Neil67 commited on
Commit
d784fe4
·
verified ·
1 Parent(s): 27c98b6

Fix English word quality and KK phonetics

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. 404.html +1 -1
  2. 404/index.html +1 -1
  3. __next.__PAGE__.txt +3 -3
  4. __next._full.txt +22 -20
  5. __next._head.txt +3 -3
  6. __next._index.txt +5 -5
  7. __next._tree.txt +2 -2
  8. _next/static/chenguang-msvqzg9h/_buildManifest.js +0 -1
  9. _next/static/chenguang-mt5ixtpd/_buildManifest.js +11 -0
  10. _next/static/chenguang-mt5ixtpd/_clientMiddlewareManifest.js +1 -0
  11. _next/static/{chenguang-msvqzg9h → chenguang-mt5ixtpd}/_ssgManifest.js +0 -0
  12. _next/static/chunks/01fkjjaxmjllw.js +3 -0
  13. _next/static/chunks/0392f73_55yx4.js +1 -0
  14. _next/static/chunks/05-c3ty_6dwfk.js +1 -0
  15. _next/static/chunks/{polyfills-42372ed130431b0a.js → 0cz1d0mv5g_q7.js} +0 -0
  16. _next/static/chunks/0hjmsyzned3p8.js +1 -0
  17. _next/static/chunks/0x-17au6zvwi6.js +1 -0
  18. _next/static/chunks/13wk2aorwngo0.js +1 -0
  19. _next/static/chunks/14mrh2-p_w84d.js +1 -0
  20. _next/static/chunks/1553.fe7a8a25cf8dc27c.js +0 -1
  21. _next/static/chunks/1966.1560d0f43ac9a41a.js +0 -1
  22. _next/static/chunks/1awtrs58q38px.js +1 -0
  23. _next/static/chunks/1fzmt6k-wgjqc.js +1 -0
  24. _next/static/chunks/1g4vb67-ko26n.css +1 -0
  25. _next/static/chunks/1kuwwi-pzktjs.js +1 -0
  26. _next/static/chunks/1lld_xgwo9am9.js +0 -0
  27. _next/static/chunks/1qp2cnh13tfb2.js +1 -0
  28. _next/static/chunks/1t3fjy-pg_496.js +0 -0
  29. _next/static/chunks/27jktro2p5rq9.js +4 -0
  30. _next/static/chunks/2927-a494ee41b72ffcba.js +0 -1
  31. _next/static/chunks/2ecndn9sdfd5d.js +1 -0
  32. _next/static/chunks/2ed6zxyx6bltt.js +1 -0
  33. _next/static/chunks/2eqq4i-f6tb29.js +1 -0
  34. _next/static/chunks/2jp8l98lm8ch0.js +1 -0
  35. _next/static/chunks/2mka_yjv0p9c4.js +1 -0
  36. _next/static/chunks/2pex9a9vvpvcg.js +1 -0
  37. _next/static/chunks/2s-mj2kxpo2po.js +1 -0
  38. _next/static/chunks/2v9kiejxhux02.js +1 -0
  39. _next/static/chunks/2w4nzkaxxb852.js +1 -0
  40. _next/static/chunks/2z69le1cjg69d.js +1 -0
  41. _next/static/chunks/30wzzb4czv44x.js +1 -0
  42. _next/static/chunks/3146sdm58x_li.js +1 -0
  43. _next/static/chunks/3794-cb526b88d93b741f.js +0 -0
  44. _next/static/chunks/3899.cf10152d8085e352.js +0 -1
  45. _next/static/chunks/39ivbka3u9lh7.js +1 -0
  46. _next/static/chunks/3_6muaniutgts.js +1 -0
  47. _next/static/chunks/3_mt5x2w7sss6.js +1 -0
  48. _next/static/chunks/3cc8cz63kiyex.js +1 -0
  49. _next/static/chunks/3g2lpa9dvikev.js +1 -0
  50. _next/static/chunks/3gir9tqn7_2if.js +1 -0
404.html CHANGED
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="zh-Hant"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5, viewport-fit=cover"/><link rel="stylesheet" href="/_next/static/css/d1607a720c35fa4e.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-996a0d4b845e5b32.js"/><script src="/_next/static/chunks/4bd1b696-c2f6e0877b6c10aa.js" async=""></script><script src="/_next/static/chunks/3794-cb526b88d93b741f.js" async=""></script><script src="/_next/static/chunks/main-app-f54aabdc4817e74d.js" async=""></script><script src="/_next/static/chunks/app/layout-8f4e954e06fc61fd.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><meta name="theme-color" content="#fff8ef"/><title>晨光|國小學習陪跑系統</title><meta name="description" content="給家長與孩子使用的國小學習陪跑系統,支援英文練習、手寫出題、每日測驗與家長週報。"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-996a0d4b845e5b32.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[1910,[\"7177\",\"static/chunks/app/layout-8f4e954e06fc61fd.js\"],\"StaticSpaceNavigationGuard\"]\n3:I[7121,[],\"\"]\n4:I[4581,[],\"\"]\n5:I[484,[],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n9:I[484,[],\"ViewportBoundary\"]\nb:I[484,[],\"MetadataBoundary\"]\nd:I[7123,[],\"default\",1]\n:HL[\"/_next/static/css/d1607a720c35fa4e.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/d1607a720c35fa4e.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"zh-Hant\",\"children\":[\"$\",\"body\",null,{\"children\":[[\"$\",\"$L2\",null,{}],[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,null]},null,false,\"$@8\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"chenguang-msvqzg9h\"}\n"])</script><script>self.__next_f.push([1,"e:[]\n8:\"$We\"\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=5, viewport-fit=cover\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#fff8ef\"}]]\n"])</script><script>self.__next_f.push([1,"7:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"晨光|國小學習陪跑系統\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"給家長與孩子使用的國小學習陪跑系統,支援英文練習、手寫出題、每日測驗與家長週報。\"}]]\n"])</script></body></html>
 
1
+ <!DOCTYPE html><html lang="zh-Hant"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5, viewport-fit=cover"/><link rel="stylesheet" href="/_next/static/chunks/1g4vb67-ko26n.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/40e0f9pufs6g4.js"/><script src="/_next/static/chunks/27jktro2p5rq9.js" async=""></script><script src="/_next/static/chunks/3peubv2924kx4.js" async=""></script><script src="/_next/static/chunks/1lld_xgwo9am9.js" async=""></script><script src="/_next/static/chunks/turbopack-38dm0j3nbl-h4.js" async=""></script><script src="/_next/static/chunks/2v9kiejxhux02.js" async=""></script><script src="/_next/static/chunks/14mrh2-p_w84d.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><meta name="theme-color" content="#fff8ef"/><title>晨光|國小學習陪跑系統</title><meta name="description" content="給家長與孩子使用的國小學習陪跑系統,支援英文練習、手寫出題、每日測驗與家長週報。"/><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/40e0f9pufs6g4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[17907,[\"/_next/static/chunks/2v9kiejxhux02.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"StaticSpaceNavigationGuard\"]\n3:I[39756,[\"/_next/static/chunks/2v9kiejxhux02.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/2v9kiejxhux02.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n5:I[97367,[\"/_next/static/chunks/2v9kiejxhux02.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n9:I[97367,[\"/_next/static/chunks/2v9kiejxhux02.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ViewportBoundary\"]\nb:I[97367,[\"/_next/static/chunks/2v9kiejxhux02.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"MetadataBoundary\"]\nd:I[68027,[\"/_next/static/chunks/2v9kiejxhux02.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/1g4vb67-ko26n.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1g4vb67-ko26n.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/2v9kiejxhux02.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/14mrh2-p_w84d.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"zh-Hant\",\"children\":[\"$\",\"body\",null,{\"children\":[[\"$\",\"$L2\",null,{}],[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,null]},null,false,\"$@8\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1g4vb67-ko26n.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"chenguang-mt5ixtpd\"}\n"])</script><script>self.__next_f.push([1,"e:[]\n8:\"$We\"\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=5, viewport-fit=cover\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#fff8ef\"}]]\n"])</script><script>self.__next_f.push([1,"7:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"晨光|國小學習陪跑系統\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"給家長與孩子使用的國小學習陪跑系統,支援英文練習、手寫出題、每日測驗與家長週報。\"}]]\n"])</script></body></html>
404/index.html CHANGED
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="zh-Hant"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5, viewport-fit=cover"/><link rel="stylesheet" href="/_next/static/css/d1607a720c35fa4e.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-996a0d4b845e5b32.js"/><script src="/_next/static/chunks/4bd1b696-c2f6e0877b6c10aa.js" async=""></script><script src="/_next/static/chunks/3794-cb526b88d93b741f.js" async=""></script><script src="/_next/static/chunks/main-app-f54aabdc4817e74d.js" async=""></script><script src="/_next/static/chunks/app/layout-8f4e954e06fc61fd.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><meta name="theme-color" content="#fff8ef"/><title>晨光|國小學習陪跑系統</title><meta name="description" content="給家長與孩子使用的國小學習陪跑系統,支援英文練習、手寫出題、每日測驗與家長週報。"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-996a0d4b845e5b32.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[1910,[\"7177\",\"static/chunks/app/layout-8f4e954e06fc61fd.js\"],\"StaticSpaceNavigationGuard\"]\n3:I[7121,[],\"\"]\n4:I[4581,[],\"\"]\n5:I[484,[],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n9:I[484,[],\"ViewportBoundary\"]\nb:I[484,[],\"MetadataBoundary\"]\nd:I[7123,[],\"default\",1]\n:HL[\"/_next/static/css/d1607a720c35fa4e.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/d1607a720c35fa4e.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"zh-Hant\",\"children\":[\"$\",\"body\",null,{\"children\":[[\"$\",\"$L2\",null,{}],[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,null]},null,false,\"$@8\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"chenguang-msvqzg9h\"}\n"])</script><script>self.__next_f.push([1,"e:[]\n8:\"$We\"\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=5, viewport-fit=cover\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#fff8ef\"}]]\n"])</script><script>self.__next_f.push([1,"7:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"晨光|國小學習陪跑系統\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"給家長與孩子使用的國小學習陪跑系統,支援英文練習、手寫出題、每日測驗與家長週報。\"}]]\n"])</script></body></html>
 
1
+ <!DOCTYPE html><html lang="zh-Hant"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5, viewport-fit=cover"/><link rel="stylesheet" href="/_next/static/chunks/1g4vb67-ko26n.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/40e0f9pufs6g4.js"/><script src="/_next/static/chunks/27jktro2p5rq9.js" async=""></script><script src="/_next/static/chunks/3peubv2924kx4.js" async=""></script><script src="/_next/static/chunks/1lld_xgwo9am9.js" async=""></script><script src="/_next/static/chunks/turbopack-38dm0j3nbl-h4.js" async=""></script><script src="/_next/static/chunks/2v9kiejxhux02.js" async=""></script><script src="/_next/static/chunks/14mrh2-p_w84d.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><meta name="theme-color" content="#fff8ef"/><title>晨光|國小學習陪跑系統</title><meta name="description" content="給家長與孩子使用的國小學習陪跑系統,支援英文練習、手寫出題、每日測驗與家長週報。"/><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/40e0f9pufs6g4.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[17907,[\"/_next/static/chunks/2v9kiejxhux02.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"StaticSpaceNavigationGuard\"]\n3:I[39756,[\"/_next/static/chunks/2v9kiejxhux02.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/2v9kiejxhux02.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\"]\n5:I[97367,[\"/_next/static/chunks/2v9kiejxhux02.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n9:I[97367,[\"/_next/static/chunks/2v9kiejxhux02.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"ViewportBoundary\"]\nb:I[97367,[\"/_next/static/chunks/2v9kiejxhux02.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"MetadataBoundary\"]\nd:I[68027,[\"/_next/static/chunks/2v9kiejxhux02.js\",\"/_next/static/chunks/14mrh2-p_w84d.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/1g4vb67-ko26n.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1g4vb67-ko26n.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/2v9kiejxhux02.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/14mrh2-p_w84d.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"zh-Hant\",\"children\":[\"$\",\"body\",null,{\"children\":[[\"$\",\"$L2\",null,{}],[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:1:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,null]},null,false,\"$@8\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1g4vb67-ko26n.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"chenguang-mt5ixtpd\"}\n"])</script><script>self.__next_f.push([1,"e:[]\n8:\"$We\"\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=5, viewport-fit=cover\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#fff8ef\"}]]\n"])</script><script>self.__next_f.push([1,"7:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"晨光|國小學習陪跑系統\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"給家長與孩子使用的國小學習陪跑系統,支援英文練習、手寫出題、每日測驗與家長週報。\"}]]\n"])</script></body></html>
__next.__PAGE__.txt CHANGED
@@ -1,6 +1,6 @@
1
  1:"$Sreact.fragment"
2
- 2:I[5862,["8500","static/chunks/8500-3953cc33eeceb44e.js","8974","static/chunks/app/page-19f7bd3140682c83.js"],"ExportSafeLink"]
3
- 3:I[484,[],"OutletBoundary"]
4
  4:"$Sreact.suspense"
5
- 0:{"rsc":["$","$1","c",{"children":[["$","main",null,{"className":"home-page","children":["$","div",null,{"className":"home-shell","children":[["$","nav",null,{"className":"home-nav","aria-label":"首頁導覽","children":[["$","$L2",null,{"className":"home-brand","href":"/","children":[["$","span",null,{"className":"home-brand-mark","aria-hidden":"true","children":"☀"}],["$","span",null,{"children":[["$","strong",null,{"children":"晨光"}],["$","small",null,{"children":"國小學習陪跑系統"}]]}]]}],["$","div",null,{"className":"home-nav-actions","children":[["$","$L2",null,{"className":"home-nav-link","href":"/courses","children":"看看課程"}],["$","$L2",null,{"className":"home-nav-button","href":"/login","children":"登入晨光"}]]}]]}],["$","section",null,{"className":"home-hero","children":["$","div",null,{"className":"home-hero-copy","children":[["$","p",null,{"className":"home-eyebrow","children":"給國小家庭的每日學習節奏"}],["$","h1",null,{"children":"晨光國小學習陪跑"}],["$","p",null,{"className":"home-hero-lead","children":"從國語、英文、數學開始,每天完成一小步。孩子知道現在要做什麼,家長也看得見真正的學習進度。"}],["$","div",null,{"className":"home-hero-actions","children":[["$","$L2",null,{"className":"home-primary-button","href":"/login","children":"開始今天任務"}],["$","$L2",null,{"className":"home-secondary-button","href":"/courses","children":"瀏覽三科課程"}]]}],["$","p",null,{"className":"home-hero-note","children":"目前開放小一到小三內容,可切換匿名學習檔案並分別保存年級進度。"}]]}]}],["$","section",null,{"className":"home-steps","aria-label":"晨光學習流程","children":[["$","div","01",{"className":"home-step","children":[["$","span",null,{"children":"01"}],["$","div",null,{"children":[["$","strong",null,{"children":"選今天任務"}],["$","p",null,{"children":"依孩子年級安排一個小目標"}]]}]]}],["$","div","02",{"className":"home-step","children":[["$","span",null,{"children":"02"}],["$","div",null,{"children":[["$","strong",null,{"children":"聽、說、做"}],["$","p",null,{"children":"一次只處理一題,不把整頁塞滿"}]]}]]}],["$","div","03",{"className":"home-step","children":[["$","span",null,{"children":"03"}],["$","div",null,{"children":[["$","strong",null,{"children":"錯題再練"}],["$","p",null,{"children":"用孩子聽得懂的方式說明原因"}]]}]]}],["$","div","04",{"className":"home-step","children":[["$","span",null,{"children":"04"}],["$","div",null,{"children":[["$","strong",null,{"children":"家長看進度"}],["$","p",null,{"children":"一頁掌握這週做過哪些內容"}]]}]]}]]}],["$","section",null,{"className":"home-features","children":[["$","header",null,{"children":[["$","p",null,{"className":"home-eyebrow","children":"今天就能直接使用"}],["$","h2",null,{"children":"三個核心功能,形成完整陪跑循環"}],["$","p",null,{"children":"先讓每一步都能操作、能留下紀錄,再逐步擴充教材。"}]]}],["$","div",null,{"className":"home-feature-grid","children":[["$","$L2","每日 10 題",{"className":"home-feature-card","href":"/daily-quiz","children":[["$","span",null,{"className":"home-feature-number","children":"10"}],["$","h3",null,{"children":"每日 10 題"}],["$","p",null,{"children":"一次只出現一題,選完立即知道結果,再安心前往下一題。"}],["$","strong",null,{"children":["開始今天練習"," →"]}]]}],["$","$L2","錯題小老師",{"className":"home-feature-card","href":"/wrong-review","children":[["$","span",null,{"className":"home-feature-number","children":"AI"}],["$","h3",null,{"children":"錯題小老師"}],["$","p",null,{"children":"保留孩子答錯的內容,用簡短中文、注音提示與例句陪他重新理解。"}],["$","strong",null,{"children":["看看需要再練"," →"]}]]}],["$","$L2","家長學習週報",{"className":"home-feature-card","href":"/parent-weekly-report","children":[["$","span",null,{"className":"home-feature-number","children":"週"}],["$","h3",null,{"children":"家長學習週報"}],["$","p",null,{"children":"把學習天數、題數、正確率與接觸單字集中在同一頁,不必到處找。"}],["$","strong",null,{"children":["查看本週進度"," →"]}]]}]]}]]}]]}]}],null,["$","$L3",null,{"children":["$","$4",null,{"name":"Next.MetadataOutlet","children":"$@5"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"chenguang-msvqzg9h"}
6
  5:null
 
1
  1:"$Sreact.fragment"
2
+ 2:I[14876,["/_next/static/chunks/2v9kiejxhux02.js","/_next/static/chunks/14mrh2-p_w84d.js","/_next/static/chunks/2ed6zxyx6bltt.js"],"ExportSafeLink"]
3
+ 3:I[97367,["/_next/static/chunks/2v9kiejxhux02.js","/_next/static/chunks/14mrh2-p_w84d.js"],"OutletBoundary"]
4
  4:"$Sreact.suspense"
5
+ 0:{"rsc":["$","$1","c",{"children":[["$","main",null,{"className":"home-page","children":["$","div",null,{"className":"home-shell","children":[["$","nav",null,{"className":"home-nav","aria-label":"首頁導覽","children":[["$","$L2",null,{"className":"home-brand","href":"/","children":[["$","span",null,{"className":"home-brand-mark","aria-hidden":"true","children":"☀"}],["$","span",null,{"children":[["$","strong",null,{"children":"晨光"}],["$","small",null,{"children":"國小學習陪跑系統"}]]}]]}],["$","div",null,{"className":"home-nav-actions","children":[["$","$L2",null,{"className":"home-nav-link","href":"/courses","children":"看看課程"}],["$","$L2",null,{"className":"home-nav-button","href":"/login","children":"登入晨光"}]]}]]}],["$","section",null,{"className":"home-hero","children":["$","div",null,{"className":"home-hero-copy","children":[["$","p",null,{"className":"home-eyebrow","children":"給國小家庭的每日學習節奏"}],["$","h1",null,{"children":"晨光國小學習陪跑"}],["$","p",null,{"className":"home-hero-lead","children":"從國語、英文、數學開始,每天完成一小步。孩子知道現在要做什麼,家長也看得見真正的學習進度。"}],["$","div",null,{"className":"home-hero-actions","children":[["$","$L2",null,{"className":"home-primary-button","href":"/login","children":"開始今天任務"}],["$","$L2",null,{"className":"home-secondary-button","href":"/courses","children":"瀏覽三科課程"}]]}],["$","p",null,{"className":"home-hero-note","children":"目前開放小一到小三內容,可切換匿名學習檔案並分別保存年級進度。"}]]}]}],["$","section",null,{"className":"home-steps","aria-label":"晨光學習流程","children":[["$","div","01",{"className":"home-step","children":[["$","span",null,{"children":"01"}],["$","div",null,{"children":[["$","strong",null,{"children":"選今天任務"}],["$","p",null,{"children":"依孩子年級安排一個小目標"}]]}]]}],["$","div","02",{"className":"home-step","children":[["$","span",null,{"children":"02"}],["$","div",null,{"children":[["$","strong",null,{"children":"聽、說、做"}],["$","p",null,{"children":"一次只處理一題,不把整頁塞滿"}]]}]]}],["$","div","03",{"className":"home-step","children":[["$","span",null,{"children":"03"}],["$","div",null,{"children":[["$","strong",null,{"children":"錯題再練"}],["$","p",null,{"children":"用孩子聽得懂的方式說明原因"}]]}]]}],["$","div","04",{"className":"home-step","children":[["$","span",null,{"children":"04"}],["$","div",null,{"children":[["$","strong",null,{"children":"家長看進度"}],["$","p",null,{"children":"一頁掌握這週做過哪些內容"}]]}]]}]]}],["$","section",null,{"className":"home-features","children":[["$","header",null,{"children":[["$","p",null,{"className":"home-eyebrow","children":"今天就能直接使用"}],["$","h2",null,{"children":"三個核心功能,形成完整陪跑循環"}],["$","p",null,{"children":"先讓每一步都能操作、能留下紀錄,再逐步擴充教材。"}]]}],["$","div",null,{"className":"home-feature-grid","children":[["$","$L2","每日 10 題",{"className":"home-feature-card","href":"/daily-quiz","children":[["$","span",null,{"className":"home-feature-number","children":"10"}],["$","h3",null,{"children":"每日 10 題"}],["$","p",null,{"children":"一次只出現一題,選完立即知道結果,再安心前往下一題。"}],["$","strong",null,{"children":["開始今天練習"," →"]}]]}],["$","$L2","錯題小老師",{"className":"home-feature-card","href":"/wrong-review","children":[["$","span",null,{"className":"home-feature-number","children":"AI"}],["$","h3",null,{"children":"錯題小老師"}],["$","p",null,{"children":"保留孩子答錯的內容,用簡短中文、注音提示與例句陪他重新理解。"}],["$","strong",null,{"children":["看看需要再練"," →"]}]]}],["$","$L2","家長學習週報",{"className":"home-feature-card","href":"/parent-weekly-report","children":[["$","span",null,{"className":"home-feature-number","children":"週"}],["$","h3",null,{"children":"家長學習週報"}],["$","p",null,{"children":"把學習天數、題數、正確率與接觸單字集中在同一頁,不必到處找。"}],["$","strong",null,{"children":["查看本週進度"," →"]}]]}]]}]]}]]}]}],[["$","script","script-0",{"src":"/_next/static/chunks/2ed6zxyx6bltt.js","async":true}]],["$","$L3",null,{"children":["$","$4",null,{"name":"Next.MetadataOutlet","children":"$@5"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"chenguang-mt5ixtpd"}
6
  5:null
__next._full.txt CHANGED
@@ -1,21 +1,23 @@
1
  1:"$Sreact.fragment"
2
- 2:I[1910,["7177","static/chunks/app/layout-8f4e954e06fc61fd.js"],"StaticSpaceNavigationGuard"]
3
- 3:I[7121,[],""]
4
- 4:I[4581,[],""]
5
- 5:I[5862,["8500","static/chunks/8500-3953cc33eeceb44e.js","8974","static/chunks/app/page-19f7bd3140682c83.js"],"ExportSafeLink"]
6
- c:I[7123,[],"default",1]
7
- :HL["/_next/static/css/d1607a720c35fa4e.css","style"]
8
- 0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/d1607a720c35fa4e.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"zh-Hant","children":["$","body",null,{"children":[["$","$L2",null,{}],["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]]}]}]]}],{"children":[["$","$1","c",{"children":[["$","main",null,{"className":"home-page","children":["$","div",null,{"className":"home-shell","children":[["$","nav",null,{"className":"home-nav","aria-label":"首頁導覽","children":[["$","$L5",null,{"className":"home-brand","href":"/","children":[["$","span",null,{"className":"home-brand-mark","aria-hidden":"true","children":"☀"}],["$","span",null,{"children":[["$","strong",null,{"children":"晨光"}],["$","small",null,{"children":"國小學習陪跑系統"}]]}]]}],["$","div",null,{"className":"home-nav-actions","children":[["$","$L5",null,{"className":"home-nav-link","href":"/courses","children":"看看課程"}],["$","$L5",null,{"className":"home-nav-button","href":"/login","children":"登入晨光"}]]}]]}],["$","section",null,{"className":"home-hero","children":["$","div",null,{"className":"home-hero-copy","children":[["$","p",null,{"className":"home-eyebrow","children":"給國小家庭的每日學習節奏"}],["$","h1",null,{"children":"晨光國小學習陪跑"}],["$","p",null,{"className":"home-hero-lead","children":"從國語、英文、數學開始,每天完成一小步。孩子知道現在要做什麼,家長也看得見真正的學習進度。"}],["$","div",null,{"className":"home-hero-actions","children":[["$","$L5",null,{"className":"home-primary-button","href":"/login","children":"開始今天任務"}],["$","$L5",null,{"className":"home-secondary-button","href":"/courses","children":"瀏覽三科課程"}]]}],["$","p",null,{"className":"home-hero-note","children":"目前開放小一到小三內容,可切換匿名學習檔案並分別保存年級進度。"}]]}]}],["$","section",null,{"className":"home-steps","aria-label":"晨光學習流程","children":[["$","div","01",{"className":"home-step","children":[["$","span",null,{"children":"01"}],["$","div",null,{"children":[["$","strong",null,{"children":"選今天任務"}],["$","p",null,{"children":"依孩子年級安排一個小目標"}]]}]]}],["$","div","02",{"className":"home-step","children":[["$","span",null,{"children":"02"}],["$","div",null,{"children":[["$","strong",null,{"children":"聽、說、做"}],["$","p",null,{"children":"一次只處理一題,不把整頁塞滿"}]]}]]}],["$","div","03",{"className":"home-step","children":[["$","span",null,{"children":"03"}],["$","div",null,{"children":[["$","strong",null,{"children":"錯題再練"}],["$","p",null,{"children":"用孩子聽得懂的方式說明原因"}]]}]]}],["$","div","04",{"className":"home-step","children":[["$","span",null,{"children":"04"}],["$","div",null,{"children":[["$","strong",null,{"children":"家長看進度"}],["$","p",null,{"children":"一頁掌握這週做過哪些內容"}]]}]]}]]}],["$","section",null,{"className":"home-features","children":[["$","header",null,{"children":[["$","p",null,{"className":"home-eyebrow","children":"今天就能直接使用"}],["$","h2",null,{"children":"三個核心功能,形成完整陪跑循環"}],["$","p",null,{"children":"先讓每一步都能操作、能留下紀錄,再逐步擴充教材。"}]]}],["$","div",null,{"className":"home-feature-grid","children":[["$","$L5","每日 10 題",{"className":"home-feature-card","href":"/daily-quiz","children":[["$","span",null,{"className":"home-feature-number","children":"10"}],["$","h3",null,{"children":"每日 10 題"}],["$","p",null,{"children":"一次只出現一題,選完立即知道結果,再安心前往下一題。"}],["$","strong",null,{"children":["開始今天練習"," →"]}]]}],["$","$L5","錯題小老師",{"className":"home-feature-card","href":"/wrong-review","children":[["$","span",null,{"className":"home-feature-number","children":"AI"}],["$","h3",null,{"children":"錯題小老師"}],["$","p",null,{"children":"保留孩子答錯的內容,用簡短中文、注音提示與例句陪他重新理解。"}],["$","strong",null,{"children":["看看需要再練"," →"]}]]}],["$","$L5","家長學習週報",{"className":"home-feature-card","href":"/parent-weekly-report","children":["$L6","$L7","$L8","$L9"]}]]}]]}]]}]}],null,"$La"]}],{},null,false,null]},null,false,null],"$Lb",false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"chenguang-msvqzg9h"}
9
- d:I[484,[],"OutletBoundary"]
10
- e:"$Sreact.suspense"
11
- 10:I[484,[],"ViewportBoundary"]
12
- 12:I[484,[],"MetadataBoundary"]
13
- 6:["$","span",null,{"className":"home-feature-number","children":""}]
14
- 7:["$","h3",null,{"children":"家長學習週報"}]
15
- 8:["$","p",null,{"children":"把學習天數、題數、正確率與接觸單字集中在同一頁,不必到處找。"}]
16
- 9:["$","strong",null,{"children":["查看本週進度"," →"]}]
17
- a:["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]
18
- b:["$","$1","h",{"children":[null,["$","$L10",null,{"children":"$L11"}],["$","div",null,{"hidden":true,"children":["$","$L12",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L13"}]}]}],null]}]
19
- 11:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=5, viewport-fit=cover"}],["$","meta","2",{"name":"theme-color","content":"#fff8ef"}]]
20
- f:null
21
- 13:[["$","title","0",{"children":"晨光|國小學習陪跑系統"}],["$","meta","1",{"name":"description","content":"給家長與孩子使用的國小學習陪跑系統,支援英文練習、手寫出題、每日測驗與家長週報。"}]]
 
 
 
1
  1:"$Sreact.fragment"
2
+ 2:I[17907,["/_next/static/chunks/2v9kiejxhux02.js","/_next/static/chunks/14mrh2-p_w84d.js"],"StaticSpaceNavigationGuard"]
3
+ 3:I[39756,["/_next/static/chunks/2v9kiejxhux02.js","/_next/static/chunks/14mrh2-p_w84d.js"],"default"]
4
+ 4:I[37457,["/_next/static/chunks/2v9kiejxhux02.js","/_next/static/chunks/14mrh2-p_w84d.js"],"default"]
5
+ 5:I[14876,["/_next/static/chunks/2v9kiejxhux02.js","/_next/static/chunks/14mrh2-p_w84d.js","/_next/static/chunks/2ed6zxyx6bltt.js"],"ExportSafeLink"]
6
+ d:I[68027,["/_next/static/chunks/2v9kiejxhux02.js","/_next/static/chunks/14mrh2-p_w84d.js"],"default",1]
7
+ :HL["/_next/static/chunks/1g4vb67-ko26n.css","style"]
8
+ 0:{"P":null,"c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/1g4vb67-ko26n.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/2v9kiejxhux02.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/14mrh2-p_w84d.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"zh-Hant","children":["$","body",null,{"children":[["$","$L2",null,{}],["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]]}]}]]}],{"children":[["$","$1","c",{"children":[["$","main",null,{"className":"home-page","children":["$","div",null,{"className":"home-shell","children":[["$","nav",null,{"className":"home-nav","aria-label":"首頁導覽","children":[["$","$L5",null,{"className":"home-brand","href":"/","children":[["$","span",null,{"className":"home-brand-mark","aria-hidden":"true","children":"☀"}],["$","span",null,{"children":[["$","strong",null,{"children":"晨光"}],["$","small",null,{"children":"國小學習陪跑系統"}]]}]]}],["$","div",null,{"className":"home-nav-actions","children":[["$","$L5",null,{"className":"home-nav-link","href":"/courses","children":"看看課程"}],["$","$L5",null,{"className":"home-nav-button","href":"/login","children":"登入晨光"}]]}]]}],["$","section",null,{"className":"home-hero","children":["$","div",null,{"className":"home-hero-copy","children":[["$","p",null,{"className":"home-eyebrow","children":"給國小家庭的每日學習節奏"}],["$","h1",null,{"children":"晨光國小學習陪跑"}],["$","p",null,{"className":"home-hero-lead","children":"從國語、英文、數學開始,每天完成一小步。孩子知道現在要做什麼,家長也看得見真正的學習進度。"}],["$","div",null,{"className":"home-hero-actions","children":[["$","$L5",null,{"className":"home-primary-button","href":"/login","children":"開始今天任務"}],["$","$L5",null,{"className":"home-secondary-button","href":"/courses","children":"瀏覽三科課程"}]]}],["$","p",null,{"className":"home-hero-note","children":"目前開放小一到小三內容,可切換匿名學習檔案並分別保存年級進度。"}]]}]}],["$","section",null,{"className":"home-steps","aria-label":"晨光學習流程","children":[["$","div","01",{"className":"home-step","children":[["$","span",null,{"children":"01"}],["$","div",null,{"children":[["$","strong",null,{"children":"選今天任務"}],["$","p",null,{"children":"依孩子年級安排一個小目標"}]]}]]}],["$","div","02",{"className":"home-step","children":[["$","span",null,{"children":"02"}],["$","div",null,{"children":[["$","strong",null,{"children":"聽、說、做"}],["$","p",null,{"children":"一次只處理一題,不把整頁塞滿"}]]}]]}],["$","div","03",{"className":"home-step","children":[["$","span",null,{"children":"03"}],["$","div",null,{"children":[["$","strong",null,{"children":"錯題再練"}],["$","p",null,{"children":"用孩子聽得懂的方式說明原因"}]]}]]}],["$","div","04",{"className":"home-step","children":[["$","span",null,{"children":"04"}],["$","div",null,{"children":[["$","strong",null,{"children":"家長看進度"}],["$","p",null,{"children":"一頁掌握這週做過哪些內容"}]]}]]}]]}],["$","section",null,{"className":"home-features","children":[["$","header",null,{"children":[["$","p",null,{"className":"home-eyebrow","children":"今天就能直接使用"}],["$","h2",null,{"children":"三個核心功能,形成完整陪跑循環"}],["$","p",null,{"children":"先讓每一步都能操作、能留下紀錄,再逐步擴充教材。"}]]}],["$","div",null,{"className":"home-feature-grid","children":[["$","$L5","每日 10 題",{"className":"home-feature-card","href":"/daily-quiz","children":[["$","span",null,{"className":"home-feature-number","children":"10"}],["$","h3",null,{"children":"每日 10 題"}],["$","p",null,{"children":"一次只出現一題,選完立即知道結果,再安心前往下一題。"}],["$","strong",null,{"children":["開始今天練習"," →"]}]]}],["$","$L5","錯題小老師",{"className":"home-feature-card","href":"/wrong-review","children":[["$","span",null,{"className":"home-feature-number","children":"AI"}],"$L6","$L7","$L8"]}],"$L9"]}]]}]]}]}],["$La"],"$Lb"]}],{},null,false,null]},null,false,null],"$Lc",false]],"m":"$undefined","G":["$d",["$Le"]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"chenguang-mt5ixtpd"}
9
+ f:I[97367,["/_next/static/chunks/2v9kiejxhux02.js","/_next/static/chunks/14mrh2-p_w84d.js"],"OutletBoundary"]
10
+ 10:"$Sreact.suspense"
11
+ 12:I[97367,["/_next/static/chunks/2v9kiejxhux02.js","/_next/static/chunks/14mrh2-p_w84d.js"],"ViewportBoundary"]
12
+ 14:I[97367,["/_next/static/chunks/2v9kiejxhux02.js","/_next/static/chunks/14mrh2-p_w84d.js"],"MetadataBoundary"]
13
+ 6:["$","h3",null,{"children":"錯題小老師"}]
14
+ 7:["$","p",null,{"children":"保留孩子答錯的內容,用簡短中文、注音提示與例句陪他重新理解。"}]
15
+ 8:["$","strong",null,{"children":["看看需要再練"," →"]}]
16
+ 9:["$","$L5","家長學習週報",{"className":"home-feature-card","href":"/parent-weekly-report","children":[["$","span",null,{"className":"home-feature-number","children":"週"}],["$","h3",null,{"children":"家長學習週報"}],["$","p",null,{"children":"把學習天數、題數、正確率與接觸單字集中在同一頁,不必到處找。"}],["$","strong",null,{"children":["查看本週進度"," →"]}]]}]
17
+ a:["$","script","script-0",{"src":"/_next/static/chunks/2ed6zxyx6bltt.js","async":true,"nonce":"$undefined"}]
18
+ b:["$","$Lf",null,{"children":["$","$10",null,{"name":"Next.MetadataOutlet","children":"$@11"}]}]
19
+ c:["$","$1","h",{"children":[null,["$","$L12",null,{"children":"$L13"}],["$","div",null,{"hidden":true,"children":["$","$L14",null,{"children":["$","$10",null,{"name":"Next.Metadata","children":"$L15"}]}]}],null]}]
20
+ e:["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/1g4vb67-ko26n.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]
21
+ 13:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=5, viewport-fit=cover"}],["$","meta","2",{"name":"theme-color","content":"#fff8ef"}]]
22
+ 11:null
23
+ 15:[["$","title","0",{"children":"晨光|國小學習陪跑系統"}],["$","meta","1",{"name":"description","content":"給家長與孩子使用的國小學習陪跑系統,支援英文練習、手寫出題、每日測驗與家長週報。"}]]
__next._head.txt CHANGED
@@ -1,5 +1,5 @@
1
  1:"$Sreact.fragment"
2
- 2:I[484,[],"ViewportBoundary"]
3
- 3:I[484,[],"MetadataBoundary"]
4
  4:"$Sreact.suspense"
5
- 0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=5, viewport-fit=cover"}],["$","meta","2",{"name":"theme-color","content":"#fff8ef"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"晨光|國小學習陪跑系統"}],["$","meta","1",{"name":"description","content":"給家長與孩子使用的國小學習陪跑系統,支援英文練習、手寫出題、每日測驗與家長週報。"}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"chenguang-msvqzg9h"}
 
1
  1:"$Sreact.fragment"
2
+ 2:I[97367,["/_next/static/chunks/2v9kiejxhux02.js","/_next/static/chunks/14mrh2-p_w84d.js"],"ViewportBoundary"]
3
+ 3:I[97367,["/_next/static/chunks/2v9kiejxhux02.js","/_next/static/chunks/14mrh2-p_w84d.js"],"MetadataBoundary"]
4
  4:"$Sreact.suspense"
5
+ 0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1, maximum-scale=5, viewport-fit=cover"}],["$","meta","2",{"name":"theme-color","content":"#fff8ef"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"晨光|國小學習陪跑系統"}],["$","meta","1",{"name":"description","content":"給家長與孩子使用的國小學習陪跑系統,支援英文練習、手寫出題、每日測驗與家長週報。"}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"chenguang-mt5ixtpd"}
__next._index.txt CHANGED
@@ -1,6 +1,6 @@
1
  1:"$Sreact.fragment"
2
- 2:I[1910,["7177","static/chunks/app/layout-8f4e954e06fc61fd.js"],"StaticSpaceNavigationGuard"]
3
- 3:I[7121,[],""]
4
- 4:I[4581,[],""]
5
- :HL["/_next/static/css/d1607a720c35fa4e.css","style"]
6
- 0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/d1607a720c35fa4e.css","precedence":"next"}]],["$","html",null,{"lang":"zh-Hant","children":["$","body",null,{"children":[["$","$L2",null,{}],["$","$L3",null,{"parallelRouterKey":"children","template":["$","$L4",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"chenguang-msvqzg9h"}
 
1
  1:"$Sreact.fragment"
2
+ 2:I[17907,["/_next/static/chunks/2v9kiejxhux02.js","/_next/static/chunks/14mrh2-p_w84d.js"],"StaticSpaceNavigationGuard"]
3
+ 3:I[39756,["/_next/static/chunks/2v9kiejxhux02.js","/_next/static/chunks/14mrh2-p_w84d.js"],"default"]
4
+ 4:I[37457,["/_next/static/chunks/2v9kiejxhux02.js","/_next/static/chunks/14mrh2-p_w84d.js"],"default"]
5
+ :HL["/_next/static/chunks/1g4vb67-ko26n.css","style"]
6
+ 0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/1g4vb67-ko26n.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/2v9kiejxhux02.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/14mrh2-p_w84d.js","async":true}]],["$","html",null,{"lang":"zh-Hant","children":["$","body",null,{"children":[["$","$L2",null,{}],["$","$L3",null,{"parallelRouterKey":"children","template":["$","$L4",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"chenguang-mt5ixtpd"}
__next._tree.txt CHANGED
@@ -1,2 +1,2 @@
1
- :HL["/_next/static/css/d1607a720c35fa4e.css","style"]
2
- 0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"chenguang-msvqzg9h"}
 
1
+ :HL["/_next/static/chunks/1g4vb67-ko26n.css","style"]
2
+ 0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"chenguang-mt5ixtpd"}
_next/static/chenguang-msvqzg9h/_buildManifest.js DELETED
@@ -1 +0,0 @@
1
- self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:20,errorRate:1e-4,numBits:384,numHashes:14,bitArray:[0,0,0,1,0,1,1,0,1,1,1,0,0,1,0,1,0,0,0,1,1,0,0,1,0,1,1,0,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0,0,1,1,0,1,0,1,0,1,0,0,1,0,1,1,0,1,0,0,1,0,1,0,1,0,1,1,1,0,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,1,1,0,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,1,1,0,0,0,0,1,1,0,0,1,1,1,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,1,1,1,1,0,1,0,0,1,0,1,1,0,1,0,0,0,0,0,1,0,1,1,0,1,0,1,0,0,1,0,1,0,1,0,1,1,1,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,0,0,0,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1,0,1,0,1,0,0,1,0,1,1,0,1,0,0,0,0,0,1,0,1,1,1,1,0,1,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,1,1,1,0,0,1,1,0,0,1,0,0,0,1,1,1,1,0,1,0,0,0,1,1,1,0,0,1,0,0,1,0,0,0,1,0,1,0,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,0,0,1,1,0]},__routerFilterDynamic:{numItems:5,errorRate:1e-4,numBits:96,numHashes:14,bitArray:[0,0,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,1,1,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0,1,1,0,1,1,0,0,0,1,0,0,1,1,0,1,1,1,1,1,1,0,0,1,0,0,1,0,1,1,1,0,1,0]},sortedPages:["/_app"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
 
 
_next/static/chenguang-mt5ixtpd/_buildManifest.js ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ self.__BUILD_MANIFEST = {
2
+ "__rewrites": {
3
+ "afterFiles": [],
4
+ "beforeFiles": [],
5
+ "fallback": []
6
+ },
7
+ "sortedPages": [
8
+ "/_app",
9
+ "/_error"
10
+ ]
11
+ };self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB()
_next/static/chenguang-mt5ixtpd/_clientMiddlewareManifest.js ADDED
@@ -0,0 +1 @@
 
 
1
+ self.__MIDDLEWARE_MATCHERS = [];self.__MIDDLEWARE_MATCHERS_CB && self.__MIDDLEWARE_MATCHERS_CB()
_next/static/{chenguang-msvqzg9h → chenguang-mt5ixtpd}/_ssgManifest.js RENAMED
File without changes
_next/static/chunks/01fkjjaxmjllw.js ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,88143,(e,t,n)=>{"use strict";function r({widthInt:e,heightInt:t,blurWidth:n,blurHeight:s,blurDataURL:i,objectFit:l}){let a=n?40*n:e,o=s?40*s:t,d=a&&o?`viewBox='0 0 ${a} ${o}'`:"";return`%3Csvg xmlns='http://www.w3.org/2000/svg' ${d}%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='${d?"none":"contain"===l?"xMidYMid":"cover"===l?"xMidYMid slice":"none"}' style='filter: url(%23b);' href='${i}'/%3E%3C/svg%3E`}Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"getImageBlurSvg",{enumerable:!0,get:function(){return r}})},87690,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={VALID_LOADERS:function(){return i},imageConfigDefault:function(){return l}};for(var s in r)Object.defineProperty(n,s,{enumerable:!0,get:r[s]});let i=["default","imgix","cloudinary","akamai","custom"],l={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],path:"/_next/image",loader:"default",loaderFile:"",domains:[],disableStaticImages:!1,minimumCacheTTL:14400,formats:["image/webp"],maximumDiskCacheSize:void 0,maximumRedirects:3,maximumResponseBody:5e7,dangerouslyAllowLocalIP:!1,dangerouslyAllowSVG:!1,contentSecurityPolicy:"script-src 'none'; frame-src 'none'; sandbox;",contentDispositionType:"attachment",localPatterns:void 0,remotePatterns:[],qualities:[75],unoptimized:!1,customCacheHandler:!1}},8927,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"getImgProps",{enumerable:!0,get:function(){return d}}),e.r(33525);let r=e.r(43369),s=e.r(88143),i=e.r(87690),l=["-moz-initial","fill","none","scale-down",void 0];function a(e){return void 0!==e.default}function o(e){return void 0===e?e:"number"==typeof e?Number.isFinite(e)?e:NaN:"string"==typeof e&&/^[0-9]+$/.test(e)?parseInt(e,10):NaN}function d({src:e,sizes:t,unoptimized:n=!1,priority:c=!1,preload:u=!1,loading:m,className:h,quality:x,width:g,height:p,fill:f=!1,style:b,overrideSrc:y,onLoad:w,onLoadingComplete:j,placeholder:k="empty",blurDataURL:v,fetchPriority:N,decoding:_="async",layout:S,objectFit:C,objectPosition:P,lazyBoundary:E,lazyRoot:O,...$},M){var R;let z,I,T,{imgConf:D,showAltText:L,blurComplete:A,defaultLoader:U}=M,q=D||i.imageConfigDefault;if("allSizes"in q)z=q;else{let e=[...q.deviceSizes,...q.imageSizes].sort((e,t)=>e-t),t=q.deviceSizes.sort((e,t)=>e-t),n=q.qualities?.sort((e,t)=>e-t);z={...q,allSizes:e,deviceSizes:t,qualities:n}}if(void 0===U)throw Object.defineProperty(Error("images.loaderFile detected but the file is missing default export.\nRead more: https://nextjs.org/docs/messages/invalid-images-config"),"__NEXT_ERROR_CODE",{value:"E163",enumerable:!1,configurable:!0});let B=$.loader||U;delete $.loader,delete $.srcSet;let W="__next_img_default"in B;if(W){if("custom"===z.loader)throw Object.defineProperty(Error(`Image with src "${e}" is missing "loader" prop.
2
+ Read more: https://nextjs.org/docs/messages/next-image-missing-loader`),"__NEXT_ERROR_CODE",{value:"E252",enumerable:!1,configurable:!0})}else{let e=B;B=t=>{let{config:n,...r}=t;return e(r)}}if(S){"fill"===S&&(f=!0);let e={intrinsic:{maxWidth:"100%",height:"auto"},responsive:{width:"100%",height:"auto"}}[S];e&&(b={...b,...e});let n={responsive:"100vw",fill:"100vw"}[S];n&&!t&&(t=n)}let F="",G=o(g),H=o(p);if((R=e)&&"object"==typeof R&&(a(R)||void 0!==R.src)){let t=a(e)?e.default:e;if(!t.src)throw Object.defineProperty(Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include src. Received ${JSON.stringify(t)}`),"__NEXT_ERROR_CODE",{value:"E460",enumerable:!1,configurable:!0});if(!t.height||!t.width)throw Object.defineProperty(Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include height and width. Received ${JSON.stringify(t)}`),"__NEXT_ERROR_CODE",{value:"E48",enumerable:!1,configurable:!0});if(I=t.blurWidth,T=t.blurHeight,v=v||t.blurDataURL,F=t.src,!f)if(G||H){if(G&&!H){let e=G/t.width;H=Math.round(t.height*e)}else if(!G&&H){let e=H/t.height;G=Math.round(t.width*e)}}else G=t.width,H=t.height}let V=!c&&!u&&("lazy"===m||void 0===m);(!(e="string"==typeof e?e:F)||e.startsWith("data:")||e.startsWith("blob:"))&&(n=!0,V=!1),z.unoptimized&&(n=!0),W&&!z.dangerouslyAllowSVG&&e.split("?",1)[0].endsWith(".svg")&&(n=!0);let X=o(x),J=Object.assign(f?{position:"absolute",height:"100%",width:"100%",left:0,top:0,right:0,bottom:0,objectFit:C,objectPosition:P}:{},L?{}:{color:"transparent"},b),Q=A||"empty"===k?null:"blur"===k?`url("data:image/svg+xml;charset=utf-8,${(0,s.getImageBlurSvg)({widthInt:G,heightInt:H,blurWidth:I,blurHeight:T,blurDataURL:v||"",objectFit:J.objectFit})}")`:`url("${k}")`,Z=l.includes(J.objectFit)?"fill"===J.objectFit?"100% 100%":"cover":J.objectFit,K=Q?{backgroundSize:Z,backgroundPosition:J.objectPosition||"50% 50%",backgroundRepeat:"no-repeat",backgroundImage:Q}:{},Y=function({config:e,src:t,unoptimized:n,width:s,quality:i,sizes:l,loader:a}){if(n){if(t.startsWith("/")&&!t.startsWith("//")){let e=(0,r.getDeploymentId)();if(e){let n=t.indexOf("?");if(-1!==n){let r=new URLSearchParams(t.slice(n+1));r.get("dpl")||(r.append("dpl",e),t=t.slice(0,n)+"?"+r.toString())}else t+=`?dpl=${e}`}}return{src:t,srcSet:void 0,sizes:void 0}}let{widths:o,kind:d}=function({deviceSizes:e,allSizes:t},n,r){if(r){let n=/(^|\s)(1?\d?\d)vw/g,s=[];for(let e;e=n.exec(r);)s.push(parseInt(e[2]));if(s.length){let n=.01*Math.min(...s);return{widths:t.filter(t=>t>=e[0]*n),kind:"w"}}return{widths:t,kind:"w"}}return"number"!=typeof n?{widths:e,kind:"w"}:{widths:[...new Set([n,2*n].map(e=>t.find(t=>t>=e)||t[t.length-1]))],kind:"x"}}(e,s,l),c=o.length-1;return{sizes:l||"w"!==d?l:"100vw",srcSet:o.map((n,r)=>`${a({config:e,src:t,quality:i,width:n})} ${"w"===d?n:r+1}${d}`).join(", "),src:a({config:e,src:t,quality:i,width:o[c]})}}({config:z,src:e,unoptimized:n,width:G,quality:X,sizes:t,loader:B}),ee=V?"lazy":m;return{props:{...$,loading:ee,fetchPriority:N,width:G,height:H,decoding:_,className:h,style:{...J,...K},sizes:Y.sizes,srcSet:Y.srcSet,src:y||Y.src},meta:{unoptimized:n,preload:u||c,placeholder:k,fill:f}}}},98879,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"default",{enumerable:!0,get:function(){return a}});let r=e.r(71645),s="u"<typeof window,i=s?()=>{}:r.useLayoutEffect,l=s?()=>{}:r.useEffect;function a(e){let{headManager:t,reduceComponentsToState:n}=e;function a(){if(t&&t.mountedInstances){let e=r.Children.toArray(Array.from(t.mountedInstances).filter(Boolean));t.updateHead(n(e))}}return s&&(t?.mountedInstances?.add(e.children),a()),i(()=>(t?.mountedInstances?.add(e.children),()=>{t?.mountedInstances?.delete(e.children)})),i(()=>(t&&(t._pendingUpdate=a),()=>{t&&(t._pendingUpdate=a)})),l(()=>(t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null),()=>{t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null)})),null}},25633,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={default:function(){return g},defaultHead:function(){return u}};for(var s in r)Object.defineProperty(n,s,{enumerable:!0,get:r[s]});let i=e.r(55682),l=e.r(90809),a=e.r(43476),o=l._(e.r(71645)),d=i._(e.r(98879)),c=e.r(42732);function u(){return[(0,a.jsx)("meta",{charSet:"utf-8"},"charset"),(0,a.jsx)("meta",{name:"viewport",content:"width=device-width"},"viewport")]}function m(e,t){return"string"==typeof t||"number"==typeof t?e:t.type===o.default.Fragment?e.concat(o.default.Children.toArray(t.props.children).reduce((e,t)=>"string"==typeof t||"number"==typeof t?e:e.concat(t),[])):e.concat(t)}e.r(33525);let h=["name","httpEquiv","charSet","itemProp"];function x(e){let t,n,r,s;return e.reduce(m,[]).reverse().concat(u().reverse()).filter((t=new Set,n=new Set,r=new Set,s={},e=>{let i=!0,l=!1;if(e.key&&"number"!=typeof e.key&&e.key.indexOf("$")>0){l=!0;let n=e.key.slice(e.key.indexOf("$")+1);t.has(n)?i=!1:t.add(n)}switch(e.type){case"title":case"base":n.has(e.type)?i=!1:n.add(e.type);break;case"meta":for(let t=0,n=h.length;t<n;t++){let n=h[t];if(e.props.hasOwnProperty(n))if("charSet"===n)r.has(n)?i=!1:r.add(n);else{let t=e.props[n],r=s[n]||new Set;("name"!==n||!l)&&r.has(t)?i=!1:(r.add(t),s[n]=r)}}}return i})).reverse().map((e,t)=>{let n=e.key||t;return o.default.cloneElement(e,{key:n})})}let g=function({children:e}){let t=(0,o.useContext)(c.HeadManagerContext);return(0,a.jsx)(d.default,{reduceComponentsToState:x,headManager:t,children:e})};("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},18556,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"ImageConfigContext",{enumerable:!0,get:function(){return i}});let r=e.r(55682)._(e.r(71645)),s=e.r(87690),i=r.default.createContext(s.imageConfigDefault)},65856,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"RouterContext",{enumerable:!0,get:function(){return r}});let r=e.r(55682)._(e.r(71645)).default.createContext(null)},70965,(e,t,n)=>{"use strict";function r(e,t){let n=e||75;return t?.qualities?.length?t.qualities.reduce((e,t)=>Math.abs(t-n)<Math.abs(e-n)?t:e,t.qualities[0]):n}Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"findClosestQuality",{enumerable:!0,get:function(){return r}})},1948,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"default",{enumerable:!0,get:function(){return l}});let r=e.r(70965),s=e.r(43369);function i({config:e,src:t,width:n,quality:l}){let a=(0,s.getDeploymentId)();if(t.startsWith("/")&&!t.startsWith("//")){let e=t.indexOf("?");if(-1!==e){let n=new URLSearchParams(t.slice(e+1)),r=n.get("dpl");if(r){a=r,n.delete("dpl");let s=n.toString();t=t.slice(0,e)+(s?"?"+s:"")}}}if(t.startsWith("/")&&t.includes("?")&&e.localPatterns?.length===1&&"**"===e.localPatterns[0].pathname&&""===e.localPatterns[0].search)throw Object.defineProperty(Error(`Image with src "${t}" is using a query string which is not configured in images.localPatterns.
3
+ Read more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`),"__NEXT_ERROR_CODE",{value:"E871",enumerable:!1,configurable:!0});let o=(0,r.findClosestQuality)(l,e);return`${e.path}?url=${encodeURIComponent(t)}&w=${n}&q=${o}${t.startsWith("/")&&a?`&dpl=${a}`:""}`}i.__next_img_default=!0;let l=i},5500,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"Image",{enumerable:!0,get:function(){return w}});let r=e.r(55682),s=e.r(90809),i=e.r(43476),l=s._(e.r(71645)),a=r._(e.r(74080)),o=r._(e.r(25633)),d=e.r(8927),c=e.r(87690),u=e.r(18556);e.r(33525);let m=e.r(65856),h=r._(e.r(1948)),x=e.r(18581),g={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],qualities:[75],path:"/_next/image/",loader:"default",dangerouslyAllowSVG:!1,unoptimized:!0};function p(e,t,n,r,s,i,l){let a=e?.src;e&&e["data-loaded-src"]!==a&&(e["data-loaded-src"]=a,("decode"in e?e.decode():Promise.resolve()).catch(()=>{}).then(()=>{if(e.parentElement&&e.isConnected){if("empty"!==t&&s(!0),n?.current){let t=new Event("load");Object.defineProperty(t,"target",{writable:!1,value:e});let r=!1,s=!1;n.current({...t,nativeEvent:t,currentTarget:e,target:e,isDefaultPrevented:()=>r,isPropagationStopped:()=>s,persist:()=>{},preventDefault:()=>{r=!0,t.preventDefault()},stopPropagation:()=>{s=!0,t.stopPropagation()}})}r?.current&&r.current(e)}}))}function f(e){return l.use?{fetchPriority:e}:{fetchpriority:e}}"u"<typeof window&&(globalThis.__NEXT_IMAGE_IMPORTED=!0);let b=(0,l.forwardRef)(({src:e,srcSet:t,sizes:n,height:r,width:s,decoding:a,className:o,style:d,fetchPriority:c,placeholder:u,loading:m,unoptimized:h,fill:g,onLoadRef:b,onLoadingCompleteRef:y,setBlurComplete:w,setShowAltText:j,sizesInput:k,onLoad:v,onError:N,..._},S)=>{let C=(0,l.useCallback)(e=>{e&&(N&&(e.src=e.src),e.complete&&p(e,u,b,y,w,h,k))},[e,u,b,y,w,N,h,k]),P=(0,x.useMergedRef)(S,C);return(0,i.jsx)("img",{..._,...f(c),loading:m,width:s,height:r,decoding:a,"data-nimg":g?"fill":"1",className:o,style:d,sizes:n,srcSet:t,src:e,ref:P,onLoad:e=>{p(e.currentTarget,u,b,y,w,h,k)},onError:e=>{j(!0),"empty"!==u&&w(!0),N&&N(e)}})});function y({isAppRouter:e,imgAttributes:t}){let n={as:"image",imageSrcSet:t.srcSet,imageSizes:t.sizes,crossOrigin:t.crossOrigin,referrerPolicy:t.referrerPolicy,...f(t.fetchPriority)};return e&&a.default.preload?(a.default.preload(t.src,n),null):(0,i.jsx)(o.default,{children:(0,i.jsx)("link",{rel:"preload",href:t.srcSet?void 0:t.src,...n},"__nimg-"+t.src+t.srcSet+t.sizes)})}let w=(0,l.forwardRef)((e,t)=>{let n=(0,l.useContext)(m.RouterContext),r=(0,l.useContext)(u.ImageConfigContext),s=(0,l.useMemo)(()=>{let e=g||r||c.imageConfigDefault,t=[...e.deviceSizes,...e.imageSizes].sort((e,t)=>e-t),n=e.deviceSizes.sort((e,t)=>e-t),s=e.qualities?.sort((e,t)=>e-t);return{...e,allSizes:t,deviceSizes:n,qualities:s,localPatterns:"u"<typeof window?r?.localPatterns:e.localPatterns}},[r]),{onLoad:a,onLoadingComplete:o}=e,x=(0,l.useRef)(a);(0,l.useEffect)(()=>{x.current=a},[a]);let p=(0,l.useRef)(o);(0,l.useEffect)(()=>{p.current=o},[o]);let[f,w]=(0,l.useState)(!1),[j,k]=(0,l.useState)(!1),{props:v,meta:N}=(0,d.getImgProps)(e,{defaultLoader:h.default,imgConf:s,blurComplete:f,showAltText:j});return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(b,{...v,unoptimized:N.unoptimized,placeholder:N.placeholder,fill:N.fill,onLoadRef:x,onLoadingCompleteRef:p,setBlurComplete:w,setShowAltText:k,sizesInput:e.sizes,ref:t}),N.preload?(0,i.jsx)(y,{isAppRouter:!n,imgAttributes:v}):null]})});("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},94909,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={default:function(){return c},getImageProps:function(){return d}};for(var s in r)Object.defineProperty(n,s,{enumerable:!0,get:r[s]});let i=e.r(55682),l=e.r(8927),a=e.r(5500),o=i._(e.r(1948));function d(e){let{props:t}=(0,l.getImgProps)(e,{defaultLoader:o.default,imgConf:{deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],qualities:[75],path:"/_next/image/",loader:"default",dangerouslyAllowSVG:!1,unoptimized:!0}});for(let[e,n]of Object.entries(t))void 0===n&&delete t[e];return{props:t}}let c=a.Image},57688,(e,t,n)=>{t.exports=e.r(94909)},1696,e=>{"use strict";var t=e.i(43476),n=e.i(57688),r=e.i(14876),s=e.i(71645),i=e.i(32324),l=e.i(16549),a=e.i(12408);function o({gradeId:e,lessonId:n,lessonTitle:d,onComplete:c}){let u=Number(e.replace("grade-","")),m=(0,s.useMemo)(()=>(0,l.getChineseDictionaryQuestion)(u,d),[u,d]),h=(0,s.useMemo)(()=>{let e=Array.from(n).reduce((e,t)=>e+t.charCodeAt(0),0);return m.illustration.observationPrompts[e%m.illustration.observationPrompts.length]},[n,m.illustration]),[x,g]=(0,s.useState)(""),p=x===m.entry.character;return(0,t.jsxs)("div",{className:"mt-5 grid gap-5 lg:grid-cols-[0.8fr_1.2fr]",children:[(0,t.jsxs)("section",{className:"rounded-3xl border border-blue-100 bg-gradient-to-br from-blue-50 to-white p-5 text-center shadow-sm",children:[(0,t.jsx)("p",{className:"text-sm font-black text-blue-700",children:u<=2?"看圖找國字":"從真實情境找閱讀線索"}),(0,t.jsxs)("figure",{className:"mx-auto mt-4 max-w-xl overflow-hidden rounded-[1.5rem] border-4 border-white bg-white shadow-warm",children:[(0,t.jsx)("img",{src:m.illustration.src,alt:m.illustration.alt,className:"aspect-[4/3] w-full object-cover",loading:"lazy"}),(0,t.jsx)("figcaption",{className:"bg-white px-4 py-3 text-left text-sm font-bold leading-6 text-stone-600",children:m.illustration.caption})]}),(0,t.jsxs)("div",{className:"mx-auto mt-4 max-w-xl rounded-2xl bg-blue-100/70 p-4 text-left",children:[(0,t.jsx)("p",{className:"text-xs font-black text-blue-700",children:"先說說看"}),(0,t.jsx)("p",{className:"mt-1 text-base font-black leading-7 text-blue-950",children:h}),(0,t.jsxs)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-600",children:["本題線索:",m.entry.pictureDescription]})]}),(0,t.jsx)("div",{className:"mt-5 grid grid-cols-2 gap-3",children:m.options.map(e=>{let n=x===e,r=n&&e===m.entry.character;return(0,t.jsx)("button",{type:"button",onClick:()=>{g(e),(0,a.speakMandarin)(e,{rate:.72}),c?.(e===m.entry.character)},className:`min-h-16 rounded-2xl border-2 text-3xl font-black shadow-sm transition active:scale-[0.98] ${r?"border-green-400 bg-green-100 text-green-900":n?"border-rose-300 bg-rose-50 text-rose-900":"border-white bg-white text-ink hover:border-blue-200"}`,children:e},e)})}),(0,t.jsx)("p",{"aria-live":"polite",className:`mt-4 rounded-2xl p-3 text-sm font-black ${p?"bg-green-50 text-green-900":x?"bg-rose-50 text-rose-900":"bg-white text-stone-500"}`,children:p?"答對了。現在一起聽字音、看字義,再把它放進句子裡。":x?"這個字和情境線索還不相符。回到圖畫找一個更明確的動作或物品。":"先看圖說一句話,再點選最符合線索的國字。點字時會直接播放讀音。"})]}),(0,t.jsxs)("section",{className:`rounded-3xl border p-5 shadow-sm transition ${p?"border-green-100 bg-green-50/80":"border-amber-100 bg-[#fff8ea]/90"}`,children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:"晨光兒童字典"}),(0,t.jsxs)("div",{className:"mt-2 flex items-end gap-4",children:[(0,t.jsx)("span",{className:"text-6xl font-black text-ink",children:p?m.entry.character:"?"}),p?(0,t.jsx)("span",{className:"pb-1 text-xl font-black text-blue-700",children:m.entry.zhuyin}):null]})]}),p?(0,t.jsx)("button",{type:"button",onClick:()=>(0,a.speakMandarin)(`${m.entry.character},${m.entry.word}。${m.entry.example}`,{rate:.7}),className:"rounded-2xl bg-butter px-4 py-3 font-black text-amber-900 shadow-sm transition active:scale-[0.98]",children:"聽國字、詞語和例句"}):null]}),p?(0,t.jsxs)("div",{className:"mt-5 grid gap-3 sm:grid-cols-2",children:[(0,t.jsxs)("div",{className:"rounded-2xl bg-white p-4",children:[(0,t.jsx)("p",{className:"text-xs font-black text-stone-500",children:"部首/筆畫"}),(0,t.jsxs)("p",{className:"mt-1 text-lg font-black text-ink",children:[m.entry.radical," 部/",m.entry.strokes," 畫"]})]}),(0,t.jsxs)("div",{className:"rounded-2xl bg-white p-4",children:[(0,t.jsx)("p",{className:"text-xs font-black text-stone-500",children:"例詞/本課字音"}),(0,t.jsx)("p",{className:"mt-1 text-lg font-black text-ink",children:(0,t.jsx)(i.ZhuyinText,{text:m.entry.word,show:!0,compact:!1})}),(0,t.jsxs)("p",{className:"mt-2 text-sm font-black text-blue-700",children:[m.entry.character,":",m.entry.zhuyin]})]}),(0,t.jsxs)("div",{className:"rounded-2xl bg-white p-4 sm:col-span-2",children:[(0,t.jsx)("p",{className:"text-xs font-black text-stone-500",children:"小朋友字義"}),(0,t.jsx)("p",{className:"mt-1 font-bold leading-7 text-stone-700",children:m.entry.meaning})]}),(0,t.jsxs)("div",{className:"rounded-2xl bg-blue-50 p-4 sm:col-span-2",children:[(0,t.jsx)("p",{className:"text-xs font-black text-blue-700",children:"例句"}),(0,t.jsx)("p",{className:"mt-1 text-lg font-black leading-8 text-blue-900",children:(0,t.jsx)(i.ZhuyinText,{text:m.entry.example,show:!0,compact:!1})})]}),(0,t.jsxs)("div",{className:"rounded-2xl bg-white p-4 sm:col-span-2",children:[(0,t.jsx)("p",{className:"text-xs font-black text-stone-500",children:"寫字提醒"}),(0,t.jsx)("p",{className:"mt-1 font-bold leading-7 text-stone-700",children:m.entry.strokeHint})]})]}):(0,t.jsx)("div",{className:"mt-6 rounded-2xl border-2 border-dashed border-amber-200 bg-white/60 p-8 text-center font-black leading-8 text-amber-900",children:"先完成左邊的看圖猜字,字義、注音、例詞與例句就會出現。"}),p?(0,t.jsxs)("div",{className:"mt-5 flex flex-wrap gap-3",children:[(0,t.jsx)(r.ExportSafeLink,{href:`/handwriting/${n}`,className:"inline-flex min-h-14 items-center justify-center rounded-2xl bg-coral px-6 py-3 text-lg font-black text-white shadow-sm",children:"把這個字寫一次"}),(0,t.jsx)("button",{type:"button",onClick:()=>(0,a.speakMandarin)(`${m.entry.character},${m.entry.zhuyin}。${m.entry.meaning}。例詞,${m.entry.word}。例句,${m.entry.example}`,{rate:.68}),className:"inline-flex min-h-14 items-center justify-center rounded-2xl bg-butter px-5 py-3 font-black text-amber-900 shadow-sm",children:"聽完整解說"})]}):null]})]})}var d=e.i(47106),c=e.i(86540),u=e.i(65208),m=e.i(19328);let h={green:"border-green-100 bg-green-50/90",cream:"border-amber-100 bg-[#fff8ea]/90",blue:"border-blue-100 bg-blue-50/80"};function x(e){return`chenguang-lesson-actions-${e}`}e.s(["InteractiveLessonCards",0,function({lessonId:e,gradeId:l,subjectId:g,title:p,todayFocus:f,example:b,blocks:y}){let[w,j]=(0,s.useState)([]),[k,v]=(0,s.useState)(0),[N,_]=(0,s.useState)(""),[S,C]=(0,s.useState)(!1),[P,E]=(0,s.useState)(!1),[O,$]=(0,s.useState)(""),[M,R]=(0,s.useState)(!1),z="english"===g?"en-US":"zh-TW",I=(0,s.useMemo)(()=>(function(e,t,n,r,s,i){if("english"===e){let e=(0,u.getEnglishLessonExperience)(i,t,r);return[{id:"learn",title:"先看懂今天的英文",body:e.sentence,tone:"blue",practiceText:e.sentence,kind:"learn"},{id:"check",title:e.imageSrc?"看圖選一句英文":"選出正確意思",body:e.childPrompt,tone:"cream",practiceText:e.sentence,kind:"english-check"},{id:"speak",title:"輪到孩子開口",body:e.sentence,tone:"blue",practiceText:e.sentence,kind:"speak"},{id:"apply",title:"把英文放進生活",body:e.childPrompt,tone:"green",practiceText:e.sentence,kind:"apply"}]}if("chinese"===e){let e=function(e,t){let n=t.match(/「([^」]{1,12})」/)?.[1];if(n)return n;let r=t.split(/[。!?]/)[0]?.trim();return r&&r.length<=18?r:e}(t,r);return[{id:"learn",title:"看圖認字,打開小字典",body:r,tone:"blue",practiceText:e,kind:"chinese-word"},{id:"speak",title:"讀給系統聽",body:e,tone:"green",practiceText:e,kind:"speak"},{id:"handwriting",title:"動手寫一次",body:`在手寫板練習「${e}」,完成後會依這次筆跡重新評分。`,tone:"cream",practiceText:e,kind:"handwriting"}]}return[{id:"learn",title:"先看生活例子",body:r,tone:"cream",practiceText:t,kind:"learn"},{id:"math-check",title:"自己動手算一題",body:s.find(e=>e.heading.includes("任務"))?.body??n,tone:"blue",practiceText:t,kind:"math-check"},{id:"apply",title:"說說看怎麼想",body:n,tone:"green",practiceText:t,kind:"apply"}]})(g,p,f,b,y,l),[y,b,l,g,p,f]),T=(0,s.useMemo)(()=>(0,u.getEnglishLessonExperience)(l,p,b),[b,l,p]),D=(0,s.useMemo)(()=>(0,u.getEnglishCheck)(T,`${l}:${p}`),[T,l,p]),L=(0,s.useMemo)(()=>(0,m.getMathLessonTask)(p,l),[l,p]);(0,s.useEffect)(()=>{try{let t=window.localStorage.getItem(x(e)),n=(t?JSON.parse(t):[]).filter(e=>I.some(t=>t.id===e)),r=I.findIndex(e=>!n.includes(e.id));j(n),v(-1===r?I.length:r)}catch{j([]),v(0)}},[I,e]),(0,s.useEffect)(()=>{_(""),C(!1),E(!1),$(""),R(!1)},[k]);let A=I.length>0&&k>=I.length,U=A?null:I[k],q=I.filter(e=>w.includes(e.id)).length,B=0===I.length?0:Math.round(q/I.length*100),W=N===D.answer,F=O===L.answer,G=!U||"chinese-word"!==U.kind&&"english-check"!==U.kind&&"math-check"!==U.kind&&"speak"!==U.kind||"chinese-word"===U.kind&&M||"english-check"===U.kind&&W||"math-check"===U.kind&&F||"speak"===U.kind&&S&&P;function H(t){j(t),window.localStorage.setItem(x(e),JSON.stringify(t))}return(0,t.jsxs)("section",{className:"mt-8 rounded-[1.75rem] border border-softline/80 bg-white/90 p-5 shadow-warm md:p-8",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:"一步一步學"}),(0,t.jsx)("h2",{className:"mt-1 text-3xl font-black text-ink",children:"一次只做眼前這一步"}),(0,t.jsx)("p",{className:"mt-2 text-base font-bold text-stone-500",children:"看懂、自己作答、再親自開口或動手完成。"})]}),(0,t.jsx)("div",{className:"shrink-0 rounded-2xl bg-cream px-4 py-3 text-base font-black text-amber-900",children:A?"本課完成":`第 ${k+1} 步,共 ${I.length} 步`})]}),(0,t.jsx)("div",{className:"mt-5 h-3 overflow-hidden rounded-full bg-cream","aria-label":`課程完成 ${B}%`,children:(0,t.jsx)("div",{className:"h-full rounded-full bg-coral transition-all duration-300",style:{width:`${B}%`}})}),A?(0,t.jsxs)("div",{className:"mt-6 rounded-[1.5rem] border border-green-100 bg-green-50/90 p-6 text-center md:p-8",children:[(0,t.jsxs)("p",{className:"text-base font-black text-green-700",children:["完成 ",q," 個小任務"]}),(0,t.jsx)("h3",{className:"mt-2 text-3xl font-black text-ink",children:"今天這一課完成了"}),(0,t.jsx)("p",{className:"mx-auto mt-3 max-w-2xl text-lg font-bold leading-8 text-green-900",children:"接著做幾題練習,把剛才真正用過的內容記得更清楚。"}),(0,t.jsxs)("div",{className:"mt-6 flex flex-wrap justify-center gap-3",children:[(0,t.jsx)(r.ExportSafeLink,{className:"rounded-2xl bg-coral px-6 py-4 text-lg font-black text-white shadow-sm transition hover:brightness-105",href:`/practice/${e}`,children:"開始練習題"}),"chinese"===g?(0,t.jsx)(r.ExportSafeLink,{className:"rounded-2xl bg-butter px-6 py-4 text-lg font-black text-amber-900 shadow-sm transition hover:bg-amber-100",href:`/handwriting/${e}`,children:"前往手寫板"}):null,(0,t.jsx)("button",{className:"rounded-2xl bg-white px-6 py-4 text-lg font-black text-amber-900 shadow-sm ring-1 ring-amber-100",type:"button",onClick:function(){H([]),v(0)},children:"再學一次"})]})]}):U?(0,t.jsxs)("article",{className:`mt-6 rounded-[1.5rem] border p-5 md:p-7 ${h[U.tone]}`,children:[(0,t.jsxs)("p",{className:"text-sm font-black text-amber-700",children:["第 ",k+1," 步"]}),(0,t.jsx)("h3",{className:"mt-1 text-3xl font-black text-ink",children:U.title}),"english"===g&&"learn"===U.kind?(0,t.jsxs)("div",{className:"mt-5 grid gap-5 lg:grid-cols-[1fr_auto] lg:items-center",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>(0,a.speakEnglish)(T.sentence,{rate:.72}),className:"rounded-3xl bg-white/85 p-6 text-left shadow-sm transition hover:bg-white",children:[(0,t.jsx)("span",{className:"block text-3xl font-black leading-relaxed text-blue-700",children:T.sentence}),(0,t.jsx)("span",{className:"mt-3 block text-lg font-black text-stone-700",children:T.meaning}),(0,t.jsx)("span",{className:"mt-2 block text-sm font-bold text-amber-700",children:"點這裡才會播放標準發音"})]}),(0,t.jsx)("div",{className:"rounded-2xl bg-green-50 px-5 py-4 font-bold leading-7 text-green-900",children:T.childPrompt})]}):null,"english"===g&&"english-check"===U.kind?(0,t.jsxs)("div",{className:"mt-5",children:[T.imageSrc?(0,t.jsx)("div",{className:"overflow-hidden rounded-3xl border border-white bg-white shadow-sm",children:(0,t.jsx)(n.default,{src:T.imageSrc,alt:T.imageAlt??"英文看圖練習",width:1536,height:820,className:"h-auto max-h-[420px] w-full object-cover object-center",priority:!1})}):(0,t.jsx)("div",{className:"rounded-3xl bg-white/85 p-6 text-center text-3xl font-black leading-relaxed text-blue-700 shadow-sm",children:T.sentence}),(0,t.jsx)("h4",{className:"mt-5 text-2xl font-black text-ink",children:D.question}),(0,t.jsx)("div",{className:"mt-4 grid gap-3 sm:grid-cols-2",children:D.options.map((e,n)=>{let r=N===e,s=r&&e===D.answer,i=r&&e!==D.answer;return(0,t.jsxs)("button",{type:"button",onClick:()=>{_(e),D.optionsAreEnglish?(0,a.speakEnglish)(e,{rate:.72}):(0,a.speakMandarin)(e,{rate:.78})},className:`min-h-20 rounded-2xl border-2 px-5 py-4 text-left text-lg font-black transition ${s?"border-green-400 bg-green-100 text-green-900":i?"border-rose-300 bg-rose-50 text-rose-900":r?"border-coral bg-orange-50":"border-white bg-white hover:border-blue-200 hover:bg-blue-50"}`,children:[(0,t.jsx)("span",{className:"mr-3 inline-grid h-8 w-8 place-items-center rounded-full bg-blue-50 text-sm text-blue-800",children:String.fromCharCode(65+n)}),e]},e)})}),(0,t.jsx)("div",{"aria-live":"polite",className:`mt-4 rounded-2xl p-4 font-black ${W?"bg-green-50 text-green-900":N?"bg-rose-50 text-rose-900":"bg-white/70 text-stone-600"}`,children:W?`答對了。${T.sentence} 的意思是「${T.meaning}」`:N?"這一句不符合,再看一次圖片或英文意思。":"請選一個答案;選取後會變色並播放。"})]}):null,"speak"===U.kind?(0,t.jsxs)("div",{className:"mt-5",children:[(0,t.jsxs)("div",{className:"rounded-3xl bg-white/85 p-5 text-center shadow-sm",children:[(0,t.jsx)("p",{className:`font-black leading-relaxed ${"english"===g?"text-3xl text-blue-700":"text-2xl text-ink"}`,children:U.practiceText}),"english"===g?(0,t.jsx)("p",{className:"mt-2 text-lg font-black text-stone-600",children:T.meaning}):(0,t.jsx)(i.ZhuyinText,{text:U.practiceText,show:!0,compact:!1,className:"mt-3 justify-center"})]}),(0,t.jsx)(d.SpeechPracticeButton,{expected:U.practiceText,lang:z,speakLabel:"聽標準發音",listenLabel:"按下麥克風,輪到我說",targetLabel:"english"===g?"我要朗讀":"我要讀",onResult:()=>{C(!0),E(!1)},onReviewed:()=>E(!0)}),S&&!P?(0,t.jsx)("p",{className:"mt-3 rounded-2xl bg-rose-50 p-3 font-bold text-rose-900",children:"先留在這一步再試一次;標準發音不會自動播放。"}):null]}):null,"chinese"===g&&"chinese-word"===U.kind?(0,t.jsx)(o,{gradeId:l,lessonId:e,lessonTitle:p,onComplete:R}):null,"handwriting"===U.kind?(0,t.jsxs)("div",{className:"mt-5 rounded-3xl bg-white/85 p-6 shadow-sm",children:[(0,t.jsx)("p",{className:"text-lg font-bold leading-8 text-stone-700",children:U.body}),(0,t.jsx)(r.ExportSafeLink,{href:`/handwriting/${e}`,className:"mt-4 inline-flex min-h-14 items-center justify-center rounded-2xl bg-coral px-6 py-3 text-lg font-black text-white shadow-sm",children:"打開國語手寫板"})]}):null,"math-check"===U.kind?(0,t.jsxs)("div",{className:"mt-5",children:[(0,t.jsxs)("div",{className:"rounded-3xl bg-white/85 p-6 text-center shadow-sm",children:[(0,t.jsx)("p",{className:"text-2xl font-black leading-10 text-ink",children:L.question}),(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(c.MathQuestionVisual,{visual:L.visual,compact:!0})})]}),(0,t.jsx)("div",{className:"mt-4 grid gap-3 sm:grid-cols-3",children:L.options.map(e=>{let n=O===e,r=n&&e===L.answer;return(0,t.jsx)("button",{type:"button",onClick:()=>$(e),className:`min-h-16 rounded-2xl border-2 px-4 py-3 text-lg font-black ${r?"border-green-400 bg-green-100 text-green-900":n?"border-rose-300 bg-rose-50 text-rose-900":"border-white bg-white text-amber-900 hover:border-amber-200"}`,children:e},e)})}),O?(0,t.jsx)("p",{className:`mt-4 rounded-2xl p-4 font-bold ${F?"bg-green-50 text-green-900":"bg-rose-50 text-rose-900"}`,children:F?`答對了。${L.explanation}`:"再數一次或把算式慢慢拆開看看。"}):null]}):null,"apply"===U.kind&&"math"!==g?(0,t.jsxs)("button",{type:"button",onClick:()=>{var e;return e=U.body,void(0,a.speakText)(e,{lang:z,rate:"english"===g?.72:.78,pitch:"english"===g?1:1.05})},className:"mt-5 block w-full rounded-3xl bg-white/80 p-5 text-left text-xl font-bold leading-9 text-stone-700 shadow-sm transition hover:bg-white",children:[U.body,(0,t.jsx)("span",{className:"mt-3 block text-sm font-black text-amber-700",children:"點一下可以聽內容"})]}):null,("apply"===U.kind||"learn"===U.kind)&&"math"===g?(0,t.jsxs)("div",{className:"mt-5 rounded-3xl bg-white/85 p-5 text-xl font-bold leading-9 text-stone-700 shadow-sm",children:[U.body,(0,t.jsx)("span",{className:"mt-3 block text-sm font-black text-blue-700",children:"數學用觀察、操作和計算完成,不要求孩子朗讀。"})]}):null,(0,t.jsxs)("div",{className:"mt-6 flex flex-wrap items-center justify-between gap-3",children:[k>0?(0,t.jsx)("button",{className:"rounded-2xl bg-white px-5 py-3 font-black text-amber-900 shadow-sm",type:"button",onClick:function(){v(e=>Math.max(0,e-1))},children:"上一步"}):(0,t.jsx)("span",{}),(0,t.jsx)("button",{disabled:!G,className:"rounded-2xl bg-coral px-6 py-4 text-lg font-black text-white shadow-sm transition hover:brightness-105 active:scale-[0.99] disabled:cursor-not-allowed disabled:bg-stone-300 disabled:text-stone-600",type:"button",onClick:function(){U&&G&&(H(w.includes(U.id)?w:[...w,U.id]),v(e=>Math.min(I.length,e+1)))},children:G?k===I.length-1?"完成這一課":"完成,下一步":"speak"===U.kind?"先完成口說辨識":"chinese-word"===U.kind?"先找出正確國字":"先答對這一題"})]})]}):null]})}],1696)}]);
_next/static/chunks/0392f73_55yx4.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,52109,e=>{"use strict";var t=e.i(43476),s=e.i(71645);let l=[{id:"vocabulary",step:1,icon:"Aa",label:"字彙",hint:"看意思、KK 音標與例句",action:"開始認單字"},{id:"listening",step:2,icon:"聽",label:"聽力",hint:"聽清楚,再選出正確單字",action:"開始聽力"},{id:"speaking",step:3,icon:"說",label:"口說",hint:"自己開口,讓系統辨識",action:"開始口說"},{id:"reading",step:4,icon:"讀",label:"閱讀",hint:"一次讀懂一個生活句型",action:"開始閱讀"},{id:"game",step:5,icon:"玩",label:"遊戲",hint:"用變化題型快速練習",action:"開始遊戲"},{id:"checkpoint",step:6,icon:"10",label:"自學闖關",hint:"完成今天的 10 題任務",action:"開始闖關"}],n={禮貌:{eyebrow:"Everyday English",title:"Hello, New Day!",titleZh:"有禮貌地打招呼",description:"從每天都會用到的問候開始,學會聽、說,也知道什麼時候使用。",accent:"coral"},校園:{eyebrow:"School English",title:"My School Day",titleZh:"我的校園生活",description:"把教室、老師、同學和學用品放進生活句子,讓英文在學校也用得上。",accent:"blue"},文具:{eyebrow:"Ready for Class",title:"What Is in My Bag?",titleZh:"書包裡有什麼",description:"拿起身邊的學用品邊看邊說,單字就不再只是課本上的文字。",accent:"yellow"},顏色:{eyebrow:"Colors Around Me",title:"I See Colors",titleZh:"找找生活中的顏色",description:"觀察身邊的顏色,再用簡單英文說出來。",accent:"coral"},家人:{eyebrow:"My Family",title:"Meet My Family",titleZh:"介紹我的家人",description:"從最熟悉的家人開始,練習用一句完整英文介紹身邊的人。",accent:"green"},食物:{eyebrow:"Food Time",title:"What Do You Like?",titleZh:"說說喜歡的食物",description:"把吃飯和點心時間變成英文練習,說出喜歡、想要和需要。",accent:"yellow"},心情:{eyebrow:"How I Feel",title:"I Am Happy",titleZh:"說出今天的心情",description:"認識自己的感受,也練習用英文把心情說清楚。",accent:"green"},動作:{eyebrow:"I Can Do It",title:"Read, Write and Play",titleZh:"我會做的日常動作",description:"用每天真的會做的動作學英文,邊做邊說最容易記住。",accent:"blue"},動物:{eyebrow:"Animal Friends",title:"Animals Around Us",titleZh:"認識動物朋友",description:"從熟悉的動物開始,練習看、聽和說出牠們的英文名稱。",accent:"green"},天氣:{eyebrow:"Weather Today",title:"How Is the Weather?",titleZh:"今天是什麼天氣",description:"每天看一眼窗外,就能把天氣變成真正會用的生活英文。",accent:"blue"},場所:{eyebrow:"Around Town",title:"Where Are We Going?",titleZh:"生活中的地點",description:"認識常去的地方,練習用英文說出要去哪裡。",accent:"yellow"}},a={eyebrow:"Words for Today",title:"English in My Day",titleZh:"今天的生活英文",description:"先理解意思,再放進生活句子;每天一小步,英文會慢慢變熟悉。",accent:"coral"};function r({active:e,completed:s=[],onChange:n}){return(0,t.jsxs)("nav",{"aria-label":"英文學習功能",children:[(0,t.jsxs)("div",{className:"mb-4 flex flex-wrap items-end justify-between gap-2 px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-xs font-black uppercase text-amber-700",children:"Learning Zone"}),(0,t.jsx)("h2",{className:"mt-1 text-2xl font-black text-ink",children:"今天想練哪一種?"})]}),(0,t.jsx)("p",{className:"text-sm font-bold text-stone-500",children:"每次只開一個任務,完成後再前進。"})]}),(0,t.jsx)("ol",{className:"grid grid-cols-2 gap-3 sm:grid-cols-3 xl:grid-cols-6",children:l.map(l=>{let a=l.id===e,r=s.includes(l.id);return(0,t.jsx)("li",{children:(0,t.jsxs)("button",{type:"button",onClick:()=>n(l.id),"aria-current":a?"step":void 0,className:`flex min-h-32 w-full flex-col items-start justify-between rounded-3xl border px-4 py-4 text-left transition hover:-translate-y-0.5 active:translate-y-0 active:scale-[0.99] ${a?"border-coral bg-coral text-white shadow-[0_14px_30px_rgba(244,124,112,0.22)]":r?"border-green-100 bg-green-50 text-green-900":"border-softline bg-white/85 text-stone-700 hover:border-amber-200 hover:bg-cream"}`,children:[(0,t.jsxs)("span",{className:"flex w-full items-start justify-between gap-2",children:[(0,t.jsx)("span",{className:`grid h-11 min-w-11 place-items-center rounded-2xl px-2 text-sm font-black ${a?"bg-white/20":"bg-white shadow-sm"}`,children:l.icon}),(0,t.jsx)("span",{className:`rounded-full px-2 py-1 text-[11px] font-black ${a?"bg-white/20":r?"bg-white text-green-700":"bg-cream text-amber-700"}`,children:r?"已完成":`第 ${l.step} 站`})]}),(0,t.jsxs)("span",{className:"mt-3",children:[(0,t.jsx)("strong",{className:"block text-lg font-black",children:l.label}),(0,t.jsx)("span",{className:`mt-1 block text-xs font-bold leading-5 ${a?"text-white/85":"text-stone-500"}`,children:l.hint})]})]})},l.id)})})]})}var i=e.i(74761),o=e.i(62164),c=e.i(12408);let d={coral:"from-orange-50 via-white to-rose-50 text-coral",blue:"from-blue-50 via-white to-cyan-50 text-blue-700",green:"from-green-50 via-white to-emerald-50 text-green-700",yellow:"from-amber-50 via-white to-yellow-50 text-amber-700"};function x({topic:e,words:s,grade:l,groupLabel:n,onStart:a}){let r=s[0],m=r?.example??"Let us learn English.",h=r?(0,i.getKKPhonetic)(r.word,r.phonetic):"";return(0,t.jsx)("section",{className:`overflow-hidden rounded-[2rem] border border-softline bg-gradient-to-br ${d[e.accent]} shadow-warm`,children:(0,t.jsxs)("div",{className:"grid lg:grid-cols-[1.08fr_0.92fr]",children:[(0,t.jsxs)("div",{className:"p-6 md:p-9 lg:p-10",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsxs)("span",{className:"rounded-full bg-white px-3 py-1 text-xs font-black text-amber-800 shadow-sm",children:["小",l,"|",e.category]}),(0,t.jsx)("span",{className:"text-xs font-black text-stone-500",children:n})]}),(0,t.jsx)("p",{className:"mt-6 text-sm font-black uppercase text-amber-700",children:e.eyebrow}),(0,t.jsx)("h2",{className:"mt-2 text-4xl font-black leading-tight text-ink md:text-5xl",children:e.title}),(0,t.jsx)("p",{className:"mt-3 text-2xl font-black text-stone-700",children:e.titleZh}),(0,t.jsx)("p",{className:"mt-4 max-w-2xl text-base font-bold leading-8 text-stone-600",children:e.description}),(0,t.jsxs)("div",{className:"mt-6 flex flex-wrap gap-3",children:[(0,t.jsx)("button",{type:"button",onClick:a,className:"min-h-14 rounded-2xl bg-coral px-6 py-3 font-black text-white shadow-[0_14px_30px_rgba(244,124,112,0.24)] transition hover:brightness-105 active:scale-[0.98]",children:"開始今天的主題"}),(0,t.jsx)("button",{type:"button",onClick:()=>(0,c.speakEnglish)(m,{rate:.72}),className:"min-h-14 rounded-2xl bg-butter px-6 py-3 font-black text-amber-900 shadow-sm transition hover:bg-amber-100 active:scale-[0.98]",children:"聽主題句"})]})]}),(0,t.jsx)("div",{className:"relative flex min-h-[320px] items-center justify-center border-t border-white/80 bg-white/40 p-6 lg:border-l lg:border-t-0 md:p-9",children:(0,t.jsxs)("div",{className:"w-full max-w-lg rounded-[2rem] border border-white bg-white/85 p-6 shadow-[0_24px_60px_rgba(93,75,55,0.12)] backdrop-blur",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-xs font-black uppercase text-amber-700",children:"Today's English"}),(0,t.jsx)("button",{type:"button",onClick:()=>r&&(0,c.speakEnglish)(r.word,{rate:.75}),className:"mt-2 text-left text-5xl font-black leading-tight text-blue-700 transition hover:text-blue-800",children:r?.word??"hello"}),(0,t.jsxs)("p",{className:"mt-2 text-base font-black text-blue-500",children:["KK ",h||"音標整理中"]}),(0,t.jsx)("p",{className:"mt-2 text-xl font-black text-ink",children:r?.zh??"你好"})]}),(0,t.jsx)("span",{className:"grid h-16 w-16 shrink-0 place-items-center rounded-2xl bg-cream text-xl font-black text-amber-900 shadow-sm",children:"Aa"})]}),(0,t.jsxs)("button",{type:"button",onClick:()=>(0,c.speakEnglish)(m,{rate:.72}),className:"mt-6 w-full rounded-2xl bg-blue-50 px-5 py-4 text-left transition hover:bg-blue-100",children:[(0,t.jsx)("span",{className:"block text-lg font-black text-blue-800",children:m}),(0,t.jsx)("span",{className:"mt-1 block text-sm font-bold text-stone-600",children:(0,o.getEnglishExampleZh)(m,r?.zh,r?.usage)})]}),(0,t.jsx)("div",{className:"mt-4 flex flex-wrap gap-2",children:s.slice(1,5).map(e=>(0,t.jsx)("button",{type:"button",onClick:()=>(0,c.speakEnglish)(e.word,{rate:.75}),className:"rounded-full bg-cream px-4 py-2 text-sm font-black text-amber-900 transition hover:bg-butter",children:e.word},e.word))})]})})]})})}var m=e.i(47106),h=e.i(32324);function b({words:e,grade:l,onComplete:n}){let[a,r]=(0,s.useState)(0),[d,x]=(0,s.useState)(!1),g=e[a]??e[0];if((0,s.useEffect)(()=>{r(0),x(!1)},[e]),!g)return(0,t.jsx)("p",{className:"rounded-2xl bg-cream p-5 font-bold text-stone-600",children:"目前沒有可練習的單字。"});let p=(0,i.getKKPhonetic)(g.word,g.phonetic),u=(0,o.getEnglishExampleZh)(g.example,g.zh,g.usage),f=a===e.length-1;function w(t){r(s=>Math.min(e.length-1,Math.max(0,s+t))),x(!1)}return(0,t.jsxs)("section",{className:"rounded-[2rem] border border-softline bg-white/90 p-5 shadow-warm md:p-8",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{className:"text-sm font-black text-amber-700",children:["Word ",a+1," / ",e.length]}),(0,t.jsx)("h3",{className:"mt-1 text-3xl font-black text-ink",children:"一次專心學一個"})]}),(0,t.jsxs)("div",{className:"flex gap-2","aria-label":"切換單字",children:[(0,t.jsx)("button",{type:"button",onClick:()=>w(-1),disabled:0===a,className:"grid h-12 w-12 place-items-center rounded-2xl bg-cream text-xl font-black text-amber-900 shadow-sm disabled:opacity-35","aria-label":"上一個單字",children:"←"}),(0,t.jsx)("button",{type:"button",onClick:()=>w(1),disabled:f,className:"grid h-12 w-12 place-items-center rounded-2xl bg-cream text-xl font-black text-amber-900 shadow-sm disabled:opacity-35","aria-label":"下一個單字",children:"→"})]})]}),(0,t.jsxs)("div",{className:"mt-6 grid gap-5 lg:grid-cols-[0.85fr_1.15fr]",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>(0,c.speakEnglish)(g.word,{rate:.74}),className:"group flex min-h-64 flex-col items-center justify-center rounded-[2rem] border border-blue-100 bg-blue-50 p-6 text-center transition hover:bg-blue-100 active:scale-[0.99]",children:[(0,t.jsx)("span",{className:"rounded-full bg-white px-4 py-2 text-xs font-black text-green-800 shadow-sm",children:g.category}),(0,t.jsx)("strong",{className:"mt-5 text-5xl font-black leading-tight text-blue-700 md:text-6xl",children:g.word}),(0,t.jsxs)("span",{className:"mt-3 rounded-full bg-white/85 px-4 py-2 text-lg font-black text-blue-600 shadow-sm",children:["KK ",p||"音標整理中"]}),(0,t.jsx)("span",{className:"mt-5 rounded-full bg-white px-4 py-2 text-sm font-black text-amber-800 shadow-sm",children:"點一下聽發音"})]}),(0,t.jsxs)("div",{className:"rounded-[2rem] bg-cream p-5 md:p-7",children:[(0,t.jsx)("p",{className:"text-xs font-black text-amber-700",children:"中文意思"}),(0,t.jsx)("div",{className:"mt-2 text-3xl font-black text-ink",children:(0,t.jsx)(h.ZhuyinText,{text:g.zh,show:l<=6})}),(0,t.jsxs)("p",{className:"mt-3 font-bold leading-7 text-stone-600",children:["使用時機:",g.usage]}),!1===g.verifiedExample?(0,t.jsxs)("div",{className:"mt-5 rounded-2xl bg-white px-5 py-4 text-left shadow-sm",children:[(0,t.jsx)("span",{className:"block font-black text-stone-700",children:"先把字音和字義學會"}),(0,t.jsx)("span",{className:"mt-1 block text-sm font-bold leading-6 text-stone-500",children:"未經教師確認的例句不會顯示給孩子。"})]}):(0,t.jsxs)("button",{type:"button",onClick:()=>(0,c.speakEnglish)(g.example,{rate:.72}),className:"mt-5 w-full rounded-2xl bg-white px-5 py-4 text-left shadow-sm transition hover:bg-amber-50",children:[(0,t.jsx)("span",{className:"block text-lg font-black text-amber-900",children:g.example}),(0,t.jsxs)("span",{className:"mt-1 block text-sm font-bold leading-6 text-stone-600",children:["意思:",u,"|點一下聽例句"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>x(e=>!e),className:`mt-4 min-h-12 rounded-2xl px-5 py-3 font-black shadow-sm transition ${d?"bg-coral text-white":"bg-mint text-green-800 hover:bg-green-100"}`,children:d?"收起口說練習":"換我唸給系統聽"})]})]}),d?(0,t.jsx)(m.SpeechPracticeButton,{expected:g.word,lang:"en-US",speakLabel:"再聽一次",listenLabel:"按下麥克風,我要說",targetLabel:"我要朗讀的單字"}):null,(0,t.jsx)("div",{className:"mt-6 flex justify-end",children:(0,t.jsx)("button",{type:"button",onClick:()=>f?n():w(1),className:"min-h-14 rounded-2xl bg-coral px-7 py-3 font-black text-white shadow-[0_12px_28px_rgba(244,124,112,0.22)] transition hover:brightness-105 active:scale-[0.98]",children:f?"單字完成,練句型":"記住了,下一個"})})]})}var g=e.i(10400),p=e.i(71556),u=e.i(30599),f=e.i(42391),w=e.i(73887),j=e.i(82836),k=e.i(97750);function N(e){return e.includes("___")}function y({sentences:e,defaultBlankText:l="name",onSentenceSaved:n,onQuizStart:a,onComplete:r}){let[i,d]=(0,s.useState)(0),[x,b]=(0,s.useState)({}),[g,p]=(0,s.useState)("先看懂中文意思,再聽一次,最後換你開口說。"),[u,f]=(0,s.useState)(!1);(0,s.useEffect)(()=>{d(0),f(!1)},[e]);let w=e[i]??"",j=x[w]??l,k=N(w)?w.replace("___",j.trim()||"___"):w,v=(0,o.getEnglishExampleZh)(k),S=!N(k),C=i===e.length-1;function $(){if(!S)return void p("請先把空格填好,再播放完整句子。");let e=(0,c.speakEnglish)(k,{rate:.72});p(e.ok?`正在播放:${k}`:e.message)}function E(t){0!==e.length&&(d(s=>(s+t+e.length)%e.length),f(!1),p("新句子準備好了。先理解、再聽、最後開口說。"))}return w?(0,t.jsxs)("section",{className:"rounded-[2rem] border border-softline bg-white/90 p-5 shadow-warm md:p-8",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{className:"text-sm font-black text-amber-700",children:["Sentence ",i+1," / ",e.length]}),(0,t.jsx)("h3",{className:"mt-1 text-3xl font-black text-ink",children:"一句一句練開口"})]}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)("button",{type:"button",onClick:()=>E(-1),className:"grid h-12 w-12 place-items-center rounded-2xl bg-cream text-xl font-black text-amber-900 shadow-sm","aria-label":"上一句",children:"←"}),(0,t.jsx)("button",{type:"button",onClick:()=>E(1),className:"grid h-12 w-12 place-items-center rounded-2xl bg-cream text-xl font-black text-amber-900 shadow-sm","aria-label":"下一句",children:"→"})]})]}),(0,t.jsxs)("article",{className:"mt-6 rounded-[2rem] border border-blue-100 bg-blue-50/70 p-5 md:p-7",children:[(0,t.jsxs)("button",{type:"button",onClick:$,className:"w-full rounded-[1.5rem] bg-white px-5 py-7 text-center text-3xl font-black leading-relaxed text-blue-700 shadow-sm transition hover:bg-blue-50 active:scale-[0.99]","aria-label":`播放句子 ${k}`,children:[k,(0,t.jsx)("span",{className:"mt-3 block text-sm font-black text-amber-700",children:"點一下聽完整句子"})]}),(0,t.jsxs)("div",{className:"mt-4 rounded-2xl bg-cream px-5 py-4",children:[(0,t.jsx)("span",{className:"text-xs font-black text-amber-800",children:"中文意思與注音協助"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg leading-8 text-ink",children:(0,t.jsx)(h.ZhuyinText,{text:v})})]}),N(w)?(0,t.jsxs)("label",{className:"mt-4 grid gap-2 rounded-2xl bg-white px-4 py-4 shadow-sm",children:[(0,t.jsx)("span",{className:"text-sm font-black text-blue-700",children:"這一句有空格,填入你的英文名字"}),(0,t.jsx)("input",{value:j,onChange:e=>{b(t=>({...t,[w]:e.target.value})),f(!1)},className:"rounded-xl border border-blue-100 bg-blue-50 px-4 py-3 text-lg font-black text-blue-800 outline-none transition focus:border-blue-300 focus:bg-white",placeholder:"輸入英文名字","aria-label":`填入 ${w} 的空格`})]}):null,(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap gap-2",children:[(0,t.jsx)("button",{type:"button",onClick:$,className:"rounded-2xl bg-butter px-5 py-3 text-sm font-black text-amber-900 shadow-sm",children:"聽標準句子"}),(0,t.jsx)("button",{type:"button",onClick:function(){if(!S)return void p("請先完成空格,才能加入今日句子。");let e={id:`sentence-${Date.now()}`,date:new Date().toISOString(),sentence:k,type:"daily-sentence"};try{let t=window.localStorage.getItem("chenguang-daily-sentences"),s=t?JSON.parse(t):[];window.localStorage.setItem("chenguang-daily-sentences",JSON.stringify([e,...s].slice(0,30))),p(`已加入今天:${k}`),n?.(k)}catch{p("這台裝置暫時無法儲存,但仍然可以繼續練習。")}},className:"rounded-2xl bg-mint px-5 py-3 text-sm font-black text-green-800 shadow-sm",children:"加入今日句子"})]}),S?(0,t.jsx)(m.SpeechPracticeButton,{expected:k,lang:"en-US",speakLabel:"再聽一次",listenLabel:"按下麥克風,換我說",targetLabel:"我要朗讀的句子",compact:!0,showParentControls:!1,onResult:e=>{f(e.ok),p(e.ok?"系統有聽懂這一句。看完辨識結果,就可以前進。":"還差一點,先看系統聽到什麼,再放慢速度試一次。"),a?.(k)}}):(0,t.jsx)("p",{className:"mt-4 rounded-2xl bg-cream p-4 text-sm font-bold text-amber-900",children:"先填好空格,口說按鈕就會出現。"}),(0,t.jsx)("div",{className:"mt-5 flex justify-end",children:(0,t.jsx)("button",{type:"button",disabled:!u,onClick:function(){u?C?r?.():E(1):p("先讓系統聽到你的朗讀,再前進下一句。")},className:"min-h-14 rounded-2xl bg-coral px-6 py-3 font-black text-white shadow-sm disabled:cursor-not-allowed disabled:bg-stone-300 disabled:text-stone-600",children:u?C?"句型完成,開始挑戰":"這句完成,下一句":"完成口說後前進"})})]}),(0,t.jsx)("p",{"aria-live":"polite",className:"mt-4 rounded-2xl bg-cream px-4 py-3 text-sm font-bold leading-7 text-stone-600",children:g})]}):(0,t.jsx)("p",{className:"rounded-2xl bg-cream p-4 font-bold text-stone-600",children:"目前沒有可練習的句子。"})}var v=e.i(44014),S=e.i(74503),C=e.i(24038),$=e.i(34295),E=e.i(41324);let _="chenguang-english-practice-groups-v2",M={mixed:{title:"混合闖關",hint:"題型自動變換,比較像真的遊戲。"},meaning:{title:"看英選中",hint:"看到英文,選出中文意思。"},listen:{title:"聽音挑戰",hint:"先聽發音,再選出聽到的單字。"},sentence:{title:"句型補空",hint:"把單字放回句子裡。"},speak:{title:"跟讀任務",hint:"聽一次,再讓系統檢查孩子有沒有唸接近。"}},P={"learner-grade-1":"Jamie","learner-grade-2":"Alex","learner-grade-3":"Robin","guardian-1":"Taylor","guardian-2":"Morgan"};function L(e,t,s){return 0===e.length?[]:Array.from({length:Math.min(s,e.length)},(s,l)=>e[(t+l)%e.length])}function Z(e,t,s){let l=Array.from(new Set([e,...t])).slice(0,4),n=Array.from(e).reduce((e,t)=>e+t.charCodeAt(0),s+19);for(let e=l.length-1;e>0;e-=1){let t=Math.floor((n=(9301*n+49297)%233280)/233280*(e+1));[l[e],l[t]]=[l[t],l[e]]}return l}function A(e,t,s,l){let n={id:`english-game-${Date.now()}`,date:new Date().toISOString(),score:e,streak:t,words:s.map(e=>e.word)},a=(0,$.readPersonStorage)("chenguang-english-game-history",l,[]);(0,$.writePersonStorage)("chenguang-english-game-history",l,[{...n,personId:l},...a].slice(0,30))}e.s(["default",0,function(){var e;let{person:d}=(0,E.useActivePerson)(),N=(0,s.useRef)(`practice-${Date.now()}-${Math.random().toString(36).slice(2,8)}`),B=(0,s.useRef)(d.id),T=(0,v.getEnglishLessonByGrade)(d.grade),z=P[d.id]??"Jamie",I=(0,S.getWordBankStats)(),[K,R]=(0,s.useState)(0),[D,W]=(0,s.useState)("mixed"),[F,U]=(0,s.useState)(0),[O,q]=(0,s.useState)(0),[G,H]=(0,s.useState)(0),[J,Q]=(0,s.useState)(3),[Y,V]=(0,s.useState)("選一個模式開始闖關。點答案會直接播放,答對後再進下一題。"),[X,ee]=(0,s.useState)(!1),[et,es]=(0,s.useState)(""),[el,en]=(0,s.useState)(0),[ea,er]=(0,s.useState)(!1),[ei,eo]=(0,s.useState)([]),[ec,ed]=(0,s.useState)({poolSize:0,cycle:0,position:0}),[ex,em]=(0,s.useState)([]),[eh,eb]=(0,s.useState)([]),[eg,ep]=(0,s.useState)(0),[eu,ef]=(0,s.useState)(!1),[ew,ej]=(0,s.useState)("overview"),[ek,eN]=(0,s.useState)([]),ey=T.wordGroups[K%T.wordGroups.length]??T.wordGroups[0],ev=ei.length>0?ei:ey.words,eS=(0,s.useMemo)(()=>(0,S.getIntegratedPracticePack)(10*K,10,d.grade),[K,d.grade]),eC=eh.length>0,e$=eC?`循環複習|第 ${eg+1} / ${eh.length} 組|每組 10 個單字`:`第 ${K+1} 組|本輪 ${ec.position.toLocaleString()} / ${ec.poolSize.toLocaleString()}|每組 10 個不重複單字`,eE=ev[F%ev.length]??ev[0],e_=eE?.example??eS.speakText,eM="mixed"===D?["meaning","listen","sentence"][F%3]:"speak"===D?"meaning":D,eP=(0,s.useMemo)(()=>{let e,t;if("listen"===eM){let e,t;return t=Z((e=ev[F%ev.length]).word,L(ev,F+2,5).map(e=>e.word),F+3),{mode:"listen",word:e,question:"你聽到哪一個單字?",answer:e.word,options:t}}if("sentence"===eM){let e,t,s;return t=(e=ev[F%ev.length]).example.replace(RegExp(e.word,"i"),"___"),s=Z(e.word,L(ev,F+3,5).map(e=>e.word),F+5),{mode:"sentence",word:e,question:t===e.example?`${e.example} 這句話的重點單字是哪一個?`:t,answer:e.word,options:s}}return t=Z((e=ev[F%ev.length]).zh,L(ev,F+1,5).map(e=>e.zh),F),{mode:"meaning",word:e,question:`${e.word} 是什麼意思?`,answer:e.zh,options:t}},[eM,F,ev]),eL="checkpoint"===ew?10:5,eZ=O>=80?"晨光小隊長":O>=40?"單字探險家":"暖身練習生",eA=Math.min(100,Math.round(el/eL*100)),eB=(0,o.getEnglishExampleZh)(eP.word.example,eP.word.zh,eP.word.usage),eT=(0,o.getEnglishExampleZh)(e_,eE?.zh,eE?.usage),ez=(0,i.getKKPhonetic)(eP.word.word,eP.word.phonetic),eI={category:e=ev[0]?.category??ey.title,...n[e]??a},eK="overview"===ew?null:l.find(e=>e.id===ew)??null,eR="checkpoint"===ew?"今天的 10 題自學闖關":"speaking"===ew?"一次一句的 AI 口說練習":"listening"===ew?"一次一題的聽力練習":"五題快速遊戲";function eD(e){ej("overview"),W("mixed"),q(0),H(0),Q(3),V(e),U(0),ee(!1),es(""),en(0),er(!1)}function eW(){eb([]),ep(0),R(e=>e+1),eD("已換成全新 10 個單字,近期學過的內容不會立刻重複。")}function eF(e){W(e),U(0),ee(!1),es(""),en(0),er(!1),V(`${M[e].title} 已開始:${M[e].hint}`),("listen"===e||"mixed"===e)&&(0,c.speakEnglish)(ev[0]?.word??"hello",{rate:.75})}function eU(e){eN(t=>t.includes(e)?t:[...t,e])}function eO(e){ej(e),"listening"===e&&eF("listen"),"speaking"===e&&eF("speak"),("game"===e||"checkpoint"===e)&&eF("mixed")}function eq(){if(!ea){if(!X)return void V("speak"===D?"先讓孩子完成這一題口說辨識,再進入下一題。":"先選到正確答案,再進入下一題。");if(el>=eL){er(!0),"overview"!==ew&&"vocabulary"!==ew&&"reading"!==ew&&eU(ew),A(O,G,ev,d.id);return}if(U(e=>e+1),ee(!1),es(""),V("下一題來了。直接點答案,系統會幫你播放。"),"listen"===("mixed"===D?["meaning","listen","sentence"][(F+1)%3]:D)){let e=ev[(F+1)%ev.length];(0,c.speakEnglish)(e.word,{rate:.75})}A(O,G,ev,d.id)}}function eG(){q(0),H(0),Q(3),U(0),ee(!1),es(""),en(0),er(!1),V("已重新開始。點答案就會播放,答對再進下一題。")}return(0,s.useEffect)(()=>{R(0),W("mixed"),U(0),q(0),H(0),Q(3),ee(!1),es(""),en(0),er(!1),eo([]),em((0,$.readPersonStorage)(_,d.id,[]).slice(-10)),eb([]),ep(0),ef(!1),ej("overview"),eN([]),V(`已切換到 ${d.name} 的小${d.grade}英文內容。`)},[d.id,d.grade,d.name]),(0,s.useEffect)(()=>{if(B.current!==d.id&&(B.current=d.id,0!==K))return;let e=(0,C.getNextEnglishQuestionSet)({personId:d.id,grade:d.grade,count:10,requestId:`${N.current}:${d.id}:${K}`});eo(e.words),ed({poolSize:e.poolSize,cycle:e.cycle,position:e.position}),em(t=>{if(e.words.map(e=>e.word.toLocaleLowerCase("en-US")).join("|")===t.at(-1)?.map(e=>e.word.toLocaleLowerCase("en-US")).join("|"))return t;let s=[...t,e.words].slice(-10);return(0,$.writePersonStorage)(_,d.id,s),s})},[K,d.grade,d.id]),(0,t.jsx)(g.AppShell,{children:(0,t.jsxs)(u.LearningPageFrame,{children:[(0,t.jsx)(f.PageHeader,{eyebrow:"Everyday English",title:"晨光每日英語",description:`依小${d.grade}程度安排生活主題,從看懂、聽懂、開口到小挑戰,一次只完成一個步驟。`}),(0,t.jsx)(x,{topic:eI,words:ev,grade:d.grade,groupLabel:e$,onStart:()=>eO("vocabulary")}),(0,t.jsx)("section",{className:"rounded-[2rem] border border-softline bg-white/75 p-4 shadow-warm backdrop-blur md:p-5",children:(0,t.jsx)(r,{active:"overview"===ew?null:ew,completed:ek,onChange:eO})}),"overview"===ew?(0,t.jsx)("section",{className:"rounded-[2rem] border border-softline bg-white/90 p-6 shadow-warm md:p-8",children:(0,t.jsxs)("div",{className:"grid gap-6 lg:grid-cols-[0.9fr_1.1fr] lg:items-center",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:"Today's Mission"}),(0,t.jsx)("h2",{className:"mt-2 text-3xl font-black text-ink md:text-4xl",children:"先選一種能力,完成一個小任務"}),(0,t.jsx)("p",{className:"mt-3 font-bold leading-8 text-stone-600",children:"字彙、聽力、口說、閱讀、遊���與闖關各自獨立。孩子不必一次看完全部內容,也能依今天的精神選擇想練的項目。"}),(0,t.jsx)("button",{type:"button",onClick:()=>eO("vocabulary"),className:"mt-6 min-h-14 rounded-2xl bg-coral px-7 py-3 font-black text-white shadow-[0_14px_30px_rgba(244,124,112,0.22)] transition hover:brightness-105 active:scale-[0.98]",children:"從字彙暖身開始"})]}),(0,t.jsx)("div",{className:"grid gap-3 sm:grid-cols-3",children:[["6","能力專區","每一區都能直接開始"],["1","一次一題","答完才出現下一題"],["10","今日闖關","完成後存入個人進度"]].map(([e,s,l])=>(0,t.jsxs)("div",{className:"rounded-3xl bg-cream p-5",children:[(0,t.jsx)("strong",{className:"text-4xl font-black text-coral",children:e}),(0,t.jsx)("span",{className:"mt-2 block text-lg font-black text-ink",children:s}),(0,t.jsx)("span",{className:"mt-1 block text-sm font-bold leading-6 text-stone-500",children:l})]},s))})]})}):null,"vocabulary"===ew?(0,t.jsx)(b,{words:ev,grade:d.grade,onComplete:()=>{eU("vocabulary"),eO("listening")}}):null,"reading"===ew?(0,t.jsx)(y,{sentences:T.dailySentences,defaultBlankText:z,onQuizStart:e=>V(`句型口說:${e}`),onComplete:()=>{eU("reading"),eO("game")}}):null,"listening"===ew||"speaking"===ew||"game"===ew||"checkpoint"===ew?(0,t.jsxs)("section",{className:"rounded-[2rem] border border-softline bg-white/90 p-5 shadow-warm md:p-8",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-5 xl:flex-row xl:items-start xl:justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:eK?.label??"English Challenge"}),(0,t.jsx)("h2",{className:"mt-2 text-3xl font-black text-ink md:text-4xl",children:eR}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"speaking"===ew?"按下麥克風後由孩子開口,系統辨識完成才會前進。":"點選時會同步播放;看懂解析後,再進入下一題。"})]}),(0,t.jsx)("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:[["分數",O],["連擊",G],["進度",`${el}/${eL}`],["稱號",eZ]].map(([e,s])=>(0,t.jsxs)("div",{className:"rounded-2xl bg-cream px-4 py-3 text-center",children:[(0,t.jsx)("p",{className:"text-xs font-black text-amber-700",children:e}),(0,t.jsx)("strong",{className:"mt-1 block text-lg text-ink",children:s})]},e))})]}),(0,t.jsxs)("div",{className:"mt-6 flex flex-wrap items-center justify-between gap-3 rounded-2xl bg-cream px-4 py-3",children:[(0,t.jsxs)("p",{className:"font-black text-amber-900",children:["目前模式:",eK?.label,"|",M[D].hint]}),(0,t.jsx)("button",{type:"button",onClick:()=>ej("overview"),className:"min-h-11 rounded-2xl bg-white px-4 py-2 text-sm font-black text-amber-900 shadow-sm",children:"回到能力選單"})]}),(0,t.jsxs)("div",{className:"mt-5 rounded-2xl bg-cream p-4",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3 text-sm font-black text-amber-900",children:[(0,t.jsx)("span",{children:"本輪學習進度"}),(0,t.jsxs)("span",{children:[eA,"%"]})]}),(0,t.jsx)("div",{className:"mt-3 h-3 overflow-hidden rounded-full bg-white",children:(0,t.jsx)("div",{className:"h-full rounded-full bg-coral transition-all duration-500",style:{width:`${eA}%`}})})]}),ea?(0,t.jsxs)("div",{className:"mt-6 rounded-[1.75rem] border border-green-100 bg-green-50 p-6 shadow-sm",children:[(0,t.jsx)("p",{className:"text-sm font-black text-green-700",children:"Mission Complete"}),(0,t.jsx)("h3",{className:"mt-1 text-3xl font-black text-ink",children:"今天這一組完成了"}),(0,t.jsxs)("p",{className:"mt-3 font-bold leading-8 text-green-900",children:["本局分數 ",O,",最高連擊 ",G,"。紀錄已存入目前學習者的進度。"]}),eu?(0,t.jsxs)("div",{className:"mt-4 rounded-2xl border border-amber-200 bg-white p-5",children:[(0,t.jsx)("p",{className:"text-lg font-black text-ink",children:"已完成最近 10 組,要怎麼繼續?"}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-7 text-stone-600",children:"可以複習剛學的 100 個單字,也可以繼續取得全新內容。"}),(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap gap-3",children:[(0,t.jsx)(w.PrimaryButton,{onClick:function(){let e=ex.slice(-10);e.length&&(ef(!1),eb(e),ep(0),eo(e[0]),em([]),(0,$.writePersonStorage)(_,d.id,[]),eD("開始循環最近 10 組;完成後會自動接回全新單字。"))},children:"循環最近 10 組"}),(0,t.jsx)(k.SecondaryButton,{onClick:function(){ef(!1),em([]),(0,$.writePersonStorage)(_,d.id,[]),eW()},children:"繼續全新單字"})]})]}):null,(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap gap-3",children:["checkpoint"!==ew?(0,t.jsx)(w.PrimaryButton,{onClick:()=>{let e,t;return e=l.findIndex(e=>e.id===ew),void((t=l[e+1])?eO(t.id):ej("overview"))},children:"完成,前往下一區"}):(0,t.jsx)(w.PrimaryButton,{onClick:eG,children:"再玩一局"}),eu?null:(0,t.jsx)(k.SecondaryButton,{onClick:function(){if(eC){let e=eg+1;e<eh.length?(ep(e),eo(eh[e]),eD(`正在循環複習第 ${e+1} 組。`)):eW();return}if(ex.length>=10){ef(!0),V("已完成 10 組、��� 100 個單字。請選擇要循環複習,或繼續全新單字。");return}eW()},children:eC?"複習下一組":"換下一組"})]})]}):(0,t.jsx)("section",{className:"mt-6 rounded-[1.75rem] bg-gradient-to-br from-blue-50 to-green-50 p-5 shadow-sm ring-1 ring-blue-100 md:p-7",children:"speak"===D?(0,t.jsxs)("div",{className:"mx-auto max-w-4xl",children:[(0,t.jsx)("p",{className:"text-sm font-black text-blue-700",children:"Speak Mission"}),(0,t.jsx)("h3",{className:"mt-2 text-3xl font-black text-ink",children:"換你親自說這一句"}),(0,t.jsxs)("div",{className:"mt-5 rounded-[1.5rem] bg-white/85 p-6 text-center text-3xl font-black leading-relaxed text-blue-700",children:[e_,(0,t.jsxs)("span",{className:"mt-3 block text-base font-bold text-stone-500",children:["意思:",eT]})]}),(0,t.jsx)(m.SpeechPracticeButton,{expected:e_,lang:"en-US",speakLabel:"先聽標準句子",listenLabel:"按下麥克風,換我說",targetLabel:"我要朗讀",onResult:e=>V(e.ok?"系統有聽懂。看完辨識內容,再確認完成。":`系統還沒聽清楚:${e.message}`),onReviewed:()=>{X||(ee(!0),function(){if(en(e=>Math.min(eL,e+1)),q(e=>e+10),H(e=>e+1),el+1>=eL){er(!0),"speaking"===ew&&eU("speaking"),A(O+10,G+1,ev,d.id),V("完成一局跟讀任務,已存入今日英文遊戲紀錄。");return}V("跟讀任務完成一題,繼續下一題。")}())}}),(0,t.jsx)("div",{className:"mt-5 flex justify-end",children:X?(0,t.jsx)(w.PrimaryButton,{onClick:eq,children:el>=eL?"完成並看結果":"完成,下一題"}):(0,t.jsx)("span",{className:"rounded-2xl bg-white px-5 py-3 font-black text-stone-500 shadow-sm",children:"先完成口說辨識"})})]}):(0,t.jsxs)("div",{className:"mx-auto max-w-5xl",children:[(0,t.jsxs)("p",{className:"text-sm font-black text-blue-700",children:["第 ",Math.min(el+1,eL)," 題|","mixed"===D?M[eM].title:M[D].title]}),(0,t.jsx)("h3",{className:"mt-2 text-3xl font-black leading-tight text-ink md:text-4xl",children:eP.question}),(0,t.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:[ez?(0,t.jsxs)("button",{type:"button",onClick:()=>(0,c.speakEnglish)(eP.word.word,{rate:.76}),className:"rounded-full bg-blue-100 px-4 py-2 text-sm font-black text-blue-800 shadow-sm",children:["KK ",ez,"|點我聽"]}):null,(0,t.jsx)("span",{className:"text-sm font-bold text-stone-500",children:"請點一個答案,選中的框會明確變色。"})]}),(0,t.jsxs)("button",{type:"button",onClick:()=>(0,c.speakEnglish)(eP.word.example,{rate:.72}),className:"mt-5 w-full rounded-2xl bg-white/85 px-5 py-4 text-left shadow-sm transition hover:bg-white",children:[(0,t.jsxs)("span",{className:"block font-black text-amber-900",children:["例句:",eP.word.example]}),(0,t.jsxs)("span",{className:"mt-1 block text-sm font-bold text-stone-500",children:["意思:",eB,"|點一下聽完整例句"]})]}),(0,t.jsx)("div",{className:"mt-6 grid gap-3 sm:grid-cols-2",children:eP.options.map((e,s)=>{let l=e===et,n=X&&e===eP.answer,a=l&&e!==eP.answer;return(0,t.jsxs)("button",{type:"button",onClick:()=>(function(e){if(ea||X)return;/^[\x00-\x7F\s'.,!?-]+$/.test(e)?(0,c.speakEnglish)(e,{rate:.78}):(0,c.speakMandarin)(e,{rate:.78});let t=e===eP.answer;if(es(e),t){if(X)return;ee(!0),en(Math.min(eL,el+1));let e=G+1,t=5*(e>=3);q(e=>e+10+t),H(e),V(t>0?"答對了,三連擊加分。按確認進下一題。":"答對了,很穩。按確認進下一題。")}else Q(e=>Math.max(0,e-1)),H(0),ee(!1),V(`再試一次。${eP.word.word} 是「${eP.word.zh}」。先聽例句,再選一次。`),window.setTimeout(()=>(0,c.speakEnglish)(eP.word.example,{rate:.72}),250)})(e),disabled:X,"aria-pressed":l,className:`relative min-h-24 rounded-3xl border-2 px-5 py-4 text-center text-2xl font-black shadow-sm transition disabled:cursor-default ${n?"border-green-500 bg-green-100 text-green-900 ring-4 ring-green-100":a?"border-rose-400 bg-rose-50 text-rose-900 ring-4 ring-rose-100":"border-blue-100 bg-white text-blue-700 hover:-translate-y-0.5 hover:border-blue-300 hover:bg-blue-50 active:scale-[0.99]"}`,children:[(0,t.jsx)("span",{className:`absolute left-4 top-1/2 grid h-9 w-9 -translate-y-1/2 place-items-center rounded-full text-sm ${n?"bg-green-600 text-white":a?"bg-rose-500 text-white":"bg-blue-50 text-blue-700"}`,children:String.fromCharCode(65+s)}),(0,t.jsx)("span",{className:"block px-10",children:(0,t.jsx)(h.ZhuyinText,{text:e,show:d.grade<=6,compact:!0,className:"justify-center"})}),n?(0,t.jsx)("span",{className:"mt-2 block text-sm text-green-800",children:"答對了"}):null,a?(0,t.jsx)("span",{className:"mt-2 block text-sm text-rose-800",children:"再想一想"}):null]},e)})}),(0,t.jsx)("div",{"aria-live":"polite",className:`mt-5 rounded-2xl border px-5 py-4 font-black ${X?"border-green-200 bg-green-50 text-green-900":et?"border-rose-200 bg-rose-50 text-rose-900":"border-amber-100 bg-cream text-amber-900"}`,children:X?`你選了「${et}」,答對了。先看解析,再到下一題。`:et?`你選了「${et}」,再試一次。`:"請點選一個答案;系統會同步唸給你聽。"}),et?(0,t.jsx)(p.ChildFriendlyExplanation,{word:eP.word.word,meaning:eP.word.zh,example:eP.word.example,exampleMeaning:eB,usage:eP.word.usage,correct:X,grade:d.grade}):null,(0,t.jsxs)("div",{className:"mt-5 flex flex-wrap gap-3",children:[X?(0,t.jsx)(w.PrimaryButton,{onClick:eq,children:el>=eL?"完成並看結果":"我看懂了,下一題"}):(0,t.jsx)("span",{className:"inline-flex min-h-12 items-center justify-center rounded-2xl bg-white px-6 py-3 font-black text-stone-500 shadow-sm",children:et?"再選一次就能前進":"先選一個答案"}),(0,t.jsx)(k.SecondaryButton,{onClick:eG,children:"重新開始"})]})]})}),(0,t.jsxs)("details",{className:"mt-5 rounded-2xl border border-softline bg-cream px-5 py-4",children:[(0,t.jsx)("summary",{className:"cursor-pointer font-black text-amber-900",children:"需要複習時,再打開本組 10 個單字"}),(0,t.jsx)("div",{className:"mt-4 grid gap-2 sm:grid-cols-2 lg:grid-cols-5",children:ev.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>(0,c.speakEnglish)(e.word,{rate:.76}),className:"rounded-2xl bg-white px-4 py-3 text-left shadow-sm transition hover:bg-blue-50",children:[(0,t.jsx)("span",{className:"block text-lg font-black text-blue-700",children:e.word}),(0,t.jsx)("span",{className:"mt-1 block text-sm font-bold text-stone-600",children:e.zh})]},e.word))}),(0,t.jsxs)("p",{className:"mt-3 text-xs font-bold leading-6 text-stone-500",children:["來源字庫共 ",I.sourceTotal.toLocaleString()," 個單字;系統會排除不適齡內容,近期學過的字也不會立即重複。"]})]}),(0,t.jsx)("div",{className:"mt-5",children:(0,t.jsx)(j.ResultBox,{title:"本題回饋",children:Y})})]}):null]})})}],52109)}]);
_next/static/chunks/05-c3ty_6dwfk.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,33525,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"warnOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},18967,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={DecodeError:function(){return P},MiddlewareNotFoundError:function(){return O},MissingStaticPage:function(){return h},NormalizeError:function(){return E},PageNotFoundError:function(){return b},SP:function(){return m},ST:function(){return y},WEB_VITALS:function(){return i},execOnce:function(){return u},getDisplayName:function(){return l},getLocationOrigin:function(){return c},getURL:function(){return f},isAbsoluteUrl:function(){return a},isResSent:function(){return d},loadGetInitialProps:function(){return g},normalizeRepeatedSlashes:function(){return p},stringifyError:function(){return N}};for(var o in n)Object.defineProperty(t,o,{enumerable:!0,get:n[o]});let i=["CLS","FCP","FID","INP","LCP","TTFB"];function u(e){let r,t=!1;return(...n)=>(t||(t=!0,r=e(...n)),r)}let s=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,a=e=>s.test(e);function c(){let{protocol:e,hostname:r,port:t}=window.location;return`${e}//${r}${t?":"+t:""}`}function f(){let{href:e}=window.location,r=c();return e.substring(r.length)}function l(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function d(e){return e.finished||e.headersSent}function p(e){let r=e.split("?");return r[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(r[1]?`?${r.slice(1).join("?")}`:"")}async function g(e,r){let t=r.res||r.ctx&&r.ctx.res;if(!e.getInitialProps)return r.ctx&&r.Component?{pageProps:await g(r.Component,r.ctx)}:{};let n=await e.getInitialProps(r);if(t&&d(t))return n;if(!n)throw Object.defineProperty(Error(`"${l(e)}.getInitialProps()" should resolve to an object. But found "${n}" instead.`),"__NEXT_ERROR_CODE",{value:"E1025",enumerable:!1,configurable:!0});return n}let m="u">typeof performance,y=m&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class P extends Error{}class E extends Error{}class b extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class h extends Error{constructor(e,r){super(),this.message=`Failed to load static file for page: ${e} ${r}`}}class O extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function N(e){return JSON.stringify({message:e.message,stack:e.stack})}},98183,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={assign:function(){return a},searchParamsToUrlQuery:function(){return i},urlQueryToSearchParams:function(){return s}};for(var o in n)Object.defineProperty(t,o,{enumerable:!0,get:n[o]});function i(e){let r={};for(let[t,n]of e.entries()){let e=r[t];void 0===e?r[t]=n:Array.isArray(e)?e.push(n):r[t]=[e,n]}return r}function u(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function s(e){let r=new URLSearchParams;for(let[t,n]of Object.entries(e))if(Array.isArray(n))for(let e of n)r.append(t,u(e));else r.set(t,u(n));return r}function a(e,...r){for(let t of r){for(let r of t.keys())e.delete(r);for(let[r,n]of t.entries())e.append(r,n)}return e}}]);
_next/static/chunks/{polyfills-42372ed130431b0a.js → 0cz1d0mv5g_q7.js} RENAMED
File without changes
_next/static/chunks/0hjmsyzned3p8.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95057,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={formatUrl:function(){return i},formatWithValidation:function(){return c},urlObjectKeys:function(){return o}};for(var a in r)Object.defineProperty(n,a,{enumerable:!0,get:r[a]});let l=e.r(90809)._(e.r(98183)),s=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:n}=e,r=e.protocol||"",a=e.pathname||"",i=e.hash||"",o=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:n&&(c=t+(~n.indexOf(":")?`[${n}]`:n),e.port&&(c+=":"+e.port)),o&&"object"==typeof o&&(o=String(l.urlQueryToSearchParams(o)));let d=e.search||o&&`?${o}`||"";return r&&!r.endsWith(":")&&(r+=":"),e.slashes||(!r||s.test(r))&&!1!==c?(c="//"+(c||""),a&&"/"!==a[0]&&(a="/"+a)):c||(c=""),i&&"#"!==i[0]&&(i="#"+i),d&&"?"!==d[0]&&(d="?"+d),a=a.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${r}${c}${a}${d}${i}`}let o=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return i(e)}},18581,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"useMergedRef",{enumerable:!0,get:function(){return a}});let r=e.r(71645);function a(e,t){let n=(0,r.useRef)(null),a=(0,r.useRef)(null);return(0,r.useCallback)(r=>{if(null===r){let e=n.current;e&&(n.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(n.current=l(e,r)),t&&(a.current=l(t,r))},[e,t])}function l(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let n=e(t);return"function"==typeof n?n:()=>e(null)}}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},73668,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"isLocalURL",{enumerable:!0,get:function(){return l}});let r=e.r(18967),a=e.r(52817);function l(e){if(!(0,r.isAbsoluteUrl)(e))return!0;try{let t=(0,r.getLocationOrigin)(),n=new URL(e,t);return n.origin===t&&(0,a.hasBasePath)(n.pathname)}catch(e){return!1}}},84508,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"errorOnce",{enumerable:!0,get:function(){return r}});let r=e=>{}},22016,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={default:function(){return x},useLinkStatus:function(){return w}};for(var a in r)Object.defineProperty(n,a,{enumerable:!0,get:r[a]});let l=e.r(90809),s=e.r(43476),i=l._(e.r(71645)),o=e.r(95057),c=e.r(8372),d=e.r(18581),u=e.r(18967),h=e.r(5550);e.r(33525);let m=e.r(88540),g=e.r(91949),f=e.r(73668),p=e.r(9396);function x(t){var n,r;let a,l,x,[w,y]=(0,i.useOptimistic)(g.IDLE_LINK_STATUS),v=(0,i.useRef)(null),{href:j,as:k,children:N,prefetch:S=null,passHref:P,replace:$,shallow:E,scroll:R,onClick:C,onMouseEnter:L,onTouchStart:M,legacyBehavior:T=!1,onNavigate:I,transitionTypes:A,ref:U,unstable_dynamicOnHover:O,..._}=t;a=N,T&&("string"==typeof a||"number"==typeof a)&&(a=(0,s.jsx)("a",{children:a}));let B=i.default.useContext(c.AppRouterContext),z=!1!==S,D=!1!==S?null===(r=S)||"auto"===r?p.FetchStrategy.PPR:p.FetchStrategy.Full:p.FetchStrategy.PPR,W="string"==typeof(n=k||j)?n:(0,o.formatUrl)(n);if(T){if(a?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});l=i.default.Children.only(a)}let H=T?l&&"object"==typeof l&&l.ref:U,K=i.default.useCallback(e=>(null!==B&&(v.current=(0,g.mountLinkInstance)(e,W,B,D,z,y)),()=>{v.current&&((0,g.unmountLinkForCurrentNavigation)(v.current),v.current=null),(0,g.unmountPrefetchableInstance)(e)}),[z,W,B,D,y]),F={ref:(0,d.useMergedRef)(K,H),onClick(t){T||"function"!=typeof C||C(t),T&&l.props&&"function"==typeof l.props.onClick&&l.props.onClick(t),!B||t.defaultPrevented||function(t,n,r,a,l,s,o){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,f.isLocalURL)(n)){a&&(t.preventDefault(),location.replace(n));return}if(t.preventDefault(),s){let e=!1;if(s({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);i.default.startTransition(()=>{u(n,a?"replace":"push",!1===l?m.ScrollBehavior.NoScroll:m.ScrollBehavior.Default,r.current,o)})}}(t,W,v,$,R,I,A)},onMouseEnter(e){T||"function"!=typeof L||L(e),T&&l.props&&"function"==typeof l.props.onMouseEnter&&l.props.onMouseEnter(e),B&&z&&(0,g.onNavigationIntent)(e.currentTarget,!0===O)},onTouchStart:function(e){T||"function"!=typeof M||M(e),T&&l.props&&"function"==typeof l.props.onTouchStart&&l.props.onTouchStart(e),B&&z&&(0,g.onNavigationIntent)(e.currentTarget,!0===O)}};return(0,u.isAbsoluteUrl)(W)?F.href=W:T&&!P&&("a"!==l.type||"href"in l.props)||(F.href=(0,h.addBasePath)(W)),x=T?i.default.cloneElement(l,F):(0,s.jsx)("a",{..._,...F,children:a}),(0,s.jsx)(b.Provider,{value:w,children:x})}e.r(84508);let b=(0,i.createContext)(g.IDLE_LINK_STATUS),w=()=>(0,i.useContext)(b);("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},14876,e=>{"use strict";var t=e.i(43476),n=e.i(22016);function r(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:n,suffix:r}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===n?`/index.html${r}`:/\.[a-z0-9]+$/i.test(n)?e:`${n.replace(/\/+$/,"")}/index.html${r}`}e.s(["ExportSafeLink",0,function({href:e,children:a,...l}){return"string"==typeof e?(0,t.jsx)("a",{href:r(e),...l,children:a}):(0,t.jsx)(n.default,{href:e,...l,children:a})},"getExportSafeHref",0,r])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let n=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function r(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return n.find(t=>t.grade===e)},"getGradeIdByNumber",0,r,"grades",0,n],62312);let a=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],l={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function s(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.find(e=>e.id===t)??l}function i(e){if(!e)return l.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.some(e=>e.id===t)?t:l.id}e.s(["currentStudent",0,l,"getCurrentStudentGradeId",0,function(e=l){return r(e.grade)},"getPersonById",0,s,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,a,"normalizePersonId",0,i],7728);let o="chenguang-active-person-id",c="chenguang-active-person-change",d="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,n]=(0,t.useState)(l.id),[r,a]=(0,t.useState)(!1),[h,m]=(0,t.useState)(!1);function g(e){let t=i(e);n(t),window.localStorage.setItem(o,t),window.dispatchEvent(new Event(c))}return(0,t.useEffect)(()=>{let e=i(window.localStorage.getItem(o));function t(){let e=i(window.localStorage.getItem(o));n(e),window.localStorage.setItem(o,e)}function r(){a(!!window.localStorage.getItem(d))}return n(e),window.localStorage.setItem(o,e),a(!!window.localStorage.getItem(d)),m(!0),window.addEventListener(c,t),window.addEventListener("storage",t),window.addEventListener(u,r),()=>{window.removeEventListener(c,t),window.removeEventListener("storage",t),window.removeEventListener(u,r)}},[]),{person:s(e),switchPerson:g,signIn:function(e){let t=i(e);g(t);let n=s(t);window.localStorage.setItem(d,JSON.stringify({personId:t,role:n.role,signedInAt:new Date().toISOString()})),a(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(d),a(!1),window.dispatchEvent(new Event(u))},isLoggedIn:r,isReady:h}}],41324)},82697,e=>{"use strict";var t=e.i(43476),n=e.i(14876),r=e.i(7728),a=e.i(62312),l=e.i(41324);e.s(["BrandHeader",0,function({showPerson:e=!0}){let{person:s,isLoggedIn:i}=(0,l.useActivePerson)(),o=(0,a.getGradeByNumber)(s.grade),c=i?`${(0,r.getPersonDisplayName)(s)}|${"student"===s.role?(0,r.getPersonSubtitle)(s):o?.shortName??`小${s.grade}`}`:"訪客模式";return(0,t.jsxs)(n.ExportSafeLink,{href:i?"/dashboard":"/",className:"flex min-w-0 items-center gap-3 text-ink",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 shrink-0 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{className:"min-w-0 leading-tight",children:[(0,t.jsx)("strong",{className:"block truncate text-xl font-black",children:"晨光"}),(0,t.jsx)("small",{className:"block truncate text-sm font-bold text-stone-500",children:e?c:"國小學習陪跑系統"})]})]})}])},18566,(e,t,n)=>{t.exports=e.r(76562)},22468,e=>{"use strict";var t=e.i(43476),n=e.i(71645),r=e.i(18566),a=e.i(14876),l=e.i(7728),s=e.i(62312),i=e.i(41324);let o=[{label:"登入",href:"/login"},{label:"訪客體驗",href:"/courses"},{label:"註冊登入",href:"/register",primary:!0}];function c(e,t="student"){let n=[{label:"課程首頁",href:"/dashboard",icon:"⌂"},{label:"每日 10 題",href:"/daily-quiz",icon:"10"},{label:"錯題 AI 說明",href:"/wrong-review",icon:"AI"},{label:"進度月曆",href:"/parent-weekly-report",icon:"月"},{label:"英文練習",href:"/practice",icon:"Aa"},{label:"手寫出題",href:"/word-scanner",icon:"掃"},{label:"課程總覽",href:"/courses",icon:"▦"},{label:"國語練習",href:`/courses/grade-${e}/chinese/basic`,icon:"ㄅ"},{label:"數學練習",href:`/courses/grade-${e}/math/basic`,icon:"123"},{label:"每日紀錄",href:"/daily-record",icon:"✓"},{label:"週計畫",href:"/weekly-plan",icon:"□"},{label:"登出",href:"/",icon:"出"}];return"parent"===t?n.filter(e=>["課程首頁","進度月曆","每日紀錄","週計畫","課程總覽","登出"].includes(e.label)):"teacher"===t?n.filter(e=>["課程首頁","課程總覽","國語練習","英文練習","數學練習","週計畫","手寫出題","登出"].includes(e.label)):n.filter(e=>["課程首頁","每日 10 題","英文練習","國語練習","數學練習","手寫出題","錯題 AI 說明","登出"].includes(e.label))}function d(e,t){return"/dashboard"===t?"/dashboard"===e:"/courses"===t?"/courses"===e:t.startsWith("/courses/")?e===t||e.startsWith(`${t}/`):e===t}function u({compact:e=!1}){let{person:r}=(0,i.useActivePerson)(),[a,o]=(0,n.useState)(!1),c=(0,s.getGradeByNumber)(r.grade),d="student"===r.role?(0,l.getPersonSubtitle)(r):c?.name??`國小${r.grade}年級`,h=(0,t.jsx)("div",{className:"grid gap-2",children:l.mockPeople.map(e=>{let n=(0,s.getGradeByNumber)(e.grade),a=e.id===r.id;return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;let n;return t=e.id,o(!1),n=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login",void window.location.assign(`${n}?person=${encodeURIComponent(t)}`)},className:`rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${a?"bg-coral text-white shadow-sm":"bg-white text-stone-700 hover:bg-butter"}`,children:[(0,t.jsxs)("span",{className:"block text-xs font-black opacity-80",children:[(0,l.getRoleLabel)(e.role),"模式"]}),(0,t.jsx)("span",{className:"mt-1 block text-base font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-75",children:"student"===e.role?(0,l.getPersonSubtitle)(e):n?.name??`國小${e.grade}年級`})]},e.id)})});return e?(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>o(e=>!e),className:"flex min-h-11 max-w-[5.5rem] items-center gap-1 rounded-2xl bg-butter px-2 text-left text-amber-950 shadow-sm sm:max-w-none sm:gap-2 sm:px-3","aria-expanded":a,"aria-label":"切換目前使用者",children:[(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("strong",{className:"block max-w-20 truncate text-sm font-black",children:r.name}),(0,t.jsx)("small",{className:"block text-[11px] font-bold opacity-70",children:c?.shortName??`小${r.grade}`})]}),(0,t.jsx)("span",{"aria-hidden":"true",className:"text-xs",children:"⌄"})]}),a?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100vh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsx)("strong",{className:"text-base font-black text-ink",children:"切換使用者"}),(0,t.jsx)("button",{type:"button",onClick:()=>o(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉帳號選單",children:"×"})]}),h]}):null]}):(0,t.jsxs)("section",{className:"rounded-3xl border border-amber-100 bg-cream p-3 shadow-sm",children:[(0,t.jsx)("button",{type:"button",onClick:()=>o(e=>!e),className:"w-full rounded-[1.35rem] bg-white/80 p-3 text-left ring-1 ring-transparent transition hover:bg-white hover:ring-coral/30","aria-expanded":a,"aria-label":"切換目前使用者",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("p",{className:"text-xs font-black text-amber-700",children:[(0,l.getRoleLabel)(r.role),"模式"]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-2xl font-black leading-tight text-ink",children:r.name}),(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"student"===r.role?"匿名檔案":(0,l.getRoleLabel)(r.role)})]}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:d})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-coral px-3 py-2 text-xs font-black text-white shadow-sm",children:"切換帳號"})]})}),a?(0,t.jsx)("div",{className:"mt-3",children:h}):null]})}e.s(["AppSidebar",0,function(){let e=(0,r.usePathname)(),{person:n,isLoggedIn:l,signOut:s}=(0,i.useActivePerson)();function h(){s();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsx)("aside",{className:"fixed inset-y-0 left-0 z-20 hidden w-64 flex-col border-r border-softline/80 bg-white/85 backdrop-blur-xl lg:flex",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 py-6",children:[(0,t.jsxs)(a.ExportSafeLink,{className:"flex items-center gap-3",href:l?"/dashboard":"/",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"text-sm font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),l?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{}),(0,t.jsx)("nav",{className:"grid gap-2 pr-1",children:c(n.grade,n.role).map(n=>{let r=d(e,n.href),l=`flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left transition ${r?"bg-butter text-amber-900 shadow-sm":"text-stone-600 hover:bg-butter hover:text-amber-900"}`,s=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 place-items-center rounded-xl text-sm font-black shadow-sm ${r?"bg-white text-coral":"bg-white text-stone-500"}`,children:n.icon}),(0,t.jsx)("span",{className:"font-bold",children:n.label})]});return"登出"===n.label?(0,t.jsx)("button",{type:"button",onClick:h,className:l,children:s},n.label):(0,t.jsx)(a.ExportSafeLink,{href:n.href,className:l,children:s},n.label)})})]}):(0,t.jsx)("div",{className:"grid gap-3",children:o.map(e=>(0,t.jsx)(a.ExportSafeLink,{href:e.href,className:e.primary?"rounded-2xl bg-coral px-4 py-3 text-center font-black text-white shadow-warm transition hover:brightness-105":"rounded-2xl border border-softline bg-white px-4 py-3 text-center font-black text-amber-800 transition hover:bg-butter",children:e.label},e.label))}),l?(0,t.jsxs)(a.ExportSafeLink,{href:"student"===n.role?"/wrong-review":"/parent-weekly-report",className:"mt-auto rounded-2xl border border-green-100 bg-green-50 p-4 text-sm text-green-900 transition hover:-translate-y-0.5 hover:bg-green-100",children:[(0,t.jsx)("span",{className:"block text-xs font-black text-green-700",children:"本週學習摘要"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg",children:"每天一小步,進度看得見"}),(0,t.jsx)("span",{className:"mt-2 block font-bold text-green-700",children:"查看進度與需要再練的內容 →"})]}):null]})})},"MobileMenu",0,function(){let e=(0,r.usePathname)(),{person:l,signOut:s}=(0,i.useActivePerson)(),[o,u]=(0,n.useState)(!1),h=c(l.grade,l.role);function m(){s();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsxs)("div",{className:"shrink-0 lg:hidden",children:[(0,t.jsx)("button",{type:"button",onClick:()=>u(e=>!e),className:"grid min-h-11 min-w-11 place-items-center rounded-2xl bg-white text-xl font-black text-amber-900 shadow-sm active:scale-[0.98]","aria-expanded":o,"aria-label":"開啟完整功能選單",children:o?"×":"☰"}),o?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100dvh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("strong",{className:"block text-base font-black text-ink",children:"全部功能"}),(0,t.jsxs)("span",{className:"text-xs font-bold text-stone-500",children:["依 ",l.name," 的身分顯示"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉功能選單",children:"×"})]}),(0,t.jsx)("nav",{className:"grid grid-cols-2 gap-2",children:h.map(n=>{let r=d(e,n.href),l=`flex min-h-16 items-center gap-3 rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${r?"bg-coral text-white":"bg-white text-stone-700"}`,s=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 shrink-0 place-items-center rounded-xl text-sm font-black ${r?"bg-white/20":"bg-butter text-amber-900"}`,children:n.icon}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:n.label})]});return"登出"===n.label?(0,t.jsx)("button",{type:"button",onClick:m,className:l,children:s},n.label):(0,t.jsx)(a.ExportSafeLink,{href:n.href,onClick:()=>u(!1),className:l,children:s},n.label)})})]}):null]})},"MobileQuickNav",0,function(){var e;let n,l=(0,r.usePathname)(),{person:s}=(0,i.useActivePerson)(),o=(n=c(s.grade,e=s.role),("guest"===e?["課程首頁","課程總覽"]:({student:["課程首頁","每日 10 題","英文練習","課程總覽"],parent:["課程首頁","進度月曆","每日紀錄","週計畫"],teacher:["課程首頁","課程總覽","週計畫","手寫出題"]})[e]).map(e=>n.find(t=>t.label===e)).filter(e=>!!e));return(0,t.jsx)("nav",{className:"fixed inset-x-3 bottom-[max(0.75rem,env(safe-area-inset-bottom))] z-50 grid grid-cols-4 gap-1 rounded-3xl border border-white/80 bg-white/90 p-2 shadow-warm backdrop-blur-xl lg:hidden","aria-label":"主要功能",children:o.map(e=>{let n=d(l,e.href);return(0,t.jsxs)(a.ExportSafeLink,{href:e.href,className:`flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl px-1 py-2 text-center transition active:scale-[0.98] ${n?"bg-coral text-white shadow-sm":"text-stone-600"}`,children:[(0,t.jsx)("span",{className:"text-sm font-black",children:e.icon}),(0,t.jsx)("span",{className:"w-full truncate text-[11px] font-black",children:e.label})]},e.label)})})},"PersonSwitcher",0,u])},55634,e=>{"use strict";var t=e.i(43476),n=e.i(71645),r=e.i(18566),a=e.i(14876),l=e.i(41324);e.s(["ActiveGradeRouteSync",0,function(){let e=(0,r.usePathname)(),{person:s,isLoggedIn:i,isReady:o}=(0,l.useActivePerson)(),c=function(e){let t=e.match(/^\/learn\/(?:grade-)?([1-6])(?:\/|$)/);if(t)return Number(t[1]);let n=e.match(/^\/courses\/grade-([1-6])(?:\/|$)/);if(n)return Number(n[1]);let r=e.match(/^\/(?:lesson|practice|handwriting)\/grade-([1-6])-/);return r?Number(r[1]):null}(e),d=!!(o&&i&&"student"===s.role&&c&&c!==s.grade);return((0,n.useEffect)(()=>{var t;if(!d)return;let n=(t=s.grade,/^\/learn\/(?:grade-)?[1-6](?:\/|$)/.test(e)?e.replace(/^\/learn\/(?:grade-)?[1-6]/,`/learn/${t}`):/^\/courses\/grade-[1-6](?:\/|$)/.test(e)?e.replace(/^\/courses\/grade-[1-6]/,`/courses/grade-${t}`):e.replace(/^(\/(?:lesson|practice|handwriting)\/)grade-[1-6]-/,`$1grade-${t}-`)),r=`${(0,a.getExportSafeHref)(n)}${window.location.search}${window.location.hash}`;window.location.replace(r)},[e,s.grade,d]),o&&!d)?null:(0,t.jsx)("div",{className:"fixed inset-0 z-[100] grid place-items-center bg-[#fffaf3]/95 p-5 backdrop-blur-md",role:"status","aria-live":"polite",children:(0,t.jsxs)("div",{className:"w-full max-w-md rounded-[2rem] border border-white bg-white/90 p-7 text-center shadow-warm",children:[(0,t.jsx)("span",{className:"mx-auto grid h-14 w-14 place-items-center rounded-2xl bg-butter text-2xl","aria-hidden":"true",children:"☀"}),(0,t.jsx)("strong",{className:"mt-4 block text-2xl font-black text-ink",children:o?`正在切換到小${s.grade}課程`:"正在讀取目前學習年級"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"晨光會自動載入這位學習者正確的課程內容。"})]})})}],55634)},12408,e=>{"use strict";function t(){return"speechSynthesis"in window&&"SpeechSynthesisUtterance"in window}function n(e,r={}){if(!e.trim())return{ok:!1,message:"請先選擇要播放的內容。"};if(!t())return{ok:!1,message:"這個瀏覽器不支援語音播放,建議使用 Chrome 或 Edge。"};window.speechSynthesis.cancel();let a=new SpeechSynthesisUtterance(e);return a.lang=r.lang??"en-US",a.rate=r.rate??.82,a.pitch=r.pitch??1,a.volume=r.volume??1,window.speechSynthesis.speak(a),{ok:!0,message:"正在播放標準發音。"}}e.s(["speakEnglish",0,function(e,t={}){return n(e,{...t,lang:"en-US"})},"speakMandarin",0,function(e,t={}){return n(e,{rate:.76,pitch:1.05,...t,lang:"zh-TW"})},"speakText",0,n,"stopSpeech",0,function(){t()&&window.speechSynthesis.cancel()}])},32324,e=>{"use strict";var t=e.i(43476);let n={一:"ㄧ",二:"ㄦˋ",三:"ㄙㄢ",上衣:"ㄕㄤˋ ㄧ",下午:"ㄒㄧㄚˋ ㄨˇ",下雨的:"ㄒㄧㄚˋ ㄩˇ ㄉㄜ˙",不舒服:"ㄅㄨˋ ㄕㄨ ㄈㄨ˙",今天:"ㄐㄧㄣ ㄊㄧㄢ",公園:"ㄍㄨㄥ ㄩㄢˊ",午餐:"ㄨˇ ㄘㄢ",天氣:"ㄊㄧㄢ ㄑㄧˋ",手:"ㄕㄡˇ",水:"ㄕㄨㄟˇ",牛奶:"ㄋㄧㄡˊ ㄋㄞˇ",兄弟:"ㄒㄩㄥ ㄉㄧˋ",右邊:"ㄧㄡˋ ㄅㄧㄢ",左邊:"ㄗㄨㄛˇ ㄅㄧㄢ",市場:"ㄕˋ ㄔㄤˇ",再見:"ㄗㄞˋ ㄐㄧㄢˋ",多雲的:"ㄉㄨㄛ ㄩㄣˊ ㄉㄜ˙",早上:"ㄗㄠˇ ㄕㄤˋ",早餐:"ㄗㄠˇ ㄘㄢ",有風的:"ㄧㄡˇ ㄈㄥ ㄉㄜ˙",老師:"ㄌㄠˇ ㄕ",作業:"ㄗㄨㄛˋ ㄧㄝˋ",你好:"ㄋㄧˇ ㄏㄠˇ",車站:"ㄔㄜ ㄓㄢˋ",姊妹:"ㄗˇ ㄇㄟˋ",房間:"ㄈㄤˊ ㄐㄧㄢ",朋友:"ㄆㄥˊ ㄧㄡˇ",河流:"ㄏㄜˊ ㄌㄧㄡˊ",爸爸:"ㄅㄚˋ ㄅㄚ˙",玩:"ㄨㄢˊ",附近:"ㄈㄨˋ ㄐㄧㄣˋ",紅色:"ㄏㄨㄥˊ ㄙㄜˋ",書:"ㄕㄨ",書包:"ㄕㄨ ㄅㄠ",桌子:"ㄓㄨㄛ ㄗ˙",商店:"ㄕㄤ ㄉㄧㄢˋ",問題:"ㄨㄣˋ ㄊㄧˊ",教室:"ㄐㄧㄠˋ ㄕˋ",晚上:"ㄨㄢˇ ㄕㄤˋ",晚餐:"ㄨㄢˇ ㄘㄢ",累了:"ㄌㄟˋ ㄌㄜ˙",帽子:"ㄇㄠˋ ㄗ˙",晴朗的:"ㄑㄧㄥˊ ㄌㄤˇ ㄉㄜ˙",渴了:"ㄎㄜˇ ㄌㄜ˙",畫畫:"ㄏㄨㄚˋ ㄏㄨㄚˋ",答案:"ㄉㄚˊ ㄢˋ",開心:"ㄎㄞ ㄒㄧㄣ",黃色:"ㄏㄨㄤˊ ㄙㄜˋ",媽媽:"ㄇㄚ ㄇㄚ˙",準備好了:"ㄓㄨㄣˇ ㄅㄟˋ ㄏㄠˇ ㄌㄜ˙",腳:"ㄐㄧㄠˇ",鉛筆:"ㄑㄧㄢ ㄅㄧˇ",圖書館:"ㄊㄨˊ ㄕㄨ ㄍㄨㄢˇ",睡覺:"ㄕㄨㄟˋ ㄐㄧㄠˋ",綠色:"ㄌㄩˋ ㄙㄜˋ",說:"ㄕㄨㄛ",寫:"ㄒㄧㄝˇ",練習:"ㄌㄧㄢˋ ㄒㄧˊ",複習:"ㄈㄨˋ ㄒㄧˊ",請:"ㄑㄧㄥˇ",閱讀:"ㄩㄝˋ ㄉㄨˊ",莊:"ㄓㄨㄤ",村莊:"ㄘㄨㄣ ㄓㄨㄤ",鞋子:"ㄒㄧㄝˊ ㄗ˙",餓了:"ㄜˋ ㄌㄜ˙",學校:"ㄒㄩㄝˊ ㄒㄧㄠˋ",學習:"ㄒㄩㄝˊ ㄒㄧˊ",樹:"ㄕㄨˋ",橡皮擦:"ㄒㄧㄤˋ ㄆㄧˊ ㄘㄚ",醒來:"ㄒㄧㄥˇ ㄌㄞˊ",頭:"ㄊㄡˊ",謝謝你:"ㄒㄧㄝˋ ㄒㄧㄝ˙ ㄋㄧˇ",藍色:"ㄌㄢˊ ㄙㄜˋ",醫院:"ㄧ ㄩㄢˋ",難過:"ㄋㄢˊ ㄍㄨㄛˋ",蘋果:"ㄆㄧㄥˊ ㄍㄨㄛˇ",麵包:"ㄇㄧㄢˋ ㄅㄠ",聽:"ㄊㄧㄥ","老師,你好。":"ㄌㄠˇ ㄕ,ㄋㄧˇ ㄏㄠˇ。","這是我的書。":"ㄓㄜˋ ㄕˋ ㄨㄛˇ ㄉㄜ˙ ㄕㄨ。","謝謝你。":"ㄒㄧㄝˋ ㄒㄧㄝ˙ ㄋㄧˇ。","我需要幫忙。":"ㄨㄛˇ ㄒㄩ ㄧㄠˋ ㄅㄤ ㄇㄤˊ。","這是我的家人。":"ㄓㄜˋ ㄕˋ ㄨㄛˇ ㄉㄜ˙ ㄐㄧㄚ ㄖㄣˊ。","我喜歡蘋果。":"ㄨㄛˇ ㄒㄧˇ ㄏㄨㄢ ㄆㄧㄥˊ ㄍㄨㄛˇ。","我讀一本書。":"ㄨㄛˇ ㄉㄨˊ ㄧˋ ㄅㄣˇ ㄕㄨ。","我和朋友一起玩。":"ㄨㄛˇ ㄏㄜˊ ㄆㄥˊ ㄧㄡˇ ㄧˋ ㄑㄧˇ ㄨㄢˊ。","我說英文。":"ㄨㄛˇ ㄕㄨㄛ ㄧㄥ ㄨㄣˊ。","我有一個問題。":"ㄨㄛˇ ㄧㄡˇ ㄧˊ ㄍㄜ˙ ㄨㄣˋ ㄊㄧˊ。","我去圖書館。":"ㄨㄛˇ ㄑㄩˋ ㄊㄨˊ ㄕㄨ ㄍㄨㄢˇ。","我準備好了。":"ㄨㄛˇ ㄓㄨㄣˇ ㄅㄟˋ ㄏㄠˇ ㄌㄜ˙。","河邊有一個安靜的村莊。":"ㄏㄜˊ ㄅㄧㄢ ㄧㄡˇ ㄧˊ ㄍㄜ˙ ㄢ ㄐㄧㄥˋ ㄉㄜ˙ ㄘㄨㄣ ㄓㄨㄤ。"};e.s(["ZhuyinText",0,function({text:e,show:r=!0,compact:a=!1,className:l=""}){let s,i,o=r?(i=(s=e.trim()).match(/^我的名字是 (.+)。$/))?`ㄨㄛˇ ㄉㄜ˙ ㄇㄧㄥˊ ㄗˋ ㄕˋ ${i[1]}。`:n[s]??"":"";return(0,t.jsxs)("span",{className:`inline-flex flex-wrap items-center gap-x-2 gap-y-1 ${l}`,children:[(0,t.jsx)("span",{children:e}),o?(0,t.jsx)("span",{className:`rounded-full bg-white/85 font-black tracking-wide text-stone-500 shadow-sm ${a?"px-2 py-1 text-[11px]":"px-3 py-1 text-xs"}`,children:o}):null]})}],32324)},47106,e=>{"use strict";var t=e.i(43476),n=e.i(71645);let r=[["write","right"],["two","to","too"],["one","won"],["read","reed"],["blue","blew"],["weather","whether"]];function a(){let e=window;return e.SpeechRecognition??e.webkitSpeechRecognition??null}function l(e){return e.toLowerCase().replace(/\bi'm\b/g,"i am").replace(/\bit's\b/g,"it is").replace(/\byou're\b/g,"you are").replace(/\bwe're\b/g,"we are").replace(/\bthey're\b/g,"they are").replace(/\bcan't\b/g,"cannot").replace(/\bdon't\b/g,"do not").replace(/[^a-z\s']/g,"").replace(/\s+/g," ").trim()}function s(e,t){let n=l(e),a=l(t);if(!n||!a)return 0;if(n===a||r.some(e=>e.includes(n)&&e.includes(a)))return 1;let s=Math.max(n.length,a.length),i=Math.max(0,1-function(e,t){let n=Array.from({length:e.length+1},()=>Array(t.length+1).fill(0));for(let t=0;t<=e.length;t+=1)n[t][0]=t;for(let e=0;e<=t.length;e+=1)n[0][e]=e;for(let r=1;r<=e.length;r+=1)for(let a=1;a<=t.length;a+=1){let l=+(e[r-1]!==t[a-1]);n[r][a]=Math.min(n[r-1][a]+1,n[r][a-1]+1,n[r-1][a-1]+l)}return n[e.length][t.length]}(n,a)/s),o=n.split(" "),c=a.split(" ");if(1===o.length)return i;let d=function(e,t){let n=Array.from({length:e.length+1},()=>Array(t.length+1).fill(0));for(let r=1;r<=e.length;r+=1)for(let a=1;a<=t.length;a+=1)n[r][a]=e[r-1]===t[a-1]?n[r-1][a-1]+1:Math.max(n[r-1][a],n[r][a-1]);return n[e.length][t.length]}(o,c),u=d/o.length,h=d/c.length;return u<.7||h<.7?Math.min(i,.69):.45*i+.4*u+.15*h}function i(e){return e.replace(/[\s,。!?、,.!?]/g,"").trim()}function o(e,t,n=[]){let r=[e,...n].map(i).filter(Boolean),a=i(t);return!!r.length&&!!a&&r.some(e=>a===e||a.includes(e)||e.includes(a))}function c(e,t,n="en-US",r=[]){return n.toLowerCase().startsWith("zh")?o(e,t,r):[e,...r].some(e=>{var n;let r,a;return s(n=e,t)>=(1===(a=(r=l(n)).split(" ").filter(Boolean).length)&&r.length<=4?.9:1===a?.86:.8)})}var d=e.i(12408);e.s(["SpeechPracticeButton",0,function({expected:e,alternatives:r=[],lang:i="en-US",listenLabel:u="開始口說辨識",speakLabel:h="先聽一次",targetLabel:m="目標",compact:g=!1,showParentControls:f=!0,onResult:p,onReviewed:x,listenSeconds:b}){var w;let y,v,[j,k]=(0,n.useState)(!1),[N,S]=(0,n.useState)(!1),[P,$]=(0,n.useState)(!1),[E,R]=(0,n.useState)(null),[C,L]=(0,n.useState)(0),[M,T]=(0,n.useState)(!1),[I,A]=(0,n.useState)(""),[U,O]=(0,n.useState)(null),_=(0,n.useRef)(null),B=(0,n.useRef)([]),z=(0,n.useRef)(0);(0,n.useEffect)(()=>(k(!0),()=>{z.current+=1,I&&URL.revokeObjectURL(I),_.current?.stream.getTracks().forEach(e=>e.stop())}),[I]),(0,n.useEffect)(()=>{O(null),T(!1),R(null)},[e]);let D=(0,n.useMemo)(()=>j&&!!a(),[j]),W=j&&!D;function H(e){O(e),p?.(e)}async function K(){let t=z.current+1;z.current=t,(0,d.stopSpeech)(),O(null),T(!1);for(let e=3;e>=1;e-=1)if(R(e),await new Promise(e=>window.setTimeout(e,900)),z.current!==t)return;R(null),S(!0);let n=b??(e.trim().split(/\s+/).length>2?15:12);L(n);let u=window.setInterval(()=>L(e=>Math.max(0,e-1)),1e3);await new Promise(e=>window.setTimeout(e,220));let h=await function({expected:e,alternatives:t=[],lang:n="en-US",timeoutMs:r}){let i=a();return i?new Promise(a=>{let d=new i,u=r??(l(e).split(" ").filter(Boolean).length>2?15e3:12e3),h=Date.now()+u,m=!1,g="",f=0,p=0,x=0,b=e=>{if(!m){m=!0,window.clearTimeout(w);try{d.abort()}catch{}a(e)}},w=window.setTimeout(()=>{b({ok:!1,transcript:g,confidence:f,accuracy:Math.round(100*p),message:g?"有聽到聲音,但內容還不夠接近目標。放慢速度再試一次。":"還沒有聽到清楚的聲音,請靠近麥克風再試一次。"})},u);d.lang=n,d.interimResults=!0,d.maxAlternatives=5,d.continuous=!1;let y=()=>!(m||x>=2||Date.now()+900>=h)&&(x+=1,window.setTimeout(()=>{if(!m)try{d.start()}catch{}},320),!0);d.onresult=r=>{for(let a of Array.from({length:r.results.length},(e,t)=>r.results[t]))for(let r of Array.from({length:a.length},(e,t)=>a[t]).filter(Boolean)){let a=n.toLowerCase().startsWith("zh")?+!!o(e,r.transcript,t):function(e,t,n){return Math.max(...[e,...n].map(e=>s(e,t)))}(e,r.transcript,t),l=r.confidence??0;(a>p||a===p&&l>f)&&(g=r.transcript,f=l,p=a)}c(e,g,n,t)&&b({ok:!0,transcript:g,confidence:f,accuracy:Math.round(100*p),message:"系統有聽懂,發音和目標內容很接近。"})},d.onerror=e=>{("no-speech"===e.error||"aborted"===e.error)&&y()||b({ok:!1,transcript:g,confidence:f,accuracy:Math.round(100*p),message:"not-allowed"===e.error?"請允許瀏覽器使用麥克風,才能進行口說辨識。":"語音辨識暫時沒有收到完整內容,請再試一次。"})},d.onend=()=>{m||(c(e,g,n,t)?b({ok:!0,transcript:g,confidence:f,accuracy:Math.round(100*p),message:"系統有聽懂,發音和目標內容很接近。"}):y()||b({ok:!1,transcript:g,confidence:f,accuracy:Math.round(100*p),message:g?"內容還差一點,看看系統聽到的文字,再慢慢說一次。":"這次沒有聽清楚,請靠近麥克風再試一次。"}))};try{d.start()}catch{b({ok:!1,transcript:"",confidence:0,accuracy:0,message:"麥克風正在準備中,請稍等一下再按一次。"})}}):Promise.resolve({ok:!1,transcript:"",confidence:0,accuracy:0,message:"這個瀏覽器目前不支援語音轉文字,仍可使用錄音回放模式。"})}({expected:e,alternatives:r,lang:i,timeoutMs:1e3*n});window.clearInterval(u),z.current===t&&(S(!1),L(0),H(h))}async function F(){if(!("u">typeof navigator&&navigator.mediaDevices?.getUserMedia&&"u">typeof MediaRecorder))return void H({ok:!1,transcript:"",confidence:0,message:"這台裝置無法錄音,請讓孩子跟著家長唸一次。"});try{let e=await navigator.mediaDevices.getUserMedia({audio:!0}),t=new MediaRecorder(e);B.current=[],_.current=t,t.ondataavailable=e=>{e.data.size>0&&B.current.push(e.data)},t.onstop=()=>{let n=new Blob(B.current,{type:t.mimeType||"audio/webm"});I&&URL.revokeObjectURL(I),A(URL.createObjectURL(n)),e.getTracks().forEach(e=>e.stop())},t.start(),$(!0),O(null)}catch{H({ok:!1,transcript:"",confidence:0,message:"請允許麥克風權限,才能錄下孩子的口說練習。"})}}function G(e){H({ok:e,transcript:e?"家長確認發音接近目標":"家長確認需要再練一次",confidence:e?1:.35,message:e?"家長確認唸對了,很棒。":"再練一次,先聽標準發音再慢慢唸。"})}let q=U?.transcript&&"en-US"===i?(w=U.transcript,y=l(e).split(" ").filter(Boolean),v=new Set(l(w).split(" ").filter(Boolean)),y.map(e=>({word:e,heard:v.has(e)}))):[];return(0,t.jsxs)("div",{className:`mt-4 border border-blue-100 bg-blue-50/70 ${g?"rounded-2xl p-3":"rounded-3xl p-4 md:p-5"}`,children:[(0,t.jsxs)("div",{className:"rounded-2xl bg-white/85 p-4",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,t.jsx)("span",{className:"rounded-full bg-blue-100 px-3 py-1 text-xs font-black text-blue-800",children:D?"孩子口說辨識":"錄音回放模式"}),(0,t.jsx)("span",{className:"text-xs font-bold text-stone-500",children:"系統不會自己開始播放"})]}),g?null:(0,t.jsxs)("div",{className:"mt-3",children:[(0,t.jsx)("p",{className:"text-xs font-black text-stone-500",children:m}),(0,t.jsx)("p",{className:"mt-1 text-xl font-black leading-8 text-blue-800",children:e})]})]}),(0,t.jsx)("p",{className:"mt-3 text-sm font-bold leading-7 text-stone-600",children:D?"請孩子準備好後按下紅色按鈕,再親自把上面的內容唸出來。":"這台裝置目前不能直接轉成文字,仍可錄下孩子的聲音並回放。"}),(0,t.jsxs)("div",{className:"mt-3 grid gap-2 sm:grid-cols-2",children:[D?(0,t.jsx)("button",{type:"button",onClick:K,disabled:N||null!==E,className:"min-h-14 rounded-2xl bg-coral px-4 py-3 text-base font-black text-white shadow-sm transition hover:brightness-105 disabled:cursor-wait disabled:opacity-70",children:null!==E?`準備 ${E}`:N?`正在聽,還有 ${C} 秒`:u}):(0,t.jsx)("button",{type:"button",onClick:P?function(){_.current&&"inactive"!==_.current.state&&(_.current.stop(),$(!1))}:F,className:"min-h-14 rounded-2xl bg-coral px-4 py-3 text-base font-black text-white shadow-sm transition hover:brightness-105",children:P?"完成錄音":"錄下我的朗讀"}),(0,t.jsx)("button",{type:"button",onClick:()=>(0,d.speakText)(e,{lang:i,rate:"zh-TW"===i?.72:.68}),className:"min-h-14 rounded-2xl bg-butter px-4 py-3 text-base font-black text-amber-900 shadow-sm transition hover:bg-amber-100",children:h})]}),I&&W?(0,t.jsxs)("div",{className:"mt-3 rounded-2xl bg-white/80 p-3",children:[(0,t.jsx)("p",{className:"mb-2 text-sm font-bold text-stone-600",children:"iPhone/iPad 錄音回放:先聽孩子剛剛的聲音,再由家長協助確認。"}),(0,t.jsx)("audio",{className:"w-full",controls:!0,src:I}),(0,t.jsx)("button",{type:"button",onClick:()=>H({ok:!0,transcript:"已完成錄音並回放",confidence:1,accuracy:100,message:"這台裝置使用錄音回放模式,已完成本次朗讀。"}),className:"mt-3 min-h-12 w-full rounded-2xl bg-green-700 px-4 py-3 text-sm font-black text-white shadow-sm",children:"我已聽過錄音,完成這次朗讀"})]}):null,U?(0,t.jsxs)("div",{"aria-live":"polite",className:`mt-3 min-h-20 rounded-2xl p-4 text-sm font-bold leading-7 ${U.ok?"bg-green-50 text-green-900":"bg-rose-50 text-rose-900"}`,children:[(0,t.jsx)("p",{className:"text-base font-black",children:U.ok?"有聽到孩子的聲音,這次很接近。":"這次還沒聽完整,再慢慢說一次。"}),U.transcript?(0,t.jsxs)("p",{className:"mt-1",children:["系統聽到:",U.transcript]}):(0,t.jsx)("p",{className:"mt-1",children:"系統還沒有收到清楚的文字。"}),(0,t.jsxs)("p",{className:"mt-1",children:["目標內容:",e]}),"number"==typeof U.accuracy?(0,t.jsxs)("p",{children:["內容接近度:",U.accuracy,"%"]}):null,q.length>1?(0,t.jsx)("div",{className:"mt-2 flex flex-wrap gap-2","aria-label":"逐字辨識結果",children:q.map(({word:e,heard:n},r)=>(0,t.jsxs)("span",{className:`rounded-full px-3 py-1 text-xs font-black ${n?"bg-green-100 text-green-800":"bg-white text-rose-800"}`,children:[e," ",n?"有聽到":"再練一次"]},`${e}-${r}`))}):null,U.ok?null:(0,t.jsxs)("p",{className:"mt-2",children:["小提示:","zh-TW"===i?"先看注音,再按紅色按鈕自己唸一次。":`可以拆成「${function(e){if(e.includes(" "))return e.split(" ").join(" / ");if(e.length<=4)return e;let t=Math.ceil(e.length/2);return`${e.slice(0,t)} / ${e.slice(t)}`}(e)}」,放慢速度再試一次。`]}),U.ok&&x?(0,t.jsx)("button",{type:"button",disabled:M,onClick:function(){U?.ok&&!M&&(T(!0),x?.(U))},className:"mt-3 min-h-12 rounded-2xl bg-green-700 px-5 py-3 text-base font-black text-white shadow-sm disabled:bg-green-200 disabled:text-green-800",children:M?"已理解,可以前進":"我看懂了,完成口說"}):null]}):(0,t.jsx)("p",{"aria-live":"polite",className:"mt-3 min-h-16 rounded-2xl bg-white/65 p-3 text-sm font-bold leading-7 text-stone-500",children:null!==E?"先看著目標內容準備,倒數結束再開始說。":N?"麥克風已開啟,請孩子現在開始說;唸完後停一下,系統會自動判斷。":"尚未開始。按紅色按鈕後會先倒數 3 秒,再給孩子足夠時間朗讀。"}),f?(0,t.jsxs)("details",{className:"mt-3 rounded-2xl bg-white/70 px-4 py-3",children:[(0,t.jsx)("summary",{className:"cursor-pointer text-sm font-black text-stone-600",children:"家長協助確認(選用)"}),(0,t.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("button",{type:"button",onClick:()=>G(!0),className:"rounded-xl bg-mint px-3 py-2 text-xs font-black text-green-800",children:"聽起來正確"}),(0,t.jsx)("button",{type:"button",onClick:()=>G(!1),className:"rounded-xl bg-white px-3 py-2 text-xs font-black text-amber-900 shadow-sm",children:"需要再練"})]})]}):null]})}],47106)}]);
_next/static/chunks/0x-17au6zvwi6.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,42391,e=>{"use strict";var t=e.i(43476);e.s(["PageHeader",0,function({eyebrow:e,title:r,description:n,action:a}){return(0,t.jsxs)("header",{className:"flex min-w-0 flex-col gap-5 pb-1 sm:flex-row sm:items-start sm:justify-between",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-black uppercase tracking-[0.08em] text-amber-700",children:e}),(0,t.jsx)("h1",{className:"mt-2 text-3xl font-black leading-tight tracking-normal text-ink md:text-5xl",children:r}),n?(0,t.jsx)("p",{className:"mt-3 max-w-3xl text-base font-medium leading-7 text-stone-600 md:text-lg md:leading-8",children:n}):null]}),a?(0,t.jsx)("div",{className:"w-full shrink-0 sm:w-auto",children:a}):null]})}])},95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return i},formatWithValidation:function(){return c},urlObjectKeys:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let s=e.r(90809)._(e.r(98183)),l=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:r}=e,n=e.protocol||"",a=e.pathname||"",i=e.hash||"",o=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),o&&"object"==typeof o&&(o=String(s.urlQueryToSearchParams(o)));let d=e.search||o&&`?${o}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||l.test(n))&&!1!==c?(c="//"+(c||""),a&&"/"!==a[0]&&(a="/"+a)):c||(c=""),i&&"#"!==i[0]&&(i="#"+i),d&&"?"!==d[0]&&(d="?"+d),a=a.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${n}${c}${a}${d}${i}`}let o=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return i(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t){let r=(0,n.useRef)(null),a=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(r.current=s(e,n)),t&&(a.current=s(t,n))},[e,t])}function s(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return s}});let n=e.r(18967),a=e.r(52817);function s(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,a.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return b},useLinkStatus:function(){return w}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let s=e.r(90809),l=e.r(43476),i=s._(e.r(71645)),o=e.r(95057),c=e.r(8372),d=e.r(18581),u=e.r(18967),h=e.r(5550);e.r(33525);let m=e.r(88540),g=e.r(91949),f=e.r(73668),x=e.r(9396);function b(t){var r,n;let a,s,b,[w,j]=(0,i.useOptimistic)(g.IDLE_LINK_STATUS),v=(0,i.useRef)(null),{href:N,as:y,children:k,prefetch:S=null,passHref:P,replace:I,shallow:$,scroll:C,onClick:E,onMouseEnter:L,onTouchStart:R,legacyBehavior:A=!1,onNavigate:_,transitionTypes:O,ref:M,unstable_dynamicOnHover:T,...B}=t;a=k,A&&("string"==typeof a||"number"==typeof a)&&(a=(0,l.jsx)("a",{children:a}));let H=i.default.useContext(c.AppRouterContext),U=!1!==S,D=!1!==S?null===(n=S)||"auto"===n?x.FetchStrategy.PPR:x.FetchStrategy.Full:x.FetchStrategy.PPR,G="string"==typeof(r=y||N)?r:(0,o.formatUrl)(r);if(A){if(a?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});s=i.default.Children.only(a)}let z=A?s&&"object"==typeof s&&s.ref:M,F=i.default.useCallback(e=>(null!==H&&(v.current=(0,g.mountLinkInstance)(e,G,H,D,U,j)),()=>{v.current&&((0,g.unmountLinkForCurrentNavigation)(v.current),v.current=null),(0,g.unmountPrefetchableInstance)(e)}),[U,G,H,D,j]),K={ref:(0,d.useMergedRef)(F,z),onClick(t){A||"function"!=typeof E||E(t),A&&s.props&&"function"==typeof s.props.onClick&&s.props.onClick(t),!H||t.defaultPrevented||function(t,r,n,a,s,l,o){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,f.isLocalURL)(r)){a&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);i.default.startTransition(()=>{u(r,a?"replace":"push",!1===s?m.ScrollBehavior.NoScroll:m.ScrollBehavior.Default,n.current,o)})}}(t,G,v,I,C,_,O)},onMouseEnter(e){A||"function"!=typeof L||L(e),A&&s.props&&"function"==typeof s.props.onMouseEnter&&s.props.onMouseEnter(e),H&&U&&(0,g.onNavigationIntent)(e.currentTarget,!0===T)},onTouchStart:function(e){A||"function"!=typeof R||R(e),A&&s.props&&"function"==typeof s.props.onTouchStart&&s.props.onTouchStart(e),H&&U&&(0,g.onNavigationIntent)(e.currentTarget,!0===T)}};return(0,u.isAbsoluteUrl)(G)?K.href=G:A&&!P&&("a"!==s.type||"href"in s.props)||(K.href=(0,h.addBasePath)(G)),b=A?i.default.cloneElement(s,K):(0,l.jsx)("a",{...B,...K,children:a}),(0,l.jsx)(p.Provider,{value:w,children:b})}e.r(84508);let p=(0,i.createContext)(g.IDLE_LINK_STATUS),w=()=>(0,i.useContext)(p);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},14876,e=>{"use strict";var t=e.i(43476),r=e.i(22016);function n(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:r,suffix:n}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===r?`/index.html${n}`:/\.[a-z0-9]+$/i.test(r)?e:`${r.replace(/\/+$/,"")}/index.html${n}`}e.s(["ExportSafeLink",0,function({href:e,children:a,...s}){return"string"==typeof e?(0,t.jsx)("a",{href:n(e),...s,children:a}):(0,t.jsx)(r.default,{href:e,...s,children:a})},"getExportSafeHref",0,n])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let r=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function n(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return r.find(t=>t.grade===e)},"getGradeIdByNumber",0,n,"grades",0,r],62312);let a=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],s={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function l(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.find(e=>e.id===t)??s}function i(e){if(!e)return s.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.some(e=>e.id===t)?t:s.id}e.s(["currentStudent",0,s,"getCurrentStudentGradeId",0,function(e=s){return n(e.grade)},"getPersonById",0,l,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,a,"normalizePersonId",0,i],7728);let o="chenguang-active-person-id",c="chenguang-active-person-change",d="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,r]=(0,t.useState)(s.id),[n,a]=(0,t.useState)(!1),[h,m]=(0,t.useState)(!1);function g(e){let t=i(e);r(t),window.localStorage.setItem(o,t),window.dispatchEvent(new Event(c))}return(0,t.useEffect)(()=>{let e=i(window.localStorage.getItem(o));function t(){let e=i(window.localStorage.getItem(o));r(e),window.localStorage.setItem(o,e)}function n(){a(!!window.localStorage.getItem(d))}return r(e),window.localStorage.setItem(o,e),a(!!window.localStorage.getItem(d)),m(!0),window.addEventListener(c,t),window.addEventListener("storage",t),window.addEventListener(u,n),()=>{window.removeEventListener(c,t),window.removeEventListener("storage",t),window.removeEventListener(u,n)}},[]),{person:l(e),switchPerson:g,signIn:function(e){let t=i(e);g(t);let r=l(t);window.localStorage.setItem(d,JSON.stringify({personId:t,role:r.role,signedInAt:new Date().toISOString()})),a(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(d),a(!1),window.dispatchEvent(new Event(u))},isLoggedIn:n,isReady:h}}],41324)},82697,e=>{"use strict";var t=e.i(43476),r=e.i(14876),n=e.i(7728),a=e.i(62312),s=e.i(41324);e.s(["BrandHeader",0,function({showPerson:e=!0}){let{person:l,isLoggedIn:i}=(0,s.useActivePerson)(),o=(0,a.getGradeByNumber)(l.grade),c=i?`${(0,n.getPersonDisplayName)(l)}|${"student"===l.role?(0,n.getPersonSubtitle)(l):o?.shortName??`小${l.grade}`}`:"訪客模式";return(0,t.jsxs)(r.ExportSafeLink,{href:i?"/dashboard":"/",className:"flex min-w-0 items-center gap-3 text-ink",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 shrink-0 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{className:"min-w-0 leading-tight",children:[(0,t.jsx)("strong",{className:"block truncate text-xl font-black",children:"晨光"}),(0,t.jsx)("small",{className:"block truncate text-sm font-bold text-stone-500",children:e?c:"國小學習陪跑系統"})]})]})}])},18566,(e,t,r)=>{t.exports=e.r(76562)},22468,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),s=e.i(7728),l=e.i(62312),i=e.i(41324);let o=[{label:"登入",href:"/login"},{label:"訪客體驗",href:"/courses"},{label:"註冊登入",href:"/register",primary:!0}];function c(e,t="student"){let r=[{label:"課程首頁",href:"/dashboard",icon:"⌂"},{label:"每日 10 題",href:"/daily-quiz",icon:"10"},{label:"錯題 AI 說明",href:"/wrong-review",icon:"AI"},{label:"進度月曆",href:"/parent-weekly-report",icon:"月"},{label:"英文練習",href:"/practice",icon:"Aa"},{label:"手寫出題",href:"/word-scanner",icon:"掃"},{label:"課程總覽",href:"/courses",icon:"▦"},{label:"國語練習",href:`/courses/grade-${e}/chinese/basic`,icon:"ㄅ"},{label:"數學練習",href:`/courses/grade-${e}/math/basic`,icon:"123"},{label:"每日紀錄",href:"/daily-record",icon:"✓"},{label:"週計畫",href:"/weekly-plan",icon:"□"},{label:"登出",href:"/",icon:"出"}];return"parent"===t?r.filter(e=>["課程首頁","進度月曆","每日紀錄","週計畫","課程總覽","登出"].includes(e.label)):"teacher"===t?r.filter(e=>["課程首頁","課程總覽","國語練習","英文練習","數學練習","週計畫","手寫出題","登出"].includes(e.label)):r.filter(e=>["課程首頁","每日 10 題","英文練習","國語練習","數學練習","手寫出題","錯題 AI 說明","登出"].includes(e.label))}function d(e,t){return"/dashboard"===t?"/dashboard"===e:"/courses"===t?"/courses"===e:t.startsWith("/courses/")?e===t||e.startsWith(`${t}/`):e===t}function u({compact:e=!1}){let{person:n}=(0,i.useActivePerson)(),[a,o]=(0,r.useState)(!1),c=(0,l.getGradeByNumber)(n.grade),d="student"===n.role?(0,s.getPersonSubtitle)(n):c?.name??`國小${n.grade}年級`,h=(0,t.jsx)("div",{className:"grid gap-2",children:s.mockPeople.map(e=>{let r=(0,l.getGradeByNumber)(e.grade),a=e.id===n.id;return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;let r;return t=e.id,o(!1),r=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login",void window.location.assign(`${r}?person=${encodeURIComponent(t)}`)},className:`rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${a?"bg-coral text-white shadow-sm":"bg-white text-stone-700 hover:bg-butter"}`,children:[(0,t.jsxs)("span",{className:"block text-xs font-black opacity-80",children:[(0,s.getRoleLabel)(e.role),"模式"]}),(0,t.jsx)("span",{className:"mt-1 block text-base font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-75",children:"student"===e.role?(0,s.getPersonSubtitle)(e):r?.name??`國小${e.grade}年級`})]},e.id)})});return e?(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>o(e=>!e),className:"flex min-h-11 max-w-[5.5rem] items-center gap-1 rounded-2xl bg-butter px-2 text-left text-amber-950 shadow-sm sm:max-w-none sm:gap-2 sm:px-3","aria-expanded":a,"aria-label":"切換目前使用者",children:[(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("strong",{className:"block max-w-20 truncate text-sm font-black",children:n.name}),(0,t.jsx)("small",{className:"block text-[11px] font-bold opacity-70",children:c?.shortName??`小${n.grade}`})]}),(0,t.jsx)("span",{"aria-hidden":"true",className:"text-xs",children:"⌄"})]}),a?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100vh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsx)("strong",{className:"text-base font-black text-ink",children:"切換使用者"}),(0,t.jsx)("button",{type:"button",onClick:()=>o(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉帳號選單",children:"×"})]}),h]}):null]}):(0,t.jsxs)("section",{className:"rounded-3xl border border-amber-100 bg-cream p-3 shadow-sm",children:[(0,t.jsx)("button",{type:"button",onClick:()=>o(e=>!e),className:"w-full rounded-[1.35rem] bg-white/80 p-3 text-left ring-1 ring-transparent transition hover:bg-white hover:ring-coral/30","aria-expanded":a,"aria-label":"切換目前使用者",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("p",{className:"text-xs font-black text-amber-700",children:[(0,s.getRoleLabel)(n.role),"模式"]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-2xl font-black leading-tight text-ink",children:n.name}),(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"student"===n.role?"匿名檔案":(0,s.getRoleLabel)(n.role)})]}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:d})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-coral px-3 py-2 text-xs font-black text-white shadow-sm",children:"切換帳號"})]})}),a?(0,t.jsx)("div",{className:"mt-3",children:h}):null]})}e.s(["AppSidebar",0,function(){let e=(0,n.usePathname)(),{person:r,isLoggedIn:s,signOut:l}=(0,i.useActivePerson)();function h(){l();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsx)("aside",{className:"fixed inset-y-0 left-0 z-20 hidden w-64 flex-col border-r border-softline/80 bg-white/85 backdrop-blur-xl lg:flex",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 py-6",children:[(0,t.jsxs)(a.ExportSafeLink,{className:"flex items-center gap-3",href:s?"/dashboard":"/",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"text-sm font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),s?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{}),(0,t.jsx)("nav",{className:"grid gap-2 pr-1",children:c(r.grade,r.role).map(r=>{let n=d(e,r.href),s=`flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left transition ${n?"bg-butter text-amber-900 shadow-sm":"text-stone-600 hover:bg-butter hover:text-amber-900"}`,l=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 place-items-center rounded-xl text-sm font-black shadow-sm ${n?"bg-white text-coral":"bg-white text-stone-500"}`,children:r.icon}),(0,t.jsx)("span",{className:"font-bold",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:h,className:s,children:l},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,className:s,children:l},r.label)})})]}):(0,t.jsx)("div",{className:"grid gap-3",children:o.map(e=>(0,t.jsx)(a.ExportSafeLink,{href:e.href,className:e.primary?"rounded-2xl bg-coral px-4 py-3 text-center font-black text-white shadow-warm transition hover:brightness-105":"rounded-2xl border border-softline bg-white px-4 py-3 text-center font-black text-amber-800 transition hover:bg-butter",children:e.label},e.label))}),s?(0,t.jsxs)(a.ExportSafeLink,{href:"student"===r.role?"/wrong-review":"/parent-weekly-report",className:"mt-auto rounded-2xl border border-green-100 bg-green-50 p-4 text-sm text-green-900 transition hover:-translate-y-0.5 hover:bg-green-100",children:[(0,t.jsx)("span",{className:"block text-xs font-black text-green-700",children:"本��學習摘要"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg",children:"每天一小步,進度看得見"}),(0,t.jsx)("span",{className:"mt-2 block font-bold text-green-700",children:"查看進度與需要再練的內容 →"})]}):null]})})},"MobileMenu",0,function(){let e=(0,n.usePathname)(),{person:s,signOut:l}=(0,i.useActivePerson)(),[o,u]=(0,r.useState)(!1),h=c(s.grade,s.role);function m(){l();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsxs)("div",{className:"shrink-0 lg:hidden",children:[(0,t.jsx)("button",{type:"button",onClick:()=>u(e=>!e),className:"grid min-h-11 min-w-11 place-items-center rounded-2xl bg-white text-xl font-black text-amber-900 shadow-sm active:scale-[0.98]","aria-expanded":o,"aria-label":"開啟完整功能選單",children:o?"×":"☰"}),o?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100dvh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("strong",{className:"block text-base font-black text-ink",children:"全部功能"}),(0,t.jsxs)("span",{className:"text-xs font-bold text-stone-500",children:["依 ",s.name," 的身分顯示"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉功能選單",children:"×"})]}),(0,t.jsx)("nav",{className:"grid grid-cols-2 gap-2",children:h.map(r=>{let n=d(e,r.href),s=`flex min-h-16 items-center gap-3 rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${n?"bg-coral text-white":"bg-white text-stone-700"}`,l=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 shrink-0 place-items-center rounded-xl text-sm font-black ${n?"bg-white/20":"bg-butter text-amber-900"}`,children:r.icon}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:m,className:s,children:l},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,onClick:()=>u(!1),className:s,children:l},r.label)})})]}):null]})},"MobileQuickNav",0,function(){var e;let r,s=(0,n.usePathname)(),{person:l}=(0,i.useActivePerson)(),o=(r=c(l.grade,e=l.role),("guest"===e?["課程首頁","課程總覽"]:({student:["課程首頁","每日 10 題","英文練習","課程總覽"],parent:["課程首頁","進度月曆","每日紀錄","週計畫"],teacher:["課程首頁","課程總覽","週計畫","手寫出題"]})[e]).map(e=>r.find(t=>t.label===e)).filter(e=>!!e));return(0,t.jsx)("nav",{className:"fixed inset-x-3 bottom-[max(0.75rem,env(safe-area-inset-bottom))] z-50 grid grid-cols-4 gap-1 rounded-3xl border border-white/80 bg-white/90 p-2 shadow-warm backdrop-blur-xl lg:hidden","aria-label":"主要功能",children:o.map(e=>{let r=d(s,e.href);return(0,t.jsxs)(a.ExportSafeLink,{href:e.href,className:`flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl px-1 py-2 text-center transition active:scale-[0.98] ${r?"bg-coral text-white shadow-sm":"text-stone-600"}`,children:[(0,t.jsx)("span",{className:"text-sm font-black",children:e.icon}),(0,t.jsx)("span",{className:"w-full truncate text-[11px] font-black",children:e.label})]},e.label)})})},"PersonSwitcher",0,u])},55634,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),s=e.i(41324);e.s(["ActiveGradeRouteSync",0,function(){let e=(0,n.usePathname)(),{person:l,isLoggedIn:i,isReady:o}=(0,s.useActivePerson)(),c=function(e){let t=e.match(/^\/learn\/(?:grade-)?([1-6])(?:\/|$)/);if(t)return Number(t[1]);let r=e.match(/^\/courses\/grade-([1-6])(?:\/|$)/);if(r)return Number(r[1]);let n=e.match(/^\/(?:lesson|practice|handwriting)\/grade-([1-6])-/);return n?Number(n[1]):null}(e),d=!!(o&&i&&"student"===l.role&&c&&c!==l.grade);return((0,r.useEffect)(()=>{var t;if(!d)return;let r=(t=l.grade,/^\/learn\/(?:grade-)?[1-6](?:\/|$)/.test(e)?e.replace(/^\/learn\/(?:grade-)?[1-6]/,`/learn/${t}`):/^\/courses\/grade-[1-6](?:\/|$)/.test(e)?e.replace(/^\/courses\/grade-[1-6]/,`/courses/grade-${t}`):e.replace(/^(\/(?:lesson|practice|handwriting)\/)grade-[1-6]-/,`$1grade-${t}-`)),n=`${(0,a.getExportSafeHref)(r)}${window.location.search}${window.location.hash}`;window.location.replace(n)},[e,l.grade,d]),o&&!d)?null:(0,t.jsx)("div",{className:"fixed inset-0 z-[100] grid place-items-center bg-[#fffaf3]/95 p-5 backdrop-blur-md",role:"status","aria-live":"polite",children:(0,t.jsxs)("div",{className:"w-full max-w-md rounded-[2rem] border border-white bg-white/90 p-7 text-center shadow-warm",children:[(0,t.jsx)("span",{className:"mx-auto grid h-14 w-14 place-items-center rounded-2xl bg-butter text-2xl","aria-hidden":"true",children:"☀"}),(0,t.jsx)("strong",{className:"mt-4 block text-2xl font-black text-ink",children:o?`正在切換到小${l.grade}課程`:"正在讀取目前學習年級"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"晨光會自動載入這位學習者正確的課程內容。"})]})})}],55634)},10400,e=>{"use strict";var t=e.i(43476),r=e.i(82697),n=e.i(22468),a=e.i(55634);e.s(["AppShell",0,function({children:e}){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.ActiveGradeRouteSync,{}),(0,t.jsx)(n.AppSidebar,{}),(0,t.jsxs)("main",{className:"app-reading-scale min-h-screen min-w-0 overflow-x-clip px-4 pb-28 pt-4 lg:ml-64 lg:px-10 lg:py-6",children:[(0,t.jsx)("div",{className:"sticky top-3 z-40 mb-5 lg:hidden",children:(0,t.jsxs)("div",{className:"flex min-w-0 items-center justify-between gap-2 rounded-3xl border border-white/80 bg-white/90 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsx)("div",{className:"min-w-0 flex-1",children:(0,t.jsx)(r.BrandHeader,{showPerson:!1})}),(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,t.jsx)(n.PersonSwitcher,{compact:!0}),(0,t.jsx)(n.MobileMenu,{})]})]})}),(0,t.jsx)("div",{className:"mx-auto min-w-0 w-full max-w-7xl",children:e}),(0,t.jsx)(n.MobileQuickNav,{})]})]})}])},98239,e=>{"use strict";var t=e.i(43476);e.s(["SectionCard",0,function({children:e,className:r=""}){return(0,t.jsx)("section",{className:`min-w-0 overflow-hidden rounded-[1.75rem] border border-softline/80 bg-white/90 p-5 shadow-warm sm:p-6 md:p-8 ${r}`,children:e})}])},51772,e=>{"use strict";var t=e.i(43476);let r={green:"border-green-100 bg-green-50 text-green-950",blue:"border-blue-100 bg-blue-50 text-blue-950",cream:"border-softline bg-cream text-stone-700"};e.s(["InfoCard",0,function({title:e,children:n,tone:a="green",className:s=""}){return(0,t.jsxs)("div",{className:`rounded-2xl border p-5 ${r[a]} ${s}`,children:[e?(0,t.jsx)("p",{className:"mb-2 font-black",children:e}):null,(0,t.jsx)("div",{className:"leading-8",children:n})]})}])},30599,e=>{"use strict";var t=e.i(43476);e.s(["LearningPageFrame",0,function({children:e}){return(0,t.jsx)("div",{className:"mx-auto flex w-full max-w-[1480px] flex-col gap-6 pb-10",children:e})}])},97592,e=>{"use strict";let t={1:"小一三科啟蒙陪跑",2:"小二基礎延伸學習",3:"小三閱讀與主題學習",4:"小四理解與應用練習",5:"小五閱讀策略與表達",6:"小六銜接與自主學習"};function r(e,t){return`/learn/${e}/${t}`}let n=[{subjectId:"chinese",title:"小一國語安心起步",description:"用短時間、低壓力的方式,陪孩子從注音、字詞到短句慢慢熟悉國語。",goals:["注音符號","基礎生字","詞語朗讀","短句理解"],href:r(1,"chinese"),status:"available"},{subjectId:"english",title:"小一英文啟蒙陪跑",description:"從問候、文具、校園與家庭英文開始,讓孩子每天只學一點點,也敢開口。",goals:["每日一句","生活單字","聽一聽","跟著說"],href:r(1,"english"),status:"available"},{subjectId:"math",title:"小一數學生活數感",description:"從數量、比較、分類與圖形開始,用生活物品建立加減前的數感。",goals:["0 到 20 的數","數一數","比大小","加法起步"],href:r(1,"math"),status:"available"}],a=[{subjectId:"chinese",title:"小二國語閱讀起步",description:"從部首、詞語和標點進入短文閱讀,練習把看到的內容清楚說出來。",goals:["生字與部首","詞語理解","標點符號","短文閱讀"],href:r(2,"chinese"),status:"available"},{subjectId:"english",title:"小二生活英文延伸",description:"用家人、食物、校園與一天作息練習完整生活句,建立穩定開口習慣。",goals:["家人與食物","生活作息","簡短句型","聽說練習"],href:r(2,"english"),status:"available"},{subjectId:"math",title:"小二加減與生活應用",description:"認識位值與長度,熟悉二位數加減,再把計算放進時間、錢幣與生活題。",goals:["1000 以內的數","二位數加減","長度與時間","生活應用題"],href:r(2,"math"),status:"available"}],s=[{subjectId:"chinese",title:"小三閱讀與表達",description:"練習理解段落、找主旨與整理故事順序,再把想法寫成短文。",goals:["段落理解","主旨與細節","故事順序","短文寫作"],href:r(3,"chinese"),status:"available"},{subjectId:"english",title:"小三主題英文與閱讀",description:"從學習動作、作息、場所與方向延伸句型,開始讀懂短篇生活英文。",goals:["主題單字","生活句型","情境對話","短篇閱讀"],href:r(3,"english"),status:"available"},{subjectId:"math",title:"小三乘除與圖形應用",description:"熟悉乘法與除法概念,認識分數、周長,再挑戰多步驟生活問題。",goals:["乘法熟練","除法起步","分數初步","周長與應用題"],href:r(3,"math"),status:"available"}],l={4:[{subjectId:"chinese",title:"小四國語理解與摘要",description:"從詞義、段落結構與修辭進入摘要和推論,練習把閱讀重點說清楚。",goals:["成語與詞義","段落結構","摘要練習","說明文閱讀"],href:r(4,"chinese"),status:"available"},{subjectId:"english",title:"小四英文生活應用",description:"以時間、興趣、交通與比較為主題,練習問答、短文與生活任務。",goals:["時間與作息","興趣活動","交通方式","比較句型"],href:r(4,"english"),status:"available"},{subjectId:"math",title:"小四數學計算與推理",description:"熟悉大數、乘除、角度、分數與面積,再用圖表和多步驟題練習推理。",goals:["億以內的數","乘除計算","分數與小數","面積與圖表"],href:r(4,"math"),status:"available"}],5:[{subjectId:"chinese",title:"小五國語閱讀策略",description:"練習字詞辨析、複句關係、觀點與事實,逐步建立跨文本閱讀能力。",goals:["字詞辨析","複句關係","觀點與事實","文本比較"],href:r(5,"chinese"),status:"available"},{subjectId:"english",title:"小五英文閱讀與表達",description:"從健康、環境、旅行與計畫延伸到過去式、建議句與短篇閱讀。",goals:["健康習慣","旅行與方向","過去經驗","未來計畫"],href:r(5,"english"),status:"available"},{subjectId:"math",title:"小五數學分數與幾何",description:"整合小數、分數、因數倍數、面積體積與資料分析,強化解題策略。",goals:["小數乘法","分數計算","因數與倍數","面積與體積"],href:r(5,"math"),status:"available"}],6:[{subjectId:"chinese",title:"小六國語統整與銜接",description:"整合語境、文本結構、論點證據與跨文本閱讀,準備進入國中學習。",goals:["語境與推論","論點與證據","跨文本閱讀","完整作文"],href:r(6,"chinese"),status:"available"},{subjectId:"english",title:"小六英文自主與銜接",description:"用校園生活、文化、環境與觀點表達,統整時態並進入較長篇閱讀。",goals:["時態統整","原因與結果","意見表達","國中銜接閱讀"],href:r(6,"english"),status:"available"},{subjectId:"math",title:"小六數學比例與銜接",description:"統整四則、比與比值、圓、速率和體積,建立代數與機率的初步觀念。",goals:["分數小數四則","比與比值","速率與比例尺","代數思考"],href:r(6,"math"),status:"available"}]},i=[{gradeId:"grade-1",grade:1,title:t[1],subtitle:"小一先從國語、英文、數學三科開始,每天一小步,讓孩子有安全感地融入學習。",subjects:n},{gradeId:"grade-2",grade:2,title:t[2],subtitle:"小二把基礎帶進閱讀與生活應用,每天完成一個能說、能做的小任務。",subjects:a},{gradeId:"grade-3",grade:3,title:t[3],subtitle:"小三開始練習抓重點、完整表達與解決問題,建立自己的學習方法。",subjects:s},...[4,5,6].map(e=>({gradeId:`grade-${e}`,grade:e,title:t[e],subtitle:4===e?"小四把基礎知識帶進理解與應用,練習說明自己的想法與解題步驟。":5===e?"小五建立閱讀策略與跨科應用能力,逐步學會整理、比較與表達。":"小六統整六年所學並銜接國中,練習自主安排與檢查自己的學習。",subjects:l[e]}))];e.s(["getCurriculumByGrade",0,function(e){return i.find(t=>t.grade===e)},"getCurriculumByGradeId",0,function(e){return i.find(t=>t.gradeId===e)}])},78052,e=>{"use strict";let t=[{id:"chinese",name:"國語",shortDescription:"注音、識字、朗讀、短句理解與手寫練習。",icon:"文",tone:"coral"},{id:"english",name:"英文",shortDescription:"每日一句、生活單字、聽說練習與小測驗。",icon:"Aa",tone:"leaf"},{id:"math",name:"數學",shortDescription:"數一數、比大小、加減起步與生活應用。",icon:"123",tone:"honey"}];e.s(["getSubjectById",0,function(e){return t.find(t=>t.id===e)},"subjects",0,t])},14,e=>{"use strict";var t=e.i(43476),r=e.i(14876),n=e.i(10400),a=e.i(51772),s=e.i(30599),l=e.i(42391),i=e.i(98239),o=e.i(7728),c=e.i(97592),d=e.i(62312),u=e.i(78052),h=e.i(41324);e.s(["default",0,function(){let{person:e}=(0,h.useActivePerson)(),m=(0,o.getCurrentStudentGradeId)(e),g=d.grades.find(e=>e.id===m)??d.grades[0],f=(0,c.getCurriculumByGradeId)(g.id);return(0,t.jsx)(n.AppShell,{children:(0,t.jsxs)(s.LearningPageFrame,{children:[(0,t.jsx)(l.PageHeader,{eyebrow:"Grade Curriculum",title:"國小一年級到六年級課綱",description:`目前使用者是 ${e.name},系統會以 ${g.name} 作為預設年級。`}),(0,t.jsx)(i.SectionCard,{children:(0,t.jsx)("div",{className:"grid gap-5 md:grid-cols-2 xl:grid-cols-3",children:d.grades.map(e=>{let n=e.id===g.id;return(0,t.jsxs)(r.ExportSafeLink,{href:`/courses/${e.id}`,className:`rounded-warm border p-6 transition hover:-translate-y-0.5 hover:shadow-warm ${n?"border-coral bg-butter/70":"border-softline bg-white/90"}`,children:[(0,t.jsx)("p",{className:"font-bold text-amber-700",children:e.shortName}),(0,t.jsx)("h2",{className:"mt-2 text-3xl font-black",children:e.name}),(0,t.jsx)("p",{className:"mt-3 leading-7 text-stone-600",children:e.description}),(0,t.jsx)("span",{className:"mt-5 inline-flex rounded-full bg-white px-3 py-1 text-sm font-bold text-stone-500",children:n?"目前學生年級":"active"===e.status?"已開放":"入口保留"})]},e.id)})})}),(0,t.jsxs)(i.SectionCard,{children:[(0,t.jsx)(l.PageHeader,{eyebrow:g.name,title:"目前選擇年級重點"}),(0,t.jsx)("div",{className:"mt-6 grid gap-4 lg:grid-cols-3",children:u.subjects.map(e=>{let r=f?.subjects.find(t=>t.subjectId===e.id);return(0,t.jsx)(a.InfoCard,{tone:"english"===e.id?"blue":"math"===e.id?"cream":"green",title:e.name,children:r?.description??e.shortDescription},e.id)})})]})]})})}])}]);
_next/static/chunks/13wk2aorwngo0.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95057,(e,t,a)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0});var r={formatUrl:function(){return i},formatWithValidation:function(){return d},urlObjectKeys:function(){return o}};for(var n in r)Object.defineProperty(a,n,{enumerable:!0,get:r[n]});let s=e.r(90809)._(e.r(98183)),l=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:a}=e,r=e.protocol||"",n=e.pathname||"",i=e.hash||"",o=e.query||"",d=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?d=t+e.host:a&&(d=t+(~a.indexOf(":")?`[${a}]`:a),e.port&&(d+=":"+e.port)),o&&"object"==typeof o&&(o=String(s.urlQueryToSearchParams(o)));let c=e.search||o&&`?${o}`||"";return r&&!r.endsWith(":")&&(r+=":"),e.slashes||(!r||l.test(r))&&!1!==d?(d="//"+(d||""),n&&"/"!==n[0]&&(n="/"+n)):d||(d=""),i&&"#"!==i[0]&&(i="#"+i),c&&"?"!==c[0]&&(c="?"+c),n=n.replace(/[?#]/g,encodeURIComponent),c=c.replace("#","%23"),`${r}${d}${n}${c}${i}`}let o=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function d(e){return i(e)}},18581,(e,t,a)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0}),Object.defineProperty(a,"useMergedRef",{enumerable:!0,get:function(){return n}});let r=e.r(71645);function n(e,t){let a=(0,r.useRef)(null),n=(0,r.useRef)(null);return(0,r.useCallback)(r=>{if(null===r){let e=a.current;e&&(a.current=null,e());let t=n.current;t&&(n.current=null,t())}else e&&(a.current=s(e,r)),t&&(n.current=s(t,r))},[e,t])}function s(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let a=e(t);return"function"==typeof a?a:()=>e(null)}}("function"==typeof a.default||"object"==typeof a.default&&null!==a.default)&&void 0===a.default.__esModule&&(Object.defineProperty(a.default,"__esModule",{value:!0}),Object.assign(a.default,a),t.exports=a.default)},73668,(e,t,a)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0}),Object.defineProperty(a,"isLocalURL",{enumerable:!0,get:function(){return s}});let r=e.r(18967),n=e.r(52817);function s(e){if(!(0,r.isAbsoluteUrl)(e))return!0;try{let t=(0,r.getLocationOrigin)(),a=new URL(e,t);return a.origin===t&&(0,n.hasBasePath)(a.pathname)}catch(e){return!1}}},84508,(e,t,a)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0}),Object.defineProperty(a,"errorOnce",{enumerable:!0,get:function(){return r}});let r=e=>{}},22016,(e,t,a)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0});var r={default:function(){return b},useLinkStatus:function(){return w}};for(var n in r)Object.defineProperty(a,n,{enumerable:!0,get:r[n]});let s=e.r(90809),l=e.r(43476),i=s._(e.r(71645)),o=e.r(95057),d=e.r(8372),c=e.r(18581),u=e.r(18967),h=e.r(5550);e.r(33525);let m=e.r(88540),g=e.r(91949),x=e.r(73668),f=e.r(9396);function b(t){var a,r;let n,s,b,[w,j]=(0,i.useOptimistic)(g.IDLE_LINK_STATUS),y=(0,i.useRef)(null),{href:v,as:k,children:N,prefetch:S=null,passHref:$,replace:I,shallow:P,scroll:E,onClick:C,onMouseEnter:L,onTouchStart:T,legacyBehavior:A=!1,onNavigate:R,transitionTypes:M,ref:D,unstable_dynamicOnHover:O,..._}=t;n=N,A&&("string"==typeof n||"number"==typeof n)&&(n=(0,l.jsx)("a",{children:n}));let B=i.default.useContext(d.AppRouterContext),H=!1!==S,U=!1!==S?null===(r=S)||"auto"===r?f.FetchStrategy.PPR:f.FetchStrategy.Full:f.FetchStrategy.PPR,z="string"==typeof(a=k||v)?a:(0,o.formatUrl)(a);if(A){if(n?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});s=i.default.Children.only(n)}let F=A?s&&"object"==typeof s&&s.ref:D,G=i.default.useCallback(e=>(null!==B&&(y.current=(0,g.mountLinkInstance)(e,z,B,U,H,j)),()=>{y.current&&((0,g.unmountLinkForCurrentNavigation)(y.current),y.current=null),(0,g.unmountPrefetchableInstance)(e)}),[H,z,B,U,j]),W={ref:(0,c.useMergedRef)(G,F),onClick(t){A||"function"!=typeof C||C(t),A&&s.props&&"function"==typeof s.props.onClick&&s.props.onClick(t),!B||t.defaultPrevented||function(t,a,r,n,s,l,o){if("u">typeof window){let d,{nodeName:c}=t.currentTarget;if("A"===c.toUpperCase()&&((d=t.currentTarget.getAttribute("target"))&&"_self"!==d||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,x.isLocalURL)(a)){n&&(t.preventDefault(),location.replace(a));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);i.default.startTransition(()=>{u(a,n?"replace":"push",!1===s?m.ScrollBehavior.NoScroll:m.ScrollBehavior.Default,r.current,o)})}}(t,z,y,I,E,R,M)},onMouseEnter(e){A||"function"!=typeof L||L(e),A&&s.props&&"function"==typeof s.props.onMouseEnter&&s.props.onMouseEnter(e),B&&H&&(0,g.onNavigationIntent)(e.currentTarget,!0===O)},onTouchStart:function(e){A||"function"!=typeof T||T(e),A&&s.props&&"function"==typeof s.props.onTouchStart&&s.props.onTouchStart(e),B&&H&&(0,g.onNavigationIntent)(e.currentTarget,!0===O)}};return(0,u.isAbsoluteUrl)(z)?W.href=z:A&&!$&&("a"!==s.type||"href"in s.props)||(W.href=(0,h.addBasePath)(z)),b=A?i.default.cloneElement(s,W):(0,l.jsx)("a",{..._,...W,children:n}),(0,l.jsx)(p.Provider,{value:w,children:b})}e.r(84508);let p=(0,i.createContext)(g.IDLE_LINK_STATUS),w=()=>(0,i.useContext)(p);("function"==typeof a.default||"object"==typeof a.default&&null!==a.default)&&void 0===a.default.__esModule&&(Object.defineProperty(a.default,"__esModule",{value:!0}),Object.assign(a.default,a),t.exports=a.default)},14876,e=>{"use strict";var t=e.i(43476),a=e.i(22016);function r(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:a,suffix:r}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===a?`/index.html${r}`:/\.[a-z0-9]+$/i.test(a)?e:`${a.replace(/\/+$/,"")}/index.html${r}`}e.s(["ExportSafeLink",0,function({href:e,children:n,...s}){return"string"==typeof e?(0,t.jsx)("a",{href:r(e),...s,children:n}):(0,t.jsx)(a.default,{href:e,...s,children:n})},"getExportSafeHref",0,r])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let a=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function r(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return a.find(t=>t.grade===e)},"getGradeIdByNumber",0,r,"grades",0,a],62312);let n=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],s={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function l(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return n.find(e=>e.id===t)??s}function i(e){if(!e)return s.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return n.some(e=>e.id===t)?t:s.id}e.s(["currentStudent",0,s,"getCurrentStudentGradeId",0,function(e=s){return r(e.grade)},"getPersonById",0,l,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,n,"normalizePersonId",0,i],7728);let o="chenguang-active-person-id",d="chenguang-active-person-change",c="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,a]=(0,t.useState)(s.id),[r,n]=(0,t.useState)(!1),[h,m]=(0,t.useState)(!1);function g(e){let t=i(e);a(t),window.localStorage.setItem(o,t),window.dispatchEvent(new Event(d))}return(0,t.useEffect)(()=>{let e=i(window.localStorage.getItem(o));function t(){let e=i(window.localStorage.getItem(o));a(e),window.localStorage.setItem(o,e)}function r(){n(!!window.localStorage.getItem(c))}return a(e),window.localStorage.setItem(o,e),n(!!window.localStorage.getItem(c)),m(!0),window.addEventListener(d,t),window.addEventListener("storage",t),window.addEventListener(u,r),()=>{window.removeEventListener(d,t),window.removeEventListener("storage",t),window.removeEventListener(u,r)}},[]),{person:l(e),switchPerson:g,signIn:function(e){let t=i(e);g(t);let a=l(t);window.localStorage.setItem(c,JSON.stringify({personId:t,role:a.role,signedInAt:new Date().toISOString()})),n(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(c),n(!1),window.dispatchEvent(new Event(u))},isLoggedIn:r,isReady:h}}],41324)},82697,e=>{"use strict";var t=e.i(43476),a=e.i(14876),r=e.i(7728),n=e.i(62312),s=e.i(41324);e.s(["BrandHeader",0,function({showPerson:e=!0}){let{person:l,isLoggedIn:i}=(0,s.useActivePerson)(),o=(0,n.getGradeByNumber)(l.grade),d=i?`${(0,r.getPersonDisplayName)(l)}|${"student"===l.role?(0,r.getPersonSubtitle)(l):o?.shortName??`小${l.grade}`}`:"訪客模式";return(0,t.jsxs)(a.ExportSafeLink,{href:i?"/dashboard":"/",className:"flex min-w-0 items-center gap-3 text-ink",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 shrink-0 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{className:"min-w-0 leading-tight",children:[(0,t.jsx)("strong",{className:"block truncate text-xl font-black",children:"晨光"}),(0,t.jsx)("small",{className:"block truncate text-sm font-bold text-stone-500",children:e?d:"國小學習陪跑系統"})]})]})}])},18566,(e,t,a)=>{t.exports=e.r(76562)},22468,e=>{"use strict";var t=e.i(43476),a=e.i(71645),r=e.i(18566),n=e.i(14876),s=e.i(7728),l=e.i(62312),i=e.i(41324);let o=[{label:"登入",href:"/login"},{label:"訪客體驗",href:"/courses"},{label:"註冊登入",href:"/register",primary:!0}];function d(e,t="student"){let a=[{label:"課程首頁",href:"/dashboard",icon:"⌂"},{label:"每日 10 題",href:"/daily-quiz",icon:"10"},{label:"錯題 AI 說明",href:"/wrong-review",icon:"AI"},{label:"進度月曆",href:"/parent-weekly-report",icon:"月"},{label:"英文練習",href:"/practice",icon:"Aa"},{label:"手寫出題",href:"/word-scanner",icon:"掃"},{label:"課程總覽",href:"/courses",icon:"▦"},{label:"國語練習",href:`/courses/grade-${e}/chinese/basic`,icon:"ㄅ"},{label:"數學練習",href:`/courses/grade-${e}/math/basic`,icon:"123"},{label:"每日紀錄",href:"/daily-record",icon:"✓"},{label:"週計畫",href:"/weekly-plan",icon:"□"},{label:"登出",href:"/",icon:"出"}];return"parent"===t?a.filter(e=>["課程首頁","進度月曆","每日紀錄","週計畫","課程總覽","登出"].includes(e.label)):"teacher"===t?a.filter(e=>["課程首頁","課程總覽","國語練習","英文練習","數學練習","週計畫","手寫出題","登出"].includes(e.label)):a.filter(e=>["課程首頁","每日 10 題","英文練習","國語練習","數學練習","手寫出題","錯題 AI 說明","登出"].includes(e.label))}function c(e,t){return"/dashboard"===t?"/dashboard"===e:"/courses"===t?"/courses"===e:t.startsWith("/courses/")?e===t||e.startsWith(`${t}/`):e===t}function u({compact:e=!1}){let{person:r}=(0,i.useActivePerson)(),[n,o]=(0,a.useState)(!1),d=(0,l.getGradeByNumber)(r.grade),c="student"===r.role?(0,s.getPersonSubtitle)(r):d?.name??`國小${r.grade}年級`,h=(0,t.jsx)("div",{className:"grid gap-2",children:s.mockPeople.map(e=>{let a=(0,l.getGradeByNumber)(e.grade),n=e.id===r.id;return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;let a;return t=e.id,o(!1),a=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login",void window.location.assign(`${a}?person=${encodeURIComponent(t)}`)},className:`rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${n?"bg-coral text-white shadow-sm":"bg-white text-stone-700 hover:bg-butter"}`,children:[(0,t.jsxs)("span",{className:"block text-xs font-black opacity-80",children:[(0,s.getRoleLabel)(e.role),"模式"]}),(0,t.jsx)("span",{className:"mt-1 block text-base font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-75",children:"student"===e.role?(0,s.getPersonSubtitle)(e):a?.name??`國小${e.grade}年級`})]},e.id)})});return e?(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>o(e=>!e),className:"flex min-h-11 max-w-[5.5rem] items-center gap-1 rounded-2xl bg-butter px-2 text-left text-amber-950 shadow-sm sm:max-w-none sm:gap-2 sm:px-3","aria-expanded":n,"aria-label":"切換目前使用者",children:[(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("strong",{className:"block max-w-20 truncate text-sm font-black",children:r.name}),(0,t.jsx)("small",{className:"block text-[11px] font-bold opacity-70",children:d?.shortName??`小${r.grade}`})]}),(0,t.jsx)("span",{"aria-hidden":"true",className:"text-xs",children:"⌄"})]}),n?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100vh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsx)("strong",{className:"text-base font-black text-ink",children:"切換使用者"}),(0,t.jsx)("button",{type:"button",onClick:()=>o(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉帳號選單",children:"×"})]}),h]}):null]}):(0,t.jsxs)("section",{className:"rounded-3xl border border-amber-100 bg-cream p-3 shadow-sm",children:[(0,t.jsx)("button",{type:"button",onClick:()=>o(e=>!e),className:"w-full rounded-[1.35rem] bg-white/80 p-3 text-left ring-1 ring-transparent transition hover:bg-white hover:ring-coral/30","aria-expanded":n,"aria-label":"切換目前使用者",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("p",{className:"text-xs font-black text-amber-700",children:[(0,s.getRoleLabel)(r.role),"模式"]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-2xl font-black leading-tight text-ink",children:r.name}),(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"student"===r.role?"匿名檔案":(0,s.getRoleLabel)(r.role)})]}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:c})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-coral px-3 py-2 text-xs font-black text-white shadow-sm",children:"切換帳號"})]})}),n?(0,t.jsx)("div",{className:"mt-3",children:h}):null]})}e.s(["AppSidebar",0,function(){let e=(0,r.usePathname)(),{person:a,isLoggedIn:s,signOut:l}=(0,i.useActivePerson)();function h(){l();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsx)("aside",{className:"fixed inset-y-0 left-0 z-20 hidden w-64 flex-col border-r border-softline/80 bg-white/85 backdrop-blur-xl lg:flex",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 py-6",children:[(0,t.jsxs)(n.ExportSafeLink,{className:"flex items-center gap-3",href:s?"/dashboard":"/",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"text-sm font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),s?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{}),(0,t.jsx)("nav",{className:"grid gap-2 pr-1",children:d(a.grade,a.role).map(a=>{let r=c(e,a.href),s=`flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left transition ${r?"bg-butter text-amber-900 shadow-sm":"text-stone-600 hover:bg-butter hover:text-amber-900"}`,l=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 place-items-center rounded-xl text-sm font-black shadow-sm ${r?"bg-white text-coral":"bg-white text-stone-500"}`,children:a.icon}),(0,t.jsx)("span",{className:"font-bold",children:a.label})]});return"登出"===a.label?(0,t.jsx)("button",{type:"button",onClick:h,className:s,children:l},a.label):(0,t.jsx)(n.ExportSafeLink,{href:a.href,className:s,children:l},a.label)})})]}):(0,t.jsx)("div",{className:"grid gap-3",children:o.map(e=>(0,t.jsx)(n.ExportSafeLink,{href:e.href,className:e.primary?"rounded-2xl bg-coral px-4 py-3 text-center font-black text-white shadow-warm transition hover:brightness-105":"rounded-2xl border border-softline bg-white px-4 py-3 text-center font-black text-amber-800 transition hover:bg-butter",children:e.label},e.label))}),s?(0,t.jsxs)(n.ExportSafeLink,{href:"student"===a.role?"/wrong-review":"/parent-weekly-report",className:"mt-auto rounded-2xl border border-green-100 bg-green-50 p-4 text-sm text-green-900 transition hover:-translate-y-0.5 hover:bg-green-100",children:[(0,t.jsx)("span",{className:"block text-xs font-black text-green-700",children:"本週學習摘要"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg",children:"每天一小步,進度看得見"}),(0,t.jsx)("span",{className:"mt-2 block font-bold text-green-700",children:"查看進度與需要再練的內容 →"})]}):null]})})},"MobileMenu",0,function(){let e=(0,r.usePathname)(),{person:s,signOut:l}=(0,i.useActivePerson)(),[o,u]=(0,a.useState)(!1),h=d(s.grade,s.role);function m(){l();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsxs)("div",{className:"shrink-0 lg:hidden",children:[(0,t.jsx)("button",{type:"button",onClick:()=>u(e=>!e),className:"grid min-h-11 min-w-11 place-items-center rounded-2xl bg-white text-xl font-black text-amber-900 shadow-sm active:scale-[0.98]","aria-expanded":o,"aria-label":"開啟完整功能選單",children:o?"×":"☰"}),o?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100dvh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("strong",{className:"block text-base font-black text-ink",children:"全部功能"}),(0,t.jsxs)("span",{className:"text-xs font-bold text-stone-500",children:["依 ",s.name," 的身分顯示"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉功能選單",children:"×"})]}),(0,t.jsx)("nav",{className:"grid grid-cols-2 gap-2",children:h.map(a=>{let r=c(e,a.href),s=`flex min-h-16 items-center gap-3 rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${r?"bg-coral text-white":"bg-white text-stone-700"}`,l=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 shrink-0 place-items-center rounded-xl text-sm font-black ${r?"bg-white/20":"bg-butter text-amber-900"}`,children:a.icon}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:a.label})]});return"登出"===a.label?(0,t.jsx)("button",{type:"button",onClick:m,className:s,children:l},a.label):(0,t.jsx)(n.ExportSafeLink,{href:a.href,onClick:()=>u(!1),className:s,children:l},a.label)})})]}):null]})},"MobileQuickNav",0,function(){var e;let a,s=(0,r.usePathname)(),{person:l}=(0,i.useActivePerson)(),o=(a=d(l.grade,e=l.role),("guest"===e?["課程首頁","課程總覽"]:({student:["課程首頁","每日 10 題","英文練習","課程總覽"],parent:["課程首頁","進度月曆","每日紀錄","週計畫"],teacher:["課程首頁","課程總覽","週計畫","手寫出題"]})[e]).map(e=>a.find(t=>t.label===e)).filter(e=>!!e));return(0,t.jsx)("nav",{className:"fixed inset-x-3 bottom-[max(0.75rem,env(safe-area-inset-bottom))] z-50 grid grid-cols-4 gap-1 rounded-3xl border border-white/80 bg-white/90 p-2 shadow-warm backdrop-blur-xl lg:hidden","aria-label":"主要功能",children:o.map(e=>{let a=c(s,e.href);return(0,t.jsxs)(n.ExportSafeLink,{href:e.href,className:`flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl px-1 py-2 text-center transition active:scale-[0.98] ${a?"bg-coral text-white shadow-sm":"text-stone-600"}`,children:[(0,t.jsx)("span",{className:"text-sm font-black",children:e.icon}),(0,t.jsx)("span",{className:"w-full truncate text-[11px] font-black",children:e.label})]},e.label)})})},"PersonSwitcher",0,u])},55634,e=>{"use strict";var t=e.i(43476),a=e.i(71645),r=e.i(18566),n=e.i(14876),s=e.i(41324);e.s(["ActiveGradeRouteSync",0,function(){let e=(0,r.usePathname)(),{person:l,isLoggedIn:i,isReady:o}=(0,s.useActivePerson)(),d=function(e){let t=e.match(/^\/learn\/(?:grade-)?([1-6])(?:\/|$)/);if(t)return Number(t[1]);let a=e.match(/^\/courses\/grade-([1-6])(?:\/|$)/);if(a)return Number(a[1]);let r=e.match(/^\/(?:lesson|practice|handwriting)\/grade-([1-6])-/);return r?Number(r[1]):null}(e),c=!!(o&&i&&"student"===l.role&&d&&d!==l.grade);return((0,a.useEffect)(()=>{var t;if(!c)return;let a=(t=l.grade,/^\/learn\/(?:grade-)?[1-6](?:\/|$)/.test(e)?e.replace(/^\/learn\/(?:grade-)?[1-6]/,`/learn/${t}`):/^\/courses\/grade-[1-6](?:\/|$)/.test(e)?e.replace(/^\/courses\/grade-[1-6]/,`/courses/grade-${t}`):e.replace(/^(\/(?:lesson|practice|handwriting)\/)grade-[1-6]-/,`$1grade-${t}-`)),r=`${(0,n.getExportSafeHref)(a)}${window.location.search}${window.location.hash}`;window.location.replace(r)},[e,l.grade,c]),o&&!c)?null:(0,t.jsx)("div",{className:"fixed inset-0 z-[100] grid place-items-center bg-[#fffaf3]/95 p-5 backdrop-blur-md",role:"status","aria-live":"polite",children:(0,t.jsxs)("div",{className:"w-full max-w-md rounded-[2rem] border border-white bg-white/90 p-7 text-center shadow-warm",children:[(0,t.jsx)("span",{className:"mx-auto grid h-14 w-14 place-items-center rounded-2xl bg-butter text-2xl","aria-hidden":"true",children:"☀"}),(0,t.jsx)("strong",{className:"mt-4 block text-2xl font-black text-ink",children:o?`正在切換到小${l.grade}課程`:"正在讀取目前學習年級"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"晨光會自動載入這位學習者正確的課程內容。"})]})})}],55634)},10400,e=>{"use strict";var t=e.i(43476),a=e.i(82697),r=e.i(22468),n=e.i(55634);e.s(["AppShell",0,function({children:e}){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.ActiveGradeRouteSync,{}),(0,t.jsx)(r.AppSidebar,{}),(0,t.jsxs)("main",{className:"app-reading-scale min-h-screen min-w-0 overflow-x-clip px-4 pb-28 pt-4 lg:ml-64 lg:px-10 lg:py-6",children:[(0,t.jsx)("div",{className:"sticky top-3 z-40 mb-5 lg:hidden",children:(0,t.jsxs)("div",{className:"flex min-w-0 items-center justify-between gap-2 rounded-3xl border border-white/80 bg-white/90 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsx)("div",{className:"min-w-0 flex-1",children:(0,t.jsx)(a.BrandHeader,{showPerson:!1})}),(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,t.jsx)(r.PersonSwitcher,{compact:!0}),(0,t.jsx)(r.MobileMenu,{})]})]})}),(0,t.jsx)("div",{className:"mx-auto min-w-0 w-full max-w-7xl",children:e}),(0,t.jsx)(r.MobileQuickNav,{})]})]})}])},98239,e=>{"use strict";var t=e.i(43476);e.s(["SectionCard",0,function({children:e,className:a=""}){return(0,t.jsx)("section",{className:`min-w-0 overflow-hidden rounded-[1.75rem] border border-softline/80 bg-white/90 p-5 shadow-warm sm:p-6 md:p-8 ${a}`,children:e})}])},97750,e=>{"use strict";var t=e.i(43476),a=e.i(14876);e.s(["SecondaryButton",0,function({children:e,href:r,onClick:n,type:s="button",className:l="",disabled:i=!1}){let o=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-butter px-6 py-3 text-center font-black text-amber-900 shadow-sm transition hover:-translate-y-0.5 hover:bg-amber-100 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-honey/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${l}`;return r&&!i?(0,t.jsx)(a.ExportSafeLink,{className:o,href:r,children:e}):(0,t.jsx)("button",{className:o,type:s,onClick:n,disabled:i,children:e})}])},73887,e=>{"use strict";var t=e.i(43476),a=e.i(14876);e.s(["PrimaryButton",0,function({children:e,href:r,onClick:n,type:s="button",className:l="",disabled:i=!1}){let o=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-coral px-6 py-3 text-center font-black text-white shadow-warm transition hover:-translate-y-0.5 hover:brightness-105 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-coral/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${l}`;return r&&!i?(0,t.jsx)(a.ExportSafeLink,{className:o,href:r,children:e}):(0,t.jsx)("button",{className:o,type:s,onClick:n,disabled:i,children:e})}])},34295,e=>{"use strict";function t(e,t){return`${e}:${t}`}e.s(["getPersonStorageKey",0,t,"readPersonStorage",0,function(e,a,r){try{let n=window.localStorage.getItem(t(e,a));return n?JSON.parse(n):r}catch{return r}},"removePersonStorage",0,function(e,a){try{window.localStorage.removeItem(t(e,a))}catch{}},"writePersonStorage",0,function(e,a,r){try{return window.localStorage.setItem(t(e,a),JSON.stringify(r)),!0}catch{return!1}}])},87102,e=>{"use strict";var t=e.i(7728),a=e.i(34295);let r="chenguang-learning-history";function n(e=t.currentStudent.id){return(0,a.readPersonStorage)(r,e,[])}function s(e,a=t.currentStudent.id){return(e??n(a)).flatMap(e=>e.answers.filter(e=>!e.correct))}e.s(["buildAnswerRecord",0,function(e,t){return{questionId:e.id,word:e.word,selected:t,answer:e.answer,correct:t===e.answer,explanation:e.explanation,answeredAt:new Date().toISOString()}},"getWeeklySummary",0,function(e,a=t.currentStudent.id){let r=new Date,l=new Date(r.getFullYear(),r.getMonth(),r.getDate()-6),i=new Date(r.getFullYear(),r.getMonth(),r.getDate()+1),o=(e??n(a)).filter(e=>{let t=new Date(e.date);return t>=l&&t<i}),d=o.reduce((e,t)=>e+t.total,0),c=o.reduce((e,t)=>e+t.score,0),u=s(o,a),h=Array.from(new Set(o.flatMap(e=>e.answers.map(e=>e.word)))),m=new Set(o.map(e=>{let t=new Date(e.date);return`${t.getFullYear()}-${t.getMonth()+1}-${t.getDate()}`})),g=0;for(let e=0;e<7;e+=1){let t=new Date(r.getFullYear(),r.getMonth(),r.getDate()-e),a=`${t.getFullYear()}-${t.getMonth()+1}-${t.getDate()}`;if(!m.has(a))break;g+=1}return{days:m.size,streak:g,total:d,score:c,accuracy:0===d?0:Math.round(c/d*100),wrongAnswers:u.slice(0,6),words:h.slice(0,20),lastScore:o[0]?.score??0}},"getWrongAnswers",0,s,"saveDailyQuizRecord",0,function(e,s=t.currentStudent.id){let l=n(s),i={id:`daily-${Date.now()}`,personId:s,date:new Date().toISOString(),score:e.filter(e=>e.correct).length,total:e.length,answers:e};(0,a.writePersonStorage)(r,s,[i,...l].slice(0,60))}])},77423,e=>{"use strict";var t=e.i(43476),a=e.i(14876);e.s(["ComingSoonCard",0,function({title:e="此功能正在建置中",description:r="晨光正在一步步補齊這個功能,請先回到課程首頁或儀表板。"}){return(0,t.jsx)("section",{className:"mx-auto grid min-h-[72vh] max-w-4xl place-items-center px-4 py-10",children:(0,t.jsxs)("div",{className:"w-full rounded-[2rem] border border-softline bg-white/90 p-8 text-center shadow-warm md:p-12",children:[(0,t.jsx)("div",{className:"mx-auto grid h-20 w-20 place-items-center rounded-[1.75rem] bg-gradient-to-br from-coral to-honey text-4xl shadow-warm","aria-hidden":"true",children:"☀️"}),(0,t.jsx)("p",{className:"mt-6 font-bold text-amber-700",children:"Coming Soon"}),(0,t.jsx)("h1",{className:"mt-3 text-4xl font-black leading-tight text-ink md:text-5xl",children:e}),(0,t.jsx)("p",{className:"mx-auto mt-4 max-w-2xl text-lg leading-8 text-stone-600",children:r}),(0,t.jsxs)("div",{className:"mt-8 flex flex-wrap justify-center gap-3",children:[(0,t.jsx)(a.ExportSafeLink,{className:"rounded-2xl bg-coral px-6 py-4 font-black text-white shadow-sm transition hover:brightness-105",href:"/",children:"回課程首頁"}),(0,t.jsx)(a.ExportSafeLink,{className:"rounded-2xl bg-butter px-6 py-4 font-black text-amber-900 transition hover:bg-amber-100",href:"/dashboard",children:"回儀表板"})]})]})})}])},65812,e=>{"use strict";e.s(["weeklyPlans",0,[{id:"grade-1-week-01",grade:"grade-1",week:1,theme:"小一安心開學週",goal:"用很短的每日任務,建立國文、英文、數學的學習安全感。",dailyTasks:[{day:"星期一",task:"國文:認識 ㄅㄆㄇㄈ,英文:Hello, teacher.,數學:數 1 到 5。"},{day:"星期二",task:"國文:看生活字,英文:book、pencil,數學:排出 6 個物品。"},{day:"星期三",task:"國文:朗讀短句,英文:Thank you.,數學:比哪邊多。"},{day:"星期四",task:"國文:說詞語,英文:This is my book.,數學:合起來是幾個。"},{day:"星期五",task:"親子複習:三科各選一個孩子最喜歡的任務。"}],parentTips:["每天 10-20 分鐘即可","先鼓勵開口與嘗試","不要把陪跑變成考試"]},{id:"grade-2-week-01",grade:"grade-2",week:1,theme:"小二生活應用週",goal:"把閱讀、生活英文與加減練習放進每天熟悉的情境。",dailyTasks:[{day:"星期一",task:"國文:讀一段生活短文,英文:介紹家人,數學:複習兩位數。"},{day:"星期二",task:"國文:找出文章人物,英文:說出兩種食物,數學:完成一題加法。"},{day:"星期三",task:"國文:用詞語造句,英文:I like apples.,數學:完成一題減法。"},{day:"星期四",task:"國文:朗讀並說重點,英文:描述每天的動作,數學:解一題生活題。"},{day:"星期五",task:"親子複習:各挑一個本週最有把握的內容說給家長聽。"}],parentTips:["先請孩子說出想法","答錯時把題目換成生活例子","每天 15 分鐘就很好"]},{id:"grade-3-week-01",grade:"grade-3",week:1,theme:"小三閱讀與表達週",goal:"練習抓重點、完整表達,並把乘除概念連到生活。",dailyTasks:[{day:"星期一",task:"國文:閱讀短文找主旨,英文:read、write、listen,數學:乘法概念。"},{day:"星期二",task:"國文:整理人物與事件,英文:I have a question.,數學:用分組理解除法。"},{day:"星期三",task:"國文:寫兩句閱讀心得,英文:介紹學習動作,數學:完成一題生活應用。"},{day:"星期四",task:"國文:口頭摘要短文,英文:說出地點與感受,數學:檢查解題步驟。"},{day:"星期五",task:"親子複習:孩子自己選一科,說明這週學會了什麼。"}],parentTips:["多問孩子怎麼想","先說清楚再追求寫得完整","完成後讓孩子自己選明天任務"]},{id:"grade-4-week-01",grade:"grade-4",week:1,theme:"小四理解與應用週",goal:"把摘要、生活英文和多步驟計算放進每天可完成的小任務。",dailyTasks:[{day:"星期一",task:"國語:找段落重點,英文:說出起床時間,數學:讀一個大數。"},{day:"星期二",task:"國語:練習一句摘要,英文:介紹興趣,數學:完成乘除計算。"},{day:"星期三",task:"國語:找出因果線索,英文:說交通方式,數學:比較分數。"},{day:"星期四",task:"國語:讀一段說明文,英文:完成比較句,數學:算面積。"},{day:"星期五",task:"本週回顧:選一科說明自己的做法與答案。"}],parentTips:["請孩子先說方法","一次只處理一個重點","用追問代替直接公布答案"]},{id:"grade-5-week-01",grade:"grade-5",week:1,theme:"小五策略與表達週",goal:"練習比較、整理與說明,讓孩子逐步建立自己的學習策略。",dailyTasks:[{day:"星期一",task:"國語:辨析兩個近義詞,英文:說一個健康習慣,數學:小數乘法。"},{day:"星期二",task:"國語:找複句關係,英文:看地圖問路,數學:分數計算。"},{day:"星期三",task:"國語:分辨觀點與事實,英文:說昨天的經驗,數學:因數倍數。"},{day:"星期四",task:"國語:比較兩段文本,英文:說明明天計畫,數學:面積或體積。"},{day:"星期五",task:"本週回顧:整理一個最有效的閱讀或解題方法。"}],parentTips:["鼓勵孩子留下草稿","請孩子說明證據","先看策略,再看最後答案"]},{id:"grade-6-week-01",grade:"grade-6",week:1,theme:"小六統整與銜接週",goal:"統整國語、英文與數學重點,練習自主規劃、檢查和修正。",dailyTasks:[{day:"星期一",task:"國語:讀文本找推論,英文:設定學習目標,數學:分數小數四則。"},{day:"星期二",task:"國語:找論點與證據,英文:用 because 說原因,數學:比與比值。"},{day:"星期三",task:"國語:比較兩篇文章,英文:談環保行動,數學:速率問題。"},{day:"星期四",task:"國語:練習完整表達,英文:短文找關鍵字,數學:比例尺或體積。"},{day:"星期五",task:"本週回顧:自己選一題,說明如何檢查與修正。"}],parentTips:["讓孩子自己排順序","提醒檢查而不代替作答","肯定能說明與修正的能力"]}]])},78052,e=>{"use strict";let t=[{id:"chinese",name:"國語",shortDescription:"注音、識字、朗讀、短句理解與手寫練習。",icon:"文",tone:"coral"},{id:"english",name:"英文",shortDescription:"每日一句、生活單字、聽說練習與小測驗。",icon:"Aa",tone:"leaf"},{id:"math",name:"數學",shortDescription:"數一數、比大小、加減起步與生活應用。",icon:"123",tone:"honey"}];e.s(["getSubjectById",0,function(e){return t.find(t=>t.id===e)},"subjects",0,t])},97592,e=>{"use strict";let t={1:"小一三科啟蒙陪跑",2:"小二基礎延伸學習",3:"小三閱讀與主題學習",4:"小四理解與應用練習",5:"小五閱讀策略與表達",6:"小六銜接與自主學習"};function a(e,t){return`/learn/${e}/${t}`}let r=[{subjectId:"chinese",title:"小一國語安心起步",description:"用短時間、低壓力的方式,陪孩子從注音、字詞到短句慢慢熟悉國語。",goals:["注音符號","基礎生字","詞語朗讀","短句理解"],href:a(1,"chinese"),status:"available"},{subjectId:"english",title:"小一英文啟蒙陪跑",description:"從問候、文具、校園與家庭英文開始,讓孩子每天只學一點點,也敢開口。",goals:["每日一句","生活單字","聽一聽","跟著說"],href:a(1,"english"),status:"available"},{subjectId:"math",title:"小一數學生活數感",description:"從數量、比較、分類與圖形開始,用生活物品建立加減前的數感。",goals:["0 到 20 的數","數一數","比大小","加法起步"],href:a(1,"math"),status:"available"}],n=[{subjectId:"chinese",title:"小二國語閱讀起步",description:"從部首、詞語和標點進入短文閱讀,練習把看到的內容清楚說出來。",goals:["生字與部首","詞語理解","標點符號","短文閱讀"],href:a(2,"chinese"),status:"available"},{subjectId:"english",title:"小二生活英文延伸",description:"用家人、食物、校園與一天作息練習完整生活句,建立穩定開口習慣。",goals:["家人與食物","生活作息","簡短句型","聽說練習"],href:a(2,"english"),status:"available"},{subjectId:"math",title:"小二加減與生活應用",description:"認識位值與長度,熟悉二位數加減,再把計算放進時間、錢幣與生活題。",goals:["1000 以內的數","二位數加減","長度與時間","生活應用題"],href:a(2,"math"),status:"available"}],s=[{subjectId:"chinese",title:"小三閱讀與表達",description:"練習理解段落、找主旨與整理故事順序,再把想法寫成短文。",goals:["段落理解","主旨與細節","故事順序","短文寫作"],href:a(3,"chinese"),status:"available"},{subjectId:"english",title:"小三主題英文與閱讀",description:"從學習動作、作息、場所與方向延伸句型,開始讀懂短篇生活英文。",goals:["主題單字","生活句型","情境對話","短篇閱讀"],href:a(3,"english"),status:"available"},{subjectId:"math",title:"小三乘除與圖形應用",description:"熟悉乘法與除法概念,認識分數、周長,再挑戰多步驟生活問題。",goals:["乘法熟練","除法起步","分數初步","周長與應用題"],href:a(3,"math"),status:"available"}],l={4:[{subjectId:"chinese",title:"小四國語理解與摘要",description:"從詞義、段落結構與修辭進入摘要和推論,練習把閱讀重點說清楚。",goals:["成語與詞義","段落結構","摘要練習","說明文閱讀"],href:a(4,"chinese"),status:"available"},{subjectId:"english",title:"小四英文生活應用",description:"以時間、興趣、交通與比較為主題,練習問答、短文與生活任務。",goals:["時間與作息","興趣活動","交通方式","比較句型"],href:a(4,"english"),status:"available"},{subjectId:"math",title:"小四數學計算與推理",description:"熟悉大數、乘除、角度、分數與面積,再用圖表和多步驟題練習推理。",goals:["億以內的數","乘除計算","分數與小數","面積與圖表"],href:a(4,"math"),status:"available"}],5:[{subjectId:"chinese",title:"小五國語閱讀策略",description:"練習字詞辨析、複句關係、觀點與事實,逐步建立跨文本閱讀能力。",goals:["字詞辨析","複句關係","觀點與事實","文本比較"],href:a(5,"chinese"),status:"available"},{subjectId:"english",title:"小五英文閱讀與表達",description:"從健康、環境、旅行與計畫延伸到過去式、建議句與短篇閱讀。",goals:["健康習慣","旅行與方向","過去經驗","未來計畫"],href:a(5,"english"),status:"available"},{subjectId:"math",title:"小五數學分數與幾何",description:"整合小數、分數、因數倍數、面積體積與資料分析,強化解題策略。",goals:["小數乘法","分數計算","因數與倍數","面積與體積"],href:a(5,"math"),status:"available"}],6:[{subjectId:"chinese",title:"小六國語統整與銜接",description:"整合語境、文本結構、論點證據與跨文本閱讀,準備進入國中學習。",goals:["語境與推論","論點與證據","跨文本閱讀","完整作文"],href:a(6,"chinese"),status:"available"},{subjectId:"english",title:"小六英文自主與銜接",description:"用校園生活、文化、環境與觀點表達,統整時態並進入較長篇閱讀。",goals:["時態統整","原因與結果","意見表達","國中銜接閱讀"],href:a(6,"english"),status:"available"},{subjectId:"math",title:"小六數學比例與銜接",description:"統整四則、比與比值、圓、速率和體積,建立代數與機率的初步觀念。",goals:["分數小數四則","比與比值","速率與比例尺","代數思考"],href:a(6,"math"),status:"available"}]},i=[{gradeId:"grade-1",grade:1,title:t[1],subtitle:"小一先從國語、英文、數學三科開始,每天一小步,讓孩子有安全感地融入學習。",subjects:r},{gradeId:"grade-2",grade:2,title:t[2],subtitle:"小二把基礎帶進閱讀與生活應用,每天完成一個能說、能做的小任務。",subjects:n},{gradeId:"grade-3",grade:3,title:t[3],subtitle:"小三開始練習抓重點、完整表達與解決問題,建立自己的學習方法。",subjects:s},...[4,5,6].map(e=>({gradeId:`grade-${e}`,grade:e,title:t[e],subtitle:4===e?"小四把基礎知識帶進理解與應用,練習說明自己的想法與解題步驟。":5===e?"小五建立閱讀策略與跨科應用能力,逐步學會整理、比較與表達。":"小六統整六年所學並銜接國中,練習自主安排與檢查自己的學習。",subjects:l[e]}))];e.s(["getCurriculumByGrade",0,function(e){return i.find(t=>t.grade===e)},"getCurriculumByGradeId",0,function(e){return i.find(t=>t.gradeId===e)}])},81957,e=>{"use strict";var t=e.i(43476),a=e.i(14876),r=e.i(78052);let n={coral:"bg-coral/10 text-coral",leaf:"bg-green-100 text-green-700",honey:"bg-butter text-amber-800"};e.s(["SubjectCard",0,function({item:e,href:s,compact:l=!1}){let i=(0,r.getSubjectById)(e.subjectId),o="placeholder"===e.status,d="english"===e.subjectId?12:10;return l?(0,t.jsxs)(a.ExportSafeLink,{href:s??e.href,className:"group flex min-h-64 min-w-0 flex-col rounded-[1.65rem] border border-softline/80 bg-white/85 p-5 shadow-sm transition hover:-translate-y-0.5 hover:border-coral/30 hover:bg-white hover:shadow-warm active:translate-y-0 active:scale-[0.99]",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsx)("span",{className:`grid h-12 w-12 shrink-0 place-items-center rounded-2xl text-base font-black ${n[i?.tone??"honey"]}`,children:i?.icon??"課"}),(0,t.jsx)("span",{className:`rounded-full px-3 py-1 text-xs font-black ${o?"bg-stone-100 text-stone-500":"bg-mint text-green-800"}`,children:o?"建置中":`約 ${d} 分鐘`})]}),(0,t.jsx)("p",{className:"mt-5 text-sm font-black text-amber-700",children:i?.name??e.subjectId}),(0,t.jsx)("h3",{className:"mt-1 text-xl font-black leading-snug text-ink",children:e.title}),(0,t.jsx)("p",{className:"mt-3 max-h-14 overflow-hidden text-sm font-medium leading-7 text-stone-600",children:e.description}),(0,t.jsxs)("span",{className:"mt-auto pt-5 text-sm font-black text-coral transition group-hover:translate-x-1",children:[o?"查看預計內容":"開始學習"," →"]})]}):(0,t.jsxs)(a.ExportSafeLink,{href:s??e.href,className:"group block min-w-0 rounded-[1.75rem] border border-softline bg-white/90 p-6 shadow-sm transition hover:-translate-y-0.5 hover:bg-white hover:shadow-warm active:translate-y-0 active:scale-[0.99]",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,t.jsx)("span",{className:`grid h-14 w-14 place-items-center rounded-2xl text-lg font-black ${n[i?.tone??"honey"]}`,children:i?.icon??"課"}),(0,t.jsx)("span",{className:`rounded-full px-3 py-1 text-xs font-bold ${o?"bg-stone-100 text-stone-500":"bg-mint text-green-800"}`,children:o?"建置中":"已開放"})]}),(0,t.jsx)("p",{className:"mt-6 text-sm font-bold text-amber-700",children:i?.name??e.subjectId}),(0,t.jsx)("h3",{className:"mt-2 text-2xl font-black leading-snug text-ink",children:e.title}),(0,t.jsx)("p",{className:"mt-3 min-h-20 leading-7 text-stone-600",children:e.description}),(0,t.jsx)("div",{className:"mt-5 flex flex-wrap gap-2",children:e.goals.map(e=>(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-sm font-bold text-stone-600",children:e},e))})]})}])},30257,e=>{"use strict";var t=e.i(43476),a=e.i(71645),r=e.i(77423);function n({metrics:e}){return(0,t.jsx)("section",{className:"mt-5 rounded-[1.75rem] border border-white/80 bg-white/75 px-5 py-5 shadow-sm backdrop-blur-xl sm:px-7",children:(0,t.jsx)("div",{className:"grid grid-cols-2 gap-y-5 sm:grid-cols-4",children:e.map((e,a)=>(0,t.jsxs)("div",{className:`min-w-0 px-2 sm:px-5 ${a>0?"sm:border-l sm:border-softline":""}`,children:[(0,t.jsx)("p",{className:"text-xs font-black text-stone-500",children:e.label}),(0,t.jsx)("strong",{className:"mt-1 block text-2xl font-black text-ink sm:text-3xl",children:e.value}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold text-stone-500",children:e.note})]},e.label))})})}var s=e.i(73887),l=e.i(97750);function i({greeting:e,personName:a,gradeName:r,dateLabel:n,theme:o,task:d,progress:c,primaryHref:u,primaryLabel:h,secondaryHref:m,secondaryLabel:g}){return(0,t.jsx)("section",{className:"overflow-hidden rounded-[2rem] border border-white/80 bg-white/85 shadow-warm backdrop-blur-xl",children:(0,t.jsxs)("div",{className:"grid min-w-0 lg:grid-cols-[1.15fr_0.85fr]",children:[(0,t.jsxs)("div",{className:"min-w-0 p-6 sm:p-8 lg:p-10",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-sm font-black text-amber-700",children:[(0,t.jsx)("span",{children:n}),(0,t.jsx)("span",{"aria-hidden":"true",children:"·"}),(0,t.jsx)("span",{children:r})]}),(0,t.jsxs)("h1",{className:"mt-4 text-4xl font-black leading-tight text-ink sm:text-5xl",children:[e,",",a]}),(0,t.jsx)("p",{className:"mt-4 max-w-2xl text-base font-medium leading-8 text-stone-600 sm:text-lg",children:"今天只完成一個小任務就很好。做完後,晨光會替你記下這一步。"}),(0,t.jsxs)("div",{className:"mt-7 flex flex-col gap-3 sm:flex-row",children:[(0,t.jsx)(s.PrimaryButton,{href:u,className:"w-full sm:w-auto",children:h}),(0,t.jsx)(l.SecondaryButton,{href:m,className:"w-full sm:w-auto",children:g})]})]}),(0,t.jsxs)("div",{className:"flex min-w-0 flex-col items-start gap-5 border-t border-softline bg-cream/70 p-6 sm:flex-row sm:items-center sm:p-8 lg:border-l lg:border-t-0 lg:p-10",children:[(0,t.jsx)("div",{className:"grid h-24 w-24 shrink-0 place-items-center rounded-full p-2 shadow-sm",style:{background:`conic-gradient(#f47c70 ${c}%, #fff1d9 ${c}% 100%)`},"aria-label":`本週任務進度 ${c}%`,children:(0,t.jsxs)("span",{className:"grid h-full w-full place-items-center rounded-full bg-white text-lg font-black text-ink",children:[c,"%"]})}),(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:"今日任務"}),(0,t.jsx)("h2",{className:"mt-2 text-xl font-black leading-snug text-ink sm:text-2xl",children:o}),(0,t.jsx)("p",{className:"mt-2 text-sm font-medium leading-7 text-stone-600",children:d})]})]})]})})}var o=e.i(10400),d=e.i(98239),c=e.i(81957),u=e.i(14876),h=e.i(97592),m=e.i(62312),g=e.i(65812),x=e.i(87102),f=e.i(41324);let b={days:0,streak:0,total:0,score:0,accuracy:0,wrongAnswers:[],words:[],lastScore:0};e.s(["default",0,function(){let{person:e}=(0,f.useActivePerson)(),s=(0,m.getGradeByNumber)(e.grade),l=(0,m.getGradeIdByNumber)(e.grade),p=(0,h.getCurriculumByGrade)(e.grade),[w,j]=(0,a.useState)(b),[y,v]=(0,a.useState)(null);(0,a.useEffect)(()=>{j((0,x.getWeeklySummary)(void 0,e.id)),v(new Date)},[e.id]);let k=(0,a.useMemo)(()=>g.weeklyPlans.find(e=>e.grade===l),[l]),N=y?.getDay()??1,S=N>=1&&N<=5?k?.dailyTasks[N-1]?.task:"自由複習:挑一個本週最想再練一次的內容。",$=y?.toLocaleDateString("zh-TW",{month:"long",day:"numeric",weekday:"short"})??"今天",I=y?.getHours()??9,P="student"===e.role,E=Math.min(100,Math.round(w.days/5*100));return p?(0,t.jsxs)(o.AppShell,{children:[(0,t.jsx)(i,{greeting:I<12?"早安":I<18?"午安":"晚安",personName:e.name,gradeName:s?.name??`國小${e.grade}年級`,dateLabel:$,theme:k?.theme??p.title,task:S??p.subtitle,progress:E,primaryHref:P?"/daily-quiz":"/parent-weekly-report",primaryLabel:P?"開始今日 10 題":"查看孩子進度",secondaryHref:`/courses/${l}`,secondaryLabel:"選擇三科課程"}),(0,t.jsx)(n,{metrics:[{label:"本週學習",value:`${w.days} 天`,note:`連續 ${w.streak} 天`},{label:"完成題數",value:`${w.total} 題`,note:"最近 7 天"},{label:"答題正確率",value:`${w.accuracy}%`,note:w.total?`${w.score} 題答對`:"完成後自動計算"},{label:"接觸單字",value:`${w.words.length} 個`,note:"不重複計算"}]}),(0,t.jsxs)(d.SectionCard,{className:"mt-8",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-black uppercase tracking-[0.08em] text-amber-700",children:"THREE SUBJECTS"}),(0,t.jsx)("h2",{className:"mt-2 text-3xl font-black text-ink",children:"今天想從哪一科開始?"}),(0,t.jsxs)("p",{className:"mt-2 text-base font-medium leading-7 text-stone-600",children:["內容會依 ",e.name," 的 ",s?.shortName??`小${e.grade}`," 程度自動調整。"]})]}),(0,t.jsx)(u.ExportSafeLink,{href:`/courses/${l}`,className:"font-black text-coral",children:"查看完整課程 →"})]}),(0,t.jsx)("div",{className:"mt-6 grid gap-4 md:grid-cols-3",children:p.subjects.map(e=>(0,t.jsx)(c.SubjectCard,{item:e,compact:!0},e.subjectId))})]}),(0,t.jsx)("section",{className:"mt-8 grid gap-3 sm:grid-cols-3","aria-label":"常用學習工具",children:[{label:"需要再練",text:"查看答錯的題目與簡單解析",href:"/wrong-review"},{label:"本週安排",text:"一天一個小任務,家長更好陪",href:"/weekly-plan"},{label:"學習進度",text:"用月曆看每天做了哪些內容",href:"/parent-weekly-report"}].map(e=>(0,t.jsxs)(u.ExportSafeLink,{href:e.href,className:"rounded-3xl border border-softline/80 bg-white/70 p-5 shadow-sm transition hover:-translate-y-0.5 hover:bg-white active:translate-y-0",children:[(0,t.jsx)("strong",{className:"block text-lg font-black text-ink",children:e.label}),(0,t.jsx)("span",{className:"mt-2 block text-sm font-medium leading-6 text-stone-600",children:e.text})]},e.label))})]}):(0,t.jsx)(o.AppShell,{children:(0,t.jsx)(r.ComingSoonCard,{title:"此年級課程建置中",description:"晨光已保留入口,之後會逐步補齊正式教材。"})})}],30257)}]);
_next/static/chunks/14mrh2-p_w84d.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,91915,(e,t,r)=>{"use strict";function n(e,t={}){if(t.onlyHashChange)return void e();let r=document.documentElement;if("smooth"!==r.dataset.scrollBehavior)return void e();let a=r.style.scrollBehavior;r.style.scrollBehavior="auto",t.dontForceLayout||r.getClientRects(),e(),r.style.scrollBehavior=a}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"disableSmoothScrollDuringRouteTransition",{enumerable:!0,get:function(){return n}}),e.r(33525)},68017,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"HTTPAccessFallbackBoundary",{enumerable:!0,get:function(){return u}});let n=e.r(90809),a=e.r(43476),o=n._(e.r(71645)),i=e.r(90373),s=e.r(54394);e.r(33525);let l=e.r(8372);class c extends o.default.Component{constructor(e){super(e),this.state={triggeredStatus:void 0,previousPathname:e.pathname}}componentDidCatch(){}static getDerivedStateFromError(e){if((0,s.isHTTPAccessFallbackError)(e))return{triggeredStatus:(0,s.getAccessFallbackHTTPStatus)(e)};throw e}static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPathname&&t.triggeredStatus?{triggeredStatus:void 0,previousPathname:e.pathname}:{triggeredStatus:t.triggeredStatus,previousPathname:e.pathname}}render(){let{notFound:e,forbidden:t,unauthorized:r,children:n}=this.props,{triggeredStatus:o}=this.state,i={[s.HTTPAccessErrorStatus.NOT_FOUND]:e,[s.HTTPAccessErrorStatus.FORBIDDEN]:t,[s.HTTPAccessErrorStatus.UNAUTHORIZED]:r};if(o){let l=o===s.HTTPAccessErrorStatus.NOT_FOUND&&e,c=o===s.HTTPAccessErrorStatus.FORBIDDEN&&t,u=o===s.HTTPAccessErrorStatus.UNAUTHORIZED&&r;return l||c||u?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("meta",{name:"robots",content:"noindex"}),!1,i[o]]}):n}return n}}function u({notFound:e,forbidden:t,unauthorized:r,children:n}){let s=(0,i.useUntrackedPathname)(),d=(0,o.useContext)(l.MissingSlotContext);return e||t||r?(0,a.jsx)(c,{pathname:s,notFound:e,forbidden:t,unauthorized:r,missingSlots:d,children:n}):(0,a.jsx)(a.Fragment,{children:n})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},28298,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useRouterBFCache",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t,r){let[a,o]=(0,n.useState)(()=>({tree:e,cacheNode:t,stateKey:r,next:null}));if(a.tree===e)return a;let i={tree:e,cacheNode:t,stateKey:r,next:null},s=1,l=a,c=i;for(;null!==l&&s<1;){if(l.stateKey===r){c.next=l.next;break}{s++;let e={tree:l.tree,cacheNode:l.cacheNode,stateKey:l.stateKey,next:null};c.next=e,c=e}l=l.next}return o(i),i}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},39756,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={LoadingBoundaryProvider:function(){return j},default:function(){return A}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(55682),i=e.r(90809),s=e.r(43476),l=i._(e.r(71645)),c=o._(e.r(74080)),u=e.r(8372),d=e.r(1244),f=e.r(72383),p=e.r(91915),m=e.r(58442),h=e.r(68017),g=e.r(70725),y=e.r(28298);e.r(74180);let b=e.r(61994),P=e.r(33906),_=e.r(95871),v=c.default.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,E=["bottom","height","left","right","top","width","x","y"];function R(e,t){let r=e.getClientRects();if(0===r.length)return!1;let n=1/0;for(let e=0;e<r.length;e++){let t=r[e];t.top<n&&(n=t.top)}return n>=0&&n<=t}class O extends l.default.Component{componentDidMount(){this.handlePotentialScroll()}componentDidUpdate(){this.handlePotentialScroll()}render(){return this.props.children}constructor(...e){super(...e),this.handlePotentialScroll=()=>{let{focusAndScrollRef:e,cacheNode:t}=this.props,r=e.forceScroll?e.scrollRef:t.scrollRef;if(null===r||!r.current)return;let n=null,a=e.hashFragment;if(a&&(n="top"===a?document.body:document.getElementById(a)??document.getElementsByName(a)[0]),n||(n="u"<typeof window?null:(0,v.findDOMNode)(this)),n instanceof Element){for(;!(n instanceof HTMLElement)||function(e){if(["sticky","fixed"].includes(getComputedStyle(e).position))return!0;let t=e.getBoundingClientRect();return E.every(e=>0===t[e])}(n);){if(null===n.nextElementSibling)return;n=n.nextElementSibling}r.current=!1,(0,p.disableSmoothScrollDuringRouteTransition)(()=>{if(a)return void n.scrollIntoView();let e=document.documentElement,t=e.clientHeight;!R(n,t)&&(e.scrollTop=0,R(n,t)||n.scrollIntoView())},{dontForceLayout:!0,onlyHashChange:e.onlyHashChange}),e.onlyHashChange=!1,e.hashFragment=null,n.focus()}}}}function w({children:e,cacheNode:t}){let r=(0,l.useContext)(u.GlobalLayoutRouterContext);if(!r)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});return(0,s.jsx)(O,{focusAndScrollRef:r.focusAndScrollRef,cacheNode:t,children:e})}function S({tree:e,segmentPath:t,debugNameContext:r,cacheNode:n,params:a,url:o,isActive:i}){let c,f=(0,l.useContext)(u.GlobalLayoutRouterContext);if((0,l.useContext)(b.NavigationPromisesContext),!f)throw Object.defineProperty(Error("invariant global layout router not mounted"),"__NEXT_ERROR_CODE",{value:"E473",enumerable:!1,configurable:!0});let p=null!==n?n:(0,l.use)(d.unresolvedThenable),m=null!==p.prefetchRsc?p.prefetchRsc:p.rsc,h=(0,l.useDeferredValue)(p.rsc,m);if((0,_.isDeferredRsc)(h)){let e=(0,l.use)(h);null===e&&(0,l.use)(d.unresolvedThenable),c=e}else null===h&&(0,l.use)(d.unresolvedThenable),c=h;let g=c;return(0,s.jsx)(u.LayoutRouterContext.Provider,{value:{parentTree:e,parentCacheNode:p,parentSegmentPath:t,parentParams:a,parentLoadingData:null,debugNameContext:r,url:o,isActive:i},children:g})}function j({loading:e,children:t}){let r=(0,l.use)(u.LayoutRouterContext);return null===r?t:(0,s.jsx)(u.LayoutRouterContext.Provider,{value:{parentTree:r.parentTree,parentCacheNode:r.parentCacheNode,parentSegmentPath:r.parentSegmentPath,parentParams:r.parentParams,parentLoadingData:e,debugNameContext:r.debugNameContext,url:r.url,isActive:r.isActive},children:t})}function C({name:e,loading:t,children:r}){if(null!==t){let n=t[0],a=t[1],o=t[2];return(0,s.jsx)(l.Suspense,{name:e,fallback:(0,s.jsxs)(s.Fragment,{children:[a,o,n]}),children:r})}return(0,s.jsx)(s.Fragment,{children:r})}function A({parallelRouterKey:e,error:t,errorStyles:r,errorScripts:n,templateStyles:a,templateScripts:o,template:i,notFound:c,forbidden:p,unauthorized:b,segmentViewBoundaries:_}){let v=(0,l.useContext)(u.LayoutRouterContext);if(!v)throw Object.defineProperty(Error("invariant expected layout router to be mounted"),"__NEXT_ERROR_CODE",{value:"E56",enumerable:!1,configurable:!0});let{parentTree:E,parentCacheNode:R,parentSegmentPath:O,parentParams:j,parentLoadingData:x,url:k,isActive:T,debugNameContext:N}=v,D=E[0],M=null===O?[e]:O.concat([D,e]),I=E[1][e],F=R.slots;(void 0===I||null===F)&&(0,l.use)(d.unresolvedThenable);let $=I[0],L=F[e]??null,U=(0,g.createRouterCacheKey)($,!0),X=(0,y.useRouterBFCache)(I,L,U),H=[];do{let e=X.tree,l=X.cacheNode,d=X.stateKey,g=e[0],y=j;if(Array.isArray(g)){let e=g[0],t=g[1],r=g[2],n=(0,P.getParamValueFromCacheKey)(t,r);null!==n&&(y={...j,[e]:n})}let _=function(e){if("/"===e)return"/";if("string"==typeof e)if("(__SLOT__)"===e)return;else return e+"/";return e[1]+"/"}(g),v=_??N,E=void 0===_?void 0:N,R=(0,s.jsxs)(w,{cacheNode:l,children:[(0,s.jsx)(f.ErrorBoundary,{errorComponent:t,errorStyles:r,errorScripts:n,children:(0,s.jsx)(C,{name:E,loading:x,children:(0,s.jsx)(h.HTTPAccessFallbackBoundary,{notFound:c,forbidden:p,unauthorized:b,children:(0,s.jsxs)(m.RedirectBoundary,{children:[(0,s.jsx)(S,{url:k,tree:e,params:y,cacheNode:l,segmentPath:M,debugNameContext:v,isActive:T&&d===U}),null]})})})}),null]}),O=(0,s.jsxs)(u.TemplateContext.Provider,{value:R,children:[a,o,i]},d);H.push(O),X=X.next}while(null!==X)return H}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},37457,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return s}});let n=e.r(90809),a=e.r(43476),o=n._(e.r(71645)),i=e.r(8372);function s(){let e=(0,o.useContext)(i.TemplateContext);return(0,a.jsx)(a.Fragment,{children:e})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},93504,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},66996,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderSearchParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(93504).createRenderSearchParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},6831,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return a}});let n=new WeakMap;function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);return n.set(e,r),r}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},97689,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createRenderParamsFromClient",{enumerable:!0,get:function(){return n}});let n=e.r(6831).createRenderParamsFromClient;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},66373,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={accumulateRootVaryParam:function(){return y},accumulateVaryParam:function(){return g},createResponseVaryParamsAccumulator:function(){return c},createVaryParamsAccumulator:function(){return u},createVaryingParams:function(){return b},createVaryingSearchParams:function(){return P},emptyVaryParamsAccumulator:function(){return l},finishAccumulatingVaryParams:function(){return _},getMetadataVaryParamsAccumulator:function(){return d},getMetadataVaryParamsThenable:function(){return p},getRootParamsVaryParamsAccumulator:function(){return h},getVaryParamsThenable:function(){return f},getViewportVaryParamsAccumulator:function(){return m}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(62141);function i(){let e={varyParams:new Set,status:"pending",value:new Set,then(t){t&&("pending"===e.status?e.resolvers.push(t):t(e.value))},resolvers:[]};return e}let s=new Set,l={varyParams:s,status:"fulfilled",value:s,then(e){e&&e(s)},resolvers:[]};function c(){let e=i();return{head:e,rootParams:i(),segments:new Set}}function u(){let e=o.workUnitAsyncStorage.getStore();if(e)switch(e.type){case"prerender":case"prerender-runtime":{let t=e.varyParamsAccumulator;if(null!==t){let e=i();return t.segments.add(e),e}}}return null}function d(){let e=o.workUnitAsyncStorage.getStore();if(e)switch(e.type){case"prerender":case"prerender-runtime":{let t=e.varyParamsAccumulator;if(null!==t)return t.head}}return null}function f(e){return e}function p(){let e=d();return null!==e?e:null}let m=d;function h(){let e=o.workUnitAsyncStorage.getStore();if(e)switch(e.type){case"prerender":case"prerender-runtime":{let t=e.varyParamsAccumulator;if(null!==t)return t.rootParams}}return null}function g(e,t){e.varyParams.add(t)}function y(e){let t=h();null!==t&&g(t,e)}function b(e,t,r){if(null!==r)return new Proxy(t,{get:(t,n,a)=>("string"==typeof n&&(n===r||Object.prototype.hasOwnProperty.call(t,n))&&g(e,n),Reflect.get(t,n,a)),has:(t,n)=>(n===r&&g(e,r),Reflect.has(t,n)),ownKeys:t=>(g(e,r),Reflect.ownKeys(t))});let n={};for(let r in t)Object.defineProperty(n,r,{get:()=>(g(e,r),t[r]),enumerable:!0});return n}function P(e,t){let r={};for(let n in t)Object.defineProperty(r,n,{get:()=>(g(e,"?"),t[n]),enumerable:!0});return r}async function _(e){let t=e.rootParams.varyParams;for(let r of(v(e.head,t),e.segments))v(r,t);await Promise.resolve(),await Promise.resolve(),await Promise.resolve()}function v(e,t){if("pending"!==e.status)return;let r=new Set(e.varyParams);for(let e of t)r.add(e);for(let t of(e.value=r,e.status="fulfilled",e.resolvers))t(r);e.resolvers=[]}},42715,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ReflectAdapter",{enumerable:!0,get:function(){return n}});class n{static get(e,t,r){let n=Reflect.get(e,t,r);return"function"==typeof n?n.bind(e):n}static set(e,t,r,n){return Reflect.set(e,t,r,n)}static has(e,t){return Reflect.has(e,t)}static deleteProperty(e,t){return Reflect.deleteProperty(e,t)}}},76361,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"createDedupedByCallsiteServerErrorLoggerDev",{enumerable:!0,get:function(){return l}});let n=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=a(void 0);if(t&&t.has(e))return t.get(e);var r={__proto__:null},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if("default"!==o&&Object.prototype.hasOwnProperty.call(e,o)){var i=n?Object.getOwnPropertyDescriptor(e,o):null;i&&(i.get||i.set)?Object.defineProperty(r,o,i):r[o]=e[o]}return r.default=e,t&&t.set(e,r),r}(e.r(71645));function a(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(a=function(e){return e?r:t})(e)}let o={current:null},i="function"==typeof n.cache?n.cache:e=>e,s=console.warn;function l(e){return function(...t){s(e(...t))}}i(e=>{try{s(o.current)}finally{o.current=null}})},65932,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={describeHasCheckingStringProperty:function(){return s},describeStringPropertyAccess:function(){return i},wellKnownProperties:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=/^[A-Za-z_$][A-Za-z0-9_$]*$/;function i(e,t){return o.test(t)?`\`${e}.${t}\``:`\`${e}[${JSON.stringify(t)}]\``}function s(e,t){let r=JSON.stringify(t);return`\`Reflect.has(${e}, ${r})\`, \`${r} in ${e}\`, or similar`}let l=new Set(["hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toString","valueOf","toLocaleString","then","catch","finally","status","displayName","_debugInfo","toJSON","$$typeof","__esModule","@@iterator"])},83066,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"afterTaskAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(90317).createAsyncLocalStorage)()},41643,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"afterTaskAsyncStorage",{enumerable:!0,get:function(){return n.afterTaskAsyncStorageInstance}});let n=e.r(83066)},50999,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={isRequestAPICallableInsideAfter:function(){return c},throwForSearchParamsAccessInUseCache:function(){return l},throwWithStaticGenerationBailoutErrorWithDynamicError:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(43248),i=e.r(41643);function s(e,t){throw Object.defineProperty(new o.StaticGenBailoutError(`Route ${e} with \`dynamic = "error"\` couldn't be rendered statically because it used ${t}. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`),"__NEXT_ERROR_CODE",{value:"E543",enumerable:!1,configurable:!0})}function l(e,t){let r=Object.defineProperty(Error(`Route ${e.route} used \`searchParams\` inside "use cache". Accessing dynamic request data inside a cache scope is not supported. If you need some search params inside a cached function await \`searchParams\` outside of the cached function and pass only the required search params as arguments to the cached function. See more info here: https://nextjs.org/docs/messages/next-request-in-use-cache`),"__NEXT_ERROR_CODE",{value:"E842",enumerable:!1,configurable:!0});throw Error.captureStackTrace(r,t),e.invalidDynamicUsageError??=r,r}function c(){let e=i.afterTaskAsyncStorage.getStore();return(null==e?void 0:e.rootTaskSpawnPhase)==="action"}},28649,(e,t,r)=>{"use strict";var n=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,s={},l={RequestCookies:()=>h,ResponseCookies:()=>g,parseCookie:()=>d,parseSetCookie:()=>f,stringifyCookie:()=>u};for(var c in l)n(s,c,{get:l[c],enumerable:!0});function u(e){var t;let r=["path"in e&&e.path&&`Path=${e.path}`,"expires"in e&&(e.expires||0===e.expires)&&`Expires=${("number"==typeof e.expires?new Date(e.expires):e.expires).toUTCString()}`,"maxAge"in e&&"number"==typeof e.maxAge&&`Max-Age=${e.maxAge}`,"domain"in e&&e.domain&&`Domain=${e.domain}`,"secure"in e&&e.secure&&"Secure","httpOnly"in e&&e.httpOnly&&"HttpOnly","sameSite"in e&&e.sameSite&&`SameSite=${e.sameSite}`,"partitioned"in e&&e.partitioned&&"Partitioned","priority"in e&&e.priority&&`Priority=${e.priority}`].filter(Boolean),n=`${e.name}=${encodeURIComponent(null!=(t=e.value)?t:"")}`;return 0===r.length?n:`${n}; ${r.join("; ")}`}function d(e){let t=new Map;for(let r of e.split(/; */)){if(!r)continue;let e=r.indexOf("=");if(-1===e){t.set(r,"true");continue}let[n,a]=[r.slice(0,e),r.slice(e+1)];try{t.set(n,decodeURIComponent(null!=a?a:"true"))}catch{}}return t}function f(e){if(!e)return;let[[t,r],...n]=d(e),{domain:a,expires:o,httponly:i,maxage:s,path:l,samesite:c,secure:u,partitioned:f,priority:h}=Object.fromEntries(n.map(([e,t])=>[e.toLowerCase().replace(/-/g,""),t]));{var g,y,b={name:t,value:decodeURIComponent(r),domain:a,...o&&{expires:new Date(o)},...i&&{httpOnly:!0},..."string"==typeof s&&{maxAge:Number(s)},path:l,...c&&{sameSite:p.includes(g=(g=c).toLowerCase())?g:void 0},...u&&{secure:!0},...h&&{priority:m.includes(y=(y=h).toLowerCase())?y:void 0},...f&&{partitioned:!0}};let e={};for(let t in b)b[t]&&(e[t]=b[t]);return e}}t.exports=((e,t,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let s of o(t))i.call(e,s)||void 0===s||n(e,s,{get:()=>t[s],enumerable:!(r=a(t,s))||r.enumerable});return e})(n({},"__esModule",{value:!0}),s);var p=["strict","lax","none"],m=["low","medium","high"],h=class{constructor(e){this._parsed=new Map,this._headers=e;const t=e.get("cookie");if(t)for(const[e,r]of d(t))this._parsed.set(e,{name:e,value:r})}[Symbol.iterator](){return this._parsed[Symbol.iterator]()}get size(){return this._parsed.size}get(...e){let t="string"==typeof e[0]?e[0]:e[0].name;return this._parsed.get(t)}getAll(...e){var t;let r=Array.from(this._parsed);if(!e.length)return r.map(([e,t])=>t);let n="string"==typeof e[0]?e[0]:null==(t=e[0])?void 0:t.name;return r.filter(([e])=>e===n).map(([e,t])=>t)}has(e){return this._parsed.has(e)}set(...e){let[t,r]=1===e.length?[e[0].name,e[0].value]:e,n=this._parsed;return n.set(t,{name:t,value:r}),this._headers.set("cookie",Array.from(n).map(([e,t])=>u(t)).join("; ")),this}delete(e){let t=this._parsed,r=Array.isArray(e)?e.map(e=>t.delete(e)):t.delete(e);return this._headers.set("cookie",Array.from(t).map(([e,t])=>u(t)).join("; ")),r}clear(){return this.delete(Array.from(this._parsed.keys())),this}[Symbol.for("edge-runtime.inspect.custom")](){return`RequestCookies ${JSON.stringify(Object.fromEntries(this._parsed))}`}toString(){return[...this._parsed.values()].map(e=>`${e.name}=${encodeURIComponent(e.value)}`).join("; ")}},g=class{constructor(e){var t,r,n;this._parsed=new Map,this._headers=e;const a=null!=(n=null!=(r=null==(t=e.getSetCookie)?void 0:t.call(e))?r:e.get("set-cookie"))?n:[];for(const e of Array.isArray(a)?a:function(e){if(!e)return[];var t,r,n,a,o,i=[],s=0;function l(){for(;s<e.length&&/\s/.test(e.charAt(s));)s+=1;return s<e.length}for(;s<e.length;){for(t=s,o=!1;l();)if(","===(r=e.charAt(s))){for(n=s,s+=1,l(),a=s;s<e.length&&"="!==(r=e.charAt(s))&&";"!==r&&","!==r;)s+=1;s<e.length&&"="===e.charAt(s)?(o=!0,s=a,i.push(e.substring(t,n)),t=s):s=n+1}else s+=1;(!o||s>=e.length)&&i.push(e.substring(t,e.length))}return i}(a)){const t=f(e);t&&this._parsed.set(t.name,t)}}get(...e){let t="string"==typeof e[0]?e[0]:e[0].name;return this._parsed.get(t)}getAll(...e){var t;let r=Array.from(this._parsed.values());if(!e.length)return r;let n="string"==typeof e[0]?e[0]:null==(t=e[0])?void 0:t.name;return r.filter(e=>e.name===n)}has(e){return this._parsed.has(e)}set(...e){let[t,r,n]=1===e.length?[e[0].name,e[0].value,e[0]]:e,a=this._parsed;return a.set(t,function(e={name:"",value:""}){return"number"==typeof e.expires&&(e.expires=new Date(e.expires)),e.maxAge&&(e.expires=new Date(Date.now()+1e3*e.maxAge)),(null===e.path||void 0===e.path)&&(e.path="/"),e}({name:t,value:r,...n})),function(e,t){for(let[,r]of(t.delete("set-cookie"),e)){let e=u(r);t.append("set-cookie",e)}}(a,this._headers),this}delete(...e){let[t,r]="string"==typeof e[0]?[e[0]]:[e[0].name,e[0]];return this.set({...r,name:t,value:"",expires:new Date(0)})}[Symbol.for("edge-runtime.inspect.custom")](){return`ResponseCookies ${JSON.stringify(Object.fromEntries(this._parsed))}`}toString(){return[...this._parsed.values()].map(u).join("; ")}}},96883,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={RequestCookies:function(){return o.RequestCookies},ResponseCookies:function(){return o.ResponseCookies},stringifyCookie:function(){return o.stringifyCookie}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(28649)},97270,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={MutableRequestCookiesAdapter:function(){return m},ReadonlyRequestCookiesError:function(){return c},RequestCookiesAdapter:function(){return u},appendMutableCookies:function(){return p},areCookiesMutableInCurrentPhase:function(){return g},createCookiesWithMutableAccessCheck:function(){return h},getModifiedCookieValues:function(){return f},responseCookiesToRequestCookies:function(){return b}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(96883),i=e.r(42715),s=e.r(63599),l=e.r(39146);class c extends Error{constructor(){super("Cookies can only be modified in a Server Action or Route Handler. Read more: https://nextjs.org/docs/app/api-reference/functions/cookies#options")}static callable(){throw new c}}class u{static seal(e){return new Proxy(e,{get(e,t,r){switch(t){case"clear":case"delete":case"set":return c.callable;default:return i.ReflectAdapter.get(e,t,r)}}})}}let d=Symbol.for("next.mutated.cookies");function f(e){let t=e[d];return t&&Array.isArray(t)&&0!==t.length?t:[]}function p(e,t){let r=f(t);if(0===r.length)return!1;let n=new o.ResponseCookies(e),a=n.getAll();for(let e of r)n.set(e);for(let e of a)n.set(e);return!0}class m{static wrap(e,t){let r=new o.ResponseCookies(new Headers);for(let t of e.getAll())r.set(t);let n=[],a=new Set,c=()=>{let e=s.workAsyncStorage.getStore();if(e&&(e.pathWasRevalidated=l.ActionDidRevalidateStaticAndDynamic),n=r.getAll().filter(e=>a.has(e.name)),t){let e=[];for(let t of n){let r=new o.ResponseCookies(new Headers);r.set(t),e.push(r.toString())}t(e)}},u=new Proxy(r,{get(e,t,r){switch(t){case d:return n;case"delete":return function(...t){a.add("string"==typeof t[0]?t[0]:t[0].name);try{return e.delete(...t),u}finally{c()}};case"set":return function(...t){a.add("string"==typeof t[0]?t[0]:t[0].name);try{return e.set(...t),u}finally{c()}};default:return i.ReflectAdapter.get(e,t,r)}}});return u}}function h(e){let t=new Proxy(e.mutableCookies,{get(r,n,a){switch(n){case"delete":return function(...n){return y(e,"cookies().delete"),r.delete(...n),t};case"set":return function(...n){return y(e,"cookies().set"),r.set(...n),t};default:return i.ReflectAdapter.get(r,n,a)}}});return t}function g(e){return"action"===e.phase}function y(e,t){if(!g(e))throw new c}function b(e){let t=new o.RequestCookies(new Headers);for(let r of e.getAll())t.set(r);return t}},87720,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={HeadersAdapter:function(){return s},ReadonlyHeadersError:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(42715);class i extends Error{constructor(){super("Headers cannot be modified. Read more: https://nextjs.org/docs/app/api-reference/functions/headers")}static callable(){throw new i}}class s extends Headers{constructor(e){super(),this.headers=new Proxy(e,{get(t,r,n){if("symbol"==typeof r)return o.ReflectAdapter.get(t,r,n);let a=r.toLowerCase(),i=Object.keys(e).find(e=>e.toLowerCase()===a);if(void 0!==i)return o.ReflectAdapter.get(t,i,n)},set(t,r,n,a){if("symbol"==typeof r)return o.ReflectAdapter.set(t,r,n,a);let i=r.toLowerCase(),s=Object.keys(e).find(e=>e.toLowerCase()===i);return o.ReflectAdapter.set(t,s??r,n,a)},has(t,r){if("symbol"==typeof r)return o.ReflectAdapter.has(t,r);let n=r.toLowerCase(),a=Object.keys(e).find(e=>e.toLowerCase()===n);return void 0!==a&&o.ReflectAdapter.has(t,a)},deleteProperty(t,r){if("symbol"==typeof r)return o.ReflectAdapter.deleteProperty(t,r);let n=r.toLowerCase(),a=Object.keys(e).find(e=>e.toLowerCase()===n);return void 0===a||o.ReflectAdapter.deleteProperty(t,a)}})}static seal(e){return new Proxy(e,{get(e,t,r){switch(t){case"append":case"delete":case"set":return i.callable;default:return o.ReflectAdapter.get(e,t,r)}}})}merge(e){return Array.isArray(e)?e.join(", "):e}static from(e){return e instanceof Headers?e:new s(e)}append(e,t){let r=this.headers[e];"string"==typeof r?this.headers[e]=[r,t]:Array.isArray(r)?r.push(t):this.headers[e]=t}delete(e){delete this.headers[e]}get(e){let t=this.headers[e];return void 0!==t?this.merge(t):null}has(e){return void 0!==this.headers[e]}set(e,t){this.headers[e]=t}forEach(e,t){for(let[r,n]of this.entries())e.call(t,n,r,this)}*entries(){for(let e of Object.keys(this.headers)){let t=e.toLowerCase(),r=this.get(t);yield[t,r]}}*keys(){for(let e of Object.keys(this.headers)){let t=e.toLowerCase();yield t}}*values(){for(let e of Object.keys(this.headers)){let t=this.get(e);yield t}}[Symbol.iterator](){return this.entries()}}},1643,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={getParamProperties:function(){return l},getSegmentParam:function(){return i},isCatchAll:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(91463);function i(e){let t=o.INTERCEPTION_ROUTE_MARKERS.find(t=>e.startsWith(t));return(t&&(e=e.slice(t.length)),e.startsWith("[[...")&&e.endsWith("]]"))?{paramType:"optional-catchall",paramName:e.slice(5,-2)}:e.startsWith("[...")&&e.endsWith("]")?{paramType:t?`catchall-intercepted-${t}`:"catchall",paramName:e.slice(4,-1)}:e.startsWith("[")&&e.endsWith("]")?{paramType:t?`dynamic-intercepted-${t}`:"dynamic",paramName:e.slice(1,-1)}:null}function s(e){return"catchall"===e||"catchall-intercepted-(..)(..)"===e||"catchall-intercepted-(.)"===e||"catchall-intercepted-(..)"===e||"catchall-intercepted-(...)"===e||"optional-catchall"===e}function l(e){let t=!1,r=!1;switch(e){case"catchall":case"catchall-intercepted-(..)(..)":case"catchall-intercepted-(.)":case"catchall-intercepted-(..)":case"catchall-intercepted-(...)":t=!0;break;case"optional-catchall":t=!0,r=!0}return{repeat:t,optional:r}}},90929,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"parseRelativeUrl",{enumerable:!0,get:function(){return o}});let n=e.r(18967),a=e.r(98183);function o(e,t,r=!0){let i=new URL("u"<typeof window?"http://n":(0,n.getLocationOrigin)()),s=t?new URL(t,i):e.startsWith(".")?new URL("u"<typeof window?"http://n":window.location.href):i,{pathname:l,searchParams:c,search:u,hash:d,href:f,origin:p}=e.startsWith("/")?new URL(`${s.protocol}//${s.host}${e}`):new URL(e,s);if(p!==i.origin)throw Object.defineProperty(Error(`invariant: invalid relative URL, router received ${e}`),"__NEXT_ERROR_CODE",{value:"E159",enumerable:!1,configurable:!0});return{auth:null,host:null,hostname:null,pathname:l,port:null,protocol:null,query:r?(0,a.searchParamsToUrlQuery)(c):void 0,search:u,hash:d,href:f.slice(p.length),slashes:null}}},13770,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={InstantValidationError:function(){return s},isInstantValidationError:function(){return i}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o="INSTANT_VALIDATION_ERROR";function i(e){return!!(e&&"object"==typeof e&&e instanceof Error&&e.digest===o)}class s extends Error{constructor(...e){super(...e),this.digest=o}}},18450,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={assertRootParamInSamples:function(){return S},createCookiesFromSample:function(){return y},createDraftModeForValidation:function(){return _},createExhaustiveParamsProxy:function(){return v},createExhaustiveSearchParamsProxy:function(){return E},createExhaustiveURLSearchParamsProxy:function(){return R},createHeadersFromSample:function(){return P},createRelativeURLFromSamples:function(){return w},createValidationSampleTracking:function(){return m},trackMissingSampleError:function(){return h},trackMissingSampleErrorAndThrow:function(){return g}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(96883),i=e.r(97270),s=e.r(87720),l=e.r(1643),c=e.r(90929),u=e.r(12718),d=e.r(13770),f=e.r(62141),p=e.r(65932);function m(){return{missingSampleErrors:[]}}function h(e){(function(){let e=null,t=f.workUnitAsyncStorage.getStore();if(t)switch(t.type){case"request":case"validation-client":e=t.validationSampleTracking??null}if(!e)throw Object.defineProperty(new u.InvariantError("Expected to have a workUnitStore that provides validationSampleTracking"),"__NEXT_ERROR_CODE",{value:"E1110",enumerable:!1,configurable:!0});return e})().missingSampleErrors.push(e)}function g(e){throw h(e),e}function y(e,t){let r=new Set,n=new o.RequestCookies(new Headers);if(e)for(let t of e)r.add(t.name),null!==t.value&&n.set(t.name,t.value);return new Proxy(i.RequestCookiesAdapter.seal(n),{get(e,n,a){if("has"===n){let o=Reflect.get(e,n,a);return function(n){return r.has(n)||g(b(t,n)),o.call(e,n)}}if("get"===n){let o=Reflect.get(e,n,a);return function(n){let a;if("string"==typeof n)a=n;else{if(!n||"object"!=typeof n||"string"!=typeof n.name)return o.call(e,n);a=n.name}return r.has(a)||g(b(t,a)),o.call(e,a)}}return Reflect.get(e,n,a)}})}function b(e,t){return Object.defineProperty(new d.InstantValidationError(`Route "${e}" accessed cookie "${t}" which is not defined in the \`samples\` of \`unstable_instant\`. Add it to the sample's \`cookies\` array, or \`{ name: "${t}", value: null }\` if it should be absent.`),"__NEXT_ERROR_CODE",{value:"E1115",enumerable:!1,configurable:!0})}function P(e,t,r){let n=e?[...e]:[];if(n.find(([e])=>"cookie"===e.toLowerCase()))throw Object.defineProperty(new d.InstantValidationError('Invalid sample: Defining cookies via a "cookie" header is not supported. Use `cookies: [{ name: ..., value: ... }]` instead.'),"__NEXT_ERROR_CODE",{value:"E1111",enumerable:!1,configurable:!0});if(t){let e=t.toString();n.push(["cookie",""!==e?e:null])}let a=new Set,o={};for(let[e,t]of n)a.add(e.toLowerCase()),null!==t&&(o[e.toLowerCase()]=t);return new Proxy(s.HeadersAdapter.seal(s.HeadersAdapter.from(o)),{get(e,t,n){if("get"===t||"has"===t){let o=Reflect.get(e,t,n);return function(t){let n=t.toLowerCase();return a.has(n)||g(Object.defineProperty(new d.InstantValidationError(`Route "${r}" accessed header "${n}" which is not defined in the \`samples\` of \`unstable_instant\`. Add it to the sample's \`headers\` array, or \`["${n}", null]\` if it should be absent.`),"__NEXT_ERROR_CODE",{value:"E1116",enumerable:!1,configurable:!0})),o.call(e,n)}}return Reflect.get(e,t,n)}})}function _(){return{get isEnabled(){return!1},enable(){throw Object.defineProperty(Error("Draft mode cannot be enabled during build-time instant validation."),"__NEXT_ERROR_CODE",{value:"E1092",enumerable:!1,configurable:!0})},disable(){throw Object.defineProperty(Error("Draft mode cannot be disabled during build-time instant validation."),"__NEXT_ERROR_CODE",{value:"E1094",enumerable:!1,configurable:!0})}}}function v(e,t,r){return new Proxy(e,{get:(n,a,o)=>("string"==typeof a&&!p.wellKnownProperties.has(a)&&a in e&&!t.has(a)&&g(Object.defineProperty(new d.InstantValidationError(`Route "${r}" accessed param "${a}" which is not defined in the \`samples\` of \`unstable_instant\`. Add it to the sample's \`params\` object.`),"__NEXT_ERROR_CODE",{value:"E1095",enumerable:!1,configurable:!0})),Reflect.get(n,a,o))})}function E(e,t,r){return new Proxy(e,{get:(e,n,a)=>("string"!=typeof n||p.wellKnownProperties.has(n)||t.has(n)||g(O(r,n)),Reflect.get(e,n,a)),has:(e,n)=>("string"!=typeof n||p.wellKnownProperties.has(n)||t.has(n)||g(O(r,n)),Reflect.has(e,n))})}function R(e,t,r){return new Proxy(e,{get(e,n,a){if("get"===n||"getAll"===n||"has"===n){let o=Reflect.get(e,n,a);return n=>("string"!=typeof n||t.has(n)||g(O(r,n)),o.call(e,n))}let o=Reflect.get(e,n,a);return"function"!=typeof o||Object.hasOwn(e,n)?o:o.bind(e)}})}function O(e,t){return Object.defineProperty(new d.InstantValidationError(`Route "${e}" accessed searchParam "${t}" which is not defined in the \`samples\` of \`unstable_instant\`. Add it to the sample's \`searchParams\` object, or \`{ "${t}": null }\` if it should be absent.`),"__NEXT_ERROR_CODE",{value:"E1098",enumerable:!1,configurable:!0})}function w(e,t,r){let n=function(e,t){let r=[];for(let n of e.split("/")){let e=(0,l.getSegmentParam)(n);if(e)switch(e.paramType){case"catchall":case"optional-catchall":{let a=t[e.paramName];if(void 0===a)a=[n];else if(!Array.isArray(a))throw Object.defineProperty(new d.InstantValidationError(`Expected sample param value for segment '${n}' to be an array of strings, got ${typeof a}`),"__NEXT_ERROR_CODE",{value:"E1104",enumerable:!1,configurable:!0});r.push(...a.map(e=>encodeURIComponent(e)));break}case"dynamic":{let a=t[e.paramName];if(void 0===a)a=n;else if("string"!=typeof a)throw Object.defineProperty(new d.InstantValidationError(`Expected sample param value for segment '${n}' to be a string, got ${typeof a}`),"__NEXT_ERROR_CODE",{value:"E1108",enumerable:!1,configurable:!0});r.push(encodeURIComponent(a));break}case"catchall-intercepted-(..)(..)":case"catchall-intercepted-(.)":case"catchall-intercepted-(..)":case"catchall-intercepted-(...)":case"dynamic-intercepted-(..)(..)":case"dynamic-intercepted-(.)":case"dynamic-intercepted-(..)":case"dynamic-intercepted-(...)":throw Object.defineProperty(new u.InvariantError("Not implemented: Validation of interception routes"),"__NEXT_ERROR_CODE",{value:"E1106",enumerable:!1,configurable:!0});default:e.paramType}else r.push(n)}return r.join("/")}(e,t??{}),a="";if(r){let e=(function(e){let t=new URLSearchParams;if(e){for(let[r,n]of Object.entries(e))if(null!=n)if(Array.isArray(n))for(let e of n)t.append(r,e);else t.set(r,n)}return t})(r).toString();e&&(a="?"+e)}return(0,c.parseRelativeUrl)(n+a,void 0,!0)}function S(e,t,r){if(t&&r in t);else{let t=e.route;g(Object.defineProperty(new d.InstantValidationError(`Route "${t}" accessed root param "${r}" which is not defined in the \`samples\` of \`unstable_instant\`. Add it to the sample's \`params\` object.`),"__NEXT_ERROR_CODE",{value:"E1114",enumerable:!1,configurable:!0}))}}},69882,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={createPrerenderSearchParamsForClientPage:function(){return P},createSearchParamsFromClient:function(){return g},createServerSearchParamsForMetadata:function(){return y},createServerSearchParamsForServerPage:function(){return b},makeErroringSearchParamsForUseCache:function(){return O}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(63599),i=e.r(66373),s=e.r(42715),l=e.r(67673),c=e.r(62141),u=e.r(12718),d=e.r(63138),f=e.r(76361),p=e.r(65932),m=e.r(50999),h=e.r(42852);function g(t){let r=o.workAsyncStorage.getStore();if(!r)throw Object.defineProperty(new u.InvariantError("Expected workStore to be initialized"),"__NEXT_ERROR_CODE",{value:"E1068",enumerable:!1,configurable:!0});let n=c.workUnitAsyncStorage.getStore();if(n)switch(n.type){case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":return _(r,n);case"validation-client":return function(t,r,n){var a;let{createExhaustiveSearchParamsProxy:o}=e.r(18450);return Promise.resolve(t=o(t,new Set(Object.keys((null==(a=n.validationSamples)?void 0:a.searchParams)??{})),r.route))}(t,r,n);case"prerender-runtime":throw Object.defineProperty(new u.InvariantError("createSearchParamsFromClient should not be called in a runtime prerender."),"__NEXT_ERROR_CODE",{value:"E769",enumerable:!1,configurable:!0});case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new u.InvariantError("createSearchParamsFromClient should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E739",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new u.InvariantError("createSearchParamsFromClient should not be called inside generateStaticParams."),"__NEXT_ERROR_CODE",{value:"E1133",enumerable:!1,configurable:!0});case"request":return v(t,r,n,!1)}(0,c.throwInvariantForMissingStore)()}function y(e,t){return b(e,(0,i.getMetadataVaryParamsAccumulator)(),t)}function b(e,t,r){let n=o.workAsyncStorage.getStore();if(!n)throw Object.defineProperty(new u.InvariantError("Expected workStore to be initialized"),"__NEXT_ERROR_CODE",{value:"E1068",enumerable:!1,configurable:!0});let a=c.workUnitAsyncStorage.getStore();if(a)switch(a.type){case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":return _(n,a);case"validation-client":throw Object.defineProperty(new u.InvariantError("createServerSearchParamsForServerPage should not be called in a client validation."),"__NEXT_ERROR_CODE",{value:"E1066",enumerable:!1,configurable:!0});case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new u.InvariantError("createServerSearchParamsForServerPage should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E747",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new u.InvariantError("createServerSearchParamsForServerPage should not be called inside generateStaticParams."),"__NEXT_ERROR_CODE",{value:"E1128",enumerable:!1,configurable:!0});case"prerender-runtime":return function(e,t,r,n){let a=w(null!==r?(0,i.createVaryingSearchParams)(r,e):e),{stagedRendering:o}=t;if(!o)return a;let s=n?h.RenderStage.EarlyRuntime:h.RenderStage.Runtime;return o.waitForStage(s).then(()=>a)}(e,a,t,r);case"request":return v(e,n,a,r)}(0,c.throwInvariantForMissingStore)()}function P(){let e=o.workAsyncStorage.getStore();if(!e)throw Object.defineProperty(new u.InvariantError("Expected workStore to be initialized"),"__NEXT_ERROR_CODE",{value:"E1068",enumerable:!1,configurable:!0});if(e.forceStatic)return Promise.resolve({});let t=c.workUnitAsyncStorage.getStore();if(t)switch(t.type){case"prerender":case"prerender-client":return(0,d.makeHangingPromise)(t.renderSignal,e.route,"`searchParams`");case"validation-client":throw Object.defineProperty(new u.InvariantError("createPrerenderSearchParamsForClientPage should not be called in a client validation."),"__NEXT_ERROR_CODE",{value:"E1061",enumerable:!1,configurable:!0});case"prerender-runtime":throw Object.defineProperty(new u.InvariantError("createPrerenderSearchParamsForClientPage should not be called in a runtime prerender."),"__NEXT_ERROR_CODE",{value:"E768",enumerable:!1,configurable:!0});case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new u.InvariantError("createPrerenderSearchParamsForClientPage should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E746",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new u.InvariantError("createPrerenderSearchParamsForClientPage should not be called inside generateStaticParams."),"__NEXT_ERROR_CODE",{value:"E1124",enumerable:!1,configurable:!0});case"prerender-ppr":case"prerender-legacy":case"request":return Promise.resolve({})}(0,c.throwInvariantForMissingStore)()}function _(e,t){if(e.forceStatic)return Promise.resolve({});switch(t.type){case"prerender":case"prerender-client":var r=e,n=t;let a=E.get(n);if(a)return a;let o=(0,d.makeHangingPromise)(n.renderSignal,r.route,"`searchParams`"),i=new Proxy(o,{get(e,t,r){if(Object.hasOwn(o,t))return s.ReflectAdapter.get(e,t,r);switch(t){case"then":return(0,l.annotateDynamicAccess)("`await searchParams`, `searchParams.then`, or similar",n),s.ReflectAdapter.get(e,t,r);case"status":return(0,l.annotateDynamicAccess)("`use(searchParams)`, `searchParams.status`, or similar",n),s.ReflectAdapter.get(e,t,r);default:return s.ReflectAdapter.get(e,t,r)}}});return E.set(n,i),i;case"prerender-ppr":case"prerender-legacy":var c=e,u=t;let f=E.get(c);if(f)return f;let p=Promise.resolve({}),h=new Proxy(p,{get(e,t,r){if(Object.hasOwn(p,t))return s.ReflectAdapter.get(e,t,r);if("string"==typeof t&&"then"===t){let e="`await searchParams`, `searchParams.then`, or similar";c.dynamicShouldError?(0,m.throwWithStaticGenerationBailoutErrorWithDynamicError)(c.route,e):"prerender-ppr"===u.type?(0,l.postponeWithTracking)(c.route,e,u.dynamicTracking):(0,l.throwToInterruptStaticGeneration)(e,c,u)}return s.ReflectAdapter.get(e,t,r)}});return E.set(c,h),h;default:return t}}function v(t,r,n,a){if(r.forceStatic)return Promise.resolve({});if(!n.asyncApiPromises)return w(t);if(n.validationSamples){let{createExhaustiveSearchParamsProxy:a}=e.r(18450),o=new Set(Object.keys(n.validationSamples.searchParams??{}));t=a(t,o,r.route)}return(a?n.asyncApiPromises.earlySharedSearchParamsParent:n.asyncApiPromises.sharedSearchParamsParent).then(()=>t)}let E=new WeakMap,R=new WeakMap;function O(){let e=o.workAsyncStorage.getStore();if(!e)throw Object.defineProperty(new u.InvariantError("Expected workStore to be initialized"),"__NEXT_ERROR_CODE",{value:"E1068",enumerable:!1,configurable:!0});let t=R.get(e);if(t)return t;let r=Promise.resolve({}),n=new Proxy(r,{get:function t(n,a,o){return Object.hasOwn(r,a)||"string"!=typeof a||"then"!==a&&p.wellKnownProperties.has(a)||(0,m.throwForSearchParamsAccessInUseCache)(e,t),s.ReflectAdapter.get(n,a,o)}});return R.set(e,n),n}function w(e){let t=E.get(e);if(t)return t;let r=Promise.resolve(e);return E.set(e,r),r}(0,f.createDedupedByCallsiteServerErrorLoggerDev)(function(e,t){let r=e?`Route "${e}" `:"This route ";return Object.defineProperty(Error(`${r}used ${t}. \`searchParams\` is a Promise and must be unwrapped with \`await\` or \`React.use()\` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis`),"__NEXT_ERROR_CODE",{value:"E848",enumerable:!1,configurable:!0})})},74804,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"dynamicAccessAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(90317).createAsyncLocalStorage)()},88276,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"dynamicAccessAsyncStorage",{enumerable:!0,get:function(){return n.dynamicAccessAsyncStorageInstance}});let n=e.r(74804)},41489,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={createParamsFromClient:function(){return g},createPrerenderParamsForClientSegment:function(){return _},createServerParamsForMetadata:function(){return y},createServerParamsForRoute:function(){return b},createServerParamsForServerSegment:function(){return P}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(63599),i=e.r(66373),s=e.r(42715),l=e.r(67673),c=e.r(62141),u=e.r(12718),d=e.r(65932),f=e.r(63138),p=e.r(76361),m=e.r(88276),h=e.r(42852);function g(e){let t=o.workAsyncStorage.getStore();if(!t)throw Object.defineProperty(new u.InvariantError("Expected workStore to be initialized"),"__NEXT_ERROR_CODE",{value:"E1068",enumerable:!1,configurable:!0});let r=c.workUnitAsyncStorage.getStore();if(r)switch(r.type){case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":return v(e,null,t,r,null);case"validation-client":return R(e,t,r.validationSamples);case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new u.InvariantError("createParamsFromClient should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E736",enumerable:!1,configurable:!0});case"prerender-runtime":throw Object.defineProperty(new u.InvariantError("createParamsFromClient should not be called in a runtime prerender."),"__NEXT_ERROR_CODE",{value:"E770",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new u.InvariantError("createParamsFromClient should not be called inside generateStaticParams."),"__NEXT_ERROR_CODE",{value:"E1122",enumerable:!1,configurable:!0});case"request":if(r.validationSamples)return R(e,t,r.validationSamples);return S(e)}(0,c.throwInvariantForMissingStore)()}function y(e,t,r){return P(e,t,(0,i.getMetadataVaryParamsAccumulator)(),r)}function b(e,t=null){let r=o.workAsyncStorage.getStore();if(!r)throw Object.defineProperty(new u.InvariantError("Expected workStore to be initialized"),"__NEXT_ERROR_CODE",{value:"E1068",enumerable:!1,configurable:!0});let n=c.workUnitAsyncStorage.getStore();if(n)switch(n.type){case"prerender":case"prerender-ppr":case"prerender-legacy":return v(e,null,r,n,t);case"prerender-client":case"validation-client":throw Object.defineProperty(new u.InvariantError("createServerParamsForRoute should not be called in client contexts."),"__NEXT_ERROR_CODE",{value:"E1064",enumerable:!1,configurable:!0});case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new u.InvariantError("createServerParamsForRoute should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E738",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new u.InvariantError("createServerParamsForRoute should not be called inside generateStaticParams."),"__NEXT_ERROR_CODE",{value:"E1131",enumerable:!1,configurable:!0});case"prerender-runtime":return E(e,null,n,t,!1);case"request":return S(e)}(0,c.throwInvariantForMissingStore)()}function P(t,r,n,a){let i=o.workAsyncStorage.getStore();if(!i)throw Object.defineProperty(new u.InvariantError("Expected workStore to be initialized"),"__NEXT_ERROR_CODE",{value:"E1068",enumerable:!1,configurable:!0});let s=c.workUnitAsyncStorage.getStore();if(s)switch(s.type){case"prerender":case"prerender-client":case"prerender-ppr":case"prerender-legacy":return v(t,r,i,s,n);case"validation-client":throw Object.defineProperty(new u.InvariantError("createServerParamsForServerSegment should not be called in client contexts."),"__NEXT_ERROR_CODE",{value:"E1101",enumerable:!1,configurable:!0});case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new u.InvariantError("createServerParamsForServerSegment should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E743",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new u.InvariantError("createServerParamsForServerSegment should not be called inside generateStaticParams."),"__NEXT_ERROR_CODE",{value:"E1120",enumerable:!1,configurable:!0});case"prerender-runtime":return E(t,r,s,n,a);case"request":if(s.asyncApiPromises&&s.validationSamples)return function(t,r,n,a,o){let{createExhaustiveParamsProxy:i}=e.r(18450),s=i(t,new Set(Object.keys(n.params??{})),r.route);return(o?a.earlySharedParamsParent:a.sharedParamsParent).then(()=>s)}(t,i,s.validationSamples,s.asyncApiPromises,a);if(s.asyncApiPromises&&function(e,t){if(t){for(let r in e)if(t.has(r))return!0}return!1}(t,s.fallbackParams))return(a?s.asyncApiPromises.earlySharedParamsParent:s.asyncApiPromises.sharedParamsParent).then(()=>t);return S(t)}(0,c.throwInvariantForMissingStore)()}function _(e){let t=o.workAsyncStorage.getStore();if(!t)throw Object.defineProperty(new u.InvariantError("Missing workStore in createPrerenderParamsForClientSegment"),"__NEXT_ERROR_CODE",{value:"E773",enumerable:!1,configurable:!0});let r=c.workUnitAsyncStorage.getStore();if(r)switch(r.type){case"prerender":case"prerender-client":let n=r.fallbackRouteParams;if(n){for(let a in e)if(n.has(a))return(0,f.makeHangingPromise)(r.renderSignal,t.route,"`params`")}break;case"validation-client":throw Object.defineProperty(new u.InvariantError("createPrerenderParamsForClientSegment should not be called in validation contexts."),"__NEXT_ERROR_CODE",{value:"E1099",enumerable:!1,configurable:!0});case"cache":case"private-cache":case"unstable-cache":throw Object.defineProperty(new u.InvariantError("createPrerenderParamsForClientSegment should not be called in cache contexts."),"__NEXT_ERROR_CODE",{value:"E734",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new u.InvariantError("createPrerenderParamsForClientSegment should not be called inside generateStaticParams."),"__NEXT_ERROR_CODE",{value:"E1126",enumerable:!1,configurable:!0})}return Promise.resolve(e)}function v(e,t,r,n,a){let o=null!==a?(0,i.createVaryingParams)(a,e,t):e;switch(n.type){case"prerender":case"prerender-client":{let t=n.fallbackRouteParams;if(t){for(let a in e)if(t.has(a))return function(e,t,r){let n=O.get(e);if(n)return n;let a=new Proxy((0,f.makeHangingPromise)(r.renderSignal,t.route,"`params`"),w);return O.set(e,a),a}(o,r,n)}break}case"prerender-ppr":{let t=n.fallbackRouteParams;if(t){for(let a in e)if(t.has(a))return function(e,t,r,n){let a=O.get(e);if(a)return a;let o={...e},i=Promise.resolve(o);return O.set(e,i),Object.keys(e).forEach(e=>{d.wellKnownProperties.has(e)||t.has(e)&&Object.defineProperty(o,e,{get(){let t=(0,d.describeStringPropertyAccess)("params",e);"prerender-ppr"===n.type?(0,l.postponeWithTracking)(r.route,t,n.dynamicTracking):(0,l.throwToInterruptStaticGeneration)(t,r,n)},enumerable:!0})}),i}(o,t,r,n)}}}return S(o)}function E(e,t,r,n,a){let o=S(null!==n?(0,i.createVaryingParams)(n,e,t):e),{stagedRendering:s}=r;if(!s)return o;let l=a?h.RenderStage.EarlyRuntime:h.RenderStage.Runtime;return s.waitForStage(l).then(()=>o)}function R(t,r,n){let{createExhaustiveParamsProxy:a}=e.r(18450);return Promise.resolve(a(t,new Set(Object.keys((null==n?void 0:n.params)??{})),r.route))}let O=new WeakMap,w={get:function(e,t,r){if("then"===t||"catch"===t||"finally"===t){let n=s.ReflectAdapter.get(e,t,r);return({[t]:(...t)=>{let r=m.dynamicAccessAsyncStorage.getStore();return r&&r.abortController.abort(Object.defineProperty(Error("Accessed fallback `params` during prerendering."),"__NEXT_ERROR_CODE",{value:"E691",enumerable:!1,configurable:!0})),new Proxy(n.apply(e,t),w)}})[t]}return s.ReflectAdapter.get(e,t,r)}};function S(e){let t=O.get(e);if(t)return t;let r=Promise.resolve(e);return O.set(e,r),r}(0,p.createDedupedByCallsiteServerErrorLoggerDev)(function(e,t){let r=e?`Route "${e}" `:"This route ";return Object.defineProperty(Error(`${r}used ${t}. \`params\` is a Promise and must be unwrapped with \`await\` or \`React.use()\` before accessing its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis`),"__NEXT_ERROR_CODE",{value:"E834",enumerable:!1,configurable:!0})})},47257,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientPageRoot",{enumerable:!0,get:function(){return l}});let n=e.r(43476),a=e.r(8372),o=e.r(71645),i=e.r(33906),s=e.r(61994);function l({Component:t,serverProvidedParams:r}){let c,u;if(null!==r)c=r.searchParams,u=r.params;else{let e=(0,o.use)(a.LayoutRouterContext);u=null!==e?e.parentParams:{},c=(0,i.urlSearchParamsToParsedUrlQuery)((0,o.use)(s.SearchParamsContext))}if("u"<typeof window){let r,a,{createSearchParamsFromClient:o}=e.r(69882);r=o(c);let{createParamsFromClient:i}=e.r(41489);return a=i(u),(0,n.jsx)(t,{params:a,searchParams:r})}{let{createRenderSearchParamsFromClient:r}=e.r(66996),a=r(c),{createRenderParamsFromClient:o}=e.r(97689),i=o(u);return(0,n.jsx)(t,{params:i,searchParams:a})}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92825,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ClientSegmentRoot",{enumerable:!0,get:function(){return i}});let n=e.r(43476),a=e.r(8372),o=e.r(71645);function i({Component:t,slots:r,serverProvidedParams:s}){let l;if(null!==s)l=s.params;else{let e=(0,o.use)(a.LayoutRouterContext);l=null!==e?e.parentParams:{}}if("u"<typeof window){let{createParamsFromClient:a}=e.r(41489),o=a(l);return(0,n.jsx)(t,{...r,params:o})}{let{createRenderParamsFromClient:a}=e.r(97689),o=a(l);return(0,n.jsx)(t,{...r,params:o})}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},27201,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"IconMark",{enumerable:!0,get:function(){return a}});let n=e.r(43476),a=()=>"u">typeof window?null:(0,n.jsx)("meta",{name:"«nxt-icon»"})}]);
_next/static/chunks/1553.fe7a8a25cf8dc27c.js DELETED
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1553],{1553:(e,t,r)=>{r.d(t,{disposeHandwrittenEnglishAI:()=>l,recognizeHandwrittenEnglishLines:()=>a});let n=null;async function s(){return Function("url","return import(url)")("https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.8.1/+esm")}async function a(e,t){if(0===e.length)return[];t?.({progress:.85,label:"準備手寫英文辨識模型"});let r=await (!n&&(n=s().then(async({env:e,pipeline:r})=>(e.allowRemoteModels=!0,e.allowLocalModels=!1,e.useBrowserCache=!0,r("image-to-text","Xenova/trocr-small-handwritten",{dtype:"q8",progress_callback:e=>{"progress"===e.status&&"number"==typeof e.progress&&t?.({progress:.86+.08*Math.min(1,Math.max(0,e.progress/100)),label:"正在載入手寫英文辨識模型"})}})))),n),a=[];for(let n=0;n<e.length;n+=1){let s=URL.createObjectURL(e[n]);try{t?.({progress:.94+(n+1)/e.length*.055,label:`AI 正在辨識第 ${n+1} / ${e.length} 行`});let l=await r(s,{max_new_tokens:16}),i=function(e){if(!Array.isArray(e)||0===e.length)return"";let t=e[0];return Array.isArray(t)?t[0]?.generated_text?.trim()??"":t?.generated_text?.trim()??""}(l);i&&a.push(i)}finally{URL.revokeObjectURL(s)}}return a}async function l(){if(n)try{let e=await n;await e.dispose()}finally{n=null}}}}]);
 
 
_next/static/chunks/1966.1560d0f43ac9a41a.js DELETED
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1966],{1966:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return r}});let l=a(4252),s=a(7876),u=l._(a(4232)),n=a(8608);async function o({Component:e,ctx:t}){return{pageProps:await (0,n.loadGetInitialProps)(e,t)}}class r extends u.default.Component{static{this.origGetInitialProps=o}static{this.getInitialProps=o}render(){let{Component:e,pageProps:t}=this.props;return(0,s.jsx)(e,{...t})}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)}}]);
 
 
_next/static/chunks/1awtrs58q38px.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,12408,e=>{"use strict";function i(){return"speechSynthesis"in window&&"SpeechSynthesisUtterance"in window}function t(e,a={}){if(!e.trim())return{ok:!1,message:"請先選擇要播放的內容。"};if(!i())return{ok:!1,message:"這個瀏覽器不支援語音播放,建議使用 Chrome 或 Edge。"};window.speechSynthesis.cancel();let r=new SpeechSynthesisUtterance(e);return r.lang=a.lang??"en-US",r.rate=a.rate??.82,r.pitch=a.pitch??1,r.volume=a.volume??1,window.speechSynthesis.speak(r),{ok:!0,message:"正在播放標準發音。"}}e.s(["speakEnglish",0,function(e,i={}){return t(e,{...i,lang:"en-US"})},"speakMandarin",0,function(e,i={}){return t(e,{rate:.76,pitch:1.05,...i,lang:"zh-TW"})},"speakText",0,t,"stopSpeech",0,function(){i()&&window.speechSynthesis.cancel()}])},32324,e=>{"use strict";var i=e.i(43476);let t={一:"ㄧ",二:"ㄦˋ",三:"ㄙㄢ",上衣:"ㄕㄤˋ ㄧ",下午:"ㄒㄧㄚˋ ㄨˇ",下雨的:"ㄒㄧㄚˋ ㄩˇ ㄉㄜ˙",不舒服:"ㄅㄨˋ ㄕㄨ ㄈㄨ˙",今天:"ㄐㄧㄣ ㄊㄧㄢ",公園:"ㄍㄨㄥ ㄩㄢˊ",午餐:"ㄨˇ ㄘㄢ",天氣:"ㄊㄧㄢ ㄑㄧˋ",手:"ㄕㄡˇ",水:"ㄕㄨㄟˇ",牛奶:"ㄋㄧㄡˊ ㄋㄞˇ",兄弟:"ㄒㄩㄥ ㄉㄧˋ",右邊:"ㄧㄡˋ ㄅㄧㄢ",左邊:"ㄗㄨㄛˇ ㄅㄧㄢ",市場:"ㄕˋ ㄔㄤˇ",再見:"ㄗㄞˋ ㄐㄧㄢˋ",多雲的:"ㄉㄨㄛ ㄩㄣˊ ㄉㄜ˙",早上:"ㄗㄠˇ ㄕㄤˋ",早餐:"ㄗㄠˇ ㄘㄢ",有風的:"ㄧㄡˇ ㄈㄥ ㄉㄜ˙",老師:"ㄌㄠˇ ㄕ",作業:"ㄗㄨㄛˋ ㄧㄝˋ",你好:"ㄋㄧˇ ㄏㄠˇ",車站:"ㄔㄜ ㄓㄢˋ",姊妹:"ㄗˇ ㄇㄟˋ",房間:"ㄈㄤˊ ㄐㄧㄢ",朋友:"ㄆㄥˊ ㄧㄡˇ",河流:"ㄏㄜˊ ㄌㄧㄡˊ",爸爸:"ㄅㄚˋ ㄅㄚ˙",玩:"ㄨㄢˊ",附近:"ㄈㄨˋ ㄐㄧㄣˋ",紅色:"ㄏㄨㄥˊ ㄙㄜˋ",書:"ㄕㄨ",書包:"ㄕㄨ ㄅㄠ",桌子:"ㄓㄨㄛ ㄗ˙",商店:"ㄕㄤ ㄉㄧㄢˋ",問題:"ㄨㄣˋ ㄊㄧˊ",教室:"ㄐㄧㄠˋ ㄕˋ",晚上:"ㄨㄢˇ ㄕㄤˋ",晚餐:"ㄨㄢˇ ㄘㄢ",累了:"ㄌㄟˋ ㄌㄜ˙",帽子:"ㄇㄠˋ ㄗ˙",晴朗的:"ㄑㄧㄥˊ ㄌㄤˇ ㄉㄜ˙",渴了:"ㄎㄜˇ ㄌㄜ˙",畫畫:"ㄏㄨㄚˋ ㄏㄨㄚˋ",答案:"ㄉㄚˊ ㄢˋ",開心:"ㄎㄞ ㄒㄧㄣ",黃色:"ㄏㄨㄤˊ ㄙㄜˋ",媽媽:"ㄇㄚ ㄇㄚ˙",準備好了:"ㄓㄨㄣˇ ㄅㄟˋ ㄏㄠˇ ㄌㄜ˙",腳:"ㄐㄧㄠˇ",鉛筆:"ㄑㄧㄢ ㄅㄧˇ",圖書館:"ㄊㄨˊ ㄕㄨ ㄍㄨㄢˇ",睡覺:"ㄕㄨㄟˋ ㄐㄧㄠˋ",綠色:"ㄌㄩˋ ㄙㄜˋ",說:"ㄕㄨㄛ",寫:"ㄒㄧㄝˇ",練習:"ㄌㄧㄢˋ ㄒㄧˊ",複習:"ㄈㄨˋ ㄒㄧˊ",請:"ㄑㄧㄥˇ",閱讀:"ㄩㄝˋ ㄉㄨˊ",莊:"ㄓㄨㄤ",村莊:"ㄘㄨㄣ ㄓㄨㄤ",鞋子:"ㄒㄧㄝˊ ㄗ˙",餓了:"ㄜˋ ㄌㄜ˙",學校:"ㄒㄩㄝˊ ㄒㄧㄠˋ",學習:"ㄒㄩㄝˊ ㄒㄧˊ",樹:"ㄕㄨˋ",橡皮擦:"ㄒㄧㄤˋ ㄆㄧˊ ㄘㄚ",醒來:"ㄒㄧㄥˇ ㄌㄞˊ",頭:"ㄊㄡˊ",謝謝你:"ㄒㄧㄝˋ ㄒㄧㄝ˙ ㄋㄧˇ",藍色:"ㄌㄢˊ ㄙㄜˋ",醫院:"ㄧ ㄩㄢˋ",難過:"ㄋㄢˊ ㄍㄨㄛˋ",蘋果:"ㄆㄧㄥˊ ㄍㄨㄛˇ",麵包:"ㄇㄧㄢˋ ㄅㄠ",聽:"ㄊㄧㄥ","老師,你好。":"ㄌㄠˇ ㄕ,ㄋㄧˇ ㄏㄠˇ。","這是我的書。":"ㄓㄜˋ ㄕˋ ㄨㄛˇ ㄉㄜ˙ ㄕㄨ。","謝謝你。":"ㄒㄧㄝˋ ㄒㄧㄝ˙ ㄋㄧˇ。","我需要幫忙。":"ㄨㄛˇ ㄒㄩ ㄧㄠˋ ㄅㄤ ㄇㄤˊ。","這是我的家人。":"ㄓㄜˋ ㄕˋ ㄨㄛˇ ㄉㄜ˙ ㄐㄧㄚ ㄖㄣˊ。","我喜歡蘋果。":"ㄨㄛˇ ㄒㄧˇ ㄏㄨㄢ ㄆㄧㄥˊ ㄍㄨㄛˇ。","我讀一本書。":"ㄨㄛˇ ㄉㄨˊ ㄧˋ ㄅㄣˇ ㄕㄨ。","我和朋友一起玩。":"ㄨㄛˇ ㄏㄜˊ ㄆㄥˊ ㄧㄡˇ ㄧˋ ㄑㄧˇ ㄨㄢˊ。","我說英文。":"ㄨㄛˇ ㄕㄨㄛ ㄧㄥ ㄨㄣˊ。","我有一個問題。":"ㄨㄛˇ ㄧㄡˇ ㄧˊ ㄍㄜ˙ ㄨㄣˋ ㄊㄧˊ。","我去圖書館。":"ㄨㄛˇ ㄑㄩˋ ㄊㄨˊ ㄕㄨ ㄍㄨㄢˇ。","我準備好了。":"ㄨㄛˇ ㄓㄨㄣˇ ㄅㄟˋ ㄏㄠˇ ㄌㄜ˙。","河邊有一個安靜的村莊。":"ㄏㄜˊ ㄅㄧㄢ ㄧㄡˇ ㄧˊ ㄍㄜ˙ ㄢ ㄐㄧㄥˋ ㄉㄜ˙ ㄘㄨㄣ ㄓㄨㄤ。"};e.s(["ZhuyinText",0,function({text:e,show:a=!0,compact:r=!1,className:n=""}){let s,d,c=a?(d=(s=e.trim()).match(/^我的名字是 (.+)。$/))?`ㄨㄛˇ ㄉㄜ˙ ㄇㄧㄥˊ ㄗˋ ㄕˋ ${d[1]}。`:t[s]??"":"";return(0,i.jsxs)("span",{className:`inline-flex flex-wrap items-center gap-x-2 gap-y-1 ${n}`,children:[(0,i.jsx)("span",{children:e}),c?(0,i.jsx)("span",{className:`rounded-full bg-white/85 font-black tracking-wide text-stone-500 shadow-sm ${r?"px-2 py-1 text-[11px]":"px-3 py-1 text-xs"}`,children:c}):null]})}],32324)},51668,e=>{"use strict";let i=[{id:"g1-ren",grade:1,character:"人",zhuyin:"ㄖㄣˊ",word:"人們",meaning:"一個人或很多人。",example:"我們都是有禮貌的人。",strokeHint:"先撇再捺,兩筆要站穩。"},{id:"g1-shang",grade:1,character:"上",zhuyin:"ㄕㄤˋ",word:"上學",meaning:"位置在高處,或開始去學校。",example:"我早上去上學。",strokeHint:"中間一豎要直,下面一橫要平。"},{id:"g1-da",grade:1,character:"大",zhuyin:"ㄉㄚˋ",word:"大��",meaning:"尺寸很大,也可以表示很多人。",example:"大家一起讀故事。",strokeHint:"先橫,再撇,最後捺要打開。"},{id:"g1-xiao",grade:1,character:"小",zhuyin:"ㄒㄧㄠˇ",word:"小手",meaning:"尺寸不大。",example:"我用小手寫字。",strokeHint:"中間豎鉤站直,兩點不要太遠。"},{id:"g1-ri",grade:1,character:"日",zhuyin:"ㄖˋ",word:"日子",meaning:"太陽或一天。",example:"今天是好日子。",strokeHint:"外框方正,中間一橫不要太斜。"},{id:"g1-yue",grade:1,character:"月",zhuyin:"ㄩㄝˋ",word:"月亮",meaning:"夜晚天空中的月亮。",example:"月亮掛在天空。",strokeHint:"外框窄長,裡面兩橫平均。"},{id:"g1-shui",grade:1,character:"水",zhuyin:"ㄕㄨㄟˇ",word:"喝水",meaning:"可以喝、洗東西的液體。",example:"運動後要喝水。",strokeHint:"中間豎鉤先寫,左右筆畫像水流。"},{id:"g1-mu",grade:1,character:"木",zhuyin:"ㄇㄨˋ",word:"木頭",meaning:"樹木的材料。",example:"桌子是木頭做的。",strokeHint:"先橫再豎,撇捺要張開。"},{id:"g1-shou",grade:1,character:"手",zhuyin:"ㄕㄡˇ",word:"小手",meaning:"用來拿東西、寫字的身體部位。",example:"我把手洗乾淨。",strokeHint:"三橫間距平均,豎鉤往下穩。"},{id:"g1-kou",grade:1,character:"口",zhuyin:"ㄎㄡˇ",word:"開口",meaning:"嘴巴,也表示說話。",example:"我勇敢開口回答。",strokeHint:"外框寫方,最後一橫封起來。"},{id:"g2-xue",grade:2,character:"學",zhuyin:"ㄒㄩㄝˊ",word:"學習",meaning:"學新的知識或能力。",example:"我每天開心學習。",strokeHint:"上半部不要擠,下面子字要端正。"},{id:"g2-jia",grade:2,character:"家",zhuyin:"ㄐㄧㄚ",word:"家庭",meaning:"和家人一起生活的地方。",example:"家是溫暖的地方。",strokeHint:"寶蓋頭蓋住下面,彎鉤自然。"},{id:"g2-you",grade:2,character:"友",zhuyin:"ㄧㄡˇ",word:"朋友",meaning:"一起玩、互相照顧的人。",example:"我和朋友分享玩具。",strokeHint:"撇要舒展,又字收穩。"},{id:"g2-shu",grade:2,character:"書",zhuyin:"ㄕㄨ",word:"書本",meaning:"可以閱讀的本子。",example:"我喜歡看故事書。",strokeHint:"橫畫多,要保持間距。"},{id:"g2-hua",grade:2,character:"花",zhuyin:"ㄏㄨㄚ",word:"花朵",meaning:"植物開出的美麗部分。",example:"公園裡有很多花。",strokeHint:"草字頭寬,下面化字站穩。"},{id:"g2-kan",grade:2,character:"看",zhuyin:"ㄎㄢˋ",word:"看見",meaning:"用眼睛觀察。",example:"我看見一隻小鳥。",strokeHint:"上方像手,下面目字要方正。"},{id:"g3-yu",grade:3,character:"語",zhuyin:"ㄩˇ",word:"語文",meaning:"說話和文字。",example:"語文課可以讀故事。",strokeHint:"言字旁偏窄,右邊要分層。"},{id:"g3-du",grade:3,character:"讀",zhuyin:"ㄉㄨˊ",word:"閱讀",meaning:"看文字並理解意思。",example:"我每天閱讀十分鐘。",strokeHint:"左右結構要平衡,貝字收小。"},{id:"g3-xiang",grade:3,character:"想",zhuyin:"ㄒㄧㄤˇ",word:"想法",meaning:"心裡思考。",example:"我說出自己的想法。",strokeHint:"相在上方,心在下方要穩。"},{id:"g3-qing",grade:3,character:"情",zhuyin:"ㄑㄧㄥˊ",word:"心情",meaning:"心裡的感覺。",example:"今天我的心情很好。",strokeHint:"豎心旁要窄,青字橫畫平均。"},{id:"g3-zhuang",grade:3,character:"莊",zhuyin:"ㄓㄨㄤ",word:"村莊",meaning:"人們聚居生活的村落,也可以用在地名或姓氏。",example:"河邊有一個安靜的村莊。",strokeHint:"草字頭要平穩,下方的壯要寫得端正。"},{id:"g4-cha",grade:4,character:"察",zhuyin:"ㄔㄚˊ",word:"觀察",meaning:"仔細看、仔細想。",example:"我們觀察植物生長。",strokeHint:"寶蓋頭舒展,下方筆畫不要擠。"},{id:"g4-guan",grade:4,character:"管",zhuyin:"ㄍㄨㄢˇ",word:"管理",meaning:"安排與照顧。",example:"我會管理自己的書包。",strokeHint:"竹字頭要輕,官字端正。"},{id:"g4-zhai",grade:4,character:"摘",zhuyin:"ㄓㄞ",word:"摘要",meaning:"取出內容中最重要的部分。",example:"我把文章重點整理成摘要。",strokeHint:"提手旁寫窄,右邊上下要對齊。"},{id:"g4-yao",grade:4,character:"要",zhuyin:"ㄧㄠˋ",word:"重要",meaning:"必須注意或很有價值。",example:"閱讀時要找出重要線索。",strokeHint:"上方扁而穩,女字底要托住上方。"},{id:"g4-zhang",grade:4,character:"章",zhuyin:"ㄓㄤ",word:"文章",meaning:"由句子和段落組成的文字內容。",example:"這篇文章介紹海洋。",strokeHint:"上方音字收緊,下方十字站直。"},{id:"g4-li",grade:4,character:"理",zhuyin:"ㄌㄧˇ",word:"理解",meaning:"知道內容在說什麼。",example:"我讀完後能理解主旨。",strokeHint:"王字旁窄,里字橫畫平均。"},{id:"g5-bian",grade:5,character:"辨",zhuyin:"ㄅㄧㄢˋ",word:"辨認",meaning:"分清楚不同的地方。",example:"我能辨認相似的字。",strokeHint:"左中右要平均,不要寫太寬。"},{id:"g5-lun",grade:5,character:"論",zhuyin:"ㄌㄨㄣˋ",word:"討論",meaning:"交換想法。",example:"我們一起討論答案。",strokeHint:"言字旁偏窄,右邊層次清楚。"},{id:"g5-ce",grade:5,character:"策",zhuyin:"ㄘㄜˋ",word:"策略",meaning:"為了完成目標所安排的方法。",example:"找關鍵字是一種閱讀策略。",strokeHint:"竹字頭要輕,下方筆畫保持中央。"},{id:"g5-ju",grade:5,character:"據",zhuyin:"ㄐㄩˋ",word:"證據",meaning:"能支持說法的資料或事實。",example:"請從文章找出證據。",strokeHint:"提手旁窄,右邊層次清楚。"},{id:"g5-bi",grade:5,character:"比",zhuyin:"ㄅㄧˇ",word:"比較",meaning:"找出兩件事相同或不同的地方。",example:"我們比較兩篇文章的觀點。",strokeHint:"左右兩部分靠近,豎彎鉤要穩。"},{id:"g5-xi",grade:5,character:"析",zhuyin:"ㄒㄧ",word:"分析",meaning:"把內容拆開來仔細理解。",example:"分析圖表後再回答問題。",strokeHint:"木字旁窄,斤字撇畫舒展。"},{id:"g6-bian",grade:6,character:"辯",zhuyin:"ㄅㄧㄢˋ",word:"辯論",meaning:"用理由說明自己的想法。",example:"辯論時要尊重別人。",strokeHint:"左中右結構要緊湊。"},{id:"g6-zheng",grade:6,character:"證",zhuyin:"ㄓㄥˋ",word:"證明",meaning:"用理由或資料說明是真的。",example:"請用例子證明你的想法。",strokeHint:"左窄右寬,登字要站穩。"},{id:"g6-tong",grade:6,character:"統",zhuyin:"ㄊㄨㄥˇ",word:"統整",meaning:"把分散的內容整理成完整架構。",example:"考前要統整學過的重點。",strokeHint:"糸字旁窄,右邊上緊下穩。"},{id:"g6-tui",grade:6,character:"推",zhuyin:"ㄊㄨㄟ",word:"推論",meaning:"根據線索想出合理的結果。",example:"我從人物行動推論他的心情。",strokeHint:"提手旁窄,隹字四橫要平均。"},{id:"g6-guan",grade:6,character:"觀",zhuyin:"ㄍㄨㄢ",word:"觀點",meaning:"一個人看事情的想法和立場。",example:"文章提出兩種不同觀點。",strokeHint:"左邊筆畫多要收緊,見字底穩。"},{id:"g6-jie",grade:6,character:"接",zhuyin:"ㄐㄧㄝ",word:"銜接",meaning:"把前後內容連起來。",example:"這個單元幫助我們銜接國中。",strokeHint:"提手旁窄,右邊妾字上下對正。"}];e.s(["chineseHandwritingWords",0,i,"getChineseHandwritingWordsByGrade",0,function(e){return i.filter(i=>i.grade===e)}])},4914,e=>{"use strict";let i=[{id:"grade-1-concrete-words",grades:[1],src:"/images/chinese/grade-1-picture-learning.webp",alt:"小學生在明亮教室裡指著樹木圖卡朗讀,桌上有故事書、水杯和書包",caption:"先找找看:圖裡有哪些人、物品和動作?再把看到的內容說成一句話。",observationPrompts:["孩子用哪一隻手指圖卡?","窗外是白天還是晚上?","桌上有哪些學習用品?"]},{id:"grade-2-home-reading",grades:[2],src:"/images/chinese/grade-2-picture-learning.webp",alt:"兩位小學生和家人在溫暖的家中一起看故事書,桌上有花和筆記本",caption:"看看人物正在做什麼,再找出「家、友、書、花、看、學」的生活線索。",observationPrompts:["誰正在拿書?","朋友用手指出了什麼?","家人怎麼陪伴孩子閱讀?"]},{id:"grade-3-4-reading",grades:[3,4],src:"/images/chinese/grade-3-4-reading.webp",alt:"兩位小學生觀察葉片、閱讀植物文章、排列生長圖片並整理筆記",caption:"從圖中的觀察、閱讀與排列動作,找出故事順序和文章重點。",observationPrompts:["放大鏡正在觀察什麼?","三張圖片的先後順序是什麼?","筆記可以寫下哪一句重點?"]},{id:"grade-5-6-evidence-reading",grades:[5,6],src:"/images/chinese/grade-5-6-reading.webp",alt:"三位高年級學生在圖書館比較文章、找證據、整理重點並討論觀點",caption:"先看資料,再說理由:哪些內容是線索、哪些內容能支持結論?",observationPrompts:["學生正在比較哪兩份資料?","便利貼可能記錄了哪些證據?","說明觀點時,為什麼要先聽完別人的理由?"]}];e.s(["getChineseIllustrationForGrade",0,function(e){return i.find(i=>i.grades.includes(e))??i[0]}])},16549,e=>{"use strict";var i=e.i(51668),t=e.i(4914);let a={"g1-ren":{radical:"人",strokes:2,picture:"兩個人一起走",pictureDescription:"兩個人互相陪伴,一起往前走。"},"g1-shang":{radical:"一",strokes:3,picture:"箭頭往上",pictureDescription:"箭頭指向高處,表示上方。"},"g1-da":{radical:"大",strokes:3,picture:"一大一小兩個圓",pictureDescription:"比較兩個圓,較大的就是「大」。"},"g1-xiao":{radical:"小",strokes:3,picture:"一小一大兩個圓",pictureDescription:"比較兩個圓,較小的就是「小」。"},"g1-ri":{radical:"日",strokes:4,picture:"太陽",pictureDescription:"白天看見太陽,也可以想到一天的日子。"},"g1-yue":{radical:"月",strokes:4,picture:"月亮",pictureDescription:"夜晚天空中的月亮。"},"g1-shui":{radical:"水",strokes:4,picture:"水滴",pictureDescription:"可以喝、可以洗東西的水。"},"g1-mu":{radical:"木",strokes:4,picture:"樹木",pictureDescription:"樹幹和樹枝讓人想到木頭。"},"g1-shou":{radical:"手",strokes:4,picture:"一隻手",pictureDescription:"可以拿東西、寫字和打招呼的手。"},"g1-kou":{radical:"口",strokes:3,picture:"張開的嘴巴",pictureDescription:"用嘴巴吃東西,也用口說話。"},"g2-xue":{radical:"子",strokes:16,picture:"課本和鉛筆",pictureDescription:"打開課本、拿起鉛筆,就是在學習。"},"g2-jia":{radical:"宀",strokes:10,picture:"一間房子",pictureDescription:"家人一起生活的溫暖房子。"},"g2-you":{radical:"又",strokes:4,picture:"兩隻手握在一起",pictureDescription:"朋友互相幫忙、一起分享。"},"g2-shu":{radical:"曰",strokes:10,picture:"打開的書",pictureDescription:"翻開書本,可以讀到文字和故事。"},"g2-hua":{radical:"艸",strokes:7,picture:"一朵花",pictureDescription:"植物開出的花朵。"},"g2-kan":{radical:"目",strokes:9,picture:"一雙眼睛",pictureDescription:"用眼睛仔細觀察,就是看。"},"g3-yu":{radical:"言",strokes:14,picture:"對話框",pictureDescription:"用說話和文字表達語言。"},"g3-du":{radical:"言",strokes:22,picture:"正在閱讀的書",pictureDescription:"看著文字並理解內容,就是讀。"},"g3-xiang":{radical:"心",strokes:13,picture:"想法泡泡",pictureDescription:"安靜思考,心裡出現一個想法。"},"g3-qing":{radical:"心",strokes:11,picture:"一顆心",pictureDescription:"開心、難過都是心裡的感情。"},"g3-zhuang":{radical:"艸",strokes:11,picture:"屋舍與田野",pictureDescription:"幾間屋舍聚在田野旁,形成大家生活的村莊。"},"g4-cha":{radical:"宀",strokes:14,picture:"放大鏡看葉子",pictureDescription:"拿放大鏡仔細看葉脈,找出細節。"},"g4-guan":{radical:"竹",strokes:14,picture:"整理好的書包",pictureDescription:"把物品分類放好,表示有條理地管理。"},"g4-zhai":{radical:"手",strokes:14,picture:"文章圈出重點",pictureDescription:"從一段文字中圈出最重要的內容。"},"g4-yao":{radical:"襾",strokes:9,picture:"星號標記重點",pictureDescription:"用星號標出需要特別注意的內容。"},"g4-zhang":{radical:"立",strokes:11,picture:"三段文字",pictureDescription:"幾個段落依順序組成一篇文章。"},"g4-li":{radical:"玉",strokes:11,picture:"想法連成線",pictureDescription:"把線索連起來,就能理解內容。"},"g5-bian":{radical:"辛",strokes:16,picture:"找不同",pictureDescription:"仔細找出兩個相似內容不同的地方。"},"g5-lun":{radical:"言",strokes:15,picture:"多人交換想法",pictureDescription:"大家輪流說明理由並聽別人的想法。"},"g5-ce":{radical:"竹",strokes:12,picture:"步驟清單",pictureDescription:"先安排步驟,再依方法完成目標。"},"g5-ju":{radical:"手",strokes:16,picture:"資料支持答案",pictureDescription:"用文章線索或資料支持自己的答案。"},"g5-bi":{radical:"比",strokes:4,picture:"兩欄比較表",pictureDescription:"把兩件事放在一起,找相同與不同。"},"g5-xi":{radical:"木",strokes:8,picture:"內容拆成小塊",pictureDescription:"把複雜內容分成幾個部分逐一理解。"},"g6-bian":{radical:"辛",strokes:21,picture:"兩方提出理由",pictureDescription:"兩方用理由和證據說明不同立場。"},"g6-zheng":{radical:"言",strokes:19,picture:"證據指向結論",pictureDescription:"資料和例子共同支持一個結論。"},"g6-tong":{radical:"糸",strokes:12,picture:"重點整理圖",pictureDescription:"把不同單元的重點整理到同一張圖。"},"g6-tui":{radical:"手",strokes:11,picture:"線索指向答案",pictureDescription:"從已知線索一步步想出合理結果。"},"g6-guan":{radical:"見",strokes:24,picture:"不同角度看同一件事",pictureDescription:"站在不同位置,可能會有不同看法。"},"g6-jie":{radical:"手",strokes:11,picture:"兩段道路連接",pictureDescription:"把前一段學習和下一階段順利連起來。"}},r={注音符號:"口",聲調練習:"口",基礎生字:"人",常見詞語:"手",朗讀練習:"日",生字與部首:"學",造詞與語意:"友",短文閱讀:"書",常用國字與部首:"語",詞語理解:"想",段落理解:"讀",成語與詞義:"理",段落結構:"章",摘要練習:"摘",因果推論:"理",說明文閱讀:"察",字詞辨析:"辨",複句關係:"析",閱讀策略:"策",主旨與摘要:"析",觀點與事實:"據",文本比較:"比",成語與語境:"觀",文本結構:"統",閱讀推論:"推",跨文本閱讀:"接",論點與證據:"證",演說與辯論:"辯",國中銜接閱讀:"接"},n={"g2-xue":{aliases:["学"],variantNote:"「学」是中國大陸常見簡化字,臺灣課程使用「學」。"},"g2-shu":{aliases:["书"],variantNote:"「书」是中國大陸常見簡化字,臺灣課程使用「書」。"},"g3-yu":{aliases:["语"],variantNote:"「语」是中國大陸常見簡化字,臺灣課程使用「語」。"},"g3-du":{aliases:["读"],variantNote:"���读」是中國大陸常見簡化字,臺灣課程使用「讀」。"},"g3-zhuang":{aliases:["庄"],variantNote:"「庄」可作「莊」的異體字;臺灣國小一般書寫正字「莊」。"},"g6-zheng":{aliases:["证"],variantNote:"「证」是中國大陸常見簡化字,臺灣課程使用「證」。"},"g6-tong":{aliases:["统"],variantNote:"「统」是中國大陸常見簡化字,臺灣課程使用「統」。"},"g6-guan":{aliases:["观"],variantNote:"「观」是中國大陸常見簡化字,臺灣課程使用「觀」。"}},s=i.chineseHandwritingWords.filter(e=>a[e.id]).map(e=>({...e,...a[e.id],...n[e.id]}));function d(e){return Array.from(e).reduce((e,i)=>e+i.charCodeAt(0),0)}function c(e){let i=s.filter(i=>i.grade===e);return i.length>=4?i:s.filter(i=>i.grade<=e).slice(-10)}e.s(["chineseDictionary",0,s,"findChineseDictionaryEntry",0,function(e){let i=e.normalize("NFKC").trim().replace(/[,。!?、;:,.!?;:\s]/g,"");if(!i)return;let t=s.find(e=>e.character===i);if(t)return{entry:t};for(let e of s){let t=e.aliases?.find(e=>e===i);if(t)return{entry:e,matchedAlias:t}}let a=s.find(e=>e.word===i);if(a)return{entry:a}},"getChineseDictionaryEntries",0,c,"getChineseDictionaryQuestion",0,function(e,i){let a=c(e),n=Object.entries(r).find(([e])=>i.includes(e))?.[1],l=a.find(e=>e.character===n),o=a.length?d(i)%a.length:0,g=l??a[o]??s[0],h=a.filter(e=>e.id!==g.id).slice(0,3),m=[g,...h].sort((e,t)=>d(`${i}:${e.id}`)-d(`${i}:${t.id}`)).map(e=>e.character);return{entry:g,options:m,illustration:(0,t.getChineseIllustrationForGrade)(e)}}])},79693,e=>{"use strict";let i=[{id:"g1-one-heart",grade:1,idiom:"一心一意",zhuyin:"ㄧ ㄒㄧㄣ ㄧ ㄧˋ",kidMeaning:"把心思專心放在同一件事上。",example:"我一心一意把這一頁讀完。",whenToUse:"形容很專心、不分心。",storyHint:"孩子坐好,只專心讀眼前的一本書。"},{id:"g1-seven-eight",grade:1,idiom:"七上八下",zhuyin:"ㄑㄧ ㄕㄤˋ ㄅㄚ ㄒㄧㄚˋ",kidMeaning:"心裡很緊張,安定不下來。",example:"上臺前,我的心情七上八下。",whenToUse:"形容擔心或緊張的心情。",storyHint:"第一次上臺的孩子握著講稿,心跳得很快。"},{id:"g1-dance",grade:1,idiom:"手舞足蹈",zhuyin:"ㄕㄡˇ ㄨˇ ㄗㄨˊ ㄉㄠˋ",kidMeaning:"高興得手腳都動了起來。",example:"聽到校外教學的消息,大家高興得手舞足蹈。",whenToUse:"形容非常高興。",storyHint:"孩子聽到好消息,開心地揮手跳舞。"},{id:"g1-orderly",grade:1,idiom:"井然有序",zhuyin:"ㄐㄧㄥˇ ㄖㄢˊ ㄧㄡˇ ㄒㄩˋ",kidMeaning:"東西或事情排得整整齊齊,很有順序。",example:"書架上的書放得井然有序。",whenToUse:"形容整齊而有條理。",storyHint:"不同顏色的書一本一本排在書架上。"},{id:"g1-help",grade:1,idiom:"守望相助",zhuyin:"ㄕㄡˇ ㄨㄤˋ ㄒㄧㄤ ㄓㄨˋ",kidMeaning:"大家互相照顧、互相幫忙。",example:"鄰居守望相助,讓社區更安全。",whenToUse:"形容彼此關心和幫助。",storyHint:"下雨時,鄰居一起幫忙收好院子裡的物品。"},{id:"g2-teamwork",grade:2,idiom:"同心協力",zhuyin:"ㄊㄨㄥˊ ㄒㄧㄣ ㄒㄧㄝˊ ㄌㄧˋ",kidMeaning:"大家有同一個目標,一起努力。",example:"我們同心協力完成班級海報。",whenToUse:"形容團隊一起合作。",storyHint:"同學分工畫圖、寫字,再把海報完成。"},{id:"g2-focus",grade:2,idiom:"專心致志",zhuyin:"ㄓㄨㄢ ㄒㄧㄣ ㄓˋ ㄓˋ",kidMeaning:"把全部心思放在正在做的事情上。",example:"她專心致志地練習寫字。",whenToUse:"形容做事非常專心。",storyHint:"孩子安靜地看著字帖,一筆一畫寫字。"},{id:"g2-cannot-wait",grade:2,idiom:"迫不及待",zhuyin:"ㄆㄛˋ ㄅㄨˋ ㄐㄧˊ ㄉㄞˋ",kidMeaning:"急得不能再等,想立刻去做。",example:"我迫不及待想打開生日禮物。",whenToUse:"形容非常期待、急著行動。",storyHint:"孩子抱著禮物,眼睛發亮地等著拆開。"},{id:"g2-self-talk",grade:2,idiom:"自言自語",zhuyin:"ㄗˋ ㄧㄢˊ ㄗˋ ㄩˇ",kidMeaning:"自己對自己說話。",example:"弟弟一邊找鉛筆,一邊自言自語。",whenToUse:"形容身旁沒有人,卻自己說話。",storyHint:"孩子在書桌旁找東西,小聲說著話。"},{id:"g2-kind-face",grade:2,idiom:"和顏悅色",zhuyin:"ㄏㄜˊ ㄧㄢˊ ㄩㄝˋ ㄙㄜˋ",kidMeaning:"臉色溫和,態度親切。",example:"老師和顏悅色地聽我說完。",whenToUse:"形容待人溫柔、親切。",storyHint:"老師微笑著蹲下來,耐心聽孩子說話。"},{id:"g3-snake",grade:3,idiom:"畫蛇添足",zhuyin:"ㄏㄨㄚˋ ㄕㄜˊ ㄊㄧㄢ ㄗㄨˊ",kidMeaning:"事情已經完成,卻多做了不需要的部分,反而把事情弄壞。",example:"海報已經很清楚,再加太多裝飾反而畫蛇添足。",whenToUse:"提醒別人不要做多餘的事。",storyHint:"一條蛇已經畫好,卻又被加上不需要的腳。"},{id:"g3-rabbit",grade:3,idiom:"守株待兔",zhuyin:"ㄕㄡˇ ㄓㄨ ㄉㄞˋ ㄊㄨˋ",kidMeaning:"只想靠運氣得到成果,不肯主動努力。",example:"想考好卻不複習,就像守株待兔。",whenToUse:"提醒人不能只靠運氣。",storyHint:"農夫一直坐在樹樁旁等兔子,卻沒有耕田。"},{id:"g3-sheep",grade:3,idiom:"亡羊補牢",zhuyin:"ㄨㄤˊ ㄧㄤˊ ㄅㄨˇ ㄌㄠˊ",kidMeaning:"出了問題後趕快改正,還來得及避免更大的損失。",example:"這次忘了帶作業,現在整理書包也算亡羊補牢。",whenToUse:"鼓勵犯錯後立刻補救。",storyHint:"羊跑走後,主人趕快把破掉的圍欄修好。"},{id:"g3-frog",grade:3,idiom:"井底之蛙",zhuyin:"ㄐㄧㄥˇ ㄉㄧˇ ㄓ ㄨㄚ",kidMeaning:"看見的範圍太小,卻以為自己知道全部。",example:"多閱讀、多旅行,才不會成為井底之蛙。",whenToUse:"提醒自己要開闊眼界。",storyHint:"青蛙從井底往上看,只看見一小片天空。"},{id:"g3-halfway",grade:3,idiom:"半途而廢",zhuyin:"ㄅㄢˋ ㄊㄨˊ ㄦˊ ㄈㄟˋ",kidMeaning:"事情做到一半就停下來,不再繼續。",example:"練習樂器需要耐心,不要半途而廢。",whenToUse:"鼓勵人把事情做完。",storyHint:"孩子走到半路就停下,還沒有到達終點。"},{id:"g4-clear",grade:4,idiom:"一目了然",zhuyin:"ㄧ ㄇㄨˋ ㄌㄧㄠˇ ㄖㄢˊ",kidMeaning:"一看就完全明白。",example:"這張表格整理得很清楚,內容一目了然。",whenToUse:"形容內容清楚容易懂。",storyHint:"整齊的圖表把三個步驟清楚排出來。"},{id:"g4-step",grade:4,idiom:"循序漸進",zhuyin:"ㄒㄩㄣˊ ㄒㄩˋ ㄐㄧㄢˋ ㄐㄧㄣˋ",kidMeaning:"按照順序,一步一步慢慢前進。",example:"學習分數要循序漸進,先懂圖再學算式。",whenToUse:"形容依照步驟學習或做事。",storyHint:"孩子沿著階梯,一階一階往上走。"},{id:"g4-attention",grade:4,idiom:"全神貫注",zhuyin:"ㄑㄩㄢˊ ㄕㄣˊ ㄍㄨㄢˋ ㄓㄨˋ",kidMeaning:"把全部注意力集中在一件事上。",example:"實驗開始後,大家全神貫注地觀察。",whenToUse:"形容注意力非常集中。",storyHint:"孩子用放大鏡仔細觀察葉片。"},{id:"g4-suddenly-clear",grade:4,idiom:"豁然開朗",zhuyin:"ㄏㄨㄛˋ ㄖㄢˊ ㄎㄞ ㄌㄤˇ",kidMeaning:"原本不明白,後來突然想通了。",example:"聽完老師的例子,我立刻豁然開朗。",whenToUse:"形容突然明白道理。",storyHint:"孩子把兩條線索連起來,終於找到答案。"},{id:"g4-same-answer",grade:4,idiom:"異口同聲",zhuyin:"ㄧˋ ㄎㄡˇ ㄊㄨㄥˊ ㄕㄥ",kidMeaning:"不同的人同時說出一樣的話。",example:"老師問誰願意參加,大家異口同聲地說願意。",whenToUse:"形容許多人同時說同樣的話。",storyHint:"全班同學一起舉手並說出相同答案。"},{id:"g5-facts",grade:5,idiom:"實事求是",zhuyin:"ㄕˊ ㄕˋ ㄑㄧㄡˊ ㄕˋ",kidMeaning:"按照真實情況判斷,不誇大也不亂猜。",example:"做自然紀錄要實事求是,看到什麼就寫什麼。",whenToUse:"提醒人尊重事實。",storyHint:"學生把觀察到的數據如實寫進紀錄表。"},{id:"g5-small-clue",grade:5,idiom:"見微知著",zhuyin:"ㄐㄧㄢˋ ㄨㄟˊ ㄓ ㄓㄨˋ",kidMeaning:"從很小的線索,看出事情可能的發展。",example:"從葉子變黃,可以見微知著地發現植物缺水。",whenToUse:"形容善於從小線索看出大問題。",storyHint:"學生從一片變黃的葉子找出植物缺水的原因。"},{id:"g5-infer",grade:5,idiom:"舉一反三",zhuyin:"ㄐㄩˇ ㄧ ㄈㄢˇ ㄙㄢ",kidMeaning:"懂了一個例子,就能推想出其他相似情況。",example:"學會一種解題方法後,我能舉一反三。",whenToUse:"形容學習後能靈活運用。",storyHint:"學生從一個算式推想到三個相似題目。"},{id:"g5-ideas",grade:5,idiom:"集思廣益",zhuyin:"ㄐㄧˊ ㄙ ㄍㄨㄤˇ ㄧˋ",kidMeaning:"集合大家的想法,讓事情做得更好。",example:"我們集思廣益,想出減少垃圾的方法。",whenToUse:"形容一起討論、採用好意見。",storyHint:"小組成員把不同想法寫在便利貼上。"},{id:"g5-success",grade:5,idiom:"水到渠成",zhuyin:"ㄕㄨㄟˇ ㄉㄠˋ ㄑㄩˊ ㄔㄥˊ",kidMeaning:"條件準備好了,事情自然就會成功。",example:"每天固定閱讀,寫作進步就是水到渠成。",whenToUse:"形容累積足夠後自然成功。",storyHint:"水流到合適的位置,自然形成一條水道。"},{id:"g6-organized",grade:6,idiom:"有條不紊",zhuyin:"ㄧㄡˇ ㄊㄧㄠˊ ㄅㄨˋ ㄨㄣˇ",kidMeaning:"事情很多,仍然安排得有順序、不混亂。",example:"她有條不紊地完成報告的每個步驟。",whenToUse:"形容做事有條理。",storyHint:"學生照清單依序完成蒐集、整理和報告。"},{id:"g6-think",grade:6,idiom:"深思熟慮",zhuyin:"ㄕㄣ ㄙ ㄕㄨˊ ㄌㄩˋ",kidMeaning:"仔細、深入地想過各種情況。",example:"經過深思熟慮後,我選擇最有證據的答案。",whenToUse:"形容想得仔細周全。",storyHint:"學生比較多份資料後才寫下結論。"},{id:"g6-connect",grade:6,idiom:"觸類旁通",zhuyin:"ㄔㄨˋ ㄌㄟˋ ㄆㄤˊ ㄊㄨㄥ",kidMeaning:"懂得一種道理後,也能理解相近的事物。",example:"掌握文章結構後,閱讀其他說明文也能觸類旁通。",whenToUse:"形容能把學到的方法靈活運用。",storyHint:"同一種閱讀方法被用在不同主題的文章上。"},{id:"g6-persist",grade:6,idiom:"持之以恆",zhuyin:"ㄔˊ ㄓ ㄧˇ ㄏㄥˊ",kidMeaning:"長久堅持做一件事,不輕易停下來。",example:"每天讀十分鐘,持之以恆就會看見進步。",whenToUse:"鼓勵長期堅持。",storyHint:"日曆上每天都有完成閱讀的記號。"},{id:"g6-integrate",grade:6,idiom:"融會貫通",zhuyin:"ㄖㄨㄥˊ ㄏㄨㄟˋ ㄍㄨㄢˋ ㄊㄨㄥ",kidMeaning:"把不同地方學到的知識連起來,真正理解並會運用。",example:"把課文、圖表和生活經驗融會貫通,答案會更完整。",whenToUse:"形容能整合並靈活運用知識。",storyHint:"學生把文章、圖表和筆記連成一張完整的學習圖。"}];e.s(["chineseIdioms",0,i,"chineseIdiomsSource",0,{name:"教育部《成語典》",url:"https://dict.idioms.moe.edu.tw/"},"findChineseIdiom",0,function(e){let t=e.normalize("NFKC").trim().replace(/[,。!?、;:,.!?;:\s]/g,"");return i.find(e=>e.idiom===t)},"getChineseIdiomsByGrade",0,function(e){return i.filter(i=>i.grade===e)}])},18397,e=>{"use strict";let i;var t=e.i(43476),a=e.i(14876),r=e.i(71645);let n=/^(.+?)([˙]?[ㄅ-ㄩ]+[ˊˇˋ]?|[ㄅ-ㄩ]+[˙ˊˇˋ]?)$/u;function s({entry:e}){return(0,t.jsxs)("article",{className:"rounded-2xl border border-blue-100 bg-blue-50/70 p-4",children:[(0,t.jsx)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-xs font-black text-blue-700",children:"教育部原始資料"}),(0,t.jsxs)("p",{className:"mt-1 text-lg font-black text-ink",children:[e.zhuyin,"|",e.radical,"部|共 ",e.totalStrokes," 畫"]})]})}),(0,t.jsx)("p",{className:"mt-3 whitespace-pre-wrap text-base font-bold leading-9 text-stone-700",children:e.definition.split("&&").map((e,i)=>{if(i%2==0)return(0,t.jsx)("span",{children:e},`${i}-${e}`);let a=e.match(n);return a?(0,t.jsxs)("ruby",{className:"mx-0.5 whitespace-nowrap",children:[a[1],(0,t.jsx)("rp",{children:"("}),(0,t.jsx)("rt",{className:"text-[0.58em] font-bold text-blue-700",children:a[2]}),(0,t.jsx)("rp",{children:")"})]},`${i}-${e}`):(0,t.jsx)("span",{children:e},`${i}-${e}`)})})]})}var d=e.i(32324),c=e.i(16549),l=e.i(79693),o=e.i(4914);let g=[{gradeId:"grade-1",stage:"第一學習階段",title:"注音、字形與生活短句",description:"先把聲音和字形連起來,再從熟悉的生活詞語開始閱讀。",focus:["注音與聲調","常用國字","生活詞語","短句朗讀"],lessonFlow:["先聽字音","看圖認字","放進詞語","讀一小句","描寫國字"],readingSupport:"每個國字保留注音;手寫板提供淡色描字虛底。"},{gradeId:"grade-2",stage:"第一學習階段",title:"部首、詞義與完整句子",description:"從部首找線索,把生字放進詞語和完整句子裡理解。",focus:["生字與部首","造詞與語意","標點符號","短文閱讀"],lessonFlow:["聽清字音","找部首","理解詞義","讀懂句子","描寫與造句"],readingSupport:"保留全文注音提示;孩子可以先讀,再切換隱藏注音。"},{gradeId:"grade-3",stage:"第二學習階段",title:"字詞、段落與故事順序",description:"擴充常用字詞,開始找段落重點、人物與事情順序。",focus:["部首識字","詞語理解","段落重點","故事順序"],lessonFlow:["字詞暖身","讀一小段","圈出線索","說出重點","短句寫作"],readingSupport:"注音預設顯示,遇到熟悉內容時可自行隱藏。"},{gradeId:"grade-4",stage:"第二學習階段",title:"段落結構、摘要與因果",description:"看懂文章怎麼組成,練習找重點、因果與說明線索。",focus:["成語與詞義","段落結構","摘要練習","因果推論"],lessonFlow:["預測內容","找關鍵詞","整理段落","說一句摘要","生活表達"],readingSupport:"生難字仍可點開注音與小學生版字義。"},{gradeId:"grade-5",stage:"第三學習階段",title:"閱讀策略、觀點與比較",description:"辨析字詞與複句,分清事實、觀點和支持內容的證據。",focus:["字詞辨析","閱讀策略","觀點與事實","文本比較"],lessonFlow:["確認詞義","標記線索","比較內容","說明理由","整理成文"],readingSupport:"注音改為按需查看,避免生難字中斷理解。"},{gradeId:"grade-6",stage:"第三學習階段",title:"推論、證據與完整表達",description:"整合跨文本線索,用理由與證據形成自己的觀點。",focus:["閱讀推論","跨文本閱讀","論點與證據","完整作文"],lessonFlow:["理解語境","找出證據","形成推論","口頭表達","完成短文"],readingSupport:"保留可開關的注音支援,同時練習自主查字典。"}],h=new Map;function m(e){return e.normalize("NFKC").trim().replace(/[,。!?、;:,.!?;:\s]/g,"")}function u(e){return/^[\u3400-\u9fff]$/u.test(m(e))}async function p(e){if(!e)return[];let i=h.get(e);if(i)return i;let t=fetch(`/data/moe-mini/${e}.json`,{cache:"force-cache"}).then(async i=>{if(!i.ok)throw Error(`MOE dictionary shard ${e} returned ${i.status}`);return i.json()}).catch(i=>{throw h.delete(e),i});return h.set(e,t),t}async function x(e){let i,t=m(e);return u(t)?(await p(void 0===(i=t.codePointAt(0))?"":i.toString(16).padStart(4,"0").slice(0,2))).filter(e=>e.word===t):[]}async function b(e){return Promise.all((function(e,i=8){return Array.from(new Set(Array.from(m(e)).filter(e=>/[\u3400-\u9fff]/u.test(e)))).slice(0,i)})(e).map(async e=>({character:e,entries:await x(e)})))}var k=e.i(12408);let f=[{id:"basic",label:"基礎",note:"字音、字形與基本理解"},{id:"advanced",label:"進階",note:"句段閱讀與思考"},{id:"extension",label:"延伸",note:"表達、寫作與應用"}];e.s(["ChineseLearningHub",0,function({gradeId:e,gradeName:n}){let h=(0,r.useMemo)(()=>g.find(i=>i.gradeId===e)??g[0],[e]),p=Number(e.replace("grade-","")),y=(0,r.useMemo)(()=>(0,c.getChineseDictionaryEntries)(p),[p]),w=y[0],j=(0,r.useMemo)(()=>(0,o.getChineseIllustrationForGrade)(p),[p]),N=(0,r.useMemo)(()=>(0,l.getChineseIdiomsByGrade)(p),[p]),[z,v]=(0,r.useState)(""),[H,D]=(0,r.useState)(""),[M,T]=(0,r.useState)(""),[$,U]=(0,r.useState)([]),[S,C]=(0,r.useState)(),[I,F]=(0,r.useState)(!1),[E,A]=(0,r.useState)(!1),[P,B]=(0,r.useState)("輸入一個國字,或點選本年級詞語與成語。晨光只顯示精確結果,不猜字義。"),G=c.chineseDictionary.find(e=>e.id===H)??(I?void 0:w),K=l.chineseIdioms.find(e=>e.id===M);async function O(e){let i=m(e);if(F(!0),U([]),D(""),T(""),!i||!/[\u3400-\u9fff]/u.test(i))return void B("請輸入一個國字,例如「學」;也可以直接點下方的本年級詞語或成語。");let t=(0,l.findChineseIdiom)(i);if(t){T(t.id),B(`已找到成語「${t.idiom}」。下方是晨光白話解釋、使用時機和例句。`);return}let a=(0,c.findChineseDictionaryEntry)(i);a&&D(a.entry.id);let r=u(i)?i:a?.entry.character??i;A(!0);try{let e=(u(r)?[{character:r,entries:await x(r)}]:await b(r)).filter(e=>e.entries.length>0);U(e);let t=e.reduce((e,i)=>e+i.entries.length,0);0!==t||a?a?.matchedAlias?B(`已辨識「${a.matchedAlias}」;臺灣國小課程常用正字是「${a.entry.character}」。教育部原始資料也已載入。`):a?B(`已精確找到「${a.entry.character}」。先看晨光白話解釋,再核對教育部完整字義。`):e.length>1?B(`「${i}」目前沒有晨光整詞解釋;已依原順序查到 ${e.length} 個國字。下方是逐字結果,不會把字義假裝成詞義。`):B(`已從教育部《國語小字典》精確找到「${e[0]?.character??i}」,共有 ${t} 個讀音或義項。`):B(`教育部資料中沒有找到「${i}」的可核對國字。晨光不猜答案,請確認字形後再試一次。`)}catch{B(a?`已找到晨光課程詞條「${a.entry.character}」,但教育部資料暫時載入失敗,請稍後再試。`:"教育部字典資料暫時載入失敗,請確認網路後再試一次。")}finally{A(!1)}}function W(e){v(e),O(e)}return(0,r.useEffect)(()=>{let e=!0;return(i||(i=fetch("/data/moe-mini/manifest.json",{cache:"no-cache"}).then(async e=>{if(!e.ok)throw Error(`MOE dictionary manifest returned ${e.status}`);return e.json()}).catch(e=>{throw i=void 0,e}))).then(i=>{e&&C(i)}).catch(()=>{e&&C(void 0)}),()=>{e=!1}},[]),(0,t.jsxs)("section",{className:"mt-8 overflow-hidden rounded-[1.75rem] border border-amber-100 bg-[linear-gradient(135deg,rgba(255,248,234,0.96),rgba(239,249,242,0.94))] p-5 shadow-sm md:p-7",children:[(0,t.jsxs)("div",{className:"grid gap-6 xl:grid-cols-[1.05fr_0.95fr]",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{className:"text-sm font-black text-amber-700",children:[h.stage,"|",n,"國語學習地圖"]}),(0,t.jsx)("h2",{className:"mt-2 text-3xl font-black text-ink",children:h.title}),(0,t.jsx)("p",{className:"mt-3 max-w-3xl text-lg font-bold leading-8 text-stone-600",children:h.description}),(0,t.jsx)("div",{className:"mt-5 flex flex-wrap gap-2","aria-label":"本年級國語學習重點",children:h.focus.map(e=>(0,t.jsx)("span",{className:"rounded-full bg-white/90 px-4 py-2 text-sm font-black text-stone-700 shadow-sm ring-1 ring-white",children:e},e))}),(0,t.jsxs)("figure",{className:"mt-6 overflow-hidden rounded-3xl border-4 border-white bg-white shadow-warm",children:[(0,t.jsx)("img",{src:j.src,alt:j.alt,className:"aspect-[4/3] w-full object-cover",loading:"lazy"}),(0,t.jsxs)("figcaption",{className:"p-4",children:[(0,t.jsx)("p",{className:"font-black leading-7 text-ink",children:j.caption}),(0,t.jsx)("ul",{className:"mt-3 grid gap-2 text-sm font-bold leading-6 text-stone-600 sm:grid-cols-3",children:j.observationPrompts.map(e=>(0,t.jsx)("li",{className:"rounded-xl bg-cream p-3",children:e},e))})]})]}),(0,t.jsx)("ol",{className:"mt-6 grid gap-3 sm:grid-cols-5","aria-label":"國語學習順序",children:h.lessonFlow.map((e,i)=>(0,t.jsxs)("li",{className:"rounded-2xl bg-white/85 p-4 shadow-sm",children:[(0,t.jsx)("span",{className:"grid h-8 w-8 place-items-center rounded-full bg-coral text-sm font-black text-white",children:i+1}),(0,t.jsx)("strong",{className:"mt-3 block text-base text-ink",children:e})]},e))})]}),(0,t.jsxs)("aside",{className:"self-start rounded-3xl border border-white bg-white/85 p-5 shadow-sm xl:sticky xl:top-6",children:[(0,t.jsx)("p",{className:"text-sm font-black text-green-800",children:"晨光站內兒童字典"}),(0,t.jsx)("h3",{className:"mt-1 text-2xl font-black text-ink",children:"查得到才顯示,不用相近字猜"}),(0,t.jsxs)("form",{className:"mt-5",onSubmit:function(e){e.preventDefault(),O(z)},children:[(0,t.jsx)("label",{htmlFor:"chenguang-dictionary-query",className:"text-sm font-black text-stone-600",children:"我要查的國字、課程詞語或成語"}),(0,t.jsxs)("div",{className:"mt-2 flex gap-2",children:[(0,t.jsx)("input",{id:"chenguang-dictionary-query",value:z,onChange:e=>v(e.target.value.slice(0,8)),inputMode:"text",className:"min-h-14 min-w-0 flex-1 rounded-2xl border-2 border-amber-100 bg-white px-4 text-center text-2xl font-black text-ink outline-none focus:border-coral focus:ring-4 focus:ring-coral/10",placeholder:"學","aria-describedby":"dictionary-message"}),(0,t.jsx)("button",{type:"submit",disabled:E,className:"min-h-14 shrink-0 rounded-2xl bg-coral px-5 font-black text-white shadow-sm transition active:scale-[0.98] disabled:cursor-wait disabled:opacity-70",children:E?"查詢中":"查字典"})]})]}),(0,t.jsxs)("div",{className:"mt-3 flex flex-wrap gap-2","aria-label":"本年級查字建議",children:[y.slice(0,6).map(e=>(0,t.jsx)("button",{type:"button",onClick:()=>W(e.character),className:"min-h-10 rounded-xl bg-cream px-3 font-black text-amber-900 transition hover:bg-butter",children:e.character},e.id)),N.slice(0,2).map(e=>(0,t.jsx)("button",{type:"button",onClick:()=>W(e.idiom),className:"min-h-10 rounded-xl bg-green-50 px-3 font-black text-green-800 transition hover:bg-green-100",children:e.idiom},e.id))]}),(0,t.jsx)("p",{id:"dictionary-message","aria-live":"polite",className:"mt-3 rounded-xl bg-stone-50 p-3 text-sm font-bold leading-6 text-stone-600",children:P}),G?(0,t.jsxs)("article",{className:"mt-4 rounded-2xl border border-green-100 bg-green-50/80 p-4","aria-live":"polite",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,t.jsxs)("div",{className:"flex items-end gap-3",children:[(0,t.jsx)("strong",{className:"text-5xl font-black leading-none text-ink",children:G.character}),(0,t.jsx)("span",{className:"text-lg font-black text-blue-700",children:G.zhuyin})]}),(0,t.jsx)("button",{type:"button",onClick:()=>(0,k.speakMandarin)(`${G.character},${G.word}。${G.example}`,{rate:.7}),className:"min-h-11 shrink-0 rounded-xl bg-butter px-3 font-black text-amber-900 shadow-sm",children:"聽讀音"})]}),(0,t.jsxs)("dl",{className:"mt-4 grid gap-3 text-sm leading-6",children:[G.variantNote?(0,t.jsxs)("div",{className:"rounded-xl bg-amber-50 p-3",children:[(0,t.jsx)("dt",{className:"font-black text-amber-700",children:"字形提醒"}),(0,t.jsx)("dd",{className:"font-black text-amber-950",children:G.variantNote})]}):null,(0,t.jsxs)("div",{className:"rounded-xl bg-white/90 p-3",children:[(0,t.jsx)("dt",{className:"font-black text-stone-500",children:"部首與筆畫"}),(0,t.jsxs)("dd",{className:"font-black text-ink",children:[G.radical,"部,共 ",G.strokes," 畫"]})]}),(0,t.jsxs)("div",{className:"rounded-xl bg-white/90 p-3",children:[(0,t.jsx)("dt",{className:"font-black text-green-700",children:"晨光白話解釋"}),(0,t.jsxs)("dd",{className:"font-black text-ink",children:[(0,t.jsx)(d.ZhuyinText,{text:G.word,show:!0,compact:!1}),"|",G.meaning]})]}),(0,t.jsxs)("div",{className:"rounded-xl bg-blue-50 p-3",children:[(0,t.jsx)("dt",{className:"font-black text-blue-700",children:"生活例句"}),(0,t.jsx)("dd",{className:"font-black text-blue-950",children:(0,t.jsx)(d.ZhuyinText,{text:G.example,show:!0,compact:!1})})]}),(0,t.jsxs)("div",{className:"rounded-xl bg-[#fff8ea] p-3",children:[(0,t.jsx)("dt",{className:"font-black text-amber-700",children:"書寫提醒"}),(0,t.jsx)("dd",{className:"font-black text-amber-950",children:G.strokeHint})]})]})]}):null,K?(0,t.jsxs)("article",{className:"mt-4 rounded-2xl border border-amber-100 bg-[#fff8ea] p-4","aria-live":"polite",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-xs font-black text-amber-700",children:"本年級成語"}),(0,t.jsx)("h4",{className:"mt-1 text-3xl font-black text-ink",children:K.idiom}),(0,t.jsx)("p",{className:"mt-1 font-black text-blue-700",children:K.zhuyin})]}),(0,t.jsx)("button",{type:"button",onClick:()=>(0,k.speakMandarin)(`${K.idiom}。${K.example}`,{rate:.68}),className:"min-h-11 rounded-xl bg-butter px-3 font-black text-amber-900 shadow-sm",children:"聽成語"})]}),(0,t.jsxs)("div",{className:"mt-4 grid gap-3",children:[(0,t.jsxs)("div",{className:"rounded-xl bg-white p-3",children:[(0,t.jsx)("p",{className:"text-xs font-black text-green-700",children:"晨光白話���釋"}),(0,t.jsx)("p",{className:"mt-1 font-bold leading-7 text-stone-700",children:K.kidMeaning})]}),(0,t.jsxs)("div",{className:"rounded-xl bg-white p-3",children:[(0,t.jsx)("p",{className:"text-xs font-black text-blue-700",children:"什麼時候用"}),(0,t.jsx)("p",{className:"mt-1 font-bold leading-7 text-stone-700",children:K.whenToUse})]}),(0,t.jsxs)("div",{className:"rounded-xl bg-blue-50 p-3",children:[(0,t.jsx)("p",{className:"text-xs font-black text-blue-700",children:"例句"}),(0,t.jsx)("p",{className:"mt-1 font-black leading-7 text-blue-950",children:(0,t.jsx)(d.ZhuyinText,{text:K.example,show:!0,compact:!1})})]})]})]}):null,$.length>0?(0,t.jsxs)("section",{className:"mt-4 space-y-3","aria-label":"教育部國語小字典完整字義",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,t.jsx)("h4",{className:"text-lg font-black text-ink",children:"教育部完整字義"}),(0,t.jsx)("span",{className:"rounded-full bg-green-50 px-3 py-1 text-xs font-black text-green-800",children:"按需線上載入"})]}),$.map((e,i)=>(0,t.jsxs)("article",{className:"rounded-2xl border border-blue-100 bg-white/90 p-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("strong",{className:"text-3xl font-black text-ink",children:e.character}),(0,t.jsx)("span",{className:"text-xs font-black text-stone-500",children:"逐字核對"})]}),(0,t.jsx)("div",{className:"mt-2 space-y-2",children:e.entries.map((e,a)=>(0,t.jsxs)("details",{open:0===i&&0===a,className:"rounded-xl bg-blue-50/50 p-2",children:[(0,t.jsxs)("summary",{className:"cursor-pointer rounded-lg px-2 py-2 font-black text-blue-800",children:["讀音 ",e.zhuyin]}),(0,t.jsx)(s,{entry:e})]},`${e.word}-${e.zhuyin}-${a}`))})]},e.character))]}):null,(0,t.jsxs)("p",{className:"mt-4 rounded-2xl bg-white/80 p-4 text-xs font-bold leading-6 text-stone-600",children:["官方字義來源:","教育部《國語小字典》","(",S?.edition??"dict_mini_2019_20260626",",","CC BY-ND 3.0 臺灣",")。",S?` 共 ${S.entryCount.toLocaleString("zh-TW")} 筆,來源更新 ${S.updatedAt}。`:" 正在核對字庫版本。","教育部原文不改寫;「晨光白話解釋」是另行提供的學習提示。"]}),(0,t.jsxs)("p",{className:"mt-3 rounded-2xl bg-green-50 p-4 text-sm font-bold leading-6 text-green-900",children:[h.readingSupport," 所有查字內容都直接留在晨光頁面內。"]})]})]}),(0,t.jsxs)("section",{className:"mt-8","aria-labelledby":"grade-idioms-title",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:"成語放進生活裡"}),(0,t.jsxs)("h3",{id:"grade-idioms-title",className:"mt-1 text-2xl font-black text-ink",children:[n,"本階段成語"]})]}),(0,t.jsx)("p",{className:"text-sm font-bold text-stone-500",children:"點卡片即可在上方查看解釋與例句"})]}),(0,t.jsx)("div",{className:"mt-4 grid gap-3 sm:grid-cols-2 xl:grid-cols-5",children:N.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>W(e.idiom),className:"rounded-2xl border-2 border-white bg-white/90 p-4 text-left shadow-sm transition hover:-translate-y-0.5 hover:border-amber-200 hover:shadow-warm",children:[(0,t.jsx)("strong",{className:"block text-xl text-ink",children:e.idiom}),(0,t.jsx)("span",{className:"mt-2 block text-sm font-bold leading-6 text-stone-600",children:e.kidMeaning})]},e.id))}),(0,t.jsxs)("p",{className:"mt-3 text-xs font-bold text-stone-500",children:["成語名稱與讀音依據:",l.chineseIdiomsSource.name,";晨光另寫兒童版說明與生活例句。"]})]}),(0,t.jsx)("div",{className:"mt-6 grid gap-3 md:grid-cols-3",children:f.map(i=>(0,t.jsxs)(a.ExportSafeLink,{href:`/courses/${e}/chinese/${i.id}`,className:"group rounded-2xl border border-white bg-white/85 p-5 shadow-sm transition hover:-translate-y-0.5 hover:border-amber-200 hover:shadow-warm",children:[(0,t.jsxs)("span",{className:"text-sm font-black text-amber-700",children:[i.label,"課程"]}),(0,t.jsx)("strong",{className:"mt-1 block text-xl text-ink",children:i.note}),(0,t.jsxs)("span",{className:"mt-3 block text-sm font-black text-coral",children:["進入",i.label]})]},i.id))})]})}],18397)}]);
_next/static/chunks/1fzmt6k-wgjqc.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95057,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={formatUrl:function(){return i},formatWithValidation:function(){return c},urlObjectKeys:function(){return o}};for(var a in r)Object.defineProperty(n,a,{enumerable:!0,get:r[a]});let l=e.r(90809)._(e.r(98183)),s=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:n}=e,r=e.protocol||"",a=e.pathname||"",i=e.hash||"",o=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:n&&(c=t+(~n.indexOf(":")?`[${n}]`:n),e.port&&(c+=":"+e.port)),o&&"object"==typeof o&&(o=String(l.urlQueryToSearchParams(o)));let d=e.search||o&&`?${o}`||"";return r&&!r.endsWith(":")&&(r+=":"),e.slashes||(!r||s.test(r))&&!1!==c?(c="//"+(c||""),a&&"/"!==a[0]&&(a="/"+a)):c||(c=""),i&&"#"!==i[0]&&(i="#"+i),d&&"?"!==d[0]&&(d="?"+d),a=a.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${r}${c}${a}${d}${i}`}let o=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return i(e)}},18581,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"useMergedRef",{enumerable:!0,get:function(){return a}});let r=e.r(71645);function a(e,t){let n=(0,r.useRef)(null),a=(0,r.useRef)(null);return(0,r.useCallback)(r=>{if(null===r){let e=n.current;e&&(n.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(n.current=l(e,r)),t&&(a.current=l(t,r))},[e,t])}function l(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let n=e(t);return"function"==typeof n?n:()=>e(null)}}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},73668,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"isLocalURL",{enumerable:!0,get:function(){return l}});let r=e.r(18967),a=e.r(52817);function l(e){if(!(0,r.isAbsoluteUrl)(e))return!0;try{let t=(0,r.getLocationOrigin)(),n=new URL(e,t);return n.origin===t&&(0,a.hasBasePath)(n.pathname)}catch(e){return!1}}},84508,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"errorOnce",{enumerable:!0,get:function(){return r}});let r=e=>{}},22016,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={default:function(){return x},useLinkStatus:function(){return w}};for(var a in r)Object.defineProperty(n,a,{enumerable:!0,get:r[a]});let l=e.r(90809),s=e.r(43476),i=l._(e.r(71645)),o=e.r(95057),c=e.r(8372),d=e.r(18581),u=e.r(18967),h=e.r(5550);e.r(33525);let m=e.r(88540),g=e.r(91949),f=e.r(73668),p=e.r(9396);function x(t){var n,r;let a,l,x,[w,y]=(0,i.useOptimistic)(g.IDLE_LINK_STATUS),v=(0,i.useRef)(null),{href:j,as:k,children:N,prefetch:S=null,passHref:P,replace:$,shallow:E,scroll:R,onClick:C,onMouseEnter:L,onTouchStart:M,legacyBehavior:T=!1,onNavigate:I,transitionTypes:A,ref:U,unstable_dynamicOnHover:O,..._}=t;a=N,T&&("string"==typeof a||"number"==typeof a)&&(a=(0,s.jsx)("a",{children:a}));let B=i.default.useContext(c.AppRouterContext),z=!1!==S,D=!1!==S?null===(r=S)||"auto"===r?p.FetchStrategy.PPR:p.FetchStrategy.Full:p.FetchStrategy.PPR,W="string"==typeof(n=k||j)?n:(0,o.formatUrl)(n);if(T){if(a?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});l=i.default.Children.only(a)}let H=T?l&&"object"==typeof l&&l.ref:U,K=i.default.useCallback(e=>(null!==B&&(v.current=(0,g.mountLinkInstance)(e,W,B,D,z,y)),()=>{v.current&&((0,g.unmountLinkForCurrentNavigation)(v.current),v.current=null),(0,g.unmountPrefetchableInstance)(e)}),[z,W,B,D,y]),F={ref:(0,d.useMergedRef)(K,H),onClick(t){T||"function"!=typeof C||C(t),T&&l.props&&"function"==typeof l.props.onClick&&l.props.onClick(t),!B||t.defaultPrevented||function(t,n,r,a,l,s,o){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,f.isLocalURL)(n)){a&&(t.preventDefault(),location.replace(n));return}if(t.preventDefault(),s){let e=!1;if(s({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);i.default.startTransition(()=>{u(n,a?"replace":"push",!1===l?m.ScrollBehavior.NoScroll:m.ScrollBehavior.Default,r.current,o)})}}(t,W,v,$,R,I,A)},onMouseEnter(e){T||"function"!=typeof L||L(e),T&&l.props&&"function"==typeof l.props.onMouseEnter&&l.props.onMouseEnter(e),B&&z&&(0,g.onNavigationIntent)(e.currentTarget,!0===O)},onTouchStart:function(e){T||"function"!=typeof M||M(e),T&&l.props&&"function"==typeof l.props.onTouchStart&&l.props.onTouchStart(e),B&&z&&(0,g.onNavigationIntent)(e.currentTarget,!0===O)}};return(0,u.isAbsoluteUrl)(W)?F.href=W:T&&!P&&("a"!==l.type||"href"in l.props)||(F.href=(0,h.addBasePath)(W)),x=T?i.default.cloneElement(l,F):(0,s.jsx)("a",{..._,...F,children:a}),(0,s.jsx)(b.Provider,{value:w,children:x})}e.r(84508);let b=(0,i.createContext)(g.IDLE_LINK_STATUS),w=()=>(0,i.useContext)(b);("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},14876,e=>{"use strict";var t=e.i(43476),n=e.i(22016);function r(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:n,suffix:r}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===n?`/index.html${r}`:/\.[a-z0-9]+$/i.test(n)?e:`${n.replace(/\/+$/,"")}/index.html${r}`}e.s(["ExportSafeLink",0,function({href:e,children:a,...l}){return"string"==typeof e?(0,t.jsx)("a",{href:r(e),...l,children:a}):(0,t.jsx)(n.default,{href:e,...l,children:a})},"getExportSafeHref",0,r])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let n=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function r(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return n.find(t=>t.grade===e)},"getGradeIdByNumber",0,r,"grades",0,n],62312);let a=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],l={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function s(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.find(e=>e.id===t)??l}function i(e){if(!e)return l.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.some(e=>e.id===t)?t:l.id}e.s(["currentStudent",0,l,"getCurrentStudentGradeId",0,function(e=l){return r(e.grade)},"getPersonById",0,s,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,a,"normalizePersonId",0,i],7728);let o="chenguang-active-person-id",c="chenguang-active-person-change",d="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,n]=(0,t.useState)(l.id),[r,a]=(0,t.useState)(!1),[h,m]=(0,t.useState)(!1);function g(e){let t=i(e);n(t),window.localStorage.setItem(o,t),window.dispatchEvent(new Event(c))}return(0,t.useEffect)(()=>{let e=i(window.localStorage.getItem(o));function t(){let e=i(window.localStorage.getItem(o));n(e),window.localStorage.setItem(o,e)}function r(){a(!!window.localStorage.getItem(d))}return n(e),window.localStorage.setItem(o,e),a(!!window.localStorage.getItem(d)),m(!0),window.addEventListener(c,t),window.addEventListener("storage",t),window.addEventListener(u,r),()=>{window.removeEventListener(c,t),window.removeEventListener("storage",t),window.removeEventListener(u,r)}},[]),{person:s(e),switchPerson:g,signIn:function(e){let t=i(e);g(t);let n=s(t);window.localStorage.setItem(d,JSON.stringify({personId:t,role:n.role,signedInAt:new Date().toISOString()})),a(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(d),a(!1),window.dispatchEvent(new Event(u))},isLoggedIn:r,isReady:h}}],41324)},82697,e=>{"use strict";var t=e.i(43476),n=e.i(14876),r=e.i(7728),a=e.i(62312),l=e.i(41324);e.s(["BrandHeader",0,function({showPerson:e=!0}){let{person:s,isLoggedIn:i}=(0,l.useActivePerson)(),o=(0,a.getGradeByNumber)(s.grade),c=i?`${(0,r.getPersonDisplayName)(s)}|${"student"===s.role?(0,r.getPersonSubtitle)(s):o?.shortName??`小${s.grade}`}`:"訪客模式";return(0,t.jsxs)(n.ExportSafeLink,{href:i?"/dashboard":"/",className:"flex min-w-0 items-center gap-3 text-ink",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 shrink-0 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{className:"min-w-0 leading-tight",children:[(0,t.jsx)("strong",{className:"block truncate text-xl font-black",children:"晨光"}),(0,t.jsx)("small",{className:"block truncate text-sm font-bold text-stone-500",children:e?c:"國小學習陪跑系統"})]})]})}])},18566,(e,t,n)=>{t.exports=e.r(76562)},22468,e=>{"use strict";var t=e.i(43476),n=e.i(71645),r=e.i(18566),a=e.i(14876),l=e.i(7728),s=e.i(62312),i=e.i(41324);let o=[{label:"登入",href:"/login"},{label:"訪客體驗",href:"/courses"},{label:"註冊登入",href:"/register",primary:!0}];function c(e,t="student"){let n=[{label:"課程首頁",href:"/dashboard",icon:"⌂"},{label:"每日 10 題",href:"/daily-quiz",icon:"10"},{label:"錯題 AI 說明",href:"/wrong-review",icon:"AI"},{label:"進度月曆",href:"/parent-weekly-report",icon:"月"},{label:"英文練習",href:"/practice",icon:"Aa"},{label:"手寫出題",href:"/word-scanner",icon:"掃"},{label:"課程總覽",href:"/courses",icon:"▦"},{label:"國語練習",href:`/courses/grade-${e}/chinese/basic`,icon:"ㄅ"},{label:"數學練習",href:`/courses/grade-${e}/math/basic`,icon:"123"},{label:"每日紀錄",href:"/daily-record",icon:"✓"},{label:"週計畫",href:"/weekly-plan",icon:"□"},{label:"登出",href:"/",icon:"出"}];return"parent"===t?n.filter(e=>["課程首頁","進度月曆","每日紀錄","週計畫","課程總覽","登出"].includes(e.label)):"teacher"===t?n.filter(e=>["課程首頁","課程總覽","國語練習","英文練習","數學練習","週計畫","手寫出題","登出"].includes(e.label)):n.filter(e=>["課程首頁","每日 10 題","英文練習","國語練習","數學練習","手寫出題","錯題 AI 說明","登出"].includes(e.label))}function d(e,t){return"/dashboard"===t?"/dashboard"===e:"/courses"===t?"/courses"===e:t.startsWith("/courses/")?e===t||e.startsWith(`${t}/`):e===t}function u({compact:e=!1}){let{person:r}=(0,i.useActivePerson)(),[a,o]=(0,n.useState)(!1),c=(0,s.getGradeByNumber)(r.grade),d="student"===r.role?(0,l.getPersonSubtitle)(r):c?.name??`國小${r.grade}年級`,h=(0,t.jsx)("div",{className:"grid gap-2",children:l.mockPeople.map(e=>{let n=(0,s.getGradeByNumber)(e.grade),a=e.id===r.id;return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;let n;return t=e.id,o(!1),n=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login",void window.location.assign(`${n}?person=${encodeURIComponent(t)}`)},className:`rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${a?"bg-coral text-white shadow-sm":"bg-white text-stone-700 hover:bg-butter"}`,children:[(0,t.jsxs)("span",{className:"block text-xs font-black opacity-80",children:[(0,l.getRoleLabel)(e.role),"模式"]}),(0,t.jsx)("span",{className:"mt-1 block text-base font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-75",children:"student"===e.role?(0,l.getPersonSubtitle)(e):n?.name??`國小${e.grade}年級`})]},e.id)})});return e?(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>o(e=>!e),className:"flex min-h-11 max-w-[5.5rem] items-center gap-1 rounded-2xl bg-butter px-2 text-left text-amber-950 shadow-sm sm:max-w-none sm:gap-2 sm:px-3","aria-expanded":a,"aria-label":"切換目前使用者",children:[(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("strong",{className:"block max-w-20 truncate text-sm font-black",children:r.name}),(0,t.jsx)("small",{className:"block text-[11px] font-bold opacity-70",children:c?.shortName??`小${r.grade}`})]}),(0,t.jsx)("span",{"aria-hidden":"true",className:"text-xs",children:"⌄"})]}),a?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100vh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsx)("strong",{className:"text-base font-black text-ink",children:"切換使用者"}),(0,t.jsx)("button",{type:"button",onClick:()=>o(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉帳號選單",children:"×"})]}),h]}):null]}):(0,t.jsxs)("section",{className:"rounded-3xl border border-amber-100 bg-cream p-3 shadow-sm",children:[(0,t.jsx)("button",{type:"button",onClick:()=>o(e=>!e),className:"w-full rounded-[1.35rem] bg-white/80 p-3 text-left ring-1 ring-transparent transition hover:bg-white hover:ring-coral/30","aria-expanded":a,"aria-label":"切換目前使用者",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("p",{className:"text-xs font-black text-amber-700",children:[(0,l.getRoleLabel)(r.role),"模式"]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-2xl font-black leading-tight text-ink",children:r.name}),(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"student"===r.role?"匿名檔案":(0,l.getRoleLabel)(r.role)})]}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:d})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-coral px-3 py-2 text-xs font-black text-white shadow-sm",children:"切換帳號"})]})}),a?(0,t.jsx)("div",{className:"mt-3",children:h}):null]})}e.s(["AppSidebar",0,function(){let e=(0,r.usePathname)(),{person:n,isLoggedIn:l,signOut:s}=(0,i.useActivePerson)();function h(){s();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsx)("aside",{className:"fixed inset-y-0 left-0 z-20 hidden w-64 flex-col border-r border-softline/80 bg-white/85 backdrop-blur-xl lg:flex",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 py-6",children:[(0,t.jsxs)(a.ExportSafeLink,{className:"flex items-center gap-3",href:l?"/dashboard":"/",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"text-sm font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),l?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{}),(0,t.jsx)("nav",{className:"grid gap-2 pr-1",children:c(n.grade,n.role).map(n=>{let r=d(e,n.href),l=`flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left transition ${r?"bg-butter text-amber-900 shadow-sm":"text-stone-600 hover:bg-butter hover:text-amber-900"}`,s=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 place-items-center rounded-xl text-sm font-black shadow-sm ${r?"bg-white text-coral":"bg-white text-stone-500"}`,children:n.icon}),(0,t.jsx)("span",{className:"font-bold",children:n.label})]});return"登出"===n.label?(0,t.jsx)("button",{type:"button",onClick:h,className:l,children:s},n.label):(0,t.jsx)(a.ExportSafeLink,{href:n.href,className:l,children:s},n.label)})})]}):(0,t.jsx)("div",{className:"grid gap-3",children:o.map(e=>(0,t.jsx)(a.ExportSafeLink,{href:e.href,className:e.primary?"rounded-2xl bg-coral px-4 py-3 text-center font-black text-white shadow-warm transition hover:brightness-105":"rounded-2xl border border-softline bg-white px-4 py-3 text-center font-black text-amber-800 transition hover:bg-butter",children:e.label},e.label))}),l?(0,t.jsxs)(a.ExportSafeLink,{href:"student"===n.role?"/wrong-review":"/parent-weekly-report",className:"mt-auto rounded-2xl border border-green-100 bg-green-50 p-4 text-sm text-green-900 transition hover:-translate-y-0.5 hover:bg-green-100",children:[(0,t.jsx)("span",{className:"block text-xs font-black text-green-700",children:"本週學習摘要"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg",children:"每天一小步,進度看得見"}),(0,t.jsx)("span",{className:"mt-2 block font-bold text-green-700",children:"查看進度與需要再練的內容 →"})]}):null]})})},"MobileMenu",0,function(){let e=(0,r.usePathname)(),{person:l,signOut:s}=(0,i.useActivePerson)(),[o,u]=(0,n.useState)(!1),h=c(l.grade,l.role);function m(){s();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsxs)("div",{className:"shrink-0 lg:hidden",children:[(0,t.jsx)("button",{type:"button",onClick:()=>u(e=>!e),className:"grid min-h-11 min-w-11 place-items-center rounded-2xl bg-white text-xl font-black text-amber-900 shadow-sm active:scale-[0.98]","aria-expanded":o,"aria-label":"開啟完整功能選單",children:o?"×":"☰"}),o?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100dvh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("strong",{className:"block text-base font-black text-ink",children:"全部功能"}),(0,t.jsxs)("span",{className:"text-xs font-bold text-stone-500",children:["依 ",l.name," 的身分顯示"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉功能選單",children:"×"})]}),(0,t.jsx)("nav",{className:"grid grid-cols-2 gap-2",children:h.map(n=>{let r=d(e,n.href),l=`flex min-h-16 items-center gap-3 rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${r?"bg-coral text-white":"bg-white text-stone-700"}`,s=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 shrink-0 place-items-center rounded-xl text-sm font-black ${r?"bg-white/20":"bg-butter text-amber-900"}`,children:n.icon}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:n.label})]});return"登出"===n.label?(0,t.jsx)("button",{type:"button",onClick:m,className:l,children:s},n.label):(0,t.jsx)(a.ExportSafeLink,{href:n.href,onClick:()=>u(!1),className:l,children:s},n.label)})})]}):null]})},"MobileQuickNav",0,function(){var e;let n,l=(0,r.usePathname)(),{person:s}=(0,i.useActivePerson)(),o=(n=c(s.grade,e=s.role),("guest"===e?["課程首頁","課程總覽"]:({student:["課程首頁","每日 10 題","英文練習","課程總覽"],parent:["課程首頁","進度月曆","每日紀錄","週計畫"],teacher:["課程首頁","課程總覽","週計畫","手寫出題"]})[e]).map(e=>n.find(t=>t.label===e)).filter(e=>!!e));return(0,t.jsx)("nav",{className:"fixed inset-x-3 bottom-[max(0.75rem,env(safe-area-inset-bottom))] z-50 grid grid-cols-4 gap-1 rounded-3xl border border-white/80 bg-white/90 p-2 shadow-warm backdrop-blur-xl lg:hidden","aria-label":"主要功能",children:o.map(e=>{let n=d(l,e.href);return(0,t.jsxs)(a.ExportSafeLink,{href:e.href,className:`flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl px-1 py-2 text-center transition active:scale-[0.98] ${n?"bg-coral text-white shadow-sm":"text-stone-600"}`,children:[(0,t.jsx)("span",{className:"text-sm font-black",children:e.icon}),(0,t.jsx)("span",{className:"w-full truncate text-[11px] font-black",children:e.label})]},e.label)})})},"PersonSwitcher",0,u])},55634,e=>{"use strict";var t=e.i(43476),n=e.i(71645),r=e.i(18566),a=e.i(14876),l=e.i(41324);e.s(["ActiveGradeRouteSync",0,function(){let e=(0,r.usePathname)(),{person:s,isLoggedIn:i,isReady:o}=(0,l.useActivePerson)(),c=function(e){let t=e.match(/^\/learn\/(?:grade-)?([1-6])(?:\/|$)/);if(t)return Number(t[1]);let n=e.match(/^\/courses\/grade-([1-6])(?:\/|$)/);if(n)return Number(n[1]);let r=e.match(/^\/(?:lesson|practice|handwriting)\/grade-([1-6])-/);return r?Number(r[1]):null}(e),d=!!(o&&i&&"student"===s.role&&c&&c!==s.grade);return((0,n.useEffect)(()=>{var t;if(!d)return;let n=(t=s.grade,/^\/learn\/(?:grade-)?[1-6](?:\/|$)/.test(e)?e.replace(/^\/learn\/(?:grade-)?[1-6]/,`/learn/${t}`):/^\/courses\/grade-[1-6](?:\/|$)/.test(e)?e.replace(/^\/courses\/grade-[1-6]/,`/courses/grade-${t}`):e.replace(/^(\/(?:lesson|practice|handwriting)\/)grade-[1-6]-/,`$1grade-${t}-`)),r=`${(0,a.getExportSafeHref)(n)}${window.location.search}${window.location.hash}`;window.location.replace(r)},[e,s.grade,d]),o&&!d)?null:(0,t.jsx)("div",{className:"fixed inset-0 z-[100] grid place-items-center bg-[#fffaf3]/95 p-5 backdrop-blur-md",role:"status","aria-live":"polite",children:(0,t.jsxs)("div",{className:"w-full max-w-md rounded-[2rem] border border-white bg-white/90 p-7 text-center shadow-warm",children:[(0,t.jsx)("span",{className:"mx-auto grid h-14 w-14 place-items-center rounded-2xl bg-butter text-2xl","aria-hidden":"true",children:"☀"}),(0,t.jsx)("strong",{className:"mt-4 block text-2xl font-black text-ink",children:o?`正在切換到小${s.grade}課程`:"正在讀取目前學習年級"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"晨光會自動載入這位學習者正確的課程內容。"})]})})}],55634)},12408,e=>{"use strict";function t(){return"speechSynthesis"in window&&"SpeechSynthesisUtterance"in window}function n(e,r={}){if(!e.trim())return{ok:!1,message:"請先選擇要播放的內容。"};if(!t())return{ok:!1,message:"這個瀏覽器不支援語音播放,建議使用 Chrome 或 Edge。"};window.speechSynthesis.cancel();let a=new SpeechSynthesisUtterance(e);return a.lang=r.lang??"en-US",a.rate=r.rate??.82,a.pitch=r.pitch??1,a.volume=r.volume??1,window.speechSynthesis.speak(a),{ok:!0,message:"正在播放標準發音。"}}e.s(["speakEnglish",0,function(e,t={}){return n(e,{...t,lang:"en-US"})},"speakMandarin",0,function(e,t={}){return n(e,{rate:.76,pitch:1.05,...t,lang:"zh-TW"})},"speakText",0,n,"stopSpeech",0,function(){t()&&window.speechSynthesis.cancel()}])},47106,e=>{"use strict";var t=e.i(43476),n=e.i(71645);let r=[["write","right"],["two","to","too"],["one","won"],["read","reed"],["blue","blew"],["weather","whether"]];function a(){let e=window;return e.SpeechRecognition??e.webkitSpeechRecognition??null}function l(e){return e.toLowerCase().replace(/\bi'm\b/g,"i am").replace(/\bit's\b/g,"it is").replace(/\byou're\b/g,"you are").replace(/\bwe're\b/g,"we are").replace(/\bthey're\b/g,"they are").replace(/\bcan't\b/g,"cannot").replace(/\bdon't\b/g,"do not").replace(/[^a-z\s']/g,"").replace(/\s+/g," ").trim()}function s(e,t){let n=l(e),a=l(t);if(!n||!a)return 0;if(n===a||r.some(e=>e.includes(n)&&e.includes(a)))return 1;let s=Math.max(n.length,a.length),i=Math.max(0,1-function(e,t){let n=Array.from({length:e.length+1},()=>Array(t.length+1).fill(0));for(let t=0;t<=e.length;t+=1)n[t][0]=t;for(let e=0;e<=t.length;e+=1)n[0][e]=e;for(let r=1;r<=e.length;r+=1)for(let a=1;a<=t.length;a+=1){let l=+(e[r-1]!==t[a-1]);n[r][a]=Math.min(n[r-1][a]+1,n[r][a-1]+1,n[r-1][a-1]+l)}return n[e.length][t.length]}(n,a)/s),o=n.split(" "),c=a.split(" ");if(1===o.length)return i;let d=function(e,t){let n=Array.from({length:e.length+1},()=>Array(t.length+1).fill(0));for(let r=1;r<=e.length;r+=1)for(let a=1;a<=t.length;a+=1)n[r][a]=e[r-1]===t[a-1]?n[r-1][a-1]+1:Math.max(n[r-1][a],n[r][a-1]);return n[e.length][t.length]}(o,c),u=d/o.length,h=d/c.length;return u<.7||h<.7?Math.min(i,.69):.45*i+.4*u+.15*h}function i(e){return e.replace(/[\s,。!?、,.!?]/g,"").trim()}function o(e,t,n=[]){let r=[e,...n].map(i).filter(Boolean),a=i(t);return!!r.length&&!!a&&r.some(e=>a===e||a.includes(e)||e.includes(a))}function c(e,t,n="en-US",r=[]){return n.toLowerCase().startsWith("zh")?o(e,t,r):[e,...r].some(e=>{var n;let r,a;return s(n=e,t)>=(1===(a=(r=l(n)).split(" ").filter(Boolean).length)&&r.length<=4?.9:1===a?.86:.8)})}var d=e.i(12408);e.s(["SpeechPracticeButton",0,function({expected:e,alternatives:r=[],lang:i="en-US",listenLabel:u="開始口說辨識",speakLabel:h="先聽一次",targetLabel:m="目標",compact:g=!1,showParentControls:f=!0,onResult:p,onReviewed:x,listenSeconds:b}){var w;let y,v,[j,k]=(0,n.useState)(!1),[N,S]=(0,n.useState)(!1),[P,$]=(0,n.useState)(!1),[E,R]=(0,n.useState)(null),[C,L]=(0,n.useState)(0),[M,T]=(0,n.useState)(!1),[I,A]=(0,n.useState)(""),[U,O]=(0,n.useState)(null),_=(0,n.useRef)(null),B=(0,n.useRef)([]),z=(0,n.useRef)(0);(0,n.useEffect)(()=>(k(!0),()=>{z.current+=1,I&&URL.revokeObjectURL(I),_.current?.stream.getTracks().forEach(e=>e.stop())}),[I]),(0,n.useEffect)(()=>{O(null),T(!1),R(null)},[e]);let D=(0,n.useMemo)(()=>j&&!!a(),[j]),W=j&&!D;function H(e){O(e),p?.(e)}async function K(){let t=z.current+1;z.current=t,(0,d.stopSpeech)(),O(null),T(!1);for(let e=3;e>=1;e-=1)if(R(e),await new Promise(e=>window.setTimeout(e,900)),z.current!==t)return;R(null),S(!0);let n=b??(e.trim().split(/\s+/).length>2?15:12);L(n);let u=window.setInterval(()=>L(e=>Math.max(0,e-1)),1e3);await new Promise(e=>window.setTimeout(e,220));let h=await function({expected:e,alternatives:t=[],lang:n="en-US",timeoutMs:r}){let i=a();return i?new Promise(a=>{let d=new i,u=r??(l(e).split(" ").filter(Boolean).length>2?15e3:12e3),h=Date.now()+u,m=!1,g="",f=0,p=0,x=0,b=e=>{if(!m){m=!0,window.clearTimeout(w);try{d.abort()}catch{}a(e)}},w=window.setTimeout(()=>{b({ok:!1,transcript:g,confidence:f,accuracy:Math.round(100*p),message:g?"有聽到聲音,但內容還不夠接近目標。放慢速度再試一次。":"還沒有聽到清楚的聲音,請靠近麥克風再試一次。"})},u);d.lang=n,d.interimResults=!0,d.maxAlternatives=5,d.continuous=!1;let y=()=>!(m||x>=2||Date.now()+900>=h)&&(x+=1,window.setTimeout(()=>{if(!m)try{d.start()}catch{}},320),!0);d.onresult=r=>{for(let a of Array.from({length:r.results.length},(e,t)=>r.results[t]))for(let r of Array.from({length:a.length},(e,t)=>a[t]).filter(Boolean)){let a=n.toLowerCase().startsWith("zh")?+!!o(e,r.transcript,t):function(e,t,n){return Math.max(...[e,...n].map(e=>s(e,t)))}(e,r.transcript,t),l=r.confidence??0;(a>p||a===p&&l>f)&&(g=r.transcript,f=l,p=a)}c(e,g,n,t)&&b({ok:!0,transcript:g,confidence:f,accuracy:Math.round(100*p),message:"系統有聽懂,發音和目標內容很接近。"})},d.onerror=e=>{("no-speech"===e.error||"aborted"===e.error)&&y()||b({ok:!1,transcript:g,confidence:f,accuracy:Math.round(100*p),message:"not-allowed"===e.error?"請允許瀏覽器使用麥克風,才能進行口說辨識。":"語音辨識暫時沒有收到完整內容,請再試一次。"})},d.onend=()=>{m||(c(e,g,n,t)?b({ok:!0,transcript:g,confidence:f,accuracy:Math.round(100*p),message:"系統有聽懂,發音和目標內容很接近。"}):y()||b({ok:!1,transcript:g,confidence:f,accuracy:Math.round(100*p),message:g?"內容還差一點,看看系統聽到的文字,再慢慢說一次。":"這次沒有聽清楚,請靠近麥克風再試一次。"}))};try{d.start()}catch{b({ok:!1,transcript:"",confidence:0,accuracy:0,message:"麥克風正在準���中,請稍等一下再按一次。"})}}):Promise.resolve({ok:!1,transcript:"",confidence:0,accuracy:0,message:"這個瀏覽器目前不支援語音轉文字,仍可使用錄音回放模式。"})}({expected:e,alternatives:r,lang:i,timeoutMs:1e3*n});window.clearInterval(u),z.current===t&&(S(!1),L(0),H(h))}async function F(){if(!("u">typeof navigator&&navigator.mediaDevices?.getUserMedia&&"u">typeof MediaRecorder))return void H({ok:!1,transcript:"",confidence:0,message:"這台裝置無法錄音,請讓孩子跟著家長唸一次。"});try{let e=await navigator.mediaDevices.getUserMedia({audio:!0}),t=new MediaRecorder(e);B.current=[],_.current=t,t.ondataavailable=e=>{e.data.size>0&&B.current.push(e.data)},t.onstop=()=>{let n=new Blob(B.current,{type:t.mimeType||"audio/webm"});I&&URL.revokeObjectURL(I),A(URL.createObjectURL(n)),e.getTracks().forEach(e=>e.stop())},t.start(),$(!0),O(null)}catch{H({ok:!1,transcript:"",confidence:0,message:"請允許麥克風權限,才能錄下孩子的口說練習。"})}}function G(e){H({ok:e,transcript:e?"家長確認發音接近目標":"家長確認需要再練一次",confidence:e?1:.35,message:e?"家長確認唸對了,很棒。":"再練一次,先聽標準發音再慢慢唸。"})}let q=U?.transcript&&"en-US"===i?(w=U.transcript,y=l(e).split(" ").filter(Boolean),v=new Set(l(w).split(" ").filter(Boolean)),y.map(e=>({word:e,heard:v.has(e)}))):[];return(0,t.jsxs)("div",{className:`mt-4 border border-blue-100 bg-blue-50/70 ${g?"rounded-2xl p-3":"rounded-3xl p-4 md:p-5"}`,children:[(0,t.jsxs)("div",{className:"rounded-2xl bg-white/85 p-4",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,t.jsx)("span",{className:"rounded-full bg-blue-100 px-3 py-1 text-xs font-black text-blue-800",children:D?"孩子口說辨識":"錄音回放模式"}),(0,t.jsx)("span",{className:"text-xs font-bold text-stone-500",children:"系統不會自己開始播放"})]}),g?null:(0,t.jsxs)("div",{className:"mt-3",children:[(0,t.jsx)("p",{className:"text-xs font-black text-stone-500",children:m}),(0,t.jsx)("p",{className:"mt-1 text-xl font-black leading-8 text-blue-800",children:e})]})]}),(0,t.jsx)("p",{className:"mt-3 text-sm font-bold leading-7 text-stone-600",children:D?"請孩子準備好後按下紅色按鈕,再親自把上面的內容唸出來。":"這台裝置目前不能直接轉成文字,仍可錄下孩子的聲音並回放。"}),(0,t.jsxs)("div",{className:"mt-3 grid gap-2 sm:grid-cols-2",children:[D?(0,t.jsx)("button",{type:"button",onClick:K,disabled:N||null!==E,className:"min-h-14 rounded-2xl bg-coral px-4 py-3 text-base font-black text-white shadow-sm transition hover:brightness-105 disabled:cursor-wait disabled:opacity-70",children:null!==E?`準備 ${E}`:N?`正在聽,還有 ${C} 秒`:u}):(0,t.jsx)("button",{type:"button",onClick:P?function(){_.current&&"inactive"!==_.current.state&&(_.current.stop(),$(!1))}:F,className:"min-h-14 rounded-2xl bg-coral px-4 py-3 text-base font-black text-white shadow-sm transition hover:brightness-105",children:P?"完成錄音":"錄下我的朗讀"}),(0,t.jsx)("button",{type:"button",onClick:()=>(0,d.speakText)(e,{lang:i,rate:"zh-TW"===i?.72:.68}),className:"min-h-14 rounded-2xl bg-butter px-4 py-3 text-base font-black text-amber-900 shadow-sm transition hover:bg-amber-100",children:h})]}),I&&W?(0,t.jsxs)("div",{className:"mt-3 rounded-2xl bg-white/80 p-3",children:[(0,t.jsx)("p",{className:"mb-2 text-sm font-bold text-stone-600",children:"iPhone/iPad 錄音回放:先聽孩子剛剛的聲音,再由家長協助確認。"}),(0,t.jsx)("audio",{className:"w-full",controls:!0,src:I}),(0,t.jsx)("button",{type:"button",onClick:()=>H({ok:!0,transcript:"已完成錄音並回放",confidence:1,accuracy:100,message:"這台裝置使用錄音回放模式,已完成本次朗讀。"}),className:"mt-3 min-h-12 w-full rounded-2xl bg-green-700 px-4 py-3 text-sm font-black text-white shadow-sm",children:"我已聽過錄音,完成這次朗讀"})]}):null,U?(0,t.jsxs)("div",{"aria-live":"polite",className:`mt-3 min-h-20 rounded-2xl p-4 text-sm font-bold leading-7 ${U.ok?"bg-green-50 text-green-900":"bg-rose-50 text-rose-900"}`,children:[(0,t.jsx)("p",{className:"text-base font-black",children:U.ok?"有聽到孩子的聲音,這次很接近。":"這次還沒聽完整,再慢慢說一次。"}),U.transcript?(0,t.jsxs)("p",{className:"mt-1",children:["系統聽到:",U.transcript]}):(0,t.jsx)("p",{className:"mt-1",children:"系統還沒有收到清楚的文字。"}),(0,t.jsxs)("p",{className:"mt-1",children:["目標內容:",e]}),"number"==typeof U.accuracy?(0,t.jsxs)("p",{children:["內容接近度:",U.accuracy,"%"]}):null,q.length>1?(0,t.jsx)("div",{className:"mt-2 flex flex-wrap gap-2","aria-label":"逐字辨識結果",children:q.map(({word:e,heard:n},r)=>(0,t.jsxs)("span",{className:`rounded-full px-3 py-1 text-xs font-black ${n?"bg-green-100 text-green-800":"bg-white text-rose-800"}`,children:[e," ",n?"有聽到":"再練一次"]},`${e}-${r}`))}):null,U.ok?null:(0,t.jsxs)("p",{className:"mt-2",children:["小提示:","zh-TW"===i?"先看注音,再按紅色按鈕自己唸一次。":`可以拆成「${function(e){if(e.includes(" "))return e.split(" ").join(" / ");if(e.length<=4)return e;let t=Math.ceil(e.length/2);return`${e.slice(0,t)} / ${e.slice(t)}`}(e)}」,放慢速度再試一次。`]}),U.ok&&x?(0,t.jsx)("button",{type:"button",disabled:M,onClick:function(){U?.ok&&!M&&(T(!0),x?.(U))},className:"mt-3 min-h-12 rounded-2xl bg-green-700 px-5 py-3 text-base font-black text-white shadow-sm disabled:bg-green-200 disabled:text-green-800",children:M?"已理解,可以前進":"我看懂了,完成口說"}):null]}):(0,t.jsx)("p",{"aria-live":"polite",className:"mt-3 min-h-16 rounded-2xl bg-white/65 p-3 text-sm font-bold leading-7 text-stone-500",children:null!==E?"先看著目標內容準備,倒數結束再開始說。":N?"麥克風已開啟,請孩子現在開始說;唸完後停一下,系統會自動判斷。":"尚未開始。按紅色按鈕後會先倒數 3 秒,再給孩子足夠時間朗讀。"}),f?(0,t.jsxs)("details",{className:"mt-3 rounded-2xl bg-white/70 px-4 py-3",children:[(0,t.jsx)("summary",{className:"cursor-pointer text-sm font-black text-stone-600",children:"家長協助確認(選用)"}),(0,t.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("button",{type:"button",onClick:()=>G(!0),className:"rounded-xl bg-mint px-3 py-2 text-xs font-black text-green-800",children:"聽起來正確"}),(0,t.jsx)("button",{type:"button",onClick:()=>G(!1),className:"rounded-xl bg-white px-3 py-2 text-xs font-black text-amber-900 shadow-sm",children:"需要再練"})]})]}):null]})}],47106)}]);
_next/static/chunks/1g4vb67-ko26n.css ADDED
@@ -0,0 +1 @@
 
 
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-orange-50:#fff7ed;--color-orange-100:#ffedd5;--color-orange-200:#ffd7a8;--color-orange-500:#fe6e00;--color-orange-700:#c53c00;--color-orange-800:#9f2d00;--color-amber-50:#fffbeb;--color-amber-100:#fef3c6;--color-amber-200:#fee685;--color-amber-300:#ffd236;--color-amber-400:#fcbb00;--color-amber-500:#f99c00;--color-amber-700:#b75000;--color-amber-800:#953d00;--color-amber-900:#7b3306;--color-amber-950:#461901;--color-yellow-50:#fefce8;--color-green-50:#f0fdf4;--color-green-100:#dcfce7;--color-green-200:#b9f8cf;--color-green-300:#7bf1a8;--color-green-400:#05df72;--color-green-500:#00c758;--color-green-600:#00a544;--color-green-700:#008138;--color-green-800:#016630;--color-green-900:#0d542b;--color-green-950:#032e15;--color-emerald-50:#ecfdf5;--color-cyan-50:#ecfeff;--color-blue-50:#eff6ff;--color-blue-100:#dbeafe;--color-blue-200:#bedbff;--color-blue-300:#90c5ff;--color-blue-500:#3080ff;--color-blue-600:#155dfc;--color-blue-700:#1447e6;--color-blue-800:#193cb8;--color-blue-900:#1c398e;--color-blue-950:#162456;--color-rose-50:#fff1f2;--color-rose-100:#ffe4e6;--color-rose-200:#ffccd3;--color-rose-300:#ffa2ae;--color-rose-400:#ff667f;--color-rose-500:#ff2357;--color-rose-700:#c20039;--color-rose-800:#a30037;--color-rose-900:#8b0836;--color-rose-950:#4d0218;--color-stone-50:#fafaf9;--color-stone-100:#f5f5f4;--color-stone-200:#e7e5e4;--color-stone-300:#d6d3d1;--color-stone-400:#a6a09b;--color-stone-500:#79716b;--color-stone-600:#57534d;--color-stone-700:#44403b;--color-stone-800:#292524;--color-stone-900:#1c1917;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-black:900;--tracking-normal:0em;--tracking-wide:.025em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-bounce:bounce 1s infinite;--blur-md:12px;--blur-xl:24px;--blur-2xl:40px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}@supports (color:lab(0% 0 0)){:root,:host{--color-orange-50:lab(97.7008% 1.53738 5.90646);--color-orange-100:lab(94.7127% 3.58391 14.3151);--color-orange-200:lab(88.4871% 9.94918 28.8378);--color-orange-500:lab(64.272% 57.1788 90.3583);--color-orange-700:lab(46.4615% 57.7275 70.8507);--color-orange-800:lab(37.1566% 46.6433 50.5562);--color-amber-50:lab(98.6252% -.635982 8.42309);--color-amber-100:lab(95.916% -1.2165 23.111);--color-amber-200:lab(91.7203% -.505269 49.9084);--color-amber-300:lab(86.4156% 6.13147 78.3961);--color-amber-400:lab(80.1641% 16.6016 99.2089);--color-amber-500:lab(72.7183% 31.8672 97.9407);--color-amber-700:lab(47.2709% 42.9082 69.2966);--color-amber-800:lab(37.8823% 37.1699 52.2718);--color-amber-900:lab(31.2288% 30.2627 40.0378);--color-amber-950:lab(15.8111% 20.9107 23.3752);--color-yellow-50:lab(98.6846% -1.79058 9.77662);--color-green-50:lab(98.1563% -5.60117 2.75913);--color-green-100:lab(96.186% -13.8464 6.52362);--color-green-200:lab(92.4222% -26.4702 12.9427);--color-green-300:lab(86.9953% -47.2691 25.0054);--color-green-400:lab(78.503% -64.9265 39.7492);--color-green-500:lab(70.5521% -66.5147 45.8072);--color-green-600:lab(59.0978% -58.6621 41.2579);--color-green-700:lab(47.0329% -47.0239 31.4788);--color-green-800:lab(37.4616% -36.7971 22.9692);--color-green-900:lab(30.797% -29.6927 17.382);--color-green-950:lab(15.6845% -20.4225 11.7249);--color-emerald-50:lab(97.8462% -6.94963 1.85487);--color-cyan-50:lab(98.3303% -5.97429 -2.62109);--color-blue-50:lab(96.492% -1.14647 -5.11479);--color-blue-100:lab(92.0301% -2.24757 -11.6453);--color-blue-200:lab(86.15% -4.04379 -21.0797);--color-blue-300:lab(77.5052% -6.4629 -36.42);--color-blue-500:lab(54.1736% 13.3368 -74.6839);--color-blue-600:lab(44.0605% 29.0279 -86.0352);--color-blue-700:lab(36.9089% 35.0961 -85.6872);--color-blue-800:lab(30.2514% 27.7854 -70.2699);--color-blue-900:lab(26.1542% 15.7545 -51.5504);--color-blue-950:lab(15.6723% 8.86233 -32.2945);--color-rose-50:lab(96.2369% 4.94152 1.28012);--color-rose-100:lab(92.8221% 9.86832 2.60077);--color-rose-200:lab(86.806% 19.1909 4.07754);--color-rose-300:lab(76.6339% 38.3549 9.68834);--color-rose-400:lab(64.4124% 63.0291 19.2068);--color-rose-500:lab(56.101% 79.4329 31.4532);--color-rose-700:lab(41.1651% 71.6251 30.3087);--color-rose-800:lab(34.6481% 60.802 20.1957);--color-rose-900:lab(29.7104% 51.514 12.6253);--color-rose-950:lab(14.2323% 34.0086 9.80922);--color-stone-50:lab(98.2686% -.0991821 .364304);--color-stone-100:lab(96.5286% -.0991821 .36428);--color-stone-200:lab(91.055% .663072 .865591);--color-stone-300:lab(84.7909% .928015 1.59738);--color-stone-400:lab(66.2166% 1.88047 3.20325);--color-stone-500:lab(48.1164% 2.35698 4.26853);--color-stone-600:lab(35.5168% 1.08606 4.07829);--color-stone-700:lab(27.3812% 1.32917 3.57789);--color-stone-800:lab(15.0353% 1.96067 1.53427);--color-stone-900:lab(9.03835% 1.15297 1.92955)}}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-3{inset-inline:calc(var(--spacing) * 3)}.inset-x-4{inset-inline:calc(var(--spacing) * 4)}.inset-y-0{inset-block:0}.-top-2{top:calc(var(--spacing) * -2)}.top-0{top:0}.top-1{top:var(--spacing)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-3{top:calc(var(--spacing) * 3)}.top-4{top:calc(var(--spacing) * 4)}.top-5{top:calc(var(--spacing) * 5)}.top-20{top:calc(var(--spacing) * 20)}.top-full{top:100%}.right-0{right:0}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-4{right:calc(var(--spacing) * 4)}.right-5{right:calc(var(--spacing) * 5)}.-bottom-2{bottom:calc(var(--spacing) * -2)}.bottom-1\/2{bottom:50%}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-\[max\(0\.75rem\,env\(safe-area-inset-bottom\)\)\]{bottom:max(.75rem, env(safe-area-inset-bottom))}.left-0{left:0}.left-1{left:var(--spacing)}.left-1\/2{left:50%}.left-3{left:calc(var(--spacing) * 3)}.left-4{left:calc(var(--spacing) * 4)}.left-5{left:calc(var(--spacing) * 5)}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[70\]{z-index:70}.z-\[100\]{z-index:100}.\!container{width:100%!important}@media (min-width:40rem){.\!container{max-width:40rem!important}}@media (min-width:48rem){.\!container{max-width:48rem!important}}@media (min-width:64rem){.\!container{max-width:64rem!important}}@media (min-width:80rem){.\!container{max-width:80rem!important}}@media (min-width:96rem){.\!container{max-width:96rem!important}}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-0\.5{margin-inline:calc(var(--spacing) * .5)}.mx-auto{margin-inline:auto}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-auto{margin-top:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-4{margin-left:calc(var(--spacing) * 4)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.table{display:table}.aspect-\[4\/3\]{aspect-ratio:4/3}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.h-0{height:0}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:var(--spacing)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-52{height:calc(var(--spacing) * 52)}.h-\[360px\]{height:360px}.h-\[420px\]{height:420px}.h-auto{height:auto}.h-full{height:100%}.max-h-14{max-height:calc(var(--spacing) * 14)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-\[420px\]{max-height:420px}.max-h-\[520px\]{max-height:520px}.max-h-\[calc\(100dvh-6rem\)\]{max-height:calc(100dvh - 6rem)}.max-h-\[calc\(100vh-6rem\)\]{max-height:calc(100vh - 6rem)}.min-h-0{min-height:0}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-12{min-height:calc(var(--spacing) * 12)}.min-h-14{min-height:calc(var(--spacing) * 14)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-20{min-height:calc(var(--spacing) * 20)}.min-h-24{min-height:calc(var(--spacing) * 24)}.min-h-28{min-height:calc(var(--spacing) * 28)}.min-h-32{min-height:calc(var(--spacing) * 32)}.min-h-36{min-height:calc(var(--spacing) * 36)}.min-h-40{min-height:calc(var(--spacing) * 40)}.min-h-44{min-height:calc(var(--spacing) * 44)}.min-h-56{min-height:calc(var(--spacing) * 56)}.min-h-64{min-height:calc(var(--spacing) * 64)}.min-h-72{min-height:calc(var(--spacing) * 72)}.min-h-80{min-height:calc(var(--spacing) * 80)}.min-h-\[72vh\]{min-height:72vh}.min-h-\[320px\]{min-height:320px}.min-h-\[360px\]{min-height:360px}.min-h-screen{min-height:100vh}.w-0{width:0}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-52{width:calc(var(--spacing) * 52)}.w-64{width:calc(var(--spacing) * 64)}.w-\[320px\]{width:320px}.w-\[min\(920px\,calc\(100vw-2rem\)\)\]{width:min(920px,100vw - 2rem)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-20{max-width:calc(var(--spacing) * 20)}.max-w-\[5\.5rem\]{max-width:5.5rem}.max-w-\[1480px\]{max-width:1480px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-11{min-width:calc(var(--spacing) * 11)}.min-w-14{min-width:calc(var(--spacing) * 14)}.min-w-16{min-width:calc(var(--spacing) * 16)}.min-w-28{min-width:calc(var(--spacing) * 28)}.min-w-\[4\.25rem\]{min-width:4.25rem}.min-w-\[520px\]{min-width:520px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.origin-bottom{transform-origin:bottom}.-translate-x-1{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-\[-35deg\]{rotate:-35deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-bounce{animation:var(--animate-bounce)}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.scroll-mt-28{scroll-margin-top:calc(var(--spacing) * 28)}.\[scrollbar-width\:none\]{scrollbar-width:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-7>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 7) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 7) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{-moz-column-gap:calc(var(--spacing) * 2);column-gap:calc(var(--spacing) * 2)}.gap-y-1{row-gap:var(--spacing)}.gap-y-5{row-gap:calc(var(--spacing) * 5)}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-clip{overflow-x:clip}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\[1\.5rem\]{border-radius:1.5rem}.rounded-\[1\.25rem\]{border-radius:1.25rem}.rounded-\[1\.35rem\]{border-radius:1.35rem}.rounded-\[1\.65rem\]{border-radius:1.65rem}.rounded-\[1\.75rem\]{border-radius:1.75rem}.rounded-\[2rem\]{border-radius:2rem}.rounded-\[28px\]{border-radius:28px}.rounded-\[32px\]{border-radius:32px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-l-\[32px\]{border-top-left-radius:32px;border-bottom-left-radius:32px}.rounded-b-full{border-bottom-right-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-\[10px\]{border-style:var(--tw-border-style);border-width:10px}.border-x-\[24px\]{border-inline-style:var(--tw-border-style);border-inline-width:24px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-2{border-right-style:var(--tw-border-style);border-right-width:2px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-4{border-bottom-style:var(--tw-border-style);border-bottom-width:4px}.border-b-\[42px\]{border-bottom-style:var(--tw-border-style);border-bottom-width:42px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[\#efe7da\]{border-color:#efe7da}.border-amber-100{border-color:var(--color-amber-100)}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-300{border-color:var(--color-amber-300)}.border-black\/5{border-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.border-black\/5{border-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.border-blue-100{border-color:var(--color-blue-100)}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-300{border-color:var(--color-blue-300)}.border-green-100{border-color:var(--color-green-100)}.border-green-200{border-color:var(--color-green-200)}.border-green-300{border-color:var(--color-green-300)}.border-green-400{border-color:var(--color-green-400)}.border-green-500{border-color:var(--color-green-500)}.border-orange-100{border-color:var(--color-orange-100)}.border-orange-100\/80{border-color:#ffedd5cc}@supports (color:color-mix(in lab, red, red)){.border-orange-100\/80{border-color:color-mix(in oklab, var(--color-orange-100) 80%, transparent)}}.border-orange-200{border-color:var(--color-orange-200)}.border-rose-200{border-color:var(--color-rose-200)}.border-rose-300{border-color:var(--color-rose-300)}.border-rose-400{border-color:var(--color-rose-400)}.border-stone-300{border-color:var(--color-stone-300)}.border-transparent{border-color:#0000}.border-white{border-color:var(--color-white)}.border-white\/80{border-color:#fffc}@supports (color:color-mix(in lab, red, red)){.border-white\/80{border-color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.border-x-transparent{border-inline-color:#0000}.border-b-\[\#78b9ef\]{border-bottom-color:#78b9ef}.bg-\[\#7fcf9b\]{background-color:#7fcf9b}.bg-\[\#e8f7e9\]{background-color:#e8f7e9}.bg-\[\#eef7ff\]{background-color:#eef7ff}.bg-\[\#f3fbef\]{background-color:#f3fbef}.bg-\[\#f4bd62\]{background-color:#f4bd62}.bg-\[\#f4f1eb\]{background-color:#f4f1eb}.bg-\[\#f7f1e6\]{background-color:#f7f1e6}.bg-\[\#ff8b7d\]{background-color:#ff8b7d}.bg-\[\#ffc95d\]{background-color:#ffc95d}.bg-\[\#fff0eb\]{background-color:#fff0eb}.bg-\[\#fff3be\]{background-color:#fff3be}.bg-\[\#fff3df\]{background-color:#fff3df}.bg-\[\#fff8ea\]{background-color:#fff8ea}.bg-\[\#fff8ea\]\/90{background-color:#fff8eae6;background-color:lab(97.8453% .676304 7.62112/.9)}.bg-\[\#fff8eb\]{background-color:#fff8eb}.bg-\[\#fff8ec\]{background-color:#fff8ec}.bg-\[\#fffaf3\]{background-color:#fffaf3}.bg-\[\#fffaf3\]\/95{background-color:#fffaf3f2;background-color:lab(98.5176% .8322 3.98619/.95)}.bg-\[\#fffbeb\]{background-color:#fffbeb}.bg-\[\#fffdf8\]{background-color:#fffdf8}.bg-\[\#fffdf9\]{background-color:#fffdf9}.bg-\[\#fffdfa\]{background-color:#fffdfa}.bg-\[\#fffdfa\]\/90{background-color:#fffdfae6;background-color:lab(99.4017% .298113 1.68463/.9)}.bg-\[\#fffdfa\]\/95{background-color:#fffdfaf2;background-color:lab(99.4017% .298113 1.68463/.95)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-900{background-color:var(--color-amber-900)}.bg-black{background-color:var(--color-black)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-50\/50{background-color:#eff6ff80}@supports (color:color-mix(in lab, red, red)){.bg-blue-50\/50{background-color:color-mix(in oklab, var(--color-blue-50) 50%, transparent)}}.bg-blue-50\/60{background-color:#eff6ff99}@supports (color:color-mix(in lab, red, red)){.bg-blue-50\/60{background-color:color-mix(in oklab, var(--color-blue-50) 60%, transparent)}}.bg-blue-50\/70{background-color:#eff6ffb3}@supports (color:color-mix(in lab, red, red)){.bg-blue-50\/70{background-color:color-mix(in oklab, var(--color-blue-50) 70%, transparent)}}.bg-blue-50\/80{background-color:#eff6ffcc}@supports (color:color-mix(in lab, red, red)){.bg-blue-50\/80{background-color:color-mix(in oklab, var(--color-blue-50) 80%, transparent)}}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-100\/70{background-color:#dbeafeb3}@supports (color:color-mix(in lab, red, red)){.bg-blue-100\/70{background-color:color-mix(in oklab, var(--color-blue-100) 70%, transparent)}}.bg-blue-200{background-color:var(--color-blue-200)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-50\/80{background-color:#f0fdf4cc}@supports (color:color-mix(in lab, red, red)){.bg-green-50\/80{background-color:color-mix(in oklab, var(--color-green-50) 80%, transparent)}}.bg-green-50\/90{background-color:#f0fdf4e6}@supports (color:color-mix(in lab, red, red)){.bg-green-50\/90{background-color:color-mix(in oklab, var(--color-green-50) 90%, transparent)}}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-600{background-color:var(--color-green-600)}.bg-green-700{background-color:var(--color-green-700)}.bg-orange-50{background-color:var(--color-orange-50)}.bg-orange-50\/80{background-color:#fff7edcc}@supports (color:color-mix(in lab, red, red)){.bg-orange-50\/80{background-color:color-mix(in oklab, var(--color-orange-50) 80%, transparent)}}.bg-orange-100{background-color:var(--color-orange-100)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-100{background-color:var(--color-rose-100)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-stone-50{background-color:var(--color-stone-50)}.bg-stone-100{background-color:var(--color-stone-100)}.bg-stone-200{background-color:var(--color-stone-200)}.bg-stone-800{background-color:var(--color-stone-800)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/20{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.bg-white\/20{background-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.bg-white\/40{background-color:#fff6}@supports (color:color-mix(in lab, red, red)){.bg-white\/40{background-color:color-mix(in oklab, var(--color-white) 40%, transparent)}}.bg-white\/50{background-color:#ffffff80}@supports (color:color-mix(in lab, red, red)){.bg-white\/50{background-color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab, red, red)){.bg-white\/60{background-color:color-mix(in oklab, var(--color-white) 60%, transparent)}}.bg-white\/65{background-color:#ffffffa6}@supports (color:color-mix(in lab, red, red)){.bg-white\/65{background-color:color-mix(in oklab, var(--color-white) 65%, transparent)}}.bg-white\/70{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.bg-white\/70{background-color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.bg-white\/75{background-color:#ffffffbf}@supports (color:color-mix(in lab, red, red)){.bg-white\/75{background-color:color-mix(in oklab, var(--color-white) 75%, transparent)}}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab, red, red)){.bg-white\/80{background-color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.bg-white\/85{background-color:#ffffffd9}@supports (color:color-mix(in lab, red, red)){.bg-white\/85{background-color:color-mix(in oklab, var(--color-white) 85%, transparent)}}.bg-white\/90{background-color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.bg-white\/90{background-color:color-mix(in oklab, var(--color-white) 90%, transparent)}}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab, red, red)){.bg-white\/95{background-color:color-mix(in oklab, var(--color-white) 95%, transparent)}}.bg-white\/\[0\.92\]{background-color:#ffffffeb}@supports (color:color-mix(in lab, red, red)){.bg-white\/\[0\.92\]{background-color:color-mix(in oklab, var(--color-white) 92%, transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-\[linear-gradient\(\#f6dfb2_1px\,transparent_1px\)\,linear-gradient\(90deg\,\#f6dfb2_1px\,transparent_1px\)\]{background-image:linear-gradient(#f6dfb2 1px,#0000 1px),linear-gradient(90deg,#f6dfb2 1px,#0000 1px)}.bg-\[linear-gradient\(135deg\,rgba\(255\,248\,234\,0\.96\)\,rgba\(239\,249\,242\,0\.94\)\)\]{background-image:linear-gradient(135deg,#fff8eaf5,#eff9f2f0)}.bg-\[radial-gradient\(circle_at_top_left\,rgba\(255\,213\,144\,0\.5\)\,transparent_34rem\)\,radial-gradient\(circle_at_top_right\,rgba\(190\,235\,220\,0\.55\)\,transparent_32rem\)\,linear-gradient\(135deg\,\#fff8ef\,\#f7fbff_55\%\,\#fff8e8\)\]{background-image:radial-gradient(circle at 0 0,#ffd59080,#0000 34rem),radial-gradient(circle at 100% 0,#beebdc8c,#0000 32rem),linear-gradient(135deg,#fff8ef,#f7fbff 55%,#fff8e8)}.from-\[\#f47c70\]{--tw-gradient-from:#f47c70;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-\[\#fff7e8\]{--tw-gradient-from:#fff7e8;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-\[\#fff8ea\]{--tw-gradient-from:#fff8ea;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-amber-50{--tw-gradient-from:var(--color-amber-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-blue-50{--tw-gradient-from:var(--color-blue-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-green-50{--tw-gradient-from:var(--color-green-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-orange-50{--tw-gradient-from:var(--color-orange-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-amber-300{--tw-gradient-via:var(--color-amber-300);--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-white{--tw-gradient-via:var(--color-white);--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-\[\#f5bd4f\]{--tw-gradient-to:#f5bd4f;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-50{--tw-gradient-to:var(--color-cyan-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-emerald-50{--tw-gradient-to:var(--color-emerald-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-green-50{--tw-gradient-to:var(--color-green-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-green-300{--tw-gradient-to:var(--color-green-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-rose-50{--tw-gradient-to:var(--color-rose-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-white{--tw-gradient-to:var(--color-white);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-yellow-50{--tw-gradient-to:var(--color-yellow-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-\[size\:48px_48px\]{background-size:48px 48px}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-center{-o-object-position:center;object-position:center}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-7{padding:calc(var(--spacing) * 7)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-10{padding-inline:calc(var(--spacing) * 10)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-7{padding-block:calc(var(--spacing) * 7)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pr-1{padding-right:var(--spacing)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-10{padding-bottom:calc(var(--spacing) * 10)}.pb-28{padding-bottom:calc(var(--spacing) * 28)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.58em\]{font-size:.58em}.text-\[5\.5rem\]{font-size:5.5rem}.text-\[11px\]{font-size:11px}.text-\[12rem\]{font-size:12rem}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-8{--tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8)}.leading-9{--tw-leading:calc(var(--spacing) * 9);line-height:calc(var(--spacing) * 9)}.leading-10{--tw-leading:calc(var(--spacing) * 10);line-height:calc(var(--spacing) * 10)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.3em\]{--tw-tracking:.3em;letter-spacing:.3em}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.35em\]{--tw-tracking:.35em;letter-spacing:.35em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#2e3138\]{color:#2e3138}.text-\[\#8f4e2f\]{color:#8f4e2f}.text-\[\#565b63\]{color:#565b63}.text-\[\#737780\]{color:#737780}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-900\/10{color:#7b33061a}@supports (color:color-mix(in lab, red, red)){.text-amber-900\/10{color:color-mix(in oklab, var(--color-amber-900) 10%, transparent)}}.text-amber-900\/35{color:#7b330659}@supports (color:color-mix(in lab, red, red)){.text-amber-900\/35{color:color-mix(in oklab, var(--color-amber-900) 35%, transparent)}}.text-amber-950{color:var(--color-amber-950)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-blue-900{color:var(--color-blue-900)}.text-blue-950{color:var(--color-blue-950)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-green-900{color:var(--color-green-900)}.text-green-950{color:var(--color-green-950)}.text-orange-700{color:var(--color-orange-700)}.text-orange-800{color:var(--color-orange-800)}.text-rose-500{color:var(--color-rose-500)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-rose-900{color:var(--color-rose-900)}.text-rose-950{color:var(--color-rose-950)}.text-stone-300{color:var(--color-stone-300)}.text-stone-400{color:var(--color-stone-400)}.text-stone-500{color:var(--color-stone-500)}.text-stone-600{color:var(--color-stone-600)}.text-stone-700{color:var(--color-stone-700)}.text-stone-800{color:var(--color-stone-800)}.text-stone-900{color:var(--color-stone-900)}.text-white{color:var(--color-white)}.text-white\/85{color:#ffffffd9}@supports (color:color-mix(in lab, red, red)){.text-white\/85{color:color-mix(in oklab, var(--color-white) 85%, transparent)}}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.accent-orange-500{accent-color:var(--color-orange-500)}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_10px_24px_rgba\(244\,124\,112\,0\.28\)\]{--tw-shadow:0 10px 24px var(--tw-shadow-color,#f47c7047);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_12px_28px_rgba\(244\,124\,112\,0\.22\)\]{--tw-shadow:0 12px 28px var(--tw-shadow-color,#f47c7038);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_14px_30px_rgba\(244\,124\,112\,0\.22\)\]{--tw-shadow:0 14px 30px var(--tw-shadow-color,#f47c7038);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_14px_30px_rgba\(244\,124\,112\,0\.24\)\]{--tw-shadow:0 14px 30px var(--tw-shadow-color,#f47c703d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_18px_45px_rgba\(74\,55\,32\,0\.12\)\]{--tw-shadow:0 18px 45px var(--tw-shadow-color,#4a37201f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_24px_60px_rgba\(93\,75\,55\,0\.12\)\]{--tw-shadow:0 24px 60px var(--tw-shadow-color,#5d4b371f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_24px_70px_rgba\(74\,55\,32\,0\.16\)\]{--tw-shadow:0 24px 70px var(--tw-shadow-color,#4a372029);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-4{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-amber-100{--tw-ring-color:var(--color-amber-100)}.ring-blue-100{--tw-ring-color:var(--color-blue-100)}.ring-green-100{--tw-ring-color:var(--color-green-100)}.ring-orange-100{--tw-ring-color:var(--color-orange-100)}.ring-rose-100{--tw-ring-color:var(--color-rose-100)}.ring-transparent{--tw-ring-color:transparent}.ring-white{--tw-ring-color:var(--color-white)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-2xl{--tw-backdrop-blur:blur(var(--blur-2xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:translate-x-0\.5:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:bg-amber-50:is(:where(.group):hover *){background-color:var(--color-amber-50)}}.last\:border-r-0:last-child{border-right-style:var(--tw-border-style);border-right-width:0}@media (hover:hover){.hover\:-translate-y-0\.5:hover{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:-translate-y-1:hover{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:border-amber-100:hover{border-color:var(--color-amber-100)}.hover\:border-amber-200:hover{border-color:var(--color-amber-200)}.hover\:border-amber-300:hover{border-color:var(--color-amber-300)}.hover\:border-blue-200:hover{border-color:var(--color-blue-200)}.hover\:border-blue-300:hover{border-color:var(--color-blue-300)}.hover\:bg-\[\#d9f5df\]:hover{background-color:#d9f5df}.hover\:bg-\[\#ee625c\]:hover{background-color:#ee625c}.hover\:bg-\[\#ffe8bd\]:hover{background-color:#ffe8bd}.hover\:bg-\[\#fff1d8\]:hover{background-color:#fff1d8}.hover\:bg-amber-50:hover{background-color:var(--color-amber-50)}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-blue-50:hover{background-color:var(--color-blue-50)}.hover\:bg-blue-100:hover{background-color:var(--color-blue-100)}.hover\:bg-blue-200:hover{background-color:var(--color-blue-200)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-green-100:hover{background-color:var(--color-green-100)}.hover\:bg-rose-50:hover{background-color:var(--color-rose-50)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:text-\[\#8f4e2f\]:hover{color:#8f4e2f}.hover\:text-amber-900:hover{color:var(--color-amber-900)}.hover\:text-blue-800:hover{color:var(--color-blue-800)}.hover\:text-rose-700:hover{color:var(--color-rose-700)}.hover\:brightness-105:hover{--tw-brightness:brightness(105%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.focus\:border-amber-200:focus{border-color:var(--color-amber-200)}.focus\:border-blue-300:focus{border-color:var(--color-blue-300)}.focus\:bg-white:focus{background-color:var(--color-white)}.focus\:ring-4:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-green-100:focus{--tw-ring-color:var(--color-green-100)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:bg-\[\#e8f7e9\]:focus-visible{background-color:#e8f7e9}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:translate-y-0:active{--tw-translate-y:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\:scale-\[0\.98\]:active{scale:.98}.active\:scale-\[0\.99\]:active{scale:.99}.disabled\:translate-y-0:disabled{--tw-translate-y:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:bg-green-200:disabled{background-color:var(--color-green-200)}.disabled\:bg-stone-300:disabled{background-color:var(--color-stone-300)}.disabled\:text-green-800:disabled{color:var(--color-green-800)}.disabled\:text-stone-600:disabled{color:var(--color-stone-600)}.disabled\:opacity-35:disabled{opacity:.35}.disabled\:opacity-45:disabled{opacity:.45}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-55:disabled{opacity:.55}.disabled\:opacity-60:disabled{opacity:.6}.disabled\:opacity-70:disabled{opacity:.7}@media (min-width:40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-start-2{grid-column-start:2}.sm\:col-end-5{grid-column-end:5}.sm\:h-10{height:calc(var(--spacing) * 10)}.sm\:h-\[420px\]{height:420px}.sm\:w-10{width:calc(var(--spacing) * 10)}.sm\:w-auto{width:auto}.sm\:max-w-none{max-width:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:grid-cols-\[2\.5rem_minmax\(0\,1fr\)_minmax\(0\,1fr\)_auto\]{grid-template-columns:2.5rem minmax(0,1fr) minmax(0,1fr) auto}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-5{gap:calc(var(--spacing) * 5)}.sm\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.sm\:p-3{padding:calc(var(--spacing) * 3)}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-7{padding:calc(var(--spacing) * 7)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:p-10{padding:calc(var(--spacing) * 10)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-7{padding-inline:calc(var(--spacing) * 7)}.sm\:pt-7{padding-top:calc(var(--spacing) * 7)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-\[16rem\]{font-size:16rem}}@media (min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:items-start{align-items:flex-start}.md\:justify-between{justify-content:space-between}.md\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.md\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.md\:p-5{padding:calc(var(--spacing) * 5)}.md\:p-7{padding:calc(var(--spacing) * 7)}.md\:p-8{padding:calc(var(--spacing) * 8)}.md\:p-9{padding:calc(var(--spacing) * 9)}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:px-8{padding-inline:calc(var(--spacing) * 8)}.md\:py-10{padding-block:calc(var(--spacing) * 10)}.md\:pr-4{padding-right:calc(var(--spacing) * 4)}.md\:pb-0{padding-bottom:0}.md\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.md\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.md\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.md\:leading-8{--tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8)}}@media (min-width:64rem){.lg\:ml-64{margin-left:calc(var(--spacing) * 64)}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-\[0\.8fr_1\.2fr\]{grid-template-columns:.8fr 1.2fr}.lg\:grid-cols-\[0\.9fr_1\.1fr\]{grid-template-columns:.9fr 1.1fr}.lg\:grid-cols-\[0\.85fr_1\.15fr\]{grid-template-columns:.85fr 1.15fr}.lg\:grid-cols-\[1\.1fr_0\.9fr\]{grid-template-columns:1.1fr .9fr}.lg\:grid-cols-\[1\.08fr_0\.92fr\]{grid-template-columns:1.08fr .92fr}.lg\:grid-cols-\[1\.12fr_0\.88fr\]{grid-template-columns:1.12fr .88fr}.lg\:grid-cols-\[1\.15fr_0\.85fr\]{grid-template-columns:1.15fr .85fr}.lg\:grid-cols-\[1fr_1\.1fr\]{grid-template-columns:1fr 1.1fr}.lg\:grid-cols-\[1fr_1fr\]{grid-template-columns:1fr 1fr}.lg\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.lg\:grid-cols-\[220px_1fr\]{grid-template-columns:220px 1fr}.lg\:grid-cols-\[minmax\(0\,1\.35fr\)_minmax\(260px\,0\.65fr\)\]{grid-template-columns:minmax(0,1.35fr) minmax(260px,.65fr)}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:items-end{align-items:flex-end}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.lg\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.lg\:p-10{padding:calc(var(--spacing) * 10)}.lg\:px-10{padding-inline:calc(var(--spacing) * 10)}.lg\:px-12{padding-inline:calc(var(--spacing) * 12)}.lg\:py-6{padding-block:calc(var(--spacing) * 6)}.lg\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}}@media (min-width:80rem){.xl\:sticky{position:sticky}.xl\:top-6{top:calc(var(--spacing) * 6)}.xl\:block{display:block}.xl\:flex{display:flex}.xl\:min-w-\[520px\]{min-width:520px}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-\[0\.9fr_1\.1fr\]{grid-template-columns:.9fr 1.1fr}.xl\:grid-cols-\[0\.95fr_1\.05fr\]{grid-template-columns:.95fr 1.05fr}.xl\:grid-cols-\[1\.2fr_0\.8fr\]{grid-template-columns:1.2fr .8fr}.xl\:grid-cols-\[1\.05fr_0\.95fr\]{grid-template-columns:1.05fr .95fr}.xl\:grid-cols-\[1fr_0\.9fr\]{grid-template-columns:1fr .9fr}.xl\:grid-cols-\[1fr_0\.95fr\]{grid-template-columns:1fr .95fr}.xl\:flex-row{flex-direction:row}.xl\:items-start{align-items:flex-start}.xl\:justify-between{justify-content:space-between}}}*{box-sizing:border-box}html{scroll-behavior:smooth;width:100%;max-width:100%;overflow-x:clip}body{color:#2e3138;-webkit-text-size-adjust:100%;background:linear-gradient(135deg,#fff8ef 0%,#f5fbfa 52%,#f7fbff 100%);width:100%;max-width:100%;min-height:100vh;margin:0;font-family:GenSenRounded TW,GenSenRounded,"jf open 粉圓 2.0",Microsoft JhengHei,PingFang TC,system-ui,sans-serif;overflow-x:clip}main,section,article,header,nav,main *{min-width:0}img,video,canvas{max-width:100%}a{color:inherit;text-decoration:none}button,input,textarea,select{font:inherit}button,a{-webkit-tap-highlight-color:transparent}button:focus-visible,a:focus-visible,input:focus-visible,textarea:focus-visible,select:focus-visible{outline-offset:3px;outline:3px solid #f47c7059}.home-page{background:#fff8ef;min-height:100vh;padding:18px}.home-shell{width:min(1240px,100%);margin:0 auto}.home-nav{justify-content:space-between;align-items:center;gap:20px;min-height:68px;padding:0 4px 16px;display:flex}.home-brand{align-items:center;gap:12px;min-width:0;display:inline-flex}.home-brand-mark{color:#fff;background:#f47c70;border-radius:16px;flex:none;place-items:center;width:48px;height:48px;font-size:24px;display:grid;box-shadow:0 12px 28px #f47c703d}.home-brand strong,.home-brand small{display:block}.home-brand strong{font-size:23px;font-weight:900}.home-brand small{color:#78716c;margin-top:2px;font-size:13px;font-weight:700}.home-nav-actions,.home-hero-actions{flex-wrap:wrap;gap:10px;display:flex}.home-nav-link,.home-nav-button,.home-primary-button,.home-secondary-button{border-radius:16px;justify-content:center;align-items:center;font-weight:900;transition:transform .18s,background-color .18s,box-shadow .18s;display:inline-flex}.home-nav-link,.home-nav-button{min-height:46px;padding:0 18px}.home-nav-link,.home-secondary-button{color:#925126;background:#ffffffe0;border:1px solid #eadfce}.home-nav-button,.home-primary-button{color:#fff;background:#f47c70;box-shadow:0 16px 36px #f47c7042}.home-nav-link:hover,.home-nav-button:hover,.home-primary-button:hover,.home-secondary-button:hover,.home-feature-card:hover{transform:translateY(-2px)}.home-nav-link:active,.home-nav-button:active,.home-primary-button:active,.home-secondary-button:active,.home-feature-card:active{transform:translateY(0)scale(.99)}.home-hero{background-image:linear-gradient(90deg,#fff9f1fc 0%,#fff9f1f0 34%,#fff9f18a 55%,#fff9f10d 76%),url(/images/chenguang-family.webp);background-position:50%;background-size:cover;border:1px solid #eadfce;border-radius:32px;align-items:center;min-height:min(640px,68svh);display:flex;position:relative;overflow:hidden;box-shadow:0 28px 70px #89683d21}.home-hero-copy{z-index:1;width:min(620px,58%);padding:clamp(34px,6vw,78px);position:relative}.home-eyebrow{color:#a95320;letter-spacing:0;margin:0;font-size:14px;font-weight:900}.home-hero h1{color:#2e3138;letter-spacing:0;max-width:580px;margin:16px 0 0;font-size:clamp(44px,6vw,72px);font-weight:950;line-height:1.12}.home-hero-lead{color:#57534e;max-width:560px;margin:22px 0 0;font-size:clamp(17px,1.7vw,21px);font-weight:700;line-height:1.8}.home-hero-actions{margin-top:28px}.home-primary-button,.home-secondary-button{min-height:56px;padding:0 24px;font-size:17px}.home-hero-note{color:#78716c;max-width:520px;margin:18px 0 0;font-size:13px;font-weight:700;line-height:1.7}.home-steps{background:#ffffffe6;border:1px solid #eadfce;border-radius:24px;grid-template-columns:repeat(4,minmax(0,1fr));margin-top:16px;display:grid;overflow:hidden;box-shadow:0 16px 44px #89683d14}.home-step{align-items:flex-start;gap:12px;min-width:0;padding:20px;display:flex}.home-step+.home-step{border-left:1px solid #eadfce}.home-step>span{color:#f47c70;font-size:13px;font-weight:950}.home-step strong,.home-step p{margin:0;display:block}.home-step strong{font-size:15px;font-weight:900}.home-step p{color:#78716c;margin-top:5px;font-size:13px;font-weight:650;line-height:1.55}.home-features{padding:80px 0 48px}.home-features>header{max-width:720px}.home-features h2{margin:10px 0 0;font-size:clamp(32px,4vw,48px);font-weight:950;line-height:1.2}.home-features>header>p:last-child{color:#78716c;margin:14px 0 0;font-size:17px;font-weight:650;line-height:1.7}.home-feature-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin-top:30px;display:grid}.home-feature-card{background:#ffffffe6;border:1px solid #eadfce;border-radius:28px;flex-direction:column;min-height:280px;padding:28px;transition:transform .18s,box-shadow .18s;display:flex;box-shadow:0 18px 48px #89683d17}.home-feature-card:nth-child(2){background:#f1faf4}.home-feature-card:nth-child(3){background:#f3f8ff}.home-feature-number{color:#a95320;background:#fff1d9;border-radius:16px;place-items:center;width:48px;height:48px;font-weight:950;display:grid}.home-feature-card h3{margin:22px 0 0;font-size:26px;font-weight:950}.home-feature-card p{color:#69635d;margin:12px 0 0;font-size:16px;font-weight:650;line-height:1.75}.home-feature-card>strong{color:#a95320;margin-top:auto;padding-top:24px;font-size:14px;font-weight:950}.bg-coral{background-color:#f47c70!important}.bg-butter{background-color:#fff1d9!important}.bg-cream{background-color:#fff8f0!important}.bg-mint{background-color:#dff5df!important}.bg-honey{background-color:#f5bd4f!important}.text-ink{color:#2e3138!important}.text-coral{color:#f47c70!important}.border-softline,[class*=border-softline]{border-color:#eadfce!important}.shadow-warm{box-shadow:0 24px 70px #89683d24!important}.rounded-warm{border-radius:1.75rem!important}.app-reading-scale{font-size:1.1rem}.app-reading-scale .text-xs{font-size:.825rem!important}.app-reading-scale .text-sm{font-size:.9625rem!important}.app-reading-scale .text-base{font-size:1.1rem!important}.app-reading-scale .text-lg{font-size:1.2375rem!important}.app-reading-scale .text-xl{font-size:1.375rem!important}.app-reading-scale .text-2xl{font-size:1.65rem!important}.app-reading-scale .text-3xl{font-size:2.0625rem!important}.app-reading-scale .text-4xl{font-size:2.475rem!important}.app-reading-scale .text-5xl{font-size:3.3rem!important;line-height:1.12!important}.app-reading-scale .text-6xl{font-size:4.125rem!important;line-height:1.08!important}@media (max-width:900px){.home-page{padding:12px}.home-nav{gap:10px;padding-bottom:12px}.home-brand small,.home-nav-link{display:none}.home-nav-button{min-height:44px;padding:0 16px}.home-hero{background-image:linear-gradient(#fff9f10f 0%,#fff9f142 35%,#fff9f1fa 68%,#fff9f1 100%),url(/images/chenguang-family.webp);background-position:64%;border-radius:26px;align-items:flex-end;min-height:640px}.home-hero-copy{width:100%;padding:28px 22px}.home-hero h1{max-width:360px;font-size:39px;line-height:1.16}.home-hero-lead{font-size:16px;line-height:1.7}.home-hero-actions{grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.home-primary-button,.home-secondary-button{min-width:0;min-height:52px;padding:0 12px;font-size:15px}.home-steps{grid-template-columns:repeat(2,minmax(0,1fr))}.home-step+.home-step{border-left:0}.home-step:nth-child(2n){border-left:1px solid #eadfce}.home-step:nth-child(n+3){border-top:1px solid #eadfce}.home-step{padding:16px 13px}.home-features{padding-top:56px}.home-feature-grid{grid-template-columns:1fr}.home-feature-card{border-radius:24px;min-height:230px;padding:24px}input,textarea,select{font-size:16px}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}
_next/static/chunks/1kuwwi-pzktjs.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return i},formatWithValidation:function(){return c},urlObjectKeys:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let l=e.r(90809)._(e.r(98183)),s=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:r}=e,n=e.protocol||"",a=e.pathname||"",i=e.hash||"",o=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),o&&"object"==typeof o&&(o=String(l.urlQueryToSearchParams(o)));let d=e.search||o&&`?${o}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||s.test(n))&&!1!==c?(c="//"+(c||""),a&&"/"!==a[0]&&(a="/"+a)):c||(c=""),i&&"#"!==i[0]&&(i="#"+i),d&&"?"!==d[0]&&(d="?"+d),a=a.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${n}${c}${a}${d}${i}`}let o=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return i(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t){let r=(0,n.useRef)(null),a=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(r.current=l(e,n)),t&&(a.current=l(t,n))},[e,t])}function l(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return l}});let n=e.r(18967),a=e.r(52817);function l(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,a.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return p},useLinkStatus:function(){return w}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let l=e.r(90809),s=e.r(43476),i=l._(e.r(71645)),o=e.r(95057),c=e.r(8372),d=e.r(18581),u=e.r(18967),h=e.r(5550);e.r(33525);let m=e.r(88540),f=e.r(91949),x=e.r(73668),g=e.r(9396);function p(t){var r,n;let a,l,p,[w,v]=(0,i.useOptimistic)(f.IDLE_LINK_STATUS),j=(0,i.useRef)(null),{href:y,as:N,children:k,prefetch:S=null,passHref:P,replace:$,shallow:E,scroll:C,onClick:L,onMouseEnter:R,onTouchStart:I,legacyBehavior:_=!1,onNavigate:A,transitionTypes:O,ref:T,unstable_dynamicOnHover:M,...B}=t;a=k,_&&("string"==typeof a||"number"==typeof a)&&(a=(0,s.jsx)("a",{children:a}));let U=i.default.useContext(c.AppRouterContext),H=!1!==S,z=!1!==S?null===(n=S)||"auto"===n?g.FetchStrategy.PPR:g.FetchStrategy.Full:g.FetchStrategy.PPR,D="string"==typeof(r=N||y)?r:(0,o.formatUrl)(r);if(_){if(a?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});l=i.default.Children.only(a)}let W=_?l&&"object"==typeof l&&l.ref:T,F=i.default.useCallback(e=>(null!==U&&(j.current=(0,f.mountLinkInstance)(e,D,U,z,H,v)),()=>{j.current&&((0,f.unmountLinkForCurrentNavigation)(j.current),j.current=null),(0,f.unmountPrefetchableInstance)(e)}),[H,D,U,z,v]),K={ref:(0,d.useMergedRef)(F,W),onClick(t){_||"function"!=typeof L||L(t),_&&l.props&&"function"==typeof l.props.onClick&&l.props.onClick(t),!U||t.defaultPrevented||function(t,r,n,a,l,s,o){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,x.isLocalURL)(r)){a&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),s){let e=!1;if(s({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);i.default.startTransition(()=>{u(r,a?"replace":"push",!1===l?m.ScrollBehavior.NoScroll:m.ScrollBehavior.Default,n.current,o)})}}(t,D,j,$,C,A,O)},onMouseEnter(e){_||"function"!=typeof R||R(e),_&&l.props&&"function"==typeof l.props.onMouseEnter&&l.props.onMouseEnter(e),U&&H&&(0,f.onNavigationIntent)(e.currentTarget,!0===M)},onTouchStart:function(e){_||"function"!=typeof I||I(e),_&&l.props&&"function"==typeof l.props.onTouchStart&&l.props.onTouchStart(e),U&&H&&(0,f.onNavigationIntent)(e.currentTarget,!0===M)}};return(0,u.isAbsoluteUrl)(D)?K.href=D:_&&!P&&("a"!==l.type||"href"in l.props)||(K.href=(0,h.addBasePath)(D)),p=_?i.default.cloneElement(l,K):(0,s.jsx)("a",{...B,...K,children:a}),(0,s.jsx)(b.Provider,{value:w,children:p})}e.r(84508);let b=(0,i.createContext)(f.IDLE_LINK_STATUS),w=()=>(0,i.useContext)(b);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},14876,e=>{"use strict";var t=e.i(43476),r=e.i(22016);function n(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:r,suffix:n}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===r?`/index.html${n}`:/\.[a-z0-9]+$/i.test(r)?e:`${r.replace(/\/+$/,"")}/index.html${n}`}e.s(["ExportSafeLink",0,function({href:e,children:a,...l}){return"string"==typeof e?(0,t.jsx)("a",{href:n(e),...l,children:a}):(0,t.jsx)(r.default,{href:e,...l,children:a})},"getExportSafeHref",0,n])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let r=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function n(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return r.find(t=>t.grade===e)},"getGradeIdByNumber",0,n,"grades",0,r],62312);let a=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],l={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function s(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.find(e=>e.id===t)??l}function i(e){if(!e)return l.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.some(e=>e.id===t)?t:l.id}e.s(["currentStudent",0,l,"getCurrentStudentGradeId",0,function(e=l){return n(e.grade)},"getPersonById",0,s,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,a,"normalizePersonId",0,i],7728);let o="chenguang-active-person-id",c="chenguang-active-person-change",d="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,r]=(0,t.useState)(l.id),[n,a]=(0,t.useState)(!1),[h,m]=(0,t.useState)(!1);function f(e){let t=i(e);r(t),window.localStorage.setItem(o,t),window.dispatchEvent(new Event(c))}return(0,t.useEffect)(()=>{let e=i(window.localStorage.getItem(o));function t(){let e=i(window.localStorage.getItem(o));r(e),window.localStorage.setItem(o,e)}function n(){a(!!window.localStorage.getItem(d))}return r(e),window.localStorage.setItem(o,e),a(!!window.localStorage.getItem(d)),m(!0),window.addEventListener(c,t),window.addEventListener("storage",t),window.addEventListener(u,n),()=>{window.removeEventListener(c,t),window.removeEventListener("storage",t),window.removeEventListener(u,n)}},[]),{person:s(e),switchPerson:f,signIn:function(e){let t=i(e);f(t);let r=s(t);window.localStorage.setItem(d,JSON.stringify({personId:t,role:r.role,signedInAt:new Date().toISOString()})),a(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(d),a(!1),window.dispatchEvent(new Event(u))},isLoggedIn:n,isReady:h}}],41324)},82697,e=>{"use strict";var t=e.i(43476),r=e.i(14876),n=e.i(7728),a=e.i(62312),l=e.i(41324);e.s(["BrandHeader",0,function({showPerson:e=!0}){let{person:s,isLoggedIn:i}=(0,l.useActivePerson)(),o=(0,a.getGradeByNumber)(s.grade),c=i?`${(0,n.getPersonDisplayName)(s)}|${"student"===s.role?(0,n.getPersonSubtitle)(s):o?.shortName??`小${s.grade}`}`:"訪客模式";return(0,t.jsxs)(r.ExportSafeLink,{href:i?"/dashboard":"/",className:"flex min-w-0 items-center gap-3 text-ink",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 shrink-0 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{className:"min-w-0 leading-tight",children:[(0,t.jsx)("strong",{className:"block truncate text-xl font-black",children:"晨光"}),(0,t.jsx)("small",{className:"block truncate text-sm font-bold text-stone-500",children:e?c:"國小學習陪跑系統"})]})]})}])},18566,(e,t,r)=>{t.exports=e.r(76562)},22468,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),l=e.i(7728),s=e.i(62312),i=e.i(41324);let o=[{label:"登入",href:"/login"},{label:"訪客體驗",href:"/courses"},{label:"註冊登入",href:"/register",primary:!0}];function c(e,t="student"){let r=[{label:"課程首頁",href:"/dashboard",icon:"⌂"},{label:"每日 10 題",href:"/daily-quiz",icon:"10"},{label:"錯題 AI 說明",href:"/wrong-review",icon:"AI"},{label:"進度月曆",href:"/parent-weekly-report",icon:"月"},{label:"英文練習",href:"/practice",icon:"Aa"},{label:"手寫出題",href:"/word-scanner",icon:"掃"},{label:"課程總覽",href:"/courses",icon:"▦"},{label:"國語練習",href:`/courses/grade-${e}/chinese/basic`,icon:"ㄅ"},{label:"數學練習",href:`/courses/grade-${e}/math/basic`,icon:"123"},{label:"每日紀錄",href:"/daily-record",icon:"✓"},{label:"週計畫",href:"/weekly-plan",icon:"□"},{label:"登出",href:"/",icon:"出"}];return"parent"===t?r.filter(e=>["課程首頁","進度月曆","每日紀錄","週計畫","課程總覽","登出"].includes(e.label)):"teacher"===t?r.filter(e=>["課程首頁","課程總覽","國語練習","英文練習","數學練習","週計畫","手寫出題","登出"].includes(e.label)):r.filter(e=>["課程首頁","每日 10 題","英文練習","國語練習","數學練習","手寫出題","錯題 AI 說明","登出"].includes(e.label))}function d(e,t){return"/dashboard"===t?"/dashboard"===e:"/courses"===t?"/courses"===e:t.startsWith("/courses/")?e===t||e.startsWith(`${t}/`):e===t}function u({compact:e=!1}){let{person:n}=(0,i.useActivePerson)(),[a,o]=(0,r.useState)(!1),c=(0,s.getGradeByNumber)(n.grade),d="student"===n.role?(0,l.getPersonSubtitle)(n):c?.name??`國小${n.grade}年級`,h=(0,t.jsx)("div",{className:"grid gap-2",children:l.mockPeople.map(e=>{let r=(0,s.getGradeByNumber)(e.grade),a=e.id===n.id;return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;let r;return t=e.id,o(!1),r=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login",void window.location.assign(`${r}?person=${encodeURIComponent(t)}`)},className:`rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${a?"bg-coral text-white shadow-sm":"bg-white text-stone-700 hover:bg-butter"}`,children:[(0,t.jsxs)("span",{className:"block text-xs font-black opacity-80",children:[(0,l.getRoleLabel)(e.role),"模式"]}),(0,t.jsx)("span",{className:"mt-1 block text-base font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-75",children:"student"===e.role?(0,l.getPersonSubtitle)(e):r?.name??`國小${e.grade}年級`})]},e.id)})});return e?(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>o(e=>!e),className:"flex min-h-11 max-w-[5.5rem] items-center gap-1 rounded-2xl bg-butter px-2 text-left text-amber-950 shadow-sm sm:max-w-none sm:gap-2 sm:px-3","aria-expanded":a,"aria-label":"切換目前使用者",children:[(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("strong",{className:"block max-w-20 truncate text-sm font-black",children:n.name}),(0,t.jsx)("small",{className:"block text-[11px] font-bold opacity-70",children:c?.shortName??`小${n.grade}`})]}),(0,t.jsx)("span",{"aria-hidden":"true",className:"text-xs",children:"⌄"})]}),a?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100vh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsx)("strong",{className:"text-base font-black text-ink",children:"切換使用者"}),(0,t.jsx)("button",{type:"button",onClick:()=>o(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉帳號選單",children:"×"})]}),h]}):null]}):(0,t.jsxs)("section",{className:"rounded-3xl border border-amber-100 bg-cream p-3 shadow-sm",children:[(0,t.jsx)("button",{type:"button",onClick:()=>o(e=>!e),className:"w-full rounded-[1.35rem] bg-white/80 p-3 text-left ring-1 ring-transparent transition hover:bg-white hover:ring-coral/30","aria-expanded":a,"aria-label":"切換目前使用者",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("p",{className:"text-xs font-black text-amber-700",children:[(0,l.getRoleLabel)(n.role),"模式"]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-2xl font-black leading-tight text-ink",children:n.name}),(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"student"===n.role?"匿名檔案":(0,l.getRoleLabel)(n.role)})]}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:d})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-coral px-3 py-2 text-xs font-black text-white shadow-sm",children:"切換帳號"})]})}),a?(0,t.jsx)("div",{className:"mt-3",children:h}):null]})}e.s(["AppSidebar",0,function(){let e=(0,n.usePathname)(),{person:r,isLoggedIn:l,signOut:s}=(0,i.useActivePerson)();function h(){s();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsx)("aside",{className:"fixed inset-y-0 left-0 z-20 hidden w-64 flex-col border-r border-softline/80 bg-white/85 backdrop-blur-xl lg:flex",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 py-6",children:[(0,t.jsxs)(a.ExportSafeLink,{className:"flex items-center gap-3",href:l?"/dashboard":"/",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"text-sm font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),l?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{}),(0,t.jsx)("nav",{className:"grid gap-2 pr-1",children:c(r.grade,r.role).map(r=>{let n=d(e,r.href),l=`flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left transition ${n?"bg-butter text-amber-900 shadow-sm":"text-stone-600 hover:bg-butter hover:text-amber-900"}`,s=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 place-items-center rounded-xl text-sm font-black shadow-sm ${n?"bg-white text-coral":"bg-white text-stone-500"}`,children:r.icon}),(0,t.jsx)("span",{className:"font-bold",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:h,className:l,children:s},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,className:l,children:s},r.label)})})]}):(0,t.jsx)("div",{className:"grid gap-3",children:o.map(e=>(0,t.jsx)(a.ExportSafeLink,{href:e.href,className:e.primary?"rounded-2xl bg-coral px-4 py-3 text-center font-black text-white shadow-warm transition hover:brightness-105":"rounded-2xl border border-softline bg-white px-4 py-3 text-center font-black text-amber-800 transition hover:bg-butter",children:e.label},e.label))}),l?(0,t.jsxs)(a.ExportSafeLink,{href:"student"===r.role?"/wrong-review":"/parent-weekly-report",className:"mt-auto rounded-2xl border border-green-100 bg-green-50 p-4 text-sm text-green-900 transition hover:-translate-y-0.5 hover:bg-green-100",children:[(0,t.jsx)("span",{className:"block text-xs font-black text-green-700",children:"本週學習摘要"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg",children:"每天一小步,進度看得見"}),(0,t.jsx)("span",{className:"mt-2 block font-bold text-green-700",children:"查看進度與需要再練的內容 →"})]}):null]})})},"MobileMenu",0,function(){let e=(0,n.usePathname)(),{person:l,signOut:s}=(0,i.useActivePerson)(),[o,u]=(0,r.useState)(!1),h=c(l.grade,l.role);function m(){s();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsxs)("div",{className:"shrink-0 lg:hidden",children:[(0,t.jsx)("button",{type:"button",onClick:()=>u(e=>!e),className:"grid min-h-11 min-w-11 place-items-center rounded-2xl bg-white text-xl font-black text-amber-900 shadow-sm active:scale-[0.98]","aria-expanded":o,"aria-label":"開啟完整功能選單",children:o?"×":"☰"}),o?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100dvh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("strong",{className:"block text-base font-black text-ink",children:"全部功能"}),(0,t.jsxs)("span",{className:"text-xs font-bold text-stone-500",children:["依 ",l.name," 的身分顯示"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉功能選單",children:"×"})]}),(0,t.jsx)("nav",{className:"grid grid-cols-2 gap-2",children:h.map(r=>{let n=d(e,r.href),l=`flex min-h-16 items-center gap-3 rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${n?"bg-coral text-white":"bg-white text-stone-700"}`,s=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 shrink-0 place-items-center rounded-xl text-sm font-black ${n?"bg-white/20":"bg-butter text-amber-900"}`,children:r.icon}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:m,className:l,children:s},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,onClick:()=>u(!1),className:l,children:s},r.label)})})]}):null]})},"MobileQuickNav",0,function(){var e;let r,l=(0,n.usePathname)(),{person:s}=(0,i.useActivePerson)(),o=(r=c(s.grade,e=s.role),("guest"===e?["課程首頁","課程總覽"]:({student:["課程首頁","每日 10 題","英文練習","課程總覽"],parent:["課程首頁","進度月曆","每日紀錄","週計畫"],teacher:["課程首頁","課程總覽","週計畫","手寫出題"]})[e]).map(e=>r.find(t=>t.label===e)).filter(e=>!!e));return(0,t.jsx)("nav",{className:"fixed inset-x-3 bottom-[max(0.75rem,env(safe-area-inset-bottom))] z-50 grid grid-cols-4 gap-1 rounded-3xl border border-white/80 bg-white/90 p-2 shadow-warm backdrop-blur-xl lg:hidden","aria-label":"主要功能",children:o.map(e=>{let r=d(l,e.href);return(0,t.jsxs)(a.ExportSafeLink,{href:e.href,className:`flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl px-1 py-2 text-center transition active:scale-[0.98] ${r?"bg-coral text-white shadow-sm":"text-stone-600"}`,children:[(0,t.jsx)("span",{className:"text-sm font-black",children:e.icon}),(0,t.jsx)("span",{className:"w-full truncate text-[11px] font-black",children:e.label})]},e.label)})})},"PersonSwitcher",0,u])},55634,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),l=e.i(41324);e.s(["ActiveGradeRouteSync",0,function(){let e=(0,n.usePathname)(),{person:s,isLoggedIn:i,isReady:o}=(0,l.useActivePerson)(),c=function(e){let t=e.match(/^\/learn\/(?:grade-)?([1-6])(?:\/|$)/);if(t)return Number(t[1]);let r=e.match(/^\/courses\/grade-([1-6])(?:\/|$)/);if(r)return Number(r[1]);let n=e.match(/^\/(?:lesson|practice|handwriting)\/grade-([1-6])-/);return n?Number(n[1]):null}(e),d=!!(o&&i&&"student"===s.role&&c&&c!==s.grade);return((0,r.useEffect)(()=>{var t;if(!d)return;let r=(t=s.grade,/^\/learn\/(?:grade-)?[1-6](?:\/|$)/.test(e)?e.replace(/^\/learn\/(?:grade-)?[1-6]/,`/learn/${t}`):/^\/courses\/grade-[1-6](?:\/|$)/.test(e)?e.replace(/^\/courses\/grade-[1-6]/,`/courses/grade-${t}`):e.replace(/^(\/(?:lesson|practice|handwriting)\/)grade-[1-6]-/,`$1grade-${t}-`)),n=`${(0,a.getExportSafeHref)(r)}${window.location.search}${window.location.hash}`;window.location.replace(n)},[e,s.grade,d]),o&&!d)?null:(0,t.jsx)("div",{className:"fixed inset-0 z-[100] grid place-items-center bg-[#fffaf3]/95 p-5 backdrop-blur-md",role:"status","aria-live":"polite",children:(0,t.jsxs)("div",{className:"w-full max-w-md rounded-[2rem] border border-white bg-white/90 p-7 text-center shadow-warm",children:[(0,t.jsx)("span",{className:"mx-auto grid h-14 w-14 place-items-center rounded-2xl bg-butter text-2xl","aria-hidden":"true",children:"☀"}),(0,t.jsx)("strong",{className:"mt-4 block text-2xl font-black text-ink",children:o?`正在切換到小${s.grade}課程`:"正在讀取目前學習年級"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"晨光會自動載入這位學習者正確的課程內容。"})]})})}],55634)},10400,e=>{"use strict";var t=e.i(43476),r=e.i(82697),n=e.i(22468),a=e.i(55634);e.s(["AppShell",0,function({children:e}){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.ActiveGradeRouteSync,{}),(0,t.jsx)(n.AppSidebar,{}),(0,t.jsxs)("main",{className:"app-reading-scale min-h-screen min-w-0 overflow-x-clip px-4 pb-28 pt-4 lg:ml-64 lg:px-10 lg:py-6",children:[(0,t.jsx)("div",{className:"sticky top-3 z-40 mb-5 lg:hidden",children:(0,t.jsxs)("div",{className:"flex min-w-0 items-center justify-between gap-2 rounded-3xl border border-white/80 bg-white/90 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsx)("div",{className:"min-w-0 flex-1",children:(0,t.jsx)(r.BrandHeader,{showPerson:!1})}),(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,t.jsx)(n.PersonSwitcher,{compact:!0}),(0,t.jsx)(n.MobileMenu,{})]})]})}),(0,t.jsx)("div",{className:"mx-auto min-w-0 w-full max-w-7xl",children:e}),(0,t.jsx)(n.MobileQuickNav,{})]})]})}])},98239,e=>{"use strict";var t=e.i(43476);e.s(["SectionCard",0,function({children:e,className:r=""}){return(0,t.jsx)("section",{className:`min-w-0 overflow-hidden rounded-[1.75rem] border border-softline/80 bg-white/90 p-5 shadow-warm sm:p-6 md:p-8 ${r}`,children:e})}])},97750,e=>{"use strict";var t=e.i(43476),r=e.i(14876);e.s(["SecondaryButton",0,function({children:e,href:n,onClick:a,type:l="button",className:s="",disabled:i=!1}){let o=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-butter px-6 py-3 text-center font-black text-amber-900 shadow-sm transition hover:-translate-y-0.5 hover:bg-amber-100 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-honey/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${s}`;return n&&!i?(0,t.jsx)(r.ExportSafeLink,{className:o,href:n,children:e}):(0,t.jsx)("button",{className:o,type:l,onClick:a,disabled:i,children:e})}])},73887,e=>{"use strict";var t=e.i(43476),r=e.i(14876);e.s(["PrimaryButton",0,function({children:e,href:n,onClick:a,type:l="button",className:s="",disabled:i=!1}){let o=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-coral px-6 py-3 text-center font-black text-white shadow-warm transition hover:-translate-y-0.5 hover:brightness-105 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-coral/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${s}`;return n&&!i?(0,t.jsx)(r.ExportSafeLink,{className:o,href:n,children:e}):(0,t.jsx)("button",{className:o,type:l,onClick:a,disabled:i,children:e})}])},55852,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(10400),a=e.i(73887),l=e.i(97750),s=e.i(98239);e.s(["default",0,function(){return(0,r.useEffect)(()=>{let e=window.location.hostname.endsWith(".static.hf.space")?"/parent-weekly-report/index.html":"/parent-weekly-report",t=window.setTimeout(()=>window.location.replace(e),900);return()=>window.clearTimeout(t)},[]),(0,t.jsx)(n.AppShell,{children:(0,t.jsxs)(s.SectionCard,{className:"mx-auto max-w-3xl text-center",children:[(0,t.jsx)("p",{className:"font-black text-amber-700",children:"功能已整合"}),(0,t.jsx)("h1",{className:"mt-2 text-4xl font-black text-ink",children:"家長檢查已改為學習進度"}),(0,t.jsx)("p",{className:"mx-auto mt-4 max-w-2xl font-bold leading-8 text-stone-600",children:"為了讓操作更簡單,原本的家長檢查已移除;每天的任務、單字與測驗結果會集中顯示在學習進度月曆。"}),(0,t.jsxs)("div",{className:"mt-7 flex flex-wrap justify-center gap-3",children:[(0,t.jsx)(a.PrimaryButton,{href:"/parent-weekly-report",children:"查看學習進度"}),(0,t.jsx)(l.SecondaryButton,{href:"/dashboard",children:"回課程首頁"})]})]})})}])}]);
_next/static/chunks/1lld_xgwo9am9.js ADDED
The diff for this file is too large to render. See raw diff
 
_next/static/chunks/1qp2cnh13tfb2.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return o},formatWithValidation:function(){return c},urlObjectKeys:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let i=e.r(90809)._(e.r(98183)),s=/https?|ftp|gopher|file/;function o(e){let{auth:t,hostname:r}=e,n=e.protocol||"",a=e.pathname||"",o=e.hash||"",l=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),l&&"object"==typeof l&&(l=String(i.urlQueryToSearchParams(l)));let d=e.search||l&&`?${l}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||s.test(n))&&!1!==c?(c="//"+(c||""),a&&"/"!==a[0]&&(a="/"+a)):c||(c=""),o&&"#"!==o[0]&&(o="#"+o),d&&"?"!==d[0]&&(d="?"+d),a=a.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${n}${c}${a}${d}${o}`}let l=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return o(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t){let r=(0,n.useRef)(null),a=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(r.current=i(e,n)),t&&(a.current=i(t,n))},[e,t])}function i(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return i}});let n=e.r(18967),a=e.r(52817);function i(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,a.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return x},useLinkStatus:function(){return w}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let i=e.r(90809),s=e.r(43476),o=i._(e.r(71645)),l=e.r(95057),c=e.r(8372),d=e.r(18581),u=e.r(18967),g=e.r(5550);e.r(33525);let h=e.r(88540),p=e.r(91949),m=e.r(73668),f=e.r(9396);function x(t){var r,n;let a,i,x,[w,k]=(0,o.useOptimistic)(p.IDLE_LINK_STATUS),y=(0,o.useRef)(null),{href:v,as:j,children:N,prefetch:S=null,passHref:z,replace:P,shallow:$,scroll:H,onClick:D,onMouseEnter:E,onTouchStart:C,legacyBehavior:I=!1,onNavigate:L,transitionTypes:R,ref:_,unstable_dynamicOnHover:O,...A}=t;a=N,I&&("string"==typeof a||"number"==typeof a)&&(a=(0,s.jsx)("a",{children:a}));let T=o.default.useContext(c.AppRouterContext),M=!1!==S,U=!1!==S?null===(n=S)||"auto"===n?f.FetchStrategy.PPR:f.FetchStrategy.Full:f.FetchStrategy.PPR,B="string"==typeof(r=j||v)?r:(0,l.formatUrl)(r);if(I){if(a?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});i=o.default.Children.only(a)}let W=I?i&&"object"==typeof i&&i.ref:_,F=o.default.useCallback(e=>(null!==T&&(y.current=(0,p.mountLinkInstance)(e,B,T,U,M,k)),()=>{y.current&&((0,p.unmountLinkForCurrentNavigation)(y.current),y.current=null),(0,p.unmountPrefetchableInstance)(e)}),[M,B,T,U,k]),G={ref:(0,d.useMergedRef)(F,W),onClick(t){I||"function"!=typeof D||D(t),I&&i.props&&"function"==typeof i.props.onClick&&i.props.onClick(t),!T||t.defaultPrevented||function(t,r,n,a,i,s,l){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,m.isLocalURL)(r)){a&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),s){let e=!1;if(s({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);o.default.startTransition(()=>{u(r,a?"replace":"push",!1===i?h.ScrollBehavior.NoScroll:h.ScrollBehavior.Default,n.current,l)})}}(t,B,y,P,H,L,R)},onMouseEnter(e){I||"function"!=typeof E||E(e),I&&i.props&&"function"==typeof i.props.onMouseEnter&&i.props.onMouseEnter(e),T&&M&&(0,p.onNavigationIntent)(e.currentTarget,!0===O)},onTouchStart:function(e){I||"function"!=typeof C||C(e),I&&i.props&&"function"==typeof i.props.onTouchStart&&i.props.onTouchStart(e),T&&M&&(0,p.onNavigationIntent)(e.currentTarget,!0===O)}};return(0,u.isAbsoluteUrl)(B)?G.href=B:I&&!z&&("a"!==i.type||"href"in i.props)||(G.href=(0,g.addBasePath)(B)),x=I?o.default.cloneElement(i,G):(0,s.jsx)("a",{...A,...G,children:a}),(0,s.jsx)(b.Provider,{value:w,children:x})}e.r(84508);let b=(0,o.createContext)(p.IDLE_LINK_STATUS),w=()=>(0,o.useContext)(b);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},14876,e=>{"use strict";var t=e.i(43476),r=e.i(22016);function n(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:r,suffix:n}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===r?`/index.html${n}`:/\.[a-z0-9]+$/i.test(r)?e:`${r.replace(/\/+$/,"")}/index.html${n}`}e.s(["ExportSafeLink",0,function({href:e,children:a,...i}){return"string"==typeof e?(0,t.jsx)("a",{href:n(e),...i,children:a}):(0,t.jsx)(r.default,{href:e,...i,children:a})},"getExportSafeHref",0,n])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let r=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function n(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return r.find(t=>t.grade===e)},"getGradeIdByNumber",0,n,"grades",0,r],62312);let a=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],i={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function s(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.find(e=>e.id===t)??i}function o(e){if(!e)return i.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.some(e=>e.id===t)?t:i.id}e.s(["currentStudent",0,i,"getCurrentStudentGradeId",0,function(e=i){return n(e.grade)},"getPersonById",0,s,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,a,"normalizePersonId",0,o],7728);let l="chenguang-active-person-id",c="chenguang-active-person-change",d="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,r]=(0,t.useState)(i.id),[n,a]=(0,t.useState)(!1),[g,h]=(0,t.useState)(!1);function p(e){let t=o(e);r(t),window.localStorage.setItem(l,t),window.dispatchEvent(new Event(c))}return(0,t.useEffect)(()=>{let e=o(window.localStorage.getItem(l));function t(){let e=o(window.localStorage.getItem(l));r(e),window.localStorage.setItem(l,e)}function n(){a(!!window.localStorage.getItem(d))}return r(e),window.localStorage.setItem(l,e),a(!!window.localStorage.getItem(d)),h(!0),window.addEventListener(c,t),window.addEventListener("storage",t),window.addEventListener(u,n),()=>{window.removeEventListener(c,t),window.removeEventListener("storage",t),window.removeEventListener(u,n)}},[]),{person:s(e),switchPerson:p,signIn:function(e){let t=o(e);p(t);let r=s(t);window.localStorage.setItem(d,JSON.stringify({personId:t,role:r.role,signedInAt:new Date().toISOString()})),a(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(d),a(!1),window.dispatchEvent(new Event(u))},isLoggedIn:n,isReady:g}}],41324)},82697,e=>{"use strict";var t=e.i(43476),r=e.i(14876),n=e.i(7728),a=e.i(62312),i=e.i(41324);e.s(["BrandHeader",0,function({showPerson:e=!0}){let{person:s,isLoggedIn:o}=(0,i.useActivePerson)(),l=(0,a.getGradeByNumber)(s.grade),c=o?`${(0,n.getPersonDisplayName)(s)}|${"student"===s.role?(0,n.getPersonSubtitle)(s):l?.shortName??`小${s.grade}`}`:"訪客模式";return(0,t.jsxs)(r.ExportSafeLink,{href:o?"/dashboard":"/",className:"flex min-w-0 items-center gap-3 text-ink",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 shrink-0 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{className:"min-w-0 leading-tight",children:[(0,t.jsx)("strong",{className:"block truncate text-xl font-black",children:"晨光"}),(0,t.jsx)("small",{className:"block truncate text-sm font-bold text-stone-500",children:e?c:"國小學習陪跑系統"})]})]})}])},18566,(e,t,r)=>{t.exports=e.r(76562)},22468,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),i=e.i(7728),s=e.i(62312),o=e.i(41324);let l=[{label:"登入",href:"/login"},{label:"訪客體驗",href:"/courses"},{label:"註冊登入",href:"/register",primary:!0}];function c(e,t="student"){let r=[{label:"課程首頁",href:"/dashboard",icon:"⌂"},{label:"每日 10 題",href:"/daily-quiz",icon:"10"},{label:"錯題 AI 說明",href:"/wrong-review",icon:"AI"},{label:"進度月曆",href:"/parent-weekly-report",icon:"月"},{label:"英文練習",href:"/practice",icon:"Aa"},{label:"手寫出題",href:"/word-scanner",icon:"掃"},{label:"課程總覽",href:"/courses",icon:"▦"},{label:"國語練習",href:`/courses/grade-${e}/chinese/basic`,icon:"ㄅ"},{label:"數學練習",href:`/courses/grade-${e}/math/basic`,icon:"123"},{label:"每日紀錄",href:"/daily-record",icon:"✓"},{label:"週計畫",href:"/weekly-plan",icon:"□"},{label:"登出",href:"/",icon:"出"}];return"parent"===t?r.filter(e=>["課程首頁","進度月曆","每日紀錄","週計畫","課程總覽","登出"].includes(e.label)):"teacher"===t?r.filter(e=>["課程首頁","課程總覽","國語練習","英文練習","數學練習","週計畫","手寫出題","登出"].includes(e.label)):r.filter(e=>["課程首頁","每日 10 題","英文練習","國語練習","數學練習","手寫出題","錯題 AI 說明","登出"].includes(e.label))}function d(e,t){return"/dashboard"===t?"/dashboard"===e:"/courses"===t?"/courses"===e:t.startsWith("/courses/")?e===t||e.startsWith(`${t}/`):e===t}function u({compact:e=!1}){let{person:n}=(0,o.useActivePerson)(),[a,l]=(0,r.useState)(!1),c=(0,s.getGradeByNumber)(n.grade),d="student"===n.role?(0,i.getPersonSubtitle)(n):c?.name??`國小${n.grade}年級`,g=(0,t.jsx)("div",{className:"grid gap-2",children:i.mockPeople.map(e=>{let r=(0,s.getGradeByNumber)(e.grade),a=e.id===n.id;return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;let r;return t=e.id,l(!1),r=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login",void window.location.assign(`${r}?person=${encodeURIComponent(t)}`)},className:`rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${a?"bg-coral text-white shadow-sm":"bg-white text-stone-700 hover:bg-butter"}`,children:[(0,t.jsxs)("span",{className:"block text-xs font-black opacity-80",children:[(0,i.getRoleLabel)(e.role),"模式"]}),(0,t.jsx)("span",{className:"mt-1 block text-base font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-75",children:"student"===e.role?(0,i.getPersonSubtitle)(e):r?.name??`國小${e.grade}年級`})]},e.id)})});return e?(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>l(e=>!e),className:"flex min-h-11 max-w-[5.5rem] items-center gap-1 rounded-2xl bg-butter px-2 text-left text-amber-950 shadow-sm sm:max-w-none sm:gap-2 sm:px-3","aria-expanded":a,"aria-label":"切換目前使用者",children:[(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("strong",{className:"block max-w-20 truncate text-sm font-black",children:n.name}),(0,t.jsx)("small",{className:"block text-[11px] font-bold opacity-70",children:c?.shortName??`小${n.grade}`})]}),(0,t.jsx)("span",{"aria-hidden":"true",className:"text-xs",children:"⌄"})]}),a?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100vh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsx)("strong",{className:"text-base font-black text-ink",children:"切換使用者"}),(0,t.jsx)("button",{type:"button",onClick:()=>l(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉帳號選單",children:"×"})]}),g]}):null]}):(0,t.jsxs)("section",{className:"rounded-3xl border border-amber-100 bg-cream p-3 shadow-sm",children:[(0,t.jsx)("button",{type:"button",onClick:()=>l(e=>!e),className:"w-full rounded-[1.35rem] bg-white/80 p-3 text-left ring-1 ring-transparent transition hover:bg-white hover:ring-coral/30","aria-expanded":a,"aria-label":"切換目前使用者",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("p",{className:"text-xs font-black text-amber-700",children:[(0,i.getRoleLabel)(n.role),"模式"]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-2xl font-black leading-tight text-ink",children:n.name}),(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"student"===n.role?"匿名檔案":(0,i.getRoleLabel)(n.role)})]}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:d})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-coral px-3 py-2 text-xs font-black text-white shadow-sm",children:"切換帳號"})]})}),a?(0,t.jsx)("div",{className:"mt-3",children:g}):null]})}e.s(["AppSidebar",0,function(){let e=(0,n.usePathname)(),{person:r,isLoggedIn:i,signOut:s}=(0,o.useActivePerson)();function g(){s();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsx)("aside",{className:"fixed inset-y-0 left-0 z-20 hidden w-64 flex-col border-r border-softline/80 bg-white/85 backdrop-blur-xl lg:flex",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 py-6",children:[(0,t.jsxs)(a.ExportSafeLink,{className:"flex items-center gap-3",href:i?"/dashboard":"/",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"text-sm font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),i?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{}),(0,t.jsx)("nav",{className:"grid gap-2 pr-1",children:c(r.grade,r.role).map(r=>{let n=d(e,r.href),i=`flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left transition ${n?"bg-butter text-amber-900 shadow-sm":"text-stone-600 hover:bg-butter hover:text-amber-900"}`,s=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 place-items-center rounded-xl text-sm font-black shadow-sm ${n?"bg-white text-coral":"bg-white text-stone-500"}`,children:r.icon}),(0,t.jsx)("span",{className:"font-bold",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:g,className:i,children:s},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,className:i,children:s},r.label)})})]}):(0,t.jsx)("div",{className:"grid gap-3",children:l.map(e=>(0,t.jsx)(a.ExportSafeLink,{href:e.href,className:e.primary?"rounded-2xl bg-coral px-4 py-3 text-center font-black text-white shadow-warm transition hover:brightness-105":"rounded-2xl border border-softline bg-white px-4 py-3 text-center font-black text-amber-800 transition hover:bg-butter",children:e.label},e.label))}),i?(0,t.jsxs)(a.ExportSafeLink,{href:"student"===r.role?"/wrong-review":"/parent-weekly-report",className:"mt-auto rounded-2xl border border-green-100 bg-green-50 p-4 text-sm text-green-900 transition hover:-translate-y-0.5 hover:bg-green-100",children:[(0,t.jsx)("span",{className:"block text-xs font-black text-green-700",children:"本週學習摘要"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg",children:"每天一小步,進度看得見"}),(0,t.jsx)("span",{className:"mt-2 block font-bold text-green-700",children:"查看進度與需要再練的內容 →"})]}):null]})})},"MobileMenu",0,function(){let e=(0,n.usePathname)(),{person:i,signOut:s}=(0,o.useActivePerson)(),[l,u]=(0,r.useState)(!1),g=c(i.grade,i.role);function h(){s();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsxs)("div",{className:"shrink-0 lg:hidden",children:[(0,t.jsx)("button",{type:"button",onClick:()=>u(e=>!e),className:"grid min-h-11 min-w-11 place-items-center rounded-2xl bg-white text-xl font-black text-amber-900 shadow-sm active:scale-[0.98]","aria-expanded":l,"aria-label":"開啟完整功能選單",children:l?"×":"☰"}),l?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100dvh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("strong",{className:"block text-base font-black text-ink",children:"全部功能"}),(0,t.jsxs)("span",{className:"text-xs font-bold text-stone-500",children:["依 ",i.name," 的身分顯示"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉功能選單",children:"×"})]}),(0,t.jsx)("nav",{className:"grid grid-cols-2 gap-2",children:g.map(r=>{let n=d(e,r.href),i=`flex min-h-16 items-center gap-3 rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${n?"bg-coral text-white":"bg-white text-stone-700"}`,s=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 shrink-0 place-items-center rounded-xl text-sm font-black ${n?"bg-white/20":"bg-butter text-amber-900"}`,children:r.icon}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:h,className:i,children:s},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,onClick:()=>u(!1),className:i,children:s},r.label)})})]}):null]})},"MobileQuickNav",0,function(){var e;let r,i=(0,n.usePathname)(),{person:s}=(0,o.useActivePerson)(),l=(r=c(s.grade,e=s.role),("guest"===e?["課程首頁","課程總覽"]:({student:["課程首頁","每日 10 題","英文練習","課程總覽"],parent:["課程首頁","進度月曆","每日紀錄","週計畫"],teacher:["課程首頁","課程總覽","週計畫","手寫出題"]})[e]).map(e=>r.find(t=>t.label===e)).filter(e=>!!e));return(0,t.jsx)("nav",{className:"fixed inset-x-3 bottom-[max(0.75rem,env(safe-area-inset-bottom))] z-50 grid grid-cols-4 gap-1 rounded-3xl border border-white/80 bg-white/90 p-2 shadow-warm backdrop-blur-xl lg:hidden","aria-label":"主要功能",children:l.map(e=>{let r=d(i,e.href);return(0,t.jsxs)(a.ExportSafeLink,{href:e.href,className:`flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl px-1 py-2 text-center transition active:scale-[0.98] ${r?"bg-coral text-white shadow-sm":"text-stone-600"}`,children:[(0,t.jsx)("span",{className:"text-sm font-black",children:e.icon}),(0,t.jsx)("span",{className:"w-full truncate text-[11px] font-black",children:e.label})]},e.label)})})},"PersonSwitcher",0,u])},55634,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),i=e.i(41324);e.s(["ActiveGradeRouteSync",0,function(){let e=(0,n.usePathname)(),{person:s,isLoggedIn:o,isReady:l}=(0,i.useActivePerson)(),c=function(e){let t=e.match(/^\/learn\/(?:grade-)?([1-6])(?:\/|$)/);if(t)return Number(t[1]);let r=e.match(/^\/courses\/grade-([1-6])(?:\/|$)/);if(r)return Number(r[1]);let n=e.match(/^\/(?:lesson|practice|handwriting)\/grade-([1-6])-/);return n?Number(n[1]):null}(e),d=!!(l&&o&&"student"===s.role&&c&&c!==s.grade);return((0,r.useEffect)(()=>{var t;if(!d)return;let r=(t=s.grade,/^\/learn\/(?:grade-)?[1-6](?:\/|$)/.test(e)?e.replace(/^\/learn\/(?:grade-)?[1-6]/,`/learn/${t}`):/^\/courses\/grade-[1-6](?:\/|$)/.test(e)?e.replace(/^\/courses\/grade-[1-6]/,`/courses/grade-${t}`):e.replace(/^(\/(?:lesson|practice|handwriting)\/)grade-[1-6]-/,`$1grade-${t}-`)),n=`${(0,a.getExportSafeHref)(r)}${window.location.search}${window.location.hash}`;window.location.replace(n)},[e,s.grade,d]),l&&!d)?null:(0,t.jsx)("div",{className:"fixed inset-0 z-[100] grid place-items-center bg-[#fffaf3]/95 p-5 backdrop-blur-md",role:"status","aria-live":"polite",children:(0,t.jsxs)("div",{className:"w-full max-w-md rounded-[2rem] border border-white bg-white/90 p-7 text-center shadow-warm",children:[(0,t.jsx)("span",{className:"mx-auto grid h-14 w-14 place-items-center rounded-2xl bg-butter text-2xl","aria-hidden":"true",children:"☀"}),(0,t.jsx)("strong",{className:"mt-4 block text-2xl font-black text-ink",children:l?`正在切換到小${s.grade}課程`:"正在讀取目前學習年級"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"晨光會自動載入這位學習者正確的課程內容。"})]})})}],55634)},12408,e=>{"use strict";function t(){return"speechSynthesis"in window&&"SpeechSynthesisUtterance"in window}function r(e,n={}){if(!e.trim())return{ok:!1,message:"請先選擇要播放的內容。"};if(!t())return{ok:!1,message:"這個瀏覽器不支援語音播放,建議使用 Chrome 或 Edge。"};window.speechSynthesis.cancel();let a=new SpeechSynthesisUtterance(e);return a.lang=n.lang??"en-US",a.rate=n.rate??.82,a.pitch=n.pitch??1,a.volume=n.volume??1,window.speechSynthesis.speak(a),{ok:!0,message:"正在播放標準發音。"}}e.s(["speakEnglish",0,function(e,t={}){return r(e,{...t,lang:"en-US"})},"speakMandarin",0,function(e,t={}){return r(e,{rate:.76,pitch:1.05,...t,lang:"zh-TW"})},"speakText",0,r,"stopSpeech",0,function(){t()&&window.speechSynthesis.cancel()}])},32324,e=>{"use strict";var t=e.i(43476);let r={一:"ㄧ",二:"ㄦˋ",三:"ㄙㄢ",上衣:"ㄕㄤˋ ㄧ",下午:"ㄒㄧㄚˋ ㄨˇ",下雨的:"ㄒㄧㄚˋ ㄩˇ ㄉㄜ˙",不舒服:"ㄅㄨˋ ㄕㄨ ㄈㄨ˙",今天:"ㄐㄧㄣ ㄊㄧㄢ",公園:"ㄍㄨㄥ ㄩㄢˊ",午餐:"ㄨˇ ㄘㄢ",天氣:"ㄊㄧㄢ ㄑㄧˋ",手:"ㄕㄡˇ",水:"ㄕㄨㄟˇ",牛奶:"ㄋㄧㄡˊ ㄋㄞˇ",兄弟:"ㄒㄩㄥ ㄉㄧˋ",右邊:"ㄧㄡˋ ㄅㄧㄢ",左邊:"ㄗㄨㄛˇ ㄅㄧㄢ",市場:"ㄕˋ ㄔㄤˇ",再見:"ㄗㄞˋ ㄐㄧㄢˋ",多雲的:"ㄉㄨㄛ ㄩㄣˊ ㄉㄜ˙",早上:"ㄗㄠˇ ㄕㄤˋ",早餐:"ㄗㄠˇ ㄘㄢ",有風的:"ㄧㄡˇ ㄈㄥ ㄉㄜ˙",老師:"ㄌㄠˇ ㄕ",作業:"ㄗㄨㄛˋ ㄧㄝˋ",你好:"ㄋㄧˇ ㄏㄠˇ",車站:"ㄔㄜ ㄓㄢˋ",姊妹:"ㄗˇ ㄇㄟˋ",房間:"ㄈㄤˊ ㄐㄧㄢ",朋友:"ㄆㄥˊ ㄧㄡˇ",河流:"ㄏㄜˊ ㄌㄧㄡˊ",爸爸:"ㄅㄚˋ ㄅㄚ˙",玩:"ㄨㄢˊ",附近:"ㄈㄨˋ ㄐㄧㄣˋ",紅色:"ㄏㄨㄥˊ ㄙㄜˋ",書:"ㄕㄨ",書包:"ㄕㄨ ㄅㄠ",桌子:"ㄓㄨㄛ ㄗ˙",商店:"ㄕㄤ ㄉㄧㄢˋ",問題:"ㄨㄣˋ ㄊㄧˊ",教室:"ㄐㄧㄠˋ ㄕˋ",晚上:"ㄨㄢˇ ㄕㄤˋ",晚餐:"ㄨㄢˇ ㄘㄢ",累了:"ㄌㄟˋ ㄌㄜ˙",帽子:"ㄇㄠˋ ㄗ˙",晴朗的:"ㄑㄧㄥˊ ㄌㄤˇ ㄉㄜ˙",渴了:"ㄎㄜˇ ㄌㄜ˙",畫畫:"ㄏㄨㄚˋ ㄏㄨㄚˋ",答案:"ㄉㄚˊ ㄢˋ",開心:"ㄎㄞ ㄒㄧㄣ",黃色:"ㄏㄨㄤˊ ㄙㄜˋ",媽媽:"ㄇㄚ ㄇㄚ˙",準備好了:"ㄓㄨㄣˇ ㄅㄟˋ ㄏㄠˇ ㄌㄜ˙",腳:"ㄐㄧㄠˇ",鉛筆:"ㄑㄧㄢ ㄅㄧˇ",圖書館:"ㄊㄨˊ ㄕㄨ ㄍㄨㄢˇ",睡覺:"ㄕㄨㄟˋ ㄐㄧㄠˋ",綠色:"ㄌㄩˋ ㄙㄜˋ",說:"ㄕㄨㄛ",寫:"ㄒㄧㄝˇ",練習:"ㄌㄧㄢˋ ㄒㄧˊ",複習:"ㄈㄨˋ ㄒㄧˊ",請:"ㄑㄧㄥˇ",閱讀:"ㄩㄝˋ ㄉㄨˊ",莊:"ㄓㄨㄤ",村莊:"ㄘㄨㄣ ㄓㄨㄤ",鞋子:"ㄒㄧㄝˊ ㄗ˙",餓了:"ㄜˋ ㄌㄜ˙",學校:"ㄒㄩㄝˊ ㄒㄧㄠˋ",學習:"ㄒㄩㄝˊ ㄒㄧˊ",樹:"ㄕㄨˋ",橡皮擦:"ㄒㄧㄤˋ ㄆㄧˊ ㄘㄚ",醒來:"ㄒㄧㄥˇ ㄌㄞˊ",頭:"ㄊㄡˊ",謝謝你:"ㄒㄧㄝˋ ㄒㄧㄝ˙ ㄋㄧˇ",藍色:"ㄌㄢˊ ㄙㄜˋ",醫院:"ㄧ ㄩㄢˋ",難過:"ㄋㄢˊ ㄍㄨㄛˋ",蘋果:"ㄆㄧㄥˊ ㄍㄨㄛˇ",麵包:"ㄇㄧㄢˋ ㄅㄠ",聽:"ㄊㄧㄥ","老師,你好。":"ㄌㄠˇ ㄕ,ㄋㄧˇ ㄏㄠˇ。","這是我的書。":"ㄓㄜˋ ㄕˋ ㄨㄛˇ ㄉㄜ˙ ㄕㄨ。","謝謝你。":"ㄒㄧㄝˋ ㄒㄧㄝ˙ ㄋㄧˇ。","我需要幫忙。":"ㄨㄛˇ ㄒㄩ ㄧㄠˋ ㄅㄤ ㄇㄤˊ。","這是我的家人。":"ㄓㄜˋ ㄕˋ ㄨㄛˇ ㄉㄜ˙ ㄐㄧㄚ ㄖㄣˊ。","我喜歡蘋果。":"ㄨㄛˇ ㄒㄧˇ ㄏㄨㄢ ㄆㄧㄥˊ ㄍㄨㄛˇ。","我讀一本書。":"ㄨㄛˇ ㄉㄨˊ ㄧˋ ㄅㄣˇ ㄕㄨ。","我和朋友一起玩。":"ㄨㄛˇ ㄏㄜˊ ㄆㄥˊ ㄧㄡˇ ㄧˋ ㄑㄧˇ ㄨㄢˊ。","我說英文。":"ㄨㄛˇ ㄕㄨㄛ ㄧㄥ ㄨㄣˊ。","我有一個問題。":"ㄨㄛˇ ㄧㄡˇ ㄧˊ ㄍㄜ˙ ㄨㄣˋ ㄊㄧˊ。","我去圖書館。":"ㄨㄛˇ ㄑㄩˋ ㄊㄨˊ ㄕㄨ ㄍㄨㄢˇ。","我準備好了。":"ㄨㄛˇ ㄓㄨㄣˇ ㄅㄟˋ ㄏㄠˇ ㄌㄜ˙。","河邊有一個安靜的村莊。":"ㄏㄜˊ ㄅㄧㄢ ㄧㄡˇ ㄧˊ ㄍㄜ˙ ㄢ ㄐㄧㄥˋ ㄉㄜ˙ ㄘㄨㄣ ㄓㄨㄤ。"};e.s(["ZhuyinText",0,function({text:e,show:n=!0,compact:a=!1,className:i=""}){let s,o,l=n?(o=(s=e.trim()).match(/^我的名字是 (.+)。$/))?`ㄨㄛˇ ㄉㄜ˙ ㄇㄧㄥˊ ㄗˋ ㄕˋ ${o[1]}。`:r[s]??"":"";return(0,t.jsxs)("span",{className:`inline-flex flex-wrap items-center gap-x-2 gap-y-1 ${i}`,children:[(0,t.jsx)("span",{children:e}),l?(0,t.jsx)("span",{className:`rounded-full bg-white/85 font-black tracking-wide text-stone-500 shadow-sm ${a?"px-2 py-1 text-[11px]":"px-3 py-1 text-xs"}`,children:l}):null]})}],32324)},51668,e=>{"use strict";let t=[{id:"g1-ren",grade:1,character:"人",zhuyin:"ㄖㄣˊ",word:"人們",meaning:"一個人或很多人。",example:"我們都是有禮貌的人。",strokeHint:"先撇再捺,兩筆要站穩。"},{id:"g1-shang",grade:1,character:"上",zhuyin:"ㄕㄤˋ",word:"上學",meaning:"位置在高處,或開始去學校。",example:"我早上去上學。",strokeHint:"中間一豎要直,下面一橫要平。"},{id:"g1-da",grade:1,character:"大",zhuyin:"ㄉㄚˋ",word:"大家",meaning:"尺寸很大,也可以表示很多人。",example:"大家一起讀故事。",strokeHint:"先橫,再撇,最後捺要打開。"},{id:"g1-xiao",grade:1,character:"小",zhuyin:"ㄒㄧㄠˇ",word:"小手",meaning:"尺寸不大。",example:"我用小手寫字。",strokeHint:"中間豎鉤站直,兩點不要太遠。"},{id:"g1-ri",grade:1,character:"日",zhuyin:"ㄖˋ",word:"日子",meaning:"太陽或一天。",example:"今天是好日子。",strokeHint:"外框方正,中間一橫不要太斜。"},{id:"g1-yue",grade:1,character:"月",zhuyin:"ㄩㄝˋ",word:"月亮",meaning:"夜晚天空中的月亮。",example:"月亮掛在天空。",strokeHint:"外框窄長,裡面兩橫平均。"},{id:"g1-shui",grade:1,character:"水",zhuyin:"ㄕㄨ���ˇ",word:"喝水",meaning:"可以喝、洗東西的液體。",example:"運動後要喝水。",strokeHint:"中間豎鉤先寫,左右筆畫像水流。"},{id:"g1-mu",grade:1,character:"木",zhuyin:"ㄇㄨˋ",word:"木頭",meaning:"樹木的材料。",example:"桌子是木頭做的。",strokeHint:"先橫再豎,撇捺要張開。"},{id:"g1-shou",grade:1,character:"手",zhuyin:"ㄕㄡˇ",word:"小手",meaning:"用來拿東西、寫字的身體部位。",example:"我把手洗乾淨。",strokeHint:"三橫間距平均,豎鉤往下穩。"},{id:"g1-kou",grade:1,character:"口",zhuyin:"ㄎㄡˇ",word:"開口",meaning:"嘴巴,也表示說話。",example:"我勇敢開口回答。",strokeHint:"外框寫方,最後一橫封起來。"},{id:"g2-xue",grade:2,character:"學",zhuyin:"ㄒㄩㄝˊ",word:"學習",meaning:"學新的知識或能力。",example:"我每天開心學習。",strokeHint:"上半部不要擠,下面子字要端正。"},{id:"g2-jia",grade:2,character:"家",zhuyin:"ㄐㄧㄚ",word:"家庭",meaning:"和家人一起生活的地方。",example:"家是溫暖的地方。",strokeHint:"寶蓋頭蓋住下面,彎鉤自然。"},{id:"g2-you",grade:2,character:"友",zhuyin:"ㄧㄡˇ",word:"朋友",meaning:"一起玩、互相照顧的人。",example:"我和朋友分享玩具。",strokeHint:"撇要舒展,又字收穩。"},{id:"g2-shu",grade:2,character:"書",zhuyin:"ㄕㄨ",word:"書本",meaning:"可以閱讀的本子。",example:"我喜歡看故事書。",strokeHint:"橫畫多,要保持間距。"},{id:"g2-hua",grade:2,character:"花",zhuyin:"ㄏㄨㄚ",word:"花朵",meaning:"植物開出的美麗部分。",example:"公園裡有很多花。",strokeHint:"草字頭寬,下面化字站穩。"},{id:"g2-kan",grade:2,character:"看",zhuyin:"ㄎㄢˋ",word:"看見",meaning:"用眼睛觀察。",example:"我看見一隻小鳥。",strokeHint:"上方像手,下面目字要方正。"},{id:"g3-yu",grade:3,character:"語",zhuyin:"ㄩˇ",word:"語文",meaning:"說話和文字。",example:"語文課可以讀故事。",strokeHint:"言字旁偏窄,右邊要分層。"},{id:"g3-du",grade:3,character:"讀",zhuyin:"ㄉㄨˊ",word:"閱讀",meaning:"看文字並理解意思。",example:"我每天閱讀十分鐘。",strokeHint:"左右結構要平衡,貝字收小。"},{id:"g3-xiang",grade:3,character:"想",zhuyin:"ㄒㄧㄤˇ",word:"想法",meaning:"心裡思考。",example:"我說出自己的想法。",strokeHint:"相在上方,心在下方要穩。"},{id:"g3-qing",grade:3,character:"情",zhuyin:"ㄑㄧㄥˊ",word:"心情",meaning:"心裡的感覺。",example:"今天我的心情很好。",strokeHint:"豎心旁要窄,青字橫畫平均。"},{id:"g3-zhuang",grade:3,character:"莊",zhuyin:"ㄓㄨㄤ",word:"村莊",meaning:"人們聚居生活的村落,也可以用在地名或姓氏。",example:"河邊有一個安靜的村莊。",strokeHint:"草字頭要平穩,下方的壯要寫得端正。"},{id:"g4-cha",grade:4,character:"察",zhuyin:"ㄔㄚˊ",word:"觀察",meaning:"仔細看、仔細想。",example:"我們觀察植物生長。",strokeHint:"寶蓋頭舒展,下方筆畫不要擠。"},{id:"g4-guan",grade:4,character:"管",zhuyin:"ㄍㄨㄢˇ",word:"管理",meaning:"安排與照顧。",example:"我會管理自己的書包。",strokeHint:"竹字頭要輕,官字端正。"},{id:"g4-zhai",grade:4,character:"摘",zhuyin:"ㄓㄞ",word:"摘要",meaning:"取出內容中最重要的部分。",example:"我把文章重點整理成摘要。",strokeHint:"提手旁寫窄,右邊上下要對齊。"},{id:"g4-yao",grade:4,character:"要",zhuyin:"ㄧㄠˋ",word:"重要",meaning:"必須注意或很有價值。",example:"閱讀時要找出重要線索。",strokeHint:"上方扁而穩,女字底要托住上方。"},{id:"g4-zhang",grade:4,character:"章",zhuyin:"ㄓㄤ",word:"文章",meaning:"由句子和段落組成的文字內容。",example:"這篇文章介紹海洋。",strokeHint:"上方音字收緊,下方十字站直。"},{id:"g4-li",grade:4,character:"理",zhuyin:"ㄌㄧˇ",word:"理解",meaning:"知道內容在說什麼。",example:"我讀完後能理解主旨。",strokeHint:"王字旁窄,里字橫畫平均。"},{id:"g5-bian",grade:5,character:"辨",zhuyin:"ㄅㄧㄢˋ",word:"辨認",meaning:"分清楚不同的地方。",example:"我能辨認相似的字。",strokeHint:"左中右要平均,不要寫太寬。"},{id:"g5-lun",grade:5,character:"論",zhuyin:"ㄌㄨㄣˋ",word:"討論",meaning:"交換想法。",example:"我們一起討論答案。",strokeHint:"言字旁偏窄,右邊層次清楚。"},{id:"g5-ce",grade:5,character:"策",zhuyin:"ㄘㄜˋ",word:"策略",meaning:"為了完成目標所安排的方法。",example:"找關鍵字是一種閱讀策略。",strokeHint:"竹字頭要輕,下方筆畫保持中央。"},{id:"g5-ju",grade:5,character:"據",zhuyin:"ㄐㄩˋ",word:"證據",meaning:"能支持說法的資料或事實。",example:"請從文章找出證據。",strokeHint:"提手旁窄,右邊層次清楚。"},{id:"g5-bi",grade:5,character:"比",zhuyin:"ㄅㄧˇ",word:"比較",meaning:"找出兩件事相同或不同的地方。",example:"我們比較兩篇文章的觀點。",strokeHint:"左右兩部分靠近,豎彎鉤要穩。"},{id:"g5-xi",grade:5,character:"析",zhuyin:"ㄒㄧ",word:"分析",meaning:"把內容拆開來仔細理解。",example:"分析圖表後再回答問題。",strokeHint:"木字旁窄,斤字撇畫舒展。"},{id:"g6-bian",grade:6,character:"辯",zhuyin:"ㄅㄧㄢˋ",word:"辯論",meaning:"用理由說明自己的想法。",example:"辯論時要尊重別人。",strokeHint:"左中右結構要緊湊。"},{id:"g6-zheng",grade:6,character:"證",zhuyin:"ㄓㄥˋ",word:"證明",meaning:"用理由或資料說明是真的。",example:"請用例子證明你的想法。",strokeHint:"左窄右寬,登字要站穩。"},{id:"g6-tong",grade:6,character:"統",zhuyin:"ㄊㄨㄥˇ",word:"統整",meaning:"把分散的內容整理成完整架構。",example:"考前要統整學過的重點。",strokeHint:"糸字旁窄,右邊上緊下穩。"},{id:"g6-tui",grade:6,character:"推",zhuyin:"ㄊㄨㄟ",word:"推論",meaning:"根據線索想出合理的結果。",example:"我從人物行動推論他的心情。",strokeHint:"提手旁窄,隹字四橫要平均。"},{id:"g6-guan",grade:6,character:"觀",zhuyin:"ㄍㄨㄢ",word:"觀點",meaning:"一個人看事情的想法和立場。",example:"文章提出兩種不同觀點。",strokeHint:"左邊筆畫多要收緊,見字底穩。"},{id:"g6-jie",grade:6,character:"接",zhuyin:"ㄐㄧㄝ",word:"銜接",meaning:"把前後內容連起來。",example:"這個單元幫助我們銜接國中。",strokeHint:"提手旁窄,右邊妾字上下對正。"}];e.s(["chineseHandwritingWords",0,t,"getChineseHandwritingWordsByGrade",0,function(e){return t.filter(t=>t.grade===e)}])},4914,e=>{"use strict";let t=[{id:"grade-1-concrete-words",grades:[1],src:"/images/chinese/grade-1-picture-learning.webp",alt:"小學生在明亮教室裡指著樹木圖卡朗讀,桌上有故事書、水杯和書包",caption:"先找找看:圖裡有哪些人、物品和動作?再把看到的內容說成一句話。",observationPrompts:["孩子用哪一隻手指圖卡?","窗外是白天還是晚上?","桌上有哪些學習用品?"]},{id:"grade-2-home-reading",grades:[2],src:"/images/chinese/grade-2-picture-learning.webp",alt:"兩位小學生和家人在溫暖的家中一起看故事書,桌上有花和筆記本",caption:"看看人物正在做什麼,再找出「家、友、書、花、看、學」的生活線索。",observationPrompts:["誰正在拿書?","朋友用手指出了什麼?","家人怎麼陪伴孩子閱讀?"]},{id:"grade-3-4-reading",grades:[3,4],src:"/images/chinese/grade-3-4-reading.webp",alt:"兩位小學生觀察葉片、閱讀植物文章、排列生長圖片並整理筆記",caption:"從圖中的觀察、閱讀與排列動作,找出故事順序和文章重點。",observationPrompts:["放大鏡正在觀察什麼?","三張圖片的先後順序是什麼?","筆記可以寫下哪一句重點?"]},{id:"grade-5-6-evidence-reading",grades:[5,6],src:"/images/chinese/grade-5-6-reading.webp",alt:"三位高年級學生在圖書館比較文章、找證據、整理重點並討論觀點",caption:"先看資料,再說理由:哪些內容是線索、哪些內容能支持結論?",observationPrompts:["學生正在比較哪兩份資料?","便利貼可能記錄了哪些證據?","說明觀點時,為什麼要先聽完別人的理由?"]}];e.s(["getChineseIllustrationForGrade",0,function(e){return t.find(t=>t.grades.includes(e))??t[0]}])},16549,e=>{"use strict";var t=e.i(51668),r=e.i(4914);let n={"g1-ren":{radical:"人",strokes:2,picture:"兩個人一起走",pictureDescription:"兩個人互相陪伴,一起往前走。"},"g1-shang":{radical:"一",strokes:3,picture:"箭頭往上",pictureDescription:"箭頭指向高處,表示上方。"},"g1-da":{radical:"大",strokes:3,picture:"一大一小兩個圓",pictureDescription:"比較兩個圓,較大的就是「大」。"},"g1-xiao":{radical:"小",strokes:3,picture:"一小一大兩個圓",pictureDescription:"比較兩個圓,較小的就是「小」。"},"g1-ri":{radical:"日",strokes:4,picture:"太陽",pictureDescription:"白天看見太陽,也可以想到一天的日子。"},"g1-yue":{radical:"月",strokes:4,picture:"月亮",pictureDescription:"夜晚天空中的月亮。"},"g1-shui":{radical:"水",strokes:4,picture:"水滴",pictureDescription:"可以喝、可以洗東西的水。"},"g1-mu":{radical:"木",strokes:4,picture:"樹木",pictureDescription:"樹幹和樹枝讓人想到木頭。"},"g1-shou":{radical:"手",strokes:4,picture:"一隻手",pictureDescription:"可以拿東西、寫字和打招呼的手。"},"g1-kou":{radical:"口",strokes:3,picture:"張開的嘴巴",pictureDescription:"用嘴巴吃東西,也用口說話。"},"g2-xue":{radical:"子",strokes:16,picture:"課本和鉛筆",pictureDescription:"打開課本、拿起鉛筆,就是在學習。"},"g2-jia":{radical:"宀",strokes:10,picture:"一間房子",pictureDescription:"家人一起生活的溫暖房子。"},"g2-you":{radical:"又",strokes:4,picture:"兩隻手握在一起",pictureDescription:"朋友互相��忙、一起分享。"},"g2-shu":{radical:"曰",strokes:10,picture:"打開的書",pictureDescription:"翻開書本,可以讀到文字和故事。"},"g2-hua":{radical:"艸",strokes:7,picture:"一朵花",pictureDescription:"植物開出的花朵。"},"g2-kan":{radical:"目",strokes:9,picture:"一雙眼睛",pictureDescription:"用眼睛仔細觀察,就是看。"},"g3-yu":{radical:"言",strokes:14,picture:"對話框",pictureDescription:"用說話和文字表達語言。"},"g3-du":{radical:"言",strokes:22,picture:"正在閱讀的書",pictureDescription:"看著文字並理解內容,就是讀。"},"g3-xiang":{radical:"心",strokes:13,picture:"想法泡泡",pictureDescription:"安靜思考,心裡出現一個想法。"},"g3-qing":{radical:"心",strokes:11,picture:"一顆心",pictureDescription:"開心、難過都是心裡的感情。"},"g3-zhuang":{radical:"艸",strokes:11,picture:"屋舍與田野",pictureDescription:"幾間屋舍聚在田野旁,形成大家生活的村莊。"},"g4-cha":{radical:"宀",strokes:14,picture:"放大鏡看葉子",pictureDescription:"拿放大鏡仔細看葉脈,找出細節。"},"g4-guan":{radical:"竹",strokes:14,picture:"整理好的書包",pictureDescription:"把物品分類放好,表示有條理地管理。"},"g4-zhai":{radical:"手",strokes:14,picture:"文章圈出重點",pictureDescription:"從一段文字中圈出最重要的內容。"},"g4-yao":{radical:"襾",strokes:9,picture:"星號標記重點",pictureDescription:"用星號標出需要特別注意的內容。"},"g4-zhang":{radical:"立",strokes:11,picture:"三段文字",pictureDescription:"幾個段落依順序組成一篇文章。"},"g4-li":{radical:"玉",strokes:11,picture:"想法連成線",pictureDescription:"把線索連起來,就能理解內容。"},"g5-bian":{radical:"辛",strokes:16,picture:"找不同",pictureDescription:"仔細找出兩個相似內容不同的地方。"},"g5-lun":{radical:"言",strokes:15,picture:"多人交換想法",pictureDescription:"大家輪流說明理由並聽別人的想法。"},"g5-ce":{radical:"竹",strokes:12,picture:"步驟清單",pictureDescription:"先安排步驟,再依方法完成目標。"},"g5-ju":{radical:"手",strokes:16,picture:"資料支持答案",pictureDescription:"用文章線索或資料支持自己的答案。"},"g5-bi":{radical:"比",strokes:4,picture:"兩欄比較表",pictureDescription:"把兩件事放在一起,找相同與不同。"},"g5-xi":{radical:"木",strokes:8,picture:"內容拆成小塊",pictureDescription:"把複雜內容分成幾個部分逐一理解。"},"g6-bian":{radical:"辛",strokes:21,picture:"兩方提出理由",pictureDescription:"兩方用理由和證據說明不同立場。"},"g6-zheng":{radical:"言",strokes:19,picture:"證據指向結論",pictureDescription:"資料和例子共同支持一個結論。"},"g6-tong":{radical:"糸",strokes:12,picture:"重點整理圖",pictureDescription:"把不同單元的重點整理到同一張圖。"},"g6-tui":{radical:"手",strokes:11,picture:"線索指向答案",pictureDescription:"從已知線索一步步想出合理結果。"},"g6-guan":{radical:"見",strokes:24,picture:"不同角度看同一件事",pictureDescription:"站在不同位置,可能會有不同看法。"},"g6-jie":{radical:"手",strokes:11,picture:"兩段道路連接",pictureDescription:"把前一段學習和下一階段順利連起來。"}},a={注音符號:"口",聲調練習:"口",基礎生字:"人",常見詞語:"手",朗讀練習:"日",生字與部首:"學",造詞與語意:"友",短文閱讀:"書",常用國字與部首:"語",詞語理解:"想",段落理解:"讀",成語與詞義:"理",段落結構:"章",摘要練習:"摘",因果推論:"理",說明文閱讀:"察",字詞辨析:"辨",複句關係:"析",閱讀策略:"策",主旨與摘要:"析",觀點與事實:"據",文本比較:"比",成語與語境:"觀",文本結構:"統",閱讀推論:"推",跨文本閱讀:"接",論點與證據:"證",演說與辯論:"辯",國中銜接閱讀:"接"},i={"g2-xue":{aliases:["学"],variantNote:"「学」是中國大陸常見簡化字,臺灣課程使用「學」。"},"g2-shu":{aliases:["书"],variantNote:"「书」是中國大陸常見簡化字,臺灣課程使用「書」。"},"g3-yu":{aliases:["语"],variantNote:"「语」是中國大陸常見簡化字,臺灣課程使用「語」。"},"g3-du":{aliases:["读"],variantNote:"「读」是中國大陸常見簡化字,臺灣課程使用「讀」。"},"g3-zhuang":{aliases:["庄"],variantNote:"「庄」可作「莊」的異體字;臺灣國小一般書寫正字「莊」。"},"g6-zheng":{aliases:["证"],variantNote:"「证」是中國大陸常見簡化字,臺灣課程使用「證」。"},"g6-tong":{aliases:["统"],variantNote:"「统」是中國大陸常見簡化字,臺灣課程使用「統」。"},"g6-guan":{aliases:["观"],variantNote:"「观」是中國大陸常見簡化字,臺灣課程使用「觀」。"}},s=t.chineseHandwritingWords.filter(e=>n[e.id]).map(e=>({...e,...n[e.id],...i[e.id]}));function o(e){return Array.from(e).reduce((e,t)=>e+t.charCodeAt(0),0)}function l(e){let t=s.filter(t=>t.grade===e);return t.length>=4?t:s.filter(t=>t.grade<=e).slice(-10)}e.s(["chineseDictionary",0,s,"findChineseDictionaryEntry",0,function(e){let t=e.normalize("NFKC").trim().replace(/[,。!?、;:,.!?;:\s]/g,"");if(!t)return;let r=s.find(e=>e.character===t);if(r)return{entry:r};for(let e of s){let r=e.aliases?.find(e=>e===t);if(r)return{entry:e,matchedAlias:r}}let n=s.find(e=>e.word===t);if(n)return{entry:n}},"getChineseDictionaryEntries",0,l,"getChineseDictionaryQuestion",0,function(e,t){let n=l(e),i=Object.entries(a).find(([e])=>t.includes(e))?.[1],c=n.find(e=>e.character===i),d=n.length?o(t)%n.length:0,u=c??n[d]??s[0],g=n.filter(e=>e.id!==u.id).slice(0,3),h=[u,...g].sort((e,r)=>o(`${t}:${e.id}`)-o(`${t}:${r.id}`)).map(e=>e.character);return{entry:u,options:h,illustration:(0,r.getChineseIllustrationForGrade)(e)}}])}]);
_next/static/chunks/1t3fjy-pg_496.js ADDED
The diff for this file is too large to render. See raw diff
 
_next/static/chunks/27jktro2p5rq9.js ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,32061,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={BailoutToCSRError:function(){return o},isBailoutToCSRError:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let i="BAILOUT_TO_CLIENT_SIDE_RENDERING";class o extends Error{constructor(e){super(`Bail out to client-side rendering: ${e}`),this.reason=e,this.digest=i}}function s(e){return"object"==typeof e&&null!==e&&"digest"in e&&e.digest===i}},54394,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={HTTPAccessErrorStatus:function(){return i},HTTP_ERROR_FALLBACK_ERROR_CODE:function(){return s},getAccessFallbackErrorTypeByStatus:function(){return l},getAccessFallbackHTTPStatus:function(){return c},isHTTPAccessFallbackError:function(){return u}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let i={NOT_FOUND:404,FORBIDDEN:403,UNAUTHORIZED:401},o=new Set(Object.values(i)),s="NEXT_HTTP_ERROR_FALLBACK";function u(e){if("object"!=typeof e||null===e||!("digest"in e)||"string"!=typeof e.digest)return!1;let[t,r]=e.digest.split(";");return t===s&&o.has(Number(r))}function c(e){return Number(e.digest.split(";")[1])}function l(e){switch(e){case 401:return"unauthorized";case 403:return"forbidden";case 404:return"not-found";default:return}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},65713,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isNextRouterError",{enumerable:!0,get:function(){return i}});let n=e.r(54394),a=e.r(68391);function i(e){return(0,a.isRedirectError)(e)||(0,n.isHTTPAccessFallbackError)(e)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},3680,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ReadonlyURLSearchParams",{enumerable:!0,get:function(){return a}});class n extends Error{constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. Read more: https://nextjs.org/docs/app/api-reference/functions/use-search-params#updating-searchparams")}}class a extends URLSearchParams{append(){throw new n}delete(){throw new n}set(){throw new n}sort(){throw new n}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},61994,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={NavigationPromisesContext:function(){return l},PathParamsContext:function(){return c},PathnameContext:function(){return u},ReadonlyURLSearchParams:function(){return o.ReadonlyURLSearchParams},SearchParamsContext:function(){return s},createDevToolsInstrumentedPromise:function(){return d}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let i=e.r(71645),o=e.r(3680),s=(0,i.createContext)(null),u=(0,i.createContext)(null),c=(0,i.createContext)(null),l=(0,i.createContext)(null);function d(e,t){let r=Promise.resolve(t);return r.status="fulfilled",r.value=t,r.displayName=`${e} (SSR)`,r}},45955,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"workUnitAsyncStorageInstance",{enumerable:!0,get:function(){return n}});let n=(0,e.r(90317).createAsyncLocalStorage)()},42852,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,a={RenderStage:function(){return u},StagedRenderingController:function(){return c}};for(var i in a)Object.defineProperty(r,i,{enumerable:!0,get:a[i]});let o=e.r(12718),s=e.r(39470);var u=((n={})[n.Before=1]="Before",n[n.EarlyStatic=2]="EarlyStatic",n[n.Static=3]="Static",n[n.EarlyRuntime=4]="EarlyRuntime",n[n.Runtime=5]="Runtime",n[n.Dynamic=6]="Dynamic",n[n.Abandoned=7]="Abandoned",n);class c{constructor(e,t,r){this.abortSignal=e,this.abandonController=t,this.shouldTrackSyncIO=r,this.currentStage=1,this.syncInterruptReason=null,this.staticStageEndTime=1/0,this.runtimeStageEndTime=1/0,this.staticStageListeners=[],this.earlyRuntimeStageListeners=[],this.runtimeStageListeners=[],this.dynamicStageListeners=[],this.staticStagePromise=(0,s.createPromiseWithResolvers)(),this.earlyRuntimeStagePromise=(0,s.createPromiseWithResolvers)(),this.runtimeStagePromise=(0,s.createPromiseWithResolvers)(),this.dynamicStagePromise=(0,s.createPromiseWithResolvers)(),e&&e.addEventListener("abort",()=>{let{reason:t}=e;this.staticStagePromise.promise.catch(l),this.staticStagePromise.reject(t),this.earlyRuntimeStagePromise.promise.catch(l),this.earlyRuntimeStagePromise.reject(t),this.runtimeStagePromise.promise.catch(l),this.runtimeStagePromise.reject(t),this.dynamicStagePromise.promise.catch(l),this.dynamicStagePromise.reject(t)},{once:!0}),t&&t.signal.addEventListener("abort",()=>{this.abandonRender()},{once:!0})}onStage(e,t){if(this.currentStage>=e)t();else if(3===e)this.staticStageListeners.push(t);else if(4===e)this.earlyRuntimeStageListeners.push(t);else if(5===e)this.runtimeStageListeners.push(t);else if(6===e)this.dynamicStageListeners.push(t);else throw Object.defineProperty(new o.InvariantError(`Invalid render stage: ${e}`),"__NEXT_ERROR_CODE",{value:"E881",enumerable:!1,configurable:!0})}shouldTrackSyncInterrupt(){if(!this.shouldTrackSyncIO)return!1;switch(this.currentStage){case 1:case 5:case 6:case 7:default:return!1;case 2:case 3:case 4:return!0}}syncInterruptCurrentStageWithReason(e){if(1!==this.currentStage&&7!==this.currentStage){if(this.abandonController)return void this.abandonController.abort();if(this.abortSignal){this.syncInterruptReason=e,this.currentStage=7;return}switch(this.currentStage){case 2:case 3:case 4:this.syncInterruptReason=e,this.advanceStage(6);return;case 5:return}}}getSyncInterruptReason(){return this.syncInterruptReason}getStaticStageEndTime(){return this.staticStageEndTime}getRuntimeStageEndTime(){return this.runtimeStageEndTime}abandonRender(){let{currentStage:e}=this;switch(e){case 2:this.resolveStaticStage();case 3:this.resolveEarlyRuntimeStage();case 4:this.resolveRuntimeStage();case 5:this.currentStage=7;return}}advanceStage(e){if(e<=this.currentStage)return;let t=this.currentStage;if(this.currentStage=e,t<3&&e>=3&&this.resolveStaticStage(),t<4&&e>=4&&this.resolveEarlyRuntimeStage(),t<5&&e>=5&&(this.staticStageEndTime=performance.now()+performance.timeOrigin,this.resolveRuntimeStage()),t<6&&e>=6){this.runtimeStageEndTime=performance.now()+performance.timeOrigin,this.resolveDynamicStage();return}}resolveStaticStage(){let e=this.staticStageListeners;for(let t=0;t<e.length;t++)e[t]();e.length=0,this.staticStagePromise.resolve()}resolveEarlyRuntimeStage(){let e=this.earlyRuntimeStageListeners;for(let t=0;t<e.length;t++)e[t]();e.length=0,this.earlyRuntimeStagePromise.resolve()}resolveRuntimeStage(){let e=this.runtimeStageListeners;for(let t=0;t<e.length;t++)e[t]();e.length=0,this.runtimeStagePromise.resolve()}resolveDynamicStage(){let e=this.dynamicStageListeners;for(let t=0;t<e.length;t++)e[t]();e.length=0,this.dynamicStagePromise.resolve()}getStagePromise(e){switch(e){case 3:return this.staticStagePromise.promise;case 4:return this.earlyRuntimeStagePromise.promise;case 5:return this.runtimeStagePromise.promise;case 6:return this.dynamicStagePromise.promise;default:throw Object.defineProperty(new o.InvariantError(`Invalid render stage: ${e}`),"__NEXT_ERROR_CODE",{value:"E881",enumerable:!1,configurable:!0})}}waitForStage(e){return this.getStagePromise(e)}delayUntilStage(e,t,r){var n,a,i;let o,s=(n=this.getStagePromise(e),a=t,i=r,o=new Promise((e,t)=>{n.then(e.bind(null,i),t)}),void 0!==a&&(o.displayName=a),o);return this.abortSignal&&s.catch(l),s}}function l(){}},62141,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={getCacheSignal:function(){return b},getDraftModeProviderForCacheScope:function(){return g},getHmrRefreshHash:function(){return m},getPrerenderResumeDataCache:function(){return d},getRenderResumeDataCache:function(){return f},getServerComponentsHmrCache:function(){return p},getStagedRenderingController:function(){return y},isHmrRefresh:function(){return h},isInEarlyRenderStage:function(){return u},throwForMissingRequestStore:function(){return c},throwInvariantForMissingStore:function(){return l},workUnitAsyncStorage:function(){return i.workUnitAsyncStorageInstance}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let i=e.r(45955);e.r(21768);let o=e.r(12718),s=e.r(42852);function u(e){let t=e.stagedRendering;return!!t&&(t.currentStage===s.RenderStage.EarlyStatic||t.currentStage===s.RenderStage.EarlyRuntime)}function c(e){throw Object.defineProperty(Error(`\`${e}\` was called outside a request scope. Read more: https://nextjs.org/docs/messages/next-dynamic-api-wrong-context`),"__NEXT_ERROR_CODE",{value:"E251",enumerable:!1,configurable:!0})}function l(){throw Object.defineProperty(new o.InvariantError("Expected workUnitAsyncStorage to have a store."),"__NEXT_ERROR_CODE",{value:"E696",enumerable:!1,configurable:!0})}function d(e){switch(e.type){case"prerender":case"prerender-runtime":case"prerender-ppr":case"prerender-client":case"validation-client":return e.prerenderResumeDataCache;case"request":if(e.prerenderResumeDataCache)return e.prerenderResumeDataCache;case"prerender-legacy":case"cache":case"private-cache":case"unstable-cache":case"generate-static-params":return null;default:return e}}function f(e){switch(e.type){case"request":case"prerender":case"prerender-runtime":case"prerender-client":case"validation-client":if(e.renderResumeDataCache)return e.renderResumeDataCache;case"prerender-ppr":return e.prerenderResumeDataCache??null;case"cache":case"private-cache":case"unstable-cache":case"prerender-legacy":case"generate-static-params":return null;default:return e}}function m(e){}function h(e){return!1}function p(e){}function g(e,t){if(e.isDraftMode)switch(t.type){case"cache":case"private-cache":case"unstable-cache":case"prerender-runtime":case"request":return t.draftMode}}function y(e){switch(e.type){case"request":case"prerender-runtime":return e.stagedRendering??null;case"prerender":case"prerender-client":case"validation-client":case"prerender-ppr":case"prerender-legacy":case"cache":case"private-cache":case"unstable-cache":case"generate-static-params":return null;default:return e}}function b(e){switch(e.type){case"prerender":case"prerender-client":case"validation-client":case"prerender-runtime":return e.cacheSignal;case"request":if(e.cacheSignal)return e.cacheSignal;case"prerender-ppr":case"prerender-legacy":case"cache":case"private-cache":case"unstable-cache":case"generate-static-params":return null;default:return e}}},13957,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ServerInsertedHTMLContext:function(){return o},useServerInsertedHTML:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let i=e.r(90809)._(e.r(71645)),o=i.default.createContext(null);function s(e){let t=(0,i.useContext)(o);t&&t(e)}},22783,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"notFound",{enumerable:!0,get:function(){return i}});let n=e.r(54394),a=`${n.HTTP_ERROR_FALLBACK_ERROR_CODE};404`;function i(){let e=Object.defineProperty(Error(a),"__NEXT_ERROR_CODE",{value:"E1041",enumerable:!1,configurable:!0});throw e.digest=a,e}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},79854,(e,t,r)=>{"use strict";function n(){throw Object.defineProperty(Error("`forbidden()` is experimental and only allowed to be enabled when `experimental.authInterrupts` is enabled."),"__NEXT_ERROR_CODE",{value:"E488",enumerable:!1,configurable:!0})}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"forbidden",{enumerable:!0,get:function(){return n}}),e.r(54394).HTTP_ERROR_FALLBACK_ERROR_CODE,("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},22683,(e,t,r)=>{"use strict";function n(){throw Object.defineProperty(Error("`unauthorized()` is experimental and only allowed to be used when `experimental.authInterrupts` is enabled."),"__NEXT_ERROR_CODE",{value:"E411",enumerable:!1,configurable:!0})}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unauthorized",{enumerable:!0,get:function(){return n}}),e.r(54394).HTTP_ERROR_FALLBACK_ERROR_CODE,("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},15507,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unstable_rethrow",{enumerable:!0,get:function(){return function e(t){if((0,a.isNextRouterError)(t)||(0,n.isBailoutToCSRError)(t))throw t;t instanceof Error&&"cause"in t&&e(t.cause)}}});let n=e.r(32061),a=e.r(65713);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},63138,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={delayUntilRuntimeStage:function(){return h},getRuntimeStage:function(){return m},isHangingPromiseRejectionError:function(){return o},makeDevtoolsIOAwarePromise:function(){return f},makeHangingPromise:function(){return l}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let i=e.r(42852);function o(e){return"object"==typeof e&&null!==e&&"digest"in e&&e.digest===s}let s="HANGING_PROMISE_REJECTION";class u extends Error{constructor(e,t){super(`During prerendering, ${t} rejects when the prerender is complete. Typically these errors are handled by React but if you move ${t} to a different context by using \`setTimeout\`, \`after\`, or similar functions you may observe this error and you should handle it in that context. This occurred at route "${e}".`),this.route=e,this.expression=t,this.digest=s}}let c=new WeakMap;function l(e,t,r){if(e.aborted)return Promise.reject(new u(t,r));{let n=new Promise((n,a)=>{let i=a.bind(null,new u(t,r)),o=c.get(e);if(o)o.push(i);else{let t=[i];c.set(e,t),e.addEventListener("abort",()=>{for(let e=0;e<t.length;e++)t[e]()},{once:!0})}});return n.catch(d),n}}function d(){}function f(e,t,r){return t.stagedRendering?t.stagedRendering.delayUntilStage(r,void 0,e):new Promise(t=>{setTimeout(()=>{t(e)},0)})}function m(e){return e.currentStage===i.RenderStage.EarlyStatic||e.currentStage===i.RenderStage.EarlyRuntime?i.RenderStage.EarlyRuntime:i.RenderStage.Runtime}function h(e,t){let{stagedRendering:r}=e;return r?r.waitForStage(m(r)).then(()=>t):t}},67287,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isPostpone",{enumerable:!0,get:function(){return a}});let n=Symbol.for("react.postpone");function a(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}},76353,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={DynamicServerError:function(){return o},isDynamicServerError:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let i="DYNAMIC_SERVER_USAGE";class o extends Error{constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,this.digest=i}}function s(e){return"object"==typeof e&&null!==e&&"digest"in e&&"string"==typeof e.digest&&e.digest===i}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},43248,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={StaticGenBailoutError:function(){return o},isStaticGenBailoutError:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let i="NEXT_STATIC_GEN_BAILOUT";class o extends Error{constructor(...e){super(...e),this.code=i}}function s(e){return"object"==typeof e&&null!==e&&"code"in e&&e.code===i}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},54839,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={METADATA_BOUNDARY_NAME:function(){return i},OUTLET_BOUNDARY_NAME:function(){return s},ROOT_LAYOUT_BOUNDARY_NAME:function(){return u},VIEWPORT_BOUNDARY_NAME:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let i="__next_metadata_boundary__",o="__next_viewport_boundary__",s="__next_outlet_boundary__",u="__next_root_layout_boundary__"},29419,(e,t,r)=>{"use strict";var n=e.i(47167);Object.defineProperty(r,"__esModule",{value:!0});var a={atLeastOneTask:function(){return u},scheduleImmediate:function(){return s},scheduleOnNextTick:function(){return o},waitAtLeastOneReactRenderTask:function(){return c}};for(var i in a)Object.defineProperty(r,i,{enumerable:!0,get:a[i]});let o=e=>{Promise.resolve().then(()=>{n.default.nextTick(e)})},s=e=>{setImmediate(e)};function u(){return new Promise(e=>s(e))}function c(){return new Promise(e=>setImmediate(e))}},2897,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"INSTANT_VALIDATION_BOUNDARY_NAME",{enumerable:!0,get:function(){return n}});let n="__next_instant_validation_boundary__"},67673,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,a,i,o={DynamicHoleKind:function(){return Z},Postpone:function(){return T},PreludeState:function(){return ei},abortAndThrowOnSynchronousRequestDataAccess:function(){return D},abortOnSynchronousPlatformIOAccess:function(){return j},accessedDynamicData:function(){return L},annotateDynamicAccess:function(){return H},consumeDynamicAccess:function(){return $},createDynamicTrackingState:function(){return E},createDynamicValidationState:function(){return R},createHangingInputAbortSignal:function(){return X},createInstantValidationState:function(){return Q},createRenderInBrowserAbortSignal:function(){return B},formatDynamicAPIAccesses:function(){return U},getFirstDynamicReason:function(){return v},getNavigationDisallowedDynamicReasons:function(){return ec},getStaticShellDisallowedDynamicReasons:function(){return eu},isDynamicPostpone:function(){return C},isPrerenderInterruptedError:function(){return I},logDisallowedDynamicError:function(){return eo},markCurrentScopeAsDynamic:function(){return S},postponeWithTracking:function(){return x},throwIfDisallowedDynamic:function(){return es},throwToInterruptStaticGeneration:function(){return O},trackAllowedDynamicAccess:function(){return J},trackDynamicDataInDynamicRender:function(){return w},trackDynamicHoleInNavigation:function(){return ee},trackDynamicHoleInRuntimeShell:function(){return er},trackDynamicHoleInStaticShell:function(){return en},trackThrownErrorInNavigation:function(){return et},useDynamicRouteParams:function(){return F},useDynamicSearchParams:function(){return W}};for(var s in o)Object.defineProperty(r,s,{enumerable:!0,get:o[s]});let u=(n=e.r(71645))&&n.__esModule?n:{default:n},c=e.r(76353),l=e.r(43248),d=e.r(62141),f=e.r(63599),m=e.r(63138),h=e.r(54839),p=e.r(29419),g=e.r(32061),y=e.r(12718),b=e.r(2897),_="function"==typeof u.default.unstable_postpone;function E(e){return{isDebugDynamicAccesses:e,dynamicAccesses:[],syncDynamicErrorWithStack:null}}function R(){return{hasSuspenseAboveBody:!1,hasDynamicMetadata:!1,dynamicMetadata:null,hasDynamicViewport:!1,hasAllowedDynamic:!1,dynamicErrors:[]}}function v(e){var t;return null==(t=e.dynamicAccesses[0])?void 0:t.expression}function S(e,t,r){if(t)switch(t.type){case"cache":case"unstable-cache":case"private-cache":return}if(!e.forceDynamic&&!e.forceStatic){if(e.dynamicShouldError)throw Object.defineProperty(new l.StaticGenBailoutError(`Route ${e.route} with \`dynamic = "error"\` couldn't be rendered statically because it used \`${r}\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`),"__NEXT_ERROR_CODE",{value:"E553",enumerable:!1,configurable:!0});if(t)switch(t.type){case"prerender-ppr":return x(e.route,r,t.dynamicTracking);case"prerender-legacy":t.revalidate=0;let n=Object.defineProperty(new c.DynamicServerError(`Route ${e.route} couldn't be rendered statically because it used ${r}. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`),"__NEXT_ERROR_CODE",{value:"E550",enumerable:!1,configurable:!0});throw e.dynamicUsageDescription=r,e.dynamicUsageStack=n.stack,n}}}function O(e,t,r){let n=Object.defineProperty(new c.DynamicServerError(`Route ${t.route} couldn't be rendered statically because it used \`${e}\`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`),"__NEXT_ERROR_CODE",{value:"E558",enumerable:!1,configurable:!0});throw r.revalidate=0,t.dynamicUsageDescription=e,t.dynamicUsageStack=n.stack,n}function w(e){switch(e.type){case"cache":case"unstable-cache":case"private-cache":return}}function P(e,t,r){let n=M(`Route ${e} needs to bail out of prerendering at this point because it used ${t}.`);r.controller.abort(n);let a=r.dynamicTracking;a&&a.dynamicAccesses.push({stack:a.isDebugDynamicAccesses?Error().stack:void 0,expression:t})}function j(e,t,r,n){let a=n.dynamicTracking;P(e,t,n),a&&null===a.syncDynamicErrorWithStack&&(a.syncDynamicErrorWithStack=r)}function D(e,t,r,n){if(!1===n.controller.signal.aborted){P(e,t,n);let a=n.dynamicTracking;a&&null===a.syncDynamicErrorWithStack&&(a.syncDynamicErrorWithStack=r)}throw M(`Route ${e} needs to bail out of prerendering at this point because it used ${t}.`)}function T({reason:e,route:t}){let r=d.workUnitAsyncStorage.getStore();x(t,e,r&&"prerender-ppr"===r.type?r.dynamicTracking:null)}function x(e,t,r){(function(){if(!_)throw Object.defineProperty(Error("Invariant: React.unstable_postpone is not defined. This suggests the wrong version of React was loaded. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E224",enumerable:!1,configurable:!0})})(),r&&r.dynamicAccesses.push({stack:r.isDebugDynamicAccesses?Error().stack:void 0,expression:t}),u.default.unstable_postpone(A(e,t))}function A(e,t){return`Route ${e} needs to bail out of prerendering at this point because it used ${t}. React throws this special object to indicate where. It should not be caught by your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`}function C(e){return"object"==typeof e&&null!==e&&"string"==typeof e.message&&N(e.message)}function N(e){return e.includes("needs to bail out of prerendering at this point because it used")&&e.includes("Learn more: https://nextjs.org/docs/messages/ppr-caught-error")}if(!1===N(A("%%%","^^^")))throw Object.defineProperty(Error("Invariant: isDynamicPostpone misidentified a postpone reason. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E296",enumerable:!1,configurable:!0});let k="NEXT_PRERENDER_INTERRUPTED";function M(e){let t=Object.defineProperty(Error(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return t.digest=k,t}function I(e){return"object"==typeof e&&null!==e&&e.digest===k&&"name"in e&&"message"in e&&e instanceof Error}function L(e){return e.length>0}function $(e,t){return e.dynamicAccesses.push(...t.dynamicAccesses),e.dynamicAccesses}function U(e){return e.filter(e=>"string"==typeof e.stack&&e.stack.length>0).map(({expression:e,stack:t})=>(t=t.split("\n").slice(4).filter(e=>!(e.includes("node_modules/next/")||e.includes(" (<anonymous>)")||e.includes(" (node:"))).join("\n"),`Dynamic API Usage Debug - ${e}:
2
+ ${t}`))}function B(){let e=new AbortController;return e.abort(Object.defineProperty(new g.BailoutToCSRError("Render in Browser"),"__NEXT_ERROR_CODE",{value:"E721",enumerable:!1,configurable:!0})),e.signal}function X(e){switch(e.type){case"prerender":case"prerender-runtime":let t=new AbortController;if(e.cacheSignal)e.cacheSignal.inputReady().then(()=>{t.abort()});else if("prerender-runtime"===e.type&&e.stagedRendering){let{stagedRendering:r}=e;r.waitForStage((0,m.getRuntimeStage)(r)).then(()=>(0,p.scheduleOnNextTick)(()=>t.abort()))}else(0,p.scheduleOnNextTick)(()=>t.abort());return t.signal;case"prerender-client":case"validation-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"private-cache":case"unstable-cache":case"generate-static-params":return}}function H(e,t){let r=t.dynamicTracking;r&&r.dynamicAccesses.push({stack:r.isDebugDynamicAccesses?Error().stack:void 0,expression:e})}function F(e){let t=f.workAsyncStorage.getStore(),r=d.workUnitAsyncStorage.getStore();if(t&&r)switch(r.type){case"prerender-client":case"prerender":{let n=r.fallbackRouteParams;n&&n.size>0&&u.default.use((0,m.makeHangingPromise)(r.renderSignal,t.route,e));break}case"prerender-ppr":{let n=r.fallbackRouteParams;if(n&&n.size>0)return x(t.route,e,r.dynamicTracking);break}case"validation-client":case"prerender-legacy":case"request":case"unstable-cache":break;case"prerender-runtime":throw Object.defineProperty(new y.InvariantError(`\`${e}\` was called during a runtime prerender. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E771",enumerable:!1,configurable:!0});case"cache":case"private-cache":throw Object.defineProperty(new y.InvariantError(`\`${e}\` was called inside a cache scope. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E745",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new y.InvariantError(`\`${e}\` was called in \`generateStaticParams\`. Next.js should be preventing ${e} from being included in server component files statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E1130",enumerable:!1,configurable:!0})}}function W(e){let t=f.workAsyncStorage.getStore(),r=d.workUnitAsyncStorage.getStore();if(t)switch(!r&&(0,d.throwForMissingRequestStore)(e),r.type){case"validation-client":case"request":return;case"prerender-client":u.default.use((0,m.makeHangingPromise)(r.renderSignal,t.route,e));break;case"prerender-legacy":case"prerender-ppr":if(t.forceStatic)return;throw Object.defineProperty(new g.BailoutToCSRError(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});case"prerender":case"prerender-runtime":throw Object.defineProperty(new y.InvariantError(`\`${e}\` was called from a Server Component. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E795",enumerable:!1,configurable:!0});case"cache":case"unstable-cache":case"private-cache":throw Object.defineProperty(new y.InvariantError(`\`${e}\` was called inside a cache scope. Next.js should be preventing ${e} from being included in server components statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E745",enumerable:!1,configurable:!0});case"generate-static-params":throw Object.defineProperty(new y.InvariantError(`\`${e}\` was called in \`generateStaticParams\`. Next.js should be preventing ${e} from being included in server component files statically, but did not in this case.`),"__NEXT_ERROR_CODE",{value:"E1130",enumerable:!1,configurable:!0})}}let z=/\n\s+at Suspense \(<anonymous>\)/,V=RegExp(`\\n\\s+at Suspense \\(<anonymous>\\)(?:(?!\\n\\s+at (?:body|div|main|section|article|aside|header|footer|nav|form|p|span|h1|h2|h3|h4|h5|h6) \\(<anonymous>\\))[\\s\\S])*?\\n\\s+at ${h.ROOT_LAYOUT_BOUNDARY_NAME} \\([^\\n]*\\)`),q=RegExp(`\\n\\s+at ${h.METADATA_BOUNDARY_NAME}[\\n\\s]`),G=RegExp(`\\n\\s+at ${h.VIEWPORT_BOUNDARY_NAME}[\\n\\s]`),Y=RegExp(`\\n\\s+at ${h.OUTLET_BOUNDARY_NAME}[\\n\\s]`),K=RegExp(`\\n\\s+at ${b.INSTANT_VALIDATION_BOUNDARY_NAME}[\\n\\s]`);function J(e,t,r,n){if(!Y.test(t)){if(q.test(t)){r.hasDynamicMetadata=!0;return}if(G.test(t)){r.hasDynamicViewport=!0;return}if(V.test(t)){r.hasAllowedDynamic=!0,r.hasSuspenseAboveBody=!0;return}else if(z.test(t)){r.hasAllowedDynamic=!0;return}else{if(n.syncDynamicErrorWithStack)return void r.dynamicErrors.push(n.syncDynamicErrorWithStack);let a=ea(Object.defineProperty(Error(`Route "${e.route}": Uncached data was accessed outside of <Suspense>. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`),"__NEXT_ERROR_CODE",{value:"E1079",enumerable:!1,configurable:!0}),t,null);return void r.dynamicErrors.push(a)}}}var Z=((a={})[a.Runtime=1]="Runtime",a[a.Dynamic=2]="Dynamic",a);function Q(e){return{hasDynamicMetadata:!1,hasAllowedClientDynamicAboveBoundary:!1,dynamicMetadata:null,hasDynamicViewport:!1,hasAllowedDynamic:!1,dynamicErrors:[],validationPreventingErrors:[],thrownErrorsOutsideBoundary:[],createInstantStack:e}}function ee(e,t,r,n,a,i){if(Y.test(t))return;if(q.test(t)){let n=ea(Object.defineProperty(Error(`Route "${e.route}": ${1===a?"Runtime data such as `cookies()`, `headers()`, `params`, or `searchParams` was accessed inside `generateMetadata` or you have file-based metadata such as icons that depend on dynamic params segments.":"Uncached data or `connection()` was accessed inside `generateMetadata`."} Except for this instance, the page would have been entirely prerenderable which may have been the intended behavior. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-metadata`),"__NEXT_ERROR_CODE",{value:"E1076",enumerable:!1,configurable:!0}),t,r.createInstantStack);r.dynamicMetadata=n;return}if(G.test(t)){let n=ea(Object.defineProperty(Error(`Route "${e.route}": ${1===a?"Runtime data such as `cookies()`, `headers()`, `params`, or `searchParams` was accessed inside `generateViewport`.":"Uncached data or `connection()` was accessed inside `generateViewport`."} This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/next-prerender-dynamic-viewport`),"__NEXT_ERROR_CODE",{value:"E1086",enumerable:!1,configurable:!0}),t,r.createInstantStack);r.dynamicErrors.push(n);return}let o=K.exec(t);if(o){let e=z.exec(t);if(e&&e.index<o.index){r.hasAllowedDynamic=!0;return}}else if(i.expectedIds.size===i.renderedIds.size){r.hasAllowedClientDynamicAboveBoundary=!0,r.hasAllowedDynamic=!0;return}else{let n=ea(Object.defineProperty(Error(`Route "${e.route}": Could not validate \`unstable_instant\` because a Client Component in a parent segment prevented the page from rendering.`),"__NEXT_ERROR_CODE",{value:"E1082",enumerable:!1,configurable:!0}),t,r.createInstantStack);r.validationPreventingErrors.push(n);return}if(n.syncDynamicErrorWithStack){let e=n.syncDynamicErrorWithStack;null!==r.createInstantStack&&void 0===e.cause&&(e.cause=r.createInstantStack()),r.dynamicErrors.push(e);return}let s=ea(Object.defineProperty(Error(`Route "${e.route}": ${1===a?"Runtime data such as `cookies()`, `headers()`, `params`, or `searchParams` was accessed outside of `<Suspense>`.":"Uncached data or `connection()` was accessed outside of `<Suspense>`."} This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`),"__NEXT_ERROR_CODE",{value:"E1078",enumerable:!1,configurable:!0}),t,r.createInstantStack);r.dynamicErrors.push(s)}function et(e,t,r,n){let a=K.exec(n);if(a){let i=z.exec(n);if(i&&i.index<a.index)return;let o=ea(Object.defineProperty(Error(`Route "${e.route}": Could not validate \`unstable_instant\` because an error prevented the target segment from rendering.`,{cause:r}),"__NEXT_ERROR_CODE",{value:"E1112",enumerable:!1,configurable:!0}),n,null);t.validationPreventingErrors.push(o)}else{let e=ea(Object.defineProperty(Error("An error occurred while attempting to validate instant UI. This error may be preventing the validation from completing.",{cause:r}),"__NEXT_ERROR_CODE",{value:"E1118",enumerable:!1,configurable:!0}),n,null);t.thrownErrorsOutsideBoundary.push(e)}}function er(e,t,r,n){if(Y.test(t))return;if(q.test(t)){r.dynamicMetadata=ea(Object.defineProperty(Error(`Route "${e.route}": Uncached data or \`connection()\` was accessed inside \`generateMetadata\`. Except for this instance, the page would have been entirely prerenderable which may have been the intended behavior. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-metadata`),"__NEXT_ERROR_CODE",{value:"E1080",enumerable:!1,configurable:!0}),t,null);return}if(G.test(t)){let n=ea(Object.defineProperty(Error(`Route "${e.route}": Uncached data or \`connection()\` was accessed inside \`generateViewport\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/next-prerender-dynamic-viewport`),"__NEXT_ERROR_CODE",{value:"E1077",enumerable:!1,configurable:!0}),t,null);r.dynamicErrors.push(n);return}if(V.test(t)){r.hasAllowedDynamic=!0,r.hasSuspenseAboveBody=!0;return}if(z.test(t)){r.hasAllowedDynamic=!0;return}else if(n.syncDynamicErrorWithStack)return void r.dynamicErrors.push(n.syncDynamicErrorWithStack);let a=ea(Object.defineProperty(Error(`Route "${e.route}": Uncached data or \`connection()\` was accessed outside of \`<Suspense>\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`),"__NEXT_ERROR_CODE",{value:"E1084",enumerable:!1,configurable:!0}),t,null);r.dynamicErrors.push(a)}function en(e,t,r,n){if(!Y.test(t)){if(q.test(t)){r.dynamicMetadata=ea(Object.defineProperty(Error(`Route "${e.route}": Runtime data such as \`cookies()\`, \`headers()\`, \`params\`, or \`searchParams\` was accessed inside \`generateMetadata\` or you have file-based metadata such as icons that depend on dynamic params segments. Except for this instance, the page would have been entirely prerenderable which may have been the intended behavior. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-metadata`),"__NEXT_ERROR_CODE",{value:"E1085",enumerable:!1,configurable:!0}),t,null);return}if(G.test(t)){let n=ea(Object.defineProperty(Error(`Route "${e.route}": Runtime data such as \`cookies()\`, \`headers()\`, \`params\`, or \`searchParams\` was accessed inside \`generateViewport\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/next-prerender-dynamic-viewport`),"__NEXT_ERROR_CODE",{value:"E1081",enumerable:!1,configurable:!0}),t,null);r.dynamicErrors.push(n);return}if(V.test(t)){r.hasAllowedDynamic=!0,r.hasSuspenseAboveBody=!0;return}else if(z.test(t)){r.hasAllowedDynamic=!0;return}else{if(n.syncDynamicErrorWithStack)return void r.dynamicErrors.push(n.syncDynamicErrorWithStack);let a=ea(Object.defineProperty(Error(`Route "${e.route}": Runtime data such as \`cookies()\`, \`headers()\`, \`params\`, or \`searchParams\` was accessed outside of \`<Suspense>\`. This delays the entire page from rendering, resulting in a slow user experience. Learn more: https://nextjs.org/docs/messages/blocking-route`),"__NEXT_ERROR_CODE",{value:"E1083",enumerable:!1,configurable:!0}),t,null);return void r.dynamicErrors.push(a)}}}function ea(e,t,r){return null!==r&&(e.cause=r()),e.stack=e.name+": "+e.message+t,e}var ei=((i={})[i.Full=0]="Full",i[i.Empty=1]="Empty",i[i.Errored=2]="Errored",i);function eo(e,t){console.error(t),console.error(`To get a more detailed stack trace and pinpoint the issue, try one of the following:
3
+ - Start the app in development mode by running \`next dev\`, then open "${e.route}" in your browser to investigate the error.
4
+ - Rerun the production build with \`next build --debug-prerender\` to generate better stack traces.`)}function es(e,t,r,n){if(n.syncDynamicErrorWithStack)throw eo(e,n.syncDynamicErrorWithStack),new l.StaticGenBailoutError;if(0!==t){if(r.hasSuspenseAboveBody)return;let n=r.dynamicErrors;if(n.length>0){for(let t=0;t<n.length;t++)eo(e,n[t]);throw new l.StaticGenBailoutError}if(r.hasDynamicViewport)throw console.error(`Route "${e.route}" has a \`generateViewport\` that depends on Request data (\`cookies()\`, etc...) or uncached external data (\`fetch(...)\`, etc...) without explicitly allowing fully dynamic rendering. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-viewport`),new l.StaticGenBailoutError;if(1===t)throw console.error(`Route "${e.route}" did not produce a static shell and Next.js was unable to determine a reason. This is a bug in Next.js.`),new l.StaticGenBailoutError}else if(!1===r.hasAllowedDynamic&&r.hasDynamicMetadata)throw console.error(`Route "${e.route}" has a \`generateMetadata\` that depends on Request data (\`cookies()\`, etc...) or uncached external data (\`fetch(...)\`, etc...) when the rest of the route does not. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-metadata`),new l.StaticGenBailoutError}function eu(e,t,r,n){if(n||r.hasSuspenseAboveBody)return[];if(0!==t){let n=r.dynamicErrors;if(n.length>0)return n;if(1===t)return[Object.defineProperty(new y.InvariantError(`Route "${e.route}" did not produce a static shell and Next.js was unable to determine a reason.`),"__NEXT_ERROR_CODE",{value:"E936",enumerable:!1,configurable:!0})]}else if(!1===r.hasAllowedDynamic&&0===r.dynamicErrors.length&&r.dynamicMetadata)return[r.dynamicMetadata];return[]}function ec(e,t,r,n,a){if(n){let{missingSampleErrors:e}=n;if(e.length>0)return e}let{validationPreventingErrors:i}=r;if(i.length>0)return i;if(a.renderedIds.size<a.expectedIds.size){let{thrownErrorsOutsideBoundary:t,createInstantStack:n}=r;if(0===t.length){let t=`Route "${e.route}": Could not validate \`unstable_instant\` because the target segment was prevented from rendering for an unknown reason.`,r=null!==n?n():Error();return r.name="Error",r.message=t,[r]}if(1===t.length){let r=`Route "${e.route}": Could not validate \`unstable_instant\` because the target segment was prevented from rendering, likely due to the following error.`,a=null!==n?n():Error();return a.name="Error",a.message=r,[a,t[0]]}{let r=`Route "${e.route}": Could not validate \`unstable_instant\` because the target segment was prevented from rendering, likely due to one of the following errors.`,a=null!==n?n():Error();return a.name="Error",a.message=r,[a,...t]}}if(0!==t){let n=r.dynamicErrors;if(n.length>0)return n;if(1===t)return r.hasAllowedClientDynamicAboveBoundary?[]:[Object.defineProperty(new y.InvariantError(`Route "${e.route}" failed to render during instant validation and Next.js was unable to determine a reason.`),"__NEXT_ERROR_CODE",{value:"E1055",enumerable:!1,configurable:!0})]}else{let e=r.dynamicErrors;if(e.length>0)return e;if(!1===r.hasAllowedDynamic&&r.dynamicMetadata)return[r.dynamicMetadata]}return[]}},91414,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unstable_rethrow",{enumerable:!0,get:function(){return function e(t){if((0,o.isNextRouterError)(t)||(0,i.isBailoutToCSRError)(t)||(0,u.isDynamicServerError)(t)||(0,s.isDynamicPostpone)(t)||(0,a.isPostpone)(t)||(0,n.isHangingPromiseRejectionError)(t)||(0,s.isPrerenderInterruptedError)(t))throw t;t instanceof Error&&"cause"in t&&e(t.cause)}}});let n=e.r(63138),a=e.r(67287),i=e.r(32061),o=e.r(65713),s=e.r(67673),u=e.r(76353);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},90508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"unstable_rethrow",{enumerable:!0,get:function(){return n}});let n="u"<typeof window?e.r(91414).unstable_rethrow:e.r(15507).unstable_rethrow;("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},92805,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ReadonlyURLSearchParams:function(){return i.ReadonlyURLSearchParams},RedirectType:function(){return f},forbidden:function(){return u.forbidden},notFound:function(){return s.notFound},permanentRedirect:function(){return o.permanentRedirect},redirect:function(){return o.redirect},unauthorized:function(){return c.unauthorized},unstable_isUnrecognizedActionError:function(){return d},unstable_rethrow:function(){return l.unstable_rethrow}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let i=e.r(3680),o=e.r(24063),s=e.r(22783),u=e.r(79854),c=e.r(22683),l=e.r(90508);function d(){throw Object.defineProperty(Error("`unstable_isUnrecognizedActionError` can only be used on the client."),"__NEXT_ERROR_CODE",{value:"E776",enumerable:!1,configurable:!0})}let f={push:"push",replace:"replace"};("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},76562,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={ReadonlyURLSearchParams:function(){return s.ReadonlyURLSearchParams},RedirectType:function(){return d.RedirectType},ServerInsertedHTMLContext:function(){return c.ServerInsertedHTMLContext},forbidden:function(){return d.forbidden},notFound:function(){return d.notFound},permanentRedirect:function(){return d.permanentRedirect},redirect:function(){return d.redirect},unauthorized:function(){return d.unauthorized},unstable_isUnrecognizedActionError:function(){return l.unstable_isUnrecognizedActionError},unstable_rethrow:function(){return d.unstable_rethrow},useParams:function(){return E},usePathname:function(){return b},useRouter:function(){return _},useSearchParams:function(){return y},useSelectedLayoutSegment:function(){return v},useSelectedLayoutSegments:function(){return R},useServerInsertedHTML:function(){return c.useServerInsertedHTML}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let i=e.r(90809)._(e.r(71645)),o=e.r(8372),s=e.r(61994),u=e.r(13258),c=e.r(13957),l=e.r(92838),d=e.r(92805),f="u"<typeof window?e.r(67673).useDynamicRouteParams:void 0,m="u"<typeof window?e.r(67673).useDynamicSearchParams:void 0,{instrumentParamsForClientValidation:h,instrumentSearchParamsForClientValidation:p,expectCompleteParamsInClientValidation:g}={};function y(){m?.("useSearchParams()");let e=(0,i.useContext)(s.SearchParamsContext);return(0,i.useMemo)(()=>e?new s.ReadonlyURLSearchParams(e):null,[e])}function b(){return f?.("usePathname()"),(0,i.useContext)(s.PathnameContext)}function _(){let e=(0,i.useContext)(o.AppRouterContext);if(null===e)throw Object.defineProperty(Error("invariant expected app router to be mounted"),"__NEXT_ERROR_CODE",{value:"E238",enumerable:!1,configurable:!0});return e}function E(){return f?.("useParams()"),(0,i.useContext)(s.PathParamsContext)}function R(e="children"){f?.("useSelectedLayoutSegments()");let t=(0,i.useContext)(o.LayoutRouterContext);return t?(0,u.getSelectedLayoutSegmentPath)(t.parentTree,e):null}function v(e="children"){f?.("useSelectedLayoutSegment()"),(0,i.useContext)(s.NavigationPromisesContext);let t=R(e);return(0,u.computeSelectedLayoutSegment)(t,e)}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)}]);
_next/static/chunks/2927-a494ee41b72ffcba.js DELETED
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2927],{1019:(e,a,o)=>{function r(e,a){return`${e}:${a}`}function t(e,a,o){try{let t=window.localStorage.getItem(r(e,a));return t?JSON.parse(t):o}catch{return o}}function s(e,a,o){try{return window.localStorage.setItem(r(e,a),JSON.stringify(o)),!0}catch{return!1}}function i(e,a){try{window.localStorage.removeItem(r(e,a))}catch{}}o.d(a,{RW:()=>i,_1:()=>r,bt:()=>t,ou:()=>s})},2844:(e,a,o)=>{o.d(a,{PrimaryButton:()=>s});var r=o(5155),t=o(5862);function s({children:e,href:a,onClick:o,type:i="button",className:l="",disabled:d=!1}){let n=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-coral px-6 py-3 text-center font-black text-white shadow-warm transition hover:-translate-y-0.5 hover:brightness-105 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-coral/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${l}`;return a&&!d?(0,r.jsx)(t.ExportSafeLink,{className:n,href:a,children:e}):(0,r.jsx)("button",{className:n,type:i,onClick:o,disabled:d,children:e})}},3321:(e,a,o)=>{var r=o(4645);o.o(r,"usePathname")&&o.d(a,{usePathname:function(){return r.usePathname}}),o.o(r,"useRouter")&&o.d(a,{useRouter:function(){return r.useRouter}})},4016:(e,a,o)=>{o.d(a,{z:()=>t});var r=o(5155);function t({eyebrow:e,title:a,description:o,action:s}){return(0,r.jsxs)("header",{className:"flex min-w-0 flex-col gap-5 pb-1 sm:flex-row sm:items-start sm:justify-between",children:[(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("p",{className:"text-sm font-black uppercase tracking-[0.08em] text-amber-700",children:e}),(0,r.jsx)("h1",{className:"mt-2 text-3xl font-black leading-tight tracking-normal text-ink md:text-5xl",children:a}),o?(0,r.jsx)("p",{className:"mt-3 max-w-3xl text-base font-medium leading-7 text-stone-600 md:text-lg md:leading-8",children:o}):null]}),s?(0,r.jsx)("div",{className:"w-full shrink-0 sm:w-auto",children:s}):null]})}},4200:(e,a,o)=>{o.d(a,{SecondaryButton:()=>s});var r=o(5155),t=o(5862);function s({children:e,href:a,onClick:o,type:i="button",className:l="",disabled:d=!1}){let n=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-butter px-6 py-3 text-center font-black text-amber-900 shadow-sm transition hover:-translate-y-0.5 hover:bg-amber-100 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-honey/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${l}`;return a&&!d?(0,r.jsx)(t.ExportSafeLink,{className:n,href:a,children:e}):(0,r.jsx)("button",{className:n,type:i,onClick:o,disabled:d,children:e})}},5998:(e,a,o)=>{o.d(a,{G:()=>l});var r=o(5155),t=o(6989),s=o(5297),i=o(8284);function l({children:e}){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.ActiveGradeRouteSync,{}),(0,r.jsx)(s.AppSidebar,{}),(0,r.jsxs)("main",{className:"app-reading-scale min-h-screen min-w-0 overflow-x-clip px-4 pb-28 pt-4 lg:ml-64 lg:px-10 lg:py-6",children:[(0,r.jsx)("div",{className:"sticky top-3 z-40 mb-5 lg:hidden",children:(0,r.jsxs)("div",{className:"flex min-w-0 items-center justify-between gap-2 rounded-3xl border border-white/80 bg-white/90 p-3 shadow-warm backdrop-blur-xl",children:[(0,r.jsx)("div",{className:"min-w-0 flex-1",children:(0,r.jsx)(t.BrandHeader,{showPerson:!1})}),(0,r.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,r.jsx)(s.PersonSwitcher,{compact:!0}),(0,r.jsx)(s.MobileMenu,{})]})]})}),(0,r.jsx)("div",{className:"mx-auto min-w-0 w-full max-w-7xl",children:e}),(0,r.jsx)(s.MobileQuickNav,{})]})]})}},6565:(e,a,o)=>{o.d(a,{RZ:()=>s,S8:()=>t});let r={grade:1,title:"小一英文練習",subtitle:"每次 6 個生活單字,搭配可點擊發音、跟讀檢查與小測驗。",wordGroups:[{id:"greeting-school-1",title:"禮貌與校園",description:"從見面、離開、感謝和校園人物開始,讓孩子敢開口。",words:[{word:"hello",zh:"你好",category:"禮貌",usage:"見面時說",example:"Hello, teacher."},{word:"goodbye",zh:"再見",category:"禮貌",usage:"離開時說",example:"Goodbye, friend."},{word:"thank you",zh:"謝謝你",category:"禮貌",usage:"收到幫助時說",example:"Thank you."},{word:"teacher",zh:"老師",category:"校園",usage:"找老師時用",example:"My teacher is kind."},{word:"friend",zh:"朋友",category:"校園",usage:"介紹同學時用",example:"You are my friend."},{word:"book",zh:"書",category:"文具",usage:"拿起課本說",example:"This is my book."}]},{id:"stationery-color-1",title:"文具與顏色",description:"把桌上的文具和看到的顏色說出來。",words:[{word:"pencil",zh:"鉛筆",category:"文具",usage:"寫字時用",example:"This is my pencil."},{word:"eraser",zh:"橡皮擦",category:"文具",usage:"擦掉錯字時說",example:"I need an eraser."},{word:"bag",zh:"書包",category:"文具",usage:"整理書包時說",example:"This is my bag."},{word:"red",zh:"紅色",category:"顏色",usage:"看到紅色時說",example:"It is red."},{word:"blue",zh:"藍色",category:"顏色",usage:"看到藍色時說",example:"It is blue."},{word:"yellow",zh:"黃色",category:"顏色",usage:"看到黃色時說",example:"It is yellow."}]},{id:"family-home-1",title:"家人與家裡",description:"用簡單英文介紹家人和家裡常見物品。",words:[{word:"mother",zh:"媽媽",category:"家人",usage:"介紹媽媽時說",example:"This is my mother."},{word:"father",zh:"爸爸",category:"家人",usage:"介紹爸爸時說",example:"This is my father."},{word:"sister",zh:"姊妹",category:"家人",usage:"介紹姊妹時說",example:"She is my sister."},{word:"brother",zh:"兄弟",category:"家人",usage:"介紹兄弟時說",example:"He is my brother."},{word:"room",zh:"房間",category:"家裡",usage:"介紹房間時說",example:"This is my room."},{word:"table",zh:"桌子",category:"家裡",usage:"看到桌子時說",example:"The book is on the table."}]},{id:"food-feeling-1",title:"食物與心情",description:"從吃喝和心情表達開始,讓英文貼近生活。",words:[{word:"apple",zh:"蘋果",category:"食物",usage:"吃水果時說",example:"I like apples."},{word:"milk",zh:"牛奶",category:"食物",usage:"喝牛奶時說",example:"I drink milk."},{word:"water",zh:"水",category:"食物",usage:"想喝水時說",example:"I need water."},{word:"happy",zh:"開心",category:"心情",usage:"心情好時說",example:"I am happy."},{word:"sad",zh:"難過",category:"心情",usage:"心情不好時說",example:"I am sad."},{word:"tired",zh:"累了",category:"心情",usage:"想休息時說",example:"I am tired."}]},{id:"action-day-1",title:"動作與一天",description:"練習讀、寫、畫、聽、說、玩等日常動作。",words:[{word:"read",zh:"閱讀",category:"動作",usage:"看書時說",example:"I read a book."},{word:"write",zh:"寫",category:"動作",usage:"寫字時說",example:"I write my name."},{word:"draw",zh:"畫畫",category:"動作",usage:"畫圖時說",example:"I draw a sun."},{word:"listen",zh:"聽",category:"動作",usage:"聽老師說話時說",example:"I listen to my teacher."},{word:"speak",zh:"說",category:"動作",usage:"練習開口時說",example:"I speak English."},{word:"play",zh:"玩",category:"動作",usage:"和朋友玩時說",example:"I play with my friend."}]}],dailySentences:["Hello, teacher.","This is my book.","Thank you.","My name is ___.","I need help."],quiz:[{id:"q-hello",question:"hello 是什麼意思?",answer:"你好",options:["你好","書","老師"]},{id:"q-book",question:"book 是什麼意思?",answer:"書",options:["朋友","書","再見"]},{id:"q-thank-you",question:"收到幫助時可以說哪一句?",answer:"Thank you.",options:["Goodbye.","Thank you.","This is my book."]}]},t=[r,{grade:2,title:"小二英文練習",subtitle:"從家人、食物、日常動作開始,練習完整生活句。",wordGroups:[{id:"family-food-2",title:"家人與食物",description:"練習介紹家人,也能說出常見食物。",words:[{word:"mother",zh:"媽媽",category:"家人",usage:"介紹媽媽時說",example:"This is my mother."},{word:"father",zh:"爸爸",category:"家人",usage:"介紹爸爸時說",example:"This is my father."},{word:"sister",zh:"姊妹",category:"家人",usage:"介紹姊妹時說",example:"She is my sister."},{word:"brother",zh:"兄弟",category:"家人",usage:"介紹兄弟時說",example:"He is my brother."},{word:"apple",zh:"蘋果",category:"食物",usage:"吃水果時說",example:"I like apples."},{word:"milk",zh:"牛奶",category:"食物",usage:"喝牛奶時說",example:"I drink milk."}]},{id:"home-action-2",title:"家裡與動作",description:"把家裡常見物品和每天會做的動作說出來。",words:[{word:"room",zh:"房間",category:"家裡",usage:"介紹房間時說",example:"This is my room."},{word:"table",zh:"桌子",category:"家裡",usage:"看到桌子時說",example:"The book is on the table."},{word:"read",zh:"閱讀",category:"動作",usage:"看書時說",example:"I read a book."},{word:"write",zh:"寫",category:"動作",usage:"寫字時說",example:"I write my name."},{word:"draw",zh:"畫畫",category:"動作",usage:"畫圖時說",example:"I draw a sun."},{word:"play",zh:"玩",category:"動作",usage:"和朋友玩時說",example:"I play with my friend."}]},{id:"school-time-2",title:"校園與時間",description:"用簡單句子說出上課、午餐和一天中的時間。",words:[{word:"classroom",zh:"教室",category:"校園",usage:"介紹教室時說",example:"This is my classroom."},{word:"homework",zh:"作業",category:"校園",usage:"準備寫作業時說",example:"I do my homework."},{word:"lunch",zh:"午餐",category:"校園",usage:"吃午餐時說",example:"I eat lunch at school."},{word:"morning",zh:"早上",category:"時間",usage:"早上打招呼時說",example:"Good morning."},{word:"afternoon",zh:"下午",category:"時間",usage:"下午打招呼時說",example:"Good afternoon."},{word:"evening",zh:"晚上",category:"時間",usage:"晚上打招呼時說",example:"Good evening."}]},{id:"clothes-weather-2",title:"衣物與天氣",description:"依照天氣說出今天穿的衣物。",words:[{word:"shirt",zh:"上衣",category:"衣物",usage:"介紹衣服時說",example:"This is my shirt."},{word:"shoes",zh:"鞋子",category:"衣物",usage:"穿鞋時說",example:"These are my shoes."},{word:"hat",zh:"帽子",category:"衣物",usage:"戴帽子時說",example:"I have a hat."},{word:"sunny",zh:"晴朗的",category:"天氣",usage:"晴天時說",example:"It is sunny today."},{word:"rainy",zh:"下雨的",category:"天氣",usage:"雨天時說",example:"It is rainy today."},{word:"windy",zh:"有風的",category:"天氣",usage:"風很大時說",example:"It is windy today."}]},{id:"body-health-2",title:"身體與感受",description:"認識身體部位,也能說出餓、渴和不舒服。",words:[{word:"head",zh:"頭",category:"身體",usage:"指出頭部時說",example:"This is my head."},{word:"hand",zh:"手",category:"身體",usage:"指出手時說",example:"This is my hand."},{word:"foot",zh:"腳",category:"身體",usage:"指出腳時說",example:"This is my foot."},{word:"hungry",zh:"餓了",category:"感受",usage:"想吃東西時說",example:"I am hungry."},{word:"thirsty",zh:"渴了",category:"感受",usage:"想喝水時說",example:"I am thirsty."},{word:"sick",zh:"不舒服",category:"感受",usage:"身體不舒服時說",example:"I feel sick."}]}],dailySentences:["My name is ___.","This is my family.","I like apples.","I read a book.","I play with my friend."],quiz:[{id:"q2-family",question:"family 是什麼意思?",answer:"家人",options:["顏色","家人","鉛筆"]},{id:"q2-apple",question:"apple 是什麼意思?",answer:"蘋果",options:["蘋果","牛奶","書"]}]},{grade:3,title:"小三英文練習",subtitle:"加入動作、場所與比較完整的句型,讓孩子能說出自己的生活。",wordGroups:[{id:"action-learning-3",title:"學習動作",description:"練習讀、寫、聽、說,讓英文和學習情境連在一起。",words:[{word:"read",zh:"閱讀",category:"動作",usage:"看書時說",example:"I read a story."},{word:"write",zh:"寫",category:"動作",usage:"寫字時說",example:"I write English words."},{word:"listen",zh:"聽",category:"動作",usage:"聽老師說話時說",example:"I listen to my teacher."},{word:"speak",zh:"說",category:"動作",usage:"練習開口時說",example:"I speak English."},{word:"practice",zh:"練習",category:"學習",usage:"複習時說",example:"I practice every day."},{word:"question",zh:"問題",category:"學習",usage:"提問時說",example:"I have a question."}]},{id:"places-feelings-3",title:"地點與感受",description:"用英文說出常見地點,也練習描述自己的感覺。",words:[{word:"library",zh:"圖書館",category:"場所",usage:"借書時說",example:"I go to the library."},{word:"park",zh:"公園",category:"場所",usage:"出去玩時說",example:"I play in the park."},{word:"market",zh:"市場",category:"場所",usage:"買東西時說",example:"I go to the market."},{word:"happy",zh:"開心",category:"心情",usage:"心情好時說",example:"I am happy today."},{word:"tired",zh:"累了",category:"心情",usage:"想休息時說",example:"I am tired."},{word:"ready",zh:"準備好了",category:"心情",usage:"開始任務時說",example:"I am ready."}]},{id:"routine-time-3",title:"一天的作息",description:"把起床、吃飯、學習和睡覺連成一天的英文。",words:[{word:"wake",zh:"醒來",category:"作息",usage:"早上起床時說",example:"I wake up at seven."},{word:"breakfast",zh:"早餐",category:"作息",usage:"吃早餐時說",example:"I eat breakfast."},{word:"study",zh:"學習",category:"作息",usage:"開始學習時說",example:"I study English."},{word:"dinner",zh:"晚餐",category:"作息",usage:"吃晚餐時說",example:"I eat dinner with my family."},{word:"sleep",zh:"睡覺",category:"作息",usage:"準備睡覺時說",example:"I go to sleep."},{word:"today",zh:"今天",category:"時間",usage:"說今天的事情時用",example:"I am happy today."}]},{id:"nature-weather-3",title:"自然與天氣",description:"觀察每天的天氣和生活周遭的自然景物。",words:[{word:"weather",zh:"天氣",category:"天氣",usage:"談論天氣時說",example:"How is the weather?"},{word:"sunny",zh:"晴朗的",category:"天氣",usage:"晴天時說",example:"It is sunny today."},{word:"cloudy",zh:"多雲的",category:"天氣",usage:"多雲時說",example:"It is cloudy today."},{word:"rainy",zh:"下雨的",category:"天氣",usage:"雨天時說",example:"It is rainy today."},{word:"tree",zh:"樹",category:"自然",usage:"看到樹時說",example:"I see a tall tree."},{word:"river",zh:"河流",category:"自然",usage:"看到河流時說",example:"The river is long."}]},{id:"community-direction-3",title:"社區與方向",description:"認識社區場所,練習左右和遠近。",words:[{word:"hospital",zh:"醫院",category:"社區",usage:"介紹醫院時說",example:"The hospital is near."},{word:"station",zh:"車站",category:"社區",usage:"詢問車站時說",example:"Where is the station?"},{word:"store",zh:"商店",category:"社區",usage:"去商店時說",example:"I go to the store."},{word:"left",zh:"左邊",category:"方向",usage:"指左邊時說",example:"Turn left."},{word:"right",zh:"右邊",category:"方向",usage:"指右邊時說",example:"Turn right."},{word:"near",zh:"附近",category:"方向",usage:"說距離很近時用",example:"The school is near."}]}],dailySentences:["My name is ___.","I speak English.","I have a question.","I go to the library.","I am ready."],quiz:[{id:"q3-speak",question:"speak 是什麼意思?",answer:"說",options:["聽","說","寫"]},{id:"q3-library",question:"library 是什麼意思?",answer:"圖書館",options:["市場","公園","圖書館"]}]},{grade:4,title:"小四英文練習",subtitle:"用時間、興趣、交通、比較與購物情境,練習更完整的生活問答。",wordGroups:[{id:"time-hobby-4",title:"時間與興趣",description:"說出時間和自己喜歡的活動。",words:[{word:"clock",zh:"時鐘",category:"時間",usage:"看時間時用",example:"The clock says nine."},{word:"minute",zh:"分鐘",category:"時間",usage:"說時間長度時用",example:"Wait for five minutes."},{word:"early",zh:"提早地",category:"時間",usage:"比預定時間早時用",example:"I get up early."},{word:"hobby",zh:"興趣",category:"興趣",usage:"介紹休閒活動時用",example:"My hobby is drawing."},{word:"music",zh:"音樂",category:"興趣",usage:"談喜歡的活動時用",example:"I listen to music."},{word:"collect",zh:"收集",category:"興趣",usage:"說收藏時用",example:"I collect stickers."}]},{id:"transportation-4",title:"交通與移動",description:"練習說明自己怎麼到達不同地方。",words:[{word:"bus",zh:"公車",category:"交通",usage:"搭公車時用",example:"I go to school by bus."},{word:"train",zh:"火車",category:"交通",usage:"搭火車時用",example:"The train is fast."},{word:"bicycle",zh:"腳踏車",category:"交通",usage:"騎車時用",example:"I ride my bicycle."},{word:"station",zh:"車站",category:"地點",usage:"找車站時用",example:"The station is near."},{word:"ticket",zh:"車票",category:"交通",usage:"搭車前用",example:"I have a train ticket."},{word:"arrive",zh:"到達",category:"動作",usage:"說抵達時間時用",example:"We arrive at ten."}]},{id:"frequency-4",title:"多久做一次",description:"用頻率副詞描述日常習慣。",words:[{word:"always",zh:"總是",category:"頻率",usage:"每次都會時用",example:"I always wash my hands."},{word:"usually",zh:"通常",category:"頻率",usage:"大多時候會做時用",example:"I usually walk to school."},{word:"often",zh:"常常",category:"頻率",usage:"經常做某事時用",example:"I often read after dinner."},{word:"sometimes",zh:"有時候",category:"頻率",usage:"偶爾做某事時用",example:"I sometimes play chess."},{word:"never",zh:"從不",category:"頻率",usage:"完全不做時用",example:"I never skip breakfast."},{word:"weekend",zh:"週末",category:"時間",usage:"說假日活動時用",example:"I swim on the weekend."}]},{id:"comparison-4",title:"比較事物",description:"用常見形容詞比較大小、速度與重量。",words:[{word:"tall",zh:"高的",category:"描述",usage:"比較身高時用",example:"The giraffe is tall."},{word:"short",zh:"矮的;短的",category:"描述",usage:"比較高度或長度時用",example:"This pencil is short."},{word:"fast",zh:"快的",category:"描述",usage:"比較速度時用",example:"A train is fast."},{word:"slow",zh:"慢的",category:"描述",usage:"說速度慢時用",example:"The turtle is slow."},{word:"heavy",zh:"重的",category:"描述",usage:"比較重量時用",example:"This box is heavy."},{word:"light",zh:"輕的",category:"描述",usage:"說重量輕時用",example:"This bag is light."}]},{id:"shopping-4",title:"購物英文",description:"認識價格、金錢與購物時常用的動詞。",words:[{word:"price",zh:"價格",category:"購物",usage:"詢問價錢時用",example:"What is the price?"},{word:"money",zh:"錢",category:"購物",usage:"付錢時用",example:"I have enough money."},{word:"cheap",zh:"便宜的",category:"購物",usage:"價格低時用",example:"The pencil is cheap."},{word:"expensive",zh:"昂貴的",category:"購物",usage:"價格高時用",example:"The bag is expensive."},{word:"buy",zh:"購買",category:"購物",usage:"買東西時用",example:"I want to buy a book."},{word:"change",zh:"找零",category:"購物",usage:"付款後用",example:"Here is your change."}]}],dailySentences:["What time do you get up?","I usually walk to school.","My hobby is drawing.","The train is faster than the bus.","How much is this book?"],quiz:[{id:"q4-hobby",question:"hobby 是什麼意思?",answer:"興趣",options:["興趣","車票","價格"]},{id:"q4-often",question:"often 是什麼意思?",answer:"常常",options:["從不","常常","明天"]},{id:"q4-train",question:"火車的英文是哪一個?",answer:"train",options:["train","bicycle","station"]}]},{grade:5,title:"小五英文練習",subtitle:"從健康、方向、季節、過去經驗與未來計畫,建立閱讀和表達能力。",wordGroups:[{id:"health-habits-5",title:"健康與習慣",description:"用英文說出身體狀況與健康選擇。",words:[{word:"healthy",zh:"健康的",category:"健康",usage:"描述健康狀態時用",example:"Vegetables are healthy."},{word:"exercise",zh:"運動",category:"健康",usage:"談運動習慣時用",example:"I exercise every day."},{word:"headache",zh:"頭痛",category:"健康",usage:"說身體不舒服時用",example:"I have a headache."},{word:"medicine",zh:"藥",category:"健康",usage:"生病吃藥時用",example:"Take your medicine."},{word:"rest",zh:"休息",category:"健康",usage:"需要休息時用",example:"You should get some rest."},{word:"habit",zh:"習慣",category:"健康",usage:"談生活方式時用",example:"Sleeping early is a good habit."}]},{id:"map-direction-5",title:"地圖與方向",description:"看地圖時辨認方位和旅行地點。",words:[{word:"north",zh:"北方",category:"方向",usage:"看地圖時用",example:"Taipei is in the north."},{word:"south",zh:"南方",category:"方向",usage:"看地圖時用",example:"The beach is in the south."},{word:"east",zh:"東方",category:"方向",usage:"說日出方向時用",example:"The sun rises in the east."},{word:"west",zh:"西方",category:"方向",usage:"說日落方向時用",example:"The sun sets in the west."},{word:"map",zh:"地圖",category:"旅行",usage:"找路時用",example:"Let us look at the map."},{word:"hotel",zh:"旅館",category:"旅行",usage:"旅行住宿時用",example:"Our hotel is near the station."}]},{id:"seasons-5",title:"季節與活動",description:"說出四季和不同季節適合的活動。",words:[{word:"spring",zh:"春天",category:"季節",usage:"談春天時用",example:"Flowers grow in spring."},{word:"summer",zh:"夏天",category:"季節",usage:"談暑假時用",example:"I swim in summer."},{word:"autumn",zh:"秋天",category:"季節",usage:"談秋季時用",example:"Leaves fall in autumn."},{word:"winter",zh:"冬天",category:"季節",usage:"談冷天時用",example:"It is cold in winter."},{word:"vacation",zh:"假期",category:"活動",usage:"談放假安排時用",example:"We travel during vacation."},{word:"activity",zh:"活動",category:"活動",usage:"介紹行程時用",example:"This activity is fun."}]},{id:"past-experience-5",title:"過去的經驗",description:"用常見過去式說昨天做過的事。",words:[{word:"yesterday",zh:"昨天",category:"過去",usage:"說昨天的事情時用",example:"I was busy yesterday."},{word:"visited",zh:"拜訪了",category:"過去",usage:"說去過某地時用",example:"We visited the museum."},{word:"watched",zh:"觀看了",category:"過去",usage:"說看過節目時用",example:"I watched a movie."},{word:"played",zh:"玩了",category:"過去",usage:"說玩過什麼時用",example:"I played basketball."},{word:"studied",zh:"學習了",category:"過去",usage:"說讀過書時用",example:"I studied English."},{word:"went",zh:"去了",category:"過去",usage:"說去過某地時用",example:"We went to the park."}]},{id:"plans-advice-5",title:"計畫與建議",description:"安排明天的事情,也能給出簡單建議。",words:[{word:"tomorrow",zh:"明天",category:"計畫",usage:"談明天時用",example:"I will study tomorrow."},{word:"plan",zh:"計畫",category:"計畫",usage:"安排事情時用",example:"I have a plan."},{word:"should",zh:"應該",category:"建議",usage:"給建議時用",example:"You should drink water."},{word:"enough",zh:"足夠的",category:"建議",usage:"確認數量充足時用",example:"Get enough sleep."},{word:"careful",zh:"小心的",category:"建議",usage:"提醒注意時用",example:"Please be careful."},{word:"remember",zh:"記得",category:"建議",usage:"提醒別忘記時用",example:"Remember to bring your book."}]}],dailySentences:["You should get enough sleep.","How can I get to the station?","We visited the museum yesterday.","I will study English tomorrow.","Spring is warmer than winter."],quiz:[{id:"q5-healthy",question:"healthy 是什麼意思?",answer:"健康的",options:["健康的","昂貴的","小心的"]},{id:"q5-yesterday",question:"昨天的英文是哪一個?",answer:"yesterday",options:["tomorrow","yesterday","winter"]},{id:"q5-should",question:"給建議時常用哪一個字?",answer:"should",options:["visited","should","north"]}]},{grade:6,title:"小六英文練習",subtitle:"統整時態、連接詞與觀點表達,準備讀懂較長句子並銜接國中。",wordGroups:[{id:"school-project-6",title:"校園計畫",description:"規劃學習任務並清楚報告自己的目標。",words:[{word:"project",zh:"專題",category:"學習",usage:"談小組任務時用",example:"Our science project is ready."},{word:"schedule",zh:"行程表",category:"學習",usage:"安排時間時用",example:"Check the class schedule."},{word:"prepare",zh:"準備",category:"學習",usage:"開始任務前用",example:"We prepare for the report."},{word:"report",zh:"報告",category:"學習",usage:"上台分享時用",example:"I gave a short report."},{word:"choose",zh:"選擇",category:"學習",usage:"做決定時用",example:"Choose one topic."},{word:"goal",zh:"目標",category:"學習",usage:"設定學習方向時用",example:"My goal is to read more."}]},{id:"culture-travel-6",title:"旅行與文化",description:"認識不同國家、語言與文化特色。",words:[{word:"country",zh:"國家",category:"文化",usage:"介紹國家時用",example:"Japan is an island country."},{word:"culture",zh:"文化",category:"文化",usage:"談生活特色時用",example:"Every culture is special."},{word:"language",zh:"語言",category:"文化",usage:"談溝通時用",example:"English is an international language."},{word:"famous",zh:"著名的",category:"旅行",usage:"介紹景點時用",example:"The tower is famous."},{word:"tradition",zh:"傳統",category:"文化",usage:"介紹節慶時用",example:"This is a family tradition."},{word:"visitor",zh:"訪客",category:"旅行",usage:"說來訪的人時用",example:"Many visitors come here."}]},{id:"environment-6",title:"環境行動",description:"用英文討論減量、回收與保護環境。",words:[{word:"recycle",zh:"回收",category:"環境",usage:"分類資源時用",example:"We recycle paper and cans."},{word:"reduce",zh:"減少",category:"環境",usage:"減少浪費時用",example:"We should reduce waste."},{word:"reuse",zh:"重複使用",category:"環境",usage:"再次使用物品時用",example:"Reuse this bag."},{word:"energy",zh:"能源",category:"環境",usage:"談電力資源時用",example:"Turn off lights to save energy."},{word:"pollution",zh:"汙染",category:"環境",usage:"談環境問題時用",example:"Air pollution hurts our health."},{word:"protect",zh:"保護",category:"環境",usage:"談守護自然時用",example:"We must protect the ocean."}]},{id:"reasons-opinions-6",title:"原因與觀點",description:"用連接詞說清楚原因、結果和自己的看法。",words:[{word:"because",zh:"因為",category:"連接",usage:"說明原因時用",example:"I stayed home because it rained."},{word:"so",zh:"所以",category:"連接",usage:"說明結果時用",example:"It rained, so we stayed home."},{word:"however",zh:"然而",category:"連接",usage:"轉折時用",example:"It was hard; however, I finished it."},{word:"agree",zh:"同意",category:"觀點",usage:"表達同意時用",example:"I agree with your idea."},{word:"opinion",zh:"意見",category:"觀點",usage:"分享想法時用",example:"In my opinion, reading is useful."},{word:"reason",zh:"理由",category:"觀點",usage:"解釋想法時用",example:"Please give one reason."}]},{id:"junior-transition-6",title:"國中銜接",description:"練習解釋、解決問題與持續進步的學習用語。",words:[{word:"experience",zh:"經驗",category:"銜接",usage:"分享做過的事情時用",example:"It was a useful experience."},{word:"improve",zh:"進步;改善",category:"銜接",usage:"談學習成長時用",example:"Practice helps me improve."},{word:"solve",zh:"解決",category:"銜接",usage:"處理問題時用",example:"We can solve this problem."},{word:"explain",zh:"解釋",category:"銜接",usage:"說明答案時用",example:"Please explain your answer."},{word:"continue",zh:"繼續",category:"銜接",usage:"持續任務時用",example:"I will continue learning."},{word:"confident",zh:"有信心的",category:"銜接",usage:"描述自信時用",example:"I feel confident today."}]}],dailySentences:["My goal is to improve every day.","We should reduce waste to protect Earth.","I agree because your reason is clear.","I have finished my school project.","I will continue learning English."],quiz:[{id:"q6-protect",question:"protect 是什麼意思?",answer:"保護",options:["保護","比較","準備"]},{id:"q6-because",question:"說明原因時常用哪一個字?",answer:"because",options:["however","because","visitor"]},{id:"q6-improve",question:"improve 是什麼意思?",answer:"進步;改善",options:["解釋","進步;改善","選擇"]}]}];function s(e){return t.find(a=>a.grade===e)??r}}}]);
 
 
_next/static/chunks/2ecndn9sdfd5d.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,97750,e=>{"use strict";var t=e.i(43476),r=e.i(14876);e.s(["SecondaryButton",0,function({children:e,href:n,onClick:a,type:s="button",className:l="",disabled:i=!1}){let o=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-butter px-6 py-3 text-center font-black text-amber-900 shadow-sm transition hover:-translate-y-0.5 hover:bg-amber-100 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-honey/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${l}`;return n&&!i?(0,t.jsx)(r.ExportSafeLink,{className:o,href:n,children:e}):(0,t.jsx)("button",{className:o,type:s,onClick:a,disabled:i,children:e})}])},34295,e=>{"use strict";function t(e,t){return`${e}:${t}`}e.s(["getPersonStorageKey",0,t,"readPersonStorage",0,function(e,r,n){try{let a=window.localStorage.getItem(t(e,r));return a?JSON.parse(a):n}catch{return n}},"removePersonStorage",0,function(e,r){try{window.localStorage.removeItem(t(e,r))}catch{}},"writePersonStorage",0,function(e,r,n){try{return window.localStorage.setItem(t(e,r),JSON.stringify(n)),!0}catch{return!1}}])},42391,e=>{"use strict";var t=e.i(43476);e.s(["PageHeader",0,function({eyebrow:e,title:r,description:n,action:a}){return(0,t.jsxs)("header",{className:"flex min-w-0 flex-col gap-5 pb-1 sm:flex-row sm:items-start sm:justify-between",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-black uppercase tracking-[0.08em] text-amber-700",children:e}),(0,t.jsx)("h1",{className:"mt-2 text-3xl font-black leading-tight tracking-normal text-ink md:text-5xl",children:r}),n?(0,t.jsx)("p",{className:"mt-3 max-w-3xl text-base font-medium leading-7 text-stone-600 md:text-lg md:leading-8",children:n}):null]}),a?(0,t.jsx)("div",{className:"w-full shrink-0 sm:w-auto",children:a}):null]})}])},95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return i},formatWithValidation:function(){return c},urlObjectKeys:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let s=e.r(90809)._(e.r(98183)),l=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:r}=e,n=e.protocol||"",a=e.pathname||"",i=e.hash||"",o=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),o&&"object"==typeof o&&(o=String(s.urlQueryToSearchParams(o)));let d=e.search||o&&`?${o}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||l.test(n))&&!1!==c?(c="//"+(c||""),a&&"/"!==a[0]&&(a="/"+a)):c||(c=""),i&&"#"!==i[0]&&(i="#"+i),d&&"?"!==d[0]&&(d="?"+d),a=a.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${n}${c}${a}${d}${i}`}let o=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return i(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t){let r=(0,n.useRef)(null),a=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(r.current=s(e,n)),t&&(a.current=s(t,n))},[e,t])}function s(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return s}});let n=e.r(18967),a=e.r(52817);function s(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,a.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return p},useLinkStatus:function(){return w}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let s=e.r(90809),l=e.r(43476),i=s._(e.r(71645)),o=e.r(95057),c=e.r(8372),d=e.r(18581),u=e.r(18967),x=e.r(5550);e.r(33525);let m=e.r(88540),h=e.r(91949),g=e.r(73668),f=e.r(9396);function p(t){var r,n;let a,s,p,[w,j]=(0,i.useOptimistic)(h.IDLE_LINK_STATUS),N=(0,i.useRef)(null),{href:v,as:y,children:k,prefetch:S=null,passHref:$,replace:P,shallow:E,scroll:z,onClick:I,onMouseEnter:A,onTouchStart:M,legacyBehavior:D=!1,onNavigate:C,transitionTypes:R,ref:L,unstable_dynamicOnHover:O,..._}=t;a=k,D&&("string"==typeof a||"number"==typeof a)&&(a=(0,l.jsx)("a",{children:a}));let T=i.default.useContext(c.AppRouterContext),B=!1!==S,F=!1!==S?null===(n=S)||"auto"===n?f.FetchStrategy.PPR:f.FetchStrategy.Full:f.FetchStrategy.PPR,H="string"==typeof(r=y||v)?r:(0,o.formatUrl)(r);if(D){if(a?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});s=i.default.Children.only(a)}let K=D?s&&"object"==typeof s&&s.ref:L,U=i.default.useCallback(e=>(null!==T&&(N.current=(0,h.mountLinkInstance)(e,H,T,F,B,j)),()=>{N.current&&((0,h.unmountLinkForCurrentNavigation)(N.current),N.current=null),(0,h.unmountPrefetchableInstance)(e)}),[B,H,T,F,j]),G={ref:(0,d.useMergedRef)(U,K),onClick(t){D||"function"!=typeof I||I(t),D&&s.props&&"function"==typeof s.props.onClick&&s.props.onClick(t),!T||t.defaultPrevented||function(t,r,n,a,s,l,o){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,g.isLocalURL)(r)){a&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);i.default.startTransition(()=>{u(r,a?"replace":"push",!1===s?m.ScrollBehavior.NoScroll:m.ScrollBehavior.Default,n.current,o)})}}(t,H,N,P,z,C,R)},onMouseEnter(e){D||"function"!=typeof A||A(e),D&&s.props&&"function"==typeof s.props.onMouseEnter&&s.props.onMouseEnter(e),T&&B&&(0,h.onNavigationIntent)(e.currentTarget,!0===O)},onTouchStart:function(e){D||"function"!=typeof M||M(e),D&&s.props&&"function"==typeof s.props.onTouchStart&&s.props.onTouchStart(e),T&&B&&(0,h.onNavigationIntent)(e.currentTarget,!0===O)}};return(0,u.isAbsoluteUrl)(H)?G.href=H:D&&!$&&("a"!==s.type||"href"in s.props)||(G.href=(0,x.addBasePath)(H)),p=D?i.default.cloneElement(s,G):(0,l.jsx)("a",{..._,...G,children:a}),(0,l.jsx)(b.Provider,{value:w,children:p})}e.r(84508);let b=(0,i.createContext)(h.IDLE_LINK_STATUS),w=()=>(0,i.useContext)(b);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},14876,e=>{"use strict";var t=e.i(43476),r=e.i(22016);function n(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:r,suffix:n}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===r?`/index.html${n}`:/\.[a-z0-9]+$/i.test(r)?e:`${r.replace(/\/+$/,"")}/index.html${n}`}e.s(["ExportSafeLink",0,function({href:e,children:a,...s}){return"string"==typeof e?(0,t.jsx)("a",{href:n(e),...s,children:a}):(0,t.jsx)(r.default,{href:e,...s,children:a})},"getExportSafeHref",0,n])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let r=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function n(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return r.find(t=>t.grade===e)},"getGradeIdByNumber",0,n,"grades",0,r],62312);let a=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],s={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function l(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.find(e=>e.id===t)??s}function i(e){if(!e)return s.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.some(e=>e.id===t)?t:s.id}e.s(["currentStudent",0,s,"getCurrentStudentGradeId",0,function(e=s){return n(e.grade)},"getPersonById",0,l,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,a,"normalizePersonId",0,i],7728);let o="chenguang-active-person-id",c="chenguang-active-person-change",d="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,r]=(0,t.useState)(s.id),[n,a]=(0,t.useState)(!1),[x,m]=(0,t.useState)(!1);function h(e){let t=i(e);r(t),window.localStorage.setItem(o,t),window.dispatchEvent(new Event(c))}return(0,t.useEffect)(()=>{let e=i(window.localStorage.getItem(o));function t(){let e=i(window.localStorage.getItem(o));r(e),window.localStorage.setItem(o,e)}function n(){a(!!window.localStorage.getItem(d))}return r(e),window.localStorage.setItem(o,e),a(!!window.localStorage.getItem(d)),m(!0),window.addEventListener(c,t),window.addEventListener("storage",t),window.addEventListener(u,n),()=>{window.removeEventListener(c,t),window.removeEventListener("storage",t),window.removeEventListener(u,n)}},[]),{person:l(e),switchPerson:h,signIn:function(e){let t=i(e);h(t);let r=l(t);window.localStorage.setItem(d,JSON.stringify({personId:t,role:r.role,signedInAt:new Date().toISOString()})),a(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(d),a(!1),window.dispatchEvent(new Event(u))},isLoggedIn:n,isReady:x}}],41324)},82697,e=>{"use strict";var t=e.i(43476),r=e.i(14876),n=e.i(7728),a=e.i(62312),s=e.i(41324);e.s(["BrandHeader",0,function({showPerson:e=!0}){let{person:l,isLoggedIn:i}=(0,s.useActivePerson)(),o=(0,a.getGradeByNumber)(l.grade),c=i?`${(0,n.getPersonDisplayName)(l)}|${"student"===l.role?(0,n.getPersonSubtitle)(l):o?.shortName??`小${l.grade}`}`:"訪客模式";return(0,t.jsxs)(r.ExportSafeLink,{href:i?"/dashboard":"/",className:"flex min-w-0 items-center gap-3 text-ink",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 shrink-0 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{className:"min-w-0 leading-tight",children:[(0,t.jsx)("strong",{className:"block truncate text-xl font-black",children:"晨光"}),(0,t.jsx)("small",{className:"block truncate text-sm font-bold text-stone-500",children:e?c:"國小學習陪跑系統"})]})]})}])},18566,(e,t,r)=>{t.exports=e.r(76562)},22468,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),s=e.i(7728),l=e.i(62312),i=e.i(41324);let o=[{label:"登入",href:"/login"},{label:"訪客體驗",href:"/courses"},{label:"註冊登入",href:"/register",primary:!0}];function c(e,t="student"){let r=[{label:"課程首頁",href:"/dashboard",icon:"⌂"},{label:"每日 10 題",href:"/daily-quiz",icon:"10"},{label:"錯題 AI 說明",href:"/wrong-review",icon:"AI"},{label:"進度月曆",href:"/parent-weekly-report",icon:"月"},{label:"英文練習",href:"/practice",icon:"Aa"},{label:"手寫出題",href:"/word-scanner",icon:"掃"},{label:"課程總覽",href:"/courses",icon:"▦"},{label:"國語練習",href:`/courses/grade-${e}/chinese/basic`,icon:"ㄅ"},{label:"數學練習",href:`/courses/grade-${e}/math/basic`,icon:"123"},{label:"每日紀錄",href:"/daily-record",icon:"✓"},{label:"週計畫",href:"/weekly-plan",icon:"□"},{label:"登出",href:"/",icon:"出"}];return"parent"===t?r.filter(e=>["課程首頁","進度月曆","每日紀錄","週計畫","課程總覽","登出"].includes(e.label)):"teacher"===t?r.filter(e=>["課程首頁","課程總覽","國語練習","英文練習","數學練習","週計畫","手寫出題","登出"].includes(e.label)):r.filter(e=>["課程首頁","每日 10 題","英文練習","國語練習","數學練習","手寫出題","錯題 AI 說明","登出"].includes(e.label))}function d(e,t){return"/dashboard"===t?"/dashboard"===e:"/courses"===t?"/courses"===e:t.startsWith("/courses/")?e===t||e.startsWith(`${t}/`):e===t}function u({compact:e=!1}){let{person:n}=(0,i.useActivePerson)(),[a,o]=(0,r.useState)(!1),c=(0,l.getGradeByNumber)(n.grade),d="student"===n.role?(0,s.getPersonSubtitle)(n):c?.name??`國小${n.grade}年級`,x=(0,t.jsx)("div",{className:"grid gap-2",children:s.mockPeople.map(e=>{let r=(0,l.getGradeByNumber)(e.grade),a=e.id===n.id;return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;let r;return t=e.id,o(!1),r=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login",void window.location.assign(`${r}?person=${encodeURIComponent(t)}`)},className:`rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${a?"bg-coral text-white shadow-sm":"bg-white text-stone-700 hover:bg-butter"}`,children:[(0,t.jsxs)("span",{className:"block text-xs font-black opacity-80",children:[(0,s.getRoleLabel)(e.role),"模式"]}),(0,t.jsx)("span",{className:"mt-1 block text-base font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-75",children:"student"===e.role?(0,s.getPersonSubtitle)(e):r?.name??`國小${e.grade}年級`})]},e.id)})});return e?(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>o(e=>!e),className:"flex min-h-11 max-w-[5.5rem] items-center gap-1 rounded-2xl bg-butter px-2 text-left text-amber-950 shadow-sm sm:max-w-none sm:gap-2 sm:px-3","aria-expanded":a,"aria-label":"切換目前使用者",children:[(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("strong",{className:"block max-w-20 truncate text-sm font-black",children:n.name}),(0,t.jsx)("small",{className:"block text-[11px] font-bold opacity-70",children:c?.shortName??`小${n.grade}`})]}),(0,t.jsx)("span",{"aria-hidden":"true",className:"text-xs",children:"⌄"})]}),a?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100vh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsx)("strong",{className:"text-base font-black text-ink",children:"切換使用者"}),(0,t.jsx)("button",{type:"button",onClick:()=>o(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉帳號選單",children:"×"})]}),x]}):null]}):(0,t.jsxs)("section",{className:"rounded-3xl border border-amber-100 bg-cream p-3 shadow-sm",children:[(0,t.jsx)("button",{type:"button",onClick:()=>o(e=>!e),className:"w-full rounded-[1.35rem] bg-white/80 p-3 text-left ring-1 ring-transparent transition hover:bg-white hover:ring-coral/30","aria-expanded":a,"aria-label":"切換目前使用者",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("p",{className:"text-xs font-black text-amber-700",children:[(0,s.getRoleLabel)(n.role),"模式"]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-2xl font-black leading-tight text-ink",children:n.name}),(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"student"===n.role?"匿名檔案":(0,s.getRoleLabel)(n.role)})]}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:d})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-coral px-3 py-2 text-xs font-black text-white shadow-sm",children:"切換帳號"})]})}),a?(0,t.jsx)("div",{className:"mt-3",children:x}):null]})}e.s(["AppSidebar",0,function(){let e=(0,n.usePathname)(),{person:r,isLoggedIn:s,signOut:l}=(0,i.useActivePerson)();function x(){l();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsx)("aside",{className:"fixed inset-y-0 left-0 z-20 hidden w-64 flex-col border-r border-softline/80 bg-white/85 backdrop-blur-xl lg:flex",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 py-6",children:[(0,t.jsxs)(a.ExportSafeLink,{className:"flex items-center gap-3",href:s?"/dashboard":"/",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"text-sm font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),s?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{}),(0,t.jsx)("nav",{className:"grid gap-2 pr-1",children:c(r.grade,r.role).map(r=>{let n=d(e,r.href),s=`flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left transition ${n?"bg-butter text-amber-900 shadow-sm":"text-stone-600 hover:bg-butter hover:text-amber-900"}`,l=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 place-items-center rounded-xl text-sm font-black shadow-sm ${n?"bg-white text-coral":"bg-white text-stone-500"}`,children:r.icon}),(0,t.jsx)("span",{className:"font-bold",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:x,className:s,children:l},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,className:s,children:l},r.label)})})]}):(0,t.jsx)("div",{className:"grid gap-3",children:o.map(e=>(0,t.jsx)(a.ExportSafeLink,{href:e.href,className:e.primary?"rounded-2xl bg-coral px-4 py-3 text-center font-black text-white shadow-warm transition hover:brightness-105":"rounded-2xl border border-softline bg-white px-4 py-3 text-center font-black text-amber-800 transition hover:bg-butter",children:e.label},e.label))}),s?(0,t.jsxs)(a.ExportSafeLink,{href:"student"===r.role?"/wrong-review":"/parent-weekly-report",className:"mt-auto rounded-2xl border border-green-100 bg-green-50 p-4 text-sm text-green-900 transition hover:-translate-y-0.5 hover:bg-green-100",children:[(0,t.jsx)("span",{className:"block text-xs font-black text-green-700",children:"本週學習摘要"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg",children:"每天一小步,進度看得見"}),(0,t.jsx)("span",{className:"mt-2 block font-bold text-green-700",children:"查看進度與需要再練的內容 →"})]}):null]})})},"MobileMenu",0,function(){let e=(0,n.usePathname)(),{person:s,signOut:l}=(0,i.useActivePerson)(),[o,u]=(0,r.useState)(!1),x=c(s.grade,s.role);function m(){l();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsxs)("div",{className:"shrink-0 lg:hidden",children:[(0,t.jsx)("button",{type:"button",onClick:()=>u(e=>!e),className:"grid min-h-11 min-w-11 place-items-center rounded-2xl bg-white text-xl font-black text-amber-900 shadow-sm active:scale-[0.98]","aria-expanded":o,"aria-label":"開啟完整功能選單",children:o?"×":"☰"}),o?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100dvh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("strong",{className:"block text-base font-black text-ink",children:"全部功能"}),(0,t.jsxs)("span",{className:"text-xs font-bold text-stone-500",children:["依 ",s.name," 的身分顯示"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉功能選單",children:"×"})]}),(0,t.jsx)("nav",{className:"grid grid-cols-2 gap-2",children:x.map(r=>{let n=d(e,r.href),s=`flex min-h-16 items-center gap-3 rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${n?"bg-coral text-white":"bg-white text-stone-700"}`,l=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 shrink-0 place-items-center rounded-xl text-sm font-black ${n?"bg-white/20":"bg-butter text-amber-900"}`,children:r.icon}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:m,className:s,children:l},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,onClick:()=>u(!1),className:s,children:l},r.label)})})]}):null]})},"MobileQuickNav",0,function(){var e;let r,s=(0,n.usePathname)(),{person:l}=(0,i.useActivePerson)(),o=(r=c(l.grade,e=l.role),("guest"===e?["課程首頁","課程總覽"]:({student:["課程首頁","每日 10 題","英文練習","課程總覽"],parent:["課程首頁","進度月曆","每日紀錄","週計畫"],teacher:["課程首頁","課程總覽","週計畫","手寫出題"]})[e]).map(e=>r.find(t=>t.label===e)).filter(e=>!!e));return(0,t.jsx)("nav",{className:"fixed inset-x-3 bottom-[max(0.75rem,env(safe-area-inset-bottom))] z-50 grid grid-cols-4 gap-1 rounded-3xl border border-white/80 bg-white/90 p-2 shadow-warm backdrop-blur-xl lg:hidden","aria-label":"主要功能",children:o.map(e=>{let r=d(s,e.href);return(0,t.jsxs)(a.ExportSafeLink,{href:e.href,className:`flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl px-1 py-2 text-center transition active:scale-[0.98] ${r?"bg-coral text-white shadow-sm":"text-stone-600"}`,children:[(0,t.jsx)("span",{className:"text-sm font-black",children:e.icon}),(0,t.jsx)("span",{className:"w-full truncate text-[11px] font-black",children:e.label})]},e.label)})})},"PersonSwitcher",0,u])},55634,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),s=e.i(41324);e.s(["ActiveGradeRouteSync",0,function(){let e=(0,n.usePathname)(),{person:l,isLoggedIn:i,isReady:o}=(0,s.useActivePerson)(),c=function(e){let t=e.match(/^\/learn\/(?:grade-)?([1-6])(?:\/|$)/);if(t)return Number(t[1]);let r=e.match(/^\/courses\/grade-([1-6])(?:\/|$)/);if(r)return Number(r[1]);let n=e.match(/^\/(?:lesson|practice|handwriting)\/grade-([1-6])-/);return n?Number(n[1]):null}(e),d=!!(o&&i&&"student"===l.role&&c&&c!==l.grade);return((0,r.useEffect)(()=>{var t;if(!d)return;let r=(t=l.grade,/^\/learn\/(?:grade-)?[1-6](?:\/|$)/.test(e)?e.replace(/^\/learn\/(?:grade-)?[1-6]/,`/learn/${t}`):/^\/courses\/grade-[1-6](?:\/|$)/.test(e)?e.replace(/^\/courses\/grade-[1-6]/,`/courses/grade-${t}`):e.replace(/^(\/(?:lesson|practice|handwriting)\/)grade-[1-6]-/,`$1grade-${t}-`)),n=`${(0,a.getExportSafeHref)(r)}${window.location.search}${window.location.hash}`;window.location.replace(n)},[e,l.grade,d]),o&&!d)?null:(0,t.jsx)("div",{className:"fixed inset-0 z-[100] grid place-items-center bg-[#fffaf3]/95 p-5 backdrop-blur-md",role:"status","aria-live":"polite",children:(0,t.jsxs)("div",{className:"w-full max-w-md rounded-[2rem] border border-white bg-white/90 p-7 text-center shadow-warm",children:[(0,t.jsx)("span",{className:"mx-auto grid h-14 w-14 place-items-center rounded-2xl bg-butter text-2xl","aria-hidden":"true",children:"☀"}),(0,t.jsx)("strong",{className:"mt-4 block text-2xl font-black text-ink",children:o?`正在切換到小${l.grade}課程`:"正在讀取目前學習年級"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"晨光會自動載入這位學習者正確的課程內容。"})]})})}],55634)},10400,e=>{"use strict";var t=e.i(43476),r=e.i(82697),n=e.i(22468),a=e.i(55634);e.s(["AppShell",0,function({children:e}){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.ActiveGradeRouteSync,{}),(0,t.jsx)(n.AppSidebar,{}),(0,t.jsxs)("main",{className:"app-reading-scale min-h-screen min-w-0 overflow-x-clip px-4 pb-28 pt-4 lg:ml-64 lg:px-10 lg:py-6",children:[(0,t.jsx)("div",{className:"sticky top-3 z-40 mb-5 lg:hidden",children:(0,t.jsxs)("div",{className:"flex min-w-0 items-center justify-between gap-2 rounded-3xl border border-white/80 bg-white/90 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsx)("div",{className:"min-w-0 flex-1",children:(0,t.jsx)(r.BrandHeader,{showPerson:!1})}),(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,t.jsx)(n.PersonSwitcher,{compact:!0}),(0,t.jsx)(n.MobileMenu,{})]})]})}),(0,t.jsx)("div",{className:"mx-auto min-w-0 w-full max-w-7xl",children:e}),(0,t.jsx)(n.MobileQuickNav,{})]})]})}])},98239,e=>{"use strict";var t=e.i(43476);e.s(["SectionCard",0,function({children:e,className:r=""}){return(0,t.jsx)("section",{className:`min-w-0 overflow-hidden rounded-[1.75rem] border border-softline/80 bg-white/90 p-5 shadow-warm sm:p-6 md:p-8 ${r}`,children:e})}])},51772,e=>{"use strict";var t=e.i(43476);let r={green:"border-green-100 bg-green-50 text-green-950",blue:"border-blue-100 bg-blue-50 text-blue-950",cream:"border-softline bg-cream text-stone-700"};e.s(["InfoCard",0,function({title:e,children:n,tone:a="green",className:s=""}){return(0,t.jsxs)("div",{className:`rounded-2xl border p-5 ${r[a]} ${s}`,children:[e?(0,t.jsx)("p",{className:"mb-2 font-black",children:e}):null,(0,t.jsx)("div",{className:"leading-8",children:n})]})}])},87102,e=>{"use strict";var t=e.i(7728),r=e.i(34295);let n="chenguang-learning-history";function a(e=t.currentStudent.id){return(0,r.readPersonStorage)(n,e,[])}function s(e,r=t.currentStudent.id){return(e??a(r)).flatMap(e=>e.answers.filter(e=>!e.correct))}e.s(["buildAnswerRecord",0,function(e,t){return{questionId:e.id,word:e.word,selected:t,answer:e.answer,correct:t===e.answer,explanation:e.explanation,answeredAt:new Date().toISOString()}},"getWeeklySummary",0,function(e,r=t.currentStudent.id){let n=new Date,l=new Date(n.getFullYear(),n.getMonth(),n.getDate()-6),i=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1),o=(e??a(r)).filter(e=>{let t=new Date(e.date);return t>=l&&t<i}),c=o.reduce((e,t)=>e+t.total,0),d=o.reduce((e,t)=>e+t.score,0),u=s(o,r),x=Array.from(new Set(o.flatMap(e=>e.answers.map(e=>e.word)))),m=new Set(o.map(e=>{let t=new Date(e.date);return`${t.getFullYear()}-${t.getMonth()+1}-${t.getDate()}`})),h=0;for(let e=0;e<7;e+=1){let t=new Date(n.getFullYear(),n.getMonth(),n.getDate()-e),r=`${t.getFullYear()}-${t.getMonth()+1}-${t.getDate()}`;if(!m.has(r))break;h+=1}return{days:m.size,streak:h,total:c,score:d,accuracy:0===c?0:Math.round(d/c*100),wrongAnswers:u.slice(0,6),words:x.slice(0,20),lastScore:o[0]?.score??0}},"getWrongAnswers",0,s,"saveDailyQuizRecord",0,function(e,s=t.currentStudent.id){let l=a(s),i={id:`daily-${Date.now()}`,personId:s,date:new Date().toISOString(),score:e.filter(e=>e.correct).length,total:e.length,answers:e};(0,r.writePersonStorage)(n,s,[i,...l].slice(0,60))}])},26896,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(10400),a=e.i(51772),s=e.i(42391),l=e.i(97750),i=e.i(98239),o=e.i(34295);let c=["日","一","二","三","四","五","六"];function d(e){return String(e).padStart(2,"0")}function u(e){return`${e.getFullYear()}-${d(e.getMonth()+1)}-${d(e.getDate())}`}function x(e){try{let t=JSON.parse(window.localStorage.getItem(e)??"[]");return Array.isArray(t)?t:[]}catch{return[]}}function m(e){let t=new Date(e);return Number.isNaN(t.getTime())?e.slice(0,10):u(t)}function h(e){return e?Array.from(new Set([...e.quizzes.flatMap(e=>e.answers.map(e=>e.word)),...e.scannedQuizzes.flatMap(e=>e.words.map(e=>e.word)),...e.englishGames.flatMap(e=>e.words)])):[]}function g(e){return e?e.quizzes.reduce((e,t)=>e+t.total,0)+e.dailyRecords.reduce((e,t)=>e+t.tasks.length,0)+e.scannedQuizzes.length+e.englishGames.length:0}function f({personId:e}){let[n,a]=(0,r.useState)(()=>new Date),[s,i]=(0,r.useState)(()=>new Date),[d,p]=(0,r.useState)(()=>u(new Date)),[b,w]=(0,r.useState)(new Map);(0,r.useEffect)(()=>{function t(){let t=new Date;a(t),w(function(e){let t=new Map;function r(e){return t.has(e)||t.set(e,{dateKey:e,quizzes:[],dailyRecords:[],scannedQuizzes:[],englishGames:[]}),t.get(e)}return x((0,o.getPersonStorageKey)("chenguang-learning-history",e)).forEach(e=>{r(m(e.date)).quizzes.push(e)}),x((0,o.getPersonStorageKey)("chenguang-daily-records",e)).forEach(e=>{r(e.date).dailyRecords.push(e)}),x((0,o.getPersonStorageKey)("chenguang-scanned-word-quizzes",e)).forEach(e=>{r(m(e.createdAt)).scannedQuizzes.push(e)}),x((0,o.getPersonStorageKey)("chenguang-english-game-history",e)).forEach(e=>{r(m(e.date)).englishGames.push(e)}),t}(e)),p(e=>e||u(t))}t();let r=window.setInterval(t,6e4);return()=>window.clearInterval(r)},[e]);let j=(0,r.useMemo)(()=>{let e,t,r,n;return e=s.getFullYear(),r=new Date(e,t=s.getMonth(),1),n=new Date(e,t+1,0).getDate(),[...Array.from({length:r.getDay()},()=>null),...Array.from({length:n},(r,n)=>new Date(e,t,n+1))]},[s]),N=b.get(d),v=h(N),y=Array.from(b.values()).filter(e=>{let t=new Date(e.dateKey);return t.getFullYear()===s.getFullYear()&&t.getMonth()===s.getMonth()}),k=new Set(y.flatMap(e=>h(e))).size,S=y.reduce((e,t)=>e+g(t),0),$=u(n);function P(e){i(t=>new Date(t.getFullYear(),t.getMonth()+e,1))}return(0,t.jsxs)("section",{className:"rounded-[2rem] border border-softline bg-white/90 p-5 shadow-warm md:p-7",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-4 lg:flex-row lg:items-end lg:justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:"Learning Calendar"}),(0,t.jsx)("h2",{className:"mt-1 text-3xl font-black text-ink",children:"學習進度月曆"}),(0,t.jsxs)("p",{className:"mt-2 text-sm font-bold text-stone-500",children:["現在時間:",n.toLocaleDateString("zh-TW")," ",n.toLocaleTimeString("zh-TW",{hour:"2-digit",minute:"2-digit"})]})]}),(0,t.jsxs)("div",{className:"grid gap-2 sm:grid-cols-3",children:[(0,t.jsxs)("div",{className:"rounded-2xl bg-cream px-4 py-3",children:[(0,t.jsx)("p",{className:"text-xs font-black text-amber-700",children:"本月學習日"}),(0,t.jsxs)("strong",{className:"text-2xl text-ink",children:[y.length," 天"]})]}),(0,t.jsxs)("div",{className:"rounded-2xl bg-green-50 px-4 py-3",children:[(0,t.jsx)("p",{className:"text-xs font-black text-green-700",children:"本月任務數"}),(0,t.jsxs)("strong",{className:"text-2xl text-ink",children:[S," 項"]})]}),(0,t.jsxs)("div",{className:"rounded-2xl bg-blue-50 px-4 py-3",children:[(0,t.jsx)("p",{className:"text-xs font-black text-blue-700",children:"學過單字"}),(0,t.jsxs)("strong",{className:"text-2xl text-ink",children:[k," 個"]})]})]})]}),(0,t.jsxs)("div",{className:"mt-6 grid gap-6 xl:grid-cols-[1.05fr_0.95fr]",children:[(0,t.jsxs)("div",{className:"rounded-[1.75rem] bg-cream/70 p-4",children:[(0,t.jsxs)("div",{className:"mb-4 flex items-center justify-between gap-3",children:[(0,t.jsx)("button",{type:"button",onClick:()=>P(-1),className:"grid h-11 w-11 place-items-center rounded-2xl bg-white font-black text-amber-900 shadow-sm","aria-label":"上一個月",children:"‹"}),(0,t.jsx)("h3",{className:"text-center text-xl font-black text-ink",children:`${s.getFullYear()} 年 ${s.getMonth()+1} 月`}),(0,t.jsx)("button",{type:"button",onClick:()=>P(1),className:"grid h-11 w-11 place-items-center rounded-2xl bg-white font-black text-amber-900 shadow-sm","aria-label":"下一個月",children:"›"})]}),(0,t.jsx)("div",{className:"grid grid-cols-7 gap-2 text-center text-sm font-black",children:c.map(e=>(0,t.jsx)("span",{className:"日"===e?"text-rose-500":"六"===e?"text-blue-500":"text-stone-500",children:e},e))}),(0,t.jsx)("div",{className:"mt-2 grid grid-cols-7 gap-2",children:j.map((e,r)=>{if(!e)return(0,t.jsx)("div",{className:"min-h-20"},`blank-${r}`);let n=u(e),a=b.get(n),s=function(e){if(!e||0===g(e))return[];let t=[];return e.quizzes.length>0&&t.push("測驗"),e.dailyRecords.length>0&&t.push("紀錄"),e.scannedQuizzes.length>0&&t.push("掃描"),e.englishGames.length>0&&t.push("英文"),t}(a),l=d===n,i=$===n;return(0,t.jsxs)("button",{type:"button",onClick:()=>p(n),className:`min-h-20 rounded-2xl border p-2 text-left transition ${l?"border-coral bg-coral/10 shadow-sm":a?"border-green-200 bg-green-50 hover:bg-green-100":"border-softline bg-white/70 hover:bg-white"}`,children:[(0,t.jsx)("span",{className:`block text-sm font-black ${i?"text-coral":"text-stone-700"}`,children:e.getDate()}),s.length>0?(0,t.jsx)("span",{className:"mt-2 flex flex-wrap gap-1",children:s.map(e=>(0,t.jsx)("span",{className:"rounded-lg bg-white px-2 py-1 text-xs font-black text-green-800",children:e},e))}):(0,t.jsx)("span",{className:"mt-2 block text-xs font-bold text-stone-400",children:0===e.getDay()?"休息":"尚無"})]},n)})})]}),(0,t.jsxs)("aside",{className:"rounded-[1.75rem] border border-softline bg-white p-5",children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:"日期明細"}),(0,t.jsx)("h3",{className:"mt-1 text-3xl font-black text-ink",children:d}),N&&0!==g(N)?(0,t.jsxs)("div",{className:"mt-5 grid gap-4",children:[(0,t.jsxs)("div",{className:"grid gap-3 sm:grid-cols-3",children:[(0,t.jsxs)("div",{className:"rounded-2xl bg-cream p-4",children:[(0,t.jsx)("p",{className:"text-xs font-black text-amber-700",children:"完成任務"}),(0,t.jsx)("strong",{className:"text-2xl text-ink",children:g(N)})]}),(0,t.jsxs)("div",{className:"rounded-2xl bg-green-50 p-4",children:[(0,t.jsx)("p",{className:"text-xs font-black text-green-700",children:"學過單字"}),(0,t.jsx)("strong",{className:"text-2xl text-ink",children:v.length})]}),(0,t.jsxs)("div",{className:"rounded-2xl bg-blue-50 p-4",children:[(0,t.jsx)("p",{className:"text-xs font-black text-blue-700",children:"測驗次數"}),(0,t.jsx)("strong",{className:"text-2xl text-ink",children:N.quizzes.length})]})]}),v.length>0?(0,t.jsxs)("section",{className:"rounded-3xl bg-green-50 p-4",children:[(0,t.jsx)("p",{className:"font-black text-green-900",children:"這天學過的英文單字"}),(0,t.jsx)("div",{className:"mt-3 flex flex-wrap gap-2",children:v.map(e=>(0,t.jsx)("span",{className:"rounded-full bg-white px-3 py-2 text-sm font-black text-green-800",children:e},e))})]}):null,N.quizzes.map(e=>(0,t.jsxs)("section",{className:"rounded-3xl border border-softline bg-white p-4",children:[(0,t.jsx)("p",{className:"font-black text-ink",children:"每日 10 題"}),(0,t.jsxs)("p",{className:"mt-1 font-bold text-stone-600",children:["分數 ",e.score," / ",e.total]})]},e.id)),N.englishGames.map(e=>(0,t.jsxs)("section",{className:"rounded-3xl border border-softline bg-white p-4",children:[(0,t.jsx)("p",{className:"font-black text-ink",children:"英文闖關"}),(0,t.jsxs)("p",{className:"mt-1 font-bold text-stone-600",children:["分數 ",e.score,"|連擊 ",e.streak]})]},e.id)),N.dailyRecords.map(e=>(0,t.jsxs)("section",{className:"rounded-3xl border border-softline bg-white p-4",children:[(0,t.jsxs)("p",{className:"font-black text-ink",children:["每日紀錄:",e.mood]}),(0,t.jsx)("p",{className:"mt-1 font-bold text-blue-700",children:e.sentence}),(0,t.jsx)("p",{className:"mt-2 text-sm leading-7 text-stone-600",children:e.note})]},e.id))]}):(0,t.jsx)("div",{className:"mt-5 rounded-3xl bg-cream p-5 font-bold leading-8 text-stone-600",children:"這一天還沒有學習紀錄。完成每日 10 題、每日紀錄或手寫掃描後,這裡會自動整理。"}),(0,t.jsxs)("div",{className:"mt-5 flex flex-wrap gap-3",children:[(0,t.jsx)(l.SecondaryButton,{href:"/daily-record",children:"新增每日紀錄"}),(0,t.jsx)(l.SecondaryButton,{href:"/daily-quiz",children:"開始每日 10 題"})]})]})]})]})}var p=e.i(87102),b=e.i(41324);e.s(["default",0,function(){let{person:e}=(0,b.useActivePerson)(),[o,c]=(0,r.useState)(null);return(0,r.useEffect)(()=>{c((0,p.getWeeklySummary)(void 0,e.id))},[e.id]),(0,t.jsxs)(n.AppShell,{children:[(0,t.jsx)(s.PageHeader,{eyebrow:"Progress Review",title:`${e.name} 的學習進度`,description:`目前顯示 ${e.name} 的獨立紀錄;切換孩子後,月曆、單字數與測驗成績會一起更新。`,action:(0,t.jsx)(l.SecondaryButton,{href:"/dashboard",children:"回儀表板"})}),(0,t.jsx)("section",{className:"mt-8 grid gap-4 md:grid-cols-4",children:[["近 7 天學習日",`${o?.days??0} 天`],["近 7 天題數",`${o?.total??0} 題`],["答對題數",`${o?.score??0} 題`],["正確率",`${o?.accuracy??0}%`]].map(([e,r])=>(0,t.jsxs)(a.InfoCard,{tone:"cream",children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:e}),(0,t.jsx)("strong",{className:"mt-2 block text-3xl text-ink",children:r})]},e))}),(0,t.jsx)("div",{className:"mt-8",children:(0,t.jsx)(f,{personId:e.id})}),(0,t.jsxs)(i.SectionCard,{className:"mt-8",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-black text-amber-700",children:"Parent Notes"}),(0,t.jsx)("h2",{className:"mt-1 text-2xl font-black text-ink",children:"本週家長觀察重點"}),(0,t.jsx)("p",{className:"mt-3 max-w-3xl leading-8 text-stone-600",children:"先看孩子是否願意每天靠近一點,再看答對幾題。若某天沒有紀錄,不代表退步,只是提醒我們明天補一小步。"})]}),(0,t.jsx)("div",{className:"flex flex-wrap gap-3",children:(0,t.jsx)(l.SecondaryButton,{href:"/daily-record",children:"新增每日紀錄"})})]}),o&&o.words.length>0?(0,t.jsxs)("div",{className:"mt-6 rounded-3xl bg-green-50 p-5",children:[(0,t.jsx)("p",{className:"font-black text-green-900",children:"近 7 天學過的單字"}),(0,t.jsx)("div",{className:"mt-3 flex flex-wrap gap-2",children:o.words.map(e=>(0,t.jsx)("span",{className:"rounded-full bg-white px-4 py-2 text-sm font-black text-green-800",children:e},e))})]}):null]})]})}],26896)}]);
_next/static/chunks/2ed6zxyx6bltt.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return a},formatWithValidation:function(){return c},urlObjectKeys:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(90809)._(e.r(98183)),l=/https?|ftp|gopher|file/;function a(e){let{auth:t,hostname:r}=e,n=e.protocol||"",o=e.pathname||"",a=e.hash||"",i=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),i&&"object"==typeof i&&(i=String(u.urlQueryToSearchParams(i)));let f=e.search||i&&`?${i}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||l.test(n))&&!1!==c?(c="//"+(c||""),o&&"/"!==o[0]&&(o="/"+o)):c||(c=""),a&&"#"!==a[0]&&(a="#"+a),f&&"?"!==f[0]&&(f="?"+f),o=o.replace(/[?#]/g,encodeURIComponent),f=f.replace("#","%23"),`${n}${c}${o}${f}${a}`}let i=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return a(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return o}});let n=e.r(71645);function o(e,t){let r=(0,n.useRef)(null),o=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=o.current;t&&(o.current=null,t())}else e&&(r.current=u(e,n)),t&&(o.current=u(t,n))},[e,t])}function u(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return u}});let n=e.r(18967),o=e.r(52817);function u(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,o.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return g},useLinkStatus:function(){return m}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let u=e.r(90809),l=e.r(43476),a=u._(e.r(71645)),i=e.r(95057),c=e.r(8372),f=e.r(18581),s=e.r(18967),p=e.r(5550);e.r(33525);let d=e.r(88540),h=e.r(91949),y=e.r(73668),b=e.r(9396);function g(t){var r,n;let o,u,g,[m,_]=(0,a.useOptimistic)(h.IDLE_LINK_STATUS),j=(0,a.useRef)(null),{href:P,as:O,children:S,prefetch:T=null,passHref:C,replace:R,shallow:x,scroll:E,onClick:L,onMouseEnter:M,onTouchStart:$,legacyBehavior:U=!1,onNavigate:k,transitionTypes:A,ref:I,unstable_dynamicOnHover:K,...w}=t;o=S,U&&("string"==typeof o||"number"==typeof o)&&(o=(0,l.jsx)("a",{children:o}));let B=a.default.useContext(c.AppRouterContext),D=!1!==T,N=!1!==T?null===(n=T)||"auto"===n?b.FetchStrategy.PPR:b.FetchStrategy.Full:b.FetchStrategy.PPR,F="string"==typeof(r=O||P)?r:(0,i.formatUrl)(r);if(U){if(o?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});u=a.default.Children.only(o)}let W=U?u&&"object"==typeof u&&u.ref:I,z=a.default.useCallback(e=>(null!==B&&(j.current=(0,h.mountLinkInstance)(e,F,B,N,D,_)),()=>{j.current&&((0,h.unmountLinkForCurrentNavigation)(j.current),j.current=null),(0,h.unmountPrefetchableInstance)(e)}),[D,F,B,N,_]),q={ref:(0,f.useMergedRef)(z,W),onClick(t){U||"function"!=typeof L||L(t),U&&u.props&&"function"==typeof u.props.onClick&&u.props.onClick(t),!B||t.defaultPrevented||function(t,r,n,o,u,l,i){if("u">typeof window){let c,{nodeName:f}=t.currentTarget;if("A"===f.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,y.isLocalURL)(r)){o&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:s}=e.r(99781);a.default.startTransition(()=>{s(r,o?"replace":"push",!1===u?d.ScrollBehavior.NoScroll:d.ScrollBehavior.Default,n.current,i)})}}(t,F,j,R,E,k,A)},onMouseEnter(e){U||"function"!=typeof M||M(e),U&&u.props&&"function"==typeof u.props.onMouseEnter&&u.props.onMouseEnter(e),B&&D&&(0,h.onNavigationIntent)(e.currentTarget,!0===K)},onTouchStart:function(e){U||"function"!=typeof $||$(e),U&&u.props&&"function"==typeof u.props.onTouchStart&&u.props.onTouchStart(e),B&&D&&(0,h.onNavigationIntent)(e.currentTarget,!0===K)}};return(0,s.isAbsoluteUrl)(F)?q.href=F:U&&!C&&("a"!==u.type||"href"in u.props)||(q.href=(0,p.addBasePath)(F)),g=U?a.default.cloneElement(u,q):(0,l.jsx)("a",{...w,...q,children:o}),(0,l.jsx)(v.Provider,{value:m,children:g})}e.r(84508);let v=(0,a.createContext)(h.IDLE_LINK_STATUS),m=()=>(0,a.useContext)(v);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},14876,e=>{"use strict";var t=e.i(43476),r=e.i(22016);function n(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:r,suffix:n}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===r?`/index.html${n}`:/\.[a-z0-9]+$/i.test(r)?e:`${r.replace(/\/+$/,"")}/index.html${n}`}e.s(["ExportSafeLink",0,function({href:e,children:o,...u}){return"string"==typeof e?(0,t.jsx)("a",{href:n(e),...u,children:o}):(0,t.jsx)(r.default,{href:e,...u,children:o})},"getExportSafeHref",0,n])}]);
_next/static/chunks/2eqq4i-f6tb29.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,51668,e=>{"use strict";let n=[{id:"g1-ren",grade:1,character:"人",zhuyin:"ㄖㄣˊ",word:"人們",meaning:"一個人或很多人。",example:"我們都是有禮貌的人。",strokeHint:"先撇再捺,兩筆要站穩。"},{id:"g1-shang",grade:1,character:"上",zhuyin:"ㄕㄤˋ",word:"上學",meaning:"位置在高處,或開始去學校。",example:"我早上去上學。",strokeHint:"中間一豎要直,下面一橫要平。"},{id:"g1-da",grade:1,character:"大",zhuyin:"ㄉㄚˋ",word:"大家",meaning:"尺寸很大,也可以表示很多人。",example:"大家一起讀故事。",strokeHint:"先橫,再撇,最後捺要打開。"},{id:"g1-xiao",grade:1,character:"小",zhuyin:"ㄒㄧㄠˇ",word:"小手",meaning:"尺寸不大。",example:"我用小手寫字。",strokeHint:"中間豎鉤站直,兩點不要太遠。"},{id:"g1-ri",grade:1,character:"日",zhuyin:"ㄖˋ",word:"日子",meaning:"太陽或一天。",example:"今天是好日子。",strokeHint:"外框方正,中間一橫不要太斜。"},{id:"g1-yue",grade:1,character:"月",zhuyin:"ㄩㄝˋ",word:"月亮",meaning:"夜晚天空中的月亮。",example:"月亮掛在天空。",strokeHint:"外框窄長,裡面兩橫平均。"},{id:"g1-shui",grade:1,character:"水",zhuyin:"ㄕㄨㄟˇ",word:"喝水",meaning:"可以喝、洗東西的液體。",example:"運動後要喝水。",strokeHint:"中間豎鉤先寫,左右筆畫像水流。"},{id:"g1-mu",grade:1,character:"木",zhuyin:"ㄇㄨˋ",word:"木頭",meaning:"樹木的材料。",example:"桌子是木頭做的。",strokeHint:"先橫再豎,撇捺要張開。"},{id:"g1-shou",grade:1,character:"手",zhuyin:"ㄕㄡˇ",word:"小手",meaning:"用來拿東西、寫字的身體部位。",example:"我把手洗乾淨。",strokeHint:"三橫間距平均,豎鉤往下穩。"},{id:"g1-kou",grade:1,character:"口",zhuyin:"ㄎㄡˇ",word:"開口",meaning:"嘴巴,也表示說話。",example:"我勇敢開口回答。",strokeHint:"外框寫方,最後一橫封起來。"},{id:"g2-xue",grade:2,character:"學",zhuyin:"ㄒㄩㄝˊ",word:"學習",meaning:"學新的知識或能力。",example:"我每天開心學習。",strokeHint:"上半部不要擠,下面子字要端正。"},{id:"g2-jia",grade:2,character:"家",zhuyin:"ㄐㄧㄚ",word:"家庭",meaning:"和家人一起生活的地方。",example:"家是溫暖的地方。",strokeHint:"寶蓋頭蓋住下面,彎鉤自然。"},{id:"g2-you",grade:2,character:"友",zhuyin:"ㄧㄡˇ",word:"朋友",meaning:"一起玩、互相照顧的人。",example:"我和朋友分享玩具。",strokeHint:"撇要舒展,又字收穩。"},{id:"g2-shu",grade:2,character:"書",zhuyin:"ㄕㄨ",word:"書本",meaning:"可以閱讀的本子。",example:"我喜歡看故事書。",strokeHint:"橫畫多,要保持間距。"},{id:"g2-hua",grade:2,character:"花",zhuyin:"ㄏㄨㄚ",word:"花朵",meaning:"植物開出的美麗部分。",example:"公園裡有很多花。",strokeHint:"草字頭寬,下面化字站穩。"},{id:"g2-kan",grade:2,character:"看",zhuyin:"ㄎㄢˋ",word:"看見",meaning:"用眼睛觀察。",example:"我看見一隻小鳥。",strokeHint:"上方像手,下面目字要方正。"},{id:"g3-yu",grade:3,character:"語",zhuyin:"ㄩˇ",word:"語文",meaning:"說話和文字。",example:"語文課可以讀故事。",strokeHint:"言字旁偏窄,右邊要分層。"},{id:"g3-du",grade:3,character:"讀",zhuyin:"ㄉㄨˊ",word:"閱讀",meaning:"看文字並理解意思。",example:"我每天閱讀十分鐘。",strokeHint:"左右結構要平衡,貝字收小。"},{id:"g3-xiang",grade:3,character:"想",zhuyin:"ㄒㄧㄤˇ",word:"想法",meaning:"心裡思考。",example:"我說出自己的想法。",strokeHint:"相在上方,心在下方要穩。"},{id:"g3-qing",grade:3,character:"情",zhuyin:"ㄑㄧㄥˊ",word:"心情",meaning:"心裡的感覺。",example:"今天我的心情很好。",strokeHint:"豎心旁要窄,青字橫畫平均。"},{id:"g3-zhuang",grade:3,character:"莊",zhuyin:"ㄓㄨㄤ",word:"村莊",meaning:"人們聚居生活的村落,也可以用在地名或姓氏。",example:"河邊有一個安靜的村莊。",strokeHint:"草字頭要平穩,下方的壯要寫得端正。"},{id:"g4-cha",grade:4,character:"察",zhuyin:"ㄔㄚˊ",word:"觀察",meaning:"仔細看、仔細想。",example:"我們觀察植物生長。",strokeHint:"寶蓋頭舒展,下方筆畫不要擠。"},{id:"g4-guan",grade:4,character:"管",zhuyin:"ㄍㄨㄢˇ",word:"管理",meaning:"安排與照顧。",example:"我會管理自己的書包。",strokeHint:"竹字頭要輕,官字端正。"},{id:"g4-zhai",grade:4,character:"摘",zhuyin:"ㄓㄞ",word:"摘要",meaning:"取出內容中最重要的部分。",example:"我把文章重點整理成摘要。",strokeHint:"提手旁寫窄,右邊上下要對齊。"},{id:"g4-yao",grade:4,character:"要",zhuyin:"ㄧㄠˋ",word:"重要",meaning:"必須注意或很有價值。",example:"閱讀時要找出重要線索。",strokeHint:"上方扁而穩,女字底��托住上方。"},{id:"g4-zhang",grade:4,character:"章",zhuyin:"ㄓㄤ",word:"文章",meaning:"由句子和段落組成的文字內容。",example:"這篇文章介紹海洋。",strokeHint:"上方音字收緊,下方十字站直。"},{id:"g4-li",grade:4,character:"理",zhuyin:"ㄌㄧˇ",word:"理解",meaning:"知道內容在說什麼。",example:"我讀完後能理解主旨。",strokeHint:"王字旁窄,里字橫畫平均。"},{id:"g5-bian",grade:5,character:"辨",zhuyin:"ㄅㄧㄢˋ",word:"辨認",meaning:"分清楚不同的地方。",example:"我能辨認相似的字。",strokeHint:"左中右要平均,不要寫太寬。"},{id:"g5-lun",grade:5,character:"論",zhuyin:"ㄌㄨㄣˋ",word:"討論",meaning:"交換想法。",example:"我們一起討論答案。",strokeHint:"言字旁偏窄,右邊層次清楚。"},{id:"g5-ce",grade:5,character:"策",zhuyin:"ㄘㄜˋ",word:"策略",meaning:"為了完成目標所安排的方法。",example:"找關鍵字是一種閱讀策略。",strokeHint:"竹字頭要輕,下方筆畫保持中央。"},{id:"g5-ju",grade:5,character:"據",zhuyin:"ㄐㄩˋ",word:"證據",meaning:"能支持說法的資料或事實。",example:"請從文章找出證據。",strokeHint:"提手旁窄,右邊層次清楚。"},{id:"g5-bi",grade:5,character:"比",zhuyin:"ㄅㄧˇ",word:"比較",meaning:"找出兩件事相同或不同的地方。",example:"我們比較兩篇文章的觀點。",strokeHint:"左右兩部分靠近,豎彎鉤要穩。"},{id:"g5-xi",grade:5,character:"析",zhuyin:"ㄒㄧ",word:"分析",meaning:"把內容拆開來仔細理解。",example:"分析圖表後再回答問題。",strokeHint:"木字旁窄,斤字撇畫舒展。"},{id:"g6-bian",grade:6,character:"辯",zhuyin:"ㄅㄧㄢˋ",word:"辯論",meaning:"用理由說明自己的想法。",example:"辯論時要尊重別人。",strokeHint:"左中右結構要緊湊。"},{id:"g6-zheng",grade:6,character:"證",zhuyin:"ㄓㄥˋ",word:"證明",meaning:"用理由或資料說明是真的。",example:"請用例子證明你的想法。",strokeHint:"左窄右寬,登字要站穩。"},{id:"g6-tong",grade:6,character:"統",zhuyin:"ㄊㄨㄥˇ",word:"統整",meaning:"把分散的內容整理成完整架構。",example:"考前要統整學過的重點。",strokeHint:"糸字旁窄,右邊上緊下穩。"},{id:"g6-tui",grade:6,character:"推",zhuyin:"ㄊㄨㄟ",word:"推論",meaning:"根據線索想出合理的結果。",example:"我從人物行動推論他的心情。",strokeHint:"提手旁窄,隹字四橫要平均。"},{id:"g6-guan",grade:6,character:"觀",zhuyin:"ㄍㄨㄢ",word:"觀點",meaning:"一個人看事情的想法和立場。",example:"文章提出兩種不同觀點。",strokeHint:"左邊筆畫多要收緊,見字底穩。"},{id:"g6-jie",grade:6,character:"接",zhuyin:"ㄐㄧㄝ",word:"銜接",meaning:"把前後內容連起來。",example:"這個單元幫助我們銜接國中。",strokeHint:"提手旁窄,右邊妾字上下對正。"}];e.s(["chineseHandwritingWords",0,n,"getChineseHandwritingWordsByGrade",0,function(e){return n.filter(n=>n.grade===e)}])},4914,e=>{"use strict";let n=[{id:"grade-1-concrete-words",grades:[1],src:"/images/chinese/grade-1-picture-learning.webp",alt:"小學生在明亮教室裡指著樹木圖卡朗讀,桌上有故事書、水杯和書包",caption:"先找找看:圖裡有哪些人、物品和動作?再把看到的內容說成一句話。",observationPrompts:["孩子用哪一隻手指圖卡?","窗外是白天還是晚上?","桌上有哪些學習用品?"]},{id:"grade-2-home-reading",grades:[2],src:"/images/chinese/grade-2-picture-learning.webp",alt:"兩位小學生和家人在溫暖的家中一起看故事書,桌上有花和筆記本",caption:"看看人物正在做什麼,再找出「家、友、書、花、看、學」的生活線索。",observationPrompts:["誰正在拿書?","朋友用手指出了什麼?","家人怎麼陪伴孩子閱讀?"]},{id:"grade-3-4-reading",grades:[3,4],src:"/images/chinese/grade-3-4-reading.webp",alt:"兩位小學生觀察葉片、閱讀植物文章、排列生長圖片並整理筆記",caption:"從圖中的觀察、閱讀與排列動作,找出故事順序和文章重點。",observationPrompts:["放大鏡正在觀察什麼?","三張圖片的先後順序是什麼?","筆記可以寫下哪一句重點?"]},{id:"grade-5-6-evidence-reading",grades:[5,6],src:"/images/chinese/grade-5-6-reading.webp",alt:"三位高年級學生在圖書館比較文章、找證據、整理重點並討論觀點",caption:"先看資料,再說理由:哪些內容是線索、哪些內容能支持結論?",observationPrompts:["學生正在比較哪兩份資料?","便利貼可能記錄了哪些證據?","說明觀點時,為什麼要先聽完別人的理由?"]}];e.s(["getChineseIllustrationForGrade",0,function(e){return n.find(n=>n.grades.includes(e))??n[0]}])},16549,e=>{"use strict";var n=e.i(51668),r=e.i(4914);let i={"g1-ren":{radical:"人",strokes:2,picture:"兩個人一起走",pictureDescription:"兩個人互相陪伴,一起往前走。"},"g1-shang":{radical:"一",strokes:3,picture:"箭頭往上",pictureDescription:"箭頭指向高處,表示上方。"},"g1-da":{radical:"大",strokes:3,picture:"一大一小兩個圓",pictureDescription:"比較兩個圓,較大的就是「大」。"},"g1-xiao":{radical:"小",strokes:3,picture:"一小一大兩個圓",pictureDescription:"比較兩個圓,較小的就是「小」。"},"g1-ri":{radical:"日",strokes:4,picture:"太陽",pictureDescription:"白天看見太陽,也可以想到一天的日子。"},"g1-yue":{radical:"月",strokes:4,picture:"月亮",pictureDescription:"夜晚天空中的月亮。"},"g1-shui":{radical:"水",strokes:4,picture:"水滴",pictureDescription:"可以喝、可以洗東西的水。"},"g1-mu":{radical:"木",strokes:4,picture:"樹木",pictureDescription:"樹幹和樹枝讓人想到木頭。"},"g1-shou":{radical:"手",strokes:4,picture:"一隻手",pictureDescription:"可以拿東西、寫字和打招呼的手。"},"g1-kou":{radical:"口",strokes:3,picture:"張開的嘴巴",pictureDescription:"用嘴巴吃東西,也用口說話。"},"g2-xue":{radical:"子",strokes:16,picture:"課本和鉛筆",pictureDescription:"打開課本、拿起鉛筆,就是在學習。"},"g2-jia":{radical:"宀",strokes:10,picture:"一間房子",pictureDescription:"家人一起生活的溫暖房子。"},"g2-you":{radical:"又",strokes:4,picture:"兩隻手握在一起",pictureDescription:"朋友互相幫忙、一起分享。"},"g2-shu":{radical:"曰",strokes:10,picture:"打開的書",pictureDescription:"翻開書本,可以讀到文字和故事。"},"g2-hua":{radical:"艸",strokes:7,picture:"一朵花",pictureDescription:"植物開出的花朵。"},"g2-kan":{radical:"目",strokes:9,picture:"一雙眼睛",pictureDescription:"用眼睛仔細觀察,就是看。"},"g3-yu":{radical:"言",strokes:14,picture:"對話框",pictureDescription:"用說話和文字表達語言。"},"g3-du":{radical:"言",strokes:22,picture:"正在閱讀的書",pictureDescription:"看著文字並理解內容,就是讀。"},"g3-xiang":{radical:"心",strokes:13,picture:"想法泡泡",pictureDescription:"安靜思考,心裡出現一個想法。"},"g3-qing":{radical:"心",strokes:11,picture:"一顆心",pictureDescription:"開心、難過都是心裡的感情。"},"g3-zhuang":{radical:"艸",strokes:11,picture:"屋舍與田野",pictureDescription:"幾間屋舍聚在田野旁,形成大家生活的村莊。"},"g4-cha":{radical:"宀",strokes:14,picture:"放大鏡看葉子",pictureDescription:"拿放大鏡仔細看葉脈,找出細節。"},"g4-guan":{radical:"竹",strokes:14,picture:"整理好的書包",pictureDescription:"把物品分類放好,表示有條理地管理。"},"g4-zhai":{radical:"手",strokes:14,picture:"文章圈出重點",pictureDescription:"從一段文字中圈出最重要的內容。"},"g4-yao":{radical:"襾",strokes:9,picture:"星號標記重點",pictureDescription:"用星號標出需要特別注意的內容。"},"g4-zhang":{radical:"立",strokes:11,picture:"三段文字",pictureDescription:"幾個段落依順序組成一篇文章。"},"g4-li":{radical:"玉",strokes:11,picture:"想法連成線",pictureDescription:"把線索連起來,就能理解內容。"},"g5-bian":{radical:"辛",strokes:16,picture:"找不同",pictureDescription:"仔細找出兩個相似內容不同的地方。"},"g5-lun":{radical:"言",strokes:15,picture:"多人交換想法",pictureDescription:"大家輪流說明理由並聽別人的想法。"},"g5-ce":{radical:"竹",strokes:12,picture:"步驟清單",pictureDescription:"先安排步驟,再依方法完成目標。"},"g5-ju":{radical:"手",strokes:16,picture:"資料支持答案",pictureDescription:"用文章線索或資料支持自己的答案。"},"g5-bi":{radical:"比",strokes:4,picture:"兩欄比較表",pictureDescription:"把兩件事放在一起,找相同與不同。"},"g5-xi":{radical:"木",strokes:8,picture:"內容拆成小塊",pictureDescription:"把複雜內容分成幾個部分逐一理解。"},"g6-bian":{radical:"辛",strokes:21,picture:"兩方提出理由",pictureDescription:"兩方用理由和證據說明不同立場。"},"g6-zheng":{radical:"言",strokes:19,picture:"證據指向結論",pictureDescription:"資料和例子共同支持一個結論。"},"g6-tong":{radical:"糸",strokes:12,picture:"重點整理圖",pictureDescription:"把不同單元的重點整理到同一張圖。"},"g6-tui":{radical:"手",strokes:11,picture:"線索指向答案",pictureDescription:"從已知線索一步步想出合理結果。"},"g6-guan":{radical:"見",strokes:24,picture:"不同角度看同一件事",pictureDescription:"站在不同位置,可能會有不同看法。"},"g6-jie":{radical:"手",strokes:11,picture:"兩段道路連接",pictureDescription:"把前一段學習和下一階段順利連起來。"}},a={注音符號:"口",聲調練習:"口",基礎生字:"人",常見詞語:"手",朗讀練習:"日",生字與部首:"學",造詞與語意:"友",短文閱讀:"書",常用國字與部首:"語",詞語理解:"想",段落理解:"讀",成語與詞義:"理",段落結構:"章",摘要練習:"摘",因果推論:"理",說明文閱讀:"察",字詞辨析:"辨",複句關��:"析",閱讀策略:"策",主旨與摘要:"析",觀點與事實:"據",文本比較:"比",成語與語境:"觀",文本結構:"統",閱讀推論:"推",跨文本閱讀:"接",論點與證據:"證",演說與辯論:"辯",國中銜接閱讀:"接"},t={"g2-xue":{aliases:["学"],variantNote:"「学」是中國大陸常見簡化字,臺灣課程使用「學」。"},"g2-shu":{aliases:["书"],variantNote:"「书」是中國大陸常見簡化字,臺灣課程使用「書」。"},"g3-yu":{aliases:["语"],variantNote:"「语」是中國大陸常見簡化字,臺灣課程使用「語」。"},"g3-du":{aliases:["读"],variantNote:"「读」是中國大陸常見簡化字,臺灣課程使用「讀」。"},"g3-zhuang":{aliases:["庄"],variantNote:"「庄」可作「莊」的異體字;臺灣國小一般書寫正字「莊」。"},"g6-zheng":{aliases:["证"],variantNote:"「证」是中國大陸常見簡化字,臺灣課程使用「證」。"},"g6-tong":{aliases:["统"],variantNote:"「统」是中國大陸常見簡化字,臺灣課程使用「統」。"},"g6-guan":{aliases:["观"],variantNote:"「观」是中國大陸常見簡化字,臺灣課程使用「觀」。"}},s=n.chineseHandwritingWords.filter(e=>i[e.id]).map(e=>({...e,...i[e.id],...t[e.id]}));function o(e){return Array.from(e).reduce((e,n)=>e+n.charCodeAt(0),0)}function l(e){let n=s.filter(n=>n.grade===e);return n.length>=4?n:s.filter(n=>n.grade<=e).slice(-10)}e.s(["chineseDictionary",0,s,"findChineseDictionaryEntry",0,function(e){let n=e.normalize("NFKC").trim().replace(/[,。!?、;:,.!?;:\s]/g,"");if(!n)return;let r=s.find(e=>e.character===n);if(r)return{entry:r};for(let e of s){let r=e.aliases?.find(e=>e===n);if(r)return{entry:e,matchedAlias:r}}let i=s.find(e=>e.word===n);if(i)return{entry:i}},"getChineseDictionaryEntries",0,l,"getChineseDictionaryQuestion",0,function(e,n){let i=l(e),t=Object.entries(a).find(([e])=>n.includes(e))?.[1],c=i.find(e=>e.character===t),d=i.length?o(n)%i.length:0,u=c??i[d]??s[0],p=i.filter(e=>e.id!==u.id).slice(0,3),g=[u,...p].sort((e,r)=>o(`${n}:${e.id}`)-o(`${n}:${r.id}`)).map(e=>e.character);return{entry:u,options:g,illustration:(0,r.getChineseIllustrationForGrade)(e)}}])},86540,65208,19328,e=>{"use strict";var n=e.i(43476);let r={circle:"圓形",square:"正方形",triangle:"三角形",rectangle:"長方形"};function i({count:e,removed:r=0}){return(0,n.jsx)("div",{className:"flex max-w-md flex-wrap justify-center gap-2","aria-label":`${e} 個圓點${r?`,其中 ${r} 個被拿走`:""}`,children:Array.from({length:e},(i,a)=>{let t=a>=e-r;return(0,n.jsx)("span",{"aria-hidden":"true",className:`relative h-9 w-9 rounded-full border-2 shadow-sm sm:h-10 sm:w-10 ${t?"border-stone-300 bg-stone-200 opacity-60":"border-amber-300 bg-[#ffc95d]"}`,children:t?(0,n.jsx)("span",{className:"absolute left-1/2 top-1/2 h-0.5 w-11 -translate-x-1/2 -translate-y-1/2 rotate-[-35deg] bg-rose-500"}):null},a)})})}function a({name:e}){return"triangle"===e?(0,n.jsx)("span",{"aria-hidden":"true",className:"h-0 w-0 border-x-[24px] border-b-[42px] border-x-transparent border-b-[#78b9ef]"}):(0,n.jsx)("span",{"aria-hidden":"true",className:`block border-2 border-white shadow-sm ${"circle"===e?"h-12 w-12 rounded-full bg-[#ff8b7d]":"square"===e?"h-12 w-12 rounded-xl bg-[#7fcf9b]":"h-10 w-16 rounded-xl bg-[#f4bd62]"}`})}e.s(["MathQuestionVisual",0,function({visual:e,compact:t=!1}){let s=t?"rounded-2xl border border-blue-100 bg-blue-50/80 p-4":"rounded-[1.75rem] border border-blue-100 bg-gradient-to-br from-blue-50 to-white p-5 shadow-sm sm:p-7";if("objects"===e.kind)return(0,n.jsxs)("div",{className:s,children:[(0,n.jsx)("p",{className:"mb-4 text-center text-sm font-black text-blue-800",children:e.removed?`看清楚:拿走 ${e.removed} 個`:`請用手指逐一數 ${e.label}`}),(0,n.jsx)("div",{className:"flex justify-center",children:(0,n.jsx)(i,{count:e.count,removed:e.removed})})]});if("comparison"===e.kind)return(0,n.jsxs)("div",{className:`${s} grid gap-4 sm:grid-cols-2`,children:[(0,n.jsxs)("div",{className:"rounded-2xl bg-white p-4 text-center shadow-sm",children:[(0,n.jsx)("p",{className:"mb-3 font-black text-blue-800",children:"左邊"}),(0,n.jsx)(i,{count:e.left})]}),(0,n.jsxs)("div",{className:"rounded-2xl bg-white p-4 text-center shadow-sm",children:[(0,n.jsx)("p",{className:"mb-3 font-black text-blue-800",children:"右邊"}),(0,n.jsx)(i,{count:e.right})]})]});if("groups"===e.kind)return(0,n.jsxs)("div",{className:s,children:[(0,n.jsxs)("p",{className:"mb-4 text-center text-sm font-black text-blue-800",children:["每一個框框是一組,共 ",e.groups.length," 組"]}),(0,n.jsx)("div",{className:"flex flex-wrap justify-center gap-3",children:e.groups.map((e,r)=>(0,n.jsx)("div",{className:"rounded-2xl border-2 border-dashed border-amber-200 bg-white p-3 shadow-sm",children:(0,n.jsx)(i,{count:e})},`${e}-${r}`))})]});if("equation"===e.kind)return(0,n.jsxs)("div",{className:`${s} text-center`,children:[(0,n.jsx)("p",{className:"break-words text-3xl font-black text-blue-800 sm:text-4xl",children:e.expression}),e.note?(0,n.jsx)("p",{className:"mt-3 text-sm font-bold leading-6 text-stone-600",children:e.note}):null]});if("number-line"===e.kind)return(0,n.jsx)("div",{className:`${s} overflow-x-auto`,children:(0,n.jsx)("div",{className:"mx-auto flex min-w-[520px] max-w-3xl items-center px-3 pb-2 pt-5",children:e.values.map((r,i)=>(0,n.jsxs)("div",{className:"relative flex flex-1 items-center",children:[(0,n.jsx)("span",{className:`relative z-10 grid h-14 min-w-14 place-items-center rounded-2xl border-2 text-lg font-black shadow-sm ${"?"===r?"border-coral bg-coral text-white":"border-blue-100 bg-white text-blue-800"}`,children:r}),i<e.values.length-1?(0,n.jsx)("span",{className:"h-1 flex-1 bg-blue-200"}):null]},`${r}-${i}`))})});if("place-value"===e.kind){let r=String(e.value).split(""),i=4===r.length?["千位","百位","十位","個位"]:["百位","十位","個位"];return(0,n.jsx)("div",{className:s,children:(0,n.jsx)("div",{className:"mx-auto grid max-w-xl gap-2",style:{gridTemplateColumns:`repeat(${r.length}, minmax(0, 1fr))`},children:r.map((e,r)=>(0,n.jsxs)("div",{className:"overflow-hidden rounded-2xl border border-blue-100 bg-white text-center shadow-sm",children:[(0,n.jsx)("p",{className:"bg-blue-100 px-2 py-2 text-sm font-black text-blue-800",children:i[r]}),(0,n.jsx)("p",{className:"px-2 py-4 text-3xl font-black text-ink",children:e})]},`${e}-${r}`))})})}if("shapes"===e.kind)return(0,n.jsx)("div",{className:s,children:(0,n.jsx)("div",{className:"flex flex-wrap justify-center gap-3 sm:gap-5",children:e.shapes.map((e,i)=>(0,n.jsxs)("div",{className:"flex min-h-28 min-w-28 flex-col items-center justify-center gap-3 rounded-2xl bg-white p-4 shadow-sm",children:[(0,n.jsx)(a,{name:e}),(0,n.jsx)("span",{className:"text-sm font-black text-stone-600",children:r[e]})]},`${e}-${i}`))})});if("pattern"===e.kind)return(0,n.jsx)("div",{className:s,children:(0,n.jsx)("div",{className:"flex flex-wrap items-center justify-center gap-3",children:e.items.map((e,r)=>(0,n.jsx)("span",{className:`grid h-16 min-w-16 place-items-center rounded-2xl border-2 px-3 text-2xl font-black shadow-sm ${"?"===e?"border-coral bg-coral text-white":"border-blue-100 bg-white text-blue-800"}`,children:e},`${e}-${r}`))})});if("clock"===e.kind){let r=6*e.minute,i=e.hour%12*30+.5*e.minute;return(0,n.jsx)("div",{className:s,children:(0,n.jsxs)("div",{className:"relative mx-auto h-52 w-52 rounded-full border-[10px] border-amber-200 bg-white shadow-inner","aria-label":`${e.hour} 點 ${e.minute} 分`,children:[(0,n.jsx)("span",{className:"absolute left-1/2 top-2 -translate-x-1/2 font-black text-stone-700",children:"12"}),(0,n.jsx)("span",{className:"absolute right-3 top-1/2 -translate-y-1/2 font-black text-stone-700",children:"3"}),(0,n.jsx)("span",{className:"absolute bottom-2 left-1/2 -translate-x-1/2 font-black text-stone-700",children:"6"}),(0,n.jsx)("span",{className:"absolute left-3 top-1/2 -translate-y-1/2 font-black text-stone-700",children:"9"}),(0,n.jsx)("span",{className:"absolute bottom-1/2 left-1/2 h-14 w-1.5 origin-bottom -translate-x-1/2 rounded-full bg-stone-800",style:{transform:`translateX(-50%) rotate(${i}deg)`}}),(0,n.jsx)("span",{className:"absolute bottom-1/2 left-1/2 h-20 w-1 origin-bottom -translate-x-1/2 rounded-full bg-coral",style:{transform:`translateX(-50%) rotate(${r}deg)`}}),(0,n.jsx)("span",{className:"absolute left-1/2 top-1/2 h-4 w-4 -translate-x-1/2 -translate-y-1/2 rounded-full bg-stone-800"})]})})}return"money"===e.kind?(0,n.jsx)("div",{className:s,children:(0,n.jsx)("div",{className:"flex flex-wrap justify-center gap-4",children:e.values.map((e,r)=>(0,n.jsxs)("span",{className:"grid h-24 w-24 place-items-center rounded-full border-4 border-amber-300 bg-[#fff3be] text-2xl font-black text-amber-900 shadow-sm",children:[e," 元"]},`${e}-${r}`))})}):"fraction"===e.kind?(0,n.jsxs)("div",{className:s,children:[(0,n.jsx)("div",{className:"mx-auto flex max-w-2xl overflow-hidden rounded-2xl border-4 border-white bg-white shadow-sm","aria-label":`${e.parts} 等份,其中 ${e.shaded} 份塗色`,children:Array.from({length:e.parts},(r,i)=>(0,n.jsx)("span",{className:`h-24 flex-1 border-r-2 border-white last:border-r-0 ${i<e.shaded?"bg-[#7fcf9b]":"bg-stone-100"}`},i))}),(0,n.jsxs)("p",{className:"mt-3 text-center text-sm font-black text-blue-800",children:["共有 ",e.parts," 等份,綠色是其中 ",e.shaded," 份"]})]}):"measurement"===e.kind?(0,n.jsx)("div",{className:s,children:void 0!==e.secondaryValue?(0,n.jsx)("div",{className:"mx-auto grid max-w-md place-items-center rounded-2xl border-4 border-blue-300 bg-white p-7 shadow-sm",style:{aspectRatio:`${Math.max(1.2,e.value/e.secondaryValue)} / 1`},children:(0,n.jsxs)("span",{className:"text-center text-lg font-black text-blue-800",children:["長 ",e.value," ",e.unit,(0,n.jsx)("br",{}),"寬 ",e.secondaryValue," ",e.unit]})}):(0,n.jsxs)("div",{className:"mx-auto max-w-2xl rounded-2xl bg-white p-5 shadow-sm",children:[(0,n.jsx)("p",{className:"text-center text-lg font-black text-stone-700",children:e.label}),(0,n.jsx)("div",{className:"mt-4 h-5 rounded-full bg-gradient-to-r from-coral via-amber-300 to-green-300"}),(0,n.jsxs)("div",{className:"mt-2 flex justify-between text-sm font-black text-stone-500",children:[(0,n.jsx)("span",{children:"0"}),(0,n.jsxs)("span",{children:[e.value," ",e.unit]})]})]})}):null}],86540);let t={"grade-1:日常問候":{sentence:"Hello, teacher.",meaning:"老師,你好。",childPrompt:"早上看到老師時,可以用這句打招呼。"},"grade-1:顏色":{sentence:"It is blue.",meaning:"它是藍色的。",childPrompt:"找一個藍色物品,再把句子說一次。"},"grade-1:數字":{sentence:"I have three pencils.",meaning:"我有三支鉛筆。",childPrompt:"拿出三樣物品,一邊數一邊說。"},"grade-1:家人":{sentence:"This is my family.",meaning:"這是我的家人。",childPrompt:"指著一張家庭照片介紹家人。"},"grade-1:學用品":{sentence:"This is my book.",meaning:"這是我的書。",childPrompt:"拿起自己的課本,把句子說一次。"},"grade-1:I am ...":{sentence:"I am happy.",meaning:"我很開心。",childPrompt:"用 happy、tired 或 ready 說說現在的感覺。"},"grade-1:This is ...":{sentence:"This is my pencil.",meaning:"這是我的鉛筆。",childPrompt:"選一樣身邊的物品,用 This is ... 介紹它。"},"grade-1:I like ...":{sentence:"I like apples.",meaning:"我喜歡蘋果。",childPrompt:"把 apples 換成自己喜歡的食物。"},"grade-1:I have ...":{sentence:"I have one book.",meaning:"我有一本書。",childPrompt:"拿一樣物品,說說自己有什麼。"},"grade-1:Thank you / Sorry":{sentence:"I am sorry.",meaning:"我很抱歉。",childPrompt:"想一想什麼時候說 Thank you,什麼時候說 Sorry。"},"grade-1:親子對話":{sentence:"How are you? I am happy.",meaning:"你好嗎?我很開心。",childPrompt:"家長先問 How are you?,孩子再回答。"},"grade-1:看圖說英文":{sentence:"This is my family.",meaning:"這是我的家人。",childPrompt:"看看圖裡的人,再選出最適合的英文句子。",imageSrc:"/images/chenguang-family.webp",imageAlt:"一家人在明亮的學習空間一起閱讀與寫作"},"grade-1:找一找生活英文":{sentence:"I see a book.",meaning:"我看到一本書。",childPrompt:"在房間裡找一樣東西,用 I see ... 說出來。"},"grade-1:每日一句任務":{sentence:"I can do it.",meaning:"我做得到。",childPrompt:"開始今天任務前,先為自己加油一次。"},"grade-1:小小英文日記":{sentence:"Today is sunny. I am happy.",meaning:"今天是晴天,我很開心。",childPrompt:"把 sunny 和 happy 換成今天真正的天氣與心情。"},"grade-2:Family 家人":{sentence:"This is my family.",meaning:"這是我的家人。",childPrompt:"選一位家人,用英文介紹他。"},"grade-2:Food and drinks 食物飲品":{sentence:"I like apples and milk.",meaning:"我喜歡蘋果和牛奶。",childPrompt:"把食物換成自己今天吃過的東西。"},"grade-2:Daily routines 每日作息":{sentence:"I eat breakfast in the morning.",meaning:"我早上吃早餐。",childPrompt:"說一件自己早上固定會做的事。"},"grade-2:This is my ...":{sentence:"This is my book.",meaning:"這是我的書。",childPrompt:"拿一樣自己的物品完成句子。"},"grade-2:I like ...":{sentence:"I like apples.",meaning:"我喜歡蘋果。",childPrompt:"說一個自己喜歡的食物或活動。"},"grade-2:What do you like?":{sentence:"What do you like? I like milk.",meaning:"你喜歡什麼?我喜歡牛奶。",childPrompt:"和家長一問一答,再交換角色。"},"grade-2:生活情境對話":{sentence:"What do you like? I like apples.",meaning:"你喜歡什麼?我喜歡蘋果。",childPrompt:"把 apples 換成自己的答案。"},"grade-2:圖卡描述":{sentence:"This is my family. My mother is kind.",meaning:"這是我的家人。我的媽媽很親切。",childPrompt:"看圖先說有誰,再用一句英文描述他。",imageSrc:"/images/chenguang-family.webp",imageAlt:"一家人在溫暖的空間陪孩子學習"},"grade-2:英文小日記":{sentence:"Today is sunny. I am happy.",meaning:"今天是晴天,我很開心。",childPrompt:"用兩句話記下今天的天氣和心情。"},"grade-3:Learning actions 學習動作":{sentence:"I read and write at school.",meaning:"我在學校閱讀和寫字。",childPrompt:"說出一件自己上課會做的事。"},"grade-3:Daily routines 每日作息":{sentence:"I usually study after school.",meaning:"我通常放學後讀書。",childPrompt:"用 usually 說一件每天常做的事。"},"grade-3:Places at school 校園場所":{sentence:"The library is near my classroom.",meaning:"圖書館在我的教室附近。",childPrompt:"說說教室附近有什麼地方。"},"grade-3:I can ...":{sentence:"I can read English.",meaning:"我會讀英文。",childPrompt:"用 I can ... 說一件自己會做的事。"},"grade-3:I usually ...":{sentence:"I usually eat breakfast at seven.",meaning:"我通常七點吃早餐。",childPrompt:"把時間換成自己真正的作息。"},"grade-3:Where is ...?":{sentence:"Where is the library? It is near the classroom.",meaning:"圖書館在哪裡?它在教室附近。",childPrompt:"選一個校園地點,和家長練��問路。"},"grade-3:情境對話":{sentence:"Where is the library? It is near the classroom.",meaning:"圖書館在哪裡?它在教室附近。",childPrompt:"一人問地點,一人用 near 回答。"},"grade-3:生活短篇閱讀":{sentence:"I go to school in the morning. I read, write, and play with my friends.",meaning:"我早上去上學。我會閱讀、寫字,也和朋友玩。",childPrompt:"讀完後,說出故事裡做了哪三件事。"},"grade-3:一週英文日記":{sentence:"Today I studied English. I learned three new words.",meaning:"今天我學了英文,也學會三個新單字。",childPrompt:"把 three 換成自己今天學會的單字數量。"},"grade-4:Time and routines 時間作息":{sentence:"I get up at seven every morning.",meaning:"我每天早上七點起床。",childPrompt:"把 seven 換成自己的起床時間。"},"grade-4:Hobbies 興趣":{sentence:"My hobby is drawing.",meaning:"我的興趣是畫畫。",childPrompt:"把 drawing 換成自己喜歡的活動。"},"grade-4:Transportation 交通":{sentence:"I go to school by bus.",meaning:"我搭公車去上學。",childPrompt:"說說自己平常怎麼去學校。"},"grade-4:What time ...?":{sentence:"What time does class start? It starts at eight.",meaning:"課程幾點開始?八點開始。",childPrompt:"一人問時間,一人用自己的上課時間回答。"},"grade-4:How often ...?":{sentence:"How often do you read? I read every day.",meaning:"你多久閱讀一次?我每天閱讀。",childPrompt:"把 read 換成自己的興趣活動。"},"grade-4:Comparing things 比較事物":{sentence:"A train is faster than a bus.",meaning:"火車比公車快。",childPrompt:"挑兩種交通工具,用 faster 或 slower 比較。"},"grade-4:情境會話":{sentence:"How do you go to school? I go by bus.",meaning:"你怎麼去上學?我搭公車。",childPrompt:"和同伴交換角色完成一問一答。"},"grade-4:主題短篇閱讀":{sentence:"Mia rides her bicycle to the park every Saturday.",meaning:"米亞每個星期六騎腳踏車去公園。",childPrompt:"找出人物、交通方式、地點和時間。"},"grade-4:我的興趣分享":{sentence:"My hobby is drawing because colors make me happy.",meaning:"我的興趣是畫畫,因為色彩讓我開心。",childPrompt:"用 My hobby is ... because ... 分享自己的興趣。"},"grade-5:Health and habits 健康習慣":{sentence:"You should get enough sleep every night.",meaning:"你每天晚上都應該睡飽。",childPrompt:"說出一個自己的健康好習慣。"},"grade-5:Places and directions 地點方向":{sentence:"Walk north and turn left at the bank.",meaning:"往北走,在銀行左轉。",childPrompt:"看一張簡單地圖,練習指出方向。"},"grade-5:Seasons and activities 季節活動":{sentence:"We often go swimming in summer.",meaning:"我們夏天常去游泳。",childPrompt:"選一個季節,說出適合的活動。"},"grade-5:Past experiences 過去經驗":{sentence:"We visited the museum yesterday.",meaning:"我們昨天參觀了博物館。",childPrompt:"用 yesterday 說一件昨天做過的事。"},"grade-5:Future plans 未來計畫":{sentence:"I will finish my report tomorrow.",meaning:"我明天會完成報告。",childPrompt:"用 I will ... 說一個明天的計畫。"},"grade-5:You should ... 建議":{sentence:"You should drink more water.",meaning:"你應該多喝水。",childPrompt:"想一個健康問題,再給一句簡單建議。"},"grade-5:生活會話任務":{sentence:"How can I get to the station? Go straight and turn right.",meaning:"我要怎麼到車站?直走再右轉。",childPrompt:"一人問路,一人看地圖回答。"},"grade-5:閱讀理解":{sentence:"Leo felt tired, so he went to bed early and felt better the next day.",meaning:"里歐覺得累,所以他早點睡,隔天感覺好多了。",childPrompt:"說出里歐做了什麼,以及結果如何。"},"grade-5:英文電子郵件":{sentence:"Dear Amy, I had a great trip. See you soon!",meaning:"親愛的艾咪,我有一趟很棒的旅行。很快見!",childPrompt:"寫一句問候、一件事情和一句結尾。"},"grade-6:School life and plans 校園與計畫":{sentence:"Our group will present the science project on Friday.",meaning:"我們小組星期五要發表科學專題。",childPrompt:"說出任務、日期和自己負責的工作。"},"grade-6:Travel and culture 旅行文化":{sentence:"Learning about another culture helps us understand people.",meaning:"了解另一種文化能幫助我們理解他人。",childPrompt:"分享一個自己想認識的國家或文化。"},"grade-6:Environment 環境":{sentence:"We can reduce waste by reusing bags and bottles.",meaning:"我們可以重複使用袋子和瓶子來減少垃圾。",childPrompt:"說出一件今天就能做的環保行動。"},"grade-6:Tense review 時態統整":{sentence:"I studied yesterday, I practice today, and I will review tomorrow.",meaning:"我昨天讀書、今天練習,明天會複習。",childPrompt:"找出過去、現在和未來的時間線索。"},"grade-6:Because and so 原因結果":{sentence:"I practiced every day, so my reading improved.",meaning:"我每天練習,所以閱讀進步了。",childPrompt:"先說原因,再用 so 接出結果。"},"grade-6:Sharing opinions 表達意見":{sentence:"In my opinion, students should read every day.",meaning:"我認為學生應該每天閱讀。",childPrompt:"說出自己的意見,再補上一個理由。"},"grade-6:任務型對話":{sentence:"Which topic should we choose? Let us choose clean energy.",meaning:"我們該選哪個主題?我們選乾淨能源吧。",childPrompt:"和同伴討論並共同做出一個選擇。"},"grade-6:長篇閱讀入門":{sentence:"Nora wanted to improve her English, so she made a schedule and practiced a little every day.",meaning:"諾拉想提升英文,所以她安排時間表,每天練習一點。",childPrompt:"找出人物的目標、做法和結果。"},"grade-6:國中英文銜接":{sentence:"When I do not understand a question, I read it again and look for key words.",meaning:"當我看不懂題目時,我會再讀一次並找關鍵字。",childPrompt:"把這個閱讀策略用在今天的一道題目。"}},s=["This is my book.","I like apples.","I am happy.","I go to school.","Thank you, teacher."],o=["我喜歡蘋果。","這是我的書。","我今天很開心。","我去學校。","老師,謝謝你。"];function l(e,n=0){return Array.from(new Set([e,Math.max(n,e-1),e+1,Math.max(n,e-2),e+2])).slice(0,4).map(String)}function c(e,n,r,i,a,t,s="choice",o="先看清楚題目中的數量,再一步一步算。"){let l=Array.from(new Set([i,...t])).slice(0,4);return{id:e,question:n,visual:r,answer:i,options:"input"===s?[]:l,explanation:a,strategy:o,mode:s}}function d(e,n){let r=Number(n.replace("grade-",""));return(1===r?[[2,1],[4,3],[5,5],[7,6],[8,9]]:2===r?[[24,13],[36,22],[47,25],[58,16],[65,28]]:[[125,243],[356,278],[407,186],[525,349],[638,257]]).map(([n,i],a)=>{let t=n+i,s=n<=10&&i<=10?{kind:"groups",groups:[n,i],label:"圓片"}:{kind:"equation",expression:`${n} + ${i} = ?`,note:"可以先算個位,再算十位或百位。"};return c(`${e}-add-${a}`,0===a&&1===r?`桌上原有 ${n} 個圓片,又放上 ${i} 個,一共有幾個?`:`${n} 加 ${i} 等於多少?`,s,String(t),`${n} + ${i} = ${t}。`,l(t),4===a?"input":"choice",n<=10?"先數第一組,再接著數第二組。":"從個位開始相加;滿十要記得進一。")})}function u(e,n){let r=Number(n.replace("grade-",""));return(1===r?[[5,2],[8,3],[10,4],[13,5],[17,8]]:2===r?[[35,12],[48,25],[63,21],[72,38],[90,47]]:[[568,245],[704,182],[831,379],[920,456],[1e3,638]]).map(([n,r],i)=>{let a=n-r,t=n<=20?{kind:"objects",count:n,removed:r,label:"積木"}:{kind:"equation",expression:`${n} - ${r} = ?`,note:"可以先估算,再用直式檢查。"};return c(`${e}-subtract-${i}`,n<=20?`原有 ${n} 塊積木,拿走 ${r} 塊,還剩幾塊?`:`${n} 減 ${r} 等於多少?`,t,String(a),`${n} - ${r} = ${a}。`,l(a),4===i?"input":"choice",n<=20?"把有斜線的積木拿走,再數剩下的。":"從個位開始減;不夠減時向前一位借一。")})}function p(e){return[{items:["●","■","●","■","?"],answer:"●"},{items:["▲","▲","●","▲","▲","?"],answer:"●"},{items:["1","2","3","4","?"],answer:"5"},{items:["2","4","6","8","?"],answer:"10"},{items:["■","●","▲","■","●","?"],answer:"▲"}].map((n,r)=>c(`${e}-pattern-${r}`,"觀察重複或變化的規律,問號應該放什麼?",{kind:"pattern",items:n.items},n.answer,`照前面的規律繼續排,問號應該是「${n.answer}」。`,Array.from(new Set([n.answer,"●","■","▲",String(Number(n.answer)+1)])).slice(0,4),4===r?"input":"choice","先找最短的重複單位,再把它接下去。"))}function g(e,n){return(1e3===n?[352,407,680,915,724]:[3406,5072,6819,9025,7463]).map((r,i)=>{let a=String(r).padStart(1e3===n?3:4,"0").split("").map(Number),t=i%a.length,s=1e3===n?["百位","十位","個位"]:["千位","百位","十位","個位"],o=String(a[t]);return c(`${e}-place-${i}`,`${r} 的${s[t]}數字是多少?`,{kind:"place-value",value:r},o,`${r} 從左到右依序放進${s.join("、")},所以${s[t]}是 ${o}。`,l(Number(o)),4===i?"input":"choice","把每個數字放進正確的位值格,再找題目指定的那一格。")})}function m(e){return[{text:"原有 24 顆蘋果,又買 18 顆,吃掉 9 顆,還有幾顆?",expression:"24+18-9",answer:33},{text:"3 盒各有 8 枝筆,送出 5 枝,還剩幾枝?",expression:"3×8-5",answer:19},{text:"上午做 35 個,下午做 27 個,其中 12 個送人,還有幾個?",expression:"35+27-12",answer:50},{text:"4 組各有 6 人,又來了 3 人,一共有幾人?",expression:"4×6+3",answer:27},{text:"有 50 元,買 18 元的筆和 12 元的本子,剩多少元?",expression:"50-18-12",answer:20}].map((n,r)=>c(`${e}-multi-${r}`,n.text,{kind:"equation",expression:`${n.expression}=?`,note:"先完成第一步,再做第二步。"},String(n.answer),`${n.expression}=${n.answer}。`,l(n.answer),4===r?"input":"choice","一次只處理一件事,寫完第一個算式再接著算。"))}function h(e,n,r){return n.map((i,a)=>{let t=Number(i.answer),s=i.options??(Number.isFinite(t)?l(t):[i.answer]);return c(`${e}-upper-${a}`,i.question,{kind:"equation",expression:i.expression,note:r},i.answer,i.explanation,s,a===n.length-1?"input":"choice",r)})}function x(e,n=!1){return h(e,n?[{question:"二分之一加四分之一是多少?",expression:"1/2+1/4",answer:"3/4",explanation:"1/2 先換成 2/4,再加 1/4,得到 3/4。",options:["3/4","2/6","1/4","1"]},{question:"三分之二減六分之一是多少?",expression:"2/3-1/6",answer:"1/2",explanation:"2/3=4/6,4/6-1/6=3/6=1/2。",options:["1/2","1/3","3/5","5/6"]},{question:"五分之二加十分之三是多少?",expression:"2/5+3/10",answer:"7/10",explanation:"2/5=4/10,4/10+3/10=7/10。",options:["7/10","5/15","1/2","9/10"]},{question:"四分之三減八分之一是多少?",expression:"3/4-1/8",answer:"5/8",explanation:"3/4=6/8,6/8-1/8=5/8。",options:["5/8","2/3","1/2","7/8"]},{question:"六分之一加九分之一是多少?請用最簡分數作答。",expression:"1/6+1/9",answer:"5/18",explanation:"最小公倍數是 18,3/18+2/18=5/18。"}]:[{question:"七分之二加七分之三是多少?",expression:"2/7+3/7",answer:"5/7",explanation:"分母相同,分子 2+3=5,答案是 5/7。",options:["5/7","5/14","1/7","6/7"]},{question:"九分之八減九分之三是多少?",expression:"8/9-3/9",answer:"5/9",explanation:"分母不變,分子 8-3=5。",options:["5/9","5/6","11/9","4/9"]},{question:"十分之四加十分之五是多少?",expression:"4/10+5/10",answer:"9/10",explanation:"分母不變,分子 4+5=9。",options:["9/10","9/20","1/10","8/10"]},{question:"十二分之十一減十二分之四是多少?",expression:"11/12-4/12",answer:"7/12",explanation:"分母不變,分子 11-4=7。",options:["7/12","7/8","15/12","6/12"]},{question:"十五分之六加十五分之七是多少?",expression:"6/15+7/15",answer:"13/15",explanation:"分母相同,分子相加得到 13/15。"}],n?"先找共同分母,再換成同分母分數計算。":"同分母相加減時,分母不變,只算分子。")}function w(e,n=!1){return h(e,(n?[[2.4,3],[1.25,4],[.8,2.5],[3.06,5],[4.2,1.6]]:[[3.4,1.2],[5.75,-2.3],[.8,.35],[12.06,-4.7],[6.25,2.5]]).map(([e,r],i)=>{let a=n?"×":r>=0?"+":"-",t=Math.abs(r),s=Number((n?e*t:r>=0?e+t:e-t).toFixed(3));return{question:`${e} ${a} ${t} 等於多少?`,expression:`${e} ${a} ${t}=?`,answer:String(s),explanation:`${e} ${a} ${t}=${s}。${0===i?"小數點要對齊或先忽略小數點計算。":"計算後再檢查小數位數。"}`}}),n?"先當整數相乘,再依原題的小數位數點回小數點。":"小數加減要把小數點對齊。")}function $(e,n="grade-1"){if(e.includes("億以內"))return h(e,[{question:"43,218,765 的百萬位數字是多少?",expression:"43,218,765",answer:"3",explanation:"從右邊依序是個、十、百、千、萬、十萬、百萬,所以百萬位是 3。"},{question:"70,504,009 的十萬位數字是多少?",expression:"70,504,009",answer:"5",explanation:"70,504,009 的十萬位是 5。"},{question:"98,765,432 的萬位數字是多少?",expression:"98,765,432",answer:"6",explanation:"從右邊數第五位是萬位,數字是 6。"},{question:"下列哪個數比較大?",expression:"6,020,100 和 6,002,100",answer:"6,020,100",explanation:"百萬位相同,接著比較萬位:2 大於 0。",options:["6,020,100","6,002,100"]},{question:"8 千萬、4 百萬、2 萬合起來是多少?",expression:"80,000,000+4,000,000+20,000",answer:"84020000",explanation:"80,000,000+4,000,000+20,000=84,020,000。"}],"先依位值分組,每四位或每三位做記號再比較。");if(e.includes("整數乘除"))return h(e,[[236,14,"×"],[864,24,"÷"],[125,32,"×"],[1440,36,"÷"],[208,45,"×"]].map(([e,n,r])=>{let i="×"===r?e*n:e/n;return{question:`${e} ${"×"===r?"乘以":"除以"} ${n} 等於多少?`,expression:`${e} ${r} ${n}=?`,answer:String(i),explanation:`${e} ${r} ${n}=${i}。可以用估算檢查答案大小是否合理。`}}),"先估算答案範圍,再直式計算並反向檢查。");if(e.includes("角度")||e.includes("三角形"))return h(e,[{question:"30 度的角是哪一種角?",expression:"30°<90°",answer:"銳角",explanation:"小於 90 度的角叫做銳角。",options:["銳角","直角","鈍角"]},{question:"90 度的角是哪一種角?",expression:"90°",answer:"直角",explanation:"剛好 90 度的角叫做直角。",options:["銳角","直角","鈍角"]},{question:"120 度的角是哪一種角?",expression:"90°<120°<180°",answer:"鈍角",explanation:"大於 90 度、小於 180 度的是鈍角。",options:["銳角","直角","鈍角"]},{question:"三角形兩個角是 50 度和 60 度,第三個角是多少度?",expression:"180-50-60",answer:"70",explanation:"三角形內角和是 180 度,所以第三角是 70 度。"},{question:"等腰三角形有幾條一樣長的邊?",expression:"等腰三角形",answer:"2",explanation:"等腰三角形至少有兩���邊一樣長。"}],"先辨認角度,再使用三角形內角和 180 度。");if(e.includes("同分母分數"))return x(e);if(e.includes("異分母分數"))return x(e,!0);if(e.includes("小數乘法"))return w(e,!0);if(e.includes("小數入門"))return w(e);if(e.includes("長方體")||e.includes("柱體")||e.includes("體積"))return h(e,[[4,3,2],[5,5,3],[8,2,6],[10,4,3],[7,6,5]].map(([e,n,r])=>({question:`長 ${e}、寬 ${n}、高 ${r} 公分的長方體,體積是多少立方公分?`,expression:`${e}\xd7${n}\xd7${r}=?`,answer:String(e*n*r),explanation:`長方體體積=長\xd7寬\xd7高,所以答案是 ${e*n*r} 立方公分。`})),"先找長、寬、高三個數,再依序相乘。");if(e.includes("面積"))return e.includes("圓周長")?h(e,[{question:"半徑 5 公分的圓,直徑是多少公分?",expression:"5×2",answer:"10",explanation:"直徑=半徑×2,所以是 10 公分。"},{question:"直徑 8 公分的圓,半徑是多少公分?",expression:"8÷2",answer:"4",explanation:"半徑=直徑÷2,所以是 4 公分。"},{question:"直徑 10 公分的圓,圓周長約是多少公分?(圓周率取 3.14)",expression:"10×3.14",answer:"31.4",explanation:"圓周長=直徑×圓周率=31.4 公分。"},{question:"半徑 4 公分的圓,面積約是多少平方公分?(圓周率取 3.14)",expression:"4×4×3.14",answer:"50.24",explanation:"圓面積=半徑×半徑×圓周率=50.24。"},{question:"半徑 10 公分的圓,面積約是多少平方公分?",expression:"10×10×3.14",answer:"314",explanation:"10×10×3.14=314 平方公分。"}],"先分清楚半徑和直徑,再選圓周長或圓面積公式。"):h(e,[[8,5],[12,7],[15,6],[9,9],[18,4]].map(([e,n])=>({question:`長 ${e} 公分、寬 ${n} 公分的長方形,面積是多少平方公分?`,expression:`${e}\xd7${n}=?`,answer:String(e*n),explanation:`長方形面積=長\xd7寬,所以 ${e}\xd7${n}=${e*n} 平方公分。`})),"先確認圖形的底和高,再選擇正確的面積公式。");if(e.includes("因數")||e.includes("倍數"))return h(e,[{question:"12 和 18 的最大公因數是多少?",expression:"12:1,2,3,4,6,12 18:1,2,3,6,9,18",answer:"6",explanation:"共同因數有 1、2、3、6,最大是 6。"},{question:"4 和 6 的最小公倍數是多少?",expression:"4:4,8,12… 6:6,12…",answer:"12",explanation:"第一個共同倍數是 12。"},{question:"哪一個數是 24 的因數?",expression:"24÷? 沒有餘數",answer:"8",explanation:"24÷8=3,所以 8 是 24 的因數。",options:["5","7","8","10"]},{question:"哪一個數是 7 的倍數?",expression:"7×?",answer:"35",explanation:"7×5=35,所以 35 是 7 的倍數。",options:["24","30","35","40"]},{question:"18 和 30 的最大公因數是多少?",expression:"18 和 30",answer:"6",explanation:"18 和 30 共同的最大因數是 6。"}],"先列出因數或倍數,再找共同且符合最大或最小的數。");if(e.includes("百分率")||e.includes("比率"))return h(e,[{question:"50 題答對 40 題,答對率是多少?",expression:"40÷50×100%",answer:"80%",explanation:"40÷50=0.8,所以是 80%。",options:["60%","70%","80%","90%"]},{question:"200 元的 25% 是多少元?",expression:"200×25%",answer:"50",explanation:"25%=1/4,200÷4=50。"},{question:"全班 30 人,有 60% 喜歡閱讀,共有幾人?",expression:"30×60%",answer:"18",explanation:"30×0.6=18 人。"},{question:"四分之三換成百分率是多少?",expression:"3/4×100%",answer:"75%",explanation:"3÷4=0.75,所以是 75%。",options:["25%","50%","75%","80%"]},{question:"80 的 15% 是多少?",expression:"80×0.15",answer:"12",explanation:"80×0.15=12。"}],"百分率先換成小數或分數,再和總量相乘。");if(e.includes("比與比值"))return h(e,[{question:"紅球 6 顆、藍球 9 顆,紅球和藍球的最簡整數比是多少?",expression:"6:9",answer:"2:3",explanation:"6 和 9 同除以 3,得到 2:3。",options:["2:3","3:2","6:3","1:3"]},{question:"4:5 的前項乘 3,後項也乘 3,得到哪個相等的比?",expression:"4×3:5×3",answer:"12:15",explanation:"比的前後項同乘 3,比值不變。",options:["12:15","7:8","12:5","4:15"]},{question:"12:4 的比值是多少?",expression:"12÷4",answer:"3",explanation:"比值是前項除以後項,12÷4=3。"},{question:"果汁與水的比是 1:4,若果汁 3 杯,水需要幾杯?",expression:"1:4=3:?",answer:"12",explanation:"果汁放大 3 倍,水也放大 3 倍,4×3=12。"},{question:"15:25 化成最簡整數比。",expression:"15:25",answer:"3:5",explanation:"15 和 25 同除以 5,得到 3:5。"}],"把比的前項和後項同除以最大公因數,或利用相等的比放大縮小。");if(e.includes("速率"))return h(e,[{question:"120 公里走 2 小時,平均時速是多少?",expression:"120÷2",answer:"60",explanation:"速率=距離÷時間=60 公里/小時。"},{question:"時速 50 公里走 3 小時,共走幾公里?",expression:"50×3",answer:"150",explanation:"距離=速率×時間��150 公里。"},{question:"走 180 公里,時速 60 公里,需要幾小時?",expression:"180÷60",answer:"3",explanation:"時間=距離÷速率=3 小時。"},{question:"300 公尺跑 60 秒,平均每秒跑幾公尺?",expression:"300÷60",answer:"5",explanation:"300÷60=5 公尺/秒。"},{question:"每分鐘走 80 公尺,走 15 分鐘,共走幾公尺?",expression:"80×15",answer:"1200",explanation:"80×15=1200 公尺。"}],"先寫出距離、時間、速率的關係,再代入已知數字。");if(e.includes("比例尺"))return h(e,[{question:"比例尺 1:100,圖上 3 公分代表實際幾公分?",expression:"3×100",answer:"300",explanation:"圖上 1 公分代表 100 公分,3 公分代表 300 公分。"},{question:"比例尺 1:1000,圖上 5 公分代表實際幾公尺?",expression:"5×1000÷100",answer:"50",explanation:"5000 公分=50 公尺。"},{question:"實際 200 公尺,在 1:10000 的地圖上是幾公分?",expression:"20000÷10000",answer:"2",explanation:"200 公尺=20000 公分,除以 10000 得 2 公分。"},{question:"圖上 4 公分代表實際 2 公里,圖上 1 公分代表幾公尺?",expression:"2000÷4",answer:"500",explanation:"2 公里=2000 公尺,2000÷4=500 公尺。"},{question:"比例尺 1:500,實際 25 公尺在圖上是幾公分?",expression:"2500÷500",answer:"5",explanation:"25 公尺=2500 公分,圖上是 5 公分。"}],"先把實際距離換成同一單位,再依比例尺乘或除。");if(e.includes("統計圖表")||e.includes("資料分析"))return h(e,[{question:"閱讀紀錄是星期一 3 本、星期二 5 本、星期三 4 本,三天共讀幾本?",expression:"一 3|二 5|三 4",answer:"12",explanation:"3+5+4=12 本。"},{question:"投票結果:蘋果 8 票、香蕉 5 票、橘子 7 票,哪一種最多?",expression:"蘋果 8|香蕉 5|橘子 7",answer:"蘋果",explanation:"8 大於 7 和 5,所以蘋果票數最多。",options:["蘋果","香蕉","橘子"]},{question:"氣溫紀錄為 25、27、26、28 度,最高溫是多少?",expression:"25|27|26|28",answer:"28",explanation:"四個數中最大的是 28。"},{question:"四次測驗分數是 80、90、70、100,平均是多少?",expression:"(80+90+70+100)÷4",answer:"85",explanation:"總分 340,340÷4=85。"},{question:"借書人數:一班 24 人、二班 31 人、三班 28 人,二班比一班多幾人?",expression:"31-24",answer:"7",explanation:"31-24=7 人。"}],"先讀清楚標題與數據,再決定要加總、比較或求平均。");if(e.includes("機率"))return h(e,[{question:"袋中有 3 顆紅球、1 顆藍球,抽到紅球的機率是多少?",expression:"3÷4",answer:"3/4",explanation:"共有 4 顆,其中 3 顆紅球,所以機率是 3/4。",options:["1/4","1/2","3/4","1"]},{question:"擲一個公平骰子,出現偶數的機率是多少?",expression:"偶數有 2,4,6,共 3 種",answer:"1/2",explanation:"6 種結果中有 3 種偶數,3/6=1/2。",options:["1/6","1/3","1/2","2/3"]},{question:"硬幣擲一次,出現正面的機率是多少?",expression:"正面或反面",answer:"1/2",explanation:"兩種等可能結果中有一種是正面。",options:["0","1/4","1/2","1"]},{question:"盒中只有綠球,抽到綠球的機率是多少?",expression:"全部都是綠球",answer:"1",explanation:"一定會抽到綠球,機率是 1。",options:["0","1/2","1"]},{question:"10 張卡片中有 2 張星星,抽到星星的機率是多少?",expression:"2÷10",answer:"1/5",explanation:"2/10 約分後是 1/5。"}],"機率=符合條件的結果數÷全部可能結果數。");if(e.includes("邏輯推理"))return p(e);if(e.includes("綜合應用題"))return m(e);if(e.includes("代數")||e.includes("國中數學銜接"))return h(e,[{question:"x+7=15,x 是多少?",expression:"x+7=15",answer:"8",explanation:"15-7=8,所以 x=8。"},{question:"3x=24,x 是多少?",expression:"3×x=24",answer:"8",explanation:"24÷3=8,所以 x=8。"},{question:"x-12=20,x 是多少?",expression:"x-12=20",answer:"32",explanation:"20+12=32,所以 x=32。"},{question:"2x+5=19,x 是多少?",expression:"2x+5=19",answer:"7",explanation:"先算 19-5=14,再算 14÷2=7。"},{question:"5x-10=40,x 是多少?",expression:"5x-10=40",answer:"10",explanation:"先算 40+10=50,再算 50÷5=10。"}],"把未知數想成空格,使用相反運算一步一步找答案。");if(e.includes("分數與小數四則"))return[...x(e,!0).slice(0,3),...w(e).slice(0,2)];if(e.includes("三位數加減"))return[...d(e,n).slice(0,3),...u(e,n).slice(0,2)];if(e.includes("兩步驟")||e.includes("多步驟"))return m(e);if(e.includes("10000"))return g(e,1e4);if(e.includes("1000"))return g(e,1e3);if(e.includes("位值")||e.includes("數線"))return[[220,230,240,250,260],[410,420,430,440,450],[675,680,685,690,695],[900,920,940,960,980],[125,150,175,200,225]].map((n,r)=>{let i=1+r%3,a=String(n[i]);return c(`${e}-line-${r}`,"數線上的問號應該是哪一個數?",{kind:"number-line",values:n.map((e,n)=>n===i?"?":e)},a,`觀察每一格增加的數量,問號的位置是 ${a}。`,l(Number(a)),4===r?"input":"choice","先比較相鄰兩格差多少,再沿著數線往右數。")});if(e.includes("比大小")||e.includes("比較"))return[[5,3],[4,7],[6,6],[9,8],[10,12]].map(([n,r],i)=>{let a=n===r?"一樣多":n>r?"左邊":"右邊";return c(`${e}-compare-${i}`,2===i?"左右兩邊的圓點數量有什麼關係?":"哪一邊的圓點比較多?",{kind:"comparison",left:n,right:r,label:"圓點"},a,`左邊有 ${n} 個,右邊有 ${r} 個,所以答案是「${a}」。`,["左邊","右邊","一樣多"],"choice","先分別數完左右兩邊,再比較兩個數字。")});if(e.includes("分類")){let n,r;return n=["circle","square","triangle","rectangle","circle"],r={circle:"圓形",square:"正方形",triangle:"三角形",rectangle:"長方形"},[["circle","square","circle","triangle","circle"],["square","square","circle","triangle","square","circle"],["triangle","circle","triangle","square","triangle"],["rectangle","circle","rectangle","square","rectangle","triangle"],["circle","square","circle","circle","triangle","circle"]].map((i,a)=>{let t=i.filter(e=>e===n[a]).length;return c(`${e}-classify-${a}`,`請先把相同圖形放在一起。圖中有幾個${r[n[a]]}?`,{kind:"shapes",shapes:i},String(t),`找出所有${r[n[a]]}後逐一數,共有 ${t} 個。`,l(t),4===a?"input":"choice","先看形狀,不看顏色;相同形狀才算同一類。")})}if(e.includes("圖形認識")||e.includes("圖形組合")){let n;return[c(`${e}-shape-0`,"哪一個圖形沒有角?",n={kind:"shapes",shapes:["circle","triangle","square","rectangle"]},"圓形","圓形的邊是彎曲的,沒有角。",["圓形","三角形","正方形","長方形"]),c(`${e}-shape-1`,"哪一個圖形有 3 個角?",n,"三角形","三角形有 3 條邊和 3 個角。",["圓形","三角形","正方形","長方形"]),c(`${e}-shape-2`,"哪一個圖形的 4 條邊一樣長?",n,"正方形","正方形有 4 條一樣長的邊。",["圓形","三角形","正方形","長方形"]),c(`${e}-shape-3`,"哪一個圖形通常有兩條長邊、兩條短邊?",n,"長方形","長方形有 4 個角,常見的是兩條長邊和兩條短邊。",["圓形","三角形","正方形","長方形"]),c(`${e}-shape-4`,"三角形有幾個角?請填數字。",{kind:"shapes",shapes:["triangle"]},"3","沿著三角形的外框找角,共有 3 個。",[],"input")]}if(e.includes("加法"))return d(e,n);if(e.includes("減法"))return u(e,n);if(e.includes("數量分解"))return[[8,5],[10,6],[12,7],[15,9],[20,13]].map(([n,r],i)=>{let a=n-r;return c(`${e}-split-${i}`,`${n} 可以分成 ${r} 和多少?`,{kind:"equation",expression:`${n} = ${r} + ?`,note:"整體 = 一部分 + 另一部分"},String(a),`${r} + ${a} = ${n},所以空格是 ${a}。`,l(a),4===i?"input":"choice","先從整體拿掉已知道的部分,就能找到另一部分。")});if(e.includes("規律"))return p(e);if(e.includes("時間"))return(1===Number(n.replace("grade-",""))?[[7,0,"7 點"],[9,30,"9 點 30 分"],[3,0,"3 點"],[6,30,"6 點 30 分"],[10,0,"10 點"]]:[[7,30,"8 點",30],[9,15,"10 點",45],[14,30,"3 點 15 分",45],[18,45,"7 點 15 分",30],[11,20,"12 點",40]]).map((n,r)=>{let[i,a,t,s]=n,o="number"==typeof s,l=i>12?i-12:i;return c(`${e}-time-${r}`,o?`${l} 點 ${a} 分再過 ${s} 分鐘,是幾點?`:"時鐘現在是幾點?",{kind:"clock",hour:l,minute:a},t,o?`從 ${l}:${String(a).padStart(2,"0")} 往後走 ${s} 分鐘,是 ${t}。`:`短針看小時、長針看分鐘,現在是 ${t}。`,o?[t,`${l} 點`,`${l+1} 點 30 分`,`${l+2} 點`]:[t,`${l+1} 點`,`${l} 點 30 分`,`${Math.max(1,l-1)} 點`],"choice","先看短針指向哪個小時,再看長針走了幾分鐘。")});if(e.includes("長度"))return[[15,"鉛筆","公分"],[120,"桌子長邊","公分"],[2,"教室門高度","公尺"],[8,"橡皮擦長度","公分"],[3,"走廊寬度","公尺"]].map(([n,r,i],a)=>c(`${e}-length-${a}`,`${r}量起來是 ${n} ${i}。應該選哪個記錄?`,{kind:"measurement",label:r,value:n,unit:i},`${n} ${i}`,`量長度時,數字和單位要一起記錄,所以是 ${n} ${i}。`,[`${n} ${i}`,`${n+1} ${i}`,`${Math.max(1,n-1)} ${i}`,`${n} ${"公分"===i?"公尺":"公分"}`],"choice","先讀刻度的數字,再確認使用的是公分還是公尺。"));if(e.includes("乘法"))return[[3,4],[5,2],[4,6],[7,3],[8,5]].map(([n,r],i)=>{let a=n*r;return c(`${e}-multiply-${i}`,`有 ${n} 組,每組 ${r} 個,一共有幾個?`,{kind:"groups",groups:Array.from({length:n},()=>r),label:"圓片"},String(a),`${n} 組、每組 ${r} 個,可以寫成 ${n} \xd7 ${r} = ${a}。`,l(a),4===i?"input":"choice","先確認有幾組,再確認每一組有幾個。")});if(e.includes("除法"))return[[12,3],[20,4],[18,3],[24,6],[32,4]].map(([n,r],i)=>{let a=n/r;return c(`${e}-divide-${i}`,`${n} 個圓片平均分成 ${r} 組,每組有幾個?`,{kind:"groups",groups:Array.from({length:r},()=>a),label:"分好的圓片"},String(a),`${n} \xf7 ${r} = ${a},每一組都是 ${a} 個。`,l(a),4===i?"input":"choice","平均���表示每組一樣多,可以一個一個輪流分。")});if(e.includes("分數"))return[[2,1,"二分之一"],[4,1,"四分之一"],[4,3,"四分之三"],[3,2,"三分之二"],[8,5,"八分之五"]].map(([n,r,i],a)=>c(`${e}-fraction-${a}`,`長條平均分成 ${n} 份,塗色 ${r} 份,塗色部分是多少?`,{kind:"fraction",parts:n,shaded:r},i,`全部有 ${n} 等份,塗色 ${r} 份,所以是${i}。`,[i,`${n}分之${n-r}`,`${r}分之${n}`,"一半"],"choice","分母看全部分成幾份,分子看其中取了幾份。"));if(e.includes("周長"))return[[5,3],[7,4],[8,2],[6,6],[10,5]].map(([n,r],i)=>{let a=2*(n+r);return c(`${e}-perimeter-${i}`,`長方形的長是 ${n} 公分、寬是 ${r} 公分,周長是多少公分?`,{kind:"measurement",label:"長方形",value:n,secondaryValue:r,unit:"公分"},String(a),`周長是四條邊加起來:${n}+${r}+${n}+${r}=${a}。`,l(a),4===i?"input":"choice","沿著圖形外框走一圈,把四條邊全部加起來。")});if(e.includes("錢幣"))return[[50,10,10],[100,50,10],[20,20,5],[50,5,5],[100,10,10]].map((n,r)=>{let i=n.reduce((e,n)=>e+n,0);return c(`${e}-money-${r}`,"把下面的錢幣加起來,一共有多少元?",{kind:"money",values:n},String(i),`${n.join("+")}=${i},所以一共有 ${i} 元。`,l(i),4===r?"input":"choice","先把面額大的加起來,再加面額小的。")});if(e.includes("重量")||e.includes("容量"))return[{question:"1 公斤等於多少公克?",expression:"1 公斤 = ? 公克",answer:1e3,explanation:"1 公斤=1000 公克。"},{question:"2 公斤等於多少公克?",expression:"2 公斤 = ? 公克",answer:2e3,explanation:"2 個 1000 公克是 2000 公克。"},{question:"1 公升等於多少毫升?",expression:"1 公升 = ? 毫升",answer:1e3,explanation:"1 公升=1000 毫升。"},{question:"3 公升等於多少毫升?",expression:"3 公升 = ? 毫升",answer:3e3,explanation:"3 個 1000 毫升是 3000 毫升。"},{question:"1500 公克是 1 公斤又多少公克?",expression:"1500 公克 = 1 公斤 + ? 公克",answer:500,explanation:"1500-1000=500,所以是 1 公斤 500 公克。"}].map((n,r)=>c(`${e}-measure-${r}`,n.question,{kind:"equation",expression:n.expression},String(n.answer),n.explanation,l(n.answer),4===r?"input":"choice","先記住 1 公斤=1000 公克、1 公升=1000 毫升,再換算。"));if(e.includes("生活應用")||e.includes("故事")||e.includes("親子數學"))return(1===Number(n.replace("grade-",""))?[[3,2,"公園有 3 個紅球,又拿來 2 個藍球,一共有幾個球?","+"],[8,3,"盒子裡有 8 枝筆,拿走 3 枝,還剩幾枝?","-"],[6,4,"桌上有 6 本書,又放上 4 本,一共有幾本?","+"],[10,6,"有 10 張卡片,送出 6 張,還剩幾張?","-"],[7,5,"第一盒彩球有 7 顆,第二盒有 5 顆,兩盒共有幾顆?","+"]]:[[24,18,"原有 24 顆蘋果,又買 18 顆,一共有幾顆?","+"],[52,19,"書架有 52 本書,借走 19 本,還剩幾本?","-"],[35,27,"上午收集 35 張貼紙,下午又收集 27 張,共有幾張?","+"],[80,36,"班上準備 80 張紙,用掉 36 張,還剩幾張?","-"],[46,28,"紅色積木 46 個、藍色積木 28 個,共有幾個?","+"]]).map(([n,r,i,a],t)=>{let s="+"===a?n+r:n-r;return c(`${e}-story-${t}`,i,{kind:"equation",expression:`${n} ${"+"===a?"+":"-"} ${r} = ?`,note:"+"===a?"合起來用加法":"拿走或變少用減法"},String(s),`${n} ${"+"===a?"+":"-"} ${r} = ${s}。`,l(s),4===t?"input":"choice","先圈出題目中的兩個數,再判斷是合起來還是拿走。")});return[4,7,9,12,15].map((n,r)=>c(`${e}-count-${r}`,4===r?"請數一數,並把圓點總數填進答案格。":"請數一數,一共有幾個圓點?",{kind:"objects",count:n,label:"圓點"},String(n),`從左到右一個一個點著數,共有 ${n} 個圓點。`,l(n),4===r?"input":"choice","用手指著圓點慢慢數,每個圓點只數一次。"))}e.s(["getEnglishCheck",0,function(e,n){let r=!!e.imageSrc,i=r?e.sentence:e.meaning,a=function(e,n){let r=[...e],i=Array.from(n).reduce((e,n)=>e+n.charCodeAt(0),41);for(let e=r.length-1;e>0;e-=1){let n=Math.floor((i=(9301*i+49297)%233280)/233280*(e+1));[r[e],r[n]]=[r[n],r[e]]}return r}(Array.from(new Set([i,...(r?s:o).filter(e=>e!==i)])).slice(0,4),n);return{question:r?"看圖後,哪一句英文最適合?":`「${e.sentence}」是什麼意思?`,answer:i,options:a,optionsAreEnglish:r}},"getEnglishLessonExperience",0,function(e,n,r){return t[`${e}:${n}`]??{sentence:r,meaning:"先聽懂這句英文,再試著用自己的聲音說一次。",childPrompt:"找一個生活情境,把今天的英文用出來。"}}],65208),e.s(["getMathLessonTask",0,function(e,n="grade-1"){return $(e,n)[0]},"getMathLessonTasks",0,$],19328)}]);
_next/static/chunks/2jp8l98lm8ch0.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,42391,e=>{"use strict";var t=e.i(43476);e.s(["PageHeader",0,function({eyebrow:e,title:r,description:a,action:n}){return(0,t.jsxs)("header",{className:"flex min-w-0 flex-col gap-5 pb-1 sm:flex-row sm:items-start sm:justify-between",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-black uppercase tracking-[0.08em] text-amber-700",children:e}),(0,t.jsx)("h1",{className:"mt-2 text-3xl font-black leading-tight tracking-normal text-ink md:text-5xl",children:r}),a?(0,t.jsx)("p",{className:"mt-3 max-w-3xl text-base font-medium leading-7 text-stone-600 md:text-lg md:leading-8",children:a}):null]}),n?(0,t.jsx)("div",{className:"w-full shrink-0 sm:w-auto",children:n}):null]})}])},95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var a={formatUrl:function(){return i},formatWithValidation:function(){return c},urlObjectKeys:function(){return o}};for(var n in a)Object.defineProperty(r,n,{enumerable:!0,get:a[n]});let s=e.r(90809)._(e.r(98183)),l=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:r}=e,a=e.protocol||"",n=e.pathname||"",i=e.hash||"",o=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),o&&"object"==typeof o&&(o=String(s.urlQueryToSearchParams(o)));let d=e.search||o&&`?${o}`||"";return a&&!a.endsWith(":")&&(a+=":"),e.slashes||(!a||l.test(a))&&!1!==c?(c="//"+(c||""),n&&"/"!==n[0]&&(n="/"+n)):c||(c=""),i&&"#"!==i[0]&&(i="#"+i),d&&"?"!==d[0]&&(d="?"+d),n=n.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${a}${c}${n}${d}${i}`}let o=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return i(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return n}});let a=e.r(71645);function n(e,t){let r=(0,a.useRef)(null),n=(0,a.useRef)(null);return(0,a.useCallback)(a=>{if(null===a){let e=r.current;e&&(r.current=null,e());let t=n.current;t&&(n.current=null,t())}else e&&(r.current=s(e,a)),t&&(n.current=s(t,a))},[e,t])}function s(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return s}});let a=e.r(18967),n=e.r(52817);function s(e){if(!(0,a.isAbsoluteUrl)(e))return!0;try{let t=(0,a.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,n.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return a}});let a=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var a={default:function(){return b},useLinkStatus:function(){return w}};for(var n in a)Object.defineProperty(r,n,{enumerable:!0,get:a[n]});let s=e.r(90809),l=e.r(43476),i=s._(e.r(71645)),o=e.r(95057),c=e.r(8372),d=e.r(18581),u=e.r(18967),h=e.r(5550);e.r(33525);let m=e.r(88540),g=e.r(91949),f=e.r(73668),x=e.r(9396);function b(t){var r,a;let n,s,b,[w,j]=(0,i.useOptimistic)(g.IDLE_LINK_STATUS),v=(0,i.useRef)(null),{href:N,as:y,children:k,prefetch:S=null,passHref:I,replace:P,shallow:$,scroll:C,onClick:E,onMouseEnter:L,onTouchStart:A,legacyBehavior:R=!1,onNavigate:_,transitionTypes:O,ref:B,unstable_dynamicOnHover:M,...T}=t;n=k,R&&("string"==typeof n||"number"==typeof n)&&(n=(0,l.jsx)("a",{children:n}));let H=i.default.useContext(c.AppRouterContext),U=!1!==S,D=!1!==S?null===(a=S)||"auto"===a?x.FetchStrategy.PPR:x.FetchStrategy.Full:x.FetchStrategy.PPR,G="string"==typeof(r=y||N)?r:(0,o.formatUrl)(r);if(R){if(n?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});s=i.default.Children.only(n)}let z=R?s&&"object"==typeof s&&s.ref:B,F=i.default.useCallback(e=>(null!==H&&(v.current=(0,g.mountLinkInstance)(e,G,H,D,U,j)),()=>{v.current&&((0,g.unmountLinkForCurrentNavigation)(v.current),v.current=null),(0,g.unmountPrefetchableInstance)(e)}),[U,G,H,D,j]),K={ref:(0,d.useMergedRef)(F,z),onClick(t){R||"function"!=typeof E||E(t),R&&s.props&&"function"==typeof s.props.onClick&&s.props.onClick(t),!H||t.defaultPrevented||function(t,r,a,n,s,l,o){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,f.isLocalURL)(r)){n&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);i.default.startTransition(()=>{u(r,n?"replace":"push",!1===s?m.ScrollBehavior.NoScroll:m.ScrollBehavior.Default,a.current,o)})}}(t,G,v,P,C,_,O)},onMouseEnter(e){R||"function"!=typeof L||L(e),R&&s.props&&"function"==typeof s.props.onMouseEnter&&s.props.onMouseEnter(e),H&&U&&(0,g.onNavigationIntent)(e.currentTarget,!0===M)},onTouchStart:function(e){R||"function"!=typeof A||A(e),R&&s.props&&"function"==typeof s.props.onTouchStart&&s.props.onTouchStart(e),H&&U&&(0,g.onNavigationIntent)(e.currentTarget,!0===M)}};return(0,u.isAbsoluteUrl)(G)?K.href=G:R&&!I&&("a"!==s.type||"href"in s.props)||(K.href=(0,h.addBasePath)(G)),b=R?i.default.cloneElement(s,K):(0,l.jsx)("a",{...T,...K,children:n}),(0,l.jsx)(p.Provider,{value:w,children:b})}e.r(84508);let p=(0,i.createContext)(g.IDLE_LINK_STATUS),w=()=>(0,i.useContext)(p);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},14876,e=>{"use strict";var t=e.i(43476),r=e.i(22016);function a(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:r,suffix:a}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===r?`/index.html${a}`:/\.[a-z0-9]+$/i.test(r)?e:`${r.replace(/\/+$/,"")}/index.html${a}`}e.s(["ExportSafeLink",0,function({href:e,children:n,...s}){return"string"==typeof e?(0,t.jsx)("a",{href:a(e),...s,children:n}):(0,t.jsx)(r.default,{href:e,...s,children:n})},"getExportSafeHref",0,a])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let r=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function a(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return r.find(t=>t.grade===e)},"getGradeIdByNumber",0,a,"grades",0,r],62312);let n=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],s={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function l(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return n.find(e=>e.id===t)??s}function i(e){if(!e)return s.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return n.some(e=>e.id===t)?t:s.id}e.s(["currentStudent",0,s,"getCurrentStudentGradeId",0,function(e=s){return a(e.grade)},"getPersonById",0,l,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,n,"normalizePersonId",0,i],7728);let o="chenguang-active-person-id",c="chenguang-active-person-change",d="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,r]=(0,t.useState)(s.id),[a,n]=(0,t.useState)(!1),[h,m]=(0,t.useState)(!1);function g(e){let t=i(e);r(t),window.localStorage.setItem(o,t),window.dispatchEvent(new Event(c))}return(0,t.useEffect)(()=>{let e=i(window.localStorage.getItem(o));function t(){let e=i(window.localStorage.getItem(o));r(e),window.localStorage.setItem(o,e)}function a(){n(!!window.localStorage.getItem(d))}return r(e),window.localStorage.setItem(o,e),n(!!window.localStorage.getItem(d)),m(!0),window.addEventListener(c,t),window.addEventListener("storage",t),window.addEventListener(u,a),()=>{window.removeEventListener(c,t),window.removeEventListener("storage",t),window.removeEventListener(u,a)}},[]),{person:l(e),switchPerson:g,signIn:function(e){let t=i(e);g(t);let r=l(t);window.localStorage.setItem(d,JSON.stringify({personId:t,role:r.role,signedInAt:new Date().toISOString()})),n(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(d),n(!1),window.dispatchEvent(new Event(u))},isLoggedIn:a,isReady:h}}],41324)},82697,e=>{"use strict";var t=e.i(43476),r=e.i(14876),a=e.i(7728),n=e.i(62312),s=e.i(41324);e.s(["BrandHeader",0,function({showPerson:e=!0}){let{person:l,isLoggedIn:i}=(0,s.useActivePerson)(),o=(0,n.getGradeByNumber)(l.grade),c=i?`${(0,a.getPersonDisplayName)(l)}|${"student"===l.role?(0,a.getPersonSubtitle)(l):o?.shortName??`小${l.grade}`}`:"訪客模式";return(0,t.jsxs)(r.ExportSafeLink,{href:i?"/dashboard":"/",className:"flex min-w-0 items-center gap-3 text-ink",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 shrink-0 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{className:"min-w-0 leading-tight",children:[(0,t.jsx)("strong",{className:"block truncate text-xl font-black",children:"晨光"}),(0,t.jsx)("small",{className:"block truncate text-sm font-bold text-stone-500",children:e?c:"國小學習陪跑系統"})]})]})}])},18566,(e,t,r)=>{t.exports=e.r(76562)},22468,e=>{"use strict";var t=e.i(43476),r=e.i(71645),a=e.i(18566),n=e.i(14876),s=e.i(7728),l=e.i(62312),i=e.i(41324);let o=[{label:"登入",href:"/login"},{label:"訪客體驗",href:"/courses"},{label:"註冊登入",href:"/register",primary:!0}];function c(e,t="student"){let r=[{label:"課程首頁",href:"/dashboard",icon:"⌂"},{label:"每日 10 題",href:"/daily-quiz",icon:"10"},{label:"錯題 AI 說明",href:"/wrong-review",icon:"AI"},{label:"進度月曆",href:"/parent-weekly-report",icon:"月"},{label:"英文練習",href:"/practice",icon:"Aa"},{label:"手寫出題",href:"/word-scanner",icon:"掃"},{label:"課程總覽",href:"/courses",icon:"▦"},{label:"國語練習",href:`/courses/grade-${e}/chinese/basic`,icon:"ㄅ"},{label:"數學練習",href:`/courses/grade-${e}/math/basic`,icon:"123"},{label:"每日紀錄",href:"/daily-record",icon:"✓"},{label:"週計畫",href:"/weekly-plan",icon:"□"},{label:"登出",href:"/",icon:"出"}];return"parent"===t?r.filter(e=>["課程首頁","進度月曆","每日紀錄","週計畫","課程總覽","登出"].includes(e.label)):"teacher"===t?r.filter(e=>["課程首頁","課程總覽","國語練習","英文練習","數學練習","週計畫","手寫出題","登出"].includes(e.label)):r.filter(e=>["課程首頁","每日 10 題","英文練習","國語練習","數學練習","手寫出題","錯題 AI 說明","登出"].includes(e.label))}function d(e,t){return"/dashboard"===t?"/dashboard"===e:"/courses"===t?"/courses"===e:t.startsWith("/courses/")?e===t||e.startsWith(`${t}/`):e===t}function u({compact:e=!1}){let{person:a}=(0,i.useActivePerson)(),[n,o]=(0,r.useState)(!1),c=(0,l.getGradeByNumber)(a.grade),d="student"===a.role?(0,s.getPersonSubtitle)(a):c?.name??`國小${a.grade}年級`,h=(0,t.jsx)("div",{className:"grid gap-2",children:s.mockPeople.map(e=>{let r=(0,l.getGradeByNumber)(e.grade),n=e.id===a.id;return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;let r;return t=e.id,o(!1),r=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login",void window.location.assign(`${r}?person=${encodeURIComponent(t)}`)},className:`rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${n?"bg-coral text-white shadow-sm":"bg-white text-stone-700 hover:bg-butter"}`,children:[(0,t.jsxs)("span",{className:"block text-xs font-black opacity-80",children:[(0,s.getRoleLabel)(e.role),"模式"]}),(0,t.jsx)("span",{className:"mt-1 block text-base font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-75",children:"student"===e.role?(0,s.getPersonSubtitle)(e):r?.name??`國小${e.grade}年級`})]},e.id)})});return e?(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>o(e=>!e),className:"flex min-h-11 max-w-[5.5rem] items-center gap-1 rounded-2xl bg-butter px-2 text-left text-amber-950 shadow-sm sm:max-w-none sm:gap-2 sm:px-3","aria-expanded":n,"aria-label":"切換目前使用者",children:[(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("strong",{className:"block max-w-20 truncate text-sm font-black",children:a.name}),(0,t.jsx)("small",{className:"block text-[11px] font-bold opacity-70",children:c?.shortName??`小${a.grade}`})]}),(0,t.jsx)("span",{"aria-hidden":"true",className:"text-xs",children:"⌄"})]}),n?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100vh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsx)("strong",{className:"text-base font-black text-ink",children:"切換使用者"}),(0,t.jsx)("button",{type:"button",onClick:()=>o(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉帳號選單",children:"×"})]}),h]}):null]}):(0,t.jsxs)("section",{className:"rounded-3xl border border-amber-100 bg-cream p-3 shadow-sm",children:[(0,t.jsx)("button",{type:"button",onClick:()=>o(e=>!e),className:"w-full rounded-[1.35rem] bg-white/80 p-3 text-left ring-1 ring-transparent transition hover:bg-white hover:ring-coral/30","aria-expanded":n,"aria-label":"切換目前使用者",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("p",{className:"text-xs font-black text-amber-700",children:[(0,s.getRoleLabel)(a.role),"模式"]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-2xl font-black leading-tight text-ink",children:a.name}),(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"student"===a.role?"匿名檔案":(0,s.getRoleLabel)(a.role)})]}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:d})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-coral px-3 py-2 text-xs font-black text-white shadow-sm",children:"切換帳號"})]})}),n?(0,t.jsx)("div",{className:"mt-3",children:h}):null]})}e.s(["AppSidebar",0,function(){let e=(0,a.usePathname)(),{person:r,isLoggedIn:s,signOut:l}=(0,i.useActivePerson)();function h(){l();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsx)("aside",{className:"fixed inset-y-0 left-0 z-20 hidden w-64 flex-col border-r border-softline/80 bg-white/85 backdrop-blur-xl lg:flex",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 py-6",children:[(0,t.jsxs)(n.ExportSafeLink,{className:"flex items-center gap-3",href:s?"/dashboard":"/",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"text-sm font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),s?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{}),(0,t.jsx)("nav",{className:"grid gap-2 pr-1",children:c(r.grade,r.role).map(r=>{let a=d(e,r.href),s=`flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left transition ${a?"bg-butter text-amber-900 shadow-sm":"text-stone-600 hover:bg-butter hover:text-amber-900"}`,l=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 place-items-center rounded-xl text-sm font-black shadow-sm ${a?"bg-white text-coral":"bg-white text-stone-500"}`,children:r.icon}),(0,t.jsx)("span",{className:"font-bold",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:h,className:s,children:l},r.label):(0,t.jsx)(n.ExportSafeLink,{href:r.href,className:s,children:l},r.label)})})]}):(0,t.jsx)("div",{className:"grid gap-3",children:o.map(e=>(0,t.jsx)(n.ExportSafeLink,{href:e.href,className:e.primary?"rounded-2xl bg-coral px-4 py-3 text-center font-black text-white shadow-warm transition hover:brightness-105":"rounded-2xl border border-softline bg-white px-4 py-3 text-center font-black text-amber-800 transition hover:bg-butter",children:e.label},e.label))}),s?(0,t.jsxs)(n.ExportSafeLink,{href:"student"===r.role?"/wrong-review":"/parent-weekly-report",className:"mt-auto rounded-2xl border border-green-100 bg-green-50 p-4 text-sm text-green-900 transition hover:-translate-y-0.5 hover:bg-green-100",children:[(0,t.jsx)("span",{className:"block text-xs font-black text-green-700",children:"本��學習摘要"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg",children:"每天一小步,進度看得見"}),(0,t.jsx)("span",{className:"mt-2 block font-bold text-green-700",children:"查看進度與需要再練的內容 →"})]}):null]})})},"MobileMenu",0,function(){let e=(0,a.usePathname)(),{person:s,signOut:l}=(0,i.useActivePerson)(),[o,u]=(0,r.useState)(!1),h=c(s.grade,s.role);function m(){l();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsxs)("div",{className:"shrink-0 lg:hidden",children:[(0,t.jsx)("button",{type:"button",onClick:()=>u(e=>!e),className:"grid min-h-11 min-w-11 place-items-center rounded-2xl bg-white text-xl font-black text-amber-900 shadow-sm active:scale-[0.98]","aria-expanded":o,"aria-label":"開啟完整功能選單",children:o?"×":"☰"}),o?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100dvh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("strong",{className:"block text-base font-black text-ink",children:"全部功能"}),(0,t.jsxs)("span",{className:"text-xs font-bold text-stone-500",children:["依 ",s.name," 的身分顯示"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉功能選單",children:"×"})]}),(0,t.jsx)("nav",{className:"grid grid-cols-2 gap-2",children:h.map(r=>{let a=d(e,r.href),s=`flex min-h-16 items-center gap-3 rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${a?"bg-coral text-white":"bg-white text-stone-700"}`,l=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 shrink-0 place-items-center rounded-xl text-sm font-black ${a?"bg-white/20":"bg-butter text-amber-900"}`,children:r.icon}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:m,className:s,children:l},r.label):(0,t.jsx)(n.ExportSafeLink,{href:r.href,onClick:()=>u(!1),className:s,children:l},r.label)})})]}):null]})},"MobileQuickNav",0,function(){var e;let r,s=(0,a.usePathname)(),{person:l}=(0,i.useActivePerson)(),o=(r=c(l.grade,e=l.role),("guest"===e?["課程首頁","課程總覽"]:({student:["課程首頁","每日 10 題","英文練習","課程總覽"],parent:["課程首頁","進度月曆","每日紀錄","週計畫"],teacher:["課程首頁","課程總覽","週計畫","手寫出題"]})[e]).map(e=>r.find(t=>t.label===e)).filter(e=>!!e));return(0,t.jsx)("nav",{className:"fixed inset-x-3 bottom-[max(0.75rem,env(safe-area-inset-bottom))] z-50 grid grid-cols-4 gap-1 rounded-3xl border border-white/80 bg-white/90 p-2 shadow-warm backdrop-blur-xl lg:hidden","aria-label":"主要功能",children:o.map(e=>{let r=d(s,e.href);return(0,t.jsxs)(n.ExportSafeLink,{href:e.href,className:`flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl px-1 py-2 text-center transition active:scale-[0.98] ${r?"bg-coral text-white shadow-sm":"text-stone-600"}`,children:[(0,t.jsx)("span",{className:"text-sm font-black",children:e.icon}),(0,t.jsx)("span",{className:"w-full truncate text-[11px] font-black",children:e.label})]},e.label)})})},"PersonSwitcher",0,u])},55634,e=>{"use strict";var t=e.i(43476),r=e.i(71645),a=e.i(18566),n=e.i(14876),s=e.i(41324);e.s(["ActiveGradeRouteSync",0,function(){let e=(0,a.usePathname)(),{person:l,isLoggedIn:i,isReady:o}=(0,s.useActivePerson)(),c=function(e){let t=e.match(/^\/learn\/(?:grade-)?([1-6])(?:\/|$)/);if(t)return Number(t[1]);let r=e.match(/^\/courses\/grade-([1-6])(?:\/|$)/);if(r)return Number(r[1]);let a=e.match(/^\/(?:lesson|practice|handwriting)\/grade-([1-6])-/);return a?Number(a[1]):null}(e),d=!!(o&&i&&"student"===l.role&&c&&c!==l.grade);return((0,r.useEffect)(()=>{var t;if(!d)return;let r=(t=l.grade,/^\/learn\/(?:grade-)?[1-6](?:\/|$)/.test(e)?e.replace(/^\/learn\/(?:grade-)?[1-6]/,`/learn/${t}`):/^\/courses\/grade-[1-6](?:\/|$)/.test(e)?e.replace(/^\/courses\/grade-[1-6]/,`/courses/grade-${t}`):e.replace(/^(\/(?:lesson|practice|handwriting)\/)grade-[1-6]-/,`$1grade-${t}-`)),a=`${(0,n.getExportSafeHref)(r)}${window.location.search}${window.location.hash}`;window.location.replace(a)},[e,l.grade,d]),o&&!d)?null:(0,t.jsx)("div",{className:"fixed inset-0 z-[100] grid place-items-center bg-[#fffaf3]/95 p-5 backdrop-blur-md",role:"status","aria-live":"polite",children:(0,t.jsxs)("div",{className:"w-full max-w-md rounded-[2rem] border border-white bg-white/90 p-7 text-center shadow-warm",children:[(0,t.jsx)("span",{className:"mx-auto grid h-14 w-14 place-items-center rounded-2xl bg-butter text-2xl","aria-hidden":"true",children:"☀"}),(0,t.jsx)("strong",{className:"mt-4 block text-2xl font-black text-ink",children:o?`正在切換到小${l.grade}課程`:"正在讀取目前學習年級"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"晨光會自動載入這位學習者正確的課程內容。"})]})})}],55634)},10400,e=>{"use strict";var t=e.i(43476),r=e.i(82697),a=e.i(22468),n=e.i(55634);e.s(["AppShell",0,function({children:e}){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.ActiveGradeRouteSync,{}),(0,t.jsx)(a.AppSidebar,{}),(0,t.jsxs)("main",{className:"app-reading-scale min-h-screen min-w-0 overflow-x-clip px-4 pb-28 pt-4 lg:ml-64 lg:px-10 lg:py-6",children:[(0,t.jsx)("div",{className:"sticky top-3 z-40 mb-5 lg:hidden",children:(0,t.jsxs)("div",{className:"flex min-w-0 items-center justify-between gap-2 rounded-3xl border border-white/80 bg-white/90 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsx)("div",{className:"min-w-0 flex-1",children:(0,t.jsx)(r.BrandHeader,{showPerson:!1})}),(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,t.jsx)(a.PersonSwitcher,{compact:!0}),(0,t.jsx)(a.MobileMenu,{})]})]})}),(0,t.jsx)("div",{className:"mx-auto min-w-0 w-full max-w-7xl",children:e}),(0,t.jsx)(a.MobileQuickNav,{})]})]})}])},98239,e=>{"use strict";var t=e.i(43476);e.s(["SectionCard",0,function({children:e,className:r=""}){return(0,t.jsx)("section",{className:`min-w-0 overflow-hidden rounded-[1.75rem] border border-softline/80 bg-white/90 p-5 shadow-warm sm:p-6 md:p-8 ${r}`,children:e})}])},78052,e=>{"use strict";let t=[{id:"chinese",name:"國語",shortDescription:"注音、識字、朗讀、短句理解與手寫練習。",icon:"文",tone:"coral"},{id:"english",name:"英文",shortDescription:"每日一句、生活單字、聽說練習與小測驗。",icon:"Aa",tone:"leaf"},{id:"math",name:"數學",shortDescription:"數一數、比大小、加減起步與生活應用。",icon:"123",tone:"honey"}];e.s(["getSubjectById",0,function(e){return t.find(t=>t.id===e)},"subjects",0,t])},97592,e=>{"use strict";let t={1:"小一三科啟蒙陪跑",2:"小二基礎延伸學習",3:"小三閱讀與主題學習",4:"小四理解與應用練習",5:"小五閱讀策略與表達",6:"小六銜接與自主學習"};function r(e,t){return`/learn/${e}/${t}`}let a=[{subjectId:"chinese",title:"小一國語安心起步",description:"用短時間、低壓力的方式,陪孩子從注音、字詞到短句慢慢熟悉國語。",goals:["注音符號","基礎生字","詞語朗讀","短句理解"],href:r(1,"chinese"),status:"available"},{subjectId:"english",title:"小一英文啟蒙陪跑",description:"從問候、文具、校園與家庭英文開始,讓孩子每天只學一點點,也敢開口。",goals:["每日一句","生活單字","聽一聽","跟著說"],href:r(1,"english"),status:"available"},{subjectId:"math",title:"小一數學生活數感",description:"從數量、比較、分類與圖形開始,用生活物品建立加減前的數感。",goals:["0 到 20 的數","數一數","比大小","加法起步"],href:r(1,"math"),status:"available"}],n=[{subjectId:"chinese",title:"小二國語閱讀起步",description:"從部首、詞語和標點進入短文閱讀,練習把看到的內容清楚說出來。",goals:["生字與部首","詞語理解","標點符號","短文閱讀"],href:r(2,"chinese"),status:"available"},{subjectId:"english",title:"小二生活英文延伸",description:"用家人、食物、校園與一天作息練習完整生活句,建立穩定開口習慣。",goals:["家人與食物","生活作息","簡短句型","聽說練習"],href:r(2,"english"),status:"available"},{subjectId:"math",title:"小二加減與生活應用",description:"認識位值與長度,熟悉二位數加減,再把計算放進時間、錢幣與生活題。",goals:["1000 以內的數","二位數加減","長度與時間","生活應用題"],href:r(2,"math"),status:"available"}],s=[{subjectId:"chinese",title:"小三閱讀與表達",description:"練習理解段落、找主旨與整理故事順序,再把想法寫成短文。",goals:["段落理解","主旨與細節","故事順序","短文寫作"],href:r(3,"chinese"),status:"available"},{subjectId:"english",title:"小三主題英文與閱讀",description:"從學習動作、作息、場所與方向延伸句型,開始讀懂短篇生活英文。",goals:["主題單字","生活句型","情境對話","短篇閱讀"],href:r(3,"english"),status:"available"},{subjectId:"math",title:"小三乘除與圖形應用",description:"熟悉乘法與除法概念,認識分數、周長,再挑戰多步驟生活問題。",goals:["乘法熟練","除法起步","分數初步","周長與應用題"],href:r(3,"math"),status:"available"}],l={4:[{subjectId:"chinese",title:"小四國語理解與摘要",description:"從詞義、段落結構與修辭進入摘要和推論,練習把閱讀重點說清楚。",goals:["成語與詞義","段落結構","摘要練習","說明文閱讀"],href:r(4,"chinese"),status:"available"},{subjectId:"english",title:"小四英文生活應用",description:"以時間、興趣、交通與比較為主題,練習問答、短文與生活任務。",goals:["時間與作息","興趣活動","交通方式","比較句型"],href:r(4,"english"),status:"available"},{subjectId:"math",title:"小四數學計算與推理",description:"熟悉大數、乘除、角度、分數與面積,再用圖表和多步驟題練習推理。",goals:["億以內的數","乘除計算","分數與小數","面積與圖表"],href:r(4,"math"),status:"available"}],5:[{subjectId:"chinese",title:"小五國語閱讀策略",description:"練習字詞辨析、複句關係、觀點與事實,逐步建立跨文本閱讀能力。",goals:["字詞辨析","複句關係","觀點與事實","文本比較"],href:r(5,"chinese"),status:"available"},{subjectId:"english",title:"小五英文閱讀與表達",description:"從健康、環境、旅行與計畫延伸到過去式、建議句與短篇閱讀。",goals:["健康習慣","旅行與方向","過去經驗","未來計畫"],href:r(5,"english"),status:"available"},{subjectId:"math",title:"小五數學分數與幾何",description:"整合小數、分數、因數倍數、面積體積與資料分析,強化解題策略。",goals:["小數乘法","分數計算","因數與倍數","面積與體積"],href:r(5,"math"),status:"available"}],6:[{subjectId:"chinese",title:"小六國語統整與銜接",description:"整合語境、文本結構、論點證據與跨文本閱讀,準備進入國中學習。",goals:["語境與推論","論點與證據","跨文本閱讀","完整作文"],href:r(6,"chinese"),status:"available"},{subjectId:"english",title:"小六英文自主與銜接",description:"用校園生活、文化、環境與觀點表達,統整時態並進入較長篇閱讀。",goals:["時態統整","原因與結果","意見表達","國中銜接閱讀"],href:r(6,"english"),status:"available"},{subjectId:"math",title:"小六數學比例與銜接",description:"統整四則、比與比值、圓、速率和體積,建立代數與機率的初步觀念。",goals:["分數小數四則","比與比值","速率與比例尺","代數思考"],href:r(6,"math"),status:"available"}]},i=[{gradeId:"grade-1",grade:1,title:t[1],subtitle:"小一先從國語、英文、數學三科開始,每天一小步,讓孩子有安全感地融入學習。",subjects:a},{gradeId:"grade-2",grade:2,title:t[2],subtitle:"小二把基礎帶進閱讀與生活應用,每天完成一個能說、能做的小任務。",subjects:n},{gradeId:"grade-3",grade:3,title:t[3],subtitle:"小三開始練習抓重點、完整表達與解決問題,建立自己的學習方法。",subjects:s},...[4,5,6].map(e=>({gradeId:`grade-${e}`,grade:e,title:t[e],subtitle:4===e?"小四把基礎知識帶進理解與應用,練習說明自己的想法與解題步驟。":5===e?"小五建立閱讀策略與跨科應用能力,逐步學會整理、比較與表達。":"小六統整六年所學並銜接國中,練習自主安排與檢查自己的學習。",subjects:l[e]}))];e.s(["getCurriculumByGrade",0,function(e){return i.find(t=>t.grade===e)},"getCurriculumByGradeId",0,function(e){return i.find(t=>t.gradeId===e)}])},81957,e=>{"use strict";var t=e.i(43476),r=e.i(14876),a=e.i(78052);let n={coral:"bg-coral/10 text-coral",leaf:"bg-green-100 text-green-700",honey:"bg-butter text-amber-800"};e.s(["SubjectCard",0,function({item:e,href:s,compact:l=!1}){let i=(0,a.getSubjectById)(e.subjectId),o="placeholder"===e.status,c="english"===e.subjectId?12:10;return l?(0,t.jsxs)(r.ExportSafeLink,{href:s??e.href,className:"group flex min-h-64 min-w-0 flex-col rounded-[1.65rem] border border-softline/80 bg-white/85 p-5 shadow-sm transition hover:-translate-y-0.5 hover:border-coral/30 hover:bg-white hover:shadow-warm active:translate-y-0 active:scale-[0.99]",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsx)("span",{className:`grid h-12 w-12 shrink-0 place-items-center rounded-2xl text-base font-black ${n[i?.tone??"honey"]}`,children:i?.icon??"課"}),(0,t.jsx)("span",{className:`rounded-full px-3 py-1 text-xs font-black ${o?"bg-stone-100 text-stone-500":"bg-mint text-green-800"}`,children:o?"建置中":`約 ${c} 分鐘`})]}),(0,t.jsx)("p",{className:"mt-5 text-sm font-black text-amber-700",children:i?.name??e.subjectId}),(0,t.jsx)("h3",{className:"mt-1 text-xl font-black leading-snug text-ink",children:e.title}),(0,t.jsx)("p",{className:"mt-3 max-h-14 overflow-hidden text-sm font-medium leading-7 text-stone-600",children:e.description}),(0,t.jsxs)("span",{className:"mt-auto pt-5 text-sm font-black text-coral transition group-hover:translate-x-1",children:[o?"查看預計內容":"開始學習"," →"]})]}):(0,t.jsxs)(r.ExportSafeLink,{href:s??e.href,className:"group block min-w-0 rounded-[1.75rem] border border-softline bg-white/90 p-6 shadow-sm transition hover:-translate-y-0.5 hover:bg-white hover:shadow-warm active:translate-y-0 active:scale-[0.99]",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,t.jsx)("span",{className:`grid h-14 w-14 place-items-center rounded-2xl text-lg font-black ${n[i?.tone??"honey"]}`,children:i?.icon??"課"}),(0,t.jsx)("span",{className:`rounded-full px-3 py-1 text-xs font-bold ${o?"bg-stone-100 text-stone-500":"bg-mint text-green-800"}`,children:o?"建置中":"已開放"})]}),(0,t.jsx)("p",{className:"mt-6 text-sm font-bold text-amber-700",children:i?.name??e.subjectId}),(0,t.jsx)("h3",{className:"mt-2 text-2xl font-black leading-snug text-ink",children:e.title}),(0,t.jsx)("p",{className:"mt-3 min-h-20 leading-7 text-stone-600",children:e.description}),(0,t.jsx)("div",{className:"mt-5 flex flex-wrap gap-2",children:e.goals.map(e=>(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-sm font-bold text-stone-600",children:e},e))})]})}])},17683,e=>{"use strict";var t=e.i(43476),r=e.i(10400),a=e.i(42391),n=e.i(98239),s=e.i(81957),l=e.i(7728),i=e.i(97592),o=e.i(62312),c=e.i(41324);e.s(["default",0,function(){let{person:e}=(0,c.useActivePerson)(),d=(0,o.getGradeByNumber)(e.grade),u=(0,i.getCurriculumByGrade)(e.grade);return u&&d?(0,t.jsxs)(r.AppShell,{children:[(0,t.jsx)(n.SectionCard,{children:(0,t.jsx)(a.PageHeader,{eyebrow:"Courses",title:u.title,description:u.subtitle,action:(0,t.jsxs)("div",{className:"w-fit rounded-2xl bg-butter px-5 py-3 font-black text-amber-900",children:[(0,l.getPersonDisplayName)(e),"|",d.shortName]})})}),(0,t.jsx)("section",{className:"mt-8 grid gap-5 lg:grid-cols-3",children:u.subjects.map(e=>(0,t.jsx)(s.SubjectCard,{item:e,href:`/learn/${u.grade}/${e.subjectId}`},e.subjectId))})]}):(0,t.jsx)(r.AppShell,{children:(0,t.jsx)(n.SectionCard,{children:(0,t.jsx)(a.PageHeader,{eyebrow:"Courses",title:"此年級課程建置中",description:"目前找不到對應年級資料,請先回到儀表板或切換學生。"})})})}])}]);
_next/static/chunks/2mka_yjv0p9c4.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,97750,e=>{"use strict";var t=e.i(43476),r=e.i(14876);e.s(["SecondaryButton",0,function({children:e,href:n,onClick:a,type:l="button",className:s="",disabled:i=!1}){let o=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-butter px-6 py-3 text-center font-black text-amber-900 shadow-sm transition hover:-translate-y-0.5 hover:bg-amber-100 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-honey/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${s}`;return n&&!i?(0,t.jsx)(r.ExportSafeLink,{className:o,href:n,children:e}):(0,t.jsx)("button",{className:o,type:l,onClick:a,disabled:i,children:e})}])},42391,e=>{"use strict";var t=e.i(43476);e.s(["PageHeader",0,function({eyebrow:e,title:r,description:n,action:a}){return(0,t.jsxs)("header",{className:"flex min-w-0 flex-col gap-5 pb-1 sm:flex-row sm:items-start sm:justify-between",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-black uppercase tracking-[0.08em] text-amber-700",children:e}),(0,t.jsx)("h1",{className:"mt-2 text-3xl font-black leading-tight tracking-normal text-ink md:text-5xl",children:r}),n?(0,t.jsx)("p",{className:"mt-3 max-w-3xl text-base font-medium leading-7 text-stone-600 md:text-lg md:leading-8",children:n}):null]}),a?(0,t.jsx)("div",{className:"w-full shrink-0 sm:w-auto",children:a}):null]})}])},95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return i},formatWithValidation:function(){return c},urlObjectKeys:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let l=e.r(90809)._(e.r(98183)),s=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:r}=e,n=e.protocol||"",a=e.pathname||"",i=e.hash||"",o=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),o&&"object"==typeof o&&(o=String(l.urlQueryToSearchParams(o)));let d=e.search||o&&`?${o}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||s.test(n))&&!1!==c?(c="//"+(c||""),a&&"/"!==a[0]&&(a="/"+a)):c||(c=""),i&&"#"!==i[0]&&(i="#"+i),d&&"?"!==d[0]&&(d="?"+d),a=a.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${n}${c}${a}${d}${i}`}let o=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return i(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t){let r=(0,n.useRef)(null),a=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(r.current=l(e,n)),t&&(a.current=l(t,n))},[e,t])}function l(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return l}});let n=e.r(18967),a=e.r(52817);function l(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,a.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return p},useLinkStatus:function(){return w}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let l=e.r(90809),s=e.r(43476),i=l._(e.r(71645)),o=e.r(95057),c=e.r(8372),d=e.r(18581),u=e.r(18967),m=e.r(5550);e.r(33525);let h=e.r(88540),f=e.r(91949),x=e.r(73668),g=e.r(9396);function p(t){var r,n;let a,l,p,[w,j]=(0,i.useOptimistic)(f.IDLE_LINK_STATUS),v=(0,i.useRef)(null),{href:y,as:N,children:k,prefetch:S=null,passHref:P,replace:$,shallow:E,scroll:C,onClick:_,onMouseEnter:L,onTouchStart:I,legacyBehavior:R=!1,onNavigate:A,transitionTypes:O,ref:T,unstable_dynamicOnHover:M,...B}=t;a=k,R&&("string"==typeof a||"number"==typeof a)&&(a=(0,s.jsx)("a",{children:a}));let H=i.default.useContext(c.AppRouterContext),U=!1!==S,z=!1!==S?null===(n=S)||"auto"===n?g.FetchStrategy.PPR:g.FetchStrategy.Full:g.FetchStrategy.PPR,D="string"==typeof(r=N||y)?r:(0,o.formatUrl)(r);if(R){if(a?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});l=i.default.Children.only(a)}let F=R?l&&"object"==typeof l&&l.ref:T,K=i.default.useCallback(e=>(null!==H&&(v.current=(0,f.mountLinkInstance)(e,D,H,z,U,j)),()=>{v.current&&((0,f.unmountLinkForCurrentNavigation)(v.current),v.current=null),(0,f.unmountPrefetchableInstance)(e)}),[U,D,H,z,j]),W={ref:(0,d.useMergedRef)(K,F),onClick(t){R||"function"!=typeof _||_(t),R&&l.props&&"function"==typeof l.props.onClick&&l.props.onClick(t),!H||t.defaultPrevented||function(t,r,n,a,l,s,o){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,x.isLocalURL)(r)){a&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),s){let e=!1;if(s({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);i.default.startTransition(()=>{u(r,a?"replace":"push",!1===l?h.ScrollBehavior.NoScroll:h.ScrollBehavior.Default,n.current,o)})}}(t,D,v,$,C,A,O)},onMouseEnter(e){R||"function"!=typeof L||L(e),R&&l.props&&"function"==typeof l.props.onMouseEnter&&l.props.onMouseEnter(e),H&&U&&(0,f.onNavigationIntent)(e.currentTarget,!0===M)},onTouchStart:function(e){R||"function"!=typeof I||I(e),R&&l.props&&"function"==typeof l.props.onTouchStart&&l.props.onTouchStart(e),H&&U&&(0,f.onNavigationIntent)(e.currentTarget,!0===M)}};return(0,u.isAbsoluteUrl)(D)?W.href=D:R&&!P&&("a"!==l.type||"href"in l.props)||(W.href=(0,m.addBasePath)(D)),p=R?i.default.cloneElement(l,W):(0,s.jsx)("a",{...B,...W,children:a}),(0,s.jsx)(b.Provider,{value:w,children:p})}e.r(84508);let b=(0,i.createContext)(f.IDLE_LINK_STATUS),w=()=>(0,i.useContext)(b);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},14876,e=>{"use strict";var t=e.i(43476),r=e.i(22016);function n(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:r,suffix:n}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===r?`/index.html${n}`:/\.[a-z0-9]+$/i.test(r)?e:`${r.replace(/\/+$/,"")}/index.html${n}`}e.s(["ExportSafeLink",0,function({href:e,children:a,...l}){return"string"==typeof e?(0,t.jsx)("a",{href:n(e),...l,children:a}):(0,t.jsx)(r.default,{href:e,...l,children:a})},"getExportSafeHref",0,n])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let r=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function n(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return r.find(t=>t.grade===e)},"getGradeIdByNumber",0,n,"grades",0,r],62312);let a=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],l={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function s(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.find(e=>e.id===t)??l}function i(e){if(!e)return l.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.some(e=>e.id===t)?t:l.id}e.s(["currentStudent",0,l,"getCurrentStudentGradeId",0,function(e=l){return n(e.grade)},"getPersonById",0,s,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,a,"normalizePersonId",0,i],7728);let o="chenguang-active-person-id",c="chenguang-active-person-change",d="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,r]=(0,t.useState)(l.id),[n,a]=(0,t.useState)(!1),[m,h]=(0,t.useState)(!1);function f(e){let t=i(e);r(t),window.localStorage.setItem(o,t),window.dispatchEvent(new Event(c))}return(0,t.useEffect)(()=>{let e=i(window.localStorage.getItem(o));function t(){let e=i(window.localStorage.getItem(o));r(e),window.localStorage.setItem(o,e)}function n(){a(!!window.localStorage.getItem(d))}return r(e),window.localStorage.setItem(o,e),a(!!window.localStorage.getItem(d)),h(!0),window.addEventListener(c,t),window.addEventListener("storage",t),window.addEventListener(u,n),()=>{window.removeEventListener(c,t),window.removeEventListener("storage",t),window.removeEventListener(u,n)}},[]),{person:s(e),switchPerson:f,signIn:function(e){let t=i(e);f(t);let r=s(t);window.localStorage.setItem(d,JSON.stringify({personId:t,role:r.role,signedInAt:new Date().toISOString()})),a(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(d),a(!1),window.dispatchEvent(new Event(u))},isLoggedIn:n,isReady:m}}],41324)},82697,e=>{"use strict";var t=e.i(43476),r=e.i(14876),n=e.i(7728),a=e.i(62312),l=e.i(41324);e.s(["BrandHeader",0,function({showPerson:e=!0}){let{person:s,isLoggedIn:i}=(0,l.useActivePerson)(),o=(0,a.getGradeByNumber)(s.grade),c=i?`${(0,n.getPersonDisplayName)(s)}|${"student"===s.role?(0,n.getPersonSubtitle)(s):o?.shortName??`小${s.grade}`}`:"訪客模式";return(0,t.jsxs)(r.ExportSafeLink,{href:i?"/dashboard":"/",className:"flex min-w-0 items-center gap-3 text-ink",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 shrink-0 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{className:"min-w-0 leading-tight",children:[(0,t.jsx)("strong",{className:"block truncate text-xl font-black",children:"晨光"}),(0,t.jsx)("small",{className:"block truncate text-sm font-bold text-stone-500",children:e?c:"國小學習陪跑系統"})]})]})}])},18566,(e,t,r)=>{t.exports=e.r(76562)},22468,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),l=e.i(7728),s=e.i(62312),i=e.i(41324);let o=[{label:"登入",href:"/login"},{label:"訪客體驗",href:"/courses"},{label:"註冊登入",href:"/register",primary:!0}];function c(e,t="student"){let r=[{label:"課程首頁",href:"/dashboard",icon:"⌂"},{label:"每日 10 題",href:"/daily-quiz",icon:"10"},{label:"錯題 AI 說明",href:"/wrong-review",icon:"AI"},{label:"進度月曆",href:"/parent-weekly-report",icon:"月"},{label:"英文練習",href:"/practice",icon:"Aa"},{label:"手寫出題",href:"/word-scanner",icon:"掃"},{label:"課程總覽",href:"/courses",icon:"▦"},{label:"國語練習",href:`/courses/grade-${e}/chinese/basic`,icon:"ㄅ"},{label:"數學練習",href:`/courses/grade-${e}/math/basic`,icon:"123"},{label:"每日紀錄",href:"/daily-record",icon:"✓"},{label:"週計畫",href:"/weekly-plan",icon:"□"},{label:"登出",href:"/",icon:"出"}];return"parent"===t?r.filter(e=>["課程首頁","進度月曆","每日紀錄","週計畫","課程總覽","登出"].includes(e.label)):"teacher"===t?r.filter(e=>["課程首頁","課程總覽","國語練習","英文練習","數學練習","週計畫","手寫出題","登出"].includes(e.label)):r.filter(e=>["課程首頁","每日 10 題","英文練習","國語練習","數學練習","手寫出題","錯題 AI 說明","登出"].includes(e.label))}function d(e,t){return"/dashboard"===t?"/dashboard"===e:"/courses"===t?"/courses"===e:t.startsWith("/courses/")?e===t||e.startsWith(`${t}/`):e===t}function u({compact:e=!1}){let{person:n}=(0,i.useActivePerson)(),[a,o]=(0,r.useState)(!1),c=(0,s.getGradeByNumber)(n.grade),d="student"===n.role?(0,l.getPersonSubtitle)(n):c?.name??`國小${n.grade}年級`,m=(0,t.jsx)("div",{className:"grid gap-2",children:l.mockPeople.map(e=>{let r=(0,s.getGradeByNumber)(e.grade),a=e.id===n.id;return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;let r;return t=e.id,o(!1),r=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login",void window.location.assign(`${r}?person=${encodeURIComponent(t)}`)},className:`rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${a?"bg-coral text-white shadow-sm":"bg-white text-stone-700 hover:bg-butter"}`,children:[(0,t.jsxs)("span",{className:"block text-xs font-black opacity-80",children:[(0,l.getRoleLabel)(e.role),"模式"]}),(0,t.jsx)("span",{className:"mt-1 block text-base font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-75",children:"student"===e.role?(0,l.getPersonSubtitle)(e):r?.name??`國小${e.grade}年級`})]},e.id)})});return e?(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>o(e=>!e),className:"flex min-h-11 max-w-[5.5rem] items-center gap-1 rounded-2xl bg-butter px-2 text-left text-amber-950 shadow-sm sm:max-w-none sm:gap-2 sm:px-3","aria-expanded":a,"aria-label":"切換目前使用者",children:[(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("strong",{className:"block max-w-20 truncate text-sm font-black",children:n.name}),(0,t.jsx)("small",{className:"block text-[11px] font-bold opacity-70",children:c?.shortName??`小${n.grade}`})]}),(0,t.jsx)("span",{"aria-hidden":"true",className:"text-xs",children:"⌄"})]}),a?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100vh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsx)("strong",{className:"text-base font-black text-ink",children:"切換使用者"}),(0,t.jsx)("button",{type:"button",onClick:()=>o(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉帳號選單",children:"×"})]}),m]}):null]}):(0,t.jsxs)("section",{className:"rounded-3xl border border-amber-100 bg-cream p-3 shadow-sm",children:[(0,t.jsx)("button",{type:"button",onClick:()=>o(e=>!e),className:"w-full rounded-[1.35rem] bg-white/80 p-3 text-left ring-1 ring-transparent transition hover:bg-white hover:ring-coral/30","aria-expanded":a,"aria-label":"切換目前使用者",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("p",{className:"text-xs font-black text-amber-700",children:[(0,l.getRoleLabel)(n.role),"模式"]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-2xl font-black leading-tight text-ink",children:n.name}),(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"student"===n.role?"匿名檔案":(0,l.getRoleLabel)(n.role)})]}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:d})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-coral px-3 py-2 text-xs font-black text-white shadow-sm",children:"切換帳號"})]})}),a?(0,t.jsx)("div",{className:"mt-3",children:m}):null]})}e.s(["AppSidebar",0,function(){let e=(0,n.usePathname)(),{person:r,isLoggedIn:l,signOut:s}=(0,i.useActivePerson)();function m(){s();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsx)("aside",{className:"fixed inset-y-0 left-0 z-20 hidden w-64 flex-col border-r border-softline/80 bg-white/85 backdrop-blur-xl lg:flex",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 py-6",children:[(0,t.jsxs)(a.ExportSafeLink,{className:"flex items-center gap-3",href:l?"/dashboard":"/",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"text-sm font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),l?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{}),(0,t.jsx)("nav",{className:"grid gap-2 pr-1",children:c(r.grade,r.role).map(r=>{let n=d(e,r.href),l=`flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left transition ${n?"bg-butter text-amber-900 shadow-sm":"text-stone-600 hover:bg-butter hover:text-amber-900"}`,s=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 place-items-center rounded-xl text-sm font-black shadow-sm ${n?"bg-white text-coral":"bg-white text-stone-500"}`,children:r.icon}),(0,t.jsx)("span",{className:"font-bold",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:m,className:l,children:s},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,className:l,children:s},r.label)})})]}):(0,t.jsx)("div",{className:"grid gap-3",children:o.map(e=>(0,t.jsx)(a.ExportSafeLink,{href:e.href,className:e.primary?"rounded-2xl bg-coral px-4 py-3 text-center font-black text-white shadow-warm transition hover:brightness-105":"rounded-2xl border border-softline bg-white px-4 py-3 text-center font-black text-amber-800 transition hover:bg-butter",children:e.label},e.label))}),l?(0,t.jsxs)(a.ExportSafeLink,{href:"student"===r.role?"/wrong-review":"/parent-weekly-report",className:"mt-auto rounded-2xl border border-green-100 bg-green-50 p-4 text-sm text-green-900 transition hover:-translate-y-0.5 hover:bg-green-100",children:[(0,t.jsx)("span",{className:"block text-xs font-black text-green-700",children:"本週學習摘要"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg",children:"每天一小步,進度看得見"}),(0,t.jsx)("span",{className:"mt-2 block font-bold text-green-700",children:"查看進度與需要再練的內容 →"})]}):null]})})},"MobileMenu",0,function(){let e=(0,n.usePathname)(),{person:l,signOut:s}=(0,i.useActivePerson)(),[o,u]=(0,r.useState)(!1),m=c(l.grade,l.role);function h(){s();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsxs)("div",{className:"shrink-0 lg:hidden",children:[(0,t.jsx)("button",{type:"button",onClick:()=>u(e=>!e),className:"grid min-h-11 min-w-11 place-items-center rounded-2xl bg-white text-xl font-black text-amber-900 shadow-sm active:scale-[0.98]","aria-expanded":o,"aria-label":"開啟完整功能選單",children:o?"×":"☰"}),o?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100dvh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("strong",{className:"block text-base font-black text-ink",children:"全部功能"}),(0,t.jsxs)("span",{className:"text-xs font-bold text-stone-500",children:["依 ",l.name," 的身分顯示"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉功能選單",children:"×"})]}),(0,t.jsx)("nav",{className:"grid grid-cols-2 gap-2",children:m.map(r=>{let n=d(e,r.href),l=`flex min-h-16 items-center gap-3 rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${n?"bg-coral text-white":"bg-white text-stone-700"}`,s=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 shrink-0 place-items-center rounded-xl text-sm font-black ${n?"bg-white/20":"bg-butter text-amber-900"}`,children:r.icon}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:h,className:l,children:s},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,onClick:()=>u(!1),className:l,children:s},r.label)})})]}):null]})},"MobileQuickNav",0,function(){var e;let r,l=(0,n.usePathname)(),{person:s}=(0,i.useActivePerson)(),o=(r=c(s.grade,e=s.role),("guest"===e?["課程首頁","課程總覽"]:({student:["課程首頁","每日 10 題","英文練習","課程總覽"],parent:["課程首頁","進度月曆","每日紀錄","週計畫"],teacher:["課程首頁","課程總覽","週計畫","手寫出題"]})[e]).map(e=>r.find(t=>t.label===e)).filter(e=>!!e));return(0,t.jsx)("nav",{className:"fixed inset-x-3 bottom-[max(0.75rem,env(safe-area-inset-bottom))] z-50 grid grid-cols-4 gap-1 rounded-3xl border border-white/80 bg-white/90 p-2 shadow-warm backdrop-blur-xl lg:hidden","aria-label":"主要功能",children:o.map(e=>{let r=d(l,e.href);return(0,t.jsxs)(a.ExportSafeLink,{href:e.href,className:`flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl px-1 py-2 text-center transition active:scale-[0.98] ${r?"bg-coral text-white shadow-sm":"text-stone-600"}`,children:[(0,t.jsx)("span",{className:"text-sm font-black",children:e.icon}),(0,t.jsx)("span",{className:"w-full truncate text-[11px] font-black",children:e.label})]},e.label)})})},"PersonSwitcher",0,u])},55634,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),l=e.i(41324);e.s(["ActiveGradeRouteSync",0,function(){let e=(0,n.usePathname)(),{person:s,isLoggedIn:i,isReady:o}=(0,l.useActivePerson)(),c=function(e){let t=e.match(/^\/learn\/(?:grade-)?([1-6])(?:\/|$)/);if(t)return Number(t[1]);let r=e.match(/^\/courses\/grade-([1-6])(?:\/|$)/);if(r)return Number(r[1]);let n=e.match(/^\/(?:lesson|practice|handwriting)\/grade-([1-6])-/);return n?Number(n[1]):null}(e),d=!!(o&&i&&"student"===s.role&&c&&c!==s.grade);return((0,r.useEffect)(()=>{var t;if(!d)return;let r=(t=s.grade,/^\/learn\/(?:grade-)?[1-6](?:\/|$)/.test(e)?e.replace(/^\/learn\/(?:grade-)?[1-6]/,`/learn/${t}`):/^\/courses\/grade-[1-6](?:\/|$)/.test(e)?e.replace(/^\/courses\/grade-[1-6]/,`/courses/grade-${t}`):e.replace(/^(\/(?:lesson|practice|handwriting)\/)grade-[1-6]-/,`$1grade-${t}-`)),n=`${(0,a.getExportSafeHref)(r)}${window.location.search}${window.location.hash}`;window.location.replace(n)},[e,s.grade,d]),o&&!d)?null:(0,t.jsx)("div",{className:"fixed inset-0 z-[100] grid place-items-center bg-[#fffaf3]/95 p-5 backdrop-blur-md",role:"status","aria-live":"polite",children:(0,t.jsxs)("div",{className:"w-full max-w-md rounded-[2rem] border border-white bg-white/90 p-7 text-center shadow-warm",children:[(0,t.jsx)("span",{className:"mx-auto grid h-14 w-14 place-items-center rounded-2xl bg-butter text-2xl","aria-hidden":"true",children:"☀"}),(0,t.jsx)("strong",{className:"mt-4 block text-2xl font-black text-ink",children:o?`正在切換到小${s.grade}課程`:"正在讀取目前學習年級"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"晨光會自動載入這位學習者正確的課程內容。"})]})})}],55634)},10400,e=>{"use strict";var t=e.i(43476),r=e.i(82697),n=e.i(22468),a=e.i(55634);e.s(["AppShell",0,function({children:e}){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.ActiveGradeRouteSync,{}),(0,t.jsx)(n.AppSidebar,{}),(0,t.jsxs)("main",{className:"app-reading-scale min-h-screen min-w-0 overflow-x-clip px-4 pb-28 pt-4 lg:ml-64 lg:px-10 lg:py-6",children:[(0,t.jsx)("div",{className:"sticky top-3 z-40 mb-5 lg:hidden",children:(0,t.jsxs)("div",{className:"flex min-w-0 items-center justify-between gap-2 rounded-3xl border border-white/80 bg-white/90 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsx)("div",{className:"min-w-0 flex-1",children:(0,t.jsx)(r.BrandHeader,{showPerson:!1})}),(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,t.jsx)(n.PersonSwitcher,{compact:!0}),(0,t.jsx)(n.MobileMenu,{})]})]})}),(0,t.jsx)("div",{className:"mx-auto min-w-0 w-full max-w-7xl",children:e}),(0,t.jsx)(n.MobileQuickNav,{})]})]})}])},98239,e=>{"use strict";var t=e.i(43476);e.s(["SectionCard",0,function({children:e,className:r=""}){return(0,t.jsx)("section",{className:`min-w-0 overflow-hidden rounded-[1.75rem] border border-softline/80 bg-white/90 p-5 shadow-warm sm:p-6 md:p-8 ${r}`,children:e})}])},51772,e=>{"use strict";var t=e.i(43476);let r={green:"border-green-100 bg-green-50 text-green-950",blue:"border-blue-100 bg-blue-50 text-blue-950",cream:"border-softline bg-cream text-stone-700"};e.s(["InfoCard",0,function({title:e,children:n,tone:a="green",className:l=""}){return(0,t.jsxs)("div",{className:`rounded-2xl border p-5 ${r[a]} ${l}`,children:[e?(0,t.jsx)("p",{className:"mb-2 font-black",children:e}):null,(0,t.jsx)("div",{className:"leading-8",children:n})]})}])},19172,e=>{"use strict";var t=e.i(43476),r=e.i(10400),n=e.i(51772),a=e.i(42391),l=e.i(97750),s=e.i(98239),i=e.i(7728);let o=[{id:"learner-grade-1",displayName:"小一學習者",accessType:"lifetime_free",note:"永久免費無限使用"},{id:"learner-grade-2",displayName:"小二學習者",accessType:"lifetime_free",note:"永久免費無限使用"},{id:"learner-grade-3",displayName:"小三學習者",accessType:"lifetime_free",note:"永久免費無限使用"},{id:"guardian-1",displayName:"家長帳號一",accessType:"lifetime_free",note:"永久免費無限使用"},{id:"guardian-2",displayName:"家長帳號二",accessType:"lifetime_free",note:"永久免費無限使用"}];var c=e.i(41324);e.s(["default",0,function(){let{person:e}=(0,c.useActivePerson)();return(0,t.jsx)(r.AppShell,{children:(0,t.jsxs)("div",{className:"space-y-7",children:[(0,t.jsx)(a.PageHeader,{eyebrow:"Member Center",title:"會員中心",description:"目前先用 mock 帳號示範登入後狀態,之後可以接 Supabase 與正式付款權限。",action:(0,t.jsx)(l.SecondaryButton,{href:"/dashboard",children:"回儀表板"})}),(0,t.jsxs)("div",{className:"grid gap-6 lg:grid-cols-[1fr_1fr]",children:[(0,t.jsxs)(s.SectionCard,{children:[(0,t.jsx)("p",{className:"font-black text-amber-700",children:"目前使用者"}),(0,t.jsx)("h2",{className:"mt-3 text-4xl font-black text-ink",children:e.name}),(0,t.jsxs)("div",{className:"mt-6 grid gap-3 text-lg font-bold text-stone-700",children:[(0,t.jsxs)("p",{children:["身份:",(0,i.getRoleLabel)(e.role)]}),(0,t.jsxs)("p",{children:["年級:國小",e.grade,"年級"]}),(0,t.jsxs)("p",{children:["帳號 ID:",e.id]}),(0,t.jsx)("p",{children:"方案狀態:MVP 示範帳號"})]}),(0,t.jsxs)("div",{className:"mt-6 flex flex-wrap gap-3",children:[(0,t.jsx)(l.SecondaryButton,{href:"/pricing",children:"查看方案"}),(0,t.jsx)(l.SecondaryButton,{href:"/daily-record",children:"看每日紀錄"})]})]}),(0,t.jsxs)(n.InfoCard,{title:"永久免費名單",tone:"green",className:"h-full",children:[(0,t.jsx)("p",{children:"以下帳號會保留永久免費無限使用權限,之後接資料庫時也會成為白名單規則。"}),(0,t.jsx)("div",{className:"mt-4 grid gap-3",children:o.map(e=>(0,t.jsxs)("div",{className:"rounded-2xl bg-white/80 px-4 py-3 font-black text-green-900 shadow-sm",children:[e.displayName,"|",e.note]},e.id))})]})]})]})})}],19172)}]);
_next/static/chunks/2pex9a9vvpvcg.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,28408,e=>{"use strict";let t=null;async function r(){return Function("url","return import(url)")("https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.8.1/+esm")}async function n(e,n){if(0===e.length)return[];n?.({progress:.85,label:"準備手寫英文辨識模型"});let s=await (!t&&(t=r().then(async({env:e,pipeline:t})=>(e.allowRemoteModels=!0,e.allowLocalModels=!1,e.useBrowserCache=!0,t("image-to-text","Xenova/trocr-small-handwritten",{dtype:"q8",progress_callback:e=>{"progress"===e.status&&"number"==typeof e.progress&&n?.({progress:.86+.08*Math.min(1,Math.max(0,e.progress/100)),label:"正在載入手寫英文辨識模型"})}})))),t),l=[];for(let t=0;t<e.length;t+=1){let r=URL.createObjectURL(e[t]);try{n?.({progress:.94+(t+1)/e.length*.055,label:`AI 正在辨識第 ${t+1} / ${e.length} 行`});let a=await s(r,{max_new_tokens:16}),o=function(e){if(!Array.isArray(e)||0===e.length)return"";let t=e[0];return Array.isArray(t)?t[0]?.generated_text?.trim()??"":t?.generated_text?.trim()??""}(a);o&&l.push(o)}finally{URL.revokeObjectURL(r)}}return l}async function s(){if(t)try{let e=await t;await e.dispose()}finally{t=null}}e.s(["disposeHandwrittenEnglishAI",0,s,"recognizeHandwrittenEnglishLines",0,n])}]);
_next/static/chunks/2s-mj2kxpo2po.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,34295,e=>{"use strict";function t(e,t){return`${e}:${t}`}e.s(["getPersonStorageKey",0,t,"readPersonStorage",0,function(e,r,n){try{let a=window.localStorage.getItem(t(e,r));return a?JSON.parse(a):n}catch{return n}},"removePersonStorage",0,function(e,r){try{window.localStorage.removeItem(t(e,r))}catch{}},"writePersonStorage",0,function(e,r,n){try{return window.localStorage.setItem(t(e,r),JSON.stringify(n)),!0}catch{return!1}}])},42391,e=>{"use strict";var t=e.i(43476);e.s(["PageHeader",0,function({eyebrow:e,title:r,description:n,action:a}){return(0,t.jsxs)("header",{className:"flex min-w-0 flex-col gap-5 pb-1 sm:flex-row sm:items-start sm:justify-between",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-black uppercase tracking-[0.08em] text-amber-700",children:e}),(0,t.jsx)("h1",{className:"mt-2 text-3xl font-black leading-tight tracking-normal text-ink md:text-5xl",children:r}),n?(0,t.jsx)("p",{className:"mt-3 max-w-3xl text-base font-medium leading-7 text-stone-600 md:text-lg md:leading-8",children:n}):null]}),a?(0,t.jsx)("div",{className:"w-full shrink-0 sm:w-auto",children:a}):null]})}])},95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return i},formatWithValidation:function(){return c},urlObjectKeys:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let s=e.r(90809)._(e.r(98183)),l=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:r}=e,n=e.protocol||"",a=e.pathname||"",i=e.hash||"",o=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),o&&"object"==typeof o&&(o=String(s.urlQueryToSearchParams(o)));let d=e.search||o&&`?${o}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||l.test(n))&&!1!==c?(c="//"+(c||""),a&&"/"!==a[0]&&(a="/"+a)):c||(c=""),i&&"#"!==i[0]&&(i="#"+i),d&&"?"!==d[0]&&(d="?"+d),a=a.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${n}${c}${a}${d}${i}`}let o=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return i(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t){let r=(0,n.useRef)(null),a=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(r.current=s(e,n)),t&&(a.current=s(t,n))},[e,t])}function s(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return s}});let n=e.r(18967),a=e.r(52817);function s(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,a.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return p},useLinkStatus:function(){return w}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let s=e.r(90809),l=e.r(43476),i=s._(e.r(71645)),o=e.r(95057),c=e.r(8372),d=e.r(18581),u=e.r(18967),h=e.r(5550);e.r(33525);let m=e.r(88540),g=e.r(91949),f=e.r(73668),x=e.r(9396);function p(t){var r,n;let a,s,p,[w,v]=(0,i.useOptimistic)(g.IDLE_LINK_STATUS),j=(0,i.useRef)(null),{href:y,as:N,children:k,prefetch:S=null,passHref:P,replace:$,shallow:E,scroll:I,onClick:A,onMouseEnter:C,onTouchStart:R,legacyBehavior:L=!1,onNavigate:O,transitionTypes:M,ref:_,unstable_dynamicOnHover:T,...D}=t;a=k,L&&("string"==typeof a||"number"==typeof a)&&(a=(0,l.jsx)("a",{children:a}));let U=i.default.useContext(c.AppRouterContext),B=!1!==S,z=!1!==S?null===(n=S)||"auto"===n?x.FetchStrategy.PPR:x.FetchStrategy.Full:x.FetchStrategy.PPR,H="string"==typeof(r=N||y)?r:(0,o.formatUrl)(r);if(L){if(a?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});s=i.default.Children.only(a)}let W=L?s&&"object"==typeof s&&s.ref:_,F=i.default.useCallback(e=>(null!==U&&(j.current=(0,g.mountLinkInstance)(e,H,U,z,B,v)),()=>{j.current&&((0,g.unmountLinkForCurrentNavigation)(j.current),j.current=null),(0,g.unmountPrefetchableInstance)(e)}),[B,H,U,z,v]),G={ref:(0,d.useMergedRef)(F,W),onClick(t){L||"function"!=typeof A||A(t),L&&s.props&&"function"==typeof s.props.onClick&&s.props.onClick(t),!U||t.defaultPrevented||function(t,r,n,a,s,l,o){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,f.isLocalURL)(r)){a&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);i.default.startTransition(()=>{u(r,a?"replace":"push",!1===s?m.ScrollBehavior.NoScroll:m.ScrollBehavior.Default,n.current,o)})}}(t,H,j,$,I,O,M)},onMouseEnter(e){L||"function"!=typeof C||C(e),L&&s.props&&"function"==typeof s.props.onMouseEnter&&s.props.onMouseEnter(e),U&&B&&(0,g.onNavigationIntent)(e.currentTarget,!0===T)},onTouchStart:function(e){L||"function"!=typeof R||R(e),L&&s.props&&"function"==typeof s.props.onTouchStart&&s.props.onTouchStart(e),U&&B&&(0,g.onNavigationIntent)(e.currentTarget,!0===T)}};return(0,u.isAbsoluteUrl)(H)?G.href=H:L&&!P&&("a"!==s.type||"href"in s.props)||(G.href=(0,h.addBasePath)(H)),p=L?i.default.cloneElement(s,G):(0,l.jsx)("a",{...D,...G,children:a}),(0,l.jsx)(b.Provider,{value:w,children:p})}e.r(84508);let b=(0,i.createContext)(g.IDLE_LINK_STATUS),w=()=>(0,i.useContext)(b);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},14876,e=>{"use strict";var t=e.i(43476),r=e.i(22016);function n(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:r,suffix:n}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===r?`/index.html${n}`:/\.[a-z0-9]+$/i.test(r)?e:`${r.replace(/\/+$/,"")}/index.html${n}`}e.s(["ExportSafeLink",0,function({href:e,children:a,...s}){return"string"==typeof e?(0,t.jsx)("a",{href:n(e),...s,children:a}):(0,t.jsx)(r.default,{href:e,...s,children:a})},"getExportSafeHref",0,n])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let r=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function n(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return r.find(t=>t.grade===e)},"getGradeIdByNumber",0,n,"grades",0,r],62312);let a=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],s={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function l(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.find(e=>e.id===t)??s}function i(e){if(!e)return s.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.some(e=>e.id===t)?t:s.id}e.s(["currentStudent",0,s,"getCurrentStudentGradeId",0,function(e=s){return n(e.grade)},"getPersonById",0,l,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,a,"normalizePersonId",0,i],7728);let o="chenguang-active-person-id",c="chenguang-active-person-change",d="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,r]=(0,t.useState)(s.id),[n,a]=(0,t.useState)(!1),[h,m]=(0,t.useState)(!1);function g(e){let t=i(e);r(t),window.localStorage.setItem(o,t),window.dispatchEvent(new Event(c))}return(0,t.useEffect)(()=>{let e=i(window.localStorage.getItem(o));function t(){let e=i(window.localStorage.getItem(o));r(e),window.localStorage.setItem(o,e)}function n(){a(!!window.localStorage.getItem(d))}return r(e),window.localStorage.setItem(o,e),a(!!window.localStorage.getItem(d)),m(!0),window.addEventListener(c,t),window.addEventListener("storage",t),window.addEventListener(u,n),()=>{window.removeEventListener(c,t),window.removeEventListener("storage",t),window.removeEventListener(u,n)}},[]),{person:l(e),switchPerson:g,signIn:function(e){let t=i(e);g(t);let r=l(t);window.localStorage.setItem(d,JSON.stringify({personId:t,role:r.role,signedInAt:new Date().toISOString()})),a(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(d),a(!1),window.dispatchEvent(new Event(u))},isLoggedIn:n,isReady:h}}],41324)},82697,e=>{"use strict";var t=e.i(43476),r=e.i(14876),n=e.i(7728),a=e.i(62312),s=e.i(41324);e.s(["BrandHeader",0,function({showPerson:e=!0}){let{person:l,isLoggedIn:i}=(0,s.useActivePerson)(),o=(0,a.getGradeByNumber)(l.grade),c=i?`${(0,n.getPersonDisplayName)(l)}|${"student"===l.role?(0,n.getPersonSubtitle)(l):o?.shortName??`小${l.grade}`}`:"訪客模式";return(0,t.jsxs)(r.ExportSafeLink,{href:i?"/dashboard":"/",className:"flex min-w-0 items-center gap-3 text-ink",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 shrink-0 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{className:"min-w-0 leading-tight",children:[(0,t.jsx)("strong",{className:"block truncate text-xl font-black",children:"晨光"}),(0,t.jsx)("small",{className:"block truncate text-sm font-bold text-stone-500",children:e?c:"國小學習陪跑系統"})]})]})}])},18566,(e,t,r)=>{t.exports=e.r(76562)},22468,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),s=e.i(7728),l=e.i(62312),i=e.i(41324);let o=[{label:"登入",href:"/login"},{label:"訪客體驗",href:"/courses"},{label:"註冊登入",href:"/register",primary:!0}];function c(e,t="student"){let r=[{label:"課程首頁",href:"/dashboard",icon:"⌂"},{label:"每日 10 題",href:"/daily-quiz",icon:"10"},{label:"錯題 AI 說明",href:"/wrong-review",icon:"AI"},{label:"進度月曆",href:"/parent-weekly-report",icon:"月"},{label:"英文練習",href:"/practice",icon:"Aa"},{label:"手寫出題",href:"/word-scanner",icon:"掃"},{label:"課程總覽",href:"/courses",icon:"▦"},{label:"國語練習",href:`/courses/grade-${e}/chinese/basic`,icon:"ㄅ"},{label:"數學練習",href:`/courses/grade-${e}/math/basic`,icon:"123"},{label:"每日紀錄",href:"/daily-record",icon:"✓"},{label:"週計畫",href:"/weekly-plan",icon:"□"},{label:"登出",href:"/",icon:"出"}];return"parent"===t?r.filter(e=>["課程首頁","進度月曆","每日紀錄","週計畫","課程總覽","登出"].includes(e.label)):"teacher"===t?r.filter(e=>["課程首頁","課程總覽","國語練習","英文練習","數學練習","週計畫","手寫出題","登出"].includes(e.label)):r.filter(e=>["課程首頁","每日 10 題","英文練習","國語練習","數學練習","手寫出題","錯題 AI 說明","登出"].includes(e.label))}function d(e,t){return"/dashboard"===t?"/dashboard"===e:"/courses"===t?"/courses"===e:t.startsWith("/courses/")?e===t||e.startsWith(`${t}/`):e===t}function u({compact:e=!1}){let{person:n}=(0,i.useActivePerson)(),[a,o]=(0,r.useState)(!1),c=(0,l.getGradeByNumber)(n.grade),d="student"===n.role?(0,s.getPersonSubtitle)(n):c?.name??`國小${n.grade}年級`,h=(0,t.jsx)("div",{className:"grid gap-2",children:s.mockPeople.map(e=>{let r=(0,l.getGradeByNumber)(e.grade),a=e.id===n.id;return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;let r;return t=e.id,o(!1),r=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login",void window.location.assign(`${r}?person=${encodeURIComponent(t)}`)},className:`rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${a?"bg-coral text-white shadow-sm":"bg-white text-stone-700 hover:bg-butter"}`,children:[(0,t.jsxs)("span",{className:"block text-xs font-black opacity-80",children:[(0,s.getRoleLabel)(e.role),"模式"]}),(0,t.jsx)("span",{className:"mt-1 block text-base font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-75",children:"student"===e.role?(0,s.getPersonSubtitle)(e):r?.name??`國小${e.grade}年級`})]},e.id)})});return e?(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>o(e=>!e),className:"flex min-h-11 max-w-[5.5rem] items-center gap-1 rounded-2xl bg-butter px-2 text-left text-amber-950 shadow-sm sm:max-w-none sm:gap-2 sm:px-3","aria-expanded":a,"aria-label":"切換目前使用者",children:[(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("strong",{className:"block max-w-20 truncate text-sm font-black",children:n.name}),(0,t.jsx)("small",{className:"block text-[11px] font-bold opacity-70",children:c?.shortName??`小${n.grade}`})]}),(0,t.jsx)("span",{"aria-hidden":"true",className:"text-xs",children:"⌄"})]}),a?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100vh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsx)("strong",{className:"text-base font-black text-ink",children:"切換使用者"}),(0,t.jsx)("button",{type:"button",onClick:()=>o(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉帳號選單",children:"×"})]}),h]}):null]}):(0,t.jsxs)("section",{className:"rounded-3xl border border-amber-100 bg-cream p-3 shadow-sm",children:[(0,t.jsx)("button",{type:"button",onClick:()=>o(e=>!e),className:"w-full rounded-[1.35rem] bg-white/80 p-3 text-left ring-1 ring-transparent transition hover:bg-white hover:ring-coral/30","aria-expanded":a,"aria-label":"切換目前使用者",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("p",{className:"text-xs font-black text-amber-700",children:[(0,s.getRoleLabel)(n.role),"模式"]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-2xl font-black leading-tight text-ink",children:n.name}),(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"student"===n.role?"匿名檔案":(0,s.getRoleLabel)(n.role)})]}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:d})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-coral px-3 py-2 text-xs font-black text-white shadow-sm",children:"切換帳號"})]})}),a?(0,t.jsx)("div",{className:"mt-3",children:h}):null]})}e.s(["AppSidebar",0,function(){let e=(0,n.usePathname)(),{person:r,isLoggedIn:s,signOut:l}=(0,i.useActivePerson)();function h(){l();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsx)("aside",{className:"fixed inset-y-0 left-0 z-20 hidden w-64 flex-col border-r border-softline/80 bg-white/85 backdrop-blur-xl lg:flex",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 py-6",children:[(0,t.jsxs)(a.ExportSafeLink,{className:"flex items-center gap-3",href:s?"/dashboard":"/",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"text-sm font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),s?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{}),(0,t.jsx)("nav",{className:"grid gap-2 pr-1",children:c(r.grade,r.role).map(r=>{let n=d(e,r.href),s=`flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left transition ${n?"bg-butter text-amber-900 shadow-sm":"text-stone-600 hover:bg-butter hover:text-amber-900"}`,l=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 place-items-center rounded-xl text-sm font-black shadow-sm ${n?"bg-white text-coral":"bg-white text-stone-500"}`,children:r.icon}),(0,t.jsx)("span",{className:"font-bold",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:h,className:s,children:l},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,className:s,children:l},r.label)})})]}):(0,t.jsx)("div",{className:"grid gap-3",children:o.map(e=>(0,t.jsx)(a.ExportSafeLink,{href:e.href,className:e.primary?"rounded-2xl bg-coral px-4 py-3 text-center font-black text-white shadow-warm transition hover:brightness-105":"rounded-2xl border border-softline bg-white px-4 py-3 text-center font-black text-amber-800 transition hover:bg-butter",children:e.label},e.label))}),s?(0,t.jsxs)(a.ExportSafeLink,{href:"student"===r.role?"/wrong-review":"/parent-weekly-report",className:"mt-auto rounded-2xl border border-green-100 bg-green-50 p-4 text-sm text-green-900 transition hover:-translate-y-0.5 hover:bg-green-100",children:[(0,t.jsx)("span",{className:"block text-xs font-black text-green-700",children:"本週學習摘要"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg",children:"每天一小步,進度看得見"}),(0,t.jsx)("span",{className:"mt-2 block font-bold text-green-700",children:"查看進度與需要再練的內容 →"})]}):null]})})},"MobileMenu",0,function(){let e=(0,n.usePathname)(),{person:s,signOut:l}=(0,i.useActivePerson)(),[o,u]=(0,r.useState)(!1),h=c(s.grade,s.role);function m(){l();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsxs)("div",{className:"shrink-0 lg:hidden",children:[(0,t.jsx)("button",{type:"button",onClick:()=>u(e=>!e),className:"grid min-h-11 min-w-11 place-items-center rounded-2xl bg-white text-xl font-black text-amber-900 shadow-sm active:scale-[0.98]","aria-expanded":o,"aria-label":"開啟完整功能選單",children:o?"×":"☰"}),o?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100dvh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("strong",{className:"block text-base font-black text-ink",children:"全部功能"}),(0,t.jsxs)("span",{className:"text-xs font-bold text-stone-500",children:["依 ",s.name," 的身分顯示"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉功能選單",children:"×"})]}),(0,t.jsx)("nav",{className:"grid grid-cols-2 gap-2",children:h.map(r=>{let n=d(e,r.href),s=`flex min-h-16 items-center gap-3 rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${n?"bg-coral text-white":"bg-white text-stone-700"}`,l=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 shrink-0 place-items-center rounded-xl text-sm font-black ${n?"bg-white/20":"bg-butter text-amber-900"}`,children:r.icon}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:m,className:s,children:l},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,onClick:()=>u(!1),className:s,children:l},r.label)})})]}):null]})},"MobileQuickNav",0,function(){var e;let r,s=(0,n.usePathname)(),{person:l}=(0,i.useActivePerson)(),o=(r=c(l.grade,e=l.role),("guest"===e?["課程首頁","課程總覽"]:({student:["課程首頁","每日 10 題","英文練習","課程總覽"],parent:["課程首頁","進度月曆","每日紀錄","週計畫"],teacher:["課程首頁","課程總覽","週計畫","手寫出題"]})[e]).map(e=>r.find(t=>t.label===e)).filter(e=>!!e));return(0,t.jsx)("nav",{className:"fixed inset-x-3 bottom-[max(0.75rem,env(safe-area-inset-bottom))] z-50 grid grid-cols-4 gap-1 rounded-3xl border border-white/80 bg-white/90 p-2 shadow-warm backdrop-blur-xl lg:hidden","aria-label":"主要功能",children:o.map(e=>{let r=d(s,e.href);return(0,t.jsxs)(a.ExportSafeLink,{href:e.href,className:`flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl px-1 py-2 text-center transition active:scale-[0.98] ${r?"bg-coral text-white shadow-sm":"text-stone-600"}`,children:[(0,t.jsx)("span",{className:"text-sm font-black",children:e.icon}),(0,t.jsx)("span",{className:"w-full truncate text-[11px] font-black",children:e.label})]},e.label)})})},"PersonSwitcher",0,u])},55634,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),s=e.i(41324);e.s(["ActiveGradeRouteSync",0,function(){let e=(0,n.usePathname)(),{person:l,isLoggedIn:i,isReady:o}=(0,s.useActivePerson)(),c=function(e){let t=e.match(/^\/learn\/(?:grade-)?([1-6])(?:\/|$)/);if(t)return Number(t[1]);let r=e.match(/^\/courses\/grade-([1-6])(?:\/|$)/);if(r)return Number(r[1]);let n=e.match(/^\/(?:lesson|practice|handwriting)\/grade-([1-6])-/);return n?Number(n[1]):null}(e),d=!!(o&&i&&"student"===l.role&&c&&c!==l.grade);return((0,r.useEffect)(()=>{var t;if(!d)return;let r=(t=l.grade,/^\/learn\/(?:grade-)?[1-6](?:\/|$)/.test(e)?e.replace(/^\/learn\/(?:grade-)?[1-6]/,`/learn/${t}`):/^\/courses\/grade-[1-6](?:\/|$)/.test(e)?e.replace(/^\/courses\/grade-[1-6]/,`/courses/grade-${t}`):e.replace(/^(\/(?:lesson|practice|handwriting)\/)grade-[1-6]-/,`$1grade-${t}-`)),n=`${(0,a.getExportSafeHref)(r)}${window.location.search}${window.location.hash}`;window.location.replace(n)},[e,l.grade,d]),o&&!d)?null:(0,t.jsx)("div",{className:"fixed inset-0 z-[100] grid place-items-center bg-[#fffaf3]/95 p-5 backdrop-blur-md",role:"status","aria-live":"polite",children:(0,t.jsxs)("div",{className:"w-full max-w-md rounded-[2rem] border border-white bg-white/90 p-7 text-center shadow-warm",children:[(0,t.jsx)("span",{className:"mx-auto grid h-14 w-14 place-items-center rounded-2xl bg-butter text-2xl","aria-hidden":"true",children:"☀"}),(0,t.jsx)("strong",{className:"mt-4 block text-2xl font-black text-ink",children:o?`正在切換到小${l.grade}課程`:"正在讀取目前學習年級"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"晨光會自動載入這位學習者正確的課程內容。"})]})})}],55634)},10400,e=>{"use strict";var t=e.i(43476),r=e.i(82697),n=e.i(22468),a=e.i(55634);e.s(["AppShell",0,function({children:e}){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.ActiveGradeRouteSync,{}),(0,t.jsx)(n.AppSidebar,{}),(0,t.jsxs)("main",{className:"app-reading-scale min-h-screen min-w-0 overflow-x-clip px-4 pb-28 pt-4 lg:ml-64 lg:px-10 lg:py-6",children:[(0,t.jsx)("div",{className:"sticky top-3 z-40 mb-5 lg:hidden",children:(0,t.jsxs)("div",{className:"flex min-w-0 items-center justify-between gap-2 rounded-3xl border border-white/80 bg-white/90 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsx)("div",{className:"min-w-0 flex-1",children:(0,t.jsx)(r.BrandHeader,{showPerson:!1})}),(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,t.jsx)(n.PersonSwitcher,{compact:!0}),(0,t.jsx)(n.MobileMenu,{})]})]})}),(0,t.jsx)("div",{className:"mx-auto min-w-0 w-full max-w-7xl",children:e}),(0,t.jsx)(n.MobileQuickNav,{})]})]})}])},98239,e=>{"use strict";var t=e.i(43476);e.s(["SectionCard",0,function({children:e,className:r=""}){return(0,t.jsx)("section",{className:`min-w-0 overflow-hidden rounded-[1.75rem] border border-softline/80 bg-white/90 p-5 shadow-warm sm:p-6 md:p-8 ${r}`,children:e})}])},12408,e=>{"use strict";function t(){return"speechSynthesis"in window&&"SpeechSynthesisUtterance"in window}function r(e,n={}){if(!e.trim())return{ok:!1,message:"請先選擇要播放的內容。"};if(!t())return{ok:!1,message:"這個瀏覽器不支援語音播放,建議使用 Chrome 或 Edge。"};window.speechSynthesis.cancel();let a=new SpeechSynthesisUtterance(e);return a.lang=n.lang??"en-US",a.rate=n.rate??.82,a.pitch=n.pitch??1,a.volume=n.volume??1,window.speechSynthesis.speak(a),{ok:!0,message:"正在播放標準發音。"}}e.s(["speakEnglish",0,function(e,t={}){return r(e,{...t,lang:"en-US"})},"speakMandarin",0,function(e,t={}){return r(e,{rate:.76,pitch:1.05,...t,lang:"zh-TW"})},"speakText",0,r,"stopSpeech",0,function(){t()&&window.speechSynthesis.cancel()}])},70027,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(12408);let a={cream:"bg-cream text-amber-900 hover:bg-[#ffe8bd]",coral:"bg-coral text-white shadow-sm hover:bg-[#ee625c]",mint:"bg-mint text-green-800 hover:bg-[#d9f5df]"};e.s(["VoiceButton",0,function({text:e,children:s="播放",variant:l="cream",className:i="",lang:o="en-US",rate:c}){let[d,u]=(0,r.useState)("");return(0,t.jsxs)("span",{className:"inline-flex flex-col gap-1",children:[(0,t.jsx)("button",{type:"button",onClick:()=>{u((0,n.speakText)(e,{lang:o,rate:c??("zh-TW"===o?.76:.82),pitch:"zh-TW"===o?1.05:1}).message)},className:`rounded-2xl px-4 py-2 text-sm font-black transition ${a[l]} ${i}`,children:s}),d&&!d.includes("正在播放")?(0,t.jsx)("span",{className:"text-xs font-bold text-stone-500",children:d}):null]})}])},87102,e=>{"use strict";var t=e.i(7728),r=e.i(34295);let n="chenguang-learning-history";function a(e=t.currentStudent.id){return(0,r.readPersonStorage)(n,e,[])}function s(e,r=t.currentStudent.id){return(e??a(r)).flatMap(e=>e.answers.filter(e=>!e.correct))}e.s(["buildAnswerRecord",0,function(e,t){return{questionId:e.id,word:e.word,selected:t,answer:e.answer,correct:t===e.answer,explanation:e.explanation,answeredAt:new Date().toISOString()}},"getWeeklySummary",0,function(e,r=t.currentStudent.id){let n=new Date,l=new Date(n.getFullYear(),n.getMonth(),n.getDate()-6),i=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1),o=(e??a(r)).filter(e=>{let t=new Date(e.date);return t>=l&&t<i}),c=o.reduce((e,t)=>e+t.total,0),d=o.reduce((e,t)=>e+t.score,0),u=s(o,r),h=Array.from(new Set(o.flatMap(e=>e.answers.map(e=>e.word)))),m=new Set(o.map(e=>{let t=new Date(e.date);return`${t.getFullYear()}-${t.getMonth()+1}-${t.getDate()}`})),g=0;for(let e=0;e<7;e+=1){let t=new Date(n.getFullYear(),n.getMonth(),n.getDate()-e),r=`${t.getFullYear()}-${t.getMonth()+1}-${t.getDate()}`;if(!m.has(r))break;g+=1}return{days:m.size,streak:g,total:c,score:d,accuracy:0===c?0:Math.round(d/c*100),wrongAnswers:u.slice(0,6),words:h.slice(0,20),lastScore:o[0]?.score??0}},"getWrongAnswers",0,s,"saveDailyQuizRecord",0,function(e,s=t.currentStudent.id){let l=a(s),i={id:`daily-${Date.now()}`,personId:s,date:new Date().toISOString(),score:e.filter(e=>e.correct).length,total:e.length,answers:e};(0,r.writePersonStorage)(n,s,[i,...l].slice(0,60))}])},17454,e=>{"use strict";var t=e.i(43476);e.s(["CompanionGuide",0,function({title:e,message:r}){return(0,t.jsx)("div",{className:"rounded-warm border border-softline bg-gradient-to-br from-cream via-white to-mint p-5 shadow-sm",children:(0,t.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:e}),(0,t.jsx)("p",{className:"mt-2 text-lg font-bold leading-8 text-stone-700",children:r})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-white/80 px-4 py-2 text-sm font-black text-green-800 shadow-sm",children:"提示"})]})})}])},8094,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(10400),a=e.i(17454),s=e.i(42391),l=e.i(98239),i=e.i(70027),o=e.i(87102),c=e.i(41324);e.s(["default",0,function(){let{person:e}=(0,c.useActivePerson)(),[d,u]=(0,r.useState)([]);return(0,r.useEffect)(()=>{u((0,o.getWrongAnswers)(void 0,e.id).slice(0,12))},[e.id]),(0,t.jsxs)(n.AppShell,{children:[(0,t.jsx)(s.PageHeader,{eyebrow:"AI Error Coach",title:`${e.name} 的錯題 AI 說明`,description:"把答錯的題目留下來,用簡單說明陪孩子再理解一次。"}),(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(a.CompanionGuide,{title:"錯題診斷",message:"錯題不是扣分,而是找到下一步。每一題都會用孩子聽得懂的方式重新說明。"})}),(0,t.jsx)(l.SectionCard,{className:"mt-8",children:0===d.length?(0,t.jsx)("div",{className:"rounded-3xl bg-green-50 p-6 font-bold leading-8 text-green-900",children:"目前沒有錯題紀錄。先完成「每日 10 題」,這裡就會出現需要加強的題目。"}):(0,t.jsx)("div",{className:"grid gap-4 lg:grid-cols-2",children:d.map(e=>(0,t.jsxs)("article",{className:"rounded-3xl border border-softline bg-white p-5 shadow-sm",children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:e.word}),(0,t.jsx)("h2",{className:"mt-2 text-2xl font-black text-ink",children:e.answer}),(0,t.jsx)("p",{className:"mt-3 rounded-2xl bg-cream p-4 font-bold leading-7 text-stone-700",children:`你選了「${e.selected||"沒有作答"}」,正確答案是「${e.answer}」。先記住 ${e.word} 的意思,再用例句聽一次、跟著說一次。`}),(0,t.jsx)("p",{className:"mt-3 text-sm font-bold leading-6 text-stone-500",children:e.explanation}),(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(i.VoiceButton,{text:e.word,variant:"mint",children:"再聽一次"})})]},`${e.questionId}-${e.answeredAt}`))})})]})}])}]);
_next/static/chunks/2v9kiejxhux02.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,33525,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"warnOnce",{enumerable:!0,get:function(){return r}});let r=e=>{}},18967,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={DecodeError:function(){return y},MiddlewareNotFoundError:function(){return w},MissingStaticPage:function(){return b},NormalizeError:function(){return E},PageNotFoundError:function(){return P},SP:function(){return g},ST:function(){return h},WEB_VITALS:function(){return i},execOnce:function(){return a},getDisplayName:function(){return l},getLocationOrigin:function(){return c},getURL:function(){return f},isAbsoluteUrl:function(){return s},isResSent:function(){return d},loadGetInitialProps:function(){return m},normalizeRepeatedSlashes:function(){return p},stringifyError:function(){return v}};for(var o in r)Object.defineProperty(n,o,{enumerable:!0,get:r[o]});let i=["CLS","FCP","FID","INP","LCP","TTFB"];function a(e){let t,n=!1;return(...r)=>(n||(n=!0,t=e(...r)),t)}let u=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,s=e=>u.test(e);function c(){let{protocol:e,hostname:t,port:n}=window.location;return`${e}//${t}${n?":"+n:""}`}function f(){let{href:e}=window.location,t=c();return e.substring(t.length)}function l(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function d(e){return e.finished||e.headersSent}function p(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function m(e,t){let n=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await m(t.Component,t.ctx)}:{};let r=await e.getInitialProps(t);if(n&&d(n))return r;if(!r)throw Object.defineProperty(Error(`"${l(e)}.getInitialProps()" should resolve to an object. But found "${r}" instead.`),"__NEXT_ERROR_CODE",{value:"E1025",enumerable:!1,configurable:!0});return r}let g="u">typeof performance,h=g&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class y extends Error{}class E extends Error{}class P extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class b extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class w extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function v(e){return JSON.stringify({message:e.message,stack:e.stack})}},98183,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={assign:function(){return s},searchParamsToUrlQuery:function(){return i},urlQueryToSearchParams:function(){return u}};for(var o in r)Object.defineProperty(n,o,{enumerable:!0,get:r[o]});function i(e){let t={};for(let[n,r]of e.entries()){let e=t[n];void 0===e?t[n]=r:Array.isArray(e)?e.push(r):t[n]=[e,r]}return t}function a(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function u(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))if(Array.isArray(r))for(let e of r)t.append(n,a(e));else t.set(n,a(r));return t}function s(e,...t){for(let n of t){for(let t of n.keys())e.delete(t);for(let[t,r]of n.entries())e.append(t,r)}return e}},17907,e=>{"use strict";var t=e.i(71645);e.s(["StaticSpaceNavigationGuard",0,function(){return(0,t.useEffect)(()=>{if(window.location.hostname.endsWith(".static.hf.space"))return document.addEventListener("click",e,!0),()=>document.removeEventListener("click",e,!0);function e(e){if(e.defaultPrevented||0!==e.button||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let t=e.target;if(!(t instanceof Element))return;let n=t.closest("a");if(!n||"_blank"===n.target||n.hasAttribute("download"))return;let r=new URL(n.href,window.location.href);if(r.origin!==window.location.origin)return;let o=function(e){if("/"===e.pathname||e.pathname.endsWith("/index.html")||(e.pathname.split("/").filter(Boolean).at(-1)??"").includes("."))return e;let t=e.pathname.endsWith("/")?e.pathname:`${e.pathname}/`;return e.pathname=`${t}index.html`,e}(r);o.href!==n.href&&(e.preventDefault(),e.stopPropagation(),window.location.assign(o.href))}},[]),null}])}]);
_next/static/chunks/2w4nzkaxxb852.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return i},formatWithValidation:function(){return c},urlObjectKeys:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let l=e.r(90809)._(e.r(98183)),s=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:r}=e,n=e.protocol||"",a=e.pathname||"",i=e.hash||"",o=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),o&&"object"==typeof o&&(o=String(l.urlQueryToSearchParams(o)));let d=e.search||o&&`?${o}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||s.test(n))&&!1!==c?(c="//"+(c||""),a&&"/"!==a[0]&&(a="/"+a)):c||(c=""),i&&"#"!==i[0]&&(i="#"+i),d&&"?"!==d[0]&&(d="?"+d),a=a.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${n}${c}${a}${d}${i}`}let o=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return i(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t){let r=(0,n.useRef)(null),a=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(r.current=l(e,n)),t&&(a.current=l(t,n))},[e,t])}function l(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return l}});let n=e.r(18967),a=e.r(52817);function l(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,a.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return b},useLinkStatus:function(){return w}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let l=e.r(90809),s=e.r(43476),i=l._(e.r(71645)),o=e.r(95057),c=e.r(8372),d=e.r(18581),u=e.r(18967),h=e.r(5550);e.r(33525);let f=e.r(88540),g=e.r(91949),m=e.r(73668),x=e.r(9396);function b(t){var r,n;let a,l,b,[w,v]=(0,i.useOptimistic)(g.IDLE_LINK_STATUS),y=(0,i.useRef)(null),{href:j,as:N,children:k,prefetch:S=null,passHref:P,replace:$,shallow:E,scroll:L,onClick:C,onMouseEnter:I,onTouchStart:R,legacyBehavior:_=!1,onNavigate:O,transitionTypes:A,ref:T,unstable_dynamicOnHover:M,...B}=t;a=k,_&&("string"==typeof a||"number"==typeof a)&&(a=(0,s.jsx)("a",{children:a}));let U=i.default.useContext(c.AppRouterContext),H=!1!==S,z=!1!==S?null===(n=S)||"auto"===n?x.FetchStrategy.PPR:x.FetchStrategy.Full:x.FetchStrategy.PPR,D="string"==typeof(r=N||j)?r:(0,o.formatUrl)(r);if(_){if(a?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});l=i.default.Children.only(a)}let K=_?l&&"object"==typeof l&&l.ref:T,W=i.default.useCallback(e=>(null!==U&&(y.current=(0,g.mountLinkInstance)(e,D,U,z,H,v)),()=>{y.current&&((0,g.unmountLinkForCurrentNavigation)(y.current),y.current=null),(0,g.unmountPrefetchableInstance)(e)}),[H,D,U,z,v]),F={ref:(0,d.useMergedRef)(W,K),onClick(t){_||"function"!=typeof C||C(t),_&&l.props&&"function"==typeof l.props.onClick&&l.props.onClick(t),!U||t.defaultPrevented||function(t,r,n,a,l,s,o){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,m.isLocalURL)(r)){a&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),s){let e=!1;if(s({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);i.default.startTransition(()=>{u(r,a?"replace":"push",!1===l?f.ScrollBehavior.NoScroll:f.ScrollBehavior.Default,n.current,o)})}}(t,D,y,$,L,O,A)},onMouseEnter(e){_||"function"!=typeof I||I(e),_&&l.props&&"function"==typeof l.props.onMouseEnter&&l.props.onMouseEnter(e),U&&H&&(0,g.onNavigationIntent)(e.currentTarget,!0===M)},onTouchStart:function(e){_||"function"!=typeof R||R(e),_&&l.props&&"function"==typeof l.props.onTouchStart&&l.props.onTouchStart(e),U&&H&&(0,g.onNavigationIntent)(e.currentTarget,!0===M)}};return(0,u.isAbsoluteUrl)(D)?F.href=D:_&&!P&&("a"!==l.type||"href"in l.props)||(F.href=(0,h.addBasePath)(D)),b=_?i.default.cloneElement(l,F):(0,s.jsx)("a",{...B,...F,children:a}),(0,s.jsx)(p.Provider,{value:w,children:b})}e.r(84508);let p=(0,i.createContext)(g.IDLE_LINK_STATUS),w=()=>(0,i.useContext)(p);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},14876,e=>{"use strict";var t=e.i(43476),r=e.i(22016);function n(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:r,suffix:n}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===r?`/index.html${n}`:/\.[a-z0-9]+$/i.test(r)?e:`${r.replace(/\/+$/,"")}/index.html${n}`}e.s(["ExportSafeLink",0,function({href:e,children:a,...l}){return"string"==typeof e?(0,t.jsx)("a",{href:n(e),...l,children:a}):(0,t.jsx)(r.default,{href:e,...l,children:a})},"getExportSafeHref",0,n])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let r=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function n(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return r.find(t=>t.grade===e)},"getGradeIdByNumber",0,n,"grades",0,r],62312);let a=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],l={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function s(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.find(e=>e.id===t)??l}function i(e){if(!e)return l.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.some(e=>e.id===t)?t:l.id}e.s(["currentStudent",0,l,"getCurrentStudentGradeId",0,function(e=l){return n(e.grade)},"getPersonById",0,s,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,a,"normalizePersonId",0,i],7728);let o="chenguang-active-person-id",c="chenguang-active-person-change",d="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,r]=(0,t.useState)(l.id),[n,a]=(0,t.useState)(!1),[h,f]=(0,t.useState)(!1);function g(e){let t=i(e);r(t),window.localStorage.setItem(o,t),window.dispatchEvent(new Event(c))}return(0,t.useEffect)(()=>{let e=i(window.localStorage.getItem(o));function t(){let e=i(window.localStorage.getItem(o));r(e),window.localStorage.setItem(o,e)}function n(){a(!!window.localStorage.getItem(d))}return r(e),window.localStorage.setItem(o,e),a(!!window.localStorage.getItem(d)),f(!0),window.addEventListener(c,t),window.addEventListener("storage",t),window.addEventListener(u,n),()=>{window.removeEventListener(c,t),window.removeEventListener("storage",t),window.removeEventListener(u,n)}},[]),{person:s(e),switchPerson:g,signIn:function(e){let t=i(e);g(t);let r=s(t);window.localStorage.setItem(d,JSON.stringify({personId:t,role:r.role,signedInAt:new Date().toISOString()})),a(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(d),a(!1),window.dispatchEvent(new Event(u))},isLoggedIn:n,isReady:h}}],41324)},82697,e=>{"use strict";var t=e.i(43476),r=e.i(14876),n=e.i(7728),a=e.i(62312),l=e.i(41324);e.s(["BrandHeader",0,function({showPerson:e=!0}){let{person:s,isLoggedIn:i}=(0,l.useActivePerson)(),o=(0,a.getGradeByNumber)(s.grade),c=i?`${(0,n.getPersonDisplayName)(s)}|${"student"===s.role?(0,n.getPersonSubtitle)(s):o?.shortName??`小${s.grade}`}`:"訪客模式";return(0,t.jsxs)(r.ExportSafeLink,{href:i?"/dashboard":"/",className:"flex min-w-0 items-center gap-3 text-ink",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 shrink-0 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{className:"min-w-0 leading-tight",children:[(0,t.jsx)("strong",{className:"block truncate text-xl font-black",children:"晨光"}),(0,t.jsx)("small",{className:"block truncate text-sm font-bold text-stone-500",children:e?c:"國小學習陪跑系統"})]})]})}])},18566,(e,t,r)=>{t.exports=e.r(76562)},22468,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),l=e.i(7728),s=e.i(62312),i=e.i(41324);let o=[{label:"登入",href:"/login"},{label:"訪客體驗",href:"/courses"},{label:"註冊登入",href:"/register",primary:!0}];function c(e,t="student"){let r=[{label:"課程首頁",href:"/dashboard",icon:"⌂"},{label:"每日 10 題",href:"/daily-quiz",icon:"10"},{label:"錯題 AI 說明",href:"/wrong-review",icon:"AI"},{label:"進度月曆",href:"/parent-weekly-report",icon:"月"},{label:"英文練習",href:"/practice",icon:"Aa"},{label:"手寫出題",href:"/word-scanner",icon:"掃"},{label:"課程總覽",href:"/courses",icon:"▦"},{label:"國語練習",href:`/courses/grade-${e}/chinese/basic`,icon:"ㄅ"},{label:"數學練習",href:`/courses/grade-${e}/math/basic`,icon:"123"},{label:"每日紀錄",href:"/daily-record",icon:"✓"},{label:"週計畫",href:"/weekly-plan",icon:"□"},{label:"登出",href:"/",icon:"出"}];return"parent"===t?r.filter(e=>["課程首頁","進度月曆","每日紀錄","週計畫","課程總覽","登出"].includes(e.label)):"teacher"===t?r.filter(e=>["課程首頁","課程總覽","國語練習","英文練習","數學練習","週計畫","手寫出題","登出"].includes(e.label)):r.filter(e=>["課程首頁","每日 10 題","英文練習","國語練習","數學練習","手寫出題","錯題 AI 說明","登出"].includes(e.label))}function d(e,t){return"/dashboard"===t?"/dashboard"===e:"/courses"===t?"/courses"===e:t.startsWith("/courses/")?e===t||e.startsWith(`${t}/`):e===t}function u({compact:e=!1}){let{person:n}=(0,i.useActivePerson)(),[a,o]=(0,r.useState)(!1),c=(0,s.getGradeByNumber)(n.grade),d="student"===n.role?(0,l.getPersonSubtitle)(n):c?.name??`國小${n.grade}年級`,h=(0,t.jsx)("div",{className:"grid gap-2",children:l.mockPeople.map(e=>{let r=(0,s.getGradeByNumber)(e.grade),a=e.id===n.id;return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;let r;return t=e.id,o(!1),r=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login",void window.location.assign(`${r}?person=${encodeURIComponent(t)}`)},className:`rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${a?"bg-coral text-white shadow-sm":"bg-white text-stone-700 hover:bg-butter"}`,children:[(0,t.jsxs)("span",{className:"block text-xs font-black opacity-80",children:[(0,l.getRoleLabel)(e.role),"模式"]}),(0,t.jsx)("span",{className:"mt-1 block text-base font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-75",children:"student"===e.role?(0,l.getPersonSubtitle)(e):r?.name??`國小${e.grade}年級`})]},e.id)})});return e?(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>o(e=>!e),className:"flex min-h-11 max-w-[5.5rem] items-center gap-1 rounded-2xl bg-butter px-2 text-left text-amber-950 shadow-sm sm:max-w-none sm:gap-2 sm:px-3","aria-expanded":a,"aria-label":"切換目前使用者",children:[(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("strong",{className:"block max-w-20 truncate text-sm font-black",children:n.name}),(0,t.jsx)("small",{className:"block text-[11px] font-bold opacity-70",children:c?.shortName??`小${n.grade}`})]}),(0,t.jsx)("span",{"aria-hidden":"true",className:"text-xs",children:"⌄"})]}),a?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100vh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsx)("strong",{className:"text-base font-black text-ink",children:"切換使用者"}),(0,t.jsx)("button",{type:"button",onClick:()=>o(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉帳號選單",children:"×"})]}),h]}):null]}):(0,t.jsxs)("section",{className:"rounded-3xl border border-amber-100 bg-cream p-3 shadow-sm",children:[(0,t.jsx)("button",{type:"button",onClick:()=>o(e=>!e),className:"w-full rounded-[1.35rem] bg-white/80 p-3 text-left ring-1 ring-transparent transition hover:bg-white hover:ring-coral/30","aria-expanded":a,"aria-label":"切換目前使用者",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("p",{className:"text-xs font-black text-amber-700",children:[(0,l.getRoleLabel)(n.role),"模式"]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-2xl font-black leading-tight text-ink",children:n.name}),(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"student"===n.role?"匿名檔案":(0,l.getRoleLabel)(n.role)})]}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:d})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-coral px-3 py-2 text-xs font-black text-white shadow-sm",children:"切換帳號"})]})}),a?(0,t.jsx)("div",{className:"mt-3",children:h}):null]})}e.s(["AppSidebar",0,function(){let e=(0,n.usePathname)(),{person:r,isLoggedIn:l,signOut:s}=(0,i.useActivePerson)();function h(){s();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsx)("aside",{className:"fixed inset-y-0 left-0 z-20 hidden w-64 flex-col border-r border-softline/80 bg-white/85 backdrop-blur-xl lg:flex",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 py-6",children:[(0,t.jsxs)(a.ExportSafeLink,{className:"flex items-center gap-3",href:l?"/dashboard":"/",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"text-sm font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),l?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{}),(0,t.jsx)("nav",{className:"grid gap-2 pr-1",children:c(r.grade,r.role).map(r=>{let n=d(e,r.href),l=`flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left transition ${n?"bg-butter text-amber-900 shadow-sm":"text-stone-600 hover:bg-butter hover:text-amber-900"}`,s=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 place-items-center rounded-xl text-sm font-black shadow-sm ${n?"bg-white text-coral":"bg-white text-stone-500"}`,children:r.icon}),(0,t.jsx)("span",{className:"font-bold",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:h,className:l,children:s},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,className:l,children:s},r.label)})})]}):(0,t.jsx)("div",{className:"grid gap-3",children:o.map(e=>(0,t.jsx)(a.ExportSafeLink,{href:e.href,className:e.primary?"rounded-2xl bg-coral px-4 py-3 text-center font-black text-white shadow-warm transition hover:brightness-105":"rounded-2xl border border-softline bg-white px-4 py-3 text-center font-black text-amber-800 transition hover:bg-butter",children:e.label},e.label))}),l?(0,t.jsxs)(a.ExportSafeLink,{href:"student"===r.role?"/wrong-review":"/parent-weekly-report",className:"mt-auto rounded-2xl border border-green-100 bg-green-50 p-4 text-sm text-green-900 transition hover:-translate-y-0.5 hover:bg-green-100",children:[(0,t.jsx)("span",{className:"block text-xs font-black text-green-700",children:"本週學習摘要"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg",children:"每天一小步,進度看得見"}),(0,t.jsx)("span",{className:"mt-2 block font-bold text-green-700",children:"查看進度與需要再練的內容 →"})]}):null]})})},"MobileMenu",0,function(){let e=(0,n.usePathname)(),{person:l,signOut:s}=(0,i.useActivePerson)(),[o,u]=(0,r.useState)(!1),h=c(l.grade,l.role);function f(){s();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsxs)("div",{className:"shrink-0 lg:hidden",children:[(0,t.jsx)("button",{type:"button",onClick:()=>u(e=>!e),className:"grid min-h-11 min-w-11 place-items-center rounded-2xl bg-white text-xl font-black text-amber-900 shadow-sm active:scale-[0.98]","aria-expanded":o,"aria-label":"開啟完整功能選單",children:o?"×":"☰"}),o?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100dvh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("strong",{className:"block text-base font-black text-ink",children:"全部功能"}),(0,t.jsxs)("span",{className:"text-xs font-bold text-stone-500",children:["依 ",l.name," 的身分顯示"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉功能選單",children:"×"})]}),(0,t.jsx)("nav",{className:"grid grid-cols-2 gap-2",children:h.map(r=>{let n=d(e,r.href),l=`flex min-h-16 items-center gap-3 rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${n?"bg-coral text-white":"bg-white text-stone-700"}`,s=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 shrink-0 place-items-center rounded-xl text-sm font-black ${n?"bg-white/20":"bg-butter text-amber-900"}`,children:r.icon}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:f,className:l,children:s},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,onClick:()=>u(!1),className:l,children:s},r.label)})})]}):null]})},"MobileQuickNav",0,function(){var e;let r,l=(0,n.usePathname)(),{person:s}=(0,i.useActivePerson)(),o=(r=c(s.grade,e=s.role),("guest"===e?["課程首頁","課程總覽"]:({student:["課程首頁","每日 10 題","英文練習","課程總覽"],parent:["課程首頁","進度月曆","每日紀錄","週計畫"],teacher:["課程首頁","課程總覽","週計畫","手寫出題"]})[e]).map(e=>r.find(t=>t.label===e)).filter(e=>!!e));return(0,t.jsx)("nav",{className:"fixed inset-x-3 bottom-[max(0.75rem,env(safe-area-inset-bottom))] z-50 grid grid-cols-4 gap-1 rounded-3xl border border-white/80 bg-white/90 p-2 shadow-warm backdrop-blur-xl lg:hidden","aria-label":"主要功能",children:o.map(e=>{let r=d(l,e.href);return(0,t.jsxs)(a.ExportSafeLink,{href:e.href,className:`flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl px-1 py-2 text-center transition active:scale-[0.98] ${r?"bg-coral text-white shadow-sm":"text-stone-600"}`,children:[(0,t.jsx)("span",{className:"text-sm font-black",children:e.icon}),(0,t.jsx)("span",{className:"w-full truncate text-[11px] font-black",children:e.label})]},e.label)})})},"PersonSwitcher",0,u])},55634,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),l=e.i(41324);e.s(["ActiveGradeRouteSync",0,function(){let e=(0,n.usePathname)(),{person:s,isLoggedIn:i,isReady:o}=(0,l.useActivePerson)(),c=function(e){let t=e.match(/^\/learn\/(?:grade-)?([1-6])(?:\/|$)/);if(t)return Number(t[1]);let r=e.match(/^\/courses\/grade-([1-6])(?:\/|$)/);if(r)return Number(r[1]);let n=e.match(/^\/(?:lesson|practice|handwriting)\/grade-([1-6])-/);return n?Number(n[1]):null}(e),d=!!(o&&i&&"student"===s.role&&c&&c!==s.grade);return((0,r.useEffect)(()=>{var t;if(!d)return;let r=(t=s.grade,/^\/learn\/(?:grade-)?[1-6](?:\/|$)/.test(e)?e.replace(/^\/learn\/(?:grade-)?[1-6]/,`/learn/${t}`):/^\/courses\/grade-[1-6](?:\/|$)/.test(e)?e.replace(/^\/courses\/grade-[1-6]/,`/courses/grade-${t}`):e.replace(/^(\/(?:lesson|practice|handwriting)\/)grade-[1-6]-/,`$1grade-${t}-`)),n=`${(0,a.getExportSafeHref)(r)}${window.location.search}${window.location.hash}`;window.location.replace(n)},[e,s.grade,d]),o&&!d)?null:(0,t.jsx)("div",{className:"fixed inset-0 z-[100] grid place-items-center bg-[#fffaf3]/95 p-5 backdrop-blur-md",role:"status","aria-live":"polite",children:(0,t.jsxs)("div",{className:"w-full max-w-md rounded-[2rem] border border-white bg-white/90 p-7 text-center shadow-warm",children:[(0,t.jsx)("span",{className:"mx-auto grid h-14 w-14 place-items-center rounded-2xl bg-butter text-2xl","aria-hidden":"true",children:"☀"}),(0,t.jsx)("strong",{className:"mt-4 block text-2xl font-black text-ink",children:o?`正在切換到小${s.grade}課程`:"正在讀取目前學習年級"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"晨光會自動載入這位學習者正確的課程內容。"})]})})}],55634)},97750,e=>{"use strict";var t=e.i(43476),r=e.i(14876);e.s(["SecondaryButton",0,function({children:e,href:n,onClick:a,type:l="button",className:s="",disabled:i=!1}){let o=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-butter px-6 py-3 text-center font-black text-amber-900 shadow-sm transition hover:-translate-y-0.5 hover:bg-amber-100 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-honey/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${s}`;return n&&!i?(0,t.jsx)(r.ExportSafeLink,{className:o,href:n,children:e}):(0,t.jsx)("button",{className:o,type:l,onClick:a,disabled:i,children:e})}])},73887,e=>{"use strict";var t=e.i(43476),r=e.i(14876);e.s(["PrimaryButton",0,function({children:e,href:n,onClick:a,type:l="button",className:s="",disabled:i=!1}){let o=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-coral px-6 py-3 text-center font-black text-white shadow-warm transition hover:-translate-y-0.5 hover:brightness-105 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-coral/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${s}`;return n&&!i?(0,t.jsx)(r.ExportSafeLink,{className:o,href:n,children:e}):(0,t.jsx)("button",{className:o,type:l,onClick:a,disabled:i,children:e})}])}]);
_next/static/chunks/2z69le1cjg69d.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,97750,e=>{"use strict";var t=e.i(43476),r=e.i(14876);e.s(["SecondaryButton",0,function({children:e,href:a,onClick:n,type:s="button",className:l="",disabled:i=!1}){let o=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-butter px-6 py-3 text-center font-black text-amber-900 shadow-sm transition hover:-translate-y-0.5 hover:bg-amber-100 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-honey/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${l}`;return a&&!i?(0,t.jsx)(r.ExportSafeLink,{className:o,href:a,children:e}):(0,t.jsx)("button",{className:o,type:s,onClick:n,disabled:i,children:e})}])},73887,e=>{"use strict";var t=e.i(43476),r=e.i(14876);e.s(["PrimaryButton",0,function({children:e,href:a,onClick:n,type:s="button",className:l="",disabled:i=!1}){let o=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-coral px-6 py-3 text-center font-black text-white shadow-warm transition hover:-translate-y-0.5 hover:brightness-105 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-coral/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${l}`;return a&&!i?(0,t.jsx)(r.ExportSafeLink,{className:o,href:a,children:e}):(0,t.jsx)("button",{className:o,type:s,onClick:n,disabled:i,children:e})}])},34295,e=>{"use strict";function t(e,t){return`${e}:${t}`}e.s(["getPersonStorageKey",0,t,"readPersonStorage",0,function(e,r,a){try{let n=window.localStorage.getItem(t(e,r));return n?JSON.parse(n):a}catch{return a}},"removePersonStorage",0,function(e,r){try{window.localStorage.removeItem(t(e,r))}catch{}},"writePersonStorage",0,function(e,r,a){try{return window.localStorage.setItem(t(e,r),JSON.stringify(a)),!0}catch{return!1}}])},42391,e=>{"use strict";var t=e.i(43476);e.s(["PageHeader",0,function({eyebrow:e,title:r,description:a,action:n}){return(0,t.jsxs)("header",{className:"flex min-w-0 flex-col gap-5 pb-1 sm:flex-row sm:items-start sm:justify-between",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-black uppercase tracking-[0.08em] text-amber-700",children:e}),(0,t.jsx)("h1",{className:"mt-2 text-3xl font-black leading-tight tracking-normal text-ink md:text-5xl",children:r}),a?(0,t.jsx)("p",{className:"mt-3 max-w-3xl text-base font-medium leading-7 text-stone-600 md:text-lg md:leading-8",children:a}):null]}),n?(0,t.jsx)("div",{className:"w-full shrink-0 sm:w-auto",children:n}):null]})}])},95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var a={formatUrl:function(){return i},formatWithValidation:function(){return d},urlObjectKeys:function(){return o}};for(var n in a)Object.defineProperty(r,n,{enumerable:!0,get:a[n]});let s=e.r(90809)._(e.r(98183)),l=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:r}=e,a=e.protocol||"",n=e.pathname||"",i=e.hash||"",o=e.query||"",d=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?d=t+e.host:r&&(d=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(d+=":"+e.port)),o&&"object"==typeof o&&(o=String(s.urlQueryToSearchParams(o)));let c=e.search||o&&`?${o}`||"";return a&&!a.endsWith(":")&&(a+=":"),e.slashes||(!a||l.test(a))&&!1!==d?(d="//"+(d||""),n&&"/"!==n[0]&&(n="/"+n)):d||(d=""),i&&"#"!==i[0]&&(i="#"+i),c&&"?"!==c[0]&&(c="?"+c),n=n.replace(/[?#]/g,encodeURIComponent),c=c.replace("#","%23"),`${a}${d}${n}${c}${i}`}let o=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function d(e){return i(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return n}});let a=e.r(71645);function n(e,t){let r=(0,a.useRef)(null),n=(0,a.useRef)(null);return(0,a.useCallback)(a=>{if(null===a){let e=r.current;e&&(r.current=null,e());let t=n.current;t&&(n.current=null,t())}else e&&(r.current=s(e,a)),t&&(n.current=s(t,a))},[e,t])}function s(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return s}});let a=e.r(18967),n=e.r(52817);function s(e){if(!(0,a.isAbsoluteUrl)(e))return!0;try{let t=(0,a.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,n.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return a}});let a=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var a={default:function(){return p},useLinkStatus:function(){return w}};for(var n in a)Object.defineProperty(r,n,{enumerable:!0,get:a[n]});let s=e.r(90809),l=e.r(43476),i=s._(e.r(71645)),o=e.r(95057),d=e.r(8372),c=e.r(18581),u=e.r(18967),m=e.r(5550);e.r(33525);let h=e.r(88540),g=e.r(91949),x=e.r(73668),f=e.r(9396);function p(t){var r,a;let n,s,p,[w,y]=(0,i.useOptimistic)(g.IDLE_LINK_STATUS),v=(0,i.useRef)(null),{href:k,as:j,children:N,prefetch:S=null,passHref:P,replace:$,shallow:T,scroll:C,onClick:E,onMouseEnter:I,onTouchStart:L,legacyBehavior:R=!1,onNavigate:A,transitionTypes:_,ref:O,unstable_dynamicOnHover:B,...M}=t;n=N,R&&("string"==typeof n||"number"==typeof n)&&(n=(0,l.jsx)("a",{children:n}));let H=i.default.useContext(d.AppRouterContext),U=!1!==S,z=!1!==S?null===(a=S)||"auto"===a?f.FetchStrategy.PPR:f.FetchStrategy.Full:f.FetchStrategy.PPR,F="string"==typeof(r=j||k)?r:(0,o.formatUrl)(r);if(R){if(n?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});s=i.default.Children.only(n)}let W=R?s&&"object"==typeof s&&s.ref:O,D=i.default.useCallback(e=>(null!==H&&(v.current=(0,g.mountLinkInstance)(e,F,H,z,U,y)),()=>{v.current&&((0,g.unmountLinkForCurrentNavigation)(v.current),v.current=null),(0,g.unmountPrefetchableInstance)(e)}),[U,F,H,z,y]),K={ref:(0,c.useMergedRef)(D,W),onClick(t){R||"function"!=typeof E||E(t),R&&s.props&&"function"==typeof s.props.onClick&&s.props.onClick(t),!H||t.defaultPrevented||function(t,r,a,n,s,l,o){if("u">typeof window){let d,{nodeName:c}=t.currentTarget;if("A"===c.toUpperCase()&&((d=t.currentTarget.getAttribute("target"))&&"_self"!==d||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,x.isLocalURL)(r)){n&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);i.default.startTransition(()=>{u(r,n?"replace":"push",!1===s?h.ScrollBehavior.NoScroll:h.ScrollBehavior.Default,a.current,o)})}}(t,F,v,$,C,A,_)},onMouseEnter(e){R||"function"!=typeof I||I(e),R&&s.props&&"function"==typeof s.props.onMouseEnter&&s.props.onMouseEnter(e),H&&U&&(0,g.onNavigationIntent)(e.currentTarget,!0===B)},onTouchStart:function(e){R||"function"!=typeof L||L(e),R&&s.props&&"function"==typeof s.props.onTouchStart&&s.props.onTouchStart(e),H&&U&&(0,g.onNavigationIntent)(e.currentTarget,!0===B)}};return(0,u.isAbsoluteUrl)(F)?K.href=F:R&&!P&&("a"!==s.type||"href"in s.props)||(K.href=(0,m.addBasePath)(F)),p=R?i.default.cloneElement(s,K):(0,l.jsx)("a",{...M,...K,children:n}),(0,l.jsx)(b.Provider,{value:w,children:p})}e.r(84508);let b=(0,i.createContext)(g.IDLE_LINK_STATUS),w=()=>(0,i.useContext)(b);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},14876,e=>{"use strict";var t=e.i(43476),r=e.i(22016);function a(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:r,suffix:a}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===r?`/index.html${a}`:/\.[a-z0-9]+$/i.test(r)?e:`${r.replace(/\/+$/,"")}/index.html${a}`}e.s(["ExportSafeLink",0,function({href:e,children:n,...s}){return"string"==typeof e?(0,t.jsx)("a",{href:a(e),...s,children:n}):(0,t.jsx)(r.default,{href:e,...s,children:n})},"getExportSafeHref",0,a])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let r=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function a(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return r.find(t=>t.grade===e)},"getGradeIdByNumber",0,a,"grades",0,r],62312);let n=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],s={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function l(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return n.find(e=>e.id===t)??s}function i(e){if(!e)return s.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return n.some(e=>e.id===t)?t:s.id}e.s(["currentStudent",0,s,"getCurrentStudentGradeId",0,function(e=s){return a(e.grade)},"getPersonById",0,l,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,n,"normalizePersonId",0,i],7728);let o="chenguang-active-person-id",d="chenguang-active-person-change",c="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,r]=(0,t.useState)(s.id),[a,n]=(0,t.useState)(!1),[m,h]=(0,t.useState)(!1);function g(e){let t=i(e);r(t),window.localStorage.setItem(o,t),window.dispatchEvent(new Event(d))}return(0,t.useEffect)(()=>{let e=i(window.localStorage.getItem(o));function t(){let e=i(window.localStorage.getItem(o));r(e),window.localStorage.setItem(o,e)}function a(){n(!!window.localStorage.getItem(c))}return r(e),window.localStorage.setItem(o,e),n(!!window.localStorage.getItem(c)),h(!0),window.addEventListener(d,t),window.addEventListener("storage",t),window.addEventListener(u,a),()=>{window.removeEventListener(d,t),window.removeEventListener("storage",t),window.removeEventListener(u,a)}},[]),{person:l(e),switchPerson:g,signIn:function(e){let t=i(e);g(t);let r=l(t);window.localStorage.setItem(c,JSON.stringify({personId:t,role:r.role,signedInAt:new Date().toISOString()})),n(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(c),n(!1),window.dispatchEvent(new Event(u))},isLoggedIn:a,isReady:m}}],41324)},82697,e=>{"use strict";var t=e.i(43476),r=e.i(14876),a=e.i(7728),n=e.i(62312),s=e.i(41324);e.s(["BrandHeader",0,function({showPerson:e=!0}){let{person:l,isLoggedIn:i}=(0,s.useActivePerson)(),o=(0,n.getGradeByNumber)(l.grade),d=i?`${(0,a.getPersonDisplayName)(l)}|${"student"===l.role?(0,a.getPersonSubtitle)(l):o?.shortName??`小${l.grade}`}`:"訪客模式";return(0,t.jsxs)(r.ExportSafeLink,{href:i?"/dashboard":"/",className:"flex min-w-0 items-center gap-3 text-ink",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 shrink-0 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{className:"min-w-0 leading-tight",children:[(0,t.jsx)("strong",{className:"block truncate text-xl font-black",children:"晨光"}),(0,t.jsx)("small",{className:"block truncate text-sm font-bold text-stone-500",children:e?d:"國小學習陪跑系統"})]})]})}])},18566,(e,t,r)=>{t.exports=e.r(76562)},22468,e=>{"use strict";var t=e.i(43476),r=e.i(71645),a=e.i(18566),n=e.i(14876),s=e.i(7728),l=e.i(62312),i=e.i(41324);let o=[{label:"登入",href:"/login"},{label:"訪客體驗",href:"/courses"},{label:"註冊登入",href:"/register",primary:!0}];function d(e,t="student"){let r=[{label:"課程首頁",href:"/dashboard",icon:"⌂"},{label:"每日 10 題",href:"/daily-quiz",icon:"10"},{label:"錯題 AI 說明",href:"/wrong-review",icon:"AI"},{label:"進度月曆",href:"/parent-weekly-report",icon:"月"},{label:"英文練習",href:"/practice",icon:"Aa"},{label:"手寫出題",href:"/word-scanner",icon:"掃"},{label:"課程總覽",href:"/courses",icon:"▦"},{label:"國語練習",href:`/courses/grade-${e}/chinese/basic`,icon:"ㄅ"},{label:"數學練習",href:`/courses/grade-${e}/math/basic`,icon:"123"},{label:"每日紀錄",href:"/daily-record",icon:"✓"},{label:"週計畫",href:"/weekly-plan",icon:"□"},{label:"登出",href:"/",icon:"出"}];return"parent"===t?r.filter(e=>["課程首頁","進度月曆","每日紀錄","週計畫","課程總覽","登出"].includes(e.label)):"teacher"===t?r.filter(e=>["課程首頁","課程總覽","國語練習","英文練習","數學練習","週計畫","手寫出題","登出"].includes(e.label)):r.filter(e=>["課程首頁","每日 10 題","英文練習","國語練習","數學練習","手寫出題","錯題 AI 說明","登出"].includes(e.label))}function c(e,t){return"/dashboard"===t?"/dashboard"===e:"/courses"===t?"/courses"===e:t.startsWith("/courses/")?e===t||e.startsWith(`${t}/`):e===t}function u({compact:e=!1}){let{person:a}=(0,i.useActivePerson)(),[n,o]=(0,r.useState)(!1),d=(0,l.getGradeByNumber)(a.grade),c="student"===a.role?(0,s.getPersonSubtitle)(a):d?.name??`國小${a.grade}年級`,m=(0,t.jsx)("div",{className:"grid gap-2",children:s.mockPeople.map(e=>{let r=(0,l.getGradeByNumber)(e.grade),n=e.id===a.id;return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;let r;return t=e.id,o(!1),r=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login",void window.location.assign(`${r}?person=${encodeURIComponent(t)}`)},className:`rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${n?"bg-coral text-white shadow-sm":"bg-white text-stone-700 hover:bg-butter"}`,children:[(0,t.jsxs)("span",{className:"block text-xs font-black opacity-80",children:[(0,s.getRoleLabel)(e.role),"模式"]}),(0,t.jsx)("span",{className:"mt-1 block text-base font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-75",children:"student"===e.role?(0,s.getPersonSubtitle)(e):r?.name??`國小${e.grade}年級`})]},e.id)})});return e?(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>o(e=>!e),className:"flex min-h-11 max-w-[5.5rem] items-center gap-1 rounded-2xl bg-butter px-2 text-left text-amber-950 shadow-sm sm:max-w-none sm:gap-2 sm:px-3","aria-expanded":n,"aria-label":"切換目前使用者",children:[(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("strong",{className:"block max-w-20 truncate text-sm font-black",children:a.name}),(0,t.jsx)("small",{className:"block text-[11px] font-bold opacity-70",children:d?.shortName??`小${a.grade}`})]}),(0,t.jsx)("span",{"aria-hidden":"true",className:"text-xs",children:"⌄"})]}),n?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100vh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsx)("strong",{className:"text-base font-black text-ink",children:"切換使用者"}),(0,t.jsx)("button",{type:"button",onClick:()=>o(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉帳號選單",children:"×"})]}),m]}):null]}):(0,t.jsxs)("section",{className:"rounded-3xl border border-amber-100 bg-cream p-3 shadow-sm",children:[(0,t.jsx)("button",{type:"button",onClick:()=>o(e=>!e),className:"w-full rounded-[1.35rem] bg-white/80 p-3 text-left ring-1 ring-transparent transition hover:bg-white hover:ring-coral/30","aria-expanded":n,"aria-label":"切換目前使用者",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("p",{className:"text-xs font-black text-amber-700",children:[(0,s.getRoleLabel)(a.role),"模式"]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-2xl font-black leading-tight text-ink",children:a.name}),(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"student"===a.role?"匿名檔案":(0,s.getRoleLabel)(a.role)})]}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:c})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-coral px-3 py-2 text-xs font-black text-white shadow-sm",children:"切換帳號"})]})}),n?(0,t.jsx)("div",{className:"mt-3",children:m}):null]})}e.s(["AppSidebar",0,function(){let e=(0,a.usePathname)(),{person:r,isLoggedIn:s,signOut:l}=(0,i.useActivePerson)();function m(){l();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsx)("aside",{className:"fixed inset-y-0 left-0 z-20 hidden w-64 flex-col border-r border-softline/80 bg-white/85 backdrop-blur-xl lg:flex",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 py-6",children:[(0,t.jsxs)(n.ExportSafeLink,{className:"flex items-center gap-3",href:s?"/dashboard":"/",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"text-sm font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),s?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{}),(0,t.jsx)("nav",{className:"grid gap-2 pr-1",children:d(r.grade,r.role).map(r=>{let a=c(e,r.href),s=`flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left transition ${a?"bg-butter text-amber-900 shadow-sm":"text-stone-600 hover:bg-butter hover:text-amber-900"}`,l=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 place-items-center rounded-xl text-sm font-black shadow-sm ${a?"bg-white text-coral":"bg-white text-stone-500"}`,children:r.icon}),(0,t.jsx)("span",{className:"font-bold",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:m,className:s,children:l},r.label):(0,t.jsx)(n.ExportSafeLink,{href:r.href,className:s,children:l},r.label)})})]}):(0,t.jsx)("div",{className:"grid gap-3",children:o.map(e=>(0,t.jsx)(n.ExportSafeLink,{href:e.href,className:e.primary?"rounded-2xl bg-coral px-4 py-3 text-center font-black text-white shadow-warm transition hover:brightness-105":"rounded-2xl border border-softline bg-white px-4 py-3 text-center font-black text-amber-800 transition hover:bg-butter",children:e.label},e.label))}),s?(0,t.jsxs)(n.ExportSafeLink,{href:"student"===r.role?"/wrong-review":"/parent-weekly-report",className:"mt-auto rounded-2xl border border-green-100 bg-green-50 p-4 text-sm text-green-900 transition hover:-translate-y-0.5 hover:bg-green-100",children:[(0,t.jsx)("span",{className:"block text-xs font-black text-green-700",children:"本週學習摘要"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg",children:"每天一小步,進度看得見"}),(0,t.jsx)("span",{className:"mt-2 block font-bold text-green-700",children:"查看進度與需要再練的內容 →"})]}):null]})})},"MobileMenu",0,function(){let e=(0,a.usePathname)(),{person:s,signOut:l}=(0,i.useActivePerson)(),[o,u]=(0,r.useState)(!1),m=d(s.grade,s.role);function h(){l();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsxs)("div",{className:"shrink-0 lg:hidden",children:[(0,t.jsx)("button",{type:"button",onClick:()=>u(e=>!e),className:"grid min-h-11 min-w-11 place-items-center rounded-2xl bg-white text-xl font-black text-amber-900 shadow-sm active:scale-[0.98]","aria-expanded":o,"aria-label":"開啟完整功能選單",children:o?"×":"☰"}),o?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100dvh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("strong",{className:"block text-base font-black text-ink",children:"全部功能"}),(0,t.jsxs)("span",{className:"text-xs font-bold text-stone-500",children:["依 ",s.name," 的身分顯示"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉功能選單",children:"×"})]}),(0,t.jsx)("nav",{className:"grid grid-cols-2 gap-2",children:m.map(r=>{let a=c(e,r.href),s=`flex min-h-16 items-center gap-3 rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${a?"bg-coral text-white":"bg-white text-stone-700"}`,l=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 shrink-0 place-items-center rounded-xl text-sm font-black ${a?"bg-white/20":"bg-butter text-amber-900"}`,children:r.icon}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:h,className:s,children:l},r.label):(0,t.jsx)(n.ExportSafeLink,{href:r.href,onClick:()=>u(!1),className:s,children:l},r.label)})})]}):null]})},"MobileQuickNav",0,function(){var e;let r,s=(0,a.usePathname)(),{person:l}=(0,i.useActivePerson)(),o=(r=d(l.grade,e=l.role),("guest"===e?["課程首頁","課程總覽"]:({student:["課程首頁","每日 10 題","英文練習","課程總覽"],parent:["課程首頁","進度月曆","每日紀錄","週計畫"],teacher:["課程首頁","課程總覽","週計畫","手寫出題"]})[e]).map(e=>r.find(t=>t.label===e)).filter(e=>!!e));return(0,t.jsx)("nav",{className:"fixed inset-x-3 bottom-[max(0.75rem,env(safe-area-inset-bottom))] z-50 grid grid-cols-4 gap-1 rounded-3xl border border-white/80 bg-white/90 p-2 shadow-warm backdrop-blur-xl lg:hidden","aria-label":"主要功能",children:o.map(e=>{let r=c(s,e.href);return(0,t.jsxs)(n.ExportSafeLink,{href:e.href,className:`flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl px-1 py-2 text-center transition active:scale-[0.98] ${r?"bg-coral text-white shadow-sm":"text-stone-600"}`,children:[(0,t.jsx)("span",{className:"text-sm font-black",children:e.icon}),(0,t.jsx)("span",{className:"w-full truncate text-[11px] font-black",children:e.label})]},e.label)})})},"PersonSwitcher",0,u])},55634,e=>{"use strict";var t=e.i(43476),r=e.i(71645),a=e.i(18566),n=e.i(14876),s=e.i(41324);e.s(["ActiveGradeRouteSync",0,function(){let e=(0,a.usePathname)(),{person:l,isLoggedIn:i,isReady:o}=(0,s.useActivePerson)(),d=function(e){let t=e.match(/^\/learn\/(?:grade-)?([1-6])(?:\/|$)/);if(t)return Number(t[1]);let r=e.match(/^\/courses\/grade-([1-6])(?:\/|$)/);if(r)return Number(r[1]);let a=e.match(/^\/(?:lesson|practice|handwriting)\/grade-([1-6])-/);return a?Number(a[1]):null}(e),c=!!(o&&i&&"student"===l.role&&d&&d!==l.grade);return((0,r.useEffect)(()=>{var t;if(!c)return;let r=(t=l.grade,/^\/learn\/(?:grade-)?[1-6](?:\/|$)/.test(e)?e.replace(/^\/learn\/(?:grade-)?[1-6]/,`/learn/${t}`):/^\/courses\/grade-[1-6](?:\/|$)/.test(e)?e.replace(/^\/courses\/grade-[1-6]/,`/courses/grade-${t}`):e.replace(/^(\/(?:lesson|practice|handwriting)\/)grade-[1-6]-/,`$1grade-${t}-`)),a=`${(0,n.getExportSafeHref)(r)}${window.location.search}${window.location.hash}`;window.location.replace(a)},[e,l.grade,c]),o&&!c)?null:(0,t.jsx)("div",{className:"fixed inset-0 z-[100] grid place-items-center bg-[#fffaf3]/95 p-5 backdrop-blur-md",role:"status","aria-live":"polite",children:(0,t.jsxs)("div",{className:"w-full max-w-md rounded-[2rem] border border-white bg-white/90 p-7 text-center shadow-warm",children:[(0,t.jsx)("span",{className:"mx-auto grid h-14 w-14 place-items-center rounded-2xl bg-butter text-2xl","aria-hidden":"true",children:"☀"}),(0,t.jsx)("strong",{className:"mt-4 block text-2xl font-black text-ink",children:o?`正在切換到小${l.grade}課程`:"正在讀取目前學習年級"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"晨光會自動載入這位學習者正確的課程內容。"})]})})}],55634)},10400,e=>{"use strict";var t=e.i(43476),r=e.i(82697),a=e.i(22468),n=e.i(55634);e.s(["AppShell",0,function({children:e}){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.ActiveGradeRouteSync,{}),(0,t.jsx)(a.AppSidebar,{}),(0,t.jsxs)("main",{className:"app-reading-scale min-h-screen min-w-0 overflow-x-clip px-4 pb-28 pt-4 lg:ml-64 lg:px-10 lg:py-6",children:[(0,t.jsx)("div",{className:"sticky top-3 z-40 mb-5 lg:hidden",children:(0,t.jsxs)("div",{className:"flex min-w-0 items-center justify-between gap-2 rounded-3xl border border-white/80 bg-white/90 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsx)("div",{className:"min-w-0 flex-1",children:(0,t.jsx)(r.BrandHeader,{showPerson:!1})}),(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,t.jsx)(a.PersonSwitcher,{compact:!0}),(0,t.jsx)(a.MobileMenu,{})]})]})}),(0,t.jsx)("div",{className:"mx-auto min-w-0 w-full max-w-7xl",children:e}),(0,t.jsx)(a.MobileQuickNav,{})]})]})}])},98239,e=>{"use strict";var t=e.i(43476);e.s(["SectionCard",0,function({children:e,className:r=""}){return(0,t.jsx)("section",{className:`min-w-0 overflow-hidden rounded-[1.75rem] border border-softline/80 bg-white/90 p-5 shadow-warm sm:p-6 md:p-8 ${r}`,children:e})}])},51772,e=>{"use strict";var t=e.i(43476);let r={green:"border-green-100 bg-green-50 text-green-950",blue:"border-blue-100 bg-blue-50 text-blue-950",cream:"border-softline bg-cream text-stone-700"};e.s(["InfoCard",0,function({title:e,children:a,tone:n="green",className:s=""}){return(0,t.jsxs)("div",{className:`rounded-2xl border p-5 ${r[n]} ${s}`,children:[e?(0,t.jsx)("p",{className:"mb-2 font-black",children:e}):null,(0,t.jsx)("div",{className:"leading-8",children:a})]})}])},30599,e=>{"use strict";var t=e.i(43476);e.s(["LearningPageFrame",0,function({children:e}){return(0,t.jsx)("div",{className:"mx-auto flex w-full max-w-[1480px] flex-col gap-6 pb-10",children:e})}])},82836,e=>{"use strict";var t=e.i(43476);e.s(["ResultBox",0,function({title:e,children:r}){return(0,t.jsxs)("section",{className:"rounded-2xl border border-softline bg-[#f4f1eb] p-5 text-stone-700",children:[(0,t.jsx)("p",{className:"text-lg font-black text-ink",children:e}),(0,t.jsx)("div",{className:"mt-3 leading-8",children:r})]})}])},65812,e=>{"use strict";e.s(["weeklyPlans",0,[{id:"grade-1-week-01",grade:"grade-1",week:1,theme:"小一安心開學週",goal:"用很短的每日任務,建立國文、英文、數學的學習安全感。",dailyTasks:[{day:"星期一",task:"國文:認識 ㄅㄆㄇㄈ,英文:Hello, teacher.,數學:數 1 到 5。"},{day:"星期二",task:"國文:看生活字,英文:book、pencil,數學:排出 6 個物品。"},{day:"星期三",task:"國文:朗讀短句,英文:Thank you.,數學:比哪邊多。"},{day:"星期四",task:"國文:說詞語,英文:This is my book.,數學:合起來是幾個。"},{day:"星期五",task:"親子複習:三科各選一個孩子最喜歡的任務。"}],parentTips:["每天 10-20 分鐘即可","先鼓勵開口與嘗試","不要把陪跑變成考試"]},{id:"grade-2-week-01",grade:"grade-2",week:1,theme:"小二生活應用週",goal:"把閱讀、生活英文與加減練習放進每天熟悉的情境。",dailyTasks:[{day:"星期一",task:"國文:讀一段生活短文,英文:介紹家人,數學:複習兩位數。"},{day:"星期二",task:"國文:找出文章人物,英文:說出兩種食物,數學:完成一題加法。"},{day:"星期三",task:"國文:用詞語造句,英文:I like apples.,數學:完成一題減法。"},{day:"星期四",task:"國文:朗讀並說重點,英文:描述每天的動作,數學:解一題生活題。"},{day:"星期五",task:"親子複習:各挑一個本週最有把握的內容說給家長聽。"}],parentTips:["先請孩子說出想法","答錯時把題目換成生活例子","每天 15 分鐘就很好"]},{id:"grade-3-week-01",grade:"grade-3",week:1,theme:"小三閱讀與表達週",goal:"練習抓重點、完整表達,並把乘除概念連到生活。",dailyTasks:[{day:"星期一",task:"國文:閱讀短文找主旨,英文:read、write、listen,數學:乘法概念。"},{day:"星期二",task:"國文:整理人物與事件,英文:I have a question.,數學:用分組理解除法。"},{day:"星期三",task:"國文:寫兩句閱讀心得,英文:介紹學習動作,數學:完成一題生活應用。"},{day:"星期四",task:"國文:口頭摘要短文,英文:說出地點與感受,數學:檢查解題步驟。"},{day:"星期五",task:"親子複習:孩子自己選一科,說明這週學會了什麼。"}],parentTips:["多問孩子怎麼想","先說清楚再追求寫得完整","完成後讓孩子自己選明天任務"]},{id:"grade-4-week-01",grade:"grade-4",week:1,theme:"小四理解與應用週",goal:"把摘要、生活英文和多步驟計算放進每天可完成的小任務。",dailyTasks:[{day:"星期一",task:"國語:找段落重點,英文:說出起床時間,數學:讀一個大數。"},{day:"星期二",task:"國語:練習一句摘要,英文:介紹興趣,數學:完成乘除計算。"},{day:"星期三",task:"國語:找出因果線索,英文:說交通方式,數學:比較分數。"},{day:"星期四",task:"國語:讀一段說明文,英文:完成比較句,數學:算面積。"},{day:"星期五",task:"本週回顧:選一科說明自己的做法與答案。"}],parentTips:["請孩子先說方法","一次只處理一個重點","用追問代替直接公布答案"]},{id:"grade-5-week-01",grade:"grade-5",week:1,theme:"小五策略與表達週",goal:"練習比較、整理與說明,讓孩子逐步建立自己的學習策略。",dailyTasks:[{day:"星期一",task:"國語:辨析兩個近義詞,英文:說一個健康習慣,數學:小數乘法。"},{day:"星期二",task:"國語:找複句關係,英文:看地圖問路,數學:分數計算。"},{day:"星期三",task:"國語:分辨觀點與事實,英文:說昨天的經驗,數學:因數倍數。"},{day:"星期四",task:"國語:比較兩段文本,英文:說明明天計畫,數學:面積或體積。"},{day:"星期五",task:"本週回顧:整理一個最有效的閱讀或解題方法。"}],parentTips:["鼓勵孩子留下草稿","請孩子說明證據","先看策略,再看最後答案"]},{id:"grade-6-week-01",grade:"grade-6",week:1,theme:"小六統整與銜接週",goal:"統整國語、英文與數學重點,練習自主規劃、檢查和修正。",dailyTasks:[{day:"星期一",task:"國語:讀文本找推論,英文:設定學習目標,數學:分數小數四則。"},{day:"星期二",task:"國語:找論點與證據,英文:用 because 說原因,數學:比與比值。"},{day:"星期三",task:"國語:比較兩篇文章,英文:談環保行動,數學:速率問題。"},{day:"星期四",task:"國語:練習完整表達,英文:短文找關鍵字,數學:比例尺或體積。"},{day:"星期五",task:"本週回顧:自己選一題,說明如何檢查與修正。"}],parentTips:["讓孩子自己排順序","提醒檢查而不代替作答","肯定能說明與修正的能力"]}]])},10172,e=>{"use strict";var t=e.i(43476),r=e.i(71645),a=e.i(10400),n=e.i(73887);function s({children:e,href:r,onClick:a,type:l="button",className:i=""}){return(0,t.jsx)(n.PrimaryButton,{href:r,onClick:a,type:l,className:i,children:e})}var l=e.i(97750);function i({day:e,subject:r,task:a,parentTip:n,completed:s=!1,onToggle:o}){return(0,t.jsxs)("article",{className:`flex min-h-80 flex-col rounded-[1.5rem] border p-5 shadow-sm ${s?"border-green-200 bg-green-50":"border-softline/80 bg-white"}`,children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-black uppercase tracking-[0.08em] text-amber-700",children:e}),(0,t.jsx)("h3",{className:"mt-2 text-2xl font-black text-ink",children:r})]}),(0,t.jsx)("span",{className:`rounded-full px-3 py-1 text-sm font-bold ${s?"bg-green-100 text-green-800":"bg-butter text-amber-900"}`,children:s?"已完成":"未完成"})]}),(0,t.jsx)("p",{className:"mt-5 leading-8 text-stone-700",children:a}),n?(0,t.jsxs)("div",{className:"mt-4 rounded-2xl bg-blue-50 p-4 text-sm leading-7 text-blue-950",children:[(0,t.jsx)("strong",{className:"block",children:"家長小提醒"}),n]}):null,o?(0,t.jsx)(l.SecondaryButton,{className:"mt-auto w-full",onClick:o,children:s?"取消完成":"標記完成"}):null]})}var o=e.i(51772),d=e.i(30599),c=e.i(42391),u=e.i(82836),m=e.i(98239),h=e.i(65812),g=e.i(62312),x=e.i(34295),f=e.i(41324);let p="chenguang-weekly-plan-completed",b=["國語","英文","數學","生活任務","本週回顧"],w={1:{activities:["國語:睡前一起讀一句短句。","英文:吃飯、收玩具時自然說 Thank you.","數學:用家裡小物品做數量比較。"],review:"孩子是否願意開始?是否有說出一句話?是否能在低壓力下完成任務?"},2:{activities:["國語:讀一小段故事,請孩子說出人物和事情。","英文:用 This is my ... 介紹一位家人或一件物品。","數學:用零錢練習湊出 50 元或 100 元。"],review:"孩子能不能說出短文重點、完成一個生活英文句子,並說明加減計算的方法?"},3:{activities:["國語:讀完短文後,用兩句話說出主旨與感受。","英文:用 I usually ... 說一個每天會做的活動。","數學:用家中物品做分組,說明乘法或除法。"],review:"孩子能不能整理段落重點、說出完整英文句,並用自己的話解釋乘除或分數概念?"},4:{activities:["國語:把一段內容濃縮成一句重點。","英文:用時間和頻率說自己的作息。","數學:選一題把每一步寫清楚。"],review:"孩子是否能抓到段落重點、完成生活問答,並解釋計算步驟?"},5:{activities:["國語:比較兩段內容有哪些相同和不同。","英文:用過去式說昨天做過的事。","數學:用圖或算式說明分數與面積。"],review:"孩子是否會選擇閱讀策略、使用正確時態,並檢查計算是否合理?"},6:{activities:["國語:找出一個論點和支持證據。","英文:用 because 或 so 連接原因結果。","數學:完成一題比例或速率並驗算。"],review:"孩子是否能自主規劃、提出理由,並在發現錯誤後自己修正?"}};e.s(["default",0,function(){let{person:e}=(0,f.useActivePerson)(),n=h.weeklyPlans.find(t=>t.grade===(0,g.getGradeIdByNumber)(e.grade))??h.weeklyPlans[0],l=w[e.grade]??w[1],[y,v]=(0,r.useState)([]);(0,r.useEffect)(()=>{v((0,x.readPersonStorage)(p,e.id,[]))},[e.id]);let k=y.length,j=(0,r.useMemo)(()=>`本週已完成 ${k} / ${n.dailyTasks.length} 天`,[k,n.dailyTasks.length]);return(0,t.jsx)(a.AppShell,{children:(0,t.jsxs)(d.LearningPageFrame,{children:[(0,t.jsx)(c.PageHeader,{eyebrow:"Weekly Plan",title:`${e.name} 的一週課程`,description:`${n.theme}:${n.goal}`,action:(0,t.jsx)(s,{onClick:()=>window.print(),children:"列印"})}),(0,t.jsxs)(m.SectionCard,{children:[(0,t.jsxs)("div",{className:"flex flex-col gap-4 md:flex-row md:items-center md:justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-bold text-amber-700",children:"教師可直接使用"}),(0,t.jsxs)("h2",{className:"mt-2 text-3xl font-black",children:["第 ",n.week," 週學習安排"]})]}),(0,t.jsx)("span",{className:"w-fit rounded-full bg-mint px-4 py-2 font-bold text-green-800",children:j})]}),(0,t.jsx)("div",{className:"mt-7 grid gap-4 xl:grid-cols-5",children:n.dailyTasks.map((r,a)=>(0,t.jsx)(i,{day:r.day,subject:b[a]??"每日任務",task:r.task,parentTip:n.parentTips[a%n.parentTips.length],completed:y.includes(r.day),onToggle:()=>{var t;return t=r.day,void v(r=>{let a=r.includes(t)?r.filter(e=>e!==t):[...r,t];return(0,x.writePersonStorage)(p,e.id,a),a})}},r.day))})]}),(0,t.jsxs)("section",{className:"grid gap-5 lg:grid-cols-2",children:[(0,t.jsxs)(m.SectionCard,{children:[(0,t.jsx)("p",{className:"font-bold text-amber-700",children:"延伸內容"}),(0,t.jsx)("h2",{className:"mt-2 text-3xl font-black",children:"本週親子活動"}),(0,t.jsx)("ul",{className:"mt-5 grid gap-3 text-lg leading-8 text-stone-700",children:l.activities.map(e=>(0,t.jsx)("li",{children:e},e))})]}),(0,t.jsxs)(m.SectionCard,{children:[(0,t.jsx)("p",{className:"font-bold text-amber-700",children:"Weekly Review"}),(0,t.jsx)("h2",{className:"mt-2 text-3xl font-black",children:"本週學習回顧"}),(0,t.jsxs)("div",{className:"mt-5 grid gap-4",children:[(0,t.jsx)(o.InfoCard,{tone:"green",title:"陪讀觀察",children:l.review}),(0,t.jsxs)(u.ResultBox,{title:"本週狀態",children:[j,"。想記下學習情況時,可使用每日紀錄。"]})]})]})]})]})})}],10172)}]);
_next/static/chunks/30wzzb4czv44x.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,97750,e=>{"use strict";var t=e.i(43476),a=e.i(14876);e.s(["SecondaryButton",0,function({children:e,href:r,onClick:o,type:s="button",className:n="",disabled:i=!1}){let l=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-butter px-6 py-3 text-center font-black text-amber-900 shadow-sm transition hover:-translate-y-0.5 hover:bg-amber-100 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-honey/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${n}`;return r&&!i?(0,t.jsx)(a.ExportSafeLink,{className:l,href:r,children:e}):(0,t.jsx)("button",{className:l,type:s,onClick:o,disabled:i,children:e})}])},73887,e=>{"use strict";var t=e.i(43476),a=e.i(14876);e.s(["PrimaryButton",0,function({children:e,href:r,onClick:o,type:s="button",className:n="",disabled:i=!1}){let l=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-coral px-6 py-3 text-center font-black text-white shadow-warm transition hover:-translate-y-0.5 hover:brightness-105 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-coral/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${n}`;return r&&!i?(0,t.jsx)(a.ExportSafeLink,{className:l,href:r,children:e}):(0,t.jsx)("button",{className:l,type:s,onClick:o,disabled:i,children:e})}])},95057,(e,t,a)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0});var r={formatUrl:function(){return i},formatWithValidation:function(){return d},urlObjectKeys:function(){return l}};for(var o in r)Object.defineProperty(a,o,{enumerable:!0,get:r[o]});let s=e.r(90809)._(e.r(98183)),n=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:a}=e,r=e.protocol||"",o=e.pathname||"",i=e.hash||"",l=e.query||"",d=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?d=t+e.host:a&&(d=t+(~a.indexOf(":")?`[${a}]`:a),e.port&&(d+=":"+e.port)),l&&"object"==typeof l&&(l=String(s.urlQueryToSearchParams(l)));let c=e.search||l&&`?${l}`||"";return r&&!r.endsWith(":")&&(r+=":"),e.slashes||(!r||n.test(r))&&!1!==d?(d="//"+(d||""),o&&"/"!==o[0]&&(o="/"+o)):d||(d=""),i&&"#"!==i[0]&&(i="#"+i),c&&"?"!==c[0]&&(c="?"+c),o=o.replace(/[?#]/g,encodeURIComponent),c=c.replace("#","%23"),`${r}${d}${o}${c}${i}`}let l=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function d(e){return i(e)}},18581,(e,t,a)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0}),Object.defineProperty(a,"useMergedRef",{enumerable:!0,get:function(){return o}});let r=e.r(71645);function o(e,t){let a=(0,r.useRef)(null),o=(0,r.useRef)(null);return(0,r.useCallback)(r=>{if(null===r){let e=a.current;e&&(a.current=null,e());let t=o.current;t&&(o.current=null,t())}else e&&(a.current=s(e,r)),t&&(o.current=s(t,r))},[e,t])}function s(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let a=e(t);return"function"==typeof a?a:()=>e(null)}}("function"==typeof a.default||"object"==typeof a.default&&null!==a.default)&&void 0===a.default.__esModule&&(Object.defineProperty(a.default,"__esModule",{value:!0}),Object.assign(a.default,a),t.exports=a.default)},73668,(e,t,a)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0}),Object.defineProperty(a,"isLocalURL",{enumerable:!0,get:function(){return s}});let r=e.r(18967),o=e.r(52817);function s(e){if(!(0,r.isAbsoluteUrl)(e))return!0;try{let t=(0,r.getLocationOrigin)(),a=new URL(e,t);return a.origin===t&&(0,o.hasBasePath)(a.pathname)}catch(e){return!1}}},84508,(e,t,a)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0}),Object.defineProperty(a,"errorOnce",{enumerable:!0,get:function(){return r}});let r=e=>{}},22016,(e,t,a)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0});var r={default:function(){return y},useLinkStatus:function(){return f}};for(var o in r)Object.defineProperty(a,o,{enumerable:!0,get:r[o]});let s=e.r(90809),n=e.r(43476),i=s._(e.r(71645)),l=e.r(95057),d=e.r(8372),c=e.r(18581),u=e.r(18967),h=e.r(5550);e.r(33525);let g=e.r(88540),m=e.r(91949),p=e.r(73668),x=e.r(9396);function y(t){var a,r;let o,s,y,[f,b]=(0,i.useOptimistic)(m.IDLE_LINK_STATUS),v=(0,i.useRef)(null),{href:z,as:k,children:j,prefetch:I=null,passHref:N,replace:S,shallow:T,scroll:P,onClick:E,onMouseEnter:$,onTouchStart:q,legacyBehavior:L=!1,onNavigate:_,transitionTypes:C,ref:R,unstable_dynamicOnHover:O,...A}=t;o=j,L&&("string"==typeof o||"number"==typeof o)&&(o=(0,n.jsx)("a",{children:o}));let M=i.default.useContext(d.AppRouterContext),W=!1!==I,H=!1!==I?null===(r=I)||"auto"===r?x.FetchStrategy.PPR:x.FetchStrategy.Full:x.FetchStrategy.PPR,G="string"==typeof(a=k||z)?a:(0,l.formatUrl)(a);if(L){if(o?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});s=i.default.Children.only(o)}let B=L?s&&"object"==typeof s&&s.ref:R,U=i.default.useCallback(e=>(null!==M&&(v.current=(0,m.mountLinkInstance)(e,G,M,H,W,b)),()=>{v.current&&((0,m.unmountLinkForCurrentNavigation)(v.current),v.current=null),(0,m.unmountPrefetchableInstance)(e)}),[W,G,M,H,b]),D={ref:(0,c.useMergedRef)(U,B),onClick(t){L||"function"!=typeof E||E(t),L&&s.props&&"function"==typeof s.props.onClick&&s.props.onClick(t),!M||t.defaultPrevented||function(t,a,r,o,s,n,l){if("u">typeof window){let d,{nodeName:c}=t.currentTarget;if("A"===c.toUpperCase()&&((d=t.currentTarget.getAttribute("target"))&&"_self"!==d||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,p.isLocalURL)(a)){o&&(t.preventDefault(),location.replace(a));return}if(t.preventDefault(),n){let e=!1;if(n({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);i.default.startTransition(()=>{u(a,o?"replace":"push",!1===s?g.ScrollBehavior.NoScroll:g.ScrollBehavior.Default,r.current,l)})}}(t,G,v,S,P,_,C)},onMouseEnter(e){L||"function"!=typeof $||$(e),L&&s.props&&"function"==typeof s.props.onMouseEnter&&s.props.onMouseEnter(e),M&&W&&(0,m.onNavigationIntent)(e.currentTarget,!0===O)},onTouchStart:function(e){L||"function"!=typeof q||q(e),L&&s.props&&"function"==typeof s.props.onTouchStart&&s.props.onTouchStart(e),M&&W&&(0,m.onNavigationIntent)(e.currentTarget,!0===O)}};return(0,u.isAbsoluteUrl)(G)?D.href=G:L&&!N&&("a"!==s.type||"href"in s.props)||(D.href=(0,h.addBasePath)(G)),y=L?i.default.cloneElement(s,D):(0,n.jsx)("a",{...A,...D,children:o}),(0,n.jsx)(w.Provider,{value:f,children:y})}e.r(84508);let w=(0,i.createContext)(m.IDLE_LINK_STATUS),f=()=>(0,i.useContext)(w);("function"==typeof a.default||"object"==typeof a.default&&null!==a.default)&&void 0===a.default.__esModule&&(Object.defineProperty(a.default,"__esModule",{value:!0}),Object.assign(a.default,a),t.exports=a.default)},14876,e=>{"use strict";var t=e.i(43476),a=e.i(22016);function r(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:a,suffix:r}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===a?`/index.html${r}`:/\.[a-z0-9]+$/i.test(a)?e:`${a.replace(/\/+$/,"")}/index.html${r}`}e.s(["ExportSafeLink",0,function({href:e,children:o,...s}){return"string"==typeof e?(0,t.jsx)("a",{href:r(e),...s,children:o}):(0,t.jsx)(a.default,{href:e,...s,children:o})},"getExportSafeHref",0,r])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let a=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function r(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return a.find(t=>t.grade===e)},"getGradeIdByNumber",0,r,"grades",0,a],62312);let o=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],s={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function n(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return o.find(e=>e.id===t)??s}function i(e){if(!e)return s.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return o.some(e=>e.id===t)?t:s.id}e.s(["currentStudent",0,s,"getCurrentStudentGradeId",0,function(e=s){return r(e.grade)},"getPersonById",0,n,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,o,"normalizePersonId",0,i],7728);let l="chenguang-active-person-id",d="chenguang-active-person-change",c="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,a]=(0,t.useState)(s.id),[r,o]=(0,t.useState)(!1),[h,g]=(0,t.useState)(!1);function m(e){let t=i(e);a(t),window.localStorage.setItem(l,t),window.dispatchEvent(new Event(d))}return(0,t.useEffect)(()=>{let e=i(window.localStorage.getItem(l));function t(){let e=i(window.localStorage.getItem(l));a(e),window.localStorage.setItem(l,e)}function r(){o(!!window.localStorage.getItem(c))}return a(e),window.localStorage.setItem(l,e),o(!!window.localStorage.getItem(c)),g(!0),window.addEventListener(d,t),window.addEventListener("storage",t),window.addEventListener(u,r),()=>{window.removeEventListener(d,t),window.removeEventListener("storage",t),window.removeEventListener(u,r)}},[]),{person:n(e),switchPerson:m,signIn:function(e){let t=i(e);m(t);let a=n(t);window.localStorage.setItem(c,JSON.stringify({personId:t,role:a.role,signedInAt:new Date().toISOString()})),o(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(c),o(!1),window.dispatchEvent(new Event(u))},isLoggedIn:r,isReady:h}}],41324)},82697,e=>{"use strict";var t=e.i(43476),a=e.i(14876),r=e.i(7728),o=e.i(62312),s=e.i(41324);e.s(["BrandHeader",0,function({showPerson:e=!0}){let{person:n,isLoggedIn:i}=(0,s.useActivePerson)(),l=(0,o.getGradeByNumber)(n.grade),d=i?`${(0,r.getPersonDisplayName)(n)}|${"student"===n.role?(0,r.getPersonSubtitle)(n):l?.shortName??`小${n.grade}`}`:"訪客模式";return(0,t.jsxs)(a.ExportSafeLink,{href:i?"/dashboard":"/",className:"flex min-w-0 items-center gap-3 text-ink",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 shrink-0 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{className:"min-w-0 leading-tight",children:[(0,t.jsx)("strong",{className:"block truncate text-xl font-black",children:"晨光"}),(0,t.jsx)("small",{className:"block truncate text-sm font-bold text-stone-500",children:e?d:"國小學習陪跑系統"})]})]})}])},18566,(e,t,a)=>{t.exports=e.r(76562)},22468,e=>{"use strict";var t=e.i(43476),a=e.i(71645),r=e.i(18566),o=e.i(14876),s=e.i(7728),n=e.i(62312),i=e.i(41324);let l=[{label:"登入",href:"/login"},{label:"訪客體驗",href:"/courses"},{label:"註冊登入",href:"/register",primary:!0}];function d(e,t="student"){let a=[{label:"課程首頁",href:"/dashboard",icon:"⌂"},{label:"每日 10 題",href:"/daily-quiz",icon:"10"},{label:"錯題 AI 說明",href:"/wrong-review",icon:"AI"},{label:"進度月曆",href:"/parent-weekly-report",icon:"月"},{label:"英文練習",href:"/practice",icon:"Aa"},{label:"手寫出題",href:"/word-scanner",icon:"掃"},{label:"課程總覽",href:"/courses",icon:"▦"},{label:"國語練習",href:`/courses/grade-${e}/chinese/basic`,icon:"ㄅ"},{label:"數學練習",href:`/courses/grade-${e}/math/basic`,icon:"123"},{label:"每日紀錄",href:"/daily-record",icon:"✓"},{label:"週計畫",href:"/weekly-plan",icon:"□"},{label:"登出",href:"/",icon:"出"}];return"parent"===t?a.filter(e=>["課程首頁","進度月曆","每日紀錄","週計畫","課程總覽","登出"].includes(e.label)):"teacher"===t?a.filter(e=>["課程首頁","課程總覽","國語練習","英文練習","數學練習","週計畫","手寫出題","登出"].includes(e.label)):a.filter(e=>["課程首頁","每日 10 題","英文練習","國語練習","數學練習","手寫出題","錯題 AI 說明","登出"].includes(e.label))}function c(e,t){return"/dashboard"===t?"/dashboard"===e:"/courses"===t?"/courses"===e:t.startsWith("/courses/")?e===t||e.startsWith(`${t}/`):e===t}function u({compact:e=!1}){let{person:r}=(0,i.useActivePerson)(),[o,l]=(0,a.useState)(!1),d=(0,n.getGradeByNumber)(r.grade),c="student"===r.role?(0,s.getPersonSubtitle)(r):d?.name??`國小${r.grade}年級`,h=(0,t.jsx)("div",{className:"grid gap-2",children:s.mockPeople.map(e=>{let a=(0,n.getGradeByNumber)(e.grade),o=e.id===r.id;return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;let a;return t=e.id,l(!1),a=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login",void window.location.assign(`${a}?person=${encodeURIComponent(t)}`)},className:`rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${o?"bg-coral text-white shadow-sm":"bg-white text-stone-700 hover:bg-butter"}`,children:[(0,t.jsxs)("span",{className:"block text-xs font-black opacity-80",children:[(0,s.getRoleLabel)(e.role),"模式"]}),(0,t.jsx)("span",{className:"mt-1 block text-base font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-75",children:"student"===e.role?(0,s.getPersonSubtitle)(e):a?.name??`國小${e.grade}年級`})]},e.id)})});return e?(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>l(e=>!e),className:"flex min-h-11 max-w-[5.5rem] items-center gap-1 rounded-2xl bg-butter px-2 text-left text-amber-950 shadow-sm sm:max-w-none sm:gap-2 sm:px-3","aria-expanded":o,"aria-label":"切換目前使用者",children:[(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("strong",{className:"block max-w-20 truncate text-sm font-black",children:r.name}),(0,t.jsx)("small",{className:"block text-[11px] font-bold opacity-70",children:d?.shortName??`小${r.grade}`})]}),(0,t.jsx)("span",{"aria-hidden":"true",className:"text-xs",children:"⌄"})]}),o?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100vh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsx)("strong",{className:"text-base font-black text-ink",children:"切換使用者"}),(0,t.jsx)("button",{type:"button",onClick:()=>l(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉帳號選單",children:"×"})]}),h]}):null]}):(0,t.jsxs)("section",{className:"rounded-3xl border border-amber-100 bg-cream p-3 shadow-sm",children:[(0,t.jsx)("button",{type:"button",onClick:()=>l(e=>!e),className:"w-full rounded-[1.35rem] bg-white/80 p-3 text-left ring-1 ring-transparent transition hover:bg-white hover:ring-coral/30","aria-expanded":o,"aria-label":"切換目前使用者",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("p",{className:"text-xs font-black text-amber-700",children:[(0,s.getRoleLabel)(r.role),"模式"]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-2xl font-black leading-tight text-ink",children:r.name}),(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"student"===r.role?"匿名檔案":(0,s.getRoleLabel)(r.role)})]}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:c})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-coral px-3 py-2 text-xs font-black text-white shadow-sm",children:"切換帳號"})]})}),o?(0,t.jsx)("div",{className:"mt-3",children:h}):null]})}e.s(["AppSidebar",0,function(){let e=(0,r.usePathname)(),{person:a,isLoggedIn:s,signOut:n}=(0,i.useActivePerson)();function h(){n();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsx)("aside",{className:"fixed inset-y-0 left-0 z-20 hidden w-64 flex-col border-r border-softline/80 bg-white/85 backdrop-blur-xl lg:flex",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 py-6",children:[(0,t.jsxs)(o.ExportSafeLink,{className:"flex items-center gap-3",href:s?"/dashboard":"/",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"text-sm font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),s?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{}),(0,t.jsx)("nav",{className:"grid gap-2 pr-1",children:d(a.grade,a.role).map(a=>{let r=c(e,a.href),s=`flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left transition ${r?"bg-butter text-amber-900 shadow-sm":"text-stone-600 hover:bg-butter hover:text-amber-900"}`,n=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 place-items-center rounded-xl text-sm font-black shadow-sm ${r?"bg-white text-coral":"bg-white text-stone-500"}`,children:a.icon}),(0,t.jsx)("span",{className:"font-bold",children:a.label})]});return"登出"===a.label?(0,t.jsx)("button",{type:"button",onClick:h,className:s,children:n},a.label):(0,t.jsx)(o.ExportSafeLink,{href:a.href,className:s,children:n},a.label)})})]}):(0,t.jsx)("div",{className:"grid gap-3",children:l.map(e=>(0,t.jsx)(o.ExportSafeLink,{href:e.href,className:e.primary?"rounded-2xl bg-coral px-4 py-3 text-center font-black text-white shadow-warm transition hover:brightness-105":"rounded-2xl border border-softline bg-white px-4 py-3 text-center font-black text-amber-800 transition hover:bg-butter",children:e.label},e.label))}),s?(0,t.jsxs)(o.ExportSafeLink,{href:"student"===a.role?"/wrong-review":"/parent-weekly-report",className:"mt-auto rounded-2xl border border-green-100 bg-green-50 p-4 text-sm text-green-900 transition hover:-translate-y-0.5 hover:bg-green-100",children:[(0,t.jsx)("span",{className:"block text-xs font-black text-green-700",children:"本週學習摘要"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg",children:"每天一小步,進度看得見"}),(0,t.jsx)("span",{className:"mt-2 block font-bold text-green-700",children:"查看進度與需要再練的內容 →"})]}):null]})})},"MobileMenu",0,function(){let e=(0,r.usePathname)(),{person:s,signOut:n}=(0,i.useActivePerson)(),[l,u]=(0,a.useState)(!1),h=d(s.grade,s.role);function g(){n();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsxs)("div",{className:"shrink-0 lg:hidden",children:[(0,t.jsx)("button",{type:"button",onClick:()=>u(e=>!e),className:"grid min-h-11 min-w-11 place-items-center rounded-2xl bg-white text-xl font-black text-amber-900 shadow-sm active:scale-[0.98]","aria-expanded":l,"aria-label":"開啟完整功能選單",children:l?"×":"☰"}),l?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100dvh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("strong",{className:"block text-base font-black text-ink",children:"全部功能"}),(0,t.jsxs)("span",{className:"text-xs font-bold text-stone-500",children:["依 ",s.name," 的身分顯示"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉功能選單",children:"×"})]}),(0,t.jsx)("nav",{className:"grid grid-cols-2 gap-2",children:h.map(a=>{let r=c(e,a.href),s=`flex min-h-16 items-center gap-3 rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${r?"bg-coral text-white":"bg-white text-stone-700"}`,n=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 shrink-0 place-items-center rounded-xl text-sm font-black ${r?"bg-white/20":"bg-butter text-amber-900"}`,children:a.icon}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:a.label})]});return"登出"===a.label?(0,t.jsx)("button",{type:"button",onClick:g,className:s,children:n},a.label):(0,t.jsx)(o.ExportSafeLink,{href:a.href,onClick:()=>u(!1),className:s,children:n},a.label)})})]}):null]})},"MobileQuickNav",0,function(){var e;let a,s=(0,r.usePathname)(),{person:n}=(0,i.useActivePerson)(),l=(a=d(n.grade,e=n.role),("guest"===e?["課程首頁","課程總覽"]:({student:["課程首頁","每日 10 題","英文練習","課程總覽"],parent:["課程首頁","進度月曆","每日紀錄","週計畫"],teacher:["課程首頁","課程總覽","週計畫","手寫出題"]})[e]).map(e=>a.find(t=>t.label===e)).filter(e=>!!e));return(0,t.jsx)("nav",{className:"fixed inset-x-3 bottom-[max(0.75rem,env(safe-area-inset-bottom))] z-50 grid grid-cols-4 gap-1 rounded-3xl border border-white/80 bg-white/90 p-2 shadow-warm backdrop-blur-xl lg:hidden","aria-label":"主要功能",children:l.map(e=>{let a=c(s,e.href);return(0,t.jsxs)(o.ExportSafeLink,{href:e.href,className:`flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl px-1 py-2 text-center transition active:scale-[0.98] ${a?"bg-coral text-white shadow-sm":"text-stone-600"}`,children:[(0,t.jsx)("span",{className:"text-sm font-black",children:e.icon}),(0,t.jsx)("span",{className:"w-full truncate text-[11px] font-black",children:e.label})]},e.label)})})},"PersonSwitcher",0,u])},55634,e=>{"use strict";var t=e.i(43476),a=e.i(71645),r=e.i(18566),o=e.i(14876),s=e.i(41324);e.s(["ActiveGradeRouteSync",0,function(){let e=(0,r.usePathname)(),{person:n,isLoggedIn:i,isReady:l}=(0,s.useActivePerson)(),d=function(e){let t=e.match(/^\/learn\/(?:grade-)?([1-6])(?:\/|$)/);if(t)return Number(t[1]);let a=e.match(/^\/courses\/grade-([1-6])(?:\/|$)/);if(a)return Number(a[1]);let r=e.match(/^\/(?:lesson|practice|handwriting)\/grade-([1-6])-/);return r?Number(r[1]):null}(e),c=!!(l&&i&&"student"===n.role&&d&&d!==n.grade);return((0,a.useEffect)(()=>{var t;if(!c)return;let a=(t=n.grade,/^\/learn\/(?:grade-)?[1-6](?:\/|$)/.test(e)?e.replace(/^\/learn\/(?:grade-)?[1-6]/,`/learn/${t}`):/^\/courses\/grade-[1-6](?:\/|$)/.test(e)?e.replace(/^\/courses\/grade-[1-6]/,`/courses/grade-${t}`):e.replace(/^(\/(?:lesson|practice|handwriting)\/)grade-[1-6]-/,`$1grade-${t}-`)),r=`${(0,o.getExportSafeHref)(a)}${window.location.search}${window.location.hash}`;window.location.replace(r)},[e,n.grade,c]),l&&!c)?null:(0,t.jsx)("div",{className:"fixed inset-0 z-[100] grid place-items-center bg-[#fffaf3]/95 p-5 backdrop-blur-md",role:"status","aria-live":"polite",children:(0,t.jsxs)("div",{className:"w-full max-w-md rounded-[2rem] border border-white bg-white/90 p-7 text-center shadow-warm",children:[(0,t.jsx)("span",{className:"mx-auto grid h-14 w-14 place-items-center rounded-2xl bg-butter text-2xl","aria-hidden":"true",children:"☀"}),(0,t.jsx)("strong",{className:"mt-4 block text-2xl font-black text-ink",children:l?`正在切換到小${n.grade}課程`:"正在讀取目前學習年級"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"晨光會自動載入這位學習者正確的課程內容。"})]})})}],55634)},10400,e=>{"use strict";var t=e.i(43476),a=e.i(82697),r=e.i(22468),o=e.i(55634);e.s(["AppShell",0,function({children:e}){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.ActiveGradeRouteSync,{}),(0,t.jsx)(r.AppSidebar,{}),(0,t.jsxs)("main",{className:"app-reading-scale min-h-screen min-w-0 overflow-x-clip px-4 pb-28 pt-4 lg:ml-64 lg:px-10 lg:py-6",children:[(0,t.jsx)("div",{className:"sticky top-3 z-40 mb-5 lg:hidden",children:(0,t.jsxs)("div",{className:"flex min-w-0 items-center justify-between gap-2 rounded-3xl border border-white/80 bg-white/90 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsx)("div",{className:"min-w-0 flex-1",children:(0,t.jsx)(a.BrandHeader,{showPerson:!1})}),(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,t.jsx)(r.PersonSwitcher,{compact:!0}),(0,t.jsx)(r.MobileMenu,{})]})]})}),(0,t.jsx)("div",{className:"mx-auto min-w-0 w-full max-w-7xl",children:e}),(0,t.jsx)(r.MobileQuickNav,{})]})]})}])},42391,e=>{"use strict";var t=e.i(43476);e.s(["PageHeader",0,function({eyebrow:e,title:a,description:r,action:o}){return(0,t.jsxs)("header",{className:"flex min-w-0 flex-col gap-5 pb-1 sm:flex-row sm:items-start sm:justify-between",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-black uppercase tracking-[0.08em] text-amber-700",children:e}),(0,t.jsx)("h1",{className:"mt-2 text-3xl font-black leading-tight tracking-normal text-ink md:text-5xl",children:a}),r?(0,t.jsx)("p",{className:"mt-3 max-w-3xl text-base font-medium leading-7 text-stone-600 md:text-lg md:leading-8",children:r}):null]}),o?(0,t.jsx)("div",{className:"w-full shrink-0 sm:w-auto",children:o}):null]})}])},34295,e=>{"use strict";function t(e,t){return`${e}:${t}`}e.s(["getPersonStorageKey",0,t,"readPersonStorage",0,function(e,a,r){try{let o=window.localStorage.getItem(t(e,a));return o?JSON.parse(o):r}catch{return r}},"removePersonStorage",0,function(e,a){try{window.localStorage.removeItem(t(e,a))}catch{}},"writePersonStorage",0,function(e,a,r){try{return window.localStorage.setItem(t(e,a),JSON.stringify(r)),!0}catch{return!1}}])},44014,e=>{"use strict";let t={grade:1,title:"小一英文練習",subtitle:"每次 6 個生活單字,搭配可點擊發音、跟讀檢查與小測驗。",wordGroups:[{id:"greeting-school-1",title:"禮貌與校園",description:"從見面、離開、感謝和校園人物開始,讓孩子敢開口。",words:[{word:"hello",zh:"你好",category:"禮貌",usage:"見面時說",example:"Hello, teacher."},{word:"goodbye",zh:"再見",category:"禮貌",usage:"離開時說",example:"Goodbye, friend."},{word:"thank you",zh:"謝謝你",category:"禮貌",usage:"收到幫助時說",example:"Thank you."},{word:"teacher",zh:"老師",category:"校園",usage:"找老師時用",example:"My teacher is kind."},{word:"friend",zh:"朋友",category:"校園",usage:"介紹同學時用",example:"You are my friend."},{word:"book",zh:"書",category:"文具",usage:"拿起課本說",example:"This is my book."}]},{id:"stationery-color-1",title:"文具與顏色",description:"把桌上的文具和看到的顏色說出來。",words:[{word:"pencil",zh:"鉛筆",category:"文具",usage:"寫字時用",example:"This is my pencil."},{word:"eraser",zh:"橡皮擦",category:"文具",usage:"擦掉錯字時說",example:"I need an eraser."},{word:"bag",zh:"書包",category:"文具",usage:"整理書包時說",example:"This is my bag."},{word:"red",zh:"紅色",category:"顏色",usage:"看到紅色時說",example:"It is red."},{word:"blue",zh:"藍色",category:"顏色",usage:"看到藍色時說",example:"It is blue."},{word:"yellow",zh:"黃色",category:"顏色",usage:"看到黃色時說",example:"It is yellow."}]},{id:"family-home-1",title:"家人與家裡",description:"用簡單英文介紹家人和家裡常見物品。",words:[{word:"mother",zh:"媽媽",category:"家人",usage:"介紹媽媽時說",example:"This is my mother."},{word:"father",zh:"爸爸",category:"家人",usage:"介紹爸爸時說",example:"This is my father."},{word:"sister",zh:"姊妹",category:"家人",usage:"介紹姊妹時說",example:"She is my sister."},{word:"brother",zh:"兄弟",category:"家人",usage:"介紹兄弟時說",example:"He is my brother."},{word:"room",zh:"房間",category:"家裡",usage:"介紹房間時說",example:"This is my room."},{word:"table",zh:"桌子",category:"家裡",usage:"看到桌子時說",example:"The book is on the table."}]},{id:"food-feeling-1",title:"食物與心情",description:"從吃喝和心情表達開始,讓英文貼近生活。",words:[{word:"apple",zh:"蘋果",category:"食物",usage:"吃水果時說",example:"I like apples."},{word:"milk",zh:"牛奶",category:"食物",usage:"喝牛奶時說",example:"I drink milk."},{word:"water",zh:"水",category:"食物",usage:"想喝水時說",example:"I need water."},{word:"happy",zh:"開心",category:"心情",usage:"心情好時說",example:"I am happy."},{word:"sad",zh:"難過",category:"心情",usage:"心情不好時說",example:"I am sad."},{word:"tired",zh:"累了",category:"心情",usage:"想休息時說",example:"I am tired."}]},{id:"action-day-1",title:"動作與一天",description:"練習讀、寫、畫、聽、說、玩等日常動作。",words:[{word:"read",zh:"閱讀",category:"動作",usage:"看書時說",example:"I read a book."},{word:"write",zh:"寫",category:"動作",usage:"寫字時說",example:"I write my name."},{word:"draw",zh:"畫畫",category:"動作",usage:"畫圖時說",example:"I draw a sun."},{word:"listen",zh:"聽",category:"動作",usage:"聽老師說話時說",example:"I listen to my teacher."},{word:"speak",zh:"說",category:"動作",usage:"練習開口時說",example:"I speak English."},{word:"play",zh:"玩",category:"動作",usage:"和朋友玩時說",example:"I play with my friend."}]}],dailySentences:["Hello, teacher.","This is my book.","Thank you.","My name is ___.","I need help."],quiz:[{id:"q-hello",question:"hello 是什麼意思?",answer:"你好",options:["你好","書","老師"]},{id:"q-book",question:"book 是什麼意思?",answer:"書",options:["朋友","書","再見"]},{id:"q-thank-you",question:"收到幫助時可以說哪一句?",answer:"Thank you.",options:["Goodbye.","Thank you.","This is my book."]}]},a=[t,{grade:2,title:"小二英文練習",subtitle:"從家人、食物、日常動作開始,練習完整生活句。",wordGroups:[{id:"family-food-2",title:"家人與食物",description:"練習介紹家人,也能說出常見食物。",words:[{word:"mother",zh:"媽媽",category:"家人",usage:"介紹媽媽時說",example:"This is my mother."},{word:"father",zh:"爸爸",category:"家人",usage:"介紹爸爸時說",example:"This is my father."},{word:"sister",zh:"姊妹",category:"家人",usage:"介紹姊妹時說",example:"She is my sister."},{word:"brother",zh:"兄弟",category:"家人",usage:"介紹兄弟時說",example:"He is my brother."},{word:"apple",zh:"蘋果",category:"食物",usage:"吃水果時說",example:"I like apples."},{word:"milk",zh:"牛奶",category:"食物",usage:"喝牛奶時說",example:"I drink milk."}]},{id:"home-action-2",title:"家裡與動作",description:"把家裡常見物品和每天會做的動作說出來。",words:[{word:"room",zh:"房間",category:"家裡",usage:"介紹房間時說",example:"This is my room."},{word:"table",zh:"桌子",category:"家裡",usage:"看到桌子時說",example:"The book is on the table."},{word:"read",zh:"閱讀",category:"動作",usage:"看書時說",example:"I read a book."},{word:"write",zh:"寫",category:"動作",usage:"寫字時說",example:"I write my name."},{word:"draw",zh:"畫畫",category:"動作",usage:"畫圖時說",example:"I draw a sun."},{word:"play",zh:"玩",category:"動作",usage:"和朋友玩時說",example:"I play with my friend."}]},{id:"school-time-2",title:"校園與時間",description:"用簡單句子說出上課、午餐和一天中的時間。",words:[{word:"classroom",zh:"教室",category:"校園",usage:"介紹教室時說",example:"This is my classroom."},{word:"homework",zh:"作業",category:"校園",usage:"準備寫作業時說",example:"I do my homework."},{word:"lunch",zh:"午餐",category:"校園",usage:"吃午餐時說",example:"I eat lunch at school."},{word:"morning",zh:"早上",category:"時間",usage:"早上打招呼時說",example:"Good morning."},{word:"afternoon",zh:"下午",category:"時間",usage:"下午打招呼時說",example:"Good afternoon."},{word:"evening",zh:"晚上",category:"時間",usage:"晚上打招呼時說",example:"Good evening."}]},{id:"clothes-weather-2",title:"衣物與天氣",description:"依照天氣說出今天穿的衣物。",words:[{word:"shirt",zh:"上衣",category:"衣物",usage:"介紹衣服時說",example:"This is my shirt."},{word:"shoes",zh:"鞋子",category:"衣物",usage:"穿鞋時說",example:"These are my shoes."},{word:"hat",zh:"帽子",category:"衣物",usage:"戴帽子時說",example:"I have a hat."},{word:"sunny",zh:"晴朗的",category:"天氣",usage:"晴天時說",example:"It is sunny today."},{word:"rainy",zh:"下雨的",category:"天氣",usage:"雨天時說",example:"It is rainy today."},{word:"windy",zh:"有風的",category:"天氣",usage:"風很大時說",example:"It is windy today."}]},{id:"body-health-2",title:"身體與感受",description:"認識身體部位,也能說出餓、渴和不舒服。",words:[{word:"head",zh:"頭",category:"身體",usage:"指出頭部時說",example:"This is my head."},{word:"hand",zh:"手",category:"身體",usage:"指出手時說",example:"This is my hand."},{word:"foot",zh:"腳",category:"身體",usage:"指出腳時說",example:"This is my foot."},{word:"hungry",zh:"餓了",category:"感受",usage:"想吃東西時說",example:"I am hungry."},{word:"thirsty",zh:"渴了",category:"感受",usage:"想喝水時說",example:"I am thirsty."},{word:"sick",zh:"不舒服",category:"感受",usage:"身體不舒服時說",example:"I feel sick."}]}],dailySentences:["My name is ___.","This is my family.","I like apples.","I read a book.","I play with my friend."],quiz:[{id:"q2-family",question:"family 是什麼意思?",answer:"家人",options:["顏色","家人","鉛筆"]},{id:"q2-apple",question:"apple 是什麼意思?",answer:"蘋果",options:["蘋果","牛奶","書"]}]},{grade:3,title:"小三英文練習",subtitle:"加入動作、場所與比較完整的句型,讓孩子能說出自己的生活。",wordGroups:[{id:"action-learning-3",title:"學習動作",description:"練習讀、寫、聽、說,讓英文和學習情境連在一起。",words:[{word:"read",zh:"閱讀",category:"動作",usage:"看書時說",example:"I read a story."},{word:"write",zh:"寫",category:"動作",usage:"寫字時說",example:"I write English words."},{word:"listen",zh:"聽",category:"動作",usage:"聽老師說話時說",example:"I listen to my teacher."},{word:"speak",zh:"說",category:"動作",usage:"練習開口時說",example:"I speak English."},{word:"practice",zh:"練習",category:"學習",usage:"複習時說",example:"I practice every day."},{word:"question",zh:"問題",category:"學習",usage:"提問時說",example:"I have a question."}]},{id:"places-feelings-3",title:"地點與感受",description:"用英文說出常見地點,也練習描述自己的感覺。",words:[{word:"library",zh:"圖書館",category:"場所",usage:"借書時說",example:"I go to the library."},{word:"park",zh:"公園",category:"場所",usage:"出去玩時說",example:"I play in the park."},{word:"market",zh:"市場",category:"場所",usage:"買東西時說",example:"I go to the market."},{word:"happy",zh:"開心",category:"心情",usage:"心情好時說",example:"I am happy today."},{word:"tired",zh:"累了",category:"心情",usage:"想休息時說",example:"I am tired."},{word:"ready",zh:"準備好了",category:"心情",usage:"開始任務時說",example:"I am ready."}]},{id:"routine-time-3",title:"一天的作息",description:"把起床、吃飯、學習和睡覺連成一天的英文。",words:[{word:"wake",zh:"醒來",category:"作息",usage:"早上起床時說",example:"I wake up at seven."},{word:"breakfast",zh:"早餐",category:"作息",usage:"吃早餐時說",example:"I eat breakfast."},{word:"study",zh:"學習",category:"作息",usage:"開始學習時說",example:"I study English."},{word:"dinner",zh:"晚餐",category:"作息",usage:"吃晚餐時說",example:"I eat dinner with my family."},{word:"sleep",zh:"睡覺",category:"作息",usage:"準備睡覺時說",example:"I go to sleep."},{word:"today",zh:"今天",category:"時間",usage:"說今天的事情時用",example:"I am happy today."}]},{id:"nature-weather-3",title:"自然與天氣",description:"觀察每天的天氣和生活周遭的自然景物。",words:[{word:"weather",zh:"天氣",category:"天氣",usage:"談論天氣時說",example:"How is the weather?"},{word:"sunny",zh:"晴朗的",category:"天氣",usage:"晴天時說",example:"It is sunny today."},{word:"cloudy",zh:"多雲的",category:"天氣",usage:"多雲時說",example:"It is cloudy today."},{word:"rainy",zh:"下雨的",category:"天氣",usage:"雨天時說",example:"It is rainy today."},{word:"tree",zh:"樹",category:"自然",usage:"看到樹時說",example:"I see a tall tree."},{word:"river",zh:"河流",category:"自然",usage:"看到河流時說",example:"The river is long."}]},{id:"community-direction-3",title:"社區與方向",description:"認識社區場所,練習左右和遠近。",words:[{word:"hospital",zh:"醫院",category:"社區",usage:"介紹醫院時說",example:"The hospital is near."},{word:"station",zh:"車站",category:"社區",usage:"詢問車站時說",example:"Where is the station?"},{word:"store",zh:"商店",category:"社區",usage:"去商店時說",example:"I go to the store."},{word:"left",zh:"左邊",category:"方向",usage:"指左邊時說",example:"Turn left."},{word:"right",zh:"右邊",category:"方向",usage:"指右邊時說",example:"Turn right."},{word:"near",zh:"附近",category:"方向",usage:"說距離很近時用",example:"The school is near."}]}],dailySentences:["My name is ___.","I speak English.","I have a question.","I go to the library.","I am ready."],quiz:[{id:"q3-speak",question:"speak 是什麼意思?",answer:"說",options:["聽","說","寫"]},{id:"q3-library",question:"library 是什麼意思?",answer:"圖書館",options:["市場","公園","圖書館"]}]},{grade:4,title:"小四英文練習",subtitle:"用時間、興趣、交通、比較與購物情境,練習更完整的生活問答。",wordGroups:[{id:"time-hobby-4",title:"時間與興趣",description:"說出時間和自己喜歡的活動。",words:[{word:"clock",zh:"時鐘",category:"時間",usage:"看時間時用",example:"The clock says nine."},{word:"minute",zh:"分鐘",category:"時間",usage:"說時間長度時用",example:"Wait for five minutes."},{word:"early",zh:"提早地",category:"時間",usage:"比預定時間早時用",example:"I get up early."},{word:"hobby",zh:"興趣",category:"興趣",usage:"介紹休閒活動時用",example:"My hobby is drawing."},{word:"music",zh:"音樂",category:"興趣",usage:"談喜歡的活動時用",example:"I listen to music."},{word:"collect",zh:"收集",category:"興趣",usage:"說收藏時用",example:"I collect stickers."}]},{id:"transportation-4",title:"交通與移動",description:"練習說明自己怎麼到達不同地方。",words:[{word:"bus",zh:"公車",category:"交通",usage:"搭公車時用",example:"I go to school by bus."},{word:"train",zh:"火車",category:"交通",usage:"搭火車時用",example:"The train is fast."},{word:"bicycle",zh:"腳踏車",category:"交通",usage:"騎車時用",example:"I ride my bicycle."},{word:"station",zh:"車站",category:"地點",usage:"找車站時用",example:"The station is near."},{word:"ticket",zh:"車票",category:"交通",usage:"搭車前用",example:"I have a train ticket."},{word:"arrive",zh:"到達",category:"動作",usage:"說抵達時間時用",example:"We arrive at ten."}]},{id:"frequency-4",title:"多久做一次",description:"用頻率副詞描述日常習慣。",words:[{word:"always",zh:"總是",category:"頻率",usage:"每次都會時用",example:"I always wash my hands."},{word:"usually",zh:"通常",category:"頻率",usage:"大多時候會做時用",example:"I usually walk to school."},{word:"often",zh:"常常",category:"頻率",usage:"經常做某事時用",example:"I often read after dinner."},{word:"sometimes",zh:"有時候",category:"頻率",usage:"偶爾做某事時用",example:"I sometimes play chess."},{word:"never",zh:"從不",category:"頻率",usage:"完全不做時用",example:"I never skip breakfast."},{word:"weekend",zh:"週末",category:"時間",usage:"說假日活動時用",example:"I swim on the weekend."}]},{id:"comparison-4",title:"比較事物",description:"用常見形容詞比較大小、速度與重量。",words:[{word:"tall",zh:"高的",category:"描述",usage:"比較身高時用",example:"The giraffe is tall."},{word:"short",zh:"矮的;短的",category:"描述",usage:"比較高度或長度時用",example:"This pencil is short."},{word:"fast",zh:"快的",category:"描述",usage:"比較速度時用",example:"A train is fast."},{word:"slow",zh:"慢的",category:"描述",usage:"說速度慢時用",example:"The turtle is slow."},{word:"heavy",zh:"重的",category:"描述",usage:"比較重量時用",example:"This box is heavy."},{word:"light",zh:"輕的",category:"描述",usage:"說重量輕時用",example:"This bag is light."}]},{id:"shopping-4",title:"購物英文",description:"認識價格、金錢與購物時常用的動詞。",words:[{word:"price",zh:"價格",category:"購物",usage:"詢問價錢時用",example:"What is the price?"},{word:"money",zh:"錢",category:"購物",usage:"付錢時用",example:"I have enough money."},{word:"cheap",zh:"便宜的",category:"購物",usage:"價格低時用",example:"The pencil is cheap."},{word:"expensive",zh:"昂貴的",category:"購物",usage:"價格高時用",example:"The bag is expensive."},{word:"buy",zh:"購買",category:"購物",usage:"買東西時用",example:"I want to buy a book."},{word:"change",zh:"找零",category:"購物",usage:"付款後用",example:"Here is your change."}]}],dailySentences:["What time do you get up?","I usually walk to school.","My hobby is drawing.","The train is faster than the bus.","How much is this book?"],quiz:[{id:"q4-hobby",question:"hobby 是什麼意思?",answer:"興趣",options:["興趣","車票","價格"]},{id:"q4-often",question:"often 是什麼意思?",answer:"常常",options:["從不","常常","明天"]},{id:"q4-train",question:"火車的英文是哪一個?",answer:"train",options:["train","bicycle","station"]}]},{grade:5,title:"小五英文練習",subtitle:"從健康、方向、季節、過去經驗與未來計畫,建立閱讀和表達能力。",wordGroups:[{id:"health-habits-5",title:"健康與習慣",description:"用英文說出身體狀況與健康選擇。",words:[{word:"healthy",zh:"健康的",category:"健康",usage:"描述健康狀態時用",example:"Vegetables are healthy."},{word:"exercise",zh:"運動",category:"健康",usage:"談運動習慣時用",example:"I exercise every day."},{word:"headache",zh:"頭痛",category:"健康",usage:"說身體不舒服時用",example:"I have a headache."},{word:"medicine",zh:"藥",category:"健康",usage:"生病吃藥時用",example:"Take your medicine."},{word:"rest",zh:"休息",category:"健康",usage:"需要休息時用",example:"You should get some rest."},{word:"habit",zh:"習慣",category:"健康",usage:"談生活方式時用",example:"Sleeping early is a good habit."}]},{id:"map-direction-5",title:"地圖與方向",description:"看地圖時辨認方位和旅行地點。",words:[{word:"north",zh:"北方",category:"方向",usage:"看地圖時用",example:"Taipei is in the north."},{word:"south",zh:"南方",category:"方向",usage:"看地圖時用",example:"The beach is in the south."},{word:"east",zh:"東方",category:"方向",usage:"說日出方向時用",example:"The sun rises in the east."},{word:"west",zh:"西方",category:"方向",usage:"說日落方向時用",example:"The sun sets in the west."},{word:"map",zh:"地圖",category:"旅行",usage:"找路時用",example:"Let us look at the map."},{word:"hotel",zh:"旅館",category:"旅行",usage:"旅行住宿時用",example:"Our hotel is near the station."}]},{id:"seasons-5",title:"季節與活動",description:"說出四季和不同季節適合的活動。",words:[{word:"spring",zh:"春天",category:"季節",usage:"談春天時用",example:"Flowers grow in spring."},{word:"summer",zh:"夏天",category:"季節",usage:"談暑假時用",example:"I swim in summer."},{word:"autumn",zh:"秋天",category:"季節",usage:"談秋季時用",example:"Leaves fall in autumn."},{word:"winter",zh:"冬天",category:"季節",usage:"談冷天時用",example:"It is cold in winter."},{word:"vacation",zh:"假期",category:"活動",usage:"談放假安排時用",example:"We travel during vacation."},{word:"activity",zh:"活動",category:"活動",usage:"介紹行程時用",example:"This activity is fun."}]},{id:"past-experience-5",title:"過去的經驗",description:"用常見過去式說昨天做過的事。",words:[{word:"yesterday",zh:"昨天",category:"過去",usage:"說昨天的事情時用",example:"I was busy yesterday."},{word:"visited",zh:"拜訪了",category:"過去",usage:"說去過某地時用",example:"We visited the museum."},{word:"watched",zh:"觀看了",category:"過去",usage:"說看過節目時用",example:"I watched a movie."},{word:"played",zh:"玩了",category:"過去",usage:"說玩過什麼時用",example:"I played basketball."},{word:"studied",zh:"學習了",category:"過去",usage:"說讀過書時用",example:"I studied English."},{word:"went",zh:"去了",category:"過去",usage:"說去過某地時用",example:"We went to the park."}]},{id:"plans-advice-5",title:"計畫與建議",description:"安排明天的事情,也能給出簡單建議。",words:[{word:"tomorrow",zh:"明天",category:"計畫",usage:"談明天時用",example:"I will study tomorrow."},{word:"plan",zh:"計畫",category:"計畫",usage:"安排事情時用",example:"I have a plan."},{word:"should",zh:"應該",category:"建議",usage:"給建議時用",example:"You should drink water."},{word:"enough",zh:"足夠的",category:"建議",usage:"確認數量充足時用",example:"Get enough sleep."},{word:"careful",zh:"小心的",category:"建議",usage:"提醒注意時用",example:"Please be careful."},{word:"remember",zh:"記得",category:"建議",usage:"提醒別忘記時用",example:"Remember to bring your book."}]}],dailySentences:["You should get enough sleep.","How can I get to the station?","We visited the museum yesterday.","I will study English tomorrow.","Spring is warmer than winter."],quiz:[{id:"q5-healthy",question:"healthy 是什麼意思?",answer:"健康的",options:["健康的","昂貴的","小心的"]},{id:"q5-yesterday",question:"昨天的英文是哪一個?",answer:"yesterday",options:["tomorrow","yesterday","winter"]},{id:"q5-should",question:"給建議時常用哪一個字?",answer:"should",options:["visited","should","north"]}]},{grade:6,title:"小六英文練習",subtitle:"統整時態、連接詞與觀點表達,準備讀懂較長句子並銜接國中。",wordGroups:[{id:"school-project-6",title:"校園計畫",description:"規劃學習任務並清楚報告自己的目標。",words:[{word:"project",zh:"專題",category:"學習",usage:"談小組任務時用",example:"Our science project is ready."},{word:"schedule",zh:"行程表",category:"學習",usage:"安排時間時用",example:"Check the class schedule."},{word:"prepare",zh:"準備",category:"學習",usage:"開始任務前用",example:"We prepare for the report."},{word:"report",zh:"報告",category:"學習",usage:"上台分享時用",example:"I gave a short report."},{word:"choose",zh:"選擇",category:"學習",usage:"做決定時用",example:"Choose one topic."},{word:"goal",zh:"目標",category:"學習",usage:"設定學習方向時用",example:"My goal is to read more."}]},{id:"culture-travel-6",title:"旅行與文化",description:"認識不同國家、語言與文化特色。",words:[{word:"country",zh:"國家",category:"文化",usage:"介紹國家時用",example:"Japan is an island country."},{word:"culture",zh:"文化",category:"文化",usage:"談生活特色時用",example:"Every culture is special."},{word:"language",zh:"語言",category:"文化",usage:"談溝通時用",example:"English is an international language."},{word:"famous",zh:"著名的",category:"旅行",usage:"介紹景點時用",example:"The tower is famous."},{word:"tradition",zh:"傳統",category:"文化",usage:"介紹節慶時用",example:"This is a family tradition."},{word:"visitor",zh:"訪客",category:"旅行",usage:"說來訪的人時用",example:"Many visitors come here."}]},{id:"environment-6",title:"環境行動",description:"用英文討論減量、回收與保護環境。",words:[{word:"recycle",zh:"回收",category:"環境",usage:"分類資源時用",example:"We recycle paper and cans."},{word:"reduce",zh:"減少",category:"環境",usage:"減少浪費時用",example:"We should reduce waste."},{word:"reuse",zh:"重複使用",category:"環境",usage:"再次使用物品時用",example:"Reuse this bag."},{word:"energy",zh:"能源",category:"環境",usage:"談電力資源時用",example:"Turn off lights to save energy."},{word:"pollution",zh:"汙染",category:"環境",usage:"談環境問題時用",example:"Air pollution hurts our health."},{word:"protect",zh:"保護",category:"環境",usage:"談守護自然時用",example:"We must protect the ocean."}]},{id:"reasons-opinions-6",title:"原因與觀點",description:"用連接詞說清楚原因、結果和自己的看法。",words:[{word:"because",zh:"因為",category:"連接",usage:"說明原因時用",example:"I stayed home because it rained."},{word:"so",zh:"所以",category:"連接",usage:"說明結果時用",example:"It rained, so we stayed home."},{word:"however",zh:"然而",category:"連接",usage:"轉折時用",example:"It was hard; however, I finished it."},{word:"agree",zh:"同意",category:"觀點",usage:"表達同意時用",example:"I agree with your idea."},{word:"opinion",zh:"意見",category:"觀點",usage:"分享想法時用",example:"In my opinion, reading is useful."},{word:"reason",zh:"理由",category:"觀點",usage:"解釋想法時用",example:"Please give one reason."}]},{id:"junior-transition-6",title:"國中銜接",description:"練習解釋、解決問題與持續進步的學習用語。",words:[{word:"experience",zh:"經驗",category:"銜接",usage:"分享做過的事情時用",example:"It was a useful experience."},{word:"improve",zh:"進步;改善",category:"銜接",usage:"談學習成長時用",example:"Practice helps me improve."},{word:"solve",zh:"解決",category:"銜接",usage:"處理問題時用",example:"We can solve this problem."},{word:"explain",zh:"解釋",category:"銜接",usage:"說明答案時用",example:"Please explain your answer."},{word:"continue",zh:"繼續",category:"銜接",usage:"持續任務時用",example:"I will continue learning."},{word:"confident",zh:"有信心的",category:"銜接",usage:"描述自信時用",example:"I feel confident today."}]}],dailySentences:["My goal is to improve every day.","We should reduce waste to protect Earth.","I agree because your reason is clear.","I have finished my school project.","I will continue learning English."],quiz:[{id:"q6-protect",question:"protect 是什麼意思?",answer:"保護",options:["保護","比較","準備"]},{id:"q6-because",question:"說明原因時常用哪一個字?",answer:"because",options:["however","because","visitor"]},{id:"q6-improve",question:"improve 是什麼意思?",answer:"進步;改善",options:["解釋","進步;改善","選擇"]}]}];e.s(["englishLessons",0,a,"getEnglishLessonByGrade",0,function(e){return a.find(t=>t.grade===e)??t}])}]);
_next/static/chunks/3146sdm58x_li.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,12408,e=>{"use strict";function t(){return"speechSynthesis"in window&&"SpeechSynthesisUtterance"in window}function n(e,r={}){if(!e.trim())return{ok:!1,message:"請先選擇要播放的內容。"};if(!t())return{ok:!1,message:"這個瀏覽器不支援語音播放,建議使用 Chrome 或 Edge。"};window.speechSynthesis.cancel();let s=new SpeechSynthesisUtterance(e);return s.lang=r.lang??"en-US",s.rate=r.rate??.82,s.pitch=r.pitch??1,s.volume=r.volume??1,window.speechSynthesis.speak(s),{ok:!0,message:"正在播放標準發音。"}}e.s(["speakEnglish",0,function(e,t={}){return n(e,{...t,lang:"en-US"})},"speakMandarin",0,function(e,t={}){return n(e,{rate:.76,pitch:1.05,...t,lang:"zh-TW"})},"speakText",0,n,"stopSpeech",0,function(){t()&&window.speechSynthesis.cancel()}])},32324,e=>{"use strict";var t=e.i(43476);let n={一:"ㄧ",二:"ㄦˋ",三:"ㄙㄢ",上衣:"ㄕㄤˋ ㄧ",下午:"ㄒㄧㄚˋ ㄨˇ",下雨的:"ㄒㄧㄚˋ ㄩˇ ㄉㄜ˙",不舒服:"ㄅㄨˋ ㄕㄨ ㄈㄨ˙",今天:"ㄐㄧㄣ ㄊㄧㄢ",公園:"ㄍㄨㄥ ㄩㄢˊ",午餐:"ㄨˇ ㄘㄢ",天氣:"ㄊㄧㄢ ㄑㄧˋ",手:"ㄕㄡˇ",水:"ㄕㄨㄟˇ",牛奶:"ㄋㄧㄡˊ ㄋㄞˇ",兄弟:"ㄒㄩㄥ ㄉㄧˋ",右邊:"ㄧㄡˋ ㄅㄧㄢ",左邊:"ㄗㄨㄛˇ ㄅㄧㄢ",市場:"ㄕˋ ㄔㄤˇ",再見:"ㄗㄞˋ ㄐㄧㄢˋ",多雲的:"ㄉㄨㄛ ㄩㄣˊ ㄉㄜ˙",早上:"ㄗㄠˇ ㄕㄤˋ",早餐:"ㄗㄠˇ ㄘㄢ",有風的:"ㄧㄡˇ ㄈㄥ ㄉㄜ˙",老師:"ㄌㄠˇ ㄕ",作業:"ㄗㄨㄛˋ ㄧㄝˋ",你好:"ㄋㄧˇ ㄏㄠˇ",車站:"ㄔㄜ ㄓㄢˋ",姊妹:"ㄗˇ ㄇㄟˋ",房間:"ㄈㄤˊ ㄐㄧㄢ",朋友:"ㄆㄥˊ ㄧㄡˇ",河流:"ㄏㄜˊ ㄌㄧㄡˊ",爸爸:"ㄅㄚˋ ㄅㄚ˙",玩:"ㄨㄢˊ",附近:"ㄈㄨˋ ㄐㄧㄣˋ",紅色:"ㄏㄨㄥˊ ㄙㄜˋ",書:"ㄕㄨ",書包:"ㄕㄨ ㄅㄠ",桌子:"ㄓㄨㄛ ㄗ˙",商店:"ㄕㄤ ㄉㄧㄢˋ",問題:"ㄨㄣˋ ㄊㄧˊ",教室:"ㄐㄧㄠˋ ㄕˋ",晚上:"ㄨㄢˇ ㄕㄤˋ",晚餐:"ㄨㄢˇ ㄘㄢ",累了:"ㄌㄟˋ ㄌㄜ˙",帽子:"ㄇㄠˋ ㄗ˙",晴朗的:"ㄑㄧㄥˊ ㄌㄤˇ ㄉㄜ˙",渴了:"ㄎㄜˇ ㄌㄜ˙",畫畫:"ㄏㄨㄚˋ ㄏㄨㄚˋ",答案:"ㄉㄚˊ ㄢˋ",開心:"ㄎㄞ ㄒㄧㄣ",黃色:"ㄏㄨㄤˊ ㄙㄜˋ",媽媽:"ㄇㄚ ㄇㄚ˙",準備好了:"ㄓㄨㄣˇ ㄅㄟˋ ㄏㄠˇ ㄌㄜ˙",腳:"ㄐㄧㄠˇ",鉛筆:"ㄑㄧㄢ ㄅㄧˇ",圖書館:"ㄊㄨˊ ㄕㄨ ㄍㄨㄢˇ",睡覺:"ㄕㄨㄟˋ ㄐㄧㄠˋ",綠色:"ㄌㄩˋ ㄙㄜˋ",說:"ㄕㄨㄛ",寫:"ㄒㄧㄝˇ",練習:"ㄌㄧㄢˋ ㄒㄧˊ",複習:"ㄈㄨˋ ㄒㄧˊ",請:"ㄑㄧㄥˇ",閱讀:"ㄩㄝˋ ㄉㄨˊ",莊:"ㄓㄨㄤ",村莊:"ㄘㄨㄣ ㄓㄨㄤ",鞋子:"ㄒㄧㄝˊ ㄗ˙",餓了:"ㄜˋ ㄌㄜ˙",學校:"ㄒㄩㄝˊ ㄒㄧㄠˋ",學習:"ㄒㄩㄝˊ ㄒㄧˊ",樹:"ㄕㄨˋ",橡皮擦:"ㄒㄧㄤˋ ㄆㄧˊ ㄘㄚ",醒來:"ㄒㄧㄥˇ ㄌㄞˊ",頭:"ㄊㄡˊ",謝謝你:"ㄒㄧㄝˋ ㄒㄧㄝ˙ ㄋㄧˇ",藍色:"ㄌㄢˊ ㄙㄜˋ",醫院:"ㄧ ㄩㄢˋ",難過:"ㄋㄢˊ ㄍㄨㄛˋ",蘋果:"ㄆㄧㄥˊ ㄍㄨㄛˇ",麵包:"ㄇㄧㄢˋ ㄅㄠ",聽:"ㄊㄧㄥ","老師,你好。":"ㄌㄠˇ ㄕ,ㄋㄧˇ ㄏㄠˇ。","這是我的書。":"ㄓㄜˋ ㄕˋ ㄨㄛˇ ㄉㄜ˙ ㄕㄨ。","謝謝你。":"ㄒㄧㄝˋ ㄒㄧㄝ˙ ㄋㄧˇ。","我需要幫忙。":"ㄨㄛˇ ㄒㄩ ㄧㄠˋ ㄅㄤ ㄇㄤˊ。","這是我的家人。":"ㄓㄜˋ ㄕˋ ㄨㄛˇ ㄉㄜ˙ ㄐㄧㄚ ㄖㄣˊ。","我喜歡蘋果。":"ㄨㄛˇ ㄒㄧˇ ㄏㄨㄢ ㄆㄧㄥˊ ㄍㄨㄛˇ。","我讀一本書。":"ㄨㄛˇ ㄉㄨˊ ㄧˋ ㄅㄣˇ ㄕㄨ。","我和朋友一起玩。":"ㄨㄛˇ ㄏㄜˊ ㄆㄥˊ ㄧㄡˇ ㄧˋ ㄑㄧˇ ㄨㄢˊ。","我說英文。":"ㄨㄛˇ ㄕㄨㄛ ㄧㄥ ㄨㄣˊ。","我有一個問題。":"ㄨㄛˇ ㄧㄡˇ ㄧˊ ㄍㄜ˙ ㄨㄣˋ ㄊㄧˊ。","我去圖書館。":"ㄨㄛˇ ㄑㄩˋ ㄊㄨˊ ㄕㄨ ㄍㄨㄢˇ。","我準備好了。":"ㄨㄛˇ ㄓㄨㄣˇ ㄅㄟˋ ㄏㄠˇ ㄌㄜ˙。","河邊有一個安靜的村莊。":"ㄏㄜˊ ㄅㄧㄢ ㄧㄡˇ ㄧˊ ㄍㄜ˙ ㄢ ㄐㄧㄥˋ ㄉㄜ˙ ㄘㄨㄣ ㄓㄨㄤ。"};e.s(["ZhuyinText",0,function({text:e,show:r=!0,compact:s=!1,className:l=""}){let a,i,o=r?(i=(a=e.trim()).match(/^我的名字是 (.+)。$/))?`ㄨㄛˇ ㄉㄜ˙ ㄇㄧㄥˊ ㄗˋ ㄕˋ ${i[1]}。`:n[a]??"":"";return(0,t.jsxs)("span",{className:`inline-flex flex-wrap items-center gap-x-2 gap-y-1 ${l}`,children:[(0,t.jsx)("span",{children:e}),o?(0,t.jsx)("span",{className:`rounded-full bg-white/85 font-black tracking-wide text-stone-500 shadow-sm ${s?"px-2 py-1 text-[11px]":"px-3 py-1 text-xs"}`,children:o}):null]})}],32324)},47106,e=>{"use strict";var t=e.i(43476),n=e.i(71645);let r=[["write","right"],["two","to","too"],["one","won"],["read","reed"],["blue","blew"],["weather","whether"]];function s(){let e=window;return e.SpeechRecognition??e.webkitSpeechRecognition??null}function l(e){return e.toLowerCase().replace(/\bi'm\b/g,"i am").replace(/\bit's\b/g,"it is").replace(/\byou're\b/g,"you are").replace(/\bwe're\b/g,"we are").replace(/\bthey're\b/g,"they are").replace(/\bcan't\b/g,"cannot").replace(/\bdon't\b/g,"do not").replace(/[^a-z\s']/g,"").replace(/\s+/g," ").trim()}function a(e,t){let n=l(e),s=l(t);if(!n||!s)return 0;if(n===s||r.some(e=>e.includes(n)&&e.includes(s)))return 1;let a=Math.max(n.length,s.length),i=Math.max(0,1-function(e,t){let n=Array.from({length:e.length+1},()=>Array(t.length+1).fill(0));for(let t=0;t<=e.length;t+=1)n[t][0]=t;for(let e=0;e<=t.length;e+=1)n[0][e]=e;for(let r=1;r<=e.length;r+=1)for(let s=1;s<=t.length;s+=1){let l=+(e[r-1]!==t[s-1]);n[r][s]=Math.min(n[r-1][s]+1,n[r][s-1]+1,n[r-1][s-1]+l)}return n[e.length][t.length]}(n,s)/a),o=n.split(" "),c=s.split(" ");if(1===o.length)return i;let d=function(e,t){let n=Array.from({length:e.length+1},()=>Array(t.length+1).fill(0));for(let r=1;r<=e.length;r+=1)for(let s=1;s<=t.length;s+=1)n[r][s]=e[r-1]===t[s-1]?n[r-1][s-1]+1:Math.max(n[r-1][s],n[r][s-1]);return n[e.length][t.length]}(o,c),u=d/o.length,h=d/c.length;return u<.7||h<.7?Math.min(i,.69):.45*i+.4*u+.15*h}function i(e){return e.replace(/[\s,。!?、,.!?]/g,"").trim()}function o(e,t,n=[]){let r=[e,...n].map(i).filter(Boolean),s=i(t);return!!r.length&&!!s&&r.some(e=>s===e||s.includes(e)||e.includes(s))}function c(e,t,n="en-US",r=[]){return n.toLowerCase().startsWith("zh")?o(e,t,r):[e,...r].some(e=>{var n;let r,s;return a(n=e,t)>=(1===(s=(r=l(n)).split(" ").filter(Boolean).length)&&r.length<=4?.9:1===s?.86:.8)})}var d=e.i(12408);e.s(["SpeechPracticeButton",0,function({expected:e,alternatives:r=[],lang:i="en-US",listenLabel:u="開始口說辨識",speakLabel:h="先聽一次",targetLabel:m="目標",compact:p=!1,showParentControls:x=!0,onResult:g,onReviewed:b,listenSeconds:f}){var w;let k,y,[j,v]=(0,n.useState)(!1),[N,S]=(0,n.useState)(!1),[M,$]=(0,n.useState)(!1),[T,C]=(0,n.useState)(null),[R,U]=(0,n.useState)(0),[A,z]=(0,n.useState)(!1),[P,E]=(0,n.useState)(""),[B,I]=(0,n.useState)(null),L=(0,n.useRef)(null),W=(0,n.useRef)([]),K=(0,n.useRef)(0);(0,n.useEffect)(()=>(v(!0),()=>{K.current+=1,P&&URL.revokeObjectURL(P),L.current?.stream.getTracks().forEach(e=>e.stop())}),[P]),(0,n.useEffect)(()=>{I(null),z(!1),C(null)},[e]);let q=(0,n.useMemo)(()=>j&&!!s(),[j]),F=j&&!q;function O(e){I(e),g?.(e)}async function D(){let t=K.current+1;K.current=t,(0,d.stopSpeech)(),I(null),z(!1);for(let e=3;e>=1;e-=1)if(C(e),await new Promise(e=>window.setTimeout(e,900)),K.current!==t)return;C(null),S(!0);let n=f??(e.trim().split(/\s+/).length>2?15:12);U(n);let u=window.setInterval(()=>U(e=>Math.max(0,e-1)),1e3);await new Promise(e=>window.setTimeout(e,220));let h=await function({expected:e,alternatives:t=[],lang:n="en-US",timeoutMs:r}){let i=s();return i?new Promise(s=>{let d=new i,u=r??(l(e).split(" ").filter(Boolean).length>2?15e3:12e3),h=Date.now()+u,m=!1,p="",x=0,g=0,b=0,f=e=>{if(!m){m=!0,window.clearTimeout(w);try{d.abort()}catch{}s(e)}},w=window.setTimeout(()=>{f({ok:!1,transcript:p,confidence:x,accuracy:Math.round(100*g),message:p?"有聽到聲音,但內容還不夠接近目標。放慢速度再試一次。":"還沒有聽到清楚的聲音,請靠近麥克風再試一次。"})},u);d.lang=n,d.interimResults=!0,d.maxAlternatives=5,d.continuous=!1;let k=()=>!(m||b>=2||Date.now()+900>=h)&&(b+=1,window.setTimeout(()=>{if(!m)try{d.start()}catch{}},320),!0);d.onresult=r=>{for(let s of Array.from({length:r.results.length},(e,t)=>r.results[t]))for(let r of Array.from({length:s.length},(e,t)=>s[t]).filter(Boolean)){let s=n.toLowerCase().startsWith("zh")?+!!o(e,r.transcript,t):function(e,t,n){return Math.max(...[e,...n].map(e=>a(e,t)))}(e,r.transcript,t),l=r.confidence??0;(s>g||s===g&&l>x)&&(p=r.transcript,x=l,g=s)}c(e,p,n,t)&&f({ok:!0,transcript:p,confidence:x,accuracy:Math.round(100*g),message:"系統有聽懂,發音和目標內容很接近。"})},d.onerror=e=>{("no-speech"===e.error||"aborted"===e.error)&&k()||f({ok:!1,transcript:p,confidence:x,accuracy:Math.round(100*g),message:"not-allowed"===e.error?"請允許瀏覽器使用麥克風,才能進行口說辨識。":"語音辨識暫時沒有收到完整內容,請再試一次。"})},d.onend=()=>{m||(c(e,p,n,t)?f({ok:!0,transcript:p,confidence:x,accuracy:Math.round(100*g),message:"系統有聽懂,發音和目標內容很接近。"}):k()||f({ok:!1,transcript:p,confidence:x,accuracy:Math.round(100*g),message:p?"內容還差一點,看看系統聽到的文字,再慢慢說一次。":"這次沒有聽清楚,請靠近麥克風再試一次。"}))};try{d.start()}catch{f({ok:!1,transcript:"",confidence:0,accuracy:0,message:"麥克風正在準備中,請稍等一下再按一次。"})}}):Promise.resolve({ok:!1,transcript:"",confidence:0,accuracy:0,message:"這個瀏覽器目前不支援語音轉文字,仍可使用錄音回放模式。"})}({expected:e,alternatives:r,lang:i,timeoutMs:1e3*n});window.clearInterval(u),K.current===t&&(S(!1),U(0),O(h))}async function Q(){if(!("u">typeof navigator&&navigator.mediaDevices?.getUserMedia&&"u">typeof MediaRecorder))return void O({ok:!1,transcript:"",confidence:0,message:"這台裝置無法錄音,請讓孩子跟著家長唸一次。"});try{let e=await navigator.mediaDevices.getUserMedia({audio:!0}),t=new MediaRecorder(e);W.current=[],L.current=t,t.ondataavailable=e=>{e.data.size>0&&W.current.push(e.data)},t.onstop=()=>{let n=new Blob(W.current,{type:t.mimeType||"audio/webm"});P&&URL.revokeObjectURL(P),E(URL.createObjectURL(n)),e.getTracks().forEach(e=>e.stop())},t.start(),$(!0),I(null)}catch{O({ok:!1,transcript:"",confidence:0,message:"請允許麥克風權限,才能錄下孩子的口說練習。"})}}function Z(e){O({ok:e,transcript:e?"家長確認發音接近目標":"家長確認需要再練一次",confidence:e?1:.35,message:e?"家長確認唸對了,很棒。":"再練一次,先聽標準發音再慢慢唸。"})}let G=B?.transcript&&"en-US"===i?(w=B.transcript,k=l(e).split(" ").filter(Boolean),y=new Set(l(w).split(" ").filter(Boolean)),k.map(e=>({word:e,heard:y.has(e)}))):[];return(0,t.jsxs)("div",{className:`mt-4 border border-blue-100 bg-blue-50/70 ${p?"rounded-2xl p-3":"rounded-3xl p-4 md:p-5"}`,children:[(0,t.jsxs)("div",{className:"rounded-2xl bg-white/85 p-4",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,t.jsx)("span",{className:"rounded-full bg-blue-100 px-3 py-1 text-xs font-black text-blue-800",children:q?"孩子口說辨識":"錄音回放模式"}),(0,t.jsx)("span",{className:"text-xs font-bold text-stone-500",children:"系統不會自己開始播放"})]}),p?null:(0,t.jsxs)("div",{className:"mt-3",children:[(0,t.jsx)("p",{className:"text-xs font-black text-stone-500",children:m}),(0,t.jsx)("p",{className:"mt-1 text-xl font-black leading-8 text-blue-800",children:e})]})]}),(0,t.jsx)("p",{className:"mt-3 text-sm font-bold leading-7 text-stone-600",children:q?"請孩子準備好後按下紅色按鈕,再親自把上面的內容唸出來。":"這台裝置目前不能直接轉成文字,仍可錄下孩子的聲音並回放。"}),(0,t.jsxs)("div",{className:"mt-3 grid gap-2 sm:grid-cols-2",children:[q?(0,t.jsx)("button",{type:"button",onClick:D,disabled:N||null!==T,className:"min-h-14 rounded-2xl bg-coral px-4 py-3 text-base font-black text-white shadow-sm transition hover:brightness-105 disabled:cursor-wait disabled:opacity-70",children:null!==T?`準備 ${T}`:N?`正在聽,還有 ${R} 秒`:u}):(0,t.jsx)("button",{type:"button",onClick:M?function(){L.current&&"inactive"!==L.current.state&&(L.current.stop(),$(!1))}:Q,className:"min-h-14 rounded-2xl bg-coral px-4 py-3 text-base font-black text-white shadow-sm transition hover:brightness-105",children:M?"完成錄音":"錄下我的朗讀"}),(0,t.jsx)("button",{type:"button",onClick:()=>(0,d.speakText)(e,{lang:i,rate:"zh-TW"===i?.72:.68}),className:"min-h-14 rounded-2xl bg-butter px-4 py-3 text-base font-black text-amber-900 shadow-sm transition hover:bg-amber-100",children:h})]}),P&&F?(0,t.jsxs)("div",{className:"mt-3 rounded-2xl bg-white/80 p-3",children:[(0,t.jsx)("p",{className:"mb-2 text-sm font-bold text-stone-600",children:"iPhone/iPad 錄音回放:先聽孩子剛剛的聲音,再由家長協助確認。"}),(0,t.jsx)("audio",{className:"w-full",controls:!0,src:P}),(0,t.jsx)("button",{type:"button",onClick:()=>O({ok:!0,transcript:"已完成錄音並回放",confidence:1,accuracy:100,message:"這台裝置使用錄音回放模式,已完成本次朗讀。"}),className:"mt-3 min-h-12 w-full rounded-2xl bg-green-700 px-4 py-3 text-sm font-black text-white shadow-sm",children:"我已聽過錄音,完成這次朗讀"})]}):null,B?(0,t.jsxs)("div",{"aria-live":"polite",className:`mt-3 min-h-20 rounded-2xl p-4 text-sm font-bold leading-7 ${B.ok?"bg-green-50 text-green-900":"bg-rose-50 text-rose-900"}`,children:[(0,t.jsx)("p",{className:"text-base font-black",children:B.ok?"有聽到孩子的聲音,這次很接近。":"這次還沒聽完整,再慢慢說一次。"}),B.transcript?(0,t.jsxs)("p",{className:"mt-1",children:["系統聽到:",B.transcript]}):(0,t.jsx)("p",{className:"mt-1",children:"系統還沒有收到清楚的文字。"}),(0,t.jsxs)("p",{className:"mt-1",children:["目標內容:",e]}),"number"==typeof B.accuracy?(0,t.jsxs)("p",{children:["內容接近度:",B.accuracy,"%"]}):null,G.length>1?(0,t.jsx)("div",{className:"mt-2 flex flex-wrap gap-2","aria-label":"逐字辨識結果",children:G.map(({word:e,heard:n},r)=>(0,t.jsxs)("span",{className:`rounded-full px-3 py-1 text-xs font-black ${n?"bg-green-100 text-green-800":"bg-white text-rose-800"}`,children:[e," ",n?"有聽到":"再練一次"]},`${e}-${r}`))}):null,B.ok?null:(0,t.jsxs)("p",{className:"mt-2",children:["小提示:","zh-TW"===i?"先看注音,再按紅色按鈕自己唸一次。":`可以拆成「${function(e){if(e.includes(" "))return e.split(" ").join(" / ");if(e.length<=4)return e;let t=Math.ceil(e.length/2);return`${e.slice(0,t)} / ${e.slice(t)}`}(e)}」,放慢速度再試一次。`]}),B.ok&&b?(0,t.jsx)("button",{type:"button",disabled:A,onClick:function(){B?.ok&&!A&&(z(!0),b?.(B))},className:"mt-3 min-h-12 rounded-2xl bg-green-700 px-5 py-3 text-base font-black text-white shadow-sm disabled:bg-green-200 disabled:text-green-800",children:A?"已理解,可以前進":"我看懂了,完成口說"}):null]}):(0,t.jsx)("p",{"aria-live":"polite",className:"mt-3 min-h-16 rounded-2xl bg-white/65 p-3 text-sm font-bold leading-7 text-stone-500",children:null!==T?"先看著目標內容準備,倒數結束再開始說。":N?"麥克風已開啟,請孩子現在開始說;唸完後停一下,系統會自動判斷。":"尚未開始。按紅色按鈕後會先倒數 3 秒,再給孩子足夠時間朗讀。"}),x?(0,t.jsxs)("details",{className:"mt-3 rounded-2xl bg-white/70 px-4 py-3",children:[(0,t.jsx)("summary",{className:"cursor-pointer text-sm font-black text-stone-600",children:"家長協助確認(選用)"}),(0,t.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("button",{type:"button",onClick:()=>Z(!0),className:"rounded-xl bg-mint px-3 py-2 text-xs font-black text-green-800",children:"聽起來正確"}),(0,t.jsx)("button",{type:"button",onClick:()=>Z(!1),className:"rounded-xl bg-white px-3 py-2 text-xs font-black text-amber-900 shadow-sm",children:"需要再練"})]})]}):null]})}],47106)},30599,e=>{"use strict";var t=e.i(43476);e.s(["LearningPageFrame",0,function({children:e}){return(0,t.jsx)("div",{className:"mx-auto flex w-full max-w-[1480px] flex-col gap-6 pb-10",children:e})}])},82836,e=>{"use strict";var t=e.i(43476);e.s(["ResultBox",0,function({title:e,children:n}){return(0,t.jsxs)("section",{className:"rounded-2xl border border-softline bg-[#f4f1eb] p-5 text-stone-700",children:[(0,t.jsx)("p",{className:"text-lg font-black text-ink",children:e}),(0,t.jsx)("div",{className:"mt-3 leading-8",children:n})]})}])},71556,74761,24038,e=>{"use strict";var t=e.i(43476);let n={answer:"[ˈænsɚ]",afternoon:"[ˌæftɚˈnun]",advertise:"[ˈædvɚˌtaɪz]",apple:"[ˈæpəl]",bag:"[bæɡ]",blue:"[blu]",book:"[bʊk]",bread:"[brɛd]",breakfast:"[ˈbrɛkfəst]",brother:"[ˈbrʌðɚ]",classroom:"[ˈklæsˌrum]",cloudy:"[ˈklaʊdɪ]",dinner:"[ˈdɪnɚ]",draw:"[drɔ]",eraser:"[ɪˈresɚ]",evening:"[ˈivnɪŋ]",father:"[ˈfɑðɚ]",foot:"[fʊt]",friend:"[frɛnd]",goodbye:"[ˌɡʊdˈbaɪ]",green:"[grin]",hand:"[hænd]",happy:"[ˈhæpɪ]",hat:"[hæt]",head:"[hɛd]",hello:"[həˈlo]",homework:"[ˈhomˌwɝk]",hospital:"[ˈhɑspɪtəl]",hungry:"[ˈhʌŋɡrɪ]",left:"[lɛft]",library:"[ˈlaɪˌbrɛrɪ]",listen:"[ˈlɪsən]",lunch:"[lʌntʃ]",market:"[ˈmɑrkɪt]",milk:"[mɪlk]",morning:"[ˈmɔrnɪŋ]",mother:"[ˈmʌðɚ]",near:"[nɪr]",park:"[pɑrk]",pencil:"[ˈpɛnsəl]",play:"[ple]",please:"[pliz]",practice:"[ˈpræktɪs]",question:"[ˈkwɛstʃən]",rainy:"[ˈrenɪ]",read:"[rid]",ready:"[ˈrɛdɪ]",red:"[rɛd]",right:"[raɪt]",river:"[ˈrɪvɚ]",review:"[rɪˈvju]",room:"[rum]",sad:"[sæd]",shirt:"[ʃɝt]",shoes:"[ʃuz]",sick:"[sɪk]",sister:"[ˈsɪstɚ]",sleep:"[slip]",speak:"[spik]",station:"[ˈsteʃən]",store:"[stɔr]",study:"[ˈstʌdɪ]",sunny:"[ˈsʌnɪ]",school:"[skul]",table:"[ˈtebəl]",teacher:"[ˈtitʃɚ]","thank you":"[θæŋk ju]",thirsty:"[ˈθɝstɪ]",tired:"[taɪrd]",today:"[təˈde]",tree:"[tri]",one:"[wʌn]",two:"[tu]",three:"[θri]",wake:"[wek]",water:"[ˈwɔtɚ]",weather:"[ˈwɛðɚ]",windy:"[ˈwɪndɪ]",write:"[raɪt]",yellow:"[ˈjɛlo]"};function r(e,t=""){let s;return n[e.trim().toLowerCase()]??((s=t.trim().replace(/^\[|\]$/g,"").replaceAll("ә","ə").replaceAll("є","ɛ").replaceAll("ɒ","ɑ").replaceAll(":","ː").replace(/^'/,"ˈ").replaceAll(",","ˌ"))?`[${s}]`:"")}e.s(["getKKPhonetic",0,r],74761);var s=e.i(32324),l=e.i(12408);e.s(["ChildFriendlyExplanation",0,function({word:e,meaning:n,example:a,exampleMeaning:i,usage:o,correct:c,grade:d}){let u=r(e),h=d<=6;return(0,t.jsxs)("section",{className:`mt-5 rounded-3xl border p-5 ${c?"border-green-200 bg-green-50":"border-rose-200 bg-rose-50"}`,"aria-live":"polite",children:[(0,t.jsx)("p",{className:`text-sm font-black ${c?"text-green-800":"text-rose-800"}`,children:c?"答對解析":"再看一次就會了"}),(0,t.jsx)("h4",{className:"mt-2 text-2xl font-black text-ink",children:"小小解析"}),(0,t.jsxs)("div",{className:"mt-4 grid gap-4 md:grid-cols-2",children:[(0,t.jsxs)("div",{className:"border-b border-black/5 pb-4 md:border-b-0 md:border-r md:pb-0 md:pr-4",children:[(0,t.jsx)("p",{className:"text-xs font-black text-stone-500",children:"答案是"}),(0,t.jsxs)("button",{type:"button",onClick:()=>(0,l.speakEnglish)(e,{rate:.74}),className:"mt-2 text-left",children:[(0,t.jsx)("span",{className:"block text-3xl font-black text-blue-700",children:e}),u?(0,t.jsxs)("span",{className:"mt-1 block text-sm font-black text-blue-500",children:["KK ",u,"|點一下聽"]}):null]}),(0,t.jsx)("button",{type:"button",onClick:()=>(0,l.speakMandarin)(n,{rate:.76}),className:"mt-3 rounded-2xl bg-white/80 px-4 py-3 text-left font-black text-ink shadow-sm",children:(0,t.jsx)(s.ZhuyinText,{text:n,show:h})})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-xs font-black text-stone-500",children:"放進句子就懂了"}),(0,t.jsxs)("button",{type:"button",onClick:()=>(0,l.speakEnglish)(a,{rate:.72}),className:"mt-2 block text-left text-lg font-black leading-7 text-amber-900",children:[a,(0,t.jsx)("span",{className:"mt-1 block text-xs text-amber-700",children:"點一下聽例句"})]}),(0,t.jsx)("button",{type:"button",onClick:()=>(0,l.speakMandarin)(i,{rate:.76}),className:"mt-3 text-left font-bold leading-7 text-stone-700",children:(0,t.jsx)(s.ZhuyinText,{text:i,show:h})})]})]}),(0,t.jsxs)("p",{className:"mt-4 rounded-2xl bg-white/70 px-4 py-3 text-sm font-bold leading-7 text-stone-700",children:["記一記:先聽一次,再跟著說一次。",o?`在「${o}」的時候,就可以想到 ${e}。`:`把 ${e} 和「${n}」放在一起記。`]})]})}],71556);var a=e.i(9034),i=e.i(62164),o=e.i(34295);let c="chenguang-english-word-rotation-v2";e.s(["getNextEnglishQuestionSet",0,function({personId:e,grade:t,count:n=10,category:r,requestId:s}){var l,d,u;let h=(0,a.getTeachableVocabularyForGrade)(t),m=r?h.filter(e=>e.category===r):h,p=m.length>0?m:h,x=`${t}:${r??"all"}`,g=`${p.length}:${p[0]?.id??"empty"}:${p.at(-1)?.id??"empty"}`,b=(0,o.readPersonStorage)(c,e,{version:2,recentIds:[],lanes:{}}),f=b.lanes[x]??{cycle:0,cursor:0,poolSignature:g};if(f.poolSignature!==g&&(f={cycle:0,cursor:0,poolSignature:g}),f.lastRequestId===s&&f.lastSelectionIds?.length){let e=new Map(p.map(e=>[e.id,e])),t=f.lastSelectionIds.map(t=>e.get(t)).filter(e=>!!e);if(t.length>0)return{words:t,questions:(0,i.generateEnglishQuizFromWords)(t,h,f.cursor),poolSize:p.length,cycle:f.cycle,position:Math.min(f.cursor,p.length)}}let w=new Set(p.map(e=>e.id)),k=new Set(b.recentIds.filter(e=>w.has(e))),y=[],j=new Set,v=f.cycle,N=f.cursor,S=0,M=Math.max(3*p.length,4*n);for(;y.length<Math.min(n,p.length)&&S<M;){N>=p.length&&(v+=1,N=0);let t=function(e,t){let n=[...e],r=function(e){let t=0x811c9dc5;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,0x1000193);return t>>>0}(t)||1;for(let e=n.length-1;e>0;e-=1){let t=(r=Math.imul(r,1664525)+0x3c6ef35f>>>0)%(e+1);[n[e],n[t]]=[n[t],n[e]]}return n}(p,`${e}:${x}:${v}`)[N];N+=1,S+=1,!t||j.has(t.id)||p.length>k.size+y.length&&k.has(t.id)||(y.push(t),j.add(t.id))}f={cycle:v,cursor:N,poolSignature:g,lastRequestId:s,lastSelectionIds:y.map(e=>e.id)};let $={version:2,recentIds:(l=y.map(e=>e.id),d=b.recentIds,u=p.length,Array.from(new Set([...l,...d])).slice(0,Math.min(240,Math.max(0,u-1)))),lanes:{...b.lanes,[x]:f}};return(0,o.writePersonStorage)(c,e,$),{words:y,questions:(0,i.generateEnglishQuizFromWords)(y,h,N),poolSize:p.length,cycle:v,position:Math.min(N,p.length)}}],24038)}]);
_next/static/chunks/3794-cb526b88d93b741f.js DELETED
The diff for this file is too large to render. See raw diff
 
_next/static/chunks/3899.cf10152d8085e352.js DELETED
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3899],{3899:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return h}});let r=n(4252),o=n(7876),a=r._(n(4232)),i=r._(n(8005)),l={400:"Bad Request",404:"This page could not be found",405:"Method Not Allowed",500:"Internal Server Error"};function d({req:e,res:t,err:n}){return{statusCode:t&&t.statusCode?t.statusCode:n?n.statusCode:404,hostname:window.location.hostname}}let s={fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",textAlign:"center",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},u={lineHeight:"48px"},c={display:"inline-block",margin:"0 20px 0 0",paddingRight:23,fontSize:24,fontWeight:500,verticalAlign:"top"},f={fontSize:14,fontWeight:400,lineHeight:"28px"},p={display:"inline-block"};class h extends a.default.Component{static{this.displayName="ErrorPage"}static{this.getInitialProps=d}static{this.origGetInitialProps=d}render(){let{statusCode:e,withDarkMode:t=!0}=this.props,n=this.props.title||l[e]||"An unexpected error has occurred";return(0,o.jsxs)("div",{style:s,children:[(0,o.jsx)(i.default,{children:(0,o.jsx)("title",{children:e?`${e}: ${n}`:"Application error: a client-side exception has occurred"})}),(0,o.jsxs)("div",{style:u,children:[(0,o.jsx)("style",{dangerouslySetInnerHTML:{__html:`body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}${t?"@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}":""}`}}),e?(0,o.jsx)("h1",{className:"next-error-h1",style:c,children:e}):null,(0,o.jsx)("div",{style:p,children:(0,o.jsxs)("h2",{style:f,children:[this.props.title||e?n:(0,o.jsxs)(o.Fragment,{children:["Application error: a client-side exception has occurred"," ",!!this.props.hostname&&(0,o.jsxs)(o.Fragment,{children:["while loading ",this.props.hostname]})," ","(see the browser console for more information)"]}),"."]})})]})]})}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},8005:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});var r={default:function(){return y},defaultHead:function(){return c}};for(var o in r)Object.defineProperty(t,o,{enumerable:!0,get:r[o]});let a=n(4252),i=n(8365),l=n(7876),d=i._(n(4232)),s=a._(n(9762)),u=n(941);function c(){return[(0,l.jsx)("meta",{charSet:"utf-8"},"charset"),(0,l.jsx)("meta",{name:"viewport",content:"width=device-width"},"viewport")]}function f(e,t){return"string"==typeof t||"number"==typeof t?e:t.type===d.default.Fragment?e.concat(d.default.Children.toArray(t.props.children).reduce((e,t)=>"string"==typeof t||"number"==typeof t?e:e.concat(t),[])):e.concat(t)}n(7897);let p=["name","httpEquiv","charSet","itemProp"];function h(e){let t,n,r,o;return e.reduce(f,[]).reverse().concat(c().reverse()).filter((t=new Set,n=new Set,r=new Set,o={},e=>{let a=!0,i=!1;if(e.key&&"number"!=typeof e.key&&e.key.indexOf("$")>0){i=!0;let n=e.key.slice(e.key.indexOf("$")+1);t.has(n)?a=!1:t.add(n)}switch(e.type){case"title":case"base":n.has(e.type)?a=!1:n.add(e.type);break;case"meta":for(let t=0,n=p.length;t<n;t++){let n=p[t];if(e.props.hasOwnProperty(n))if("charSet"===n)r.has(n)?a=!1:r.add(n);else{let t=e.props[n],r=o[n]||new Set;("name"!==n||!i)&&r.has(t)?a=!1:(r.add(t),o[n]=r)}}}return a})).reverse().map((e,t)=>{let n=e.key||t;return d.default.cloneElement(e,{key:n})})}let y=function({children:e}){let t=(0,d.useContext)(u.HeadManagerContext);return(0,l.jsx)(s.default,{reduceComponentsToState:h,headManager:t,children:e})};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},9762:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return i}});let r=n(4232),o=r.useLayoutEffect,a=r.useEffect;function i(e){let{headManager:t,reduceComponentsToState:n}=e;function i(){if(t&&t.mountedInstances){let e=r.Children.toArray(Array.from(t.mountedInstances).filter(Boolean));t.updateHead(n(e))}}return o(()=>(t?.mountedInstances?.add(e.children),()=>{t?.mountedInstances?.delete(e.children)})),o(()=>(t&&(t._pendingUpdate=i),()=>{t&&(t._pendingUpdate=i)})),a(()=>(t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null),()=>{t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null)})),null}}}]);
 
 
_next/static/chunks/39ivbka3u9lh7.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,51668,e=>{"use strict";let t=[{id:"g1-ren",grade:1,character:"人",zhuyin:"ㄖㄣˊ",word:"人們",meaning:"一個人或很多人。",example:"我們都是有禮貌的人。",strokeHint:"先撇再捺,兩筆要站穩。"},{id:"g1-shang",grade:1,character:"上",zhuyin:"ㄕㄤˋ",word:"上學",meaning:"位置在高處,或開始去學校。",example:"我早上去上學。",strokeHint:"中間一豎要直,下面一橫要平。"},{id:"g1-da",grade:1,character:"大",zhuyin:"ㄉㄚˋ",word:"大家",meaning:"尺寸很大,也可以表示很多人。",example:"大家一起讀故事。",strokeHint:"先橫,再撇,最後捺要打開。"},{id:"g1-xiao",grade:1,character:"小",zhuyin:"ㄒㄧㄠˇ",word:"小手",meaning:"尺寸不大。",example:"我用小手寫字。",strokeHint:"中間豎鉤站直,兩點不要太遠。"},{id:"g1-ri",grade:1,character:"日",zhuyin:"ㄖˋ",word:"日子",meaning:"太陽或一天。",example:"今天是好日子。",strokeHint:"外框方正,中間一橫不要太斜。"},{id:"g1-yue",grade:1,character:"月",zhuyin:"ㄩㄝˋ",word:"月亮",meaning:"夜晚天空中的月亮。",example:"月亮掛在天空。",strokeHint:"外框窄長,裡面兩橫平均。"},{id:"g1-shui",grade:1,character:"水",zhuyin:"ㄕㄨㄟˇ",word:"喝水",meaning:"可以喝、洗東西的液體。",example:"運動後要喝水。",strokeHint:"中間豎鉤先寫,左右筆畫像水流。"},{id:"g1-mu",grade:1,character:"木",zhuyin:"ㄇㄨˋ",word:"木頭",meaning:"樹木的材料。",example:"桌子是木頭做的。",strokeHint:"先橫再豎,撇捺要張開。"},{id:"g1-shou",grade:1,character:"手",zhuyin:"ㄕㄡˇ",word:"小手",meaning:"用來拿東西、寫字的身體部位。",example:"我把手洗乾淨。",strokeHint:"三橫間距平均,豎鉤往下穩。"},{id:"g1-kou",grade:1,character:"口",zhuyin:"ㄎㄡˇ",word:"開口",meaning:"嘴巴,也表示說話。",example:"我勇敢開口回答。",strokeHint:"外框寫方,最後一橫封起來。"},{id:"g2-xue",grade:2,character:"學",zhuyin:"ㄒㄩㄝˊ",word:"學習",meaning:"學新的知識或能力。",example:"我每天開心學習。",strokeHint:"上半部不要擠,下面子字要端正。"},{id:"g2-jia",grade:2,character:"家",zhuyin:"ㄐㄧㄚ",word:"家庭",meaning:"和家人一起生活的地方。",example:"家是溫暖的地方。",strokeHint:"寶蓋頭蓋住下面,彎鉤自然。"},{id:"g2-you",grade:2,character:"友",zhuyin:"ㄧㄡˇ",word:"朋友",meaning:"一起玩、互相照顧的人。",example:"我和朋友分享玩具。",strokeHint:"撇要舒展,又字收穩。"},{id:"g2-shu",grade:2,character:"書",zhuyin:"ㄕㄨ",word:"書本",meaning:"可以閱讀的本子。",example:"我喜歡看故事書。",strokeHint:"橫畫多,要保持間距。"},{id:"g2-hua",grade:2,character:"花",zhuyin:"ㄏㄨㄚ",word:"花朵",meaning:"植物開出的美麗部分。",example:"公園裡有很多花。",strokeHint:"草字頭寬,下面化字站穩。"},{id:"g2-kan",grade:2,character:"看",zhuyin:"ㄎㄢˋ",word:"看見",meaning:"用眼睛觀察。",example:"我看見一隻小鳥。",strokeHint:"上方像手,下面目字要方正。"},{id:"g3-yu",grade:3,character:"語",zhuyin:"ㄩˇ",word:"語文",meaning:"說話和文字。",example:"語文課可以讀故事。",strokeHint:"言字旁偏窄,右邊要分層。"},{id:"g3-du",grade:3,character:"讀",zhuyin:"ㄉㄨˊ",word:"閱讀",meaning:"看文字並理解意思。",example:"我每天閱讀十分鐘。",strokeHint:"左右結構要平衡,貝字收小。"},{id:"g3-xiang",grade:3,character:"想",zhuyin:"ㄒㄧㄤˇ",word:"想法",meaning:"心裡思考。",example:"我說出自己的想法。",strokeHint:"相在上方,心在下方要穩。"},{id:"g3-qing",grade:3,character:"情",zhuyin:"ㄑㄧㄥˊ",word:"心情",meaning:"心裡的感覺。",example:"今天我的心情很好。",strokeHint:"豎心旁要窄,青字橫畫平均。"},{id:"g3-zhuang",grade:3,character:"莊",zhuyin:"ㄓㄨㄤ",word:"村莊",meaning:"人們聚居生活的村落,也可以用在地名或姓氏。",example:"河邊有一個安靜的村莊。",strokeHint:"草字頭要平穩,下方的壯要寫得端正。"},{id:"g4-cha",grade:4,character:"察",zhuyin:"ㄔㄚˊ",word:"觀察",meaning:"仔細看、仔細想。",example:"我們觀察植物生長。",strokeHint:"寶蓋頭舒展,下方筆畫不要擠。"},{id:"g4-guan",grade:4,character:"管",zhuyin:"ㄍㄨㄢˇ",word:"管理",meaning:"安排與照顧。",example:"我會管理自己的書包。",strokeHint:"竹字頭要輕,官字端正。"},{id:"g4-zhai",grade:4,character:"摘",zhuyin:"ㄓㄞ",word:"摘要",meaning:"取出內容中最重要的部分。",example:"我把文章重點整理成摘要。",strokeHint:"提手旁寫窄,右邊上下要對齊。"},{id:"g4-yao",grade:4,character:"要",zhuyin:"ㄧㄠˋ",word:"重要",meaning:"必須注意或很有價值。",example:"閱讀時要找出重要線索。",strokeHint:"上方扁而穩,女字底��托住上方。"},{id:"g4-zhang",grade:4,character:"章",zhuyin:"ㄓㄤ",word:"文章",meaning:"由句子和段落組成的文字內容。",example:"這篇文章介紹海洋。",strokeHint:"上方音字收緊,下方十字站直。"},{id:"g4-li",grade:4,character:"理",zhuyin:"ㄌㄧˇ",word:"理解",meaning:"知道內容在說什麼。",example:"我讀完後能理解主旨。",strokeHint:"王字旁窄,里字橫畫平均。"},{id:"g5-bian",grade:5,character:"辨",zhuyin:"ㄅㄧㄢˋ",word:"辨認",meaning:"分清楚不同的地方。",example:"我能辨認相似的字。",strokeHint:"左中右要平均,不要寫太寬。"},{id:"g5-lun",grade:5,character:"論",zhuyin:"ㄌㄨㄣˋ",word:"討論",meaning:"交換想法。",example:"我們一起討論答案。",strokeHint:"言字旁偏窄,右邊層次清楚。"},{id:"g5-ce",grade:5,character:"策",zhuyin:"ㄘㄜˋ",word:"策略",meaning:"為了完成目標所安排的方法。",example:"找關鍵字是一種閱讀策略。",strokeHint:"竹字頭要輕,下方筆畫保持中央。"},{id:"g5-ju",grade:5,character:"據",zhuyin:"ㄐㄩˋ",word:"證據",meaning:"能支持說法的資料或事實。",example:"請從文章找出證據。",strokeHint:"提手旁窄,右邊層次清楚。"},{id:"g5-bi",grade:5,character:"比",zhuyin:"ㄅㄧˇ",word:"比較",meaning:"找出兩件事相同或不同的地方。",example:"我們比較兩篇文章的觀點。",strokeHint:"左右兩部分靠近,豎彎鉤要穩。"},{id:"g5-xi",grade:5,character:"析",zhuyin:"ㄒㄧ",word:"分析",meaning:"把內容拆開來仔細理解。",example:"分析圖表後再回答問題。",strokeHint:"木字旁窄,斤字撇畫舒展。"},{id:"g6-bian",grade:6,character:"辯",zhuyin:"ㄅㄧㄢˋ",word:"辯論",meaning:"用理由說明自己的想法。",example:"辯論時要尊重別人。",strokeHint:"左中右結構要緊湊。"},{id:"g6-zheng",grade:6,character:"證",zhuyin:"ㄓㄥˋ",word:"證明",meaning:"用理由或資料說明是真的。",example:"請用例子證明你的想法。",strokeHint:"左窄右寬,登字要站穩。"},{id:"g6-tong",grade:6,character:"統",zhuyin:"ㄊㄨㄥˇ",word:"統整",meaning:"把分散的內容整理成完整架構。",example:"考前要統整學過的重點。",strokeHint:"糸字旁窄,右邊上緊下穩。"},{id:"g6-tui",grade:6,character:"推",zhuyin:"ㄊㄨㄟ",word:"推論",meaning:"根據線索想出合理的結果。",example:"我從人物行動推論他的心情。",strokeHint:"提手旁窄,隹字四橫要平均。"},{id:"g6-guan",grade:6,character:"觀",zhuyin:"ㄍㄨㄢ",word:"觀點",meaning:"一個人看事情的想法和立場。",example:"文章提出兩種不同觀點。",strokeHint:"左邊筆畫多要收緊,見字底穩。"},{id:"g6-jie",grade:6,character:"接",zhuyin:"ㄐㄧㄝ",word:"銜接",meaning:"把前後內容連起來。",example:"這個單元幫助我們銜接國中。",strokeHint:"提手旁窄,右邊妾字上下對正。"}];e.s(["chineseHandwritingWords",0,t,"getChineseHandwritingWordsByGrade",0,function(e){return t.filter(t=>t.grade===e)}])},4914,e=>{"use strict";let t=[{id:"grade-1-concrete-words",grades:[1],src:"/images/chinese/grade-1-picture-learning.webp",alt:"小學生在明亮教室裡指著樹木圖卡朗讀,桌上有故事書、水杯和書包",caption:"先找找看:圖裡有哪些人、物品和動作?再把看到的內容說成一句話。",observationPrompts:["孩子用哪一隻手指圖卡?","窗外是白天還是晚上?","桌上有哪些學習用品?"]},{id:"grade-2-home-reading",grades:[2],src:"/images/chinese/grade-2-picture-learning.webp",alt:"兩位小學生和家人在溫暖的家中一起看故事書,桌上有花和筆記本",caption:"看看人物正在做什麼,再找出「家、友、書、花、看、學」的生活線索。",observationPrompts:["誰正在拿書?","朋友用手指出了什麼?","家人怎麼陪伴孩子閱讀?"]},{id:"grade-3-4-reading",grades:[3,4],src:"/images/chinese/grade-3-4-reading.webp",alt:"兩位小學生觀察葉片、閱讀植物文章、排列生長圖片並整理筆記",caption:"從圖中的觀察、閱讀與排列動作,找出故事順序和文章重點。",observationPrompts:["放大鏡正在觀察什麼?","三張圖片的先後順序是什麼?","筆記可以寫下哪一句重點?"]},{id:"grade-5-6-evidence-reading",grades:[5,6],src:"/images/chinese/grade-5-6-reading.webp",alt:"三位高年級學生在圖書館比較文章、找證據、整理重點並討論觀點",caption:"先看資料,再說理由:哪些內容是線索、哪些內容能支持結論?",observationPrompts:["學生正在比較哪兩份資料?","便利貼可能記錄了哪些證據?","說明觀點時,為什麼要先聽完別人的理由?"]}];e.s(["getChineseIllustrationForGrade",0,function(e){return t.find(t=>t.grades.includes(e))??t[0]}])},16549,e=>{"use strict";var t=e.i(51668),r=e.i(4914);let a={"g1-ren":{radical:"人",strokes:2,picture:"兩個人一起走",pictureDescription:"兩個人互相陪伴,一起往前走。"},"g1-shang":{radical:"一",strokes:3,picture:"箭頭往上",pictureDescription:"箭頭指向高處,表示上方。"},"g1-da":{radical:"大",strokes:3,picture:"一大一小兩個圓",pictureDescription:"比較兩個圓,較大的就是「大」。"},"g1-xiao":{radical:"小",strokes:3,picture:"一小一大兩個圓",pictureDescription:"比較兩個圓,較小的就是「小」。"},"g1-ri":{radical:"日",strokes:4,picture:"太陽",pictureDescription:"白天看見太陽,也可以想到一天的日子。"},"g1-yue":{radical:"月",strokes:4,picture:"月亮",pictureDescription:"夜晚天空中的月亮。"},"g1-shui":{radical:"水",strokes:4,picture:"水滴",pictureDescription:"可以喝、可以洗東西的水。"},"g1-mu":{radical:"木",strokes:4,picture:"樹木",pictureDescription:"樹幹和樹枝讓人想到木頭。"},"g1-shou":{radical:"手",strokes:4,picture:"一隻手",pictureDescription:"可以拿東西、寫字和打招呼的手。"},"g1-kou":{radical:"口",strokes:3,picture:"張開的嘴巴",pictureDescription:"用嘴巴吃東西,也用口說話。"},"g2-xue":{radical:"子",strokes:16,picture:"課本和鉛筆",pictureDescription:"打開課本、拿起鉛筆,就是在學習。"},"g2-jia":{radical:"宀",strokes:10,picture:"一間房子",pictureDescription:"家人一起生活的溫暖房子。"},"g2-you":{radical:"又",strokes:4,picture:"兩隻手握在一起",pictureDescription:"朋友互相幫忙、一起分享。"},"g2-shu":{radical:"曰",strokes:10,picture:"打開的書",pictureDescription:"翻開書本,可以讀到文字和故事。"},"g2-hua":{radical:"艸",strokes:7,picture:"一朵花",pictureDescription:"植物開出的花朵。"},"g2-kan":{radical:"目",strokes:9,picture:"一雙眼睛",pictureDescription:"用眼睛仔細觀察,就是看。"},"g3-yu":{radical:"言",strokes:14,picture:"對話框",pictureDescription:"用說話和文字表達語言。"},"g3-du":{radical:"言",strokes:22,picture:"正在閱讀的書",pictureDescription:"看著文字並理解內容,就是讀。"},"g3-xiang":{radical:"心",strokes:13,picture:"想法泡泡",pictureDescription:"安靜思考,心裡出現一個想法。"},"g3-qing":{radical:"心",strokes:11,picture:"一顆心",pictureDescription:"開心、難過都是心裡的感情。"},"g3-zhuang":{radical:"艸",strokes:11,picture:"屋舍與田野",pictureDescription:"幾間屋舍聚在田野旁,形成大家生活的村莊。"},"g4-cha":{radical:"宀",strokes:14,picture:"放大鏡看葉子",pictureDescription:"拿放大鏡仔細看葉脈,找出細節。"},"g4-guan":{radical:"竹",strokes:14,picture:"整理好的書包",pictureDescription:"把物品分類放好,表示有條理地管理。"},"g4-zhai":{radical:"手",strokes:14,picture:"文章圈出重點",pictureDescription:"從一段文字中圈出最重要的內容。"},"g4-yao":{radical:"襾",strokes:9,picture:"星號標記重點",pictureDescription:"用星號標出需要特別注意的內容。"},"g4-zhang":{radical:"立",strokes:11,picture:"三段文字",pictureDescription:"幾個段落依順序組成一篇文章。"},"g4-li":{radical:"玉",strokes:11,picture:"想法連成線",pictureDescription:"把線索連起來,就能理解內容。"},"g5-bian":{radical:"辛",strokes:16,picture:"找不同",pictureDescription:"仔細找出兩個相似內容不同的地方。"},"g5-lun":{radical:"言",strokes:15,picture:"多人交換想法",pictureDescription:"大家輪流說明理由並聽別人的想法。"},"g5-ce":{radical:"竹",strokes:12,picture:"步驟清單",pictureDescription:"先安排步驟,再依方法完成目標。"},"g5-ju":{radical:"手",strokes:16,picture:"資料支持答案",pictureDescription:"用文章線索或資料支持自己的答案。"},"g5-bi":{radical:"比",strokes:4,picture:"兩欄比較表",pictureDescription:"把兩件事放在一起,找相同與不同。"},"g5-xi":{radical:"木",strokes:8,picture:"內容拆成小塊",pictureDescription:"把複雜內容分成幾個部分逐一理解。"},"g6-bian":{radical:"辛",strokes:21,picture:"兩方提出理由",pictureDescription:"兩方用理由和證據說明不同立場。"},"g6-zheng":{radical:"言",strokes:19,picture:"證據指向結論",pictureDescription:"資料和例子共同支持一個結論。"},"g6-tong":{radical:"糸",strokes:12,picture:"重點整理圖",pictureDescription:"把不同單元的重點整理到同一張圖。"},"g6-tui":{radical:"手",strokes:11,picture:"線索指向答案",pictureDescription:"從已知線索一步步想出合理結果。"},"g6-guan":{radical:"見",strokes:24,picture:"不同角度看同一件事",pictureDescription:"站在不同位置,可能會有不同看法。"},"g6-jie":{radical:"手",strokes:11,picture:"兩段道路連接",pictureDescription:"把前一段學習和下一階段順利連起來。"}},n={注音符號:"口",聲調練習:"口",基礎生字:"人",常見詞語:"手",朗讀練習:"日",生字與部首:"學",造詞與語意:"友",短文閱讀:"書",常用國字與部首:"語",詞語理解:"想",段落理解:"讀",成語與詞義:"理",段落結構:"章",摘要練習:"摘",因果推論:"理",說明文閱讀:"察",字詞辨析:"辨",複句關��:"析",閱讀策略:"策",主旨與摘要:"析",觀點與事實:"據",文本比較:"比",成語與語境:"觀",文本結構:"統",閱讀推論:"推",跨文本閱讀:"接",論點與證據:"證",演說與辯論:"辯",國中銜接閱讀:"接"},i={"g2-xue":{aliases:["学"],variantNote:"「学」是中國大陸常見簡化字,臺灣課程使用「學」。"},"g2-shu":{aliases:["书"],variantNote:"「书」是中國大陸常見簡化字,臺灣課程使用「書」。"},"g3-yu":{aliases:["语"],variantNote:"「语」是中國大陸常見簡化字,臺灣課程使用「語」。"},"g3-du":{aliases:["读"],variantNote:"「读」是中國大陸常見簡化字,臺灣課程使用「讀」。"},"g3-zhuang":{aliases:["庄"],variantNote:"「庄」可作「莊」的異體字;臺灣國小一般書寫正字「莊」。"},"g6-zheng":{aliases:["证"],variantNote:"「证」是中國大陸常見簡化字,臺灣課程使用「證」。"},"g6-tong":{aliases:["统"],variantNote:"「统」是中國大陸常見簡化字,臺灣課程使用「統」。"},"g6-guan":{aliases:["观"],variantNote:"「观」是中國大陸常見簡化字,臺灣課程使用「觀」。"}},s=t.chineseHandwritingWords.filter(e=>a[e.id]).map(e=>({...e,...a[e.id],...i[e.id]}));function c(e){return Array.from(e).reduce((e,t)=>e+t.charCodeAt(0),0)}function l(e){let t=s.filter(t=>t.grade===e);return t.length>=4?t:s.filter(t=>t.grade<=e).slice(-10)}e.s(["chineseDictionary",0,s,"findChineseDictionaryEntry",0,function(e){let t=e.normalize("NFKC").trim().replace(/[,。!?、;:,.!?;:\s]/g,"");if(!t)return;let r=s.find(e=>e.character===t);if(r)return{entry:r};for(let e of s){let r=e.aliases?.find(e=>e===t);if(r)return{entry:e,matchedAlias:r}}let a=s.find(e=>e.word===t);if(a)return{entry:a}},"getChineseDictionaryEntries",0,l,"getChineseDictionaryQuestion",0,function(e,t){let a=l(e),i=Object.entries(n).find(([e])=>t.includes(e))?.[1],o=a.find(e=>e.character===i),d=a.length?c(t)%a.length:0,g=o??a[d]??s[0],h=a.filter(e=>e.id!==g.id).slice(0,3),u=[g,...h].sort((e,r)=>c(`${t}:${e.id}`)-c(`${t}:${r.id}`)).map(e=>e.character);return{entry:g,options:u,illustration:(0,r.getChineseIllustrationForGrade)(e)}}])},66113,e=>{"use strict";var t=e.i(43476),r=e.i(71645);function a({feedback:e}){let r="excellent"===e.verdict||"good"===e.verdict?{shell:"border-green-100 bg-green-50 text-green-950",accent:"text-green-700",score:"text-green-800",badge:"bg-green-100 text-green-800",label:"已辨識為目標字"}:"needs-practice"===e.verdict?{shell:"border-amber-200 bg-amber-50 text-amber-950",accent:"text-amber-800",score:"text-amber-800",badge:"bg-amber-100 text-amber-900",label:"已辨識,還要再練"}:"scribble"===e.verdict?{shell:"border-rose-200 bg-rose-50 text-rose-950",accent:"text-rose-700",score:"text-rose-700",badge:"bg-rose-100 text-rose-800",label:"疑似塗鴉或多餘筆跡"}:{shell:"border-orange-200 bg-orange-50 text-stone-800",accent:"text-orange-700",score:"text-orange-700",badge:"bg-orange-100 text-orange-800",label:"blank"===e.verdict?"筆跡不足,未評分":"未辨識為目標字"};return(0,t.jsxs)("article",{className:`mt-5 rounded-warm border p-5 shadow-sm md:p-7 ${r.shell}`,"aria-live":"polite",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:`text-base font-black ${r.accent}`,children:"裝置端字形辨識"}),(0,t.jsx)("h3",{className:"mt-1 text-3xl font-black",children:"本次手寫檢查"}),(0,t.jsx)("span",{className:`mt-3 inline-flex rounded-full px-4 py-2 text-sm font-black ${r.badge}`,children:r.label})]}),(0,t.jsxs)("div",{className:"rounded-2xl bg-white px-5 py-3 text-right shadow-sm",children:[(0,t.jsxs)("strong",{className:`block text-3xl font-black ${r.score}`,children:[e.score," 分"]}),(0,t.jsxs)("span",{className:"mt-1 block text-sm font-bold text-stone-500",children:["字形吻合度 ",e.confidence,"%"]})]})]}),(0,t.jsx)("p",{className:"mt-4 rounded-2xl bg-white/75 p-4 text-base font-bold leading-8 text-stone-600",children:"本次分數由畫布像素、字形結構與多餘筆跡逐次計算,不是隨機或固定分數。未辨識為目標字時,分數不會進入高分區。"}),(0,t.jsx)("section",{className:"mt-4 grid gap-3 sm:grid-cols-2 lg:grid-cols-4","aria-label":"評分明細",children:e.metrics.map(e=>{var a;return(0,t.jsxs)("div",{className:"rounded-2xl bg-white/80 p-4",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsx)("p",{className:"font-black text-ink",children:e.label}),(0,t.jsx)("strong",{className:`text-lg ${r.score}`,children:e.score})]}),(0,t.jsx)("div",{className:"mt-3 h-2.5 overflow-hidden rounded-full bg-stone-100",children:(0,t.jsx)("div",{className:`h-full rounded-full ${(a=e.score)>=80?"bg-green-500":a>=60?"bg-amber-400":"bg-coral"}`,style:{width:`${e.score}%`}})}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:e.detail})]},e.label)})}),(0,t.jsxs)("section",{className:"mt-4 rounded-2xl bg-white/75 p-5",children:[(0,t.jsx)("p",{className:"text-lg font-black",children:"整體表現"}),(0,t.jsx)("p",{className:"mt-2 text-base font-bold leading-8",children:e.overall})]}),(0,t.jsxs)("section",{className:"mt-4 grid gap-4 md:grid-cols-2",children:[(0,t.jsxs)("div",{className:"rounded-2xl bg-white/75 p-5",children:[(0,t.jsx)("p",{className:"text-lg font-black",children:"做得很好的地方"}),(0,t.jsx)("ul",{className:"mt-3 grid gap-2 text-base font-bold leading-7",children:e.strengths.map(e=>(0,t.jsxs)("li",{className:"flex gap-3",children:[(0,t.jsx)("span",{className:"font-black text-green-700",children:"好"}),(0,t.jsx)("span",{children:e})]},e))})]}),(0,t.jsxs)("div",{className:"rounded-2xl bg-white/75 p-5",children:[(0,t.jsx)("p",{className:"text-lg font-black",children:"下一次注意"}),(0,t.jsx)("ul",{className:"mt-3 grid gap-2 text-base font-bold leading-7",children:e.improvements.map(e=>(0,t.jsxs)("li",{className:"flex gap-3",children:[(0,t.jsx)("span",{className:"font-black text-amber-700",children:"練"}),(0,t.jsx)("span",{children:e})]},e))})]})]}),(0,t.jsxs)("section",{className:"mt-4 rounded-2xl bg-white/75 p-5",children:[(0,t.jsx)("p",{className:"text-lg font-black",children:"下一次怎麼練"}),(0,t.jsx)("p",{className:"mt-2 text-base font-bold leading-8",children:e.nextPractice}),(0,t.jsx)("p",{className:`mt-3 text-lg font-black ${r.accent}`,children:e.encouragement})]})]})}function n({saved:e,analyzing:r,onClear:a,onSave:i,onSubmitFeedback:s}){return(0,t.jsxs)("div",{className:"mt-5 flex flex-wrap items-center gap-3",children:[(0,t.jsx)("button",{className:"rounded-2xl bg-white px-6 py-4 text-lg font-bold text-amber-900 shadow-sm transition hover:bg-cream",type:"button",onClick:a,children:"清除"}),(0,t.jsx)("button",{className:"rounded-2xl bg-butter px-6 py-4 text-lg font-bold text-amber-900 shadow-sm transition hover:bg-amber-100",type:"button",onClick:i,children:"儲存"}),(0,t.jsx)("button",{className:"rounded-2xl bg-coral px-6 py-4 text-lg font-bold text-white shadow-sm transition hover:brightness-105 disabled:cursor-wait disabled:opacity-60",type:"button",disabled:r,onClick:s,children:r?"正在比對字形...":"檢查字形"}),e?(0,t.jsx)("span",{className:"text-base font-bold text-green-800","aria-live":"polite",children:"已儲存到本機"}):null]})}var i=e.i(47106),s=e.i(16549),c=e.i(51668);function l(e,t=0,r=1){return Math.min(r,Math.max(t,e))}function o(e){let t=new Uint8Array(e.width*e.height);for(let r=0;r<t.length;r+=1){let a=4*r,n=e.data[a+3],i=(e.data[a]+e.data[a+1]+e.data[a+2])/3;n>18&&i<225&&(t[r]=1)}return t}function d(e,t,r){let a=t,n=r,i=-1,s=-1,c=0;for(let l=0;l<r;l+=1)for(let r=0;r<t;r+=1)e[l*t+r]&&(c+=1,a=Math.min(a,r),n=Math.min(n,l),i=Math.max(i,r),s=Math.max(s,l));return 0===c||i<a||s<n?null:{left:a,top:n,right:i,bottom:s,width:i-a+1,height:s-n+1,count:c}}function g(e,t){let r=new Uint8Array(e.length),a=t*t;for(let n=0;n<256;n+=1)for(let i=0;i<256;i+=1)if(e[256*n+i])for(let e=-t;e<=t;e+=1){let s=n+e;if(!(s<0)&&!(s>=256))for(let n=-t;n<=t;n+=1){if(n*n+e*e>a)continue;let t=i+n;t<0||t>=256||(r[256*s+t]=1)}}return r}function h(e){let t=0;for(let r of e)t+=r;return t}function u(e,t){let r=0;for(let a=0;a<e.length;a+=1)e[a]&&t[a]&&(r+=1);return r}function m(e,t,r,a){return e>=t&&e<=r?1:e<t?l(1-(t-e)/a):l(1-(e-r)/a)}function p(e){let t=new Float32Array(144),r=256/12;for(let a=0;a<256;a+=1)for(let n=0;n<256;n+=1){if(!e[256*a+n])continue;let i=Math.min(11,Math.floor(n/r)),s=Math.min(11,Math.floor(a/r));t[12*s+i]+=1}let a=r*r;for(let e=0;e<t.length;e+=1)t[e]=l(t[e]/(.28*a));return t}function x(e,t){let r=new Float32Array(256);for(let a=0;a<256;a+=1)for(let n=0;n<256;n+=1)e[256*a+n]&&(r["row"===t?a:n]+=1);let a=0;for(let e of r)a+=e;if(a>0)for(let e=0;e<r.length;e+=1)r[e]/=a;return r}function b(e,t){let r=0;for(let a=0;a<e.length;a+=1)r+=Math.abs(e[a]-t[a]);return l(1-r/2)}function f(e,t,r,a){return l(.42*e+.28*t+.18*r+.12*a)}function w(e,t){var r,a;let n,i,s,c,m=((s=document.createElement("canvas")).width=256,s.height=256,(c=s.getContext("2d",{willReadFrequently:!0}))?(c.clearRect(0,0,256,256),c.fillStyle="#111827",c.font='900 190px "Microsoft JhengHei", "PingFang TC", sans-serif',c.textAlign="center",c.textBaseline="middle",c.fillText(t,128,136),o(c.getImageData(0,0,256,256))):new Uint8Array(65536)),w=g(m,5),k=g(e,7),y=Math.max(1,h(e)),j=Math.max(1,h(m)),N=u(e,w)/y,v=u(m,k)/j,M=N+v===0?0:2*N*v/(N+v),z=function(e,t){let r=0,a=0,n=0;for(let i=0;i<e.length;i+=1)r+=e[i]*t[i],a+=e[i]*e[i],n+=t[i]*t[i];return 0===a||0===n?0:l(r/Math.sqrt(a*n))}(p(e),p(m)),D=(b(x(e,"row"),x(m,"row"))+b(x(e,"column"),x(m,"column")))/2,H=(r=e,a=m,n=d(r,256,256),i=d(a,256,256),n&&i?l(1-Math.abs(Math.log(n.width/Math.max(1,n.height)/(i.width/Math.max(1,i.height))))/.9):0);return{strictSimilarity:M,precision:N,recall:v,gridSimilarity:z,projectionSimilarity:D,aspectSimilarity:H,shapeScore:f(M,z,D,H)}}function k(e){return{score:0,confidence:0,recognized:!1,verdict:"blank",overall:`還沒有讀到足夠的「${e}」筆跡,因此這次不評分。`,strengths:["願意打開手寫板,就是開始練習的第一步。"],improvements:["請用���指或觸控筆,在格子中央完整寫一次。"],nextPractice:`先看上方的「${e}」,從第一筆慢慢寫到最後一筆。`,encouragement:"不用急,寫完再按一次檢查就可以了。",metrics:[{label:"字形吻合",score:0,detail:"尚未偵測到足夠筆跡"},{label:"結構分布",score:0,detail:"請先寫出完整國字"},{label:"多餘筆跡",score:0,detail:"尚無法判斷"},{label:"位置大小",score:0,detail:"請寫在格子中央"}]}}function y(e){return`chenguang-handwriting-${e}`}var j=e.i(41324);let N=[1,2,3,4,5,6];e.s(["HandwritingCanvas",0,function({lessonId:e,promptText:g,initialGrade:h=1}){let{person:u}=(0,j.useActivePerson)(),p=(0,r.useRef)(null),x=(0,r.useRef)(!1),b=(0,r.useRef)({strokeCount:0,pointCount:0,pathLength:0,directionChanges:0}),v=(0,r.useRef)(null),M=(0,r.useRef)(null),[z,D]=(0,r.useState)(!1),[H,C]=(0,r.useState)(!1),[$,S]=(0,r.useState)(null),[I,P]=(0,r.useState)(h),R=(0,c.getChineseHandwritingWordsByGrade)(I),[A,F]=(0,r.useState)(R[0]?.id??c.chineseHandwritingWords[0].id),T=R.find(e=>e.id===A)??R[0]??c.chineseHandwritingWords[0],U=`${u.id}-${e}-${T.id}`,W=I<=2;function L(){b.current={strokeCount:0,pointCount:0,pathLength:0,directionChanges:0},v.current=null,M.current=null}function O(){let e=p.current,t=e?.getContext("2d");return e&&t?(t.lineWidth=6,t.lineCap="round",t.lineJoin="round",t.strokeStyle="#3f3f46",t):null}function B(e){let t=p.current;if(!t)return{x:0,y:0};let r=t.getBoundingClientRect();return{x:(e.clientX-r.left)/r.width*t.width,y:(e.clientY-r.top)/r.height*t.height}}function q(e){x.current=!1,v.current=null,M.current=null;try{e.currentTarget.releasePointerCapture(e.pointerId)}catch{}}function E(){let e=p.current?.toDataURL("image/png");if(e){let t;return t={lessonId:U,imageDataUrl:e,savedAt:new Date().toISOString()},window.localStorage.setItem(y(U),JSON.stringify(t)),D(!0),e}}return(0,r.useEffect)(()=>{L();let e=function(e){let t=window.localStorage.getItem(y(e));if(!t)return null;try{return JSON.parse(t)}catch{return null}}(U);D(!!e),S(null);let t=p.current,r=t?.getContext("2d");if(t&&r&&r.clearRect(0,0,t.width,t.height),!e||!t||!r)return;let a=new Image;a.onload=()=>{r.clearRect(0,0,t.width,t.height),r.drawImage(a,0,0,t.width,t.height),D(!0)},a.src=e.imageDataUrl},[U]),(0,t.jsxs)("section",{className:"rounded-warm border border-softline bg-white/90 p-4 shadow-warm sm:p-6",children:[(0,t.jsxs)("div",{className:"rounded-[1.75rem] border border-amber-100 bg-gradient-to-br from-[#fff7e8] to-white p-4 shadow-sm sm:p-5",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-4 lg:flex-row lg:items-end lg:justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-bold text-amber-800",children:"今天練習"}),(0,t.jsx)("h2",{className:"mt-1 text-3xl font-black text-ink",children:"國語手寫練習"}),(0,t.jsx)("p",{className:"mt-2 text-base font-bold text-stone-500",children:g})]}),(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:N.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>{let t;return t=(0,c.getChineseHandwritingWordsByGrade)(e),void(P(e),F(t[0]?.id??c.chineseHandwritingWords[0].id))},className:`rounded-2xl px-4 py-2 text-sm font-black transition ${I===e?"bg-coral text-white shadow-sm":"bg-white text-amber-900 ring-1 ring-amber-100 hover:bg-butter"}`,children:["小",e]},e))})]}),(0,t.jsxs)("div",{className:"mt-5 grid gap-4 lg:grid-cols-[220px_1fr]",children:[(0,t.jsxs)("div",{className:"rounded-[1.5rem] bg-white/85 p-5 text-center ring-1 ring-amber-100",children:[(0,t.jsx)("div",{className:"text-[5.5rem] font-black leading-none text-amber-950",children:T.character}),(0,t.jsx)("div",{className:"mt-3 inline-flex rounded-full bg-leaf/75 px-4 py-2 text-xl font-black text-green-900",children:T.zhuyin}),(0,t.jsx)("p",{className:"mt-3 text-lg font-black text-stone-700",children:T.word}),(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(i.SpeechPracticeButton,{expected:T.character,alternatives:[T.word],lang:"zh-TW",speakLabel:"播放讀音",listenLabel:"檢查讀音",targetLabel:"練習"})})]}),(0,t.jsxs)("div",{className:"rounded-[1.5rem] bg-white/80 p-4 ring-1 ring-amber-100",children:[(0,t.jsx)("p",{className:"text-base font-black text-amber-800",children:"選擇練習國字"}),(0,t.jsx)("div",{className:"mt-3 flex gap-2 overflow-x-auto pb-2",children:R.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>F(e.id),className:`min-w-[4.25rem] rounded-2xl px-4 py-3 text-center transition ${T.id===e.id?"bg-amber-900 text-white shadow-sm":"bg-cream text-amber-950 hover:bg-butter"}`,children:[(0,t.jsx)("span",{className:"block text-2xl font-black",children:e.character}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-80",children:e.zhuyin})]},e.id))}),(0,t.jsxs)("div",{className:"mt-4 grid gap-3 text-stone-700 sm:grid-cols-3",children:[(0,t.jsxs)("div",{className:"rounded-2xl bg-[#f3fbef] p-4",children:[(0,t.jsx)("p",{className:"text-xs font-black text-green-800",children:"意思"}),(0,t.jsx)("p",{className:"mt-1 font-bold",children:T.meaning})]}),(0,t.jsxs)("div",{className:"rounded-2xl bg-[#eef7ff] p-4",children:[(0,t.jsx)("p",{className:"text-xs font-black text-blue-800",children:"例句"}),(0,t.jsx)("p",{className:"mt-1 font-bold",children:T.example})]}),(0,t.jsxs)("div",{className:"rounded-2xl bg-butter/70 p-4",children:[(0,t.jsx)("p",{className:"text-xs font-black text-amber-800",children:"書寫提醒"}),(0,t.jsx)("p",{className:"mt-1 font-bold",children:T.strokeHint})]})]})]})]})]}),(0,t.jsxs)("div",{className:"mt-5 rounded-[1.5rem] border-4 border-amber-100 bg-[#fffdf8] p-2 sm:p-3",children:[(0,t.jsxs)("div",{className:"relative overflow-hidden rounded-2xl bg-[linear-gradient(#f6dfb2_1px,transparent_1px),linear-gradient(90deg,#f6dfb2_1px,transparent_1px)] bg-[size:48px_48px]",children:[W?(0,t.jsxs)("div",{className:"pointer-events-none absolute inset-0 flex flex-col items-center justify-center text-center",children:[(0,t.jsx)("span",{className:"select-none text-[12rem] font-black leading-none text-amber-900/10 sm:text-[16rem]",children:T.character}),(0,t.jsx)("span",{className:"mt-2 rounded-full bg-white/60 px-4 py-2 text-lg font-black text-amber-900/35",children:T.zhuyin})]}):(0,t.jsx)("div",{className:"pointer-events-none absolute right-4 top-4 rounded-full bg-white/70 px-4 py-2 text-sm font-black text-stone-500",children:"小三以上自主書寫"}),(0,t.jsx)("canvas",{ref:p,width:900,height:520,className:"relative z-10 h-[360px] w-full touch-none rounded-2xl bg-transparent sm:h-[420px]","aria-label":"手寫練習區",onPointerDown:function(e){e.currentTarget.setPointerCapture(e.pointerId);let t=O();if(!t)return;let r=B(e);x.current=!0,b.current.strokeCount+=1,b.current.pointCount+=1,v.current=r,M.current=null,D(!1),S(null),t.beginPath(),t.moveTo(r.x,r.y)},onPointerMove:function(e){if(!x.current)return;let t=O();if(!t)return;let r=B(e),a=v.current;if(a){let e=Math.hypot(r.x-a.x,r.y-a.y);if(e>=2){let t=Math.atan2(r.y-a.y,r.x-a.x);null!==M.current&&Math.abs(Math.atan2(Math.sin(t-M.current),Math.cos(t-M.current)))>Math.PI/3&&(b.current.directionChanges+=1),b.current.pathLength+=e,b.current.pointCount+=1,v.current=r,M.current=t}}t.lineTo(r.x,r.y),t.stroke()},onPointerUp:q,onPointerCancel:q,onPointerLeave:q})]}),(0,t.jsx)("p",{className:"mt-3 text-base font-bold leading-7 text-stone-500",children:W?"小一、小二會顯示淡淡的國字虛底,孩子可以照著描。":"小三以上不顯示虛底,練習自己看字書寫。"})]}),(0,t.jsx)(n,{saved:z,analyzing:H,onClear:function(){let e=p.current,t=e?.getContext("2d");e&&t&&(t.clearRect(0,0,e.width,e.height),L(),window.localStorage.removeItem(y(U)),D(!1),S(null))},onSave:E,onSubmitFeedback:function(){let t=p.current;t&&!H&&(E(),C(!0),window.requestAnimationFrame(()=>{let r=(0,s.findChineseDictionaryEntry)(T.character)?.entry.strokes,a=function(e,t,r,a,n,i=[]){let s,c=e.getContext("2d",{willReadFrequently:!0});if(!c)return k(t);let g=d(o(c.getImageData(0,0,e.width,e.height)),e.width,e.height),h=Math.max(140,Math.round(e.width*e.height*35e-5));if(!g||g.count<h)return k(t);let u=function(e,t){let r=document.createElement("canvas");r.width=256,r.height=256;let a=r.getContext("2d",{willReadFrequently:!0});if(!a)return new Uint8Array(65536);let n=Math.min(208/t.width,208/t.height),i=Math.max(1,t.width*n),s=Math.max(1,t.height*n);return a.clearRect(0,0,256,256),a.imageSmoothingEnabled=!0,a.drawImage(e,t.left,t.top,t.width,t.height,(256-i)/2,(256-s)/2,i,s),o(a.getImageData(0,0,256,256))}(e,g),{strictSimilarity:p,precision:x,recall:b,gridSimilarity:y,projectionSimilarity:j,aspectSimilarity:N}=w(u,t),v=0;for(let e of new Set(i)){if(!e||e===t)continue;let r=w(u,e);r.shapeScore>v&&(s=e,v=r.shapeScore)}let M=l(1-Math.hypot((g.left+g.right)/2/e.width-.5,(g.top+g.bottom)/2/e.height-.5)/.34),z=g.width/e.width,D=g.height/e.height,H=(m(z,.22,.78,.16)+m(D,.3,.9,.2))/2,C=z*D,$=g.count/Math.max(1,g.width*g.height),S=m($,.025,.28,.15),{strokeScore:I,traceScribble:P}=function(e,t,r){if(!e||0===e.strokeCount||e.pointCount<2)return{strokeScore:.62,traceScribble:!1};let a=Math.hypot(r.width,r.height),n=e.directionChanges/Math.max(1,e.pointCount),i=e.pathLength/Math.max(1,a),s=Math.max(1,t??Math.round(4+i)),c=l(1-.8*(Math.abs(e.strokeCount-s)/Math.max(3,s))),o=e.strokeCount>2.4*s+3,d=e.pointCount>24&&n>.17&&i>Math.max(3.5,.7*s);return{strokeScore:c,traceScribble:o||d}}(a,n,e),R=x<.32&&C>.58||x<.38&&$>.31||p<.26&&y<.42&&C>.34;return function(e){let{character:t,grade:r,strictSimilarity:a,precision:n,recall:i,gridSimilarity:s,projectionSimilarity:c,aspectSimilarity:l,placementScore:o,sizeScore:d,densityScore:g,strokeScore:h,suspiciousScribble:u,competingCharacter:m,competingSimilarity:p=0}=e,x=f(a,s,c,l),b=Math.round((.72*x+.1*o+.08*d+.05*g+.05*h)*100);x<.18?b=Math.min(b,18):x<.3?b=Math.min(b,30):x<.43?b=Math.min(b,44):x<.56?b=Math.min(b,59):x<.68?b=Math.min(b,74):x<.78?b=Math.min(b,84):x<.86&&(b=Math.min(b,89)),(a<.34||s<.42)&&(b=Math.min(b,49)),n<.42&&(b=Math.min(b,39)),u&&(b=Math.min(b,24));let w=!m||x+.035>=p;w||(b=Math.min(b,45));let k=!u&&w&&x>=.52&&a>=.34&&s>=.48&&n>=.42&&i>=.42;k&&x>=.86&&a>=.72&&s>=.78&&n>=.68&&i>=.68||(b=Math.min(b,89)),b=Math.max(0,Math.min(96,b));let y=u?"scribble":k?b>=90?"excellent":b>=75?"good":"needs-practice":"mismatch",j=[],N=[];k&&j.push(`系統已從這次筆跡辨識出「${t}」的主要結構。`),a>=.68&&j.push("主要筆畫的位置與標準字形接近。 "),s>=.72&&j.push("字的上下左右結構分配得很清楚。 "),o>=.78&&j.push("國字有寫在格子中央,位置很穩。 "),0===j.length&&j.push("這次筆跡已被完整記錄,可以依提示再練一次。 "),u?N.push("偵測到過多來回線條或不規則轉折,這次視為塗鴉,不用高分帶過。 "):!w&&m?N.push(`這次的結構更接近本組的「${m}」,請對照「${t}」後重新書寫。`):k||N.push(`目前的線條還無法可靠辨識為「${t}」,請對照字形後重新書寫。`),a<.68&&N.push(r<=2?"沿著淡色虛底慢慢描,特別注意轉彎、交叉和收筆的位置。":`再看一次「${t}」的字形,確認每個部件的方向與比例。`),n<.6&&N.push("有些線條落在目標字形之外,請減少多餘筆跡。 "),o<.72&&N.push("下一次把字心移到格子中央,四周留一點空間。 "),d<.68&&N.push("請調整字的大小,讓完整筆畫留在練習格內。 "),0===N.length&&N.push("下一次可以挑戰不看虛底,再寫一次同一個字。 ");let v=u?`這次沒有辨識為「${t}」,筆跡比較像來回塗畫,因此最高只保留低分。`:!w&&m?`這次筆跡更接近「${m}」,不能當成「${t}」給高分。`:k?b>=90?`已可靠辨識為「${t}」,字形、結構與筆跡都通過高分門檻。`:b>=75?`已辨識為「${t}」,再調整一個小地方就會更穩。`:`已看出「${t}」的主要結構,但還需要依提示再練一次。`:`目前證據不足,不能說這個字是「${t}」,所以不會給高分。`;return{score:b,confidence:Math.round(100*x),recognized:k,verdict:y,overall:v,strengths:j,improvements:N,nextPractice:r<=2?`清除後沿著「${t}」的虛底再描一次,寫完重新檢查,比較兩次差異。`:`先看「${t}」三秒鐘,再清除並獨立寫一次,完成後重新檢查。`,encouragement:k?"系統有辨識到正確方向;照著提示再寫一次,進步會更明顯。":"這次不硬給高分,找到真正需要練習的地方才有幫助。",metrics:[{label:"字形吻合",score:Math.round(100*a),detail:"逐點比對筆跡與目標字形"},{label:"結構分布",score:Math.round(100*s),detail:"比較上下左右的筆畫分布"},{label:"筆跡精準",score:Math.round(100*n),detail:"檢查目標字形外的多餘線條"},{label:"位置大小",score:Math.round((o+d)/2*100),detail:"檢查字的位置與完整留白"}]}}({character:t,grade:r,strictSimilarity:p,precision:x,recall:b,gridSimilarity:y,projectionSimilarity:j,aspectSimilarity:N,placementScore:M,sizeScore:H,densityScore:S,strokeScore:I,suspiciousScribble:P||R,competingCharacter:s,competingSimilarity:v})}(t,T.character,I,b.current,r,R.map(e=>e.character));S(a),function(e){let t=`chenguang-handwriting-evaluations-${e.personId}`,r=[];try{let e=window.localStorage.getItem(t);r=e?JSON.parse(e):[]}catch{r=[]}let a={id:`${e.personId}-${e.wordId}-${Date.now()}`,personId:e.personId,lessonId:e.lessonId,wordId:e.wordId,character:e.character,grade:e.grade,score:e.feedback.score,feedback:e.feedback,evaluatedAt:new Date().toISOString()};window.localStorage.setItem(t,JSON.stringify([a,...r].slice(0,60)))}({personId:u.id,lessonId:e,wordId:T.id,character:T.character,grade:I,feedback:a}),C(!1)}))}}),$?(0,t.jsx)(a,{feedback:$}):null]})}],66113)}]);
_next/static/chunks/3_6muaniutgts.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,42391,e=>{"use strict";var t=e.i(43476);e.s(["PageHeader",0,function({eyebrow:e,title:a,description:r,action:s}){return(0,t.jsxs)("header",{className:"flex min-w-0 flex-col gap-5 pb-1 sm:flex-row sm:items-start sm:justify-between",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-black uppercase tracking-[0.08em] text-amber-700",children:e}),(0,t.jsx)("h1",{className:"mt-2 text-3xl font-black leading-tight tracking-normal text-ink md:text-5xl",children:a}),r?(0,t.jsx)("p",{className:"mt-3 max-w-3xl text-base font-medium leading-7 text-stone-600 md:text-lg md:leading-8",children:r}):null]}),s?(0,t.jsx)("div",{className:"w-full shrink-0 sm:w-auto",children:s}):null]})}])},95057,(e,t,a)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0});var r={formatUrl:function(){return l},formatWithValidation:function(){return c},urlObjectKeys:function(){return i}};for(var s in r)Object.defineProperty(a,s,{enumerable:!0,get:r[s]});let n=e.r(90809)._(e.r(98183)),o=/https?|ftp|gopher|file/;function l(e){let{auth:t,hostname:a}=e,r=e.protocol||"",s=e.pathname||"",l=e.hash||"",i=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:a&&(c=t+(~a.indexOf(":")?`[${a}]`:a),e.port&&(c+=":"+e.port)),i&&"object"==typeof i&&(i=String(n.urlQueryToSearchParams(i)));let d=e.search||i&&`?${i}`||"";return r&&!r.endsWith(":")&&(r+=":"),e.slashes||(!r||o.test(r))&&!1!==c?(c="//"+(c||""),s&&"/"!==s[0]&&(s="/"+s)):c||(c=""),l&&"#"!==l[0]&&(l="#"+l),d&&"?"!==d[0]&&(d="?"+d),s=s.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${r}${c}${s}${d}${l}`}let i=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return l(e)}},18581,(e,t,a)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0}),Object.defineProperty(a,"useMergedRef",{enumerable:!0,get:function(){return s}});let r=e.r(71645);function s(e,t){let a=(0,r.useRef)(null),s=(0,r.useRef)(null);return(0,r.useCallback)(r=>{if(null===r){let e=a.current;e&&(a.current=null,e());let t=s.current;t&&(s.current=null,t())}else e&&(a.current=n(e,r)),t&&(s.current=n(t,r))},[e,t])}function n(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let a=e(t);return"function"==typeof a?a:()=>e(null)}}("function"==typeof a.default||"object"==typeof a.default&&null!==a.default)&&void 0===a.default.__esModule&&(Object.defineProperty(a.default,"__esModule",{value:!0}),Object.assign(a.default,a),t.exports=a.default)},73668,(e,t,a)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0}),Object.defineProperty(a,"isLocalURL",{enumerable:!0,get:function(){return n}});let r=e.r(18967),s=e.r(52817);function n(e){if(!(0,r.isAbsoluteUrl)(e))return!0;try{let t=(0,r.getLocationOrigin)(),a=new URL(e,t);return a.origin===t&&(0,s.hasBasePath)(a.pathname)}catch(e){return!1}}},84508,(e,t,a)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0}),Object.defineProperty(a,"errorOnce",{enumerable:!0,get:function(){return r}});let r=e=>{}},22016,(e,t,a)=>{"use strict";Object.defineProperty(a,"__esModule",{value:!0});var r={default:function(){return w},useLinkStatus:function(){return y}};for(var s in r)Object.defineProperty(a,s,{enumerable:!0,get:r[s]});let n=e.r(90809),o=e.r(43476),l=n._(e.r(71645)),i=e.r(95057),c=e.r(8372),d=e.r(18581),u=e.r(18967),h=e.r(5550);e.r(33525);let g=e.r(88540),m=e.r(91949),p=e.r(73668),x=e.r(9396);function w(t){var a,r;let s,n,w,[y,b]=(0,l.useOptimistic)(m.IDLE_LINK_STATUS),k=(0,l.useRef)(null),{href:v,as:j,children:z,prefetch:N=null,passHref:S,replace:I,shallow:$,scroll:T,onClick:P,onMouseEnter:M,onTouchStart:E,legacyBehavior:C=!1,onNavigate:R,transitionTypes:q,ref:A,unstable_dynamicOnHover:L,..._}=t;s=z,C&&("string"==typeof s||"number"==typeof s)&&(s=(0,o.jsx)("a",{children:s}));let O=l.default.useContext(c.AppRouterContext),B=!1!==N,W=!1!==N?null===(r=N)||"auto"===r?x.FetchStrategy.PPR:x.FetchStrategy.Full:x.FetchStrategy.PPR,D="string"==typeof(a=j||v)?a:(0,i.formatUrl)(a);if(C){if(s?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});n=l.default.Children.only(s)}let U=C?n&&"object"==typeof n&&n.ref:A,G=l.default.useCallback(e=>(null!==O&&(k.current=(0,m.mountLinkInstance)(e,D,O,W,B,b)),()=>{k.current&&((0,m.unmountLinkForCurrentNavigation)(k.current),k.current=null),(0,m.unmountPrefetchableInstance)(e)}),[B,D,O,W,b]),H={ref:(0,d.useMergedRef)(G,U),onClick(t){C||"function"!=typeof P||P(t),C&&n.props&&"function"==typeof n.props.onClick&&n.props.onClick(t),!O||t.defaultPrevented||function(t,a,r,s,n,o,i){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,p.isLocalURL)(a)){s&&(t.preventDefault(),location.replace(a));return}if(t.preventDefault(),o){let e=!1;if(o({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);l.default.startTransition(()=>{u(a,s?"replace":"push",!1===n?g.ScrollBehavior.NoScroll:g.ScrollBehavior.Default,r.current,i)})}}(t,D,k,I,T,R,q)},onMouseEnter(e){C||"function"!=typeof M||M(e),C&&n.props&&"function"==typeof n.props.onMouseEnter&&n.props.onMouseEnter(e),O&&B&&(0,m.onNavigationIntent)(e.currentTarget,!0===L)},onTouchStart:function(e){C||"function"!=typeof E||E(e),C&&n.props&&"function"==typeof n.props.onTouchStart&&n.props.onTouchStart(e),O&&B&&(0,m.onNavigationIntent)(e.currentTarget,!0===L)}};return(0,u.isAbsoluteUrl)(D)?H.href=D:C&&!S&&("a"!==n.type||"href"in n.props)||(H.href=(0,h.addBasePath)(D)),w=C?l.default.cloneElement(n,H):(0,o.jsx)("a",{..._,...H,children:s}),(0,o.jsx)(f.Provider,{value:y,children:w})}e.r(84508);let f=(0,l.createContext)(m.IDLE_LINK_STATUS),y=()=>(0,l.useContext)(f);("function"==typeof a.default||"object"==typeof a.default&&null!==a.default)&&void 0===a.default.__esModule&&(Object.defineProperty(a.default,"__esModule",{value:!0}),Object.assign(a.default,a),t.exports=a.default)},14876,e=>{"use strict";var t=e.i(43476),a=e.i(22016);function r(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:a,suffix:r}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===a?`/index.html${r}`:/\.[a-z0-9]+$/i.test(a)?e:`${a.replace(/\/+$/,"")}/index.html${r}`}e.s(["ExportSafeLink",0,function({href:e,children:s,...n}){return"string"==typeof e?(0,t.jsx)("a",{href:r(e),...n,children:s}):(0,t.jsx)(a.default,{href:e,...n,children:s})},"getExportSafeHref",0,r])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let a=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function r(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return a.find(t=>t.grade===e)},"getGradeIdByNumber",0,r,"grades",0,a],62312);let s=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],n={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function o(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return s.find(e=>e.id===t)??n}function l(e){if(!e)return n.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return s.some(e=>e.id===t)?t:n.id}e.s(["currentStudent",0,n,"getCurrentStudentGradeId",0,function(e=n){return r(e.grade)},"getPersonById",0,o,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,s,"normalizePersonId",0,l],7728);let i="chenguang-active-person-id",c="chenguang-active-person-change",d="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,a]=(0,t.useState)(n.id),[r,s]=(0,t.useState)(!1),[h,g]=(0,t.useState)(!1);function m(e){let t=l(e);a(t),window.localStorage.setItem(i,t),window.dispatchEvent(new Event(c))}return(0,t.useEffect)(()=>{let e=l(window.localStorage.getItem(i));function t(){let e=l(window.localStorage.getItem(i));a(e),window.localStorage.setItem(i,e)}function r(){s(!!window.localStorage.getItem(d))}return a(e),window.localStorage.setItem(i,e),s(!!window.localStorage.getItem(d)),g(!0),window.addEventListener(c,t),window.addEventListener("storage",t),window.addEventListener(u,r),()=>{window.removeEventListener(c,t),window.removeEventListener("storage",t),window.removeEventListener(u,r)}},[]),{person:o(e),switchPerson:m,signIn:function(e){let t=l(e);m(t);let a=o(t);window.localStorage.setItem(d,JSON.stringify({personId:t,role:a.role,signedInAt:new Date().toISOString()})),s(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(d),s(!1),window.dispatchEvent(new Event(u))},isLoggedIn:r,isReady:h}}],41324)},82697,e=>{"use strict";var t=e.i(43476),a=e.i(14876),r=e.i(7728),s=e.i(62312),n=e.i(41324);e.s(["BrandHeader",0,function({showPerson:e=!0}){let{person:o,isLoggedIn:l}=(0,n.useActivePerson)(),i=(0,s.getGradeByNumber)(o.grade),c=l?`${(0,r.getPersonDisplayName)(o)}|${"student"===o.role?(0,r.getPersonSubtitle)(o):i?.shortName??`小${o.grade}`}`:"訪客模式";return(0,t.jsxs)(a.ExportSafeLink,{href:l?"/dashboard":"/",className:"flex min-w-0 items-center gap-3 text-ink",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 shrink-0 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{className:"min-w-0 leading-tight",children:[(0,t.jsx)("strong",{className:"block truncate text-xl font-black",children:"晨光"}),(0,t.jsx)("small",{className:"block truncate text-sm font-bold text-stone-500",children:e?c:"國小學習陪跑系統"})]})]})}])},18566,(e,t,a)=>{t.exports=e.r(76562)},22468,e=>{"use strict";var t=e.i(43476),a=e.i(71645),r=e.i(18566),s=e.i(14876),n=e.i(7728),o=e.i(62312),l=e.i(41324);let i=[{label:"登入",href:"/login"},{label:"訪客體驗",href:"/courses"},{label:"註冊登入",href:"/register",primary:!0}];function c(e,t="student"){let a=[{label:"課程首頁",href:"/dashboard",icon:"⌂"},{label:"每日 10 題",href:"/daily-quiz",icon:"10"},{label:"錯題 AI 說明",href:"/wrong-review",icon:"AI"},{label:"進度月曆",href:"/parent-weekly-report",icon:"月"},{label:"英文練習",href:"/practice",icon:"Aa"},{label:"手寫出題",href:"/word-scanner",icon:"掃"},{label:"課程總覽",href:"/courses",icon:"▦"},{label:"國語練習",href:`/courses/grade-${e}/chinese/basic`,icon:"ㄅ"},{label:"數學練習",href:`/courses/grade-${e}/math/basic`,icon:"123"},{label:"每日紀錄",href:"/daily-record",icon:"✓"},{label:"週計畫",href:"/weekly-plan",icon:"□"},{label:"登出",href:"/",icon:"出"}];return"parent"===t?a.filter(e=>["課程首頁","進度月曆","每日紀錄","週計畫","課程總覽","登出"].includes(e.label)):"teacher"===t?a.filter(e=>["課程首頁","課程總覽","國語練習","英文練習","數學練習","週計畫","手寫出題","登出"].includes(e.label)):a.filter(e=>["課程首頁","每日 10 題","英文練習","國語練習","數學練習","手寫出題","錯題 AI 說明","登出"].includes(e.label))}function d(e,t){return"/dashboard"===t?"/dashboard"===e:"/courses"===t?"/courses"===e:t.startsWith("/courses/")?e===t||e.startsWith(`${t}/`):e===t}function u({compact:e=!1}){let{person:r}=(0,l.useActivePerson)(),[s,i]=(0,a.useState)(!1),c=(0,o.getGradeByNumber)(r.grade),d="student"===r.role?(0,n.getPersonSubtitle)(r):c?.name??`國小${r.grade}年級`,h=(0,t.jsx)("div",{className:"grid gap-2",children:n.mockPeople.map(e=>{let a=(0,o.getGradeByNumber)(e.grade),s=e.id===r.id;return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;let a;return t=e.id,i(!1),a=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login",void window.location.assign(`${a}?person=${encodeURIComponent(t)}`)},className:`rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${s?"bg-coral text-white shadow-sm":"bg-white text-stone-700 hover:bg-butter"}`,children:[(0,t.jsxs)("span",{className:"block text-xs font-black opacity-80",children:[(0,n.getRoleLabel)(e.role),"模式"]}),(0,t.jsx)("span",{className:"mt-1 block text-base font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-75",children:"student"===e.role?(0,n.getPersonSubtitle)(e):a?.name??`國小${e.grade}年級`})]},e.id)})});return e?(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>i(e=>!e),className:"flex min-h-11 max-w-[5.5rem] items-center gap-1 rounded-2xl bg-butter px-2 text-left text-amber-950 shadow-sm sm:max-w-none sm:gap-2 sm:px-3","aria-expanded":s,"aria-label":"切換目前使用者",children:[(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("strong",{className:"block max-w-20 truncate text-sm font-black",children:r.name}),(0,t.jsx)("small",{className:"block text-[11px] font-bold opacity-70",children:c?.shortName??`小${r.grade}`})]}),(0,t.jsx)("span",{"aria-hidden":"true",className:"text-xs",children:"⌄"})]}),s?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100vh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsx)("strong",{className:"text-base font-black text-ink",children:"切換使用者"}),(0,t.jsx)("button",{type:"button",onClick:()=>i(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉帳號選單",children:"×"})]}),h]}):null]}):(0,t.jsxs)("section",{className:"rounded-3xl border border-amber-100 bg-cream p-3 shadow-sm",children:[(0,t.jsx)("button",{type:"button",onClick:()=>i(e=>!e),className:"w-full rounded-[1.35rem] bg-white/80 p-3 text-left ring-1 ring-transparent transition hover:bg-white hover:ring-coral/30","aria-expanded":s,"aria-label":"切換目前使用者",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("p",{className:"text-xs font-black text-amber-700",children:[(0,n.getRoleLabel)(r.role),"模式"]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-2xl font-black leading-tight text-ink",children:r.name}),(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"student"===r.role?"匿名檔案":(0,n.getRoleLabel)(r.role)})]}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:d})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-coral px-3 py-2 text-xs font-black text-white shadow-sm",children:"切換帳號"})]})}),s?(0,t.jsx)("div",{className:"mt-3",children:h}):null]})}e.s(["AppSidebar",0,function(){let e=(0,r.usePathname)(),{person:a,isLoggedIn:n,signOut:o}=(0,l.useActivePerson)();function h(){o();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsx)("aside",{className:"fixed inset-y-0 left-0 z-20 hidden w-64 flex-col border-r border-softline/80 bg-white/85 backdrop-blur-xl lg:flex",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 py-6",children:[(0,t.jsxs)(s.ExportSafeLink,{className:"flex items-center gap-3",href:n?"/dashboard":"/",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"text-sm font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),n?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{}),(0,t.jsx)("nav",{className:"grid gap-2 pr-1",children:c(a.grade,a.role).map(a=>{let r=d(e,a.href),n=`flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left transition ${r?"bg-butter text-amber-900 shadow-sm":"text-stone-600 hover:bg-butter hover:text-amber-900"}`,o=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 place-items-center rounded-xl text-sm font-black shadow-sm ${r?"bg-white text-coral":"bg-white text-stone-500"}`,children:a.icon}),(0,t.jsx)("span",{className:"font-bold",children:a.label})]});return"登出"===a.label?(0,t.jsx)("button",{type:"button",onClick:h,className:n,children:o},a.label):(0,t.jsx)(s.ExportSafeLink,{href:a.href,className:n,children:o},a.label)})})]}):(0,t.jsx)("div",{className:"grid gap-3",children:i.map(e=>(0,t.jsx)(s.ExportSafeLink,{href:e.href,className:e.primary?"rounded-2xl bg-coral px-4 py-3 text-center font-black text-white shadow-warm transition hover:brightness-105":"rounded-2xl border border-softline bg-white px-4 py-3 text-center font-black text-amber-800 transition hover:bg-butter",children:e.label},e.label))}),n?(0,t.jsxs)(s.ExportSafeLink,{href:"student"===a.role?"/wrong-review":"/parent-weekly-report",className:"mt-auto rounded-2xl border border-green-100 bg-green-50 p-4 text-sm text-green-900 transition hover:-translate-y-0.5 hover:bg-green-100",children:[(0,t.jsx)("span",{className:"block text-xs font-black text-green-700",children:"本��學習摘要"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg",children:"每天一小步,進度看得見"}),(0,t.jsx)("span",{className:"mt-2 block font-bold text-green-700",children:"查看進度與需要再練的內容 →"})]}):null]})})},"MobileMenu",0,function(){let e=(0,r.usePathname)(),{person:n,signOut:o}=(0,l.useActivePerson)(),[i,u]=(0,a.useState)(!1),h=c(n.grade,n.role);function g(){o();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsxs)("div",{className:"shrink-0 lg:hidden",children:[(0,t.jsx)("button",{type:"button",onClick:()=>u(e=>!e),className:"grid min-h-11 min-w-11 place-items-center rounded-2xl bg-white text-xl font-black text-amber-900 shadow-sm active:scale-[0.98]","aria-expanded":i,"aria-label":"開啟完整功能選單",children:i?"×":"☰"}),i?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100dvh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("strong",{className:"block text-base font-black text-ink",children:"全部功能"}),(0,t.jsxs)("span",{className:"text-xs font-bold text-stone-500",children:["依 ",n.name," 的身分顯示"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉功能選單",children:"×"})]}),(0,t.jsx)("nav",{className:"grid grid-cols-2 gap-2",children:h.map(a=>{let r=d(e,a.href),n=`flex min-h-16 items-center gap-3 rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${r?"bg-coral text-white":"bg-white text-stone-700"}`,o=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 shrink-0 place-items-center rounded-xl text-sm font-black ${r?"bg-white/20":"bg-butter text-amber-900"}`,children:a.icon}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:a.label})]});return"登出"===a.label?(0,t.jsx)("button",{type:"button",onClick:g,className:n,children:o},a.label):(0,t.jsx)(s.ExportSafeLink,{href:a.href,onClick:()=>u(!1),className:n,children:o},a.label)})})]}):null]})},"MobileQuickNav",0,function(){var e;let a,n=(0,r.usePathname)(),{person:o}=(0,l.useActivePerson)(),i=(a=c(o.grade,e=o.role),("guest"===e?["課程首頁","課程總覽"]:({student:["課程首頁","每日 10 題","英文練習","課程總覽"],parent:["課程首頁","進度月曆","每日紀錄","週計畫"],teacher:["課程首頁","課程總覽","週計畫","手寫出題"]})[e]).map(e=>a.find(t=>t.label===e)).filter(e=>!!e));return(0,t.jsx)("nav",{className:"fixed inset-x-3 bottom-[max(0.75rem,env(safe-area-inset-bottom))] z-50 grid grid-cols-4 gap-1 rounded-3xl border border-white/80 bg-white/90 p-2 shadow-warm backdrop-blur-xl lg:hidden","aria-label":"主要功能",children:i.map(e=>{let a=d(n,e.href);return(0,t.jsxs)(s.ExportSafeLink,{href:e.href,className:`flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl px-1 py-2 text-center transition active:scale-[0.98] ${a?"bg-coral text-white shadow-sm":"text-stone-600"}`,children:[(0,t.jsx)("span",{className:"text-sm font-black",children:e.icon}),(0,t.jsx)("span",{className:"w-full truncate text-[11px] font-black",children:e.label})]},e.label)})})},"PersonSwitcher",0,u])},55634,e=>{"use strict";var t=e.i(43476),a=e.i(71645),r=e.i(18566),s=e.i(14876),n=e.i(41324);e.s(["ActiveGradeRouteSync",0,function(){let e=(0,r.usePathname)(),{person:o,isLoggedIn:l,isReady:i}=(0,n.useActivePerson)(),c=function(e){let t=e.match(/^\/learn\/(?:grade-)?([1-6])(?:\/|$)/);if(t)return Number(t[1]);let a=e.match(/^\/courses\/grade-([1-6])(?:\/|$)/);if(a)return Number(a[1]);let r=e.match(/^\/(?:lesson|practice|handwriting)\/grade-([1-6])-/);return r?Number(r[1]):null}(e),d=!!(i&&l&&"student"===o.role&&c&&c!==o.grade);return((0,a.useEffect)(()=>{var t;if(!d)return;let a=(t=o.grade,/^\/learn\/(?:grade-)?[1-6](?:\/|$)/.test(e)?e.replace(/^\/learn\/(?:grade-)?[1-6]/,`/learn/${t}`):/^\/courses\/grade-[1-6](?:\/|$)/.test(e)?e.replace(/^\/courses\/grade-[1-6]/,`/courses/grade-${t}`):e.replace(/^(\/(?:lesson|practice|handwriting)\/)grade-[1-6]-/,`$1grade-${t}-`)),r=`${(0,s.getExportSafeHref)(a)}${window.location.search}${window.location.hash}`;window.location.replace(r)},[e,o.grade,d]),i&&!d)?null:(0,t.jsx)("div",{className:"fixed inset-0 z-[100] grid place-items-center bg-[#fffaf3]/95 p-5 backdrop-blur-md",role:"status","aria-live":"polite",children:(0,t.jsxs)("div",{className:"w-full max-w-md rounded-[2rem] border border-white bg-white/90 p-7 text-center shadow-warm",children:[(0,t.jsx)("span",{className:"mx-auto grid h-14 w-14 place-items-center rounded-2xl bg-butter text-2xl","aria-hidden":"true",children:"☀"}),(0,t.jsx)("strong",{className:"mt-4 block text-2xl font-black text-ink",children:i?`正在切換到小${o.grade}課程`:"正在讀取目前學習年級"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"晨光會自動載入這位學習者正確的課程內容。"})]})})}],55634)},10400,e=>{"use strict";var t=e.i(43476),a=e.i(82697),r=e.i(22468),s=e.i(55634);e.s(["AppShell",0,function({children:e}){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.ActiveGradeRouteSync,{}),(0,t.jsx)(r.AppSidebar,{}),(0,t.jsxs)("main",{className:"app-reading-scale min-h-screen min-w-0 overflow-x-clip px-4 pb-28 pt-4 lg:ml-64 lg:px-10 lg:py-6",children:[(0,t.jsx)("div",{className:"sticky top-3 z-40 mb-5 lg:hidden",children:(0,t.jsxs)("div",{className:"flex min-w-0 items-center justify-between gap-2 rounded-3xl border border-white/80 bg-white/90 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsx)("div",{className:"min-w-0 flex-1",children:(0,t.jsx)(a.BrandHeader,{showPerson:!1})}),(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,t.jsx)(r.PersonSwitcher,{compact:!0}),(0,t.jsx)(r.MobileMenu,{})]})]})}),(0,t.jsx)("div",{className:"mx-auto min-w-0 w-full max-w-7xl",children:e}),(0,t.jsx)(r.MobileQuickNav,{})]})]})}])},98239,e=>{"use strict";var t=e.i(43476);e.s(["SectionCard",0,function({children:e,className:a=""}){return(0,t.jsx)("section",{className:`min-w-0 overflow-hidden rounded-[1.75rem] border border-softline/80 bg-white/90 p-5 shadow-warm sm:p-6 md:p-8 ${a}`,children:e})}])},70027,e=>{"use strict";var t=e.i(43476),a=e.i(71645),r=e.i(12408);let s={cream:"bg-cream text-amber-900 hover:bg-[#ffe8bd]",coral:"bg-coral text-white shadow-sm hover:bg-[#ee625c]",mint:"bg-mint text-green-800 hover:bg-[#d9f5df]"};e.s(["VoiceButton",0,function({text:e,children:n="播放",variant:o="cream",className:l="",lang:i="en-US",rate:c}){let[d,u]=(0,a.useState)("");return(0,t.jsxs)("span",{className:"inline-flex flex-col gap-1",children:[(0,t.jsx)("button",{type:"button",onClick:()=>{u((0,r.speakText)(e,{lang:i,rate:c??("zh-TW"===i?.76:.82),pitch:"zh-TW"===i?1.05:1}).message)},className:`rounded-2xl px-4 py-2 text-sm font-black transition ${s[o]} ${l}`,children:n}),d&&!d.includes("正在播放")?(0,t.jsx)("span",{className:"text-xs font-bold text-stone-500",children:d}):null]})}])},87102,e=>{"use strict";var t=e.i(7728),a=e.i(34295);let r="chenguang-learning-history";function s(e=t.currentStudent.id){return(0,a.readPersonStorage)(r,e,[])}function n(e,a=t.currentStudent.id){return(e??s(a)).flatMap(e=>e.answers.filter(e=>!e.correct))}e.s(["buildAnswerRecord",0,function(e,t){return{questionId:e.id,word:e.word,selected:t,answer:e.answer,correct:t===e.answer,explanation:e.explanation,answeredAt:new Date().toISOString()}},"getWeeklySummary",0,function(e,a=t.currentStudent.id){let r=new Date,o=new Date(r.getFullYear(),r.getMonth(),r.getDate()-6),l=new Date(r.getFullYear(),r.getMonth(),r.getDate()+1),i=(e??s(a)).filter(e=>{let t=new Date(e.date);return t>=o&&t<l}),c=i.reduce((e,t)=>e+t.total,0),d=i.reduce((e,t)=>e+t.score,0),u=n(i,a),h=Array.from(new Set(i.flatMap(e=>e.answers.map(e=>e.word)))),g=new Set(i.map(e=>{let t=new Date(e.date);return`${t.getFullYear()}-${t.getMonth()+1}-${t.getDate()}`})),m=0;for(let e=0;e<7;e+=1){let t=new Date(r.getFullYear(),r.getMonth(),r.getDate()-e),a=`${t.getFullYear()}-${t.getMonth()+1}-${t.getDate()}`;if(!g.has(a))break;m+=1}return{days:g.size,streak:m,total:c,score:d,accuracy:0===c?0:Math.round(d/c*100),wrongAnswers:u.slice(0,6),words:h.slice(0,20),lastScore:i[0]?.score??0}},"getWrongAnswers",0,n,"saveDailyQuizRecord",0,function(e,n=t.currentStudent.id){let o=s(n),l={id:`daily-${Date.now()}`,personId:n,date:new Date().toISOString(),score:e.filter(e=>e.correct).length,total:e.length,answers:e};(0,a.writePersonStorage)(r,n,[l,...o].slice(0,60))}])},12408,e=>{"use strict";function t(){return"speechSynthesis"in window&&"SpeechSynthesisUtterance"in window}function a(e,r={}){if(!e.trim())return{ok:!1,message:"請先選擇要播放的內容。"};if(!t())return{ok:!1,message:"這個瀏覽器不支援語音播放,建議使用 Chrome 或 Edge。"};window.speechSynthesis.cancel();let s=new SpeechSynthesisUtterance(e);return s.lang=r.lang??"en-US",s.rate=r.rate??.82,s.pitch=r.pitch??1,s.volume=r.volume??1,window.speechSynthesis.speak(s),{ok:!0,message:"正在播放標準發音。"}}e.s(["speakEnglish",0,function(e,t={}){return a(e,{...t,lang:"en-US"})},"speakMandarin",0,function(e,t={}){return a(e,{rate:.76,pitch:1.05,...t,lang:"zh-TW"})},"speakText",0,a,"stopSpeech",0,function(){t()&&window.speechSynthesis.cancel()}])},32324,e=>{"use strict";var t=e.i(43476);let a={一:"ㄧ",二:"ㄦˋ",三:"ㄙㄢ",上衣:"ㄕㄤˋ ㄧ",下午:"ㄒㄧㄚˋ ㄨˇ",下雨的:"ㄒㄧㄚˋ ㄩˇ ㄉㄜ˙",不舒服:"ㄅㄨˋ ㄕㄨ ㄈㄨ˙",今天:"ㄐㄧㄣ ㄊㄧㄢ",公園:"ㄍㄨㄥ ㄩㄢˊ",午餐:"ㄨˇ ㄘㄢ",天氣:"ㄊㄧㄢ ㄑㄧˋ",手:"ㄕㄡˇ",水:"ㄕㄨㄟˇ",牛奶:"ㄋㄧㄡˊ ㄋㄞˇ",兄弟:"ㄒㄩㄥ ㄉㄧˋ",右邊:"ㄧㄡˋ ㄅㄧㄢ",左邊:"ㄗㄨㄛˇ ㄅㄧㄢ",市場:"ㄕˋ ㄔㄤˇ",再見:"ㄗㄞˋ ㄐㄧㄢˋ",多雲的:"ㄉㄨㄛ ㄩㄣˊ ㄉㄜ˙",早上:"ㄗㄠˇ ㄕㄤˋ",早餐:"ㄗㄠˇ ㄘㄢ",有風的:"ㄧㄡˇ ㄈㄥ ㄉㄜ˙",老師:"ㄌㄠˇ ㄕ",作業:"ㄗㄨㄛˋ ㄧ��ˋ",你好:"ㄋㄧˇ ㄏㄠˇ",車站:"ㄔㄜ ㄓㄢˋ",姊妹:"ㄗˇ ㄇㄟˋ",房間:"ㄈㄤˊ ㄐㄧㄢ",朋友:"ㄆㄥˊ ㄧㄡˇ",河流:"ㄏㄜˊ ㄌㄧㄡˊ",爸爸:"ㄅㄚˋ ㄅㄚ˙",玩:"ㄨㄢˊ",附近:"ㄈㄨˋ ㄐㄧㄣˋ",紅色:"ㄏㄨㄥˊ ㄙㄜˋ",書:"ㄕㄨ",書包:"ㄕㄨ ㄅㄠ",桌子:"ㄓㄨㄛ ㄗ˙",商店:"ㄕㄤ ㄉㄧㄢˋ",問題:"ㄨㄣˋ ㄊㄧˊ",教室:"ㄐㄧㄠˋ ㄕˋ",晚上:"ㄨㄢˇ ㄕㄤˋ",晚餐:"ㄨㄢˇ ㄘㄢ",累了:"ㄌㄟˋ ㄌㄜ˙",帽子:"ㄇㄠˋ ㄗ˙",晴朗的:"ㄑㄧㄥˊ ㄌㄤˇ ㄉㄜ˙",渴了:"ㄎㄜˇ ㄌㄜ˙",畫畫:"ㄏㄨㄚˋ ㄏㄨㄚˋ",答案:"ㄉㄚˊ ㄢˋ",開心:"ㄎㄞ ㄒㄧㄣ",黃色:"ㄏㄨㄤˊ ㄙㄜˋ",媽媽:"ㄇㄚ ㄇㄚ˙",準備好了:"ㄓㄨㄣˇ ㄅㄟˋ ㄏㄠˇ ㄌㄜ˙",腳:"ㄐㄧㄠˇ",鉛筆:"ㄑㄧㄢ ㄅㄧˇ",圖書館:"ㄊㄨˊ ㄕㄨ ㄍㄨㄢˇ",睡覺:"ㄕㄨㄟˋ ㄐㄧㄠˋ",綠色:"ㄌㄩˋ ㄙㄜˋ",說:"ㄕㄨㄛ",寫:"ㄒㄧㄝˇ",練習:"ㄌㄧㄢˋ ㄒㄧˊ",複習:"ㄈㄨˋ ㄒㄧˊ",請:"ㄑㄧㄥˇ",閱讀:"ㄩㄝˋ ㄉㄨˊ",莊:"ㄓㄨㄤ",村莊:"ㄘㄨㄣ ㄓㄨㄤ",鞋子:"ㄒㄧㄝˊ ㄗ˙",餓了:"ㄜˋ ㄌㄜ˙",學校:"ㄒㄩㄝˊ ㄒㄧㄠˋ",學習:"ㄒㄩㄝˊ ㄒㄧˊ",樹:"ㄕㄨˋ",橡皮擦:"ㄒㄧㄤˋ ㄆㄧˊ ㄘㄚ",醒來:"ㄒㄧㄥˇ ㄌㄞˊ",頭:"ㄊㄡˊ",謝謝你:"ㄒㄧㄝˋ ㄒㄧㄝ˙ ㄋㄧˇ",藍色:"ㄌㄢˊ ㄙㄜˋ",醫院:"ㄧ ㄩㄢˋ",難過:"ㄋㄢˊ ㄍㄨㄛˋ",蘋果:"ㄆㄧㄥˊ ㄍㄨㄛˇ",麵包:"ㄇㄧㄢˋ ㄅㄠ",聽:"ㄊㄧㄥ","老師,你好。":"ㄌㄠˇ ㄕ,ㄋㄧˇ ㄏㄠˇ。","這是我的書。":"ㄓㄜˋ ㄕˋ ㄨㄛˇ ㄉㄜ˙ ㄕㄨ。","謝謝你。":"ㄒㄧㄝˋ ㄒㄧㄝ˙ ㄋㄧˇ。","我需要幫忙。":"ㄨㄛˇ ㄒㄩ ㄧㄠˋ ㄅㄤ ㄇㄤˊ。","這是我的家人。":"ㄓㄜˋ ㄕˋ ㄨㄛˇ ㄉㄜ˙ ㄐㄧㄚ ㄖㄣˊ。","我喜歡蘋果。":"ㄨㄛˇ ㄒㄧˇ ㄏㄨㄢ ㄆㄧㄥˊ ㄍㄨㄛˇ。","我讀一本書。":"ㄨㄛˇ ㄉㄨˊ ㄧˋ ㄅㄣˇ ㄕㄨ。","我和朋友一起玩。":"ㄨㄛˇ ㄏㄜˊ ㄆㄥˊ ㄧㄡˇ ㄧˋ ㄑㄧˇ ㄨㄢˊ。","我說英文。":"ㄨㄛˇ ㄕㄨㄛ ㄧㄥ ㄨㄣˊ。","我有一個問題。":"ㄨㄛˇ ㄧㄡˇ ㄧˊ ㄍㄜ˙ ㄨㄣˋ ㄊㄧˊ。","我去圖書館。":"ㄨㄛˇ ㄑㄩˋ ㄊㄨˊ ㄕㄨ ㄍㄨㄢˇ。","我準備好了。":"ㄨㄛˇ ㄓㄨㄣˇ ㄅㄟˋ ㄏㄠˇ ㄌㄜ˙。","河邊有一個安靜的村莊。":"ㄏㄜˊ ㄅㄧㄢ ㄧㄡˇ ㄧˊ ㄍㄜ˙ ㄢ ㄐㄧㄥˋ ㄉㄜ˙ ㄘㄨㄣ ㄓㄨㄤ。"};e.s(["ZhuyinText",0,function({text:e,show:r=!0,compact:s=!1,className:n=""}){let o,l,i=r?(l=(o=e.trim()).match(/^我的名字是 (.+)。$/))?`ㄨㄛˇ ㄉㄜ˙ ㄇㄧㄥˊ ㄗˋ ㄕˋ ${l[1]}。`:a[o]??"":"";return(0,t.jsxs)("span",{className:`inline-flex flex-wrap items-center gap-x-2 gap-y-1 ${n}`,children:[(0,t.jsx)("span",{children:e}),i?(0,t.jsx)("span",{className:`rounded-full bg-white/85 font-black tracking-wide text-stone-500 shadow-sm ${s?"px-2 py-1 text-[11px]":"px-3 py-1 text-xs"}`,children:i}):null]})}],32324)},47106,e=>{"use strict";var t=e.i(43476),a=e.i(71645);let r=[["write","right"],["two","to","too"],["one","won"],["read","reed"],["blue","blew"],["weather","whether"]];function s(){let e=window;return e.SpeechRecognition??e.webkitSpeechRecognition??null}function n(e){return e.toLowerCase().replace(/\bi'm\b/g,"i am").replace(/\bit's\b/g,"it is").replace(/\byou're\b/g,"you are").replace(/\bwe're\b/g,"we are").replace(/\bthey're\b/g,"they are").replace(/\bcan't\b/g,"cannot").replace(/\bdon't\b/g,"do not").replace(/[^a-z\s']/g,"").replace(/\s+/g," ").trim()}function o(e,t){let a=n(e),s=n(t);if(!a||!s)return 0;if(a===s||r.some(e=>e.includes(a)&&e.includes(s)))return 1;let o=Math.max(a.length,s.length),l=Math.max(0,1-function(e,t){let a=Array.from({length:e.length+1},()=>Array(t.length+1).fill(0));for(let t=0;t<=e.length;t+=1)a[t][0]=t;for(let e=0;e<=t.length;e+=1)a[0][e]=e;for(let r=1;r<=e.length;r+=1)for(let s=1;s<=t.length;s+=1){let n=+(e[r-1]!==t[s-1]);a[r][s]=Math.min(a[r-1][s]+1,a[r][s-1]+1,a[r-1][s-1]+n)}return a[e.length][t.length]}(a,s)/o),i=a.split(" "),c=s.split(" ");if(1===i.length)return l;let d=function(e,t){let a=Array.from({length:e.length+1},()=>Array(t.length+1).fill(0));for(let r=1;r<=e.length;r+=1)for(let s=1;s<=t.length;s+=1)a[r][s]=e[r-1]===t[s-1]?a[r-1][s-1]+1:Math.max(a[r-1][s],a[r][s-1]);return a[e.length][t.length]}(i,c),u=d/i.length,h=d/c.length;return u<.7||h<.7?Math.min(l,.69):.45*l+.4*u+.15*h}function l(e){return e.replace(/[\s,。!?、,.!?]/g,"").trim()}function i(e,t,a=[]){let r=[e,...a].map(l).filter(Boolean),s=l(t);return!!r.length&&!!s&&r.some(e=>s===e||s.includes(e)||e.includes(s))}function c(e,t,a="en-US",r=[]){return a.toLowerCase().startsWith("zh")?i(e,t,r):[e,...r].some(e=>{var a;let r,s;return o(a=e,t)>=(1===(s=(r=n(a)).split(" ").filter(Boolean).length)&&r.length<=4?.9:1===s?.86:.8)})}var d=e.i(12408);e.s(["SpeechPracticeButton",0,function({expected:e,alternatives:r=[],lang:l="en-US",listenLabel:u="開始口說辨識",speakLabel:h="先聽一次",targetLabel:g="目標",compact:m=!1,showParentControls:p=!0,onResult:x,onReviewed:w,listenSeconds:f}){var y;let b,k,[v,j]=(0,a.useState)(!1),[z,N]=(0,a.useState)(!1),[S,I]=(0,a.useState)(!1),[$,T]=(0,a.useState)(null),[P,M]=(0,a.useState)(0),[E,C]=(0,a.useState)(!1),[R,q]=(0,a.useState)(""),[A,L]=(0,a.useState)(null),_=(0,a.useRef)(null),O=(0,a.useRef)([]),B=(0,a.useRef)(0);(0,a.useEffect)(()=>(j(!0),()=>{B.current+=1,R&&URL.revokeObjectURL(R),_.current?.stream.getTracks().forEach(e=>e.stop())}),[R]),(0,a.useEffect)(()=>{L(null),C(!1),T(null)},[e]);let W=(0,a.useMemo)(()=>v&&!!s(),[v]),D=v&&!W;function U(e){L(e),x?.(e)}async function G(){let t=B.current+1;B.current=t,(0,d.stopSpeech)(),L(null),C(!1);for(let e=3;e>=1;e-=1)if(T(e),await new Promise(e=>window.setTimeout(e,900)),B.current!==t)return;T(null),N(!0);let a=f??(e.trim().split(/\s+/).length>2?15:12);M(a);let u=window.setInterval(()=>M(e=>Math.max(0,e-1)),1e3);await new Promise(e=>window.setTimeout(e,220));let h=await function({expected:e,alternatives:t=[],lang:a="en-US",timeoutMs:r}){let l=s();return l?new Promise(s=>{let d=new l,u=r??(n(e).split(" ").filter(Boolean).length>2?15e3:12e3),h=Date.now()+u,g=!1,m="",p=0,x=0,w=0,f=e=>{if(!g){g=!0,window.clearTimeout(y);try{d.abort()}catch{}s(e)}},y=window.setTimeout(()=>{f({ok:!1,transcript:m,confidence:p,accuracy:Math.round(100*x),message:m?"有聽到聲音,但內容還不夠接近目標。放慢速度再試一次。":"還沒有聽到清楚的聲音,請靠近麥克風再試一次。"})},u);d.lang=a,d.interimResults=!0,d.maxAlternatives=5,d.continuous=!1;let b=()=>!(g||w>=2||Date.now()+900>=h)&&(w+=1,window.setTimeout(()=>{if(!g)try{d.start()}catch{}},320),!0);d.onresult=r=>{for(let s of Array.from({length:r.results.length},(e,t)=>r.results[t]))for(let r of Array.from({length:s.length},(e,t)=>s[t]).filter(Boolean)){let s=a.toLowerCase().startsWith("zh")?+!!i(e,r.transcript,t):function(e,t,a){return Math.max(...[e,...a].map(e=>o(e,t)))}(e,r.transcript,t),n=r.confidence??0;(s>x||s===x&&n>p)&&(m=r.transcript,p=n,x=s)}c(e,m,a,t)&&f({ok:!0,transcript:m,confidence:p,accuracy:Math.round(100*x),message:"系統有聽懂,發音和目標內容很接近。"})},d.onerror=e=>{("no-speech"===e.error||"aborted"===e.error)&&b()||f({ok:!1,transcript:m,confidence:p,accuracy:Math.round(100*x),message:"not-allowed"===e.error?"請允許瀏覽器使用麥克風,才能進行口說辨識。":"語音辨識暫時沒有收到完整內容,請再試一次。"})},d.onend=()=>{g||(c(e,m,a,t)?f({ok:!0,transcript:m,confidence:p,accuracy:Math.round(100*x),message:"系統有聽懂,發音和目標內容很接近。"}):b()||f({ok:!1,transcript:m,confidence:p,accuracy:Math.round(100*x),message:m?"內容還差一點,看看系統聽到的文字,再慢慢說一次。":"這次沒有聽清楚,請靠近麥克風再試一次。"}))};try{d.start()}catch{f({ok:!1,transcript:"",confidence:0,accuracy:0,message:"麥克風正在準備中,請稍等一下再按一次。"})}}):Promise.resolve({ok:!1,transcript:"",confidence:0,accuracy:0,message:"這個瀏覽器目前不支援語音轉文字,仍可使用錄音回放模式。"})}({expected:e,alternatives:r,lang:l,timeoutMs:1e3*a});window.clearInterval(u),B.current===t&&(N(!1),M(0),U(h))}async function H(){if(!("u">typeof navigator&&navigator.mediaDevices?.getUserMedia&&"u">typeof MediaRecorder))return void U({ok:!1,transcript:"",confidence:0,message:"這台裝置無法錄音,請讓孩子跟著家長唸一次。"});try{let e=await navigator.mediaDevices.getUserMedia({audio:!0}),t=new MediaRecorder(e);O.current=[],_.current=t,t.ondataavailable=e=>{e.data.size>0&&O.current.push(e.data)},t.onstop=()=>{let a=new Blob(O.current,{type:t.mimeType||"audio/webm"});R&&URL.revokeObjectURL(R),q(URL.createObjectURL(a)),e.getTracks().forEach(e=>e.stop())},t.start(),I(!0),L(null)}catch{U({ok:!1,transcript:"",confidence:0,message:"請允許麥克風權限,才能錄下孩子的口說練習。"})}}function F(e){U({ok:e,transcript:e?"家長確認發音接近目標":"家長確認需要再練一次",confidence:e?1:.35,message:e?"家長確認唸對了,很棒。":"再練一次,先聽標準發音再慢慢唸。"})}let K=A?.transcript&&"en-US"===l?(y=A.transcript,b=n(e).split(" ").filter(Boolean),k=new Set(n(y).split(" ").filter(Boolean)),b.map(e=>({word:e,heard:k.has(e)}))):[];return(0,t.jsxs)("div",{className:`mt-4 border border-blue-100 bg-blue-50/70 ${m?"rounded-2xl p-3":"rounded-3xl p-4 md:p-5"}`,children:[(0,t.jsxs)("div",{className:"rounded-2xl bg-white/85 p-4",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,t.jsx)("span",{className:"rounded-full bg-blue-100 px-3 py-1 text-xs font-black text-blue-800",children:W?"孩子口說辨識":"錄音回放模式"}),(0,t.jsx)("span",{className:"text-xs font-bold text-stone-500",children:"系統不會自己開始播放"})]}),m?null:(0,t.jsxs)("div",{className:"mt-3",children:[(0,t.jsx)("p",{className:"text-xs font-black text-stone-500",children:g}),(0,t.jsx)("p",{className:"mt-1 text-xl font-black leading-8 text-blue-800",children:e})]})]}),(0,t.jsx)("p",{className:"mt-3 text-sm font-bold leading-7 text-stone-600",children:W?"請孩子準備好後按下紅色按鈕,再親自把上面的內容唸出來。":"這台裝置目前不能直接轉成文字,仍可錄下孩子的聲音並回放。"}),(0,t.jsxs)("div",{className:"mt-3 grid gap-2 sm:grid-cols-2",children:[W?(0,t.jsx)("button",{type:"button",onClick:G,disabled:z||null!==$,className:"min-h-14 rounded-2xl bg-coral px-4 py-3 text-base font-black text-white shadow-sm transition hover:brightness-105 disabled:cursor-wait disabled:opacity-70",children:null!==$?`準備 ${$}`:z?`正在聽,還有 ${P} 秒`:u}):(0,t.jsx)("button",{type:"button",onClick:S?function(){_.current&&"inactive"!==_.current.state&&(_.current.stop(),I(!1))}:H,className:"min-h-14 rounded-2xl bg-coral px-4 py-3 text-base font-black text-white shadow-sm transition hover:brightness-105",children:S?"完成錄音":"錄下我的朗讀"}),(0,t.jsx)("button",{type:"button",onClick:()=>(0,d.speakText)(e,{lang:l,rate:"zh-TW"===l?.72:.68}),className:"min-h-14 rounded-2xl bg-butter px-4 py-3 text-base font-black text-amber-900 shadow-sm transition hover:bg-amber-100",children:h})]}),R&&D?(0,t.jsxs)("div",{className:"mt-3 rounded-2xl bg-white/80 p-3",children:[(0,t.jsx)("p",{className:"mb-2 text-sm font-bold text-stone-600",children:"iPhone/iPad 錄音回放:先聽孩子剛剛的聲音,再由家長協助確認。"}),(0,t.jsx)("audio",{className:"w-full",controls:!0,src:R}),(0,t.jsx)("button",{type:"button",onClick:()=>U({ok:!0,transcript:"已完成錄音並回放",confidence:1,accuracy:100,message:"這台裝置使用錄音回放模式,已完成本次朗讀。"}),className:"mt-3 min-h-12 w-full rounded-2xl bg-green-700 px-4 py-3 text-sm font-black text-white shadow-sm",children:"我已聽過錄音,完成這次朗讀"})]}):null,A?(0,t.jsxs)("div",{"aria-live":"polite",className:`mt-3 min-h-20 rounded-2xl p-4 text-sm font-bold leading-7 ${A.ok?"bg-green-50 text-green-900":"bg-rose-50 text-rose-900"}`,children:[(0,t.jsx)("p",{className:"text-base font-black",children:A.ok?"有聽到孩子的聲音,這次很接近。":"這次還沒聽完整,再慢慢說一次。"}),A.transcript?(0,t.jsxs)("p",{className:"mt-1",children:["系統聽到:",A.transcript]}):(0,t.jsx)("p",{className:"mt-1",children:"系統還沒有收到清楚的文字。"}),(0,t.jsxs)("p",{className:"mt-1",children:["目標內容:",e]}),"number"==typeof A.accuracy?(0,t.jsxs)("p",{children:["內容接近度:",A.accuracy,"%"]}):null,K.length>1?(0,t.jsx)("div",{className:"mt-2 flex flex-wrap gap-2","aria-label":"逐字辨識結果",children:K.map(({word:e,heard:a},r)=>(0,t.jsxs)("span",{className:`rounded-full px-3 py-1 text-xs font-black ${a?"bg-green-100 text-green-800":"bg-white text-rose-800"}`,children:[e," ",a?"有聽到":"再練一次"]},`${e}-${r}`))}):null,A.ok?null:(0,t.jsxs)("p",{className:"mt-2",children:["小提示:","zh-TW"===l?"先看注音,再按紅色按鈕自己唸一次。":`可以拆成「${function(e){if(e.includes(" "))return e.split(" ").join(" / ");if(e.length<=4)return e;let t=Math.ceil(e.length/2);return`${e.slice(0,t)} / ${e.slice(t)}`}(e)}」,放慢速度再試一次。`]}),A.ok&&w?(0,t.jsx)("button",{type:"button",disabled:E,onClick:function(){A?.ok&&!E&&(C(!0),w?.(A))},className:"mt-3 min-h-12 rounded-2xl bg-green-700 px-5 py-3 text-base font-black text-white shadow-sm disabled:bg-green-200 disabled:text-green-800",children:E?"已理解,可以前進":"我看懂了,完成口說"}):null]}):(0,t.jsx)("p",{"aria-live":"polite",className:"mt-3 min-h-16 rounded-2xl bg-white/65 p-3 text-sm font-bold leading-7 text-stone-500",children:null!==$?"先看著目標內容準備,倒數結束再開始說。":z?"麥克風已開啟,請孩子現在開始說;唸完後停一下,系統會自動判斷。":"尚未開始。按紅色按鈕後會先倒數 3 秒,再給孩子足夠時間朗讀。"}),p?(0,t.jsxs)("details",{className:"mt-3 rounded-2xl bg-white/70 px-4 py-3",children:[(0,t.jsx)("summary",{className:"cursor-pointer text-sm font-black text-stone-600",children:"家長協助確認(選用)"}),(0,t.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("button",{type:"button",onClick:()=>F(!0),className:"rounded-xl bg-mint px-3 py-2 text-xs font-black text-green-800",children:"聽起來正確"}),(0,t.jsx)("button",{type:"button",onClick:()=>F(!1),className:"rounded-xl bg-white px-3 py-2 text-xs font-black text-amber-900 shadow-sm",children:"需要再練"})]})]}):null]})}],47106)},97750,e=>{"use strict";var t=e.i(43476),a=e.i(14876);e.s(["SecondaryButton",0,function({children:e,href:r,onClick:s,type:n="button",className:o="",disabled:l=!1}){let i=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-butter px-6 py-3 text-center font-black text-amber-900 shadow-sm transition hover:-translate-y-0.5 hover:bg-amber-100 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-honey/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${o}`;return r&&!l?(0,t.jsx)(a.ExportSafeLink,{className:i,href:r,children:e}):(0,t.jsx)("button",{className:i,type:n,onClick:s,disabled:l,children:e})}])},73887,e=>{"use strict";var t=e.i(43476),a=e.i(14876);e.s(["PrimaryButton",0,function({children:e,href:r,onClick:s,type:n="button",className:o="",disabled:l=!1}){let i=`inline-flex min-h-12 items-center justify-center rounded-2xl bg-coral px-6 py-3 text-center font-black text-white shadow-warm transition hover:-translate-y-0.5 hover:brightness-105 active:translate-y-0 active:scale-[0.98] focus:outline-none focus:ring-4 focus:ring-coral/20 disabled:cursor-not-allowed disabled:translate-y-0 disabled:opacity-55 ${o}`;return r&&!l?(0,t.jsx)(a.ExportSafeLink,{className:i,href:r,children:e}):(0,t.jsx)("button",{className:i,type:n,onClick:s,disabled:l,children:e})}])},34295,e=>{"use strict";function t(e,t){return`${e}:${t}`}e.s(["getPersonStorageKey",0,t,"readPersonStorage",0,function(e,a,r){try{let s=window.localStorage.getItem(t(e,a));return s?JSON.parse(s):r}catch{return r}},"removePersonStorage",0,function(e,a){try{window.localStorage.removeItem(t(e,a))}catch{}},"writePersonStorage",0,function(e,a,r){try{return window.localStorage.setItem(t(e,a),JSON.stringify(r)),!0}catch{return!1}}])},44014,e=>{"use strict";let t={grade:1,title:"小一英文練習",subtitle:"每次 6 個生活單字,搭配可點擊發音、跟讀檢查與小測驗。",wordGroups:[{id:"greeting-school-1",title:"禮貌與校園",description:"從見面、離開、感謝和校園人物開始,讓孩子敢開口。",words:[{word:"hello",zh:"你好",category:"禮貌",usage:"見面時說",example:"Hello, teacher."},{word:"goodbye",zh:"再見",category:"禮貌",usage:"離開時說",example:"Goodbye, friend."},{word:"thank you",zh:"謝謝你",category:"禮貌",usage:"收到幫助時說",example:"Thank you."},{word:"teacher",zh:"老師",category:"校園",usage:"找老師時用",example:"My teacher is kind."},{word:"friend",zh:"朋友",category:"校園",usage:"介紹同學時用",example:"You are my friend."},{word:"book",zh:"書",category:"文具",usage:"拿起課本說",example:"This is my book."}]},{id:"stationery-color-1",title:"文具與顏色",description:"把桌上的文具和看到的顏色說出來。",words:[{word:"pencil",zh:"鉛筆",category:"文具",usage:"寫字時用",example:"This is my pencil."},{word:"eraser",zh:"橡皮擦",category:"文具",usage:"擦掉錯字時說",example:"I need an eraser."},{word:"bag",zh:"書包",category:"文具",usage:"整理書包時說",example:"This is my bag."},{word:"red",zh:"紅色",category:"顏色",usage:"看到紅色時說",example:"It is red."},{word:"blue",zh:"藍色",category:"顏色",usage:"看到藍色時說",example:"It is blue."},{word:"yellow",zh:"黃色",category:"顏色",usage:"看到黃色時說",example:"It is yellow."}]},{id:"family-home-1",title:"家人與家裡",description:"用簡單英文介紹家人和家裡常見物品。",words:[{word:"mother",zh:"媽媽",category:"家人",usage:"介紹媽媽時說",example:"This is my mother."},{word:"father",zh:"爸爸",category:"家人",usage:"介紹爸爸時說",example:"This is my father."},{word:"sister",zh:"姊妹",category:"家人",usage:"介紹姊妹時說",example:"She is my sister."},{word:"brother",zh:"兄弟",category:"家人",usage:"介紹兄弟時說",example:"He is my brother."},{word:"room",zh:"房間",category:"家裡",usage:"介紹房間時說",example:"This is my room."},{word:"table",zh:"桌子",category:"家裡",usage:"看到桌子時說",example:"The book is on the table."}]},{id:"food-feeling-1",title:"食物與心情",description:"從吃喝和心情表達開始,讓英文貼近生活。",words:[{word:"apple",zh:"蘋果",category:"食物",usage:"吃水果時說",example:"I like apples."},{word:"milk",zh:"牛奶",category:"食物",usage:"喝牛奶時說",example:"I drink milk."},{word:"water",zh:"水",category:"食物",usage:"想喝水時說",example:"I need water."},{word:"happy",zh:"開心",category:"心情",usage:"心情好時說",example:"I am happy."},{word:"sad",zh:"難過",category:"心情",usage:"心情不好時說",example:"I am sad."},{word:"tired",zh:"累了",category:"心情",usage:"想休息時說",example:"I am tired."}]},{id:"action-day-1",title:"動作與一天",description:"練習讀、寫、畫、聽、說、玩等日常動作。",words:[{word:"read",zh:"閱讀",category:"動作",usage:"看書時說",example:"I read a book."},{word:"write",zh:"寫",category:"動作",usage:"寫字時說",example:"I write my name."},{word:"draw",zh:"畫畫",category:"動作",usage:"畫圖時說",example:"I draw a sun."},{word:"listen",zh:"聽",category:"動作",usage:"聽老師說話時說",example:"I listen to my teacher."},{word:"speak",zh:"說",category:"動作",usage:"練習開口時說",example:"I speak English."},{word:"play",zh:"玩",category:"動作",usage:"和朋友玩時說",example:"I play with my friend."}]}],dailySentences:["Hello, teacher.","This is my book.","Thank you.","My name is ___.","I need help."],quiz:[{id:"q-hello",question:"hello 是什麼意思?",answer:"你好",options:["你好","書","老師"]},{id:"q-book",question:"book 是什麼意思?",answer:"���",options:["朋友","書","再見"]},{id:"q-thank-you",question:"收到幫助時可以說哪一句?",answer:"Thank you.",options:["Goodbye.","Thank you.","This is my book."]}]},a=[t,{grade:2,title:"小二英文練習",subtitle:"從家人、食物、日常動作開始,練習完整生活句。",wordGroups:[{id:"family-food-2",title:"家人與食物",description:"練習介紹家人,也能說出常見食物。",words:[{word:"mother",zh:"媽媽",category:"家人",usage:"介紹媽媽時說",example:"This is my mother."},{word:"father",zh:"爸爸",category:"家人",usage:"介紹爸爸時說",example:"This is my father."},{word:"sister",zh:"姊妹",category:"家人",usage:"介紹姊妹時說",example:"She is my sister."},{word:"brother",zh:"兄弟",category:"家人",usage:"介紹兄弟時說",example:"He is my brother."},{word:"apple",zh:"蘋果",category:"食物",usage:"吃水果時說",example:"I like apples."},{word:"milk",zh:"牛奶",category:"食物",usage:"喝牛奶時說",example:"I drink milk."}]},{id:"home-action-2",title:"家裡與動作",description:"把家裡常見物品和每天會做的動作說出來。",words:[{word:"room",zh:"房間",category:"家裡",usage:"介紹房間時說",example:"This is my room."},{word:"table",zh:"桌子",category:"家裡",usage:"看到桌子時說",example:"The book is on the table."},{word:"read",zh:"閱讀",category:"動作",usage:"看書時說",example:"I read a book."},{word:"write",zh:"寫",category:"動作",usage:"寫字時說",example:"I write my name."},{word:"draw",zh:"畫畫",category:"動作",usage:"畫圖時說",example:"I draw a sun."},{word:"play",zh:"玩",category:"動作",usage:"和朋友玩時說",example:"I play with my friend."}]},{id:"school-time-2",title:"校園與時間",description:"用簡單句子說出上課、午餐和一天中的時間。",words:[{word:"classroom",zh:"教室",category:"校園",usage:"介紹教室時說",example:"This is my classroom."},{word:"homework",zh:"作業",category:"校園",usage:"準備寫作業時說",example:"I do my homework."},{word:"lunch",zh:"午餐",category:"校園",usage:"吃午餐時說",example:"I eat lunch at school."},{word:"morning",zh:"早上",category:"時間",usage:"早上打招呼時說",example:"Good morning."},{word:"afternoon",zh:"下午",category:"時間",usage:"下午打招呼時說",example:"Good afternoon."},{word:"evening",zh:"晚上",category:"時間",usage:"晚上打招呼時說",example:"Good evening."}]},{id:"clothes-weather-2",title:"衣物與天氣",description:"依照天氣說出今天穿的衣物。",words:[{word:"shirt",zh:"上衣",category:"衣物",usage:"介紹衣服時說",example:"This is my shirt."},{word:"shoes",zh:"鞋子",category:"衣物",usage:"穿鞋時說",example:"These are my shoes."},{word:"hat",zh:"帽子",category:"衣物",usage:"戴帽子時說",example:"I have a hat."},{word:"sunny",zh:"晴朗的",category:"天氣",usage:"晴天時說",example:"It is sunny today."},{word:"rainy",zh:"下雨的",category:"天氣",usage:"雨天時說",example:"It is rainy today."},{word:"windy",zh:"有風的",category:"天氣",usage:"風很大時說",example:"It is windy today."}]},{id:"body-health-2",title:"身體與感受",description:"認識身體部位,也能說出餓、渴和不舒服。",words:[{word:"head",zh:"頭",category:"身體",usage:"指出頭部時說",example:"This is my head."},{word:"hand",zh:"手",category:"身體",usage:"指出手時說",example:"This is my hand."},{word:"foot",zh:"腳",category:"身體",usage:"指出腳時說",example:"This is my foot."},{word:"hungry",zh:"餓了",category:"感受",usage:"想吃東西時說",example:"I am hungry."},{word:"thirsty",zh:"渴了",category:"感受",usage:"想喝水時說",example:"I am thirsty."},{word:"sick",zh:"不舒服",category:"感受",usage:"身體不舒服時說",example:"I feel sick."}]}],dailySentences:["My name is ___.","This is my family.","I like apples.","I read a book.","I play with my friend."],quiz:[{id:"q2-family",question:"family 是什麼意思?",answer:"家人",options:["顏色","家人","鉛筆"]},{id:"q2-apple",question:"apple 是什麼意思?",answer:"蘋果",options:["蘋果","牛奶","書"]}]},{grade:3,title:"小三英文練習",subtitle:"加入動作、場所與比較完整的句型,讓孩子能說出自己的生活。",wordGroups:[{id:"action-learning-3",title:"學習動作",description:"練習讀、寫、聽、說,讓英文和學習情境連在一起。",words:[{word:"read",zh:"閱讀",category:"動作",usage:"看書時說",example:"I read a story."},{word:"write",zh:"寫",category:"動作",usage:"寫字時說",example:"I write English words."},{word:"listen",zh:"聽",category:"動作",usage:"聽老師說話時說",example:"I listen to my teacher."},{word:"speak",zh:"說",category:"動作",usage:"練習開口時說",example:"I speak English."},{word:"practice",zh:"練習",category:"學習",usage:"複習時說",example:"I practice every day."},{word:"question",zh:"問題",category:"學習",usage:"提問時說",example:"I have a question."}]},{id:"places-feelings-3",title:"地點與感受",description:"用英文說出常見地點,也練習描述自己的感覺。",words:[{word:"library",zh:"圖書館",category:"場所",usage:"借書時說",example:"I go to the library."},{word:"park",zh:"公園",category:"場所",usage:"出去玩時說",example:"I play in the park."},{word:"market",zh:"市場",category:"場所",usage:"買東西時說",example:"I go to the market."},{word:"happy",zh:"開心",category:"心情",usage:"心情好時說",example:"I am happy today."},{word:"tired",zh:"累了",category:"心情",usage:"想休息時說",example:"I am tired."},{word:"ready",zh:"準備好了",category:"心情",usage:"開始任務時說",example:"I am ready."}]},{id:"routine-time-3",title:"一天的作息",description:"把起床、吃飯、學習和睡覺連成一天的英文。",words:[{word:"wake",zh:"醒來",category:"作息",usage:"早上起床時說",example:"I wake up at seven."},{word:"breakfast",zh:"早餐",category:"作息",usage:"吃早餐時說",example:"I eat breakfast."},{word:"study",zh:"學習",category:"作息",usage:"開始學習時說",example:"I study English."},{word:"dinner",zh:"晚餐",category:"作息",usage:"吃晚餐時說",example:"I eat dinner with my family."},{word:"sleep",zh:"睡覺",category:"作息",usage:"準備睡覺時說",example:"I go to sleep."},{word:"today",zh:"今天",category:"時間",usage:"說今天的事情時用",example:"I am happy today."}]},{id:"nature-weather-3",title:"自然與天氣",description:"觀察每天的天氣和生活周遭的自然景物。",words:[{word:"weather",zh:"天氣",category:"天氣",usage:"談論天氣時說",example:"How is the weather?"},{word:"sunny",zh:"晴朗的",category:"天氣",usage:"晴天時說",example:"It is sunny today."},{word:"cloudy",zh:"多雲的",category:"天氣",usage:"多雲時說",example:"It is cloudy today."},{word:"rainy",zh:"下雨的",category:"天氣",usage:"雨天時說",example:"It is rainy today."},{word:"tree",zh:"樹",category:"自然",usage:"看到樹時說",example:"I see a tall tree."},{word:"river",zh:"河流",category:"自然",usage:"看到河流時說",example:"The river is long."}]},{id:"community-direction-3",title:"社區與方向",description:"認識社區場所,練習左右和遠近。",words:[{word:"hospital",zh:"醫院",category:"社區",usage:"介紹醫院時說",example:"The hospital is near."},{word:"station",zh:"車站",category:"社區",usage:"詢問車站時說",example:"Where is the station?"},{word:"store",zh:"商店",category:"社區",usage:"去商店時說",example:"I go to the store."},{word:"left",zh:"左邊",category:"方向",usage:"指左邊時說",example:"Turn left."},{word:"right",zh:"右邊",category:"方向",usage:"指右邊時說",example:"Turn right."},{word:"near",zh:"附近",category:"方向",usage:"說距離很近時用",example:"The school is near."}]}],dailySentences:["My name is ___.","I speak English.","I have a question.","I go to the library.","I am ready."],quiz:[{id:"q3-speak",question:"speak 是什麼意思?",answer:"說",options:["聽","說","寫"]},{id:"q3-library",question:"library 是什麼意思?",answer:"圖書館",options:["市場","公園","圖書館"]}]},{grade:4,title:"小四英文練習",subtitle:"用時間、興趣、交通、比較與購物情境,練習更完整的生活問答。",wordGroups:[{id:"time-hobby-4",title:"時間與興趣",description:"說出時間和自己喜歡的活動。",words:[{word:"clock",zh:"時鐘",category:"時間",usage:"看時間時用",example:"The clock says nine."},{word:"minute",zh:"分鐘",category:"時間",usage:"說時間長度時用",example:"Wait for five minutes."},{word:"early",zh:"提早地",category:"時間",usage:"比預定時間早時用",example:"I get up early."},{word:"hobby",zh:"興趣",category:"興趣",usage:"介紹休閒活動時用",example:"My hobby is drawing."},{word:"music",zh:"音樂",category:"興趣",usage:"談喜歡的活動時用",example:"I listen to music."},{word:"collect",zh:"收集",category:"興趣",usage:"說收藏時用",example:"I collect stickers."}]},{id:"transportation-4",title:"交通與移動",description:"練習說明自己怎麼到達不同地方。",words:[{word:"bus",zh:"公車",category:"交通",usage:"搭公車時用",example:"I go to school by bus."},{word:"train",zh:"火車",category:"交通",usage:"搭火車時用",example:"The train is fast."},{word:"bicycle",zh:"腳踏車",category:"交通",usage:"騎車時用",example:"I ride my bicycle."},{word:"station",zh:"車站",category:"地點",usage:"找車站時用",example:"The station is near."},{word:"ticket",zh:"車票",category:"交通",usage:"搭車前用",example:"I have a train ticket."},{word:"arrive",zh:"到達",category:"動作",usage:"說抵達時間時用",example:"We arrive at ten."}]},{id:"frequency-4",title:"多久做一次",description:"用頻率副詞描述日常習慣。",words:[{word:"always",zh:"總是",category:"頻率",usage:"每次都會時用",example:"I always wash my hands."},{word:"usually",zh:"通常",category:"頻率",usage:"大多時候會做時用",example:"I usually walk to school."},{word:"often",zh:"常常",category:"頻率",usage:"經常做某事時用",example:"I often read after dinner."},{word:"sometimes",zh:"有時候",category:"頻率",usage:"偶爾做某事時用",example:"I sometimes play chess."},{word:"never",zh:"從不",category:"頻率",usage:"完全不做時用",example:"I never skip breakfast."},{word:"weekend",zh:"週末",category:"時間",usage:"說假日活動時用",example:"I swim on the weekend."}]},{id:"comparison-4",title:"比較事物",description:"用常見形容詞比較大小、速度與重量。",words:[{word:"tall",zh:"高的",category:"描述",usage:"比較身高時用",example:"The giraffe is tall."},{word:"short",zh:"矮的;短的",category:"描述",usage:"比較高度或長度時用",example:"This pencil is short."},{word:"fast",zh:"快的",category:"描述",usage:"比較速度時用",example:"A train is fast."},{word:"slow",zh:"慢的",category:"描述",usage:"說速度慢時用",example:"The turtle is slow."},{word:"heavy",zh:"重的",category:"描述",usage:"比較重量時用",example:"This box is heavy."},{word:"light",zh:"輕的",category:"描述",usage:"說重量輕時用",example:"This bag is light."}]},{id:"shopping-4",title:"購物英文",description:"認識價格、金錢與購物時常用的動詞。",words:[{word:"price",zh:"價格",category:"購物",usage:"詢問價錢時用",example:"What is the price?"},{word:"money",zh:"錢",category:"購物",usage:"付錢時用",example:"I have enough money."},{word:"cheap",zh:"便宜的",category:"購物",usage:"價格低時用",example:"The pencil is cheap."},{word:"expensive",zh:"昂貴的",category:"購物",usage:"價格高時用",example:"The bag is expensive."},{word:"buy",zh:"購買",category:"購物",usage:"買東西時用",example:"I want to buy a book."},{word:"change",zh:"找零",category:"購物",usage:"付款後用",example:"Here is your change."}]}],dailySentences:["What time do you get up?","I usually walk to school.","My hobby is drawing.","The train is faster than the bus.","How much is this book?"],quiz:[{id:"q4-hobby",question:"hobby 是什麼意思?",answer:"興趣",options:["興趣","車票","價格"]},{id:"q4-often",question:"often 是什麼意思?",answer:"常常",options:["從不","常常","明天"]},{id:"q4-train",question:"火車的英文是哪一個?",answer:"train",options:["train","bicycle","station"]}]},{grade:5,title:"小五英文練習",subtitle:"從健康、方向、季節、過去經驗與未來計畫,建立閱讀和表達能力。",wordGroups:[{id:"health-habits-5",title:"健康與習慣",description:"用英文說出身體狀況與健康選擇。",words:[{word:"healthy",zh:"健康的",category:"健康",usage:"描述健康狀態時用",example:"Vegetables are healthy."},{word:"exercise",zh:"運動",category:"健康",usage:"談運動習慣時用",example:"I exercise every day."},{word:"headache",zh:"頭痛",category:"健康",usage:"說身體不舒服時用",example:"I have a headache."},{word:"medicine",zh:"藥",category:"健康",usage:"生病吃藥時用",example:"Take your medicine."},{word:"rest",zh:"休息",category:"健康",usage:"需要休息時用",example:"You should get some rest."},{word:"habit",zh:"習慣",category:"健康",usage:"談生活方式時用",example:"Sleeping early is a good habit."}]},{id:"map-direction-5",title:"地圖與方向",description:"看地圖時辨認方位和旅行地點。",words:[{word:"north",zh:"北方",category:"方向",usage:"看地圖時用",example:"Taipei is in the north."},{word:"south",zh:"南方",category:"方向",usage:"看地圖時用",example:"The beach is in the south."},{word:"east",zh:"東方",category:"方向",usage:"說日出方向時用",example:"The sun rises in the east."},{word:"west",zh:"西方",category:"方向",usage:"說日落方向時用",example:"The sun sets in the west."},{word:"map",zh:"地圖",category:"旅行",usage:"找路時用",example:"Let us look at the map."},{word:"hotel",zh:"旅館",category:"旅行",usage:"旅行住宿時用",example:"Our hotel is near the station."}]},{id:"seasons-5",title:"季節與活動",description:"說出四季和不同季節適合的活動。",words:[{word:"spring",zh:"春天",category:"季節",usage:"談春天時用",example:"Flowers grow in spring."},{word:"summer",zh:"夏天",category:"季節",usage:"談暑假時用",example:"I swim in summer."},{word:"autumn",zh:"秋天",category:"季節",usage:"談秋季時用",example:"Leaves fall in autumn."},{word:"winter",zh:"冬天",category:"季節",usage:"談冷天時用",example:"It is cold in winter."},{word:"vacation",zh:"假期",category:"活動",usage:"談放假安排時用",example:"We travel during vacation."},{word:"activity",zh:"活動",category:"活動",usage:"介紹行程時用",example:"This activity is fun."}]},{id:"past-experience-5",title:"過去的經驗",description:"用常見過去式說昨天做過的事。",words:[{word:"yesterday",zh:"昨天",category:"過去",usage:"說昨天的事情時用",example:"I was busy yesterday."},{word:"visited",zh:"拜訪了",category:"過去",usage:"說去過某地時用",example:"We visited the museum."},{word:"watched",zh:"觀看了",category:"過去",usage:"說看過節目時用",example:"I watched a movie."},{word:"played",zh:"玩了",category:"過去",usage:"說玩過什麼時用",example:"I played basketball."},{word:"studied",zh:"學習了",category:"過去",usage:"說讀過書時用",example:"I studied English."},{word:"went",zh:"去了",category:"過去",usage:"說去過某地時用",example:"We went to the park."}]},{id:"plans-advice-5",title:"計畫與建議",description:"安排明天的事情,也能給出簡單建議。",words:[{word:"tomorrow",zh:"明天",category:"計畫",usage:"談明天時用",example:"I will study tomorrow."},{word:"plan",zh:"計畫",category:"計畫",usage:"安排事情時用",example:"I have a plan."},{word:"should",zh:"應該",category:"建議",usage:"給建議時用",example:"You should drink water."},{word:"enough",zh:"足夠的",category:"建議",usage:"確認數量充足時用",example:"Get enough sleep."},{word:"careful",zh:"小心的",category:"建議",usage:"提醒注意時用",example:"Please be careful."},{word:"remember",zh:"記得",category:"建議",usage:"提醒別忘記時用",example:"Remember to bring your book."}]}],dailySentences:["You should get enough sleep.","How can I get to the station?","We visited the museum yesterday.","I will study English tomorrow.","Spring is warmer than winter."],quiz:[{id:"q5-healthy",question:"healthy 是什麼意思?",answer:"健康的",options:["健康的","昂貴的","小心的"]},{id:"q5-yesterday",question:"昨天的英文是哪一個?",answer:"yesterday",options:["tomorrow","yesterday","winter"]},{id:"q5-should",question:"給建議時常用哪一個字?",answer:"should",options:["visited","should","north"]}]},{grade:6,title:"小六英文練習",subtitle:"統整時態、連接詞與觀點表達,準備讀懂較長句子並銜接國中。",wordGroups:[{id:"school-project-6",title:"校園計畫",description:"規劃學習任務並清楚報告自己的目標。",words:[{word:"project",zh:"專題",category:"學習",usage:"談小組任務時用",example:"Our science project is ready."},{word:"schedule",zh:"行程表",category:"學習",usage:"安排時間時用",example:"Check the class schedule."},{word:"prepare",zh:"準備",category:"學習",usage:"開始任務前用",example:"We prepare for the report."},{word:"report",zh:"報告",category:"學習",usage:"上台分享時用",example:"I gave a short report."},{word:"choose",zh:"選擇",category:"學習",usage:"做決定時用",example:"Choose one topic."},{word:"goal",zh:"目標",category:"學習",usage:"設定學習方向時用",example:"My goal is to read more."}]},{id:"culture-travel-6",title:"旅行與文化",description:"認識不同國家、語言與文化特色。",words:[{word:"country",zh:"國家",category:"文化",usage:"介紹國家時用",example:"Japan is an island country."},{word:"culture",zh:"文化",category:"文化",usage:"談生活特色時用",example:"Every culture is special."},{word:"language",zh:"語言",category:"文化",usage:"談溝通時用",example:"English is an international language."},{word:"famous",zh:"著名的",category:"旅行",usage:"介紹景點時用",example:"The tower is famous."},{word:"tradition",zh:"傳統",category:"文化",usage:"介紹節慶時用",example:"This is a family tradition."},{word:"visitor",zh:"訪客",category:"旅行",usage:"說來訪的人時用",example:"Many visitors come here."}]},{id:"environment-6",title:"環境行動",description:"用英文討論減量、回收與保護環境。",words:[{word:"recycle",zh:"回收",category:"環境",usage:"分類資源時用",example:"We recycle paper and cans."},{word:"reduce",zh:"減少",category:"環境",usage:"減少浪費時用",example:"We should reduce waste."},{word:"reuse",zh:"重複使用",category:"環境",usage:"再次使用物品時用",example:"Reuse this bag."},{word:"energy",zh:"能源",category:"環境",usage:"談電力資源時用",example:"Turn off lights to save energy."},{word:"pollution",zh:"汙染",category:"環境",usage:"談環境問題時用",example:"Air pollution hurts our health."},{word:"protect",zh:"保護",category:"環境",usage:"談守護自然時用",example:"We must protect the ocean."}]},{id:"reasons-opinions-6",title:"原因與觀點",description:"用連接詞說清楚原因、結果和自己的看法。",words:[{word:"because",zh:"因為",category:"連接",usage:"說明原因時用",example:"I stayed home because it rained."},{word:"so",zh:"所以",category:"連接",usage:"說明結果時用",example:"It rained, so we stayed home."},{word:"however",zh:"然而",category:"連接",usage:"轉折時用",example:"It was hard; however, I finished it."},{word:"agree",zh:"同意",category:"觀點",usage:"表達同意時用",example:"I agree with your idea."},{word:"opinion",zh:"意見",category:"觀點",usage:"分享想法時用",example:"In my opinion, reading is useful."},{word:"reason",zh:"理由",category:"觀點",usage:"解釋想法時用",example:"Please give one reason."}]},{id:"junior-transition-6",title:"國中銜接",description:"練習解釋、解決問題與持續進步的學習用語。",words:[{word:"experience",zh:"經驗",category:"銜接",usage:"分享做過的事情時用",example:"It was a useful experience."},{word:"improve",zh:"進步;改善",category:"銜接",usage:"談學習成長時用",example:"Practice helps me improve."},{word:"solve",zh:"解決",category:"銜接",usage:"處理問題時用",example:"We can solve this problem."},{word:"explain",zh:"解釋",category:"銜接",usage:"說明答案時用",example:"Please explain your answer."},{word:"continue",zh:"繼續",category:"銜接",usage:"持續任務時用",example:"I will continue learning."},{word:"confident",zh:"有信心的",category:"銜接",usage:"描述自信時用",example:"I feel confident today."}]}],dailySentences:["My goal is to improve every day.","We should reduce waste to protect Earth.","I agree because your reason is clear.","I have finished my school project.","I will continue learning English."],quiz:[{id:"q6-protect",question:"protect 是什麼意思?",answer:"保護",options:["保護","比較","準備"]},{id:"q6-because",question:"說明原因時常用哪一個字?",answer:"because",options:["however","because","visitor"]},{id:"q6-improve",question:"improve 是什麼意思?",answer:"進步;改善",options:["解釋","進步;改善","選擇"]}]}];e.s(["englishLessons",0,a,"getEnglishLessonByGrade",0,function(e){return a.find(t=>t.grade===e)??t}])},17454,e=>{"use strict";var t=e.i(43476);e.s(["CompanionGuide",0,function({title:e,message:a}){return(0,t.jsx)("div",{className:"rounded-warm border border-softline bg-gradient-to-br from-cream via-white to-mint p-5 shadow-sm",children:(0,t.jsxs)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-start sm:justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:e}),(0,t.jsx)("p",{className:"mt-2 text-lg font-bold leading-8 text-stone-700",children:a})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-white/80 px-4 py-2 text-sm font-black text-green-800 shadow-sm",children:"提示"})]})})}])},71556,74761,24038,e=>{"use strict";var t=e.i(43476);let a={answer:"[ˈænsɚ]",afternoon:"[ˌæftɚˈnun]",advertise:"[ˈædvɚˌtaɪz]",apple:"[ˈæpəl]",bag:"[bæɡ]",blue:"[blu]",book:"[bʊk]",bread:"[brɛd]",breakfast:"[ˈbrɛkfəst]",brother:"[ˈbrʌðɚ]",classroom:"[ˈklæsˌrum]",cloudy:"[ˈklaʊdɪ]",dinner:"[ˈdɪnɚ]",draw:"[drɔ]",eraser:"[ɪˈresɚ]",evening:"[ˈivnɪŋ]",father:"[ˈfɑðɚ]",foot:"[fʊt]",friend:"[frɛnd]",goodbye:"[ˌɡʊdˈbaɪ]",green:"[grin]",hand:"[hænd]",happy:"[ˈhæpɪ]",hat:"[hæt]",head:"[hɛd]",hello:"[həˈlo]",homework:"[ˈhomˌwɝk]",hospital:"[ˈhɑspɪtəl]",hungry:"[ˈhʌŋɡrɪ]",left:"[lɛft]",library:"[ˈlaɪˌbrɛrɪ]",listen:"[ˈlɪsən]",lunch:"[lʌntʃ]",market:"[ˈmɑrkɪt]",milk:"[mɪlk]",morning:"[ˈmɔrnɪŋ]",mother:"[ˈmʌðɚ]",near:"[nɪr]",park:"[pɑrk]",pencil:"[ˈpɛnsəl]",play:"[ple]",please:"[pliz]",practice:"[ˈpræktɪs]",question:"[ˈkwɛstʃən]",rainy:"[ˈrenɪ]",read:"[rid]",ready:"[ˈrɛdɪ]",red:"[rɛd]",right:"[raɪt]",river:"[ˈrɪvɚ]",review:"[rɪˈvju]",room:"[rum]",sad:"[sæd]",shirt:"[ʃɝt]",shoes:"[ʃuz]",sick:"[sɪk]",sister:"[ˈsɪstɚ]",sleep:"[slip]",speak:"[spik]",station:"[ˈsteʃən]",store:"[stɔr]",study:"[ˈstʌdɪ]",sunny:"[ˈsʌnɪ]",school:"[skul]",table:"[ˈtebəl]",teacher:"[ˈtitʃɚ]","thank you":"[θæŋk ju]",thirsty:"[ˈθɝstɪ]",tired:"[taɪrd]",today:"[təˈde]",tree:"[tri]",one:"[wʌn]",two:"[tu]",three:"[θri]",wake:"[wek]",water:"[ˈwɔtɚ]",weather:"[ˈwɛðɚ]",windy:"[ˈwɪndɪ]",write:"[raɪt]",yellow:"[ˈjɛlo]"};function r(e,t=""){let s;return a[e.trim().toLowerCase()]??((s=t.trim().replace(/^\[|\]$/g,"").replaceAll("ә","ə").replaceAll("є","ɛ").replaceAll("ɒ","ɑ").replaceAll(":","ː").replace(/^'/,"ˈ").replaceAll(",","ˌ"))?`[${s}]`:"")}e.s(["getKKPhonetic",0,r],74761);var s=e.i(32324),n=e.i(12408);e.s(["ChildFriendlyExplanation",0,function({word:e,meaning:a,example:o,exampleMeaning:l,usage:i,correct:c,grade:d}){let u=r(e),h=d<=6;return(0,t.jsxs)("section",{className:`mt-5 rounded-3xl border p-5 ${c?"border-green-200 bg-green-50":"border-rose-200 bg-rose-50"}`,"aria-live":"polite",children:[(0,t.jsx)("p",{className:`text-sm font-black ${c?"text-green-800":"text-rose-800"}`,children:c?"答對解析":"再看一次就會了"}),(0,t.jsx)("h4",{className:"mt-2 text-2xl font-black text-ink",children:"小小解析"}),(0,t.jsxs)("div",{className:"mt-4 grid gap-4 md:grid-cols-2",children:[(0,t.jsxs)("div",{className:"border-b border-black/5 pb-4 md:border-b-0 md:border-r md:pb-0 md:pr-4",children:[(0,t.jsx)("p",{className:"text-xs font-black text-stone-500",children:"答案是"}),(0,t.jsxs)("button",{type:"button",onClick:()=>(0,n.speakEnglish)(e,{rate:.74}),className:"mt-2 text-left",children:[(0,t.jsx)("span",{className:"block text-3xl font-black text-blue-700",children:e}),u?(0,t.jsxs)("span",{className:"mt-1 block text-sm font-black text-blue-500",children:["KK ",u,"|點一下聽"]}):null]}),(0,t.jsx)("button",{type:"button",onClick:()=>(0,n.speakMandarin)(a,{rate:.76}),className:"mt-3 rounded-2xl bg-white/80 px-4 py-3 text-left font-black text-ink shadow-sm",children:(0,t.jsx)(s.ZhuyinText,{text:a,show:h})})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-xs font-black text-stone-500",children:"放進句子就懂了"}),(0,t.jsxs)("button",{type:"button",onClick:()=>(0,n.speakEnglish)(o,{rate:.72}),className:"mt-2 block text-left text-lg font-black leading-7 text-amber-900",children:[o,(0,t.jsx)("span",{className:"mt-1 block text-xs text-amber-700",children:"點一下聽例句"})]}),(0,t.jsx)("button",{type:"button",onClick:()=>(0,n.speakMandarin)(l,{rate:.76}),className:"mt-3 text-left font-bold leading-7 text-stone-700",children:(0,t.jsx)(s.ZhuyinText,{text:l,show:h})})]})]}),(0,t.jsxs)("p",{className:"mt-4 rounded-2xl bg-white/70 px-4 py-3 text-sm font-bold leading-7 text-stone-700",children:["記一記:先聽一次,再跟著說一次。",i?`在「${i}」的時候,就可以想到 ${e}。`:`把 ${e} 和「${a}」放在一起記。`]})]})}],71556);var o=e.i(9034),l=e.i(62164),i=e.i(34295);let c="chenguang-english-word-rotation-v2";e.s(["getNextEnglishQuestionSet",0,function({personId:e,grade:t,count:a=10,category:r,requestId:s}){var n,d,u;let h=(0,o.getTeachableVocabularyForGrade)(t),g=r?h.filter(e=>e.category===r):h,m=g.length>0?g:h,p=`${t}:${r??"all"}`,x=`${m.length}:${m[0]?.id??"empty"}:${m.at(-1)?.id??"empty"}`,w=(0,i.readPersonStorage)(c,e,{version:2,recentIds:[],lanes:{}}),f=w.lanes[p]??{cycle:0,cursor:0,poolSignature:x};if(f.poolSignature!==x&&(f={cycle:0,cursor:0,poolSignature:x}),f.lastRequestId===s&&f.lastSelectionIds?.length){let e=new Map(m.map(e=>[e.id,e])),t=f.lastSelectionIds.map(t=>e.get(t)).filter(e=>!!e);if(t.length>0)return{words:t,questions:(0,l.generateEnglishQuizFromWords)(t,h,f.cursor),poolSize:m.length,cycle:f.cycle,position:Math.min(f.cursor,m.length)}}let y=new Set(m.map(e=>e.id)),b=new Set(w.recentIds.filter(e=>y.has(e))),k=[],v=new Set,j=f.cycle,z=f.cursor,N=0,S=Math.max(3*m.length,4*a);for(;k.length<Math.min(a,m.length)&&N<S;){z>=m.length&&(j+=1,z=0);let t=function(e,t){let a=[...e],r=function(e){let t=0x811c9dc5;for(let a=0;a<e.length;a+=1)t^=e.charCodeAt(a),t=Math.imul(t,0x1000193);return t>>>0}(t)||1;for(let e=a.length-1;e>0;e-=1){let t=(r=Math.imul(r,1664525)+0x3c6ef35f>>>0)%(e+1);[a[e],a[t]]=[a[t],a[e]]}return a}(m,`${e}:${p}:${j}`)[z];z+=1,N+=1,!t||v.has(t.id)||m.length>b.size+k.length&&b.has(t.id)||(k.push(t),v.add(t.id))}f={cycle:j,cursor:z,poolSignature:x,lastRequestId:s,lastSelectionIds:k.map(e=>e.id)};let I={version:2,recentIds:(n=k.map(e=>e.id),d=w.recentIds,u=m.length,Array.from(new Set([...n,...d])).slice(0,Math.min(240,Math.max(0,u-1)))),lanes:{...w.lanes,[p]:f}};return(0,i.writePersonStorage)(c,e,I),{words:k,questions:(0,l.generateEnglishQuizFromWords)(k,h,z),poolSize:m.length,cycle:j,position:Math.min(z,m.length)}}],24038)},88293,e=>{"use strict";var t=e.i(43476),a=e.i(71645),r=e.i(10400),s=e.i(71556),n=e.i(17454),o=e.i(42391),l=e.i(73887),i=e.i(97750),c=e.i(98239),d=e.i(47106),u=e.i(70027),h=e.i(32324),g=e.i(9034),m=e.i(24038),p=e.i(87102),x=e.i(41324),w=e.i(12408);e.s(["default",0,function(){let{person:e}=(0,x.useActivePerson)(),f=(0,a.useRef)(`daily-${Date.now()}-${Math.random().toString(36).slice(2,8)}`),y=(0,a.useRef)(e.id),[b,k]=(0,a.useState)(0),[v,j]=(0,a.useState)("全部"),[z,N]=(0,a.useState)(0),[S,I]=(0,a.useState)({}),[$,T]=(0,a.useState)({}),[P,M]=(0,a.useState)(""),[E,C]=(0,a.useState)({}),[R,q]=(0,a.useState)({}),[A,L]=(0,a.useState)(!1),[_,O]=(0,a.useState)([]),[B,W]=(0,a.useState)({poolSize:0,cycle:0,position:0}),D="全部"===v?void 0:v,U=(0,a.useMemo)(()=>(0,g.getVocabularyCategories)(e.grade),[e.grade]),G=Object.keys(S).length,H=_.filter(e=>S[e.id]===e.answer&&!$[e.id]).length,F=_[z],K=F?S[F.id]:void 0,Q=!!K,Y=!!F&&K===F.answer,V=F?E[F.id]:void 0,Z=!!F&&!!R[F.id],J=Y&&!!V?.ok&&Z;function X(){k(e=>e+1),I({}),T({}),C({}),q({}),L(!1),N(0),M("")}function ee(e){j(e),k(e=>e+1),I({}),T({}),C({}),q({}),L(!1),N(0),M("")}return(0,a.useEffect)(()=>{"全部"===v||U.includes(v)||ee("全部")},[v,U]),(0,a.useEffect)(()=>{k(0),j("全部"),N(0),I({}),T({}),M(""),C({}),q({}),L(!1)},[e.id]),(0,a.useEffect)(()=>{if(y.current!==e.id&&(y.current=e.id,0!==b||"全部"!==v))return;let t=(0,m.getNextEnglishQuestionSet)({personId:e.id,grade:e.grade,count:10,category:D,requestId:`${f.current}:${e.id}:${b}:${v}`});O(t.questions),W({poolSize:t.poolSize,cycle:t.cycle,position:t.position}),N(0),M("")},[v,D,e.grade,e.id,b]),(0,t.jsxs)(r.AppShell,{children:[(0,t.jsx)(o.PageHeader,{eyebrow:"Daily 10",title:"每日 10 題英文小測驗",description:`依 ${e.name} 目前年級自動產生適合小學生的英文單字、句型與選擇題。`,action:(0,t.jsx)(i.SecondaryButton,{onClick:X,children:"換一組題目"})}),(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(n.CompanionGuide,{title:"不重複輪替題庫",message:"每位孩子都有自己的出題順序。新單字會優先出現,完整輪完目前年級字庫前不會回到舊題;答錯的內容另留在錯題複習。"})}),(0,t.jsxs)(c.SectionCard,{className:"mt-8",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{className:"font-black text-amber-700",children:["Grade ",e.grade," Vocabulary"]}),(0,t.jsx)("h2",{className:"mt-1 text-2xl font-black text-ink",children:"今天的 10 題"}),(0,t.jsxs)("p",{className:"mt-2 text-sm font-bold text-stone-500",children:["目前題組:",v,"|本輪已走到 ",B.position.toLocaleString()," / ",B.poolSize.toLocaleString(),B.cycle>0?`|第 ${B.cycle+1} 輪`:"|尚未重複"]})]}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsxs)("span",{className:"rounded-full bg-cream px-4 py-2 text-sm font-black text-amber-900",children:["已作答 ",G," / ",_.length]}),(0,t.jsxs)("span",{className:"rounded-full bg-mint px-4 py-2 text-sm font-black text-green-800",children:["分數 ",H," / ",_.length]}),(0,t.jsxs)("span",{className:"rounded-full bg-blue-50 px-4 py-2 text-sm font-black text-blue-800",children:["口說 ",Object.values(E).filter(e=>e.ok).length," / ",_.length]})]})]}),(0,t.jsx)("div",{className:"mt-5 flex flex-wrap gap-2",children:["全部",...U].map(e=>(0,t.jsx)("button",{type:"button",onClick:()=>ee(e),"aria-pressed":v===e,className:`rounded-full px-4 py-2 text-sm font-black shadow-sm transition active:scale-95 ${v===e?"bg-coral text-white":"bg-white/80 text-stone-600 hover:bg-butter hover:text-amber-900"}`,children:e},e))}),(0,t.jsx)("div",{className:"mt-5 h-3 overflow-hidden rounded-full bg-cream",children:(0,t.jsx)("div",{className:"h-full rounded-full bg-coral transition-all",style:{width:`${_.length?(z+1)/_.length*100:0}%`}})}),(0,t.jsx)("div",{className:"mt-6",children:F?(0,t.jsxs)("article",{className:"mx-auto max-w-3xl rounded-[2rem] border border-softline bg-white/90 p-5 shadow-warm md:p-7",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{className:"text-sm font-black text-amber-700",children:["第 ",z+1," 題 / ",F.category]}),(0,t.jsx)("h3",{className:"mt-2 text-2xl font-black leading-9 text-ink",children:F.question}),(0,t.jsxs)("p",{className:"mt-2 text-sm font-bold text-stone-500",children:["重點單字:",F.word,"|",(0,t.jsx)(h.ZhuyinText,{text:F.zh,show:e.grade<=6,compact:!0})]})]}),(0,t.jsx)("span",{className:"rounded-full bg-blue-50 px-4 py-2 text-sm font-black text-blue-700",children:"選一個答案,再確認"})]}),(0,t.jsx)("div",{className:"mt-4 rounded-2xl bg-cream/80 px-4 py-3",children:(0,t.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{className:"text-sm font-black text-amber-900",children:["例句:",F.example]}),(0,t.jsxs)("p",{className:"mt-1 text-sm font-bold text-stone-600",children:["意思:",F.exampleZh]})]}),(0,t.jsx)(u.VoiceButton,{text:F.example,variant:"mint",children:"播放例句"})]})}),(0,t.jsx)("div",{className:"mt-4 flex flex-wrap gap-2",children:F.options.map(a=>(0,t.jsx)("button",{type:"button",onClick:()=>{M(a),/^[\x00-\x7F\s'.,!?-]+$/.test(a)?(0,w.speakEnglish)(a,{rate:.76}):(0,w.speakMandarin)(a,{rate:.78})},className:`rounded-2xl px-4 py-2 font-black transition ${P===a||K===a?"bg-coral text-white shadow-sm":"bg-cream text-amber-900 hover:bg-butter"}`,children:(0,t.jsx)(h.ZhuyinText,{text:a,show:e.grade<=6,compact:!0,className:"justify-center"})},a))}),Q?null:(0,t.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-3",children:[(0,t.jsx)(l.PrimaryButton,{onClick:function(){F&&P&&(P!==F.answer&&T(e=>e[F.id]?e:{...e,[F.id]:P}),I(e=>({...e,[F.id]:P})),L(!1))},children:"確認答案"}),(0,t.jsx)("span",{className:"text-sm font-bold text-stone-500",children:"點選時會先唸出答案,確認後才會進入回饋。"})]}),Q?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.ChildFriendlyExplanation,{word:F.word,meaning:F.zh,example:F.example,exampleMeaning:F.exampleZh,correct:Y,grade:e.grade}),Y?null:(0,t.jsx)("button",{type:"button",onClick:function(){F&&(I(e=>{let t={...e};return delete t[F.id],t}),M(""),(0,w.speakEnglish)(F.example,{rate:.72}))},className:"mt-3 rounded-2xl bg-white px-4 py-3 font-black text-rose-800 shadow-sm",children:"聽完解析,再試一次"})]}):null,Y?(0,t.jsx)(d.SpeechPracticeButton,{expected:F.word,onResult:e=>{C(t=>({...t,[F.id]:e})),q(e=>({...e,[F.id]:!1}))},onReviewed:()=>q(e=>({...e,[F.id]:!0}))}):(0,t.jsx)("p",{className:"mt-4 rounded-2xl bg-blue-50 p-4 text-sm font-black text-blue-900",children:"先選對意思,接著才會開啟孩子口說辨識。"}),J?(0,t.jsx)("p",{className:"mt-3 rounded-2xl bg-green-50 p-3 text-sm font-black text-green-800",children:"答案、口說與解析都完成,可以前往下一題。"}):null,(0,t.jsxs)("div",{className:"mt-6 flex flex-wrap items-center justify-between gap-3",children:[(0,t.jsx)(i.SecondaryButton,{onClick:function(){N(e=>Math.max(e-1,0)),M("")},children:"上一題"}),(0,t.jsxs)("span",{className:"text-sm font-black text-stone-500",children:[z+1," / ",_.length]}),J&&z<_.length-1?(0,t.jsx)(l.PrimaryButton,{onClick:function(){N(e=>Math.min(e+1,Math.max(_.length-1,0))),M("")},children:"下一題"}):J?(0,t.jsx)(l.PrimaryButton,{onClick:function(){let t=_.map(e=>(0,p.buildAnswerRecord)(e,$[e.id]??S[e.id]??""));(0,p.saveDailyQuizRecord)(t,e.id),L(!0)},children:"完成並儲存"}):(0,t.jsx)("span",{className:"text-sm font-black text-amber-700",children:Q?Y?V?.ok?"看懂辨識結果後按『我看懂了』":"接著完成孩子口說辨識":"先完成這題再前進":"請先確認答案"})]})]},F.id):(0,t.jsx)("div",{className:"rounded-3xl bg-cream p-6 text-center font-black text-amber-900",children:"這個分類目前沒有題目,請換一組。"})}),A?(0,t.jsxs)("div",{className:"mt-8 flex flex-wrap items-center gap-3 rounded-3xl bg-green-50 p-5",children:[(0,t.jsxs)("span",{className:"font-black text-green-800",children:["已儲存,首次作答成績 ",H," / ",_.length]}),(0,t.jsx)(i.SecondaryButton,{onClick:X,children:"再來 10 題"})]}):null]})]})}])}]);
_next/static/chunks/3_mt5x2w7sss6.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return i},formatWithValidation:function(){return c},urlObjectKeys:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let l=e.r(90809)._(e.r(98183)),s=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:r}=e,n=e.protocol||"",a=e.pathname||"",i=e.hash||"",o=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),o&&"object"==typeof o&&(o=String(l.urlQueryToSearchParams(o)));let d=e.search||o&&`?${o}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||s.test(n))&&!1!==c?(c="//"+(c||""),a&&"/"!==a[0]&&(a="/"+a)):c||(c=""),i&&"#"!==i[0]&&(i="#"+i),d&&"?"!==d[0]&&(d="?"+d),a=a.replace(/[?#]/g,encodeURIComponent),d=d.replace("#","%23"),`${n}${c}${a}${d}${i}`}let o=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return i(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t){let r=(0,n.useRef)(null),a=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(r.current=l(e,n)),t&&(a.current=l(t,n))},[e,t])}function l(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return l}});let n=e.r(18967),a=e.r(52817);function l(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,a.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return p},useLinkStatus:function(){return w}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let l=e.r(90809),s=e.r(43476),i=l._(e.r(71645)),o=e.r(95057),c=e.r(8372),d=e.r(18581),u=e.r(18967),h=e.r(5550);e.r(33525);let f=e.r(88540),g=e.r(91949),m=e.r(73668),x=e.r(9396);function p(t){var r,n;let a,l,p,[w,v]=(0,i.useOptimistic)(g.IDLE_LINK_STATUS),j=(0,i.useRef)(null),{href:y,as:N,children:k,prefetch:S=null,passHref:P,replace:$,shallow:E,scroll:L,onClick:C,onMouseEnter:I,onTouchStart:R,legacyBehavior:_=!1,onNavigate:O,transitionTypes:A,ref:T,unstable_dynamicOnHover:M,...B}=t;a=k,_&&("string"==typeof a||"number"==typeof a)&&(a=(0,s.jsx)("a",{children:a}));let U=i.default.useContext(c.AppRouterContext),H=!1!==S,z=!1!==S?null===(n=S)||"auto"===n?x.FetchStrategy.PPR:x.FetchStrategy.Full:x.FetchStrategy.PPR,D="string"==typeof(r=N||y)?r:(0,o.formatUrl)(r);if(_){if(a?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});l=i.default.Children.only(a)}let K=_?l&&"object"==typeof l&&l.ref:T,W=i.default.useCallback(e=>(null!==U&&(j.current=(0,g.mountLinkInstance)(e,D,U,z,H,v)),()=>{j.current&&((0,g.unmountLinkForCurrentNavigation)(j.current),j.current=null),(0,g.unmountPrefetchableInstance)(e)}),[H,D,U,z,v]),F={ref:(0,d.useMergedRef)(W,K),onClick(t){_||"function"!=typeof C||C(t),_&&l.props&&"function"==typeof l.props.onClick&&l.props.onClick(t),!U||t.defaultPrevented||function(t,r,n,a,l,s,o){if("u">typeof window){let c,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,m.isLocalURL)(r)){a&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),s){let e=!1;if(s({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);i.default.startTransition(()=>{u(r,a?"replace":"push",!1===l?f.ScrollBehavior.NoScroll:f.ScrollBehavior.Default,n.current,o)})}}(t,D,j,$,L,O,A)},onMouseEnter(e){_||"function"!=typeof I||I(e),_&&l.props&&"function"==typeof l.props.onMouseEnter&&l.props.onMouseEnter(e),U&&H&&(0,g.onNavigationIntent)(e.currentTarget,!0===M)},onTouchStart:function(e){_||"function"!=typeof R||R(e),_&&l.props&&"function"==typeof l.props.onTouchStart&&l.props.onTouchStart(e),U&&H&&(0,g.onNavigationIntent)(e.currentTarget,!0===M)}};return(0,u.isAbsoluteUrl)(D)?F.href=D:_&&!P&&("a"!==l.type||"href"in l.props)||(F.href=(0,h.addBasePath)(D)),p=_?i.default.cloneElement(l,F):(0,s.jsx)("a",{...B,...F,children:a}),(0,s.jsx)(b.Provider,{value:w,children:p})}e.r(84508);let b=(0,i.createContext)(g.IDLE_LINK_STATUS),w=()=>(0,i.useContext)(b);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},14876,e=>{"use strict";var t=e.i(43476),r=e.i(22016);function n(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:r,suffix:n}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===r?`/index.html${n}`:/\.[a-z0-9]+$/i.test(r)?e:`${r.replace(/\/+$/,"")}/index.html${n}`}e.s(["ExportSafeLink",0,function({href:e,children:a,...l}){return"string"==typeof e?(0,t.jsx)("a",{href:n(e),...l,children:a}):(0,t.jsx)(r.default,{href:e,...l,children:a})},"getExportSafeHref",0,n])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let r=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function n(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return r.find(t=>t.grade===e)},"getGradeIdByNumber",0,n,"grades",0,r],62312);let a=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],l={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function s(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.find(e=>e.id===t)??l}function i(e){if(!e)return l.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.some(e=>e.id===t)?t:l.id}e.s(["currentStudent",0,l,"getCurrentStudentGradeId",0,function(e=l){return n(e.grade)},"getPersonById",0,s,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,a,"normalizePersonId",0,i],7728);let o="chenguang-active-person-id",c="chenguang-active-person-change",d="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,r]=(0,t.useState)(l.id),[n,a]=(0,t.useState)(!1),[h,f]=(0,t.useState)(!1);function g(e){let t=i(e);r(t),window.localStorage.setItem(o,t),window.dispatchEvent(new Event(c))}return(0,t.useEffect)(()=>{let e=i(window.localStorage.getItem(o));function t(){let e=i(window.localStorage.getItem(o));r(e),window.localStorage.setItem(o,e)}function n(){a(!!window.localStorage.getItem(d))}return r(e),window.localStorage.setItem(o,e),a(!!window.localStorage.getItem(d)),f(!0),window.addEventListener(c,t),window.addEventListener("storage",t),window.addEventListener(u,n),()=>{window.removeEventListener(c,t),window.removeEventListener("storage",t),window.removeEventListener(u,n)}},[]),{person:s(e),switchPerson:g,signIn:function(e){let t=i(e);g(t);let r=s(t);window.localStorage.setItem(d,JSON.stringify({personId:t,role:r.role,signedInAt:new Date().toISOString()})),a(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(d),a(!1),window.dispatchEvent(new Event(u))},isLoggedIn:n,isReady:h}}],41324)},82697,e=>{"use strict";var t=e.i(43476),r=e.i(14876),n=e.i(7728),a=e.i(62312),l=e.i(41324);e.s(["BrandHeader",0,function({showPerson:e=!0}){let{person:s,isLoggedIn:i}=(0,l.useActivePerson)(),o=(0,a.getGradeByNumber)(s.grade),c=i?`${(0,n.getPersonDisplayName)(s)}|${"student"===s.role?(0,n.getPersonSubtitle)(s):o?.shortName??`小${s.grade}`}`:"訪客模式";return(0,t.jsxs)(r.ExportSafeLink,{href:i?"/dashboard":"/",className:"flex min-w-0 items-center gap-3 text-ink",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 shrink-0 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{className:"min-w-0 leading-tight",children:[(0,t.jsx)("strong",{className:"block truncate text-xl font-black",children:"晨光"}),(0,t.jsx)("small",{className:"block truncate text-sm font-bold text-stone-500",children:e?c:"國小學習陪跑系統"})]})]})}])},18566,(e,t,r)=>{t.exports=e.r(76562)},22468,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),l=e.i(7728),s=e.i(62312),i=e.i(41324);let o=[{label:"登入",href:"/login"},{label:"訪客體驗",href:"/courses"},{label:"註冊登入",href:"/register",primary:!0}];function c(e,t="student"){let r=[{label:"課程首頁",href:"/dashboard",icon:"⌂"},{label:"每日 10 題",href:"/daily-quiz",icon:"10"},{label:"錯題 AI 說明",href:"/wrong-review",icon:"AI"},{label:"進度月曆",href:"/parent-weekly-report",icon:"月"},{label:"英文練習",href:"/practice",icon:"Aa"},{label:"手寫出題",href:"/word-scanner",icon:"掃"},{label:"課程總覽",href:"/courses",icon:"▦"},{label:"國語練習",href:`/courses/grade-${e}/chinese/basic`,icon:"ㄅ"},{label:"數學練習",href:`/courses/grade-${e}/math/basic`,icon:"123"},{label:"每日紀錄",href:"/daily-record",icon:"✓"},{label:"週計畫",href:"/weekly-plan",icon:"□"},{label:"登出",href:"/",icon:"出"}];return"parent"===t?r.filter(e=>["課程首頁","進度月曆","每日紀錄","週計畫","課程總覽","登出"].includes(e.label)):"teacher"===t?r.filter(e=>["課程首頁","課程總覽","國語練習","英文練習","數學練習","週計畫","手寫出題","登出"].includes(e.label)):r.filter(e=>["課程首頁","每日 10 題","英文練習","國語練習","數學練習","手寫出題","錯題 AI 說明","登出"].includes(e.label))}function d(e,t){return"/dashboard"===t?"/dashboard"===e:"/courses"===t?"/courses"===e:t.startsWith("/courses/")?e===t||e.startsWith(`${t}/`):e===t}function u({compact:e=!1}){let{person:n}=(0,i.useActivePerson)(),[a,o]=(0,r.useState)(!1),c=(0,s.getGradeByNumber)(n.grade),d="student"===n.role?(0,l.getPersonSubtitle)(n):c?.name??`國小${n.grade}年級`,h=(0,t.jsx)("div",{className:"grid gap-2",children:l.mockPeople.map(e=>{let r=(0,s.getGradeByNumber)(e.grade),a=e.id===n.id;return(0,t.jsxs)("button",{type:"button",onClick:()=>{var t;let r;return t=e.id,o(!1),r=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login",void window.location.assign(`${r}?person=${encodeURIComponent(t)}`)},className:`rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${a?"bg-coral text-white shadow-sm":"bg-white text-stone-700 hover:bg-butter"}`,children:[(0,t.jsxs)("span",{className:"block text-xs font-black opacity-80",children:[(0,l.getRoleLabel)(e.role),"模式"]}),(0,t.jsx)("span",{className:"mt-1 block text-base font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-1 block text-xs font-bold opacity-75",children:"student"===e.role?(0,l.getPersonSubtitle)(e):r?.name??`國小${e.grade}年級`})]},e.id)})});return e?(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>o(e=>!e),className:"flex min-h-11 max-w-[5.5rem] items-center gap-1 rounded-2xl bg-butter px-2 text-left text-amber-950 shadow-sm sm:max-w-none sm:gap-2 sm:px-3","aria-expanded":a,"aria-label":"切換目前使用者",children:[(0,t.jsxs)("span",{className:"min-w-0",children:[(0,t.jsx)("strong",{className:"block max-w-20 truncate text-sm font-black",children:n.name}),(0,t.jsx)("small",{className:"block text-[11px] font-bold opacity-70",children:c?.shortName??`小${n.grade}`})]}),(0,t.jsx)("span",{"aria-hidden":"true",className:"text-xs",children:"⌄"})]}),a?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100vh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsx)("strong",{className:"text-base font-black text-ink",children:"切換使用者"}),(0,t.jsx)("button",{type:"button",onClick:()=>o(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉帳號選單",children:"×"})]}),h]}):null]}):(0,t.jsxs)("section",{className:"rounded-3xl border border-amber-100 bg-cream p-3 shadow-sm",children:[(0,t.jsx)("button",{type:"button",onClick:()=>o(e=>!e),className:"w-full rounded-[1.35rem] bg-white/80 p-3 text-left ring-1 ring-transparent transition hover:bg-white hover:ring-coral/30","aria-expanded":a,"aria-label":"切換目前使用者",children:(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("p",{className:"text-xs font-black text-amber-700",children:[(0,l.getRoleLabel)(n.role),"模式"]}),(0,t.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-2",children:[(0,t.jsx)("h2",{className:"text-2xl font-black leading-tight text-ink",children:n.name}),(0,t.jsx)("span",{className:"rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"student"===n.role?"匿名檔案":(0,l.getRoleLabel)(n.role)})]}),(0,t.jsx)("p",{className:"mt-2 text-sm font-bold leading-6 text-stone-500",children:d})]}),(0,t.jsx)("span",{className:"shrink-0 rounded-full bg-coral px-3 py-2 text-xs font-black text-white shadow-sm",children:"切換帳號"})]})}),a?(0,t.jsx)("div",{className:"mt-3",children:h}):null]})}e.s(["AppSidebar",0,function(){let e=(0,n.usePathname)(),{person:r,isLoggedIn:l,signOut:s}=(0,i.useActivePerson)();function h(){s();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsx)("aside",{className:"fixed inset-y-0 left-0 z-20 hidden w-64 flex-col border-r border-softline/80 bg-white/85 backdrop-blur-xl lg:flex",children:(0,t.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 py-6",children:[(0,t.jsxs)(a.ExportSafeLink,{className:"flex items-center gap-3",href:l?"/dashboard":"/",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"text-sm font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),l?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{}),(0,t.jsx)("nav",{className:"grid gap-2 pr-1",children:c(r.grade,r.role).map(r=>{let n=d(e,r.href),l=`flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left transition ${n?"bg-butter text-amber-900 shadow-sm":"text-stone-600 hover:bg-butter hover:text-amber-900"}`,s=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 place-items-center rounded-xl text-sm font-black shadow-sm ${n?"bg-white text-coral":"bg-white text-stone-500"}`,children:r.icon}),(0,t.jsx)("span",{className:"font-bold",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:h,className:l,children:s},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,className:l,children:s},r.label)})})]}):(0,t.jsx)("div",{className:"grid gap-3",children:o.map(e=>(0,t.jsx)(a.ExportSafeLink,{href:e.href,className:e.primary?"rounded-2xl bg-coral px-4 py-3 text-center font-black text-white shadow-warm transition hover:brightness-105":"rounded-2xl border border-softline bg-white px-4 py-3 text-center font-black text-amber-800 transition hover:bg-butter",children:e.label},e.label))}),l?(0,t.jsxs)(a.ExportSafeLink,{href:"student"===r.role?"/wrong-review":"/parent-weekly-report",className:"mt-auto rounded-2xl border border-green-100 bg-green-50 p-4 text-sm text-green-900 transition hover:-translate-y-0.5 hover:bg-green-100",children:[(0,t.jsx)("span",{className:"block text-xs font-black text-green-700",children:"本週學習摘要"}),(0,t.jsx)("strong",{className:"mt-2 block text-lg",children:"每天一小步,進度看得見"}),(0,t.jsx)("span",{className:"mt-2 block font-bold text-green-700",children:"查看進度與需要再練的內容 →"})]}):null]})})},"MobileMenu",0,function(){let e=(0,n.usePathname)(),{person:l,signOut:s}=(0,i.useActivePerson)(),[o,u]=(0,r.useState)(!1),h=c(l.grade,l.role);function f(){s();let e=window.location.hostname.endsWith(".static.hf.space")?"/login/index.html":"/login";window.location.assign(e)}return(0,t.jsxs)("div",{className:"shrink-0 lg:hidden",children:[(0,t.jsx)("button",{type:"button",onClick:()=>u(e=>!e),className:"grid min-h-11 min-w-11 place-items-center rounded-2xl bg-white text-xl font-black text-amber-900 shadow-sm active:scale-[0.98]","aria-expanded":o,"aria-label":"開啟完整功能選單",children:o?"×":"☰"}),o?(0,t.jsxs)("div",{className:"fixed inset-x-4 top-20 z-[70] max-h-[calc(100dvh-6rem)] overflow-y-auto rounded-3xl border border-white/80 bg-[#fffaf3]/95 p-3 shadow-warm backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"mb-3 flex items-center justify-between px-1",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("strong",{className:"block text-base font-black text-ink",children:"全部功能"}),(0,t.jsxs)("span",{className:"text-xs font-bold text-stone-500",children:["依 ",l.name," 的身分顯示"]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!1),className:"grid h-9 w-9 place-items-center rounded-full bg-white font-black text-stone-600","aria-label":"關閉功能選單",children:"×"})]}),(0,t.jsx)("nav",{className:"grid grid-cols-2 gap-2",children:h.map(r=>{let n=d(e,r.href),l=`flex min-h-16 items-center gap-3 rounded-2xl px-3 py-3 text-left transition active:scale-[0.99] ${n?"bg-coral text-white":"bg-white text-stone-700"}`,s=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:`grid h-9 w-9 shrink-0 place-items-center rounded-xl text-sm font-black ${n?"bg-white/20":"bg-butter text-amber-900"}`,children:r.icon}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:r.label})]});return"登出"===r.label?(0,t.jsx)("button",{type:"button",onClick:f,className:l,children:s},r.label):(0,t.jsx)(a.ExportSafeLink,{href:r.href,onClick:()=>u(!1),className:l,children:s},r.label)})})]}):null]})},"MobileQuickNav",0,function(){var e;let r,l=(0,n.usePathname)(),{person:s}=(0,i.useActivePerson)(),o=(r=c(s.grade,e=s.role),("guest"===e?["課程首頁","課程總覽"]:({student:["課程首頁","每日 10 題","英文練習","課程總覽"],parent:["課程首頁","進度月曆","每日紀錄","週計畫"],teacher:["課程首頁","課程總覽","週計畫","手寫出題"]})[e]).map(e=>r.find(t=>t.label===e)).filter(e=>!!e));return(0,t.jsx)("nav",{className:"fixed inset-x-3 bottom-[max(0.75rem,env(safe-area-inset-bottom))] z-50 grid grid-cols-4 gap-1 rounded-3xl border border-white/80 bg-white/90 p-2 shadow-warm backdrop-blur-xl lg:hidden","aria-label":"主要功能",children:o.map(e=>{let r=d(l,e.href);return(0,t.jsxs)(a.ExportSafeLink,{href:e.href,className:`flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl px-1 py-2 text-center transition active:scale-[0.98] ${r?"bg-coral text-white shadow-sm":"text-stone-600"}`,children:[(0,t.jsx)("span",{className:"text-sm font-black",children:e.icon}),(0,t.jsx)("span",{className:"w-full truncate text-[11px] font-black",children:e.label})]},e.label)})})},"PersonSwitcher",0,u])},55634,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(18566),a=e.i(14876),l=e.i(41324);e.s(["ActiveGradeRouteSync",0,function(){let e=(0,n.usePathname)(),{person:s,isLoggedIn:i,isReady:o}=(0,l.useActivePerson)(),c=function(e){let t=e.match(/^\/learn\/(?:grade-)?([1-6])(?:\/|$)/);if(t)return Number(t[1]);let r=e.match(/^\/courses\/grade-([1-6])(?:\/|$)/);if(r)return Number(r[1]);let n=e.match(/^\/(?:lesson|practice|handwriting)\/grade-([1-6])-/);return n?Number(n[1]):null}(e),d=!!(o&&i&&"student"===s.role&&c&&c!==s.grade);return((0,r.useEffect)(()=>{var t;if(!d)return;let r=(t=s.grade,/^\/learn\/(?:grade-)?[1-6](?:\/|$)/.test(e)?e.replace(/^\/learn\/(?:grade-)?[1-6]/,`/learn/${t}`):/^\/courses\/grade-[1-6](?:\/|$)/.test(e)?e.replace(/^\/courses\/grade-[1-6]/,`/courses/grade-${t}`):e.replace(/^(\/(?:lesson|practice|handwriting)\/)grade-[1-6]-/,`$1grade-${t}-`)),n=`${(0,a.getExportSafeHref)(r)}${window.location.search}${window.location.hash}`;window.location.replace(n)},[e,s.grade,d]),o&&!d)?null:(0,t.jsx)("div",{className:"fixed inset-0 z-[100] grid place-items-center bg-[#fffaf3]/95 p-5 backdrop-blur-md",role:"status","aria-live":"polite",children:(0,t.jsxs)("div",{className:"w-full max-w-md rounded-[2rem] border border-white bg-white/90 p-7 text-center shadow-warm",children:[(0,t.jsx)("span",{className:"mx-auto grid h-14 w-14 place-items-center rounded-2xl bg-butter text-2xl","aria-hidden":"true",children:"☀"}),(0,t.jsx)("strong",{className:"mt-4 block text-2xl font-black text-ink",children:o?`正在切換到小${s.grade}課程`:"正在讀取目前學習年級"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"晨光會自動載入這位學習者正確的課程內容。"})]})})}],55634)}]);
_next/static/chunks/3cc8cz63kiyex.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,79693,e=>{"use strict";let t=[{id:"g1-one-heart",grade:1,idiom:"一心一意",zhuyin:"ㄧ ㄒㄧㄣ ㄧ ㄧˋ",kidMeaning:"把心思專心放在同一件事上。",example:"我一心一意把這一頁讀完。",whenToUse:"形容很專心、不分心。",storyHint:"孩子坐好,只專心讀眼前的一本書。"},{id:"g1-seven-eight",grade:1,idiom:"七上八下",zhuyin:"ㄑㄧ ㄕㄤˋ ㄅㄚ ㄒㄧㄚˋ",kidMeaning:"心裡很緊張,安定不下來。",example:"上臺前,我的心情七上八下。",whenToUse:"形容擔心或緊張的心情。",storyHint:"第一次上臺的孩子握著講稿,心跳得很快。"},{id:"g1-dance",grade:1,idiom:"手舞足蹈",zhuyin:"ㄕㄡˇ ㄨˇ ㄗㄨˊ ㄉㄠˋ",kidMeaning:"高興得手腳都動了起來。",example:"聽到校外教學的消息,大家高興得手舞足蹈。",whenToUse:"形容非常高興。",storyHint:"孩子聽到好消息,開心地揮手跳舞。"},{id:"g1-orderly",grade:1,idiom:"井然有序",zhuyin:"ㄐㄧㄥˇ ㄖㄢˊ ㄧㄡˇ ㄒㄩˋ",kidMeaning:"東西或事情排得整整齊齊,很有順序。",example:"書架上的書放得井然有序。",whenToUse:"形容整齊而有條理。",storyHint:"不同顏色的書一本一本排在書架上。"},{id:"g1-help",grade:1,idiom:"守望相助",zhuyin:"ㄕㄡˇ ㄨㄤˋ ㄒㄧㄤ ㄓㄨˋ",kidMeaning:"大家互相照顧、互相幫忙。",example:"鄰居守望相助,讓社區更安全。",whenToUse:"形容彼此關心和幫助。",storyHint:"下雨時,鄰居一起幫忙收好院子裡的物品。"},{id:"g2-teamwork",grade:2,idiom:"同心協力",zhuyin:"ㄊㄨㄥˊ ㄒㄧㄣ ㄒㄧㄝˊ ㄌㄧˋ",kidMeaning:"大家有同一個目標,一起努力。",example:"我們同心協力完成班級海報。",whenToUse:"形容團隊一起合作。",storyHint:"同學分工畫圖、寫字,再把海報完成。"},{id:"g2-focus",grade:2,idiom:"專心致志",zhuyin:"ㄓㄨㄢ ㄒㄧㄣ ㄓˋ ㄓˋ",kidMeaning:"把全部心思放在正在做的事情上。",example:"她專心致志地練習寫字。",whenToUse:"形容做事非常專心。",storyHint:"孩子安靜地看著字帖,一筆一畫寫字。"},{id:"g2-cannot-wait",grade:2,idiom:"迫不及待",zhuyin:"ㄆㄛˋ ㄅㄨˋ ㄐㄧˊ ㄉㄞˋ",kidMeaning:"急得不能再等,想立刻去做。",example:"我迫不及待想打開生日禮物。",whenToUse:"形容非常期待、急著行動。",storyHint:"孩子抱著禮物,眼睛發亮地等著拆開。"},{id:"g2-self-talk",grade:2,idiom:"自言自語",zhuyin:"ㄗˋ ㄧㄢˊ ㄗˋ ㄩˇ",kidMeaning:"自己對自己說話。",example:"弟弟一邊找鉛筆,一邊自言自語。",whenToUse:"形容身旁沒有人,卻自己說話。",storyHint:"孩子在書桌旁找東西,小聲說著話。"},{id:"g2-kind-face",grade:2,idiom:"和顏悅色",zhuyin:"ㄏㄜˊ ㄧㄢˊ ㄩㄝˋ ㄙㄜˋ",kidMeaning:"臉色溫和,態度親切。",example:"老師和顏悅色地聽我說完。",whenToUse:"形容待人溫柔、親切。",storyHint:"老師微笑著蹲下來,耐心聽孩子說話。"},{id:"g3-snake",grade:3,idiom:"畫蛇添足",zhuyin:"ㄏㄨㄚˋ ㄕㄜˊ ㄊㄧㄢ ㄗㄨˊ",kidMeaning:"事情已經完成,卻多做了不需要的部分,反而把事情弄壞。",example:"海報已經很清楚,再加太多裝飾反而畫蛇添足。",whenToUse:"提醒別人不要做多餘的事。",storyHint:"一條蛇已經畫好,卻又被加上不需要的腳。"},{id:"g3-rabbit",grade:3,idiom:"守株待兔",zhuyin:"ㄕㄡˇ ㄓㄨ ㄉㄞˋ ㄊㄨˋ",kidMeaning:"只想靠運氣得到成果,不肯主動努力。",example:"想考好卻不複習,就像守株待兔。",whenToUse:"提醒人不能只靠運氣。",storyHint:"農夫一直坐在樹樁旁等兔子,卻沒有耕田。"},{id:"g3-sheep",grade:3,idiom:"亡羊補牢",zhuyin:"ㄨㄤˊ ㄧㄤˊ ㄅㄨˇ ㄌㄠˊ",kidMeaning:"出了問題後趕快改正,還來得及避免更大的損失。",example:"這次忘了帶作業,現在整理書包也算亡羊補牢。",whenToUse:"鼓勵犯錯後立刻補救。",storyHint:"羊跑走後,主人趕快把破掉的圍欄修好。"},{id:"g3-frog",grade:3,idiom:"井底之蛙",zhuyin:"ㄐㄧㄥˇ ㄉㄧˇ ㄓ ㄨㄚ",kidMeaning:"看見的範圍太小,卻以為自己知道全部。",example:"多閱讀、多旅行,才不會成為井底之蛙。",whenToUse:"提醒自己要開闊眼界。",storyHint:"青蛙從井底往上看,只看見一小片天空。"},{id:"g3-halfway",grade:3,idiom:"半途而廢",zhuyin:"ㄅㄢˋ ㄊㄨˊ ㄦˊ ㄈㄟˋ",kidMeaning:"事情做到一半就停下來,不再繼續。",example:"練習樂器需要耐心,不要半途而廢。",whenToUse:"鼓勵人把事情做完。",storyHint:"孩子走到半路就停下,還沒有到達終點。"},{id:"g4-clear",grade:4,idiom:"一目了然",zhuyin:"ㄧ ㄇㄨˋ ㄌㄧㄠˇ ㄖㄢˊ",kidMeaning:"一看就完全明白。",example:"這張表格整理得很清楚,內容一目了然。",whenToUse:"形容內容清楚容易懂。",storyHint:"整��的圖表把三個步驟清楚排出來。"},{id:"g4-step",grade:4,idiom:"循序漸進",zhuyin:"ㄒㄩㄣˊ ㄒㄩˋ ㄐㄧㄢˋ ㄐㄧㄣˋ",kidMeaning:"按照順序,一步一步慢慢前進。",example:"學習分數要循序漸進,先懂圖再學算式。",whenToUse:"形容依照步驟學習或做事。",storyHint:"孩子沿著階梯,一階一階往上走。"},{id:"g4-attention",grade:4,idiom:"全神貫注",zhuyin:"ㄑㄩㄢˊ ㄕㄣˊ ㄍㄨㄢˋ ㄓㄨˋ",kidMeaning:"把全部注意力集中在一件事上。",example:"實驗開始後,大家全神貫注地觀察。",whenToUse:"形容注意力非常集中。",storyHint:"孩子用放大鏡仔細觀察葉片。"},{id:"g4-suddenly-clear",grade:4,idiom:"豁然開朗",zhuyin:"ㄏㄨㄛˋ ㄖㄢˊ ㄎㄞ ㄌㄤˇ",kidMeaning:"原本不明白,後來突然想通了。",example:"聽完老師的例子,我立刻豁然開朗。",whenToUse:"形容突然明白道理。",storyHint:"孩子把兩條線索連起來,終於找到答案。"},{id:"g4-same-answer",grade:4,idiom:"異口同聲",zhuyin:"ㄧˋ ㄎㄡˇ ㄊㄨㄥˊ ㄕㄥ",kidMeaning:"不同的人同時說出一樣的話。",example:"老師問誰願意參加,大家異口同聲地說願意。",whenToUse:"形容許多人同時說同樣的話。",storyHint:"全班同學一起舉手並說出相同答案。"},{id:"g5-facts",grade:5,idiom:"實事求是",zhuyin:"ㄕˊ ㄕˋ ㄑㄧㄡˊ ㄕˋ",kidMeaning:"按照真實情況判斷,不誇大也不亂猜。",example:"做自然紀錄要實事求是,看到什麼就寫什麼。",whenToUse:"提醒人尊重事實。",storyHint:"學生把觀察到的數據如實寫進紀錄表。"},{id:"g5-small-clue",grade:5,idiom:"見微知著",zhuyin:"ㄐㄧㄢˋ ㄨㄟˊ ㄓ ㄓㄨˋ",kidMeaning:"從很小的線索,看出事情可能的發展。",example:"從葉子變黃,可以見微知著地發現植物缺水。",whenToUse:"形容善於從小線索看出大問題。",storyHint:"學生從一片變黃的葉子找出植物缺水的原因。"},{id:"g5-infer",grade:5,idiom:"舉一反三",zhuyin:"ㄐㄩˇ ㄧ ㄈㄢˇ ㄙㄢ",kidMeaning:"懂了一個例子,就能推想出其他相似情況。",example:"學會一種解題方法後,我能舉一反三。",whenToUse:"形容學習後能靈活運用。",storyHint:"學生從一個算式推想到三個相似題目。"},{id:"g5-ideas",grade:5,idiom:"集思廣益",zhuyin:"ㄐㄧˊ ㄙ ㄍㄨㄤˇ ㄧˋ",kidMeaning:"集合大家的想法,讓事情做得更好。",example:"我們集思廣益,想出減少垃圾的方法。",whenToUse:"形容一起討論、採用好意見。",storyHint:"小組成員把不同想法寫在便利貼上。"},{id:"g5-success",grade:5,idiom:"水到渠成",zhuyin:"ㄕㄨㄟˇ ㄉㄠˋ ㄑㄩˊ ㄔㄥˊ",kidMeaning:"條件準備好了,事情自然就會成功。",example:"每天固定閱讀,寫作進步就是水到渠成。",whenToUse:"形容累積足夠後自然成功。",storyHint:"水流到合適的位置,自然形成一條水道。"},{id:"g6-organized",grade:6,idiom:"有條不紊",zhuyin:"ㄧㄡˇ ㄊㄧㄠˊ ㄅㄨˋ ㄨㄣˇ",kidMeaning:"事情很多,仍然安排得有順序、不混亂。",example:"她有條不紊地完成報告的每個步驟。",whenToUse:"形容做事有條理。",storyHint:"學生照清單依序完成蒐集、整理和報告。"},{id:"g6-think",grade:6,idiom:"深思熟慮",zhuyin:"ㄕㄣ ㄙ ㄕㄨˊ ㄌㄩˋ",kidMeaning:"仔細、深入地想過各種情況。",example:"經過深思熟慮後,我選擇最有證據的答案。",whenToUse:"形容想得仔細周全。",storyHint:"學生比較多份資料後才寫下結論。"},{id:"g6-connect",grade:6,idiom:"觸類旁通",zhuyin:"ㄔㄨˋ ㄌㄟˋ ㄆㄤˊ ㄊㄨㄥ",kidMeaning:"懂得一種道理後,也能理解相近的事物。",example:"掌握文章結構後,閱讀其他說明文也能觸類旁通。",whenToUse:"形容能把學到的方法靈活運用。",storyHint:"同一種閱讀方法被用在不同主題的文章上。"},{id:"g6-persist",grade:6,idiom:"持之以恆",zhuyin:"ㄔˊ ㄓ ㄧˇ ㄏㄥˊ",kidMeaning:"長久堅持做一件事,不輕易停下來。",example:"每天讀十分鐘,持之以恆就會看見進步。",whenToUse:"鼓勵長期堅持。",storyHint:"日曆上每天都有完成閱讀的記號。"},{id:"g6-integrate",grade:6,idiom:"融會貫通",zhuyin:"ㄖㄨㄥˊ ㄏㄨㄟˋ ㄍㄨㄢˋ ㄊㄨㄥ",kidMeaning:"把不同地方學到的知識連起來,真正理解並會運用。",example:"把課文、圖表和生活經驗融會貫通,答案會更完整。",whenToUse:"形容能整合並靈活運用知識。",storyHint:"學生把文章、圖表和筆記連成一張完整的學習圖。"}];e.s(["chineseIdioms",0,t,"chineseIdiomsSource",0,{name:"教育部《成語典》",url:"https://dict.idioms.moe.edu.tw/"},"findChineseIdiom",0,function(e){let i=e.normalize("NFKC").trim().replace(/[,。!?、;:,.!?;:\s]/g,"");return t.find(e=>e.idiom===i)},"getChineseIdiomsByGrade",0,function(e){return t.filter(t=>t.grade===e)}])},18397,e=>{"use strict";let t;var i=e.i(43476),s=e.i(14876),a=e.i(71645);let n=/^(.+?)([��]?[ㄅ-ㄩ]+[ˊˇˋ]?|[ㄅ-ㄩ]+[˙ˊˇˋ]?)$/u;function r({entry:e}){return(0,i.jsxs)("article",{className:"rounded-2xl border border-blue-100 bg-blue-50/70 p-4",children:[(0,i.jsx)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:(0,i.jsxs)("div",{children:[(0,i.jsx)("p",{className:"text-xs font-black text-blue-700",children:"教育部原始資料"}),(0,i.jsxs)("p",{className:"mt-1 text-lg font-black text-ink",children:[e.zhuyin,"|",e.radical,"部|共 ",e.totalStrokes," 畫"]})]})}),(0,i.jsx)("p",{className:"mt-3 whitespace-pre-wrap text-base font-bold leading-9 text-stone-700",children:e.definition.split("&&").map((e,t)=>{if(t%2==0)return(0,i.jsx)("span",{children:e},`${t}-${e}`);let s=e.match(n);return s?(0,i.jsxs)("ruby",{className:"mx-0.5 whitespace-nowrap",children:[s[1],(0,i.jsx)("rp",{children:"("}),(0,i.jsx)("rt",{className:"text-[0.58em] font-bold text-blue-700",children:s[2]}),(0,i.jsx)("rp",{children:")"})]},`${t}-${e}`):(0,i.jsx)("span",{children:e},`${t}-${e}`)})})]})}var l=e.i(32324),d=e.i(16549),o=e.i(79693),c=e.i(4914);let m=[{gradeId:"grade-1",stage:"第一學習階段",title:"注音、字形與生活短句",description:"先把聲音和字形連起來,再從熟悉的生活詞語開始閱讀。",focus:["注音與聲調","常用國字","生活詞語","短句朗讀"],lessonFlow:["先聽字音","看圖認字","放進詞語","讀一小句","描寫國字"],readingSupport:"每個國字保留注音;手寫板提供淡色描字虛底。"},{gradeId:"grade-2",stage:"第一學習階段",title:"部首、詞義與完整句子",description:"從部首找線索,把生字放進詞語和完整句子裡理解。",focus:["生字與部首","造詞與語意","標點符號","短文閱讀"],lessonFlow:["聽清字音","找部首","理解詞義","讀懂句子","描寫與造句"],readingSupport:"保留全文注音提示;孩子可以先讀,再切換隱藏注音。"},{gradeId:"grade-3",stage:"第二學習階段",title:"字詞、段落與故事順序",description:"擴充常用字詞,開始找段落重點、人物與事情順序。",focus:["部首識字","詞語理解","段落重點","故事順序"],lessonFlow:["字詞暖身","讀一小段","圈出線索","說出重點","短句寫作"],readingSupport:"注音預設顯示,遇到熟悉內容時可自行隱藏。"},{gradeId:"grade-4",stage:"第二學習階段",title:"段落結構、摘要與因果",description:"看懂文章怎麼組成,練習找重點、因果與說明線索。",focus:["成語與詞義","段落結構","摘要練習","因果推論"],lessonFlow:["預測內容","找關鍵詞","整理段落","說一句摘要","生活表達"],readingSupport:"生難字仍可點開注音與小學生版字義。"},{gradeId:"grade-5",stage:"第三學習階段",title:"閱讀策略、觀點與比較",description:"辨析字詞與複句,分清事實、觀點和支持內容的證據。",focus:["字詞辨析","閱讀策略","觀點與事實","文本比較"],lessonFlow:["確認詞義","標記線索","比較內容","說明理由","整理成文"],readingSupport:"注音改為按需查看,避免生難字中斷理解。"},{gradeId:"grade-6",stage:"第三學習階段",title:"推論、證據與完整表達",description:"整合跨文本線索,用理由與證據形成自己的觀點。",focus:["閱讀推論","跨文本閱讀","論點與證據","完整作文"],lessonFlow:["理解語境","找出證據","形成推論","口頭表達","完成短文"],readingSupport:"保留可開關的注音支援,同時練習自主查字典。"}],x=new Map;function h(e){return e.normalize("NFKC").trim().replace(/[,。!?、;:,.!?;:\s]/g,"")}function g(e){return/^[\u3400-\u9fff]$/u.test(h(e))}async function u(e){if(!e)return[];let t=x.get(e);if(t)return t;let i=fetch(`/data/moe-mini/${e}.json`,{cache:"force-cache"}).then(async t=>{if(!t.ok)throw Error(`MOE dictionary shard ${e} returned ${t.status}`);return t.json()}).catch(t=>{throw x.delete(e),t});return x.set(e,i),i}async function p(e){let t,i=h(e);return g(i)?(await u(void 0===(t=i.codePointAt(0))?"":t.toString(16).padStart(4,"0").slice(0,2))).filter(e=>e.word===i):[]}async function b(e){return Promise.all((function(e,t=8){return Array.from(new Set(Array.from(h(e)).filter(e=>/[\u3400-\u9fff]/u.test(e)))).slice(0,t)})(e).map(async e=>({character:e,entries:await p(e)})))}var f=e.i(12408);let y=[{id:"basic",label:"基礎",note:"字音、字形與基本理解"},{id:"advanced",label:"進階",note:"句段閱讀與思考"},{id:"extension",label:"延伸",note:"表達、寫作與應用"}];e.s(["ChineseLearningHub",0,function({gradeId:e,gradeName:n}){let x=(0,a.useMemo)(()=>m.find(t=>t.gradeId===e)??m[0],[e]),u=Number(e.replace("grade-","")),j=(0,a.useMemo)(()=>(0,d.getChineseDictionaryEntries)(u),[u]),k=j[0],w=(0,a.useMemo)(()=>(0,c.getChineseIllustrationForGrade)(u),[u]),N=(0,a.useMemo)(()=>(0,o.getChineseIdiomsByGrade)(u),[u]),[v,M]=(0,a.useState)(""),[z,T]=(0,a.useState)(""),[$,U]=(0,a.useState)(""),[H,S]=(0,a.useState)([]),[C,I]=(0,a.useState)(),[F,A]=(0,a.useState)(!1),[E,B]=(0,a.useState)(!1),[D,P]=(0,a.useState)("輸入��個國字,或點選本年級詞語與成語。晨光只顯示精確結果,不猜字義。"),K=d.chineseDictionary.find(e=>e.id===z)??(F?void 0:k),O=o.chineseIdioms.find(e=>e.id===$);async function _(e){let t=h(e);if(A(!0),S([]),T(""),U(""),!t||!/[\u3400-\u9fff]/u.test(t))return void P("請輸入一個國字,例如「學」;也可以直接點下方的本年級詞語或成語。");let i=(0,o.findChineseIdiom)(t);if(i){U(i.id),P(`已找到成語「${i.idiom}」。下方是晨光白話解釋、使用時機和例句。`);return}let s=(0,d.findChineseDictionaryEntry)(t);s&&T(s.entry.id);let a=g(t)?t:s?.entry.character??t;B(!0);try{let e=(g(a)?[{character:a,entries:await p(a)}]:await b(a)).filter(e=>e.entries.length>0);S(e);let i=e.reduce((e,t)=>e+t.entries.length,0);0!==i||s?s?.matchedAlias?P(`已辨識「${s.matchedAlias}」;臺灣國小課程常用正字是「${s.entry.character}」。教育部原始資料也已載入。`):s?P(`已精確找到「${s.entry.character}」。先看晨光白話解釋,再核對教育部完整字義。`):e.length>1?P(`「${t}」目前沒有晨光整詞解釋;已依原順序查到 ${e.length} 個國字。下方是逐字結果,不會把字義假裝成詞義。`):P(`已從教育部《國語小字典》精確找到「${e[0]?.character??t}」,共有 ${i} 個讀音或義項。`):P(`教育部資料中沒有找到「${t}」的可核對國字。晨光不猜答案,請確認字形後再試一次。`)}catch{P(s?`已找到晨光課程詞條「${s.entry.character}」,但教育部資料暫時載入失敗,請稍後再試。`:"教育部字典資料暫時載入失敗,請確認網路後再試一次。")}finally{B(!1)}}function G(e){M(e),_(e)}return(0,a.useEffect)(()=>{let e=!0;return(t||(t=fetch("/data/moe-mini/manifest.json",{cache:"no-cache"}).then(async e=>{if(!e.ok)throw Error(`MOE dictionary manifest returned ${e.status}`);return e.json()}).catch(e=>{throw t=void 0,e}))).then(t=>{e&&I(t)}).catch(()=>{e&&I(void 0)}),()=>{e=!1}},[]),(0,i.jsxs)("section",{className:"mt-8 overflow-hidden rounded-[1.75rem] border border-amber-100 bg-[linear-gradient(135deg,rgba(255,248,234,0.96),rgba(239,249,242,0.94))] p-5 shadow-sm md:p-7",children:[(0,i.jsxs)("div",{className:"grid gap-6 xl:grid-cols-[1.05fr_0.95fr]",children:[(0,i.jsxs)("div",{children:[(0,i.jsxs)("p",{className:"text-sm font-black text-amber-700",children:[x.stage,"|",n,"國語學習地圖"]}),(0,i.jsx)("h2",{className:"mt-2 text-3xl font-black text-ink",children:x.title}),(0,i.jsx)("p",{className:"mt-3 max-w-3xl text-lg font-bold leading-8 text-stone-600",children:x.description}),(0,i.jsx)("div",{className:"mt-5 flex flex-wrap gap-2","aria-label":"本年級國語學習重點",children:x.focus.map(e=>(0,i.jsx)("span",{className:"rounded-full bg-white/90 px-4 py-2 text-sm font-black text-stone-700 shadow-sm ring-1 ring-white",children:e},e))}),(0,i.jsxs)("figure",{className:"mt-6 overflow-hidden rounded-3xl border-4 border-white bg-white shadow-warm",children:[(0,i.jsx)("img",{src:w.src,alt:w.alt,className:"aspect-[4/3] w-full object-cover",loading:"lazy"}),(0,i.jsxs)("figcaption",{className:"p-4",children:[(0,i.jsx)("p",{className:"font-black leading-7 text-ink",children:w.caption}),(0,i.jsx)("ul",{className:"mt-3 grid gap-2 text-sm font-bold leading-6 text-stone-600 sm:grid-cols-3",children:w.observationPrompts.map(e=>(0,i.jsx)("li",{className:"rounded-xl bg-cream p-3",children:e},e))})]})]}),(0,i.jsx)("ol",{className:"mt-6 grid gap-3 sm:grid-cols-5","aria-label":"國語學習順序",children:x.lessonFlow.map((e,t)=>(0,i.jsxs)("li",{className:"rounded-2xl bg-white/85 p-4 shadow-sm",children:[(0,i.jsx)("span",{className:"grid h-8 w-8 place-items-center rounded-full bg-coral text-sm font-black text-white",children:t+1}),(0,i.jsx)("strong",{className:"mt-3 block text-base text-ink",children:e})]},e))})]}),(0,i.jsxs)("aside",{className:"self-start rounded-3xl border border-white bg-white/85 p-5 shadow-sm xl:sticky xl:top-6",children:[(0,i.jsx)("p",{className:"text-sm font-black text-green-800",children:"晨光站內兒童字典"}),(0,i.jsx)("h3",{className:"mt-1 text-2xl font-black text-ink",children:"查得到才顯示,不用相近字猜"}),(0,i.jsxs)("form",{className:"mt-5",onSubmit:function(e){e.preventDefault(),_(v)},children:[(0,i.jsx)("label",{htmlFor:"chenguang-dictionary-query",className:"text-sm font-black text-stone-600",children:"我要查的國字、課程詞語或成語"}),(0,i.jsxs)("div",{className:"mt-2 flex gap-2",children:[(0,i.jsx)("input",{id:"chenguang-dictionary-query",value:v,onChange:e=>M(e.target.value.slice(0,8)),inputMode:"text",className:"min-h-14 min-w-0 flex-1 rounded-2xl border-2 border-amber-100 bg-white px-4 text-center text-2xl font-black text-ink outline-none focus:border-coral focus:ring-4 focus:ring-coral/10",placeholder:"學","aria-describedby":"dictionary-message"}),(0,i.jsx)("button",{type:"submit",disabled:E,className:"min-h-14 shrink-0 rounded-2xl bg-coral px-5 font-black text-white shadow-sm transition active:scale-[0.98] disabled:cursor-wait disabled:opacity-70",children:E?"查詢中":"查字��"})]})]}),(0,i.jsxs)("div",{className:"mt-3 flex flex-wrap gap-2","aria-label":"本年級查字建議",children:[j.slice(0,6).map(e=>(0,i.jsx)("button",{type:"button",onClick:()=>G(e.character),className:"min-h-10 rounded-xl bg-cream px-3 font-black text-amber-900 transition hover:bg-butter",children:e.character},e.id)),N.slice(0,2).map(e=>(0,i.jsx)("button",{type:"button",onClick:()=>G(e.idiom),className:"min-h-10 rounded-xl bg-green-50 px-3 font-black text-green-800 transition hover:bg-green-100",children:e.idiom},e.id))]}),(0,i.jsx)("p",{id:"dictionary-message","aria-live":"polite",className:"mt-3 rounded-xl bg-stone-50 p-3 text-sm font-bold leading-6 text-stone-600",children:D}),K?(0,i.jsxs)("article",{className:"mt-4 rounded-2xl border border-green-100 bg-green-50/80 p-4","aria-live":"polite",children:[(0,i.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,i.jsxs)("div",{className:"flex items-end gap-3",children:[(0,i.jsx)("strong",{className:"text-5xl font-black leading-none text-ink",children:K.character}),(0,i.jsx)("span",{className:"text-lg font-black text-blue-700",children:K.zhuyin})]}),(0,i.jsx)("button",{type:"button",onClick:()=>(0,f.speakMandarin)(`${K.character},${K.word}。${K.example}`,{rate:.7}),className:"min-h-11 shrink-0 rounded-xl bg-butter px-3 font-black text-amber-900 shadow-sm",children:"聽讀音"})]}),(0,i.jsxs)("dl",{className:"mt-4 grid gap-3 text-sm leading-6",children:[K.variantNote?(0,i.jsxs)("div",{className:"rounded-xl bg-amber-50 p-3",children:[(0,i.jsx)("dt",{className:"font-black text-amber-700",children:"字形提醒"}),(0,i.jsx)("dd",{className:"font-black text-amber-950",children:K.variantNote})]}):null,(0,i.jsxs)("div",{className:"rounded-xl bg-white/90 p-3",children:[(0,i.jsx)("dt",{className:"font-black text-stone-500",children:"部首與筆畫"}),(0,i.jsxs)("dd",{className:"font-black text-ink",children:[K.radical,"部,共 ",K.strokes," 畫"]})]}),(0,i.jsxs)("div",{className:"rounded-xl bg-white/90 p-3",children:[(0,i.jsx)("dt",{className:"font-black text-green-700",children:"晨光白話解釋"}),(0,i.jsxs)("dd",{className:"font-black text-ink",children:[(0,i.jsx)(l.ZhuyinText,{text:K.word,show:!0,compact:!1}),"|",K.meaning]})]}),(0,i.jsxs)("div",{className:"rounded-xl bg-blue-50 p-3",children:[(0,i.jsx)("dt",{className:"font-black text-blue-700",children:"生活例句"}),(0,i.jsx)("dd",{className:"font-black text-blue-950",children:(0,i.jsx)(l.ZhuyinText,{text:K.example,show:!0,compact:!1})})]}),(0,i.jsxs)("div",{className:"rounded-xl bg-[#fff8ea] p-3",children:[(0,i.jsx)("dt",{className:"font-black text-amber-700",children:"書寫提醒"}),(0,i.jsx)("dd",{className:"font-black text-amber-950",children:K.strokeHint})]})]})]}):null,O?(0,i.jsxs)("article",{className:"mt-4 rounded-2xl border border-amber-100 bg-[#fff8ea] p-4","aria-live":"polite",children:[(0,i.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,i.jsxs)("div",{children:[(0,i.jsx)("p",{className:"text-xs font-black text-amber-700",children:"本年級成語"}),(0,i.jsx)("h4",{className:"mt-1 text-3xl font-black text-ink",children:O.idiom}),(0,i.jsx)("p",{className:"mt-1 font-black text-blue-700",children:O.zhuyin})]}),(0,i.jsx)("button",{type:"button",onClick:()=>(0,f.speakMandarin)(`${O.idiom}。${O.example}`,{rate:.68}),className:"min-h-11 rounded-xl bg-butter px-3 font-black text-amber-900 shadow-sm",children:"聽成語"})]}),(0,i.jsxs)("div",{className:"mt-4 grid gap-3",children:[(0,i.jsxs)("div",{className:"rounded-xl bg-white p-3",children:[(0,i.jsx)("p",{className:"text-xs font-black text-green-700",children:"晨光白話解釋"}),(0,i.jsx)("p",{className:"mt-1 font-bold leading-7 text-stone-700",children:O.kidMeaning})]}),(0,i.jsxs)("div",{className:"rounded-xl bg-white p-3",children:[(0,i.jsx)("p",{className:"text-xs font-black text-blue-700",children:"什麼時候用"}),(0,i.jsx)("p",{className:"mt-1 font-bold leading-7 text-stone-700",children:O.whenToUse})]}),(0,i.jsxs)("div",{className:"rounded-xl bg-blue-50 p-3",children:[(0,i.jsx)("p",{className:"text-xs font-black text-blue-700",children:"例句"}),(0,i.jsx)("p",{className:"mt-1 font-black leading-7 text-blue-950",children:(0,i.jsx)(l.ZhuyinText,{text:O.example,show:!0,compact:!1})})]})]})]}):null,H.length>0?(0,i.jsxs)("section",{className:"mt-4 space-y-3","aria-label":"教育部國語小字典完整字義",children:[(0,i.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,i.jsx)("h4",{className:"text-lg font-black text-ink",children:"教育部完整字義"}),(0,i.jsx)("span",{className:"rounded-full bg-green-50 px-3 py-1 text-xs font-black text-green-800",children:"按需線上載入"})]}),H.map((e,t)=>(0,i.jsxs)("article",{className:"rounded-2xl border border-blue-100 bg-white/90 p-3",children:[(0,i.jsxs)("div",{className:"flex items-center gap-3",children:[(0,i.jsx)("strong",{className:"text-3xl font-black text-ink",children:e.character}),(0,i.jsx)("span",{className:"text-xs font-black text-stone-500",children:"逐字核對"})]}),(0,i.jsx)("div",{className:"mt-2 space-y-2",children:e.entries.map((e,s)=>(0,i.jsxs)("details",{open:0===t&&0===s,className:"rounded-xl bg-blue-50/50 p-2",children:[(0,i.jsxs)("summary",{className:"cursor-pointer rounded-lg px-2 py-2 font-black text-blue-800",children:["讀音 ",e.zhuyin]}),(0,i.jsx)(r,{entry:e})]},`${e.word}-${e.zhuyin}-${s}`))})]},e.character))]}):null,(0,i.jsxs)("p",{className:"mt-4 rounded-2xl bg-white/80 p-4 text-xs font-bold leading-6 text-stone-600",children:["官方字義來源:","教育部《國語小字典》","(",C?.edition??"dict_mini_2019_20260626",",","CC BY-ND 3.0 臺灣",")。",C?` 共 ${C.entryCount.toLocaleString("zh-TW")} 筆,來源更新 ${C.updatedAt}。`:" 正在核對字庫版本。","教育部原文不改寫;「晨光白話解釋」是另行提供的學習提示。"]}),(0,i.jsxs)("p",{className:"mt-3 rounded-2xl bg-green-50 p-4 text-sm font-bold leading-6 text-green-900",children:[x.readingSupport," 所有查字內容都直接留在晨光頁面內。"]})]})]}),(0,i.jsxs)("section",{className:"mt-8","aria-labelledby":"grade-idioms-title",children:[(0,i.jsxs)("div",{className:"flex flex-wrap items-end justify-between gap-3",children:[(0,i.jsxs)("div",{children:[(0,i.jsx)("p",{className:"text-sm font-black text-amber-700",children:"成語放進生活裡"}),(0,i.jsxs)("h3",{id:"grade-idioms-title",className:"mt-1 text-2xl font-black text-ink",children:[n,"本階段成語"]})]}),(0,i.jsx)("p",{className:"text-sm font-bold text-stone-500",children:"點卡片即可在上方查看解釋與例句"})]}),(0,i.jsx)("div",{className:"mt-4 grid gap-3 sm:grid-cols-2 xl:grid-cols-5",children:N.map(e=>(0,i.jsxs)("button",{type:"button",onClick:()=>G(e.idiom),className:"rounded-2xl border-2 border-white bg-white/90 p-4 text-left shadow-sm transition hover:-translate-y-0.5 hover:border-amber-200 hover:shadow-warm",children:[(0,i.jsx)("strong",{className:"block text-xl text-ink",children:e.idiom}),(0,i.jsx)("span",{className:"mt-2 block text-sm font-bold leading-6 text-stone-600",children:e.kidMeaning})]},e.id))}),(0,i.jsxs)("p",{className:"mt-3 text-xs font-bold text-stone-500",children:["成語名稱與讀音依據:",o.chineseIdiomsSource.name,";晨光另寫兒童版說明與生活例句。"]})]}),(0,i.jsx)("div",{className:"mt-6 grid gap-3 md:grid-cols-3",children:y.map(t=>(0,i.jsxs)(s.ExportSafeLink,{href:`/courses/${e}/chinese/${t.id}`,className:"group rounded-2xl border border-white bg-white/85 p-5 shadow-sm transition hover:-translate-y-0.5 hover:border-amber-200 hover:shadow-warm",children:[(0,i.jsxs)("span",{className:"text-sm font-black text-amber-700",children:[t.label,"課程"]}),(0,i.jsx)("strong",{className:"mt-1 block text-xl text-ink",children:t.note}),(0,i.jsxs)("span",{className:"mt-3 block text-sm font-black text-coral",children:["進入",t.label]})]},t.id))})]})}],18397)}]);
_next/static/chunks/3g2lpa9dvikev.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,79930,e=>{"use strict";var t=e.i(43476),n=e.i(71645),r=e.i(10400),a=e.i(51772),s=e.i(42391),l=e.i(73887),o=e.i(97750),i=e.i(98239),d=e.i(70027);let c=["拍照或鍵入","AI 辨識","家長確認","開始測驗"];function h({currentStep:e}){return(0,t.jsx)("ol",{"aria-label":"手寫英文出題進度",className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:c.map((n,r)=>{let a=r+1,s=a===e,l=a<e;return(0,t.jsxs)("li",{"aria-current":s?"step":void 0,className:`flex min-h-14 items-center gap-3 rounded-2xl border px-3 py-2 transition sm:px-4 ${s?"border-coral bg-[#fff0eb] text-amber-950 shadow-sm":l?"border-green-100 bg-green-50 text-green-900":"border-softline bg-white/70 text-stone-500"}`,children:[(0,t.jsx)("span",{className:`grid size-8 shrink-0 place-items-center rounded-full text-sm font-black ${s?"bg-coral text-white":l?"bg-leaf text-white":"bg-cream text-stone-500"}`,children:l?"✓":a}),(0,t.jsx)("span",{className:"text-sm font-black leading-5",children:n})]},n)})})}var m=e.i(7728),u=e.i(9034);function g(e,t,n,r,a,s){return{word:e,zh:t,category:n,usage:r,example:a,exampleZh:s}}let x=[g("a","一個","基礎字","放在單數名詞前","I have a pen.","我有一枝筆。"),g("an","一個","基礎字","放在母音開頭的單數名詞前","I eat an apple.","我吃一顆蘋果。"),g("the","這個;那個","基礎字","指特定的人或物","Open the book.","打開這本書。"),g("I","我","代名詞","介紹自己時使用","I am a student.","我是一位學生。"),g("you","你;你們","代名詞","和別人說話時使用","You are my friend.","你是我的朋友。"),g("he","他","代名詞","指一位男生","He is my brother.","他是我的兄弟。"),g("she","她","代名詞","指一位女生","She is my sister.","她是我的姊妹。"),g("it","它","代名詞","指動物或物品","It is a cat.","牠是一隻貓。"),g("we","我們","代名詞","說自己和其他人","We are a team.","我們是一隊。"),g("they","他們;她們;它們","代名詞","指兩個以上的人或物","They are happy.","他們很開心。"),g("this","這個","指示詞","指靠近的單數物品","This is my book.","這是我的書。"),g("that","那個","指示詞","指較遠的單數物品","That is a bird.","那是一隻鳥。"),g("these","這些","指示詞","指靠近的多個物品","These are my pencils.","這些是我的鉛筆。"),g("those","那些","指示詞","指較遠的多個物品","Those are trees.","那些是樹。"),g("am","是","常用動詞","和 I 一起使用","I am ready.","我準備好了。"),g("is","是","常用動詞","和單數主詞一起使用","It is blue.","它是藍色的。"),g("are","是","常用動詞","和 you 或複數主詞一起使用","You are kind.","你很親切。"),g("have","有","常用動詞","說自己擁有什麼","I have a book.","我有一本書。"),g("has","有","常用動詞","說他、她或它擁有什麼","She has a pen.","她有一枝筆。"),g("do","做","常用動詞","表示做事情","I do my homework.","我做我的功課。"),g("can","能;會","常用動詞","說自己會做什麼","I can read.","我會閱讀。"),g("like","喜歡","感受","說喜歡的人事物","I like apples.","我喜歡蘋果。"),g("want","想要","感受","說想要什麼","I want some water.","我想要一些水。"),g("need","需要","感受","說需要什麼","I need help.","我需要幫忙。"),g("help","幫助","生活","需要協助時使用","Please help me.","請幫幫我。"),g("yes","是;好的","應答","肯定回答","Yes, I can.","是的,我會。"),g("no","不;不是","應答","否定回答","No, thank you.","不用了,謝謝你。"),g("not","不;不是","基礎字","用來否定","It is not red.","它不是紅色的。"),g("what","什麼","疑問詞","詢問事物","What is this?","這是什麼?"),g("who","誰","疑問詞","詢問人物","Who is she?","她是誰?"),g("where","哪裡","疑問詞","詢問地點","Where is my book?","我的書在哪裡?"),g("when","何時","疑問詞","詢問時間","When do we go?","我們何時出發?"),g("why","為什麼","疑問詞","詢問原因","Why are you sad?","你為什麼難過?"),g("how","如何;怎麼","疑問詞","詢問方式或狀態","How are you?","你好嗎?"),g("and","和;而且","連接詞","連接兩個字或句子","I like red and blue.","我喜歡紅色和藍色。"),g("or","或;或者","連接詞","表示選擇","Tea or milk?","茶或牛奶?"),g("but","但是","連接詞","連接相反的意思","I am tired but happy.","我很累,但是很開心。"),g("too","也;太","常用字","表示也,或程度過多","I like it, too.","我也喜歡它。"),g("very","非常","常用字","加強形容的程度","It is very big.","它非常大。"),g("off","關掉;離開","常用字","表示關閉或離開原位","Turn off the light.","把燈關掉。"),g("on","在上面;開著","位置","表示在物品上或開啟狀態","The book is on the desk.","書在桌上。"),g("in","在裡面","位置","表示在某物裡","The pencil is in the bag.","鉛筆在書包裡。"),g("under","在下面","位置","表示在某物下方","The cat is under the table.","貓在桌子下面。"),g("behind","在後面","位置","表示在某物後方","The ball is behind the box.","球在盒子後面。"),g("near","在附近","位置","表示距離很近","The school is near my home.","學校在我家附近。"),g("go","去","動作","表示前往某處","I go to school.","我去上學。"),g("come","來","動作","表示往這裡移動","Come here, please.","請到這裡來。"),g("get","得到;拿到","動作","表示取得某物","I get a new book.","我拿到一本新書。"),g("give","給","動作","把東西交給別人","Give me the pencil, please.","請把鉛筆給我。"),g("buy","買","動作","在商店購買東西","I buy a pen.","我買一枝筆。"),g("open","打開","動作","把書本或門打開","Open your book.","打開你的書。"),g("close","關上","動作","把書本或門關上","Close the door.","把門關上。"),g("sit","坐","動作","坐下時使用","Please sit down.","請坐下。"),g("stand","站","動作","站起來時使用","Please stand up.","請站起來。"),g("walk","走路","動作","表示步行","I walk to school.","我走路去上學。"),g("run","跑","動作","表示跑步","I can run fast.","我可以跑得很快。"),g("jump","跳","動作","表示跳躍","I can jump.","我會跳。"),g("play","玩;演奏","動作","玩遊戲或樂器","I play with my friend.","我和朋友一起玩。"),g("eat","吃","動作","吃食物時使用","I eat an apple.","我吃一顆蘋果。"),g("drink","喝","動作","喝飲料時使用","I drink water.","我喝水。"),g("sleep","睡覺","動作","準備睡覺時使用","I sleep at night.","我晚上睡覺。"),g("look","看","動作","把目光移向某處","Look at the board.","看黑板。"),g("see","看見","動作","說自己看見什麼","I see a bird.","我看見一隻鳥。"),g("say","說","動作","說出話語","Please say hello.","請說你好。"),g("ask","問","動作","提出問題","I ask a question.","我問一個問題。"),g("day","日;天","時間","談一天或日期","It is a sunny day.","這是晴朗的一天。"),g("today","今天","時間","談現在這一天","I am happy today.","我今天很開心。"),g("tomorrow","明天","時間","談下一天","See you tomorrow.","明天見。"),g("morning","早上","時間","談一天的早晨","Good morning.","早安。"),g("afternoon","下午","時間","談一天的下午","Good afternoon.","午安。"),g("night","夜晚","時間","談晚上的時間","Good night.","晚安。"),g("end","結束;末端","時間","表示事情完成","This is the end.","這就是結束。"),g("home","家","場所","談自己的家","I go home.","我回家。"),g("room","房間","場所","介紹家中的房間","This is my room.","這是我的房間。"),g("desk","書桌;課桌","校園","放書本的桌子","My book is on the desk.","我的書在桌上。"),g("table","桌子","生活物品","放置物品的家具","The cup is on the table.","杯子在桌上。"),g("chair","椅子","生活物品","坐下使用的家具","This is a chair.","這是一張椅子。"),g("door","門","生活物品","進出房間時使用","Open the door.","把門打開。"),g("window","窗戶","生活物品","讓光線進入房間","Close the window.","把窗戶關上。"),g("pen","原子筆;筆","文具","寫字時使用","I have a pen.","我有一枝筆。"),g("ink","墨水","文具","筆裡用來書寫的液體","The ink is blue.","墨水是藍色的。"),g("paper","紙","文具","寫字或畫畫時使用","I write on the paper.","我在紙上寫字。"),g("ruler","尺","文具","量長度或畫直線","This is my ruler.","這是我的尺。"),g("box","盒子","生活物品","收納東西時使用","The pencil is in the box.","鉛筆在盒子裡。"),g("cat","貓","動物","談常見寵物","I see a cat.","我看見一隻貓。"),g("dog","狗","動物","談常見寵物","The dog can run.","這隻狗會跑。"),g("bird","鳥","動物","談會飛的動物","The bird can fly.","這隻鳥會飛。"),g("fish","魚","動物","談水裡的動物","The fish can swim.","這條魚會游泳。"),g("head","頭","身體","說身體部位","Touch your head.","摸摸你的頭。"),g("face","臉","身體","說身體部位","Wash your face.","洗洗你的臉。"),g("eye","眼睛","身體","用來看東西","I have two eyes.","我有兩隻眼睛。"),g("ear","耳朵","身體","用來聽聲音","I have two ears.","我有兩隻耳朵。"),g("nose","鼻子","身體","用來聞味道","Touch your nose.","摸摸你的鼻子。"),g("mouth","嘴巴","身體","用來說話和吃東西","Open your mouth.","張開你的嘴巴。"),g("hand","手","身體","拿東西的身體部位","Raise your hand.","舉起你的手。"),g("arm","手臂","身體","連接肩膀和手的部位","Raise your arm.","舉起你的手臂。"),g("leg","腿","身體","走路使用的身體部位","My leg is strong.","我的腿很有力。"),g("foot","腳","身體","單數的一隻腳","This is my foot.","這是我的腳。"),g("feet","雙腳;多隻腳","身體","foot 的複數形","Wash your feet.","洗洗你的腳。"),g("mother","媽媽","家人","介紹家人","This is my mother.","這是我的媽媽。"),g("father","爸爸","家人","介紹家人","This is my father.","這是我的爸爸。"),g("aunt","阿姨;姑姑;伯母;嬸嬸","家人","稱呼父母的姊妹或叔伯的妻子","My aunt is kind.","我的阿姨很親切。"),g("uncle","叔叔;伯伯;舅舅;姑丈","家人","稱呼父母的兄弟或姊妹的丈夫","My uncle is tall.","我的叔叔很高。"),g("family","家人;家庭","家人","介紹自己的家庭","I love my family.","我愛我的家人。"),g("big","大的","形容詞","描述尺寸很大","The box is big.","這個盒子很大。"),g("small","小的","形容詞","描述尺寸很小","The cat is small.","這隻貓很小。"),g("long","長的","形容詞","描述長度","The ruler is long.","這把尺很長。"),g("short","短的;矮的","形容詞","描述長度或身高","The pencil is short.","這枝鉛筆很短。"),g("hot","熱的","形容詞","描述溫度很高","The soup is hot.","這碗湯很熱。"),g("cold","冷的","形容詞","描述溫度很低","The water is cold.","水是冷的。"),g("good","好的","形容詞","描述良好的事物","It is a good day.","今天是美好的一天。"),g("kind","親切的","形容詞","形容待人友善","My teacher is kind.","我的老師很親切。"),g("loud","大聲的","形容詞","描述聲音很大","The music is loud.","音樂很大聲。"),g("cool","涼爽的;酷的","形容詞","描述溫度涼爽或很有型","The day is cool.","今天很涼爽。"),g("live","居住;生活","動詞","說居住在哪裡","I live in Taiwan.","我住在台灣。"),g("cook","煮;廚師","生活","表示烹煮,也可指廚師","I cook with my family.","我和家人一起煮飯。"),g("luck","運氣","生活","祝福別人順利","Good luck!","祝你好運!")],f=new Map;for(let e of u.elementaryEnglishVocabulary)f.set(e.word.trim().toLowerCase(),{word:e.word,zh:e.zh,category:e.category,usage:e.usage,example:e.example,grade:e.grade});for(let e of x){let t=e.word.trim().toLowerCase();f.has(t)||f.set(t,e)}let p=Array.from(f.values()),w=new Map(p.map(e=>[e.word.trim().toLowerCase(),e]));function b(e){return w.get(e.trim().toLowerCase())}var y=e.i(62164),j=e.i(34295);let k="chenguang-scanned-word-quizzes",v="chenguang-scanned-word-bank",N="chenguang-scanned-word-draft",T=/[a-zA-Z]+(?:['-][a-zA-Z]+)*/g,S=new Set(p.map(e=>e.word.toLowerCase()).filter(e=>e.includes(" "))),M=Array.from(new Set(p.map(e=>e.zh)));function I(e){return(e.match(T)??[]).join(" ").trim().toLowerCase()}function C(e){let t=I(e),n=b(t);return n?{word:t,zh:n.zh,category:n.category,usage:n.usage,example:n.example,exampleZh:n.exampleZh??(0,y.getEnglishExampleZh)(n.example,n.zh,n.usage)}:{word:t,zh:"",category:"待確認",usage:"辭庫找不到這個拼字,請先確認英文與中文",example:"",exampleZh:""}}function $(e,t=0,n=5){let r=e.filter(e=>e.word.trim()&&e.zh?.trim()),a=Math.max(0,t);return r.slice(a,a+Math.max(1,n)).map((e,t)=>{let n=e.zh.trim(),s=e.usage?`,${e.usage}`:"",l=e.example?` 例句:${e.example}`:"";return{id:`scan-quiz-${e.word}-${a+t}`,word:e.word,question:`${e.word} 是什麼意思?`,answer:n,options:function(e,t,n){let r=n.map(e=>e.zh?.trim()??"").filter(t=>t&&t!==e),a=Array.from(new Set([e,...r,...M.slice(t),...M.slice(0,t)])).slice(0,4),s=Array.from(e).reduce((e,t)=>e+t.charCodeAt(0),t+23);for(let e=a.length-1;e>0;e-=1){let t=Math.floor((s=(9301*s+49297)%233280)/233280*(e+1));[a[e],a[t]]=[a[t],a[e]]}return a}(n,a+t,r),prompt:`先聽 ${e.word},再選出正確的中文意思。`,explanation:`${e.word} 是「${n}」${s}。${l}`.trim()}})}function z(e=m.currentStudent.id){return(0,j.readPersonStorage)(v,e,[])}function P(e,t=m.currentStudent.id,n){let r=new Date().toISOString(),a=new Map(z(t).map(e=>[I(e.word),e]));for(let t of e){let e=I(t.word),s=t.zh?.trim();if(!e||!s)continue;let l=a.get(e),o=!!(n&&l?.seenEventIds?.includes(n)),i=n?Array.from(new Set([n,...l?.seenEventIds??[]])).slice(0,20):l?.seenEventIds;a.set(e,{...l,...t,id:l?.id??`stored-scan-word-${e}-${Date.now()}`,word:e,zh:s,firstSeenAt:l?.firstSeenAt??r,lastSeenAt:r,timesSeen:(l?.timesSeen??0)+ +!o,seenEventIds:i})}let s=Array.from(a.values()).sort((e,t)=>t.lastSeenAt.localeCompare(e.lastSeenAt));return(0,j.writePersonStorage)(v,t,s),s}function A(e=m.currentStudent.id){return(0,j.readPersonStorage)(N,e,null)}function L(e,t=m.currentStudent.id,n){let r=A(t),a=new Date().toISOString(),s={id:n??r?.id??`scan-draft-${t}-${Date.now()}`,createdAt:r?.createdAt??a,updatedAt:a,words:e};return(0,j.writePersonStorage)(N,t,s),s}function E(e=m.currentStudent.id){(0,j.removePersonStorage)(N,e)}function R(e=m.currentStudent.id){return(0,j.readPersonStorage)(k,e,[])}function B({words:e,onChange:n}){return(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"space-y-3",children:e.map((r,a)=>{let s=!!r.zh?.trim(),l=r.confidence?Math.round(100*r.confidence):0;return(0,t.jsxs)("div",{className:"grid gap-3 rounded-3xl border border-softline bg-white/85 p-4 sm:grid-cols-[2.5rem_minmax(0,1fr)_minmax(0,1fr)_auto] sm:items-start",children:[(0,t.jsx)("span",{className:"grid size-10 place-items-center rounded-2xl bg-cream text-sm font-black text-amber-800",children:a+1}),(0,t.jsxs)("label",{className:"block",children:[(0,t.jsx)("span",{className:"mb-2 block text-xs font-black text-stone-500",children:"英文單字"}),(0,t.jsx)("input",{value:r.word,onChange:t=>{var r;let s,l;return s=C(I(r=t.target.value)),l=e[a],void n(e.map((e,t)=>t===a?{...l,...s,id:l.id,word:r.toLowerCase(),zh:s.zh||"",recognitionStatus:"manual",recognizedFrom:void 0,confidence:void 0}:e))},autoCapitalize:"none",autoCorrect:"off",spellCheck:!1,className:"min-h-12 w-full rounded-2xl border border-softline bg-cream/55 px-4 text-lg font-black text-blue-700 outline-none focus:border-coral focus:ring-4 focus:ring-coral/10","aria-label":`第 ${a+1} 個英文單字`}),(0,t.jsxs)("span",{className:"mt-2 block text-xs font-bold text-stone-500",children:[r.category||"手寫單字",r.usage?`|${r.usage}`:""]}),"corrected"===r.recognitionStatus&&r.recognizedFrom?(0,t.jsxs)("span",{className:"mt-2 inline-flex rounded-full bg-blue-50 px-3 py-1 text-xs font-black text-blue-800",children:["筆跡「",r.recognizedFrom,"」→ 辭庫校正「",r.word,"」"]}):"verified"===r.recognitionStatus?(0,t.jsxs)("span",{className:"mt-2 inline-flex rounded-full bg-green-50 px-3 py-1 text-xs font-black text-green-800",children:["完整單字已核對",l>0?`|信心 ${l}%`:""]}):"manual"===r.recognitionStatus?(0,t.jsx)("span",{className:"mt-2 inline-flex rounded-full bg-cream px-3 py-1 text-xs font-black text-amber-800",children:"家長輸入"}):null]}),(0,t.jsxs)("label",{className:"block",children:[(0,t.jsx)("span",{className:"mb-2 block text-xs font-black text-stone-500",children:"中文意思"}),(0,t.jsx)("input",{value:r.zh??"",onChange:t=>{var r;return r=t.target.value,void n(e.map((e,t)=>t===a?{...e,zh:r}:e))},className:`min-h-12 w-full rounded-2xl border px-4 text-lg font-black outline-none focus:ring-4 ${s?"border-green-100 bg-green-50 text-green-900 focus:border-leaf focus:ring-green-100":"border-rose-200 bg-rose-50 text-rose-900 focus:border-coral focus:ring-coral/10"}`,placeholder:"請家長補上中文","aria-label":`第 ${a+1} 個單字的中文意思`}),(0,t.jsx)("span",{className:`mt-2 block text-xs font-black ${s?"text-green-700":"text-rose-700"}`,children:s?"已可出題":"補上中文後才能出題"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2 sm:pt-7",children:[r.word.trim()?(0,t.jsx)(d.VoiceButton,{text:I(r.word),variant:"mint",children:"聽"}):null,(0,t.jsx)("button",{type:"button",onClick:()=>{n(e.filter((e,t)=>t!==a))},className:"grid size-10 place-items-center rounded-2xl bg-stone-100 text-xl font-black text-stone-500 transition hover:bg-rose-50 hover:text-rose-700","aria-label":`移除 ${r.word||`第 ${a+1} 列`}`,title:"移除這個單字",children:"×"})]}),r.example?(0,t.jsxs)("div",{className:"rounded-2xl bg-blue-50 px-4 py-3 text-sm font-bold leading-6 text-blue-950 sm:col-start-2 sm:col-end-5",children:["例句:",r.example,r.exampleZh?`|${r.exampleZh}`:""]}):null]},r.id)})}),(0,t.jsx)("button",{type:"button",onClick:function(){n([...e,{id:`scan-word-manual-${Date.now()}`,word:"",zh:"",category:"手動加入",usage:"由家長確認後加入題庫",recognitionStatus:"manual"}])},className:"mt-4 min-h-12 rounded-2xl border border-dashed border-amber-300 bg-cream/60 px-5 font-black text-amber-900 transition hover:bg-butter",children:"+ 新增一個單字"})]})}var _=e.i(47167);let O="morning-light-tesseract-runtime",U=null;function D(){return window.Tesseract}let Z=/[a-zA-Z0-9]+(?:['-][a-zA-Z0-9]+)*/g,W=Array.from(w.keys()).filter(e=>!e.includes(" "));function q(e,t=0,n=1){return Math.min(n,Math.max(t,e))}function G(e){return e.normalize("NFKC").trim().toLowerCase().replace(/[’‘`]/g,"'").replace(/[^a-z0-9' -]/g," ").replace(/\s+/g," ").trim()}function F(e){let t=G(e),n=(t.match(/[a-z]/g)??[]).length,r=(t.match(/[0-9]/g)??[]).length;return 0===n||r>n?"":t.replace(/0/g,"o").replace(/1/g,"l").replace(/5/g,"s").replace(/8/g,"b").replace(/[^a-z' -]/g,"").replace(/\s+/g," ").trim()}function H(e,t){let n=[];for(let r of e.split(/\r?\n/)){let e=r.match(Z)??[];if(0!==e.length){for(let r of e)n.push({text:r,confidence:t});e.length>=2&&e.length<=4&&(n.push({text:e.join(" "),confidence:t}),n.push({text:e.join(""),confidence:.9*t}))}}return n}function Y(e){let t=q((e.confidence??55)/100,.2,.97),n=H(e.text??"",t);for(let t of e.blocks??[])for(let r of t.paragraphs??[])for(let t of r.lines??[]){let r=q((t.confidence??e.confidence??55)/100,.2,.97),a=t.words?.map(e=>e.text??"").filter(Boolean)??[];for(let e of(n.push(...H(t.text??"",r)),t.words??[]))e.text&&n.push({text:e.text,confidence:q((e.confidence??t.confidence??55)/100,.15,.98)});a.length>=2&&a.length<=4&&(n.push({text:a.join(""),confidence:.9*r}),n.push({text:a.join(" "),confidence:r}))}return n}function V(e){let t=[];for(let n of e.blocks??[])for(let e of n.paragraphs??[])for(let n of e.lines??[]){if(!n.bbox)continue;let e=n.bbox.x1-n.bbox.x0,r=n.bbox.y1-n.bbox.y0;e<12||r<8||t.push(n.bbox)}return t.sort((e,t)=>{let n=e.y0-t.y0;return Math.abs(n)>12?n:e.x0-t.x0}).filter((e,t,n)=>!n.slice(0,t).some(t=>Math.max(0,Math.min(t.x1,e.x1)-Math.max(t.x0,e.x0))*Math.max(0,Math.min(t.y1,e.y1)-Math.max(t.y0,e.y0))/Math.max(1,(e.x1-e.x0)*(e.y1-e.y0))>.82))}function K(){if("u"<typeof navigator)return!1;let e=navigator.deviceMemory;return!("u"<typeof navigator)&&(/iPad|iPhone|iPod/i.test(navigator.userAgent)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)||"number"==typeof e&&e<=4}async function X(e){let t=await en(e);try{let n=Math.round(.035*t.width),r=Math.round(t.width/2),a=[{x:0,width:Math.min(t.width,r+n)},{x:Math.max(0,r-n),width:t.width-Math.max(0,r-n)}],s=[];for(let n of a){let r=document.createElement("canvas");r.width=n.width,r.height=t.height;let a=r.getContext("2d");if(!a){s.push(e);continue}a.fillStyle="#ffffff",a.fillRect(0,0,r.width,r.height),a.drawImage(t.source,n.x,0,n.width,t.height,0,0,n.width,t.height),s.push(await new Promise(e=>r.toBlob(e,"image/jpeg",.92))??e)}return s}finally{t.release()}}async function J(e,t,n=16){let r=await en(e);try{let e=[];for(let a of t.slice(0,n)){let t=a.x1-a.x0,n=a.y1-a.y0,s=Math.max(24,Math.round(.2*t)),l=Math.max(10,Math.round(.5*n)),o=Math.max(0,a.x0-s),i=Math.max(0,a.y0-l),d=Math.min(r.width-o,t+2*s),c=Math.min(r.height-i,n+2*l);if(d<20||c<12)continue;let h=Math.max(1,Math.min(3,96/c)),m=document.createElement("canvas");m.width=Math.max(64,Math.round(d*h)),m.height=Math.max(48,Math.round(c*h));let u=m.getContext("2d");if(!u)continue;u.fillStyle="#ffffff",u.fillRect(0,0,m.width,m.height),u.drawImage(r.source,o,i,d,c,0,0,m.width,m.height);let g=await new Promise(e=>m.toBlob(e,"image/png"));g&&e.push(g)}return e}finally{r.release()}}function Q(e,t){let n=new Map,r=new Set;for(let a of e){let e=function(e,t){let n=G(e.text),r=F(e.text);if(!r)return null;let a=w.get(r);if(a){let s=r.replace(/[^a-z]/g,"").length;if(1===s&&e.confidence<.55||2===s&&e.confidence<.4||3===s&&e.confidence<.25)return null;let l=n!==r;return{word:a.word.trim().toLowerCase(),confidence:q(e.confidence*(l?.92:1)),source:t,status:l?"corrected":"verified",original:n,zh:a.zh,category:a.category,usage:a.usage,example:a.example,exampleZh:a.exampleZh}}let s=function(e,t){if(e.length<3||e.includes(" ")||3===e.length&&t<.72||e.length>=4&&t<.3)return null;let n=e.length>=8?2:1,r="",a=1/0,s=1/0;for(let t of W){if(Math.abs(t.length-e.length)>n)continue;let l=function(e,t){if(e===t)return 0;if(!e.length)return t.length;if(!t.length)return e.length;let n=Array.from({length:t.length+1},(e,t)=>t),r=Array(t.length+1);for(let a=1;a<=e.length;a+=1){r[0]=a;for(let s=1;s<=t.length;s+=1){let l=n[s-1]+ +(e[a-1]!==t[s-1]);r[s]=Math.min(n[s]+1,r[s-1]+1,l)}for(let e=0;e<r.length;e+=1)n[e]=r[e]}return n[t.length]}(e,t);l<a?(s=a,a=l,r=t):l<s&&(s=l)}if(!r||a>n||s===a)return null;let l=1-a/Math.max(e.length,r.length);return l<.74?null:{word:r,similarity:l}}(r,e.confidence);if(!s)return null;let l=w.get(s.word);return l?{word:l.word.trim().toLowerCase(),confidence:q(.72*e.confidence+.28*s.similarity),source:t,status:"corrected",original:n,zh:l.zh,category:l.category,usage:l.usage,example:l.example,exampleZh:l.exampleZh}:null}(a,t);if(!e){let e=F(a.text);e.length>=2&&e.length<=18&&r.add(e);continue}let s=n.get(e.word);(!s||e.confidence>s.confidence)&&n.set(e.word,e)}return{words:Array.from(n.values()),rejectedTokens:Array.from(r).filter(e=>!n.has(e))}}function ee(...e){let t=new Map,n=new Set;for(let r of e){for(let e of r.words){let n=t.get(e.word);(!n||e.confidence>n.confidence)&&t.set(e.word,e)}for(let e of r.rejectedTokens)n.add(e)}return{words:Array.from(t.values()),rejectedTokens:Array.from(n).filter(e=>!t.has(e)),rawText:e.map(e=>e.rawText).filter(Boolean).join("\n")}}async function et(e){if(!("createImageBitmap"in window))return{words:[],rejectedTokens:[],rawText:""};let t=window.TextDetector;if(!t)return{words:[],rejectedTokens:[],rawText:""};let n=null;try{n=await createImageBitmap(e);let r=new t,a=(await r.detect(n)).map(e=>e.rawValue??e.text??"").join("\n");return{...Q(H(a,.88),"browser-ai"),rawText:a}}catch{return{words:[],rejectedTokens:[],rawText:""}}finally{n?.close()}}async function en(e){if("createImageBitmap"in window){let t=await createImageBitmap(e,{imageOrientation:"from-image"});return{source:t,width:t.width,height:t.height,release:()=>t.close()}}let t=URL.createObjectURL(e),n=new Image;return n.decoding="async",n.src=t,await n.decode(),{source:n,width:n.naturalWidth,height:n.naturalHeight,release:()=>URL.revokeObjectURL(t)}}async function er(e,t=!1){let n=await en(e);try{let r=Math.max(n.width,n.height),a=(K()?Math.min(1600,r):r<1500?1800:Math.min(2400,r))/r,s=Math.max(1,Math.round(n.width*a)),l=Math.max(1,Math.round(n.height*a)),o=document.createElement("canvas");o.width=s,o.height=l;let i=o.getContext("2d",{willReadFrequently:!0});if(!i)return e;i.drawImage(n.source,0,0,s,l);let d=i.getImageData(0,0,s,l),c=new Uint32Array(256);for(let e=0;e<d.data.length;e+=4){let t=Math.round(.299*d.data[e]+.587*d.data[e+1]+.114*d.data[e+2]);c[t]+=1}let h=s*l,m=e=>{let t=h*e,n=0;for(let e=0;e<c.length;e+=1)if((n+=c[e])>=t)return e;return 255},u=m(.03),g=Math.max(u+42,m(.97)),x=m(.72);for(let e=0;e<d.data.length;e+=4){let n=.299*d.data[e]+.587*d.data[e+1]+.114*d.data[e+2],r=255*q((n-u)/(g-u)),a=Math.round(q((r-128)*1.28+128,0,255)),s=t?n<x?20:255:a;d.data[e]=s,d.data[e+1]=s,d.data[e+2]=s}return i.putImageData(d,0,0),await new Promise(e=>o.toBlob(e,"image/jpeg",.94))??e}finally{n.release()}}async function ea(t,n){let r;n.onProgress?.({progress:.05,label:"準備裝置端辨識引擎"});let{createWorker:a,PSM:s}=await ((r=D())?Promise.resolve(r):U||(U=new Promise((e,t)=>{let n=()=>{let n=D();n?e(n):(U=null,t(Error("辨識引擎載入失敗,請確認網路後再試一次。")))},r=()=>{U=null,t(Error("辨識引擎暫時無法連線,請稍後再試。"))},a=document.getElementById(O);if(a){a.addEventListener("load",n,{once:!0}),a.addEventListener("error",r,{once:!0});return}let s=document.createElement("script");s.id=O,s.src="https://cdn.jsdelivr.net/npm/tesseract.js@7.0.0/dist/tesseract.min.js",s.async=!0,s.crossOrigin="anonymous",s.addEventListener("load",n,{once:!0}),s.addEventListener("error",r,{once:!0}),document.head.appendChild(s)}))),l=await a("eng",1,{logger:e=>{var t;let r=.1+.68*q(e.progress??0);n.onProgress?.({progress:r,label:(t=e.status??"").includes("language")?"載入英文辨識資料":t.includes("recognizing")?"逐行讀取本子上的英文":t.includes("initializing")||t.includes("loading tesseract")?"準備裝置端辨識引擎":"整理照片文字"})}});try{let r=K(),a=await er(t);await l.setParameters({tessedit_pageseg_mode:s.SPARSE_TEXT,tessedit_char_whitelist:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'- ",preserve_interword_spaces:"1",user_defined_dpi:"260"});let o=(await l.recognize(a,{rotateAuto:!0},{text:!0,blocks:!0})).data,i=Q(Y(o),"local-ocr"),d=V(o),c=null,h=null,m=[],u=ee({...i,rawText:o.text??""});if(!r){n.onProgress?.({progress:.7,label:"加強淡色筆跡再核對一次"}),c=await er(t,!0),await l.setParameters({tessedit_pageseg_mode:s.AUTO,tessedit_char_whitelist:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'- ",preserve_interword_spaces:"1",user_defined_dpi:"260"}),h=(await l.recognize(c,{rotateAuto:!0},{text:!0,blocks:!0})).data;let e=Q(Y(h),"local-ocr");m=V(h),u=ee(u,{...e,rawText:h.text??""})}let g=Math.max(d.length,m.length),x=u.words.length>=8&&(0===g||u.words.length/g>=.7),f=[];if(!x||r){n.onProgress?.({progress:.79,label:"分開左右頁逐欄辨識"});let e=await X(a),t=[];await l.setParameters({tessedit_pageseg_mode:s.SINGLE_COLUMN,tessedit_char_whitelist:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'- ",preserve_interword_spaces:"1",user_defined_dpi:"260"});for(let r=0;r<e.length;r+=1){n.onProgress?.({progress:.8+.025*r,label:`辨識第 ${r+1} 頁筆記`});let a=(await l.recognize(e[r],{rotateAuto:!1},{text:!0,blocks:!0})).data,s=Q(Y(a),"local-ocr");t.push({...s,rawText:a.text??""}),f.push({image:e[r],regions:V(a)})}u=ee(u,...t)}let p=!c||d.length>=m.length?{image:a,regions:d}:{image:c,regions:m},w=f.reduce((e,t)=>e+t.regions.length,0),b=Math.max(g,w);if((u.words.length<8||b>0&&u.words.length/b<.72)&&!r){let t=w>p.regions.length?f:[p],r=[];for(let e of t){let t=16-r.length;if(t<=0)break;r.push(...await J(e.image,e.regions,t))}if(r.length>0){let t=null;try{let{disposeHandwrittenEnglishAI:a,recognizeHandwrittenEnglishLines:s}=await e.A(98846);t=a;let l=await s(r,n.onProgress),o=l.map(e=>{let t=e.match(Z)?.length??0;return 0===t||t>2?{words:[],rejectedTokens:[]}:Q(H(e,.82),"handwriting-ai")}),i=ee(...o.map((e,t)=>({...e,rawText:l[t]??""})));u=ee(u,i)}catch(e){console.warn("[Chenguang OCR] Handwriting AI review unavailable:",e)}finally{await t?.().catch(()=>void 0)}}}return u}finally{await l.terminate()}}async function es(e){let t=_.default.env.NEXT_PUBLIC_WORD_OCR_ENDPOINT?.trim();if(!t)return{words:[],rejectedTokens:[],rawText:"",message:""};let n=new FormData;n.append("image",e);try{var r;let e=await fetch(t,{method:"POST",body:n}),a=await e.json(),s=[a.rawText??"",...a.words??[]].filter(Boolean).join("\n");return{...(r=e.ok?.86:.2,Q(H(s,r),"server-ai")),rawText:s,message:a.message??""}}catch{return{words:[],rejectedTokens:[],rawText:"",message:"線上辨識服務暫時無法連線。"}}}function el(e,t){let n=e.filter(e=>"corrected"===e.status).length,r=n>0?`,其中 ${n} 個已依正式辭庫校正拼字`:"",a=t.length>0?";模糊或無法核對的片段沒有放進題庫":"";return`辨識到 ${e.length} 個可核對的不同英文單字${r}${a}。請確認後再出題。`}async function eo(e,t={}){t.onProgress?.({progress:.02,label:"檢查照片"});let n=await et(e);try{let r=await ea(e,t),a=ee(n,r);if(a.words.length>0)return t.onProgress?.({progress:1,label:"辨識完成"}),{...a,message:el(a.words,a.rejectedTokens)}}catch(e){e instanceof Error?e.message:String(e),console.warn("[Chenguang OCR] Device recognition failed:",e)}let r=await es(e);return r.words.length>0?(t.onProgress?.({progress:1,label:"辨識完成"}),{words:r.words,rawText:r.rawText,rejectedTokens:r.rejectedTokens,message:r.message||el(r.words,r.rejectedTokens)}):(t.onProgress?.({progress:1,label:"沒有讀到可核對的單字"}),{words:[],rawText:"",rejectedTokens:n.rejectedTokens,message:"沒有讀到能和辭庫核對的完整英文單字。請靠近本子、讓紙張平整並避開陰影後重拍;系統不會用殘缺字母猜答案。"})}var ei=e.i(41324),ed=e.i(12408);let ec={progress:0,label:"尚未開始"};function eh(e){return`scan-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}e.s(["default",0,function(){var e;let{person:c}=(0,ei.useActivePerson)(),u=(0,n.useRef)(null),g=(0,n.useRef)(null),x=(0,n.useRef)(null),f=(0,n.useRef)(null),[p,w]=(0,n.useState)("photo"),[y,v]=(0,n.useState)(null),[N,M]=(0,n.useState)(""),[_,O]=(0,n.useState)(""),[U,D]=(0,n.useState)([]),[Z,W]=(0,n.useState)([]),[q,G]=(0,n.useState)(0),[F,H]=(0,n.useState)(!1),[Y,V]=(0,n.useState)(ec),[K,X]=(0,n.useState)("選擇拍照掃描或直接鍵入,晨光會替孩子整理成小測驗。"),[J,Q]=(0,n.useState)(0),[ee,et]=(0,n.useState)(0),[en,er]=(0,n.useState)(""),[ea,es]=(0,n.useState)(!1),[el,em]=(0,n.useState)(0),[eu,eg]=(0,n.useState)(0),[ex,ef]=(0,n.useState)(""),[ep,ew]=(0,n.useState)(""),[eb,ey]=(0,n.useState)(!1),ej=(0,n.useMemo)(()=>$(U,el,5),[U,el]),ek=ej[eu],ev=U.filter(e=>I(e.word)&&e.zh?.trim()).length,eN=U.filter(e=>I(e.word)&&!e.zh?.trim()).length,eT=Z[0]?"server-ai"===(e=Z[0].source)?"線上智慧辨識":"handwriting-ai"===e?"手寫英文 AI 複核":"local-ocr"===e?"裝置端文字辨識":"browser-ai"===e?"瀏覽器文字辨識":"家長確認":"typing"===p&&U.length>0?"家長鍵入":U.length>0?"已自動保存":"等待辨識",eS=Z.length?Math.round(Z.reduce((e,t)=>e+t.confidence,0)/Z.length*100):0,eM=ea?4:U.length>0?3:F||y?2:1,eI=el+ej.length<ev;function eC(){es(!1),em(0),eg(0),ef(""),ew(""),ey(!1)}function e$(e){if(!e)return;let t=e.getBoundingClientRect().top+window.scrollY-112;window.scrollTo({top:Math.max(0,t),behavior:"smooth"})}function ez(e){if(e){if(!e.type.startsWith("image/"))return void X("這個檔案不是照片,請選擇 JPG、PNG、WEBP 或手機拍攝的影像。");if(e.size>0x1900000)return void X("照片超過 25 MB,請用手機相機重新拍近一點,或選擇較小的照片。");N&&URL.revokeObjectURL(N),v(e),M(URL.createObjectURL(e)),D([]),W([]),G(0),V(ec),er(eh(c.id)),eC(),X("照片已準備好。確認單字清楚、畫面沒有大片陰影,再按「開始智慧辨識」。")}}async function eP(){if(!y||F){y||X("請先用相機拍下本子,或從相簿選一張照片。");return}H(!0),V({progress:.02,label:"檢查照片"}),X("第一次辨識會下載英文辨識資料,之後會使用裝置快取。請保持這個頁面開啟。");try{let e=await eo(y,{onProgress:V}),t=en||eh(c.id),n=e.words.map((e,t)=>({id:`scan-word-${e.word}-${t}`,...C(e.word),recognitionStatus:e.status,recognizedFrom:"corrected"===e.status?e.original:void 0,confidence:e.confidence}));if(W(e.words),G(e.rejectedTokens.length),D(n),eC(),er(t),n.length>0){let r=P(n,c.id,t);L(n,c.id,t),et(r.length),X(`${e.message} 已先自動存入 ${c.name} 的單字庫;重新整理或意外關閉也不會消失。`)}else X(e.message);n.length>0&&window.setTimeout(()=>e$(x.current),120)}catch(e){console.warn("[Chenguang scanner] Recognition stopped unexpectedly:",e),X("辨識暫時中止,已經存入個人單字庫的內容不會消失。請重新整理後再試一次,或改用直接鍵入。")}finally{H(!1)}}function eA(){N&&URL.revokeObjectURL(N),M(""),v(null),O(""),D([]),W([]),G(0),V(ec),E(c.id),er(""),eC(),X("已清除這次內容,可以重新拍照或鍵入單字。")}return(0,n.useEffect)(()=>{let e=z(c.id),t=A(c.id);Q(R(c.id).length),et(e.length),D(t?.words??[]),er(t?.id??""),W([]),G(0),v(null),O(""),es(!1),em(0),eg(0),ef(""),ew(""),ey(!1),X(t?.words.length?`已恢復 ${c.name} 上次尚未完成的 ${t.words.length} 個單字,可以接著確認。`:`現在替 ${c.name} 建立題庫。請拍本子,或直接鍵入英文單字。`),M(e=>(e&&URL.revokeObjectURL(e),""))},[c.id,c.name]),(0,n.useEffect)(()=>()=>{N&&URL.revokeObjectURL(N)},[N]),(0,t.jsxs)(r.AppShell,{children:[(0,t.jsx)(s.PageHeader,{eyebrow:"English Notebook Scanner",title:"把本子上的單字,變成今天的小測驗",description:`目前為 ${c.name} 建立專屬題庫。照片在這台裝置上辨識,家長確認後才會出題。`}),(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(h,{currentStep:eM})}),ee>0?(0,t.jsxs)("div",{className:"mt-4 flex flex-col gap-3 rounded-3xl border border-green-100 bg-green-50/90 p-4 sm:flex-row sm:items-center sm:justify-between",children:[(0,t.jsxs)("p",{className:"font-bold leading-7 text-green-900",children:[c.name," 的個人單字庫已有 ",(0,t.jsx)("strong",{children:ee})," 個寫過並確認的單字。"]}),(0,t.jsx)(o.SecondaryButton,{onClick:function(){let e=z(c.id);0===e.length?X("個人單字庫還是空的,先拍一頁本子並確認單字。"):(D(e),W([]),G(0),es(!0),em(0),eg(0),ef(""),ew(""),ey(!1),X(`已載入 ${c.name} 寫過的 ${e.length} 個不同單字,每回練 5 題。`),window.setTimeout(()=>e$(f.current),120))},children:"從單字庫練 5 題"})]}):null,(0,t.jsxs)(i.SectionCard,{className:"mt-6",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:"STEP 1"}),(0,t.jsx)("h2",{className:"mt-1 text-2xl font-black text-ink sm:text-3xl",children:"把英文單字放進晨光"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"手機可直接拍本子,也可以從相簿選照片;沒有照片時可直接鍵入。"})]}),(0,t.jsxs)("div",{className:"inline-grid grid-cols-2 rounded-2xl bg-stone-100 p-1","aria-label":"單字輸入方式",children:[(0,t.jsx)("button",{type:"button",onClick:()=>w("photo"),className:`min-h-11 rounded-xl px-4 font-black transition ${"photo"===p?"bg-white text-amber-900 shadow-sm":"text-stone-500"}`,"aria-pressed":"photo"===p,children:"拍照掃描"}),(0,t.jsx)("button",{type:"button",onClick:()=>w("typing"),className:`min-h-11 rounded-xl px-4 font-black transition ${"typing"===p?"bg-white text-amber-900 shadow-sm":"text-stone-500"}`,"aria-pressed":"typing"===p,children:"直接鍵入"})]})]}),"photo"===p?(0,t.jsxs)("div",{className:"mt-6 grid gap-5 lg:grid-cols-[minmax(0,1.35fr)_minmax(260px,0.65fr)]",children:[(0,t.jsx)("div",{className:"overflow-hidden rounded-3xl border-2 border-dashed border-amber-200 bg-cream/70 p-3",children:N?(0,t.jsx)("img",{src:N,alt:"孩子手寫英文照片預覽",className:"mx-auto aspect-[4/3] max-h-[520px] w-full rounded-2xl bg-white object-contain"}):(0,t.jsxs)("button",{type:"button",onClick:()=>u.current?.click(),className:"flex aspect-[4/3] min-h-72 w-full flex-col items-center justify-center rounded-2xl bg-white/75 px-6 text-center transition hover:bg-white",children:[(0,t.jsx)("span",{className:"grid size-16 place-items-center rounded-3xl bg-butter text-2xl font-black text-amber-900",children:"掃"}),(0,t.jsx)("span",{className:"mt-5 text-2xl font-black text-ink",children:"用相機拍下英文作業"}),(0,t.jsx)("span",{className:"mt-2 max-w-md font-bold leading-7 text-stone-500",children:"單字放大、紙張攤平、避開手和大片陰影,辨識會更準。"})]})}),(0,t.jsxs)("div",{className:"flex flex-col justify-between gap-5 rounded-3xl bg-[#fffaf3] p-5",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-black text-amber-800",children:"拍攝小提醒"}),(0,t.jsxs)("ul",{className:"mt-3 space-y-3 text-sm font-bold leading-6 text-stone-600",children:[(0,t.jsx)("li",{children:"1. 一次拍一到兩頁,英文要清楚。"}),(0,t.jsx)("li",{children:"2. 鏡頭盡量和紙張平行。"}),(0,t.jsx)("li",{children:"3. 辨識後一定會讓家長再確認。"})]})]}),(0,t.jsx)(a.InfoCard,{tone:"green",title:"孩子資料更安心",children:"照片只在目前裝置內處理,不會存進晨光,也不會上傳到題庫。"})]})]}):(0,t.jsxs)("div",{className:"mt-6 rounded-3xl bg-cream/70 p-5 sm:p-6",children:[(0,t.jsxs)("label",{className:"block",children:[(0,t.jsx)("span",{className:"font-black text-ink",children:"直接輸入本子上的英文"}),(0,t.jsx)("span",{className:"mt-1 block text-sm font-bold text-stone-500",children:"可用空格、逗號或換行分開;輸入幾個,就整理幾個。"}),(0,t.jsx)("textarea",{value:_,onChange:e=>O(e.target.value),autoCapitalize:"none",autoCorrect:"off",spellCheck:!1,className:"mt-4 min-h-40 w-full rounded-3xl border border-softline bg-white p-5 text-lg font-bold leading-8 outline-none focus:border-coral focus:ring-4 focus:ring-coral/10",placeholder:"例如:\nhello\nbook\nteacher\nfriend"})]}),(0,t.jsx)(l.PrimaryButton,{onClick:function(){let e=_.split(/[\n,,、;;]+/).flatMap(e=>{let t=I(e);return t?S.has(t)?[t]:t.match(T)??[]:[]}).map(e=>e.toLowerCase()).filter((e,t,n)=>e.length>0&&n.indexOf(e)===t).map((e,t)=>({id:`scan-word-${e}-${t}`,...C(e),recognitionStatus:b(I(e))?"verified":"needs-review"}));if(0===e.length)return void X("還沒有讀到英文單字。請用空格、逗號或換行分開,例如:hello, book, friend。");let t=eh(c.id),n=e.map(e=>({...e,recognitionStatus:"manual"}));D(n),er(t),W(e.map(e=>({word:e.word,confidence:1,source:"manual",status:"verified",original:e.word,zh:e.zh??"",category:e.category??"待確認",usage:e.usage??"家長鍵入",example:e.example??"",exampleZh:e.exampleZh}))),G(0),eC(),L(n,c.id,t),et(P(n,c.id,t).length),X(`已整理並自動保存 ${e.length} 個單字。請確認中文意思,再建立 ${c.name} 的 5 題練習。`),window.setTimeout(()=>e$(x.current),120)},className:"mt-4",children:"整理成可確認的單字"})]}),(0,t.jsx)("input",{ref:u,className:"hidden",type:"file",accept:"image/*",capture:"environment",onChange:e=>{ez(e.target.files?.[0]),e.currentTarget.value=""}}),(0,t.jsx)("input",{ref:g,className:"hidden",type:"file",accept:"image/*",onChange:e=>{ez(e.target.files?.[0]),e.currentTarget.value=""}}),"photo"===p?(0,t.jsxs)("div",{className:"mt-5 flex flex-wrap gap-3",children:[(0,t.jsx)(l.PrimaryButton,{onClick:()=>u.current?.click(),disabled:F,children:N?"重新拍本子":"開啟相機拍照"}),(0,t.jsx)(o.SecondaryButton,{onClick:()=>g.current?.click(),disabled:F,children:"從相簿選照片"}),N?(0,t.jsx)(l.PrimaryButton,{onClick:eP,disabled:F,className:"bg-blue-600 hover:bg-blue-700",children:F?"正在逐行辨識":"開始智慧辨識"}):null]}):null,F?(0,t.jsxs)("div",{className:"mt-5 rounded-3xl border border-blue-100 bg-blue-50 p-5",role:"status","aria-live":"polite",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3 font-black text-blue-950",children:[(0,t.jsx)("span",{children:Y.label}),(0,t.jsxs)("span",{children:[Math.round(100*Y.progress),"%"]})]}),(0,t.jsx)("div",{className:"mt-3 h-3 overflow-hidden rounded-full bg-white",children:(0,t.jsx)("div",{className:"h-full rounded-full bg-blue-500 transition-[width] duration-300",style:{width:`${Math.max(4,100*Y.progress)}%`}})}),(0,t.jsx)("p",{className:"mt-3 text-sm font-bold leading-6 text-blue-800",children:"第一次載入可能需要一些時間;完成後會自動移到確認區。"})]}):null,(0,t.jsx)("p",{className:"mt-5 rounded-2xl bg-green-50 p-4 font-bold leading-7 text-green-900","aria-live":"polite",children:K})]}),U.length>0?(0,t.jsx)(i.SectionCard,{className:"mt-8",children:(0,t.jsxs)("section",{ref:x,className:"scroll-mt-28",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:"STEP 3"}),(0,t.jsx)("h2",{className:"mt-1 text-2xl font-black text-ink sm:text-3xl",children:"家長確認後再出題"}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:"英文或中文有誤可直接修改。沒有中文的單字不會偷偷出題。"})]}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsxs)("span",{className:"rounded-2xl bg-green-50 px-4 py-2 text-sm font-black text-green-800",children:["可出題 ",ev]}),eN>0?(0,t.jsxs)("span",{className:"rounded-2xl bg-rose-50 px-4 py-2 text-sm font-black text-rose-800",children:["待補中文 ",eN]}):null,(0,t.jsxs)("span",{className:"rounded-2xl bg-blue-50 px-4 py-2 text-sm font-black text-blue-800",children:[eT,eS>0&&Z[0]?.source!=="manual"?` ${eS}%`:""]}),q>0?(0,t.jsx)("span",{className:"rounded-2xl bg-stone-100 px-4 py-2 text-sm font-black text-stone-600",children:"模糊片段未採用"}):null]})]}),(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsx)(B,{words:U,onChange:function(e){let t=en||eh(c.id);D(e),er(t),L(e,c.id,t),et(P(e,c.id,t).length),eC()}})}),(0,t.jsxs)("div",{className:"mt-6 flex flex-col gap-3 rounded-3xl bg-cream/70 p-5 sm:flex-row sm:items-center sm:justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("p",{className:"font-black text-ink",children:["已保留全部 ",ev," 個可核對單字"]}),(0,t.jsxs)("p",{className:"mt-1 text-sm font-bold text-stone-500",children:["每回只練 5 題;全部單字會存進 ",c.name," 的個人單字庫。目前已有 ",J," 次掃描紀錄。"]})]}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-3",children:[(0,t.jsx)(o.SecondaryButton,{onClick:eA,children:"清除重來"}),(0,t.jsx)(l.PrimaryButton,{onClick:function(){let e=U.map(e=>({...e,word:I(e.word),zh:e.zh?.trim()})).filter(e=>e.word&&e.zh),t=$(e,0,5);eN>0?X(`還有 ${eN} 個單字缺少中文意思,補完後才能避免出錯題。`):0===t.length?X("請至少確認一個英文單字與中文意思,才能建立題庫。"):(D(e),function(e,t,n=m.currentStudent.id,r){if(0===t.length)return;P(e,n,r);let a=R(n),s=[{id:`quiz-${Date.now()}`,personId:n,createdAt:new Date().toISOString(),words:e,quiz:t},...a].slice(0,20);(0,j.writePersonStorage)(k,n,s)}(e,t,c.id,en||void 0),E(c.id),er(""),Q(R(c.id).length),et(z(c.id).length),es(!0),em(0),eg(0),ef(""),ew(""),ey(!1),X(`已把 ${e.length} 個確認單字存進 ${c.name} 的個人單字庫,本回先練 ${t.length} 題。`),window.setTimeout(()=>e$(f.current),120))},disabled:0===ev||eN>0,children:eN>0?`還有 ${eN} 個待確認`:`儲存並開始 ${Math.min(5,ev)} 題`})]})]})]})}):null,ea&&ek?(0,t.jsx)(i.SectionCard,{className:"mt-8",children:(0,t.jsxs)("section",{ref:f,className:"scroll-mt-28",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:"STEP 4"}),(0,t.jsx)("h2",{className:"mt-1 text-2xl font-black text-ink sm:text-3xl",children:"一題一題,輕鬆完成"})]}),(0,t.jsx)(o.SecondaryButton,{href:"/daily-quiz",children:"練習年級每日 10 題"})]}),eb?(0,t.jsxs)("div",{className:"mx-auto mt-6 max-w-3xl rounded-[2rem] border border-green-100 bg-green-50 p-7 text-center sm:p-10",children:[(0,t.jsx)("p",{className:"text-sm font-black text-green-700",children:"TODAY COMPLETE"}),(0,t.jsxs)("h3",{className:"mt-2 text-3xl font-black text-green-950",children:[c.name," 完成這組 ",ej.length," 題"]}),(0,t.jsxs)("p",{className:"mt-3 font-bold leading-7 text-green-800",children:["這次確認的單字都已加入個人單字庫。",eI?"休息一下,再繼續下一組 5 題。":"這批單字已全部練完。"]}),(0,t.jsxs)("div",{className:"mt-6 flex flex-wrap justify-center gap-3",children:[eI?(0,t.jsxs)(l.PrimaryButton,{onClick:function(){eI&&(em(e=>e+ej.length),eg(0),ef(""),ew(""),ey(!1),window.setTimeout(()=>e$(f.current),80))},children:["下一組 ",Math.min(5,ev-el-ej.length)," 題"]}):(0,t.jsx)(l.PrimaryButton,{onClick:function(){eg(0),ef(""),ew(""),ey(!1)},children:"再玩這組"}),(0,t.jsx)(o.SecondaryButton,{onClick:eA,children:"掃描下一頁"})]})]}):(0,t.jsxs)("article",{className:"mx-auto mt-6 max-w-3xl rounded-[2rem] border border-softline bg-[#fffdf9] p-5 shadow-sm sm:p-8",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("p",{className:"text-sm font-black text-amber-700",children:["第 ",eu+1," 題 / 共 ",ej.length," 題"]}),(0,t.jsx)("span",{className:"rounded-full bg-mint px-4 py-2 text-sm font-black text-green-800",children:"本子單字"})]}),(0,t.jsx)("div",{className:"mt-3 h-2 overflow-hidden rounded-full bg-stone-100",children:(0,t.jsx)("div",{className:"h-full rounded-full bg-coral transition-[width]",style:{width:`${(eu+1)/ej.length*100}%`}})}),(0,t.jsx)("p",{className:"mt-6 text-3xl font-black leading-tight text-blue-700 sm:text-4xl",children:ek.question}),(0,t.jsx)("p",{className:"mt-3 font-bold leading-7 text-stone-500",children:ek.prompt}),(0,t.jsx)("div",{className:"mt-6 grid grid-cols-1 gap-3 sm:grid-cols-2",children:ek.options.map(e=>{let n=ex===e,r=e===ek.answer,a=n?r?"border-green-400 bg-green-100 text-green-950 ring-4 ring-green-100":"border-rose-300 bg-rose-100 text-rose-950 ring-4 ring-rose-100":"border-softline bg-white text-amber-950 hover:border-amber-300 hover:bg-butter";return(0,t.jsx)("button",{type:"button",onClick:()=>{ek&&ex!==ek.answer&&(ef(e),(0,ed.speakMandarin)(e,{rate:.78}),e===ek.answer?(ew(`答對了。${ek.explanation}`),window.setTimeout(()=>(0,ed.speakEnglish)(ek.word,{rate:.74}),350)):ew("再想一下。先聽英文單字,再選一次就好。"))},className:`min-h-20 rounded-3xl border px-5 py-4 text-left text-xl font-black transition active:scale-[0.99] ${a}`,"aria-pressed":n,children:(0,t.jsxs)("span",{className:"flex items-center justify-between gap-3",children:[(0,t.jsx)("span",{children:e}),n?(0,t.jsx)("span",{"aria-hidden":"true",children:r?"✓":"再試"}):null]})},e)})}),ep?(0,t.jsx)("p",{className:`mt-5 rounded-2xl p-4 font-bold leading-7 ${ex===ek.answer?"bg-green-50 text-green-900":"bg-rose-50 text-rose-900"}`,"aria-live":"polite",children:ep}):null,(0,t.jsxs)("div",{className:"mt-5 flex flex-wrap gap-3",children:[(0,t.jsx)(d.VoiceButton,{text:ek.word,variant:"mint",children:"聽英文單字"}),(0,t.jsx)(l.PrimaryButton,{onClick:function(){ek&&ex===ek.answer?eu===ej.length-1?ey(!0):(eg(e=>e+1),ef(""),ew("")):ew("先選到正確答案,再進入下一題。")},disabled:ex!==ek.answer,children:eu===ej.length-1?"完成這組測驗":"確認,下一題"})]})]})]})}):null]})}],79930)}]);
_next/static/chunks/3gir9tqn7_2if.js ADDED
@@ -0,0 +1 @@
 
 
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return l},formatWithValidation:function(){return d},urlObjectKeys:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(90809)._(e.r(98183)),i=/https?|ftp|gopher|file/;function l(e){let{auth:t,hostname:r}=e,n=e.protocol||"",a=e.pathname||"",l=e.hash||"",s=e.query||"",d=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?d=t+e.host:r&&(d=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(d+=":"+e.port)),s&&"object"==typeof s&&(s=String(o.urlQueryToSearchParams(s)));let c=e.search||s&&`?${s}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||i.test(n))&&!1!==d?(d="//"+(d||""),a&&"/"!==a[0]&&(a="/"+a)):d||(d=""),l&&"#"!==l[0]&&(l="#"+l),c&&"?"!==c[0]&&(c="?"+c),a=a.replace(/[?#]/g,encodeURIComponent),c=c.replace("#","%23"),`${n}${d}${a}${c}${l}`}let s=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function d(e){return l(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t){let r=(0,n.useRef)(null),a=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(r.current=o(e,n)),t&&(a.current=o(t,n))},[e,t])}function o(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return o}});let n=e.r(18967),a=e.r(52817);function o(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,a.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return b},useLinkStatus:function(){return w}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(90809),i=e.r(43476),l=o._(e.r(71645)),s=e.r(95057),d=e.r(8372),c=e.r(18581),u=e.r(18967),g=e.r(5550);e.r(33525);let f=e.r(88540),m=e.r(91949),h=e.r(73668),p=e.r(9396);function b(t){var r,n;let a,o,b,[w,v]=(0,l.useOptimistic)(m.IDLE_LINK_STATUS),y=(0,l.useRef)(null),{href:j,as:S,children:P,prefetch:k=null,passHref:N,replace:_,shallow:E,scroll:R,onClick:L,onMouseEnter:$,onTouchStart:C,legacyBehavior:I=!1,onNavigate:O,transitionTypes:T,ref:M,unstable_dynamicOnHover:U,...A}=t;a=P,I&&("string"==typeof a||"number"==typeof a)&&(a=(0,i.jsx)("a",{children:a}));let H=l.default.useContext(d.AppRouterContext),B=!1!==k,D=!1!==k?null===(n=k)||"auto"===n?p.FetchStrategy.PPR:p.FetchStrategy.Full:p.FetchStrategy.PPR,K="string"==typeof(r=S||j)?r:(0,s.formatUrl)(r);if(I){if(a?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});o=l.default.Children.only(a)}let F=I?o&&"object"==typeof o&&o.ref:M,W=l.default.useCallback(e=>(null!==H&&(y.current=(0,m.mountLinkInstance)(e,K,H,D,B,v)),()=>{y.current&&((0,m.unmountLinkForCurrentNavigation)(y.current),y.current=null),(0,m.unmountPrefetchableInstance)(e)}),[B,K,H,D,v]),z={ref:(0,c.useMergedRef)(W,F),onClick(t){I||"function"!=typeof L||L(t),I&&o.props&&"function"==typeof o.props.onClick&&o.props.onClick(t),!H||t.defaultPrevented||function(t,r,n,a,o,i,s){if("u">typeof window){let d,{nodeName:c}=t.currentTarget;if("A"===c.toUpperCase()&&((d=t.currentTarget.getAttribute("target"))&&"_self"!==d||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,h.isLocalURL)(r)){a&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),i){let e=!1;if(i({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:u}=e.r(99781);l.default.startTransition(()=>{u(r,a?"replace":"push",!1===o?f.ScrollBehavior.NoScroll:f.ScrollBehavior.Default,n.current,s)})}}(t,K,y,_,R,O,T)},onMouseEnter(e){I||"function"!=typeof $||$(e),I&&o.props&&"function"==typeof o.props.onMouseEnter&&o.props.onMouseEnter(e),H&&B&&(0,m.onNavigationIntent)(e.currentTarget,!0===U)},onTouchStart:function(e){I||"function"!=typeof C||C(e),I&&o.props&&"function"==typeof o.props.onTouchStart&&o.props.onTouchStart(e),H&&B&&(0,m.onNavigationIntent)(e.currentTarget,!0===U)}};return(0,u.isAbsoluteUrl)(K)?z.href=K:I&&!N&&("a"!==o.type||"href"in o.props)||(z.href=(0,g.addBasePath)(K)),b=I?l.default.cloneElement(o,z):(0,i.jsx)("a",{...A,...z,children:a}),(0,i.jsx)(x.Provider,{value:w,children:b})}e.r(84508);let x=(0,l.createContext)(m.IDLE_LINK_STATUS),w=()=>(0,l.useContext)(x);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},14876,e=>{"use strict";var t=e.i(43476),r=e.i(22016);function n(e){let t;if(!e.startsWith("/")||e.startsWith("//"))return e;let{path:r,suffix:n}=(t=e.match(/^([^?#]*)(.*)$/),{path:t?.[1]??e,suffix:t?.[2]??""});return"/"===r?`/index.html${n}`:/\.[a-z0-9]+$/i.test(r)?e:`${r.replace(/\/+$/,"")}/index.html${n}`}e.s(["ExportSafeLink",0,function({href:e,children:a,...o}){return"string"==typeof e?(0,t.jsx)("a",{href:n(e),...o,children:a}):(0,t.jsx)(r.default,{href:e,...o,children:a})},"getExportSafeHref",0,n])},41324,62312,7728,e=>{"use strict";var t=e.i(71645);let r=[{id:"grade-1",grade:1,name:"國小一年級",shortName:"小一",description:"從安全感、生活語彙與基礎數感開始,讓孩子每天完成一小步。",ageRange:"6-7 歲",status:"active"},{id:"grade-2",grade:2,name:"國小二年級",shortName:"小二",description:"延伸閱讀、生活英文與加減應用,慢慢建立穩定學習節奏。",ageRange:"7-8 歲",status:"active"},{id:"grade-3",grade:3,name:"國小三年級",shortName:"小三",description:"進入主題閱讀、句型表達與生活問題解決。",ageRange:"8-9 歲",status:"active"},{id:"grade-4",grade:4,name:"國小四年級",shortName:"小四",description:"強化理解、摘要、英文主題字彙與數學推理。",ageRange:"9-10 歲",status:"active"},{id:"grade-5",grade:5,name:"國小五年級",shortName:"小五",description:"培養閱讀策略、表達能力與跨科應用。",ageRange:"10-11 歲",status:"active"},{id:"grade-6",grade:6,name:"國小六年級",shortName:"小六",description:"銜接國中學習,整理知識、建立自主練習習慣。",ageRange:"11-12 歲",status:"active"}];function n(e){return`grade-${e}`}e.s(["getGradeByNumber",0,function(e){return r.find(t=>t.grade===e)},"getGradeIdByNumber",0,n,"grades",0,r],62312);let a=[{id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"},{id:"learner-grade-2",name:"小二學習者",grade:2,role:"student",loginPin:"3572",loginHint:"公開體驗代碼 3572(非生日)"},{id:"learner-grade-3",name:"小三學習者",grade:3,role:"student",loginPin:"4683",loginHint:"公開體驗代碼 4683(非生日)"},{id:"learner-grade-4",name:"小四學習者",grade:4,role:"student",loginPin:"5794",loginHint:"公開體驗代碼 5794(非生日)"},{id:"learner-grade-5",name:"小五學習者",grade:5,role:"student",loginPin:"6805",loginHint:"公開體驗代碼 6805(非生日)"},{id:"learner-grade-6",name:"小六學習者",grade:6,role:"student",loginPin:"7916",loginHint:"公開體驗代碼 7916(非生日)"},{id:"guardian-1",name:"家長帳號一",grade:1,role:"parent",loginPin:"8027",loginHint:"公開體驗代碼 8027(非生日)"},{id:"teacher-1",name:"教師體驗帳號",grade:1,role:"teacher",loginPin:"9138",loginHint:"公開體驗代碼 9138(非生日)"}],o={id:"learner-grade-1",name:"小一學習者",grade:1,role:"student",loginPin:"2461",loginHint:"公開體驗代碼 2461(非生日)"};function i(e){let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.find(e=>e.id===t)??o}function l(e){if(!e)return o.id;let t={"demo-student-001":"learner-grade-1","demo-student-002":"learner-grade-2","demo-student-003":"learner-grade-3","demo-parent-001":"guardian-1","demo-teacher-001":"teacher-1","guardian-2":"guardian-1"}[e]??e;return a.some(e=>e.id===t)?t:o.id}e.s(["currentStudent",0,o,"getCurrentStudentGradeId",0,function(e=o){return n(e.grade)},"getPersonById",0,i,"getPersonDisplayName",0,function(e){return"parent"===e.role?`${e.name} 家長`:"teacher"===e.role?`${e.name} 老師`:(e.role,e.name)},"getPersonSubtitle",0,function(e){return`${({1:"小一",2:"小二",3:"小三",4:"小四",5:"小五",6:"小六"})[e.grade]??`小${e.grade}`}|匿名學習檔案`},"getRoleLabel",0,function(e){return({parent:"家長",teacher:"老師",student:"學生",guest:"訪客"})[e]},"mockPeople",0,a,"normalizePersonId",0,l],7728);let s="chenguang-active-person-id",d="chenguang-active-person-change",c="chenguang-auth-session",u="chenguang-auth-session-change";e.s(["useActivePerson",0,function(){let[e,r]=(0,t.useState)(o.id),[n,a]=(0,t.useState)(!1),[g,f]=(0,t.useState)(!1);function m(e){let t=l(e);r(t),window.localStorage.setItem(s,t),window.dispatchEvent(new Event(d))}return(0,t.useEffect)(()=>{let e=l(window.localStorage.getItem(s));function t(){let e=l(window.localStorage.getItem(s));r(e),window.localStorage.setItem(s,e)}function n(){a(!!window.localStorage.getItem(c))}return r(e),window.localStorage.setItem(s,e),a(!!window.localStorage.getItem(c)),f(!0),window.addEventListener(d,t),window.addEventListener("storage",t),window.addEventListener(u,n),()=>{window.removeEventListener(d,t),window.removeEventListener("storage",t),window.removeEventListener(u,n)}},[]),{person:i(e),switchPerson:m,signIn:function(e){let t=l(e);m(t);let r=i(t);window.localStorage.setItem(c,JSON.stringify({personId:t,role:r.role,signedInAt:new Date().toISOString()})),a(!0),window.dispatchEvent(new Event(u))},signOut:function(){window.localStorage.removeItem(c),a(!1),window.dispatchEvent(new Event(u))},isLoggedIn:n,isReady:g}}],41324)},94542,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(14876),a=e.i(7728),o=e.i(41324);function i(e){return"student"===e.role?"student":"adult"}e.s(["default",0,function(){let{signIn:e}=(0,o.useActivePerson)(),[l,s]=(0,r.useState)("student"),[d,c]=(0,r.useState)(a.mockPeople[0].id),[u,g]=(0,r.useState)(""),[f,m]=(0,r.useState)("先選擇學習者,再輸入該帳號的 4 位數體驗代碼。"),[h,p]=(0,r.useState)(!1),b=(0,r.useRef)(null),x=a.mockPeople.find(e=>e.id===d)??a.mockPeople[0],w=(0,r.useMemo)(()=>a.mockPeople.filter(e=>i(e)===l),[l]);function v(e){s(e);let t=a.mockPeople.find(t=>i(t)===e);t&&c(t.id),g(""),p(!1),m("student"===e?"請選擇小一到小六的學習檔案。":"請選擇家長或教師體驗帳號。")}return(0,r.useEffect)(()=>{let e=new URLSearchParams(window.location.search).get("person"),t=a.mockPeople.find(t=>t.id===e);t&&(c(t.id),s(i(t)))},[]),(0,t.jsx)("main",{className:"min-h-screen bg-[radial-gradient(circle_at_top_left,rgba(255,213,144,0.5),transparent_34rem),radial-gradient(circle_at_top_right,rgba(190,235,220,0.55),transparent_32rem),linear-gradient(135deg,#fff8ef,#f7fbff_55%,#fff8e8)] px-4 py-6 md:px-8 md:py-10",children:(0,t.jsxs)("div",{className:"mx-auto w-full max-w-6xl",children:[(0,t.jsxs)("header",{className:"flex items-center justify-between gap-4",children:[(0,t.jsxs)(n.ExportSafeLink,{href:"/",className:"flex items-center gap-3",children:[(0,t.jsx)("span",{className:"grid h-12 w-12 place-items-center rounded-2xl bg-gradient-to-br from-coral to-honey text-2xl shadow-warm","aria-hidden":"true",children:"☀"}),(0,t.jsxs)("span",{children:[(0,t.jsx)("strong",{className:"block text-2xl font-black text-ink",children:"晨光"}),(0,t.jsx)("small",{className:"font-bold text-stone-500",children:"國小學習陪跑系統"})]})]}),(0,t.jsx)(n.ExportSafeLink,{href:"/",className:"rounded-2xl bg-white/80 px-4 py-3 font-black text-amber-900 shadow-sm",children:"回到首頁"})]}),(0,t.jsxs)("section",{className:"mt-7 grid overflow-hidden rounded-[2rem] border border-white/80 bg-white/70 shadow-warm backdrop-blur-2xl lg:grid-cols-[1.12fr_0.88fr]",children:[(0,t.jsxs)("div",{className:"p-5 md:p-8 lg:p-10",children:[(0,t.jsx)("p",{className:"text-sm font-black text-amber-700",children:"Choose a learner"}),(0,t.jsx)("h1",{className:"mt-2 text-4xl font-black leading-tight text-ink md:text-5xl",children:"選擇今天要使用的學習檔案"}),(0,t.jsx)("p",{className:"mt-3 max-w-2xl font-bold leading-7 text-stone-500",children:"小一到小六都有獨立內容與進度。切換帳號後,課程、英文題庫與難度會一起更新。"}),(0,t.jsxs)("div",{className:"mt-6 grid grid-cols-2 gap-2 rounded-2xl bg-cream p-2",role:"tablist","aria-label":"登入身分",children:[(0,t.jsx)("button",{type:"button",role:"tab","aria-selected":"student"===l,onClick:()=>v("student"),className:`min-h-12 rounded-xl px-4 font-black transition ${"student"===l?"bg-coral text-white shadow-sm":"text-amber-900 hover:bg-white"}`,children:"學生登入"}),(0,t.jsx)("button",{type:"button",role:"tab","aria-selected":"adult"===l,onClick:()=>v("adult"),className:`min-h-12 rounded-xl px-4 font-black transition ${"adult"===l?"bg-coral text-white shadow-sm":"text-amber-900 hover:bg-white"}`,children:"家長/教師"})]}),(0,t.jsx)("div",{className:"mt-4 grid gap-3 sm:grid-cols-2 xl:grid-cols-3",children:w.map(e=>{let r=e.id===d;return(0,t.jsxs)("button",{type:"button",onClick:()=>{c(e.id),g(""),p(!1),m("帳號已選好,請輸入卡片下方顯示的 4 位數體驗代碼。"),window.setTimeout(()=>b.current?.focus(),0)},className:`min-h-28 rounded-3xl border p-4 text-left transition active:scale-[0.99] ${r?"border-coral bg-coral text-white shadow-warm":"border-white bg-white/85 text-ink shadow-sm hover:border-amber-100 hover:bg-cream"}`,"aria-pressed":r,children:[(0,t.jsx)("span",{className:"block text-xs font-black opacity-80",children:"student"===e.role?`年級 ${e.grade}`:`${(0,a.getRoleLabel)(e.role)}模式`}),(0,t.jsx)("strong",{className:"mt-1 block text-xl font-black",children:e.name}),(0,t.jsx)("span",{className:"mt-2 block text-sm font-bold opacity-80",children:"student"===e.role?(0,a.getPersonSubtitle)(e):"成人陪伴功能"})]},e.id)})})]}),(0,t.jsxs)("form",{onSubmit:function(t){if(t.preventDefault(),u!==x.loginPin){p(!0),m(`代碼不正確,請確認:${x.loginHint}`),g(""),b.current?.focus();return}e(x.id),p(!1),m(`登入成功,正在載入 ${x.name} 的學習內容。`),window.location.assign(window.location.hostname.endsWith(".static.hf.space")?"/dashboard/index.html":"/dashboard")},className:"flex flex-col justify-center border-t border-white/80 bg-cream/75 p-5 md:p-8 lg:border-l lg:border-t-0 lg:p-10",children:[(0,t.jsxs)("span",{className:"w-fit rounded-full bg-mint px-4 py-2 text-sm font-black text-green-800",children:[(0,a.getRoleLabel)(x.role),"登入"]}),(0,t.jsx)("h2",{className:"mt-4 text-4xl font-black text-ink",children:x.name}),(0,t.jsx)("p",{className:"mt-2 font-bold leading-7 text-stone-500",children:x.loginHint}),(0,t.jsxs)("label",{className:"mt-7 grid gap-2 font-black text-ink",children:["4 位數體驗代碼",(0,t.jsx)("input",{ref:b,type:"password",inputMode:"numeric",autoComplete:"current-password",pattern:"[0-9]*",maxLength:4,value:u,onChange:e=>g(e.target.value.replace(/\D/g,"").slice(0,4)),className:"h-16 w-full rounded-2xl border border-softline bg-white px-5 text-center text-3xl font-black tracking-[0.35em] text-ink outline-none transition focus:border-coral focus:ring-4 focus:ring-coral/10","aria-label":`${x.name} 的 4 位數體驗代碼`,required:!0})]}),(0,t.jsx)("p",{className:`mt-4 rounded-2xl p-4 text-sm font-bold leading-7 ${h?"bg-rose-50 text-rose-900":"bg-green-50 text-green-900"}`,role:"status",children:f}),(0,t.jsxs)("button",{type:"submit",disabled:4!==u.length,className:"mt-5 min-h-14 rounded-2xl bg-coral px-6 py-4 text-lg font-black text-white shadow-warm transition hover:brightness-105 disabled:cursor-not-allowed disabled:opacity-45",children:["登入 ",x.name]})]})]})]})})}])}]);