diff --git a/apps/web/src/editor-stage.tsx b/apps/web/src/editor-stage.tsx index c7d0bcb..a0b19b3 100644 --- a/apps/web/src/editor-stage.tsx +++ b/apps/web/src/editor-stage.tsx @@ -16,6 +16,7 @@ import { type TextTemplateNinePatch, type TextTemplateParticleLayer, type TextTemplateTextLayer, + type TextVerticalAlign, } from "./text-assets.js"; import { COLOR_CARD_HALF_SIZES, drawColorCard } from "./palette-provider.js"; @@ -201,6 +202,32 @@ function drawTemplateParticles( context.restore(); } +interface TextTemplateBoxLayoutInput { + align: "center" | "left" | "right"; + anchorX: number; + anchorY: number; + boxHeight: number; + boxWidth: number; + fontSize: number; + lineCount: number; + lineHeight: number; + verticalAlign: TextVerticalAlign; +} + +export function textTemplateBoxLayout(input: TextTemplateBoxLayoutInput) { + const boxLeft = -input.anchorX * input.boxWidth; + const boxTop = -input.anchorY * input.boxHeight; + const lineAdvance = input.fontSize * input.lineHeight; + const blockHeight = input.fontSize + Math.max(0, input.lineCount - 1) * lineAdvance; + const x = input.align === "left" ? boxLeft + : input.align === "right" ? boxLeft + input.boxWidth + : boxLeft + input.boxWidth / 2; + const firstY = input.verticalAlign === "top" ? boxTop + input.fontSize / 2 + : input.verticalAlign === "bottom" ? boxTop + input.boxHeight - blockHeight + input.fontSize / 2 + : boxTop + (input.boxHeight - blockHeight) / 2 + input.fontSize / 2; + return { blockHeight, firstY, lineAdvance, x }; +} + function drawTemplateTextLayer( context: CanvasRenderingContext2D, element: CanvasState["elements"][number], @@ -212,7 +239,7 @@ function drawTemplateTextLayer( const fontSize = editable ? element.font_size ?? layer.fontSize : layer.fontSize; const lineHeight = editable ? styleValue(element, "line_height", layer.lineHeight) : layer.lineHeight; const letterSpacing = editable ? styleValue(element, "letter_spacing", layer.letterSpacing) : layer.letterSpacing; - const align = (editable ? styleValue(element, "text_align", layer.align) : layer.align) as CanvasTextAlign; + const align = (editable ? styleValue(element, "text_align", layer.align) : layer.align) as TextTemplateTextLayer["align"]; const lines = (editable ? element.content ?? layer.text : layer.text).split("\n"); context.save(); context.globalAlpha *= layer.alpha; @@ -225,12 +252,23 @@ function drawTemplateTextLayer( context.textBaseline = "middle"; const widths = lines.map((line) => context.measureText(line).width + Math.max(0, Array.from(line).length - 1) * letterSpacing); const textWidth = Math.max(1, ...widths); - const textHeight = Math.max(fontSize * lineHeight, lines.length * fontSize * lineHeight); + const layout = textTemplateBoxLayout({ + align, + anchorX: layer.anchorX, + anchorY: layer.anchorY, + boxHeight: layer.height, + boxWidth: layer.width, + fontSize, + lineCount: lines.length, + lineHeight, + verticalAlign: layer.verticalAlign, + }); if (editable && styleValue(element, "background_enabled", false)) { const alpha = context.globalAlpha; context.globalAlpha = alpha * styleValue(element, "background_opacity", 1); context.fillStyle = styleValue(element, "background_color", "#FFE62C"); - context.fillRect(-textWidth / 2 - 16, -textHeight / 2 - 16, textWidth + 32, textHeight + 32); + const backgroundLeft = align === "left" ? layout.x : align === "right" ? layout.x - textWidth : layout.x - textWidth / 2; + context.fillRect(backgroundLeft - 16, layout.firstY - fontSize / 2 - 16, textWidth + 32, layout.blockHeight + 32); context.globalAlpha = alpha; } context.shadowColor = layer.shadowColor; @@ -243,17 +281,12 @@ function drawTemplateTextLayer( : editable ? styleValue(element, "fill_color", layer.fillColor) : layer.fillColor; context.strokeStyle = editable ? styleValue(element, "stroke_color", layer.strokeColor) : layer.strokeColor; context.lineWidth = editable ? styleValue(element, "stroke_width", layer.strokeWidth) : layer.strokeWidth; - const centerY = (0.5 - layer.anchorY) * textHeight; - const firstY = centerY - ((lines.length - 1) * fontSize * lineHeight) / 2; - const anchorX = align === "left" ? -layer.anchorX * textWidth - : align === "right" ? (1 - layer.anchorX) * textWidth - : (0.5 - layer.anchorX) * textWidth; lines.forEach((line, index) => { - const y = firstY + index * fontSize * lineHeight; + const y = layout.firstY + index * layout.lineAdvance; if ((editable ? styleValue(element, "stroke_enabled", layer.strokeWidth > 0) : layer.strokeWidth > 0) && context.lineWidth > 0) { - context.strokeText(line, anchorX, y); + context.strokeText(line, layout.x, y); } - context.fillText(line, anchorX, y); + context.fillText(line, layout.x, y); }); context.restore(); } diff --git a/apps/web/src/generated/complex-assets.json b/apps/web/src/generated/complex-assets.json index 5f7121f..cede1f6 100644 --- a/apps/web/src/generated/complex-assets.json +++ b/apps/web/src/generated/complex-assets.json @@ -1155,6 +1155,7 @@ "stroke_width": 5, "text": "春日计划", "type": "text", + "vertical_align": "bottom", "width": 204, "x": -25.25, "y": 4.75, @@ -1248,6 +1249,7 @@ "stroke_width": 0, "text": "笑不活了", "type": "text", + "vertical_align": "bottom", "width": 172, "x": 0.335, "y": 1.5, @@ -1296,6 +1298,7 @@ "stroke_width": 1, "text": "#人生照片", "type": "text", + "vertical_align": "bottom", "width": 244.943, "x": 0, "y": 0, @@ -1356,6 +1359,7 @@ "stroke_width": 1, "text": "我的日常生活", "type": "text", + "vertical_align": "middle", "width": 275.281, "x": 0, "y": 0, @@ -1404,6 +1408,7 @@ "stroke_width": 1, "text": "#碎片生活", "type": "text", + "vertical_align": "middle", "width": 218.234, "x": 0, "y": 0, @@ -1476,6 +1481,7 @@ "stroke_width": 0, "text": "闪光瞬间", "type": "text", + "vertical_align": "bottom", "width": 145, "x": -0.244, "y": -0.756, @@ -1526,6 +1532,7 @@ "stroke_width": 0, "text": "好柿花生", "type": "text", + "vertical_align": "middle", "width": 208, "x": 0, "y": 0 @@ -1571,6 +1578,7 @@ "stroke_width": 2, "text": "vlog.", "type": "text", + "vertical_align": "middle", "width": 227.375, "x": 0, "y": 0, @@ -1618,6 +1626,7 @@ "stroke_width": 2, "text": "近期合集。", "type": "text", + "vertical_align": "middle", "width": 308, "x": 0, "y": 0, @@ -1665,6 +1674,7 @@ "stroke_width": 0.226, "text": "返航时\n海鸟追着船盘旋", "type": "text", + "vertical_align": "top", "width": 74.97, "x": 0, "y": 0, @@ -1712,6 +1722,7 @@ "stroke_width": 1.6, "text": "@September", "type": "text", + "vertical_align": "bottom", "width": 272.7, "x": 0, "y": 0, @@ -1759,6 +1770,7 @@ "stroke_width": 2.6, "text": "复古制造局", "type": "text", + "vertical_align": "bottom", "width": 221.516, "x": 0, "y": 0, @@ -1806,6 +1818,7 @@ "stroke_width": 9.2, "text": "记录日常", "type": "text", + "vertical_align": "top", "width": 356.3, "x": 0, "y": 0, @@ -1853,6 +1866,7 @@ "stroke_width": 2, "text": "出门踏青去...", "type": "text", + "vertical_align": "middle", "width": 230.953, "x": 0, "y": 0, @@ -1913,6 +1927,7 @@ "stroke_width": 2, "text": "Food", "type": "text", + "vertical_align": "middle", "width": 251, "x": 0, "y": 0, @@ -1986,6 +2001,7 @@ "stroke_width": 2.2, "text": "拿捏住了", "type": "text", + "vertical_align": "bottom", "width": 175.698, "x": -0.531, "y": 0, @@ -2067,6 +2083,7 @@ "stroke_width": 0, "text": "文字示意", "type": "text", + "vertical_align": "bottom", "width": 88.56, "x": 0, "y": 0.72, @@ -2115,6 +2132,7 @@ "stroke_width": 2, "text": "宠物贴贴", "type": "text", + "vertical_align": "bottom", "width": 268.883, "x": 0, "y": 0, @@ -2207,6 +2225,7 @@ "stroke_width": 0, "text": "灵感笔记", "type": "text", + "vertical_align": "bottom", "width": 138, "x": 2.546, "y": 0.683, @@ -2292,6 +2311,7 @@ "stroke_width": 0, "text": "心事藏进风", "type": "text", + "vertical_align": "bottom", "width": 273.458, "x": -5.415, "y": 1.805, @@ -2353,6 +2373,7 @@ "stroke_width": 0, "text": "记录生活", "type": "text", + "vertical_align": "middle", "width": 244, "x": 0, "y": 0, @@ -2438,6 +2459,7 @@ "stroke_width": 0, "text": "薄荷气泡水", "type": "text", + "vertical_align": "top", "width": 159.3, "x": -0.5, "y": 6.75, @@ -2519,6 +2541,7 @@ "stroke_width": 0, "text": "气泡柠檬", "type": "text", + "vertical_align": "bottom", "width": 140, "x": 12, "y": 1, @@ -2613,6 +2636,7 @@ "stroke_width": 0, "text": "正在输入", "type": "text", + "vertical_align": "bottom", "width": 128, "x": 0.25, "y": 0.75, @@ -2663,6 +2687,7 @@ "stroke_width": 0, "text": "分享瞬间", "type": "text", + "vertical_align": "middle", "width": 208, "x": 0, "y": 0 @@ -2708,6 +2733,7 @@ "stroke_width": 0.588, "text": "生活日记生活日记生活日记生活日记生活日记生活日", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": 0, @@ -2755,6 +2781,7 @@ "stroke_width": 10, "text": "VLOG 01", "type": "text", + "vertical_align": "bottom", "width": 242.766, "x": 0, "y": 0, @@ -2815,6 +2842,7 @@ "stroke_width": 0, "text": "OOTD", "type": "text", + "vertical_align": "bottom", "width": 277.484, "x": 0, "y": 0, @@ -2884,6 +2912,7 @@ "stroke_width": 1, "text": "今日分享", "type": "text", + "vertical_align": "middle", "width": 246, "x": 0, "y": 0, @@ -2932,6 +2961,7 @@ "stroke_width": 0, "text": "Daily Look", "type": "text", + "vertical_align": "middle", "width": 308.094, "x": 0, "y": 0, @@ -2979,6 +3009,7 @@ "stroke_width": 1, "text": "Nice.", "type": "text", + "vertical_align": "middle", "width": 164.719, "x": 0, "y": 0, @@ -3039,6 +3070,7 @@ "stroke_width": 1.52, "text": "今日推荐", "type": "text", + "vertical_align": "bottom", "width": 354.503, "x": 0, "y": -44.927, @@ -3087,6 +3119,7 @@ "stroke_width": 0, "text": "refreshing", "type": "text", + "vertical_align": "middle", "width": 263.734, "x": 0, "y": 0, @@ -3134,6 +3167,7 @@ "stroke_width": 1.6, "text": "喜欢和你一起", "type": "text", + "vertical_align": "middle", "width": 236, "x": 0, "y": 0, @@ -3181,6 +3215,7 @@ "stroke_width": 2, "text": "Outdoor户外计划®", "type": "text", + "vertical_align": "middle", "width": 280.07, "x": 0, "y": 0, @@ -3249,6 +3284,7 @@ "stroke_width": 0, "text": "White Eve", "type": "text", + "vertical_align": "top", "width": 239.625, "x": 0, "y": 19, @@ -3297,6 +3333,7 @@ "stroke_width": 1, "text": "落日余晖", "type": "text", + "vertical_align": "bottom", "width": 253, "x": 0, "y": 0, @@ -3344,6 +3381,7 @@ "stroke_width": 0, "text": "Sping.", "type": "text", + "vertical_align": "middle", "width": 195.297, "x": 0, "y": 0, @@ -3391,6 +3429,7 @@ "stroke_width": 1.5, "text": "本月爱用分享", "type": "text", + "vertical_align": "middle", "width": 265, "x": 0, "y": 0, @@ -3451,6 +3490,7 @@ "stroke_width": 3.4, "text": "破大防了", "type": "text", + "vertical_align": "bottom", "width": 216, "x": 22.5, "y": 0, @@ -3499,6 +3539,7 @@ "stroke_width": 1.6, "text": "谁顶得住啊", "type": "text", + "vertical_align": "bottom", "width": 266, "x": 0, "y": 0, @@ -3567,6 +3608,7 @@ "stroke_width": 0, "text": "文字示意", "type": "text", + "vertical_align": "bottom", "width": 146, "x": 0, "y": 0, @@ -3661,6 +3703,7 @@ "stroke_width": 0, "text": "沉浸片刻", "type": "text", + "vertical_align": "bottom", "width": 128, "x": -0.25, "y": -0.25, @@ -3754,6 +3797,7 @@ "stroke_width": 0, "text": "撕纸记录", "type": "text", + "vertical_align": "bottom", "width": 138.791, "x": -2.189, "y": -0.468, @@ -3815,6 +3859,7 @@ "stroke_width": 0, "text": "好梦都给你", "type": "text", + "vertical_align": "bottom", "width": 308.824, "x": 0, "y": 0, @@ -3908,6 +3953,7 @@ "stroke_width": 0, "text": "课间十分钟", "type": "text", + "vertical_align": "bottom", "width": 164.111, "x": 5, "y": -5, @@ -4006,6 +4052,7 @@ "stroke_width": 0, "text": "纸板箱和手帐", "type": "text", + "vertical_align": "top", "width": 240, "x": 0, "y": -17.302, @@ -4055,6 +4102,7 @@ "stroke_width": 0, "text": "0糖", "type": "text", + "vertical_align": "middle", "width": 64.5, "x": 0, "y": 0, @@ -4103,6 +4151,7 @@ "stroke_width": 3.262, "text": "今年的砖\n 先搬到这了", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": 0, @@ -4163,6 +4212,7 @@ "stroke_width": 0, "text": "打字机语言", "type": "text", + "vertical_align": "bottom", "width": 267, "x": -5.5, "y": 0, @@ -4213,6 +4263,7 @@ "stroke_width": 0, "text": "北京", "type": "text", + "vertical_align": "middle", "width": 300, "x": 150, "y": 0, @@ -4263,6 +4314,7 @@ "stroke_width": 0, "text": "北京", "type": "text", + "vertical_align": "middle", "width": 280, "x": 139.659, "y": -9.766, @@ -4313,6 +4365,7 @@ "stroke_width": 0, "text": "14Feb.\n2026", "type": "text", + "vertical_align": "middle", "width": 356.958, "x": -178.452, "y": -3.115, @@ -4374,6 +4427,7 @@ "stroke_width": 0, "text": "新年快乐", "type": "text", + "vertical_align": "bottom", "width": 160, "x": 0, "y": 0, @@ -4435,6 +4489,7 @@ "stroke_width": 0, "text": "好事成兔!", "type": "text", + "vertical_align": "middle", "width": 317, "x": 0, "y": -15.25, @@ -4516,6 +4571,7 @@ "stroke_width": 1, "text": "万圣节OOTD.", "type": "text", + "vertical_align": "middle", "width": 256.422, "x": 4, "y": 0, @@ -4564,6 +4620,7 @@ "stroke_width": 1, "text": "年底折扣季", "type": "text", + "vertical_align": "bottom", "width": 271.281, "x": 0, "y": 0, @@ -4611,6 +4668,7 @@ "stroke_width": 0, "text": "·Double Seventh Festival·", "type": "text", + "vertical_align": "bottom", "width": 1, "x": 0, "y": 0, @@ -4658,6 +4716,7 @@ "stroke_width": 1, "text": "Love in detail", "type": "text", + "vertical_align": "middle", "width": 269.344, "x": 0, "y": 0, @@ -4705,6 +4764,7 @@ "stroke_width": 0, "text": "Oh So Hot", "type": "text", + "vertical_align": "middle", "width": 290.844, "x": 0, "y": 0, @@ -4765,6 +4825,7 @@ "stroke_width": 0, "text": "恭喜发财", "type": "text", + "vertical_align": "bottom", "width": 256, "x": 0, "y": 0, @@ -4813,6 +4874,7 @@ "stroke_width": 0, "text": "amazing", "type": "text", + "vertical_align": "middle", "width": 242.047, "x": 0, "y": 0, @@ -4881,6 +4943,7 @@ "stroke_width": 0, "text": "Hello June", "type": "text", + "vertical_align": "middle", "width": 264.078, "x": 0, "y": 0, @@ -4950,6 +5013,7 @@ "stroke_width": 0, "text": "和你在一起", "type": "text", + "vertical_align": "bottom", "width": 305.094, "x": 0, "y": 0, @@ -4998,6 +5062,7 @@ "stroke_width": 0, "text": "打工人日常", "type": "text", + "vertical_align": "bottom", "width": 266.188, "x": 0, "y": 0, @@ -5045,6 +5110,7 @@ "stroke_width": 3, "text": "来一局吧", "type": "text", + "vertical_align": "bottom", "width": 204.75, "x": 0, "y": 0, @@ -5113,6 +5179,7 @@ "stroke_width": 3, "text": "@ Ader Error", "type": "text", + "vertical_align": "middle", "width": 230.516, "x": 0, "y": -5, @@ -5161,6 +5228,7 @@ "stroke_width": 0.903, "text": "夏日VLOG", "type": "text", + "vertical_align": "bottom", "width": 360, "x": 0, "y": 0, @@ -5229,6 +5297,7 @@ "stroke_width": 0, "text": "日常穿搭", "type": "text", + "vertical_align": "bottom", "width": 188.313, "x": 0, "y": -9.75, @@ -5304,6 +5373,7 @@ "stroke_width": 0, "text": "好物分享", "type": "text", + "vertical_align": "bottom", "width": 184, "x": -92, "y": 31.887, @@ -5352,6 +5422,7 @@ "stroke_width": 0, "text": "勇敢", "type": "text", + "vertical_align": "middle", "width": 134, "x": 0, "y": 0, @@ -5420,6 +5491,7 @@ "stroke_width": 0, "text": "福建·南平", "type": "text", + "vertical_align": "bottom", "width": 222.609, "x": 17, "y": 3.5, @@ -5468,6 +5540,7 @@ "stroke_width": 0.925, "text": "平替耳机惊爆价", "type": "text", + "vertical_align": "bottom", "width": 360, "x": 0, "y": 0, @@ -5536,6 +5609,7 @@ "stroke_width": 0, "text": "告别皱纹烦恼", "type": "text", + "vertical_align": "bottom", "width": 317.706, "x": -0.861, "y": -8.97, @@ -5617,6 +5691,7 @@ "stroke_width": 0, "text": "苏州", "type": "text", + "vertical_align": "bottom", "width": 120, "x": 18.75, "y": -1.75, @@ -5665,6 +5740,7 @@ "stroke_width": 3.75, "text": "今日36°C", "type": "text", + "vertical_align": "bottom", "width": 225.234, "x": 0, "y": 0, @@ -5733,6 +5809,7 @@ "stroke_width": 1.22, "text": "解放妈妈双手!", "type": "text", + "vertical_align": "middle", "width": 315.889, "x": 3.372, "y": -6.001, @@ -5802,6 +5879,7 @@ "stroke_width": 4.852, "text": "变熟后", "type": "text", + "vertical_align": "bottom", "width": 218.329, "x": -0.59, "y": 1.831, @@ -5871,6 +5949,7 @@ "stroke_width": 0, "text": "打卡成功", "type": "text", + "vertical_align": "middle", "width": 160, "x": 21.646, "y": 0, @@ -5940,6 +6019,7 @@ "stroke_width": 1.848, "text": "冬季转奶不用愁!", "type": "text", + "vertical_align": "bottom", "width": 324.428, "x": 0, "y": -6.944, @@ -6021,6 +6101,7 @@ "stroke_width": 0, "text": "油敏皮救星来了", "type": "text", + "vertical_align": "bottom", "width": 308.092, "x": -4.734, "y": 0, @@ -6082,6 +6163,7 @@ "stroke_width": 2.951, "text": "丹麦进口", "type": "text", + "vertical_align": "bottom", "width": 251.803, "x": 0, "y": 0, @@ -6151,6 +6233,7 @@ "stroke_width": 2.384, "text": "实力新宠儿!", "type": "text", + "vertical_align": "bottom", "width": 247.01, "x": 33.612, "y": 2.288, @@ -6220,6 +6303,7 @@ "stroke_width": 0, "text": "约会穿搭", "type": "text", + "vertical_align": "bottom", "width": 188.313, "x": 0, "y": -9.75, @@ -6268,6 +6352,7 @@ "stroke_width": 2, "text": "近期合集。", "type": "text", + "vertical_align": "middle", "width": 308, "x": 0, "y": 0, @@ -6316,6 +6401,7 @@ "stroke_width": 0, "text": "21 Jan 2026", "type": "text", + "vertical_align": "middle", "width": 348.442, "x": 0, "y": 0, @@ -6389,6 +6475,7 @@ "stroke_width": 0, "text": "文字示意", "type": "text", + "vertical_align": "bottom", "width": 148.738, "x": -0.25, "y": -2.827, @@ -6470,6 +6557,7 @@ "stroke_width": 4, "text": "牛肉拉面", "type": "text", + "vertical_align": "middle", "width": 180, "x": 0, "y": -2.5, @@ -6539,6 +6627,7 @@ "stroke_width": 2.946, "text": "三天熬夜测评", "type": "text", + "vertical_align": "bottom", "width": 329.067, "x": 0, "y": 0, @@ -6587,6 +6676,7 @@ "stroke_width": 1.831, "text": "拯救疲惫肩膀", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": 0, @@ -6647,6 +6737,7 @@ "stroke_width": 2.053, "text": "颜值在线", "type": "text", + "vertical_align": "bottom", "width": 265.209, "x": 0, "y": 0, @@ -6695,6 +6786,7 @@ "stroke_width": 1, "text": "特种兵旅行", "type": "text", + "vertical_align": "bottom", "width": 250, "x": 0, "y": 0, @@ -6763,6 +6855,7 @@ "stroke_width": 2, "text": "上海", "type": "text", + "vertical_align": "bottom", "width": 102, "x": 19, "y": 0, @@ -6811,6 +6904,7 @@ "stroke_width": 1, "text": "红糖糍粑", "type": "text", + "vertical_align": "bottom", "width": 160, "x": 0, "y": 0, @@ -6879,6 +6973,7 @@ "stroke_width": 0, "text": "有人知道吗", "type": "text", + "vertical_align": "middle", "width": 250, "x": 0, "y": 0, @@ -6927,6 +7022,7 @@ "stroke_width": 0, "text": "「快到模糊的踏频,\n记录着我每天奔波的\n上班通勤生活」", "type": "text", + "vertical_align": "middle", "width": 171, "x": 0, "y": 0, @@ -6974,6 +7070,7 @@ "stroke_width": 0.43, "text": "点击输入昵称", "type": "text", + "vertical_align": "bottom", "width": 199, "x": 0, "y": 0, @@ -7043,6 +7140,7 @@ "stroke_width": 2.977, "text": "以油养肤新高度", "type": "text", + "vertical_align": "bottom", "width": 355.775, "x": -2.113, "y": 18.289, @@ -7112,6 +7210,7 @@ "stroke_width": 0, "text": "乘着夜风", "type": "text", + "vertical_align": "bottom", "width": 233.514, "x": 43.784, "y": 0, @@ -7160,6 +7259,7 @@ "stroke_width": 1, "text": "好物分享", "type": "text", + "vertical_align": "bottom", "width": 264.525, "x": 0, "y": 0, @@ -7228,6 +7328,7 @@ "stroke_width": 1, "text": "的小小日常", "type": "text", + "vertical_align": "middle", "width": 231, "x": 0, "y": 0, @@ -7276,6 +7377,7 @@ "stroke_width": 0, "text": "Summer", "type": "text", + "vertical_align": "middle", "width": 199.141, "x": 0, "y": 0, @@ -7344,6 +7446,7 @@ "stroke_width": 0, "text": "投递日常", "type": "text", + "vertical_align": "bottom", "width": 188.313, "x": 0, "y": -9.75, @@ -7405,6 +7508,7 @@ "stroke_width": 1, "text": "“街头风穿搭手册”", "type": "text", + "vertical_align": "middle", "width": 308.75, "x": 5, "y": 1, @@ -7430,6 +7534,7 @@ "stroke_width": 1, "text": "“街头风穿搭手册”", "type": "text", + "vertical_align": "middle", "width": 308.75, "x": 3, "y": -1, @@ -7455,6 +7560,7 @@ "stroke_width": 1, "text": "“街头风穿搭手册”", "type": "text", + "vertical_align": "middle", "width": 308.75, "x": 0, "y": -4, @@ -7503,6 +7609,7 @@ "stroke_width": 2, "text": "「 限定快乐 」", "type": "text", + "vertical_align": "middle", "width": 273.656, "x": 0, "y": 0, @@ -7571,6 +7678,7 @@ "stroke_width": 0, "text": "电波少女", "type": "text", + "vertical_align": "bottom", "width": 163, "x": 5, "y": -3, @@ -7619,6 +7727,7 @@ "stroke_width": 2, "text": "day.", "type": "text", + "vertical_align": "middle", "width": 212.469, "x": 0, "y": 0, @@ -7666,6 +7775,7 @@ "stroke_width": 0, "text": "You're not alone", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": 0, @@ -7734,6 +7844,7 @@ "stroke_width": 0, "text": "在思考中", "type": "text", + "vertical_align": "middle", "width": 204.375, "x": 0, "y": 0, @@ -7795,6 +7906,7 @@ "stroke_width": 0, "text": "速達郵便", "type": "text", + "vertical_align": "middle", "width": 247.135, "x": 0, "y": 0, @@ -7864,6 +7976,7 @@ "stroke_width": 0, "text": "十月开心电台", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": 0, @@ -7925,6 +8038,7 @@ "stroke_width": 0, "text": "#Summervibe🌴", "type": "text", + "vertical_align": "bottom", "width": 232.031, "x": 0, "y": -5.25, @@ -7973,6 +8087,7 @@ "stroke_width": 1.6, "text": "「折扣推荐」", "type": "text", + "vertical_align": "middle", "width": 294, "x": 0, "y": 0, @@ -8020,6 +8135,7 @@ "stroke_width": 0, "text": "你好新年", "type": "text", + "vertical_align": "bottom", "width": 244.125, "x": 0, "y": 0, @@ -8067,6 +8183,7 @@ "stroke_width": 3.354, "text": "摸鱼居中对齐", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": 0, @@ -8116,6 +8233,7 @@ "stroke_width": 0.3, "text": "Shot by Xiaohongshu", "type": "text", + "vertical_align": "bottom", "width": 175.804, "x": -87.902, "y": 0, @@ -8166,6 +8284,7 @@ "stroke_width": 0, "text": "北京", "type": "text", + "vertical_align": "middle", "width": 280, "x": 139.659, "y": -9.766, @@ -8215,6 +8334,7 @@ "stroke_width": 0, "text": "21 Jan 2026", "type": "text", + "vertical_align": "middle", "width": 348.442, "x": 0, "y": 0, @@ -8265,6 +8385,7 @@ "stroke_width": 0, "text": "“直到鞋底踩实这片土地,这一年才算\n真正结束,新年才算真的开始” ", "type": "text", + "vertical_align": "top", "width": 360, "x": -180, "y": 0, @@ -8314,6 +8435,7 @@ "stroke_width": 0, "text": "0脂", "type": "text", + "vertical_align": "bottom", "width": 64.5, "x": 0, "y": 0, @@ -8375,6 +8497,7 @@ "stroke_width": 0, "text": "相机", "type": "text", + "vertical_align": "bottom", "width": 96, "x": 0, "y": -16.9, @@ -8423,6 +8546,7 @@ "stroke_width": 0, "text": "Dopamine!", "type": "text", + "vertical_align": "middle", "width": 208.453, "x": 0, "y": 0, @@ -8508,6 +8632,7 @@ "stroke_width": 0.679, "text": "我们的人生之树都会结满果实", "type": "text", + "vertical_align": "top", "width": 301.987, "x": -151.248, "y": -19.46, @@ -8556,6 +8681,7 @@ "stroke_width": 3.2, "text": "无语住了", "type": "text", + "vertical_align": "bottom", "width": 291.867, "x": 0, "y": 0, @@ -8629,6 +8755,7 @@ "stroke_width": 0, "text": "童年的游乐园", "type": "text", + "vertical_align": "bottom", "width": 244.099, "x": -2.266, "y": 2.743, @@ -8722,6 +8849,7 @@ "stroke_width": 0, "text": "手帐心情", "type": "text", + "vertical_align": "bottom", "width": 128.606, "x": -1.836, "y": 4.301, @@ -8770,6 +8898,7 @@ "stroke_width": 0, "text": "喜欢被治愈", "type": "text", + "vertical_align": "bottom", "width": 343, "x": 0, "y": 0, @@ -8838,6 +8967,7 @@ "stroke_width": 0, "text": "示例文字", "type": "text", + "vertical_align": "bottom", "width": 143, "x": 0, "y": 0, @@ -8899,6 +9029,7 @@ "stroke_width": 1.8, "text": "不愧是我。", "type": "text", + "vertical_align": "bottom", "width": 262, "x": 10.25, "y": 18.5, @@ -8947,6 +9078,7 @@ "stroke_width": 1, "text": "满分日常", "type": "text", + "vertical_align": "middle", "width": 228, "x": 0, "y": 0, @@ -8994,6 +9126,7 @@ "stroke_width": 1.2, "text": "恋爱这件小事", "type": "text", + "vertical_align": "middle", "width": 240, "x": 0, "y": 0, @@ -9041,6 +9174,7 @@ "stroke_width": 0, "text": "( 限定浪漫 )", "type": "text", + "vertical_align": "middle", "width": 213, "x": 0, "y": 0, @@ -9109,6 +9243,7 @@ "stroke_width": 0, "text": "送你一张入秋券", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": 0, @@ -9157,6 +9292,7 @@ "stroke_width": 2.6, "text": "Daily Plog", "type": "text", + "vertical_align": "bottom", "width": 231.641, "x": 0, "y": 0, @@ -9204,6 +9340,7 @@ "stroke_width": 0.958, "text": "summer is coming", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": 0, @@ -9264,6 +9401,7 @@ "stroke_width": 0, "text": "元气满满", "type": "text", + "vertical_align": "bottom", "width": 298.182, "x": 0, "y": 1.164, @@ -9333,6 +9471,7 @@ "stroke_width": 2, "text": "好运派送中", "type": "text", + "vertical_align": "middle", "width": 217, "x": 0, "y": 5, @@ -9381,6 +9520,7 @@ "stroke_width": 1, "text": "💛Luckyday!", "type": "text", + "vertical_align": "middle", "width": 228.844, "x": 0, "y": 0, @@ -9428,6 +9568,7 @@ "stroke_width": 2, "text": "Bangkok曼谷↓", "type": "text", + "vertical_align": "middle", "width": 257.438, "x": 0, "y": 0, @@ -9475,6 +9616,7 @@ "stroke_width": 0, "text": "Vintage", "type": "text", + "vertical_align": "bottom", "width": 275.125, "x": 0, "y": 0, @@ -9522,6 +9664,7 @@ "stroke_width": 0, "text": "Iridescent", "type": "text", + "vertical_align": "middle", "width": 292.359, "x": 0, "y": 0, @@ -9590,6 +9733,7 @@ "stroke_width": 0, "text": "Mini Vlog", "type": "text", + "vertical_align": "middle", "width": 267.656, "x": -9, "y": 2, @@ -9638,6 +9782,7 @@ "stroke_width": 2.3, "text": "青提乌龙茶", "type": "text", + "vertical_align": "bottom", "width": 234.25, "x": 0, "y": 0, @@ -9685,6 +9830,7 @@ "stroke_width": 3, "text": "沿途的风景。", "type": "text", + "vertical_align": "middle", "width": 271, "x": 0, "y": 0, @@ -9732,6 +9878,7 @@ "stroke_width": 0, "text": "Good health", "type": "text", + "vertical_align": "bottom", "width": 169.859, "x": 0, "y": 0, @@ -9843,6 +9990,7 @@ "stroke_width": 0, "text": "电影生活记录", "type": "text", + "vertical_align": "bottom", "width": 358.818, "x": 0.591, "y": 3.085, @@ -9905,6 +10053,7 @@ "stroke_width": 0, "text": "06.29", "type": "text", + "vertical_align": "middle", "width": 178.141, "x": -89.07, "y": -48, @@ -9931,6 +10080,7 @@ "stroke_width": 0, "text": "30°C", "type": "text", + "vertical_align": "bottom", "width": 84.156, "x": -85.07, "y": 57, @@ -9957,6 +10107,7 @@ "stroke_width": 0, "text": "&", "type": "text", + "vertical_align": "bottom", "width": 64.281, "x": 12.93, "y": 43, @@ -10005,6 +10156,7 @@ "stroke_width": 0, "text": "生活分享家", "type": "text", + "vertical_align": "middle", "width": 250.5, "x": 0, "y": 15.5, @@ -10030,6 +10182,7 @@ "stroke_width": 0, "text": "@Fantastic Lifestyle", "type": "text", + "vertical_align": "middle", "width": 207.563, "x": 0, "y": -38.5, @@ -10099,6 +10252,7 @@ "stroke_width": 0, "text": "快乐充值成功", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": -15.39, @@ -10124,6 +10278,7 @@ "stroke_width": 0, "text": "Have a nice day✨", "type": "text", + "vertical_align": "middle", "width": 146.543, "x": 0, "y": 22.082, @@ -10193,6 +10348,7 @@ "stroke_width": 0, "text": "日常\n的镜头", "type": "text", + "vertical_align": "middle", "width": 156, "x": 0, "y": -10.75, @@ -10219,6 +10375,7 @@ "stroke_width": 0, "text": "@Sunny day", "type": "text", + "vertical_align": "top", "width": 133.219, "x": 0, "y": 54.75, @@ -10327,6 +10484,7 @@ "stroke_width": 0, "text": "慢生活指南", "type": "text", + "vertical_align": "middle", "width": 210.718, "x": 0, "y": 13.5, @@ -10352,6 +10510,7 @@ "stroke_width": 0, "text": "慢生活指南", "type": "text", + "vertical_align": "middle", "width": 210.718, "x": 0, "y": 13.5, @@ -10377,6 +10536,7 @@ "stroke_width": 0, "text": "慢生活指南", "type": "text", + "vertical_align": "middle", "width": 210.718, "x": 0, "y": 13.5, @@ -10439,6 +10599,7 @@ "stroke_width": 0, "text": "做个", "type": "text", + "vertical_align": "bottom", "width": 112, "x": -44, "y": -5.144, @@ -10465,6 +10626,7 @@ "stroke_width": 0, "text": "有闲人", "type": "text", + "vertical_align": "top", "width": 186, "x": 2, "y": -2.144, @@ -10491,6 +10653,7 @@ "stroke_width": 0, "text": "Be a chill fella,\nwould you?", "type": "text", + "vertical_align": "middle", "width": 75, "x": 21, "y": -30.144, @@ -10588,6 +10751,7 @@ "stroke_width": 0, "text": "海滩日记", "type": "text", + "vertical_align": "bottom", "width": 323.702, "x": -3.666, "y": -32.982, @@ -10685,6 +10849,7 @@ "stroke_width": 0, "text": "即兴演出", "type": "text", + "vertical_align": "bottom", "width": 194.376, "x": 30.574, "y": 13.841, @@ -10790,6 +10955,7 @@ "stroke_width": 0, "text": "面包店巡礼", "type": "text", + "vertical_align": "bottom", "width": 253.224, "x": -9.496, "y": 12.239, @@ -10863,6 +11029,7 @@ "stroke_width": 1.296, "text": "童年的小红花", "type": "text", + "vertical_align": "bottom", "width": 331.272, "x": 4.166, "y": 8.563, @@ -10952,6 +11119,7 @@ "stroke_width": 0, "text": "时间的痕迹", "type": "text", + "vertical_align": "bottom", "width": 188.881, "x": 0, "y": -5.542, @@ -11070,6 +11238,7 @@ "stroke_width": 0, "text": "(周末俱乐部)", "type": "text", + "vertical_align": "middle", "width": 241.381, "x": 0, "y": 14.75, @@ -11095,6 +11264,7 @@ "stroke_width": 0, "text": "(周末俱乐部)", "type": "text", + "vertical_align": "middle", "width": 241.381, "x": 0, "y": 14.75, @@ -11120,6 +11290,7 @@ "stroke_width": 0, "text": "(周末俱乐部)", "type": "text", + "vertical_align": "middle", "width": 241.381, "x": 0, "y": 14.75, @@ -11145,6 +11316,7 @@ "stroke_width": 0, "text": "(周末俱乐部)", "type": "text", + "vertical_align": "middle", "width": 241.381, "x": 0, "y": 14.75, @@ -11170,6 +11342,7 @@ "stroke_width": 0, "text": "The Weekend Club", "type": "text", + "vertical_align": "middle", "width": 199.41, "x": 0, "y": -25.25, @@ -11292,6 +11465,7 @@ "stroke_width": 0, "text": "菠萝罐头之夜", "type": "text", + "vertical_align": "bottom", "width": 234.531, "x": 0, "y": -1.46, @@ -11386,6 +11560,7 @@ "stroke_width": 0, "text": "夏日特调", "type": "text", + "vertical_align": "bottom", "width": 152.819, "x": 0, "y": -14.497, @@ -11457,6 +11632,7 @@ "stroke_width": 1.237, "text": "超好逛的vitage市集", "type": "text", + "vertical_align": "bottom", "width": 319.62, "x": -140.759, "y": -38.366, @@ -11484,6 +11660,7 @@ "stroke_width": 0, "text": "太康路 37-2号", "type": "text", + "vertical_align": "bottom", "width": 319.746, "x": -142.761, "y": 72.272, @@ -11511,6 +11688,7 @@ "stroke_width": 0, "text": "609 Space", "type": "text", + "vertical_align": "bottom", "width": 319.746, "x": -139.746, "y": 18.137, @@ -11574,6 +11752,7 @@ "stroke_width": 0, "text": "Double Seventh Festival", "type": "text", + "vertical_align": "bottom", "width": 260, "x": -130, "y": 130, @@ -11622,6 +11801,7 @@ "stroke_width": 0, "text": "It’s\nA GOOD THING", "type": "text", + "vertical_align": "middle", "width": 276.438, "x": 0, "y": -40.5, @@ -11647,6 +11827,7 @@ "stroke_width": 0, "text": "to LIKE\nSOMEONE", "type": "text", + "vertical_align": "middle", "width": 182.672, "x": 0, "y": 40.5, @@ -11695,6 +11876,7 @@ "stroke_width": 0, "text": "NICE", "type": "text", + "vertical_align": "middle", "width": 192.726, "x": 0, "y": -0.619, @@ -11720,6 +11902,7 @@ "stroke_width": 0, "text": "风格无界\n 穿搭有型", "type": "text", + "vertical_align": "middle", "width": 59.622, "x": -150.189, "y": -0.619, @@ -11745,6 +11928,7 @@ "stroke_width": 0, "text": "复古新潮\n 皆可出彩", "type": "text", + "vertical_align": "middle", "width": 59.622, "x": 150.189, "y": -0.619, @@ -11771,6 +11955,7 @@ "stroke_width": 0, "text": "ME AND MY OOTD", "type": "text", + "vertical_align": "top", "width": 81.413, "x": 0, "y": 41.467, @@ -11832,6 +12017,7 @@ "stroke_width": 0, "text": "宜收集快乐", "type": "text", + "vertical_align": "middle", "width": 223.031, "x": 0, "y": 3.5, @@ -11857,6 +12043,7 @@ "stroke_width": 0, "text": "( 今日 )", "type": "text", + "vertical_align": "middle", "width": 58.531, "x": 0, "y": -41.5, @@ -11905,6 +12092,7 @@ "stroke_width": 0, "text": "旅行", "type": "text", + "vertical_align": "middle", "width": 90, "x": 0, "y": -61, @@ -11930,6 +12118,7 @@ "stroke_width": 0, "text": "的意义", "type": "text", + "vertical_align": "middle", "width": 135, "x": 0, "y": 42, @@ -11955,6 +12144,7 @@ "stroke_width": 0, "text": "THE MEANING\nOF TRAVEL", "type": "text", + "vertical_align": "middle", "width": 111.63, "x": 0, "y": -7, @@ -11980,6 +12170,7 @@ "stroke_width": 0, "text": "(Walk & See)", "type": "text", + "vertical_align": "middle", "width": 78.085, "x": 0, "y": 79, @@ -12075,6 +12266,7 @@ "stroke_width": 0, "text": "(放轻松)", "type": "text", + "vertical_align": "middle", "width": 356.72, "x": 0, "y": 29.929, @@ -12100,6 +12292,7 @@ "stroke_width": 0, "text": "(放轻松)", "type": "text", + "vertical_align": "middle", "width": 356.72, "x": 0, "y": 29.929, @@ -12125,6 +12318,7 @@ "stroke_width": 0, "text": "(放轻松)", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": 29.929, @@ -12151,6 +12345,7 @@ "stroke_width": 0, "text": "STAY CHILL\nBE HAPPY, ©2023", "type": "text", + "vertical_align": "top", "width": 191.426, "x": 0, "y": -27.469, @@ -12246,6 +12441,7 @@ "stroke_width": 0, "text": "游山\n玩水", "type": "text", + "vertical_align": "middle", "width": 1, "x": 0, "y": -35, @@ -12271,6 +12467,7 @@ "stroke_width": 0, "text": "游山\n玩水", "type": "text", + "vertical_align": "middle", "width": 1, "x": 0, "y": -35, @@ -12296,6 +12493,7 @@ "stroke_width": 0, "text": "游山\n玩水", "type": "text", + "vertical_align": "middle", "width": 1, "x": 0, "y": -35, @@ -12321,6 +12519,7 @@ "stroke_width": 0, "text": "(计划)进行中", "type": "text", + "vertical_align": "middle", "width": 1, "x": 0, "y": 41, @@ -12346,6 +12545,7 @@ "stroke_width": 0, "text": "Sightseeing Tour", "type": "text", + "vertical_align": "middle", "width": 1, "x": 0, "y": -41, @@ -12394,6 +12594,7 @@ "stroke_width": 0, "text": "ENJOY\nYOUR TIME", "type": "text", + "vertical_align": "bottom", "width": 75.879, "x": 49, "y": -23, @@ -12419,6 +12620,7 @@ "stroke_width": 0, "text": "假期\n 出游季", "type": "text", + "vertical_align": "bottom", "width": 234, "x": 0, "y": 0, @@ -12467,6 +12669,7 @@ "stroke_width": 0, "text": "(秋日)户外灵感", "type": "text", + "vertical_align": "bottom", "width": 231.018, "x": 0, "y": -11.5, @@ -12492,6 +12695,7 @@ "stroke_width": 0, "text": "“Inspire Lives”", "type": "text", + "vertical_align": "bottom", "width": 97.816, "x": 0, "y": 23.5, @@ -12555,6 +12759,7 @@ "stroke_width": 0, "text": "周末扫街", "type": "text", + "vertical_align": "middle", "width": 196, "x": -94, "y": -13, @@ -12603,6 +12808,7 @@ "stroke_width": 0, "text": "Hope you \nhave a good time", "type": "text", + "vertical_align": "bottom", "width": 106.719, "x": 0, "y": 24.3, @@ -12628,6 +12834,7 @@ "stroke_width": 0, "text": "Autumn.", "type": "text", + "vertical_align": "bottom", "width": 249.351, "x": 0, "y": -11.7, @@ -12677,6 +12884,7 @@ "stroke_width": 0, "text": "仲夏夜之梦", "type": "text", + "vertical_align": "bottom", "width": 360, "x": 0, "y": -0.938, @@ -12703,6 +12911,7 @@ "stroke_width": 0, "text": "A MID\nSUMMER\nNIGHT'S DREAM", "type": "text", + "vertical_align": "top", "width": 91.313, "x": 0, "y": 4.688, @@ -12752,6 +12961,7 @@ "stroke_width": 1, "text": "夏日重现", "type": "text", + "vertical_align": "bottom", "width": 218.875, "x": 0, "y": 14, @@ -12778,6 +12988,7 @@ "stroke_width": 1, "text": "Summer\ncomes again®", "type": "text", + "vertical_align": "top", "width": 109.891, "x": 0, "y": 24, @@ -12827,6 +13038,7 @@ "stroke_width": 1, "text": "Nice\nSummer", "type": "text", + "vertical_align": "bottom", "width": 178.141, "x": 0, "y": 25.27, @@ -12853,6 +13065,7 @@ "stroke_width": 1, "text": "夏日生活(图鉴)", "type": "text", + "vertical_align": "top", "width": 160, "x": 0, "y": 37.09, @@ -12901,6 +13114,7 @@ "stroke_width": 0, "text": "秋意\n正浓", "type": "text", + "vertical_align": "bottom", "width": 150, "x": -2, "y": 0, @@ -12926,6 +13140,7 @@ "stroke_width": 0, "text": "Autumn", "type": "text", + "vertical_align": "bottom", "width": 233.996, "x": 0, "y": -3, @@ -12974,6 +13189,7 @@ "stroke_width": 0, "text": "PATTAYA", "type": "text", + "vertical_align": "bottom", "width": 289.1, "x": 0, "y": -38.253, @@ -12999,6 +13215,7 @@ "stroke_width": 0, "text": "芭提雅", "type": "text", + "vertical_align": "middle", "width": 107, "x": 0, "y": 9.747, @@ -13025,6 +13242,7 @@ "stroke_width": 0, "text": "足迹记录\nThe Place I've Been To", "type": "text", + "vertical_align": "top", "width": 93.686, "x": 0, "y": 41.243, @@ -13098,6 +13316,7 @@ "stroke_width": 0, "text": "周末公园出游", "type": "text", + "vertical_align": "bottom", "width": 360, "x": 0, "y": -7.269, @@ -13185,6 +13404,7 @@ "stroke_width": 0, "text": "我的夏日秘密", "type": "text", + "vertical_align": "bottom", "width": 360, "x": 0, "y": -12.879, @@ -13302,6 +13522,7 @@ "stroke_width": 0, "text": "我的春日回忆", "type": "text", + "vertical_align": "bottom", "width": 300.189, "x": -6.196, "y": -2.471, @@ -13399,6 +13620,7 @@ "stroke_width": 0, "text": "生日浪漫札记", "type": "text", + "vertical_align": "bottom", "width": 258.867, "x": 8.216, "y": 12.885, @@ -13496,6 +13718,7 @@ "stroke_width": 0, "text": "我的春日花花写真", "type": "text", + "vertical_align": "bottom", "width": 59.663, "x": 2.686, "y": 4.158, @@ -13521,6 +13744,7 @@ "stroke_width": 0, "text": "我的春日花花写真", "type": "text", + "vertical_align": "bottom", "width": 115.363, "x": 2.686, "y": 4.158, @@ -13546,6 +13770,7 @@ "stroke_width": 0, "text": "我的春日花花写真", "type": "text", + "vertical_align": "bottom", "width": 115.131, "x": 2.686, "y": 4.158, @@ -13631,6 +13856,7 @@ "stroke_width": 0, "text": "周六心情日记", "type": "text", + "vertical_align": "bottom", "width": 278.096, "x": -0.541, "y": 22.952, @@ -13714,6 +13940,7 @@ "stroke_width": 0, "text": "夏至绿色心情", "type": "text", + "vertical_align": "bottom", "width": 194.195, "x": 96.637, "y": 0, @@ -13831,6 +14058,7 @@ "stroke_width": 0, "text": "胶片回忆", "type": "text", + "vertical_align": "bottom", "width": 185.648, "x": -3.233, "y": 0, @@ -13937,6 +14165,7 @@ "stroke_width": 0, "text": "好戏登场", "type": "text", + "vertical_align": "bottom", "width": 171.638, "x": 0, "y": -17.639, @@ -14010,6 +14239,7 @@ "stroke_width": 1.158, "text": "带走我的烦恼", "type": "text", + "vertical_align": "bottom", "width": 327.705, "x": 2.482, "y": 7.446, @@ -14083,6 +14313,7 @@ "stroke_width": 0, "text": "春日正当时", "type": "text", + "vertical_align": "middle", "width": 250, "x": 0, "y": -5.75, @@ -14108,6 +14339,7 @@ "stroke_width": 0, "text": "Specialcollection", "type": "text", + "vertical_align": "middle", "width": 168.547, "x": 0, "y": 8.25, @@ -14170,6 +14402,7 @@ "stroke_width": 0, "text": "去见面吧", "type": "text", + "vertical_align": "middle", "width": 216, "x": -114.043, "y": -37.25, @@ -14196,6 +14429,7 @@ "stroke_width": 0, "text": "春天!", "type": "text", + "vertical_align": "middle", "width": 140.172, "x": -26.129, "y": 33.75, @@ -14258,6 +14492,7 @@ "stroke_width": 0, "text": "花开", "type": "text", + "vertical_align": "middle", "width": 107.438, "x": -21.281, "y": -16.75, @@ -14283,6 +14518,7 @@ "stroke_width": 0, "text": "的", "type": "text", + "vertical_align": "middle", "width": 41.5, "x": 0, "y": -16.75, @@ -14309,6 +14545,7 @@ "stroke_width": 0, "text": "季节", "type": "text", + "vertical_align": "middle", "width": 107.438, "x": 21.281, "y": -16.75, @@ -14334,6 +14571,7 @@ "stroke_width": 0, "text": "theflowerseason", "type": "text", + "vertical_align": "middle", "width": 200.813, "x": 0, "y": 11.25, @@ -14395,6 +14633,7 @@ "stroke_width": 0, "text": "浪漫情人节", "type": "text", + "vertical_align": "middle", "width": 220.875, "x": 0, "y": -4.25, @@ -14420,6 +14659,7 @@ "stroke_width": 0, "text": "ROMANTIC MEMORY", "type": "text", + "vertical_align": "middle", "width": 120.844, "x": 0, "y": -41.25, @@ -14482,6 +14722,7 @@ "stroke_width": 0, "text": "长情\n告白", "type": "text", + "vertical_align": "middle", "width": 128, "x": 42.5, "y": -16.545, @@ -14507,6 +14748,7 @@ "stroke_width": 0, "text": "\bStay with me", "type": "text", + "vertical_align": "middle", "width": 79, "x": 53.5, "y": -16.545, @@ -14557,6 +14799,7 @@ "stroke_width": 0, "text": "有你,\n宇宙都温柔", "type": "text", + "vertical_align": "top", "width": 230, "x": -122.129, "y": -48, @@ -14583,6 +14826,7 @@ "stroke_width": 0, "text": "Stay with me", "type": "text", + "vertical_align": "middle", "width": 160.516, "x": -38.387, "y": -15, @@ -14631,6 +14875,7 @@ "stroke_width": 0, "text": "\b3000", "type": "text", + "vertical_align": "middle", "width": 180.516, "x": 0, "y": -3.5, @@ -14656,6 +14901,7 @@ "stroke_width": 0, "text": " I LOVE YOU", "type": "text", + "vertical_align": "middle", "width": 110.656, "x": 0, "y": -44.5, @@ -14681,6 +14927,7 @@ "stroke_width": 0, "text": "· 真心为你 ·", "type": "text", + "vertical_align": "middle", "width": 78.875, "x": 0, "y": 49.5, @@ -14729,6 +14976,7 @@ "stroke_width": 5, "text": "Dopamine.", "type": "text", + "vertical_align": "middle", "width": 236.156, "x": 0, "y": 5.9, @@ -14755,6 +15003,7 @@ "stroke_width": 2, "text": "多巴胺\n(de)季节", "type": "text", + "vertical_align": "bottom", "width": 81.453, "x": 0, "y": -19.8, @@ -14781,6 +15030,7 @@ "stroke_width": 0, "text": "CHILL SUMMER DAYS", "type": "text", + "vertical_align": "top", "width": 95.156, "x": 0, "y": 39.4, @@ -14842,6 +15092,7 @@ "stroke_width": 0, "text": "兔年大吉", "type": "text", + "vertical_align": "middle", "width": 201.625, "x": 0, "y": 14.75, @@ -14904,6 +15155,7 @@ "stroke_width": 0, "text": "新\n年", "type": "text", + "vertical_align": "top", "width": 60, "x": -32, "y": -111.283, @@ -14930,6 +15182,7 @@ "stroke_width": 0, "text": "新\n气\n象", "type": "text", + "vertical_align": "top", "width": 50, "x": 34, "y": -43.717, @@ -15000,6 +15253,7 @@ "stroke_width": 0, "text": "新年\n新生活", "type": "text", + "vertical_align": "top", "width": 184.156, "x": 0, "y": -90.75, @@ -15025,6 +15279,7 @@ "stroke_width": 0, "text": "HAPPY CHINESE NEW YEAR", "type": "text", + "vertical_align": "middle", "width": 250.453, "x": 0, "y": 0.25, @@ -15086,6 +15341,7 @@ "stroke_width": 7.595, "text": "新年好", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": 0, @@ -15111,6 +15367,7 @@ "stroke_width": 3.038, "text": "Happy New Year", "type": "text", + "vertical_align": "bottom", "width": 139.877, "x": 0, "y": 50.886, @@ -15184,6 +15441,7 @@ "stroke_width": 0, "text": "满心欢喜", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": -21, @@ -15209,6 +15467,7 @@ "stroke_width": 0, "text": "happy Chinese new year", "type": "text", + "vertical_align": "middle", "width": 151.51, "x": 0, "y": 32.053, @@ -15257,6 +15516,7 @@ "stroke_width": 0, "text": "谨贺新春", "type": "text", + "vertical_align": "top", "width": 254.348, "x": -2.826, "y": 0, @@ -15282,6 +15542,7 @@ "stroke_width": 0, "text": "Happy Chinese New Year", "type": "text", + "vertical_align": "middle", "width": 270.981, "x": 0, "y": 0, @@ -15357,6 +15618,7 @@ "stroke_width": 0, "text": "鲜\n活", "type": "text", + "vertical_align": "bottom", "width": 45, "x": -75.227, "y": 48.6, @@ -15384,6 +15646,7 @@ "stroke_width": 0, "text": "的日常", "type": "text", + "vertical_align": "bottom", "width": 135, "x": 120.227, "y": 47.5, @@ -15445,6 +15708,7 @@ "stroke_width": 0, "text": "白色平安夜", "type": "text", + "vertical_align": "middle", "width": 320, "x": 0, "y": -39.5, @@ -15506,6 +15770,7 @@ "stroke_width": 0, "text": "ChristmaS", "type": "text", + "vertical_align": "middle", "width": 264.063, "x": 0, "y": 10, @@ -15531,6 +15796,7 @@ "stroke_width": 0, "text": "Merry", "type": "text", + "vertical_align": "middle", "width": 156.031, "x": 15, "y": -36, @@ -15593,6 +15859,7 @@ "stroke_width": 0, "text": "上海 秋冬周边好去处", "type": "text", + "vertical_align": "middle", "width": 339.1, "x": -159.1, "y": -5.348, @@ -15656,6 +15923,7 @@ "stroke_width": 0, "text": "CAMPING", "type": "text", + "vertical_align": "bottom", "width": 327.938, "x": -147.938, "y": 24.039, @@ -15683,6 +15951,7 @@ "stroke_width": 0, "text": "秋日露营小记", "type": "text", + "vertical_align": "bottom", "width": 185.138, "x": -20.695, "y": 33.009, @@ -15744,6 +16013,7 @@ "stroke_width": 0, "text": "万圣奇遇记", "type": "text", + "vertical_align": "middle", "width": 307.031, "x": 0, "y": 29.25, @@ -15770,6 +16040,7 @@ "stroke_width": 0, "text": "OCT.31st HALLOWEEN EVE", "type": "text", + "vertical_align": "top", "width": 208.797, "x": 0, "y": 69.25, @@ -15845,6 +16116,7 @@ "stroke_width": 0, "text": "今日", "type": "text", + "vertical_align": "bottom", "width": 82.849, "x": -173.096, "y": -32.795, @@ -15872,6 +16144,7 @@ "stroke_width": 0, "text": "出门去~", "type": "text", + "vertical_align": "bottom", "width": 356.055, "x": -176.055, "y": 32.301, @@ -15898,6 +16171,7 @@ "stroke_width": 0, "text": "宜", "type": "text", + "vertical_align": "bottom", "width": 28.603, "x": -69.534, "y": -38.712, @@ -15925,6 +16199,7 @@ "stroke_width": 0, "text": "戊寅年「虎年」 十月十六日", "type": "text", + "vertical_align": "bottom", "width": 287.014, "x": -169.151, "y": 51.534, @@ -15987,6 +16262,7 @@ "stroke_width": 0, "text": "我来到\n你的城市", "type": "text", + "vertical_align": "middle", "width": 169, "x": -108, "y": 10, @@ -16014,6 +16290,7 @@ "stroke_width": 0, "text": "DATE OF ARRIVED:\n2022 OCT 15th 13:40", "type": "text", + "vertical_align": "bottom", "width": 160, "x": -102.32, "y": -33, @@ -16089,6 +16366,7 @@ "stroke_width": 0, "text": "01", "type": "text", + "vertical_align": "bottom", "width": 20.633, "x": -89.178, "y": -1.093, @@ -16116,6 +16394,7 @@ "stroke_width": 0, "text": "简约法式穿搭\n慵懒随性,很迷人!", "type": "text", + "vertical_align": "bottom", "width": 170.975, "x": -41.254, "y": 13.583, @@ -16190,6 +16469,7 @@ "stroke_width": 0, "text": "DAILY", "type": "text", + "vertical_align": "middle", "width": 359.64, "x": -180, "y": -14.565, @@ -16217,6 +16497,7 @@ "stroke_width": 0, "text": "RECORD", "type": "text", + "vertical_align": "bottom", "width": 359.64, "x": -179.64, "y": 53.047, @@ -16244,6 +16525,7 @@ "stroke_width": 0, "text": "Sep 3rd", "type": "text", + "vertical_align": "bottom", "width": 145.295, "x": -65.848, "y": -40.46, @@ -16317,6 +16599,7 @@ "stroke_width": 0, "text": "秋日特快", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": -2.789, @@ -16342,6 +16625,7 @@ "stroke_width": 0, "text": "AUTUMN EXPRESS", "type": "text", + "vertical_align": "middle", "width": 260.62, "x": 0, "y": 23.07, @@ -16391,6 +16675,7 @@ "stroke_width": 0, "text": "*AUTUMN VLOG*", "type": "text", + "vertical_align": "bottom", "width": 251, "x": 0, "y": 44.807, @@ -16417,6 +16702,7 @@ "stroke_width": 0, "text": "没关系\n秋天来了", "type": "text", + "vertical_align": "bottom", "width": 232, "x": 0, "y": 80.193, @@ -16479,6 +16765,7 @@ "stroke_width": 0, "text": "高级情话", "type": "text", + "vertical_align": "middle", "width": 243, "x": -121.5, "y": -1.5, @@ -16505,6 +16792,7 @@ "stroke_width": 0, "text": "Advanced", "type": "text", + "vertical_align": "bottom", "width": 77.297, "x": -118.5, "y": 42.5, @@ -16531,6 +16819,7 @@ "stroke_width": 0, "text": "You are my one and only", "type": "text", + "vertical_align": "bottom", "width": 118.125, "x": 113.5, "y": -45.5, @@ -16580,6 +16869,7 @@ "stroke_width": 0, "text": "为你坠入", "type": "text", + "vertical_align": "bottom", "width": 144.125, "x": -112, "y": -48.25, @@ -16606,6 +16896,7 @@ "stroke_width": 0, "text": "Love forever", "type": "text", + "vertical_align": "middle", "width": 236, "x": -118, "y": 43.75, @@ -16632,6 +16923,7 @@ "stroke_width": 0, "text": "爱 河", "type": "text", + "vertical_align": "bottom", "width": 123.266, "x": -45, "y": 15.75, @@ -16658,6 +16950,7 @@ "stroke_width": 0, "text": "2022", "type": "text", + "vertical_align": "middle", "width": 32.75, "x": 43, "y": -63.25, @@ -16727,6 +17020,7 @@ "stroke_width": 0, "text": "浪漫降落", "type": "text", + "vertical_align": "middle", "width": 224, "x": 0, "y": -16, @@ -16752,6 +17046,7 @@ "stroke_width": 0, "text": "Love story", "type": "text", + "vertical_align": "middle", "width": 118.391, "x": 3, "y": 24, @@ -16801,6 +17096,7 @@ "stroke_width": 3, "text": "避暑大作战", "type": "text", + "vertical_align": "bottom", "width": 230, "x": 0, "y": 9.39, @@ -16827,6 +17123,7 @@ "stroke_width": 2, "text": "HOT SUMMER©\nAND WAYS TO STAY COOL", "type": "text", + "vertical_align": "top", "width": 154.5, "x": 0, "y": 20.17, @@ -16889,6 +17186,7 @@ "stroke_width": 0, "text": "SUMMER\nVACATION", "type": "text", + "vertical_align": "bottom", "width": 270, "x": 0, "y": 37, @@ -16915,6 +17213,7 @@ "stroke_width": 0, "text": "“暑期生活记录”", "type": "text", + "vertical_align": "top", "width": 176, "x": 0, "y": 50.5, @@ -16964,6 +17263,7 @@ "stroke_width": 0, "text": "(夏日)", "type": "text", + "vertical_align": "middle", "width": 157.156, "x": 21.555, "y": -37, @@ -16990,6 +17290,7 @@ "stroke_width": 0, "text": "摇滚指南", "type": "text", + "vertical_align": "middle", "width": 225.25, "x": -89.648, "y": 37, @@ -17016,6 +17317,7 @@ "stroke_width": 0, "text": "It's time for\n Rock n Roll!", "type": "text", + "vertical_align": "middle", "width": 93.313, "x": 26.32, "y": -30.693, @@ -17078,6 +17380,7 @@ "stroke_width": 0, "text": "我的", "type": "text", + "vertical_align": "bottom", "width": 78.717, "x": -86.154, "y": -12.5, @@ -17103,6 +17406,7 @@ "stroke_width": 0, "text": "平行时空", "type": "text", + "vertical_align": "bottom", "width": 160, "x": 33.021, "y": -12.5, @@ -17128,6 +17432,7 @@ "stroke_width": 0, "text": "Meet another me", "type": "text", + "vertical_align": "bottom", "width": 210.76, "x": -6.154, "y": 7.5, @@ -17176,6 +17481,7 @@ "stroke_width": 0, "text": "新年\n充满热爱", "type": "text", + "vertical_align": "middle", "width": 324, "x": 0, "y": 2.25, @@ -17201,6 +17507,7 @@ "stroke_width": 0, "text": "2022", "type": "text", + "vertical_align": "middle", "width": 191.625, "x": 0, "y": -72.75, @@ -17226,6 +17533,7 @@ "stroke_width": 0, "text": "HAPPY NEW YEAR", "type": "text", + "vertical_align": "middle", "width": 226.109, "x": 0, "y": 81.25, @@ -17288,6 +17596,7 @@ "stroke_width": 0, "text": "别的风格", "type": "text", + "vertical_align": "middle", "width": 268, "x": -158.75, "y": -43, @@ -17314,6 +17623,7 @@ "stroke_width": 0, "text": "Follow Me 加载中...", "type": "text", + "vertical_align": "middle", "width": 263, "x": -158.75, "y": 9, @@ -17340,6 +17650,7 @@ "stroke_width": 0, "text": "//////////////", "type": "text", + "vertical_align": "middle", "width": 259, "x": -158.75, "y": 47, @@ -17388,6 +17699,7 @@ "stroke_width": 0, "text": "AND\nTHEN", "type": "text", + "vertical_align": "middle", "width": 149.297, "x": 0, "y": -52.5, @@ -17413,6 +17725,7 @@ "stroke_width": 0, "text": "WE\nDANCED", "type": "text", + "vertical_align": "middle", "width": 228.391, "x": 0, "y": 52.5, @@ -17461,6 +17774,7 @@ "stroke_width": 0, "text": "CALL ME", "type": "text", + "vertical_align": "middle", "width": 147.688, "x": -73.645, "y": -51.755, @@ -17486,6 +17800,7 @@ "stroke_width": 0, "text": "BY YOUR", "type": "text", + "vertical_align": "middle", "width": 164.031, "x": -14.645, "y": -15.755, @@ -17511,6 +17826,7 @@ "stroke_width": 0, "text": "NAME", "type": "text", + "vertical_align": "middle", "width": 196.938, "x": 46.355, "y": 30.245, @@ -17536,6 +17852,7 @@ "stroke_width": 0, "text": "As all things are filled\nwith my soul", "type": "text", + "vertical_align": "bottom", "width": 77.656, "x": -93.645, "y": 43.245, @@ -17584,6 +17901,7 @@ "stroke_width": 0, "text": "做一个\n热血", "type": "text", + "vertical_align": "middle", "width": 152, "x": 0, "y": -46.5, @@ -17609,6 +17927,7 @@ "stroke_width": 0, "text": "笨蛋", "type": "text", + "vertical_align": "middle", "width": 189, "x": 0, "y": 49.5, @@ -17657,6 +17976,7 @@ "stroke_width": 2, "text": "我知道答案", "type": "text", + "vertical_align": "middle", "width": 254, "x": 0, "y": -14.75, @@ -17682,6 +18002,7 @@ "stroke_width": 0, "text": "I know the answer", "type": "text", + "vertical_align": "middle", "width": 230.578, "x": 0, "y": 28.25, @@ -17743,6 +18064,7 @@ "stroke_width": 0, "text": "人生浪费指南", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": 0, @@ -17770,6 +18092,7 @@ "stroke_width": 0, "text": "Travel Vlog", "type": "text", + "vertical_align": "top", "width": 102.895, "x": 51.697, "y": -43.238, @@ -17831,6 +18154,7 @@ "stroke_width": 0, "text": "Daily\nVlog", "type": "text", + "vertical_align": "top", "width": 109.248, "x": 0.512, "y": -61.929, @@ -17856,6 +18180,7 @@ "stroke_width": 0, "text": "2021.11.25.WED", "type": "text", + "vertical_align": "top", "width": 73.301, "x": 15.866, "y": -5.118, @@ -17919,6 +18244,7 @@ "stroke_width": 0, "text": "阳光\n正好", "type": "text", + "vertical_align": "middle", "width": 93.188, "x": -122.75, "y": -58.875, @@ -17945,6 +18271,7 @@ "stroke_width": 0, "text": "05.01", "type": "text", + "vertical_align": "bottom", "width": 117.906, "x": 4.844, "y": 35.125, @@ -18006,6 +18333,7 @@ "stroke_width": 0, "text": "今日宜饮", "type": "text", + "vertical_align": "middle", "width": 145.911, "x": 0, "y": -73.731, @@ -18031,6 +18359,7 @@ "stroke_width": 0, "text": "COFFEE", "type": "text", + "vertical_align": "middle", "width": 150.215, "x": 0, "y": 35.701, @@ -18106,6 +18435,7 @@ "stroke_width": 0, "text": "周末", "type": "text", + "vertical_align": "bottom", "width": 121, "x": -70, "y": -87.009, @@ -18133,6 +18463,7 @@ "stroke_width": 0, "text": "招待所", "type": "text", + "vertical_align": "bottom", "width": 179, "x": -72, "y": 40.991, @@ -18160,6 +18491,7 @@ "stroke_width": 0, "text": "Weekend\nRecord Vol.01", "type": "text", + "vertical_align": "bottom", "width": 143.172, "x": -69, "y": -19.009, @@ -18234,6 +18566,7 @@ "stroke_width": 2, "text": "假日穿搭", "type": "text", + "vertical_align": "bottom", "width": 249.875, "x": -95.688, "y": -17.5, @@ -18259,6 +18592,7 @@ "stroke_width": 0, "text": "OOTD", "type": "text", + "vertical_align": "bottom", "width": 50.453, "x": -119.688, "y": -4.5, @@ -18285,6 +18619,7 @@ "stroke_width": 0, "text": "Holiday", "type": "text", + "vertical_align": "bottom", "width": 85.016, "x": 52.313, "y": 34.5, @@ -18366,6 +18701,7 @@ "stroke_width": 0, "text": "ShangHai", "type": "text", + "vertical_align": "bottom", "width": 239.226, "x": 0, "y": -105.394, @@ -18391,6 +18727,7 @@ "stroke_width": 0, "text": "上海", "type": "text", + "vertical_align": "middle", "width": 99.243, "x": 0, "y": -46.546, @@ -18416,6 +18753,7 @@ "stroke_width": 0, "text": "2022", "type": "text", + "vertical_align": "middle", "width": 118.415, "x": 0, "y": 5.126, @@ -18441,6 +18779,7 @@ "stroke_width": 0, "text": "漫步中", "type": "text", + "vertical_align": "middle", "width": 149.274, "x": 0, "y": 66.845, @@ -18503,6 +18842,7 @@ "stroke_width": 0, "text": "城市", "type": "text", + "vertical_align": "bottom", "width": 142, "x": -138, "y": -37.75, @@ -18528,6 +18868,7 @@ "stroke_width": 0, "text": "2022", "type": "text", + "vertical_align": "bottom", "width": 73.863, "x": 73, "y": -37.75, @@ -18554,6 +18895,7 @@ "stroke_width": 0, "text": "遊行", "type": "text", + "vertical_align": "bottom", "width": 142, "x": -4.64, "y": 37.25, @@ -18580,6 +18922,7 @@ "stroke_width": 0, "text": "City trip", "type": "text", + "vertical_align": "bottom", "width": 160.875, "x": -130, "y": 44.25, @@ -18654,6 +18997,7 @@ "stroke_width": 0, "text": "Sum", "type": "text", + "vertical_align": "bottom", "width": 135.448, "x": -124.138, "y": -29.602, @@ -18680,6 +19024,7 @@ "stroke_width": 0, "text": "mer", "type": "text", + "vertical_align": "bottom", "width": 86.897, "x": 11.966, "y": -32.467, @@ -18706,6 +19051,7 @@ "stroke_width": 0, "text": "出发吧,就现在", "type": "text", + "vertical_align": "bottom", "width": 227.268, "x": -122.228, "y": 23.873, @@ -18798,6 +19144,7 @@ "stroke_width": 0, "text": "SHARE MY LIFE", "type": "text", + "vertical_align": "middle", "width": 269.203, "x": -146, "y": -63.5, @@ -18824,6 +19171,7 @@ "stroke_width": 0, "text": "今日分享", "type": "text", + "vertical_align": "middle", "width": 284, "x": -146, "y": 40.5, @@ -18886,6 +19234,7 @@ "stroke_width": 0, "text": "平凡", "type": "text", + "vertical_align": "bottom", "width": 98.085, "x": -86.667, "y": -76.818, @@ -18912,6 +19261,7 @@ "stroke_width": 0, "text": "的", "type": "text", + "vertical_align": "bottom", "width": 49.042, "x": -86.667, "y": 0, @@ -18938,6 +19288,7 @@ "stroke_width": 0, "text": "日常", "type": "text", + "vertical_align": "bottom", "width": 98.085, "x": -86.667, "y": 80.758, @@ -18964,6 +19315,7 @@ "stroke_width": 0, "text": "2022.0208\nRECORD DAILY", "type": "text", + "vertical_align": "bottom", "width": 146.542, "x": -24.621, "y": 0, @@ -19025,6 +19377,7 @@ "stroke_width": 0, "text": "本周穿搭指南", "type": "text", + "vertical_align": "bottom", "width": 358.216, "x": 0.892, "y": -18.863, @@ -19050,6 +19403,7 @@ "stroke_width": 0, "text": "This week's dressing guide, \nto provide you with new dressing inspiration", "type": "text", + "vertical_align": "bottom", "width": 202.763, "x": -40.704, "y": 35.308, @@ -19111,6 +19465,7 @@ "stroke_width": 0, "text": "0208", "type": "text", + "vertical_align": "middle", "width": 54.281, "x": -152.859, "y": -25.636, @@ -19136,6 +19491,7 @@ "stroke_width": 0, "text": "0216", "type": "text", + "vertical_align": "middle", "width": 56.348, "x": -149.984, "y": 26.115, @@ -19162,6 +19518,7 @@ "stroke_width": 0, "text": "vlo.1", "type": "text", + "vertical_align": "middle", "width": 83.241, "x": -102.067, "y": -24.677, @@ -19188,6 +19545,7 @@ "stroke_width": 0, "text": "Roomtour", "type": "text", + "vertical_align": "middle", "width": 280.151, "x": -100.151, "y": 16.531, @@ -19249,6 +19607,7 @@ "stroke_width": 0, "text": "在路上,\n奔赴下一场", "type": "text", + "vertical_align": "bottom", "width": 317.813, "x": 0, "y": -9, @@ -19274,6 +19633,7 @@ "stroke_width": 0, "text": "Always on the road, go forward bravely", "type": "text", + "vertical_align": "middle", "width": 182.984, "x": 0, "y": 71, @@ -19336,6 +19696,7 @@ "stroke_width": 0, "text": "CHUNGKING", "type": "text", + "vertical_align": "middle", "width": 307.969, "x": -153.5, "y": -34, @@ -19362,6 +19723,7 @@ "stroke_width": 0, "text": "重庆森林", "type": "text", + "vertical_align": "middle", "width": 300, "x": -141.5, "y": 20, @@ -19423,6 +19785,7 @@ "stroke_width": 0, "text": "Romantic", "type": "text", + "vertical_align": "middle", "width": 317.859, "x": 0, "y": 13, @@ -19448,6 +19811,7 @@ "stroke_width": 0, "text": "100% collection", "type": "text", + "vertical_align": "middle", "width": 184.344, "x": 0, "y": 72, @@ -19510,6 +19874,7 @@ "stroke_width": 0, "text": "冬日记事", "type": "text", + "vertical_align": "bottom", "width": 280, "x": -119.25, "y": -12, @@ -19535,6 +19900,7 @@ "stroke_width": 0, "text": "winter diary", "type": "text", + "vertical_align": "bottom", "width": 248.772, "x": 20.75, "y": 7, @@ -19608,6 +19974,7 @@ "stroke_width": 0, "text": "新年好物", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": 34.231, @@ -19656,6 +20023,7 @@ "stroke_width": 7.941, "text": "新年好", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": -10.853, @@ -19681,6 +20049,7 @@ "stroke_width": 1.059, "text": "新年好", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": -10.853, @@ -19706,6 +20075,7 @@ "stroke_width": 5.294, "text": "Happy New Year", "type": "text", + "vertical_align": "middle", "width": 132.353, "x": 0, "y": 24.618, @@ -19731,6 +20101,7 @@ "stroke_width": 0.529, "text": "Happy New Year", "type": "text", + "vertical_align": "middle", "width": 132.353, "x": 0, "y": 24.618, @@ -19812,6 +20183,7 @@ "stroke_width": 0, "text": "2024", "type": "text", + "vertical_align": "middle", "width": 40.242, "x": 0, "y": -43.13, @@ -19837,6 +20209,7 @@ "stroke_width": 0, "text": "新年新气象", "type": "text", + "vertical_align": "middle", "width": 230, "x": 0, "y": -3.45, @@ -19898,6 +20271,7 @@ "stroke_width": 0, "text": "目的地 收录", "type": "text", + "vertical_align": "middle", "width": 197.594, "x": 0, "y": -14.5, @@ -19924,6 +20298,7 @@ "stroke_width": 0, "text": "“甘孜·新都桥”", "type": "text", + "vertical_align": "top", "width": 126.828, "x": 0, "y": 26.5, @@ -19995,6 +20370,7 @@ "stroke_width": 0, "text": "Deliclous dishes sharing.", "type": "text", + "vertical_align": "bottom", "width": 318.072, "x": -138.072, "y": 10.715, @@ -20066,6 +20442,7 @@ "stroke_width": 0, "text": "假日皇冠。", "type": "text", + "vertical_align": "top", "width": 263.308, "x": -83.308, "y": -43.255, @@ -20093,6 +20470,7 @@ "stroke_width": 0, "text": "火山温泉。", "type": "text", + "vertical_align": "bottom", "width": 263.308, "x": -84.209, "y": -2.465, @@ -20120,6 +20498,7 @@ "stroke_width": 0, "text": "专车接送。", "type": "text", + "vertical_align": "bottom", "width": 263.308, "x": -84.218, "y": 22.798, @@ -20147,6 +20526,7 @@ "stroke_width": 0, "text": "注意安全。", "type": "text", + "vertical_align": "bottom", "width": 263.308, "x": -84.174, "y": 48.048, @@ -20210,6 +20590,7 @@ "stroke_width": 0, "text": "爬坡60MIN(坡度10/配速5)", "type": "text", + "vertical_align": "bottom", "width": 287.986, "x": -107.986, "y": -2.165, @@ -20237,6 +20618,7 @@ "stroke_width": 0, "text": "全身拉伸15MIN", "type": "text", + "vertical_align": "bottom", "width": 287.986, "x": -108.421, "y": 19.207, @@ -20300,6 +20682,7 @@ "stroke_width": 0, "text": "中:鸡丝荞麦面", "type": "text", + "vertical_align": "bottom", "width": 281.947, "x": -101.947, "y": 21.124, @@ -20327,6 +20710,7 @@ "stroke_width": 0, "text": "早:酸奶碗", "type": "text", + "vertical_align": "bottom", "width": 281.947, "x": -102.454, "y": -4.362, @@ -20354,6 +20738,7 @@ "stroke_width": 0, "text": "贝贝南瓜 鸡蛋", "type": "text", + "vertical_align": "bottom", "width": 281.947, "x": -102.529, "y": 73.168, @@ -20381,6 +20766,7 @@ "stroke_width": 0, "text": "运动后加餐:电解质水 番茄", "type": "text", + "vertical_align": "bottom", "width": 281.947, "x": -102.458, "y": 46.842, @@ -20452,6 +20838,7 @@ "stroke_width": 0, "text": "SUN, \nSEP\n26TH", "type": "text", + "vertical_align": "bottom", "width": 217.273, "x": -110.773, "y": -19.052, @@ -20479,6 +20866,7 @@ "stroke_width": 0, "text": "TOM FORD 3292-5", "type": "text", + "vertical_align": "bottom", "width": 161.799, "x": -50.045, "y": 19.117, @@ -20506,6 +20894,7 @@ "stroke_width": 0, "text": "Ralph Lauren", "type": "text", + "vertical_align": "bottom", "width": 161.799, "x": -50.683, "y": 41.524, @@ -20533,6 +20922,7 @@ "stroke_width": 0, "text": "Mingma", "type": "text", + "vertical_align": "bottom", "width": 161.799, "x": -50.575, "y": 63.595, @@ -20560,6 +20950,7 @@ "stroke_width": 0, "text": "Coup De Foudre", "type": "text", + "vertical_align": "bottom", "width": 161.799, "x": -50.851, "y": 85.204, @@ -20587,6 +20978,7 @@ "stroke_width": 0, "text": "Umawang", "type": "text", + "vertical_align": "bottom", "width": 161.799, "x": -50.087, "y": 106.94, @@ -20614,6 +21006,7 @@ "stroke_width": 0, "text": "Chanel", "type": "text", + "vertical_align": "bottom", "width": 161.799, "x": -50.173, "y": 128.296, @@ -20675,6 +21068,7 @@ "stroke_width": 0, "text": "猪手竹升面", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": -3.913, @@ -20723,6 +21117,7 @@ "stroke_width": 0, "text": "outdoor sport", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": -0.861, @@ -20748,6 +21143,7 @@ "stroke_width": 0, "text": "户外计划", "type": "text", + "vertical_align": "middle", "width": 180.94, "x": 0, "y": 56.085, @@ -20773,6 +21169,7 @@ "stroke_width": 0, "text": "In MY LIFE", "type": "text", + "vertical_align": "middle", "width": 171.066, "x": 0, "y": -30.769, @@ -20835,6 +21232,7 @@ "stroke_width": 0, "text": "绿茵场 展真我", "type": "text", + "vertical_align": "middle", "width": 187.5, "x": -120, "y": -16, @@ -20861,6 +21259,7 @@ "stroke_width": 0, "text": "世界杯 齐喝彩", "type": "text", + "vertical_align": "middle", "width": 187.5, "x": 120, "y": 16, @@ -20910,6 +21309,7 @@ "stroke_width": 1, "text": "小狗", "type": "text", + "vertical_align": "middle", "width": 196.625, "x": 16.984, "y": 0, @@ -20936,6 +21336,7 @@ "stroke_width": 1, "text": "是家庭成员", "type": "text", + "vertical_align": "middle", "width": 159.375, "x": 18.491, "y": 1.506, @@ -20962,6 +21363,7 @@ "stroke_width": 1, "text": "My lovely baby*!#%", "type": "text", + "vertical_align": "middle", "width": 160, "x": 19.641, "y": 36, @@ -21024,6 +21426,7 @@ "stroke_width": 0, "text": "歌曲名称", "type": "text", + "vertical_align": "middle", "width": 200, "x": -90, "y": -37, @@ -21051,6 +21454,7 @@ "stroke_width": 0, "text": "歌手名", "type": "text", + "vertical_align": "bottom", "width": 200, "x": -89, "y": -13, @@ -21135,6 +21539,7 @@ "stroke_width": 0, "text": "让我看看", "type": "text", + "vertical_align": "middle", "width": 147, "x": -146.5, "y": -61.75, @@ -21161,6 +21566,7 @@ "stroke_width": 0, "text": "大家的评论", "type": "text", + "vertical_align": "top", "width": 329, "x": -161.5, "y": 17.25, @@ -21188,6 +21594,7 @@ "stroke_width": 0, "text": "今日分享", "type": "text", + "vertical_align": "top", "width": 299, "x": -161.5, "y": 95.25, @@ -21237,6 +21644,7 @@ "stroke_width": 5, "text": "求推荐", "type": "text", + "vertical_align": "bottom", "width": 219, "x": 0, "y": 11.5, @@ -21263,6 +21671,7 @@ "stroke_width": 4, "text": "IN NEED OF\nSOME GOOD ADVICE", "type": "text", + "vertical_align": "top", "width": 191.938, "x": 0, "y": 28.5, @@ -21311,6 +21720,7 @@ "stroke_width": 0, "text": "爱", "type": "text", + "vertical_align": "bottom", "width": 50, "x": 0, "y": 0, @@ -21336,6 +21746,7 @@ "stroke_width": 0, "text": "我", "type": "text", + "vertical_align": "bottom", "width": 50, "x": -50, "y": 0, @@ -21361,6 +21772,7 @@ "stroke_width": 0, "text": "你", "type": "text", + "vertical_align": "bottom", "width": 50, "x": 50, "y": 0, @@ -21422,6 +21834,7 @@ "stroke_width": 0, "text": "不给糖就捣蛋", "type": "text", + "vertical_align": "middle", "width": 360, "x": 0, "y": 1.554, @@ -21448,6 +21861,7 @@ "stroke_width": 0, "text": "WISH YOU ALL HAVE\nA FANTASTIC NOV.1ST HALLOWEEN", "type": "text", + "vertical_align": "top", "width": 202.397, "x": 0, "y": 38.773, @@ -21497,6 +21911,7 @@ "stroke_width": 0, "text": "我在此处\n惬意悠游,盎然恣意", "type": "text", + "vertical_align": "bottom", "width": 360, "x": 0, "y": 3.75, @@ -21523,6 +21938,7 @@ "stroke_width": 0, "text": "一起去看看这个世界吧\n现在就出发", "type": "text", + "vertical_align": "top", "width": 230, "x": 0, "y": 33.25, @@ -21585,6 +22001,7 @@ "stroke_width": 0, "text": "名古屋", "type": "text", + "vertical_align": "bottom", "width": 127.598, "x": -124.2, "y": 0, @@ -21611,6 +22028,7 @@ "stroke_width": 0, "text": "马拉松!", "type": "text", + "vertical_align": "middle", "width": 173.829, "x": 6.171, "y": 0, @@ -21659,6 +22077,7 @@ "stroke_width": 0, "text": "BEIJING", "type": "text", + "vertical_align": "middle", "width": 240, "x": 0, "y": -41.307, @@ -21684,6 +22103,7 @@ "stroke_width": 0, "text": "09:45", "type": "text", + "vertical_align": "middle", "width": 122.607, "x": 0, "y": 46.307, @@ -21709,6 +22129,7 @@ "stroke_width": 0, "text": "10月3日", "type": "text", + "vertical_align": "bottom", "width": 60, "x": 0, "y": 5.307, @@ -21790,6 +22211,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 180, "x": 0, "y": -13.5, @@ -21859,6 +22281,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "bottom", "width": 270.712, "x": 15.174, "y": 0, @@ -21928,6 +22351,7 @@ "stroke_width": 0, "text": "", "type": "text", + "vertical_align": "bottom", "width": 1, "x": 4, "y": 11, @@ -21997,6 +22421,7 @@ "stroke_width": 0, "text": "自定义标111111", "type": "text", + "vertical_align": "bottom", "width": 170.219, "x": 0, "y": -6, @@ -22066,6 +22491,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 130, "x": 4, "y": 0, @@ -22135,6 +22561,7 @@ "stroke_width": 0, "text": "City Walk ", "type": "text", + "vertical_align": "bottom", "width": 127.197, "x": -25.754, "y": -3.246, @@ -22204,6 +22631,7 @@ "stroke_width": 0, "text": "自", "type": "text", + "vertical_align": "bottom", "width": 36.125, "x": 4, "y": 0, @@ -22265,6 +22693,7 @@ "stroke_width": 1, "text": "自定义标签", "type": "text", + "vertical_align": "bottom", "width": 152.172, "x": 0, "y": -16, @@ -22334,6 +22763,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 140, "x": 18, "y": -10, @@ -22403,6 +22833,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 135, "x": 0, "y": 0, @@ -22472,6 +22903,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 165, "x": 0, "y": 0, @@ -22541,6 +22973,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "bottom", "width": 120, "x": 0, "y": 0, @@ -22602,6 +23035,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 185, "x": 0, "y": 0, @@ -22671,6 +23105,7 @@ "stroke_width": 0, "text": "#自定义标签", "type": "text", + "vertical_align": "middle", "width": 170.578, "x": 0, "y": 18, @@ -22752,6 +23187,7 @@ "stroke_width": 0, "text": "👀自定义标签", "type": "text", + "vertical_align": "bottom", "width": 166, "x": 0, "y": -10.25, @@ -22821,6 +23257,7 @@ "stroke_width": 0, "text": "(自定义)标签", "type": "text", + "vertical_align": "middle", "width": 161, "x": 0, "y": 0, @@ -22890,6 +23327,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 120, "x": 21, "y": 0, @@ -22959,6 +23397,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 143.375, "x": 0, "y": -15, @@ -23020,6 +23459,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 180, "x": -20, "y": 1, @@ -23089,6 +23529,7 @@ "stroke_width": 0, "text": "111111111111111111111", "type": "text", + "vertical_align": "bottom", "width": 299.206, "x": 8.444, "y": 0, @@ -23150,6 +23591,7 @@ "stroke_width": 0, "text": "¥13.50", "type": "text", + "vertical_align": "middle", "width": 227.688, "x": -0.146, "y": 1, @@ -23211,6 +23653,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 140, "x": -16, "y": 12, @@ -23272,6 +23715,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 230, "x": 15.5, "y": -7, @@ -23341,6 +23785,7 @@ "stroke_width": 0, "text": "新青年体", "type": "text", + "vertical_align": "bottom", "width": 127.813, "x": 0, "y": 0, @@ -23410,6 +23855,7 @@ "stroke_width": 0, "text": "自11111111111111", "type": "text", + "vertical_align": "bottom", "width": 192.844, "x": -1, "y": -6, @@ -23479,6 +23925,7 @@ "stroke_width": 1, "text": "自定12345", "type": "text", + "vertical_align": "bottom", "width": 182.578, "x": -3, "y": 23, @@ -23548,6 +23995,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "bottom", "width": 154, "x": -13, "y": 0, @@ -23617,6 +24065,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "bottom", "width": 126.031, "x": -46, "y": 0, @@ -23678,6 +24127,7 @@ "stroke_width": 1, "text": "自定义标签", "type": "text", + "vertical_align": "bottom", "width": 148.172, "x": 0, "y": -6, @@ -23747,6 +24197,7 @@ "stroke_width": 0, "text": "Group", "type": "text", + "vertical_align": "bottom", "width": 87.141, "x": 4, "y": -4, @@ -23816,6 +24267,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "bottom", "width": 149, "x": 9, "y": 7, @@ -23885,6 +24337,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 200, "x": 53, "y": -28, @@ -23954,6 +24407,7 @@ "stroke_width": 0.34, "text": "自自定义标签自定义标签自定义标签", "type": "text", + "vertical_align": "bottom", "width": 310.979, "x": 8.17, "y": 0, @@ -24023,6 +24477,7 @@ "stroke_width": 0, "text": "松然体", "type": "text", + "vertical_align": "bottom", "width": 75, "x": 12, "y": 0, @@ -24092,6 +24547,7 @@ "stroke_width": 0, "text": "自", "type": "text", + "vertical_align": "bottom", "width": 30, "x": 9, "y": 0, @@ -24161,6 +24617,7 @@ "stroke_width": 2, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 201.813, "x": 0, "y": 0, @@ -24242,6 +24699,7 @@ "stroke_width": 0, "text": "新年标签", "type": "text", + "vertical_align": "middle", "width": 135.813, "x": 29.5, "y": 0, @@ -24311,6 +24769,7 @@ "stroke_width": 0, "text": "新年标签", "type": "text", + "vertical_align": "middle", "width": 148, "x": 5, "y": -3, @@ -24380,6 +24839,7 @@ "stroke_width": 0, "text": "498", "type": "text", + "vertical_align": "middle", "width": 132.453, "x": -61, "y": 23, @@ -24449,6 +24909,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "bottom", "width": 180, "x": 0, "y": -9, @@ -24518,6 +24979,7 @@ "stroke_width": 3, "text": "自定义标签", "type": "text", + "vertical_align": "bottom", "width": 180, "x": 0, "y": -9, @@ -24587,6 +25049,7 @@ "stroke_width": 0, "text": "新年标签", "type": "text", + "vertical_align": "bottom", "width": 182, "x": 0, "y": -13, @@ -24648,6 +25111,7 @@ "stroke_width": 0, "text": "新年标签", "type": "text", + "vertical_align": "middle", "width": 200, "x": 30, "y": 0, @@ -24717,6 +25181,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 250, "x": 0, "y": -15, @@ -24786,6 +25251,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 227.273, "x": -20.909, "y": 0, @@ -24855,6 +25321,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "bottom", "width": 200, "x": 50, "y": -3, @@ -24924,6 +25391,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 200, "x": 20, "y": 3, @@ -24993,6 +25461,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 135, "x": 0, "y": 0, @@ -25062,6 +25531,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "middle", "width": 135, "x": 0, "y": 0, @@ -25131,6 +25601,7 @@ "stroke_width": 0, "text": "自定义标签", "type": "text", + "vertical_align": "bottom", "width": 140, "x": 18, "y": -10, @@ -25200,6 +25671,7 @@ "stroke_width": 2, "text": "自1111111111111", "type": "text", + "vertical_align": "bottom", "width": 226.328, "x": -12, "y": -6, @@ -25261,6 +25733,7 @@ "stroke_width": 0.3, "text": "碎片回忆录", "type": "text", + "vertical_align": "bottom", "width": 302, "x": 15.896, "y": 0, @@ -25286,6 +25759,7 @@ "stroke_width": 0.3, "text": "碎片回忆录", "type": "text", + "vertical_align": "bottom", "width": 302, "x": 15.896, "y": 0, @@ -25347,6 +25821,7 @@ "stroke_width": 0, "text": "秋天的信笺收到就好", "type": "text", + "vertical_align": "bottom", "width": 240, "x": 0, "y": -8.864, @@ -25395,6 +25870,7 @@ "stroke_width": 0.226, "text": "返航时\n海鸟追着船盘旋", "type": "text", + "vertical_align": "top", "width": 74.97, "x": 0, "y": 0, @@ -25455,6 +25931,7 @@ "stroke_width": 0, "text": "下段旅程,幸福丰盛。", "type": "text", + "vertical_align": "bottom", "width": 240, "x": 0, "y": -7.959, @@ -25503,6 +25980,7 @@ "stroke_width": 0, "text": "见信好,我们会在春天相见的。", "type": "text", + "vertical_align": "bottom", "width": 360, "x": 0, "y": 0, @@ -25575,6 +26053,7 @@ "stroke_width": 0.35, "text": "万物回春", "type": "text", + "vertical_align": "bottom", "width": 198, "x": 0, "y": -1.225, @@ -25623,6 +26102,7 @@ "stroke_width": 0, "text": "周而复始。", "type": "text", + "vertical_align": "bottom", "width": 192, "x": 0, "y": 0, @@ -25695,6 +26175,7 @@ "stroke_width": 0, "text": "周五愉快", "type": "text", + "vertical_align": "bottom", "width": 176, "x": -12.609, "y": -0.75, @@ -25743,6 +26224,7 @@ "stroke_width": 0.5, "text": "冬天", "type": "text", + "vertical_align": "bottom", "width": 100, "x": 0, "y": 0, @@ -25803,6 +26285,7 @@ "stroke_width": 0, "text": "风的旋律", "type": "text", + "vertical_align": "bottom", "width": 153, "x": -16.705, "y": -17.45, @@ -25864,6 +26347,7 @@ "stroke_width": 0.5, "text": "我会在你左右", "type": "text", + "vertical_align": "bottom", "width": 240, "x": 23.75, "y": -0.905, @@ -25912,6 +26396,7 @@ "stroke_width": 0, "text": "周末小记", "type": "text", + "vertical_align": "bottom", "width": 153.558, "x": 0, "y": 0, @@ -25959,6 +26444,7 @@ "stroke_width": 0.093, "text": "snowy Platform", "type": "text", + "vertical_align": "bottom", "width": 360, "x": 0, "y": 0, @@ -26031,6 +26517,7 @@ "stroke_width": 0.6, "text": "春醒万物生", "type": "text", + "vertical_align": "bottom", "width": 234.375, "x": 0.5, "y": 0.5, @@ -26079,6 +26566,7 @@ "stroke_width": 2.8, "text": "分享日常。", "type": "text", + "vertical_align": "bottom", "width": 200, "x": 0, "y": 0, @@ -26126,6 +26614,7 @@ "stroke_width": 0.5, "text": "冬天", "type": "text", + "vertical_align": "bottom", "width": 100, "x": 0, "y": 0, @@ -26186,6 +26675,7 @@ "stroke_width": 0, "text": "待办备忘录", "type": "text", + "vertical_align": "bottom", "width": 191, "x": 0, "y": -11.375, diff --git a/apps/web/src/text-assets.ts b/apps/web/src/text-assets.ts index 7cb811e..d0c4dc6 100644 --- a/apps/web/src/text-assets.ts +++ b/apps/web/src/text-assets.ts @@ -8,6 +8,7 @@ type CanvasElement = CanvasState["elements"][number]; export type TextTemplateCategory = "flower" | "simple" | "tag" | "title"; export type TextAlign = "center" | "left" | "right"; +export type TextVerticalAlign = "bottom" | "middle" | "top"; export interface TextTemplateImageLayer { alpha: number; @@ -70,6 +71,7 @@ export interface TextTemplateTextLayer { strokeColor: string; strokeWidth: number; text: string; + verticalAlign: TextVerticalAlign; width: number; x: number; y: number; @@ -157,7 +159,7 @@ interface RawTextLayer { alpha?: number; align: string; anchor_x?: number; anchor_y?: number; editable: boolean; fill_color: string; fill_pattern_asset_id?: string; font_id: string; font_size: number; height: number; letter_spacing: number; line_height: number; order: number; rotation: number; scale_x: number; scale_y: number; shadow_blur: number; shadow_color: string; shadow_offset_x: number; shadow_offset_y: number; stroke_color: string; - stroke_width: number; text: string; width: number; x: number; y: number; + stroke_width: number; text: string; vertical_align: TextVerticalAlign; width: number; x: number; y: number; } function renderModel(item: (typeof complexAssetCatalog.text_templates)[number]): TextTemplateRenderModel { @@ -180,7 +182,7 @@ function renderModel(item: (typeof complexAssetCatalog.text_templates)[number]): scaleY: layer.scale_y, shadowBlur: layer.shadow_blur, shadowColor: layer.shadow_color, shadowOffsetX: layer.shadow_offset_x, shadowOffsetY: layer.shadow_offset_y, strokeColor: layer.stroke_color, strokeWidth: layer.stroke_width, text: layer.text, - width: layer.width, x: layer.x, y: layer.y, + verticalAlign: layer.vertical_align, width: layer.width, x: layer.x, y: layer.y, }; }), }; diff --git a/scripts/lib/text-template-assets.mjs b/scripts/lib/text-template-assets.mjs index 65a1041..d6a4a04 100644 --- a/scripts/lib/text-template-assets.mjs +++ b/scripts/lib/text-template-assets.mjs @@ -518,6 +518,9 @@ function prefabLayers(prefab, input) { stroke_width: Math.max(0, Number(outline?.outlineSize ?? 0)), text: String(textMesh.m_text ?? ""), type: "text", + vertical_align: Number(style.vAlignment ?? 1) === 0 ? "top" + : Number(style.vAlignment ?? 1) === 2 ? "bottom" + : "middle", width: Math.max(1, Number(object.m_contentSize?.width ?? 1) * Math.abs(scaleX)), x: transform.x, y: -transform.y, @@ -762,6 +765,7 @@ export function compileTextTemplateAssets({ templateDirectory, templateId }) { stroke_width: 0, text: value, type: "text", + vertical_align: "middle", width: Math.max(96, Array.from(value).length * 52), x: 0, y: 0, diff --git a/tests/unit/postv1-all-assets.test.ts b/tests/unit/postv1-all-assets.test.ts index a24c620..292f2b8 100644 --- a/tests/unit/postv1-all-assets.test.ts +++ b/tests/unit/postv1-all-assets.test.ts @@ -5,7 +5,7 @@ import { P0A_DYNAMIC_STICKERS } from "../../apps/web/src/dynamic-provider.js"; import { DYNAMIC_RENDER_MODELS } from "../../apps/web/src/dynamic-render-models.js"; import { P0A_COLOR_CARDS } from "../../apps/web/src/palette-provider.js"; import { P0A_FONT_OPTIONS, P0A_TEXT_TEMPLATES } from "../../apps/web/src/text-assets.js"; -import { ninePatchSlices } from "../../apps/web/src/editor-stage.js"; +import { ninePatchSlices, textTemplateBoxLayout } from "../../apps/web/src/editor-stage.js"; import { P0A_COLOR_CARD_IDS, P0A_DYNAMIC_STICKER_IDS, @@ -96,6 +96,12 @@ describe("POSTV1-ASSET-ALL-16 complete asset catalog", () => { ])); expect(byId.get("H079")!.render_model.text_layers.slice(0, 3).every((layer) => Math.abs(layer.rotation + 10) < 0.001)).toBe(true); expect(byId.get("H005")!.render_model.text_layers[1]).toMatchObject({ anchor_y: 0 }); + expect(byId.get("H005")!.render_model.text_layers[0]).toMatchObject({ vertical_align: "middle" }); + expect(byId.get("H005")!.render_model.text_layers[1]).toMatchObject({ vertical_align: "top" }); + + const heading016Text = byId.get("H016")!.render_model.text_layers; + expect(heading016Text).toHaveLength(3); + expect(heading016Text.every((layer) => layer.vertical_align === "bottom")).toBe(true); const heading041 = byId.get("H041")!; const heading041Text = heading041.render_model.text_layers[0]!; @@ -105,6 +111,32 @@ describe("POSTV1-ASSET-ALL-16 complete asset catalog", () => { expect(byId.get("FLOWER024")!.render_model.image_layers[0]).toMatchObject({ alpha: 0.4000000059604645 }); }); + it("positions template text inside the captured fixed box instead of its measured glyph width", () => { + const shortText = textTemplateBoxLayout({ + align: "center", anchorX: 0, anchorY: 1, boxHeight: 70, boxWidth: 517, + fontSize: 70, lineCount: 1, lineHeight: 1, verticalAlign: "bottom", + }); + const longText = textTemplateBoxLayout({ + align: "center", anchorX: 0, anchorY: 1, boxHeight: 70, boxWidth: 517, + fontSize: 70, lineCount: 1, lineHeight: 1, verticalAlign: "bottom", + }); + + expect(shortText.x).toBe(258.5); + expect(longText.x).toBe(shortText.x); + expect(shortText.firstY).toBe(-35); + }); + + it("honors source top, middle, and bottom vertical alignment inside fixed text boxes", () => { + const layout = (verticalAlign: "top" | "middle" | "bottom") => textTemplateBoxLayout({ + align: "left", anchorX: 0, anchorY: 0, boxHeight: 120, boxWidth: 200, + fontSize: 40, lineCount: 1, lineHeight: 1, verticalAlign, + }); + + expect(layout("top").firstY).toBe(20); + expect(layout("middle").firstY).toBe(60); + expect(layout("bottom").firstY).toBe(100); + }); + it("preserves nine-patch edges while stretching only the decoration center", () => { const slices = ninePatchSlices(231, 63, { bottom: 16, left: 53, right: 25, sourceHeight: 63, sourceWidth: 159, top: 12,