{"roots":["2:422"],"nodeById":{"113:128":{"type":"COMPONENT","id":"113:128","name":"Property 1=TTMIK Stories","overrideKey":"113:128","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:10":{"type":"SVG","id":"113:10","name":"logo","overrideKey":"113:10","absoluteBoundingBox":{"x":-849.0001220703125,"y":256.0,"width":40.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-849.0001220703125,"y":256.0,"width":40.0,"height":20.0},"relativeTransform":[[1.0,0.0,3.999882698059082],[0.0,1.0,14.000003814697266]],"size":{"x":40.0,"y":20.0},"fills":[],"constraints":{"vertical":"CENTER","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-20.000117301940918,"sizeFraction":0.5},"right":{"pixelOffset":19.999882698059082,"sizeFraction":0.5},"top":{"pixelOffset":-9.999996185302734,"sizeFraction":0.5},"bottom":{"pixelOffset":10.000003814697266,"sizeFraction":0.5}},"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.1946023851633072,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"hash":"f4bd92a6a906b219f868c649ae23ad7d84392d55"},"113:9":{"type":"RECTANGLE","id":"113:9","name":"Rectangle 9157","overrideKey":"113:9","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.20000000298023224,"g":0.20000000298023224,"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:36":{"type":"RECTANGLE","id":"113:36","name":"Rectangle 9157","overrideKey":"113:36","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.10588235408067703,"b":0.1882352977991104,"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","overrideKey":"113:195","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.19069260358810425,"g":0.19069260358810425,"b":0.19069260358810425,"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:1151":{"type":"TEXT","id":"108:1151","name":"© 2025 Talk To Me In Korean. All rights reserved.","overrideKey":"108:1151","absoluteBoundingBox":{"x":-1418.0,"y":622.0,"width":345.0,"height":17.0},"isolatedAbsoluteRenderBounds":{"x":-1406.9847412109375,"y":626.0029907226562,"width":320.7628173828125,"height":10.54901123046875},"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.20736694335938,"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:1140":{"type":"FRAME","id":"108:1140","name":"Frame 3411","overrideKey":"108:1140","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"]},"113:188":{"type":"FRAME","id":"113:188","name":"SNS","overrideKey":"113:188","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"]},"113:183":{"mainComponentId":"113:97","type":"INSTANCE","id":"113:183","name":"SNS","overrideKey":"113:183","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.8509804010391235,"g":0.8509804010391235,"b":0.8509804010391235,"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,"isDefault":true}}}]},"113:192":{"mainComponentId":"113:191","type":"INSTANCE","id":"113:192","name":"TTMIK Books","overrideKey":"113:192","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,"isDefault":true}}}]},"113:37":{"type":"SVG","id":"113:37","name":"Group","overrideKey":"113:37","absoluteBoundingBox":{"x":-772.303955078125,"y":251.696044921875,"width":28.550121307373047,"height":28.55379867553711},"isolatedAbsoluteRenderBounds":{"x":-772.303955078125,"y":251.696044921875,"width":28.550121307373047,"height":28.553802490234375},"relativeTransform":[[1.0,0.0,9.696046829223633],[0.0,1.0,9.696046829223633]],"size":{"x":28.550121307373047,"y":28.55379867553711},"fills":[],"constraints":{"vertical":"TOP","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-14.303953170776367,"sizeFraction":0.5},"right":{"pixelOffset":14.24616813659668,"sizeFraction":0.5},"top":{"pixelOffset":9.696046829223633,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.5333333015441895,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"hash":"3f474f35700aeea7c57044194f844c36c1c9054f"},"108:1139":{"type":"TEXT","id":"108:1139","name":"Seyo\u2028Korean Speaking App","overrideKey":"108:1139","absoluteBoundingBox":{"x":-1354.0,"y":376.0,"width":281.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":-1353.2080078125,"y":385.1839904785156,"width":131.802001953125,"height":35.832000732421875},"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\u2028Korean 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.24884033203125,"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.20736694335938,"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.39999771118164,"lineHeightPercent":138.24884033203125,"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.799999237060547,"lineHeightPercent":138.24884033203125,"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"}}},"113:159":{"mainComponentId":"113:128","type":"INSTANCE","id":"113:159","name":"App Icon","overrideKey":"113:159","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,"isDefault":true}}}]},"108:1085":{"type":"FRAME","id":"108:1085","name":"Frame 3406","overrideKey":"108:1085","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"]},"113:131":{"mainComponentId":"113:99","type":"INSTANCE","id":"113:131","name":"App Icon","overrideKey":"113:131","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.05156249925494194,"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,"isDefault":true}}}]},"108:1083":{"type":"TEXT","id":"108:1083","name":"Meet the TTMIK Universe","overrideKey":"108:1083","absoluteBoundingBox":{"x":-1418.0,"y":150.0,"width":345.0,"height":32.0},"isolatedAbsoluteRenderBounds":{"x":-1416.593017578125,"y":157.83799743652344,"width":242.674072265625,"height":15.41400146484375},"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.20736694335938,"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","overrideKey":"2:422","absoluteBoundingBox":{"x":1887.0,"y":0.0,"width":2711.0,"height":2488.0},"isolatedAbsoluteRenderBounds":{"x":1887.0,"y":0.0,"width":2711.0,"height":2488.0},"relativeTransform":[[1.0,0.0,1887.0],[0.0,1.0,0.0]],"size":{"x":2711.0,"y":2488.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"]},"69:176":{"type":"TEXT","id":"69:176","name":"Elizabeth !","overrideKey":"69:176","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.13333334028720856,"g":0.13333334028720856,"b":0.13333334028720856,"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.8489279747009277,"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.20736694335938,"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":"이름생성기","overrideKey":"69:165","absoluteBoundingBox":{"x":4159.0,"y":100.0,"width":375.0,"height":2324.0},"isolatedAbsoluteRenderBounds":{"x":4159.0,"y":100.0,"width":375.0,"height":2324.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.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":"TOP_BOTTOM","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-187.5,"sizeFraction":0.5},"right":{"pixelOffset":187.5,"sizeFraction":0.5},"top":{"pixelOffset":0.0,"sizeFraction":0.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","overrideKey":"377:668","absoluteBoundingBox":{"x":4174.0,"y":1373.5625,"width":345.0,"height":398.85546875},"isolatedAbsoluteRenderBounds":{"x":4166.0,"y":1373.5625,"width":361.0,"height":408.85546875},"relativeTransform":[[1.0,0.0,15.0],[0.0,1.0,1273.5625]],"size":{"x":345.0,"y":398.85546875},"fills":[],"constraints":{"vertical":"TOP","horizontal":"LEFT_RIGHT"},"constraintValues":{"left":{"pixelOffset":15.0,"sizeFraction":0.0},"right":{"pixelOffset":-15.0,"sizeFraction":1.0},"top":{"pixelOffset":1273.5625,"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"]},"377:545":{"type":"FRAME","id":"377:545","name":"hangeulface","overrideKey":"377:545","absoluteBoundingBox":{"x":4174.0,"y":1479.5625,"width":345.0,"height":292.85546875},"isolatedAbsoluteRenderBounds":{"x":4166.0,"y":1473.5625,"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.15000000596046448},"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"]},"377:687":{"type":"FRAME","id":"377:687","name":"Frame 3421","overrideKey":"377:687","absoluteBoundingBox":{"x":4174.0,"y":1676.41796875,"width":345.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":4174.0,"y":1676.41796875,"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 \u2028for Hangeul Day!","overrideKey":"377:584","absoluteBoundingBox":{"x":4198.0,"y":1700.41796875,"width":297.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":4230.1767578125,"y":1705.89794921875,"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 \u2028for 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.20736694335938,"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","overrideKey":"377:735","absoluteBoundingBox":{"x":4174.0,"y":1479.5625,"width":345.0,"height":196.85546875},"targetAspectRatio":{"x":2401.0,"y":1370.0},"isolatedAbsoluteRenderBounds":{"x":4174.0,"y":1479.5625,"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 \u2028Hangeul Day in 2024","overrideKey":"377:410","absoluteBoundingBox":{"x":4174.0,"y":1373.5625,"width":345.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":4215.89306640625,"y":1379.4425048828125,"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.4000000059604645,"g":0.19809524714946747,"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 \u2028Hangeul 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.299999237060547,"lineHeightPercent":99.84638977050781,"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.4000000059604645,"g":0.19809524714946747,"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.4000000059604645,"g":0.19809524714946747,"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","overrideKey":"180:898","absoluteBoundingBox":{"x":4150.0,"y":1835.0,"width":393.0,"height":589.0},"isolatedAbsoluteRenderBounds":{"x":4150.0,"y":1835.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.19069260358810425,"g":0.19069260358810425,"b":0.19069260358810425,"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}},{"key":["Frame 34140","Frame 34130","Frame 34110"],"value":{"primaryAxisAlignItems":"SPACE_BETWEEN"}}]},"113:44":{"type":"SVG","id":"113:44","name":"Group 36793","overrideKey":"113:44","absoluteBoundingBox":{"x":-700.8238525390625,"y":258.89599609375,"width":27.674436569213867,"height":14.138636589050293},"isolatedAbsoluteRenderBounds":{"x":-700.8238525390625,"y":258.89599609375,"width":27.674560546875,"height":14.138671875},"relativeTransform":[[1.0,0.0,10.176124572753906],[0.0,1.0,16.895999908447266]],"size":{"x":27.674436569213867,"y":14.138636589050293},"fills":[],"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":10.176124572753906,"sizeFraction":0.0},"top":{"pixelOffset":16.895999908447266,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.3534659445285797,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"hash":"8c28bd314a9711385e76c2857edff413b15f3fcd"},"113:184":{"mainComponentId":"113:98","type":"INSTANCE","id":"113:184","name":"SNS","overrideKey":"113:184","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.8509804010391235,"g":0.8509804010391235,"b":0.8509804010391235,"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,"isDefault":true}}}]},"69:174":{"type":"TEXT","id":"69:174","name":"My Korean Name Is","overrideKey":"69:174","absoluteBoundingBox":{"x":4254.5,"y":140.0,"width":184.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":4255.65966796875,"y":145.39999389648438,"width":180.87744140625,"height":16.560012817382812},"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.4000000059604645,"g":0.19809524714946747,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":1.8534226417541504,"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.43600082397461,"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:166":{"type":"WIDGET","id":"69:166","name":"Embed 1","overrideKey":"69:166","absoluteBoundingBox":{"x":4159.0,"y":220.0,"width":375.0,"height":1115.0},"isolatedAbsoluteRenderBounds":{"x":4159.0,"y":220.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":"\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"ko\"\u003e\n\u003chead\u003e\n  \u003cmeta charset=\"UTF-8\" /\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/\u003e\n  \u003ctitle\u003e한글이름 MY KOREAN NAME IS\u003c/title\u003e\n\n  \u003c!-- Sentry (옵션 유지) --\u003e\n  \u003cscript src=\"https://js.sentry-cdn.com/01a272064480dbf2fd4c3ee2de7bfcf6.min.js\" crossorigin=\"anonymous\"\u003e\u003c/script\u003e\n  \u003cscript\u003e\n    Sentry.init({\n      dsn: \"https://01a272064480dbf2fd4c3ee2de7bfcf6@o1189375.ingest.us.sentry.io/4510108487647232\",\n      enableLogs: true,\n    });\n  \u003c/script\u003e\n\n  \u003c!-- DM Sans --\u003e\n  \u003clink rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin\u003e\n  \u003clink href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700\u0026display=swap\" rel=\"stylesheet\"\u003e\n\n  \u003c!-- 프리로드: UI 표시용 저해상도 배경만 선로딩 --\u003e\n  \u003clink rel=\"preload\" as=\"font\" type=\"font/woff2\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaDaeHan.woff2\"\u003e\n  \u003clink rel=\"preload\" as=\"font\" type=\"font/woff2\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaManSeh.woff2\"\u003e\n  \u003clink rel=\"preload\" as=\"image\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/name-card.png\"\u003e\n\n  \u003cstyle\u003e\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  \u003c/style\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"header\"\u003e\n      \u003cdiv id=\"topBanner\" class=\"top-banner\" aria-live=\"polite\"\u003e\n        Type in your name below and \u003cbr/\u003eyou will get a Korean-style name \u003cbr/\u003ealong with a fun personality match \u003cbr/\u003ethat reflects Korean vibes.\n      \u003c/div\u003e\n      \u003cdiv id=\"sharedTitle\" class=\"shared-title\"\u003e\u003c/div\u003e\n\n      \u003cdiv class=\"user-name-display\" id=\"userNameDisplay\"\u003e\n        \u003cdiv class=\"user-name\" id=\"userName\"\u003e\u003c/div\u003e\n        \u003cdiv class=\"generated-msg\"\u003eHere's your Korean name and the vibe behind it!\u003c/div\u003e\n      \u003c/div\u003e\n    \u003c/div\u003e\n\n    \u003c!-- 입력 폼 --\u003e\n    \u003cdiv id=\"nameForm\"\u003e\n      \u003cdiv class=\"form-group\"\u003e\n        \u003clabel class=\"form-label\" for=\"firstName\"\u003e이름 (First Name)\u003c/label\u003e\n        \u003c!-- ✅ PII 마스킹 --\u003e\n        \u003cinput data-clarity-mask=\"true\" type=\"text\" id=\"firstName\" class=\"form-input\" placeholder=\"Michael, Sophie, Omar, Fatima...\"\u003e\n      \u003c/div\u003e\n      \u003cdiv class=\"form-group\"\u003e\n        \u003clabel class=\"form-label\" for=\"lastName\"\u003e성 (Last Name)\u003c/label\u003e\n        \u003c!-- ✅ PII 마스킹 --\u003e\n        \u003cinput data-clarity-mask=\"true\" type=\"text\" id=\"lastName\" class=\"form-input\" placeholder=\"Johnson, Kim, Hassan, Al-Ahmad...\"\u003e\n      \u003c/div\u003e\n      \u003cdiv class=\"form-group\"\u003e\n        \u003clabel class=\"form-label\"\u003eName type\u003c/label\u003e\n        \u003cdiv class=\"gender-options\" role=\"tablist\" aria-label=\"Name type options\"\u003e\n          \u003cdiv class=\"gender-option selected\" role=\"tab\" aria-selected=\"true\" tabindex=\"0\" onclick=\"selectGender('neutral', this)\"\u003eunisex\u003c/div\u003e\n          \u003cdiv class=\"gender-option\" role=\"tab\" aria-selected=\"false\" tabindex=\"0\" onclick=\"selectGender('female', this)\"\u003efeminine\u003c/div\u003e\n          \u003cdiv class=\"gender-option\" role=\"tab\" aria-selected=\"false\" tabindex=\"0\" onclick=\"selectGender('male', this)\"\u003emasculine\u003c/div\u003e\n        \u003c/div\u003e\n      \u003c/div\u003e\n      \u003cbutton type=\"button\" class=\"generate-btn\" onclick=\"generateKoreanName(); incrementCounter();\"\u003eGenerate Korean Name\u003c/button\u003e\n      \u003cdiv class=\"form-footer\" id=\"formFooter\" aria-live=\"polite\"\u003e\n        \u003cimg 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\" /\u003e\n        \u003cp class=\"form-footer__text\"\u003e\n          This service is created by \u003cbr/\u003eTalk To Me In Korean.\n        \u003c/p\u003e\n      \u003c/div\u003e\n    \u003c/div\u003e\n\n    \u003c!-- 로딩 --\u003e\n    \u003cdiv class=\"loading\" id=\"loading\"\u003e\n      \u003cdiv class=\"loading-spinner\"\u003e\u003c/div\u003e\n      \u003cp\u003eCreating your unique Korean name...\u003c/p\u003e\n    \u003c/div\u003e\n\n    \u003c!-- 결과 --\u003e\n    \u003cdiv class=\"result-container\" id=\"resultContainer\"\u003e\n      \u003cdiv class=\"result-card\" id=\"resultCard\"\u003e\n        \u003cdiv class=\"result-inner\"\u003e\n          \u003cdiv class=\"korean-name\" id=\"koreanName\"\u003e\u003c/div\u003e\n          \u003cdiv class=\"ko-characteristic\" id=\"koCharacteristic\"\u003e\u003c/div\u003e\n          \u003cdiv class=\"en-characteristic\" id=\"enCharacteristic\"\u003e\u003c/div\u003e\n        \u003c/div\u003e\n      \u003c/div\u003e\n\n      \u003cdiv id=\"btnRow\" class=\"btn-row\"\u003e\n        \u003cbutton class=\"save-btn\" onclick=\"downloadResultImage()\"\u003eSave \u0026 Share\u003c/button\u003e\n      \u003c/div\u003e\n\n      \u003cdiv id=\"shareRow\" class=\"share-row\"\u003e\n        \u003cbutton id=\"shareLinkBtn\" class=\"share-link-btn\"\u003eCopy Link\u003c/button\u003e\n        \u003cp\u003ePlease screenshot if you cannot \u003cbr/\u003esave the image.\u003c/p\u003e\n      \u003c/div\u003e\n\n      \u003cdiv id=\"shareCTA\" class=\"share-cta\"\u003e\n        \u003ca class=\"cta-btn\" href=\"https://hangeulname.figma.site/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eCreate My Korean Name Too\u003c/a\u003e\n      \u003c/div\u003e\n    \u003c/div\u003e\n  \u003c/div\u003e\n\n  \u003c!-- html2canvas (희박한 폴백용) --\u003e\n  \u003cscript src=\"https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js\"\u003e\u003c/script\u003e\n\n  \u003cscript\u003e\n    /* =========================\n       [CLARITY] 안전한 호출 유틸\n       - Figma Sites \u003chead\u003e에 설치된 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 \u0026\u0026 window.clarity('set', key, val); } catch(_){} }\n    function cEvent(name, props){ try { window.clarity \u0026\u0026 window.clarity('event', name, props || {}); } catch(_){} }\n\n    // 팝업-부모 통신으로 공유 버튼 클릭 이벤트 수집\n    window.addEventListener('message', function(e){\n      if (e \u0026\u0026 e.data \u0026\u0026 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) =\u003e {\n        const img = new Image();\n        img.onload = () =\u003e resolve({ w: img.naturalWidth || 768, h: img.naturalHeight || 1364 });\n        img.onerror = () =\u003e resolve({ w: 768, h: 1364 });\n        img.crossOrigin = 'anonymous';\n        img.src = BG_SAVE_URL; // 저장 고해상도 기준으로 확인\n        setTimeout(() =\u003e 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) =\u003e {\n        const img = new Image();\n        img.crossOrigin = 'anonymous';\n        img.onload = () =\u003e resolve(img);\n        img.onerror = () =\u003e resolve(null);\n        img.src = BG_DISPLAY_URL;\n        setTimeout(() =\u003e 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=\u003e{\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()\u003e0.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()\u003e0.5 ? '정' : '장';\n      if (s.startsWith('s') || s.startsWith('sh')) return Math.random()\u003e0.5 ? '서' : '신';\n      if (s.startsWith('w') || s.startsWith('y')) return Math.random()\u003e0.5 ? '윤' : '유';\n      if (s.startsWith('h')) return Math.random()\u003e0.5 ? '한' : '황';\n      if (s.startsWith('m')) return Math.random()\u003e0.5 ? '문' : '민';\n      if (s.startsWith('o')) return '오';\n      if (s.startsWith('a')) return '안';\n      if (s.startsWith('n')) return Math.random()\u003e0.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 =\u003e {\n        const korFirst = kn.charAt(0);\n        if (first === 'm' \u0026\u0026 ['민','미'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 's' \u0026\u0026 ['서','시','수','선','성'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'j' \u0026\u0026 ['지','주','준','정'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'a' \u0026\u0026 ['아','안','애'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'e' \u0026\u0026 ['에','은','예'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'r' \u0026\u0026 ['라','리','로'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'h' \u0026\u0026 ['하','한','해'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'd' \u0026\u0026 ['다','도','두'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 't' \u0026\u0026 ['태','토','테'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'l' \u0026\u0026 ['리','라','로'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'v' \u0026\u0026 ['비','바'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'n' \u0026\u0026 ['나','노','누'].some(p =\u003e 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) =\u003e { 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 \u0026\u0026 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 \u003c timeout) {\n            const allLoaded = fontCheckList.every(f =\u003e document.fonts.check(f));\n            if (allLoaded) break;\n            await new Promise(r =\u003e setTimeout(r, interval));\n            elapsed += interval;\n          }\n\n          await document.fonts.ready;\n          await warmUpFonts();\n          await new Promise(r =\u003e 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=\u003e{\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 \u003c words.length; i++) {\n        const test = line ? line + ' ' + words[i] : words[i];\n        if (ctx.measureText(test).width \u003c= 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 \u003e minPx \u0026\u0026 ctx.measureText(text).width \u003e 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) =\u003e {\n        const img = new Image();\n        if (!/^data:/.test(bgSrc)) img.crossOrigin = 'anonymous';\n        img.onload = () =\u003e { ctx.drawImage(img, 0, 0, W, H); resolve(); };\n        img.onerror = () =\u003e { 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) =\u003e {\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 =\u003e {\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 =\u003e {\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            \u003c!doctype html\u003e\n            \u003cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1\"\u003e\n            \u003ctitle\u003eSave Image\u003c/title\u003e\n            \u003clink rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin\u003e\n            \u003clink href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700\u0026display=swap\" rel=\"stylesheet\"\u003e\n            \u003cstyle\u003e\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            \u003c/style\u003e\n            \u003cdiv class=\"wrap\"\u003e\n              \u003ch3\u003eMy Korean Name Is\u003c/h3\u003e\n              \u003cdiv id=\"ph\"\u003ePlease wait a moment.\u003c/div\u003e\n              \u003cimg id=\"preview\" style=\"display:none\" alt=\"korean-name\"/\u003e\n              \u003cbutton id=\"shareBtn\" style=\"display:none;padding:25px;\"\u003eShare\u003c/button\u003e\n            \u003c/div\u003e\n            \u003cscript\u003e\n              // 공유 버튼 클릭 시 부모 창에 이벤트 전달 (Clarity는 부모가 수집)\n              (function(){\n                document.addEventListener('click', function(e){\n                  if (e.target \u0026\u0026 e.target.id === 'shareBtn' \u0026\u0026 window.opener \u0026\u0026 window.opener.postMessage) {\n                    try { window.opener.postMessage({ type: 'kname:share' }, '*'); } catch(_){}\n                  }\n                }, true);\n              })();\n            \u003c\\/script\u003e\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) =\u003e {\n          if (canvas.toBlob) canvas.toBlob(b =\u003e 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            \u003c!doctype html\u003e\n            \u003cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1\"\u003e\n            \u003ctitle\u003eSave / Share\u003c/title\u003e\n            \u003clink rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin\u003e\n            \u003clink href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700\u0026display=swap\" rel=\"stylesheet\"\u003e\n            \u003cstyle\u003e\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            \u003c/style\u003e\n            \u003cdiv class=\"wrap\"\u003e\n              \u003ch3\u003eLong-press to save the image,\u003cbr/\u003eor take a screenshot to share it.\u003c/h3\u003e\n              \u003cimg id=\"preview\" alt=\"korean-name\" src=\"${blobUrl}\" draggable=\"false\" ondragstart=\"return false;\" style=\"-webkit-user-drag:none; user-select:none; -webkit-user-select:none;\"\u003e\n              \u003cbutton id=\"shareBtn\" class=\"btn\"\u003eShare\u003c/button\u003e\n            \u003c/div\u003e\n            \u003cscript\u003e\n              (function(){\n                document.addEventListener('click', function(e){\n                  if (e.target \u0026\u0026 e.target.id === 'shareBtn' \u0026\u0026 window.opener \u0026\u0026 window.opener.postMessage) {\n                    try { window.opener.postMessage({ type: 'kname:share' }, '*'); } catch(_){}\n                  }\n                }, true);\n              })();\n            \u003c\\/script\u003e\n          `;\n          w.document.open(); w.document.write(html); w.document.close();\n\n          const d = w.document;\n          d.getElementById('shareBtn').onclick = async () =\u003e {\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' \u0026\u0026 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 \u0026\u0026 (err.name === 'AbortError' || err.name === 'NotAllowedError'))) {\n                console.warn('Share failed:', err);\n              }\n            }\n          };\n\n          const revoke = () =\u003e { 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(/[\u0026\u003c\u003e\"']/g, m=\u003e({ '\u0026':'\u0026amp;','\u003c':'\u0026lt;','\u003e':'\u0026gt;','\"':'\u0026quot;',\"'\":'\u0026#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 \u0026\u0026 ko \u0026\u0026 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 \u003cstrong\u003e${escapeHtml(u || 'friend')}\u003c/strong\u003e'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(()=\u003edocument.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 () =\u003e {\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 \u0026\u0026 typeof data.count !== 'undefined') el.textContent = data.count;\n      } catch (error) {\n        console.log('증가 실패: ' + (error?.message || error));\n      }\n    }\n    window.incrementCounter = incrementCounter;\n  \u003c/script\u003e\n\u003c/body\u003e\n\u003c/html\u003e","embedURL":""}},"377:734":{"type":"RECTANGLE","id":"377:734","name":"image 9","overrideKey":"377:734","absoluteBoundingBox":{"x":3522.5,"y":1417.0,"width":345.0,"height":196.85546875},"targetAspectRatio":{"x":2401.0,"y":1370.0},"isolatedAbsoluteRenderBounds":{"x":3522.5,"y":1417.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:167":{"mainComponentId":"113:129","type":"INSTANCE","id":"113:167","name":"App Icon","overrideKey":"113:167","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,"isDefault":true}}}]},"69:143":{"type":"FRAME","id":"69:143","name":"Tablet","overrideKey":"69:143","absoluteBoundingBox":{"x":3295.0,"y":100.0,"width":800.0,"height":2260.0},"isolatedAbsoluteRenderBounds":{"x":3295.0,"y":100.0,"width":800.0,"height":2260.0},"relativeTransform":[[1.0,0.0,1408.0],[0.0,1.0,100.0]],"size":{"x":800.0,"y":2260.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"]},"113:99":{"type":"COMPONENT","id":"113:99","name":"Property 1=TTMIK Courses","overrideKey":"113:99","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.05156249925494194,"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"children":["113:9","113:10"],"componentSetId":"113:100"},"377:411":{"type":"TEXT","id":"377:411","name":"How We Celebrated \u2028Hangeul Day in 2024","overrideKey":"377:411","absoluteBoundingBox":{"x":3522.5,"y":1311.0,"width":345.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":3564.393310546875,"y":1316.8800048828125,"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.4000000059604645,"g":0.19809524714946747,"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 \u2028Hangeul 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.299999237060547,"lineHeightPercent":99.84638977050781,"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.4000000059604645,"g":0.19809524714946747,"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.4000000059604645,"g":0.19809524714946747,"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}}},"113:98":{"type":"COMPONENT","id":"113:98","name":"Property 1=Instagram","overrideKey":"113:98","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.8509804010391235,"g":0.8509804010391235,"b":0.8509804010391235,"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"},"377:505":{"type":"FRAME","id":"377:505","name":"hangeulface","overrideKey":"377:505","absoluteBoundingBox":{"x":3522.5,"y":1417.0,"width":345.0,"height":292.85546875},"isolatedAbsoluteRenderBounds":{"x":3514.5,"y":1411.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.15000000596046448},"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:83":{"type":"FRAME","id":"113:83","name":"TTMIK Books","overrideKey":"113:83","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","overrideKey":"113:97","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.8509804010391235,"g":0.8509804010391235,"b":0.8509804010391235,"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"},"69:164":{"type":"FRAME","id":"69:164","name":"Mobile","overrideKey":"69:164","absoluteBoundingBox":{"x":4159.0,"y":100.0,"width":375.0,"height":2324.0},"isolatedAbsoluteRenderBounds":{"x":4159.0,"y":100.0,"width":375.0,"height":2324.0},"relativeTransform":[[1.0,0.0,2272.0],[0.0,1.0,100.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}],"strokeAlign":"INSIDE","strokes":[],"effects":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"overflowDirection":"VERTICAL_SCROLLING","isBreakpointFrame":true,"children":["69:165","69:176"]},"108:1113":{"type":"TEXT","id":"108:1113","name":"TTMIK Courses\u2028Structured online Korean courses","overrideKey":"108:1113","absoluteBoundingBox":{"x":-1354.0,"y":232.0,"width":281.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":-1353.5140380859375,"y":240.1840057373047,"width":208.2554931640625,"height":33.97200012207031},"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\u2028Structured 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.88786315917969,"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.80000114440918,"lineHeightPercent":122.88786315917969,"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.80000114440918,"lineHeightPercent":122.88786315917969,"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.200000762939453,"lineHeightPercent":122.88786315917969,"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"}}},"113:43":{"type":"RECTANGLE","id":"113:43","name":"Rectangle 9157","overrideKey":"113:43","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.7333333492279053,"b":0.46666666865348816,"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":[]},"69:173":{"type":"FRAME","id":"69:173","name":"Frame 3403","overrideKey":"69:173","absoluteBoundingBox":{"x":4239.5,"y":135.0,"width":214.0,"height":33.0},"isolatedAbsoluteRenderBounds":{"x":4239.5,"y":135.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.8202614784240723,"b":0.7843137383460999,"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.4000000059604645,"g":0.19809524714946747,"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"]},"108:1081":{"type":"FRAME","id":"108:1081","name":"Frame 3414","overrideKey":"108:1081","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"]},"69:144":{"type":"FRAME","id":"69:144","name":"이름생성기","overrideKey":"69:144","absoluteBoundingBox":{"x":3498.5,"y":100.0,"width":393.0,"height":2260.0},"isolatedAbsoluteRenderBounds":{"x":3498.5,"y":100.0,"width":393.0,"height":2260.0},"relativeTransform":[[1.0,0.0,203.5],[0.0,1.0,0.0]],"size":{"x":393.0,"y":2260.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":"TOP_BOTTOM","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-196.5,"sizeFraction":0.5},"right":{"pixelOffset":196.5,"sizeFraction":0.5},"top":{"pixelOffset":0.0,"sizeFraction":0.0},"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:1122":{"type":"TEXT","id":"108:1122","name":"TTMIK Stories\u2028Korean Reading \u0026 Listening App","overrideKey":"108:1122","absoluteBoundingBox":{"x":-1354.0,"y":304.0,"width":281.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":-1353.5140380859375,"y":311.9859924316406,"width":197.9713134765625,"height":37.029998779296875},"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\u2028Korean Reading \u0026 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.88786315917969,"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.80000114440918,"lineHeightPercent":122.88786315917969,"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.80000114440918,"lineHeightPercent":122.88786315917969,"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.200000762939453,"lineHeightPercent":122.88786315917969,"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","overrideKey":"377:733","absoluteBoundingBox":{"x":2418.5,"y":1417.0,"width":345.0,"height":196.85546875},"targetAspectRatio":{"x":2401.0,"y":1370.0},"isolatedAbsoluteRenderBounds":{"x":2418.5,"y":1417.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":[]},"69:152":{"type":"FRAME","id":"69:152","name":"Frame 3403","overrideKey":"69:152","absoluteBoundingBox":{"x":3588.0,"y":135.0,"width":214.0,"height":33.0},"isolatedAbsoluteRenderBounds":{"x":3588.0,"y":135.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.8202614784240723,"b":0.7843137383460999,"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.4000000059604645,"g":0.19809524714946747,"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","overrideKey":"69:153","absoluteBoundingBox":{"x":3603.0,"y":140.0,"width":184.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":3604.15966796875,"y":145.39999389648438,"width":180.877685546875,"height":16.560012817382812},"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.4000000059604645,"g":0.19809524714946747,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":1.8534226417541504,"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.43600082397461,"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:113":{"type":"TEXT","id":"69:113","name":"My Korean Name Is","overrideKey":"69:113","absoluteBoundingBox":{"x":2499.0,"y":140.0,"width":184.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":2500.15966796875,"y":145.39999389648438,"width":180.877685546875,"height":16.560012817382812},"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.4000000059604645,"g":0.19809524714946747,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":1.8534226417541504,"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.43600082397461,"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","overrideKey":"69:145","absoluteBoundingBox":{"x":3507.5,"y":220.0,"width":375.0,"height":1015.0},"isolatedAbsoluteRenderBounds":{"x":3507.5,"y":220.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":"\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"ko\"\u003e\n\u003chead\u003e\n  \u003cmeta charset=\"UTF-8\" /\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/\u003e\n  \u003ctitle\u003e한글이름 MY KOREAN NAME IS\u003c/title\u003e\n\n  \u003c!-- Sentry (옵션 유지) --\u003e\n  \u003cscript src=\"https://js.sentry-cdn.com/01a272064480dbf2fd4c3ee2de7bfcf6.min.js\" crossorigin=\"anonymous\"\u003e\u003c/script\u003e\n  \u003cscript\u003e\n    Sentry.init({\n      dsn: \"https://01a272064480dbf2fd4c3ee2de7bfcf6@o1189375.ingest.us.sentry.io/4510108487647232\",\n      enableLogs: true,\n    });\n  \u003c/script\u003e\n\n  \u003c!-- DM Sans --\u003e\n  \u003clink rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin\u003e\n  \u003clink href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700\u0026display=swap\" rel=\"stylesheet\"\u003e\n\n  \u003c!-- 프리로드: UI 표시용 저해상도 배경만 선로딩 --\u003e\n  \u003clink rel=\"preload\" as=\"font\" type=\"font/woff2\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaDaeHan.woff2\"\u003e\n  \u003clink rel=\"preload\" as=\"font\" type=\"font/woff2\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaManSeh.woff2\"\u003e\n  \u003clink rel=\"preload\" as=\"image\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/name-card.png\"\u003e\n\n  \u003cstyle\u003e\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  \u003c/style\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"header\"\u003e\n      \u003cdiv id=\"topBanner\" class=\"top-banner\" aria-live=\"polite\"\u003e\n        Type in your name below and \u003cbr/\u003eyou will get a Korean-style name \u003cbr/\u003ealong with a fun personality match \u003cbr/\u003ethat reflects Korean vibes.\n      \u003c/div\u003e\n      \u003cdiv id=\"sharedTitle\" class=\"shared-title\"\u003e\u003c/div\u003e\n\n      \u003cdiv class=\"user-name-display\" id=\"userNameDisplay\"\u003e\n        \u003cdiv class=\"user-name\" id=\"userName\"\u003e\u003c/div\u003e\n        \u003cdiv class=\"generated-msg\"\u003eHere's your Korean name and the vibe behind it!\u003c/div\u003e\n      \u003c/div\u003e\n    \u003c/div\u003e\n\n    \u003c!-- 입력 폼 --\u003e\n    \u003cdiv id=\"nameForm\"\u003e\n      \u003cdiv class=\"form-group\"\u003e\n        \u003clabel class=\"form-label\" for=\"firstName\"\u003e이름 (First Name)\u003c/label\u003e\n        \u003c!-- ✅ PII 마스킹 --\u003e\n        \u003cinput data-clarity-mask=\"true\" type=\"text\" id=\"firstName\" class=\"form-input\" placeholder=\"Michael, Sophie, Omar, Fatima...\"\u003e\n      \u003c/div\u003e\n      \u003cdiv class=\"form-group\"\u003e\n        \u003clabel class=\"form-label\" for=\"lastName\"\u003e성 (Last Name)\u003c/label\u003e\n        \u003c!-- ✅ PII 마스킹 --\u003e\n        \u003cinput data-clarity-mask=\"true\" type=\"text\" id=\"lastName\" class=\"form-input\" placeholder=\"Johnson, Kim, Hassan, Al-Ahmad...\"\u003e\n      \u003c/div\u003e\n      \u003cdiv class=\"form-group\"\u003e\n        \u003clabel class=\"form-label\"\u003eName type\u003c/label\u003e\n        \u003cdiv class=\"gender-options\" role=\"tablist\" aria-label=\"Name type options\"\u003e\n          \u003cdiv class=\"gender-option selected\" role=\"tab\" aria-selected=\"true\" tabindex=\"0\" onclick=\"selectGender('neutral', this)\"\u003eunisex\u003c/div\u003e\n          \u003cdiv class=\"gender-option\" role=\"tab\" aria-selected=\"false\" tabindex=\"0\" onclick=\"selectGender('female', this)\"\u003efeminine\u003c/div\u003e\n          \u003cdiv class=\"gender-option\" role=\"tab\" aria-selected=\"false\" tabindex=\"0\" onclick=\"selectGender('male', this)\"\u003emasculine\u003c/div\u003e\n        \u003c/div\u003e\n      \u003c/div\u003e\n      \u003cbutton type=\"button\" class=\"generate-btn\" onclick=\"generateKoreanName(); incrementCounter();\"\u003eGenerate Korean Name\u003c/button\u003e\n      \u003cdiv class=\"form-footer\" id=\"formFooter\" aria-live=\"polite\"\u003e\n        \u003cimg 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\" /\u003e\n        \u003cp class=\"form-footer__text\"\u003e\n          This service is created by \u003cbr/\u003eTalk To Me In Korean.\n        \u003c/p\u003e\n      \u003c/div\u003e\n    \u003c/div\u003e\n\n    \u003c!-- 로딩 --\u003e\n    \u003cdiv class=\"loading\" id=\"loading\"\u003e\n      \u003cdiv class=\"loading-spinner\"\u003e\u003c/div\u003e\n      \u003cp\u003eCreating your unique Korean name...\u003c/p\u003e\n    \u003c/div\u003e\n\n    \u003c!-- 결과 --\u003e\n    \u003cdiv class=\"result-container\" id=\"resultContainer\"\u003e\n      \u003cdiv class=\"result-card\" id=\"resultCard\"\u003e\n        \u003cdiv class=\"result-inner\"\u003e\n          \u003cdiv class=\"korean-name\" id=\"koreanName\"\u003e\u003c/div\u003e\n          \u003cdiv class=\"ko-characteristic\" id=\"koCharacteristic\"\u003e\u003c/div\u003e\n          \u003cdiv class=\"en-characteristic\" id=\"enCharacteristic\"\u003e\u003c/div\u003e\n        \u003c/div\u003e\n      \u003c/div\u003e\n\n      \u003cdiv id=\"btnRow\" class=\"btn-row\"\u003e\n        \u003cbutton class=\"save-btn\" onclick=\"downloadResultImage()\"\u003eSave \u0026 Share\u003c/button\u003e\n      \u003c/div\u003e\n\n      \u003cdiv id=\"shareRow\" class=\"share-row\"\u003e\n        \u003cbutton id=\"shareLinkBtn\" class=\"share-link-btn\"\u003eCopy Link\u003c/button\u003e\n        \u003cp\u003ePlease screenshot if you cannot \u003cbr/\u003esave the image.\u003c/p\u003e\n      \u003c/div\u003e\n\n      \u003cdiv id=\"shareCTA\" class=\"share-cta\"\u003e\n        \u003ca class=\"cta-btn\" href=\"https://hangeulname.figma.site/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eCreate My Korean Name Too\u003c/a\u003e\n      \u003c/div\u003e\n    \u003c/div\u003e\n  \u003c/div\u003e\n\n  \u003c!-- html2canvas (희박한 폴백용) --\u003e\n  \u003cscript src=\"https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js\"\u003e\u003c/script\u003e\n\n  \u003cscript\u003e\n    /* =========================\n       [CLARITY] 안전한 호출 유틸\n       - Figma Sites \u003chead\u003e에 설치된 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 \u0026\u0026 window.clarity('set', key, val); } catch(_){} }\n    function cEvent(name, props){ try { window.clarity \u0026\u0026 window.clarity('event', name, props || {}); } catch(_){} }\n\n    // 팝업-부모 통신으로 공유 버튼 클릭 이벤트 수집\n    window.addEventListener('message', function(e){\n      if (e \u0026\u0026 e.data \u0026\u0026 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) =\u003e {\n        const img = new Image();\n        img.onload = () =\u003e resolve({ w: img.naturalWidth || 768, h: img.naturalHeight || 1364 });\n        img.onerror = () =\u003e resolve({ w: 768, h: 1364 });\n        img.crossOrigin = 'anonymous';\n        img.src = BG_SAVE_URL; // 저장 고해상도 기준으로 확인\n        setTimeout(() =\u003e 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) =\u003e {\n        const img = new Image();\n        img.crossOrigin = 'anonymous';\n        img.onload = () =\u003e resolve(img);\n        img.onerror = () =\u003e resolve(null);\n        img.src = BG_DISPLAY_URL;\n        setTimeout(() =\u003e 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=\u003e{\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()\u003e0.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()\u003e0.5 ? '정' : '장';\n      if (s.startsWith('s') || s.startsWith('sh')) return Math.random()\u003e0.5 ? '서' : '신';\n      if (s.startsWith('w') || s.startsWith('y')) return Math.random()\u003e0.5 ? '윤' : '유';\n      if (s.startsWith('h')) return Math.random()\u003e0.5 ? '한' : '황';\n      if (s.startsWith('m')) return Math.random()\u003e0.5 ? '문' : '민';\n      if (s.startsWith('o')) return '오';\n      if (s.startsWith('a')) return '안';\n      if (s.startsWith('n')) return Math.random()\u003e0.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 =\u003e {\n        const korFirst = kn.charAt(0);\n        if (first === 'm' \u0026\u0026 ['민','미'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 's' \u0026\u0026 ['서','시','수','선','성'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'j' \u0026\u0026 ['지','주','준','정'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'a' \u0026\u0026 ['아','안','애'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'e' \u0026\u0026 ['에','은','예'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'r' \u0026\u0026 ['라','리','로'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'h' \u0026\u0026 ['하','한','해'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'd' \u0026\u0026 ['다','도','두'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 't' \u0026\u0026 ['태','토','테'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'l' \u0026\u0026 ['리','라','로'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'v' \u0026\u0026 ['비','바'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'n' \u0026\u0026 ['나','노','누'].some(p =\u003e 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) =\u003e { 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 \u0026\u0026 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 \u003c timeout) {\n            const allLoaded = fontCheckList.every(f =\u003e document.fonts.check(f));\n            if (allLoaded) break;\n            await new Promise(r =\u003e setTimeout(r, interval));\n            elapsed += interval;\n          }\n\n          await document.fonts.ready;\n          await warmUpFonts();\n          await new Promise(r =\u003e 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=\u003e{\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 \u003c words.length; i++) {\n        const test = line ? line + ' ' + words[i] : words[i];\n        if (ctx.measureText(test).width \u003c= 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 \u003e minPx \u0026\u0026 ctx.measureText(text).width \u003e 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) =\u003e {\n        const img = new Image();\n        if (!/^data:/.test(bgSrc)) img.crossOrigin = 'anonymous';\n        img.onload = () =\u003e { ctx.drawImage(img, 0, 0, W, H); resolve(); };\n        img.onerror = () =\u003e { 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) =\u003e {\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 =\u003e {\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 =\u003e {\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            \u003c!doctype html\u003e\n            \u003cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1\"\u003e\n            \u003ctitle\u003eSave Image\u003c/title\u003e\n            \u003clink rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin\u003e\n            \u003clink href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700\u0026display=swap\" rel=\"stylesheet\"\u003e\n            \u003cstyle\u003e\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            \u003c/style\u003e\n            \u003cdiv class=\"wrap\"\u003e\n              \u003ch3\u003eMy Korean Name Is\u003c/h3\u003e\n              \u003cdiv id=\"ph\"\u003ePlease wait a moment.\u003c/div\u003e\n              \u003cimg id=\"preview\" style=\"display:none\" alt=\"korean-name\"/\u003e\n              \u003cbutton id=\"shareBtn\" style=\"display:none;padding:25px;\"\u003eShare\u003c/button\u003e\n            \u003c/div\u003e\n            \u003cscript\u003e\n              // 공유 버튼 클릭 시 부모 창에 이벤트 전달 (Clarity는 부모가 수집)\n              (function(){\n                document.addEventListener('click', function(e){\n                  if (e.target \u0026\u0026 e.target.id === 'shareBtn' \u0026\u0026 window.opener \u0026\u0026 window.opener.postMessage) {\n                    try { window.opener.postMessage({ type: 'kname:share' }, '*'); } catch(_){}\n                  }\n                }, true);\n              })();\n            \u003c\\/script\u003e\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) =\u003e {\n          if (canvas.toBlob) canvas.toBlob(b =\u003e 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            \u003c!doctype html\u003e\n            \u003cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1\"\u003e\n            \u003ctitle\u003eSave / Share\u003c/title\u003e\n            \u003clink rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin\u003e\n            \u003clink href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700\u0026display=swap\" rel=\"stylesheet\"\u003e\n            \u003cstyle\u003e\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            \u003c/style\u003e\n            \u003cdiv class=\"wrap\"\u003e\n              \u003ch3\u003eLong-press to save the image,\u003cbr/\u003eor take a screenshot to share it.\u003c/h3\u003e\n              \u003cimg id=\"preview\" alt=\"korean-name\" src=\"${blobUrl}\" draggable=\"false\" ondragstart=\"return false;\" style=\"-webkit-user-drag:none; user-select:none; -webkit-user-select:none;\"\u003e\n              \u003cbutton id=\"shareBtn\" class=\"btn\"\u003eShare\u003c/button\u003e\n            \u003c/div\u003e\n            \u003cscript\u003e\n              (function(){\n                document.addEventListener('click', function(e){\n                  if (e.target \u0026\u0026 e.target.id === 'shareBtn' \u0026\u0026 window.opener \u0026\u0026 window.opener.postMessage) {\n                    try { window.opener.postMessage({ type: 'kname:share' }, '*'); } catch(_){}\n                  }\n                }, true);\n              })();\n            \u003c\\/script\u003e\n          `;\n          w.document.open(); w.document.write(html); w.document.close();\n\n          const d = w.document;\n          d.getElementById('shareBtn').onclick = async () =\u003e {\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' \u0026\u0026 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 \u0026\u0026 (err.name === 'AbortError' || err.name === 'NotAllowedError'))) {\n                console.warn('Share failed:', err);\n              }\n            }\n          };\n\n          const revoke = () =\u003e { 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(/[\u0026\u003c\u003e\"']/g, m=\u003e({ '\u0026':'\u0026amp;','\u003c':'\u0026lt;','\u003e':'\u0026gt;','\"':'\u0026quot;',\"'\":'\u0026#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 \u0026\u0026 ko \u0026\u0026 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 \u003cstrong\u003e${escapeHtml(u || 'friend')}\u003c/strong\u003e'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(()=\u003edocument.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 () =\u003e {\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 \u0026\u0026 typeof data.count !== 'undefined') el.textContent = data.count;\n      } catch (error) {\n        console.log('증가 실패: ' + (error?.message || error));\n      }\n    }\n    window.incrementCounter = incrementCounter;\n  \u003c/script\u003e\n\u003c/body\u003e\n\u003c/html\u003e","embedURL":""}},"113:129":{"type":"COMPONENT","id":"113:129","name":"Property 1=Seyo","overrideKey":"113:129","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"},"2:423":{"type":"FRAME","id":"2:423","name":"Desktop","overrideKey":"2:423","absoluteBoundingBox":{"x":1951.0,"y":100.0,"width":1280.0,"height":2260.0},"isolatedAbsoluteRenderBounds":{"x":1951.0,"y":100.0,"width":1280.0,"height":2260.0},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,100.0]],"size":{"x":1280.0,"y":2260.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"]},"377:465":{"type":"FRAME","id":"377:465","name":"hangeulface","overrideKey":"377:465","absoluteBoundingBox":{"x":2418.5,"y":1417.0,"width":345.0,"height":292.85546875},"isolatedAbsoluteRenderBounds":{"x":2410.5,"y":1411.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.15000000596046448},"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 \u2028for Hangeul Day!","overrideKey":"377:504","absoluteBoundingBox":{"x":2442.5,"y":1637.85546875,"width":297.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":2474.676513671875,"y":1643.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 \u2028for 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.20736694335938,"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":{}},"180:896":{"mainComponentId":"113:195","type":"INSTANCE","id":"180:896","name":"footer","overrideKey":"180:896","absoluteBoundingBox":{"x":2394.5,"y":1771.0,"width":393.0,"height":589.0},"isolatedAbsoluteRenderBounds":{"x":2394.5,"y":1771.0,"width":393.0,"height":589.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,1671.0]],"size":{"x":393.0,"y":589.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.19069260358810425,"g":0.19069260358810425,"b":0.19069260358810425,"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"}},{"key":["Frame 34140","Frame 34130","Frame 34110"],"value":{"primaryAxisAlignItems":"SPACE_BETWEEN"}}]},"377:409":{"type":"TEXT","id":"377:409","name":"How We Celebrated \u2028Hangeul Day in 2024","overrideKey":"377:409","absoluteBoundingBox":{"x":2418.5,"y":1311.0,"width":345.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":2460.393310546875,"y":1316.8800048828125,"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.4000000059604645,"g":0.19809524714946747,"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 \u2028Hangeul 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.299999237060547,"lineHeightPercent":99.84638977050781,"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.4000000059604645,"g":0.19809524714946747,"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.4000000059604645,"g":0.19809524714946747,"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}}},"113:100":{"type":"COMPONENT_SET","id":"113:100","name":"App Icon","overrideKey":"113:100","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"]}}},"69:155":{"type":"TEXT","id":"69:155","name":"Elizabeth !","overrideKey":"69:155","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.13333334028720856,"g":0.13333334028720856,"b":0.13333334028720856,"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.8489279747009277,"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.20736694335938,"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:669":{"type":"FRAME","id":"377:669","name":"Frame 3420","overrideKey":"377:669","absoluteBoundingBox":{"x":3522.5,"y":1311.0,"width":345.0,"height":398.85546875},"isolatedAbsoluteRenderBounds":{"x":3514.5,"y":1311.0,"width":361.0,"height":408.85546875},"relativeTransform":[[1.0,0.0,24.0],[0.0,1.0,1211.0]],"size":{"x":345.0,"y":398.85546875},"fills":[],"constraintValues":{"left":{"pixelOffset":24.0,"sizeFraction":0.0},"top":{"pixelOffset":1211.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"]},"377:688":{"type":"FRAME","id":"377:688","name":"Frame 3421","overrideKey":"377:688","absoluteBoundingBox":{"x":3522.5,"y":1613.85546875,"width":345.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":3522.5,"y":1613.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","overrideKey":"108:1123","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"]},"377:689":{"type":"FRAME","id":"377:689","name":"Frame 3421","overrideKey":"377:689","absoluteBoundingBox":{"x":2418.5,"y":1613.85546875,"width":345.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":2418.5,"y":1613.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"]},"113:191":{"type":"COMPONENT","id":"113:191","name":"TTMIK Books","overrideKey":"113:191","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"]},"377:544":{"type":"TEXT","id":"377:544","name":"Create Your Own Hangeul Face \u2028for Hangeul Day!","overrideKey":"377:544","absoluteBoundingBox":{"x":3546.5,"y":1637.85546875,"width":297.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":3578.676513671875,"y":1643.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 \u2028for 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.20736694335938,"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":{}},"113:130":{"type":"COMPONENT_SET","id":"113:130","name":"SNS","overrideKey":"113:130","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"]}}},"69:112":{"type":"FRAME","id":"69:112","name":"Frame 3403","overrideKey":"69:112","absoluteBoundingBox":{"x":2484.0,"y":135.0,"width":214.0,"height":33.0},"isolatedAbsoluteRenderBounds":{"x":2484.0,"y":135.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.8202614784240723,"b":0.7843137383460999,"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.4000000059604645,"g":0.19809524714946747,"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"]},"108:1082":{"type":"FRAME","id":"108:1082","name":"Frame 3413","overrideKey":"108:1082","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"]},"108:1143":{"type":"TEXT","id":"108:1143","name":"Korean learning books for all levels and goals","overrideKey":"108:1143","absoluteBoundingBox":{"x":-1418.0,"y":515.0,"width":140.0,"height":36.0},"isolatedAbsoluteRenderBounds":{"x":-1417.72705078125,"y":518.5360107421875,"width":134.0699462890625,"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.19999885559082,"lineHeightPercent":107.5268783569336,"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","overrideKey":"108:1114","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"]},"113:95":{"type":"SVG","id":"113:95","name":"instagram","overrideKey":"113:95","absoluteBoundingBox":{"x":-764.0,"y":385.5,"width":32.0,"height":30.900815963745117},"isolatedAbsoluteRenderBounds":{"x":-764.0,"y":385.5,"width":32.0,"height":30.90081787109375},"relativeTransform":[[1.0,0.0,12.0],[0.0,1.0,12.5]],"size":{"x":32.0,"y":30.900815963745117},"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.21428571428571427},"right":{"pixelOffset":0.0,"sizeFraction":0.7857142857142857},"top":{"pixelOffset":0.0,"sizeFraction":0.22321428571428573},"bottom":{"pixelOffset":0.0,"sizeFraction":0.7750145707811628}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Instagram Icon","ariaAttributes":{},"interactions":[],"hash":"2428f4f5eb3c9eeac92a4451458d7e74767729d6"},"3:499":{"type":"WIDGET","id":"3:499","name":"Embed 1","overrideKey":"3:499","absoluteBoundingBox":{"x":2404.5,"y":220.0,"width":375.0,"height":1000.0},"isolatedAbsoluteRenderBounds":{"x":2404.5,"y":220.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":"\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"ko\"\u003e\n\u003chead\u003e\n  \u003cmeta charset=\"UTF-8\" /\u003e\n  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/\u003e\n  \u003ctitle\u003e한글이름 MY KOREAN NAME IS\u003c/title\u003e\n\n  \u003c!-- Sentry (옵션 유지) --\u003e\n  \u003cscript src=\"https://js.sentry-cdn.com/01a272064480dbf2fd4c3ee2de7bfcf6.min.js\" crossorigin=\"anonymous\"\u003e\u003c/script\u003e\n  \u003cscript\u003e\n    Sentry.init({\n      dsn: \"https://01a272064480dbf2fd4c3ee2de7bfcf6@o1189375.ingest.us.sentry.io/4510108487647232\",\n      enableLogs: true,\n    });\n  \u003c/script\u003e\n\n  \u003c!-- DM Sans --\u003e\n  \u003clink rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin\u003e\n  \u003clink href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700\u0026display=swap\" rel=\"stylesheet\"\u003e\n\n  \u003c!-- 프리로드: UI 표시용 저해상도 배경만 선로딩 --\u003e\n  \u003clink rel=\"preload\" as=\"font\" type=\"font/woff2\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaDaeHan.woff2\"\u003e\n  \u003clink rel=\"preload\" as=\"font\" type=\"font/woff2\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/YoonChildfundkoreaManSeh.woff2\"\u003e\n  \u003clink rel=\"preload\" as=\"image\" crossorigin\n        href=\"https://hangeulname-assets.talktomeinkorean.com/name-card.png\"\u003e\n\n  \u003cstyle\u003e\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  \u003c/style\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"header\"\u003e\n      \u003cdiv id=\"topBanner\" class=\"top-banner\" aria-live=\"polite\"\u003e\n        Type in your name below and \u003cbr/\u003eyou will get a Korean-style name \u003cbr/\u003ealong with a fun personality match \u003cbr/\u003ethat reflects Korean vibes.\n      \u003c/div\u003e\n      \u003cdiv id=\"sharedTitle\" class=\"shared-title\"\u003e\u003c/div\u003e\n\n      \u003cdiv class=\"user-name-display\" id=\"userNameDisplay\"\u003e\n        \u003cdiv class=\"user-name\" id=\"userName\"\u003e\u003c/div\u003e\n        \u003cdiv class=\"generated-msg\"\u003eHere's your Korean name and the vibe behind it!\u003c/div\u003e\n      \u003c/div\u003e\n    \u003c/div\u003e\n\n    \u003c!-- 입력 폼 --\u003e\n    \u003cdiv id=\"nameForm\"\u003e\n      \u003cdiv class=\"form-group\"\u003e\n        \u003clabel class=\"form-label\" for=\"firstName\"\u003e이름 (First Name)\u003c/label\u003e\n        \u003c!-- ✅ PII 마스킹 --\u003e\n        \u003cinput data-clarity-mask=\"true\" type=\"text\" id=\"firstName\" class=\"form-input\" placeholder=\"Michael, Sophie, Omar, Fatima...\"\u003e\n      \u003c/div\u003e\n      \u003cdiv class=\"form-group\"\u003e\n        \u003clabel class=\"form-label\" for=\"lastName\"\u003e성 (Last Name)\u003c/label\u003e\n        \u003c!-- ✅ PII 마스킹 --\u003e\n        \u003cinput data-clarity-mask=\"true\" type=\"text\" id=\"lastName\" class=\"form-input\" placeholder=\"Johnson, Kim, Hassan, Al-Ahmad...\"\u003e\n      \u003c/div\u003e\n      \u003cdiv class=\"form-group\"\u003e\n        \u003clabel class=\"form-label\"\u003eName type\u003c/label\u003e\n        \u003cdiv class=\"gender-options\" role=\"tablist\" aria-label=\"Name type options\"\u003e\n          \u003cdiv class=\"gender-option selected\" role=\"tab\" aria-selected=\"true\" tabindex=\"0\" onclick=\"selectGender('neutral', this)\"\u003eunisex\u003c/div\u003e\n          \u003cdiv class=\"gender-option\" role=\"tab\" aria-selected=\"false\" tabindex=\"0\" onclick=\"selectGender('female', this)\"\u003efeminine\u003c/div\u003e\n          \u003cdiv class=\"gender-option\" role=\"tab\" aria-selected=\"false\" tabindex=\"0\" onclick=\"selectGender('male', this)\"\u003emasculine\u003c/div\u003e\n        \u003c/div\u003e\n      \u003c/div\u003e\n      \u003cbutton type=\"button\" class=\"generate-btn\" onclick=\"generateKoreanName(); incrementCounter();\"\u003eGenerate Korean Name\u003c/button\u003e\n      \u003cdiv class=\"form-footer\" id=\"formFooter\" aria-live=\"polite\"\u003e\n        \u003cimg 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\" /\u003e\n        \u003cp class=\"form-footer__text\"\u003e\n          This service is created by \u003cbr/\u003eTalk To Me In Korean.\n        \u003c/p\u003e\n      \u003c/div\u003e\n    \u003c/div\u003e\n\n    \u003c!-- 로딩 --\u003e\n    \u003cdiv class=\"loading\" id=\"loading\"\u003e\n      \u003cdiv class=\"loading-spinner\"\u003e\u003c/div\u003e\n      \u003cp\u003eCreating your unique Korean name...\u003c/p\u003e\n    \u003c/div\u003e\n\n    \u003c!-- 결과 --\u003e\n    \u003cdiv class=\"result-container\" id=\"resultContainer\"\u003e\n      \u003cdiv class=\"result-card\" id=\"resultCard\"\u003e\n        \u003cdiv class=\"result-inner\"\u003e\n          \u003cdiv class=\"korean-name\" id=\"koreanName\"\u003e\u003c/div\u003e\n          \u003cdiv class=\"ko-characteristic\" id=\"koCharacteristic\"\u003e\u003c/div\u003e\n          \u003cdiv class=\"en-characteristic\" id=\"enCharacteristic\"\u003e\u003c/div\u003e\n        \u003c/div\u003e\n      \u003c/div\u003e\n\n      \u003cdiv id=\"btnRow\" class=\"btn-row\"\u003e\n        \u003cbutton class=\"save-btn\" onclick=\"downloadResultImage()\"\u003eSave \u0026 Share\u003c/button\u003e\n      \u003c/div\u003e\n\n      \u003cdiv id=\"shareRow\" class=\"share-row\"\u003e\n        \u003cbutton id=\"shareLinkBtn\" class=\"share-link-btn\"\u003eCopy Link\u003c/button\u003e\n        \u003cp\u003ePlease screenshot if you cannot \u003cbr/\u003esave the image.\u003c/p\u003e\n      \u003c/div\u003e\n\n      \u003cdiv id=\"shareCTA\" class=\"share-cta\"\u003e\n        \u003ca class=\"cta-btn\" href=\"https://hangeulname.figma.site/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eCreate My Korean Name Too\u003c/a\u003e\n      \u003c/div\u003e\n    \u003c/div\u003e\n  \u003c/div\u003e\n\n  \u003c!-- html2canvas (희박한 폴백용) --\u003e\n  \u003cscript src=\"https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js\"\u003e\u003c/script\u003e\n\n  \u003cscript\u003e\n    /* =========================\n       [CLARITY] 안전한 호출 유틸\n       - Figma Sites \u003chead\u003e에 설치된 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 \u0026\u0026 window.clarity('set', key, val); } catch(_){} }\n    function cEvent(name, props){ try { window.clarity \u0026\u0026 window.clarity('event', name, props || {}); } catch(_){} }\n\n    // 팝업-부모 통신으로 공유 버튼 클릭 이벤트 수집\n    window.addEventListener('message', function(e){\n      if (e \u0026\u0026 e.data \u0026\u0026 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) =\u003e {\n        const img = new Image();\n        img.onload = () =\u003e resolve({ w: img.naturalWidth || 768, h: img.naturalHeight || 1364 });\n        img.onerror = () =\u003e resolve({ w: 768, h: 1364 });\n        img.crossOrigin = 'anonymous';\n        img.src = BG_SAVE_URL; // 저장 고해상도 기준으로 확인\n        setTimeout(() =\u003e 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) =\u003e {\n        const img = new Image();\n        img.crossOrigin = 'anonymous';\n        img.onload = () =\u003e resolve(img);\n        img.onerror = () =\u003e resolve(null);\n        img.src = BG_DISPLAY_URL;\n        setTimeout(() =\u003e 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=\u003e{\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()\u003e0.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()\u003e0.5 ? '정' : '장';\n      if (s.startsWith('s') || s.startsWith('sh')) return Math.random()\u003e0.5 ? '서' : '신';\n      if (s.startsWith('w') || s.startsWith('y')) return Math.random()\u003e0.5 ? '윤' : '유';\n      if (s.startsWith('h')) return Math.random()\u003e0.5 ? '한' : '황';\n      if (s.startsWith('m')) return Math.random()\u003e0.5 ? '문' : '민';\n      if (s.startsWith('o')) return '오';\n      if (s.startsWith('a')) return '안';\n      if (s.startsWith('n')) return Math.random()\u003e0.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 =\u003e {\n        const korFirst = kn.charAt(0);\n        if (first === 'm' \u0026\u0026 ['민','미'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 's' \u0026\u0026 ['서','시','수','선','성'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'j' \u0026\u0026 ['지','주','준','정'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'a' \u0026\u0026 ['아','안','애'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'e' \u0026\u0026 ['에','은','예'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'r' \u0026\u0026 ['라','리','로'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'h' \u0026\u0026 ['하','한','해'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'd' \u0026\u0026 ['다','도','두'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 't' \u0026\u0026 ['태','토','테'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'l' \u0026\u0026 ['리','라','로'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'v' \u0026\u0026 ['비','바'].some(p =\u003e korFirst.startsWith(p))) return true;\n        if (first === 'n' \u0026\u0026 ['나','노','누'].some(p =\u003e 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) =\u003e { 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 \u0026\u0026 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 \u003c timeout) {\n            const allLoaded = fontCheckList.every(f =\u003e document.fonts.check(f));\n            if (allLoaded) break;\n            await new Promise(r =\u003e setTimeout(r, interval));\n            elapsed += interval;\n          }\n\n          await document.fonts.ready;\n          await warmUpFonts();\n          await new Promise(r =\u003e 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=\u003e{\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 \u003c words.length; i++) {\n        const test = line ? line + ' ' + words[i] : words[i];\n        if (ctx.measureText(test).width \u003c= 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 \u003e minPx \u0026\u0026 ctx.measureText(text).width \u003e 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) =\u003e {\n        const img = new Image();\n        if (!/^data:/.test(bgSrc)) img.crossOrigin = 'anonymous';\n        img.onload = () =\u003e { ctx.drawImage(img, 0, 0, W, H); resolve(); };\n        img.onerror = () =\u003e { 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) =\u003e {\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 =\u003e {\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 =\u003e {\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            \u003c!doctype html\u003e\n            \u003cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1\"\u003e\n            \u003ctitle\u003eSave Image\u003c/title\u003e\n            \u003clink rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin\u003e\n            \u003clink href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700\u0026display=swap\" rel=\"stylesheet\"\u003e\n            \u003cstyle\u003e\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            \u003c/style\u003e\n            \u003cdiv class=\"wrap\"\u003e\n              \u003ch3\u003eMy Korean Name Is\u003c/h3\u003e\n              \u003cdiv id=\"ph\"\u003ePlease wait a moment.\u003c/div\u003e\n              \u003cimg id=\"preview\" style=\"display:none\" alt=\"korean-name\"/\u003e\n              \u003cbutton id=\"shareBtn\" style=\"display:none;padding:25px;\"\u003eShare\u003c/button\u003e\n            \u003c/div\u003e\n            \u003cscript\u003e\n              // 공유 버튼 클릭 시 부모 창에 이벤트 전달 (Clarity는 부모가 수집)\n              (function(){\n                document.addEventListener('click', function(e){\n                  if (e.target \u0026\u0026 e.target.id === 'shareBtn' \u0026\u0026 window.opener \u0026\u0026 window.opener.postMessage) {\n                    try { window.opener.postMessage({ type: 'kname:share' }, '*'); } catch(_){}\n                  }\n                }, true);\n              })();\n            \u003c\\/script\u003e\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) =\u003e {\n          if (canvas.toBlob) canvas.toBlob(b =\u003e 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            \u003c!doctype html\u003e\n            \u003cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1\"\u003e\n            \u003ctitle\u003eSave / Share\u003c/title\u003e\n            \u003clink rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin\u003e\n            \u003clink href=\"https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700\u0026display=swap\" rel=\"stylesheet\"\u003e\n            \u003cstyle\u003e\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            \u003c/style\u003e\n            \u003cdiv class=\"wrap\"\u003e\n              \u003ch3\u003eLong-press to save the image,\u003cbr/\u003eor take a screenshot to share it.\u003c/h3\u003e\n              \u003cimg id=\"preview\" alt=\"korean-name\" src=\"${blobUrl}\" draggable=\"false\" ondragstart=\"return false;\" style=\"-webkit-user-drag:none; user-select:none; -webkit-user-select:none;\"\u003e\n              \u003cbutton id=\"shareBtn\" class=\"btn\"\u003eShare\u003c/button\u003e\n            \u003c/div\u003e\n            \u003cscript\u003e\n              (function(){\n                document.addEventListener('click', function(e){\n                  if (e.target \u0026\u0026 e.target.id === 'shareBtn' \u0026\u0026 window.opener \u0026\u0026 window.opener.postMessage) {\n                    try { window.opener.postMessage({ type: 'kname:share' }, '*'); } catch(_){}\n                  }\n                }, true);\n              })();\n            \u003c\\/script\u003e\n          `;\n          w.document.open(); w.document.write(html); w.document.close();\n\n          const d = w.document;\n          d.getElementById('shareBtn').onclick = async () =\u003e {\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' \u0026\u0026 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 \u0026\u0026 (err.name === 'AbortError' || err.name === 'NotAllowedError'))) {\n                console.warn('Share failed:', err);\n              }\n            }\n          };\n\n          const revoke = () =\u003e { 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(/[\u0026\u003c\u003e\"']/g, m=\u003e({ '\u0026':'\u0026amp;','\u003c':'\u0026lt;','\u003e':'\u0026gt;','\"':'\u0026quot;',\"'\":'\u0026#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 \u0026\u0026 ko \u0026\u0026 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 \u003cstrong\u003e${escapeHtml(u || 'friend')}\u003c/strong\u003e'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(()=\u003edocument.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 () =\u003e {\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 \u0026\u0026 typeof data.count !== 'undefined') el.textContent = data.count;\n      } catch (error) {\n        console.log('증가 실패: ' + (error?.message || error));\n      }\n    }\n    window.incrementCounter = incrementCounter;\n  \u003c/script\u003e\n\u003c/body\u003e\n\u003c/html\u003e","embedURL":""}},"113:190":{"type":"SVG","id":"113:190","name":"store icon","overrideKey":"113:190","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":"010c52cf27424490f3fe835fdb58b499c1fc4baa"},"108:1084":{"type":"FRAME","id":"108:1084","name":"Frame 3412","overrideKey":"108:1084","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"]},"3:452":{"type":"FRAME","id":"3:452","name":"이름생성기","overrideKey":"3:452","absoluteBoundingBox":{"x":2394.5,"y":100.0,"width":393.0,"height":2260.0},"isolatedAbsoluteRenderBounds":{"x":2394.5,"y":100.0,"width":393.0,"height":2260.0},"relativeTransform":[[1.0,0.0,443.5],[0.0,1.0,0.0]],"size":{"x":393.0,"y":2260.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":"TOP_BOTTOM","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-196.5,"sizeFraction":0.5},"right":{"pixelOffset":196.5,"sizeFraction":0.5},"top":{"pixelOffset":0.0,"sizeFraction":0.0},"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:670":{"type":"FRAME","id":"377:670","name":"Frame 3420","overrideKey":"377:670","absoluteBoundingBox":{"x":2418.5,"y":1311.0,"width":345.0,"height":398.85546875},"isolatedAbsoluteRenderBounds":{"x":2410.5,"y":1311.0,"width":361.0,"height":408.85546875},"relativeTransform":[[1.0,0.0,24.0],[0.0,1.0,1211.0]],"size":{"x":345.0,"y":398.85546875},"fills":[],"constraintValues":{"left":{"pixelOffset":24.0,"sizeFraction":0.0},"top":{"pixelOffset":1211.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"]},"113:85":{"type":"SVG","id":"113:85","name":"Group 487080","overrideKey":"113:85","absoluteBoundingBox":{"x":-841.0,"y":389.896728515625,"width":32.0,"height":22.206436157226562},"isolatedAbsoluteRenderBounds":{"x":-841.0,"y":389.896728515625,"width":32.0,"height":22.20648193359375},"relativeTransform":[[1.0,0.0,12.0],[0.0,1.0,16.896728515625]],"size":{"x":32.0,"y":22.206436157226562},"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":"fe72a249d828a797db5845a380940e7fc1c8f94c"},"4:649":{"type":"TEXT","id":"4:649","name":"Elizabeth !","overrideKey":"4:649","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.13333334028720856,"g":0.13333334028720856,"b":0.13333334028720856,"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.8489279747009277,"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.20736694335938,"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":{}},"180:897":{"mainComponentId":"113:195","type":"INSTANCE","id":"180:897","name":"footer","overrideKey":"180:897","absoluteBoundingBox":{"x":3498.5,"y":1771.0,"width":393.0,"height":589.0},"isolatedAbsoluteRenderBounds":{"x":3498.5,"y":1771.0,"width":393.0,"height":589.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,1671.0]],"size":{"x":393.0,"y":589.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.19069260358810425,"g":0.19069260358810425,"b":0.19069260358810425,"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"}},{"key":["Frame 34140","Frame 34130","Frame 34110"],"value":{"primaryAxisAlignItems":"SPACE_BETWEEN"}}]}},"assetIdToGuid":{},"guidToUrl":{"2:422":"/hangeul-name-generator","74:30":"/assets","0:3":"/"},"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":{"2428f4f5eb3c9eeac92a4451458d7e74767729d6":{"type":"GENERATED_ASSET","url":"2428f4f5eb3c9eeac92a4451458d7e74767729d6.svg","size":{"x":32.0,"y":30.900815963745117},"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"},"fe72a249d828a797db5845a380940e7fc1c8f94c":{"type":"GENERATED_ASSET","url":"fe72a249d828a797db5845a380940e7fc1c8f94c.svg","size":{"x":32.0,"y":22.206497192382812},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":-0.00027485345157528816,"unit":"PERCENT"}},"format":"SVG"},"010c52cf27424490f3fe835fdb58b499c1fc4baa":{"type":"GENERATED_ASSET","url":"010c52cf27424490f3fe835fdb58b499c1fc4baa.svg","size":{"x":27.999998092651367,"y":32.0},"offsets":{"left":{"value":3.571203650259187e-09,"unit":"PERCENT"},"right":{"value":6.808388202423593e-06,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"a5c835eb272d7e987352c854821dc7c3b8a04bb9":{"type":"GENERATED_ASSET","url":"a5c835eb272d7e987352c854821dc7c3b8a04bb9.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"},"3f474f35700aeea7c57044194f844c36c1c9054f":{"type":"GENERATED_ASSET","url":"3f474f35700aeea7c57044194f844c36c1c9054f.svg","size":{"x":28.550123260497912,"y":28.55379872131357},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":-6.841038762558221e-06,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":-1.6031653257812467e-07,"unit":"PERCENT"}},"format":"SVG"},"f0c804745cc710ab098706be09b1680f3e0e5fdf":{"type":"GENERATED_ASSET","url":"f0c804745cc710ab098706be09b1680f3e0e5fdf.svg","size":{"x":27.674535751342773,"y":14.138654800415225},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":-0.0003583889726469955,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":-0.00012880566536192402,"unit":"PERCENT"}},"format":"SVG"},"7f2b4987e968e465145a09344318f27fe9b3f71a":{"type":"PAINT_ASSET","url":"7f2b4987e968e465145a09344318f27fe9b3f71a.png","size":{"x":2401.0,"y":1370.0}},"757c3b8d403df83020fa57bf96e2cad40e134d4e":{"type":"GENERATED_ASSET","url":"757c3b8d403df83020fa57bf96e2cad40e134d4e.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"},"8c28bd314a9711385e76c2857edff413b15f3fcd":{"type":"GENERATED_ASSET","url":"8c28bd314a9711385e76c2857edff413b15f3fcd.svg","size":{"x":27.674535751342773,"y":14.138654800415225},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":-0.0003583889726469955,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":-0.00012880566536192402,"unit":"PERCENT"}},"format":"SVG"},"f4bd92a6a906b219f868c649ae23ad7d84392d55":{"type":"GENERATED_ASSET","url":"f4bd92a6a906b219f868c649ae23ad7d84392d55.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"}},"stablePathToAssetHash":{"113:85":"fe72a249d828a797db5845a380940e7fc1c8f94c","113:190":"010c52cf27424490f3fe835fdb58b499c1fc4baa","113:37":"3f474f35700aeea7c57044194f844c36c1c9054f","113:10":"f4bd92a6a906b219f868c649ae23ad7d84392d55","I113:184;113:95":"2428f4f5eb3c9eeac92a4451458d7e74767729d6","113:95":"2428f4f5eb3c9eeac92a4451458d7e74767729d6","I113:192;113:190":"010c52cf27424490f3fe835fdb58b499c1fc4baa","I180:898;113:184;113:95":"2428f4f5eb3c9eeac92a4451458d7e74767729d6","I180:896;113:192;113:190":"010c52cf27424490f3fe835fdb58b499c1fc4baa","I113:167;113:44":"8c28bd314a9711385e76c2857edff413b15f3fcd","I180:898;113:159;113:37":"3f474f35700aeea7c57044194f844c36c1c9054f","I180:897;113:131;113:10":"f4bd92a6a906b219f868c649ae23ad7d84392d55","I180:897;113:183;113:85":"fe72a249d828a797db5845a380940e7fc1c8f94c","I180:898;113:131;113:10":"f4bd92a6a906b219f868c649ae23ad7d84392d55","I180:896;113:167;113:44":"f0c804745cc710ab098706be09b1680f3e0e5fdf","I180:898;113:183;113:85":"fe72a249d828a797db5845a380940e7fc1c8f94c","I180:897;113:159;113:37":"3f474f35700aeea7c57044194f844c36c1c9054f","421:410":"757c3b8d403df83020fa57bf96e2cad40e134d4e","I113:159;113:37":"3f474f35700aeea7c57044194f844c36c1c9054f","113:44":"8c28bd314a9711385e76c2857edff413b15f3fcd","I180:896;113:183;113:85":"fe72a249d828a797db5845a380940e7fc1c8f94c","I180:898;113:167;113:44":"f0c804745cc710ab098706be09b1680f3e0e5fdf","I113:183;113:85":"fe72a249d828a797db5845a380940e7fc1c8f94c","I180:897;113:192;113:190":"010c52cf27424490f3fe835fdb58b499c1fc4baa","I180:897;113:167;113:44":"f0c804745cc710ab098706be09b1680f3e0e5fdf","I113:131;113:10":"f4bd92a6a906b219f868c649ae23ad7d84392d55","I180:897;113:184;113:95":"2428f4f5eb3c9eeac92a4451458d7e74767729d6","I180:896;113:159;113:37":"3f474f35700aeea7c57044194f844c36c1c9054f","I180:896;113:184;113:95":"2428f4f5eb3c9eeac92a4451458d7e74767729d6","I180:898;113:192;113:190":"010c52cf27424490f3fe835fdb58b499c1fc4baa","I180:896;113:131;113:10":"f4bd92a6a906b219f868c649ae23ad7d84392d55","440:414":"a5c835eb272d7e987352c854821dc7c3b8a04bb9"},"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":"\u003cscript type=\"text/javascript\"\u003e\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\u003c/script\u003e","customCodeBodyEnd":"\u003cscript\u003e\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\u003c/script\u003e\n\u003cscript async src=\"https://d-collect.jennifersoft.com/6c9f1cc9/demian.js\"\u003e\u003c/script\u003e\n\n\u003c!-- Google tag (gtag.js) --\u003e\n\u003cscript async src=\"https://www.googletagmanager.com/gtag/js?id=G-KNFL0CCK89\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  window.dataLayer = window.dataLayer || [];\n  function gtag(){dataLayer.push(arguments);}\n  gtag('js', new Date());\n\n  gtag('config', 'G-KNFL0CCK89');\n\u003c/script\u003e","faviconFilename":"a5c835eb272d7e987352c854821dc7c3b8a04bb9.png","socialImageFilename":"757c3b8d403df83020fa57bf96e2cad40e134d4e.png","labs":{"7464717929BF125D021BA2EC2CE3DD3FDA32FFCA":false,"03413F6F08EB5AE8BAC0FFAF722D852F02A991F4":true,"7E40910AE74B0A483FB7C572EAF579D247AA3603":false,"E5FBBA911B2B7A09E649D4BE6CDF8591EAEFC881":false}},"sourceCodeHash":""}