{"id":11916,"date":"2025-11-28T15:45:03","date_gmt":"2025-11-28T15:45:03","guid":{"rendered":"https:\/\/www.billyhung.com\/blog\/?page_id=11916"},"modified":"2026-11-05T05:54:05","modified_gmt":"2026-11-05T05:54:05","slug":"wedding-rundown-planning","status":"publish","type":"page","link":"https:\/\/www.billyhung.com\/blog\/wedding-rundown-planning\/","title":{"rendered":"Wedding Rundown Planning"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"11916\" class=\"elementor elementor-11916\">\n\t\t\t\t<div class=\"elementor-element elementor-element-38defc7 e-flex e-con-boxed e-con e-parent\" data-id=\"38defc7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4a36d2b elementor-widget elementor-widget-html\" data-id=\"4a36d2b\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;photography_ext_link_sidemenu&quot;:&quot;false&quot;,&quot;photography_ext_link_fullmenu&quot;:&quot;false&quot;,&quot;photography_ext_link_closed_fullmenu&quot;:&quot;false&quot;,&quot;photography_ext_mobile_static&quot;:&quot;false&quot;,&quot;photography_ext_is_scrollme&quot;:&quot;false&quot;,&quot;photography_ext_is_smoove&quot;:&quot;false&quot;,&quot;photography_ext_is_parallax_mouse&quot;:&quot;false&quot;,&quot;photography_ext_is_infinite&quot;:&quot;false&quot;,&quot;photography_ext_is_fadeout_animation&quot;:&quot;false&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!--\n====================================================================\n Billy ONAIR Photography \u2014 Wedding Day Rundown Templates & Planner\n For: WordPress Elementor \u2192 HTML Widget (paste everything)\n --------------------------------------------------------------------\n RANK MATH \/ SEO SETTINGS\n \u2022 Slug:          wedding-day-rundown-templates\n \u2022 SEO Title:     Hong Kong Wedding Day Rundown Templates: Half-Day, Full-Day & Auspicious Times | \u9999\u6e2f\u5a5a\u79ae\u6d41\u7a0b\u7bc4\u672c\n \u2022 Meta Desc:     Free Hong Kong wedding day rundown templates from photographer Billy Hung \u2014 half-day and full-day timings, how to plan around an auspicious time (\u5409\u6642), travel time and photo time. \u534a\u65e5\uff0f\u5168\u65e5\u5a5a\u79ae\u6d41\u7a0b\u3001\u5409\u6642\u9ede\u6392\u3001\u9810\u7559\u4ea4\u901a\u53ca\u62cd\u651d\u6642\u9593\u3002\n \u2022 Focus keyword: hong kong wedding day rundown\n \u2022 The builder runs entirely in the page (no AI, no credits); work is kept in the visitor\u2019s browser.\n \u2022 Extra keywords: \u5a5a\u79ae\u6d41\u7a0b, \u5a5a\u79ae\u6d41\u7a0b\u8868, \u534a\u65e5\u5a5a\u79ae\u6d41\u7a0b, \u5409\u6642 \u51fa\u9580 \u5165\u9580, \u63a5\u65b0\u5a18 \u6642\u9593, \u659f\u8336 \u6d41\u7a0b, wedding timeline hong kong\n --------------------------------------------------------------------\n The planner runs entirely in the page (no AI, no credits).\n The three templates below it are plain HTML so Google and AI assistants can read them.\n====================================================================\n-->\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;1,400;1,500&family=Inter:wght@300;400;500&family=Noto+Serif+TC:wght@400;500&display=swap\" rel=\"stylesheet\">\n\n<style>\n.boa-r{--ink:#1c2a44;--blue:#22406e;--blue-soft:#5a7299;--line:#dfe4ec;--paper:#fff;--mist:#f5f7fa;--gold:#b08a4a;\n  background:var(--paper);color:var(--ink);font-family:'Inter',sans-serif;font-weight:300;line-height:1.75;-webkit-font-smoothing:antialiased}\n.boa-r *{box-sizing:border-box}\n.boa-r a{color:var(--blue);text-decoration:none;border-bottom:1px solid var(--line)}\n.boa-r .wrap{max-width:860px;margin:0 auto;padding:0 20px}\n.boa-r .label{font:500 11px\/1.4 'Inter',sans-serif;letter-spacing:.24em;text-transform:uppercase;color:var(--blue-soft)}\n.boa-r h1,.boa-r h2,.boa-r h3{font-family:'Cormorant Garamond',serif;font-weight:400;color:var(--blue);margin:0;line-height:1.15;background:none;border:0;padding:0}\n.boa-r .zh{font-family:'Noto Serif TC',serif;font-weight:400}\n.boa-r h1{font-size:clamp(34px,6vw,56px);font-style:italic}\n.boa-r h1 .zh{display:block;font-style:normal;font-size:.5em;margin-top:14px;letter-spacing:.08em}\n.boa-r h2{font-size:clamp(28px,4.4vw,40px)}\n.boa-r h2 .zh{display:block;font-size:.55em;margin-top:8px;letter-spacing:.06em}\n.boa-r h3{font-size:23px;font-style:italic;margin-bottom:8px}\n.boa-r h3 .zh{font-style:normal;font-size:.72em;margin-left:8px;color:var(--blue-soft)}\n.boa-r p{margin:0 0 1.1em;font-size:16px}\n.boa-r p.zh{line-height:1.95;color:#2a3854}\n.boa-r section{padding:72px 0;border-bottom:1px solid var(--line)}\n.boa-r .hero{padding:96px 0 56px;text-align:center}\n.boa-r .hero .label{display:block;margin-bottom:22px}\n.boa-r .byline{margin-top:26px;font-size:13px;color:var(--blue-soft)}\n\n\/* principles *\/\n.boa-r .principles{display:grid;grid-template-columns:repeat(3,1fr);gap:0;border-top:1px solid var(--blue);margin-top:40px}\n.boa-r .principles > div{padding:24px 22px 22px 0;border-bottom:1px solid var(--line)}\n.boa-r .principles > div + div{padding-left:22px;border-left:1px solid var(--line)}\n.boa-r .principles b{display:block;font:400 21px\/1.3 'Cormorant Garamond',serif;color:var(--blue);margin-bottom:8px}\n.boa-r .principles p{font-size:14px;margin:0 0 6px}\n.boa-r .principles p.zh{font-size:13.5px}\n\n\/* planner *\/\n.boa-r .planner{background:var(--mist);margin:0;padding:72px 0}\n.boa-r .pl-grid{display:grid;grid-template-columns:minmax(0,320px) minmax(0,1fr);gap:40px;margin-top:36px}\n.boa-r fieldset{border:0;margin:0 0 26px;padding:0;min-width:0}\n.boa-r legend{font:500 11px\/1.4 'Inter',sans-serif;letter-spacing:.2em;text-transform:uppercase;color:var(--blue);margin-bottom:10px;padding:0}\n.boa-r legend span{font-family:'Noto Serif TC',serif;letter-spacing:.1em;margin-left:6px;color:var(--blue-soft)}\n.boa-r .seg{display:flex;flex-wrap:wrap;gap:8px}\n.boa-r .seg label{cursor:pointer}\n.boa-r .seg input{position:absolute;opacity:0;pointer-events:none}\n.boa-r .seg span{display:inline-block;padding:9px 14px;border:1px solid #c9d2e0;background:#fff;font-size:13px;line-height:1.4;color:var(--ink);transition:all .2s}\n.boa-r .seg input:checked + span{background:var(--blue);border-color:var(--blue);color:#fff}\n.boa-r .seg input:focus-visible + span{outline:2px solid var(--blue-soft);outline-offset:2px}\n.boa-r .field{margin-top:12px;display:flex;align-items:center;gap:10px;font-size:13px;color:var(--blue-soft)}\n.boa-r .field input{font:400 15px 'Inter',sans-serif;color:var(--ink);padding:8px 10px;border:1px solid #c9d2e0;background:#fff;border-radius:0;width:120px}\n.boa-r .hint{font-size:12.5px;color:var(--blue-soft);line-height:1.6;margin:8px 0 0}\n.boa-r .result{background:#fff;padding:30px 30px 26px;border-top:2px solid var(--blue)}\n.boa-r .result-head{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:14px}\n.boa-r .result-head b{font:400 22px 'Cormorant Garamond',serif;color:var(--blue)}\n.boa-r .legend-row{display:flex;flex-wrap:wrap;gap:14px;font-size:11.5px;color:var(--blue-soft);margin-bottom:6px}\n.boa-r .legend-row i{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:6px;vertical-align:1px}\n.boa-r .actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:22px}\n.boa-r .btn{display:inline-block;padding:12px 20px;border:1px solid var(--blue);background:none;color:var(--blue);font:400 12px 'Inter',sans-serif;letter-spacing:.12em;text-transform:uppercase;cursor:pointer}\n.boa-r .btn.solid{background:var(--blue);color:#fff}\n.boa-r .copied{font-size:12px;color:var(--blue-soft);align-self:center}\n\n\/* timeline *\/\n.boa-r ol.tl{list-style:none;margin:0;padding:0;counter-reset:none}\n.boa-r .tl-i{display:grid;grid-template-columns:92px minmax(0,1fr);gap:16px;padding:14px 0;border-bottom:1px solid var(--line);position:relative}\n.boa-r .tl-i:last-child{border-bottom:0}\n.boa-r .tl-t{font-variant-numeric:tabular-nums}\n.boa-r .tl-s{display:block;font:500 17px\/1.3 'Inter',sans-serif;color:var(--ink)}\n.boa-r .tl-e{display:block;font-size:12px;color:var(--blue-soft)}\n.boa-r .tl-tag{display:inline-block;font:500 9.5px\/1 'Inter',sans-serif;letter-spacing:.16em;text-transform:uppercase;padding:4px 7px;margin-bottom:6px;border:1px solid currentColor}\n.boa-r .t-fixed .tl-tag{color:#8a94a6}\n.boa-r .t-flex .tl-tag{color:#3f8f7b}\n.boa-r .t-travel .tl-tag{color:#b07b2c}\n.boa-r .t-key .tl-tag{color:var(--blue)}\n.boa-r .tl-i.star{background:linear-gradient(90deg,rgba(34,64,110,.06),rgba(34,64,110,0) 70%)}\n.boa-r .tl-i.star .tl-tag{color:#fff;background:var(--blue);border-color:var(--blue)}\n.boa-r .tl-i.star .tl-s{color:var(--blue)}\n.boa-r .tl-en{margin:0;font:400 17px\/1.4 'Cormorant Garamond',serif;color:var(--ink)}\n.boa-r .tl-zh{margin:2px 0 0;font:400 14px\/1.7 'Noto Serif TC',serif;color:#3a4a68}\n.boa-r .tl-note{margin:6px 0 0;font-size:12.5px;line-height:1.6;color:var(--blue-soft)}\n.boa-r .tl-note span{display:block;font-family:'Noto Serif TC',serif}\n.boa-r .tl-warn{margin-top:16px;border-left:2px solid #b07b2c;padding:4px 0 4px 14px}\n.boa-r .tl-warn p{font-size:13px;margin:0 0 8px;color:#6b4a14}\n.boa-r .tl-warn span{display:block;font-family:'Noto Serif TC',serif}\n\n\/* templates *\/\n.boa-r .tpl{margin-top:44px}\n.boa-r .tpl-meta{font-size:13px;color:var(--blue-soft);margin:0 0 14px}\n.boa-r .tpl .tl{border-top:1px solid var(--blue)}\n\n\/* tips *\/\n.boa-r .tips{display:grid;gap:0;border-top:1px solid var(--blue);margin-top:34px}\n.boa-r .tip{padding:22px 0;border-bottom:1px solid var(--line)}\n.boa-r .tip h3{font-size:21px}\n.boa-r .tip p{font-size:15px;margin-bottom:8px}\n\n\/* faq *\/\n.boa-r details{border-bottom:1px solid var(--line);padding:20px 0}\n.boa-r summary{cursor:pointer;font:400 21px\/1.35 'Cormorant Garamond',serif;color:var(--blue);list-style:none}\n.boa-r summary::-webkit-details-marker{display:none}\n.boa-r summary .zh{display:block;font-size:15px;margin-top:4px;color:var(--blue-soft)}\n.boa-r details p{margin-top:14px;font-size:15px}\n\n.boa-r .cta{text-align:center;background:var(--mist);border-bottom:0;padding:88px 0 104px}\n\n\/* ---------- builder ---------- *\/\n.boa-r .wrap.wide{max-width:1120px}\n.boa-r .bd-mini{font:500 10.5px\/1.4 'Inter',sans-serif;letter-spacing:.16em;text-transform:uppercase;color:var(--blue-soft)}\n.boa-r .chip-btn{font:400 12.5px\/1.3 'Inter','Noto Serif TC',sans-serif;padding:8px 12px;border:1px solid var(--blue);background:var(--blue);color:#fff;cursor:pointer;border-radius:0}\n.boa-r .chip-btn.ghost{background:#fff;color:var(--blue);border-color:#c9d2e0}\n.boa-r .bd-top{display:flex;flex-wrap:wrap;justify-content:space-between;gap:14px 24px;margin:30px 0 18px;align-items:center}\n.boa-r .bd-presets,.boa-r .bd-marker{display:flex;flex-wrap:wrap;gap:8px;align-items:center}\n.boa-r .bd-marker input{font:400 14px 'Inter',sans-serif;padding:7px 8px;border:1px solid #c9d2e0;background:#fff;color:var(--ink);border-radius:0}\n\n.boa-r .bd-palette{display:flex;flex-wrap:wrap;gap:7px;align-items:center;padding:16px;background:#fff;border:1px solid var(--line);margin-bottom:14px}\n.boa-r .bd-palette .bd-mini{width:100%;margin-bottom:2px}\n.boa-r .bd-palette .bd-mini b{color:var(--blue);font-weight:500}\n.boa-r .pal{display:inline-flex;align-items:center;gap:7px;padding:7px 10px;border:1px solid var(--line);background:#fff;font:400 13px\/1.3 'Noto Serif TC','Inter',sans-serif;color:var(--ink);cursor:grab;user-select:none;border-radius:0}\n.boa-r .pal:hover{border-color:var(--blue-soft)}\n.boa-r .pal i{width:8px;height:8px;border-radius:50%;flex:none}\n.boa-r .pal small{font:400 11px 'Inter',sans-serif;color:var(--blue-soft)}\n\n.boa-r .bd-board-wrap{background:#fff;border:1px solid var(--line);padding:12px 0 0}\n.boa-r .bd-zoom{display:flex;gap:6px;justify-content:flex-end;padding:0 12px 10px}\n.boa-r .bd-zoom .chip-btn{padding:6px 11px}\n.boa-r .bd-board{overflow-x:auto;-webkit-overflow-scrolling:touch}\n.boa-r .bd-grid{display:grid;min-width:100%}\n.boa-r .bd-gut{position:relative;border-right:1px solid var(--line)}\n.boa-r .bd-gut span{position:absolute;right:6px;transform:translateY(-50%);font:400 11px 'Inter',sans-serif;color:var(--blue-soft);font-variant-numeric:tabular-nums}\n.boa-r .bd-gut span:first-child{transform:none}\n.boa-r .bd-head{position:sticky;top:0;z-index:3;background:#fff;border-bottom:1px solid var(--line);padding:8px 8px 10px;border-right:1px solid var(--line);cursor:pointer}\n.boa-r .bd-head.active{box-shadow:inset 0 3px 0 var(--blue);background:#f7f9fc}\n.boa-r .bd-head input[type=text]{width:100%;font:500 13px 'Noto Serif TC','Inter',sans-serif;color:var(--blue);border:0;border-bottom:1px dashed transparent;background:transparent;padding:2px 0;border-radius:0}\n.boa-r .bd-head input[type=text]:focus{outline:0;border-bottom-color:var(--blue-soft)}\n.boa-r .bd-head .hrow{display:flex;align-items:center;gap:6px;margin-top:4px}\n.boa-r .bd-head input[type=time]{font:400 12px 'Inter',sans-serif;padding:3px 4px;border:1px solid #d6dde8;background:#fff;color:var(--ink);width:96px;border-radius:0}\n.boa-r .bd-head .rm{margin-left:auto;background:none;border:0;color:#9aa5b8;font-size:16px;cursor:pointer;line-height:1}\n.boa-r .bd-col{position:relative;border-right:1px solid var(--line);cursor:pointer}\n.boa-r .bd-col.active{background-color:rgba(34,64,110,.025)}\n.boa-r .bd-col.drop{background-color:rgba(34,64,110,.07)}\n.boa-r .bd-mark{position:absolute;left:0;right:0;border-top:1.5px dashed var(--blue);z-index:2;pointer-events:none}\n.boa-r .bd-mark span{position:absolute;left:4px;top:-17px;font:500 10px 'Inter',sans-serif;color:var(--blue);background:#fff;padding:0 3px}\n.boa-r .blk{position:absolute;padding:5px 7px 8px;overflow:hidden;border-left:3px solid;cursor:grab;font-size:12px;line-height:1.3;z-index:1;transition:box-shadow .15s,transform .15s;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;touch-action:pan-x pan-y}\n.boa-r .blk .rz{position:absolute;left:0;right:0;bottom:0;height:9px;cursor:ns-resize;touch-action:none}\n.boa-r .blk .rz::after{content:'';position:absolute;left:50%;bottom:3px;width:22px;margin-left:-11px;border-top:2px solid rgba(28,42,68,.25);border-radius:2px}\n.boa-r .blk.pressing{transform:scale(.98)}\n.boa-r .blk.dragging{z-index:10;box-shadow:0 10px 24px rgba(28,42,68,.22),0 0 0 2px var(--blue);opacity:.95;cursor:grabbing;transition:none}\nhtml.bd-dragging,html.bd-dragging *{-webkit-user-select:none!important;user-select:none!important;cursor:grabbing}\n.boa-r .bd-tap{position:absolute;left:0;right:0;border-top:2px solid var(--blue);z-index:3;pointer-events:none}\n.boa-r .bd-tap span{position:absolute;left:4px;top:-18px;font:500 10.5px 'Inter',sans-serif;color:#fff;background:var(--blue);padding:1px 5px}\n.boa-r .bd-head.corner{cursor:default}\n.boa-r .bd-head{display:flex;align-items:center;gap:4px}\n.boa-r .bd-how{list-style:none;margin:0;padding:0;font-size:12px;line-height:1.55;color:var(--blue-soft);max-width:560px}\n.boa-r .bd-how li{margin:0 0 3px}.boa-r .bd-how b{color:var(--blue);font-weight:500;margin-right:6px}\n.boa-r .bd-insp input[type=time]{font:400 14px 'Inter',sans-serif;padding:6px;border:1px solid #c9d2e0;background:#fff;color:var(--ink);border-radius:0}\n.boa-r .blk b{display:block;font:500 12.5px\/1.25 'Noto Serif TC','Inter',sans-serif;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.boa-r .blk em{font-style:normal;font:400 10.5px 'Inter',sans-serif;color:#5d6a80;font-variant-numeric:tabular-nums}\n.boa-r .blk.compact{padding:1px 6px 3px;display:flex;align-items:center;gap:6px}\n.boa-r .blk.compact b{font-size:11px;display:inline}\n.boa-r .blk.compact em{display:none}\n.boa-r .blk.sel{box-shadow:0 0 0 2px var(--blue);z-index:2}\n.boa-r .blk.c-gap{background:repeating-linear-gradient(-45deg,#fff,#fff 5px,#f3f5f9 5px,#f3f5f9 10px)!important;border-left:1px dashed #c3ccda;border:1px dashed #c3ccda}\n.boa-r .blk.c-gap b{color:#8a94a6;font-weight:400}\n.boa-r .blk.star{box-shadow:inset 0 0 0 1.5px var(--blue)}\n\n\/* category colours *\/\n.boa-r .c-prep{--cc:#7d8aa3;--ct:#eef1f6}.boa-r .c-photo{--cc:#3f8f7b;--ct:#e7f3ee}.boa-r .c-trad{--cc:#a8574b;--ct:#f7ebe8}\n.boa-r .c-travel{--cc:#b07b2c;--ct:#f7efe2}.boa-r .c-key{--cc:#22406e;--ct:#e2e9f4}.boa-r .c-party{--cc:#7a5c9a;--ct:#efe9f5}\n.boa-r .c-rest{--cc:#9aa5b8;--ct:#f3f5f8}.boa-r .c-gap{--cc:#c3ccda;--ct:#fff}.boa-r .c-custom{--cc:#5a7299;--ct:#eef2f8}\n.boa-r .blk{background:var(--ct);border-left-color:var(--cc)}\n.boa-r .pal i{background:var(--cc)}\n\n\/* inspector *\/\n.boa-r .bd-insp{position:sticky;bottom:0;z-index:20;background:#fff;border:1px solid var(--blue);box-shadow:0 -8px 30px rgba(28,42,68,.12);padding:12px 14px;margin-top:12px}\n.boa-r .bd-insp[hidden]{display:none}\n.boa-r .bd-insp-row{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:4px 0}\n.boa-r .in-name{flex:1;min-width:140px;font:500 15px 'Noto Serif TC','Inter',sans-serif;color:var(--blue);border:0;border-bottom:1px solid var(--line);padding:4px 0;background:transparent;border-radius:0}\n.boa-r .in-name:focus{outline:0;border-bottom-color:var(--blue)}\n.boa-r .in-time{font:400 12px 'Inter',sans-serif;color:var(--blue-soft);font-variant-numeric:tabular-nums}\n.boa-r .bd-insp .x{background:none;border:1px solid var(--line);width:32px;height:32px;font-size:17px;color:var(--blue);cursor:pointer}\n.boa-r .stp{font:400 12px 'Inter','Noto Serif TC',sans-serif;padding:7px 10px;border:1px solid #c9d2e0;background:#fff;color:var(--blue);cursor:pointer;border-radius:0}\n.boa-r .stp.danger{color:#a8574b;border-color:#e5c8c2}\n.boa-r #in-d{width:68px;font:400 14px 'Inter',sans-serif;padding:6px 6px;border:1px solid #c9d2e0;text-align:center;border-radius:0}\n.boa-r .in-n{min-width:34px;text-align:center;font:500 14px 'Inter',sans-serif;color:var(--ink)}\n.boa-r #in-lane{font:400 13px 'Noto Serif TC','Inter',sans-serif;padding:6px;border:1px solid #c9d2e0;background:#fff;border-radius:0}\n\n.boa-r .bd-summary{background:#fff;padding:26px 28px 24px;border-top:2px solid var(--blue);margin-top:26px}\n.boa-r .tl-lane{display:inline-block;font:500 9.5px\/1 'Inter','Noto Serif TC',sans-serif;letter-spacing:.12em;text-transform:uppercase;padding:4px 7px;margin-bottom:6px;color:var(--cc);border:1px solid var(--cc)}\n.boa-r .tl-star{display:inline-block;margin-left:6px;font:500 10px\/1 'Inter',sans-serif;padding:4px 7px;background:var(--blue);color:#fff}\n.boa-r .tl-d{margin-left:8px;font:400 11.5px 'Inter',sans-serif;color:var(--blue-soft)}\n.boa-r .tl-i{border-left:0}\n.boa-r .tpl-load{margin-top:14px}\n@media (max-width:760px){\n  .boa-r .bd-summary{padding:20px 16px}\n  .boa-r .bd-palette{padding:12px}\n  .boa-r .pal{font-size:12.5px;padding:6px 9px}\n}\n\n.boa-r .bd-board-wrap{position:relative}\n.boa-r .bd-toast{position:sticky;bottom:12px;z-index:30;display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:10px 12px 12px;padding:10px 14px;background:var(--blue);color:#fff;font-size:13px;box-shadow:0 8px 24px rgba(28,42,68,.2)}\n.boa-r .bd-toast[hidden]{display:none}\n.boa-r .bd-toast .chip-btn{padding:6px 10px}\n.boa-r .bd-zoom .bd-sp{flex:1}\n.boa-r .chip-btn:disabled{opacity:.35;cursor:default}\n.boa-r .bd-zoom{flex-wrap:wrap;align-items:center}\n\n\/* how to use \u2014 animated demo *\/\n.boa-r .howto{padding:52px 0 60px;border-bottom:1px solid var(--line)}\n.boa-r .ht-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,440px);grid-template-areas:'head demo' 'body demo';column-gap:64px;align-items:end;max-width:980px;margin:0 auto}\n.boa-r .ht-head{grid-area:head}.boa-r .ht-demo{grid-area:demo}.boa-r .ht-body{grid-area:body;align-self:start;display:flex;flex-wrap:wrap;gap:10px;margin-top:26px}\n.boa-r .ht-go{font-size:13px;padding:15px 26px}\n.boa-r .ht-vid{font-size:12px;padding:14px 18px}\n.boa-r #planner{scroll-margin-top:90px}\n\n.boa-r .ha-wrap{position:relative;width:100%;aspect-ratio:400\/372;background:#fff;border:1px solid var(--line);box-shadow:0 16px 40px rgba(28,42,68,.10);overflow:hidden}\n.boa-r .ha-stage{position:absolute;left:0;top:0;width:400px;height:372px;transform-origin:0 0;font-family:'Noto Serif TC','Inter',sans-serif}\n.boa-r .ha-chip{position:absolute;font:500 11px\/22px 'Inter','Noto Serif TC',sans-serif;height:22px;padding:0 9px;border:1px solid var(--blue);background:var(--blue);color:#fff;white-space:nowrap;transition:transform .15s}\n.boa-r .ha-chip.ghost{background:#fff;color:var(--blue);border-color:#c9d2e0}\n.boa-r #ha-half{left:12px;top:10px}.boa-r #ha-full{left:104px;top:10px}\n.boa-r .ha-pal{position:absolute;left:12px;top:42px;display:flex;gap:6px}\n.boa-r .ha-pal .ha-chip{position:static;background:#fff;color:var(--ink);border-color:var(--line);display:inline-flex;align-items:center;gap:5px;font-family:'Noto Serif TC',sans-serif}\n.boa-r .ha-pal .ha-chip::before{content:'';width:7px;height:7px;border-radius:50%;background:var(--cc)}\n.boa-r .ha-chip.press{transform:scale(.92)}\n.boa-r .ha-board{position:absolute;left:0;right:0;top:76px;height:256px;border-top:1px solid var(--line)}\n.boa-r .ha-hd{position:absolute;top:0;width:120px;height:26px;padding:0 8px;font:500 12px\/26px 'Noto Serif TC',sans-serif;color:var(--blue);border-bottom:1px solid var(--line);border-left:1px solid var(--line);transition:background .2s}\n.boa-r .ha-hd.edit{background:#f3f6fb;box-shadow:inset 0 -2px 0 var(--blue)}\n.boa-r .ha-hd.edit::after{content:'|';margin-left:1px;animation:haBlink .8s steps(1) infinite;color:var(--blue)}\n@keyframes haBlink{50%{opacity:0}}\n.boa-r .ha-gut{position:absolute;left:0;top:26px;width:400px;height:230px;\n  background-image:linear-gradient(90deg,transparent 39px,var(--line) 39px,var(--line) 40px,transparent 40px,transparent 159px,var(--line) 159px,var(--line) 160px,transparent 160px,transparent 279px,var(--line) 279px,var(--line) 280px,transparent 280px),\n  repeating-linear-gradient(to bottom,#eef1f5 0,#eef1f5 1px,transparent 1px,transparent 38px)}\n.boa-r .ha-tm{position:absolute;left:4px;font:400 9.5px 'Inter',sans-serif;color:var(--blue-soft);transform:translateY(-50%)}\n.boa-r .ha-blk{position:absolute;padding:3px 6px;border-left:3px solid var(--cc);background:var(--ct);overflow:hidden;font:500 11px\/1.25 'Noto Serif TC',sans-serif;color:var(--ink);\n  transition:left .55s cubic-bezier(.3,.7,.3,1),top .55s cubic-bezier(.3,.7,.3,1),height .45s ease,opacity .3s,transform .3s,box-shadow .2s}\n.boa-r .ha-blk em{display:block;font:400 9px 'Inter',sans-serif;color:#5d6a80;font-style:normal}\n.boa-r .ha-blk.lift{box-shadow:0 10px 22px rgba(28,42,68,.25),0 0 0 2px var(--blue);z-index:3}\n.boa-r .ha-blk.hide{opacity:0;transform:scale(.85)}\n.boa-r .ha-stage.no-tr *{transition:none!important}\n.boa-r .ha-line{position:absolute;left:161px;width:118px;border-top:2px solid var(--blue);opacity:0;transition:opacity .2s;z-index:2}\n.boa-r .ha-line span{position:absolute;left:0;top:-16px;font:500 9.5px 'Inter',sans-serif;color:#fff;background:var(--blue);padding:1px 4px}\n.boa-r .ha-line.on{opacity:1}\n.boa-r .ha-exp{position:absolute;left:12px;right:12px;top:340px;display:flex;gap:6px;opacity:.35;transition:opacity .3s}\n.boa-r .ha-exp.on{opacity:1}\n.boa-r .ha-exp span{font:500 10.5px\/22px 'Inter',sans-serif;padding:0 9px;border:1px solid var(--blue);color:var(--blue);background:#fff;transition:transform .15s}\n.boa-r .ha-exp span.solid{background:var(--blue);color:#fff}\n.boa-r .ha-exp span.press{transform:scale(.9)}\n.boa-r .ha-toast{position:absolute;right:12px;top:306px;font:500 10.5px\/24px 'Inter',sans-serif;padding:0 10px;background:var(--blue);color:#fff;opacity:0;transform:translateY(6px);transition:all .3s;z-index:4}\n.boa-r .ha-toast.on{opacity:1;transform:none}\n.boa-r .ha-finger{position:absolute;left:0;top:0;width:0;height:0;z-index:5;transition:left .6s cubic-bezier(.4,.1,.3,1),top .6s cubic-bezier(.4,.1,.3,1),opacity .3s;opacity:0}\n.boa-r .ha-finger.on{opacity:1}\n.boa-r .ha-finger i{position:absolute;left:-15px;top:-15px;width:30px;height:30px;border-radius:50%;background:rgba(34,64,110,.55);border:2px solid rgba(255,255,255,.85);box-shadow:0 3px 10px rgba(28,42,68,.25)}\n.boa-r .ha-finger.tap i{animation:haTap .45s ease-out}\n.boa-r .ha-finger.hold i::after{content:'';position:absolute;inset:-9px;border-radius:50%;border:3px solid var(--blue);animation:haHold .45s ease-out forwards}\n@keyframes haTap{0%{transform:scale(1)}40%{transform:scale(.75)}100%{transform:scale(1)}}\n@keyframes haHold{from{transform:scale(.6);opacity:.2}to{transform:scale(1);opacity:1}}\n.boa-r .ha-finger.drag{transition:left .9s cubic-bezier(.4,.1,.3,1),top .9s cubic-bezier(.4,.1,.3,1)}\n\n.boa-r .ha-cap{display:flex;align-items:baseline;gap:12px;margin-top:14px;min-height:46px}\n.boa-r .ha-n{font:400 22px\/1 'Cormorant Garamond',serif;color:var(--blue-soft)}\n.boa-r .ha-t b{display:block;font:400 21px\/1.2 'Cormorant Garamond',serif;color:var(--blue)}\n.boa-r .ha-t span{font:400 13.5px\/1.5 'Noto Serif TC',serif;color:#3a4a68}\n.boa-r .ha-dots{display:flex;gap:8px;margin-top:8px}\n.boa-r .ha-dots button{width:26px;height:4px;padding:0;border:0;background:#d6dde8;cursor:pointer;transition:background .2s}\n.boa-r .ha-dots button.on{background:var(--blue)}\n\n.ht-modal{position:fixed;inset:0;z-index:999999;background:rgba(20,32,54,.7);display:flex;align-items:center;justify-content:center;padding:20px}\n.ht-modal[hidden]{display:none}\n.ht-modal .ht-modal-box{position:relative;height:min(86vh,760px);aspect-ratio:9\/16;max-width:100%}\n.ht-modal video{width:100%;height:100%;object-fit:contain;background:#000;border-radius:14px}\n.ht-modal .ht-x{position:absolute;right:-6px;top:-46px;width:38px;height:38px;border:0;background:#fff;color:var(--blue);font-size:22px;cursor:pointer}\nhtml.ht-lock,html.ht-lock body{overflow:hidden}\n@media (max-width:760px){\n  .boa-r .howto{padding:34px 0 40px}\n  .boa-r .ht-grid{grid-template-columns:1fr;grid-template-areas:'head' 'demo' 'body';row-gap:20px}\n  .boa-r .ht-body{margin-top:0}\n  .boa-r .ht-body{flex-direction:column}\n  .boa-r .ht-go,.boa-r .ht-vid{display:block;width:100%;text-align:center}\n  .ht-modal .ht-x{right:0}\n}\n\n\/* tips cards *\/\n.boa-r .tp-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}\n.boa-r .tp-card{position:relative;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start;text-align:left;width:100%;padding:22px 52px 22px 22px;background:#fff;border:1px solid var(--line);cursor:pointer;font:inherit;color:inherit;transition:border-color .2s,box-shadow .2s,transform .2s;border-radius:0}\n.boa-r .tp-card:hover,.boa-r .tp-card:focus-visible{border-color:var(--blue-soft);box-shadow:0 10px 28px rgba(28,42,68,.09);transform:translateY(-2px);outline:none}\n.boa-r .tp-num{display:block;font:400 15px 'Cormorant Garamond',serif;color:var(--blue-soft);letter-spacing:.1em;margin-bottom:6px}\n.boa-r .tp-card b{display:block;font:400 21px\/1.25 'Cormorant Garamond',serif;color:var(--blue)}\n.boa-r .tp-zh{display:block;font:400 14px\/1.6 'Noto Serif TC',serif;color:var(--blue);margin-top:2px}\n.boa-r .tp-tease{display:block;font-size:12.5px;line-height:1.6;color:var(--blue-soft);margin-top:10px}\n.boa-r .tp-plus{position:absolute;right:18px;top:20px;width:26px;height:26px;border:1px solid #c9d2e0;color:var(--blue);font:300 18px\/24px 'Inter',sans-serif;text-align:center}\n@media (max-width:760px){.boa-r .tp-grid{grid-template-columns:1fr}.boa-r .tp-card{padding:18px 48px 18px 18px}}\n\n.tp-modal{position:fixed;inset:0;z-index:999998;background:rgba(20,32,54,.55);display:flex;align-items:center;justify-content:center;padding:18px;opacity:0;transition:opacity .25s}\n.tp-modal.show{opacity:1}\n.tp-modal[hidden]{display:none}\n.tp-modal .tp-box{position:relative;width:min(560px,100%);max-height:88vh;overflow-y:auto;background:#fff;padding:34px 32px 24px;box-shadow:0 24px 60px rgba(20,32,54,.25);transform:translateY(14px);transition:transform .3s;\n  font-family:'Inter',sans-serif;font-weight:300;color:#1c2a44;line-height:1.75}\n.tp-modal.show .tp-box{transform:none}\n.tp-modal .tp-x{position:absolute;right:14px;top:14px;width:36px;height:36px;border:1px solid #dfe4ec;background:#fff;color:#22406e;font-size:20px;cursor:pointer}\n.tp-modal .tp-m-num{font:400 15px 'Cormorant Garamond',serif;color:#5a7299;letter-spacing:.1em}\n.tp-modal h3{margin:4px 40px 0 0;font:400 27px\/1.2 'Cormorant Garamond',serif;color:#22406e}\n.tp-modal .tp-m-zh{margin:4px 0 18px;font:400 15px 'Noto Serif TC',serif;color:#22406e}\n.tp-modal p{font-size:15px;margin:0 0 12px}\n.tp-modal p.zh{font-family:'Noto Serif TC',serif;line-height:1.95;color:#2a3854}\n.tp-modal .tp-stat{display:flex;align-items:baseline;gap:14px;border-top:1px solid #22406e;border-bottom:1px solid #dfe4ec;padding:14px 0;margin-bottom:18px}\n.tp-modal .tp-stat b{font:400 44px\/1 'Cormorant Garamond',serif;color:#22406e;white-space:nowrap;flex:none}\n.tp-modal .tp-stat span{font-size:13px;color:#5a7299}\n.tp-modal .tp-pair{display:flex;align-items:center;gap:12px;margin-bottom:18px;flex-wrap:wrap}\n.tp-modal .tp-pair span{flex:1;min-width:120px;border:1px solid #dfe4ec;padding:12px 14px;font-size:12.5px;color:#5a7299}\n.tp-modal .tp-pair b{display:block;font:500 20px 'Noto Serif TC',serif;color:#22406e;margin-bottom:2px}\n.tp-modal .tp-pair em{font-style:normal;font-size:12px;color:#5a7299}\n.tp-modal .tp-lanes{display:grid;gap:6px;margin-bottom:18px}\n.tp-modal .tp-lanes div{display:grid;grid-template-columns:86px 1fr 1fr;gap:6px;align-items:stretch}\n.tp-modal .tp-ln{font:500 11px\/1.3 'Inter','Noto Serif TC',sans-serif;color:#5a7299;align-self:center}\n.tp-modal .tp-lanes i{font-style:normal;font:400 12px\/1.35 'Noto Serif TC','Inter',sans-serif;padding:8px 9px;border-left:3px solid var(--cc);background:var(--ct);color:#1c2a44}\n.tp-modal .c-prep{--cc:#7d8aa3;--ct:#eef1f6}.tp-modal .c-photo{--cc:#3f8f7b;--ct:#e7f3ee}.tp-modal .c-trad{--cc:#a8574b;--ct:#f7ebe8}\n.tp-modal ol.tp-flow{list-style:none;margin:0 0 18px;padding:0;display:flex;flex-wrap:wrap;gap:8px 0;counter-reset:f}\n.tp-modal .tp-flow li{display:flex;flex-direction:column;font-size:11px;color:#5a7299;line-height:1.35;padding:8px 10px;border:1px solid #dfe4ec;background:#faf9fc;position:relative;margin-right:22px}\n.tp-modal .tp-flow li b{font:500 14px 'Noto Serif TC',serif;color:#22406e}\n.tp-modal .tp-flow li:not(:last-child)::after{content:'\u2192';position:absolute;right:-18px;top:50%;transform:translateY(-50%);color:#22406e;font-size:13px}\n.tp-modal .tp-nav{display:flex;justify-content:space-between;gap:10px;margin-top:18px;border-top:1px solid #dfe4ec;padding-top:14px}\n.tp-modal .tp-nav button{background:none;border:1px solid #c9d2e0;color:#22406e;padding:9px 12px;font:400 12px 'Inter','Noto Serif TC',sans-serif;cursor:pointer}\n.tp-modal .tp-nav button:disabled{opacity:.3;cursor:default}\nhtml.tp-lock,html.tp-lock body{overflow:hidden}\n@media (max-width:760px){.tp-modal{align-items:flex-end;padding:0}.tp-modal .tp-box{width:100%;max-height:86vh;padding:30px 20px 22px}.tp-modal h3{font-size:24px}}\n\n\n@media (max-width:760px){\n  .boa-r .principles{grid-template-columns:1fr}\n  .boa-r .principles > div + div{padding-left:0;border-left:0}\n  .boa-r .pl-grid{grid-template-columns:1fr;gap:26px}\n  .boa-r .result{padding:22px 16px 20px}\n  .boa-r .tl-i{grid-template-columns:70px minmax(0,1fr);gap:12px}\n  .boa-r .tl-s{font-size:15px}\n  .boa-r section{padding:56px 0}\n  .boa-r .hero{padding:64px 0 40px}\n}\n<\/style>\n\n<article class=\"boa-r\" itemscope itemtype=\"https:\/\/schema.org\/Article\">\n\n  <header class=\"hero\" style=\"border-bottom:1px solid var(--line)\">\n    <div class=\"wrap\">\n      <span class=\"label\">Guide &amp; Tips \u00b7 Wedding Rundown<\/span>\n      <h1 itemprop=\"headline\">Planning Your Wedding Day Rundown\n        <span class=\"zh\">\u5a5a\u79ae\u6d41\u7a0b\u9ede\u6a23\u6392\uff1a\u534a\u65e5\u3001\u5168\u65e5\u3001\u6709\u5187\u5409\u6642\u90fd\u6709\u7bc4\u672c<\/span>\n      <\/h1>\n      <p class=\"byline\">By <span itemprop=\"author\">Billy Hung<\/span>, wedding photographer since 2009 \u00b7 Updated <time itemprop=\"dateModified\" datetime=\"2026-11-03\">3 November 2026<\/time><\/p>\n    <\/div>\n  <\/header>\n\n  <!-- ================= HOW TO USE (animated demo) ================= -->\n  <section class=\"howto\" id=\"how-to-use\">\n    <div class=\"wrap wide\">\n      <div class=\"ht-grid\">\n        <div class=\"ht-head\">\n          <span class=\"label\">How to use \u00b7 \u4f7f\u7528\u6559\u5b78<\/span>\n          <h2 style=\"margin-top:10px\">Wedding Rundown Creator <span class=\"zh\">\u5a5a\u79ae\u6d41\u7a0b\u780c\u5716<\/span><\/h2>\n        <\/div>\n\n        <div class=\"ht-demo\" aria-label=\"Animated demo of the rundown builder\">\n          <div class=\"ha-wrap\"><div class=\"ha-stage\" id=\"ha-stage\" aria-hidden=\"true\">\n            <div class=\"ha-chip ha-ex\" id=\"ha-half\">\u534a\u65e5 Half-day<\/div><div class=\"ha-chip ha-ex ghost\" id=\"ha-full\">\u5168\u65e5 Full-day<\/div>\n            <div class=\"ha-pal\">\n              <span class=\"ha-chip c-prep\">\u5316\u599d<\/span><span class=\"ha-chip c-photo\">\u5f71\u76f8<\/span><span class=\"ha-chip c-photo\" id=\"ha-pal-out\">\u5916\u5f71<\/span><span class=\"ha-chip c-trad\">\u659f\u8336<\/span><span class=\"ha-chip c-party\">\u665a\u5bb4<\/span>\n            <\/div>\n            <div class=\"ha-board\">\n              <div class=\"ha-hd\" style=\"left:40px\">\u65b0\u5a18<\/div><div class=\"ha-hd\" id=\"ha-h1\" style=\"left:160px\">\u59ca\u59b9<\/div><div class=\"ha-hd\" style=\"left:280px\">\u65b0\u90ce<\/div>\n              <div class=\"ha-gut\"><\/div>\n            <\/div>\n            <div class=\"ha-line\" id=\"ha-line\"><span>+ 12:00<\/span><\/div>\n            <div class=\"ha-exp\" id=\"ha-exp\"><span>Copy<\/span><span id=\"ha-xl\">Excel \u2193<\/span><span>CSV \u2193<\/span><span class=\"solid\">WhatsApp<\/span><\/div>\n            <div class=\"ha-toast\" id=\"ha-toast\">\u2713 wedding-rundown.xlsx<\/div>\n            <div class=\"ha-finger\" id=\"ha-finger\"><i><\/i><\/div>\n          <\/div><\/div>\n          <div class=\"ha-cap\" aria-live=\"polite\">\n            <span class=\"ha-n\" id=\"ha-n\">01<\/span>\n            <span class=\"ha-t\"><b id=\"ha-en\">Pick an example<\/b><span id=\"ha-zh\">\u5148\u63c0\u534a\u65e5\u6216\u5168\u65e5\u4f8b\u5b50<\/span><\/span>\n          <\/div>\n          <div class=\"ha-dots\" id=\"ha-dots\" role=\"tablist\" aria-label=\"Demo steps\"><\/div>\n        <\/div>\n\n        <div class=\"ht-body\">\n          <a class=\"btn solid ht-go\" href=\"#planner\">Start planning \u2193 \u958b\u59cb\u780c\u6d41\u7a0b<\/a>\n          <button type=\"button\" class=\"btn ht-vid\" id=\"ht-vid\">\u25b6 Video \u6559\u5b78\u7247 0:35<\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n    <div class=\"ht-modal\" id=\"ht-modal\" hidden>\n      <div class=\"ht-modal-box\">\n        <button type=\"button\" class=\"ht-x\" id=\"ht-x\" aria-label=\"Close\">\u00d7<\/button>\n        <video id=\"ht-video\" controls playsinline preload=\"none\" poster=\"https:\/\/www.billyhung.com\/blog\/wp-content\/uploads\/boa-rundown-builder-howto-poster.jpg\" width=\"1080\" height=\"1920\">\n          <source data-src=\"https:\/\/www.billyhung.com\/blog\/wp-content\/uploads\/boa-rundown-builder-howto-web.mp4\" type=\"video\/mp4\">\n          <track kind=\"captions\" src=\"https:\/\/www.billyhung.com\/blog\/wp-content\/uploads\/boa-rundown-builder-howto.vtt\" srclang=\"en\" label=\"English\">\n        <\/video>\n      <\/div>\n    <\/div>\n  <\/section>\n\n\n  <!-- ================= RUNDOWN BUILDER ================= -->\n  <section class=\"planner\" id=\"planner\">\n    <div class=\"wrap wide\">\n      <span class=\"label\">Rundown Builder \u00b7 \u5a5a\u79ae\u6d41\u7a0b\u780c\u5716<\/span>\n      <h2 style=\"margin-top:10px\">Build your day, block by block <span class=\"zh\">\u4e00\u7c92\u4e00\u7c92\u780c\u51fa\u4f60\u7684\u5a5a\u79ae\u6d41\u7a0b<\/span><\/h2>\n      <p style=\"margin-top:12px;font-size:14px;color:var(--blue-soft)\">Start from an example, then make it yours. \u5148\u63c0\u4f8b\u5b50\uff0c\u518d\u81ea\u5df1\u8abf\u6574\u3002<\/p>\n\n      <div class=\"bd-top\">\n        <div class=\"bd-presets\">\n          <span class=\"bd-mini\">Example \u4f8b\u5b50<\/span>\n          <button type=\"button\" class=\"chip-btn\" data-preset=\"half\">Half-day \u534a\u65e5<\/button>\n          <button type=\"button\" class=\"chip-btn\" data-preset=\"full\">Full-day \u5168\u65e5<\/button>\n          <button type=\"button\" class=\"chip-btn ghost\" data-preset=\"blank\">Blank \u6e05\u7a7a<\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"bd-palette\" id=\"bd-palette\" aria-label=\"Items\">\n        <span class=\"bd-mini\" id=\"bd-addto\">Add to \u52a0\u5230\uff1a<\/span>\n      <\/div>\n\n      <div class=\"bd-board-wrap\">\n        <div class=\"bd-zoom\">\n          <button type=\"button\" class=\"chip-btn ghost hist\" id=\"bd-undo\" disabled aria-label=\"Undo\">\u21b6 Undo \u5fa9\u539f<\/button>\n          <button type=\"button\" class=\"chip-btn ghost hist\" id=\"bd-redo\" disabled aria-label=\"Redo\">\u21b7 Redo \u91cd\u505a<\/button>\n          <span class=\"bd-sp\"><\/span>\n          <button type=\"button\" class=\"chip-btn ghost\" data-zoom=\"-1\" aria-label=\"Zoom out\">\u2212<\/button>\n          <button type=\"button\" class=\"chip-btn ghost\" data-zoom=\"1\" aria-label=\"Zoom in\">+<\/button>\n          <button type=\"button\" class=\"chip-btn\" id=\"bd-addlane\">+ Column \u65b0\u589e\u4e00\u884c<\/button>\n        <\/div>\n        <div class=\"bd-board\" id=\"bd-board\"><\/div>\n      <\/div>\n\n      <div class=\"bd-insp\" id=\"bd-insp\" hidden>\n        <div class=\"bd-insp-row\">\n          <input type=\"text\" id=\"in-zh\" class=\"in-name\" aria-label=\"Item name\">\n          <button type=\"button\" class=\"x\" id=\"in-close\" aria-label=\"Close\">\u00d7<\/button>\n        <\/div>\n        <div class=\"bd-insp-row\">\n          <span class=\"bd-mini\">Start \u958b\u59cb<\/span><input type=\"time\" id=\"in-s\" step=\"300\">\n          <span class=\"bd-mini\">End \u5b8c\u7d50<\/span><input type=\"time\" id=\"in-e\" step=\"300\">\n          <span class=\"in-time\" id=\"in-time\"><\/span>\n        <\/div>\n        <div class=\"bd-insp-row\">\n          <span class=\"bd-mini\">Each \u6bcf\u6b21<\/span>\n          <button type=\"button\" class=\"stp\" data-d=\"-15\">\u221215<\/button>\n          <button type=\"button\" class=\"stp\" data-d=\"-5\">\u22125<\/button>\n          <input type=\"number\" id=\"in-d\" min=\"5\" max=\"600\" step=\"5\" aria-label=\"Minutes\"><span class=\"bd-mini\">min<\/span>\n          <button type=\"button\" class=\"stp\" data-d=\"5\">+5<\/button>\n          <button type=\"button\" class=\"stp\" data-d=\"15\">+15<\/button>\n          <span class=\"bd-mini\" style=\"margin-left:10px\">\u00d7 People \u4eba\u6578<\/span>\n          <button type=\"button\" class=\"stp\" data-n=\"-1\">\u2212<\/button><span id=\"in-n\" class=\"in-n\">1<\/span><button type=\"button\" class=\"stp\" data-n=\"1\">+<\/button>\n        <\/div>\n        <div class=\"bd-insp-row\">\n          <span class=\"bd-mini\">Column \u884c<\/span><select id=\"in-lane\" aria-label=\"Column\"><\/select>\n          <button type=\"button\" class=\"stp\" id=\"in-snap\">\u21e1 Close gap \u8cbc\u4e0a\u4e00\u9805<\/button>\n          <button type=\"button\" class=\"stp\" id=\"in-dup\">Duplicate \u8907\u88fd<\/button>\n          <button type=\"button\" class=\"stp danger\" id=\"in-del\">Delete \u522a\u9664<\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"bd-summary\">\n        <div class=\"result-head\"><b>Your rundown \u4f60\u7684\u6d41\u7a0b<\/b><span class=\"bd-mini\" id=\"bd-span\"><\/span><\/div>\n        <div id=\"bd-list\"><ol class=\"tl\"><li class=\"tl-i c-prep\"><div class=\"tl-t\"><span class=\"tl-s\">05:30<\/span><span class=\"tl-e\">\u2013 08:00<\/span><\/div><div class=\"tl-b\"><span class=\"tl-lane\">\u65b0\u5a18\u30fb\u65b0\u4eba \u00b7 Bride &amp; couple<\/span><p class=\"tl-en\">Bride hair &amp; make-up<\/p><p class=\"tl-zh\">\u65b0\u5a18\u5316\u599d\u53ca\u9aee\u578b<span class=\"tl-d\">2h 30m<\/span><\/p><\/div><\/li><li class=\"tl-i c-prep\"><div class=\"tl-t\"><span class=\"tl-s\">06:30<\/span><span class=\"tl-e\">\u2013 08:00<\/span><\/div><div class=\"tl-b\"><span class=\"tl-lane\">\u59ca\u59b9 \u00b7 Bridesmaids<\/span><p class=\"tl-en\">Bridesmaid make-up \u00d73<\/p><p class=\"tl-zh\">\u59ca\u59b9\u5316\u599d \u00d73<span class=\"tl-d\">1h 30m<\/span><\/p><\/div><\/li><li class=\"tl-i c-photo\"><div class=\"tl-t\"><span class=\"tl-s\">08:00<\/span><span class=\"tl-e\">\u2013 09:00<\/span><\/div><div class=\"tl-b\"><span class=\"tl-lane\">\u65b0\u5a18\u30fb\u65b0\u4eba \u00b7 Bride &amp; couple<\/span><p class=\"tl-en\">Bride &amp; bridesmaids photos<\/p><p class=\"tl-zh\">\u5f71\u65b0\u5a18\u53ca\u59ca\u59b9<span class=\"tl-d\">1h<\/span><\/p><\/div><\/li><li class=\"tl-i c-prep\"><div class=\"tl-t\"><span class=\"tl-s\">08:00<\/span><span class=\"tl-e\">\u2013 09:00<\/span><\/div><div class=\"tl-b\"><span class=\"tl-lane\">\u65b0\u90ce\u30fb\u5144\u5f1f \u00b7 Groom &amp; groomsmen<\/span><p class=\"tl-en\">Groom &amp; groomsmen get ready<\/p><p class=\"tl-zh\">\u65b0\u90ce\u53ca\u5144\u5f1f\u6e96\u5099<span class=\"tl-d\">1h<\/span><\/p><\/div><\/li><li class=\"tl-i c-trad\"><div class=\"tl-t\"><span class=\"tl-s\">09:00<\/span><span class=\"tl-e\">\u2013 09:30<\/span><\/div><div class=\"tl-b\"><span class=\"tl-lane\">\u65b0\u5a18\u30fb\u65b0\u4eba \u00b7 Bride &amp; couple<\/span><p class=\"tl-en\">Door games<\/p><p class=\"tl-zh\">\u63a5\u65b0\u5a18\u30fb\u73a9\u904a\u6232<span class=\"tl-d\">30m<\/span><\/p><\/div><\/li><li class=\"tl-i c-trad\"><div class=\"tl-t\"><span class=\"tl-s\">09:30<\/span><span class=\"tl-e\">\u2013 10:00<\/span><\/div><div class=\"tl-b\"><span class=\"tl-lane\">\u65b0\u5a18\u30fb\u65b0\u4eba \u00b7 Bride &amp; couple<\/span><p class=\"tl-en\">Tea ceremony \u00b7 bride\u2019s family<\/p><p class=\"tl-zh\">\u659f\u5973\u5bb6\u8336<span class=\"tl-d\">30m<\/span><\/p><\/div><\/li><li class=\"tl-i c-travel\"><div class=\"tl-t\"><span class=\"tl-s\">10:00<\/span><span class=\"tl-e\">\u2013 10:15<\/span><\/div><div class=\"tl-b\"><span class=\"tl-lane\">\u65b0\u5a18\u30fb\u65b0\u4eba \u00b7 Bride &amp; couple<\/span><p class=\"tl-en\">Leave &amp; arrive (same hotel)<\/p><p class=\"tl-zh\">\u51fa\u9580\u30fb\u5165\u9580\uff08\u540c\u4e00\u9152\u5e97\uff09<span class=\"tl-d\">15m<\/span><\/p><\/div><\/li><li class=\"tl-i c-trad\"><div class=\"tl-t\"><span class=\"tl-s\">10:15<\/span><span class=\"tl-e\">\u2013 10:45<\/span><\/div><div class=\"tl-b\"><span class=\"tl-lane\">\u65b0\u5a18\u30fb\u65b0\u4eba \u00b7 Bride &amp; couple<\/span><p class=\"tl-en\">Groom\u2019s tea ceremony &amp; family photos<\/p><p class=\"tl-zh\">\u659f\u7537\u5bb6\u8336\u30fb\u5bb6\u4eba\u5408\u7167<span class=\"tl-d\">30m<\/span><\/p><\/div><\/li><li class=\"tl-i c-prep\"><div class=\"tl-t\"><span class=\"tl-s\">10:45<\/span><span class=\"tl-e\">\u2013 11:30<\/span><\/div><div class=\"tl-b\"><span class=\"tl-lane\">\u65b0\u5a18\u30fb\u65b0\u4eba \u00b7 Bride &amp; couple<\/span><p class=\"tl-en\">Change into the gown<\/p><p class=\"tl-zh\">\u63db\u5a5a\u7d17<span class=\"tl-d\">45m<\/span><\/p><\/div><\/li><li class=\"tl-i c-photo\"><div class=\"tl-t\"><span class=\"tl-s\">10:45<\/span><span class=\"tl-e\">\u2013 11:15<\/span><\/div><div class=\"tl-b\"><span class=\"tl-lane\">\u65b0\u90ce\u30fb\u5144\u5f1f \u00b7 Groom &amp; groomsmen<\/span><p class=\"tl-en\">Groom &amp; groomsmen photos (catch-up)<\/p><p class=\"tl-zh\">\u88dc\u5f71\u65b0\u90ce\u53ca\u5144\u5f1f<span class=\"tl-d\">30m<\/span><\/p><\/div><\/li><li class=\"tl-i c-key\"><div class=\"tl-t\"><span class=\"tl-s\">11:30<\/span><span class=\"tl-e\">\u2013 12:00<\/span><\/div><div class=\"tl-b\"><span class=\"tl-lane\">\u65b0\u5a18\u30fb\u65b0\u4eba \u00b7 Bride &amp; couple<\/span><p class=\"tl-en\">Wedding ceremony<\/p><p class=\"tl-zh\">\u8b49\u5a5a<span class=\"tl-d\">30m<\/span><\/p><\/div><\/li><li class=\"tl-i c-party\"><div class=\"tl-t\"><span class=\"tl-s\">12:00<\/span><span class=\"tl-e\">\u2013 12:30<\/span><\/div><div class=\"tl-b\"><span class=\"tl-lane\">\u65b0\u5a18\u30fb\u65b0\u4eba \u00b7 Bride &amp; couple<\/span><p class=\"tl-en\">Cocktails &amp; group photos<\/p><p class=\"tl-zh\">\u9152\u6703\u30fb\u5927\u5408\u7167<span class=\"tl-d\">30m<\/span><\/p><\/div><\/li><li class=\"tl-i c-party\"><div class=\"tl-t\"><span class=\"tl-s\">12:30<\/span><span class=\"tl-e\">\u2013 15:30<\/span><\/div><div class=\"tl-b\"><span class=\"tl-lane\">\u65b0\u5a18\u30fb\u65b0\u4eba \u00b7 Bride &amp; couple<\/span><p class=\"tl-en\">Wedding lunch<\/p><p class=\"tl-zh\">\u5348\u5bb4<span class=\"tl-d\">3h<\/span><\/p><\/div><\/li><\/ol><\/div>\n        <div class=\"actions\">\n          <button type=\"button\" class=\"btn\" id=\"bd-copy\">Copy \u8907\u88fd\u6d41\u7a0b<\/button>\n          <a class=\"btn\" id=\"bd-share\" href=\"#\" target=\"_blank\" rel=\"noopener\">Share on WhatsApp \u50b3\u7d66\u670b\u53cb<\/a>\n          <button type=\"button\" class=\"btn\" id=\"bd-xlsx\">Excel \u2193<\/button>\n          <button type=\"button\" class=\"btn\" id=\"bd-csv\">CSV \u2193<\/button>\n          <a class=\"btn solid\" id=\"bd-ask\" href=\"https:\/\/wa.me\/85296664617\" target=\"_blank\" rel=\"noopener\">Ask Billy ONAIR \u554f\u6211\u5011<\/a>\n          <span class=\"copied\" id=\"bd-copied\" hidden>Copied \u5df2\u8907\u88fd<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n\n  <!-- ================= TIPS (cards \u2192 pop-up) ================= -->\n  <section id=\"tips\" class=\"tips-sec\">\n    <div class=\"wrap\">\n      <span class=\"label\">Tips \u00b7 \u5c0f\u8cbc\u58eb<\/span>\n      <h2 style=\"margin:10px 0 26px\">From the photographer <span class=\"zh\">\u651d\u5f71\u5e2b\u7684\u6d41\u7a0b\u5c0f\u8cbc\u58eb<\/span><\/h2>\n      <div class=\"tp-grid\">\n\n        <button type=\"button\" class=\"tp-card\" data-tip=\"tp1\">\n          <span class=\"tp-num\">01<\/span>\n          <b>Make-up: time &amp; mindset<\/b><span class=\"tp-zh\">\u5316\u599d\u6642\u9593\u8207\u5fc3\u614b<\/span>\n          <span class=\"tp-tease\">Allow 2.5 hours \u2014 and a bit more. \u9810\u5169\u500b\u534a\u9418\uff0c\u518d\u9810\u9b06\u4e00\u9ede\u3002<\/span>\n          <span class=\"tp-plus\" aria-hidden=\"true\">+<\/span>\n        <\/button>\n        <div class=\"tp-body\" id=\"tp1\" hidden>\n          <div class=\"tp-stat\"><b>2.5 h<\/b><span>bridal make-up on the wedding morning \u00b7 \u65b0\u5a18\u65e9\u4e0a\u5316\u599d<\/span><\/div>\n          <p>Most make-up artists need about two and a half hours for a bride\u2019s wedding-morning look. It isn\u2019t like your pre-wedding shoot: on the day you\u2019ll be busy \u2014 family, bridesmaids and suppliers will keep asking you things, and you won\u2019t always be able to sit still. Give it some extra room.<\/p>\n          <p class=\"zh\">\u5927\u90e8\u5206\u5316\u599d\u5e2b\u5728\u5a5a\u79ae\u65e9\u4e0a\u5316\u4e00\u500b\u65b0\u5a18\u599d\uff0c\u5927\u7d04\u9700\u8981\u5169\u500b\u534a\u9418\u3002\u9019\u548c\u62cd\u5a5a\u7d17\u7167\u6642\u5316\u599d\u4e0d\u540c\uff1a\u7d50\u5a5a\u7576\u5929\u65e9\u4e0a\u4f60\u6703\u975e\u5e38\u5fd9\uff0c\u4e0d\u65b7\u6709\u4eba\u554f\u4f60\u554f\u984c\uff0c\u672a\u5fc5\u53ef\u4ee5\u4e00\u76f4\u5750\u5b9a\u5b9a\uff0c\u6240\u4ee5\u6642\u9593\u8981\u9810\u9b06\u4e00\u9ede\u3002<\/p>\n        <\/div>\n\n        <button type=\"button\" class=\"tp-card\" data-tip=\"tp2\">\n          <span class=\"tp-num\">02<\/span>\n          <b>What counts as the auspicious time?<\/b><span class=\"tp-zh\">\u5409\u6642\u600e\u6a23\u8a08\uff1f<\/span>\n          <span class=\"tp-tease\">Leaving or arriving \u2014 your families decide. \u51fa\u9580\u5b9a\u5165\u9580\uff0c\u5c4b\u4f01\u4eba\u540c\u610f\u5c31\u5f97\u3002<\/span>\n          <span class=\"tp-plus\" aria-hidden=\"true\">+<\/span>\n        <\/button>\n        <div class=\"tp-body\" id=\"tp2\" hidden>\n          <div class=\"tp-pair\"><span><b>\u51fa\u9580<\/b>Leaving the bride\u2019s home<\/span><em>or \u6216<\/em><span><b>\u5165\u9580<\/b>Arriving at the groom\u2019s<\/span><\/div>\n          <p>Some families count the auspicious time as the moment the bride leaves home; others count it as arriving at the groom\u2019s. Every village has its own custom \u2014 what matters is that both families agree.<\/p>\n          <p class=\"zh\">\u6709\u4e9b\u4eba\u628a\u5409\u6642\u7576\u4f5c\u51fa\u9580\u7684\u6642\u9593\uff0c\u6709\u4e9b\u4eba\u5247\u7576\u4f5c\u5165\u9580\u7684\u6642\u9593\u3002\u5404\u8655\u9109\u6751\u5404\u8655\u4f8b\uff0c\u6700\u91cd\u8981\u662f\u96d9\u65b9\u5bb6\u4eba\u90fd\u540c\u610f\u3002<\/p>\n        <\/div>\n\n        <button type=\"button\" class=\"tp-card\" data-tip=\"tp3\">\n          <span class=\"tp-num\">03<\/span>\n          <b>No auspicious time?<\/b><span class=\"tp-zh\">\u6c92\u6709\u5409\u6642\uff0c\u6642\u9593\u600e\u6a23\u5b9a\uff1f<\/span>\n          <span class=\"tp-tease\">Work back from the ceremony. \u7531\u8b49\u5a5a\u6642\u9593\u5012\u63a8\u3002<\/span>\n          <span class=\"tp-plus\" aria-hidden=\"true\">+<\/span>\n        <\/button>\n        <div class=\"tp-body\" id=\"tp3\" hidden>\n          <ol class=\"tp-flow\"><li><b>05:30<\/b>Make-up \u5316\u599d<\/li><li><b>08:00<\/b>Photos \u5f71\u76f8<\/li><li><b>11:30<\/b>Ceremony \u8b49\u5a5a<\/li><\/ol>\n          <p>Start from your ceremony or lunch time and work backwards. For a half-day wedding with an 11:30 or 12:00 ceremony, photos usually start at 8:00 and make-up at 5:30.<\/p>\n          <p class=\"zh\">\u7531\u8b49\u5a5a\u6216\u5348\u5bb4\u6642\u9593\u958b\u59cb\u5012\u63a8\u3002\u534a\u65e5\u5a5a\u79ae\u5982\u679c 11:30 \u6216 12:00 \u8b49\u5a5a\uff0c\u4e00\u822c 8:00 \u958b\u59cb\u62cd\u651d\uff0c5:30 \u958b\u59cb\u5316\u599d\u3002<\/p>\n        <\/div>\n\n        <button type=\"button\" class=\"tp-card\" data-tip=\"tp4\">\n          <span class=\"tp-num\">04<\/span>\n          <b>Keep travel short<\/b><span class=\"tp-zh\">\u4ea4\u901a\u6642\u9593\u8981\u9810\u5920<\/span>\n          <span class=\"tp-tease\">Half-day? Same hotel is easiest. \u534a\u65e5\u5a5a\u79ae\uff0c\u540c\u4e00\u9152\u5e97\u6700\u5f9e\u5bb9\u3002<\/span>\n          <span class=\"tp-plus\" aria-hidden=\"true\">+<\/span>\n        <\/button>\n        <div class=\"tp-body\" id=\"tp4\" hidden>\n          <div class=\"tp-pair\"><span><b>\u540c\u4e00\u9152\u5e97<\/b>Same hotel \u2014 about 15 min<\/span><em>vs<\/em><span><b>\u4e0d\u540c\u5730\u65b9<\/b>Drive + lifts + parking<\/span><\/div>\n          <p>For a half-day wedding we don\u2019t recommend spending the morning on the road. If both families can get ready in the same hotel, the whole day is calmer. If you do need to drive, allow the real journey time plus a buffer for lifts and parking.<\/p>\n          <p class=\"zh\">\u534a\u65e5\u5a5a\u79ae\u4e0d\u5efa\u8b70\u6210\u500b\u65e9\u4e0a\u90fd\u5728\u5750\u8eca\u3002\u5982\u679c\u5973\u5bb6\u3001\u7537\u5bb6\u90fd\u53ef\u4ee5\u5728\u540c\u4e00\u9593\u9152\u5e97\uff0c\u6574\u5929\u90fd\u4e0d\u6703\u90a3\u9ebc\u8d95\u3002\u5982\u679c\u771f\u7684\u8981\u5750\u8eca\uff0c\u9664\u4e86\u5be6\u969b\u8eca\u7a0b\uff0c\u9084\u8981\u9810\u7559\u7b49\ud860\udee2\u548c\u6cca\u8eca\u7684\u6642\u9593\u3002<\/p>\n        <\/div>\n\n        <button type=\"button\" class=\"tp-card\" data-tip=\"tp5\">\n          <span class=\"tp-num\">05<\/span>\n          <b>Morning too tight? Move the groom\u2019s photos<\/b><span class=\"tp-zh\">\u65e9\u4e0a\u592a\u8d95\uff1f\u65b0\u90ce\u7684\u76f8\u53ef\u4ee5\u9072\u4e9b\u62cd<\/span>\n          <span class=\"tp-tease\">What to shorten, and when to shoot the groom. \u908a\u5572\u53ef\u4ee5\u7e2e\u77ed\u3001\u65b0\u90ce\u5e7e\u6642\u5f71\u3002<\/span>\n          <span class=\"tp-plus\" aria-hidden=\"true\">+<\/span>\n        <\/button>\n        <div class=\"tp-body\" id=\"tp5\" hidden>\n          <div class=\"tp-lanes\">\n            <div><span class=\"tp-ln\">Bride \u65b0\u5a18<\/span><i class=\"c-trad\">\u659f\u7537\u5bb6\u8336 Groom\u2019s tea<\/i><i class=\"c-prep\">\u63db\u886b Changing<\/i><\/div>\n            <div><span class=\"tp-ln\">Groom \u65b0\u90ce<\/span><i class=\"c-trad\">\u659f\u7537\u5bb6\u8336 Groom\u2019s tea<\/i><i class=\"c-photo\">\u5f71\u65b0\u90ce\u53ca\u5144\u5f1f Photos<\/i><\/div>\n          <\/div>\n          <p>If the morning is tight, move the groom &amp; groomsmen photos to after the tea ceremony at the groom\u2019s family. While the bride is changing, the photographer can use that time to photograph the groom and the groomsmen. The door games can be shortened too. In general, door games, tea ceremonies and photos are flexible; make-up and the gown change are hard to rush.<\/p>\n          <p class=\"zh\">\u5982\u679c\u65e9\u4e0a\u592a\u8d95\uff0c\u53ef\u4ee5\u628a\u62cd\u65b0\u90ce\u53ca\u5144\u5f1f\u7684\u90e8\u5206\uff0c\u79fb\u5230\u7537\u5bb6\u659f\u5b8c\u8336\u4e4b\u5f8c\u3002\u65b0\u5a18\u63db\u8863\u670d\u6642\uff0c\u651d\u5f71\u5e2b\u5c31\u53ef\u4ee5\u62bd\u9019\u6bb5\u6642\u9593\u62cd\u65b0\u90ce\u548c\u5144\u5f1f\u3002\u73a9\u904a\u6232\u7684\u6642\u9593\u4ea6\u53ef\u4ee5\u76f8\u61c9\u7e2e\u77ed\u3002\u4e00\u822c\u4f86\u8aaa\uff0c\u73a9\u904a\u6232\u3001\u659f\u8336\u548c\u62cd\u651d\u90fd\u53ef\u4ee5\u8abf\u6574\uff1b\u5316\u599d\u548c\u63db\u5a5a\u7d17\u5c31\u5f88\u96e3\u52a0\u5feb\u3002<\/p>\n        <\/div>\n\n        <button type=\"button\" class=\"tp-card\" data-tip=\"tp6\">\n          <span class=\"tp-num\">06<\/span>\n          <b>A standard evening banquet<\/b><span class=\"tp-zh\">\u665a\u5bb4\u7684\u6a19\u6e96\u6d41\u7a0b<\/span>\n          <span class=\"tp-tease\">Seated \u2192 toasts \u2192 same-day edit \u2192 photos \u2192 farewell. \u5165\u5e2d\u3001\u656c\u9152\u3001\u65e9\u62cd\u665a\u64ad\u3001\u5408\u7167\u3001\u9001\u5ba2\u3002<\/span>\n          <span class=\"tp-plus\" aria-hidden=\"true\">+<\/span>\n        <\/button>\n        <div class=\"tp-body\" id=\"tp6\" hidden>\n          <ol class=\"tp-flow\">\n            <li><b>\u5165\u5e2d<\/b>Guests seated<\/li><li><b>\u63db\u656c\u9152\u886b<\/b>Change for the toasts<\/li><li><b>\u656c\u9152<\/b>Table toasts<\/li>\n            <li><b>\u65e9\u62cd\u665a\u64ad<\/b>Same-day edit<\/li><li><b>\u8cd3\u5ba2\u5408\u7167<\/b>Photos with guests<\/li><li><b>\u9001\u5ba2<\/b>See guests off<\/li>\n          <\/ol>\n          <p>After everyone is seated, the couple change into their toasting outfits and go round the tables. Then comes the same-day edit, photos with guests, and seeing everyone off. Add anything you like in between \u2014 a first dance, games and so on.<\/p>\n          <p class=\"zh\">\u5165\u5e2d\u4e4b\u5f8c\uff0c\u65b0\u4eba\u6703\u63db\u656c\u9152\u886b\uff0c\u7136\u5f8c\u656c\u9152\uff0c\u8ddf\u4f4f\u64ad\u653e\u65e9\u62cd\u665a\u64ad\uff0c\u518d\u548c\u8cd3\u5ba2\u5408\u7167\uff0c\u6700\u5f8c\u9001\u5ba2\u3002\u6709\u9700\u8981\u53ef\u4ee5\u5728\u4e2d\u9593\u52a0\u63d2\u4efb\u4f55\u74b0\u7bc0\uff0c\u4f8b\u5982 first dance\u3001\u904a\u6232\u7b49\u7b49\u3002<\/p>\n        <\/div>\n\n      <\/div>\n    <\/div>\n    <div class=\"tp-modal\" id=\"tp-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"tp-m-title\" hidden>\n      <div class=\"tp-box\">\n        <button type=\"button\" class=\"tp-x\" id=\"tp-x\" aria-label=\"Close\">\u00d7<\/button>\n        <span class=\"tp-m-num\" id=\"tp-m-num\"><\/span>\n        <h3 id=\"tp-m-title\"><\/h3><p class=\"tp-m-zh\" id=\"tp-m-zh\"><\/p>\n        <div id=\"tp-m-body\"><\/div>\n        <div class=\"tp-nav\"><button type=\"button\" id=\"tp-prev\">\u2190 Prev \u4e0a\u4e00\u500b<\/button><button type=\"button\" id=\"tp-next\">Next \u4e0b\u4e00\u500b \u2192<\/button><\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n\n  <section class=\"cta\">\n    <div class=\"wrap\">\n      <span class=\"label\">Wedding Day \u00b7 \u5a5a\u79ae\u7576\u65e5<\/span>\n      <h2 style=\"margin:12px 0 18px\">Want us to check your rundown? <span class=\"zh\">\u60f3\u6211\u5011\u5e6b\u4f60\u7747\u7747\u6d41\u7a0b\uff1f<\/span><\/h2>\n      <p>Send us your date, venue and draft timeline \u2014 we\u2019re happy to share what has worked for other couples.<\/p>\n      <p class=\"zh\">\u628a\u65e5\u671f\u3001\u5834\u5730\u548c\u521d\u6b65\u6d41\u7a0b\u50b3\u7d66\u6211\u5011\uff0c\u6211\u5011\u6a02\u610f\u5206\u4eab\u5176\u4ed6\u65b0\u4eba\u7684\u7d93\u9a57\u3002<\/p>\n      <p style=\"margin-top:26px\"><a class=\"btn solid\" href=\"https:\/\/wa.me\/85296664617\" target=\"_blank\" rel=\"noopener\">WhatsApp \u67e5\u8a62<\/a> <a class=\"btn\" href=\"https:\/\/www.billyhung.com\/blog\/price\/\">Rates \u6536\u8cbb<\/a><\/p>\n      <p style=\"margin-top:30px;font-size:14px\">Related \u00b7 \u5ef6\u4f38\u95b1\u8b80\uff1a<a href=\"https:\/\/www.billyhung.com\/blog\/hotel-wedding-ceremony-venues-hong-kong\/\">Hotel ceremony venues \u9152\u5e97\u8b49\u5a5a\u5834\u5730<\/a> \u00b7 <a href=\"https:\/\/www.billyhung.com\/blog\/wedding-day\/\">Wedding Day<\/a><\/p>\n    <\/div>\n  <\/section>\n  <meta itemprop=\"datePublished\" content=\"2026-11-03\">\n<\/article>\n\n<script>\n\/* BOA Rundown Builder core \u2014 free-placement blocks on parallel columns (no DOM, no network) *\/\nvar BOAB = (function(){\n  var CAT = [\n    {k:'makeup',   zh:'\u65b0\u5a18\u5316\u599d\u53ca\u9aee\u578b', en:'Bride hair & make-up',         d:150, c:'prep'},\n    {k:'mkbm',     zh:'\u59ca\u59b9\u5316\u599d',       en:'Bridesmaid make-up',           d:30,  c:'prep'},\n    {k:'mkmum',    zh:'\u5abd\u5abd\u5316\u599d',       en:'Mother\u2019s make-up',             d:45,  c:'prep'},\n    {k:'groomprep',zh:'\u65b0\u90ce\u53ca\u5144\u5f1f\u6e96\u5099', en:'Groom & groomsmen get ready',  d:60,  c:'prep'},\n    {k:'phbride',  zh:'\u5f71\u65b0\u5a18',         en:'Bride portraits',              d:45,  c:'photo'},\n    {k:'phgroom',  zh:'\u5f71\u65b0\u90ce\u53ca\u5144\u5f1f',   en:'Groom & groomsmen photos',     d:30,  c:'photo'},\n    {k:'photo',    zh:'\u5f71\u76f8',           en:'Photos',                       d:30,  c:'photo'},\n    {k:'games',    zh:'\u63a5\u65b0\u5a18\u30fb\u73a9\u904a\u6232', en:'Door games',                   d:30,  c:'trad'},\n    {k:'teab',     zh:'\u659f\u5973\u5bb6\u8336',       en:'Tea ceremony \u00b7 bride\u2019s family',d:30,  c:'trad'},\n    {k:'teag',     zh:'\u659f\u7537\u5bb6\u8336',       en:'Tea ceremony \u00b7 groom\u2019s family',d:30,  c:'trad'},\n    {k:'travel',   zh:'\u4ea4\u901a',           en:'Travel',                       d:30,  c:'travel'},\n    {k:'gown',     zh:'\u63db\u5a5a\u7d17',         en:'Change into the gown',         d:45,  c:'prep'},\n    {k:'cer',      zh:'\u8b49\u5a5a',           en:'Wedding ceremony',             d:30,  c:'key'},\n    {k:'cocktail', zh:'\u9152\u6703\u30fb\u5927\u5408\u7167',   en:'Cocktails & group photos',     d:30,  c:'party'},\n    {k:'outdoor',  zh:'\u5916\u5f71',           en:'Outdoor portraits',            d:90,  c:'photo'},\n    {k:'lunch',    zh:'\u5348\u5bb4',           en:'Wedding lunch',                d:180, c:'party'},\n    {k:'dinner',   zh:'\u665a\u5bb4',           en:'Wedding banquet',              d:210, c:'party'},\n    {k:'toast',    zh:'\u656c\u9152',           en:'Table toasts',                 d:45,  c:'party'},\n    {k:'video',    zh:'\u7747\u7247',           en:'Video screening',              d:10,  c:'party'},\n    {k:'sde',      zh:'\u65e9\u62cd\u665a\u64ad',       en:'Same-day edit screening',      d:10,  c:'party'},\n    {k:'rest',     zh:'\u4f11\u606f',           en:'Rest',                         d:30,  c:'rest'},\n    {k:'custom',   zh:'\u81ea\u8a02\u74b0\u7bc0',       en:'Custom item',                  d:30,  c:'custom'}\n  ];\n  var MAP={}; CAT.forEach(function(x){MAP[x.k]=x;});\n\n  function pad(n){return (n<10?'0':'')+n;}\n  function fmt(m){m=((Math.round(m)%1440)+1440)%1440;return pad(Math.floor(m\/60))+':'+pad(m%60);}\n  function parse(s){var p=String(s||'').split(':');return (+p[0]||0)*60+(+p[1]||0);}\n  function dur(m){var h=Math.floor(m\/60),r=m%60;return (h?h+'h':'')+(h&&r?' ':'')+(r||!h?r+'m':'');}\n  function snap(m,step){step=step||5;return Math.round(m\/step)*step;}\n  var seq=0; function uid(){seq++;return 'x'+seq.toString(36)+Math.random().toString(36).slice(2,6);}\n  function total(b){return b.d*(b.n||1);}\n  function end(b){return b.s+total(b);}\n\n  function mk(k,o){var c=MAP[k]||MAP.custom;var b={id:uid(),k:k,zh:c.zh,en:c.en,d:c.d,n:1,c:c.c,s:480};if(o)for(var p in o)b[p]=o[p];return b;}\n  function lane(zh,en,blocks){return {id:uid(),zh:zh,en:en,blocks:blocks||[]};}\n  \/* place blocks back-to-back from a start time; an item with {at:'hh:mm'} jumps to that time *\/\n  function chain(start,arr){var m=parse(start);arr.forEach(function(b){if(b.at){m=parse(b.at);delete b.at;}b.s=m;m=end(b);});return arr;}\n\n  var PRESETS={\n    half:function(){return {lanes:[\n      lane('\u65b0\u5a18\u30fb\u65b0\u4eba','Bride & couple',chain('05:30',[\n        mk('makeup'), mk('phbride',{zh:'\u5f71\u65b0\u5a18\u53ca\u59ca\u59b9',en:'Bride & bridesmaids photos',d:60}), mk('games'), mk('teab'),\n        mk('travel',{zh:'\u51fa\u9580\u30fb\u5165\u9580\uff08\u540c\u4e00\u9152\u5e97\uff09',en:'Leave & arrive (same hotel)',d:15}),\n        mk('teag',{zh:'\u659f\u7537\u5bb6\u8336\u30fb\u5bb6\u4eba\u5408\u7167',en:'Groom\u2019s tea ceremony & family photos'}),\n        mk('gown'), mk('cer'), mk('cocktail'), mk('lunch')])),\n      lane('\u59ca\u59b9','Bridesmaids',chain('06:30',[mk('mkbm',{n:3})])),\n      lane('\u65b0\u90ce\u30fb\u5144\u5f1f','Groom & groomsmen',chain('08:00',[\n        mk('groomprep'), mk('phgroom',{zh:'\u88dc\u5f71\u65b0\u90ce\u53ca\u5144\u5f1f',en:'Groom & groomsmen photos (catch-up)',at:'10:45'})]))\n    ]};},\n    full:function(){return {lanes:[\n      lane('\u65b0\u5a18\u30fb\u65b0\u4eba','Bride & couple',chain('05:30',[\n        mk('makeup'), mk('phbride',{zh:'\u5f71\u65b0\u5a18\u53ca\u59ca\u59b9',en:'Bride & bridesmaids photos',d:60}), mk('games',{d:45}), mk('teab',{d:45}),\n        mk('travel',{zh:'\u51fa\u9580\u30fb\u524d\u5f80\u7537\u5bb6',en:'Leave \u00b7 drive to the groom\u2019s',d:40}),\n        mk('teag',{zh:'\u659f\u7537\u5bb6\u8336\u30fb\u5bb6\u4eba\u5408\u7167',en:'Groom\u2019s tea ceremony & family photos',d:45}),\n        mk('rest',{zh:'\u5348\u81b3\u53ca\u4f11\u606f',en:'Lunch & rest',d:60}),\n        mk('gown',{d:60,at:'15:00'}), mk('cer'), mk('outdoor',{d:120}),\n        mk('cocktail',{zh:'\u9152\u6703',en:'Cocktail reception',d:60}), mk('dinner')])),\n      lane('\u59ca\u59b9','Bridesmaids',chain('06:30',[mk('mkbm',{n:4})])),\n      lane('\u665a\u5bb4\u7bc0\u76ee','Banquet programme',chain('20:15',[mk('sde'), mk('video'), mk('toast',{at:'21:15'})]))\n    ]};},\n    blank:function(){return {lanes:[lane('\u65b0\u5a18\u30fb\u65b0\u4eba','Bride & couple'),lane('\u65b0\u90ce\u30fb\u5144\u5f1f','Groom & groomsmen')]};}\n  };\n\n  \/* side-by-side packing for overlapping blocks inside one column *\/\n  function pack(L){\n    var bs=L.blocks.slice().sort(function(a,b){return a.s-b.s||end(b)-end(a);}), cl=[], cur=null;\n    bs.forEach(function(b){\n      if(!cur||b.s>=cur.e){cur={e:end(b),cols:[]};cl.push(cur);}\n      var c=0;while(cur.cols[c]!=null&&cur.cols[c]>b.s)c++;cur.cols[c]=end(b);b._c=c;b._cl=cur;cur.e=Math.max(cur.e,end(b));\n    });\n    bs.forEach(function(b){b._w=b._cl.cols.length;delete b._cl;});\n  }\n  function items(st){\n    var out=[];\n    st.lanes.forEach(function(L,li){L.blocks.forEach(function(b){out.push({b:b,L:L,li:li});});});\n    out.sort(function(a,b){return a.b.s-b.b.s||a.li-b.li;});\n    return out;\n  }\n  function lname(L){return L.en&&L.en!==L.zh?L.zh+' \u00b7 '+L.en:L.zh;}\n  function label(b){return b.zh+((b.n||1)>1?' \u00d7'+b.n:'');}\n  function labelEn(b){return b.en+((b.n||1)>1?' \u00d7'+b.n:'');}\n  function text(st,title){\n    return (title?title+'\\n':'')+items(st).map(function(x){return fmt(x.b.s)+'\u2013'+fmt(end(x.b))+'  '+label(x.b)+'\uff08'+x.L.zh+'\uff09';}).join('\\n')+\n      '\\n\\n\u2014 Billy ONAIR Photography \u5a5a\u79ae\u6d41\u7a0b billyhung.com';\n  }\n  function esc(s){return String(s).replace(\/[&<>\"]\/g,function(c){return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c];});}\n  function staticHtml(st){\n    var h='<ol class=\"tl\">';\n    items(st).forEach(function(x){var b=x.b;\n      h+='<li class=\"tl-i c-'+b.c+'\"><div class=\"tl-t\"><span class=\"tl-s\">'+fmt(b.s)+'<\/span><span class=\"tl-e\">\u2013 '+fmt(end(b))+'<\/span><\/div>'+\n        '<div class=\"tl-b\"><span class=\"tl-lane\">'+esc(lname(x.L))+'<\/span>'+\n        '<p class=\"tl-en\">'+esc(labelEn(b))+'<\/p><p class=\"tl-zh\">'+esc(label(b))+'<span class=\"tl-d\">'+dur(total(b))+'<\/span><\/p><\/div><\/li>';});\n    return h+'<\/ol>';\n  }\n\n  \/* ---------- export: parallel grid, CSV, XLSX ---------- *\/\n  function gcd(a,b){while(b){var t=b;b=a%b;a=t;}return a;}\n  function grid(st){\n    st.lanes.forEach(pack);\n    var all=items(st); if(!all.length) return {cols:[],rows:[]};\n    var cut={}; all.forEach(function(x){cut[x.b.s]=1;cut[end(x.b)]=1;});\n    var ts=Object.keys(cut).map(Number).sort(function(a,b){return a-b;});\n    var cols=[]; st.lanes.forEach(function(L,li){var w=1;L.blocks.forEach(function(b){w=Math.max(w,b._w||1);});\n      for(var c=0;c<w;c++)cols.push({li:li,sub:c,zh:L.zh+(w>1?' ('+(c+1)+')':''),en:(L.en&&L.en!==L.zh?L.en:'')+(L.en&&L.en!==L.zh&&w>1?' ('+(c+1)+')':'')});});\n    var rows=[]; for(var i=0;i<ts.length-1;i++)rows.push({t:ts[i],e:ts[i+1],cells:cols.map(function(){return null;})});\n    cols.forEach(function(col,ci){st.lanes[col.li].blocks.forEach(function(b){if((b._c||0)!==col.sub)return;\n      var idx=[];rows.forEach(function(r,ri){if(b.s<=r.t&&end(b)>=r.e)idx.push(ri);});\n      idx.forEach(function(ri,k){rows[ri].cells[ci]={b:b,first:k===0,span:idx.length};});});});\n    return {cols:cols,rows:rows};\n  }\n  function csvCell(v){v=String(v==null?'':v);return \/[\",\\n]\/.test(v)?'\"'+v.replace(\/\"\/g,'\"\"')+'\"':v;}\n  function toCSV(st){\n    var G=grid(st), out=[['Time \u6642\u9593'].concat(G.cols.map(function(c){return c.en?c.zh+' '+c.en:c.zh;}))];\n    G.rows.forEach(function(r){out.push([fmt(r.t)+'\u2013'+fmt(r.e)].concat(r.cells.map(function(c){\n      return !c?'':c.first?label(c.b)+' \/ '+labelEn(c.b)+' ('+fmt(c.b.s)+'\u2013'+fmt(end(c.b))+')':'\u2502';})));});\n    out.push([]); out.push(['Billy ONAIR Photography \u2014 billyhung.com']);\n    return '\ufeff'+out.map(function(r){return r.map(csvCell).join(',');}).join('\\r\\n');\n  }\n  \/* minimal XLSX writer (stored zip, inline strings) *\/\n  var CRC=(function(){var t=[],c,n,k;for(n=0;n<256;n++){c=n;for(k=0;k<8;k++)c=c&1?0xEDB88320^(c>>>1):c>>>1;t[n]=c>>>0;}return t;})();\n  function crc32(u){var c=0xFFFFFFFF;for(var i=0;i<u.length;i++)c=CRC[(c^u[i])&255]^(c>>>8);return (c^0xFFFFFFFF)>>>0;}\n  function utf8(s){if(typeof TextEncoder!=='undefined')return new TextEncoder().encode(s);return new Uint8Array(Buffer.from(s,'utf8'));}\n  function zip(files){\n    var parts=[],cd=[],off=0;\n    function u16(a,v){a.push(v&255,(v>>>8)&255);} function u32(a,v){a.push(v&255,(v>>>8)&255,(v>>>16)&255,(v>>>24)&255);}\n    files.forEach(function(f){var name=utf8(f[0]),data=utf8(f[1]),crc=crc32(data),h=[];\n      u32(h,0x04034b50);u16(h,20);u16(h,0x0800);u16(h,0);u16(h,0);u16(h,0x21);u32(h,crc);u32(h,data.length);u32(h,data.length);u16(h,name.length);u16(h,0);\n      parts.push(new Uint8Array(h),name,data);\n      var c=[];u32(c,0x02014b50);u16(c,20);u16(c,20);u16(c,0x0800);u16(c,0);u16(c,0);u16(c,0x21);u32(c,crc);u32(c,data.length);u32(c,data.length);\n      u16(c,name.length);u16(c,0);u16(c,0);u16(c,0);u16(c,0);u32(c,0);u32(c,off);cd.push(new Uint8Array(c),name);\n      off+=h.length+name.length+data.length;});\n    var cdLen=cd.reduce(function(n,a){return n+a.length;},0),e=[];\n    u32(e,0x06054b50);u16(e,0);u16(e,0);u16(e,files.length);u16(e,files.length);u32(e,cdLen);u32(e,off);u16(e,0);\n    var all=parts.concat(cd,[new Uint8Array(e)]),len=all.reduce(function(n,a){return n+a.length;},0),out=new Uint8Array(len),p=0;\n    all.forEach(function(a){out.set(a,p);p+=a.length;});return out;\n  }\n  function x(s){return String(s).replace(\/[&<>\"]\/g,function(c){return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c];});}\n  function colName(i){var s='';i++;while(i){var m=(i-1)%26;s=String.fromCharCode(65+m)+s;i=Math.floor((i-1)\/26);}return s;}\n  var XCAT=['prep','photo','trad','travel','key','party','rest','custom'];\n  var XFILL={prep:'EEF1F6',photo:'E7F3EE',trad:'F7EBE8',travel:'F7EFE2',key:'E2E9F4',party:'EFE9F5',rest:'F3F5F8',custom:'EEF2F8'};\n  function cellStr(ref,v,s){return '<c r=\"'+ref+'\" t=\"inlineStr\"'+(s?' s=\"'+s+'\"':'')+'><is><t xml:space=\"preserve\">'+x(v)+'<\/t><\/is><\/c>';}\n  function cellNum(ref,v,s){return '<c r=\"'+ref+'\"'+(s?' s=\"'+s+'\"':'')+'><v>'+v+'<\/v><\/c>';}\n  function toXLSX(st){\n    var G=grid(st), sh1=[], merges=[], R=1;\n    var head='<row r=\"1\" ht=\"30\" customHeight=\"1\">'+cellStr('A1','Time \u6642\u9593',1)+G.cols.map(function(c,i){return cellStr(colName(i+1)+'1',c.en?c.zh+'\\n'+c.en:c.zh,1);}).join('')+'<\/row>';\n    sh1.push(head);\n    G.rows.forEach(function(r,ri){var rn=ri+2, ht=Math.round(Math.max(30,Math.min(110,(r.e-r.t)*0.75))), h='<row r=\"'+rn+'\" ht=\"'+ht+'\" customHeight=\"1\">'+cellStr('A'+rn,fmt(r.t)+'\\n'+fmt(r.e),2);\n      r.cells.forEach(function(c,ci){var ref=colName(ci+1)+rn;\n        if(!c){h+='<c r=\"'+ref+'\" s=\"11\"\/>';return;}\n        var s=3+Math.max(0,XCAT.indexOf(c.b.c));\n        if(c.first){h+=cellStr(ref,label(c.b)+'\\n'+fmt(c.b.s)+'\u2013'+fmt(end(c.b))+' \u00b7 '+dur(total(c.b)),s);\n          if(c.span>1)merges.push(ref+':'+colName(ci+1)+(rn+c.span-1));}\n        else h+='<c r=\"'+ref+'\" s=\"'+s+'\"\/>';});\n      sh1.push(h+'<\/row>');});\n    var last=G.rows.length+3; sh1.push('<row r=\"'+last+'\">'+cellStr('A'+last,'Billy ONAIR Photography \u2014 billyhung.com',2)+'<\/row>');\n    var cols1='<cols><col min=\"1\" max=\"1\" width=\"9\" customWidth=\"1\"\/>'+(G.cols.length?'<col min=\"2\" max=\"'+(G.cols.length+1)+'\" width=\"30\" customWidth=\"1\"\/>':'')+'<\/cols>';\n    var view='<sheetViews><sheetView workbookViewId=\"0\"><pane xSplit=\"1\" ySplit=\"1\" topLeftCell=\"B2\" activePane=\"bottomRight\" state=\"frozen\"\/><\/sheetView><\/sheetViews>';\n    var ws1='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><worksheet xmlns=\"http:\/\/schemas.openxmlformats.org\/spreadsheetml\/2006\/main\">'+view+cols1+\n      '<sheetData>'+sh1.join('')+'<\/sheetData>'+(merges.length?'<mergeCells count=\"'+merges.length+'\">'+merges.map(function(m){return '<mergeCell ref=\"'+m+'\"\/>';}).join('')+'<\/mergeCells>':'')+\n      '<pageMargins left=\"0.4\" right=\"0.4\" top=\"0.5\" bottom=\"0.5\" header=\"0.3\" footer=\"0.3\"\/><pageSetup orientation=\"portrait\" fitToWidth=\"1\" fitToHeight=\"0\"\/><\/worksheet>';\n    \/* sheet 2 \u2014 chronological list *\/\n    var L2=['Start \u958b\u59cb','End \u5b8c\u7d50','Duration \u9577\u5ea6','Column \u884c','Item \u74b0\u7bc0','Item (EN)','People \u4eba\u6578'], rows2=['<row r=\"1\" ht=\"24\" customHeight=\"1\">'+L2.map(function(h,i){return cellStr(colName(i)+'1',h,1);}).join('')+'<\/row>'];\n    items(st).forEach(function(it,i){var r=i+2,b=it.b,s=3+Math.max(0,XCAT.indexOf(b.c));\n      rows2.push('<row r=\"'+r+'\">'+cellStr('A'+r,fmt(b.s),12)+cellStr('B'+r,fmt(end(b)),12)+cellStr('C'+r,dur(total(b)),12)+cellStr('D'+r,it.L.zh,12)+\n        cellStr('E'+r,b.zh,s)+cellStr('F'+r,b.en,12)+cellNum('G'+r,b.n||1,12)+'<\/row>');});\n    var ws2='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><worksheet xmlns=\"http:\/\/schemas.openxmlformats.org\/spreadsheetml\/2006\/main\">'+\n      '<sheetViews><sheetView workbookViewId=\"0\"><pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\"\/><\/sheetView><\/sheetViews>'+\n      '<cols><col min=\"1\" max=\"3\" width=\"11\" customWidth=\"1\"\/><col min=\"4\" max=\"4\" width=\"16\" customWidth=\"1\"\/><col min=\"5\" max=\"5\" width=\"24\" customWidth=\"1\"\/><col min=\"6\" max=\"6\" width=\"34\" customWidth=\"1\"\/><col min=\"7\" max=\"7\" width=\"9\" customWidth=\"1\"\/><\/cols>'+\n      '<sheetData>'+rows2.join('')+'<\/sheetData><\/worksheet>';\n    var fills='<fill><patternFill patternType=\"none\"\/><\/fill><fill><patternFill patternType=\"gray125\"\/><\/fill><fill><patternFill patternType=\"solid\"><fgColor rgb=\"FF22406E\"\/><bgColor indexed=\"64\"\/><\/patternFill><\/fill>'+\n      XCAT.map(function(k){return '<fill><patternFill patternType=\"solid\"><fgColor rgb=\"FF'+XFILL[k]+'\"\/><bgColor indexed=\"64\"\/><\/patternFill><\/fill>';}).join('');\n    var bd='<border><left\/><right\/><top\/><bottom\/><diagonal\/><\/border><border><left style=\"thin\"><color rgb=\"FFDFE4EC\"\/><\/left><right style=\"thin\"><color rgb=\"FFDFE4EC\"\/><\/right><top style=\"thin\"><color rgb=\"FFDFE4EC\"\/><\/top><bottom style=\"thin\"><color rgb=\"FFDFE4EC\"\/><\/bottom><diagonal\/><\/border>';\n    var al='<alignment vertical=\"top\" wrapText=\"1\"\/>';\n    var xfs='<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"\/>'+\n      '<xf numFmtId=\"0\" fontId=\"1\" fillId=\"2\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyFill=\"1\" applyBorder=\"1\" applyAlignment=\"1\"><alignment horizontal=\"center\" vertical=\"center\" wrapText=\"1\"\/><\/xf>'+\n      '<xf numFmtId=\"0\" fontId=\"2\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyBorder=\"1\" applyAlignment=\"1\">'+al+'<\/xf>'+\n      XCAT.map(function(k,i){return '<xf numFmtId=\"0\" fontId=\"3\" fillId=\"'+(3+i)+'\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyFill=\"1\" applyBorder=\"1\" applyAlignment=\"1\">'+al+'<\/xf>';}).join('')+\n      '<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyBorder=\"1\"\/>'+\n      '<xf numFmtId=\"0\" fontId=\"4\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyBorder=\"1\" applyAlignment=\"1\">'+al+'<\/xf>';\n    var styles='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><styleSheet xmlns=\"http:\/\/schemas.openxmlformats.org\/spreadsheetml\/2006\/main\">'+\n      '<fonts count=\"5\"><font><sz val=\"11\"\/><name val=\"Calibri\"\/><\/font><font><b\/><sz val=\"11\"\/><color rgb=\"FFFFFFFF\"\/><name val=\"Calibri\"\/><\/font><font><sz val=\"10\"\/><color rgb=\"FF5A7299\"\/><name val=\"Calibri\"\/><\/font><font><sz val=\"11\"\/><color rgb=\"FF1C2A44\"\/><name val=\"Calibri\"\/><\/font><font><sz val=\"11\"\/><color rgb=\"FF1C2A44\"\/><name val=\"Calibri\"\/><\/font><\/fonts>'+\n      '<fills count=\"'+(3+XCAT.length)+'\">'+fills+'<\/fills><borders count=\"2\">'+bd+'<\/borders>'+\n      '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"\/><\/cellStyleXfs><cellXfs count=\"'+(13)+'\">'+xfs+'<\/cellXfs>'+\n      '<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"\/><\/cellStyles><\/styleSheet>';\n    var wb='<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><workbook xmlns=\"http:\/\/schemas.openxmlformats.org\/spreadsheetml\/2006\/main\" xmlns:r=\"http:\/\/schemas.openxmlformats.org\/officeDocument\/2006\/relationships\"><sheets>'+\n      '<sheet name=\"Timeline \u6642\u9593\u7dda\" sheetId=\"1\" r:id=\"rId1\"\/><sheet name=\"List \u6d41\u7a0b\u8868\" sheetId=\"2\" r:id=\"rId2\"\/><\/sheets><\/workbook>';\n    return zip([\n      ['[Content_Types].xml','<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Types xmlns=\"http:\/\/schemas.openxmlformats.org\/package\/2006\/content-types\"><Default Extension=\"rels\" ContentType=\"application\/vnd.openxmlformats-package.relationships+xml\"\/><Default Extension=\"xml\" ContentType=\"application\/xml\"\/><Override PartName=\"\/xl\/workbook.xml\" ContentType=\"application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"\/><Override PartName=\"\/xl\/worksheets\/sheet1.xml\" ContentType=\"application\/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"\/><Override PartName=\"\/xl\/worksheets\/sheet2.xml\" ContentType=\"application\/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"\/><Override PartName=\"\/xl\/styles.xml\" ContentType=\"application\/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"\/><\/Types>'],\n      ['_rels\/.rels','<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"http:\/\/schemas.openxmlformats.org\/package\/2006\/relationships\"><Relationship Id=\"rId1\" Type=\"http:\/\/schemas.openxmlformats.org\/officeDocument\/2006\/relationships\/officeDocument\" Target=\"xl\/workbook.xml\"\/><\/Relationships>'],\n      ['xl\/workbook.xml',wb],\n      ['xl\/_rels\/workbook.xml.rels','<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"http:\/\/schemas.openxmlformats.org\/package\/2006\/relationships\"><Relationship Id=\"rId1\" Type=\"http:\/\/schemas.openxmlformats.org\/officeDocument\/2006\/relationships\/worksheet\" Target=\"worksheets\/sheet1.xml\"\/><Relationship Id=\"rId2\" Type=\"http:\/\/schemas.openxmlformats.org\/officeDocument\/2006\/relationships\/worksheet\" Target=\"worksheets\/sheet2.xml\"\/><Relationship Id=\"rId3\" Type=\"http:\/\/schemas.openxmlformats.org\/officeDocument\/2006\/relationships\/styles\" Target=\"styles.xml\"\/><\/Relationships>'],\n      ['xl\/styles.xml',styles],['xl\/worksheets\/sheet1.xml',ws1],['xl\/worksheets\/sheet2.xml',ws2]]);\n  }\n  return {grid:grid,toCSV:toCSV,toXLSX:toXLSX,CAT:CAT,MAP:MAP,PRESETS:PRESETS,fmt:fmt,parse:parse,dur:dur,snap:snap,uid:uid,mk:mk,lane:lane,total:total,end:end,pack:pack,items:items,text:text,staticHtml:staticHtml,label:label,esc:esc};\n})();\n\n(function(){\n  var B=BOAB, root=document.getElementById('planner'); if(!root) return;\n  var KEY='boa-rundown-v2', ZOOMS=[0.7,0.9,1.1,1.35,1.7], zi=2, MAXL=5, HOLD=320;\n  var st, sel=null, active=0, tap=null, T0=0, T1=0, drag=null, toastT=null, hist=[], hi=-1, lastPush=0, restoring=false;\n  function save(){try{localStorage.setItem(KEY,JSON.stringify(st));}catch(e){}}\n  function load(){try{var s=JSON.parse(localStorage.getItem(KEY)||'null');if(s&&s.lanes&&s.lanes.length)return s;}catch(e){}return null;}\n  st=load()||B.PRESETS.half();\n  var $=function(id){return document.getElementById(id);};\n  var board=$('bd-board'), pal=$('bd-palette'), addto=$('bd-addto'), insp=$('bd-insp'), list=$('bd-list');\n  function Z(){return ZOOMS[zi];}\n  var toast=document.createElement('div'); toast.className='bd-toast'; toast.hidden=true; root.querySelector('.bd-board-wrap').appendChild(toast);\n  function say(msg,canUndo){\n    toast.innerHTML='<span>'+msg+'<\/span>'+(canUndo?'<button type=\"button\" class=\"chip-btn ghost\" data-undo>Undo \u5fa9\u539f<\/button>':'');\n    toast.hidden=false; clearTimeout(toastT); toastT=setTimeout(function(){toast.hidden=true;undoSt=null;},7000);\n  }\n  function snapshot(){}\n  function ser(){return JSON.stringify(st,function(k,v){return (k==='_c'||k==='_w')?undefined:v;});}\n  function commit(){\n    if(restoring)return; var cur=ser(); if(hist[hi]===cur)return;\n    var now=Date.now();\n    if(hi>0&&now-lastPush<450&&hi===hist.length-1){hist[hi]=cur;}      \/* merge rapid edits (typing, repeated taps) *\/\n    else{hist=hist.slice(0,hi+1);hist.push(cur);if(hist.length>100)hist.shift();hi=hist.length-1;}\n    lastPush=now; syncHist();\n  }\n  function go(step){\n    var n=hi+step; if(n<0||n>=hist.length)return;\n    hi=n; restoring=true; st=JSON.parse(hist[hi]);\n    if(sel&&!findSel())sel=null; tap=null; active=Math.min(active,st.lanes.length-1);\n    render(); restoring=false; lastPush=0; syncHist(); toast.hidden=true;\n  }\n  function syncHist(){var u=$('bd-undo'),r=$('bd-redo');if(u)u.disabled=hi<=0;if(r)r.disabled=hi>=hist.length-1;}\n  toast.addEventListener('click',function(e){if(e.target.closest('[data-undo]'))go(-1);});\n\n  \/* ---------- palette ---------- *\/\n  B.CAT.forEach(function(c){\n    var b=document.createElement('button'); b.type='button'; b.className='pal c-'+c.c; b.dataset.k=c.k;\n    b.innerHTML='<i><\/i>'+B.esc(c.zh)+' <small>'+B.dur(c.d)+'<\/small>';\n    b.addEventListener('click',function(){addBlock(c.k);});\n    pal.appendChild(b);\n  });\n\n  function findSel(){if(!sel)return null;for(var i=0;i<st.lanes.length;i++){var L=st.lanes[i];for(var j=0;j<L.blocks.length;j++)if(L.blocks[j].id===sel)return {L:L,li:i,bi:j,b:L.blocks[j]};}return null;}\n  function laneEnd(L){return L.blocks.reduce(function(m,b){return Math.max(m,B.end(b));},-1);}\n  function addBlock(k){\n    var li=Math.min(active,st.lanes.length-1), L=st.lanes[li], s;\n    if(tap&&tap.li===li){s=tap.t;}\n    else{var f=findSel(); s=(f&&f.li===li)?B.end(f.b):laneEnd(L);\n      if(s<0){var all=B.items(st); s=all.length?all[0].b.s:480;}}\n    var b=B.mk(k,{s:s}); L.blocks.push(b); sel=b.id; tap=null; render();\n  }\n\n  \/* ---------- render ---------- *\/\n  function range(){\n    var all=B.items(st), lo=480, hi=480+360;\n    if(all.length){lo=Math.min.apply(null,all.map(function(x){return x.b.s;}));hi=Math.max.apply(null,all.map(function(x){return B.end(x.b);}));}\n    T0=Math.max(0,Math.floor(lo\/60)*60-60); T1=Math.min(1440,Math.max(Math.ceil(hi\/60)*60+60,T0+420));\n  }\n  function render(keepRange){\n    if(!keepRange) range();\n    var z=Z(), H=(T1-T0)*z;\n    st.lanes.forEach(B.pack);\n    var cols='48px repeat('+st.lanes.length+',minmax(128px,1fr))';\n    var h='<div class=\"bd-grid\" style=\"grid-template-columns:'+cols+'\"><div class=\"bd-head corner\"><\/div>';\n    st.lanes.forEach(function(L,li){\n      h+='<div class=\"bd-head'+(li===active?' active':'')+'\" data-li=\"'+li+'\"><input type=\"text\" value=\"'+B.esc(L.zh)+'\" data-lname=\"'+li+'\" aria-label=\"Column name\">'+\n         (st.lanes.length>1?'<button type=\"button\" class=\"rm\" data-lrm=\"'+li+'\" aria-label=\"Remove column\">\u00d7<\/button>':'')+'<\/div>';\n    });\n    h+='<div class=\"bd-gut\" style=\"height:'+H+'px\">';\n    for(var t=T0;t<=T1;t+=60){h+='<span style=\"top:'+((t-T0)*z)+'px\">'+B.fmt(t)+'<\/span>';}\n    h+='<\/div>';\n    var grid='background-image:repeating-linear-gradient(to bottom,#e9edf3 0,#e9edf3 1px,transparent 1px,transparent '+(60*z)+'px),repeating-linear-gradient(to bottom,#f4f6f9 0,#f4f6f9 1px,transparent 1px,transparent '+(30*z)+'px);';\n    st.lanes.forEach(function(L,li){\n      h+='<div class=\"bd-col'+(li===active?' active':'')+'\" data-col=\"'+li+'\" style=\"height:'+H+'px;'+grid+'\">';\n      if(tap&&tap.li===li)h+='<div class=\"bd-tap\" style=\"top:'+((tap.t-T0)*z)+'px\"><span>+ '+B.fmt(tap.t)+'<\/span><\/div>';\n      L.blocks.forEach(function(b){h+=blockHtml(b,z);});\n      h+='<\/div>';\n    });\n    board.innerHTML=h+'<\/div>';\n    addto.innerHTML='Add to \u52a0\u5230\uff1a<b>'+B.esc(st.lanes[active].zh)+'<\/b>'+(tap&&tap.li===active?' \u00b7 at \u65bc <b>'+B.fmt(tap.t)+'<\/b>':'')+' \u2014 tap a column to switch \u64b3\u76f4\u884c\u8f49\u884c';\n    list.innerHTML=B.staticHtml(st);\n    var all=B.items(st); $('bd-span').textContent=all.length?B.fmt(all[0].b.s)+' \u2013 '+B.fmt(Math.max.apply(null,all.map(function(x){return B.end(x.b);}))):'';\n    var txt=B.text(st,'\u5a5a\u79ae\u6d41\u7a0b Wedding rundown');\n    $('bd-share').href='https:\/\/wa.me\/?text='+encodeURIComponent(txt);\n    $('bd-ask').href='https:\/\/wa.me\/85296664617?text='+encodeURIComponent('\u4f60\u597d\uff01\u60f3\u8acb\u4f60\u5011\u5e6b\u6211\u7747\u7747\u5a5a\u79ae\u6d41\u7a0b\uff1a\\n\\n'+txt);\n    root._txt=txt; renderInsp(); save(); commit();\n  }\n  function blockHtml(b,z){\n    var hh=Math.max(B.total(b)*z-2,14), w=b._w||1, c=b._c||0;\n    var pos='top:'+((b.s-T0)*z+1)+'px;height:'+hh+'px;left:calc('+(c*100\/w)+'% + 4px);width:calc('+(100\/w)+'% - 8px)';\n    return '<div class=\"blk c-'+b.c+(hh<34?' compact':'')+(b.id===sel?' sel':'')+'\" data-id=\"'+b.id+'\" style=\"'+pos+'\">'+\n      '<b>'+B.esc(B.label(b))+'<\/b><em>'+B.fmt(b.s)+'\u2013'+B.fmt(B.end(b))+' \u00b7 '+B.dur(B.total(b))+'<\/em><i class=\"rz\" aria-hidden=\"true\"><\/i><\/div>';\n  }\n  function renderInsp(){\n    var f=findSel(); if(!f){insp.hidden=true;return;}\n    insp.hidden=false; var b=f.b, ae=document.activeElement;\n    if(ae!==$('in-zh'))$('in-zh').value=b.zh;\n    if(ae!==$('in-d'))$('in-d').value=b.d;\n    if(ae!==$('in-s'))$('in-s').value=B.fmt(b.s);\n    if(ae!==$('in-e'))$('in-e').value=B.fmt(B.end(b));\n    $('in-n').textContent=b.n||1;\n    $('in-time').textContent=B.dur(B.total(b));\n    $('in-lane').innerHTML=st.lanes.map(function(L,i){return '<option value=\"'+i+'\"'+(i===f.li?' selected':'')+'>'+B.esc(L.zh)+'<\/option>';}).join('');\n  }\n  function setActive(li){\n    if(li===active)return; active=li;\n    board.querySelectorAll('.bd-head[data-li],.bd-col').forEach(function(el){var i=+(el.dataset.li!=null?el.dataset.li:el.dataset.col);el.classList.toggle('active',i===li);});\n    addto.innerHTML='Add to \u52a0\u5230\uff1a<b>'+B.esc(st.lanes[active].zh)+'<\/b> \u2014 tap a column to switch \u64b3\u76f4\u884c\u8f49\u884c';\n  }\n\n  \/* ---------- clicks ---------- *\/\n  var suppressClick=false;\n  board.addEventListener('click',function(e){\n    if(suppressClick){suppressClick=false;return;}\n    var blk=e.target.closest('.blk'); if(blk){sel=blk.dataset.id;active=findSel().li;tap=null;render(true);return;}\n    var rm=e.target.closest('[data-lrm]'); if(rm){var i=+rm.dataset.lrm;snapshot();var nm=st.lanes[i].zh;\n      st.lanes.splice(i,1);say('Removed \u5df2\u522a\u9664\u300c'+B.esc(nm)+'\u300d',true);active=Math.max(0,Math.min(active,st.lanes.length-1));sel=null;tap=null;render();return;}\n    var col=e.target.closest('.bd-col');\n    if(col){var r=col.getBoundingClientRect();active=+col.dataset.col;sel=null;\n      tap={li:active,t:Math.max(0,B.snap(T0+(e.clientY-r.top)\/Z(),15))};render(true);return;}\n    var hd=e.target.closest('.bd-head[data-li]'); if(hd&&e.target.tagName!=='INPUT'){setActive(+hd.dataset.li);}\n  });\n  board.addEventListener('focusin',function(e){var hd=e.target.closest('.bd-head[data-li]');if(hd)setActive(+hd.dataset.li);});\n  board.addEventListener('change',function(e){if(e.target.dataset.lname!=null){var L=st.lanes[+e.target.dataset.lname],v=(e.target.value||'').trim()||'\u2014';L.zh=v;L.en=v;render(true);}});\n\n  \/* ---------- drag: mouse (pointer) + touch (press & hold) ---------- *\/\n  function colAt(x,y){var el=document.elementFromPoint(x,y);return el&&el.closest?el.closest('.bd-col'):null;}\n  function beginDrag(el,mode,x,y){\n    var id=el.dataset.id; sel=id; var f=findSel(); if(!f)return;\n    var col=el.parentNode, r=col.getBoundingClientRect();\n    drag={id:id,mode:mode,el:el,b:f.b,li:f.li,grab:(y-r.top)\/Z()-(f.b.s-T0),s:f.b.s,d:f.b.d,x:x,y:y,live:true};\n    el.classList.add('dragging','sel'); document.documentElement.classList.add('bd-dragging');\n    if(navigator.vibrate){try{navigator.vibrate(12);}catch(e){}}\n    autoScroll();\n  }\n  function moveDrag(x,y){\n    if(!drag)return; drag.x=x; drag.y=y; var b=drag.b, el=drag.el, z=Z();\n    if(drag.mode==='move'){\n      el.style.visibility='hidden'; var col=colAt(x,y); el.style.visibility='';\n      if(col&&col!==el.parentNode){col.appendChild(el);drag.li=+col.dataset.col;}\n      var r=el.parentNode.getBoundingClientRect();\n      var ns=B.snap(T0+(y-r.top)\/z-drag.grab,5); ns=Math.max(T0,Math.min(T1-B.total(b),ns));\n      drag.s=ns; el.style.top=((ns-T0)*z+1)+'px'; el.style.left='4px'; el.style.width='calc(100% - 8px)';\n      el.querySelector('em').textContent=B.fmt(ns)+'\u2013'+B.fmt(ns+B.total(b))+' \u00b7 '+B.dur(B.total(b));\n    } else {\n      var r2=el.parentNode.getBoundingClientRect(), endT=B.snap(T0+(y-r2.top)\/z,5);\n      var tot=Math.max(5*(b.n||1),endT-b.s), per=Math.max(5,B.snap(tot\/(b.n||1),5));\n      drag.d=per; el.style.height=Math.max(per*(b.n||1)*z-2,14)+'px';\n      el.querySelector('em').textContent=B.fmt(b.s)+'\u2013'+B.fmt(b.s+per*(b.n||1))+' \u00b7 '+B.dur(per*(b.n||1));\n    }\n  }\n  function endDrag(){\n    if(!drag)return; var d=drag; drag=null;\n    document.documentElement.classList.remove('bd-dragging');\n    var f=findSel();\n    if(f){ if(d.mode==='move'){f.b.s=d.s; if(d.li!==f.li){f.L.blocks.splice(f.bi,1);st.lanes[d.li].blocks.push(f.b);} active=d.li;} else f.b.d=d.d; }\n    suppressClick=true; setTimeout(function(){suppressClick=false;},60);\n    tap=null; render();\n  }\n  function autoScroll(){\n    if(!drag)return;\n    var y=drag.y, edge=70, v=0;\n    if(y<edge)v=-(edge-y)\/4; else if(y>window.innerHeight-edge)v=(y-(window.innerHeight-edge))\/4;\n    if(v){window.scrollBy(0,v);moveDrag(drag.x,drag.y);}\n    var bw=board, bx=drag.x, br=bw.getBoundingClientRect();\n    if(bx<br.left+30)bw.scrollLeft-=8; else if(bx>br.right-30)bw.scrollLeft+=8;\n    requestAnimationFrame(autoScroll);\n  }\n  \/* mouse \/ pen *\/\n  var pend=null;\n  board.addEventListener('pointerdown',function(e){\n    if(e.pointerType==='touch'||e.button!==0)return;\n    var el=e.target.closest('.blk'); if(!el)return;\n    pend={el:el,mode:e.target.classList.contains('rz')?'resize':'move',x:e.clientX,y:e.clientY};\n    e.preventDefault();\n  });\n  document.addEventListener('pointermove',function(e){\n    if(e.pointerType==='touch')return;\n    if(pend&&!drag&&(Math.abs(e.clientX-pend.x)+Math.abs(e.clientY-pend.y)>4)){beginDrag(pend.el,pend.mode,pend.x,pend.y);}\n    if(drag)moveDrag(e.clientX,e.clientY);\n  });\n  document.addEventListener('pointerup',function(e){if(e.pointerType==='touch')return;pend=null;if(drag)endDrag();});\n  \/* touch: press & hold to move; the bottom handle resizes straight away *\/\n  var hold=null;\n  board.addEventListener('touchstart',function(e){\n    var el=e.target.closest('.blk'); if(!el||e.touches.length>1)return;\n    var t=e.touches[0], isRz=e.target.classList.contains('rz');\n    if(isRz){e.preventDefault();beginDrag(el,'resize',t.clientX,t.clientY);return;}\n    hold={el:el,x:t.clientX,y:t.clientY,timer:setTimeout(function(){if(hold){beginDrag(hold.el,'move',hold.x,hold.y);hold=null;}},HOLD)};\n    el.classList.add('pressing');\n  },{passive:false});\n  document.addEventListener('touchmove',function(e){\n    var t=e.touches[0]; if(!t)return;\n    if(hold&&(Math.abs(t.clientX-hold.x)+Math.abs(t.clientY-hold.y)>10)){clearTimeout(hold.timer);hold.el.classList.remove('pressing');hold=null;}\n    if(drag){e.preventDefault();moveDrag(t.clientX,t.clientY);}\n  },{passive:false});\n  function touchEnd(){if(hold){clearTimeout(hold.timer);hold.el.classList.remove('pressing');hold=null;}if(drag)endDrag();}\n  document.addEventListener('touchend',touchEnd); document.addEventListener('touchcancel',touchEnd);\n  board.addEventListener('contextmenu',function(e){if(e.target.closest('.blk'))e.preventDefault();});\n\n  \/* ---------- inspector ---------- *\/\n  function upd(fn,keep){var f=findSel();if(!f)return;fn(f);render(keep);}\n  $('in-zh').addEventListener('input',function(){var v=this.value;upd(function(f){f.b.zh=v||'\u2014';},true);});\n  $('in-d').addEventListener('change',function(){var v=Math.max(5,Math.min(600,B.snap(+this.value||5,5)));upd(function(f){f.b.d=v;});});\n  $('in-s').addEventListener('change',function(){if(!this.value)return;var v=B.parse(this.value);upd(function(f){f.b.s=v;});});\n  $('in-e').addEventListener('change',function(){if(!this.value)return;var v=B.parse(this.value);upd(function(f){var n=f.b.n||1;f.b.d=Math.max(5,B.snap((v-f.b.s)\/n,5));});});\n  insp.addEventListener('click',function(e){\n    var t=e.target;\n    if(t.dataset.d)upd(function(f){f.b.d=Math.max(5,Math.min(600,f.b.d+(+t.dataset.d)));});\n    if(t.dataset.n)upd(function(f){f.b.n=Math.max(1,Math.min(12,(f.b.n||1)+(+t.dataset.n)));});\n  });\n  $('in-lane').addEventListener('change',function(){var to=+this.value;upd(function(f){f.L.blocks.splice(f.bi,1);st.lanes[to].blocks.push(f.b);active=to;});});\n  $('in-snap').addEventListener('click',function(){upd(function(f){var prev=f.L.blocks.filter(function(x){return x!==f.b&&B.end(x)<=f.b.s+0.1;}).reduce(function(m,x){return Math.max(m,B.end(x));},-1);if(prev>=0)f.b.s=prev;});});\n  $('in-dup').addEventListener('click',function(){upd(function(f){var c=JSON.parse(JSON.stringify(f.b));c.id=B.uid();c.s=B.end(f.b);f.L.blocks.push(c);sel=c.id;});});\n  $('in-del').addEventListener('click',function(){snapshot();var f0=findSel();upd(function(f){f.L.blocks.splice(f.bi,1);sel=null;});if(f0)say('Deleted \u5df2\u522a\u9664\u300c'+B.esc(f0.b.zh)+'\u300d',true);});\n  $('in-close').addEventListener('click',function(){sel=null;render(true);});\n\n  \/* ---------- toolbar ---------- *\/\n  var PN={half:'Half-day example \u534a\u65e5\u4f8b\u5b50',full:'Full-day example \u5168\u65e5\u4f8b\u5b50',blank:'Cleared \u5df2\u6e05\u7a7a'};\n  function usePreset(k,ask){\n    var had=B.items(st).length; if(had)snapshot();\n    st=B.PRESETS[k]();sel=null;tap=null;active=0;lastPush=0;render();\n    if(ask)say(PN[k]+(had?' \u2014 your previous rundown was replaced \u5df2\u53d6\u4ee3\u4e4b\u524d\u7684\u6d41\u7a0b':''),had);\n  }\n  root.querySelectorAll('[data-preset]').forEach(function(b){b.addEventListener('click',function(){usePreset(b.dataset.preset,true);});});\n  document.querySelectorAll('[data-load]').forEach(function(b){b.addEventListener('click',function(){usePreset(b.dataset.load,false);root.scrollIntoView({behavior:'smooth'});});});\n  $('bd-undo').addEventListener('click',function(){go(-1);});\n  $('bd-redo').addEventListener('click',function(){go(1);});\n  root.querySelectorAll('[data-zoom]').forEach(function(b){b.addEventListener('click',function(){zi=Math.max(0,Math.min(ZOOMS.length-1,zi+(+b.dataset.zoom)));render(true);});});\n  $('bd-addlane').addEventListener('click',function(){\n    if(st.lanes.length>=MAXL){say('Up to '+MAXL+' columns \u6700\u591a '+MAXL+' \u884c',false);return;}\n    st.lanes.push(B.lane('\u65b0\u7684\u4e00\u884c','New column'));active=st.lanes.length-1;sel=null;render(true);});\n  $('bd-copy').addEventListener('click',function(){\n    var txt=root._txt||'';function done(){$('bd-copied').hidden=false;setTimeout(function(){$('bd-copied').hidden=true;},1800);}\n    if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(txt).then(done,function(){});}\n    else{var ta=document.createElement('textarea');ta.value=txt;document.body.appendChild(ta);ta.select();try{document.execCommand('copy');done();}catch(e){}document.body.removeChild(ta);}\n  });\n  function download(data,name,type){\n    try{var blob=new Blob([data],{type:type}),url=URL.createObjectURL(blob),a=document.createElement('a');\n      a.href=url;a.download=name;a.rel='noopener';document.body.appendChild(a);a.click();\n      setTimeout(function(){document.body.removeChild(a);URL.revokeObjectURL(url);},1500);\n      say('Downloaded \u5df2\u4e0b\u8f09 '+name,false);}catch(e){say('Download not supported here \u6b64\u700f\u89bd\u5668\u4e0d\u652f\u63f4\u4e0b\u8f09',false);}\n  }\n  function stamp(){var d=new Date();return d.getFullYear()+('0'+(d.getMonth()+1)).slice(-2)+('0'+d.getDate()).slice(-2);}\n  $('bd-xlsx').addEventListener('click',function(){download(B.toXLSX(JSON.parse(JSON.stringify(st))),'wedding-rundown-'+stamp()+'.xlsx','application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet');});\n  $('bd-csv').addEventListener('click',function(){download(B.toCSV(JSON.parse(JSON.stringify(st))),'wedding-rundown-'+stamp()+'.csv','text\/csv;charset=utf-8');});\n  document.addEventListener('keydown',function(e){\n    var inField=\/INPUT|SELECT|TEXTAREA\/.test((document.activeElement||{}).tagName||'');\n    if((e.metaKey||e.ctrlKey)&&!inField&&root.contains(document.activeElement)||(e.metaKey||e.ctrlKey)&&!inField&&document.activeElement===document.body){\n      var k=e.key.toLowerCase();\n      if(k==='z'&&!e.shiftKey){e.preventDefault();go(-1);return;}\n      if((k==='z'&&e.shiftKey)||k==='y'){e.preventDefault();go(1);return;}\n    }\n    if(e.key==='Escape'&&(sel||tap)){sel=null;tap=null;render(true);}\n    var f=findSel(); if(!f||\/INPUT|SELECT|TEXTAREA\/.test((document.activeElement||{}).tagName||''))return;\n    if(e.key==='Delete'||e.key==='Backspace'){e.preventDefault();upd(function(f){f.L.blocks.splice(f.bi,1);sel=null;});}\n    if(e.key==='ArrowUp'||e.key==='ArrowDown'){e.preventDefault();var dv=(e.key==='ArrowUp'?-5:5)*(e.shiftKey?3:1);upd(function(f){f.b.s=Math.max(0,f.b.s+dv);},true);}\n  });\n  render();\n})();\n\n(function(){\n  var stage=document.getElementById('ha-stage'); if(!stage) return;\n  var wrap=stage.parentNode, F=document.getElementById('ha-finger'), $=function(id){return document.getElementById(id);};\n  \/* scale the 400\u00d7372 stage to its box *\/\n  function fit(){stage.style.transform='scale('+(wrap.clientWidth\/400)+')';}\n  fit(); if(window.ResizeObserver)new ResizeObserver(fit).observe(wrap); else window.addEventListener('resize',fit);\n\n  \/* time grid: 08:00\u201314:00, 38px per hour, from y=102 *\/\n  var Y0=102, PX=38\/60, T0=480;\n  function y(t){return Y0+(t-T0)*PX;}\n  var board=stage.querySelector('.ha-gut');\n  for(var h=8;h<14;h++){var s=document.createElement('span');s.className='ha-tm';s.style.top=(y(h*60)-76)+'px';s.textContent=(h<10?'0':'')+h+':00';board.appendChild(s);}\n  var CC={prep:['#7d8aa3','#eef1f6'],photo:['#3f8f7b','#e7f3ee'],trad:['#a8574b','#f7ebe8'],key:['#22406e','#e2e9f4'],party:['#7a5c9a','#efe9f5']};\n  function fmt(m){return (m<600?'0':'')+Math.floor(m\/60)+':'+('0'+m%60).slice(-2);}\n  var B={}, BASE=[\n    ['mk',0,480,570,'\u5316\u599d','prep'],['gm',0,570,600,'\u904a\u6232','trad'],['tea',0,600,630,'\u659f\u8336','trad'],['cer',0,660,690,'\u8b49\u5a5a','key'],['lun',0,720,840,'\u5348\u5bb4','party'],\n    ['bm',1,510,600,'\u59ca\u59b9\u5316\u599d','prep'],['gp',2,540,600,'\u65b0\u90ce\u6e96\u5099','prep'],['out',1,720,780,'\u5916\u5f71','photo']];\n  BASE.forEach(function(d){var el=document.createElement('div');el.className='ha-blk';el.style.setProperty('--cc',CC[d[5]][0]);el.style.setProperty('--ct',CC[d[5]][1]);\n    el.innerHTML='<span>'+d[4]+'<\/span><em><\/em>';stage.insertBefore(el,$('ha-line'));B[d[0]]={el:el,lane:d[1],s:d[2],e:d[3]};});\n  function place(k){var b=B[k];b.el.style.left=(40+b.lane*120+4)+'px';b.el.style.width='112px';b.el.style.top=(y(b.s)+1)+'px';b.el.style.height=Math.max(14,(b.e-b.s)*PX-2)+'px';\n    b.el.querySelector('em').textContent=(b.e-b.s>=40)?fmt(b.s)+'\u2013'+fmt(b.e):'';}\n  function show(k,on){B[k].el.classList.toggle('hide',!on);}\n\n  var STEPS=[['Pick an example','\u5148\u63c0\u534a\u65e5\u6216\u5168\u65e5\u4f8b\u5b50'],['Rename a column','\u76f4\u884c\u540d\u7a31\u81ea\u5df1\u6539\uff0c\u4f8b\u5982\u651d\u5f71\u5e2b'],['Tap a spot, then an item','\u5148\u64b3\u7a7a\u4f4d\uff0c\u518d\u64b3\u74b0\u7bc0'],\n             ['Hold & drag to move','\u64b3\u5be6\u62d6\u52d5\uff0c\u53ef\u4ee5\u642c\u53bb\u53e6\u4e00\u884c'],['Pull the edge to resize','\u62c9\u5e95\u908a\u6539\u9577\u77ed'],['Copy \u00b7 Excel \u00b7 CSV \u00b7 WhatsApp','\u8907\u88fd\u3001\u532f\u51fa\u6216\u50b3\u9001']];\n  var dots=$('ha-dots');\n  STEPS.forEach(function(s,i){var b=document.createElement('button');b.type='button';b.setAttribute('aria-label','Step '+(i+1)+': '+s[0]);b.addEventListener('click',function(){start(i);});dots.appendChild(b);});\n  function caption(i){$('ha-n').textContent='0'+(i+1);$('ha-en').textContent=STEPS[i][0];$('ha-zh').textContent=STEPS[i][1];\n    [].forEach.call(dots.children,function(d,j){d.classList.toggle('on',j===i);});}\n\n  \/* state at the start of each step *\/\n  function reset(i){\n    stage.classList.add('no-tr');\n    BASE.forEach(function(d){var b=B[d[0]];b.lane=d[1];b.s=d[2];b.e=d[3];});\n    if(i>=4){B.out.lane=2;}\n    if(i>=5){B.out.e=810;}\n    for(var k in B){place(k);show(k,i>0);}\n    show('out',i>=3); B.out.el.classList.remove('lift');\n    $('ha-h1').textContent=i>=2?'\u651d\u5f71\u5e2b':'\u59ca\u59b9'; $('ha-h1').classList.remove('edit');\n    $('ha-line').classList.remove('on'); $('ha-exp').classList.toggle('on',i>=5); $('ha-toast').classList.remove('on');\n    $('ha-half').classList.remove('ghost'); $('ha-full').classList.add('ghost');\n    stage.offsetWidth; stage.classList.remove('no-tr');\n  }\n\n  var run=0, playing=false;\n  function wait(ms,id){return new Promise(function(ok,no){setTimeout(function(){id===run?ok():no('stop');},ms);});}\n  function go(x,yy,id,ms){F.classList.add('on');F.style.left=x+'px';F.style.top=yy+'px';return wait(ms||650,id);}\n  function tap(id){F.classList.remove('tap');F.offsetWidth;F.classList.add('tap');return wait(420,id);}\n  function press(el){el.classList.add('press');setTimeout(function(){el.classList.remove('press');},180);}\n  function mid(el){var r=el.getBoundingClientRect(),s=stage.getBoundingClientRect(),k=wrap.clientWidth\/400;return [(r.left-s.left+r.width\/2)\/k,(r.top-s.top+r.height\/2)\/k];}\n\n  var SCENES=[\n    async function(id){ \/* pick example *\/\n      await go(260,250,id,300); var p=mid($('ha-full')); await go(p[0],p[1],id);\n      await tap(id); press($('ha-full')); $('ha-full').classList.remove('ghost'); $('ha-half').classList.add('ghost'); await wait(350,id);\n      p=mid($('ha-half')); await go(p[0],p[1],id,500); await tap(id); press($('ha-half')); $('ha-half').classList.remove('ghost'); $('ha-full').classList.add('ghost');\n      var ks=['mk','bm','gp','gm','tea','cer','lun']; for(var i=0;i<ks.length;i++){show(ks[i],true);await wait(110,id);} await wait(900,id);},\n    async function(id){ \/* rename column *\/\n      var h=$('ha-h1'),p=mid(h); await go(p[0]-14,p[1]+4,id); await tap(id); h.classList.add('edit'); h.textContent=''; await wait(300,id);\n      var t='\u651d\u5f71\u5e2b'; for(var i=0;i<t.length;i++){h.textContent+=t[i];await wait(260,id);} await wait(500,id); h.classList.remove('edit'); await wait(900,id);},\n    async function(id){ \/* tap spot, then item *\/\n      await go(220,y(720)+2,id); await tap(id); var L=$('ha-line'); L.style.top=y(720)+'px'; L.classList.add('on'); await wait(500,id);\n      var p=mid($('ha-pal-out')); await go(p[0],p[1],id); await tap(id); press($('ha-pal-out'));\n      show('out',true); L.classList.remove('on'); await wait(1300,id);},\n    async function(id){ \/* hold & drag *\/\n      var b=B.out,p=mid(b.el); await go(p[0],p[1],id); F.classList.add('hold'); await wait(480,id); F.classList.remove('hold'); b.el.classList.add('lift');\n      F.classList.add('drag'); b.lane=2; place('out'); await go(p[0]+120,p[1],id,950); F.classList.remove('drag'); b.el.classList.remove('lift'); await wait(1000,id);},\n    async function(id){ \/* resize *\/\n      var b=B.out; await go(40+2*120+60,y(b.e)-3,id); F.classList.add('hold'); await wait(300,id); F.classList.remove('hold');\n      F.classList.add('drag'); b.e=810; place('out'); await go(40+2*120+60,y(810)-3,id,900); F.classList.remove('drag'); await wait(1000,id);},\n    async function(id){ \/* export *\/\n      $('ha-exp').classList.add('on'); await wait(300,id); var x=$('ha-xl'),p=mid(x); await go(p[0],p[1],id); await tap(id); press(x);\n      $('ha-toast').classList.add('on'); await wait(1400,id); $('ha-toast').classList.remove('on');\n      var w=$('ha-exp').lastElementChild; p=mid(w); await go(p[0],p[1],id,500); await tap(id); press(w); await wait(1100,id); F.classList.remove('on'); await wait(500,id);}\n  ];\n  async function loop(from,id){\n    var i=from;\n    try{ for(;;){ caption(i); reset(i); await wait(250,id); await SCENES[i](id); i=(i+1)%SCENES.length; } }catch(e){}\n  }\n  function start(i){run++;playing=true;loop(i||0,run);}\n  function stop(){run++;playing=false;}\n  var reduce=window.matchMedia&&window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  caption(0); reset(1); \/* show the populated board before it plays *\/\n  if(!reduce && window.IntersectionObserver){\n    new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting&&!playing)start(0);else if(!e.isIntersecting&&playing)stop();});},{threshold:.35}).observe(wrap);\n  } else if(!reduce){start(0);}\n\n  \/* video modal *\/\n  var modal=$('ht-modal'),vid=$('ht-video'); document.body.appendChild(modal);\n  $('ht-vid').addEventListener('click',function(){\n    var src=vid.querySelector('source'); if(!src.src){src.src=src.getAttribute('data-src');vid.load();}\n    modal.hidden=false; document.documentElement.classList.add('ht-lock'); try{vid.play();}catch(e){} });\n  function close(){modal.hidden=true;document.documentElement.classList.remove('ht-lock');try{vid.pause();}catch(e){}}\n  $('ht-x').addEventListener('click',close); modal.addEventListener('click',function(e){if(e.target===modal)close();});\n  document.addEventListener('keydown',function(e){if(e.key==='Escape'&&!modal.hidden)close();});\n})();\n\n(function(){\n  var modal=document.getElementById('tp-modal'); if(!modal) return;\n  document.body.appendChild(modal);\n  var cards=[].slice.call(document.querySelectorAll('.tp-card')), cur=-1, last=null;\n  var $=function(id){return document.getElementById(id);};\n  function open(i){\n    var c=cards[i]; if(!c) return; cur=i;\n    $('tp-m-num').textContent=c.querySelector('.tp-num').textContent;\n    $('tp-m-title').textContent=c.querySelector('b').textContent;\n    $('tp-m-zh').textContent=c.querySelector('.tp-zh').textContent;\n    $('tp-m-body').innerHTML=document.getElementById(c.dataset.tip).innerHTML;\n    $('tp-prev').disabled=i===0; $('tp-next').disabled=i===cards.length-1;\n    if(modal.hidden){modal.hidden=false;document.documentElement.classList.add('tp-lock');requestAnimationFrame(function(){modal.classList.add('show');});}\n    modal.querySelector('.tp-box').scrollTop=0; setTimeout(function(){$('tp-x').focus({preventScroll:true});},60);\n  }\n  function close(){\n    modal.classList.remove('show'); document.documentElement.classList.remove('tp-lock');\n    setTimeout(function(){modal.hidden=true;},250); if(last) last.focus({preventScroll:true});\n  }\n  cards.forEach(function(c,i){c.addEventListener('click',function(){last=c;open(i);});});\n  $('tp-x').addEventListener('click',close);\n  $('tp-prev').addEventListener('click',function(){open(cur-1);});\n  $('tp-next').addEventListener('click',function(){open(cur+1);});\n  modal.addEventListener('click',function(e){if(e.target===modal)close();});\n  document.addEventListener('keydown',function(e){\n    if(modal.hidden) return;\n    if(e.key==='Escape')close(); else if(e.key==='ArrowRight')open(cur+1); else if(e.key==='ArrowLeft')open(cur-1);\n  });\n})();\n\n<\/script>\n\n<script type=\"application\/ld+json\">\n{\n \"@context\": \"https:\/\/schema.org\",\n \"@graph\": [\n  {\n   \"@type\": \"Article\",\n   \"headline\": \"Planning Your Wedding Day Rundown \u2014 Hong Kong half-day and full-day templates\",\n   \"alternativeHeadline\": \"\u5a5a\u79ae\u6d41\u7a0b\u9ede\u6a23\u6392\uff1a\u534a\u65e5\u3001\u5168\u65e5\u3001\u6709\u5187\u5409\u6642\u90fd\u6709\u7bc4\u672c\",\n   \"inLanguage\": [\n    \"en\",\n    \"zh-HK\"\n   ],\n   \"datePublished\": \"2026-11-03\",\n   \"dateModified\": \"2026-11-03\",\n   \"mainEntityOfPage\": \"https:\/\/www.billyhung.com\/blog\/wedding-day-rundown-templates\/\",\n   \"author\": {\n    \"@type\": \"Person\",\n    \"name\": \"Billy Hung\",\n    \"jobTitle\": \"Wedding Photographer, Founder of Billy ONAIR Photography\",\n    \"url\": \"https:\/\/www.billyhung.com\/blog\/personnel\/billy-hung\/\"\n   },\n   \"publisher\": {\n    \"@type\": \"Organization\",\n    \"name\": \"Billy ONAIR Photography\",\n    \"url\": \"https:\/\/www.billyhung.com\/blog\/\",\n    \"logo\": \"https:\/\/www.billyhung.com\/blog\/wp-content\/uploads\/logo2021-3.png\"\n   }\n  },\n  {\n   \"@type\": \"HowTo\",\n   \"name\": \"Half-day Hong Kong wedding rundown (ceremony 11:30, both families in the same hotel)\",\n   \"inLanguage\": \"en\",\n   \"step\": [\n    {\n     \"@type\": \"HowToStep\",\n     \"position\": 1,\n     \"name\": \"05:30\u201308:00 Bride hair & make-up\",\n     \"text\": \"Bride hair & make-up \u2014 Bride & couple (\u65b0\u5a18\u5316\u599d\u53ca\u9aee\u578b\uff0c\u65b0\u5a18\u30fb\u65b0\u4eba)\"\n    },\n    {\n     \"@type\": \"HowToStep\",\n     \"position\": 2,\n     \"name\": \"06:30\u201308:00 Bridesmaid make-up \u00d73\",\n     \"text\": \"Bridesmaid make-up \u2014 Bridesmaids (\u59ca\u59b9\u5316\u599d \u00d73\uff0c\u59ca\u59b9)\"\n    },\n    {\n     \"@type\": \"HowToStep\",\n     \"position\": 3,\n     \"name\": \"08:00\u201309:00 Bride & bridesmaids photos\",\n     \"text\": \"Bride & bridesmaids photos \u2014 Bride & couple (\u5f71\u65b0\u5a18\u53ca\u59ca\u59b9\uff0c\u65b0\u5a18\u30fb\u65b0\u4eba)\"\n    },\n    {\n     \"@type\": \"HowToStep\",\n     \"position\": 4,\n     \"name\": \"08:00\u201309:00 Groom & groomsmen get ready\",\n     \"text\": \"Groom & groomsmen get ready \u2014 Groom & groomsmen (\u65b0\u90ce\u53ca\u5144\u5f1f\u6e96\u5099\uff0c\u65b0\u90ce\u30fb\u5144\u5f1f)\"\n    },\n    {\n     \"@type\": \"HowToStep\",\n     \"position\": 5,\n     \"name\": \"09:00\u201309:30 Door games\",\n     \"text\": \"Door games \u2014 Bride & couple (\u63a5\u65b0\u5a18\u30fb\u73a9\u904a\u6232\uff0c\u65b0\u5a18\u30fb\u65b0\u4eba)\"\n    },\n    {\n     \"@type\": \"HowToStep\",\n     \"position\": 6,\n     \"name\": \"09:30\u201310:00 Tea ceremony \u00b7 bride\u2019s family\",\n     \"text\": \"Tea ceremony \u00b7 bride\u2019s family \u2014 Bride & couple (\u659f\u5973\u5bb6\u8336\uff0c\u65b0\u5a18\u30fb\u65b0\u4eba)\"\n    },\n    {\n     \"@type\": \"HowToStep\",\n     \"position\": 7,\n     \"name\": \"10:00\u201310:15 Leave & arrive (same hotel)\",\n     \"text\": \"Leave & arrive (same hotel) \u2014 Bride & couple (\u51fa\u9580\u30fb\u5165\u9580\uff08\u540c\u4e00\u9152\u5e97\uff09\uff0c\u65b0\u5a18\u30fb\u65b0\u4eba)\"\n    },\n    {\n     \"@type\": \"HowToStep\",\n     \"position\": 8,\n     \"name\": \"10:15\u201310:45 Groom\u2019s tea ceremony & family photos\",\n     \"text\": \"Groom\u2019s tea ceremony & family photos \u2014 Bride & couple (\u659f\u7537\u5bb6\u8336\u30fb\u5bb6\u4eba\u5408\u7167\uff0c\u65b0\u5a18\u30fb\u65b0\u4eba)\"\n    },\n    {\n     \"@type\": \"HowToStep\",\n     \"position\": 9,\n     \"name\": \"10:45\u201311:30 Change into the gown\",\n     \"text\": \"Change into the gown \u2014 Bride & couple (\u63db\u5a5a\u7d17\uff0c\u65b0\u5a18\u30fb\u65b0\u4eba)\"\n    },\n    {\n     \"@type\": \"HowToStep\",\n     \"position\": 10,\n     \"name\": \"10:45\u201311:15 Groom & groomsmen photos (catch-up)\",\n     \"text\": \"Groom & groomsmen photos (catch-up) \u2014 Groom & groomsmen (\u88dc\u5f71\u65b0\u90ce\u53ca\u5144\u5f1f\uff0c\u65b0\u90ce\u30fb\u5144\u5f1f)\"\n    },\n    {\n     \"@type\": \"HowToStep\",\n     \"position\": 11,\n     \"name\": \"11:30\u201312:00 Wedding ceremony\",\n     \"text\": \"Wedding ceremony \u2014 Bride & couple (\u8b49\u5a5a\uff0c\u65b0\u5a18\u30fb\u65b0\u4eba)\"\n    },\n    {\n     \"@type\": \"HowToStep\",\n     \"position\": 12,\n     \"name\": \"12:00\u201312:30 Cocktails & group photos\",\n     \"text\": \"Cocktails & group photos \u2014 Bride & couple (\u9152\u6703\u30fb\u5927\u5408\u7167\uff0c\u65b0\u5a18\u30fb\u65b0\u4eba)\"\n    },\n    {\n     \"@type\": \"HowToStep\",\n     \"position\": 13,\n     \"name\": \"12:30\u201315:30 Wedding lunch\",\n     \"text\": \"Wedding lunch \u2014 Bride & couple (\u5348\u5bb4\uff0c\u65b0\u5a18\u30fb\u65b0\u4eba)\"\n    }\n   ]\n  },\n  {\n   \"@type\": \"VideoObject\",\n   \"name\": \"How to use the Wedding Rundown Creator\",\n   \"description\": \"A 35-second guide to Billy ONAIR Photography's wedding rundown builder: start from an example, name your columns, add and drag items, type exact times, and export to Excel, CSV or WhatsApp.\",\n   \"thumbnailUrl\": \"https:\/\/www.billyhung.com\/blog\/wp-content\/uploads\/boa-rundown-builder-howto-poster.jpg\",\n   \"contentUrl\": \"https:\/\/www.billyhung.com\/blog\/wp-content\/uploads\/boa-rundown-builder-howto-web.mp4\",\n   \"uploadDate\": \"2026-11-03\",\n   \"duration\": \"PT35S\",\n   \"inLanguage\": \"en\",\n   \"publisher\": {\n    \"@type\": \"Organization\",\n    \"name\": \"Billy ONAIR Photography\",\n    \"logo\": {\n     \"@type\": \"ImageObject\",\n     \"url\": \"https:\/\/www.billyhung.com\/blog\/wp-content\/uploads\/logo2021-3.png\"\n    }\n   }\n  },\n  {\n   \"@type\": \"WebApplication\",\n   \"name\": \"Wedding Rundown Builder \u5a5a\u79ae\u6d41\u7a0b\u780c\u5716\",\n   \"applicationCategory\": \"LifestyleApplication\",\n   \"operatingSystem\": \"Any (web browser)\",\n   \"offers\": {\n    \"@type\": \"Offer\",\n    \"price\": \"0\",\n    \"priceCurrency\": \"HKD\"\n   },\n   \"url\": \"https:\/\/www.billyhung.com\/blog\/wedding-day-rundown-templates\/#planner\",\n   \"creator\": {\n    \"@type\": \"Organization\",\n    \"name\": \"Billy ONAIR Photography\"\n   }\n  },\n  {\n   \"@type\": \"FAQPage\",\n   \"mainEntity\": [\n    {\n     \"@type\": \"Question\",\n     \"name\": \"How long does bridal make-up take on the wedding morning?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Most make-up artists need about two and a half hours. Unlike a pre-wedding shoot, the bride is busy on the morning and often can't sit still, so allow extra time.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"What counts as the auspicious time (\u5409\u6642) for a Hong Kong wedding?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Some families count it as the time the bride leaves home (\u51fa\u9580), others as arriving at the groom's (\u5165\u9580). Every village has its own custom; what matters is that both families agree.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"What if we don't have an auspicious time?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Work backwards from the ceremony or lunch. For a half-day wedding with an 11:30\u201312:00 ceremony, photos usually start at 8:00 and make-up at 5:30.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"How much travel time should we allow between the two families?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"For a half-day wedding, avoid long drives; having both families in the same hotel is ideal. Otherwise allow the drive plus a buffer for lifts and parking.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"What can we do if the wedding morning is too tight?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Move the groom and groomsmen photos to after the groom's tea ceremony, while the bride changes, and shorten the door games. Games, tea and photos are flexible; make-up and the gown change are hard to rush.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"What is a standard Hong Kong evening wedding banquet rundown?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Guests are seated, the couple change for the table toasts, toast each table, show the same-day edit, take photos with guests and see everyone off. A first dance or games can be added in between.\"\n     }\n    }\n   ]\n  }\n ]\n}\n<\/script>\t\t\t\t<\/div>\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>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Guide &amp; Tips \u00b7 Wedding Rundown Planning Your Wedding Day Rundown \u5a5a\u79ae\u6d41\u7a0b\u9ede\u6a23\u6392\uff1a\u534a\u65e5\u3001\u5168\u65e5\u3001\u6709\u5187\u5409\u6642\u90fd\u6709\u7bc4\u672c By Billy Hung, wedding photographer since 2009 \u00b7 Updated 3 November 2026 How to use \u00b7 \u4f7f\u7528\u6559\u5b78 Wedding Rundown Creator \u5a5a\u79ae\u6d41\u7a0b\u780c\u5716 \u534a\u65e5 Half-day\u5168\u65e5 Full-day \u5316\u599d\u5f71\u76f8\u5916\u5f71\u659f\u8336\u665a\u5bb4 \u65b0\u5a18\u59ca\u59b9\u65b0\u90ce + 12:00 CopyExcel \u2193CSV \u2193WhatsApp \u2713 wedding-rundown.xlsx 01 Pick an example\u5148\u63c0\u534a\u65e5\u6216\u5168\u65e5\u4f8b\u5b50 Start planning \u2193 \u958b\u59cb\u780c\u6d41\u7a0b \u25b6 Video [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":11926,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-page-builder-no-header-footer.php","meta":{"footnotes":""},"class_list":["post-11916","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/www.billyhung.com\/blog\/wp-json\/wp\/v2\/pages\/11916","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.billyhung.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.billyhung.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.billyhung.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.billyhung.com\/blog\/wp-json\/wp\/v2\/comments?post=11916"}],"version-history":[{"count":5,"href":"https:\/\/www.billyhung.com\/blog\/wp-json\/wp\/v2\/pages\/11916\/revisions"}],"predecessor-version":[{"id":13495,"href":"https:\/\/www.billyhung.com\/blog\/wp-json\/wp\/v2\/pages\/11916\/revisions\/13495"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.billyhung.com\/blog\/wp-json\/wp\/v2\/media\/11926"}],"wp:attachment":[{"href":"https:\/\/www.billyhung.com\/blog\/wp-json\/wp\/v2\/media?parent=11916"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}