PageSourceSearch

https://xynergy.ai/_next/static/chunks/app/tools/page-51de07d4fe2cb279.js

js xynergy.ai collected 2026-10-05 16:01:17 UTC 15,713 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3554],{9842:(e,t,r)=>{"use strict";r.d(t,{y:()=>T});var a=r(85047),s=r(77836),i=r(19980),o=r(16635),l=r(75020),d=r(72287),n=r(19726),c=r(17938),u=r(1941),p=r(40975),f=r(33022),m=r(79434),b=r(99307),g=r(61414);let h=[{id:"irr-calculator",title:"IRR 計算機",description:"依不規則日期現金流計算內部報酬率(XIRR),評估投資或專案報酬",details:"支援簡化試算與進階現金流表格,以 ACT/365 年化,結果對齊 Excel XIRR",icon:s.A,publicPath:"/tools/irr-calculator",requiresAuth:!1,badge:"新功能",status:"active"},{id:"break-even",title:"損益試算",description:"試算損益平衡所需月/日銷量與營業額,評估固定與變動成本結構",details:"輸入售價、單位變動成本、各項月固定費用與初期投入攤銷年數,計算零銷量月虧損、月/日損益平衡銷量與營業額",icon:i.A,publicPath:"/tools/break-even",requiresAuth:!1,status:"active"},{id:"leverage-calculator",title:"槓桿投資安全水位",description:"估算槓桿投資的維持率、最大可承受跌幅與借款成本覆蓋",details:"輸入自備款、借款金額、利率與預期報酬,並用滑桿做敏感度分析,快速掌握安全水位",icon:o.A,publicPath:"/tools/leverage-calculator",requiresAuth:!1,status:"active"},{id:"dca-calculator",title:"定期定額投資試算",description:"計算定期定額投資的未來價值和報酬,幫助您規劃長期投資策略",details:"輸入每月投入金額、投資期間和預期報酬率,即可查看投資成長趨勢和最終收益",icon:l.A,publicPath:"/tools/dca-calculator",requiresAuth:!1,status:"active"},{id:"compound",title:"複利計算機",description:"計算複利投資的未來價值,支援多種計算模式和情境比較",details:"支援計算未來價值、本金、利率或時間,並可比較不同利率情境的投資結果",icon:d.A,publicPath:"/tools/compound",requiresAuth:!1,status:"active"},{id:"labor-insurance",title:"勞保試算",description:"試算勞保老年給付,可帶入退休規劃",details:"輸入薪資、投保類別與年資,計算老年年金/一次金與一次請領;登入後可帶入勞保月領至退休規劃",icon:n.A,publicPath:"/tools/labor-insurance",requiresAuth:!1,status:"active"},{id:"labor-pension",title:"勞退試算",description:"試算勞退新制退休金,可帶入退休規劃",details:"輸入月薪、年資與提撥條件,計算月提繳、專戶餘額與月退;登入後可帶入勞退月退至退休規劃",icon:c.A,publicPath:"/tools/labor-pension",requiresAuth:!1,status:"active"},{id:"loan",title:"貸款試算器",description:"計算貸款還款計劃和總利息,支援多種還款方式和進階功能",details:"支援房貸、車貸、信貸,提供本息平均攤還和本金平均攤還兩種還款方式,並可計算提前還款和利率變動",icon:u.A,publicPath:"/tools/loan",requiresAuth:!1,status:"active"},{id:"credit-cards",title:"信用卡管理",description:"管理您的信用卡資訊、優惠活動和繳款提醒",details:"記錄信用卡資訊、追蹤優惠活動,並設定繳款日提醒,避免忘記繳款",icon:p.A,publicPath:"/tools/credit-cards",requiresAuth:!0,status:"active"},{id:"fire-calculator",title:"FIRE 財務自由計算機",description:"計算達到財務自由所需的時間、資產和儲蓄計劃",details:"支援 Lean、Regular、Fat、Coast、Barista 等各種 FIRE 類型試算",icon:f.A,publicPath:"/tools/fire-calculator",requiresAuth:!1,status:"active"},{id:"education-fund",title:"子女教育基金規劃",description:"計算子女教育費用,規劃教育基金投資策略,支援多子女、多階段規劃",details:"支援多種計算模式、多子女規劃、階段式教育費用設定,並可儲存為財務目標",icon:m.A,publicPath:"/tools/education-fund",requiresAuth:!1,status:"active"},{id:"report",title:"財務報告生成",description:"透過可配置的圖表、指標與文件卡片,快速輸出易於分享的財務報告檔案",details:"選擇圖表、財務指標和文件,生成專業的財務報告 PDF,方便與顧問或家人分享",icon:b.A,publicPath:"/tools/report",requiresAuth:!0,status:"renovating",badge:"翻新中"},{id:"budget-planner",title:"預算規劃表",description:"基於年度總收入,智能規劃各項支出的預算分配和百分比",details:"設定年度總收入後,系統自動計算各分類預算的金額與百分比,並以圓餅圖視覺化顯示",icon:g.A,publicPath:"/tools/budget-planner",requiresAuth:!1,status:"active"},{id:"insurance-needs",title:"保障需求分析",description:"透過引導式問卷分析醫療與壽險的保障ç¼
1ºå£ï¼Œç”¢å‡ºå»ºè­°ä¿é¡",details:"依年齡、家庭與收入等問卷,計算住院日額、實支實付、壽險缺口等建議保額;登入後可帶入收入並將結果儲存至保險規劃",icon:n.A,publicPath:"/tools/insurance-needs",requiresAuth:!1,badge:"新功能",status:"active"}];var x=r(26052),v=r.n(x),y=r(46377),k=r(31615),A=r(82520),N=r(38187),w=r(41178),j=r(46711);let _=["from-sky-500 to-violet-500","from-violet-500 to-fuchsia-500","from-fuchsia-500 to-rose-500","from-rose-500 to-amber-500","from-amber-500 to-sky-500"];function R({tool:e,isAuthenticated:t,isAdmin:r=!1}){let{toast:s}=(0,w.dj)(),i=(0,y.useRouter)(),o="renovating"===e.status,l=!("active"===e.status||o&&r),d=e.requiresAuth&&!t,n=d?`/auth?redirect=${encodeURIComponent(e.publicPath)}`:e.publicPath,c=(0,k.useMemo)(()=>_[function(e){let t=0;for(let r=0;r<e.length;r++)t+=e.charCodeAt(r);return t%_.length}(e.id)],[e.id]),u=e.icon,p=(0,a.jsxs)(A.Zp,{className:`relative h-full min-h-[9rem] overflow-hidden rounded-2xl border transition-all duration-200 ${l?"cursor-not-allowed border-border opacity-50":"cursor-pointer border-white/[0.08] bg-gradient-to-br from-card/95 to-card/60 shadow-sm backdrop-blur-sm hover:-translate-y-0.5 hover:border-white/15 hover:shadow-xl"}`,children:[(0,a.jsx)("div",{className:`pointer-events-none absolute inset-y-0 left-0 w-1 bg-gradient-to-b ${c} opacity-90`,"aria-hidden":!0}),e.badge&&(0,a.jsx)("div",{className:"absolute right-3 top-3 z-10",children:(0,a.jsx)(N.E,{className:o?"border-zinc-400/30 bg-zinc-500/25 text-zinc-50 text-[11px] font-semibold backdrop-blur-sm dark:border-zinc-400/20 dark:bg-zinc-600/30 dark:text-zinc-100":"border-emerald-400/30 bg-emerald-500/25 text-emerald-50 text-[11px] font-semibold backdrop-blur-sm dark:border-emerald-400/25 dark:bg-emerald-600/20 dark:text-emerald-100",children:e.badge})}),(0,a.jsxs)(A.aR,{className:"flex flex-row items-start gap-4 py-5 pl-5 pr-4 sm:gap-5 sm:py-6 sm:pl-6",children:[(0,a.jsx)("div",{className:`mt-0.5 flex h-12 w-12 shrink-0 items-center justify-center rounded-2xl bg-gradient-to-br ${c} p-[1px] shadow-inner`,"aria-hidden":!0,children:(0,a.jsx)("div",{className:"flex h-full w-full items-center justify-center rounded-[0.9rem] bg-background/85 dark:bg-background/80",children:(0,a.jsx)(u,{className:"h-6 w-6 text-foreground"})})}),(0,a.jsxs)("div",{className:"min-w-0 flex-1 space-y-1.5 pr-2 pt-0.5",children:[(0,a.jsx)(A.ZB,{className:"text-lg font-bold leading-snug tracking-tight text-foreground sm:text-xl sm:leading-tight",children:e.title}),(0,a.jsx)(A.BT,{className:"line-clamp-2 text-xs font-normal leading-relaxed text-muted-foreground/90 sm:text-[0.8125rem] sm:leading-snug",children:e.description})]})]})]});return l?p:(0,a.jsx)(v(),{href:n,onClick:t=>{l?t.preventDefault():((0,j.kC)(e.id,e.title),d&&(t.preventDefault(),i.push(`/auth?redirect=${encodeURIComponent(e.publicPath)}`),s({title:"需要登入",description:"此工具需要登入後才能使用,請先登入您的帳號",variant:"default"})))},className:"group block rounded-2xl focus:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:ring-offset-background",children:p})}function T({isAuthenticated:e,showAuthRequired:t=!0,isAdmin:r=!1}){let s=function(e){let t=[],r=[];for(let a of e)"新功能"===a.badge?t.push(a):r.push(a);return[...t,...r]}(t?h:h.filter(t=>!t.requiresAuth||e));return(0,a.jsx)("div",{className:"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 md:gap-8",children:s.map(t=>(0,a.jsx)(R,{tool:t,isAuthenticated:e,isAdmin:r},t.id))})}},14985:(e,t,r)=>{Promise.resolve().then(r.bind(r,17231))},17231:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>c});var a=r(85047),s=r(90930),i=r(44251),o=r(9842),l=r(26499),d=r(73521),n=r(39461);function c(){let{user:e}=(0,d.A)(),{isAdmin:t}=(0,n.q)();return(0,a.jsxs)("div",{className:"relative flex min-h-screen flex-col overflow-hidden",children:[(0,a.jsx)(l.J,{}),(0,a.jsxs)("div",{className:"relative z-10 flex flex-1 flex-col",children:[(0,a.jsx)(s.R,{}),(0,a.jsx)("main",{className:"flex-1",children:(0,a.jsx)("div",{className:"container mx-auto py-12 px-4 md:py-16",children:(0,a.jsxs)("div",{className:"space-y-10",children:[(0,a.jsxs)("header",{className:"space-y-2",children:[(0,a.jsx)("h1",{className:"text-3xl font-bold bg-gradient-to-r from-sky-600 via-violet-600 to-rose-600 bg-clip-text text-transparent dark:from-sky-300 dark:via-violet-300 dark:to-rose-300",children:"工具"}),(0,a.jsx)("p",{className:"text-muted-foreground",children:"理財試算與規劃工具"}),(0,a.jsx)("div",{className:"h-0.5 w-12 rounded-full bg-gradient-to-r from-sky-500 via-violet-500 to-rose-500","aria-hidden":!0})]}),(0,a.jsx)(o.y,{isAuthenticated:!!e,showAuthRequired:!0,isAdmin:t})]})})}),(0,a.jsx)(i.r,{})]})]})}},26499:(e,t,r)=>{"use strict";r.d(t,{J:()=>i});var a=r(85047),s=r(34961);function i({className:e}){return(0,a.jsxs)("div",{className:(0,s.cn)("absolute inset-0 -z-10",e),children:[(0,a.jsx)("div",{className:"h-full w-full bg-gradient-to-b from-background via-slate-100/30 to-background dark:from-background dark:via-slate-950/45 dark:to-background"}),(0,a.jsx)("div",{className:"absolute -right-44 -top-44 h-[44rem] w-[44rem] rounded-full bg-sky-4
100/20 blur-[120px] dark:bg-sky-500/12"}),(0,a.jsx)("div",{className:"absolute -bottom-52 -left-52 h-[48rem] w-[48rem] rounded-full bg-violet-400/18 blur-[130px] dark:bg-violet-500/12"}),(0,a.jsx)("div",{className:"absolute left-[16%] top-[18%] h-[34rem] w-[34rem] rounded-[5rem] bg-rose-400/14 blur-[110px] dark:bg-rose-500/10"}),(0,a.jsx)("div",{className:"absolute inset-0 opacity-[0.14] dark:opacity-[0.10] bg-[linear-gradient(115deg,transparent_0%,rgba(255,255,255,0.22)_34%,transparent_72%)]"}),(0,a.jsx)("div",{className:"absolute inset-0 opacity-[0.10] dark:opacity-[0.08] bg-[radial-gradient(circle_at_12%_10%,rgba(255,255,255,0.18),transparent_45%),radial-gradient(circle_at_82%_0%,rgba(255,255,255,0.12),transparent_52%),radial-gradient(circle_at_55%_96%,rgba(255,255,255,0.10),transparent_56%)]"}),(0,a.jsx)("div",{className:"absolute inset-0 opacity-[0.10] dark:opacity-[0.07] bg-[repeating-linear-gradient(0deg,rgba(255,255,255,0.08)_0px,rgba(255,255,255,0.08)_1px,transparent_1px,transparent_6px)]"})]})}},38187:(e,t,r)=>{"use strict";r.d(t,{E:()=>d});var a=r(85047),s=r(31615),i=r(63610),o=r(34961);let l=(0,i.F)("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground hover:bg-primary/80",secondary:"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",destructive:"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",outline:"text-foreground"}},defaultVariants:{variant:"default"}}),d=s.forwardRef(({className:e,variant:t,...r},s)=>(0,a.jsx)("div",{ref:s,className:(0,o.cn)(l({variant:t}),e),...r}));d.displayName="Badge"},39461:(e,t,r)=>{"use strict";r.d(t,{q:()=>d});var a=r(31615),s=r(73521),i=r(18654),o=r(24571),l=r(76458);function d(){let{user:e,loading:t}=(0,s.A)(),[d,n]=(0,a.useState)(!1),[c,u]=(0,a.useState)(!0),[p,f]=(0,a.useState)(null),m=(0,a.useCallback)(async()=>{if(!e)return n(!1),u(!1),!1;try{u(!0),f(null);try{let t=await (await Promise.resolve().then(r.bind(r,30274))).getIdTokenResult(e,!0),a=(t?.claims||{}).role;if(void 0!==a&&("admin"===a||!0===a))return n(!0),u(!1),!0}catch{}try{await e.getIdToken(!0)}catch{}if(!l.db)throw Error("Firestore 未初始化");let t=(0,o.doc)(l.db,"users",e.uid),a=await (0,o.getDoc)(t);if(!a.exists()){for(let e=0;e<6&&(await new Promise(e=>setTimeout(e,500)),!(a=await (0,o.getDoc)(t)).exists());e++);if(!a.exists())throw Error("用戶資料不存在")}let s=a.data(),i=s?.role,d="string"==typeof i?i.toLowerCase().trim():!0===i?"admin":"user",c="admin"===d;return n(c),u(!1),c}catch(e){return(0,i.vV)("檢查管理員權限錯誤:",e),f(e.message||"權限檢查失敗"),n(!1),u(!1),!1}},[e]);return(0,a.useEffect)(()=>{t||(e?m():(n(!1),u(!1),f(null)))},[e,t,m]),{isAdmin:d,isLoading:c,error:p,checkPermission:m}}},41178:(e,t,r)=>{"use strict";r.d(t,{dj:()=>f});var a=r(31615),s=r(28979),i=r(8958);let o=0,l=new Map,d=e=>{if(l.has(e))return;let t=setTimeout(()=>{l.delete(e),u({type:"REMOVE_TOAST",toastId:e})},3e3);l.set(e,t)},n=[],c={toasts:[]};function u(e){c=((e,t)=>{switch(t.type){case"ADD_TOAST":return{...e,toasts:[t.toast,...e.toasts].slice(0,1)};case"UPDATE_TOAST":return{...e,toasts:e.toasts.map(e=>e.id===t.toast.id?{...e,...t.toast}:e)};case"DISMISS_TOAST":{let{toastId:r}=t;return r?d(r):e.toasts.forEach(e=>{d(e.id)}),{...e,toasts:e.toasts.map(e=>e.id===r||void 0===r?{...e,open:!1}:e)}}case"REMOVE_TOAST":if(void 0===t.toastId)return{...e,toasts:[]};return{...e,toasts:e.toasts.filter(e=>e.id!==t.toastId)}}})(c,e),n.forEach(e=>{e(c)})}function p({...e}){var t;let r,a=(o=(o+1)%Number.MAX_VALUE).toString(),l=()=>u({type:"DISMISS_TOAST",toastId:a});return t=e.variant,r=function(){try{let e=localStorage.getItem(i.RZ);if(e){let t=JSON.parse(e);return{enabled:t.enabled??i.wK.enabled,categories:{alerts:t.categories?.alerts??i.wK.categories.alerts,tasks:t.categories?.tasks??i.wK.categories.tasks},volume:t.volume??i.wK.volume}}}catch(e){}return i.wK}(),"destructive"===t&&s.jY.playSound("ERROR",r).catch(()=>{}),u({type:"ADD_TOAST",toast:{...e,id:a,open:!0,onOpenChange:e=>{e||l()}}}
1),{id:a,dismiss:l,update:e=>u({type:"UPDATE_TOAST",toast:{...e,id:a}})}}function f(){let[e,t]=a.useState(c);return a.useEffect(()=>(n.push(t),()=>{let e=n.indexOf(t);e>-1&&n.splice(e,1)}),[e]),{...e,toast:p,dismiss:e=>u({type:"DISMISS_TOAST",toastId:e})}}},82520:(e,t,r)=>{"use strict";r.d(t,{BT:()=>n,Wu:()=>c,ZB:()=>d,Zp:()=>o,aR:()=>l,wL:()=>u});var a=r(85047),s=r(31615),i=r(34961);let o=s.forwardRef(({className:e,...t},r)=>(0,a.jsx)("div",{ref:r,className:(0,i.cn)("rounded-xl border bg-card text-card-foreground shadow",e),...t}));o.displayName="Card";let l=s.forwardRef(({className:e,...t},r)=>(0,a.jsx)("div",{ref:r,className:(0,i.cn)("flex flex-col space-y-1.5 p-6",e),...t}));l.displayName="CardHeader";let d=s.forwardRef(({className:e,...t},r)=>(0,a.jsx)("h3",{ref:r,className:(0,i.cn)("font-semibold leading-none tracking-tight",e),...t}));d.displayName="CardTitle";let n=s.forwardRef(({className:e,...t},r)=>(0,a.jsx)("p",{ref:r,className:(0,i.cn)("text-sm text-muted-foreground",e),...t}));n.displayName="CardDescription";let c=s.forwardRef(({className:e,...t},r)=>(0,a.jsx)("div",{ref:r,className:(0,i.cn)("p-6 pt-0",e),...t}));c.displayName="CardContent";let u=s.forwardRef(({className:e,...t},r)=>(0,a.jsx)("div",{ref:r,className:(0,i.cn)("flex items-center p-6 pt-0",e),...t}));u.displayName="CardFooter"}},e=>{e.O(0,[6062,8721,2811,6277,274,9291,6052,7629,5418,7355,8133,8594,6821,6620,2931,5120,3787,6162,4498,972,5035,3118,1936,7358],()=>e(e.s=14985)),_N_E=e.O()}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.