อินเทอร์แอกทีฟและอุปกรณ์ประจำหน้า
เดโม canvas ที่รันอยู่จริงพร้อมสัญญาเบื้องหลังของมัน ตามด้วยคอมโพเนนต์เงียบ ๆ ที่ล้อมกรอบทุกบันทึกอยู่ — พวกที่คุณเห็นมาตลอดตั้งแต่หน้าแรกนั่นแหละ
§3.1DemoMount — ของจริง
การแบ่งงานเป็นแบบเดียวกับที่แพ็กเกจทำเสมอ: มาร์กอัปจุดยึด (เวที ช่องปุ่มควบคุม ช่องคำบรรยาย) มากับแพ็กเกจ ส่วนโมดูลเดโมกับตัวโหลดของมันเป็นของไซต์ ไซต์นี้เก็บตัวโหลดไว้ที่ src/lib/demo-loader.ts และเรียก mountAllDemos() หนึ่งครั้งจากเลย์เอาต์ การเรียกนี้รันทุกหน้า แต่ chunk ของโมดูลเดโมจะถูกดึงมาเฉพาะหน้าที่มีจุดยึด [data-demo] เท่านั้น
เดโมที่รับอินพุตจากพอยน์เตอร์บน canvas ของมันต้องส่ง interactive — เวทีจะยึดท่าทางสัมผัสไว้และแสดงกากบาทเล็ง ตัวนี้เป็นแบบเฉย ๆ (เรนเดอร์อย่างเดียว) จึงไม่เปิดแฟล็ก และการปัดนิ้วผ่าน canvas ยังเลื่อนหน้าได้ตามปกติ มันวาดการแทรกสอดของคลื่นจากสองแหล่งกำเนิดด้วยโทเคนหมึกของหน้าเอง จึงเปลี่ยนตามธีมด้วย:
แหล่งกำเนิดจุดสองแห่งปล่อยคลื่นวงกลม ตรงที่สันคลื่นเจอสันคลื่น หมึกกองรวมกัน ตรงที่สันคลื่นเจอท้องคลื่น กระดาษโผล่ให้เห็น ลองสลับธีมดู — เดโมจะจุ่มหมึกใหม่จากโทเคนที่กำลังใช้อยู่จริง
สัญญาของโมดูลคือ default export หนึ่งตัว mount(ctx) ซึ่งคืนฟังก์ชันเก็บกวาด ส่วนตัวโหลดจะแก้ id โมดูลอย่าง waves/interference ด้วยวิธีไหนก็ได้ตามใจไซต์ (ที่นี่ใช้ import.meta.glob)
§3.2อุปกรณ์ประจำหน้า
คอมโพเนนต์ที่เหลือทำหน้าที่ล้อมกรอบบันทึก ไม่ใช่เติมเนื้อใน:
Heroเปิดบันทึก: kicker ชื่อเรื่องแบบ display บทเกริ่นที่วิ่งผ่านไปป์ไลน์ Markdown เต็มเส้น บรรทัดเมตา และtocLabelเสริมที่เพิ่มแถว "เกริ่น" แบบไม่มีเลขให้แถบข้างtitleใน frontmatter ของบันทึกยังคงเป็นชื่อสั้นตามบัญญัติสำหรับ<title>และการ์ด ส่วนชื่อบน hero จะยาวก็ได้PartHeroเปิดบทของฮับ — หัวของหน้านี้เองก็คือมัน kicker ของมันไม่มีใครพิมพ์เอง: เส้นทางส่งป้าย "ภาค III · …" ของบทเข้ามาเป็นprops.partLabelPartหั่นบันทึกหน้าเดียวยาว ๆ ออกเป็นภาค พรีเซ็ตกำหนดเลขเปลี่ยนมันเป็นแถวกลุ่ม "ภาค II · …" ในแถบข้าง หน้ารวมทุกองค์ประกอบถูกหั่นแบบนั้นHubCardกับ.hub-gridคือการ์ดหน้าแรกของฮับ ส่วน.pathคือกล่องเส้นทางการอ่านของมัน — ทั้งคู่อยู่บนหน้าภาพรวมของแกลเลอรีนี้LocalTocเรนเดอร์รายการกระโดดในหน้า รับ ToC ได้ทั้งสองทรงที่พรีเซ็ตกำหนดเลขสองแบบผลิต และซ่อนตัวเองเมื่อรายการน้อยกว่าเกณฑ์ที่ตั้งได้ ดูของจริงข้างล่าง บน ToC ของบทนี้เองSidebarMemoryจำตำแหน่งเลื่อนของแถบข้างไว้ให้ข้ามการโหลดหน้า และจัดรายการปัจจุบัน ([aria-current="page"]โดยปริยาย) ให้อยู่กลางจอเมื่อใดที่มันจะหลุดสายตา วางไว้ในกล่องเลื่อนของแถบข้าง หลังมาร์กอัปนำทาง มันรันก่อนการวาดหน้าจอครั้งแรก แถบข้างจึงไม่มีวันกะพริบขึ้นไปอยู่บนสุด แถบข้างของเดโมนี้ก็ติดตั้งไว้LineageSvgใส่กรอบการ์ดให้ SVG วาดมือ (สายตระกูลของวิธีการ ต้นไม้หมวดหมู่) — มีตัวอย่างข้างล่างPageFooterคือตัวพิมพ์เล็กท้ายบันทึก — บรรทัดใต้ทุกบันทึกที่นี่- ชิ้นส่วนฝั่งเลือกดูอยู่ในบทวิกิ ส่วนฝั่ง Markdown ของแกลเลอรีคือรวมทุกองค์ประกอบ
§3.3LocalToc กับ LineageSvg ของจริง
LocalToc ป้อนด้วย ToC ของหน้านี้เองที่สร้างตอนบิลด์ — ข้อมูลชุดเดียวกับที่แถบข้างใช้ ส่งให้บันทึกในชื่อ props.toc:
และ LineageSvg ครอบไดอะแกรมที่วาดเอง ลงหมึกด้วยโทเคนเชิงความหมายล้วน ๆ มันจึงนั่งได้บนทั้งสองธีม:
§3.4อุปกรณ์ที่ไม่มีคอมโพเนนต์
บางชิ้นเป็นคลาสธรรมดาใน base.css สำหรับไซต์ที่เรนเดอร์จากเลย์เอาต์ของตัวเอง หรือเขียนเป็น HTML ในเนื้อความ:
| คลาส | คืออะไร |
|---|---|
.page-head + .kicker, .page-desc, .page-date | หัวหน้าที่ขับเคลื่อนด้วย frontmatter (kicker, h1, คำอธิบาย, วันที่) เรนเดอร์โดยเลย์เอาต์แทน <Hero> |
.banner, .banner-fallback | ประกาศบรรทัดเดียวใต้หัว รูปแบบ fallback คือแบบเสียงเบา |
.page-foot | ส่วนท้ายตัวพิมพ์เล็กสองคอลัมน์ (ช่องซ้าย ช่องขวา) |
.speak | บรรทัดอธิบายภาษาชาวบ้านใต้หัวข้อเชิงลึก ป้ายของมันคือ --speak-label |
.path + .title, .route, .arrow | กล่องเส้นทางการอ่านบนฮับ |
.ref-tag | แท็ก monospace เล็ก ๆ ในรายการอ้างอิง (งานประชุม ปี) |
.tag, .tag.teal / .mustard / .violet | ตราของการ์ดงานวิจัย ใช้ที่ไหนก็ได้ |
.measured + .measured-head, .measured-body, .measured-pane (.doc), .measured-tag | การ์ดเทียบ "ตามเอกสาร-ตามการวัด": แถบชื่อสีเขียวหัวเป็ดทึบเหนือสองบาน บาน .doc ถือคำอ้าง อีกบานถือผลวัด — เงารูปทรงที่ไม่ซ้ำกับ callout ใด ๆ |
.paper .idea-label | ป้ายแนวคิดหลักตัวพิมพ์ใหญ่เล็ก ๆ ในเนื้อของ PaperCard เช่น <span class="idea-label">Key idea</span> |