<div id="photoModal" class="photo-modal" style="display:none;">
  <div class="photo-modal-content">
    <span class="photo-modal-close">&times;</span>
    <div id="photoLoader" class="photo-loader"><div class="photo-spinner"></div></div>
    <span id="prevPhoto" class="photo-arrow left-arrow">&#10094;</span>
    <img id="photoMain" class="photo-main" src="" alt="gallery">
    <span id="nextPhoto" class="photo-arrow right-arrow">&#10095;</span>
    <div id="photoThumbs" class="photo-thumbs"></div>
  </div>
</div>

<style>
body .is-layout-flow > * + *,body .is-layout-constrained > * + * {margin-block-start: 0 !important;}
body{--wp--custom--spacing--outer: min(3vw, 90px) !important;}
body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)) {max-width: 1000px !important;}
.wp-site-blocks > * + * {margin-block-start: 0 !important;}
footer{display: inline-block;}
footer .has-text-align-right{display:none}
.wpgmp_pagination a{color: #29b6f6 !important;}
.photo-modal { display:none; position:fixed; z-index:2147483647 !important; left:0; top:0; width:100%; height:100%; background:rgba(0,0,0,0.95); align-items:center; justify-content:center; }
.photo-modal-content { position:relative; width:90%; max-width:1100px; background:#000; padding:10px; border-radius:8px; }
.photo-main { width:100%; max-height:75vh; object-fit:contain; display:block; margin:0 auto; background:#111; }
.photo-modal-content img { max-width: 100% !important; }
.photo-thumbs { display:flex; gap:8px; overflow-x:auto; padding:10px 0; min-height:80px; justify-content:center; }
.photo-thumbs img { height:60px; cursor:pointer; opacity:0.5; border:2px solid transparent; transition: 0.3s; }
.photo-thumbs img.active { opacity:1; border-color:#fff; }
.photo-arrow { position:absolute; top:50%; color:#fff; font-size:50px; cursor:pointer; padding:20px; z-index:100; transform:translateY(-50%); user-select:none; }
.left-arrow { left:0; } .right-arrow { right:0; }
.photo-modal-close { position:absolute; top:5px; right:15px; color:#fff; font-size:40px; cursor:pointer; z-index:110; }
.photo-loader { position:absolute; inset:0; display:none; align-items:center; justify-content:center; background:rgba(0,0,0,0.8); z-index:105; }
.photo-loader.active { display:flex; }
@media only screen and (max-width: 768px) {
    .wpgmp_pagination { display: flex; flex-direction: column; justify-content: center; align-items: stretch; }
}
@keyframes photoSpin { to { transform:rotate(360deg); } }
.photo-spinner { width:45px; height:45px; border:4px solid rgba(255,255,255,0.3); border-top-color:#fff; border-radius:50%; animation:photoSpin 1s linear infinite; }
</style>

<script>
(function($) {
    window.openPhotoGallery = function(baseUrl) {
        const modal = $("#photoModal"), mainImg = $("#photoMain"), thumbs = $("#photoThumbs"), loader = $("#photoLoader");
        modal.css("display", "flex").hide().fadeIn(200);
        loader.addClass("active");
        thumbs.empty(); mainImg.attr("src", "");
        let gState = { images: [], index: 0 };
        const promises = [];
        for (let i = 1; i <= 10; i++) {
            const src = baseUrl + "/" + i + ".jpg";
            promises.push(new Promise(res => {
                const img = new Image();
                img.onload = () => res({src, i});
                img.onerror = () => res(null);
                img.src = src;
            }));
        }
        Promise.all(promises).then(results => {
            gState.images = results.filter(r => r !== null).sort((a,b) => a.i - b.i);
            if (gState.images.length === 0) {
                mainImg.attr("alt", "No images found.");
                loader.removeClass("active"); return;
            }
            gState.images.forEach((imgObj, idx) => {
                $("<img style='height:60px;margin:5px;cursor:pointer;'>").attr("src", imgObj.src)
                    .on("click", () => showIdx(idx)).appendTo(thumbs);
            });
            function showIdx(idx) {
                gState.index = idx;
                mainImg.attr("src", gState.images[idx].src);
                thumbs.find("img").removeClass("active").eq(idx).addClass("active");
            }
            showIdx(0); loader.removeClass("active");
            $("#prevPhoto").off("click").on("click", (e) => { e.stopPropagation(); if (gState.index > 0) showIdx(gState.index - 1); });
            $("#nextPhoto").off("click").on("click", (e) => { e.stopPropagation(); if (gState.index < gState.images.length - 1) showIdx(gState.index + 1); });
        });
    };

    $(document).ready(function() {
        function fixUrl(url) {
            if (!url) return "";
            var origin = window.location.origin;
            if (window.location.hostname === "yifanaparis.com") {
                // 外网时：把原本带 /wordpress 的资源地址替换为当前纯域名 origin，干净且不带子目录
                return url.replace(/^https?:\/\/192\.168\.0\.119\/wordpress/g, origin)
                          .replace(/^https?:\/\/192\.168\.0\.119/g, origin)
                          .replace("http://", "https://");
            } else {
                return url.replace(/^https?:\/\/192\.168\.0\.119/g, origin);
            }
        }
        var observer = new MutationObserver(function(mutations) {
            mutations.forEach(function(m) {
                m.addedNodes.forEach(function(node) {
                    if (node.nodeType === 1) {
                        var nodeObj = $(node);
                        if (nodeObj.hasClass("leaflet-popup") || nodeObj.find(".wpgmp_infowindow").length > 0 || nodeObj.find("img").length > 0) {
                            nodeObj.find("img").addBack("img").each(function() {
                                var s = $(this).attr("src");
                                if (s && (s.includes("yifanaparis.com") || s.includes("yifanaparis.com\/wordpress"))) {
                                    $(this).attr("src", fixUrl(s));
                                }
                            });
                        }
                    }
                });
            });
        });
        observer.observe(document.body, { childList: true, subtree: true });
        
        $(document).on("click", function(e) {
            var target = $(e.target);
            if (target.is("img") && (target.hasClass("wpgmp_marker_image") || target.closest(".wpgmp_infowindow").length > 0)) {
                var fixedSrc = fixUrl(target.attr("src"));
                window.openPhotoGallery(fixedSrc.substring(0, fixedSrc.lastIndexOf("/")));
                e.preventDefault(); e.stopPropagation();
            }
            if (target.hasClass("photo-modal-close") || target.attr("id") === "photoModal") $("#photoModal").fadeOut(200);
        });
    });
})(jQuery);
</script>{"id":32,"date":"2025-08-03T11:49:19","date_gmt":"2025-08-03T11:49:19","guid":{"rendered":"https:\/\/yifanaparis.com\/wordpress\/?page_id=32"},"modified":"2026-04-22T14:46:54","modified_gmt":"2026-04-22T14:46:54","slug":"milestones","status":"publish","type":"page","link":"https:\/\/yifanaparis.com\/?page_id=32","title":{"rendered":"Milestones"},"content":{"rendered":"\n<div class=\"milestone-timeline\">\r\n  <div class=\"timeline-line\"><\/div>\r\n\r\n  <div class=\"timeline-item\">\r\n    <div class=\"timeline-dot\"><\/div>\r\n \u00a0 \u00a0<div class=\"timeline-date\">1988\/10\/4<\/div><div class=\"timeline-content\"><span class=\"badge badge-dad\">\u7238\u7238<\/span><h3>\u51fa\u751f<\/h3><p>16:25,3.5kg<\/p>\r\n    <\/div>\r\n  <\/div>\r\n\t<div class=\"timeline-item\">\r\n    <div class=\"timeline-dot\"><\/div>\r\n \u00a0 \u00a0<div class=\"timeline-date\">2004\/09-2007\/09<\/div><div class=\"timeline-content\"><span class=\"badge badge-dad\">\u7238\u7238<\/span><h3>\u9996\u90fd\u5e08\u8303\u5927\u5b66\u9644\u5c5e\u5b9e\u9a8c\u4e2d\u5b66<\/h3><p>\u9ad8\u4e2d\u4e09\u5e74<\/p>\r\n    <\/div>\r\n  <\/div>\r\n\t\r\n  <div class=\"timeline-item\">\r\n    <div class=\"timeline-dot\"><\/div>\r\n \u00a0 \u00a0<div class=\"timeline-date\">2007\/09-2010(2011)\/09<\/div><div class=\"timeline-content\"><span class=\"badge badge-dad\">\u7238\u7238<\/span><h3>\u5317\u4eac\u5de5\u4e1a\u5927\u5b66<\/h3><p>\u5927\u5b66\u4e09\u5e74(\u7b2c\u56db\u5e74\u5728\u6cd5\u56fd)<\/p>\r\n    <\/div>\r\n  <\/div>\r\n  \r\n  <div class=\"timeline-item\">\r\n    <div class=\"timeline-dot\"><\/div>\r\n \u00a0 \u00a0<div class=\"timeline-date\">2010\/09-2012\/09<\/div><div class=\"timeline-content\"><span class=\"badge badge-dad\">\u7238\u7238<\/span><h3>EFREI<\/h3><p>\u7814\u7a76\u751fM1+M2<\/p>\r\n    <\/div>\r\n  <\/div>\r\n\t\r\n\t  <div class=\"timeline-item\">\r\n    <div class=\"timeline-dot\"><\/div>\r\n \u00a0 \u00a0<div class=\"timeline-date\">2012\/12-2018\/09<\/div><div class=\"timeline-content\"><span class=\"badge badge-dad\">\u7238\u7238<\/span><h3>ReseauProSante<\/h3><p>\u6cd5\u56fd\u5de5\u4f5c<\/p>\r\n    <\/div>\r\n  <\/div>\r\n\t\r\n\t\t<div class=\"timeline-item\">\r\n    <div class=\"timeline-dot\"><\/div>\r\n \u00a0 \u00a0<div class=\"timeline-date\">2015\/02<\/div><div class=\"timeline-content\"><span class=\"badge badge-mom\">\u5988\u5988<\/span><span class=\"badge badge-dad\">\u7238\u7238<\/span><h3>\u521d\u8bc6<\/h3>\r\n    <\/div>\r\n  <\/div>\r\n\t\r\n\t<div class=\"timeline-item\">\r\n    <div class=\"timeline-dot\"><\/div>\r\n \u00a0 \u00a0<div class=\"timeline-date\">2016\/10<\/div><div class=\"timeline-content\"><span class=\"badge badge-mom\">\u5988\u5988<\/span><span class=\"badge badge-dad\">\u7238\u7238<\/span><h3>\u6c42\u5a5a<\/h3>\r\n    <\/div>\r\n  <\/div>\r\n\t\r\n\t\t  <div class=\"timeline-item\">\r\n    <div class=\"timeline-dot\"><\/div>\r\n \u00a0 \u00a0<div class=\"timeline-date\">2018\/02<\/div><div class=\"timeline-content\"><span class=\"badge badge-mom\">\u5988\u5988<\/span><span class=\"badge badge-dad\">\u7238\u7238<\/span><h3>\u8ba2\u5a5a\u9886\u8bc1<\/h3>\r\n    <\/div>\r\n  <\/div>\r\n\t\r\n  <div class=\"timeline-item\">\r\n    <div class=\"timeline-dot\"><\/div>\r\n    <div class=\"timeline-date\">2018\/12\/07<\/div><div class=\"timeline-content\"><span class=\"badge badge-baby\">\u5b9d\u5b9d<\/span><span class=\"badge badge-mom\">\u5988\u5988<\/span><h3>\u515c\u515c\u51fa\u751f<\/h3><p>\u4e0a\u53488:05\uff0c\u6211\u4eec\u76844kg\u5c0f\u5929\u4f7f\u6b63\u5f0f\u964d\u4e34<\/p>\r\n    <\/div>\r\n  <\/div>\r\n\t\r\n\t<div class=\"timeline-item\">\r\n    <div class=\"timeline-dot\"><\/div>\r\n \u00a0 \u00a0<div class=\"timeline-date\">2021\/09-2025\/09<\/div><div class=\"timeline-content\"><span class=\"badge badge-baby\">\u5b9d\u5b9d<\/span><h3>\u7231\u90ce\u56fd\u9645\u5e7c\u513f\u56ed<\/h3>\r\n    <\/div>\r\n  <\/div>\r\n\t\r\n <div class=\"timeline-item\">\r\n    <div class=\"timeline-dot\"><\/div>\r\n \u00a0 \u00a0<div class=\"timeline-date\">2025\/09<\/div><div class=\"timeline-content\"><span class=\"badge badge-baby\">\u5b9d\u5b9d<\/span><h3>\u82b3\u8349\u5730\u53cc\u82b1\u56ed\u6821\u533a<\/h3><p>\u5c0f\u5b66<\/p>\r\n    <\/div>\r\n  <\/div>\r\n\t\r\n\t\r\n<\/div>\r\n<style>\r\n\t\r\n\/* \u5bb9\u5668\u57fa\u7840\u8bbe\u7f6e *\/\r\n.milestone-timeline {\r\n    position: relative;\r\n    max-width: 1000px;\r\n    margin: 50px auto;\r\n    padding: 20px 0;\r\n    font-family: \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\r\n    overflow: hidden; \/* \u9632\u6b62\u9634\u5f71\u6ea2\u51fa *\/\r\n}\r\n\r\n\/* \u4e2d\u5fc3\u5782\u76f4\u7ebf *\/\r\n.timeline-line {\r\n    position: absolute;\r\n    left: 50%;\r\n    top: 0;\r\n    bottom: 0;\r\n    width: 4px;\r\n    background: #e0e0e0;\r\n    transform: translateX(-50%);\r\n    border-radius: 2px;\r\n}\r\n\r\n\/* \u5355\u4e2a\u8282\u70b9\u5bb9\u5668 *\/\r\n.timeline-item {\r\n    position: relative;\r\n    width: 50%;\r\n    padding: 0px 25px;\r\n    box-sizing: border-box;\r\n}\r\n\r\n\/* \u5947\u6570\u9879\u5728\u5de6\uff0c\u5076\u6570\u9879\u5728\u53f3 *\/\r\n.timeline-item:nth-child(odd) {\r\n    left: 0;\r\n    text-align: right;\r\n}\r\n.timeline-item:nth-child(even) {\r\n    left: 50%;\r\n    text-align: left;\r\n}\r\n\r\n\/* \u8282\u70b9\u5706\u70b9 *\/\r\n.timeline-dot {\r\n    position: absolute;\r\n    top: 30px;\r\n    width: 18px;\r\n    height: 18px;\r\n    background: #fff;\r\n    border: 4px solid #3498db;\r\n    border-radius: 50%;\r\n    z-index: 2;\r\n}\r\n.timeline-item:nth-child(odd) .timeline-dot { right: -11px; }\r\n.timeline-item:nth-child(even) .timeline-dot { left: -11px; }\r\n\r\n\/* \u65e5\u671f\u6587\u672c *\/\r\n.timeline-date {\r\n    display: block;\r\n    font-weight: 700;\r\n    color: #888;\r\n    margin-bottom: 8px;\r\n    font-size: 0.9em;\r\n}\r\n\r\n\/* \u6587\u5b57\u5361\u7247\u5185\u5bb9\u5757 *\/\r\n.timeline-content {\r\n    background: #fff;\r\n    padding: 20px;\r\n    border-radius: 15px;\r\n    box-shadow: 0 10px 30px rgba(0,0,0,0.08);\r\n    transition: transform 0.3s ease;\r\n}\r\n.timeline-content:hover {\r\n    transform: translateY(-5px);\r\n}\r\n.timeline-content h3 {\r\n    margin: 10px 0;\r\n    font-size: 1.25rem;\r\n    color: #333;\r\n}\r\n.timeline-content p {\r\n    color: #666;\r\n    line-height: 1.6;\r\n    font-size: 0.95rem;\r\n    margin: 0;\r\n}\r\n\r\n\/* \u89d2\u8272 Badge \u6837\u5f0f *\/\r\n.badge {\r\n    padding: 4px 12px;\r\n    border-radius: 20px;\r\n    font-size: 0.75rem;\r\n    color: white;\r\n    text-transform: uppercase;\r\n    letter-spacing: 1px;\r\n}\r\n\r\n.timeline-dot { border-color: #ffb35d; }\r\n\/* \u7238\u7238\uff1a\u84dd\u8272 *\/\r\n.badge-dad { background: #3498db; }\r\n\/* \u5988\u5988\uff1a\u7c89\u7d2b\u8272 *\/\r\n.badge-mom  { background: #9b59b6; }\r\n\/* \u5b9d\u5b9d\uff1a\u5ae9\u7c89\u8272 *\/\r\n.badge-baby  { background: #fb8aff; }\r\n\r\n\r\n\/* \u54cd\u5e94\u5f0f\u8bbe\u8ba1\uff1a\u624b\u673a\u7aef *\/\r\n@media screen and (max-width: 768px) {\r\n    .timeline-line {\r\n        left: 30px; \/* \u7ebf\u79fb\u5230\u5de6\u4fa7 *\/\r\n    }\r\n    .timeline-item {\r\n        width: 100%; \/* \u8282\u70b9\u5360\u6ee1\u5168\u5bbd *\/\r\n        padding-left: 70px;\r\n        padding-right: 20px;\r\n        text-align: left !important;\r\n    }\r\n    .timeline-item:nth-child(even) {\r\n        left: 0;\r\n    }\r\n    .timeline-dot {\r\n        left: 19px !important; \/* \u70b9\u79fb\u5230\u5de6\u4fa7\u7ebf\u4e0a *\/\r\n    }\r\n}\r\n<\/style>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":17,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"https:\/\/yifanaparis.com\/index.php?rest_route=\/wp\/v2\/pages\/32"}],"collection":[{"href":"https:\/\/yifanaparis.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/yifanaparis.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/yifanaparis.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yifanaparis.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=32"}],"version-history":[{"count":8,"href":"https:\/\/yifanaparis.com\/index.php?rest_route=\/wp\/v2\/pages\/32\/revisions"}],"predecessor-version":[{"id":93,"href":"https:\/\/yifanaparis.com\/index.php?rest_route=\/wp\/v2\/pages\/32\/revisions\/93"}],"up":[{"embeddable":true,"href":"https:\/\/yifanaparis.com\/index.php?rest_route=\/wp\/v2\/pages\/17"}],"wp:attachment":[{"href":"https:\/\/yifanaparis.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=32"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}