{"roots":["2:422"],"nodeById":{"530:413":{"type":"FRAME","id":"530:413","name":"Frame 2147236488","overrideKey":"1357:23486","absoluteBoundingBox":{"x":1015.0,"y":312.0,"width":141.0,"height":32.0},"isolatedAbsoluteRenderBounds":{"x":1015.0,"y":312.0,"width":141.0,"height":32.0},"relativeTransform":[[1.0,0.0,915.0],[0.0,1.0,12.0]],"size":{"x":141.0,"y":32.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.219607844948769,"g":0.239215686917305,"b":0.254901975393295,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"rectangleCornerRadii":[12.0,12.0,12.0,12.0],"cornerRadius":12.0,"paddingTop":5.0,"paddingRight":15.0,"paddingBottom":5.0,"paddingLeft":15.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","children":["530:414","530:415"]},"530:414":{"type":"TEXT","id":"530:414","name":"Shop the Set","overrideKey":"1357:23456","absoluteBoundingBox":{"x":1030.0,"y":317.0,"width":97.0,"height":22.0},"isolatedAbsoluteRenderBounds":{"x":1030.82153320312,"y":321.480010986328,"width":95.4005126953125,"height":15.0399780273438},"relativeTransform":[[1.0,0.0,15.0],[0.0,1.0,5.0]],"size":{"x":97.0,"y":22.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Shop the Set","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PIXELS","lineHeightPx":21.6000003814697,"lineHeightPercent":103.686630249023,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"530:411":{"type":"TEXT","id":"530:411","name":"TTMIK Books","overrideKey":"519:4281","absoluteBoundingBox":{"x":336.0,"y":318.0,"width":93.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":336.520721435547,"y":322.200012207031,"width":91.6401672363281,"height":10.97998046875},"relativeTransform":[[1.0,0.0,12.0],[0.0,1.0,5.0]],"size":{"x":93.0,"y":20.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.219607844948769,"g":0.239215686917305,"b":0.254901975393295,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"TTMIK Books","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":15.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PIXELS","lineHeightPx":20.25,"lineHeightPercent":103.686630249023,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"113:130":{"type":"COMPONENT_SET","id":"113:130","name":"SNS","absoluteBoundingBox":{"x":-873.0,"y":353.0,"width":173.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":-873.0,"y":353.0,"width":173.0,"height":96.0},"relativeTransform":[[1.0,0.0,-873.0],[0.0,1.0,353.0]],"size":{"x":173.0,"y":96.0},"fills":[],"strokeAlign":"INSIDE","strokeDashes":[10.0,5.0],"strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.800000011920929,"g":0.800000011920929,"b":0.800000011920929,"a":1.0},"visible":true,"opacity":1.0}],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["113:97","113:98"],"componentPropertyDefinitions":{"Property 1":{"type":"VARIANT","defaultValue":"Youtube","variantOptions":["Instagram","Youtube"]}}},"113:191":{"type":"COMPONENT","id":"113:191","name":"TTMIK Books","absoluteBoundingBox":{"x":-602.0,"y":250.0,"width":28.0,"height":32.0},"isolatedAbsoluteRenderBounds":{"x":-602.0,"y":250.0,"width":28.0,"height":32.0},"relativeTransform":[[1.0,0.0,-602.0],[0.0,1.0,250.0]],"size":{"x":28.0,"y":32.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["113:190"]},"113:190":{"type":"SVG","id":"113:190","name":"store icon","absoluteBoundingBox":{"x":-602.0,"y":250.0,"width":28.0,"height":32.0},"isolatedAbsoluteRenderBounds":{"x":-602.0,"y":250.0,"width":28.0,"height":32.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":28.0,"y":32.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"SCALE","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0},"bottom":{"pixelOffset":0.0,"sizeFraction":1.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"hash":"9c41be702f37961a1290e6e3122e436c110f68d2"},"530:410":{"type":"FRAME","id":"530:410","name":"Frame 2147236479","overrideKey":"519:4300","absoluteBoundingBox":{"x":324.0,"y":313.0,"width":117.0,"height":30.0},"isolatedAbsoluteRenderBounds":{"x":324.0,"y":313.0,"width":117.0,"height":30.0},"relativeTransform":[[1.0,0.0,224.0],[0.0,1.0,13.0]],"size":{"x":117.0,"y":30.0},"fills":[{"opacity":0.5,"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.219607844948769,"g":0.239215686917305,"b":0.254901975393295,"a":1.0},"visible":true,"opacity":1.0}],"strokeWeight":1.5,"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"rectangleCornerRadii":[100.0,100.0,100.0,100.0],"cornerRadius":100.0,"paddingRight":12.0,"paddingLeft":12.0,"layoutMode":"HORIZONTAL","counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["530:411"]},"113:43":{"type":"RECTANGLE","id":"113:43","name":"Rectangle 9157","absoluteBoundingBox":{"x":-711.0,"y":242.0,"width":48.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":-711.0,"y":242.0,"width":48.0,"height":48.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":48.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.733333349227905,"b":0.466666668653488,"a":1.0},"visible":true,"opacity":1.0}],"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"113:128":{"type":"COMPONENT","id":"113:128","name":"Property 1=TTMIK Stories","absoluteBoundingBox":{"x":-782.0,"y":242.0,"width":48.0,"height":48.0},"targetAspectRatio":{"x":48.0,"y":48.0},"isolatedAbsoluteRenderBounds":{"x":-782.0,"y":242.0,"width":48.0,"height":48.0},"relativeTransform":[[1.0,0.0,91.0],[0.0,1.0,20.0]],"size":{"x":48.0,"y":48.0},"fills":[],"constraintValues":{"left":{"pixelOffset":91.0,"sizeFraction":0.0},"top":{"pixelOffset":20.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.046875,"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"children":["113:36","113:37"],"componentSetId":"113:100"},"113:37":{"type":"SVG","id":"113:37","name":"Group","absoluteBoundingBox":{"x":-772.303955078125,"y":251.696044921875,"width":28.550121307373,"height":28.5537986755371},"isolatedAbsoluteRenderBounds":{"x":-772.303955078125,"y":251.696044921875,"width":28.550121307373,"height":28.5538024902344},"relativeTransform":[[1.0,0.0,9.69604682922363],[0.0,1.0,9.69604682922363]],"size":{"x":28.550121307373,"y":28.5537986755371},"fills":[],"constraints":{"vertical":"TOP","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-14.3039531707764,"sizeFraction":0.5},"right":{"pixelOffset":14.2461681365967,"sizeFraction":0.5},"top":{"pixelOffset":9.69604682922363,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.533333301544189,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"hash":"a9df62e45c37189d80a7faddad02006dbd8465fe"},"113:99":{"type":"COMPONENT","id":"113:99","name":"Property 1=TTMIK Courses","absoluteBoundingBox":{"x":-853.0,"y":242.0,"width":48.0,"height":48.0},"targetAspectRatio":{"x":48.0,"y":48.0},"isolatedAbsoluteRenderBounds":{"x":-853.0,"y":242.0,"width":48.0,"height":48.0},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,20.0]],"size":{"x":48.0,"y":48.0},"fills":[],"constraintValues":{"left":{"pixelOffset":20.0,"sizeFraction":0.0},"top":{"pixelOffset":20.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0515624992549419,"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"children":["113:9","113:10"],"componentSetId":"113:100"},"113:10":{"type":"SVG","id":"113:10","name":"logo","absoluteBoundingBox":{"x":-849.000122070312,"y":256.0,"width":40.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-849.000122070312,"y":256.0,"width":40.0,"height":20.0},"relativeTransform":[[1.0,0.0,3.99988269805908],[0.0,1.0,14.0000038146973]],"size":{"x":40.0,"y":20.0},"fills":[],"constraints":{"vertical":"CENTER","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-20.0001173019409,"sizeFraction":0.5},"right":{"pixelOffset":19.9998826980591,"sizeFraction":0.5},"top":{"pixelOffset":-9.99999618530273,"sizeFraction":0.5},"bottom":{"pixelOffset":10.0000038146973,"sizeFraction":0.5}},"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.194602385163307,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"hash":"f44be9b4a6b115f94ce3045d50ed1f068a02c784"},"113:9":{"type":"RECTANGLE","id":"113:9","name":"Rectangle 9157","absoluteBoundingBox":{"x":-853.0,"y":242.0,"width":48.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":-853.0,"y":242.0,"width":48.0,"height":48.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":48.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.200000002980232,"g":0.200000002980232,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"rectangleCornerRadii":[6.0,6.0,6.0,6.0],"cornerRadius":6.0},"113:195":{"type":"COMPONENT","id":"113:195","name":"footer","absoluteBoundingBox":{"x":-1442.0,"y":100.0,"width":393.0,"height":589.0},"isolatedAbsoluteRenderBounds":{"x":-1442.0,"y":100.0,"width":393.0,"height":589.0},"relativeTransform":[[1.0,0.0,-1442.0],[0.0,1.0,100.0]],"size":{"x":393.0,"y":589.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.190692603588104,"g":0.190692603588104,"b":0.190692603588104,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":50.0,"paddingRight":24.0,"paddingBottom":50.0,"paddingLeft":24.0,"layoutMode":"HORIZONTAL","counterAxisAlignItems":"CENTER","children":["108:1081"]},"108:1081":{"type":"FRAME","id":"108:1081","name":"Frame 3414","absoluteBoundingBox":{"x":-1418.0,"y":150.0,"width":345.0,"height":489.0},"isolatedAbsoluteRenderBounds":{"x":-1418.0,"y":150.0,"width":345.0,"height":489.0},"relativeTransform":[[1.0,0.0,24.0],[0.0,1.0,50.0]],"size":{"x":345.0,"y":489.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":71.0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","isInAnimateTree":true,"children":["108:1082","108:1151"]},"108:1151":{"type":"TEXT","id":"108:1151","name":"© 2025 Talk To Me In Korean. All rights reserved.","absoluteBoundingBox":{"x":-1418.0,"y":622.0,"width":345.0,"height":17.0},"isolatedAbsoluteRenderBounds":{"x":-1406.98474121094,"y":626.002990722656,"width":320.762817382812,"height":10.5490112304688},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,472.0]],"size":{"x":345.0,"y":17.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"© 2025 Talk To Me In Korean. All rights reserved.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"DM Mono","fontPostScriptName":"DMMono-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":16.5,"lineHeightPercent":115.207366943359,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"108:1082":{"type":"FRAME","id":"108:1082","name":"Frame 3413","absoluteBoundingBox":{"x":-1418.0,"y":150.0,"width":345.0,"height":401.0},"isolatedAbsoluteRenderBounds":{"x":-1418.0,"y":150.0,"width":345.0,"height":401.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":345.0,"y":401.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":50.0,"counterAxisSizingMode":"FIXED","isInAnimateTree":true,"children":["108:1083","108:1084","108:1140"]},"113:183":{"mainComponentId":"113:97","type":"INSTANCE","id":"113:183","name":"SNS","absoluteBoundingBox":{"x":-1205.0,"y":495.0,"width":56.0,"height":56.0},"isolatedAbsoluteRenderBounds":{"x":-1205.0,"y":495.0,"width":56.0,"height":56.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":56.0,"y":56.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.850980401039124,"g":0.850980401039124,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":113,"localID":490},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://www.youtube.com/@talktomeinkorean","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[1000.0,1000.0,1000.0,1000.0],"cornerRadius":1000.0,"children":["I113:183;113:85"],"componentSetId":"113:130","componentProperties":{"Property 1":{"value":"Youtube","type":"VARIANT","boundVariables":{}}},"overrides":[{"key":[],"value":{"size":{"x":56.0,"y":56.0}},"componentId":"113:97"}]},"113:192":{"mainComponentId":"113:191","type":"INSTANCE","id":"113:192","name":"TTMIK Books","absoluteBoundingBox":{"x":-1418.0,"y":474.0,"width":28.0,"height":32.0},"isolatedAbsoluteRenderBounds":{"x":-1418.0,"y":474.0,"width":28.0,"height":32.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":28.0,"y":32.0},"fills":[],"constraints":{"vertical":"TOP_BOTTOM","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0},"bottom":{"pixelOffset":-45.0,"sizeFraction":1.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["I113:192;113:190"],"componentProperties":{},"overrides":[{"key":[],"value":{"size":{"x":28.0,"y":32.0}},"componentId":"113:191"}]},"113:159":{"mainComponentId":"113:128","type":"INSTANCE","id":"113:159","name":"App Icon","absoluteBoundingBox":{"x":-1418.0,"y":304.0,"width":48.0,"height":48.0},"targetAspectRatio":{"x":48.0,"y":48.0},"isolatedAbsoluteRenderBounds":{"x":-1418.0,"y":304.0,"width":48.0,"height":48.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":48.0,"y":48.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.046875,"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"children":["I113:159;113:36","I113:159;113:37"],"componentSetId":"113:100","componentProperties":{"Property 1":{"value":"TTMIK Stories","type":"VARIANT","boundVariables":{}}},"overrides":[{"key":[],"value":{"size":{"x":48.0,"y":48.0}},"componentId":"113:128"}]},"377:669":{"type":"FRAME","id":"377:669","name":"Frame 3420","absoluteBoundingBox":{"x":3530.0,"y":1498.0,"width":345.0,"height":398.85546875},"isolatedAbsoluteRenderBounds":{"x":3522.0,"y":1498.0,"width":361.0,"height":408.85546875},"relativeTransform":[[1.0,0.0,31.0],[0.0,1.0,1205.0]],"size":{"x":345.0,"y":398.85546875},"fills":[],"constraints":{"vertical":"TOP","horizontal":"LEFT_RIGHT"},"constraintValues":{"left":{"pixelOffset":31.0,"sizeFraction":0.0},"right":{"pixelOffset":-17.0,"sizeFraction":1.0},"top":{"pixelOffset":1205.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":40.0,"counterAxisSizingMode":"FIXED","children":["377:411","377:505"]},"113:131":{"mainComponentId":"113:99","type":"INSTANCE","id":"113:131","name":"App Icon","absoluteBoundingBox":{"x":-1418.0,"y":232.0,"width":48.0,"height":48.0},"targetAspectRatio":{"x":48.0,"y":48.0},"isolatedAbsoluteRenderBounds":{"x":-1418.0,"y":232.0,"width":48.0,"height":48.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":48.0,"y":48.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0515624992549419,"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"children":["I113:131;113:9","I113:131;113:10"],"componentSetId":"113:100","componentProperties":{"Property 1":{"value":"TTMIK Courses","type":"VARIANT","boundVariables":{}}},"overrides":[{"key":[],"value":{"size":{"x":48.0,"y":48.0}},"componentId":"113:99"}]},"108:1083":{"type":"TEXT","id":"108:1083","name":"Meet the TTMIK Universe","absoluteBoundingBox":{"x":-1418.0,"y":150.0,"width":345.0,"height":32.0},"isolatedAbsoluteRenderBounds":{"x":-1416.59301757812,"y":157.837997436523,"width":242.674072265625,"height":15.4140014648438},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":345.0,"y":32.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Meet the TTMIK Universe","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":21.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.42,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":31.5,"lineHeightPercent":115.207366943359,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2:422":{"type":"WEBPAGE","id":"2:422","name":"/hangeul-name-generator","absoluteBoundingBox":{"x":1887.0,"y":0.0,"width":2711.0,"height":2684.0},"isolatedAbsoluteRenderBounds":{"x":1887.0,"y":0.0,"width":2711.0,"height":2684.0},"relativeTransform":[[1.0,0.0,1887.0],[0.0,1.0,0.0]],"size":{"x":2711.0,"y":2684.0},"fills":[{"opacity":0.0470588244497776,"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2:423","69:143","69:164"]},"108:1139":{"type":"TEXT","id":"108:1139","name":"Seyo Korean Speaking App","absoluteBoundingBox":{"x":-1354.0,"y":376.0,"width":281.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":-1353.2080078125,"y":385.183990478516,"width":131.802001953125,"height":35.8320007324219},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,0.0]],"size":{"x":281.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutGrow":1.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[25,25,25,25,24,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],"characters":"Seyo Korean Speaking App","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAlignVertical":"CENTER","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Medium","fontStyle":"Medium","fontVariantPosition":"NORMAL","fontSize":20.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":36.0,"lineHeightPercent":138.248840332031,"lineHeightPercentFontSize":180.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"28":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-SemiBold","fontStyle":"SemiBold","fontSize":13.0,"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"lineHeightPx":19.5,"lineHeightPercent":115.207366943359,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"25":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","fontSize":18.0,"lineHeightPx":32.3999977111816,"lineHeightPercent":138.248840332031,"lineHeightPercentFontSize":180.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"24":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","fontSize":16.0,"lineHeightPx":28.7999992370605,"lineHeightPercent":138.248840332031,"lineHeightPercentFontSize":180.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"}}},"547:498":{"mainComponentId":"530:409","type":"INSTANCE","id":"547:498","name":"Hello Bar 🔗","absoluteBoundingBox":{"x":4150.0,"y":100.0,"width":393.0,"height":180.0},"isolatedAbsoluteRenderBounds":{"x":4150.0,"y":100.0,"width":393.0,"height":180.0},"relativeTransform":[[1.0,0.0,-9.0],[0.0,1.0,0.0]],"size":{"x":393.0,"y":180.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.219607844948769,"g":0.403921574354172,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-196.5,"sizeFraction":0.5},"right":{"pixelOffset":196.5,"sizeFraction":0.5},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":190,"localID":2831},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://courses.talktomeinkorean.com/beginner-bootcamp-2026-06?utm_source=eventpage&utm_medium=internal&utm_campaign=202605_courses_beginnerbootcamp2&utm_content=260521&utm_term=hangeulname2","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"paddingTop":12.0,"paddingRight":20.0,"paddingBottom":12.0,"paddingLeft":20.0,"layoutMode":"HORIZONTAL","layoutWrap":"WRAP","itemSpacing":20.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","counterAxisSpacing":10.0,"children":["I547:498;519:4300","I547:498;175:677","I547:498;1357:23486"],"componentProperties":{},"overrides":[{"key":[],"value":{"counterAxisSizingMode":"FIXED","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.219607844948769,"g":0.403921574354172,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"size":{"x":393.0,"y":180.0},"interactions":[{"id":{"sessionID":190,"localID":2831},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://courses.talktomeinkorean.com/beginner-bootcamp-2026-06?utm_source=eventpage&utm_medium=internal&utm_campaign=202605_courses_beginnerbootcamp2&utm_content=260521&utm_term=hangeulname2","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}]},"componentId":"530:409"},{"key":["Frame 21472364880","Shop the Set0"],"value":{"characterStyleOverrides":[],"characters":"Explore Beginner Bootcamp","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.369800865650177,"g":0.408785313367844,"b":0.104706704616547,"a":1.0},"visible":true,"opacity":1.0}],"style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PIXELS","lineHeightPx":21.6000003814697,"lineHeightPercent":103.686630249023,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"styleOverrideTable":{}},"componentId":"530:409"},{"key":["Frame 21472364880"],"value":{"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.91372549533844,"g":0.949019610881805,"b":0.682352960109711,"a":1.0},"visible":true,"opacity":1.0}]},"componentId":"530:409"},{"key":["Frame 21472364880","Rectangle 1121560"],"value":{"strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.369800865650177,"g":0.408785313367844,"b":0.104706704616547,"a":1.0},"visible":true,"opacity":1.0}]},"componentId":"530:409"},{"key":["​A stylish way to start Korean. The Ultimate Set + Premium Gifts.0"],"value":{"characterStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12],"characters":"Got your Korean name? Now learn to say more","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PIXELS","lineHeightPx":21.6000003814697,"lineHeightPercent":103.686630249023,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"lineHeightPercent":null,"lineHeightPercentFontSize":null,"lineHeightPx":null,"lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"styleOverrideTable":{"12":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"componentId":"530:409"},{"key":["Frame 21472364790"],"value":{"visible":false},"componentId":"530:409"}]},"546:482":{"mainComponentId":"530:409","type":"INSTANCE","id":"546:482","name":"Hello Bar 🔗","absoluteBoundingBox":{"x":4497.5,"y":427.0,"width":393.0,"height":170.0},"isolatedAbsoluteRenderBounds":{"x":4497.5,"y":427.0,"width":393.0,"height":170.0},"relativeTransform":[[1.0,0.0,338.5],[0.0,1.0,327.0]],"size":{"x":393.0,"y":170.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.219607844948769,"g":0.403921574354172,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"constraintValues":{"left":{"pixelOffset":338.5,"sizeFraction":0.0},"top":{"pixelOffset":327.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":190,"localID":2831},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://courses.talktomeinkorean.com/beginner-bootcamp-2026-06?utm_source=eventpage&utm_medium=internal&utm_campaign=202605_courses_beginnerbootcamp2&utm_content=260521&utm_term=hangeulname2","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"paddingTop":12.0,"paddingRight":20.0,"paddingBottom":12.0,"paddingLeft":20.0,"layoutMode":"HORIZONTAL","layoutWrap":"WRAP","itemSpacing":20.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","counterAxisSpacing":10.0,"children":["I546:482;519:4300","I546:482;175:677","I546:482;1357:23486"],"componentProperties":{},"overrides":[{"key":[],"value":{"counterAxisSizingMode":"FIXED","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.219607844948769,"g":0.403921574354172,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"size":{"x":393.0,"y":170.0},"interactions":[{"id":{"sessionID":190,"localID":2831},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://courses.talktomeinkorean.com/beginner-bootcamp-2026-06?utm_source=eventpage&utm_medium=internal&utm_campaign=202605_courses_beginnerbootcamp2&utm_content=260521&utm_term=hangeulname2","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}]},"componentId":"530:409"},{"key":["Frame 21472364880","Shop the Set0"],"value":{"characterStyleOverrides":[],"characters":"Explore Beginner Bootcamp","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.369800865650177,"g":0.408785313367844,"b":0.104706704616547,"a":1.0},"visible":true,"opacity":1.0}],"style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PIXELS","lineHeightPx":21.6000003814697,"lineHeightPercent":103.686630249023,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"styleOverrideTable":{}},"componentId":"530:409"},{"key":["Frame 21472364880"],"value":{"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.501960813999176,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}]},"componentId":"530:409"},{"key":["​A stylish way to start Korean. The Ultimate Set + Premium Gifts.0"],"value":{"characterStyleOverrides":[5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6],"characters":"Got your Korean name? Now learn to say more","lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"styleOverrideTable":{"6":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"5":{"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"componentId":"530:409"},{"key":["Frame 21472364790"],"value":{"visible":false},"componentId":"530:409"}]},"69:176":{"type":"TEXT","id":"69:176","name":"Elizabeth !","absoluteBoundingBox":{"x":4625.0,"y":193.0,"width":345.0,"height":38.0},"isolatedAbsoluteRenderBounds":{"x":4625.0,"y":193.0,"width":345.0,"height":38.0},"relativeTransform":[[1.0,0.0,466.0],[0.0,1.0,93.0]],"size":{"x":345.0,"y":38.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.133333340287209,"g":0.133333340287209,"b":0.133333340287209,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"constraintValues":{"left":{"pixelOffset":466.0,"sizeFraction":0.0},"top":{"pixelOffset":93.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":0.848927974700928,"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Elizabeth !","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":25.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":37.5,"lineHeightPercent":115.207366943359,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"69:165":{"type":"FRAME","id":"69:165","name":"이름생성기","absoluteBoundingBox":{"x":4159.0,"y":296.0,"width":375.0,"height":2324.0},"isolatedAbsoluteRenderBounds":{"x":4159.0,"y":296.0,"width":375.0,"height":2324.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,196.0]],"size":{"x":375.0,"y":2324.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"BOTTOM","horizontal":"LEFT_RIGHT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"bottom":{"pixelOffset":0.0,"sizeFraction":1.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"children":["69:166","69:173","180:898","377:668"]},"377:668":{"type":"FRAME","id":"377:668","name":"Frame 3420","absoluteBoundingBox":{"x":4174.0,"y":1582.0,"width":345.0,"height":398.85546875},"isolatedAbsoluteRenderBounds":{"x":4166.0,"y":1582.0,"width":361.0,"height":408.85546875},"relativeTransform":[[1.0,0.0,15.0],[0.0,1.0,1286.0]],"size":{"x":345.0,"y":398.85546875},"fills":[],"constraints":{"vertical":"TOP","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-172.5,"sizeFraction":0.5},"right":{"pixelOffset":172.5,"sizeFraction":0.5},"top":{"pixelOffset":1286.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":40.0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["377:410","377:545"]},"113:98":{"type":"COMPONENT","id":"113:98","name":"Property 1=Instagram","absoluteBoundingBox":{"x":-776.0,"y":373.0,"width":56.0,"height":56.0},"isolatedAbsoluteRenderBounds":{"x":-776.0,"y":373.0,"width":56.0,"height":56.0},"relativeTransform":[[1.0,0.0,97.0],[0.0,1.0,20.0]],"size":{"x":56.0,"y":56.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.850980401039124,"g":0.850980401039124,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"constraintValues":{"left":{"pixelOffset":97.0,"sizeFraction":0.0},"top":{"pixelOffset":20.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":113,"localID":491},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://www.instagram.com/ttmik/","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[1000.0,1000.0,1000.0,1000.0],"cornerRadius":1000.0,"children":["113:95"],"componentSetId":"113:130"},"113:129":{"type":"COMPONENT","id":"113:129","name":"Property 1=Seyo","absoluteBoundingBox":{"x":-711.0,"y":242.0,"width":48.0,"height":48.0},"targetAspectRatio":{"x":48.0,"y":48.0},"isolatedAbsoluteRenderBounds":{"x":-711.0,"y":242.0,"width":48.0,"height":48.0},"relativeTransform":[[1.0,0.0,162.0],[0.0,1.0,20.0]],"size":{"x":48.0,"y":48.0},"fills":[],"constraintValues":{"left":{"pixelOffset":162.0,"sizeFraction":0.0},"top":{"pixelOffset":20.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.046875,"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"rectangleCornerRadii":[6.0,6.0,6.0,6.0],"cornerRadius":6.0,"clipsContent":true,"children":["113:43","113:44"],"componentSetId":"113:100"},"377:687":{"type":"FRAME","id":"377:687","name":"Frame 3421","absoluteBoundingBox":{"x":4174.0,"y":1884.85546875,"width":345.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":4174.0,"y":1884.85546875,"width":345.0,"height":96.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,196.85546875]],"size":{"x":345.0,"y":96.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":24.0,"paddingBottom":24.0,"paddingLeft":24.0,"layoutMode":"HORIZONTAL","counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["377:584"]},"377:584":{"type":"TEXT","id":"377:584","name":"Create Your Own Hangeul Face  for Hangeul Day!","absoluteBoundingBox":{"x":4198.0,"y":1908.85546875,"width":297.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":4230.1767578125,"y":1914.33544921875,"width":229.22412109375,"height":39.2320556640625},"relativeTransform":[[1.0,0.0,24.0],[0.0,1.0,24.0]],"size":{"x":297.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.5,"g":0.25,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutGrow":1.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Create Your Own Hangeul Face  for Hangeul Day!","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-0.32,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":115.207366943359,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"377:735":{"type":"RECTANGLE","id":"377:735","name":"image 9","absoluteBoundingBox":{"x":4174.0,"y":1688.0,"width":345.0,"height":196.85546875},"targetAspectRatio":{"x":2401.0,"y":1370.0},"isolatedAbsoluteRenderBounds":{"x":4174.0,"y":1688.0,"width":345.0,"height":196.85546875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":345.0,"y":196.85546875},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"7f2b4987e968e465145a09344318f27fe9b3f71a","originalImageWidth":2401,"originalImageHeight":1370,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"377:410":{"type":"TEXT","id":"377:410","name":"How We Celebrated  Hangeul Day in 2024","absoluteBoundingBox":{"x":4174.0,"y":1582.0,"width":345.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":4215.89306640625,"y":1587.88000488281,"width":262.62353515625,"height":57.4759521484375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":345.0,"y":66.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.400000005960464,"g":0.198095247149467,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],"characters":"How We Celebrated  Hangeul Day in 2024 ","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":21.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-0.42,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.2999992370605,"lineHeightPercent":99.8463897705078,"lineHeightPercentFontSize":130.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"3":{"fontSize":28.0,"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.400000005960464,"g":0.198095247149467,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"2":{"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.400000005960464,"g":0.198095247149467,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"180:898":{"mainComponentId":"113:195","type":"INSTANCE","id":"180:898","name":"footer","absoluteBoundingBox":{"x":4150.0,"y":2031.0,"width":393.0,"height":589.0},"isolatedAbsoluteRenderBounds":{"x":4150.0,"y":2031.0,"width":393.0,"height":589.0},"relativeTransform":[[1.0,0.0,-9.0],[0.0,1.0,1735.0]],"size":{"x":393.0,"y":589.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.190692603588104,"g":0.190692603588104,"b":0.190692603588104,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"BOTTOM","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-196.5,"sizeFraction":0.5},"right":{"pixelOffset":196.5,"sizeFraction":0.5},"bottom":{"pixelOffset":0.0,"sizeFraction":1.0}},"strokeAlign":"INSIDE","maxWidth":500.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":50.0,"paddingRight":24.0,"paddingBottom":50.0,"paddingLeft":24.0,"layoutMode":"HORIZONTAL","counterAxisAlignItems":"CENTER","children":["I180:898;108:1081"],"componentProperties":{},"overrides":[{"key":[],"value":{"maxHeight":null,"maxWidth":500.0},"componentId":"113:195"},{"key":["Frame 34140","Frame 34130","Frame 34110"],"value":{"primaryAxisAlignItems":"SPACE_BETWEEN"},"componentId":"113:195"}]},"113:188":{"type":"FRAME","id":"113:188","name":"SNS","absoluteBoundingBox":{"x":-1205.0,"y":495.0,"width":132.0,"height":56.0},"isolatedAbsoluteRenderBounds":{"x":-1205.0,"y":495.0,"width":132.0,"height":56.0},"relativeTransform":[[1.0,0.0,213.0],[0.0,1.0,21.0]],"size":{"x":132.0,"y":56.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":20.0,"counterAxisAlignItems":"CENTER","isInAnimateTree":true,"children":["113:183","113:184"]},"530:415":{"type":"SVG","id":"530:415","name":"Rectangle 112156","overrideKey":"1357:23522","absoluteBoundingBox":{"x":1137.0,"y":324.0,"width":4.0,"height":8.0},"targetAspectRatio":{"x":6.71141815185547,"y":13.4228363037109},"isolatedAbsoluteRenderBounds":{"x":1136.4697265625,"y":323.469665527344,"width":5.5909423828125,"height":9.0606689453125},"relativeTransform":[[1.0,0.0,122.0],[0.0,1.0,12.0]],"size":{"x":4.0,"y":8.0},"fills":[],"strokeAlign":"INSIDE","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.800000011920929,"g":0.800000011920929,"b":0.800000011920929,"a":1.0},"visible":true,"opacity":1.0}],"strokeWeight":1.5,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"hash":"04220716bf44f764931a9a8981baf528a94d038f"},"377:734":{"type":"RECTANGLE","id":"377:734","name":"image 9","absoluteBoundingBox":{"x":3530.0,"y":1604.0,"width":345.0,"height":196.85546875},"targetAspectRatio":{"x":2401.0,"y":1370.0},"isolatedAbsoluteRenderBounds":{"x":3530.0,"y":1604.0,"width":345.0,"height":196.85546875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":345.0,"y":196.85546875},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"7f2b4987e968e465145a09344318f27fe9b3f71a","originalImageWidth":2401,"originalImageHeight":1370,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"113:184":{"mainComponentId":"113:98","type":"INSTANCE","id":"113:184","name":"SNS","absoluteBoundingBox":{"x":-1129.0,"y":495.0,"width":56.0,"height":56.0},"isolatedAbsoluteRenderBounds":{"x":-1129.0,"y":495.0,"width":56.0,"height":56.0},"relativeTransform":[[1.0,0.0,76.0],[0.0,1.0,0.0]],"size":{"x":56.0,"y":56.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.850980401039124,"g":0.850980401039124,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":113,"localID":491},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://www.instagram.com/ttmik/","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[1000.0,1000.0,1000.0,1000.0],"cornerRadius":1000.0,"children":["I113:184;113:95"],"componentSetId":"113:130","componentProperties":{"Property 1":{"value":"Instagram","type":"VARIANT","boundVariables":{}}},"overrides":[{"key":[],"value":{"size":{"x":56.0,"y":56.0}},"componentId":"113:98"}]},"113:95":{"type":"SVG","id":"113:95","name":"instagram","absoluteBoundingBox":{"x":-764.0,"y":385.5,"width":32.0,"height":30.9008159637451},"isolatedAbsoluteRenderBounds":{"x":-764.0,"y":385.5,"width":32.0,"height":30.9008178710938},"relativeTransform":[[1.0,0.0,12.0],[0.0,1.0,12.5]],"size":{"x":32.0,"y":30.9008159637451},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"SCALE","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.214285714285714},"right":{"pixelOffset":0.0,"sizeFraction":0.785714285714286},"top":{"pixelOffset":0.0,"sizeFraction":0.223214285714286},"bottom":{"pixelOffset":0.0,"sizeFraction":0.775014570781163}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Instagram Icon","ariaAttributes":{},"interactions":[],"hash":"704f9decfb773fdf545e49995501bb7a0c3f18ee"},"113:44":{"type":"SVG","id":"113:44","name":"Group 36793","absoluteBoundingBox":{"x":-700.823852539062,"y":258.89599609375,"width":27.6744365692139,"height":14.1386365890503},"isolatedAbsoluteRenderBounds":{"x":-700.823852539062,"y":258.89599609375,"width":27.674560546875,"height":14.138671875},"relativeTransform":[[1.0,0.0,10.1761245727539],[0.0,1.0,16.8959999084473]],"size":{"x":27.6744365692139,"y":14.1386365890503},"fills":[],"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":10.1761245727539,"sizeFraction":0.0},"top":{"pixelOffset":16.8959999084473,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.35346594452858,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"hash":"bceca5780043df9252d0befd823283d65e31524a"},"69:173":{"type":"FRAME","id":"69:173","name":"Frame 3403","absoluteBoundingBox":{"x":4239.5,"y":331.0,"width":214.0,"height":33.0},"isolatedAbsoluteRenderBounds":{"x":4239.5,"y":331.0,"width":214.0,"height":33.0},"relativeTransform":[[1.0,0.0,80.5],[0.0,1.0,35.0]],"size":{"x":214.0,"y":33.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":0.820261478424072,"b":0.7843137383461,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-107.0,"sizeFraction":0.5},"right":{"pixelOffset":107.0,"sizeFraction":0.5},"top":{"pixelOffset":35.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.400000005960464,"g":0.198095247149467,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":89,"localID":785},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[5.0,5.0,5.0,5.0],"cornerRadius":5.0,"paddingTop":5.0,"paddingRight":15.0,"paddingBottom":5.0,"paddingLeft":15.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","children":["69:174"]},"69:166":{"type":"WIDGET","id":"69:166","name":"Embed 1","absoluteBoundingBox":{"x":4159.0,"y":416.0,"width":375.0,"height":1115.0},"isolatedAbsoluteRenderBounds":{"x":4159.0,"y":416.0,"width":375.0,"height":1115.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,120.0]],"size":{"x":375.0,"y":1115.0},"constraints":{"vertical":"TOP","horizontal":"LEFT_RIGHT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"top":{"pixelOffset":120.0,"sizeFraction":0.0}},"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"widgetType":"GENERIC","syncedState":{"embedAllowFullscreen":"false","embedCodeType":"html","embedIframeHtml":"<!DOCTYPE html>\n<html lang=\"ko\">\n<head>\n  <meta charset=\"UTF-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>\n  <title>한글이름 MY KOREAN NAME IS</title>\n\n  <!-- Sentry (옵션 유지) -->\n  <script src=\"https://js.sentry-cdn.com/01a272064480dbf2fd4c3ee2de7bfcf6.min.js\" crossorigin=\"anonymous\"></script>\n  <script>\n    Sentry.init({\n      dsn: \"https://01a272064480dbf2fd4c3ee2de7bfcf6@o1189375.ingest.us.sentry.io/4510108487647232\",\n      enableLogs: true,\n    });\n  </script>\n\n  <!-- DM Sans -->\n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n  <link href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&display=swap\" rel=\"stylesheet\">\n\n  <!-- 프리로드: UI 표시용 저해상도 배경만 선로딩 -->\n  <link rel=\"preload\" as=\"font\" type=\"font/woff2\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaDaeHan.woff2\">\n  <link rel=\"preload\" as=\"font\" type=\"font/woff2\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaManSeh.woff2\">\n  <link rel=\"preload\" as=\"image\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/name-card.png\">\n\n  <style>\n    /* 폰트(라이트 전용) */\n    @font-face {\n      font-family: 'YoonChildfundkoreaDaeHan';\n      src: url('https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaDaeHan.woff2') format('woff2'),\n           url('https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaDaeHan.woff') format('woff');\n      font-weight: 400; font-style: normal; font-display: swap;\n    }\n    @font-face {\n      font-family: 'YoonChildfundkoreaManSeh';\n      src: url('https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaManSeh.woff2') format('woff2'),\n           url('https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaManSeh.woff') format('woff');\n      font-weight: 400; font-style: normal; font-display: swap;\n    }\n\n    html, body { -webkit-text-size-adjust:100%; text-size-adjust:100%; }\n    * { margin:0; padding:0; box-sizing:border-box; }\n    body { font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif; color:#333; background:#fff; }\n\n    button, .generate-btn, .retry-btn, .save-btn, .share-link-btn, .cta-btn, .gender-option {\n      font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif !important;\n      font-size:16px !important; letter-spacing:0;\n    }\n\n    .container { width:100%; padding:20px; max-width:720px; margin:0 auto; }\n    .header { margin-bottom:20px; }\n    .top-banner { text-align:center; font-size:18px; line-height:1.5; color:#663300; font-weight:500; margin-bottom:50px; }\n    .top-banner strong { color:#FF6666; }\n\n    .shared-title { text-align:center; font-size:20px; line-height:1.5; color:#663300; font-weight:400; margin:12px 0 36px; display:none; }\n\n    .user-name-display { text-align:center; margin-bottom:20px; color:#663300; display:none; }\n    .user-name { font-size:22px; font-weight:700; margin-bottom:6px; }\n    .generated-msg { font-size:18px; font-weight:400; }\n\n    .form-group { margin-bottom:24px; }\n    .form-label { display:block; font-weight:600; margin-bottom:8px; color:#000; font-size:14px; }\n    .form-input { width:100%; padding:12px; border:1px solid #ddd; font-size:16px; background:#fff; border-radius:8px; color:#000; }\n    .form-input:focus { outline:none; border-color:#333; }\n    /* ✅ PII 보호: 이름 입력은 Clarity에서 마스킹 */\n    .form-input[data-clarity-mask=\"true\"] {}\n\n    .gender-options { display:flex; gap:10px; margin-top:8px; }\n    .gender-option { flex:1; padding:12px; border:1px solid #ddd; text-align:center; cursor:pointer; background:#fff; font-size:14px; user-select:none; border-radius:8px; }\n    .gender-option:hover { border-color:#3C82E8; }\n    .gender-option.selected { border-color:#3C82E8; background:#3C82E8; color:#fff; }\n\n    .generate-btn { width:100%; padding:25px; background:#FF6666; color:#fff; border:none; font-size:16px; font-weight:600; text-align:center; cursor:pointer; margin-top:40px; border-radius:50px; }\n    .generate-btn:hover { background:#e95a5a; }\n\n    .form-footer { margin:50% 0; display:flex; flex-direction:column; align-items:center; gap:20px; }\n    .form-footer__img { width:120px; height:60px; display:block; }\n    .form-footer__text { font-size:16px; line-height:1.5; color:#333; margin:0; text-align:center; }\n\n    .result-container { margin-top:30px; text-align:center; display:none; }\n\n    /* ✅ 결과 카드: UI는 저해상도, 스크롤 방해 없이 pan-y 허용 */\n    .result-card {\n      position: relative;\n      width: 100%;\n      max-width: 420px;\n      aspect-ratio: 768 / 1364;\n      margin: 20px auto;\n      border-radius: 16px;\n      overflow: hidden;\n\n      /* UI 표시용: 저해상도 기본값 (var 미지정 시 디폴트) */\n      background-image: var(--background-image, url('https://hangeulname-assets.talktomeinkorean.com/name-card.png'));\n      background-size: cover;\n      background-position: center top;\n\n      -webkit-user-select: none;\n      user-select: none;\n      -webkit-touch-callout: none;\n\n      /* 스크롤은 수직만 통과 */\n      touch-action: pan-y;\n\n      /* 렌더 최적화 */\n      will-change: transform;\n      contain: layout paint;\n    }\n\n    .result-card * {\n      -webkit-user-select: none;\n      user-select: none;\n      -webkit-touch-callout: none;\n    }\n\n    .result-inner { position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; text-align:center; padding-top:38%; gap:7%; height:88%; }\n\n    .korean-name, .ko-characteristic { font-synthesis:weight; }\n\n    .korean-name {\n      font-family:\"YoonChildfundkoreaManSeh\", serif !important; font-size:50px; font-weight:400;\n      color:#663300; height:22%; display:flex; align-items:center; justify-content:center; max-width:70%;\n    }\n    .ko-characteristic {\n      font-family:\"YoonChildfundkoreaDaeHan\", serif !important; font-weight:400; font-size:20px;\n      color:#5c3b1e; line-height:1.6; max-width:72%; height:40%;\n      display:flex; align-items:center; justify-content:center; padding-top:12%;\n    }\n    .en-characteristic {\n      font-family:'DM Sans', sans-serif; font-size:12px; color:#3d2c1c; line-height:1.4; max-width:70%; height:13%;\n      display:flex; align-items:center; justify-content:center;\n    }\n\n    .btn-row { display:block; margin-top:32px; }\n    \n    .save-btn {\n      display:block; width:100%; padding:22px; border:none; border-radius:50px; font-weight:600; cursor:pointer;\n      margin-top:24px; transition:.2s; text-align:center; background:#FF6666; color:#fff;\n    }\n    .save-btn:hover { opacity:.9; }\n\n    .share-row { display:block; }\n\n    .share-row p { text-align:center; margin-top:32px; }\n    #shareRow, #shareLinkBtn { position: relative; z-index: 10; }\n\n    .share-link-btn{\n    -webkit-user-select: none;\n    user-select: none;\n    -webkit-touch-callout: none;\n    touch-action: manipulation; /* iOS: 탭을 클릭으로, 핀치/더블탭 확대 방지 */\n    pointer-events: auto;\n    width:100%; border:1px solid #FF6666; color:#FF6666; background:#fff; margin-top:20px; padding:22px; border-radius:50px;text-align:center; font-weight:600; cursor:pointer;\n    }\n\n    .share-link-btn:hover { opacity:.9; }\n\n    .share-cta { margin-top:24px; display:none; }\n    .cta-btn { display:inline-block; padding:25px; border-radius:999px; background:#FF6666; color:#fff; font-weight:700; border:none; cursor:pointer; width:100%; text-align:center; }\n    .cta-btn:hover { opacity:.9; }\n\n    .loading { text-align:center; padding:20px; display:none; }\n    .loading-spinner { width:30px; height:30px; border:3px solid #ddd; border-left:3px solid #333; border-radius:50%; animation:spin 1s linear infinite; margin:0 auto 15px; }\n    @keyframes spin { 0%{transform:rotate(0)} 100%{transform:rotate(360deg)} }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <div id=\"topBanner\" class=\"top-banner\" aria-live=\"polite\">\n        Type in your name below and <br/>you will get a Korean-style name <br/>along with a fun personality match <br/>that reflects Korean vibes.\n      </div>\n      <div id=\"sharedTitle\" class=\"shared-title\"></div>\n\n      <div class=\"user-name-display\" id=\"userNameDisplay\">\n        <div class=\"user-name\" id=\"userName\"></div>\n        <div class=\"generated-msg\">Here's your Korean name and the vibe behind it!</div>\n      </div>\n    </div>\n\n    <!-- 입력 폼 -->\n    <div id=\"nameForm\">\n      <div class=\"form-group\">\n        <label class=\"form-label\" for=\"firstName\">이름 (First Name)</label>\n        <!-- ✅ PII 마스킹 -->\n        <input data-clarity-mask=\"true\" type=\"text\" id=\"firstName\" class=\"form-input\" placeholder=\"Michael, Sophie, Omar, Fatima...\">\n      </div>\n      <div class=\"form-group\">\n        <label class=\"form-label\" for=\"lastName\">성 (Last Name)</label>\n        <!-- ✅ PII 마스킹 -->\n        <input data-clarity-mask=\"true\" type=\"text\" id=\"lastName\" class=\"form-input\" placeholder=\"Johnson, Kim, Hassan, Al-Ahmad...\">\n      </div>\n      <div class=\"form-group\">\n        <label class=\"form-label\">Name type</label>\n        <div class=\"gender-options\" role=\"tablist\" aria-label=\"Name type options\">\n          <div class=\"gender-option selected\" role=\"tab\" aria-selected=\"true\" tabindex=\"0\" onclick=\"selectGender('neutral', this)\">unisex</div>\n          <div class=\"gender-option\" role=\"tab\" aria-selected=\"false\" tabindex=\"0\" onclick=\"selectGender('female', this)\">feminine</div>\n          <div class=\"gender-option\" role=\"tab\" aria-selected=\"false\" tabindex=\"0\" onclick=\"selectGender('male', this)\">masculine</div>\n        </div>\n      </div>\n      <button type=\"button\" class=\"generate-btn\" onclick=\"generateKoreanName(); incrementCounter();\">Generate Korean Name</button>\n      <div class=\"form-footer\" id=\"formFooter\" aria-live=\"polite\">\n        <img class=\"form-footer__img\"\n             src=\"https://hangeulname.figma.site/_assets/v11/f07271865ca56eb133ad7f8ad37a73790d341337.svg\"\n             alt=\"Hangeul Day Campaign\" width=\"120\" height=\"auto\" decoding=\"async\" loading=\"lazy\" />\n        <p class=\"form-footer__text\">\n          This service is created by <br/>Talk To Me In Korean.\n        </p>\n      </div>\n    </div>\n\n    <!-- 로딩 -->\n    <div class=\"loading\" id=\"loading\">\n      <div class=\"loading-spinner\"></div>\n      <p>Creating your unique Korean name...</p>\n    </div>\n\n    <!-- 결과 -->\n    <div class=\"result-container\" id=\"resultContainer\">\n      <div class=\"result-card\" id=\"resultCard\">\n        <div class=\"result-inner\">\n          <div class=\"korean-name\" id=\"koreanName\"></div>\n          <div class=\"ko-characteristic\" id=\"koCharacteristic\"></div>\n          <div class=\"en-characteristic\" id=\"enCharacteristic\"></div>\n        </div>\n      </div>\n\n      <div id=\"btnRow\" class=\"btn-row\">\n        <button class=\"save-btn\" onclick=\"downloadResultImage()\">Save & Share</button>\n      </div>\n\n      <div id=\"shareRow\" class=\"share-row\">\n        <button id=\"shareLinkBtn\" class=\"share-link-btn\">Copy Link</button>\n        <p>Please screenshot if you cannot <br/>save the image.</p>\n      </div>\n\n      <div id=\"shareCTA\" class=\"share-cta\">\n        <a class=\"cta-btn\" href=\"https://hangeulname.figma.site/\" target=\"_blank\" rel=\"noopener noreferrer\">Create My Korean Name Too</a>\n      </div>\n    </div>\n  </div>\n\n  <!-- html2canvas (희박한 폴백용) -->\n  <script src=\"https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js\"></script>\n\n  <script>\n    /* =========================\n       [CLARITY] 안전한 호출 유틸\n       - Figma Sites <head>에 설치된 Clarity 스니펫과 충돌 없이 동작\n       - 미로딩 시 큐에 쌓였다가 처리\n       ========================= */\n    (function(){\n      if (!window.clarity) {\n        window.clarity = function(){ (window.clarity.q = window.clarity.q || []).push(arguments); };\n      }\n    })();\n    function cSet(key, val){ try { window.clarity && window.clarity('set', key, val); } catch(_){} }\n    function cEvent(name, props){ try { window.clarity && window.clarity('event', name, props || {}); } catch(_){} }\n\n    // 팝업-부모 통신으로 공유 버튼 클릭 이벤트 수집\n    window.addEventListener('message', function(e){\n      if (e && e.data && e.data.type === 'kname:share') {\n        cEvent('click_share_in_popup', { source: 'save_popup' });\n      }\n    }, false);\n\n    /* =========================\n       전역 상태 / BG URL\n       ========================= */\n    let selectedGender = 'neutral';\n    let BG_OBJECT_URL = null; // UI 표시용 objectURL 캐시\n\n    // ✅ UI 표시용(저해상도) / 저장용(고해상도) 분리\n    const BG_DISPLAY_URL = 'https://hangeulname-assets.talktomeinkorean.com/name-card.png';\n    const BG_SAVE_URL    = 'https://hangeulname-assets.talktomeinkorean.com/name-card.png';\n\n    /* =========================\n       배경 크기(저장 스케일 계산용)\n       ========================= */\n    async function getBgNaturalSize() {\n      return new Promise((resolve) => {\n        const img = new Image();\n        img.onload = () => resolve({ w: img.naturalWidth || 768, h: img.naturalHeight || 1364 });\n        img.onerror = () => resolve({ w: 768, h: 1364 });\n        img.crossOrigin = 'anonymous';\n        img.src = BG_SAVE_URL; // 저장 고해상도 기준으로 확인\n        setTimeout(() => resolve({ w: 768, h: 1364 }), 3000);\n      });\n    }\n\n    /* =========================\n       UI 배경: 저해상도 objectURL로 적용\n       ========================= */\n    async function applyInlineBGToResultCard() {\n      const card = document.getElementById('resultCard');\n      if (!card) return;\n      try {\n        const res = await fetch(BG_DISPLAY_URL, { mode: 'cors', credentials: 'omit', cache: 'no-cache' });\n        if (!res.ok) throw new Error('BG fetch failed: ' + res.status);\n        const blob = await res.blob();\n\n        if (BG_OBJECT_URL) {\n          try { URL.revokeObjectURL(BG_OBJECT_URL); } catch(_) {}\n          BG_OBJECT_URL = null;\n        }\n\n        BG_OBJECT_URL = URL.createObjectURL(blob);\n        card.style.setProperty('--background-image', `url(\"${BG_OBJECT_URL}\")`);\n        card.style.backgroundImage = `var(--background-image)`;\n      } catch (e) {\n        console.warn('[applyInlineBGToResultCard] fallback to direct URL:', e);\n        card.style.setProperty('--background-image', `url(\"${BG_DISPLAY_URL}\")`);\n        card.style.backgroundImage = `var(--background-image)`;\n      }\n    }\n\n    /* =========================\n       UI 체감속도: 저해상도만 프리로드\n       ========================= */\n    async function preloadBackgroundImage() {\n      return new Promise((resolve) => {\n        const img = new Image();\n        img.crossOrigin = 'anonymous';\n        img.onload = () => resolve(img);\n        img.onerror = () => resolve(null);\n        img.src = BG_DISPLAY_URL;\n        setTimeout(() => resolve(null), 5000);\n      });\n    }\n\n    async function ensureBackgroundLoaded() {\n      const card = document.getElementById('resultCard');\n      if (!card) return false;\n      const current = getComputedStyle(card).backgroundImage;\n      if (current === 'none' || !current.includes('name-card')) {\n        card.style.backgroundImage = `url(\"${BG_DISPLAY_URL}\")`;\n      }\n      const img = await preloadBackgroundImage();\n      return !!img;\n    }\n\n    /* =========================\n       데이터\n       ========================= */\n    const koreanSurnames = ['김','이','박','최','정','강','조','윤','장','임','한','오','서','신','권','황','안','송','전','홍','유','고','문','양','손','배','백','허','남','심','노','하','곽','성','차','주','우','구','민','류'];\n    const maleNames = ['민준','도윤','시우','예준','하준','지호','주원','지후','도현','준우','준서','건우','현우','우진','선우','지훈','유준','은우','연우','서진','이준','민재','시윤','현준','정우','윤우','수호','지우','승우','유찬','지환','승현','이안','준혁','시후','진우','승민','민성','수현','지원','태민','재현','승준','지민','민호','현서','하민','성현','예성','하람','승완','태현','이든','태오','규민','민혁','태양','성준','윤성','다온','정민','현우','정국','지민','진','태형','윤기','남준','호석','민규','정한','원우'];\n    const femaleNames = ['서연','지아','서아','다은','예은','예린','소윤','유나','채은','윤아','아린','예나','가은','주아','예진','민지','나은','서은','나윤','채아','다연','소은','예지','나연','세아','지은','은채','예빈','윤지','소연','채린','소민','승아','혜원','소이','세은','리아','민아','나현','경화','지수','제니','채영','원영','유진','가을','겨울','지민','민정','은경','아영','규리','연아','가윤','채이','지연','예림','유정','소현','경은'];\n    const neutralNames = ['라온','시안','이루','하늘','별','나루','율','설','바다','해솔','가람','온유','연우','지후','하람','이든','서우','민서','하온','도경','시원','윤호','은찬','동현','재원','민규','하진','이현','민찬','우빈','로운','하율','도하','지율','준호','윤재','준','성민','태민','재현'];\n    const characteristics = [\n        {ko: '사람 처음 만나면 MBTI부터 물어봄', en: 'When meeting someone for the first time, they ask about MBTI right away'},\n        {ko: '엘리베이터 타면 닫힘 버튼 계속 누름', en: 'Keeps rapidly pressing the elevator close button'},\n        {ko: '휴지 달라고 하면 꼭 두 장 줌', en: 'Always gives exactly two tissues when asked'},\n        {ko: '만날 때마다 밥 먹었냐고 물어봄', en: 'Asks \"Did you eat?\" every time you meet with them'},\n        {ko: '겨울에도 아이스 아메리카노만 마심', en: 'Drinks iced americano even in winter'},\n        {ko: '밥 먹을 때 마지막 한 입 꼭 남김', en: 'Always leaves the last bite of food'},\n        {ko: '여럿이 먹을 때 마지막 한 조각은 꼭 양보함', en: 'Insists others take the last piece when sharing'},\n        {ko: '전자레인지 끝날 때까지 못 기다리고 20초 전부터 꺼낼 준비하고 있음', en: 'Hovers by the microwave to stop it with 20 seconds still left'},\n        {ko: '치킨은 무조건 반반으로 시킴', en: 'Always orders half-and-half fried chicken'},\n        {ko: '물이나 음료수 마실 때도 계속 \"짠\" 하자고 함', en: 'Says \"cheers\" and clinks glasses even when drinking water'},\n        {ko: '식당 가면 수저 세팅부터 함', en: 'Sets out chopsticks and spoon first thing at restaurants'},\n        {ko: '공항 보안 검색대 빠르게 통과하려고 미리 짐 다 꺼내서 준비함', en: 'Takes their laptop out of their bag before airport security to breeze through the line'},\n        {ko: '길 알려 주다가 결국 직접 데려다줌', en: 'Ends up personally escorting people to their destination instead of giving directions'},\n        {ko: '핸드폰으로 자리 맡아 두고 주문하러 감', en: 'Leaves phone on empty table to save it before ordering food'},\n        {ko: '야식 안 먹으면 하루가 허전함', en: 'Their day somehow feels incomplete without having a late-night snack'},\n        {ko: '감기 걸리면 바로 병원 감', en: 'Treats a runny nose like a medical emergency'},\n        {ko: '\"다음에 밥 한번 먹자\" 해 놓고 실제로는 안 먹음', en: 'Says \"Let’s grab a meal sometime\" but never actually initiates it'},\n        {ko: \"'아니', '근데' 없으면 대화 못 함\", en: 'Starts every conversation with \"No\" or \"But\"'},\n        {ko: '심심하면 카톡 프로필 사진 바꿈', en: 'Changes KakaoTalk profile picture for no particular reason'},\n        {ko: '친구들 카톡 프로필 사진 다 확인해 봄', en: 'Checks everyone else’s KakaoTalk profile pictures religiously'},\n        {ko: '메뉴 고르다 결국 늘 먹던 거 고름', en: 'Spends forever debating what to order then ends up ordering their usual'},\n        {ko: '길에서 아는 사람 만나면 어색해함', en: 'Feels awkward when running into acquaintances on the street'},\n        {ko: '술 마실 때 \"딱 한 잔만 더\" 하다가 막차 놓침', en: 'Says \"just one more drink\" and misses the last train of the night'},\n        {ko: '밥 먹을 때 김치 없으면 못 참음', en: 'Can’t eat meals without kimchi on the side'},\n        {ko: '불닭볶음면 잘 먹는 척하지만 현실은 까르보불닭', en: 'Pretends to handle super spicy ramyeon but secretly gets the mild version'},\n        {ko: '배달 시키면 라이더 위치 실시간으로 확인함', en: 'Tracks delivery drivers in real-time like NASA mission control'},\n        {ko: '\"어디 갈래?\" 하면 맨날 카페 가자고 함', en: 'Always suggests going to a café when asked where to hang out'},\n        {ko: '새로 생긴 카페 다 꿰고 있음', en: 'Knows every new café that opens in the neighborhood'},\n        {ko: '예의상 두 번 거절하고 세 번째에 좋다고 함', en: 'Keeps refusing until asked three times to be polite, then finally says yes'},\n        {ko: '와이파이 조금만 느려도 바로 핫스팟 켬', en: 'Has zero patience for slow WiFi and immediately switches to hotspot at the slightest lag'},\n        {ko: '횡단보도 건널 때도 폰만 봄', en: 'Stares at phone even while crossing the street'},\n        {ko: '고기 먹을 때 상추 없으면 못 참음', en: 'Needs lettuce wraps for BBQ'},\n        {ko: '라면 끓일 때 계란 꼭 넣음', en: 'Always cracks an egg into their ramyeon'},\n        {ko: '배부르다고 했으면서 \"후식 뭐 먹을래?\" 물어봄', en: 'Claims to be full, then immediately asks what’s for dessert'},\n        {ko: '소파에 안 앉고 바닥에 앉아서 소파를 등받이로 씀', en: 'Sits on the floor using the sofa as a backrest'},\n        {ko: '웃을 때 박수 치면서 옆 사람 때림', en: 'Claps while laughing and accidentally hits whoever’s nearby'},\n        {ko: '같은 말 두 번씩 반복함 (\"아니, 아니\")', en: 'Repeats words twice (\"No, no\" or \"Wait, wait\")'},\n        {ko: '뭐 물어보면 \"몰라\"라고 하면서 알려 줌 (\"몰라, 집에.\")', en: 'Says \"I don’t know\" before telling you the answer to your question anyways'},\n        {ko: '여름에 에어컨 틀고 이불 덮고 잠', en: 'Sleeps under blankets with the AC blasting in summer'},\n        {ko: '겨울에 난방 켜고 반팔 입고 잠', en: 'Cranks up the heated floors and then sleeps in a t-shirt during winter'},\n        {ko: '선물 받으면 뭘 이런 걸 다 준비했냐고 하지만 속으로는 좋아함', en: 'Acts like gifts are unnecessary while secretly being thrilled'},\n        {ko: '식당에서 수저 밑에 휴지 꼭 깔아 줌', en: 'Always puts napkins under utensils at restaurants'},\n        {ko: '라면만 먹는 친구 걱정해서 밥 먹이러 끌고 감', en: 'Drags friends who live on ramyeon to eat real food'},\n        {ko: '리모컨 맨날 어디 뒀는지 잊어버리고 여기저기 찾으러 다님', en: 'Spends more time looking for the TV remote than actually watching TV'},\n        {ko: '어디를 가든 콘센트부터 찾음', en: 'Has a sixth sense for finding power outlets in any room'},\n        {ko: '반찬 중 제일 맛있는 건 아껴 놨다가 마지막에 먹음', en: 'Saves the best side dish for last like it’s the grand finale'},\n        {ko: '컵라면 기다리는 3분 동안 초 단위로 시계 봄', en: 'Counts down every second of those 3 minutes while waiting for cup noodles to cook'},\n        {ko: '물건 찾을 때 \"어디 보자~\" 하면서 노래하듯 말함', en: 'Sing-songs \"Let me see…\" when looking for things'},\n        {ko: '\"다이어트는 내일부터\"라고 하면서 디저트 찾아 먹음', en: 'Says \"Diet starts tomorrow\" then immediately goes looking for dessert'},\n        {ko: '맛있으면 0칼로리라고 함', en: 'Claims delicious food has zero calories'},\n        {ko: '항상 후면 주차 하려고 함', en: 'Has an unexplainable obsession with reverse parking'},\n        {ko: '누가 뭐 필요하다 하면 가방에서 계속 꺼내 줌', en: 'Pulls endless supplies from their bag whenever someone needs anything'},\n        {ko: '먹기 전에 꼭 음식 사진 찍음', en: 'Always takes food pics first'},\n        {ko: '해외에서 한국어 들리면 자동으로 귀 쫑긋함', en: 'Ears automatically perk up when hearing Korean spoken abroad'},\n        {ko: '겨울만 되면 귤 많이 먹어서 손 노래짐', en: 'Gets orange-stained hands from winter tangerine binges'},\n        {ko: '외출복 입은 채로는 절대 침대 안 올라감', en: 'Never gets on their bed when wearing outside clothes'},\n        {ko: '연애하면 매일 연락해야 함', en: 'Expects hourly updates when dating someone'},\n        {ko: '연애할 때 기념일 다 세고 다 챙김', en: 'Remembers and celebrates every single anniversary when dating'},\n        {ko: '히말라야도 갈 수 있을 듯한 등산복이랑 등산 장비 있음', en: 'Owns full hiking gear like planning to climb Mount Everest'},\n        {ko: '새로운 취미 생기면 장비부터 장만함', en: 'Buys complete equipment sets the moment they pick up new hobbies'},\n        {ko: '멀리 사는 사람보다 지각 더 자주 함', en: 'Shows up late more often than people who live farther away'},\n        {ko: '비 한 방울만 떨어져도 바로 우산 씀', en: 'Whips out their umbrella the second a single raindrop falls'},\n        {ko: '해 조금만 있어도 바로 양산 씀', en: 'Uses their parasol the moment there’s a hint of sunshine'},\n        {ko: '겨울에 패딩 입고 슬리퍼 신음', en: 'Wears a puffy winter coat indoors with fuzzy slippers'},\n        ];\n\n    /* =========================\n       로직\n       ========================= */\n    function selectGender(g, el){\n      selectedGender = g;\n      document.querySelectorAll('.gender-option').forEach(opt=>{\n        opt.classList.remove('selected'); opt.setAttribute('aria-selected','false');\n      });\n      if (el) { el.classList.add('selected'); el.setAttribute('aria-selected','true'); }\n    }\n    window.selectGender = selectGender;\n\n    function getSimilarSurname(surname) {\n      const s = (surname||'').trim().toLowerCase();\n      if (s.startsWith('k') || s.startsWith('g') || s.startsWith('c')) return Math.random()>0.5 ? '김' : '강';\n      if (s.startsWith('l') || s.startsWith('r') || s === 'lee' || s === 'li') return '이';\n      if (s.startsWith('p') || s.startsWith('b') || s === 'park') return '박';\n      if (s.startsWith('ch') || s.startsWith('t')) return '최';\n      if (s.startsWith('j') || s.startsWith('z')) return Math.random()>0.5 ? '정' : '장';\n      if (s.startsWith('s') || s.startsWith('sh')) return Math.random()>0.5 ? '서' : '신';\n      if (s.startsWith('w') || s.startsWith('y')) return Math.random()>0.5 ? '윤' : '유';\n      if (s.startsWith('h')) return Math.random()>0.5 ? '한' : '황';\n      if (s.startsWith('m')) return Math.random()>0.5 ? '문' : '민';\n      if (s.startsWith('o')) return '오';\n      if (s.startsWith('a')) return '안';\n      if (s.startsWith('n')) return Math.random()>0.5 ? '노' : '남';\n      return koreanSurnames[Math.floor(Math.random()*koreanSurnames.length)];\n    }\n\n    function getSimilarName(firstName, gender) {\n      const name = (firstName||'').trim().toLowerCase();\n      const first = name.charAt(0);\n      let pool = neutralNames;\n      if (gender === 'male')   pool = [...maleNames,   ...neutralNames];\n      if (gender === 'female') pool = [...femaleNames, ...neutralNames];\n\n      let filtered = pool.filter(kn => {\n        const korFirst = kn.charAt(0);\n        if (first === 'm' && ['민','미'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 's' && ['서','시','수','선','성'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'j' && ['지','주','준','정'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'a' && ['아','안','애'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'e' && ['에','은','예'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'r' && ['라','리','로'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'h' && ['하','한','해'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'd' && ['다','도','두'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 't' && ['태','토','테'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'l' && ['리','라','로'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'v' && ['비','바'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'n' && ['나','노','누'].some(p => korFirst.startsWith(p))) return true;\n        return false;\n      });\n\n      if (filtered.length === 0) filtered = pool;\n      return filtered[Math.floor(Math.random()*filtered.length)];\n    }\n\n    async function warmUpFonts() {\n      try {\n        const c = document.createElement('canvas'); c.width = 800; c.height = 200;\n        const ctx = c.getContext('2d');\n        const samples = [\n          { font:'normal 400 50px \"YoonChildfundkoreaManSeh\"', text:'한글 이름 테스트 ABC 123' },\n          { font:'normal 400 20px \"YoonChildfundkoreaDaeHan\"', text:'가나다 라마바 사아자 차카타파하' },\n          { font:'normal 400 12px \"DM Sans\"',                 text:'Warm up DM Sans 123 ABC' },\n        ];\n        samples.forEach((s,i) => { ctx.font = s.font; ctx.fillStyle = '#000'; ctx.fillText(s.text, 10, 30 + i*60); ctx.measureText(s.text); });\n      } catch(_) {}\n    }\n\n    async function waitForAssets() {\n      if (document.fonts && document.fonts.load) {\n        try {\n          await Promise.all([\n            document.fonts.load('normal 400 50px \"YoonChildfundkoreaManSeh\"'),\n            document.fonts.load('normal 400 20px \"YoonChildfundkoreaDaeHan\"'),\n            document.fonts.load('normal 400 12px \"DM Sans\"'),\n          ]);\n\n          const fontCheckList = [\n            '50px \"YoonChildfundkoreaManSeh\"',\n            '20px \"YoonChildfundkoreaDaeHan\"',\n            '12px \"DM Sans\"'\n          ];\n          const timeout = 3000, interval = 50;\n          let elapsed = 0;\n          while (elapsed < timeout) {\n            const allLoaded = fontCheckList.every(f => document.fonts.check(f));\n            if (allLoaded) break;\n            await new Promise(r => setTimeout(r, interval));\n            elapsed += interval;\n          }\n\n          await document.fonts.ready;\n          await warmUpFonts();\n          await new Promise(r => setTimeout(r, 60));\n        } catch(_) {}\n      }\n    }\n\n    function setResultView({ fullKo, ko, en, user }){\n      document.getElementById('koreanName').textContent = fullKo;\n      document.getElementById('koCharacteristic').textContent = ko;\n      document.getElementById('enCharacteristic').textContent = en;\n      const userBox = document.getElementById('userName');\n      userBox.textContent = (user||'') + (user ? ',' : '');\n      document.getElementById('userNameDisplay').style.display = user ? 'block' : 'none';\n    }\n\n    async function generateKoreanName(){\n      const f = document.getElementById('firstName').value.trim();\n      const l = document.getElementById('lastName').value.trim();\n      if(!f || !l){ alert('Please enter both first and last name.'); return; }\n\n      // [CLARITY] 생성 버튼 클릭\n      cEvent('click_generate', { gender: selectedGender });\n\n      try {\n        document.getElementById('nameForm').style.display='none';\n        document.getElementById('loading').style.display='block';\n        document.getElementById('resultContainer').style.display='none';\n        document.getElementById('topBanner')?.setAttribute('hidden','true');\n        document.getElementById('sharedTitle').style.display='none';\n\n        const surname = getSimilarSurname(l);\n        const given   = getSimilarName(f, selectedGender);\n        const fullKo  = surname + given;\n        const c       = characteristics[Math.floor(Math.random()*characteristics.length)];\n        setResultView({ fullKo, ko:c.ko, en:c.en, user: `${f} ${l}` });\n\n        await ensureBackgroundLoaded();\n        await waitForAssets();\n\n        document.documentElement.classList.add('fonts-ready');\n        await applyInlineBGToResultCard(); // UI는 저해상도로 표시\n\n        document.getElementById('loading').style.display='none';\n        document.getElementById('resultContainer').style.display='block';\n        document.getElementById('resultContainer').scrollIntoView({ behavior:'smooth', block:'center' });\n\n        // [CLARITY] 결과 화면 진입\n        cSet('route', 'kname:result');\n        cEvent('view_result', { gender: selectedGender, name_len: (fullKo||'').length });\n      } catch(e){\n        document.getElementById('loading').style.display='none';\n        document.getElementById('nameForm').style.display='block';\n        alert('An error occurred while generating the name. Please try again.');\n      }\n    }\n    window.generateKoreanName = generateKoreanName;\n\n    function resetForm(){\n      document.getElementById('firstName').value = '';\n      document.getElementById('lastName').value  = '';\n      document.getElementById('resultContainer').style.display='none';\n      document.getElementById('nameForm').style.display='block';\n      document.getElementById('userNameDisplay').style.display='none';\n      document.getElementById('shareCTA').style.display='none';\n      document.getElementById('sharedTitle').style.display='none';\n      document.getElementById('btnRow')?.removeAttribute('style');\n      document.getElementById('shareRow')?.removeAttribute('style');\n\n      document.querySelectorAll('.gender-option').forEach(opt=>{\n        opt.classList.remove('selected'); opt.setAttribute('aria-selected','false');\n      });\n      const firstOpt = document.querySelector('.gender-option');\n      if (firstOpt) { firstOpt.classList.add('selected'); firstOpt.setAttribute('aria-selected','true'); }\n      selectedGender='neutral';\n\n      document.getElementById('topBanner')?.removeAttribute('hidden');\n\n      if (history?.replaceState) {\n        const clean = location.origin + location.pathname;\n        history.replaceState({}, '', clean);\n      }\n      document.getElementById('firstName').focus();\n\n      // [CLARITY] 폼으로 복귀\n      cSet('route', 'kname:form');\n      cEvent('view_form');\n    }\n    window.resetForm = resetForm;\n\n    /* =========================\n       텍스트 래핑 / 폰트 핏\n       ========================= */\n    function wrapLines(ctx, text, maxWidth, lineHeight) {\n      const words = (text || '').split(/\\s+/);\n      const lines = [];\n      let line = '';\n      for (let i = 0; i < words.length; i++) {\n        const test = line ? line + ' ' + words[i] : words[i];\n        if (ctx.measureText(test).width <= maxWidth || !line) line = test;\n        else { lines.push(line); line = words[i]; }\n      }\n      if (line) lines.push(line);\n      return lines;\n    }\n\n    function fitSingleLineFont(ctx, text, maxWidth, initialPx, minPx) {\n      let size = initialPx;\n      ctx.font = `normal 400 ${size}px \"YoonChildfundkoreaManSeh\", serif`;\n      while (size > minPx && ctx.measureText(text).width > maxWidth) {\n        size -= 1;\n        ctx.font = `normal 400 ${size}px \"YoonChildfundkoreaManSeh\", serif`;\n      }\n      return size;\n    }\n\n    /* =========================\n       직접 렌더 (UI/저장 공용)\n       useHighRes=true 시 저장용 고해상도 배경 사용\n       ========================= */\n    async function renderCardCanvasFast(scaleOverride, useHighRes = false) {\n      const card = document.getElementById('resultCard');\n      const elKoName = document.getElementById('koreanName');\n      const elKo = document.getElementById('koCharacteristic');\n      const elEn = document.getElementById('enCharacteristic');\n      if (!card || !elKoName || !elKo || !elEn) throw new Error('elements missing');\n\n      await waitForAssets();\n\n      const r = card.getBoundingClientRect();\n      const fallbackScale = Math.min(2.5, Math.max(2, window.devicePixelRatio || 2));\n      const scale = Math.max(1, scaleOverride || fallbackScale);\n\n      const W = Math.round(r.width * scale);\n      const H = Math.round(r.height * scale);\n\n      const canvas = document.createElement('canvas');\n      canvas.width = W; canvas.height = H;\n      const ctx = canvas.getContext('2d', { alpha: true });\n\n      // 배경 소스 선택: UI는 저해상도, 저장은 고해상도\n      const bgSrc = useHighRes ? BG_SAVE_URL : (BG_OBJECT_URL || BG_DISPLAY_URL);\n      await new Promise((resolve) => {\n        const img = new Image();\n        if (!/^data:/.test(bgSrc)) img.crossOrigin = 'anonymous';\n        img.onload = () => { ctx.drawImage(img, 0, 0, W, H); resolve(); };\n        img.onerror = () => { ctx.fillStyle = '#f0f0f0'; ctx.fillRect(0,0,W,H); resolve(); };\n        img.src = bgSrc;\n      });\n\n      // 위치/스타일 샘플링\n      const base = card.getBoundingClientRect();\n      const pickRect = (el) => {\n        const b = el.getBoundingClientRect();\n        const cs = getComputedStyle(el);\n        const padTopPx = parseFloat(cs.paddingTop || '0'); // px 단위\n        return {\n            x: Math.round((b.left - base.left) * scale),\n            y: Math.round((b.top  - base.top)  * scale),\n            w: Math.round(b.width  * scale),\n            h: Math.round(b.height * scale),\n            color: cs.color,\n            align: cs.textAlign,\n            padTop: Math.round(padTopPx * scale) // 스케일 반영한 padding-top\n        };\n        };\n      const Rname = pickRect(elKoName);\n      const Rko   = pickRect(elKo);\n      const Ren   = pickRect(elEn);\n\n      // 폰트 크기\n      let nameFontPx = Math.round(50 * scale);\n      const koFontPx = Math.round(20 * scale);\n      const enFontPx = Math.round(12 * scale);\n\n      // 이름(한 줄, 중앙, 폰트 자동핏)\n      ctx.save();\n      ctx.fillStyle = Rname.color || '#663300';\n      nameFontPx = fitSingleLineFont(ctx, elKoName.textContent || '', Rname.w, nameFontPx, Math.round(28 * scale));\n      ctx.textAlign = 'center'; ctx.textBaseline = 'middle';\n      ctx.fillText(elKoName.textContent || '', Rname.x + Rname.w/2, Rname.y + Rname.h/2);\n      ctx.restore();\n\n      // --- 한국어 설명(줄바꿈) ---\n        ctx.save();\n        ctx.fillStyle = Rko.color || '#5c3b1e';\n        ctx.font = `normal 400 ${koFontPx}px \"YoonChildfundkoreaDaeHan\", serif`;\n        ctx.textAlign = 'center';\n        ctx.textBaseline = 'top'; // ✅ top 기준으로 전환\n\n        const koLH = Math.round(koFontPx * 1.4);\n        const koLines = wrapLines(ctx, elKo.textContent || '', Rko.w, koLH);\n\n        // padding-top 반영 + 남은 높이에서 수직 중앙\n        const koPad = Rko.padTop || 0;                  // ← ①에서 pickRect에 추가해 둔 값\n        const koAvailH = Math.max(0, Rko.h - koPad);\n        const koBlockH = koLines.length * koLH;\n\n        let koY = Rko.y + koPad + Math.max(0, (koAvailH - koBlockH) / 2);\n        const koX = Rko.x + Rko.w / 2;\n\n        koLines.forEach(line => {\n        ctx.fillText(line, koX, koY);\n        koY += koLH;\n        });\n        ctx.restore();\n\n\n        // --- 영어 설명(줄바꿈) ---\n        ctx.save();\n        ctx.fillStyle = Ren.color || '#3d2c1c';\n        ctx.font = `${enFontPx}px \"DM Sans\", sans-serif`;\n        ctx.textAlign = 'center';\n        ctx.textBaseline = 'top'; // ✅ 동일하게 top 기준\n\n        const enLH = Math.round(enFontPx * 1.35);\n        const enLines = wrapLines(ctx, elEn.textContent || '', Ren.w, enLH);\n        const enBlockH = enLines.length * enLH;\n\n        let enY = Ren.y + Math.max(0, (Ren.h - enBlockH) / 2);\n        const enX = Ren.x + Ren.w / 2;\n\n        enLines.forEach(line => {\n        ctx.fillText(line, enX, enY);\n        enY += enLH;\n        });\n        ctx.restore();\n\n\n      return canvas;\n    }\n\n    /* =========================\n       이미지 저장 (저장 시 고해상도 사용)\n       ========================= */\n    async function downloadResultImage(){\n      try {\n        const UA = navigator.userAgent;\n        const isMobile = /Android|iPhone|iPad|iPod/i.test(UA);\n\n        // [CLARITY] 저장 버튼 클릭\n        cEvent('click_save', { device: isMobile ? 'mobile' : 'desktop' });\n\n        // 팝업 선오픈(iOS용)\n        let preOpenedWin = null;\n        if (isMobile) {\n          preOpenedWin = window.open('about:blank', '_blank');\n          if (!preOpenedWin) { alert('Pop-up was blocked. Please allow pop-ups and try again.'); return; }\n\n          // [CLARITY] 모바일 저장 화면(팝업) 노출 - 가상 라우트 태깅\n          cSet('route', 'kname:save_popup');\n          cEvent('view_save_popup', { device:'mobile' });\n\n          preOpenedWin.document.write(`\n            <!doctype html>\n            <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n            <title>Save Image</title>\n            <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n            <link href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&display=swap\" rel=\"stylesheet\">\n            <style>\n              body{margin:0;font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif;background:#f7f7f7;color:#222;user-select:none; -webkit-user-select:none;}\n              .wrap{padding:16px;max-width:640px;margin:0 auto;text-align:center}\n              img{max-width:100%;height:auto;border-radius:12px;box-shadow:0 2px 10px rgba(0,0,0,.08);-webkit-user-drag:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:auto;touch-action:none;}\n              h3{font-size:18px;margin:32px 0 20px;font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif;}\n              #ph{margin-bottom:32px;}\n              button{display:block;width:100%;border:none;border-radius:999px;padding:25px;font-weight:700;cursor:pointer;background:#FF6666;color:#fff;margin:24px 0 8px;font-size:18px;}\n            </style>\n            <div class=\"wrap\">\n              <h3>My Korean Name Is</h3>\n              <div id=\"ph\">Please wait a moment.</div>\n              <img id=\"preview\" style=\"display:none\" alt=\"korean-name\"/>\n              <button id=\"shareBtn\" style=\"display:none;padding:25px;\">Share</button>\n            </div>\n            <script>\n              // 공유 버튼 클릭 시 부모 창에 이벤트 전달 (Clarity는 부모가 수집)\n              (function(){\n                document.addEventListener('click', function(e){\n                  if (e.target && e.target.id === 'shareBtn' && window.opener && window.opener.postMessage) {\n                    try { window.opener.postMessage({ type: 'kname:share' }, '*'); } catch(_){}\n                  }\n                }, true);\n              })();\n            <\\/script>\n          `);\n          preOpenedWin.document.close();\n        }\n\n        const resultCard = document.getElementById('resultCard');\n        if (!resultCard) { alert('There are no results to save. Please generate a name first.'); return; }\n\n        // 배경의 실제 고해상도 크기 기반 스케일\n        const { w: natW } = await getBgNaturalSize();\n        const cardWidth = Math.max(1, resultCard.getBoundingClientRect().width);\n        const targetOutW = Math.min(natW || 1536, 2048, cardWidth * 2.5);\n        const preciseScale = Math.max(1, targetOutW / cardWidth);\n\n        // ✅ 저장 시에는 고해상도 배경 사용\n        let canvas = await renderCardCanvasFast(preciseScale, true);\n\n        // 실패 시 폴백\n        if (!canvas) {\n          canvas = await html2canvas(resultCard, {\n            useCORS:true, backgroundColor:null, logging:false, foreignObjectRendering:false, scale:preciseScale\n          });\n        }\n\n        // Blob 생성\n        const yyyymmdd = new Date().toISOString().slice(0,10).replace(/-/g,'');\n        const fileName = `korean-name-${yyyymmdd}.png`;\n        const blob = await new Promise((resolve) => {\n          if (canvas.toBlob) canvas.toBlob(b => resolve(b), 'image/png', 1.0);\n          else {\n            const dataURL = canvas.toDataURL('image/png', 1.0);\n            const arr = dataURL.split(','), mime = arr[0].match(/:(.*?);/)[1];\n            const bstr = atob(arr[1]); let n = bstr.length; const u8 = new Uint8Array(n);\n            while(n--) u8[n] = bstr.charCodeAt(n);\n            resolve(new Blob([u8], {type:mime}));\n          }\n        });\n\n        // 즉시 캔버스 해제(피크 메모리 절감)\n        try { canvas.width = 0; canvas.height = 0; } catch(_) {}\n        canvas = null;\n\n        if (isMobile) {\n          const blobUrl = URL.createObjectURL(blob);\n          const w = preOpenedWin || window.open('about:blank', '_blank');\n          if (!w) { alert('Pop-up was blocked. Please allow pop-ups and try again.'); return; }\n\n          const html = `\n            <!doctype html>\n            <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n            <title>Save / Share</title>\n            <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n            <link href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&display=swap\" rel=\"stylesheet\">\n            <style>\n              body{margin:0;font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif;background:#f7f7f7;color:#222}\n              .wrap{padding:16px;max-width:640px;margin:0 auto;text-align:center}\n              img{max-width:100%;height:auto;border-radius:12px;box-shadow:0 2px 10px rgba(0,0,0,.08)}\n              h3{font-size:18px;margin:32px 20px 20px;font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif;}\n              .btn{display:block;width:100%;border:none;border-radius:999px;padding:25px;font-weight:700;cursor:pointer;margin:24px 0 8px;font-size:18px;}\n              #shareBtn{background:#FF6666;color:#fff;padding:25px;}\n            </style>\n            <div class=\"wrap\">\n              <h3>Long-press to save the image,<br/>or take a screenshot to share it.</h3>\n              <img id=\"preview\" alt=\"korean-name\" src=\"${blobUrl}\" draggable=\"false\" ondragstart=\"return false;\" style=\"-webkit-user-drag:none; user-select:none; -webkit-user-select:none;\">\n              <button id=\"shareBtn\" class=\"btn\">Share</button>\n            </div>\n            <script>\n              (function(){\n                document.addEventListener('click', function(e){\n                  if (e.target && e.target.id === 'shareBtn' && window.opener && window.opener.postMessage) {\n                    try { window.opener.postMessage({ type: 'kname:share' }, '*'); } catch(_){}\n                  }\n                }, true);\n              })();\n            <\\/script>\n          `;\n          w.document.open(); w.document.write(html); w.document.close();\n\n          const d = w.document;\n          d.getElementById('shareBtn').onclick = async () => {\n            try {\n              const FileCtor = w.File || window.File;\n              const file = new FileCtor([blob], fileName, { type: 'image/png' });\n\n              if (typeof w.navigator.canShare === 'function' && w.navigator.canShare({ files: [file] })) {\n                await w.navigator.share({ files:[file], title:'My Korean Name', text:'Check out my Korean name card!' });\n                try { w.close(); } catch(_) {}\n                return;\n              }\n              if (typeof w.navigator.share === 'function') {\n                await w.navigator.share({ url:blobUrl, title:'My Korean Name', text:'Check out my Korean name card!' });\n                try { w.close(); } catch(_) {}\n                return;\n              }\n            } catch (err) {\n              if (!(err && (err.name === 'AbortError' || err.name === 'NotAllowedError'))) {\n                console.warn('Share failed:', err);\n              }\n            }\n          };\n\n          const revoke = () => { try { URL.revokeObjectURL(blobUrl); } catch(_){} };\n          w.addEventListener?.('pagehide', revoke);\n          w.addEventListener?.('unload', revoke);\n          return;\n        }\n\n        // 데스크톱 다운로드\n        const url = URL.createObjectURL(blob);\n        const a = document.createElement('a');\n        a.href = url; a.download = fileName;\n        document.body.appendChild(a); a.click(); document.body.removeChild(a);\n        URL.revokeObjectURL(url);\n\n        // [CLARITY] 데스크톱 저장 완료 이벤트\n        cEvent('download_desktop');\n        alert('Your image has been saved! Now share it with your friends.');\n      } catch (error) {\n        console.error('Download failed:', error);\n        alert('Failed to generate name card.');\n      }\n    }\n    window.downloadResultImage = downloadResultImage;\n\n    /* =========================\n       공유 링크\n       ========================= */\n    function escapeHtml(s) {\n      return (s||'').replace(/[&<>\"']/g, m=>({ '&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;' }[m]));\n    }\n\n    function buildShareURL(){\n      const name = document.getElementById('koreanName').textContent || '';\n      const ko   = document.getElementById('koCharacteristic').textContent || '';\n      const en   = document.getElementById('enCharacteristic').textContent || '';\n      const user = (document.getElementById('userName').textContent || '').replace(/,\\s*$/,'');\n      const params = new URLSearchParams({ shared:'1', name, ko, en, u:user });\n      return location.origin + location.pathname + '?' + params.toString();\n    }\n\n    async function shareCurrentResult(){\n      const url = buildShareURL();\n      try {\n        await navigator.clipboard.writeText(url);\n        // [CLARITY] 링크 복사 성공\n        cEvent('copied_link', { method:'clipboard' });\n        alert('Link copied! Now share it with your friends.');\n      } catch(e){\n        // [CLARITY] 링크 복사 실패 → 프롬프트 대체\n        cEvent('copied_link_fallback');\n        prompt('Copy the share link:', url);\n      }\n    }\n    document.getElementById('shareLinkBtn')?.addEventListener('click', function(){\n      // [CLARITY] Copy Link 버튼 클릭\n      cEvent('click_copy_link');\n      shareCurrentResult();\n    });\n\n    function loadFromURL(){\n      const qs = new URLSearchParams(location.search);\n      const isShared = qs.get('shared') === '1';\n      const name = qs.get('name');\n      const ko = qs.get('ko');\n      const en = qs.get('en');\n      const u  = qs.get('u');\n\n      if (name && ko && en){\n        document.getElementById('nameForm').style.display='none';\n        document.getElementById('topBanner')?.setAttribute('hidden','true');\n\n        setResultView({ fullKo:name, ko, en, user:'' });\n        document.getElementById('resultContainer').style.display='block';\n\n        if (isShared) {\n          document.getElementById('btnRow').style.display = 'none';\n          document.getElementById('shareRow').style.display = 'none';\n          document.getElementById('shareCTA').style.display = 'block';\n          const title = document.getElementById('sharedTitle');\n          title.innerHTML = `This is <strong>${escapeHtml(u || 'friend')}</strong>'s Korean name and the vibe behind it.`;\n          title.style.display = 'block';\n\n          // [CLARITY] 공유 링크로 진입한 공유보기 페이지\n          cSet('route', 'kname:shared_view');\n          cEvent('view_shared', { has_user: !!u });\n        } else {\n          document.getElementById('shareCTA').style.display = 'none';\n          document.getElementById('sharedTitle').style.display = 'none';\n\n          // [CLARITY] 직접 생성 결과 URL 로딩 (예외적 상황)\n          cSet('route', 'kname:result');\n          cEvent('view_result_direct');\n        }\n\n        setTimeout(()=>document.getElementById('resultContainer').scrollIntoView({behavior:'smooth', block:'center'}), 40);\n      } else {\n        document.getElementById('shareCTA').style.display = 'none';\n        document.getElementById('sharedTitle').style.display = 'none';\n        document.getElementById('userNameDisplay').style.display = 'none';\n\n        // [CLARITY] 기본 폼 화면\n        cSet('route', 'kname:form');\n        cEvent('view_form');\n      }\n    }\n\n    // 초기 진입: UI는 저해상도 사용\n    loadFromURL();\n    const resultCard = document.getElementById('resultCard');\n    if (resultCard) {\n      resultCard.style.backgroundImage = `url(\"${BG_DISPLAY_URL}\")`;\n    }\n    (async () => {\n      try { await applyInlineBGToResultCard(); } catch(_) {}\n      try { await preloadBackgroundImage(); } catch(_) {}\n    })();\n\n    /* 카운터 증가 (존재 시에만 업데이트) */\n    async function incrementCounter() {\n      try {\n        const response = await fetch('https://hangeulnamevisit.with-f85.workers.dev/api/count', { method:'POST' });\n        const data = await response.json();\n        const el = document.getElementById('counterNumber');\n        if (el && typeof data.count !== 'undefined') el.textContent = data.count;\n      } catch (error) {\n        console.log('증가 실패: ' + (error?.message || error));\n      }\n    }\n    window.incrementCounter = incrementCounter;\n  </script>\n</body>\n</html>","embedURL":""}},"547:503":{"mainComponentId":"530:409","type":"INSTANCE","id":"547:503","name":"Hello Bar 🔗","absoluteBoundingBox":{"x":3295.0,"y":100.0,"width":393.0,"height":180.0},"isolatedAbsoluteRenderBounds":{"x":3295.0,"y":100.0,"width":393.0,"height":180.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":393.0,"y":180.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.929411768913269,"g":0.929411768913269,"b":0.929411768913269,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":190,"localID":2831},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://courses.talktomeinkorean.com/hangeul-challenge-waitlist-2026-05?utm_source=eventpage&utm_medium=internal&utm_campaign=202605_courses_hangeulchallenge2&utm_content=260428&utm_term=hangeulname","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"paddingTop":12.0,"paddingRight":20.0,"paddingBottom":12.0,"paddingLeft":20.0,"layoutMode":"HORIZONTAL","layoutWrap":"WRAP","itemSpacing":20.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","counterAxisSpacing":10.0,"children":["I547:503;519:4300","I547:503;175:677","I547:503;1357:23486"],"componentProperties":{},"overrides":[{"key":[],"value":{"counterAxisSizingMode":"FIXED","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.929411768913269,"g":0.929411768913269,"b":0.929411768913269,"a":1.0},"visible":true,"opacity":1.0}],"size":{"x":393.0,"y":180.0},"interactions":[{"id":{"sessionID":190,"localID":2831},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://courses.talktomeinkorean.com/hangeul-challenge-waitlist-2026-05?utm_source=eventpage&utm_medium=internal&utm_campaign=202605_courses_hangeulchallenge2&utm_content=260428&utm_term=hangeulname","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}]},"componentId":"530:409"},{"key":["Frame 21472364880","Shop the Set0"],"value":{"characterStyleOverrides":[],"characters":"Join the 7-Day Challenge","lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"styleOverrideTable":{}},"componentId":"530:409"},{"key":["Frame 21472364880"],"value":{"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.501960813999176,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}]},"componentId":"530:409"},{"key":["​A stylish way to start Korean. The Ultimate Set + Premium Gifts.0"],"value":{"characterStyleOverrides":[7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8],"characters":"Turn your Korean name into real Hangeul skills. Learn Hangeul in 7 days.","lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"styleOverrideTable":{"8":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","fontSize":20.0,"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.501960813999176,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"lineHeightPx":32.0,"lineHeightPercent":122.88786315918,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"7":{"fontSize":15.0,"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"componentId":"530:409"},{"key":["Frame 21472364790"],"value":{"visible":false},"componentId":"530:409"}]},"108:1085":{"type":"FRAME","id":"108:1085","name":"Frame 3406","absoluteBoundingBox":{"x":-1418.0,"y":232.0,"width":345.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":-1418.0,"y":232.0,"width":345.0,"height":48.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":345.0,"y":48.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":113,"localID":487},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://courses.talktomeinkorean.com/","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"layoutMode":"HORIZONTAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","isInAnimateTree":true,"children":["113:131","108:1113"]},"377:689":{"type":"FRAME","id":"377:689","name":"Frame 3421","absoluteBoundingBox":{"x":2419.0,"y":1764.85546875,"width":345.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":2419.0,"y":1764.85546875,"width":345.0,"height":96.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,196.85546875]],"size":{"x":345.0,"y":96.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":24.0,"paddingBottom":24.0,"paddingLeft":24.0,"layoutMode":"HORIZONTAL","counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["377:504"]},"69:155":{"type":"TEXT","id":"69:155","name":"Elizabeth !","absoluteBoundingBox":{"x":3761.0,"y":193.0,"width":345.0,"height":38.0},"isolatedAbsoluteRenderBounds":{"x":3761.0,"y":193.0,"width":345.0,"height":38.0},"relativeTransform":[[1.0,0.0,466.0],[0.0,1.0,93.0]],"size":{"x":345.0,"y":38.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.133333340287209,"g":0.133333340287209,"b":0.133333340287209,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"constraintValues":{"left":{"pixelOffset":466.0,"sizeFraction":0.0},"top":{"pixelOffset":93.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":0.848927974700928,"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Elizabeth !","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":25.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":37.5,"lineHeightPercent":115.207366943359,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"377:411":{"type":"TEXT","id":"377:411","name":"How We Celebrated  Hangeul Day in 2024","absoluteBoundingBox":{"x":3530.0,"y":1498.0,"width":345.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":3571.89331054688,"y":1503.88000488281,"width":262.623291015625,"height":57.4759521484375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":345.0,"y":66.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.400000005960464,"g":0.198095247149467,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],"characters":"How We Celebrated  Hangeul Day in 2024 ","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":21.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-0.42,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.2999992370605,"lineHeightPercent":99.8463897705078,"lineHeightPercentFontSize":130.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"3":{"fontSize":28.0,"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.400000005960464,"g":0.198095247149467,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"2":{"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.400000005960464,"g":0.198095247149467,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"4:649":{"type":"TEXT","id":"4:649","name":"Elizabeth !","absoluteBoundingBox":{"x":2417.0,"y":193.0,"width":345.0,"height":38.0},"isolatedAbsoluteRenderBounds":{"x":2417.0,"y":193.0,"width":345.0,"height":38.0},"relativeTransform":[[1.0,0.0,466.0],[0.0,1.0,93.0]],"size":{"x":345.0,"y":38.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.133333340287209,"g":0.133333340287209,"b":0.133333340287209,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"constraintValues":{"left":{"pixelOffset":466.0,"sizeFraction":0.0},"top":{"pixelOffset":93.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":0.848927974700928,"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Elizabeth !","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":25.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":37.5,"lineHeightPercent":115.207366943359,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"377:505":{"type":"FRAME","id":"377:505","name":"hangeulface","absoluteBoundingBox":{"x":3530.0,"y":1604.0,"width":345.0,"height":292.85546875},"isolatedAbsoluteRenderBounds":{"x":3522.0,"y":1598.0,"width":361.0,"height":308.85546875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,106.0]],"size":{"x":345.0,"y":292.85546875},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[{"type":"DROP_SHADOW","visible":true,"color":{"r":0.0,"g":0.0,"b":0.0,"a":0.150000005960464},"blendMode":"NORMAL","offset":{"x":0.0,"y":2.0},"radius":8.0,"showShadowBehindNode":false,"spread":0.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":377,"localID":673},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://hangeulface.talktomeinkorean.com/","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[25.0,25.0,25.0,25.0],"cornerRadius":25.0,"clipsContent":true,"layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["377:734","377:688"]},"113:85":{"type":"SVG","id":"113:85","name":"Group 487080","absoluteBoundingBox":{"x":-841.0,"y":389.896728515625,"width":32.0,"height":22.2064361572266},"isolatedAbsoluteRenderBounds":{"x":-841.0,"y":389.896728515625,"width":32.0,"height":22.2064819335938},"relativeTransform":[[1.0,0.0,12.0],[0.0,1.0,16.896728515625]],"size":{"x":32.0,"y":22.2064361572266},"fills":[],"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":12.0,"sizeFraction":0.0},"top":{"pixelOffset":16.896728515625,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"hash":"b71286ba66a771f33fcabc8606425c2568f9036d"},"113:83":{"type":"FRAME","id":"113:83","name":"TTMIK Books","absoluteBoundingBox":{"x":-1418.0,"y":474.0,"width":140.0,"height":77.0},"isolatedAbsoluteRenderBounds":{"x":-1418.0,"y":474.0,"width":140.0,"height":77.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":140.0,"y":77.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":113,"localID":492},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://store.talktomeinkorean.com/","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"children":["108:1143","113:192"]},"113:97":{"type":"COMPONENT","id":"113:97","name":"Property 1=Youtube","absoluteBoundingBox":{"x":-853.0,"y":373.0,"width":56.0,"height":56.0},"isolatedAbsoluteRenderBounds":{"x":-853.0,"y":373.0,"width":56.0,"height":56.0},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,20.0]],"size":{"x":56.0,"y":56.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.850980401039124,"g":0.850980401039124,"b":0.850980401039124,"a":1.0},"visible":true,"opacity":1.0}],"constraintValues":{"left":{"pixelOffset":20.0,"sizeFraction":0.0},"top":{"pixelOffset":20.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":113,"localID":490},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://www.youtube.com/@talktomeinkorean","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[1000.0,1000.0,1000.0,1000.0],"cornerRadius":1000.0,"children":["113:85"],"componentSetId":"113:130"},"180:896":{"mainComponentId":"113:195","type":"INSTANCE","id":"180:896","name":"footer","absoluteBoundingBox":{"x":2395.0,"y":1908.0,"width":393.0,"height":589.0},"isolatedAbsoluteRenderBounds":{"x":2395.0,"y":1908.0,"width":393.0,"height":589.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,1615.0]],"size":{"x":393.0,"y":589.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.190692603588104,"g":0.190692603588104,"b":0.190692603588104,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"BOTTOM","horizontal":"LEFT_RIGHT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"bottom":{"pixelOffset":0.0,"sizeFraction":1.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":50.0,"paddingRight":24.0,"paddingBottom":50.0,"paddingLeft":24.0,"layoutMode":"HORIZONTAL","counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["I180:896;108:1081"],"componentProperties":{},"overrides":[{"key":[],"value":{"primaryAxisSizingMode":"FIXED"},"componentId":"113:195"},{"key":["Frame 34140","Frame 34130","Frame 34110"],"value":{"primaryAxisAlignItems":"SPACE_BETWEEN"},"componentId":"113:195"}]},"69:164":{"type":"FRAME","id":"69:164","name":"Mobile","absoluteBoundingBox":{"x":4159.0,"y":100.0,"width":375.0,"height":2520.0},"isolatedAbsoluteRenderBounds":{"x":4159.0,"y":100.0,"width":375.0,"height":2520.0},"relativeTransform":[[1.0,0.0,2272.0],[0.0,1.0,100.0]],"size":{"x":375.0,"y":2520.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"overflowDirection":"VERTICAL_SCROLLING","isBreakpointFrame":true,"children":["69:165","69:176","546:482","547:498"]},"113:36":{"type":"RECTANGLE","id":"113:36","name":"Rectangle 9157","absoluteBoundingBox":{"x":-782.0,"y":242.0,"width":48.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":-782.0,"y":242.0,"width":48.0,"height":48.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":48.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0117647061124444,"g":0.105882354080677,"b":0.18823529779911,"a":1.0},"visible":true,"opacity":1.0}],"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"rectangleCornerRadii":[6.0,6.0,6.0,6.0],"cornerRadius":6.0},"108:1113":{"type":"TEXT","id":"108:1113","name":"TTMIK Courses Structured online Korean courses","absoluteBoundingBox":{"x":-1354.0,"y":232.0,"width":281.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":-1353.51403808594,"y":240.184005737305,"width":208.255493164062,"height":33.9720001220703},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,0.0]],"size":{"x":281.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutGrow":1.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[35,35,35,35,35,35,35,35,35,35,35,35,35,34,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39],"characters":"TTMIK Courses Structured online Korean courses","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAlignVertical":"CENTER","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Medium","fontStyle":"Medium","fontVariantPosition":"NORMAL","fontSize":20.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":32.0,"lineHeightPercent":122.88786315918,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"35":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","fontSize":18.0,"lineHeightPx":28.8000011444092,"lineHeightPercent":122.88786315918,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"39":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-SemiBold","fontStyle":"SemiBold","fontSize":13.0,"lineHeightPx":20.8000011444092,"lineHeightPercent":122.88786315918,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"34":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","fontSize":12.0,"lineHeightPx":19.2000007629395,"lineHeightPercent":122.88786315918,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"}}},"69:144":{"type":"FRAME","id":"69:144","name":"이름생성기","absoluteBoundingBox":{"x":3499.0,"y":293.0,"width":393.0,"height":2259.0},"isolatedAbsoluteRenderBounds":{"x":3499.0,"y":293.0,"width":393.0,"height":2259.0},"relativeTransform":[[1.0,0.0,204.0],[0.0,1.0,193.0]],"size":{"x":393.0,"y":2259.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"BOTTOM","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-196.0,"sizeFraction":0.5},"right":{"pixelOffset":197.0,"sizeFraction":0.5},"bottom":{"pixelOffset":0.0,"sizeFraction":1.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"children":["69:145","69:152","180:897","377:669"]},"108:1140":{"type":"FRAME","id":"108:1140","name":"Frame 3411","absoluteBoundingBox":{"x":-1418.0,"y":474.0,"width":345.0,"height":77.0},"isolatedAbsoluteRenderBounds":{"x":-1418.0,"y":474.0,"width":345.0,"height":77.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,324.0]],"size":{"x":345.0,"y":77.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":51.0,"counterAxisAlignItems":"MAX","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","isInAnimateTree":true,"children":["113:83","113:188"]},"2:423":{"type":"FRAME","id":"2:423","name":"Desktop","absoluteBoundingBox":{"x":1951.0,"y":100.0,"width":1280.0,"height":2397.0},"isolatedAbsoluteRenderBounds":{"x":1951.0,"y":100.0,"width":1280.0,"height":2397.0},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,100.0]],"size":{"x":1280.0,"y":2397.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"overflowDirection":"VERTICAL_SCROLLING","isBreakpointFrame":true,"children":["3:452","4:649","546:477","547:502"]},"113:167":{"mainComponentId":"113:129","type":"INSTANCE","id":"113:167","name":"App Icon","absoluteBoundingBox":{"x":-1418.0,"y":376.0,"width":48.0,"height":48.0},"targetAspectRatio":{"x":48.0,"y":48.0},"isolatedAbsoluteRenderBounds":{"x":-1418.0,"y":376.0,"width":48.0,"height":48.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":48.0,"y":48.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.046875,"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"rectangleCornerRadii":[6.0,6.0,6.0,6.0],"cornerRadius":6.0,"clipsContent":true,"children":["I113:167;113:43","I113:167;113:44"],"componentSetId":"113:100","componentProperties":{"Property 1":{"value":"Seyo","type":"VARIANT","boundVariables":{}}},"overrides":[{"key":[],"value":{"size":{"x":48.0,"y":48.0}},"componentId":"113:129"}]},"69:143":{"type":"FRAME","id":"69:143","name":"Tablet","absoluteBoundingBox":{"x":3295.0,"y":100.0,"width":800.0,"height":2452.0},"isolatedAbsoluteRenderBounds":{"x":3295.0,"y":100.0,"width":800.0,"height":2452.0},"relativeTransform":[[1.0,0.0,1408.0],[0.0,1.0,100.0]],"size":{"x":800.0,"y":2452.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"overflowDirection":"VERTICAL_SCROLLING","isBreakpointFrame":true,"children":["69:144","69:155","546:481","547:503"]},"69:174":{"type":"TEXT","id":"69:174","name":"My Korean Name Is","absoluteBoundingBox":{"x":4254.5,"y":336.0,"width":184.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":4255.65966796875,"y":341.399993896484,"width":180.87744140625,"height":16.5599975585938},"relativeTransform":[[1.0,0.0,15.0],[0.0,1.0,5.0]],"size":{"x":184.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.400000005960464,"g":0.198095247149467,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":1.85342264175415,"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"My Korean Name Is","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"DM Mono","fontPostScriptName":"DMMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.4360008239746,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"530:412":{"type":"TEXT","id":"530:412","name":"​A stylish way to start Korean. The Ultimate Set + Premium Gifts.","overrideKey":"175:677","absoluteBoundingBox":{"x":461.0,"y":316.0,"width":534.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":461.738372802734,"y":320.950012207031,"width":532.274047851562,"height":17.0099792480469},"relativeTransform":[[1.0,0.0,361.0],[0.0,1.0,16.0]],"size":{"x":534.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.219607844948769,"g":0.239215686917305,"b":0.254901975393295,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","minWidth":280.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"​A stylish way to start Korean. The Ultimate Set + Premium Gifts.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PIXELS","lineHeightPx":24.3000011444092,"lineHeightPercent":103.686630249023,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"69:152":{"type":"FRAME","id":"69:152","name":"Frame 3403","absoluteBoundingBox":{"x":3588.5,"y":328.0,"width":214.0,"height":33.0},"isolatedAbsoluteRenderBounds":{"x":3588.5,"y":328.0,"width":214.0,"height":33.0},"relativeTransform":[[1.0,0.0,89.5],[0.0,1.0,35.0]],"size":{"x":214.0,"y":33.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":0.820261478424072,"b":0.7843137383461,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-107.0,"sizeFraction":0.5},"right":{"pixelOffset":107.0,"sizeFraction":0.5},"top":{"pixelOffset":35.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.400000005960464,"g":0.198095247149467,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":89,"localID":784},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[5.0,5.0,5.0,5.0],"cornerRadius":5.0,"paddingTop":5.0,"paddingRight":15.0,"paddingBottom":5.0,"paddingLeft":15.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","children":["69:153"]},"69:153":{"type":"TEXT","id":"69:153","name":"My Korean Name Is","absoluteBoundingBox":{"x":3603.5,"y":333.0,"width":184.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":3604.65966796875,"y":338.399993896484,"width":180.877685546875,"height":16.5599975585938},"relativeTransform":[[1.0,0.0,15.0],[0.0,1.0,5.0]],"size":{"x":184.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.400000005960464,"g":0.198095247149467,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":1.85342264175415,"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"My Korean Name Is","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"DM Mono","fontPostScriptName":"DMMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.4360008239746,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"530:409":{"type":"COMPONENT","id":"530:409","name":"Hello Bar 🔗","overrideKey":"175:676","absoluteBoundingBox":{"x":100.0,"y":300.0,"width":1280.0,"height":56.0},"isolatedAbsoluteRenderBounds":{"x":100.0,"y":300.0,"width":1280.0,"height":56.0},"relativeTransform":[[1.0,0.0,100.0],[0.0,1.0,300.0]],"size":{"x":1280.0,"y":56.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":0.666666686534882,"b":0.333333343267441,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":190,"localID":2831},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://ttmik.me/40foMAL","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"paddingTop":12.0,"paddingRight":20.0,"paddingBottom":12.0,"paddingLeft":20.0,"layoutMode":"HORIZONTAL","layoutWrap":"WRAP","itemSpacing":20.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSpacing":10.0,"children":["530:410","530:412","530:413"]},"69:113":{"type":"TEXT","id":"69:113","name":"My Korean Name Is","absoluteBoundingBox":{"x":2499.5,"y":333.0,"width":184.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":2500.65966796875,"y":338.399993896484,"width":180.877685546875,"height":16.5599975585938},"relativeTransform":[[1.0,0.0,15.0],[0.0,1.0,5.0]],"size":{"x":184.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.400000005960464,"g":0.198095247149467,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":1.85342264175415,"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"My Korean Name Is","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"DM Mono","fontPostScriptName":"DMMono-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.4360008239746,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"69:145":{"type":"WIDGET","id":"69:145","name":"Embed 1","absoluteBoundingBox":{"x":3508.0,"y":413.0,"width":375.0,"height":1015.0},"isolatedAbsoluteRenderBounds":{"x":3508.0,"y":413.0,"width":375.0,"height":1015.0},"relativeTransform":[[1.0,0.0,9.0],[0.0,1.0,120.0]],"size":{"x":375.0,"y":1015.0},"constraints":{"vertical":"TOP","horizontal":"LEFT_RIGHT"},"constraintValues":{"left":{"pixelOffset":9.0,"sizeFraction":0.0},"right":{"pixelOffset":-9.0,"sizeFraction":1.0},"top":{"pixelOffset":120.0,"sizeFraction":0.0}},"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"widgetType":"GENERIC","syncedState":{"embedAllowFullscreen":"false","embedCodeType":"html","embedIframeHtml":"<!DOCTYPE html>\n<html lang=\"ko\">\n<head>\n  <meta charset=\"UTF-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>\n  <title>한글이름 MY KOREAN NAME IS</title>\n\n  <!-- Sentry (옵션 유지) -->\n  <script src=\"https://js.sentry-cdn.com/01a272064480dbf2fd4c3ee2de7bfcf6.min.js\" crossorigin=\"anonymous\"></script>\n  <script>\n    Sentry.init({\n      dsn: \"https://01a272064480dbf2fd4c3ee2de7bfcf6@o1189375.ingest.us.sentry.io/4510108487647232\",\n      enableLogs: true,\n    });\n  </script>\n\n  <!-- DM Sans -->\n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n  <link href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&display=swap\" rel=\"stylesheet\">\n\n  <!-- 프리로드: UI 표시용 저해상도 배경만 선로딩 -->\n  <link rel=\"preload\" as=\"font\" type=\"font/woff2\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaDaeHan.woff2\">\n  <link rel=\"preload\" as=\"font\" type=\"font/woff2\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaManSeh.woff2\">\n  <link rel=\"preload\" as=\"image\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/name-card.png\">\n\n  <style>\n    /* 폰트(라이트 전용) */\n    @font-face {\n      font-family: 'YoonChildfundkoreaDaeHan';\n      src: url('https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaDaeHan.woff2') format('woff2'),\n           url('https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaDaeHan.woff') format('woff');\n      font-weight: 400; font-style: normal; font-display: swap;\n    }\n    @font-face {\n      font-family: 'YoonChildfundkoreaManSeh';\n      src: url('https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaManSeh.woff2') format('woff2'),\n           url('https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaManSeh.woff') format('woff');\n      font-weight: 400; font-style: normal; font-display: swap;\n    }\n\n    html, body { -webkit-text-size-adjust:100%; text-size-adjust:100%; }\n    * { margin:0; padding:0; box-sizing:border-box; }\n    body { font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif; color:#333; background:#fff; }\n\n    button, .generate-btn, .retry-btn, .save-btn, .share-link-btn, .cta-btn, .gender-option {\n      font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif !important;\n      font-size:16px !important; letter-spacing:0;\n    }\n\n    .container { width:100%; padding:20px; max-width:720px; margin:0 auto; }\n    .header { margin-bottom:20px; }\n    .top-banner { text-align:center; font-size:18px; line-height:1.5; color:#663300; font-weight:500; margin-bottom:50px; }\n    .top-banner strong { color:#FF6666; }\n\n    .shared-title { text-align:center; font-size:20px; line-height:1.5; color:#663300; font-weight:400; margin:12px 0 36px; display:none; }\n\n    .user-name-display { text-align:center; margin-bottom:20px; color:#663300; display:none; }\n    .user-name { font-size:22px; font-weight:700; margin-bottom:6px; }\n    .generated-msg { font-size:18px; font-weight:400; }\n\n    .form-group { margin-bottom:24px; }\n    .form-label { display:block; font-weight:600; margin-bottom:8px; color:#000; font-size:14px; }\n    .form-input { width:100%; padding:12px; border:1px solid #ddd; font-size:16px; background:#fff; border-radius:8px; color:#000; }\n    .form-input:focus { outline:none; border-color:#333; }\n    /* ✅ PII 보호: 이름 입력은 Clarity에서 마스킹 */\n    .form-input[data-clarity-mask=\"true\"] {}\n\n    .gender-options { display:flex; gap:10px; margin-top:8px; }\n    .gender-option { flex:1; padding:12px; border:1px solid #ddd; text-align:center; cursor:pointer; background:#fff; font-size:14px; user-select:none; border-radius:8px; }\n    .gender-option:hover { border-color:#3C82E8; }\n    .gender-option.selected { border-color:#3C82E8; background:#3C82E8; color:#fff; }\n\n    .generate-btn { width:100%; padding:25px; background:#FF6666; color:#fff; border:none; font-size:16px; font-weight:600; text-align:center; cursor:pointer; margin-top:40px; border-radius:50px; }\n    .generate-btn:hover { background:#e95a5a; }\n\n    .form-footer { margin:50% 0; display:flex; flex-direction:column; align-items:center; gap:20px; }\n    .form-footer__img { width:120px; height:60px; display:block; }\n    .form-footer__text { font-size:16px; line-height:1.5; color:#333; margin:0; text-align:center; }\n\n    .result-container { margin-top:30px; text-align:center; display:none; }\n\n    /* ✅ 결과 카드: UI는 저해상도, 스크롤 방해 없이 pan-y 허용 */\n    .result-card {\n      position: relative;\n      width: 100%;\n      max-width: 420px;\n      aspect-ratio: 768 / 1364;\n      margin: 20px auto;\n      border-radius: 16px;\n      overflow: hidden;\n\n      /* UI 표시용: 저해상도 기본값 (var 미지정 시 디폴트) */\n      background-image: var(--background-image, url('https://hangeulname-assets.talktomeinkorean.com/name-card.png'));\n      background-size: cover;\n      background-position: center top;\n\n      -webkit-user-select: none;\n      user-select: none;\n      -webkit-touch-callout: none;\n\n      /* 스크롤은 수직만 통과 */\n      touch-action: pan-y;\n\n      /* 렌더 최적화 */\n      will-change: transform;\n      contain: layout paint;\n    }\n\n    .result-card * {\n      -webkit-user-select: none;\n      user-select: none;\n      -webkit-touch-callout: none;\n    }\n\n    .result-inner { position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; text-align:center; padding-top:38%; gap:7%; height:88%; }\n\n    .korean-name, .ko-characteristic { font-synthesis:weight; }\n\n    .korean-name {\n      font-family:\"YoonChildfundkoreaManSeh\", serif !important; font-size:50px; font-weight:400;\n      color:#663300; height:22%; display:flex; align-items:center; justify-content:center; max-width:70%;\n    }\n    .ko-characteristic {\n      font-family:\"YoonChildfundkoreaDaeHan\", serif !important; font-weight:400; font-size:20px;\n      color:#5c3b1e; line-height:1.6; max-width:72%; height:40%;\n      display:flex; align-items:center; justify-content:center; padding-top:12%;\n    }\n    .en-characteristic {\n      font-family:'DM Sans', sans-serif; font-size:12px; color:#3d2c1c; line-height:1.4; max-width:70%; height:13%;\n      display:flex; align-items:center; justify-content:center;\n    }\n\n    .btn-row { display:block; margin-top:32px; }\n    \n    .save-btn {\n      display:block; width:100%; padding:22px; border:none; border-radius:50px; font-weight:600; cursor:pointer;\n      margin-top:24px; transition:.2s; text-align:center; background:#FF6666; color:#fff;\n    }\n    .save-btn:hover { opacity:.9; }\n\n    .share-row { display:block; }\n\n    .share-row p { text-align:center; margin-top:32px; }\n    #shareRow, #shareLinkBtn { position: relative; z-index: 10; }\n\n    .share-link-btn{\n    -webkit-user-select: none;\n    user-select: none;\n    -webkit-touch-callout: none;\n    touch-action: manipulation; /* iOS: 탭을 클릭으로, 핀치/더블탭 확대 방지 */\n    pointer-events: auto;\n    width:100%; border:1px solid #FF6666; color:#FF6666; background:#fff; margin-top:20px; padding:22px; border-radius:50px;text-align:center; font-weight:600; cursor:pointer;\n    }\n\n    .share-link-btn:hover { opacity:.9; }\n\n    .share-cta { margin-top:24px; display:none; }\n    .cta-btn { display:inline-block; padding:25px; border-radius:999px; background:#FF6666; color:#fff; font-weight:700; border:none; cursor:pointer; width:100%; text-align:center; }\n    .cta-btn:hover { opacity:.9; }\n\n    .loading { text-align:center; padding:20px; display:none; }\n    .loading-spinner { width:30px; height:30px; border:3px solid #ddd; border-left:3px solid #333; border-radius:50%; animation:spin 1s linear infinite; margin:0 auto 15px; }\n    @keyframes spin { 0%{transform:rotate(0)} 100%{transform:rotate(360deg)} }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <div id=\"topBanner\" class=\"top-banner\" aria-live=\"polite\">\n        Type in your name below and <br/>you will get a Korean-style name <br/>along with a fun personality match <br/>that reflects Korean vibes.\n      </div>\n      <div id=\"sharedTitle\" class=\"shared-title\"></div>\n\n      <div class=\"user-name-display\" id=\"userNameDisplay\">\n        <div class=\"user-name\" id=\"userName\"></div>\n        <div class=\"generated-msg\">Here's your Korean name and the vibe behind it!</div>\n      </div>\n    </div>\n\n    <!-- 입력 폼 -->\n    <div id=\"nameForm\">\n      <div class=\"form-group\">\n        <label class=\"form-label\" for=\"firstName\">이름 (First Name)</label>\n        <!-- ✅ PII 마스킹 -->\n        <input data-clarity-mask=\"true\" type=\"text\" id=\"firstName\" class=\"form-input\" placeholder=\"Michael, Sophie, Omar, Fatima...\">\n      </div>\n      <div class=\"form-group\">\n        <label class=\"form-label\" for=\"lastName\">성 (Last Name)</label>\n        <!-- ✅ PII 마스킹 -->\n        <input data-clarity-mask=\"true\" type=\"text\" id=\"lastName\" class=\"form-input\" placeholder=\"Johnson, Kim, Hassan, Al-Ahmad...\">\n      </div>\n      <div class=\"form-group\">\n        <label class=\"form-label\">Name type</label>\n        <div class=\"gender-options\" role=\"tablist\" aria-label=\"Name type options\">\n          <div class=\"gender-option selected\" role=\"tab\" aria-selected=\"true\" tabindex=\"0\" onclick=\"selectGender('neutral', this)\">unisex</div>\n          <div class=\"gender-option\" role=\"tab\" aria-selected=\"false\" tabindex=\"0\" onclick=\"selectGender('female', this)\">feminine</div>\n          <div class=\"gender-option\" role=\"tab\" aria-selected=\"false\" tabindex=\"0\" onclick=\"selectGender('male', this)\">masculine</div>\n        </div>\n      </div>\n      <button type=\"button\" class=\"generate-btn\" onclick=\"generateKoreanName(); incrementCounter();\">Generate Korean Name</button>\n      <div class=\"form-footer\" id=\"formFooter\" aria-live=\"polite\">\n        <img class=\"form-footer__img\"\n             src=\"https://hangeulname.figma.site/_assets/v11/f07271865ca56eb133ad7f8ad37a73790d341337.svg\"\n             alt=\"Hangeul Day Campaign\" width=\"120\" height=\"auto\" decoding=\"async\" loading=\"lazy\" />\n        <p class=\"form-footer__text\">\n          This service is created by <br/>Talk To Me In Korean.\n        </p>\n      </div>\n    </div>\n\n    <!-- 로딩 -->\n    <div class=\"loading\" id=\"loading\">\n      <div class=\"loading-spinner\"></div>\n      <p>Creating your unique Korean name...</p>\n    </div>\n\n    <!-- 결과 -->\n    <div class=\"result-container\" id=\"resultContainer\">\n      <div class=\"result-card\" id=\"resultCard\">\n        <div class=\"result-inner\">\n          <div class=\"korean-name\" id=\"koreanName\"></div>\n          <div class=\"ko-characteristic\" id=\"koCharacteristic\"></div>\n          <div class=\"en-characteristic\" id=\"enCharacteristic\"></div>\n        </div>\n      </div>\n\n      <div id=\"btnRow\" class=\"btn-row\">\n        <button class=\"save-btn\" onclick=\"downloadResultImage()\">Save & Share</button>\n      </div>\n\n      <div id=\"shareRow\" class=\"share-row\">\n        <button id=\"shareLinkBtn\" class=\"share-link-btn\">Copy Link</button>\n        <p>Please screenshot if you cannot <br/>save the image.</p>\n      </div>\n\n      <div id=\"shareCTA\" class=\"share-cta\">\n        <a class=\"cta-btn\" href=\"https://hangeulname.figma.site/\" target=\"_blank\" rel=\"noopener noreferrer\">Create My Korean Name Too</a>\n      </div>\n    </div>\n  </div>\n\n  <!-- html2canvas (희박한 폴백용) -->\n  <script src=\"https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js\"></script>\n\n  <script>\n    /* =========================\n       [CLARITY] 안전한 호출 유틸\n       - Figma Sites <head>에 설치된 Clarity 스니펫과 충돌 없이 동작\n       - 미로딩 시 큐에 쌓였다가 처리\n       ========================= */\n    (function(){\n      if (!window.clarity) {\n        window.clarity = function(){ (window.clarity.q = window.clarity.q || []).push(arguments); };\n      }\n    })();\n    function cSet(key, val){ try { window.clarity && window.clarity('set', key, val); } catch(_){} }\n    function cEvent(name, props){ try { window.clarity && window.clarity('event', name, props || {}); } catch(_){} }\n\n    // 팝업-부모 통신으로 공유 버튼 클릭 이벤트 수집\n    window.addEventListener('message', function(e){\n      if (e && e.data && e.data.type === 'kname:share') {\n        cEvent('click_share_in_popup', { source: 'save_popup' });\n      }\n    }, false);\n\n    /* =========================\n       전역 상태 / BG URL\n       ========================= */\n    let selectedGender = 'neutral';\n    let BG_OBJECT_URL = null; // UI 표시용 objectURL 캐시\n\n    // ✅ UI 표시용(저해상도) / 저장용(고해상도) 분리\n    const BG_DISPLAY_URL = 'https://hangeulname-assets.talktomeinkorean.com/name-card.png';\n    const BG_SAVE_URL    = 'https://hangeulname-assets.talktomeinkorean.com/name-card.png';\n\n    /* =========================\n       배경 크기(저장 스케일 계산용)\n       ========================= */\n    async function getBgNaturalSize() {\n      return new Promise((resolve) => {\n        const img = new Image();\n        img.onload = () => resolve({ w: img.naturalWidth || 768, h: img.naturalHeight || 1364 });\n        img.onerror = () => resolve({ w: 768, h: 1364 });\n        img.crossOrigin = 'anonymous';\n        img.src = BG_SAVE_URL; // 저장 고해상도 기준으로 확인\n        setTimeout(() => resolve({ w: 768, h: 1364 }), 3000);\n      });\n    }\n\n    /* =========================\n       UI 배경: 저해상도 objectURL로 적용\n       ========================= */\n    async function applyInlineBGToResultCard() {\n      const card = document.getElementById('resultCard');\n      if (!card) return;\n      try {\n        const res = await fetch(BG_DISPLAY_URL, { mode: 'cors', credentials: 'omit', cache: 'no-cache' });\n        if (!res.ok) throw new Error('BG fetch failed: ' + res.status);\n        const blob = await res.blob();\n\n        if (BG_OBJECT_URL) {\n          try { URL.revokeObjectURL(BG_OBJECT_URL); } catch(_) {}\n          BG_OBJECT_URL = null;\n        }\n\n        BG_OBJECT_URL = URL.createObjectURL(blob);\n        card.style.setProperty('--background-image', `url(\"${BG_OBJECT_URL}\")`);\n        card.style.backgroundImage = `var(--background-image)`;\n      } catch (e) {\n        console.warn('[applyInlineBGToResultCard] fallback to direct URL:', e);\n        card.style.setProperty('--background-image', `url(\"${BG_DISPLAY_URL}\")`);\n        card.style.backgroundImage = `var(--background-image)`;\n      }\n    }\n\n    /* =========================\n       UI 체감속도: 저해상도만 프리로드\n       ========================= */\n    async function preloadBackgroundImage() {\n      return new Promise((resolve) => {\n        const img = new Image();\n        img.crossOrigin = 'anonymous';\n        img.onload = () => resolve(img);\n        img.onerror = () => resolve(null);\n        img.src = BG_DISPLAY_URL;\n        setTimeout(() => resolve(null), 5000);\n      });\n    }\n\n    async function ensureBackgroundLoaded() {\n      const card = document.getElementById('resultCard');\n      if (!card) return false;\n      const current = getComputedStyle(card).backgroundImage;\n      if (current === 'none' || !current.includes('name-card')) {\n        card.style.backgroundImage = `url(\"${BG_DISPLAY_URL}\")`;\n      }\n      const img = await preloadBackgroundImage();\n      return !!img;\n    }\n\n    /* =========================\n       데이터\n       ========================= */\n    const koreanSurnames = ['김','이','박','최','정','강','조','윤','장','임','한','오','서','신','권','황','안','송','전','홍','유','고','문','양','손','배','백','허','남','심','노','하','곽','성','차','주','우','구','민','류'];\n    const maleNames = ['민준','도윤','시우','예준','하준','지호','주원','지후','도현','준우','준서','건우','현우','우진','선우','지훈','유준','은우','연우','서진','이준','민재','시윤','현준','정우','윤우','수호','지우','승우','유찬','지환','승현','이안','준혁','시후','진우','승민','민성','수현','지원','태민','재현','승준','지민','민호','현서','하민','성현','예성','하람','승완','태현','이든','태오','규민','민혁','태양','성준','윤성','다온','정민','현우','정국','지민','진','태형','윤기','남준','호석','민규','정한','원우'];\n    const femaleNames = ['서연','지아','서아','다은','예은','예린','소윤','유나','채은','윤아','아린','예나','가은','주아','예진','민지','나은','서은','나윤','채아','다연','소은','예지','나연','세아','지은','은채','예빈','윤지','소연','채린','소민','승아','혜원','소이','세은','리아','민아','나현','경화','지수','제니','채영','원영','유진','가을','겨울','지민','민정','은경','아영','규리','연아','가윤','채이','지연','예림','유정','소현','경은'];\n    const neutralNames = ['라온','시안','이루','하늘','별','나루','율','설','바다','해솔','가람','온유','연우','지후','하람','이든','서우','민서','하온','도경','시원','윤호','은찬','동현','재원','민규','하진','이현','민찬','우빈','로운','하율','도하','지율','준호','윤재','준','성민','태민','재현'];\n    const characteristics = [\n        {ko: '사람 처음 만나면 MBTI부터 물어봄', en: 'When meeting someone for the first time, they ask about MBTI right away'},\n        {ko: '엘리베이터 타면 닫힘 버튼 계속 누름', en: 'Keeps rapidly pressing the elevator close button'},\n        {ko: '휴지 달라고 하면 꼭 두 장 줌', en: 'Always gives exactly two tissues when asked'},\n        {ko: '만날 때마다 밥 먹었냐고 물어봄', en: 'Asks \"Did you eat?\" every time you meet with them'},\n        {ko: '겨울에도 아이스 아메리카노만 마심', en: 'Drinks iced americano even in winter'},\n        {ko: '밥 먹을 때 마지막 한 입 꼭 남김', en: 'Always leaves the last bite of food'},\n        {ko: '여럿이 먹을 때 마지막 한 조각은 꼭 양보함', en: 'Insists others take the last piece when sharing'},\n        {ko: '전자레인지 끝날 때까지 못 기다리고 20초 전부터 꺼낼 준비하고 있음', en: 'Hovers by the microwave to stop it with 20 seconds still left'},\n        {ko: '치킨은 무조건 반반으로 시킴', en: 'Always orders half-and-half fried chicken'},\n        {ko: '물이나 음료수 마실 때도 계속 \"짠\" 하자고 함', en: 'Says \"cheers\" and clinks glasses even when drinking water'},\n        {ko: '식당 가면 수저 세팅부터 함', en: 'Sets out chopsticks and spoon first thing at restaurants'},\n        {ko: '공항 보안 검색대 빠르게 통과하려고 미리 짐 다 꺼내서 준비함', en: 'Takes their laptop out of their bag before airport security to breeze through the line'},\n        {ko: '길 알려 주다가 결국 직접 데려다줌', en: 'Ends up personally escorting people to their destination instead of giving directions'},\n        {ko: '핸드폰으로 자리 맡아 두고 주문하러 감', en: 'Leaves phone on empty table to save it before ordering food'},\n        {ko: '야식 안 먹으면 하루가 허전함', en: 'Their day somehow feels incomplete without having a late-night snack'},\n        {ko: '감기 걸리면 바로 병원 감', en: 'Treats a runny nose like a medical emergency'},\n        {ko: '\"다음에 밥 한번 먹자\" 해 놓고 실제로는 안 먹음', en: 'Says \"Let’s grab a meal sometime\" but never actually initiates it'},\n        {ko: \"'아니', '근데' 없으면 대화 못 함\", en: 'Starts every conversation with \"No\" or \"But\"'},\n        {ko: '심심하면 카톡 프로필 사진 바꿈', en: 'Changes KakaoTalk profile picture for no particular reason'},\n        {ko: '친구들 카톡 프로필 사진 다 확인해 봄', en: 'Checks everyone else’s KakaoTalk profile pictures religiously'},\n        {ko: '메뉴 고르다 결국 늘 먹던 거 고름', en: 'Spends forever debating what to order then ends up ordering their usual'},\n        {ko: '길에서 아는 사람 만나면 어색해함', en: 'Feels awkward when running into acquaintances on the street'},\n        {ko: '술 마실 때 \"딱 한 잔만 더\" 하다가 막차 놓침', en: 'Says \"just one more drink\" and misses the last train of the night'},\n        {ko: '밥 먹을 때 김치 없으면 못 참음', en: 'Can’t eat meals without kimchi on the side'},\n        {ko: '불닭볶음면 잘 먹는 척하지만 현실은 까르보불닭', en: 'Pretends to handle super spicy ramyeon but secretly gets the mild version'},\n        {ko: '배달 시키면 라이더 위치 실시간으로 확인함', en: 'Tracks delivery drivers in real-time like NASA mission control'},\n        {ko: '\"어디 갈래?\" 하면 맨날 카페 가자고 함', en: 'Always suggests going to a café when asked where to hang out'},\n        {ko: '새로 생긴 카페 다 꿰고 있음', en: 'Knows every new café that opens in the neighborhood'},\n        {ko: '예의상 두 번 거절하고 세 번째에 좋다고 함', en: 'Keeps refusing until asked three times to be polite, then finally says yes'},\n        {ko: '와이파이 조금만 느려도 바로 핫스팟 켬', en: 'Has zero patience for slow WiFi and immediately switches to hotspot at the slightest lag'},\n        {ko: '횡단보도 건널 때도 폰만 봄', en: 'Stares at phone even while crossing the street'},\n        {ko: '고기 먹을 때 상추 없으면 못 참음', en: 'Needs lettuce wraps for BBQ'},\n        {ko: '라면 끓일 때 계란 꼭 넣음', en: 'Always cracks an egg into their ramyeon'},\n        {ko: '배부르다고 했으면서 \"후식 뭐 먹을래?\" 물어봄', en: 'Claims to be full, then immediately asks what’s for dessert'},\n        {ko: '소파에 안 앉고 바닥에 앉아서 소파를 등받이로 씀', en: 'Sits on the floor using the sofa as a backrest'},\n        {ko: '웃을 때 박수 치면서 옆 사람 때림', en: 'Claps while laughing and accidentally hits whoever’s nearby'},\n        {ko: '같은 말 두 번씩 반복함 (\"아니, 아니\")', en: 'Repeats words twice (\"No, no\" or \"Wait, wait\")'},\n        {ko: '뭐 물어보면 \"몰라\"라고 하면서 알려 줌 (\"몰라, 집에.\")', en: 'Says \"I don’t know\" before telling you the answer to your question anyways'},\n        {ko: '여름에 에어컨 틀고 이불 덮고 잠', en: 'Sleeps under blankets with the AC blasting in summer'},\n        {ko: '겨울에 난방 켜고 반팔 입고 잠', en: 'Cranks up the heated floors and then sleeps in a t-shirt during winter'},\n        {ko: '선물 받으면 뭘 이런 걸 다 준비했냐고 하지만 속으로는 좋아함', en: 'Acts like gifts are unnecessary while secretly being thrilled'},\n        {ko: '식당에서 수저 밑에 휴지 꼭 깔아 줌', en: 'Always puts napkins under utensils at restaurants'},\n        {ko: '라면만 먹는 친구 걱정해서 밥 먹이러 끌고 감', en: 'Drags friends who live on ramyeon to eat real food'},\n        {ko: '리모컨 맨날 어디 뒀는지 잊어버리고 여기저기 찾으러 다님', en: 'Spends more time looking for the TV remote than actually watching TV'},\n        {ko: '어디를 가든 콘센트부터 찾음', en: 'Has a sixth sense for finding power outlets in any room'},\n        {ko: '반찬 중 제일 맛있는 건 아껴 놨다가 마지막에 먹음', en: 'Saves the best side dish for last like it’s the grand finale'},\n        {ko: '컵라면 기다리는 3분 동안 초 단위로 시계 봄', en: 'Counts down every second of those 3 minutes while waiting for cup noodles to cook'},\n        {ko: '물건 찾을 때 \"어디 보자~\" 하면서 노래하듯 말함', en: 'Sing-songs \"Let me see…\" when looking for things'},\n        {ko: '\"다이어트는 내일부터\"라고 하면서 디저트 찾아 먹음', en: 'Says \"Diet starts tomorrow\" then immediately goes looking for dessert'},\n        {ko: '맛있으면 0칼로리라고 함', en: 'Claims delicious food has zero calories'},\n        {ko: '항상 후면 주차 하려고 함', en: 'Has an unexplainable obsession with reverse parking'},\n        {ko: '누가 뭐 필요하다 하면 가방에서 계속 꺼내 줌', en: 'Pulls endless supplies from their bag whenever someone needs anything'},\n        {ko: '먹기 전에 꼭 음식 사진 찍음', en: 'Always takes food pics first'},\n        {ko: '해외에서 한국어 들리면 자동으로 귀 쫑긋함', en: 'Ears automatically perk up when hearing Korean spoken abroad'},\n        {ko: '겨울만 되면 귤 많이 먹어서 손 노래짐', en: 'Gets orange-stained hands from winter tangerine binges'},\n        {ko: '외출복 입은 채로는 절대 침대 안 올라감', en: 'Never gets on their bed when wearing outside clothes'},\n        {ko: '연애하면 매일 연락해야 함', en: 'Expects hourly updates when dating someone'},\n        {ko: '연애할 때 기념일 다 세고 다 챙김', en: 'Remembers and celebrates every single anniversary when dating'},\n        {ko: '히말라야도 갈 수 있을 듯한 등산복이랑 등산 장비 있음', en: 'Owns full hiking gear like planning to climb Mount Everest'},\n        {ko: '새로운 취미 생기면 장비부터 장만함', en: 'Buys complete equipment sets the moment they pick up new hobbies'},\n        {ko: '멀리 사는 사람보다 지각 더 자주 함', en: 'Shows up late more often than people who live farther away'},\n        {ko: '비 한 방울만 떨어져도 바로 우산 씀', en: 'Whips out their umbrella the second a single raindrop falls'},\n        {ko: '해 조금만 있어도 바로 양산 씀', en: 'Uses their parasol the moment there’s a hint of sunshine'},\n        {ko: '겨울에 패딩 입고 슬리퍼 신음', en: 'Wears a puffy winter coat indoors with fuzzy slippers'},\n        ];\n\n    /* =========================\n       로직\n       ========================= */\n    function selectGender(g, el){\n      selectedGender = g;\n      document.querySelectorAll('.gender-option').forEach(opt=>{\n        opt.classList.remove('selected'); opt.setAttribute('aria-selected','false');\n      });\n      if (el) { el.classList.add('selected'); el.setAttribute('aria-selected','true'); }\n    }\n    window.selectGender = selectGender;\n\n    function getSimilarSurname(surname) {\n      const s = (surname||'').trim().toLowerCase();\n      if (s.startsWith('k') || s.startsWith('g') || s.startsWith('c')) return Math.random()>0.5 ? '김' : '강';\n      if (s.startsWith('l') || s.startsWith('r') || s === 'lee' || s === 'li') return '이';\n      if (s.startsWith('p') || s.startsWith('b') || s === 'park') return '박';\n      if (s.startsWith('ch') || s.startsWith('t')) return '최';\n      if (s.startsWith('j') || s.startsWith('z')) return Math.random()>0.5 ? '정' : '장';\n      if (s.startsWith('s') || s.startsWith('sh')) return Math.random()>0.5 ? '서' : '신';\n      if (s.startsWith('w') || s.startsWith('y')) return Math.random()>0.5 ? '윤' : '유';\n      if (s.startsWith('h')) return Math.random()>0.5 ? '한' : '황';\n      if (s.startsWith('m')) return Math.random()>0.5 ? '문' : '민';\n      if (s.startsWith('o')) return '오';\n      if (s.startsWith('a')) return '안';\n      if (s.startsWith('n')) return Math.random()>0.5 ? '노' : '남';\n      return koreanSurnames[Math.floor(Math.random()*koreanSurnames.length)];\n    }\n\n    function getSimilarName(firstName, gender) {\n      const name = (firstName||'').trim().toLowerCase();\n      const first = name.charAt(0);\n      let pool = neutralNames;\n      if (gender === 'male')   pool = [...maleNames,   ...neutralNames];\n      if (gender === 'female') pool = [...femaleNames, ...neutralNames];\n\n      let filtered = pool.filter(kn => {\n        const korFirst = kn.charAt(0);\n        if (first === 'm' && ['민','미'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 's' && ['서','시','수','선','성'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'j' && ['지','주','준','정'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'a' && ['아','안','애'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'e' && ['에','은','예'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'r' && ['라','리','로'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'h' && ['하','한','해'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'd' && ['다','도','두'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 't' && ['태','토','테'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'l' && ['리','라','로'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'v' && ['비','바'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'n' && ['나','노','누'].some(p => korFirst.startsWith(p))) return true;\n        return false;\n      });\n\n      if (filtered.length === 0) filtered = pool;\n      return filtered[Math.floor(Math.random()*filtered.length)];\n    }\n\n    async function warmUpFonts() {\n      try {\n        const c = document.createElement('canvas'); c.width = 800; c.height = 200;\n        const ctx = c.getContext('2d');\n        const samples = [\n          { font:'normal 400 50px \"YoonChildfundkoreaManSeh\"', text:'한글 이름 테스트 ABC 123' },\n          { font:'normal 400 20px \"YoonChildfundkoreaDaeHan\"', text:'가나다 라마바 사아자 차카타파하' },\n          { font:'normal 400 12px \"DM Sans\"',                 text:'Warm up DM Sans 123 ABC' },\n        ];\n        samples.forEach((s,i) => { ctx.font = s.font; ctx.fillStyle = '#000'; ctx.fillText(s.text, 10, 30 + i*60); ctx.measureText(s.text); });\n      } catch(_) {}\n    }\n\n    async function waitForAssets() {\n      if (document.fonts && document.fonts.load) {\n        try {\n          await Promise.all([\n            document.fonts.load('normal 400 50px \"YoonChildfundkoreaManSeh\"'),\n            document.fonts.load('normal 400 20px \"YoonChildfundkoreaDaeHan\"'),\n            document.fonts.load('normal 400 12px \"DM Sans\"'),\n          ]);\n\n          const fontCheckList = [\n            '50px \"YoonChildfundkoreaManSeh\"',\n            '20px \"YoonChildfundkoreaDaeHan\"',\n            '12px \"DM Sans\"'\n          ];\n          const timeout = 3000, interval = 50;\n          let elapsed = 0;\n          while (elapsed < timeout) {\n            const allLoaded = fontCheckList.every(f => document.fonts.check(f));\n            if (allLoaded) break;\n            await new Promise(r => setTimeout(r, interval));\n            elapsed += interval;\n          }\n\n          await document.fonts.ready;\n          await warmUpFonts();\n          await new Promise(r => setTimeout(r, 60));\n        } catch(_) {}\n      }\n    }\n\n    function setResultView({ fullKo, ko, en, user }){\n      document.getElementById('koreanName').textContent = fullKo;\n      document.getElementById('koCharacteristic').textContent = ko;\n      document.getElementById('enCharacteristic').textContent = en;\n      const userBox = document.getElementById('userName');\n      userBox.textContent = (user||'') + (user ? ',' : '');\n      document.getElementById('userNameDisplay').style.display = user ? 'block' : 'none';\n    }\n\n    async function generateKoreanName(){\n      const f = document.getElementById('firstName').value.trim();\n      const l = document.getElementById('lastName').value.trim();\n      if(!f || !l){ alert('Please enter both first and last name.'); return; }\n\n      // [CLARITY] 생성 버튼 클릭\n      cEvent('click_generate', { gender: selectedGender });\n\n      try {\n        document.getElementById('nameForm').style.display='none';\n        document.getElementById('loading').style.display='block';\n        document.getElementById('resultContainer').style.display='none';\n        document.getElementById('topBanner')?.setAttribute('hidden','true');\n        document.getElementById('sharedTitle').style.display='none';\n\n        const surname = getSimilarSurname(l);\n        const given   = getSimilarName(f, selectedGender);\n        const fullKo  = surname + given;\n        const c       = characteristics[Math.floor(Math.random()*characteristics.length)];\n        setResultView({ fullKo, ko:c.ko, en:c.en, user: `${f} ${l}` });\n\n        await ensureBackgroundLoaded();\n        await waitForAssets();\n\n        document.documentElement.classList.add('fonts-ready');\n        await applyInlineBGToResultCard(); // UI는 저해상도로 표시\n\n        document.getElementById('loading').style.display='none';\n        document.getElementById('resultContainer').style.display='block';\n        document.getElementById('resultContainer').scrollIntoView({ behavior:'smooth', block:'center' });\n\n        // [CLARITY] 결과 화면 진입\n        cSet('route', 'kname:result');\n        cEvent('view_result', { gender: selectedGender, name_len: (fullKo||'').length });\n      } catch(e){\n        document.getElementById('loading').style.display='none';\n        document.getElementById('nameForm').style.display='block';\n        alert('An error occurred while generating the name. Please try again.');\n      }\n    }\n    window.generateKoreanName = generateKoreanName;\n\n    function resetForm(){\n      document.getElementById('firstName').value = '';\n      document.getElementById('lastName').value  = '';\n      document.getElementById('resultContainer').style.display='none';\n      document.getElementById('nameForm').style.display='block';\n      document.getElementById('userNameDisplay').style.display='none';\n      document.getElementById('shareCTA').style.display='none';\n      document.getElementById('sharedTitle').style.display='none';\n      document.getElementById('btnRow')?.removeAttribute('style');\n      document.getElementById('shareRow')?.removeAttribute('style');\n\n      document.querySelectorAll('.gender-option').forEach(opt=>{\n        opt.classList.remove('selected'); opt.setAttribute('aria-selected','false');\n      });\n      const firstOpt = document.querySelector('.gender-option');\n      if (firstOpt) { firstOpt.classList.add('selected'); firstOpt.setAttribute('aria-selected','true'); }\n      selectedGender='neutral';\n\n      document.getElementById('topBanner')?.removeAttribute('hidden');\n\n      if (history?.replaceState) {\n        const clean = location.origin + location.pathname;\n        history.replaceState({}, '', clean);\n      }\n      document.getElementById('firstName').focus();\n\n      // [CLARITY] 폼으로 복귀\n      cSet('route', 'kname:form');\n      cEvent('view_form');\n    }\n    window.resetForm = resetForm;\n\n    /* =========================\n       텍스트 래핑 / 폰트 핏\n       ========================= */\n    function wrapLines(ctx, text, maxWidth, lineHeight) {\n      const words = (text || '').split(/\\s+/);\n      const lines = [];\n      let line = '';\n      for (let i = 0; i < words.length; i++) {\n        const test = line ? line + ' ' + words[i] : words[i];\n        if (ctx.measureText(test).width <= maxWidth || !line) line = test;\n        else { lines.push(line); line = words[i]; }\n      }\n      if (line) lines.push(line);\n      return lines;\n    }\n\n    function fitSingleLineFont(ctx, text, maxWidth, initialPx, minPx) {\n      let size = initialPx;\n      ctx.font = `normal 400 ${size}px \"YoonChildfundkoreaManSeh\", serif`;\n      while (size > minPx && ctx.measureText(text).width > maxWidth) {\n        size -= 1;\n        ctx.font = `normal 400 ${size}px \"YoonChildfundkoreaManSeh\", serif`;\n      }\n      return size;\n    }\n\n    /* =========================\n       직접 렌더 (UI/저장 공용)\n       useHighRes=true 시 저장용 고해상도 배경 사용\n       ========================= */\n    async function renderCardCanvasFast(scaleOverride, useHighRes = false) {\n      const card = document.getElementById('resultCard');\n      const elKoName = document.getElementById('koreanName');\n      const elKo = document.getElementById('koCharacteristic');\n      const elEn = document.getElementById('enCharacteristic');\n      if (!card || !elKoName || !elKo || !elEn) throw new Error('elements missing');\n\n      await waitForAssets();\n\n      const r = card.getBoundingClientRect();\n      const fallbackScale = Math.min(2.5, Math.max(2, window.devicePixelRatio || 2));\n      const scale = Math.max(1, scaleOverride || fallbackScale);\n\n      const W = Math.round(r.width * scale);\n      const H = Math.round(r.height * scale);\n\n      const canvas = document.createElement('canvas');\n      canvas.width = W; canvas.height = H;\n      const ctx = canvas.getContext('2d', { alpha: true });\n\n      // 배경 소스 선택: UI는 저해상도, 저장은 고해상도\n      const bgSrc = useHighRes ? BG_SAVE_URL : (BG_OBJECT_URL || BG_DISPLAY_URL);\n      await new Promise((resolve) => {\n        const img = new Image();\n        if (!/^data:/.test(bgSrc)) img.crossOrigin = 'anonymous';\n        img.onload = () => { ctx.drawImage(img, 0, 0, W, H); resolve(); };\n        img.onerror = () => { ctx.fillStyle = '#f0f0f0'; ctx.fillRect(0,0,W,H); resolve(); };\n        img.src = bgSrc;\n      });\n\n      // 위치/스타일 샘플링\n      const base = card.getBoundingClientRect();\n      const pickRect = (el) => {\n        const b = el.getBoundingClientRect();\n        const cs = getComputedStyle(el);\n        const padTopPx = parseFloat(cs.paddingTop || '0'); // px 단위\n        return {\n            x: Math.round((b.left - base.left) * scale),\n            y: Math.round((b.top  - base.top)  * scale),\n            w: Math.round(b.width  * scale),\n            h: Math.round(b.height * scale),\n            color: cs.color,\n            align: cs.textAlign,\n            padTop: Math.round(padTopPx * scale) // 스케일 반영한 padding-top\n        };\n        };\n      const Rname = pickRect(elKoName);\n      const Rko   = pickRect(elKo);\n      const Ren   = pickRect(elEn);\n\n      // 폰트 크기\n      let nameFontPx = Math.round(50 * scale);\n      const koFontPx = Math.round(20 * scale);\n      const enFontPx = Math.round(12 * scale);\n\n      // 이름(한 줄, 중앙, 폰트 자동핏)\n      ctx.save();\n      ctx.fillStyle = Rname.color || '#663300';\n      nameFontPx = fitSingleLineFont(ctx, elKoName.textContent || '', Rname.w, nameFontPx, Math.round(28 * scale));\n      ctx.textAlign = 'center'; ctx.textBaseline = 'middle';\n      ctx.fillText(elKoName.textContent || '', Rname.x + Rname.w/2, Rname.y + Rname.h/2);\n      ctx.restore();\n\n      // --- 한국어 설명(줄바꿈) ---\n        ctx.save();\n        ctx.fillStyle = Rko.color || '#5c3b1e';\n        ctx.font = `normal 400 ${koFontPx}px \"YoonChildfundkoreaDaeHan\", serif`;\n        ctx.textAlign = 'center';\n        ctx.textBaseline = 'top'; // ✅ top 기준으로 전환\n\n        const koLH = Math.round(koFontPx * 1.4);\n        const koLines = wrapLines(ctx, elKo.textContent || '', Rko.w, koLH);\n\n        // padding-top 반영 + 남은 높이에서 수직 중앙\n        const koPad = Rko.padTop || 0;                  // ← ①에서 pickRect에 추가해 둔 값\n        const koAvailH = Math.max(0, Rko.h - koPad);\n        const koBlockH = koLines.length * koLH;\n\n        let koY = Rko.y + koPad + Math.max(0, (koAvailH - koBlockH) / 2);\n        const koX = Rko.x + Rko.w / 2;\n\n        koLines.forEach(line => {\n        ctx.fillText(line, koX, koY);\n        koY += koLH;\n        });\n        ctx.restore();\n\n\n        // --- 영어 설명(줄바꿈) ---\n        ctx.save();\n        ctx.fillStyle = Ren.color || '#3d2c1c';\n        ctx.font = `${enFontPx}px \"DM Sans\", sans-serif`;\n        ctx.textAlign = 'center';\n        ctx.textBaseline = 'top'; // ✅ 동일하게 top 기준\n\n        const enLH = Math.round(enFontPx * 1.35);\n        const enLines = wrapLines(ctx, elEn.textContent || '', Ren.w, enLH);\n        const enBlockH = enLines.length * enLH;\n\n        let enY = Ren.y + Math.max(0, (Ren.h - enBlockH) / 2);\n        const enX = Ren.x + Ren.w / 2;\n\n        enLines.forEach(line => {\n        ctx.fillText(line, enX, enY);\n        enY += enLH;\n        });\n        ctx.restore();\n\n\n      return canvas;\n    }\n\n    /* =========================\n       이미지 저장 (저장 시 고해상도 사용)\n       ========================= */\n    async function downloadResultImage(){\n      try {\n        const UA = navigator.userAgent;\n        const isMobile = /Android|iPhone|iPad|iPod/i.test(UA);\n\n        // [CLARITY] 저장 버튼 클릭\n        cEvent('click_save', { device: isMobile ? 'mobile' : 'desktop' });\n\n        // 팝업 선오픈(iOS용)\n        let preOpenedWin = null;\n        if (isMobile) {\n          preOpenedWin = window.open('about:blank', '_blank');\n          if (!preOpenedWin) { alert('Pop-up was blocked. Please allow pop-ups and try again.'); return; }\n\n          // [CLARITY] 모바일 저장 화면(팝업) 노출 - 가상 라우트 태깅\n          cSet('route', 'kname:save_popup');\n          cEvent('view_save_popup', { device:'mobile' });\n\n          preOpenedWin.document.write(`\n            <!doctype html>\n            <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n            <title>Save Image</title>\n            <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n            <link href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&display=swap\" rel=\"stylesheet\">\n            <style>\n              body{margin:0;font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif;background:#f7f7f7;color:#222;user-select:none; -webkit-user-select:none;}\n              .wrap{padding:16px;max-width:640px;margin:0 auto;text-align:center}\n              img{max-width:100%;height:auto;border-radius:12px;box-shadow:0 2px 10px rgba(0,0,0,.08);-webkit-user-drag:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:auto;touch-action:none;}\n              h3{font-size:18px;margin:32px 0 20px;font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif;}\n              #ph{margin-bottom:32px;}\n              button{display:block;width:100%;border:none;border-radius:999px;padding:25px;font-weight:700;cursor:pointer;background:#FF6666;color:#fff;margin:24px 0 8px;font-size:18px;}\n            </style>\n            <div class=\"wrap\">\n              <h3>My Korean Name Is</h3>\n              <div id=\"ph\">Please wait a moment.</div>\n              <img id=\"preview\" style=\"display:none\" alt=\"korean-name\"/>\n              <button id=\"shareBtn\" style=\"display:none;padding:25px;\">Share</button>\n            </div>\n            <script>\n              // 공유 버튼 클릭 시 부모 창에 이벤트 전달 (Clarity는 부모가 수집)\n              (function(){\n                document.addEventListener('click', function(e){\n                  if (e.target && e.target.id === 'shareBtn' && window.opener && window.opener.postMessage) {\n                    try { window.opener.postMessage({ type: 'kname:share' }, '*'); } catch(_){}\n                  }\n                }, true);\n              })();\n            <\\/script>\n          `);\n          preOpenedWin.document.close();\n        }\n\n        const resultCard = document.getElementById('resultCard');\n        if (!resultCard) { alert('There are no results to save. Please generate a name first.'); return; }\n\n        // 배경의 실제 고해상도 크기 기반 스케일\n        const { w: natW } = await getBgNaturalSize();\n        const cardWidth = Math.max(1, resultCard.getBoundingClientRect().width);\n        const targetOutW = Math.min(natW || 1536, 2048, cardWidth * 2.5);\n        const preciseScale = Math.max(1, targetOutW / cardWidth);\n\n        // ✅ 저장 시에는 고해상도 배경 사용\n        let canvas = await renderCardCanvasFast(preciseScale, true);\n\n        // 실패 시 폴백\n        if (!canvas) {\n          canvas = await html2canvas(resultCard, {\n            useCORS:true, backgroundColor:null, logging:false, foreignObjectRendering:false, scale:preciseScale\n          });\n        }\n\n        // Blob 생성\n        const yyyymmdd = new Date().toISOString().slice(0,10).replace(/-/g,'');\n        const fileName = `korean-name-${yyyymmdd}.png`;\n        const blob = await new Promise((resolve) => {\n          if (canvas.toBlob) canvas.toBlob(b => resolve(b), 'image/png', 1.0);\n          else {\n            const dataURL = canvas.toDataURL('image/png', 1.0);\n            const arr = dataURL.split(','), mime = arr[0].match(/:(.*?);/)[1];\n            const bstr = atob(arr[1]); let n = bstr.length; const u8 = new Uint8Array(n);\n            while(n--) u8[n] = bstr.charCodeAt(n);\n            resolve(new Blob([u8], {type:mime}));\n          }\n        });\n\n        // 즉시 캔버스 해제(피크 메모리 절감)\n        try { canvas.width = 0; canvas.height = 0; } catch(_) {}\n        canvas = null;\n\n        if (isMobile) {\n          const blobUrl = URL.createObjectURL(blob);\n          const w = preOpenedWin || window.open('about:blank', '_blank');\n          if (!w) { alert('Pop-up was blocked. Please allow pop-ups and try again.'); return; }\n\n          const html = `\n            <!doctype html>\n            <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n            <title>Save / Share</title>\n            <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n            <link href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&display=swap\" rel=\"stylesheet\">\n            <style>\n              body{margin:0;font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif;background:#f7f7f7;color:#222}\n              .wrap{padding:16px;max-width:640px;margin:0 auto;text-align:center}\n              img{max-width:100%;height:auto;border-radius:12px;box-shadow:0 2px 10px rgba(0,0,0,.08)}\n              h3{font-size:18px;margin:32px 20px 20px;font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif;}\n              .btn{display:block;width:100%;border:none;border-radius:999px;padding:25px;font-weight:700;cursor:pointer;margin:24px 0 8px;font-size:18px;}\n              #shareBtn{background:#FF6666;color:#fff;padding:25px;}\n            </style>\n            <div class=\"wrap\">\n              <h3>Long-press to save the image,<br/>or take a screenshot to share it.</h3>\n              <img id=\"preview\" alt=\"korean-name\" src=\"${blobUrl}\" draggable=\"false\" ondragstart=\"return false;\" style=\"-webkit-user-drag:none; user-select:none; -webkit-user-select:none;\">\n              <button id=\"shareBtn\" class=\"btn\">Share</button>\n            </div>\n            <script>\n              (function(){\n                document.addEventListener('click', function(e){\n                  if (e.target && e.target.id === 'shareBtn' && window.opener && window.opener.postMessage) {\n                    try { window.opener.postMessage({ type: 'kname:share' }, '*'); } catch(_){}\n                  }\n                }, true);\n              })();\n            <\\/script>\n          `;\n          w.document.open(); w.document.write(html); w.document.close();\n\n          const d = w.document;\n          d.getElementById('shareBtn').onclick = async () => {\n            try {\n              const FileCtor = w.File || window.File;\n              const file = new FileCtor([blob], fileName, { type: 'image/png' });\n\n              if (typeof w.navigator.canShare === 'function' && w.navigator.canShare({ files: [file] })) {\n                await w.navigator.share({ files:[file], title:'My Korean Name', text:'Check out my Korean name card!' });\n                try { w.close(); } catch(_) {}\n                return;\n              }\n              if (typeof w.navigator.share === 'function') {\n                await w.navigator.share({ url:blobUrl, title:'My Korean Name', text:'Check out my Korean name card!' });\n                try { w.close(); } catch(_) {}\n                return;\n              }\n            } catch (err) {\n              if (!(err && (err.name === 'AbortError' || err.name === 'NotAllowedError'))) {\n                console.warn('Share failed:', err);\n              }\n            }\n          };\n\n          const revoke = () => { try { URL.revokeObjectURL(blobUrl); } catch(_){} };\n          w.addEventListener?.('pagehide', revoke);\n          w.addEventListener?.('unload', revoke);\n          return;\n        }\n\n        // 데스크톱 다운로드\n        const url = URL.createObjectURL(blob);\n        const a = document.createElement('a');\n        a.href = url; a.download = fileName;\n        document.body.appendChild(a); a.click(); document.body.removeChild(a);\n        URL.revokeObjectURL(url);\n\n        // [CLARITY] 데스크톱 저장 완료 이벤트\n        cEvent('download_desktop');\n        alert('Your image has been saved! Now share it with your friends.');\n      } catch (error) {\n        console.error('Download failed:', error);\n        alert('Failed to generate name card.');\n      }\n    }\n    window.downloadResultImage = downloadResultImage;\n\n    /* =========================\n       공유 링크\n       ========================= */\n    function escapeHtml(s) {\n      return (s||'').replace(/[&<>\"']/g, m=>({ '&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;' }[m]));\n    }\n\n    function buildShareURL(){\n      const name = document.getElementById('koreanName').textContent || '';\n      const ko   = document.getElementById('koCharacteristic').textContent || '';\n      const en   = document.getElementById('enCharacteristic').textContent || '';\n      const user = (document.getElementById('userName').textContent || '').replace(/,\\s*$/,'');\n      const params = new URLSearchParams({ shared:'1', name, ko, en, u:user });\n      return location.origin + location.pathname + '?' + params.toString();\n    }\n\n    async function shareCurrentResult(){\n      const url = buildShareURL();\n      try {\n        await navigator.clipboard.writeText(url);\n        // [CLARITY] 링크 복사 성공\n        cEvent('copied_link', { method:'clipboard' });\n        alert('Link copied! Now share it with your friends.');\n      } catch(e){\n        // [CLARITY] 링크 복사 실패 → 프롬프트 대체\n        cEvent('copied_link_fallback');\n        prompt('Copy the share link:', url);\n      }\n    }\n    document.getElementById('shareLinkBtn')?.addEventListener('click', function(){\n      // [CLARITY] Copy Link 버튼 클릭\n      cEvent('click_copy_link');\n      shareCurrentResult();\n    });\n\n    function loadFromURL(){\n      const qs = new URLSearchParams(location.search);\n      const isShared = qs.get('shared') === '1';\n      const name = qs.get('name');\n      const ko = qs.get('ko');\n      const en = qs.get('en');\n      const u  = qs.get('u');\n\n      if (name && ko && en){\n        document.getElementById('nameForm').style.display='none';\n        document.getElementById('topBanner')?.setAttribute('hidden','true');\n\n        setResultView({ fullKo:name, ko, en, user:'' });\n        document.getElementById('resultContainer').style.display='block';\n\n        if (isShared) {\n          document.getElementById('btnRow').style.display = 'none';\n          document.getElementById('shareRow').style.display = 'none';\n          document.getElementById('shareCTA').style.display = 'block';\n          const title = document.getElementById('sharedTitle');\n          title.innerHTML = `This is <strong>${escapeHtml(u || 'friend')}</strong>'s Korean name and the vibe behind it.`;\n          title.style.display = 'block';\n\n          // [CLARITY] 공유 링크로 진입한 공유보기 페이지\n          cSet('route', 'kname:shared_view');\n          cEvent('view_shared', { has_user: !!u });\n        } else {\n          document.getElementById('shareCTA').style.display = 'none';\n          document.getElementById('sharedTitle').style.display = 'none';\n\n          // [CLARITY] 직접 생성 결과 URL 로딩 (예외적 상황)\n          cSet('route', 'kname:result');\n          cEvent('view_result_direct');\n        }\n\n        setTimeout(()=>document.getElementById('resultContainer').scrollIntoView({behavior:'smooth', block:'center'}), 40);\n      } else {\n        document.getElementById('shareCTA').style.display = 'none';\n        document.getElementById('sharedTitle').style.display = 'none';\n        document.getElementById('userNameDisplay').style.display = 'none';\n\n        // [CLARITY] 기본 폼 화면\n        cSet('route', 'kname:form');\n        cEvent('view_form');\n      }\n    }\n\n    // 초기 진입: UI는 저해상도 사용\n    loadFromURL();\n    const resultCard = document.getElementById('resultCard');\n    if (resultCard) {\n      resultCard.style.backgroundImage = `url(\"${BG_DISPLAY_URL}\")`;\n    }\n    (async () => {\n      try { await applyInlineBGToResultCard(); } catch(_) {}\n      try { await preloadBackgroundImage(); } catch(_) {}\n    })();\n\n    /* 카운터 증가 (존재 시에만 업데이트) */\n    async function incrementCounter() {\n      try {\n        const response = await fetch('https://hangeulnamevisit.with-f85.workers.dev/api/count', { method:'POST' });\n        const data = await response.json();\n        const el = document.getElementById('counterNumber');\n        if (el && typeof data.count !== 'undefined') el.textContent = data.count;\n      } catch (error) {\n        console.log('증가 실패: ' + (error?.message || error));\n      }\n    }\n    window.incrementCounter = incrementCounter;\n  </script>\n</body>\n</html>","embedURL":""}},"547:502":{"mainComponentId":"530:409","type":"INSTANCE","id":"547:502","name":"Hello Bar 🔗","absoluteBoundingBox":{"x":1951.0,"y":100.0,"width":393.0,"height":180.0},"isolatedAbsoluteRenderBounds":{"x":1951.0,"y":100.0,"width":393.0,"height":180.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":393.0,"y":180.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.929411768913269,"g":0.929411768913269,"b":0.929411768913269,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":190,"localID":2831},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://courses.talktomeinkorean.com/hangeul-challenge-waitlist-2026-05?utm_source=eventpage&utm_medium=internal&utm_campaign=202605_courses_hangeulchallenge2&utm_content=260428&utm_term=hangeulname","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"paddingTop":12.0,"paddingRight":20.0,"paddingBottom":12.0,"paddingLeft":20.0,"layoutMode":"HORIZONTAL","layoutWrap":"WRAP","itemSpacing":20.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","counterAxisSpacing":10.0,"children":["I547:502;519:4300","I547:502;175:677","I547:502;1357:23486"],"componentProperties":{},"overrides":[{"key":[],"value":{"counterAxisSizingMode":"FIXED","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.929411768913269,"g":0.929411768913269,"b":0.929411768913269,"a":1.0},"visible":true,"opacity":1.0}],"size":{"x":393.0,"y":180.0},"interactions":[{"id":{"sessionID":190,"localID":2831},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://courses.talktomeinkorean.com/hangeul-challenge-waitlist-2026-05?utm_source=eventpage&utm_medium=internal&utm_campaign=202605_courses_hangeulchallenge2&utm_content=260428&utm_term=hangeulname","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}]},"componentId":"530:409"},{"key":["Frame 21472364880","Shop the Set0"],"value":{"characterStyleOverrides":[],"characters":"Join the 7-Day Challenge","lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"styleOverrideTable":{}},"componentId":"530:409"},{"key":["Frame 21472364880"],"value":{"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.501960813999176,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}]},"componentId":"530:409"},{"key":["​A stylish way to start Korean. The Ultimate Set + Premium Gifts.0"],"value":{"characterStyleOverrides":[7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8],"characters":"Turn your Korean name into real Hangeul skills. Learn Hangeul in 7 days.","lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"styleOverrideTable":{"8":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","fontSize":20.0,"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.501960813999176,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"lineHeightPx":32.0,"lineHeightPercent":122.88786315918,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"7":{"fontSize":15.0,"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"componentId":"530:409"},{"key":["Frame 21472364790"],"value":{"visible":false},"componentId":"530:409"}]},"108:1122":{"type":"TEXT","id":"108:1122","name":"TTMIK Stories Korean Reading & Listening App","absoluteBoundingBox":{"x":-1354.0,"y":304.0,"width":281.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":-1353.51403808594,"y":311.985992431641,"width":197.971313476562,"height":37.0299987792969},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,0.0]],"size":{"x":281.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutGrow":1.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[35,35,35,35,35,35,35,35,35,35,35,35,35,34,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37],"characters":"TTMIK Stories Korean Reading & Listening App","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAlignVertical":"CENTER","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Medium","fontStyle":"Medium","fontVariantPosition":"NORMAL","fontSize":20.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":32.0,"lineHeightPercent":122.88786315918,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"37":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-SemiBold","fontStyle":"SemiBold","fontSize":13.0,"lineHeightPx":20.8000011444092,"lineHeightPercent":122.88786315918,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"35":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","fontSize":18.0,"lineHeightPx":28.8000011444092,"lineHeightPercent":122.88786315918,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"34":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","fontSize":12.0,"lineHeightPx":19.2000007629395,"lineHeightPercent":122.88786315918,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"}}},"377:733":{"type":"RECTANGLE","id":"377:733","name":"image 9","absoluteBoundingBox":{"x":2419.0,"y":1568.0,"width":345.0,"height":196.85546875},"targetAspectRatio":{"x":2401.0,"y":1370.0},"isolatedAbsoluteRenderBounds":{"x":2419.0,"y":1568.0,"width":345.0,"height":196.85546875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":345.0,"y":196.85546875},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"7f2b4987e968e465145a09344318f27fe9b3f71a","originalImageWidth":2401,"originalImageHeight":1370,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"546:477":{"mainComponentId":"530:409","type":"INSTANCE","id":"546:477","name":"Hello Bar 🔗","absoluteBoundingBox":{"x":2395.0,"y":100.0,"width":393.0,"height":170.0},"isolatedAbsoluteRenderBounds":{"x":2395.0,"y":100.0,"width":393.0,"height":170.0},"relativeTransform":[[1.0,0.0,444.0],[0.0,1.0,0.0]],"size":{"x":393.0,"y":170.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.219607844948769,"g":0.403921574354172,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-196.0,"sizeFraction":0.5},"right":{"pixelOffset":197.0,"sizeFraction":0.5},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":190,"localID":2831},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://courses.talktomeinkorean.com/beginner-bootcamp-2026-06?utm_source=eventpage&utm_medium=internal&utm_campaign=202605_courses_beginnerbootcamp2&utm_content=260521&utm_term=hangeulname2","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"paddingTop":12.0,"paddingRight":20.0,"paddingBottom":12.0,"paddingLeft":20.0,"layoutMode":"HORIZONTAL","layoutWrap":"WRAP","itemSpacing":20.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","counterAxisSpacing":10.0,"children":["I546:477;519:4300","I546:477;175:677","I546:477;1357:23486"],"componentProperties":{},"overrides":[{"key":[],"value":{"counterAxisSizingMode":"FIXED","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.219607844948769,"g":0.403921574354172,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"size":{"x":393.0,"y":170.0},"interactions":[{"id":{"sessionID":190,"localID":2831},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://courses.talktomeinkorean.com/beginner-bootcamp-2026-06?utm_source=eventpage&utm_medium=internal&utm_campaign=202605_courses_beginnerbootcamp2&utm_content=260521&utm_term=hangeulname2","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}]},"componentId":"530:409"},{"key":["Frame 21472364880","Shop the Set0"],"value":{"characterStyleOverrides":[],"characters":"Explore Beginner Bootcamp","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.369800865650177,"g":0.408785313367844,"b":0.104706704616547,"a":1.0},"visible":true,"opacity":1.0}],"style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PIXELS","lineHeightPx":21.6000003814697,"lineHeightPercent":103.686630249023,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"styleOverrideTable":{}},"componentId":"530:409"},{"key":["Frame 21472364880"],"value":{"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.91372549533844,"g":0.949019610881805,"b":0.682352960109711,"a":1.0},"visible":true,"opacity":1.0}]},"componentId":"530:409"},{"key":["Frame 21472364880","Rectangle 1121560"],"value":{"strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.369800865650177,"g":0.408785313367844,"b":0.104706704616547,"a":1.0},"visible":true,"opacity":1.0}]},"componentId":"530:409"},{"key":["​A stylish way to start Korean. The Ultimate Set + Premium Gifts.0"],"value":{"characterStyleOverrides":[7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8],"characters":"Got your Korean name? Now learn to say more","lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"styleOverrideTable":{"8":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"7":{"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"componentId":"530:409"},{"key":["Frame 21472364790"],"value":{"visible":false},"componentId":"530:409"}]},"377:465":{"type":"FRAME","id":"377:465","name":"hangeulface","absoluteBoundingBox":{"x":2419.0,"y":1568.0,"width":345.0,"height":292.85546875},"isolatedAbsoluteRenderBounds":{"x":2411.0,"y":1562.0,"width":361.0,"height":308.85546875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,106.0]],"size":{"x":345.0,"y":292.85546875},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[{"type":"DROP_SHADOW","visible":true,"color":{"r":0.0,"g":0.0,"b":0.0,"a":0.150000005960464},"blendMode":"NORMAL","offset":{"x":0.0,"y":2.0},"radius":8.0,"showShadowBehindNode":false,"spread":0.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":377,"localID":672},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://hangeulface.talktomeinkorean.com/","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[25.0,25.0,25.0,25.0],"cornerRadius":25.0,"clipsContent":true,"layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["377:733","377:689"]},"377:504":{"type":"TEXT","id":"377:504","name":"Create Your Own Hangeul Face  for Hangeul Day!","absoluteBoundingBox":{"x":2443.0,"y":1788.85546875,"width":297.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":2475.17651367188,"y":1794.33544921875,"width":229.224365234375,"height":39.2320556640625},"relativeTransform":[[1.0,0.0,24.0],[0.0,1.0,24.0]],"size":{"x":297.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.5,"g":0.25,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutGrow":1.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Create Your Own Hangeul Face  for Hangeul Day!","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-0.32,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":115.207366943359,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"377:409":{"type":"TEXT","id":"377:409","name":"How We Celebrated  Hangeul Day in 2024","absoluteBoundingBox":{"x":2419.0,"y":1462.0,"width":345.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":2460.89331054688,"y":1467.88000488281,"width":262.623291015625,"height":57.4759521484375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":345.0,"y":66.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.400000005960464,"g":0.198095247149467,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],"characters":"How We Celebrated  Hangeul Day in 2024 ","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":21.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-0.42,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.2999992370605,"lineHeightPercent":99.8463897705078,"lineHeightPercentFontSize":130.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"3":{"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.400000005960464,"g":0.198095247149467,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"2":{"fontSize":28.0,"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.400000005960464,"g":0.198095247149467,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"3:452":{"type":"FRAME","id":"3:452","name":"이름생성기","absoluteBoundingBox":{"x":2395.0,"y":293.0,"width":393.0,"height":2204.0},"isolatedAbsoluteRenderBounds":{"x":2395.0,"y":293.0,"width":393.0,"height":2204.0},"relativeTransform":[[1.0,0.0,444.0],[0.0,1.0,193.0]],"size":{"x":393.0,"y":2204.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"BOTTOM","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-196.0,"sizeFraction":0.5},"right":{"pixelOffset":197.0,"sizeFraction":0.5},"bottom":{"pixelOffset":0.0,"sizeFraction":1.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"children":["3:499","69:112","180:896","377:670"]},"377:688":{"type":"FRAME","id":"377:688","name":"Frame 3421","absoluteBoundingBox":{"x":3530.0,"y":1800.85546875,"width":345.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":3530.0,"y":1800.85546875,"width":345.0,"height":96.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,196.85546875]],"size":{"x":345.0,"y":96.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":24.0,"paddingBottom":24.0,"paddingLeft":24.0,"layoutMode":"HORIZONTAL","counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["377:544"]},"108:1123":{"type":"FRAME","id":"108:1123","name":"Frame 3408","absoluteBoundingBox":{"x":-1418.0,"y":376.0,"width":345.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":-1418.0,"y":376.0,"width":345.0,"height":48.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,144.0]],"size":{"x":345.0,"y":48.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":113,"localID":489},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://courses.talktomeinkorean.com/seyo","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"layoutMode":"HORIZONTAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","isInAnimateTree":true,"children":["113:167","108:1139"]},"546:481":{"mainComponentId":"530:409","type":"INSTANCE","id":"546:481","name":"Hello Bar 🔗","absoluteBoundingBox":{"x":3499.0,"y":100.0,"width":393.0,"height":170.0},"isolatedAbsoluteRenderBounds":{"x":3499.0,"y":100.0,"width":393.0,"height":170.0},"relativeTransform":[[1.0,0.0,204.0],[0.0,1.0,0.0]],"size":{"x":393.0,"y":170.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.219607844948769,"g":0.403921574354172,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-196.0,"sizeFraction":0.5},"right":{"pixelOffset":197.0,"sizeFraction":0.5},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":190,"localID":2831},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://courses.talktomeinkorean.com/beginner-bootcamp-2026-06?utm_source=eventpage&utm_medium=internal&utm_campaign=202605_courses_beginnerbootcamp2&utm_content=260521&utm_term=hangeulname2","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"paddingTop":12.0,"paddingRight":20.0,"paddingBottom":12.0,"paddingLeft":20.0,"layoutMode":"HORIZONTAL","layoutWrap":"WRAP","itemSpacing":20.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","counterAxisSpacing":10.0,"children":["I546:481;519:4300","I546:481;175:677","I546:481;1357:23486"],"componentProperties":{},"overrides":[{"key":[],"value":{"counterAxisSizingMode":"FIXED","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.219607844948769,"g":0.403921574354172,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"size":{"x":393.0,"y":170.0},"interactions":[{"id":{"sessionID":190,"localID":2831},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://courses.talktomeinkorean.com/beginner-bootcamp-2026-06?utm_source=eventpage&utm_medium=internal&utm_campaign=202605_courses_beginnerbootcamp2&utm_content=260521&utm_term=hangeulname2","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}]},"componentId":"530:409"},{"key":["Frame 21472364880","Shop the Set0"],"value":{"characterStyleOverrides":[],"characters":"Explore Beginner Bootcamp","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.369800865650177,"g":0.408785313367844,"b":0.104706704616547,"a":1.0},"visible":true,"opacity":1.0}],"style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PIXELS","lineHeightPx":21.6000003814697,"lineHeightPercent":103.686630249023,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"styleOverrideTable":{}},"componentId":"530:409"},{"key":["Frame 21472364880"],"value":{"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.91372549533844,"g":0.949019610881805,"b":0.682352960109711,"a":1.0},"visible":true,"opacity":1.0}]},"componentId":"530:409"},{"key":["Frame 21472364880","Rectangle 1121560"],"value":{"strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.369800865650177,"g":0.408785313367844,"b":0.104706704616547,"a":1.0},"visible":true,"opacity":1.0}]},"componentId":"530:409"},{"key":["​A stylish way to start Korean. The Ultimate Set + Premium Gifts.0"],"value":{"characterStyleOverrides":[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7],"characters":"Got your Korean name? Now learn to say more","lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"styleOverrideTable":{"7":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"6":{"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"componentId":"530:409"},{"key":["Frame 21472364790"],"value":{"visible":false},"componentId":"530:409"}]},"377:544":{"type":"TEXT","id":"377:544","name":"Create Your Own Hangeul Face  for Hangeul Day!","absoluteBoundingBox":{"x":3554.0,"y":1824.85546875,"width":297.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":3586.17651367188,"y":1830.33544921875,"width":229.224365234375,"height":39.2320556640625},"relativeTransform":[[1.0,0.0,24.0],[0.0,1.0,24.0]],"size":{"x":297.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.5,"g":0.25,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutGrow":1.0,"strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Create Your Own Hangeul Face  for Hangeul Day!","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-0.32,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":115.207366943359,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"108:1084":{"type":"FRAME","id":"108:1084","name":"Frame 3412","absoluteBoundingBox":{"x":-1418.0,"y":232.0,"width":345.0,"height":192.0},"isolatedAbsoluteRenderBounds":{"x":-1418.0,"y":232.0,"width":345.0,"height":192.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,82.0]],"size":{"x":345.0,"y":192.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","isInAnimateTree":true,"children":["108:1085","108:1114","108:1123"]},"69:112":{"type":"FRAME","id":"69:112","name":"Frame 3403","absoluteBoundingBox":{"x":2484.5,"y":328.0,"width":214.0,"height":33.0},"isolatedAbsoluteRenderBounds":{"x":2484.5,"y":328.0,"width":214.0,"height":33.0},"relativeTransform":[[1.0,0.0,89.5],[0.0,1.0,35.0]],"size":{"x":214.0,"y":33.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":0.820261478424072,"b":0.7843137383461,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-107.0,"sizeFraction":0.5},"right":{"pixelOffset":107.0,"sizeFraction":0.5},"top":{"pixelOffset":35.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.400000005960464,"g":0.198095247149467,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":89,"localID":783},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[5.0,5.0,5.0,5.0],"cornerRadius":5.0,"paddingTop":5.0,"paddingRight":15.0,"paddingBottom":5.0,"paddingLeft":15.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","children":["69:113"]},"377:545":{"type":"FRAME","id":"377:545","name":"hangeulface","absoluteBoundingBox":{"x":4174.0,"y":1688.0,"width":345.0,"height":292.85546875},"isolatedAbsoluteRenderBounds":{"x":4166.0,"y":1682.0,"width":361.0,"height":308.85546875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,106.0]],"size":{"x":345.0,"y":292.85546875},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"effects":[{"type":"DROP_SHADOW","visible":true,"color":{"r":0.0,"g":0.0,"b":0.0,"a":0.150000005960464},"blendMode":"NORMAL","offset":{"x":0.0,"y":2.0},"radius":8.0,"showShadowBehindNode":false,"spread":0.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":377,"localID":674},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://hangeulface.talktomeinkorean.com/","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[25.0,25.0,25.0,25.0],"cornerRadius":25.0,"clipsContent":true,"layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","children":["377:735","377:687"]},"108:1143":{"type":"TEXT","id":"108:1143","name":"Korean learning books for all levels and goals","absoluteBoundingBox":{"x":-1418.0,"y":515.0,"width":140.0,"height":36.0},"isolatedAbsoluteRenderBounds":{"x":-1417.72705078125,"y":518.536010742188,"width":134.069946289062,"height":30.47998046875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,41.0]],"size":{"x":140.0,"y":36.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":41.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Korean learning books for all levels and goals","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"textAutoResize":"HEIGHT","style":{"fontFamily":"DM Sans","fontPostScriptName":"DMSans-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":13.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":18.1999988555908,"lineHeightPercent":107.526878356934,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"108:1114":{"type":"FRAME","id":"108:1114","name":"Frame 3407","absoluteBoundingBox":{"x":-1418.0,"y":304.0,"width":345.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":-1418.0,"y":304.0,"width":345.0,"height":48.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,72.0]],"size":{"x":345.0,"y":48.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":113,"localID":488},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"https://ttmikstories.app/","openUrlInNewTab":true}],"isDeleted":false,"stateManagementVersion":1}],"layoutMode":"HORIZONTAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","isInAnimateTree":true,"children":["113:159","108:1122"]},"3:499":{"type":"WIDGET","id":"3:499","name":"Embed 1","absoluteBoundingBox":{"x":2405.0,"y":413.0,"width":375.0,"height":1000.0},"isolatedAbsoluteRenderBounds":{"x":2405.0,"y":413.0,"width":375.0,"height":1000.0},"relativeTransform":[[1.0,0.0,10.0],[0.0,1.0,120.0]],"size":{"x":375.0,"y":1000.0},"constraints":{"vertical":"TOP","horizontal":"LEFT_RIGHT"},"constraintValues":{"left":{"pixelOffset":10.0,"sizeFraction":0.0},"right":{"pixelOffset":-8.0,"sizeFraction":1.0},"top":{"pixelOffset":120.0,"sizeFraction":0.0}},"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"widgetType":"GENERIC","syncedState":{"embedAllowFullscreen":"false","embedCodeType":"html","embedIframeHtml":"<!DOCTYPE html>\n<html lang=\"ko\">\n<head>\n  <meta charset=\"UTF-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>\n  <title>한글이름 MY KOREAN NAME IS</title>\n\n  <!-- Sentry (옵션 유지) -->\n  <script src=\"https://js.sentry-cdn.com/01a272064480dbf2fd4c3ee2de7bfcf6.min.js\" crossorigin=\"anonymous\"></script>\n  <script>\n    Sentry.init({\n      dsn: \"https://01a272064480dbf2fd4c3ee2de7bfcf6@o1189375.ingest.us.sentry.io/4510108487647232\",\n      enableLogs: true,\n    });\n  </script>\n\n  <!-- DM Sans -->\n  <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n  <link href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&display=swap\" rel=\"stylesheet\">\n\n  <!-- 프리로드: UI 표시용 저해상도 배경만 선로딩 -->\n  <link rel=\"preload\" as=\"font\" type=\"font/woff2\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaDaeHan.woff2\">\n  <link rel=\"preload\" as=\"font\" type=\"font/woff2\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaManSeh.woff2\">\n  <link rel=\"preload\" as=\"image\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/name-card.png\">\n\n  <style>\n    /* 폰트(라이트 전용) */\n    @font-face {\n      font-family: 'YoonChildfundkoreaDaeHan';\n      src: url('https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaDaeHan.woff2') format('woff2'),\n           url('https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaDaeHan.woff') format('woff');\n      font-weight: 400; font-style: normal; font-display: swap;\n    }\n    @font-face {\n      font-family: 'YoonChildfundkoreaManSeh';\n      src: url('https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaManSeh.woff2') format('woff2'),\n           url('https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaManSeh.woff') format('woff');\n      font-weight: 400; font-style: normal; font-display: swap;\n    }\n\n    html, body { -webkit-text-size-adjust:100%; text-size-adjust:100%; }\n    * { margin:0; padding:0; box-sizing:border-box; }\n    body { font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif; color:#333; background:#fff; }\n\n    button, .generate-btn, .retry-btn, .save-btn, .share-link-btn, .cta-btn, .gender-option {\n      font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif !important;\n      font-size:16px !important; letter-spacing:0;\n    }\n\n    .container { width:100%; padding:20px; max-width:720px; margin:0 auto; }\n    .header { margin-bottom:20px; }\n    .top-banner { text-align:center; font-size:18px; line-height:1.5; color:#663300; font-weight:500; margin-bottom:50px; }\n    .top-banner strong { color:#FF6666; }\n\n    .shared-title { text-align:center; font-size:20px; line-height:1.5; color:#663300; font-weight:400; margin:12px 0 36px; display:none; }\n\n    .user-name-display { text-align:center; margin-bottom:20px; color:#663300; display:none; }\n    .user-name { font-size:22px; font-weight:700; margin-bottom:6px; }\n    .generated-msg { font-size:18px; font-weight:400; }\n\n    .form-group { margin-bottom:24px; }\n    .form-label { display:block; font-weight:600; margin-bottom:8px; color:#000; font-size:14px; }\n    .form-input { width:100%; padding:12px; border:1px solid #ddd; font-size:16px; background:#fff; border-radius:8px; color:#000; }\n    .form-input:focus { outline:none; border-color:#333; }\n    /* ✅ PII 보호: 이름 입력은 Clarity에서 마스킹 */\n    .form-input[data-clarity-mask=\"true\"] {}\n\n    .gender-options { display:flex; gap:10px; margin-top:8px; }\n    .gender-option { flex:1; padding:12px; border:1px solid #ddd; text-align:center; cursor:pointer; background:#fff; font-size:14px; user-select:none; border-radius:8px; }\n    .gender-option:hover { border-color:#3C82E8; }\n    .gender-option.selected { border-color:#3C82E8; background:#3C82E8; color:#fff; }\n\n    .generate-btn { width:100%; padding:25px; background:#FF6666; color:#fff; border:none; font-size:16px; font-weight:600; text-align:center; cursor:pointer; margin-top:40px; border-radius:50px; }\n    .generate-btn:hover { background:#e95a5a; }\n\n    .form-footer { margin:50% 0; display:flex; flex-direction:column; align-items:center; gap:20px; }\n    .form-footer__img { width:120px; height:60px; display:block; }\n    .form-footer__text { font-size:16px; line-height:1.5; color:#333; margin:0; text-align:center; }\n\n    .result-container { margin-top:30px; text-align:center; display:none; }\n\n    /* ✅ 결과 카드: UI는 저해상도, 스크롤 방해 없이 pan-y 허용 */\n    .result-card {\n      position: relative;\n      width: 100%;\n      max-width: 420px;\n      aspect-ratio: 768 / 1364;\n      margin: 20px auto;\n      border-radius: 16px;\n      overflow: hidden;\n\n      /* UI 표시용: 저해상도 기본값 (var 미지정 시 디폴트) */\n      background-image: var(--background-image, url('https://hangeulname-assets.talktomeinkorean.com/name-card.png'));\n      background-size: cover;\n      background-position: center top;\n\n      -webkit-user-select: none;\n      user-select: none;\n      -webkit-touch-callout: none;\n\n      /* 스크롤은 수직만 통과 */\n      touch-action: pan-y;\n\n      /* 렌더 최적화 */\n      will-change: transform;\n      contain: layout paint;\n    }\n\n    .result-card * {\n      -webkit-user-select: none;\n      user-select: none;\n      -webkit-touch-callout: none;\n    }\n\n    .result-inner { position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; text-align:center; padding-top:38%; gap:7%; height:88%; }\n\n    .korean-name, .ko-characteristic { font-synthesis:weight; }\n\n    .korean-name {\n      font-family:\"YoonChildfundkoreaManSeh\", serif !important; font-size:50px; font-weight:400;\n      color:#663300; height:22%; display:flex; align-items:center; justify-content:center; max-width:70%;\n    }\n    .ko-characteristic {\n      font-family:\"YoonChildfundkoreaDaeHan\", serif !important; font-weight:400; font-size:20px;\n      color:#5c3b1e; line-height:1.6; max-width:72%; height:40%;\n      display:flex; align-items:center; justify-content:center; padding-top:12%;\n    }\n    .en-characteristic {\n      font-family:'DM Sans', sans-serif; font-size:12px; color:#3d2c1c; line-height:1.4; max-width:70%; height:13%;\n      display:flex; align-items:center; justify-content:center;\n    }\n\n    .btn-row { display:block; margin-top:32px; }\n    \n    .save-btn {\n      display:block; width:100%; padding:22px; border:none; border-radius:50px; font-weight:600; cursor:pointer;\n      margin-top:24px; transition:.2s; text-align:center; background:#FF6666; color:#fff;\n    }\n    .save-btn:hover { opacity:.9; }\n\n    .share-row { display:block; }\n\n    .share-row p { text-align:center; margin-top:32px; }\n    #shareRow, #shareLinkBtn { position: relative; z-index: 10; }\n\n    .share-link-btn{\n    -webkit-user-select: none;\n    user-select: none;\n    -webkit-touch-callout: none;\n    touch-action: manipulation; /* iOS: 탭을 클릭으로, 핀치/더블탭 확대 방지 */\n    pointer-events: auto;\n    width:100%; border:1px solid #FF6666; color:#FF6666; background:#fff; margin-top:20px; padding:22px; border-radius:50px;text-align:center; font-weight:600; cursor:pointer;\n    }\n\n    .share-link-btn:hover { opacity:.9; }\n\n    .share-cta { margin-top:24px; display:none; }\n    .cta-btn { display:inline-block; padding:25px; border-radius:999px; background:#FF6666; color:#fff; font-weight:700; border:none; cursor:pointer; width:100%; text-align:center; }\n    .cta-btn:hover { opacity:.9; }\n\n    .loading { text-align:center; padding:20px; display:none; }\n    .loading-spinner { width:30px; height:30px; border:3px solid #ddd; border-left:3px solid #333; border-radius:50%; animation:spin 1s linear infinite; margin:0 auto 15px; }\n    @keyframes spin { 0%{transform:rotate(0)} 100%{transform:rotate(360deg)} }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <div id=\"topBanner\" class=\"top-banner\" aria-live=\"polite\">\n        Type in your name below and <br/>you will get a Korean-style name <br/>along with a fun personality match <br/>that reflects Korean vibes.\n      </div>\n      <div id=\"sharedTitle\" class=\"shared-title\"></div>\n\n      <div class=\"user-name-display\" id=\"userNameDisplay\">\n        <div class=\"user-name\" id=\"userName\"></div>\n        <div class=\"generated-msg\">Here's your Korean name and the vibe behind it!</div>\n      </div>\n    </div>\n\n    <!-- 입력 폼 -->\n    <div id=\"nameForm\">\n      <div class=\"form-group\">\n        <label class=\"form-label\" for=\"firstName\">이름 (First Name)</label>\n        <!-- ✅ PII 마스킹 -->\n        <input data-clarity-mask=\"true\" type=\"text\" id=\"firstName\" class=\"form-input\" placeholder=\"Michael, Sophie, Omar, Fatima...\">\n      </div>\n      <div class=\"form-group\">\n        <label class=\"form-label\" for=\"lastName\">성 (Last Name)</label>\n        <!-- ✅ PII 마스킹 -->\n        <input data-clarity-mask=\"true\" type=\"text\" id=\"lastName\" class=\"form-input\" placeholder=\"Johnson, Kim, Hassan, Al-Ahmad...\">\n      </div>\n      <div class=\"form-group\">\n        <label class=\"form-label\">Name type</label>\n        <div class=\"gender-options\" role=\"tablist\" aria-label=\"Name type options\">\n          <div class=\"gender-option selected\" role=\"tab\" aria-selected=\"true\" tabindex=\"0\" onclick=\"selectGender('neutral', this)\">unisex</div>\n          <div class=\"gender-option\" role=\"tab\" aria-selected=\"false\" tabindex=\"0\" onclick=\"selectGender('female', this)\">feminine</div>\n          <div class=\"gender-option\" role=\"tab\" aria-selected=\"false\" tabindex=\"0\" onclick=\"selectGender('male', this)\">masculine</div>\n        </div>\n      </div>\n      <button type=\"button\" class=\"generate-btn\" onclick=\"generateKoreanName(); incrementCounter();\">Generate Korean Name</button>\n      <div class=\"form-footer\" id=\"formFooter\" aria-live=\"polite\">\n        <img class=\"form-footer__img\"\n             src=\"https://hangeulname.figma.site/_assets/v11/f07271865ca56eb133ad7f8ad37a73790d341337.svg\"\n             alt=\"Hangeul Day Campaign\" width=\"120\" height=\"auto\" decoding=\"async\" loading=\"lazy\" />\n        <p class=\"form-footer__text\">\n          This service is created by <br/>Talk To Me In Korean.\n        </p>\n      </div>\n    </div>\n\n    <!-- 로딩 -->\n    <div class=\"loading\" id=\"loading\">\n      <div class=\"loading-spinner\"></div>\n      <p>Creating your unique Korean name...</p>\n    </div>\n\n    <!-- 결과 -->\n    <div class=\"result-container\" id=\"resultContainer\">\n      <div class=\"result-card\" id=\"resultCard\">\n        <div class=\"result-inner\">\n          <div class=\"korean-name\" id=\"koreanName\"></div>\n          <div class=\"ko-characteristic\" id=\"koCharacteristic\"></div>\n          <div class=\"en-characteristic\" id=\"enCharacteristic\"></div>\n        </div>\n      </div>\n\n      <div id=\"btnRow\" class=\"btn-row\">\n        <button class=\"save-btn\" onclick=\"downloadResultImage()\">Save & Share</button>\n      </div>\n\n      <div id=\"shareRow\" class=\"share-row\">\n        <button id=\"shareLinkBtn\" class=\"share-link-btn\">Copy Link</button>\n        <p>Please screenshot if you cannot <br/>save the image.</p>\n      </div>\n\n      <div id=\"shareCTA\" class=\"share-cta\">\n        <a class=\"cta-btn\" href=\"https://hangeulname.figma.site/\" target=\"_blank\" rel=\"noopener noreferrer\">Create My Korean Name Too</a>\n      </div>\n    </div>\n  </div>\n\n  <!-- html2canvas (희박한 폴백용) -->\n  <script src=\"https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js\"></script>\n\n  <script>\n    /* =========================\n       [CLARITY] 안전한 호출 유틸\n       - Figma Sites <head>에 설치된 Clarity 스니펫과 충돌 없이 동작\n       - 미로딩 시 큐에 쌓였다가 처리\n       ========================= */\n    (function(){\n      if (!window.clarity) {\n        window.clarity = function(){ (window.clarity.q = window.clarity.q || []).push(arguments); };\n      }\n    })();\n    function cSet(key, val){ try { window.clarity && window.clarity('set', key, val); } catch(_){} }\n    function cEvent(name, props){ try { window.clarity && window.clarity('event', name, props || {}); } catch(_){} }\n\n    // 팝업-부모 통신으로 공유 버튼 클릭 이벤트 수집\n    window.addEventListener('message', function(e){\n      if (e && e.data && e.data.type === 'kname:share') {\n        cEvent('click_share_in_popup', { source: 'save_popup' });\n      }\n    }, false);\n\n    /* =========================\n       전역 상태 / BG URL\n       ========================= */\n    let selectedGender = 'neutral';\n    let BG_OBJECT_URL = null; // UI 표시용 objectURL 캐시\n\n    // ✅ UI 표시용(저해상도) / 저장용(고해상도) 분리\n    const BG_DISPLAY_URL = 'https://hangeulname-assets.talktomeinkorean.com/name-card.png';\n    const BG_SAVE_URL    = 'https://hangeulname-assets.talktomeinkorean.com/name-card.png';\n\n    /* =========================\n       배경 크기(저장 스케일 계산용)\n       ========================= */\n    async function getBgNaturalSize() {\n      return new Promise((resolve) => {\n        const img = new Image();\n        img.onload = () => resolve({ w: img.naturalWidth || 768, h: img.naturalHeight || 1364 });\n        img.onerror = () => resolve({ w: 768, h: 1364 });\n        img.crossOrigin = 'anonymous';\n        img.src = BG_SAVE_URL; // 저장 고해상도 기준으로 확인\n        setTimeout(() => resolve({ w: 768, h: 1364 }), 3000);\n      });\n    }\n\n    /* =========================\n       UI 배경: 저해상도 objectURL로 적용\n       ========================= */\n    async function applyInlineBGToResultCard() {\n      const card = document.getElementById('resultCard');\n      if (!card) return;\n      try {\n        const res = await fetch(BG_DISPLAY_URL, { mode: 'cors', credentials: 'omit', cache: 'no-cache' });\n        if (!res.ok) throw new Error('BG fetch failed: ' + res.status);\n        const blob = await res.blob();\n\n        if (BG_OBJECT_URL) {\n          try { URL.revokeObjectURL(BG_OBJECT_URL); } catch(_) {}\n          BG_OBJECT_URL = null;\n        }\n\n        BG_OBJECT_URL = URL.createObjectURL(blob);\n        card.style.setProperty('--background-image', `url(\"${BG_OBJECT_URL}\")`);\n        card.style.backgroundImage = `var(--background-image)`;\n      } catch (e) {\n        console.warn('[applyInlineBGToResultCard] fallback to direct URL:', e);\n        card.style.setProperty('--background-image', `url(\"${BG_DISPLAY_URL}\")`);\n        card.style.backgroundImage = `var(--background-image)`;\n      }\n    }\n\n    /* =========================\n       UI 체감속도: 저해상도만 프리로드\n       ========================= */\n    async function preloadBackgroundImage() {\n      return new Promise((resolve) => {\n        const img = new Image();\n        img.crossOrigin = 'anonymous';\n        img.onload = () => resolve(img);\n        img.onerror = () => resolve(null);\n        img.src = BG_DISPLAY_URL;\n        setTimeout(() => resolve(null), 5000);\n      });\n    }\n\n    async function ensureBackgroundLoaded() {\n      const card = document.getElementById('resultCard');\n      if (!card) return false;\n      const current = getComputedStyle(card).backgroundImage;\n      if (current === 'none' || !current.includes('name-card')) {\n        card.style.backgroundImage = `url(\"${BG_DISPLAY_URL}\")`;\n      }\n      const img = await preloadBackgroundImage();\n      return !!img;\n    }\n\n    /* =========================\n       데이터\n       ========================= */\n    const koreanSurnames = ['김','이','박','최','정','강','조','윤','장','임','한','오','서','신','권','황','안','송','전','홍','유','고','문','양','손','배','백','허','남','심','노','하','곽','성','차','주','우','구','민','류'];\n    const maleNames = ['민준','도윤','시우','예준','하준','지호','주원','지후','도현','준우','준서','건우','현우','우진','선우','지훈','유준','은우','연우','서진','이준','민재','시윤','현준','정우','윤우','수호','지우','승우','유찬','지환','승현','이안','준혁','시후','진우','승민','민성','수현','지원','태민','재현','승준','지민','민호','현서','하민','성현','예성','하람','승완','태현','이든','태오','규민','민혁','태양','성준','윤성','다온','정민','현우','정국','지민','진','태형','윤기','남준','호석','민규','정한','원우'];\n    const femaleNames = ['서연','지아','서아','다은','예은','예린','소윤','유나','채은','윤아','아린','예나','가은','주아','예진','민지','나은','서은','나윤','채아','다연','소은','예지','나연','세아','지은','은채','예빈','윤지','소연','채린','소민','승아','혜원','소이','세은','리아','민아','나현','경화','지수','제니','채영','원영','유진','가을','겨울','지민','민정','은경','아영','규리','연아','가윤','채이','지연','예림','유정','소현','경은'];\n    const neutralNames = ['라온','시안','이루','하늘','별','나루','율','설','바다','해솔','가람','온유','연우','지후','하람','이든','서우','민서','하온','도경','시원','윤호','은찬','동현','재원','민규','하진','이현','민찬','우빈','로운','하율','도하','지율','준호','윤재','준','성민','태민','재현'];\n    const characteristics = [\n        {ko: '사람 처음 만나면 MBTI부터 물어봄', en: 'When meeting someone for the first time, they ask about MBTI right away'},\n        {ko: '엘리베이터 타면 닫힘 버튼 계속 누름', en: 'Keeps rapidly pressing the elevator close button'},\n        {ko: '휴지 달라고 하면 꼭 두 장 줌', en: 'Always gives exactly two tissues when asked'},\n        {ko: '만날 때마다 밥 먹었냐고 물어봄', en: 'Asks \"Did you eat?\" every time you meet with them'},\n        {ko: '겨울에도 아이스 아메리카노만 마심', en: 'Drinks iced americano even in winter'},\n        {ko: '밥 먹을 때 마지막 한 입 꼭 남김', en: 'Always leaves the last bite of food'},\n        {ko: '여럿이 먹을 때 마지막 한 조각은 꼭 양보함', en: 'Insists others take the last piece when sharing'},\n        {ko: '전자레인지 끝날 때까지 못 기다리고 20초 전부터 꺼낼 준비하고 있음', en: 'Hovers by the microwave to stop it with 20 seconds still left'},\n        {ko: '치킨은 무조건 반반으로 시킴', en: 'Always orders half-and-half fried chicken'},\n        {ko: '물이나 음료수 마실 때도 계속 \"짠\" 하자고 함', en: 'Says \"cheers\" and clinks glasses even when drinking water'},\n        {ko: '식당 가면 수저 세팅부터 함', en: 'Sets out chopsticks and spoon first thing at restaurants'},\n        {ko: '공항 보안 검색대 빠르게 통과하려고 미리 짐 다 꺼내서 준비함', en: 'Takes their laptop out of their bag before airport security to breeze through the line'},\n        {ko: '길 알려 주다가 결국 직접 데려다줌', en: 'Ends up personally escorting people to their destination instead of giving directions'},\n        {ko: '핸드폰으로 자리 맡아 두고 주문하러 감', en: 'Leaves phone on empty table to save it before ordering food'},\n        {ko: '야식 안 먹으면 하루가 허전함', en: 'Their day somehow feels incomplete without having a late-night snack'},\n        {ko: '감기 걸리면 바로 병원 감', en: 'Treats a runny nose like a medical emergency'},\n        {ko: '\"다음에 밥 한번 먹자\" 해 놓고 실제로는 안 먹음', en: 'Says \"Let’s grab a meal sometime\" but never actually initiates it'},\n        {ko: \"'아니', '근데' 없으면 대화 못 함\", en: 'Starts every conversation with \"No\" or \"But\"'},\n        {ko: '심심하면 카톡 프로필 사진 바꿈', en: 'Changes KakaoTalk profile picture for no particular reason'},\n        {ko: '친구들 카톡 프로필 사진 다 확인해 봄', en: 'Checks everyone else’s KakaoTalk profile pictures religiously'},\n        {ko: '메뉴 고르다 결국 늘 먹던 거 고름', en: 'Spends forever debating what to order then ends up ordering their usual'},\n        {ko: '길에서 아는 사람 만나면 어색해함', en: 'Feels awkward when running into acquaintances on the street'},\n        {ko: '술 마실 때 \"딱 한 잔만 더\" 하다가 막차 놓침', en: 'Says \"just one more drink\" and misses the last train of the night'},\n        {ko: '밥 먹을 때 김치 없으면 못 참음', en: 'Can’t eat meals without kimchi on the side'},\n        {ko: '불닭볶음면 잘 먹는 척하지만 현실은 까르보불닭', en: 'Pretends to handle super spicy ramyeon but secretly gets the mild version'},\n        {ko: '배달 시키면 라이더 위치 실시간으로 확인함', en: 'Tracks delivery drivers in real-time like NASA mission control'},\n        {ko: '\"어디 갈래?\" 하면 맨날 카페 가자고 함', en: 'Always suggests going to a café when asked where to hang out'},\n        {ko: '새로 생긴 카페 다 꿰고 있음', en: 'Knows every new café that opens in the neighborhood'},\n        {ko: '예의상 두 번 거절하고 세 번째에 좋다고 함', en: 'Keeps refusing until asked three times to be polite, then finally says yes'},\n        {ko: '와이파이 조금만 느려도 바로 핫스팟 켬', en: 'Has zero patience for slow WiFi and immediately switches to hotspot at the slightest lag'},\n        {ko: '횡단보도 건널 때도 폰만 봄', en: 'Stares at phone even while crossing the street'},\n        {ko: '고기 먹을 때 상추 없으면 못 참음', en: 'Needs lettuce wraps for BBQ'},\n        {ko: '라면 끓일 때 계란 꼭 넣음', en: 'Always cracks an egg into their ramyeon'},\n        {ko: '배부르다고 했으면서 \"후식 뭐 먹을래?\" 물어봄', en: 'Claims to be full, then immediately asks what’s for dessert'},\n        {ko: '소파에 안 앉고 바닥에 앉아서 소파를 등받이로 씀', en: 'Sits on the floor using the sofa as a backrest'},\n        {ko: '웃을 때 박수 치면서 옆 사람 때림', en: 'Claps while laughing and accidentally hits whoever’s nearby'},\n        {ko: '같은 말 두 번씩 반복함 (\"아니, 아니\")', en: 'Repeats words twice (\"No, no\" or \"Wait, wait\")'},\n        {ko: '뭐 물어보면 \"몰라\"라고 하면서 알려 줌 (\"몰라, 집에.\")', en: 'Says \"I don’t know\" before telling you the answer to your question anyways'},\n        {ko: '여름에 에어컨 틀고 이불 덮고 잠', en: 'Sleeps under blankets with the AC blasting in summer'},\n        {ko: '겨울에 난방 켜고 반팔 입고 잠', en: 'Cranks up the heated floors and then sleeps in a t-shirt during winter'},\n        {ko: '선물 받으면 뭘 이런 걸 다 준비했냐고 하지만 속으로는 좋아함', en: 'Acts like gifts are unnecessary while secretly being thrilled'},\n        {ko: '식당에서 수저 밑에 휴지 꼭 깔아 줌', en: 'Always puts napkins under utensils at restaurants'},\n        {ko: '라면만 먹는 친구 걱정해서 밥 먹이러 끌고 감', en: 'Drags friends who live on ramyeon to eat real food'},\n        {ko: '리모컨 맨날 어디 뒀는지 잊어버리고 여기저기 찾으러 다님', en: 'Spends more time looking for the TV remote than actually watching TV'},\n        {ko: '어디를 가든 콘센트부터 찾음', en: 'Has a sixth sense for finding power outlets in any room'},\n        {ko: '반찬 중 제일 맛있는 건 아껴 놨다가 마지막에 먹음', en: 'Saves the best side dish for last like it’s the grand finale'},\n        {ko: '컵라면 기다리는 3분 동안 초 단위로 시계 봄', en: 'Counts down every second of those 3 minutes while waiting for cup noodles to cook'},\n        {ko: '물건 찾을 때 \"어디 보자~\" 하면서 노래하듯 말함', en: 'Sing-songs \"Let me see…\" when looking for things'},\n        {ko: '\"다이어트는 내일부터\"라고 하면서 디저트 찾아 먹음', en: 'Says \"Diet starts tomorrow\" then immediately goes looking for dessert'},\n        {ko: '맛있으면 0칼로리라고 함', en: 'Claims delicious food has zero calories'},\n        {ko: '항상 후면 주차 하려고 함', en: 'Has an unexplainable obsession with reverse parking'},\n        {ko: '누가 뭐 필요하다 하면 가방에서 계속 꺼내 줌', en: 'Pulls endless supplies from their bag whenever someone needs anything'},\n        {ko: '먹기 전에 꼭 음식 사진 찍음', en: 'Always takes food pics first'},\n        {ko: '해외에서 한국어 들리면 자동으로 귀 쫑긋함', en: 'Ears automatically perk up when hearing Korean spoken abroad'},\n        {ko: '겨울만 되면 귤 많이 먹어서 손 노래짐', en: 'Gets orange-stained hands from winter tangerine binges'},\n        {ko: '외출복 입은 채로는 절대 침대 안 올라감', en: 'Never gets on their bed when wearing outside clothes'},\n        {ko: '연애하면 매일 연락해야 함', en: 'Expects hourly updates when dating someone'},\n        {ko: '연애할 때 기념일 다 세고 다 챙김', en: 'Remembers and celebrates every single anniversary when dating'},\n        {ko: '히말라야도 갈 수 있을 듯한 등산복이랑 등산 장비 있음', en: 'Owns full hiking gear like planning to climb Mount Everest'},\n        {ko: '새로운 취미 생기면 장비부터 장만함', en: 'Buys complete equipment sets the moment they pick up new hobbies'},\n        {ko: '멀리 사는 사람보다 지각 더 자주 함', en: 'Shows up late more often than people who live farther away'},\n        {ko: '비 한 방울만 떨어져도 바로 우산 씀', en: 'Whips out their umbrella the second a single raindrop falls'},\n        {ko: '해 조금만 있어도 바로 양산 씀', en: 'Uses their parasol the moment there’s a hint of sunshine'},\n        {ko: '겨울에 패딩 입고 슬리퍼 신음', en: 'Wears a puffy winter coat indoors with fuzzy slippers'},\n        ];\n\n    /* =========================\n       로직\n       ========================= */\n    function selectGender(g, el){\n      selectedGender = g;\n      document.querySelectorAll('.gender-option').forEach(opt=>{\n        opt.classList.remove('selected'); opt.setAttribute('aria-selected','false');\n      });\n      if (el) { el.classList.add('selected'); el.setAttribute('aria-selected','true'); }\n    }\n    window.selectGender = selectGender;\n\n    function getSimilarSurname(surname) {\n      const s = (surname||'').trim().toLowerCase();\n      if (s.startsWith('k') || s.startsWith('g') || s.startsWith('c')) return Math.random()>0.5 ? '김' : '강';\n      if (s.startsWith('l') || s.startsWith('r') || s === 'lee' || s === 'li') return '이';\n      if (s.startsWith('p') || s.startsWith('b') || s === 'park') return '박';\n      if (s.startsWith('ch') || s.startsWith('t')) return '최';\n      if (s.startsWith('j') || s.startsWith('z')) return Math.random()>0.5 ? '정' : '장';\n      if (s.startsWith('s') || s.startsWith('sh')) return Math.random()>0.5 ? '서' : '신';\n      if (s.startsWith('w') || s.startsWith('y')) return Math.random()>0.5 ? '윤' : '유';\n      if (s.startsWith('h')) return Math.random()>0.5 ? '한' : '황';\n      if (s.startsWith('m')) return Math.random()>0.5 ? '문' : '민';\n      if (s.startsWith('o')) return '오';\n      if (s.startsWith('a')) return '안';\n      if (s.startsWith('n')) return Math.random()>0.5 ? '노' : '남';\n      return koreanSurnames[Math.floor(Math.random()*koreanSurnames.length)];\n    }\n\n    function getSimilarName(firstName, gender) {\n      const name = (firstName||'').trim().toLowerCase();\n      const first = name.charAt(0);\n      let pool = neutralNames;\n      if (gender === 'male')   pool = [...maleNames,   ...neutralNames];\n      if (gender === 'female') pool = [...femaleNames, ...neutralNames];\n\n      let filtered = pool.filter(kn => {\n        const korFirst = kn.charAt(0);\n        if (first === 'm' && ['민','미'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 's' && ['서','시','수','선','성'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'j' && ['지','주','준','정'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'a' && ['아','안','애'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'e' && ['에','은','예'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'r' && ['라','리','로'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'h' && ['하','한','해'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'd' && ['다','도','두'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 't' && ['태','토','테'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'l' && ['리','라','로'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'v' && ['비','바'].some(p => korFirst.startsWith(p))) return true;\n        if (first === 'n' && ['나','노','누'].some(p => korFirst.startsWith(p))) return true;\n        return false;\n      });\n\n      if (filtered.length === 0) filtered = pool;\n      return filtered[Math.floor(Math.random()*filtered.length)];\n    }\n\n    async function warmUpFonts() {\n      try {\n        const c = document.createElement('canvas'); c.width = 800; c.height = 200;\n        const ctx = c.getContext('2d');\n        const samples = [\n          { font:'normal 400 50px \"YoonChildfundkoreaManSeh\"', text:'한글 이름 테스트 ABC 123' },\n          { font:'normal 400 20px \"YoonChildfundkoreaDaeHan\"', text:'가나다 라마바 사아자 차카타파하' },\n          { font:'normal 400 12px \"DM Sans\"',                 text:'Warm up DM Sans 123 ABC' },\n        ];\n        samples.forEach((s,i) => { ctx.font = s.font; ctx.fillStyle = '#000'; ctx.fillText(s.text, 10, 30 + i*60); ctx.measureText(s.text); });\n      } catch(_) {}\n    }\n\n    async function waitForAssets() {\n      if (document.fonts && document.fonts.load) {\n        try {\n          await Promise.all([\n            document.fonts.load('normal 400 50px \"YoonChildfundkoreaManSeh\"'),\n            document.fonts.load('normal 400 20px \"YoonChildfundkoreaDaeHan\"'),\n            document.fonts.load('normal 400 12px \"DM Sans\"'),\n          ]);\n\n          const fontCheckList = [\n            '50px \"YoonChildfundkoreaManSeh\"',\n            '20px \"YoonChildfundkoreaDaeHan\"',\n            '12px \"DM Sans\"'\n          ];\n          const timeout = 3000, interval = 50;\n          let elapsed = 0;\n          while (elapsed < timeout) {\n            const allLoaded = fontCheckList.every(f => document.fonts.check(f));\n            if (allLoaded) break;\n            await new Promise(r => setTimeout(r, interval));\n            elapsed += interval;\n          }\n\n          await document.fonts.ready;\n          await warmUpFonts();\n          await new Promise(r => setTimeout(r, 60));\n        } catch(_) {}\n      }\n    }\n\n    function setResultView({ fullKo, ko, en, user }){\n      document.getElementById('koreanName').textContent = fullKo;\n      document.getElementById('koCharacteristic').textContent = ko;\n      document.getElementById('enCharacteristic').textContent = en;\n      const userBox = document.getElementById('userName');\n      userBox.textContent = (user||'') + (user ? ',' : '');\n      document.getElementById('userNameDisplay').style.display = user ? 'block' : 'none';\n    }\n\n    async function generateKoreanName(){\n      const f = document.getElementById('firstName').value.trim();\n      const l = document.getElementById('lastName').value.trim();\n      if(!f || !l){ alert('Please enter both first and last name.'); return; }\n\n      // [CLARITY] 생성 버튼 클릭\n      cEvent('click_generate', { gender: selectedGender });\n\n      try {\n        document.getElementById('nameForm').style.display='none';\n        document.getElementById('loading').style.display='block';\n        document.getElementById('resultContainer').style.display='none';\n        document.getElementById('topBanner')?.setAttribute('hidden','true');\n        document.getElementById('sharedTitle').style.display='none';\n\n        const surname = getSimilarSurname(l);\n        const given   = getSimilarName(f, selectedGender);\n        const fullKo  = surname + given;\n        const c       = characteristics[Math.floor(Math.random()*characteristics.length)];\n        setResultView({ fullKo, ko:c.ko, en:c.en, user: `${f} ${l}` });\n\n        await ensureBackgroundLoaded();\n        await waitForAssets();\n\n        document.documentElement.classList.add('fonts-ready');\n        await applyInlineBGToResultCard(); // UI는 저해상도로 표시\n\n        document.getElementById('loading').style.display='none';\n        document.getElementById('resultContainer').style.display='block';\n        document.getElementById('resultContainer').scrollIntoView({ behavior:'smooth', block:'center' });\n\n        // [CLARITY] 결과 화면 진입\n        cSet('route', 'kname:result');\n        cEvent('view_result', { gender: selectedGender, name_len: (fullKo||'').length });\n      } catch(e){\n        document.getElementById('loading').style.display='none';\n        document.getElementById('nameForm').style.display='block';\n        alert('An error occurred while generating the name. Please try again.');\n      }\n    }\n    window.generateKoreanName = generateKoreanName;\n\n    function resetForm(){\n      document.getElementById('firstName').value = '';\n      document.getElementById('lastName').value  = '';\n      document.getElementById('resultContainer').style.display='none';\n      document.getElementById('nameForm').style.display='block';\n      document.getElementById('userNameDisplay').style.display='none';\n      document.getElementById('shareCTA').style.display='none';\n      document.getElementById('sharedTitle').style.display='none';\n      document.getElementById('btnRow')?.removeAttribute('style');\n      document.getElementById('shareRow')?.removeAttribute('style');\n\n      document.querySelectorAll('.gender-option').forEach(opt=>{\n        opt.classList.remove('selected'); opt.setAttribute('aria-selected','false');\n      });\n      const firstOpt = document.querySelector('.gender-option');\n      if (firstOpt) { firstOpt.classList.add('selected'); firstOpt.setAttribute('aria-selected','true'); }\n      selectedGender='neutral';\n\n      document.getElementById('topBanner')?.removeAttribute('hidden');\n\n      if (history?.replaceState) {\n        const clean = location.origin + location.pathname;\n        history.replaceState({}, '', clean);\n      }\n      document.getElementById('firstName').focus();\n\n      // [CLARITY] 폼으로 복귀\n      cSet('route', 'kname:form');\n      cEvent('view_form');\n    }\n    window.resetForm = resetForm;\n\n    /* =========================\n       텍스트 래핑 / 폰트 핏\n       ========================= */\n    function wrapLines(ctx, text, maxWidth, lineHeight) {\n      const words = (text || '').split(/\\s+/);\n      const lines = [];\n      let line = '';\n      for (let i = 0; i < words.length; i++) {\n        const test = line ? line + ' ' + words[i] : words[i];\n        if (ctx.measureText(test).width <= maxWidth || !line) line = test;\n        else { lines.push(line); line = words[i]; }\n      }\n      if (line) lines.push(line);\n      return lines;\n    }\n\n    function fitSingleLineFont(ctx, text, maxWidth, initialPx, minPx) {\n      let size = initialPx;\n      ctx.font = `normal 400 ${size}px \"YoonChildfundkoreaManSeh\", serif`;\n      while (size > minPx && ctx.measureText(text).width > maxWidth) {\n        size -= 1;\n        ctx.font = `normal 400 ${size}px \"YoonChildfundkoreaManSeh\", serif`;\n      }\n      return size;\n    }\n\n    /* =========================\n       직접 렌더 (UI/저장 공용)\n       useHighRes=true 시 저장용 고해상도 배경 사용\n       ========================= */\n    async function renderCardCanvasFast(scaleOverride, useHighRes = false) {\n      const card = document.getElementById('resultCard');\n      const elKoName = document.getElementById('koreanName');\n      const elKo = document.getElementById('koCharacteristic');\n      const elEn = document.getElementById('enCharacteristic');\n      if (!card || !elKoName || !elKo || !elEn) throw new Error('elements missing');\n\n      await waitForAssets();\n\n      const r = card.getBoundingClientRect();\n      const fallbackScale = Math.min(2.5, Math.max(2, window.devicePixelRatio || 2));\n      const scale = Math.max(1, scaleOverride || fallbackScale);\n\n      const W = Math.round(r.width * scale);\n      const H = Math.round(r.height * scale);\n\n      const canvas = document.createElement('canvas');\n      canvas.width = W; canvas.height = H;\n      const ctx = canvas.getContext('2d', { alpha: true });\n\n      // 배경 소스 선택: UI는 저해상도, 저장은 고해상도\n      const bgSrc = useHighRes ? BG_SAVE_URL : (BG_OBJECT_URL || BG_DISPLAY_URL);\n      await new Promise((resolve) => {\n        const img = new Image();\n        if (!/^data:/.test(bgSrc)) img.crossOrigin = 'anonymous';\n        img.onload = () => { ctx.drawImage(img, 0, 0, W, H); resolve(); };\n        img.onerror = () => { ctx.fillStyle = '#f0f0f0'; ctx.fillRect(0,0,W,H); resolve(); };\n        img.src = bgSrc;\n      });\n\n      // 위치/스타일 샘플링\n      const base = card.getBoundingClientRect();\n      const pickRect = (el) => {\n        const b = el.getBoundingClientRect();\n        const cs = getComputedStyle(el);\n        const padTopPx = parseFloat(cs.paddingTop || '0'); // px 단위\n        return {\n            x: Math.round((b.left - base.left) * scale),\n            y: Math.round((b.top  - base.top)  * scale),\n            w: Math.round(b.width  * scale),\n            h: Math.round(b.height * scale),\n            color: cs.color,\n            align: cs.textAlign,\n            padTop: Math.round(padTopPx * scale) // 스케일 반영한 padding-top\n        };\n        };\n      const Rname = pickRect(elKoName);\n      const Rko   = pickRect(elKo);\n      const Ren   = pickRect(elEn);\n\n      // 폰트 크기\n      let nameFontPx = Math.round(50 * scale);\n      const koFontPx = Math.round(20 * scale);\n      const enFontPx = Math.round(12 * scale);\n\n      // 이름(한 줄, 중앙, 폰트 자동핏)\n      ctx.save();\n      ctx.fillStyle = Rname.color || '#663300';\n      nameFontPx = fitSingleLineFont(ctx, elKoName.textContent || '', Rname.w, nameFontPx, Math.round(28 * scale));\n      ctx.textAlign = 'center'; ctx.textBaseline = 'middle';\n      ctx.fillText(elKoName.textContent || '', Rname.x + Rname.w/2, Rname.y + Rname.h/2);\n      ctx.restore();\n\n      // --- 한국어 설명(줄바꿈) ---\n        ctx.save();\n        ctx.fillStyle = Rko.color || '#5c3b1e';\n        ctx.font = `normal 400 ${koFontPx}px \"YoonChildfundkoreaDaeHan\", serif`;\n        ctx.textAlign = 'center';\n        ctx.textBaseline = 'top'; // ✅ top 기준으로 전환\n\n        const koLH = Math.round(koFontPx * 1.4);\n        const koLines = wrapLines(ctx, elKo.textContent || '', Rko.w, koLH);\n\n        // padding-top 반영 + 남은 높이에서 수직 중앙\n        const koPad = Rko.padTop || 0;                  // ← ①에서 pickRect에 추가해 둔 값\n        const koAvailH = Math.max(0, Rko.h - koPad);\n        const koBlockH = koLines.length * koLH;\n\n        let koY = Rko.y + koPad + Math.max(0, (koAvailH - koBlockH) / 2);\n        const koX = Rko.x + Rko.w / 2;\n\n        koLines.forEach(line => {\n        ctx.fillText(line, koX, koY);\n        koY += koLH;\n        });\n        ctx.restore();\n\n\n        // --- 영어 설명(줄바꿈) ---\n        ctx.save();\n        ctx.fillStyle = Ren.color || '#3d2c1c';\n        ctx.font = `${enFontPx}px \"DM Sans\", sans-serif`;\n        ctx.textAlign = 'center';\n        ctx.textBaseline = 'top'; // ✅ 동일하게 top 기준\n\n        const enLH = Math.round(enFontPx * 1.35);\n        const enLines = wrapLines(ctx, elEn.textContent || '', Ren.w, enLH);\n        const enBlockH = enLines.length * enLH;\n\n        let enY = Ren.y + Math.max(0, (Ren.h - enBlockH) / 2);\n        const enX = Ren.x + Ren.w / 2;\n\n        enLines.forEach(line => {\n        ctx.fillText(line, enX, enY);\n        enY += enLH;\n        });\n        ctx.restore();\n\n\n      return canvas;\n    }\n\n    /* =========================\n       이미지 저장 (저장 시 고해상도 사용)\n       ========================= */\n    async function downloadResultImage(){\n      try {\n        const UA = navigator.userAgent;\n        const isMobile = /Android|iPhone|iPad|iPod/i.test(UA);\n\n        // [CLARITY] 저장 버튼 클릭\n        cEvent('click_save', { device: isMobile ? 'mobile' : 'desktop' });\n\n        // 팝업 선오픈(iOS용)\n        let preOpenedWin = null;\n        if (isMobile) {\n          preOpenedWin = window.open('about:blank', '_blank');\n          if (!preOpenedWin) { alert('Pop-up was blocked. Please allow pop-ups and try again.'); return; }\n\n          // [CLARITY] 모바일 저장 화면(팝업) 노출 - 가상 라우트 태깅\n          cSet('route', 'kname:save_popup');\n          cEvent('view_save_popup', { device:'mobile' });\n\n          preOpenedWin.document.write(`\n            <!doctype html>\n            <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n            <title>Save Image</title>\n            <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n            <link href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&display=swap\" rel=\"stylesheet\">\n            <style>\n              body{margin:0;font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif;background:#f7f7f7;color:#222;user-select:none; -webkit-user-select:none;}\n              .wrap{padding:16px;max-width:640px;margin:0 auto;text-align:center}\n              img{max-width:100%;height:auto;border-radius:12px;box-shadow:0 2px 10px rgba(0,0,0,.08);-webkit-user-drag:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:auto;touch-action:none;}\n              h3{font-size:18px;margin:32px 0 20px;font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif;}\n              #ph{margin-bottom:32px;}\n              button{display:block;width:100%;border:none;border-radius:999px;padding:25px;font-weight:700;cursor:pointer;background:#FF6666;color:#fff;margin:24px 0 8px;font-size:18px;}\n            </style>\n            <div class=\"wrap\">\n              <h3>My Korean Name Is</h3>\n              <div id=\"ph\">Please wait a moment.</div>\n              <img id=\"preview\" style=\"display:none\" alt=\"korean-name\"/>\n              <button id=\"shareBtn\" style=\"display:none;padding:25px;\">Share</button>\n            </div>\n            <script>\n              // 공유 버튼 클릭 시 부모 창에 이벤트 전달 (Clarity는 부모가 수집)\n              (function(){\n                document.addEventListener('click', function(e){\n                  if (e.target && e.target.id === 'shareBtn' && window.opener && window.opener.postMessage) {\n                    try { window.opener.postMessage({ type: 'kname:share' }, '*'); } catch(_){}\n                  }\n                }, true);\n              })();\n            <\\/script>\n          `);\n          preOpenedWin.document.close();\n        }\n\n        const resultCard = document.getElementById('resultCard');\n        if (!resultCard) { alert('There are no results to save. Please generate a name first.'); return; }\n\n        // 배경의 실제 고해상도 크기 기반 스케일\n        const { w: natW } = await getBgNaturalSize();\n        const cardWidth = Math.max(1, resultCard.getBoundingClientRect().width);\n        const targetOutW = Math.min(natW || 1536, 2048, cardWidth * 2.5);\n        const preciseScale = Math.max(1, targetOutW / cardWidth);\n\n        // ✅ 저장 시에는 고해상도 배경 사용\n        let canvas = await renderCardCanvasFast(preciseScale, true);\n\n        // 실패 시 폴백\n        if (!canvas) {\n          canvas = await html2canvas(resultCard, {\n            useCORS:true, backgroundColor:null, logging:false, foreignObjectRendering:false, scale:preciseScale\n          });\n        }\n\n        // Blob 생성\n        const yyyymmdd = new Date().toISOString().slice(0,10).replace(/-/g,'');\n        const fileName = `korean-name-${yyyymmdd}.png`;\n        const blob = await new Promise((resolve) => {\n          if (canvas.toBlob) canvas.toBlob(b => resolve(b), 'image/png', 1.0);\n          else {\n            const dataURL = canvas.toDataURL('image/png', 1.0);\n            const arr = dataURL.split(','), mime = arr[0].match(/:(.*?);/)[1];\n            const bstr = atob(arr[1]); let n = bstr.length; const u8 = new Uint8Array(n);\n            while(n--) u8[n] = bstr.charCodeAt(n);\n            resolve(new Blob([u8], {type:mime}));\n          }\n        });\n\n        // 즉시 캔버스 해제(피크 메모리 절감)\n        try { canvas.width = 0; canvas.height = 0; } catch(_) {}\n        canvas = null;\n\n        if (isMobile) {\n          const blobUrl = URL.createObjectURL(blob);\n          const w = preOpenedWin || window.open('about:blank', '_blank');\n          if (!w) { alert('Pop-up was blocked. Please allow pop-ups and try again.'); return; }\n\n          const html = `\n            <!doctype html>\n            <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n            <title>Save / Share</title>\n            <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n            <link href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&display=swap\" rel=\"stylesheet\">\n            <style>\n              body{margin:0;font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif;background:#f7f7f7;color:#222}\n              .wrap{padding:16px;max-width:640px;margin:0 auto;text-align:center}\n              img{max-width:100%;height:auto;border-radius:12px;box-shadow:0 2px 10px rgba(0,0,0,.08)}\n              h3{font-size:18px;margin:32px 20px 20px;font-family:'DM Sans', Tahoma, Geneva, Verdana, sans-serif;}\n              .btn{display:block;width:100%;border:none;border-radius:999px;padding:25px;font-weight:700;cursor:pointer;margin:24px 0 8px;font-size:18px;}\n              #shareBtn{background:#FF6666;color:#fff;padding:25px;}\n            </style>\n            <div class=\"wrap\">\n              <h3>Long-press to save the image,<br/>or take a screenshot to share it.</h3>\n              <img id=\"preview\" alt=\"korean-name\" src=\"${blobUrl}\" draggable=\"false\" ondragstart=\"return false;\" style=\"-webkit-user-drag:none; user-select:none; -webkit-user-select:none;\">\n              <button id=\"shareBtn\" class=\"btn\">Share</button>\n            </div>\n            <script>\n              (function(){\n                document.addEventListener('click', function(e){\n                  if (e.target && e.target.id === 'shareBtn' && window.opener && window.opener.postMessage) {\n                    try { window.opener.postMessage({ type: 'kname:share' }, '*'); } catch(_){}\n                  }\n                }, true);\n              })();\n            <\\/script>\n          `;\n          w.document.open(); w.document.write(html); w.document.close();\n\n          const d = w.document;\n          d.getElementById('shareBtn').onclick = async () => {\n            try {\n              const FileCtor = w.File || window.File;\n              const file = new FileCtor([blob], fileName, { type: 'image/png' });\n\n              if (typeof w.navigator.canShare === 'function' && w.navigator.canShare({ files: [file] })) {\n                await w.navigator.share({ files:[file], title:'My Korean Name', text:'Check out my Korean name card!' });\n                try { w.close(); } catch(_) {}\n                return;\n              }\n              if (typeof w.navigator.share === 'function') {\n                await w.navigator.share({ url:blobUrl, title:'My Korean Name', text:'Check out my Korean name card!' });\n                try { w.close(); } catch(_) {}\n                return;\n              }\n            } catch (err) {\n              if (!(err && (err.name === 'AbortError' || err.name === 'NotAllowedError'))) {\n                console.warn('Share failed:', err);\n              }\n            }\n          };\n\n          const revoke = () => { try { URL.revokeObjectURL(blobUrl); } catch(_){} };\n          w.addEventListener?.('pagehide', revoke);\n          w.addEventListener?.('unload', revoke);\n          return;\n        }\n\n        // 데스크톱 다운로드\n        const url = URL.createObjectURL(blob);\n        const a = document.createElement('a');\n        a.href = url; a.download = fileName;\n        document.body.appendChild(a); a.click(); document.body.removeChild(a);\n        URL.revokeObjectURL(url);\n\n        // [CLARITY] 데스크톱 저장 완료 이벤트\n        cEvent('download_desktop');\n        alert('Your image has been saved! Now share it with your friends.');\n      } catch (error) {\n        console.error('Download failed:', error);\n        alert('Failed to generate name card.');\n      }\n    }\n    window.downloadResultImage = downloadResultImage;\n\n    /* =========================\n       공유 링크\n       ========================= */\n    function escapeHtml(s) {\n      return (s||'').replace(/[&<>\"']/g, m=>({ '&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;' }[m]));\n    }\n\n    function buildShareURL(){\n      const name = document.getElementById('koreanName').textContent || '';\n      const ko   = document.getElementById('koCharacteristic').textContent || '';\n      const en   = document.getElementById('enCharacteristic').textContent || '';\n      const user = (document.getElementById('userName').textContent || '').replace(/,\\s*$/,'');\n      const params = new URLSearchParams({ shared:'1', name, ko, en, u:user });\n      return location.origin + location.pathname + '?' + params.toString();\n    }\n\n    async function shareCurrentResult(){\n      const url = buildShareURL();\n      try {\n        await navigator.clipboard.writeText(url);\n        // [CLARITY] 링크 복사 성공\n        cEvent('copied_link', { method:'clipboard' });\n        alert('Link copied! Now share it with your friends.');\n      } catch(e){\n        // [CLARITY] 링크 복사 실패 → 프롬프트 대체\n        cEvent('copied_link_fallback');\n        prompt('Copy the share link:', url);\n      }\n    }\n    document.getElementById('shareLinkBtn')?.addEventListener('click', function(){\n      // [CLARITY] Copy Link 버튼 클릭\n      cEvent('click_copy_link');\n      shareCurrentResult();\n    });\n\n    function loadFromURL(){\n      const qs = new URLSearchParams(location.search);\n      const isShared = qs.get('shared') === '1';\n      const name = qs.get('name');\n      const ko = qs.get('ko');\n      const en = qs.get('en');\n      const u  = qs.get('u');\n\n      if (name && ko && en){\n        document.getElementById('nameForm').style.display='none';\n        document.getElementById('topBanner')?.setAttribute('hidden','true');\n\n        setResultView({ fullKo:name, ko, en, user:'' });\n        document.getElementById('resultContainer').style.display='block';\n\n        if (isShared) {\n          document.getElementById('btnRow').style.display = 'none';\n          document.getElementById('shareRow').style.display = 'none';\n          document.getElementById('shareCTA').style.display = 'block';\n          const title = document.getElementById('sharedTitle');\n          title.innerHTML = `This is <strong>${escapeHtml(u || 'friend')}</strong>'s Korean name and the vibe behind it.`;\n          title.style.display = 'block';\n\n          // [CLARITY] 공유 링크로 진입한 공유보기 페이지\n          cSet('route', 'kname:shared_view');\n          cEvent('view_shared', { has_user: !!u });\n        } else {\n          document.getElementById('shareCTA').style.display = 'none';\n          document.getElementById('sharedTitle').style.display = 'none';\n\n          // [CLARITY] 직접 생성 결과 URL 로딩 (예외적 상황)\n          cSet('route', 'kname:result');\n          cEvent('view_result_direct');\n        }\n\n        setTimeout(()=>document.getElementById('resultContainer').scrollIntoView({behavior:'smooth', block:'center'}), 40);\n      } else {\n        document.getElementById('shareCTA').style.display = 'none';\n        document.getElementById('sharedTitle').style.display = 'none';\n        document.getElementById('userNameDisplay').style.display = 'none';\n\n        // [CLARITY] 기본 폼 화면\n        cSet('route', 'kname:form');\n        cEvent('view_form');\n      }\n    }\n\n    // 초기 진입: UI는 저해상도 사용\n    loadFromURL();\n    const resultCard = document.getElementById('resultCard');\n    if (resultCard) {\n      resultCard.style.backgroundImage = `url(\"${BG_DISPLAY_URL}\")`;\n    }\n    (async () => {\n      try { await applyInlineBGToResultCard(); } catch(_) {}\n      try { await preloadBackgroundImage(); } catch(_) {}\n    })();\n\n    /* 카운터 증가 (존재 시에만 업데이트) */\n    async function incrementCounter() {\n      try {\n        const response = await fetch('https://hangeulnamevisit.with-f85.workers.dev/api/count', { method:'POST' });\n        const data = await response.json();\n        const el = document.getElementById('counterNumber');\n        if (el && typeof data.count !== 'undefined') el.textContent = data.count;\n      } catch (error) {\n        console.log('증가 실패: ' + (error?.message || error));\n      }\n    }\n    window.incrementCounter = incrementCounter;\n  </script>\n</body>\n</html>","embedURL":""}},"113:100":{"type":"COMPONENT_SET","id":"113:100","name":"App Icon","absoluteBoundingBox":{"x":-873.0,"y":222.0,"width":230.0,"height":88.0},"isolatedAbsoluteRenderBounds":{"x":-873.0,"y":222.0,"width":230.0,"height":88.0},"relativeTransform":[[1.0,0.0,-873.0],[0.0,1.0,222.0]],"size":{"x":230.0,"y":88.0},"fills":[],"strokeAlign":"INSIDE","strokeDashes":[10.0,5.0],"strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.800000011920929,"g":0.800000011920929,"b":0.800000011920929,"a":1.0},"visible":true,"opacity":1.0}],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["113:99","113:128","113:129"],"componentPropertyDefinitions":{"Property 1":{"type":"VARIANT","defaultValue":"TTMIK Courses","variantOptions":["TTMIK Courses","TTMIK Stories","Seyo"]}}},"377:670":{"type":"FRAME","id":"377:670","name":"Frame 3420","absoluteBoundingBox":{"x":2419.0,"y":1462.0,"width":345.0,"height":398.85546875},"isolatedAbsoluteRenderBounds":{"x":2411.0,"y":1462.0,"width":361.0,"height":408.85546875},"relativeTransform":[[1.0,0.0,24.0],[0.0,1.0,1169.0]],"size":{"x":345.0,"y":398.85546875},"fills":[],"constraints":{"vertical":"TOP","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-172.5,"sizeFraction":0.5},"right":{"pixelOffset":172.5,"sizeFraction":0.5},"top":{"pixelOffset":1169.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":40.0,"counterAxisSizingMode":"FIXED","children":["377:409","377:465"]},"180:897":{"mainComponentId":"113:195","type":"INSTANCE","id":"180:897","name":"footer","absoluteBoundingBox":{"x":3499.0,"y":1963.0,"width":393.0,"height":589.0},"isolatedAbsoluteRenderBounds":{"x":3499.0,"y":1963.0,"width":393.0,"height":589.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,1670.0]],"size":{"x":393.0,"y":589.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.190692603588104,"g":0.190692603588104,"b":0.190692603588104,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"BOTTOM","horizontal":"LEFT_RIGHT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"bottom":{"pixelOffset":0.0,"sizeFraction":1.0}},"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":50.0,"paddingRight":24.0,"paddingBottom":50.0,"paddingLeft":24.0,"layoutMode":"HORIZONTAL","counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["I180:897;108:1081"],"componentProperties":{},"overrides":[{"key":[],"value":{"primaryAxisSizingMode":"FIXED"},"componentId":"113:195"},{"key":["Frame 34140","Frame 34130","Frame 34110"],"value":{"primaryAxisAlignItems":"SPACE_BETWEEN"},"componentId":"113:195"}]}},"assetIdToGuid":{},"guidToUrl":{"0:3":"/","74:30":"/assets","2:422":"/hangeul-name-generator"},"fonts":{"DM Mono:Medium":{"id":"2f3c75a191f9bc30c0e317afa9dfee8ef8ac1018","url":"2f3c75a191f9bc30c0e317afa9dfee8ef8ac1018","source":2,"italic":false,"weight":500},"DM Sans:SemiBold":{"id":"b6aa66348c49a5a33159ea5b426141f5092965e0","url":"b6aa66348c49a5a33159ea5b426141f5092965e0","source":2,"italic":false,"weight":600,"variationAxes":[{"tag":"opsz","value":14.0,"name":"OpticalSize"},{"tag":"wght","value":600.0,"name":"Weight"}]},"DM Sans:Medium":{"id":"b6aa66348c49a5a33159ea5b426141f5092965e0","url":"b6aa66348c49a5a33159ea5b426141f5092965e0","source":2,"italic":false,"weight":500,"variationAxes":[{"tag":"opsz","value":14.0,"name":"OpticalSize"},{"tag":"wght","value":500.0,"name":"Weight"}]},"DM Sans:Bold":{"id":"b6aa66348c49a5a33159ea5b426141f5092965e0","url":"b6aa66348c49a5a33159ea5b426141f5092965e0","source":2,"italic":false,"weight":700,"variationAxes":[{"tag":"opsz","value":14.0,"name":"OpticalSize"},{"tag":"wght","value":700.0,"name":"Weight"}]},"DM Mono:Regular":{"id":"db17d2a554ebd6fee2da2fc1bd94a9e6cc07526e","url":"db17d2a554ebd6fee2da2fc1bd94a9e6cc07526e","source":2,"italic":false,"weight":400}},"assets":{"04220716bf44f764931a9a8981baf528a94d038f":{"type":"GENERATED_ASSET","url":"04220716bf44f764931a9a8981baf528a94d038f.svg","size":{"x":5.59099054336548,"y":9.06065940856934},"offsets":{"left":{"value":-13.2582515478134,"unit":"PERCENT"},"right":{"value":-26.5165120363235,"unit":"PERCENT"},"top":{"value":-6.62912577390671,"unit":"PERCENT"},"bottom":{"value":-6.62911683320999,"unit":"PERCENT"}},"format":"SVG"},"2b73b287ece92b3afc459e9bdc0743271e676a93":{"type":"GENERATED_ASSET","url":"2b73b287ece92b3afc459e9bdc0743271e676a93.svg","size":{"x":5.59099054336548,"y":9.06065940856934},"offsets":{"left":{"value":-13.2582515478134,"unit":"PERCENT"},"right":{"value":-26.5165120363235,"unit":"PERCENT"},"top":{"value":-6.62912577390671,"unit":"PERCENT"},"bottom":{"value":-6.62911683320999,"unit":"PERCENT"}},"format":"SVG"},"b71286ba66a771f33fcabc8606425c2568f9036d":{"type":"GENERATED_ASSET","url":"b71286ba66a771f33fcabc8606425c2568f9036d.svg","size":{"x":32.0,"y":22.2064971923828},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":-0.000274853451575288,"unit":"PERCENT"}},"format":"SVG"},"9c41be702f37961a1290e6e3122e436c110f68d2":{"type":"GENERATED_ASSET","url":"9c41be702f37961a1290e6e3122e436c110f68d2.svg","size":{"x":27.9999980926514,"y":32.0},"offsets":{"left":{"value":3.57120365025919e-09,"unit":"PERCENT"},"right":{"value":6.80838820242359e-06,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"7f2b4987e968e465145a09344318f27fe9b3f71a":{"type":"PAINT_ASSET","url":"7f2b4987e968e465145a09344318f27fe9b3f71a.png","size":{"x":2401.0,"y":1370.0}},"f44be9b4a6b115f94ce3045d50ed1f068a02c784":{"type":"GENERATED_ASSET","url":"f44be9b4a6b115f94ce3045d50ed1f068a02c784.svg","size":{"x":40.0,"y":20.0},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"704f9decfb773fdf545e49995501bb7a0c3f18ee":{"type":"GENERATED_ASSET","url":"704f9decfb773fdf545e49995501bb7a0c3f18ee.svg","size":{"x":32.0,"y":30.9008159637451},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"bceca5780043df9252d0befd823283d65e31524a":{"type":"GENERATED_ASSET","url":"bceca5780043df9252d0befd823283d65e31524a.svg","size":{"x":27.6745357513428,"y":14.1386548004152},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":-0.000358388972646996,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":-0.000128805665361924,"unit":"PERCENT"}},"format":"SVG"},"a9df62e45c37189d80a7faddad02006dbd8465fe":{"type":"GENERATED_ASSET","url":"a9df62e45c37189d80a7faddad02006dbd8465fe.svg","size":{"x":28.5501232604979,"y":28.5537987213136},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":-6.84103876255822e-06,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":-1.60316532578125e-07,"unit":"PERCENT"}},"format":"SVG"},"8b37f692b2702d9e5f15f9dedcc0ce3f0e589e2a":{"type":"GENERATED_ASSET","url":"8b37f692b2702d9e5f15f9dedcc0ce3f0e589e2a.png","size":{"x":1200.0,"y":630.0},"offsets":{"top":{"value":0,"unit":"PIXELS"},"right":{"value":0,"unit":"PIXELS"},"bottom":{"value":0,"unit":"PIXELS"},"left":{"value":0,"unit":"PIXELS"}},"format":"PNG"},"245493ff4d10d2d1fd68ba826319004125ad7e81":{"type":"GENERATED_ASSET","url":"245493ff4d10d2d1fd68ba826319004125ad7e81.png","size":{"x":48.0,"y":48.0},"offsets":{"top":{"value":0,"unit":"PIXELS"},"right":{"value":0,"unit":"PIXELS"},"bottom":{"value":0,"unit":"PIXELS"},"left":{"value":0,"unit":"PIXELS"}},"format":"PNG"}},"stablePathToAssetInfo":{"113:85":{"hash":"b71286ba66a771f33fcabc8606425c2568f9036d"},"113:190":{"hash":"9c41be702f37961a1290e6e3122e436c110f68d2"},"530:415":{"hash":"04220716bf44f764931a9a8981baf528a94d038f"},"113:37":{"hash":"a9df62e45c37189d80a7faddad02006dbd8465fe"},"113:10":{"hash":"f44be9b4a6b115f94ce3045d50ed1f068a02c784"},"I113:184;113:95":{"hash":"704f9decfb773fdf545e49995501bb7a0c3f18ee"},"113:95":{"hash":"704f9decfb773fdf545e49995501bb7a0c3f18ee"},"I113:192;113:190":{"hash":"9c41be702f37961a1290e6e3122e436c110f68d2"},"I547:498;1357:23522":{"hash":"2b73b287ece92b3afc459e9bdc0743271e676a93"},"I180:898;113:184;113:95":{"hash":"704f9decfb773fdf545e49995501bb7a0c3f18ee"},"I180:898;113:159;113:37":{"hash":"a9df62e45c37189d80a7faddad02006dbd8465fe"},"I113:159;113:37":{"hash":"a9df62e45c37189d80a7faddad02006dbd8465fe"},"421:410":{"hash":"8b37f692b2702d9e5f15f9dedcc0ce3f0e589e2a"},"I547:503;1357:23522":{"hash":"04220716bf44f764931a9a8981baf528a94d038f"},"I180:897;113:131;113:10":{"hash":"f44be9b4a6b115f94ce3045d50ed1f068a02c784"},"I180:897;113:183;113:85":{"hash":"b71286ba66a771f33fcabc8606425c2568f9036d"},"I180:896;113:167;113:44":{"hash":"bceca5780043df9252d0befd823283d65e31524a"},"I180:898;113:131;113:10":{"hash":"f44be9b4a6b115f94ce3045d50ed1f068a02c784"},"I113:183;113:85":{"hash":"b71286ba66a771f33fcabc8606425c2568f9036d"},"I180:897;113:192;113:190":{"hash":"9c41be702f37961a1290e6e3122e436c110f68d2"},"I180:897;113:167;113:44":{"hash":"bceca5780043df9252d0befd823283d65e31524a"},"I547:502;1357:23522":{"hash":"04220716bf44f764931a9a8981baf528a94d038f"},"113:44":{"hash":"bceca5780043df9252d0befd823283d65e31524a"},"I180:896;113:183;113:85":{"hash":"b71286ba66a771f33fcabc8606425c2568f9036d"},"I180:898;113:167;113:44":{"hash":"bceca5780043df9252d0befd823283d65e31524a"},"I113:167;113:44":{"hash":"bceca5780043df9252d0befd823283d65e31524a"},"I546:482;1357:23522":{"hash":"04220716bf44f764931a9a8981baf528a94d038f"},"I180:896;113:192;113:190":{"hash":"9c41be702f37961a1290e6e3122e436c110f68d2"},"I113:131;113:10":{"hash":"f44be9b4a6b115f94ce3045d50ed1f068a02c784"},"I180:897;113:184;113:95":{"hash":"704f9decfb773fdf545e49995501bb7a0c3f18ee"},"I180:896;113:159;113:37":{"hash":"a9df62e45c37189d80a7faddad02006dbd8465fe"},"I180:898;113:183;113:85":{"hash":"b71286ba66a771f33fcabc8606425c2568f9036d"},"I180:897;113:159;113:37":{"hash":"a9df62e45c37189d80a7faddad02006dbd8465fe"},"I546:477;1357:23522":{"hash":"2b73b287ece92b3afc459e9bdc0743271e676a93"},"I180:896;113:184;113:95":{"hash":"704f9decfb773fdf545e49995501bb7a0c3f18ee"},"I180:898;113:192;113:190":{"hash":"9c41be702f37961a1290e6e3122e436c110f68d2"},"I180:896;113:131;113:10":{"hash":"f44be9b4a6b115f94ce3045d50ed1f068a02c784"},"I546:481;1357:23522":{"hash":"2b73b287ece92b3afc459e9bdc0743271e676a93"},"440:414":{"hash":"245493ff4d10d2d1fd68ba826319004125ad7e81"}},"animateRootIds":[],"siteSettings":{"title":"한글이름 MY KOREAN NAME IS","description":"What if your name were in Korean? Celebrate Hangul Day with TTMIK’s “Korean Name” campaign. Discover your own three-syllable Korean name and its unique vibe. Let's bond over your Korean name!","scalingMode":"REFLOW","googleAnalyticsID":"G-KNFL0CCK89","customCodeHeadStart":"<script type=\"text/javascript\">\n    (function(c,l,a,r,i,t,y){\n        c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};\n        t=l.createElement(r);t.async=1;t.src=\"https://www.clarity.ms/tag/\"+i;\n        y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);\n    })(window, document, \"clarity\", \"script\", \"tiu4rfae4w\");\n</script>","customCodeBodyEnd":"<script>\n    (function(j,ennifer) {\n        j['dmndata']=[];j['jenniferFront']=function(args){window.dmndata.push(args)};\n        j['dmnaid']=ennifer;j['dmnatime']=new Date();j['dmnanocookie']=false;j['dmnajennifer']='JENNIFER_FRONT@INTG';\n    }(window, '6c9f1cc9'));\n</script>\n<script async src=\"https://d-collect.jennifersoft.com/6c9f1cc9/demian.js\"></script>\n\n<!-- Google tag (gtag.js) -->\n<script async src=\"https://www.googletagmanager.com/gtag/js?id=G-KNFL0CCK89\"></script>\n<script>\n  window.dataLayer = window.dataLayer || [];\n  function gtag(){dataLayer.push(arguments);}\n  gtag('js', new Date());\n\n  gtag('config', 'G-KNFL0CCK89');\n</script>","faviconFilename":"245493ff4d10d2d1fd68ba826319004125ad7e81.png","socialImageFilename":"8b37f692b2702d9e5f15f9dedcc0ce3f0e589e2a.png","labs":{"E5FBBA911B2B7A09E649D4BE6CDF8591EAEFC881":false}},"sourceCodeHash":""}