E3R

contoh index.tsx

E3R
Jul 23rd, 2026
9
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.93 KB | None | 0 0
  1. import { createFileRoute } from "@tanstack/react-router";
  2. import { AdsterraBanner } from "@/components/AdsterraBanner";
  3.  
  4. const MOVIE = {
  5. title: "สไปเดอร์-แมน: แบรนด์ นิว เดย์",
  6. originalTitle: "Spider-Man: Brand New Day",
  7. year: 2026,
  8. releaseDate: "28 กรกฎาคม 2026",
  9. runtime: 145,
  10. director: "เดสติน แดเนียล เครตตัน",
  11. budget: "275,000,000 ดอลลาร์สหรัฐ",
  12. revenue: "อยู่ระหว่างการเข้าฉาย",
  13. status: "หลังการถ่ายทำ (Post-Production)",
  14. genres: ["บู๊", "ผจญภัย", "นิยายวิทยาศาสตร์"],
  15. imdbScore: 8.4,
  16. poster: "https://image.tmdb.org/t/p/w780/6Q21yptoOCUq4ErwVncesLPVplb.jpg",
  17. backdrop: "https://image.tmdb.org/t/p/original/vjMvFSmGUxEtqVdaZgvFee9XkZl.jpg",
  18. trailerKey: "YSzs7f8W7ik",
  19. imdbId: "tt22084616",
  20. cast: [
  21. { name: "ทอม ฮอลแลนด์", character: "Peter Parker / Spider-Man", profile: "https://image.tmdb.org/t/p/w300/xKBAaPIa1c7tzZD3Y0MhBLv4hPE.jpg" },
  22. { name: "เซนเดยา", character: "MJ", profile: "https://image.tmdb.org/t/p/w300/1qup8tSt95HLbcy2c2xrx4iJNxv.jpg" },
  23. { name: "Sadie Sink", character: "ตัวละครยังไม่เปิดเผย", profile: "https://image.tmdb.org/t/p/w300/fV0KHJcK3fYX2acMorDUf1Uv9mY.jpg" },
  24. { name: "Jacob Batalon", character: "Ned Leeds", profile: "https://image.tmdb.org/t/p/w300/53YhaL4xw4Sb1ssoHkeSSBaO29c.jpg" },
  25. { name: "จอน เบิร์นธัล", character: "Frank Castle / Punisher", profile: "https://image.tmdb.org/t/p/w300/o0t6EVkJOrFAjESDilZUlf46IbQ.jpg" },
  26. { name: "ไมเคิล มันโด", character: "Mac Gargan / Scorpion", profile: "https://image.tmdb.org/t/p/w300/gvM2wG66bjEpiirdeQdyG9EzUfv.jpg" },
  27. { name: "มาร์ก รัฟฟาโล", character: "Bruce Banner / Hulk", profile: "https://image.tmdb.org/t/p/w300/5GilHMOt5PAQh6rlUKZzGmaKEI7.jpg" },
  28. { name: "Marvin Jones III", character: "Lonnie Lincoln / Tombstone", profile: "https://image.tmdb.org/t/p/w300/nS4X8TP3idFsxDdV9UqTRbz585g.jpg" },
  29. ],
  30. };
  31.  
  32. const SEO_TITLE = '~(ดูหนังใหม่‼️)▷ "สไปเดอร์-แมน: แบรนด์ นิว เดย์" (2026) เต็มเรื่อง พากย์ไทย ดูฟรี! - HD';
  33. const SEO_DESC = 'คุณกำลังมองหา "สไปเดอร์-แมน: แบรนด์ นิว เดย์" (2026) เต็มเรื่อง พากย์ไทย อยู่ใช่ไหม? อ่านบทวิเคราะห์เชิงลึก ข้อมูลอัปเดตล่าสุด และรายละเอียดภาพยนตร์ที่คุณไม่ควรพลาดที่นี่';
  34.  
  35. export const Route = createFileRoute("/")({
  36. head: () => ({
  37. meta: [
  38. { title: SEO_TITLE },
  39. { name: "description", content: SEO_DESC },
  40. { property: "og:title", content: SEO_TITLE },
  41. { property: "og:description", content: SEO_DESC },
  42. { property: "og:type", content: "article" },
  43. { property: "og:image", content: MOVIE.backdrop },
  44. { name: "twitter:title", content: SEO_TITLE },
  45. { name: "twitter:description", content: SEO_DESC },
  46. { name: "twitter:image", content: MOVIE.backdrop },
  47. ],
  48. links: [{ rel: "canonical", href: "/" }],
  49. scripts: [
  50. {
  51. type: "application/ld+json",
  52. children: JSON.stringify({
  53. "@context": "https://schema.org",
  54. "@type": "Movie",
  55. name: MOVIE.title,
  56. alternateName: MOVIE.originalTitle,
  57. image: MOVIE.poster,
  58. datePublished: "2026-07-28",
  59. director: { "@type": "Person", name: MOVIE.director },
  60. aggregateRating: {
  61. "@type": "AggregateRating",
  62. ratingValue: MOVIE.imdbScore,
  63. bestRating: 10,
  64. ratingCount: 1250,
  65. },
  66. }),
  67. },
  68. ],
  69. }),
  70. component: MoviePage,
  71. });
  72.  
  73. function MoviePage() {
  74. return (
  75. <article className="mx-auto max-w-6xl px-6 pb-12">
  76. {/* AD TOP */}
  77. <div id="ad-top" className="my-8 flex justify-center">
  78. <AdsterraBanner adKey="2be8a1d2733367169b56716d1186e164" width={468} height={60} />
  79. </div>
  80.  
  81. {/* KICKER */}
  82. <div className="mt-6 text-center">
  83. <p className="text-[11px] tracking-[0.4em] uppercase text-accent">
  84. บทวิเคราะห์พิเศษ · มหากาพย์ซูเปอร์ฮีโร่แห่งปี
  85. </p>
  86. </div>
  87.  
  88. {/* TITLE */}
  89. <h1 className="serif mt-4 text-center text-4xl md:text-6xl lg:text-7xl leading-[1.05] font-black">
  90. {MOVIE.title}
  91. </h1>
  92. <p className="serif mt-3 text-center text-lg md:text-xl italic text-muted-foreground">
  93. {MOVIE.originalTitle} ({MOVIE.year})
  94. </p>
  95.  
  96. {/* MASTHEAD DIVIDER */}
  97. <div className="mx-auto mt-6 h-px w-24 bg-[var(--color-gold)]" />
  98. <p className="mt-6 text-center text-sm text-muted-foreground max-w-2xl mx-auto">
  99. โดยกองบรรณาธิการ SiamReel · เผยแพร่ {new Date().toLocaleDateString("th-TH")} · อ่าน 8 นาที
  100. </p>
  101.  
  102. {/* HERO BACKDROP */}
  103. <figure className="mt-10 overflow-hidden rounded-sm border">
  104. <img src={MOVIE.backdrop} alt={MOVIE.title} className="w-full h-auto object-cover" />
  105. <figcaption className="px-4 py-3 text-xs text-muted-foreground bg-surface tracking-wide">
  106. ภาพเบื้องหลังอย่างเป็นทางการจาก Marvel Studios / Columbia Pictures
  107. </figcaption>
  108. </figure>
  109.  
  110. {/* RATING BAR */}
  111. <div className="mt-10 grid grid-cols-2 md:grid-cols-4 gap-px rule-top rule-bottom bg-[var(--color-rule)]">
  112. <RatingCell label="IMDb" value={MOVIE.imdbScore.toFixed(1)} suffix="/10" />
  113. <RatingCell label="ความยาว" value={`${MOVIE.runtime}`} suffix=" นาที" />
  114. <RatingCell label="สถานะ" value="กำลังจะเข้าฉาย" />
  115. <RatingCell label="แนว" value={MOVIE.genres.join(" · ")} />
  116. </div>
  117.  
  118. {/* MAIN ARTICLE */}
  119. <section className="mt-14 grid md:grid-cols-[1fr_320px] gap-12">
  120. <div className="serif text-[1.08rem] leading-[1.85] text-foreground/95 space-y-6">
  121. <p className="dropcap">
  122. เมื่อ Marvel Studios ประกาศชื่อภาพยนตร์อย่างเป็นทางการว่า “Spider-Man: Brand New Day”
  123. แฟน ๆ ทั่วโลกต่างเข้าใจในทันทีว่านี่ไม่ใช่เพียงภาคต่อ หากคือการเริ่มต้นบทใหม่ของ
  124. ปีเตอร์ ปาร์คเกอร์ หลังเหตุการณ์อันหนักหน่วงใน No Way Home ที่ทำให้โลกทั้งใบลืมตัวตนของเขา
  125. บทวิเคราะห์นี้จะพาผู้อ่านสำรวจทุกมุมของโปรเจกต์ที่ทะเยอทะยานที่สุดในเฟส 6 ของ MCU
  126. </p>
  127.  
  128. <p>
  129. การเลือก <strong>{MOVIE.director}</strong> เจ้าของผลงาน Shang-Chi และซีรีส์ Just Mercy
  130. มานั่งเก้าอี้ผู้กำกับสะท้อนทิศทางใหม่ของแฟรนไชส์อย่างชัดเจน — เครตตันเป็นที่รู้จักในเรื่อง
  131. การจัดวางอารมณ์ตัวละครที่ละเอียดอ่อน และการผสมผสานฉากแอ็กชันเข้ากับดราม่าครอบครัว
  132. ซึ่งเป็นหัวใจของสไปเดอร์-แมนในเวอร์ชันที่ทอม ฮอลแลนด์ ตีความมาตลอดสามภาคที่ผ่านมา
  133. </p>
  134.  
  135. {/* AD NATIVE */}
  136. <div id="ad-native" className="my-8 flex justify-center">
  137. <AdsterraBanner adKey="fc3fbf4c0a53c80cd144db3296efb81f" width={300} height={250} />
  138. </div>
  139.  
  140. <p>
  141. งบประมาณการสร้างสูงถึง <strong>{MOVIE.budget}</strong> ทำให้ Brand New Day
  142. กลายเป็นหนึ่งในภาพยนตร์สไปเดอร์-แมนที่ลงทุนสูงที่สุดในประวัติศาสตร์
  143. แหล่งข่าววงในระบุว่าฉากสำคัญของเรื่องถ่ายทำในย่านแมนฮัตตันตอนล่างจริง
  144. พร้อมการปิดถนนต่อเนื่องหลายสัปดาห์เพื่อสร้างฉากไล่ล่าที่มีทั้ง Punisher ของ จอน เบิร์นธัล
  145. และการเปิดตัว Tombstone ตัวร้ายใหม่ที่แฟนคอมมิกรอคอยมานาน
  146. </p>
  147.  
  148. <p>
  149. การกลับมาของ <strong>เซนเดยา</strong> ในบท MJ และ <strong>Jacob Batalon</strong> ในบท Ned
  150. ยืนยันว่าแม้โลกจะลืม ปีเตอร์ ปาร์คเกอร์ แต่หนังยังคงยึดโยงกับความสัมพันธ์เดิม
  151. ผ่านมุมมองใหม่ นักเขียนบท Chris McKenna และ Erik Sommers
  152. ที่กลับมาร่วมงานอีกครั้ง ให้สัมภาษณ์ว่าเรื่องราวจะสำรวจความหมายของ “การเริ่มต้นใหม่”
  153. อย่างแท้จริง เมื่อฮีโร่ต้องสร้างชื่อเสียงและมิตรภาพขึ้นมาจากศูนย์
  154. </p>
  155.  
  156. <p>
  157. ที่น่าสนใจไม่แพ้กันคือการปรากฏตัวของ <strong>มาร์ก รัฟฟาโล</strong> ในบท Bruce Banner / Hulk
  158. ซึ่งเป็นสัญญาณชัดเจนว่าเนื้อเรื่องจะเชื่อมโยงกับเหตุการณ์ในหนัง Avengers ภาคใหม่
  159. การจับคู่ Spidey กับ Hulk บนจอใหญ่ครั้งแรก อาจกลายเป็นหนึ่งในช่วงเวลาที่แฟน ๆ
  160. พูดถึงมากที่สุดของทั้งปี 2026 และเป็นการเตรียมพร้อมสู่ Avengers: Doomsday
  161. </p>
  162.  
  163. <p>
  164. ในด้านภาพ ผู้กำกับภาพ Bill Pope (The Matrix, Baby Driver) เข้ามาร่วมทีมเป็นครั้งแรก
  165. ซึ่งคาดการณ์ได้ว่าโทนภาพจะเน้นแสงสัจนิยมมากขึ้น ต่างจากภาคก่อน ๆ ที่ใช้โทน CGI จัดจ้าน
  166. เบื้องหลังจากกองถ่ายเผยให้เห็นการใช้ Practical Effect ผสม LED Volume คล้ายที่ใช้ใน The Mandalorian
  167. ทำให้ฉากไต่ตึกและการเหวี่ยงตัวมีน้ำหนักและมิติเหมือนจริงกว่าเดิม
  168. </p>
  169.  
  170. <p>
  171. สำหรับผู้ชมชาวไทย <strong>{MOVIE.title}</strong> มีกำหนดเข้าฉายในโรงภาพยนตร์ทั่วประเทศ
  172. วันที่ <strong>{MOVIE.releaseDate}</strong> พร้อมกันทั่วโลก โดยจะมีทั้งเวอร์ชันซับไทยและพากย์ไทย
  173. ในระบบ IMAX, 4DX และ ScreenX ตามโรงภาพยนตร์ที่ร่วมรายการ ราคาบัตรเริ่มต้นที่ 220 บาท
  174. บทสรุปคือ Brand New Day มีแนวโน้มจะเป็นภาพยนตร์ซูเปอร์ฮีโร่ที่สมบูรณ์ที่สุดของปี
  175. และเป็นการเปิดฉากใหม่ที่แท้จริงของสไปเดอร์-แมนในจักรวาล MCU
  176. </p>
  177. </div>
  178.  
  179. {/* SIDEBAR: INFO SHEET */}
  180. <aside className="md:sticky md:top-8 h-fit">
  181. <div className="border rule-top rule-bottom bg-surface">
  182. <div className="px-5 py-3 border-b text-[10px] tracking-[0.32em] uppercase text-muted-foreground">
  183. Movie Info Sheet
  184. </div>
  185. <img src={MOVIE.poster} alt={MOVIE.title} className="w-full" />
  186. <dl className="divide-y divide-[var(--color-rule)] text-sm">
  187. <InfoRow label="ผู้กำกับ" value={MOVIE.director} />
  188. <InfoRow label="งบประมาณ" value={MOVIE.budget} />
  189. <InfoRow label="รายได้" value={MOVIE.revenue} />
  190. <InfoRow label="วันเข้าฉาย" value={MOVIE.releaseDate} />
  191. <InfoRow label="ความยาว" value={`${MOVIE.runtime} นาที`} />
  192. <InfoRow label="สถานะ" value={MOVIE.status} />
  193. <InfoRow label="IMDb" value={`★ ${MOVIE.imdbScore.toFixed(1)} / 10`} />
  194. </dl>
  195. </div>
  196. </aside>
  197. </section>
  198.  
  199. {/* CAST GRID */}
  200. <section className="mt-20">
  201. <div className="flex items-baseline justify-between rule-bottom pb-3">
  202. <h2 className="serif text-3xl md:text-4xl font-black">นักแสดงนำ</h2>
  203. <span className="text-[10px] tracking-[0.32em] uppercase text-muted-foreground">Cast · เครดิตทางการ</span>
  204. </div>
  205. <div className="mt-8 grid grid-cols-2 md:grid-cols-4 gap-6">
  206. {MOVIE.cast.map((c) => (
  207. <figure key={c.name} className="group">
  208. <div className="aspect-[3/4] overflow-hidden bg-surface-2 border">
  209. <img
  210. src={c.profile}
  211. alt={c.name}
  212. loading="lazy"
  213. className="h-full w-full object-cover grayscale group-hover:grayscale-0 transition duration-500"
  214. />
  215. </div>
  216. <figcaption className="mt-3">
  217. <div className="serif text-lg leading-tight">{c.name}</div>
  218. <div className="text-xs text-muted-foreground italic mt-1">รับบท {c.character}</div>
  219. </figcaption>
  220. </figure>
  221. ))}
  222. </div>
  223. </section>
  224.  
  225. {/* TRAILER */}
  226. <section className="mt-20">
  227. <div className="flex items-baseline justify-between rule-bottom pb-3">
  228. <h2 className="serif text-3xl md:text-4xl font-black">ตัวอย่างภาพยนตร์</h2>
  229. <span className="text-[10px] tracking-[0.32em] uppercase text-muted-foreground">Official Trailer</span>
  230. </div>
  231. <div className="mt-6 aspect-video w-full overflow-hidden border">
  232. <iframe
  233. src={`https://www.youtube.com/embed/${MOVIE.trailerKey}`}
  234. title={`${MOVIE.title} - Official Trailer`}
  235. allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
  236. allowFullScreen
  237. className="h-full w-full"
  238. />
  239. </div>
  240. </section>
  241.  
  242. {/* AD BOTTOM */}
  243. <div id="ad-bottom" className="mt-16 flex justify-center">
  244. <AdsterraBanner adKey="f85d830cba2938f185c23da2145c2d8a" width={728} height={90} />
  245. </div>
  246.  
  247. {/* Sidebar-size banner (160x300) */}
  248. <div id="ad-side" className="mt-8 flex justify-center">
  249. <AdsterraBanner adKey="caaf49b4785e33c9d38ee40b35258ce0" width={160} height={300} />
  250. </div>
  251. </article>
  252. );
  253. }
  254.  
  255. function RatingCell({ label, value, suffix }: { label: string; value: string; suffix?: string }) {
  256. return (
  257. <div className="bg-background px-4 py-5 text-center">
  258. <div className="text-[10px] tracking-[0.32em] uppercase text-muted-foreground">{label}</div>
  259. <div className="serif mt-2 text-xl md:text-2xl">
  260. <span className="text-gold" style={{ color: "var(--color-gold)" }}>{value}</span>
  261. {suffix && <span className="text-muted-foreground text-sm ml-1">{suffix}</span>}
  262. </div>
  263. </div>
  264. );
  265. }
  266.  
  267. function InfoRow({ label, value }: { label: string; value: string }) {
  268. return (
  269. <div className="grid grid-cols-[110px_1fr] gap-3 px-5 py-3">
  270. <dt className="text-[10px] tracking-[0.24em] uppercase text-muted-foreground pt-1">{label}</dt>
  271. <dd className="serif">{value}</dd>
  272. </div>
  273. );
  274. }
  275.  
Advertisement
Add Comment
Please, Sign In to add comment