[{"data":1,"prerenderedAt":75},["ShallowReactive",2],{"blog:page:\u002Fvi\u002Fblog":3,"blog:articles:vi":4,"blog:translations:\u002Fvi\u002Fblog":72},null,[5,15,27,39,51,60],{"path":6,"stem":7,"title":8,"description":9,"date":10,"author":11,"tags":12,"featured":14,"cover":-1},"\u002Fvi\u002Fblog\u002Fdemo-content-note","vi\u002Fblog\u002F6.demo-content-note\u002Findex","Blog này là gì (và không phải gì)","Đây là một vertical slice demo - layout thật, pipeline thật, content editorial một cách có chủ ý.","2026-10-07","John Martin",[13],"meta",false,{"path":16,"stem":17,"title":18,"description":19,"date":20,"author":11,"tags":21,"featured":14,"cover":24},"\u002Fvi\u002Fblog\u002Freading-first-design","vi\u002Fblog\u002F5.reading-first-design\u002Findex","Trang đọc bài không phải trang tài liệu","Vì sao layout article của blog cố tình khác layout docs - phân cấp thông tin, bề rộng cột, và sự tiết chế.","2026-09-30",[22,23],"design","typography",{"src":25,"alt":26},"\u002Fassets\u002Fcover-reading-first.svg","Minh họa bìa: bố cục một cột hẹp được chọn thay vì bố cục nhiều cột rối rắm",{"path":28,"stem":29,"title":30,"description":31,"date":32,"author":11,"tags":33,"featured":14,"cover":36},"\u002Fvi\u002Fblog\u002Fstatic-deployment","vi\u002Fblog\u002F4.static-deployment\u002Findex","Deploy một blog như static assets","Không Worker script, không database binding - toàn bộ deployment là một thư mục file và một trang 404.","2026-09-23",[34,35],"deployment","cloudflare",{"src":37,"alt":38},"\u002Fassets\u002Fcover-static-deployment.svg","Minh họa bìa: thư mục các tệp HTML và SVG chảy ra mạng lưới edge CDN",{"path":40,"stem":41,"title":42,"description":43,"date":44,"author":11,"tags":45,"featured":14,"cover":48},"\u002Fvi\u002Fblog\u002Flocale-switching","vi\u002Fblog\u002F3.locale-switching\u002Findex","Locale switching không bao giờ nói dối","Language switcher chỉ được offer thứ tồn tại. Đây là cách danh sách link được suy ra từ content thật.","2026-09-16",[46,47],"i18n","ux",{"src":49,"alt":50},"\u002Fassets\u002Ftwo-locales-one-page.svg","Minh họa bìa: hai đường dẫn ngôn ngữ hội tụ về cùng một bố cục trang",{"path":52,"stem":53,"title":54,"description":55,"date":56,"author":11,"tags":57,"featured":14,"cover":-1},"\u002Fvi\u002Fblog\u002Fbuild-time-content","vi\u002Fblog\u002F2.build-time-content\u002Findex","Content được resolve ở build time","Vì sao blog này ship dưới dạng file prerender thay vì một content API - và điều đó mua được gì.","2026-09-09",[58,59],"architecture","static-sites",{"path":61,"stem":62,"title":63,"description":64,"date":65,"author":11,"tags":66,"featured":68,"cover":69},"\u002Fvi\u002Fblog\u002Furl-model","vi\u002Fblog\u002F1.url-model\u002Findex","Một mô hình URL cho mọi trang public","\u002Flocale\u002Fmount\u002Fpath giữ cho mọi trang public đoán được - và vì sao ta ràng buộc nó thay vì hy vọng nó được tuân thủ.","2026-09-02",[58,67],"urls",true,{"src":70,"alt":71},"\u002Fassets\u002Fcover-url-model.svg","Minh họa bìa: một thanh địa chỉ tách thành ba segment locale, mount và path",[73,74],"en","vi",1791809693768]