{"id":888,"date":"2025-10-07T16:00:49","date_gmt":"2025-10-07T16:00:49","guid":{"rendered":"https:\/\/awakeunity.com\/?page_id=888"},"modified":"2026-03-05T20:18:54","modified_gmt":"2026-03-05T12:18:54","slug":"wall","status":"publish","type":"page","link":"https:\/\/awakeunity.com\/en\/vow\/wall\/","title":{"rendered":"\u7948\u798f\u7246Wishing Wall"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"888\" class=\"elementor elementor-888\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b6e1dba e-flex e-con-boxed e-con e-parent\" data-id=\"b6e1dba\" data-element_type=\"container\" id=\"vows-wall\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7a7a99b elementor-widget elementor-widget-html\" data-id=\"7a7a99b\" data-element_type=\"widget\" id=\"vows-wall\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section id=\"vows-hero\">\r\n  <div class=\"vh-inner\">\r\n    <h1>Wishing Wall<\/h1>\r\n    <p class=\"vh-sub\">\r\n      Gathering pure aspirations, Let light protect one another;<br>\r\n      A single thought of compassion illuminates all ten directions.\r\n    <\/p>\r\n  <\/div>\r\n<\/section>\r\n\r\n<style>\r\n  \/* ===== \u7948\u798f\u7246\u8868\u982d\uff08\u67d4\u5149\u5f8b\u52d5 v3 + \u6efe\u52d5\u7e2e\u5c0f\/\u6de1\u51fa\uff09 ===== *\/\r\n  #vows-hero {\r\n    position: relative;\r\n    overflow: hidden;\r\n    color: #fff;\r\n    text-align: center;\r\n    padding: 110px 20px 90px;\r\n    background: linear-gradient(135deg, #0a3a45 0%, #0b5c5c 50%, #0f706d 100%);\r\n    transition: padding .45s ease, opacity .45s ease;\r\n  }\r\n\r\n  \/* \u80cc\u666f\u67d4\u5149\u7684\u7de9\u6162\u6d41\u52d5 *\/\r\n  #vows-hero::before{\r\n    content:\"\"; position:absolute; inset:0; z-index:0;\r\n    background:\r\n      radial-gradient(circle at 20% 30%, rgba(102,179,255,0.3), transparent 70%),\r\n      radial-gradient(circle at 80% 40%, rgba(255,215,64,0.18), transparent 60%),\r\n      radial-gradient(circle at 60% 80%, rgba(34,197,94,0.25), transparent 70%);\r\n    background-size:200% 200%;\r\n    animation: auroraFlow 20s ease-in-out infinite alternate;\r\n    transition: filter .45s ease, opacity .45s ease;\r\n  }\r\n  @keyframes auroraFlow{\r\n    0%{background-position:0% 50%}\r\n    50%{background-position:100% 50%}\r\n    100%{background-position:0% 50%}\r\n  }\r\n\r\n  #vows-hero .vh-inner{\r\n    position:relative; z-index:1; max-width:1100px; margin:0 auto;\r\n    opacity:0; transform:translateY(40px);\r\n    animation: fadeUp 1.8s ease forwards;\r\n    transition: transform .45s ease, opacity .45s ease;\r\n  }\r\n  @keyframes fadeUp{\r\n    from{opacity:0; transform:translateY(40px)}\r\n    to{opacity:1; transform:translateY(0)}\r\n  }\r\n\r\n  \/* \u6a19\u984c\/\u526f\u6a19\uff08\u684c\u6a5f\uff09 *\/\r\n  #vows-hero h1{\r\n    font-size:62px; font-weight:900; letter-spacing:3px;\r\n    margin:0 0 20px; color:#fff;\r\n    text-shadow:0 0 4px rgba(255,255,180,.35), 0 0 8px rgba(255,230,120,.25), 0 3px 18px rgba(0,0,0,.4);\r\n    -webkit-text-stroke:.8px rgba(255,215,0,.35);\r\n    transition: font-size .45s ease, letter-spacing .45s ease;\r\n  }\r\n  #vows-hero .vh-sub{\r\n    font-size:26px; line-height:2; opacity:.95; margin:0; font-weight:400;\r\n    text-shadow:0 2px 10px rgba(0,0,0,.35);\r\n    transition: font-size .45s ease, opacity .45s ease;\r\n  }\r\n\r\n  \/* \u4e0b\u65b9\u91d1\u8272\u5206\u9694\u7dda *\/\r\n  #vows-hero::after{\r\n    content:\"\"; position:absolute; left:50%; bottom:0; transform:translateX(-50%);\r\n    width:60%; height:1px; opacity:.7;\r\n    background:linear-gradient(90deg,transparent,rgba(255,215,0,.4),transparent);\r\n    transition: width .45s ease, opacity .45s ease;\r\n  }\r\n\r\n  \/* \u2014\u2014 \u6efe\u52d5\u72c0\u614b\uff08\u5957\u7528 .is-shrunk \u6642\uff09 \u2014\u2014 *\/\r\n  #vows-hero.is-shrunk{\r\n    padding: 72px 20px 56px;\r\n    opacity: .96;\r\n  }\r\n  #vows-hero.is-shrunk::before{\r\n    filter: blur(2px);\r\n    opacity: .9;\r\n  }\r\n  #vows-hero.is-shrunk .vh-inner{\r\n    transform: translateY(0);\r\n  }\r\n  #vows-hero.is-shrunk h1{\r\n    font-size: 46px;\r\n    letter-spacing: 2px;\r\n  }\r\n  #vows-hero.is-shrunk .vh-sub{\r\n    font-size: 20px;\r\n    opacity: .9;\r\n  }\r\n  #vows-hero.is-shrunk::after{\r\n    width: 48%;\r\n    opacity: .55;\r\n  }\r\n\r\n  \/* \u884c\u52d5\u88dd\u7f6e *\/\r\n  @media (max-width:768px){\r\n    #vows-hero{ padding:80px 16px 60px; }\r\n    #vows-hero h1{ font-size:46px; -webkit-text-stroke:.6px rgba(255,215,0,.4); }\r\n    #vows-hero .vh-sub{ font-size:19px; line-height:1.9; }\r\n    #vows-hero.is-shrunk{ padding:64px 16px 46px; }\r\n    #vows-hero.is-shrunk h1{ font-size:36px; }\r\n    #vows-hero.is-shrunk .vh-sub{ font-size:18px; }\r\n  }\r\n<\/style>\r\n\r\n<script>\r\n\/* \u6efe\u52d5\u5075\u6e2c\uff1a\u8d85\u904e 60px \u5c31\u5957\u7528\u7e2e\u5c0f\u6a23\u5f0f *\/\r\n(function(){\r\n  var hero = document.getElementById('vows-hero');\r\n  if(!hero) return;\r\n  var ticking = false;\r\n  function onScroll(){\r\n    if(!ticking){\r\n      window.requestAnimationFrame(function(){\r\n        var shrink = window.scrollY > 60;\r\n        hero.classList.toggle('is-shrunk', shrink);\r\n        ticking = false;\r\n      });\r\n      ticking = true;\r\n    }\r\n  }\r\n  window.addEventListener('scroll', onScroll, {passive:true});\r\n  onScroll(); \/\/ \u521d\u59cb\u72c0\u614b\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-304e333 elementor-widget elementor-widget-shortcode\" data-id=\"304e333\" data-element_type=\"widget\" id=\"vows-wall\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">  <section id=\"vw-wall-1\" class=\"vw-wrap\" data-per-page=\"18\">\n    <div class=\"vw-toolbar\">\n      <div class=\"vw-left\">\n        <input id=\"vw-search\" type=\"search\" placeholder=\"Search for blessings or #hashtags\u2026\" \/>\n        <select id=\"vw-filter\">\n          <option value=\"\">All objects<\/option>\n          <option value=\"person\">Character<\/option>\n          <option value=\"region\">Region<\/option>\n          <option value=\"event\">Incident<\/option>\n        <\/select>\n        <select id=\"vw-sort\">\n          <option value=\"newest\" selected>latest<\/option>\n          <option value=\"oldest\">oldest<\/option>\n        <\/select>\n      <\/div>\n      <div class=\"vw-right\"><span id=\"vw-count\">0 pens<\/span><\/div>\n    <\/div>\n\n    <div id=\"vw-grid\" class=\"vw-grid\">\n              <article class=\"vw-card\"\n                 data-id=\"3640\"\n                 data-liked=\"0\"\n                 data-target=\"person\"\n                 data-date=\"2025-12-29T15:03:43+08:00\"\n                 data-tags=\"\u6240\u6709\u751f\u547d\"\n                 data-text=\"\u795d\u798f \u6240\u6709\u751f\u547d\u548c\u89e3\u548c\u8ae7 \u4e92\u76f8\u5584\u5f85 \u5171\u4eab\u5171\u5584\u5171\u89ba \u4f4f\u4f5b\u7a76\u7adf\u5b89\u6a02 \u8207\u85e5\u5e2b\u4f5b\u7121\u7570\u3002\u7279\u5225\u662f\u5973\u6027\u8207\u5b69\u5b50\uff0c\u90fd\u80fd\u88ab\u5584\u5f85\uff0c\u5b89\u5168\u3001\u5b89\u5fc3\uff0c\u7121\u6182\u7121\u60f1\uff0c\u65e9\u5165\u6cd5\u6d77\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u795d\u798f \u6240\u6709\u751f\u547d\u548c\u89e3\u548c\u8ae7 \u4e92\u76f8\u5584\u5f85 \u5171\u4eab\u5171\u5584\u5171\u89ba \u4f4f\u4f5b\u7a76\u7adf\u5b89\u6a02 \u8207\u85e5\u5e2b\u4f5b\u7121\u7570\u3002\u7279\u5225\u662f\u5973\u6027\u8207\u5b69\u5b50\uff0c\u90fd\u80fd\u88ab\u5584\u5f85\uff0c\u5b89\u5168\u3001\u5b89\u5fc3\uff0c\u7121\u6182\u7121\u60f1\uff0c\u65e9\u5165\u6cd5\u6d77<\/h3>\n\n                      <ul class=\"vw-tags\">\n              <li>#All Life<\/li>            <\/ul>\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">A kind friend<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.12.29<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"3640\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">1<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"2778\"\n                 data-liked=\"0\"\n                 data-target=\"event\"\n                 data-date=\"2025-12-05T11:56:21+08:00\"\n                 data-tags=\"\u5927\u5bb6\"\n                 data-text=\"\u5e0c\u671b\u9999\u6e2f\u5b8f\u798f\u82d1\u53d7\u50b7\u7684\u4eba\u90fd\u80fd\u65e9\u65e5\u5eb7\u5fa9 \u4ea1\u8005\u90fd\u80fd\u65e9\u65e5\u5f80\u751f\u6de8\u571f \u5e0c\u671b\u9999\u6e2f\u5b8f\u798f\u82d1\u53d7\u50b7\u7684\u4eba\u90fd\u80fd\u65e9\u65e5\u5eb7\u5fa9 \u4ea1\u8005\u90fd\u80fd\u65e9\u65e5\u5f80\u751f\u6de8\u571f\">\n\n          <h3 class=\"vw-title\">May everyone injured at Wang Fuk Court in Hong Kong recover soon, and may the departed be reborn swiftly in the Pure Land.<\/h3>\n\n                      <ul class=\"vw-tags\">\n              <li>#Everyone<\/li>            <\/ul>\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">\ud83d\udca0 \u5fc3\u5fc3<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.12.05<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"2778\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">4<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"2701\"\n                 data-liked=\"0\"\n                 data-target=\"person\"\n                 data-date=\"2025-10-27T16:46:00+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u5beb\u7d66\u5929\u4e0a\u7684\u7238\u7238\u3002\u7238\uff0c\u53c8\u904e\u4e86\u4e00\u5e74\uff0c\u5bb6\u88e1\u4e00\u5207\u90fd\u597d\uff0c\u8acb\u60a8\u653e\u5fc3\u3002\u96d6\u7136\u60a8\u4e0d\u5728\u8eab\u908a\uff0c\u4f46\u60a8\u7684\u6559\u8aa8\u6211\u5011\u90fd\u8a18\u5728\u5fc3\u88e1\u3002\u5e0c\u671b\u60a8\u5728\u53e6\u4e00\u500b\u4e16\u754c\u4e5f\u80fd\u81ea\u5728\u900d\u9059\uff0c\u6211\u5011\u5f88\u60f3\u5ff5\u60a8\u3002\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u5beb\u7d66\u5929\u4e0a\u7684\u7238\u7238\u3002\u7238\uff0c\u53c8\u904e\u4e86\u4e00\u5e74\uff0c\u5bb6\u88e1\u4e00\u5207\u90fd\u597d\uff0c\u8acb\u60a8\u653e\u5fc3\u3002\u96d6\u7136\u60a8\u4e0d\u5728\u8eab\u908a\uff0c\u4f46\u60a8\u7684\u6559\u8aa8\u6211\u5011\u90fd\u8a18\u5728\u5fc3\u88e1\u3002\u5e0c\u671b\u60a8\u5728\u53e6\u4e00\u500b\u4e16\u754c\u4e5f\u80fd\u81ea\u5728\u900d\u9059\uff0c\u6211\u5011\u5f88\u60f3\u5ff5\u60a8\u3002<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">A kind friend<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.27<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"2701\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">5<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"2700\"\n                 data-liked=\"0\"\n                 data-target=\"person\"\n                 data-date=\"2025-10-08T16:48:00+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u9858\u773e\u751f\u96e2\u82e6\u5f97\u6a02\u3002\u9858\u5c07\u4eca\u65e5\u6301\u8aa6\u85e5\u5e2b\u704c\u9802\u771f\u8a00\u4e4b\u529f\u5fb7\uff0c\u8ff4\u5411\u7d66\u6cd5\u754c\u4e00\u5207\u773e\u751f\u3002\u7948\u9858\u6240\u6709\u53d7\u8eab\u5fc3\u75c5\u75db\u6298\u78e8\u7684\u4eba\uff0c\u90fd\u80fd\u5f97\u5230\u85e5\u77f3\u7684\u6551\u6cbb\u8207\u5fc3\u9748\u7684\u6170\u85c9\uff0c\u91cd\u7372\u5065\u5eb7\u5e73\u5b89\u3002\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u9858\u773e\u751f\u96e2\u82e6\u5f97\u6a02\u3002\u9858\u5c07\u4eca\u65e5\u6301\u8aa6\u85e5\u5e2b\u704c\u9802\u771f\u8a00\u4e4b\u529f\u5fb7\uff0c\u8ff4\u5411\u7d66\u6cd5\u754c\u4e00\u5207\u773e\u751f\u3002\u7948\u9858\u6240\u6709\u53d7\u8eab\u5fc3\u75c5\u75db\u6298\u78e8\u7684\u4eba\uff0c\u90fd\u80fd\u5f97\u5230\u85e5\u77f3\u7684\u6551\u6cbb\u8207\u5fc3\u9748\u7684\u6170\u85c9\uff0c\u91cd\u7372\u5065\u5eb7\u5e73\u5b89\u3002<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">A kind friend<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.08<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"2700\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">3<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"2699\"\n                 data-liked=\"0\"\n                 data-target=\"person\"\n                 data-date=\"2025-10-08T16:42:00+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u8aa0\u5fc3\u61fa\u6094\u8207\u767c\u9858\u3002 \u56de\u60f3\u904e\u53bb\u56e0\u70ba\u813e\u6c23\u4e0d\u597d\uff0c\u7121\u610f\u9593\u50b7\u5bb3\u4e86\u8eab\u908a\u89aa\u8fd1\u7684\u4eba\u3002\u4eca\u65e5\u8aa0\u5fc3\u5728\u4f5b\u524d\u61fa\u6094\uff0c\u5e0c\u671b\u80fd\u66f4\u6709\u667a\u6167\u8207\u5b9a\u529b\u63a7\u5236\u60c5\u7dd2\uff0c\u4e26\u5c07\u6301\u5492\u529f\u5fb7\u8ff4\u5411\u7d66\u51a4\u89aa\u50b5\u4e3b\uff0c\u89e3\u51a4\u91cb\u7d50\u3002\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u8aa0\u5fc3\u61fa\u6094\u8207\u767c\u9858\u3002 \u56de\u60f3\u904e\u53bb\u56e0\u70ba\u813e\u6c23\u4e0d\u597d\uff0c\u7121\u610f\u9593\u50b7\u5bb3\u4e86\u8eab\u908a\u89aa\u8fd1\u7684\u4eba\u3002\u4eca\u65e5\u8aa0\u5fc3\u5728\u4f5b\u524d\u61fa\u6094\uff0c\u5e0c\u671b\u80fd\u66f4\u6709\u667a\u6167\u8207\u5b9a\u529b\u63a7\u5236\u60c5\u7dd2\uff0c\u4e26\u5c07\u6301\u5492\u529f\u5fb7\u8ff4\u5411\u7d66\u51a4\u89aa\u50b5\u4e3b\uff0c\u89e3\u51a4\u91cb\u7d50\u3002<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">A kind friend<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.08<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"2699\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">3<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"2673\"\n                 data-liked=\"0\"\n                 data-target=\"region\"\n                 data-date=\"2025-10-08T16:02:00+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u9858\u6230\u706b\u5e73\u606f\uff0c\u4e16\u754c\u7121\u707d\u3002\u770b\u5230\u65b0\u805e\u4e0a\u53d7\u82e6\u7684\u96e3\u6c11\u8207\u707d\u5340\u756b\u9762\uff0c\u5fc3\u88e1\u771f\u7684\u5f88\u96e3\u904e\u3002\u7948\u9858\u4e16\u754c\u5404\u5730\u7684\u6230\u706b\u80fd\u65e9\u65e5\u6b62\u606f\uff0c\u5929\u707d\u6e1b\u5c11\uff0c\u8b93\u6240\u6709\u4eba\u90fd\u80fd\u64c1\u6709\u4e00\u500b\u5b89\u7a69\u3001\u6c92\u6709\u6050\u61fc\u7684\u5bb6\u5712\u3002\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u9858\u6230\u706b\u5e73\u606f\uff0c\u4e16\u754c\u7121\u707d\u3002\u770b\u5230\u65b0\u805e\u4e0a\u53d7\u82e6\u7684\u96e3\u6c11\u8207\u707d\u5340\u756b\u9762\uff0c\u5fc3\u88e1\u771f\u7684\u5f88\u96e3\u904e\u3002\u7948\u9858\u4e16\u754c\u5404\u5730\u7684\u6230\u706b\u80fd\u65e9\u65e5\u6b62\u606f\uff0c\u5929\u707d\u6e1b\u5c11\uff0c\u8b93\u6240\u6709\u4eba\u90fd\u80fd\u64c1\u6709\u4e00\u500b\u5b89\u7a69\u3001\u6c92\u6709\u6050\u61fc\u7684\u5bb6\u5712\u3002<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">A kind friend<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.08<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"2673\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">7<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"2787\"\n                 data-liked=\"0\"\n                 data-target=\"person\"\n                 data-date=\"2025-10-08T14:48:27+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u7d66\u6700\u611b\u7684\u6bdb\u5c0f\u5b69\u76ae\u76ae\u3002 \u8b1d\u8b1d\u4f60\u901915\u5e74\u4f86\u7684\u966a\u4f34\uff0c\u4f60\u662f\u6211\u5011\u5bb6\u6700\u91cd\u8981\u7684\u4e00\u4efd\u5b50\u3002\u5e0c\u671b\u4f60\u5df2\u7d93\u6c92\u6709\u75c5\u75db\uff0c\u8ddf\u8457\u4f5b\u83e9\u85a9\u7684\u5149\u660e\u53bb\u5230\u66f4\u597d\u7684\u5730\u65b9\u3002\u6c38\u9060\u611b\u4f60\uff0c\u6211\u5011\u6703\u6c38\u9060\u8a18\u5f97\u4f60\u7684\u53ef\u611b\u6a21\u6a23\u3002\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u7d66\u6700\u611b\u7684\u6bdb\u5c0f\u5b69\u76ae\u76ae\u3002 \u8b1d\u8b1d\u4f60\u901915\u5e74\u4f86\u7684\u966a\u4f34\uff0c\u4f60\u662f\u6211\u5011\u5bb6\u6700\u91cd\u8981\u7684\u4e00\u4efd\u5b50\u3002\u5e0c\u671b\u4f60\u5df2\u7d93\u6c92\u6709\u75c5\u75db\uff0c\u8ddf\u8457\u4f5b\u83e9\u85a9\u7684\u5149\u660e\u53bb\u5230\u66f4\u597d\u7684\u5730\u65b9\u3002\u6c38\u9060\u611b\u4f60\uff0c\u6211\u5011\u6703\u6c38\u9060\u8a18\u5f97\u4f60\u7684\u53ef\u611b\u6a21\u6a23\u3002<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">A kind friend<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.08<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"2787\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">3<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"719\"\n                 data-liked=\"0\"\n                 data-target=\"person\"\n                 data-date=\"2025-10-08T10:51:22+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u7948\u9858\u5abd\u5abd\u624b\u8853\u9806\u5229\u3002\u61c7\u8acb\u85e5\u5e2b\u4f5b\u52a0\u88ab\uff0c\u4fdd\u4f51\u5abd\u5abd\u4e0b\u9031\u4e8c\u7684\u819d\u84cb\u624b\u8853\u4e00\u5207\u9806\u5229\uff0c\u8853\u5f8c\u5fa9\u539f\u826f\u597d\u3002\u5e0c\u671b\u5abd\u5abd\u80fd\u65e9\u65e5\u64fa\u812b\u75bc\u75db\uff0c\u6062\u5fa9\u5065\u5eb7\u7684\u7b11\u5bb9\uff0c\u8b93\u6211\u5011\u6709\u66f4\u591a\u6642\u9593\u966a\u4f34\u5979\u5230\u8655\u8d70\u8d70\u3002\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u7948\u9858\u5abd\u5abd\u624b\u8853\u9806\u5229\u3002\u61c7\u8acb\u85e5\u5e2b\u4f5b\u52a0\u88ab\uff0c\u4fdd\u4f51\u5abd\u5abd\u4e0b\u9031\u4e8c\u7684\u819d\u84cb\u624b\u8853\u4e00\u5207\u9806\u5229\uff0c\u8853\u5f8c\u5fa9\u539f\u826f\u597d\u3002\u5e0c\u671b\u5abd\u5abd\u80fd\u65e9\u65e5\u64fa\u812b\u75bc\u75db\uff0c\u6062\u5fa9\u5065\u5eb7\u7684\u7b11\u5bb9\uff0c\u8b93\u6211\u5011\u6709\u66f4\u591a\u6642\u9593\u966a\u4f34\u5979\u5230\u8655\u8d70\u8d70\u3002<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">A kind friend<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.08<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"719\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">3<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"2678\"\n                 data-liked=\"0\"\n                 data-target=\"event\"\n                 data-date=\"2025-10-07T16:12:00+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u7948\u6c42\u5de5\u4f5c\u8f49\u8077\u9806\u5229\u3002\u6700\u8fd1\u5728\u8077\u6daf\u5341\u5b57\u8def\u53e3\u611f\u5230\u5f88\u8ff7\u60d8\uff0c\u5e0c\u671b\u80fd\u7372\u5f97\u667a\u6167\u8207\u52c7\u6c23\uff0c\u505a\u51fa\u6b63\u78ba\u7684\u6c7a\u5b9a\u3002\u9858\u63a5\u4e0b\u4f86\u7684\u65b0\u5de5\u4f5c\u80fd\u767c\u63ee\u6240\u9577\uff0c\u9047\u5230\u5584\u89e3\u4eba\u610f\u7684\u540c\u4e8b\u8207\u4e3b\u7ba1\uff0c\u5de5\u4f5c\u9806\u5fc3\u3002\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u7948\u6c42\u5de5\u4f5c\u8f49\u8077\u9806\u5229\u3002\u6700\u8fd1\u5728\u8077\u6daf\u5341\u5b57\u8def\u53e3\u611f\u5230\u5f88\u8ff7\u60d8\uff0c\u5e0c\u671b\u80fd\u7372\u5f97\u667a\u6167\u8207\u52c7\u6c23\uff0c\u505a\u51fa\u6b63\u78ba\u7684\u6c7a\u5b9a\u3002\u9858\u63a5\u4e0b\u4f86\u7684\u65b0\u5de5\u4f5c\u80fd\u767c\u63ee\u6240\u9577\uff0c\u9047\u5230\u5584\u89e3\u4eba\u610f\u7684\u540c\u4e8b\u8207\u4e3b\u7ba1\uff0c\u5de5\u4f5c\u9806\u5fc3\u3002<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">A kind friend<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.07<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"2678\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">4<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"748\"\n                 data-liked=\"0\"\n                 data-target=\"person\"\n                 data-date=\"2025-10-07T04:46:05+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u7d66\u6b63\u5728\u5316\u7642\u7684\u597d\u53cb\u3002\u89aa\u611b\u7684\uff0c\u77e5\u9053\u9019\u689d\u8def\u5f88\u8f9b\u82e6\uff0c\u4f46\u8acb\u76f8\u4fe1\u4f60\u4e26\u4e0d\u5b64\u55ae\u3002\u6211\u5011\u90fd\u5728\u70ba\u4f60\u96c6\u6c23\u7948\u798f\uff01\u9858\u85e5\u5e2b\u4f5b\u7684\u5149\u660e\u5b88\u8b77\u8457\u4f60\uff0c\u8b93\u7642\u7a0b\u526f\u4f5c\u7528\u6e1b\u5230\u6700\u4f4e\uff0c\u65e9\u65e5\u5eb7\u5fa9\u6b78\u968a\uff01\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u7d66\u6b63\u5728\u5316\u7642\u7684\u597d\u53cb\u3002\u89aa\u611b\u7684\uff0c\u77e5\u9053\u9019\u689d\u8def\u5f88\u8f9b\u82e6\uff0c\u4f46\u8acb\u76f8\u4fe1\u4f60\u4e26\u4e0d\u5b64\u55ae\u3002\u6211\u5011\u90fd\u5728\u70ba\u4f60\u96c6\u6c23\u7948\u798f\uff01\u9858\u85e5\u5e2b\u4f5b\u7684\u5149\u660e\u5b88\u8b77\u8457\u4f60\uff0c\u8b93\u7642\u7a0b\u526f\u4f5c\u7528\u6e1b\u5230\u6700\u4f4e\uff0c\u65e9\u65e5\u5eb7\u5fa9\u6b78\u968a\uff01<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">A kind friend<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.07<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"748\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">2<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n          <\/div>\n\n    <div class=\"vw-more\"><button id=\"vw-load\">Load more<\/button><\/div>\n  <\/section>\n\n  <style>\n  .vw-wrap{--brand:#1f2937;--muted:#6b7280;--line:#e5e7eb;--card:#fff;--bg:#f8fafc;\n    font-family:system-ui,\"Noto Sans TC\",\"PingFang TC\",sans-serif;background:var(--bg);padding:12px;border-radius:16px}\n  .vw-toolbar{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:12px}\n  .vw-left{display:flex;gap:8px;flex-wrap:wrap}\n  #vw-search{padding:10px 12px;border:1px solid var(--line);border-radius:999px;min-width:240px}\n  #vw-filter,#vw-sort{padding:10px 12px;border:1px solid var(--line);border-radius:12px;background:#fff}\n  #vw-count{color:var(--muted)}\n  .vw-grid{display:grid;gap:14px;grid-template-columns:repeat(1,1fr)}\n  @media(min-width:640px){.vw-grid{grid-template-columns:repeat(2,1fr)}}\n  @media(min-width:1024px){.vw-grid{grid-template-columns:repeat(3,1fr)}}\n  .vw-card{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:14px;box-shadow:0 8px 20px rgba(0,0,0,.06)}\n  .vw-title{margin:0 0 6px;font-size:20px;line-height:1.35;color:#111827;}\n  .vw-tags{list-style:none;margin:6px 0 8px;padding:0;display:flex;flex-wrap:wrap;gap:6px}\n  .vw-tags li{font-size:12px;border:1px dashed #93c5fd;padding:2px 8px;border-radius:999px;color:#2563eb;background:#fff}\n  .vw-body{color:var(--muted);margin:4px 0 0;font-size:14px;line-height:1.6}\n\n  \/* footer\uff1a\u4e0d\u52a0\u9ad8\uff0c\u4fdd\u6301\u539f\u8282\u594f\uff1b\u53f3\u4fa7\u201c\u65e5\u671f+\u6309\u94ae\u201d\u5728\u540c\u4e00\u884c\u4e14\u65e5\u671f\u66f4\u9760\u5de6 *\/\n  .vw-foot{\n    margin-top:10px;color:var(--muted);font-size:13px;\n    border-top:1px solid var(--line);\n    padding-top:8px;\n    display:flex;justify-content:space-between;align-items:center;gap:10px\n  }\n  .vw-foot .meta{\n    min-width:0;\n    flex:1 1 auto;\n    overflow:hidden;\n    text-overflow:ellipsis;\n    white-space:nowrap;\n    padding-right:8px;\n  }\n  .vw-foot-right{\n    flex:0 0 auto;\n    display:inline-flex;\n    align-items:center;\n    gap:14px;              \/* \u5173\u952e\uff1a\u65e5\u671f\u4e0e\u6309\u94ae\u95f4\u8ddd\u66f4\u5927 => \u65e5\u671f\u5f80\u5de6 *\/\n    white-space:nowrap;\n  }\n  .vw-foot .date{font-size:13px;color:var(--muted);}\n\n  .vw-more{display:flex;justify-content:center;margin-top:14px}\n  #vw-load{padding:10px 16px;border-radius:999px;border:1px solid var(--line);background:#fff;cursor:pointer}\n  #vw-load:hover{border-color:#cbd5e1}\n\n  \/* \u795d\u798f\u6309\u94ae\uff1a\u66f4\u5c0f\uff08\u542b\u5df2\u795d\u798f\u72b6\u6001\u4e5f\u4e0d\u6491\u5927\uff09\uff0c\u4e14\u4e0d\u906e\u6321\u65e5\u671f\uff08\u5df2\u5728\u5e03\u5c40\u4e2d\u8ba9\u4f4d\uff09 *\/\n  .vw-like{\n    display:inline-flex;align-items:center;gap:3px;\n    padding:2px 6px;          \/* \u66f4\u5c0f *\/\n    border-radius:999px;\n    border:1px solid var(--line);\n    background:#fff;\n    cursor:pointer;\n    font-size:10px;           \/* \u66f4\u5c0f *\/\n    line-height:1;\n    color:#111827;\n    white-space:nowrap;\n    box-shadow:0 6px 16px rgba(0,0,0,.08);\n    transition:transform .15s ease, box-shadow .15s ease, background-color .15s ease, border-color .15s ease;\n  }\n  .vw-like:hover{transform:translateY(-1px);box-shadow:0 8px 20px rgba(0,0,0,.10);}\n  .vw-like:disabled{opacity:.72;cursor:not-allowed}\n  .vw-like-count{font-variant-numeric:tabular-nums}\n\n  \/* \u5df2\u795d\u798f\u72b6\u6001 *\/\n  .vw-like.is-liked{border-color:#fca5a5;background:#fff1f2;}\n\n  \/* \u5f39\u8df3\u52a8\u753b *\/\n  @keyframes vwLikePop{\n    0%{ transform:scale(1); }\n    35%{ transform:scale(1.08); }\n    100%{ transform:scale(1); }\n  }\n  .vw-like.is-burst{ animation:vwLikePop .28s ease-out; }\n\n  \/* +1 \u6d6e\u6807 *\/\n  @keyframes vwPlusOne{\n    0%{ opacity:0; transform:translateY(0) scale(.95); }\n    20%{ opacity:1; }\n    100%{ opacity:0; transform:translateY(-10px) scale(1.02); }\n  }\n  .vw-like.is-burst::after{\n    content:\"+1\";\n    position:absolute;\n    margin-left:0;\n    top:-10px;\n    right:2px;\n    font-size:12px;\n    font-weight:700;\n    color:#ef4444;\n    animation:vwPlusOne .6s ease-out;\n    pointer-events:none;\n  }\n  \/* \u8ba9 ::after \u7684 absolute \u4ee5\u6309\u94ae\u4e3a\u53c2\u7167 *\/\n  .vw-like{ position:relative; }\n  <\/style>\n\n  <script>\n  (function(){\n    const wrap = document.getElementById('vw-wall-1');\n    if(!wrap) return;\n\n    const grid   = wrap.querySelector('#vw-grid');\n    const search = wrap.querySelector('#vw-search');\n    const filter = wrap.querySelector('#vw-filter');\n    const sort   = wrap.querySelector('#vw-sort');\n    const load   = wrap.querySelector('#vw-load');\n    const count  = wrap.querySelector('#vw-count');\n\n    const ajaxUrl   = 'https:\/\/awakeunity.com\/wp-admin\/admin-ajax.php';\n    const likeNonce = 'e414a296d4';\n    const LS_PREFIX = 'vw_like_';\n\n    let page = 1, loading = false, done = false;\n\n    function splitFirstSentence(full){\n      full = (full || '').replace(\/\\s+\/g,' ').trim();\n      if(!full) return {title:'', rest:''};\n      const m = full.split(\/(?<=[\u3002\uff01\uff1f!?])|\\n\/);\n      let first = (m[0] || '').trim();\n      if(!first) first = full.slice(0,33);\n      let title = first.slice(0,33);\n      let rest = full.slice(first.length).trim();\n      if(!rest || rest.length < 6 || rest.toLowerCase()===title.toLowerCase()) rest='';\n      return {title, rest};\n    }\n\n    function fmtDate(iso){\n      const d = new Date(iso);\n      const y = d.getFullYear();\n      const m = String(d.getMonth()+1).padStart(2,'0');\n      const day = String(d.getDate()).padStart(2,'0');\n      return `${y}.${m}.${day}`;\n    }\n\n    function setBlessedUI(btn){\n      btn.classList.add('is-liked');\n      btn.setAttribute('aria-pressed','true');\n      btn.setAttribute('aria-label','\u5df2\u795d\u798f');\n      btn.disabled = true;\n\n      const ico = btn.querySelector('.vw-like-ico');\n      const text = btn.querySelector('.vw-like-text');\n      if(ico) ico.textContent = '\u2764\ufe0f';\n      if(text) text.textContent = '\u5df2\u795d\u798f';\n    }\n\n    function markLikedUI(card){\n      const id = card.getAttribute('data-id');\n      if(!id) return;\n\n      const btn = card.querySelector('.vw-like');\n      if(!btn) return;\n\n      const likedByServer = card.getAttribute('data-liked') === '1';\n      const likedByLS = !!localStorage.getItem(LS_PREFIX + id);\n\n      if(likedByServer || likedByLS){\n        setBlessedUI(btn);\n      }\n    }\n\n    function apply(){\n      const kw = (search.value || '').trim().toLowerCase();\n      const typ = filter.value;\n      const cards = [...grid.querySelectorAll('.vw-card')];\n\n      cards.forEach(card=>{\n        const text = card.dataset.text || '';\n        const tags = card.dataset.tags || '';\n        const tgt  = card.dataset.target || '';\n        const matchKw = kw ? (text.includes(kw) || tags.includes(kw)) : true;\n        const matchTp = typ ? (tgt === typ) : true;\n        card.hidden = !(matchKw && matchTp);\n      });\n\n      const visible = cards.filter(c=>!c.hidden);\n      visible.sort((a,b)=>{\n        const da = new Date(a.dataset.date).getTime();\n        const db = new Date(b.dataset.date).getTime();\n        return sort.value === 'newest' ? (db - da) : (da - db);\n      }).forEach(c=>grid.appendChild(c));\n\n      count.textContent = visible.length + ' \u7b46';\n    }\n\n    async function like(postId, btn){\n      if(!postId || !btn) return;\n\n      if(localStorage.getItem(LS_PREFIX + postId) || btn.classList.contains('is-liked')) return;\n      btn.disabled = true;\n\n      try{\n        const body = new URLSearchParams();\n        body.set('action', 'vw_like');\n        body.set('post_id', postId);\n        body.set('nonce', likeNonce);\n\n        const res = await fetch(ajaxUrl, {\n          method: 'POST',\n          headers: {'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8'},\n          body: body.toString(),\n          credentials: 'same-origin'\n        });\n\n        const json = await res.json().catch(()=>null);\n        if(!res.ok || !json || !json.success){\n          btn.disabled = false;\n          return;\n        }\n\n        const likes = (json.data && typeof json.data.likes !== 'undefined') ? parseInt(json.data.likes,10) : null;\n        if(Number.isFinite(likes)){\n          const cnt = btn.querySelector('.vw-like-count');\n          if(cnt) cnt.textContent = likes;\n        }\n\n        localStorage.setItem(LS_PREFIX + postId, '1');\n        setBlessedUI(btn);\n\n        btn.classList.add('is-burst');\n        setTimeout(()=>btn.classList.remove('is-burst'), 350);\n\n      }catch(e){\n        btn.disabled = false;\n      }\n    }\n\n    \/\/ \u4e8b\u4ef6\u59d4\u6258\uff1a\u52a8\u6001\u8f7d\u5165\u7684\u5361\u7247\u4e5f\u652f\u6301\u795d\u798f\n    wrap.addEventListener('click', function(e){\n      const btn = e.target.closest && e.target.closest('.vw-like');\n      if(!btn) return;\n      const postId = btn.getAttribute('data-id');\n      like(postId, btn);\n    });\n\n    async function loadMore(){\n      if(loading || done) return;\n      loading = true; load.textContent = '\u8f09\u5165\u4e2d\u2026';\n\n      const perPage = parseInt(wrap.dataset.perPage || '18', 10);\n      page += 1;\n\n      try{\n        const url = new URL('https:\/\/awakeunity.com\/en\/wp-json\/wp\/v2\/vows');\n        url.searchParams.set('status', 'publish');\n        url.searchParams.set('orderby','date');\n        url.searchParams.set('order', sort.value==='newest'?'desc':'asc');\n        url.searchParams.set('per_page', perPage);\n        url.searchParams.set('page', page);\n        url.searchParams.set('_embed','1');\n\n        const res = await fetch(url);\n        if(res.status===400 || res.status===404){ done = true; load.textContent='\u6c92\u6709\u66f4\u591a\u4e86'; return; }\n        if(!res.ok) throw new Error('HTTP '+res.status);\n\n        const data = await res.json();\n        if(!data.length){ done = true; load.textContent='\u6c92\u6709\u66f4\u591a\u4e86'; return; }\n\n        data.forEach(post=>{\n          const raw   = (post.content && post.content.rendered) ? post.content.rendered.replace(\/<[^>]*>\/g,'') : '';\n          const split = splitFirstSentence(raw);\n          const title = split.title || ((post.title && post.title.rendered) ? post.title.rendered.replace(\/<[^>]*>\/g,'') : '\uff08\u7121\u6a19\u984c\uff09');\n          const rest  = split.rest;\n          const date  = post.date;\n\n          const meta  = post.meta || {};\n          const tags  = (meta.tags || '').toString();\n          const sig   = (meta.vow_signature || '').toString().trim();\n          const author = sig !== '' ? sig : '\u4e00\u4f4d\u5584\u53cb';\n\n          const likes = parseInt(meta.vw_likes || 0, 10) || 0;\n          const pid   = post.id;\n\n          const card = document.createElement('article');\n          card.className='vw-card';\n          card.dataset.id     = String(pid);\n          card.dataset.liked  = '0';\n          card.dataset.target = (meta.target_type||'').toString();\n          card.dataset.date   = date;\n          card.dataset.tags   = tags.toLowerCase();\n          card.dataset.text   = (title+' '+raw).toLowerCase();\n\n          card.innerHTML = `\n            <h3 class=\"vw-title\">\ud83d\udd6f ${title}<\/h3>\n            ${ tags ? `<ul class=\"vw-tags\">${tags.split(',').map(t=>t.trim()).filter(Boolean).map(t=>`<li>#${t}<\/li>`).join('')}<\/ul>` : '' }\n            ${ rest ? `<p class=\"vw-body\">${rest}<\/p>` : '' }\n            <div class=\"vw-foot\">\n              <span class=\"meta\">\ud83d\udca0 ${author}<\/span>\n              <span class=\"vw-foot-right\">\n                <span class=\"date\">${fmtDate(date)}<\/span>\n                <button class=\"vw-like\" type=\"button\" data-id=\"${pid}\" aria-label=\"\u795d\u798f\">\n                  <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                  <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                  <span class=\"vw-like-count\">${likes}<\/span>\n                <\/button>\n              <\/span>\n            <\/div>\n          `;\n\n          grid.appendChild(card);\n          markLikedUI(card);\n        });\n\n        apply();\n        load.textContent='\u8f09\u5165\u66f4\u591a';\n      }catch(e){\n        load.textContent='\u8f09\u5165\u5931\u6557\uff0c\u91cd\u8a66';\n      }finally{\n        loading = false;\n      }\n    }\n\n    search.addEventListener('input', apply);\n    filter.addEventListener('change', apply);\n    sort.addEventListener('change', apply);\n    load.addEventListener('click', loadMore);\n\n    [...grid.querySelectorAll('.vw-card')].forEach(markLikedUI);\n    apply();\n  })();\n  <\/script>\n  <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-54287e8 elementor-widget elementor-widget-html\" data-id=\"54287e8\" data-element_type=\"widget\" id=\"vows-wall\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n\/* ===== Scoped vows wall styles \u2014 safe for Elementor shortcode widgets =====\r\n   Paste into an HTML widget on the same section where   <section id=\"vw-wall-2\" class=\"vw-wrap\" data-per-page=\"18\">\n    <div class=\"vw-toolbar\">\n      <div class=\"vw-left\">\n        <input id=\"vw-search\" type=\"search\" placeholder=\"\u641c\u5c0b\u7948\u798f\u5167\u5bb9\u6216 #\u6a19\u7c64\u2026\" \/>\n        <select id=\"vw-filter\">\n          <option value=\"\">\u5168\u90e8\u5c0d\u8c61<\/option>\n          <option value=\"person\">\u4eba\u7269<\/option>\n          <option value=\"region\">\u5730\u5340<\/option>\n          <option value=\"event\">\u4e8b\u4ef6<\/option>\n        <\/select>\n        <select id=\"vw-sort\">\n          <option value=\"newest\" selected>\u6700\u65b0<\/option>\n          <option value=\"oldest\">\u6700\u820a<\/option>\n        <\/select>\n      <\/div>\n      <div class=\"vw-right\"><span id=\"vw-count\">0 \u7b46<\/span><\/div>\n    <\/div>\n\n    <div id=\"vw-grid\" class=\"vw-grid\">\n              <article class=\"vw-card\"\n                 data-id=\"3640\"\n                 data-liked=\"0\"\n                 data-target=\"person\"\n                 data-date=\"2025-12-29T15:03:43+08:00\"\n                 data-tags=\"\u6240\u6709\u751f\u547d\"\n                 data-text=\"\u795d\u798f \u6240\u6709\u751f\u547d\u548c\u89e3\u548c\u8ae7 \u4e92\u76f8\u5584\u5f85 \u5171\u4eab\u5171\u5584\u5171\u89ba \u4f4f\u4f5b\u7a76\u7adf\u5b89\u6a02 \u8207\u85e5\u5e2b\u4f5b\u7121\u7570\u3002\u7279\u5225\u662f\u5973\u6027\u8207\u5b69\u5b50\uff0c\u90fd\u80fd\u88ab\u5584\u5f85\uff0c\u5b89\u5168\u3001\u5b89\u5fc3\uff0c\u7121\u6182\u7121\u60f1\uff0c\u65e9\u5165\u6cd5\u6d77\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u795d\u798f \u6240\u6709\u751f\u547d\u548c\u89e3\u548c\u8ae7 \u4e92\u76f8\u5584\u5f85 \u5171\u4eab\u5171\u5584\u5171\u89ba \u4f4f\u4f5b\u7a76\u7adf\u5b89\u6a02 \u8207\u85e5\u5e2b\u4f5b\u7121\u7570\u3002\u7279\u5225\u662f\u5973\u6027\u8207\u5b69\u5b50\uff0c\u90fd\u80fd\u88ab\u5584\u5f85\uff0c\u5b89\u5168\u3001\u5b89\u5fc3\uff0c\u7121\u6182\u7121\u60f1\uff0c\u65e9\u5165\u6cd5\u6d77<\/h3>\n\n                      <ul class=\"vw-tags\">\n              <li>#\u6240\u6709\u751f\u547d<\/li>            <\/ul>\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">\ud83d\udca0 \u4e00\u4f4d\u5584\u53cb<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.12.29<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"3640\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">1<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"2778\"\n                 data-liked=\"0\"\n                 data-target=\"event\"\n                 data-date=\"2025-12-05T11:56:21+08:00\"\n                 data-tags=\"\u5927\u5bb6\"\n                 data-text=\"\u5e0c\u671b\u9999\u6e2f\u5b8f\u798f\u82d1\u53d7\u50b7\u7684\u4eba\u90fd\u80fd\u65e9\u65e5\u5eb7\u5fa9 \u4ea1\u8005\u90fd\u80fd\u65e9\u65e5\u5f80\u751f\u6de8\u571f \u5e0c\u671b\u9999\u6e2f\u5b8f\u798f\u82d1\u53d7\u50b7\u7684\u4eba\u90fd\u80fd\u65e9\u65e5\u5eb7\u5fa9 \u4ea1\u8005\u90fd\u80fd\u65e9\u65e5\u5f80\u751f\u6de8\u571f\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u5e0c\u671b\u9999\u6e2f\u5b8f\u798f\u82d1\u53d7\u50b7\u7684\u4eba\u90fd\u80fd\u65e9\u65e5\u5eb7\u5fa9 \u4ea1\u8005\u90fd\u80fd\u65e9\u65e5\u5f80\u751f\u6de8\u571f<\/h3>\n\n                      <ul class=\"vw-tags\">\n              <li>#\u5927\u5bb6<\/li>            <\/ul>\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">\ud83d\udca0 \u5fc3\u5fc3<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.12.05<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"2778\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">4<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"2701\"\n                 data-liked=\"0\"\n                 data-target=\"person\"\n                 data-date=\"2025-10-27T16:46:00+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u5beb\u7d66\u5929\u4e0a\u7684\u7238\u7238\u3002\u7238\uff0c\u53c8\u904e\u4e86\u4e00\u5e74\uff0c\u5bb6\u88e1\u4e00\u5207\u90fd\u597d\uff0c\u8acb\u60a8\u653e\u5fc3\u3002\u96d6\u7136\u60a8\u4e0d\u5728\u8eab\u908a\uff0c\u4f46\u60a8\u7684\u6559\u8aa8\u6211\u5011\u90fd\u8a18\u5728\u5fc3\u88e1\u3002\u5e0c\u671b\u60a8\u5728\u53e6\u4e00\u500b\u4e16\u754c\u4e5f\u80fd\u81ea\u5728\u900d\u9059\uff0c\u6211\u5011\u5f88\u60f3\u5ff5\u60a8\u3002\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u5beb\u7d66\u5929\u4e0a\u7684\u7238\u7238\u3002\u7238\uff0c\u53c8\u904e\u4e86\u4e00\u5e74\uff0c\u5bb6\u88e1\u4e00\u5207\u90fd\u597d\uff0c\u8acb\u60a8\u653e\u5fc3\u3002\u96d6\u7136\u60a8\u4e0d\u5728\u8eab\u908a\uff0c\u4f46\u60a8\u7684\u6559\u8aa8\u6211\u5011\u90fd\u8a18\u5728\u5fc3\u88e1\u3002\u5e0c\u671b\u60a8\u5728\u53e6\u4e00\u500b\u4e16\u754c\u4e5f\u80fd\u81ea\u5728\u900d\u9059\uff0c\u6211\u5011\u5f88\u60f3\u5ff5\u60a8\u3002<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">\ud83d\udca0 \u4e00\u4f4d\u5584\u53cb<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.27<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"2701\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">5<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"2700\"\n                 data-liked=\"0\"\n                 data-target=\"person\"\n                 data-date=\"2025-10-08T16:48:00+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u9858\u773e\u751f\u96e2\u82e6\u5f97\u6a02\u3002\u9858\u5c07\u4eca\u65e5\u6301\u8aa6\u85e5\u5e2b\u704c\u9802\u771f\u8a00\u4e4b\u529f\u5fb7\uff0c\u8ff4\u5411\u7d66\u6cd5\u754c\u4e00\u5207\u773e\u751f\u3002\u7948\u9858\u6240\u6709\u53d7\u8eab\u5fc3\u75c5\u75db\u6298\u78e8\u7684\u4eba\uff0c\u90fd\u80fd\u5f97\u5230\u85e5\u77f3\u7684\u6551\u6cbb\u8207\u5fc3\u9748\u7684\u6170\u85c9\uff0c\u91cd\u7372\u5065\u5eb7\u5e73\u5b89\u3002\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u9858\u773e\u751f\u96e2\u82e6\u5f97\u6a02\u3002\u9858\u5c07\u4eca\u65e5\u6301\u8aa6\u85e5\u5e2b\u704c\u9802\u771f\u8a00\u4e4b\u529f\u5fb7\uff0c\u8ff4\u5411\u7d66\u6cd5\u754c\u4e00\u5207\u773e\u751f\u3002\u7948\u9858\u6240\u6709\u53d7\u8eab\u5fc3\u75c5\u75db\u6298\u78e8\u7684\u4eba\uff0c\u90fd\u80fd\u5f97\u5230\u85e5\u77f3\u7684\u6551\u6cbb\u8207\u5fc3\u9748\u7684\u6170\u85c9\uff0c\u91cd\u7372\u5065\u5eb7\u5e73\u5b89\u3002<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">\ud83d\udca0 \u4e00\u4f4d\u5584\u53cb<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.08<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"2700\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">3<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"2699\"\n                 data-liked=\"0\"\n                 data-target=\"person\"\n                 data-date=\"2025-10-08T16:42:00+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u8aa0\u5fc3\u61fa\u6094\u8207\u767c\u9858\u3002 \u56de\u60f3\u904e\u53bb\u56e0\u70ba\u813e\u6c23\u4e0d\u597d\uff0c\u7121\u610f\u9593\u50b7\u5bb3\u4e86\u8eab\u908a\u89aa\u8fd1\u7684\u4eba\u3002\u4eca\u65e5\u8aa0\u5fc3\u5728\u4f5b\u524d\u61fa\u6094\uff0c\u5e0c\u671b\u80fd\u66f4\u6709\u667a\u6167\u8207\u5b9a\u529b\u63a7\u5236\u60c5\u7dd2\uff0c\u4e26\u5c07\u6301\u5492\u529f\u5fb7\u8ff4\u5411\u7d66\u51a4\u89aa\u50b5\u4e3b\uff0c\u89e3\u51a4\u91cb\u7d50\u3002\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u8aa0\u5fc3\u61fa\u6094\u8207\u767c\u9858\u3002 \u56de\u60f3\u904e\u53bb\u56e0\u70ba\u813e\u6c23\u4e0d\u597d\uff0c\u7121\u610f\u9593\u50b7\u5bb3\u4e86\u8eab\u908a\u89aa\u8fd1\u7684\u4eba\u3002\u4eca\u65e5\u8aa0\u5fc3\u5728\u4f5b\u524d\u61fa\u6094\uff0c\u5e0c\u671b\u80fd\u66f4\u6709\u667a\u6167\u8207\u5b9a\u529b\u63a7\u5236\u60c5\u7dd2\uff0c\u4e26\u5c07\u6301\u5492\u529f\u5fb7\u8ff4\u5411\u7d66\u51a4\u89aa\u50b5\u4e3b\uff0c\u89e3\u51a4\u91cb\u7d50\u3002<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">\ud83d\udca0 \u4e00\u4f4d\u5584\u53cb<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.08<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"2699\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">3<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"2673\"\n                 data-liked=\"0\"\n                 data-target=\"region\"\n                 data-date=\"2025-10-08T16:02:00+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u9858\u6230\u706b\u5e73\u606f\uff0c\u4e16\u754c\u7121\u707d\u3002\u770b\u5230\u65b0\u805e\u4e0a\u53d7\u82e6\u7684\u96e3\u6c11\u8207\u707d\u5340\u756b\u9762\uff0c\u5fc3\u88e1\u771f\u7684\u5f88\u96e3\u904e\u3002\u7948\u9858\u4e16\u754c\u5404\u5730\u7684\u6230\u706b\u80fd\u65e9\u65e5\u6b62\u606f\uff0c\u5929\u707d\u6e1b\u5c11\uff0c\u8b93\u6240\u6709\u4eba\u90fd\u80fd\u64c1\u6709\u4e00\u500b\u5b89\u7a69\u3001\u6c92\u6709\u6050\u61fc\u7684\u5bb6\u5712\u3002\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u9858\u6230\u706b\u5e73\u606f\uff0c\u4e16\u754c\u7121\u707d\u3002\u770b\u5230\u65b0\u805e\u4e0a\u53d7\u82e6\u7684\u96e3\u6c11\u8207\u707d\u5340\u756b\u9762\uff0c\u5fc3\u88e1\u771f\u7684\u5f88\u96e3\u904e\u3002\u7948\u9858\u4e16\u754c\u5404\u5730\u7684\u6230\u706b\u80fd\u65e9\u65e5\u6b62\u606f\uff0c\u5929\u707d\u6e1b\u5c11\uff0c\u8b93\u6240\u6709\u4eba\u90fd\u80fd\u64c1\u6709\u4e00\u500b\u5b89\u7a69\u3001\u6c92\u6709\u6050\u61fc\u7684\u5bb6\u5712\u3002<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">\ud83d\udca0 \u4e00\u4f4d\u5584\u53cb<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.08<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"2673\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">7<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"2787\"\n                 data-liked=\"0\"\n                 data-target=\"person\"\n                 data-date=\"2025-10-08T14:48:27+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u7d66\u6700\u611b\u7684\u6bdb\u5c0f\u5b69\u76ae\u76ae\u3002 \u8b1d\u8b1d\u4f60\u901915\u5e74\u4f86\u7684\u966a\u4f34\uff0c\u4f60\u662f\u6211\u5011\u5bb6\u6700\u91cd\u8981\u7684\u4e00\u4efd\u5b50\u3002\u5e0c\u671b\u4f60\u5df2\u7d93\u6c92\u6709\u75c5\u75db\uff0c\u8ddf\u8457\u4f5b\u83e9\u85a9\u7684\u5149\u660e\u53bb\u5230\u66f4\u597d\u7684\u5730\u65b9\u3002\u6c38\u9060\u611b\u4f60\uff0c\u6211\u5011\u6703\u6c38\u9060\u8a18\u5f97\u4f60\u7684\u53ef\u611b\u6a21\u6a23\u3002\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u7d66\u6700\u611b\u7684\u6bdb\u5c0f\u5b69\u76ae\u76ae\u3002 \u8b1d\u8b1d\u4f60\u901915\u5e74\u4f86\u7684\u966a\u4f34\uff0c\u4f60\u662f\u6211\u5011\u5bb6\u6700\u91cd\u8981\u7684\u4e00\u4efd\u5b50\u3002\u5e0c\u671b\u4f60\u5df2\u7d93\u6c92\u6709\u75c5\u75db\uff0c\u8ddf\u8457\u4f5b\u83e9\u85a9\u7684\u5149\u660e\u53bb\u5230\u66f4\u597d\u7684\u5730\u65b9\u3002\u6c38\u9060\u611b\u4f60\uff0c\u6211\u5011\u6703\u6c38\u9060\u8a18\u5f97\u4f60\u7684\u53ef\u611b\u6a21\u6a23\u3002<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">\ud83d\udca0 \u4e00\u4f4d\u5584\u53cb<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.08<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"2787\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">3<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"719\"\n                 data-liked=\"0\"\n                 data-target=\"person\"\n                 data-date=\"2025-10-08T10:51:22+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u7948\u9858\u5abd\u5abd\u624b\u8853\u9806\u5229\u3002\u61c7\u8acb\u85e5\u5e2b\u4f5b\u52a0\u88ab\uff0c\u4fdd\u4f51\u5abd\u5abd\u4e0b\u9031\u4e8c\u7684\u819d\u84cb\u624b\u8853\u4e00\u5207\u9806\u5229\uff0c\u8853\u5f8c\u5fa9\u539f\u826f\u597d\u3002\u5e0c\u671b\u5abd\u5abd\u80fd\u65e9\u65e5\u64fa\u812b\u75bc\u75db\uff0c\u6062\u5fa9\u5065\u5eb7\u7684\u7b11\u5bb9\uff0c\u8b93\u6211\u5011\u6709\u66f4\u591a\u6642\u9593\u966a\u4f34\u5979\u5230\u8655\u8d70\u8d70\u3002\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u7948\u9858\u5abd\u5abd\u624b\u8853\u9806\u5229\u3002\u61c7\u8acb\u85e5\u5e2b\u4f5b\u52a0\u88ab\uff0c\u4fdd\u4f51\u5abd\u5abd\u4e0b\u9031\u4e8c\u7684\u819d\u84cb\u624b\u8853\u4e00\u5207\u9806\u5229\uff0c\u8853\u5f8c\u5fa9\u539f\u826f\u597d\u3002\u5e0c\u671b\u5abd\u5abd\u80fd\u65e9\u65e5\u64fa\u812b\u75bc\u75db\uff0c\u6062\u5fa9\u5065\u5eb7\u7684\u7b11\u5bb9\uff0c\u8b93\u6211\u5011\u6709\u66f4\u591a\u6642\u9593\u966a\u4f34\u5979\u5230\u8655\u8d70\u8d70\u3002<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">\ud83d\udca0 \u4e00\u4f4d\u5584\u53cb<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.08<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"719\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">3<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"2678\"\n                 data-liked=\"0\"\n                 data-target=\"event\"\n                 data-date=\"2025-10-07T16:12:00+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u7948\u6c42\u5de5\u4f5c\u8f49\u8077\u9806\u5229\u3002\u6700\u8fd1\u5728\u8077\u6daf\u5341\u5b57\u8def\u53e3\u611f\u5230\u5f88\u8ff7\u60d8\uff0c\u5e0c\u671b\u80fd\u7372\u5f97\u667a\u6167\u8207\u52c7\u6c23\uff0c\u505a\u51fa\u6b63\u78ba\u7684\u6c7a\u5b9a\u3002\u9858\u63a5\u4e0b\u4f86\u7684\u65b0\u5de5\u4f5c\u80fd\u767c\u63ee\u6240\u9577\uff0c\u9047\u5230\u5584\u89e3\u4eba\u610f\u7684\u540c\u4e8b\u8207\u4e3b\u7ba1\uff0c\u5de5\u4f5c\u9806\u5fc3\u3002\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u7948\u6c42\u5de5\u4f5c\u8f49\u8077\u9806\u5229\u3002\u6700\u8fd1\u5728\u8077\u6daf\u5341\u5b57\u8def\u53e3\u611f\u5230\u5f88\u8ff7\u60d8\uff0c\u5e0c\u671b\u80fd\u7372\u5f97\u667a\u6167\u8207\u52c7\u6c23\uff0c\u505a\u51fa\u6b63\u78ba\u7684\u6c7a\u5b9a\u3002\u9858\u63a5\u4e0b\u4f86\u7684\u65b0\u5de5\u4f5c\u80fd\u767c\u63ee\u6240\u9577\uff0c\u9047\u5230\u5584\u89e3\u4eba\u610f\u7684\u540c\u4e8b\u8207\u4e3b\u7ba1\uff0c\u5de5\u4f5c\u9806\u5fc3\u3002<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">\ud83d\udca0 \u4e00\u4f4d\u5584\u53cb<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.07<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"2678\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">4<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n              <article class=\"vw-card\"\n                 data-id=\"748\"\n                 data-liked=\"0\"\n                 data-target=\"person\"\n                 data-date=\"2025-10-07T04:46:05+08:00\"\n                 data-tags=\"\"\n                 data-text=\"\u7d66\u6b63\u5728\u5316\u7642\u7684\u597d\u53cb\u3002\u89aa\u611b\u7684\uff0c\u77e5\u9053\u9019\u689d\u8def\u5f88\u8f9b\u82e6\uff0c\u4f46\u8acb\u76f8\u4fe1\u4f60\u4e26\u4e0d\u5b64\u55ae\u3002\u6211\u5011\u90fd\u5728\u70ba\u4f60\u96c6\u6c23\u7948\u798f\uff01\u9858\u85e5\u5e2b\u4f5b\u7684\u5149\u660e\u5b88\u8b77\u8457\u4f60\uff0c\u8b93\u7642\u7a0b\u526f\u4f5c\u7528\u6e1b\u5230\u6700\u4f4e\uff0c\u65e9\u65e5\u5eb7\u5fa9\u6b78\u968a\uff01\">\n\n          <h3 class=\"vw-title\">\ud83d\udd6f \u7d66\u6b63\u5728\u5316\u7642\u7684\u597d\u53cb\u3002\u89aa\u611b\u7684\uff0c\u77e5\u9053\u9019\u689d\u8def\u5f88\u8f9b\u82e6\uff0c\u4f46\u8acb\u76f8\u4fe1\u4f60\u4e26\u4e0d\u5b64\u55ae\u3002\u6211\u5011\u90fd\u5728\u70ba\u4f60\u96c6\u6c23\u7948\u798f\uff01\u9858\u85e5\u5e2b\u4f5b\u7684\u5149\u660e\u5b88\u8b77\u8457\u4f60\uff0c\u8b93\u7642\u7a0b\u526f\u4f5c\u7528\u6e1b\u5230\u6700\u4f4e\uff0c\u65e9\u65e5\u5eb7\u5fa9\u6b78\u968a\uff01<\/h3>\n\n          \n          \n          <div class=\"vw-foot\">\n            <span class=\"meta\">\ud83d\udca0 \u4e00\u4f4d\u5584\u53cb<\/span>\n\n            <span class=\"vw-foot-right\">\n              <span class=\"date\">2025.10.07<\/span>\n\n              <button class=\"vw-like\" type=\"button\" data-id=\"748\" aria-label=\"\u795d\u798f\">\n                <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                <span class=\"vw-like-count\">2<\/span>\n              <\/button>\n            <\/span>\n          <\/div>\n        <\/article>\n          <\/div>\n\n    <div class=\"vw-more\"><button id=\"vw-load\">\u8f09\u5165\u66f4\u591a<\/button><\/div>\n  <\/section>\n\n  <style>\n  .vw-wrap{--brand:#1f2937;--muted:#6b7280;--line:#e5e7eb;--card:#fff;--bg:#f8fafc;\n    font-family:system-ui,\"Noto Sans TC\",\"PingFang TC\",sans-serif;background:var(--bg);padding:12px;border-radius:16px}\n  .vw-toolbar{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:12px}\n  .vw-left{display:flex;gap:8px;flex-wrap:wrap}\n  #vw-search{padding:10px 12px;border:1px solid var(--line);border-radius:999px;min-width:240px}\n  #vw-filter,#vw-sort{padding:10px 12px;border:1px solid var(--line);border-radius:12px;background:#fff}\n  #vw-count{color:var(--muted)}\n  .vw-grid{display:grid;gap:14px;grid-template-columns:repeat(1,1fr)}\n  @media(min-width:640px){.vw-grid{grid-template-columns:repeat(2,1fr)}}\n  @media(min-width:1024px){.vw-grid{grid-template-columns:repeat(3,1fr)}}\n  .vw-card{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:14px;box-shadow:0 8px 20px rgba(0,0,0,.06)}\n  .vw-title{margin:0 0 6px;font-size:20px;line-height:1.35;color:#111827;}\n  .vw-tags{list-style:none;margin:6px 0 8px;padding:0;display:flex;flex-wrap:wrap;gap:6px}\n  .vw-tags li{font-size:12px;border:1px dashed #93c5fd;padding:2px 8px;border-radius:999px;color:#2563eb;background:#fff}\n  .vw-body{color:var(--muted);margin:4px 0 0;font-size:14px;line-height:1.6}\n\n  \/* footer\uff1a\u4e0d\u52a0\u9ad8\uff0c\u4fdd\u6301\u539f\u8282\u594f\uff1b\u53f3\u4fa7\u201c\u65e5\u671f+\u6309\u94ae\u201d\u5728\u540c\u4e00\u884c\u4e14\u65e5\u671f\u66f4\u9760\u5de6 *\/\n  .vw-foot{\n    margin-top:10px;color:var(--muted);font-size:13px;\n    border-top:1px solid var(--line);\n    padding-top:8px;\n    display:flex;justify-content:space-between;align-items:center;gap:10px\n  }\n  .vw-foot .meta{\n    min-width:0;\n    flex:1 1 auto;\n    overflow:hidden;\n    text-overflow:ellipsis;\n    white-space:nowrap;\n    padding-right:8px;\n  }\n  .vw-foot-right{\n    flex:0 0 auto;\n    display:inline-flex;\n    align-items:center;\n    gap:14px;              \/* \u5173\u952e\uff1a\u65e5\u671f\u4e0e\u6309\u94ae\u95f4\u8ddd\u66f4\u5927 => \u65e5\u671f\u5f80\u5de6 *\/\n    white-space:nowrap;\n  }\n  .vw-foot .date{font-size:13px;color:var(--muted);}\n\n  .vw-more{display:flex;justify-content:center;margin-top:14px}\n  #vw-load{padding:10px 16px;border-radius:999px;border:1px solid var(--line);background:#fff;cursor:pointer}\n  #vw-load:hover{border-color:#cbd5e1}\n\n  \/* \u795d\u798f\u6309\u94ae\uff1a\u66f4\u5c0f\uff08\u542b\u5df2\u795d\u798f\u72b6\u6001\u4e5f\u4e0d\u6491\u5927\uff09\uff0c\u4e14\u4e0d\u906e\u6321\u65e5\u671f\uff08\u5df2\u5728\u5e03\u5c40\u4e2d\u8ba9\u4f4d\uff09 *\/\n  .vw-like{\n    display:inline-flex;align-items:center;gap:3px;\n    padding:2px 6px;          \/* \u66f4\u5c0f *\/\n    border-radius:999px;\n    border:1px solid var(--line);\n    background:#fff;\n    cursor:pointer;\n    font-size:10px;           \/* \u66f4\u5c0f *\/\n    line-height:1;\n    color:#111827;\n    white-space:nowrap;\n    box-shadow:0 6px 16px rgba(0,0,0,.08);\n    transition:transform .15s ease, box-shadow .15s ease, background-color .15s ease, border-color .15s ease;\n  }\n  .vw-like:hover{transform:translateY(-1px);box-shadow:0 8px 20px rgba(0,0,0,.10);}\n  .vw-like:disabled{opacity:.72;cursor:not-allowed}\n  .vw-like-count{font-variant-numeric:tabular-nums}\n\n  \/* \u5df2\u795d\u798f\u72b6\u6001 *\/\n  .vw-like.is-liked{border-color:#fca5a5;background:#fff1f2;}\n\n  \/* \u5f39\u8df3\u52a8\u753b *\/\n  @keyframes vwLikePop{\n    0%{ transform:scale(1); }\n    35%{ transform:scale(1.08); }\n    100%{ transform:scale(1); }\n  }\n  .vw-like.is-burst{ animation:vwLikePop .28s ease-out; }\n\n  \/* +1 \u6d6e\u6807 *\/\n  @keyframes vwPlusOne{\n    0%{ opacity:0; transform:translateY(0) scale(.95); }\n    20%{ opacity:1; }\n    100%{ opacity:0; transform:translateY(-10px) scale(1.02); }\n  }\n  .vw-like.is-burst::after{\n    content:\"+1\";\n    position:absolute;\n    margin-left:0;\n    top:-10px;\n    right:2px;\n    font-size:12px;\n    font-weight:700;\n    color:#ef4444;\n    animation:vwPlusOne .6s ease-out;\n    pointer-events:none;\n  }\n  \/* \u8ba9 ::after \u7684 absolute \u4ee5\u6309\u94ae\u4e3a\u53c2\u7167 *\/\n  .vw-like{ position:relative; }\n  <\/style>\n\n  <script>\n  (function(){\n    const wrap = document.getElementById('vw-wall-2');\n    if(!wrap) return;\n\n    const grid   = wrap.querySelector('#vw-grid');\n    const search = wrap.querySelector('#vw-search');\n    const filter = wrap.querySelector('#vw-filter');\n    const sort   = wrap.querySelector('#vw-sort');\n    const load   = wrap.querySelector('#vw-load');\n    const count  = wrap.querySelector('#vw-count');\n\n    const ajaxUrl   = 'https:\/\/awakeunity.com\/wp-admin\/admin-ajax.php';\n    const likeNonce = 'e414a296d4';\n    const LS_PREFIX = 'vw_like_';\n\n    let page = 1, loading = false, done = false;\n\n    function splitFirstSentence(full){\n      full = (full || '').replace(\/\\s+\/g,' ').trim();\n      if(!full) return {title:'', rest:''};\n      const m = full.split(\/(?<=[\u3002\uff01\uff1f!?])|\\n\/);\n      let first = (m[0] || '').trim();\n      if(!first) first = full.slice(0,33);\n      let title = first.slice(0,33);\n      let rest = full.slice(first.length).trim();\n      if(!rest || rest.length < 6 || rest.toLowerCase()===title.toLowerCase()) rest='';\n      return {title, rest};\n    }\n\n    function fmtDate(iso){\n      const d = new Date(iso);\n      const y = d.getFullYear();\n      const m = String(d.getMonth()+1).padStart(2,'0');\n      const day = String(d.getDate()).padStart(2,'0');\n      return `${y}.${m}.${day}`;\n    }\n\n    function setBlessedUI(btn){\n      btn.classList.add('is-liked');\n      btn.setAttribute('aria-pressed','true');\n      btn.setAttribute('aria-label','\u5df2\u795d\u798f');\n      btn.disabled = true;\n\n      const ico = btn.querySelector('.vw-like-ico');\n      const text = btn.querySelector('.vw-like-text');\n      if(ico) ico.textContent = '\u2764\ufe0f';\n      if(text) text.textContent = '\u5df2\u795d\u798f';\n    }\n\n    function markLikedUI(card){\n      const id = card.getAttribute('data-id');\n      if(!id) return;\n\n      const btn = card.querySelector('.vw-like');\n      if(!btn) return;\n\n      const likedByServer = card.getAttribute('data-liked') === '1';\n      const likedByLS = !!localStorage.getItem(LS_PREFIX + id);\n\n      if(likedByServer || likedByLS){\n        setBlessedUI(btn);\n      }\n    }\n\n    function apply(){\n      const kw = (search.value || '').trim().toLowerCase();\n      const typ = filter.value;\n      const cards = [...grid.querySelectorAll('.vw-card')];\n\n      cards.forEach(card=>{\n        const text = card.dataset.text || '';\n        const tags = card.dataset.tags || '';\n        const tgt  = card.dataset.target || '';\n        const matchKw = kw ? (text.includes(kw) || tags.includes(kw)) : true;\n        const matchTp = typ ? (tgt === typ) : true;\n        card.hidden = !(matchKw && matchTp);\n      });\n\n      const visible = cards.filter(c=>!c.hidden);\n      visible.sort((a,b)=>{\n        const da = new Date(a.dataset.date).getTime();\n        const db = new Date(b.dataset.date).getTime();\n        return sort.value === 'newest' ? (db - da) : (da - db);\n      }).forEach(c=>grid.appendChild(c));\n\n      count.textContent = visible.length + ' \u7b46';\n    }\n\n    async function like(postId, btn){\n      if(!postId || !btn) return;\n\n      if(localStorage.getItem(LS_PREFIX + postId) || btn.classList.contains('is-liked')) return;\n      btn.disabled = true;\n\n      try{\n        const body = new URLSearchParams();\n        body.set('action', 'vw_like');\n        body.set('post_id', postId);\n        body.set('nonce', likeNonce);\n\n        const res = await fetch(ajaxUrl, {\n          method: 'POST',\n          headers: {'Content-Type':'application\/x-www-form-urlencoded; charset=UTF-8'},\n          body: body.toString(),\n          credentials: 'same-origin'\n        });\n\n        const json = await res.json().catch(()=>null);\n        if(!res.ok || !json || !json.success){\n          btn.disabled = false;\n          return;\n        }\n\n        const likes = (json.data && typeof json.data.likes !== 'undefined') ? parseInt(json.data.likes,10) : null;\n        if(Number.isFinite(likes)){\n          const cnt = btn.querySelector('.vw-like-count');\n          if(cnt) cnt.textContent = likes;\n        }\n\n        localStorage.setItem(LS_PREFIX + postId, '1');\n        setBlessedUI(btn);\n\n        btn.classList.add('is-burst');\n        setTimeout(()=>btn.classList.remove('is-burst'), 350);\n\n      }catch(e){\n        btn.disabled = false;\n      }\n    }\n\n    \/\/ \u4e8b\u4ef6\u59d4\u6258\uff1a\u52a8\u6001\u8f7d\u5165\u7684\u5361\u7247\u4e5f\u652f\u6301\u795d\u798f\n    wrap.addEventListener('click', function(e){\n      const btn = e.target.closest && e.target.closest('.vw-like');\n      if(!btn) return;\n      const postId = btn.getAttribute('data-id');\n      like(postId, btn);\n    });\n\n    async function loadMore(){\n      if(loading || done) return;\n      loading = true; load.textContent = '\u8f09\u5165\u4e2d\u2026';\n\n      const perPage = parseInt(wrap.dataset.perPage || '18', 10);\n      page += 1;\n\n      try{\n        const url = new URL('https:\/\/awakeunity.com\/en\/wp-json\/wp\/v2\/vows');\n        url.searchParams.set('status', 'publish');\n        url.searchParams.set('orderby','date');\n        url.searchParams.set('order', sort.value==='newest'?'desc':'asc');\n        url.searchParams.set('per_page', perPage);\n        url.searchParams.set('page', page);\n        url.searchParams.set('_embed','1');\n\n        const res = await fetch(url);\n        if(res.status===400 || res.status===404){ done = true; load.textContent='\u6c92\u6709\u66f4\u591a\u4e86'; return; }\n        if(!res.ok) throw new Error('HTTP '+res.status);\n\n        const data = await res.json();\n        if(!data.length){ done = true; load.textContent='\u6c92\u6709\u66f4\u591a\u4e86'; return; }\n\n        data.forEach(post=>{\n          const raw   = (post.content && post.content.rendered) ? post.content.rendered.replace(\/<[^>]*>\/g,'') : '';\n          const split = splitFirstSentence(raw);\n          const title = split.title || ((post.title && post.title.rendered) ? post.title.rendered.replace(\/<[^>]*>\/g,'') : '\uff08\u7121\u6a19\u984c\uff09');\n          const rest  = split.rest;\n          const date  = post.date;\n\n          const meta  = post.meta || {};\n          const tags  = (meta.tags || '').toString();\n          const sig   = (meta.vow_signature || '').toString().trim();\n          const author = sig !== '' ? sig : '\u4e00\u4f4d\u5584\u53cb';\n\n          const likes = parseInt(meta.vw_likes || 0, 10) || 0;\n          const pid   = post.id;\n\n          const card = document.createElement('article');\n          card.className='vw-card';\n          card.dataset.id     = String(pid);\n          card.dataset.liked  = '0';\n          card.dataset.target = (meta.target_type||'').toString();\n          card.dataset.date   = date;\n          card.dataset.tags   = tags.toLowerCase();\n          card.dataset.text   = (title+' '+raw).toLowerCase();\n\n          card.innerHTML = `\n            <h3 class=\"vw-title\">\ud83d\udd6f ${title}<\/h3>\n            ${ tags ? `<ul class=\"vw-tags\">${tags.split(',').map(t=>t.trim()).filter(Boolean).map(t=>`<li>#${t}<\/li>`).join('')}<\/ul>` : '' }\n            ${ rest ? `<p class=\"vw-body\">${rest}<\/p>` : '' }\n            <div class=\"vw-foot\">\n              <span class=\"meta\">\ud83d\udca0 ${author}<\/span>\n              <span class=\"vw-foot-right\">\n                <span class=\"date\">${fmtDate(date)}<\/span>\n                <button class=\"vw-like\" type=\"button\" data-id=\"${pid}\" aria-label=\"\u795d\u798f\">\n                  <span class=\"vw-like-ico\" aria-hidden=\"true\">\ud83d\udc4d<\/span>\n                  <span class=\"vw-like-text\">\u795d\u798f<\/span>\n                  <span class=\"vw-like-count\">${likes}<\/span>\n                <\/button>\n              <\/span>\n            <\/div>\n          `;\n\n          grid.appendChild(card);\n          markLikedUI(card);\n        });\n\n        apply();\n        load.textContent='\u8f09\u5165\u66f4\u591a';\n      }catch(e){\n        load.textContent='\u8f09\u5165\u5931\u6557\uff0c\u91cd\u8a66';\n      }finally{\n        loading = false;\n      }\n    }\n\n    search.addEventListener('input', apply);\n    filter.addEventListener('change', apply);\n    sort.addEventListener('change', apply);\n    load.addEventListener('click', loadMore);\n\n    [...grid.querySelectorAll('.vw-card')].forEach(markLikedUI);\n    apply();\n  })();\n  <\/script>\n   is used.\r\n   All selectors are scoped to \".elementor-widget-shortcode .vw-wrap\" so they won't leak.\r\n*\/\r\n.elementor-widget-shortcode .vw-wrap{\r\n  --bg-start:#fff9f1;\r\n  --bg-end:#fff1df;\r\n  --card:#ffffff;\r\n  --muted:#6b7280;\r\n  --accent:#ff8f2a;\r\n  font-family: \"Noto Sans TC\",\"PingFang TC\",system-ui,-apple-system,Segoe UI,Roboto,\"Helvetica Neue\",Arial;\r\n  background: linear-gradient(180deg,var(--bg-start),var(--bg-end));\r\n  padding:18px;\r\n  border-radius:16px;\r\n  box-sizing:border-box;\r\n  color:#0f1724;\r\n}\r\n\r\n\/* toolbar *\/\r\n.elementor-widget-shortcode .vw-wrap .vw-toolbar{\r\n  display:flex; justify-content:space-between; align-items:center; gap:12px; flex-wrap:wrap; margin-bottom:14px;\r\n}\r\n.elementor-widget-shortcode .vw-wrap .vw-left{ display:flex; gap:10px; align-items:center; flex-wrap:wrap; }\r\n.elementor-widget-shortcode .vw-wrap #vw-search{\r\n  min-width:260px;padding:10px 14px;border-radius:999px;border:1px solid rgba(0,0,0,0.06); background:#fff;\r\n  box-shadow: inset 0 1px 0 rgba(0,0,0,0.02);\r\n  font-size:14px;\r\n}\r\n.elementor-widget-shortcode .vw-wrap select{\r\n  padding:9px 12px;border-radius:12px;border:1px solid rgba(0,0,0,0.05); background:#fff; font-size:14px;\r\n}\r\n\r\n\/* count *\/\r\n.elementor-widget-shortcode .vw-wrap #vw-count{ font-weight:700; color:#0b2540 }\r\n\r\n\/* responsive grid with auto-rows used by JS to simulate masonry *\/\r\n.elementor-widget-shortcode .vw-wrap .vw-grid{\r\n  display:grid;\r\n  grid-template-columns:repeat(1,1fr);\r\n  gap:16px;\r\n  grid-auto-rows: 12px; \/* small unit; JS will calculate spans *\/\r\n  align-items:start;\r\n}\r\n@media(min-width:640px){ .elementor-widget-shortcode .vw-wrap .vw-grid{ grid-template-columns:repeat(2,1fr) } }\r\n@media(min-width:1024px){ .elementor-widget-shortcode .vw-wrap .vw-grid{ grid-template-columns:repeat(3,1fr) } }\r\n\r\n\/* card visual *\/\r\n.elementor-widget-shortcode .vw-wrap .vw-card{\r\n  background:var(--card); border-radius:14px; padding:14px; box-shadow:0 8px 24px rgba(16,24,40,0.06);\r\n  border:1px solid rgba(0,0,0,0.03); display:flex; flex-direction:column; transition:transform .18s ease, box-shadow .18s ease, opacity .3s;\r\n  overflow:hidden;\r\n}\r\n.elementor-widget-shortcode .vw-wrap .vw-card:hover{\r\n  transform:translateY(-6px); box-shadow:0 20px 40px rgba(16,24,40,0.10);\r\n}\r\n\r\n\/* card head *\/\r\n.elementor-widget-shortcode .vw-wrap .vw-card-head{ display:flex; justify-content:space-between; align-items:center; margin-bottom:8px; gap:8px; }\r\n.elementor-widget-shortcode .vw-wrap .vw-badge{\r\n  font-size:12px; padding:6px 10px; border-radius:999px; color:#1f6fe5; border:1px solid rgba(31,111,229,0.12);\r\n  background:linear-gradient(180deg, rgba(31,111,229,0.06), #fff);\r\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,0.02);\r\n}\r\n.elementor-widget-shortcode .vw-wrap .vw-date{ font-size:12px; color:var(--muted) }\r\n\r\n\/* title\/tags\/body *\/\r\n.elementor-widget-shortcode .vw-wrap .vw-title{ margin:0 0 8px; font-size:20px; line-height:1.25; font-weight:800; word-break:break-word; }\r\n.elementor-widget-shortcode .vw-wrap .vw-tags{ display:flex; gap:8px; flex-wrap:wrap; margin:6px 0 10px; padding:0; list-style:none; }\r\n.elementor-widget-shortcode .vw-wrap .vw-tags li{ font-size:12px; padding:4px 10px; border-radius:999px; background:#fff; color:#1658c7; border:1px dashed rgba(37,99,235,0.14); }\r\n.elementor-widget-shortcode .vw-wrap .vw-body{ color:var(--muted); margin:0; font-size:14px; line-height:1.65; min-height:48px; }\r\n\r\n\/* foot\/actions *\/\r\n.elementor-widget-shortcode .vw-wrap .vw-foot{ margin-top:12px; display:flex; justify-content:space-between; align-items:center; gap:12px; border-top:1px solid rgba(0,0,0,0.03); padding-top:12px; }\r\n.elementor-widget-shortcode .vw-wrap .vw-actions{ display:flex; gap:8px; align-items:center; }\r\n.elementor-widget-shortcode .vw-wrap .vw-actions button{ padding:8px 12px; border-radius:999px; border:1px solid rgba(0,0,0,0.05); background:#fff; cursor:pointer; font-size:13px; }\r\n.elementor-widget-shortcode .vw-wrap .vw-actions .vw-share{ color:var(--accent); border-color: rgba(255,120,40,0.12); }\r\n.elementor-widget-shortcode .vw-wrap .vw-actions .vw-expand{ color:#1f6fe5; }\r\n\r\n\/* load more button *\/\r\n.elementor-widget-shortcode .vw-wrap #vw-load{ background:linear-gradient(180deg,#ffb56f,#ff8f2a); color:#fff; border:none; padding:10px 18px; border-radius:999px; cursor:pointer; box-shadow:0 10px 30px rgba(255,143,42,0.12); }\r\n\r\n\/* modal *\/\r\n.elementor-widget-shortcode .vw-wrap #vw-modal-root{ z-index:99999; position:relative; }\r\n.elementor-widget-shortcode .vw-wrap .vw-modal{ position:fixed; inset:0; display:flex; align-items:center; justify-content:center; background:rgba(0,0,0,0.45); }\r\n.elementor-widget-shortcode .vw-wrap .vw-modal .vw-modal-card{ background:#fff; padding:18px; border-radius:12px; max-width:900px; width:100%; max-height:90vh; overflow:auto; }\r\n.elementor-widget-shortcode .vw-wrap .vw-modal .close{ float:right; cursor:pointer; background:none; border:none; font-size:14px; }\r\n\r\n.elementor-widget-shortcode .vw-wrap .vw-card[hidden]{ display:none !important; }\r\n\r\n\/* animations *\/\r\n.elementor-widget-shortcode .vw-wrap .vw-card{ opacity:0; transform:translateY(8px); }\r\n.elementor-widget-shortcode .vw-wrap .vw-card.visible{ opacity:1; transform:translateY(0); transition:opacity .36s ease, transform .36s ease; }\r\n\r\n\/* small devices *\/\r\n@media(max-width:420px){\r\n  .elementor-widget-shortcode .vw-wrap .vw-title{ font-size:18px }\r\n  .elementor-widget-shortcode .vw-wrap .vw-body{ font-size:13px }\r\n}\r\n<\/style>\r\n\r\n<script>\r\n\/* ===== Scoped JS: masonry auto-span + UI behaviors =====\r\n   Place this script in the same HTML widget (after the shortcode) or footer.\r\n*\/\r\n(function(){\r\n  \/\/ find the wrapper that contains the shortcode output inside Elementor's shortcode widget\r\n  const wrapper = document.querySelector('.elementor-widget-shortcode .vw-wrap');\r\n  if(!wrapper) return;\r\n\r\n  const grid = wrapper.querySelector('.vw-grid');\r\n  const loadBtn = wrapper.querySelector('#vw-load');\r\n  const search = wrapper.querySelector('#vw-search');\r\n  const filter = wrapper.querySelector('#vw-filter');\r\n  const project = wrapper.querySelector('#vw-project');\r\n  const sort = wrapper.querySelector('#vw-sort');\r\n  const count = wrapper.querySelector('#vw-count');\r\n\r\n  \/\/ masonry-like grid span calculation\r\n  function relayout(){\r\n    if(!grid) return;\r\n    const style = window.getComputedStyle(grid);\r\n    const rowHeight = parseFloat(style.getPropertyValue('grid-auto-rows')) || 8;\r\n    const gap = parseFloat(style.getPropertyValue('gap')) || parseFloat(style.getPropertyValue('grid-row-gap')) || 16;\r\n\r\n    Array.from(grid.children).forEach(item => {\r\n      if(item.hidden) { item.style.gridRowEnd = 'span 1'; return; }\r\n      item.style.gridRowEnd = null; \/\/ reset\r\n      const contentH = item.getBoundingClientRect().height;\r\n      const span = Math.ceil((contentH + gap) \/ (rowHeight + gap));\r\n      item.style.gridRowEnd = 'span ' + Math.max(1, span);\r\n    });\r\n  }\r\n\r\n  \/\/ reveal animation\r\n  function revealCards(){\r\n    const cards = Array.from(grid.querySelectorAll('.vw-card'));\r\n    cards.forEach((c,i)=>{\r\n      setTimeout(()=> c.classList.add('visible'), 80 + i*30);\r\n    });\r\n  }\r\n\r\n  \/\/ filter \/ search \/ sort logic (client-side)\r\n  function applyFilters(){\r\n    const kw = (search && search.value || '').trim().toLowerCase();\r\n    const typ = (filter && filter.value) || '';\r\n    const proj = (project && project.value) || '';\r\n    const sortVal = (sort && sort.value) || 'newest';\r\n\r\n    const cards = Array.from(grid.querySelectorAll('.vw-card'));\r\n    cards.forEach(card=>{\r\n      const text = (card.dataset.text || '').toLowerCase();\r\n      const tags = (card.dataset.tags || '').toLowerCase();\r\n      const target = (card.dataset.target || '').toLowerCase();\r\n      const p = (card.dataset.project || '').toLowerCase();\r\n\r\n      const matchKw = !kw || text.includes(kw) || tags.includes(kw);\r\n      const matchType = !typ || target === typ;\r\n      const matchProj = !proj || p === proj;\r\n\r\n      card.hidden = !(matchKw && matchType && matchProj);\r\n    });\r\n\r\n    \/\/ reorder DOM by date\r\n    const visible = Array.from(grid.querySelectorAll('.vw-card')).filter(c=>!c.hidden);\r\n    visible.sort((a,b)=>{\r\n      const da = new Date(a.dataset.date).getTime();\r\n      const db = new Date(b.dataset.date).getTime();\r\n      return sortVal === 'newest' ? (db - da) : (da - db);\r\n    }).forEach(c=> grid.appendChild(c));\r\n\r\n    if(count) count.textContent = visible.length + ' \u7b46';\r\n    relayout();\r\n  }\r\n\r\n  \/\/ modal helper\r\n  function openModal(html){\r\n    let root = wrapper.querySelector('#vw-modal-root');\r\n    if(!root){\r\n      root = document.createElement('div'); root.id = 'vw-modal-root'; wrapper.appendChild(root);\r\n    }\r\n    root.innerHTML = '<div class=\"vw-modal\" id=\"__vw_modal\"><div class=\"vw-modal-card\"><button class=\"close\" id=\"__vw_modal_close\">\u95dc\u9589<\/button><div class=\"vw-modal-body\">'+html+'<\/div><\/div><\/div>';\r\n    root.style.display='block';\r\n    document.getElementById('__vw_modal_close').addEventListener('click', ()=>{ root.style.display='none'; root.innerHTML=''; });\r\n  }\r\n\r\n  \/\/ event delegation for card actions\r\n  grid.addEventListener('click', function(e){\r\n    const expand = e.target.closest('.vw-expand');\r\n    if(expand){\r\n      const full = expand.getAttribute('data-full') ? decodeURIComponent(expand.getAttribute('data-full')) : (expand.dataset.full || '');\r\n      openModal('<h3>\u5b8c\u6574\u9858\u6587<\/h3><div style=\"white-space:pre-wrap;\">'+String(full).replace(\/<\/g,'&lt;')+'<\/div>');\r\n      return;\r\n    }\r\n    const share = e.target.closest('.vw-share');\r\n    if(share){\r\n      const title = share.getAttribute('data-title') ? decodeURIComponent(share.getAttribute('data-title')) : (share.dataset.title||'');\r\n      const text = share.getAttribute('data-text') ? decodeURIComponent(share.getAttribute('data-text')) : (share.dataset.text||'');\r\n      if(navigator.share){\r\n        navigator.share({title: title, text: text}).catch(()=>{});\r\n      }else if(navigator.clipboard){\r\n        navigator.clipboard.writeText(title + '\\n' + text).then(()=> alert('\u5206\u4eab\u5167\u5bb9\u5df2\u8907\u88fd')).catch(()=> alert('\u8907\u88fd\u5931\u6557'));\r\n      }else{\r\n        alert(title + '\\n\\n' + text);\r\n      }\r\n      return;\r\n    }\r\n    const report = e.target.closest('.vw-report');\r\n    if(report){\r\n      const id = report.getAttribute('data-id') || report.dataset.id;\r\n      if(!confirm('\u78ba\u5b9a\u8981\u6aa2\u8209\u6b64\u689d\u7948\u798f\u55ce\uff1f\u7cfb\u7d71\u5c07\u9001\u4ea4\u7ba1\u7406\u54e1\u5be9\u6838\u3002')) return;\r\n      \/\/ placeholder: send to your own endpoint. Change URL on server integration.\r\n      fetch('<?php try { echo esc_js( rest_url(\"vow\/v1\/report\") ); } catch(e) { \/* noop in static snippet *\/ } ?>', {\r\n        method: 'POST',\r\n        headers: {'Content-Type':'application\/json'},\r\n        body: JSON.stringify({id: id})\r\n      }).then(r=>r.json()).then(data=>{\r\n        alert((data && data.ok) ? '\u6aa2\u8209\u5df2\u9001\u51fa' : '\u6aa2\u8209\u63d0\u4ea4\u5931\u6557');\r\n      }).catch(()=> alert('\u6aa2\u8209\u767c\u751f\u932f\u8aa4\uff08\u793a\u610f\uff09'));\r\n      return;\r\n    }\r\n  });\r\n\r\n  \/\/ recalc when images\/fonts\/layout change or children added\/removed\r\n  const resizeObserver = new ResizeObserver(()=> relayout());\r\n  resizeObserver.observe(grid);\r\n\r\n  const mutationObserver = new MutationObserver(()=> {\r\n    relayout();\r\n    revealCards();\r\n  });\r\n  mutationObserver.observe(grid, {childList:true, subtree:true});\r\n\r\n  window.addEventListener('resize', ()=> relayout());\r\n  \/\/ attach UI listeners (if controls exist)\r\n  if(search) search.addEventListener('input', applyFilters);\r\n  if(filter) filter.addEventListener('change', applyFilters);\r\n  if(project) project.addEventListener('change', applyFilters);\r\n  if(sort) sort.addEventListener('change', applyFilters);\r\n  if(loadBtn) loadBtn.addEventListener('click', function(){\r\n    \/\/ let the existing load-more logic in your shortcode run (which appends to grid),\r\n    \/\/ our observer will pick up DOM changes and relayout automatically.\r\n    \/\/ Provide a small UX hint:\r\n    loadBtn.disabled = true; loadBtn.textContent = '\u8f09\u5165\u4e2d\u2026';\r\n    setTimeout(()=> { loadBtn.disabled = false; loadBtn.textContent = '\u8f09\u5165\u66f4\u591a'; }, 1200);\r\n  });\r\n\r\n  \/\/ initial layout + reveal once DOM settled\r\n  setTimeout(()=>{ relayout(); revealCards(); applyFilters(); }, 120);\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>\u7948\u798f\u7246 \u532f\u805a\u6e05\u6de8\u9858\u529b\uff0c\u8b93\u5149\u660e\u5f7c\u6b64\u76f8\u8b77\uff1b \u4e00\u5ff5\u6148\u60b2\uff0c\u904d\u7167\u5341\u65b9\u3002<\/p>","protected":false},"author":2,"featured_media":0,"parent":173,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"two_page_speed":[],"footnotes":""},"class_list":["post-888","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/awakeunity.com\/en\/wp-json\/wp\/v2\/pages\/888","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/awakeunity.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/awakeunity.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/awakeunity.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/awakeunity.com\/en\/wp-json\/wp\/v2\/comments?post=888"}],"version-history":[{"count":0,"href":"https:\/\/awakeunity.com\/en\/wp-json\/wp\/v2\/pages\/888\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/awakeunity.com\/en\/wp-json\/wp\/v2\/pages\/173"}],"wp:attachment":[{"href":"https:\/\/awakeunity.com\/en\/wp-json\/wp\/v2\/media?parent=888"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}