PageSourceSearch

https://taskudos.net/assets/index-D9-csJG3.js

js taskudos.net collected 2026-10-02 01:05:29 UTC 312,849 bytes, 24 lines download raw bytes

1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/TourButton-1fv1wiBj.js","assets/data-vendor-BbRRaOei.js","assets/react-vendor-CTMQ6zmr.js","assets/useOnboardingTour-DlyS0UpO.js","assets/firebase-auth-D9FSLi8g.js","assets/i18n-vendor-BcG5Fkkq.js","assets/ui-vendor-B6XsRz8N.js","assets/swipe-vendor-Du95hpjX.js","assets/tw-merge-C6Cmh_M-.js","assets/firebase-app-DUOH9wz5.js","assets/animation-vendor-C5eF-vcf.js","assets/CommandPalette-CXx9vHx3.js","assets/CookieConsentBanner-wLdz1-Tj.js","assets/GuestModeIndicator-D0bDjE5m.js","assets/GuestLimitModal-BRPMI3uX.js","assets/GuestExitDialog-0zvgjjwJ.js","assets/OnboardingTour-BQgT3Aii.js","assets/colors-DGAPE9IX.js","assets/GlobalAIButton-Wu-ukxTs.js","assets/useAgents-CJflCF9x.js","assets/SwipeableSheet-Bzrz8lAZ.js","assets/aiRoleStore-nWSrIASY.js","assets/InstallBanner-DkFS5q-9.js","assets/useInstallPrompt-CDp0NHEa.js","assets/OfflineIndicator-CcdI5_g0.js","assets/BiometricGuard-6r3_1q7H.js","assets/HomePage-1_jyebgH.js","assets/FloatingActionButton-DuPZlTIJ.js","assets/TaskForm-DtCct5Tj.js","assets/form-vendor-pph_JIdS.js","assets/zod-DYnmGfkv.js","assets/useGuestLimitModal-C7VtPVR4.js","assets/Switch-CEUQgi7r.js","assets/useUserGjRecords-DBx36rsR.js","assets/gjTimelineApi-Crc9QceD.js","assets/useRebrandFlag-4_uZpou3.js","assets/useCurrentPlan-CD5hKTRu.js","assets/ModalBackdrop-Cyk1hNBh.js","assets/api-Crdv-87I.js","assets/TasksPage-D1bDyTow.js","assets/ConfirmDialog-D5Eksbys.js","assets/ScopeBadge-DVuNaVC6.js","assets/BaseModal-Cen7YaUK.js","assets/DueDateBadge-G_NFUuJP.js","assets/useGroupMembers-DFLrqv1M.js","assets/useCategories-Cu6zRpPM.js","assets/useGuestTaskStore-CsxgWTGe.js","assets/TaskDetailPage-BTX0T5k2.js","assets/DayView-Db9UdJYf.js","assets/ja-DTANkwTE.js","assets/DayView-DEpV2Nr3.css","assets/KanbanPage-CW0bpZ45.js","assets/TaskAffiliationBadge-DKKY_fQd.js","assets/CalendarPage-D1kfnG6f.js","assets/SettingsPage-BSfzD4Ti.js","assets/LoginPage-Br9xExEO.js","assets/SocialAuthButtons-D91p4OQO.js","assets/SignupPage-Ao7I3MdY.js","assets/PasswordRequirements-CztzOHOs.js","assets/GroupsPage-CLrB58Qi.js","assets/InviteShareButton-Do8epWlz.js","assets/useClipboard-DK-KHT8B.js","assets/CreateGroupPage-BD6BdHIO.js","assets/GroupDetailPage-cyzYO8bj.js","assets/GroupSettingsPage-Crk4xCEf.js","assets/ImageUploader-Cy2MQg9a.js","assets/TaskSettingsPage-D3fu2I_-.js","assets/CreateTaskPage-BqIah524.js","assets/MemoTaskPage-BnvM2KiM.js","assets/CategoriesPage-BzbIAE-h.js","assets/LandingPage-CH3Mog2H.js","assets/InvitePage-BaiRQfYr.js","assets/MemberCapDialog-DlEtWdel.js","assets/HelpPage-UTRFk0xF.js","assets/FeedbackPage-BK090UXK.js","assets/AdminFeedbackPage-wUrfX8hU.js","assets/AdminAccessGuard-BaBM3F4D.js","assets/AdminWhitelistPage-BrPpGRHj.js","assets/ForgotPasswordPage-D9mObJGn.js","assets/ResetPasswordPage-DvJGhcUd.js","assets/VerifyEmailPage-R09MTD6a.js","assets/NotificationsPage-CjI5p7du.js","assets/formatDistanceToNow-C-wL0EQ0.js","assets/GroupInvitePage-T1S8mUo5.js","assets/InviteAcceptPage-DFKQW5PP.js","assets/TermsPage-CLpzb-b-.js","assets/markdownParser-C17hY2A0.js","assets/PrivacyPolicyPage-CjTQAWwQ.js","assets/TokushohoPage-RGgJ7tgx.js","assets/TrashPage-B9R2cxHz.js"])))=>i.map(i=>d[i]);
2var In=Object.defineProperty;var An=(e,t,n)=>t in e?In(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var he=(e,t,n)=>An(e,typeof t!="symbol"?t+"":t,n);import{Q as Sn,c as re,p as ue,a as Tt,u as V,b as It,d as me,j as a,e as Cn}from"./data-vendor-BbRRaOei.js";import{e as En,g as Pn,a as c,R as At,b as St,u as oe,f as pe,L as Ct,O as Dn,N as Z,h as jn,i as Ln,j as He,k as Rn,l as Nn}from"./react-vendor-CTMQ6zmr.js";import{u as $e}from"./swipe-vendor-Du95hpjX.js";import{z as Le,P as Et,L as Pt,T as _n,U as Mn,S as we,C as Dt,E as Fn,B as Gn,a as jt,b as On,M as Lt,X as Re,c as Un,d as Bn,e as Wn,f as Vn,g as qn,H as Rt,h as Kn,i as zn,j as Hn,k as $n,l as Jn,m as Nt,R as Yn,I as Qn,n as Xn,o as Zn,w as ea,p as ta}from"./ui-vendor-B6XsRz8N.js";import{t as na}from"./tw-merge-C6Cmh_M-.js";import{q as aa,s as sa,G as ra,t as oa,u as Oe,O as ia,v as Ie,w as tt,x as la,y as Ue,z as Be,A as ca,B as _t,D as nt,H as at,I as da,J as ua,K as st,M as ma,N as pa,P as Mt}from"./firebase-auth-D9FSLi8g.js";import{g as ga,h as Ft}from"./firebase-functions-w4CkjSCL.js";import"./firebase-app-DUOH9wz5.js";import{initializeFirestore as fa,persistentLocalCache as ha,persistentSingleTabManager as ya,persistentMultipleTabManager as ba,doc as E,setDoc as xa,serverTimestamp as ee,increment as ka,collection as N,query as G,where as M,getCountFromServer as Je,getDoc as ve,Timestamp as P,addDoc as Ne,waitForPendingWrites as Gt,updateDoc as te,deleteDoc as Ot,limit as ne,getDocs as Y,documentId as Ut,writeBatch as ge,orderBy as Bt,onSnapshot as Wt,arrayUnion as wa}from"./firebase-firestore-Ql9DxvAQ.js";import{g as va}from"./firebase-storage-BoKl8lfL.js";import{i as _,u as C,B as Ta,a as Ia}from"./i18n-vendor-BcG5Fkkq.js";import{D as Aa,a as Sa}from"./dnd-vendor-CBnHgLcf.js";import{A as Ca,m as Ea,L as Pa,d as Da}from"./animation-vendor-C5eF-vcf.js";var Ae={},rt;function ja(){if(rt)return Ae;rt=1;var e=En();return Ae.createRoot=e.createRoot,Ae.hydrateRoot=e.hydrateRoot,Ae}var La=ja();const Ra=Pn(La),Vt=new Sn({defaultOptions:{queries:{staleTime:300*1e3,gcTime:600*1e3,retry:2,refetchOnWindowFocus:!1,refetchOnReconnect:!0},mutations:{retry:1}}}),Na=(function(){const t=typeof document<"u"&&document.createElement("link").relList;return t&&t.supports&&t.supports("modulepreload")?"modulepreload":"preload"})(),_a=function(e){return"/"+e},ot={},k=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){let i=function(u){return Promise.all(u.map(p=>Promise.resolve(p).then(m=>({status:"fulfilled",value:m}),m=>({status:"rejected",reason:m}))))};document.getElementsByTagName("link");const l=document.querySelector("meta[property=csp-nonce]"),d=(l==null?void 0:l.nonce)||(l==null?void 0:l.getAttribute("nonce"));r=i(n.map(u=>{if(u=_a(u),u in ot)return;ot[u]=!0;const p=u.endsWith(".css"),m=p?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${m}`))return;const g=document.createElement("link");if(g.rel=p?"stylesheet":Na,p||(g.as="script"),g.crossOrigin="",g.href=u,d&&g.setAttribute("nonce",d),document.head.appendChild(g),p)return new Promise((h,f)=>{g.addEventListener("load",h),g.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${u}`)))})}))}function o(i){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=i,window.dispatchEvent(l),!l.defaultPrevented)throw i}return r.then(i=>{for(const l of i||[])l.status==="rejected"&&o(l.reason);return t().catch(o)})},ae=e=>{Le.success(e,{duration:3e3,position:"bottom-center"})},le=e=>{Le.error(e,{duration:4e3,position:"bottom-center"})},Ma=e=>{Le(e,{icon:"⚠️",duration:3500,position:"bottom-center"})},Fa=e=>{Le(e,{icon:"ℹ️",duration:3e3,position:"bottom-center"})};function qt(e){var t,n,s="";if(typeof e=="string"||typeof e=="number")s+=e;else if(typeof e=="object")if(Array.isArray(e)){var r=e.length;for(t=0;t<r;t++)e[t]&&(n=qt(e[t]))&&(s&&(s+=" "),s+=n)}else for(n in e)e[n]&&(s&&(s+=" "),s+=n);return s}function Ga(){for(var e,t,n=0,s="",r=arguments.length;n<r;n++)(e=arguments[n])&&(t=qt(e))&&(s&&(s+=" "),s+=t);return s}function w(...e){return na(Ga(e))}const Oa=!1,Ua=(()=>{var e,t;try{if(typeof window>"u")return!1;const n="standalone"in window.navigator&&window.navigator.standalone===!0,s=(t=(e=window.matchMedia)==null?void 0:e.call(window,"(display-mode: standalone)"))==null?void 0:t.matches;return n||s}catch{return!1}})(),Ba=(()=>{try{if(typeof window>"u"||Oa)return!1;const e=window.navigator.userAgent,t=/iPad|iPhone|iPod/.test(e)||e.includes("Mac")&&"ontouchend"in document,n=/Safari/.test(e)&&!/Chrome|CriOS|FxiOS/.test(e);return t&&n}catch{return!1}})(),Dl=Ua&&Ba,Wa={apiKey:"AIzaSyCnl0HdZB5ECjR2f2Yzz_NNyzzxvpH3qlg",authDomain:"taskudos.net",projectId:"taskudos-ai",storageBucket:"taskudos-ai.firebasestorage.app",messagingSenderId:"86583210446",appId:"1:86583210446:web:428e08684ff9ce17783b9f"},_e=aa(Wa);var Ee,vt;const Va=typeof window<"u"&&((vt=(Ee=window.Capacitor)==null?void 0:Ee.isNativePlatform)==null?void 0:vt.call(Ee))===!0,I=sa(_e);I.languageCode="ja";const x=fa(_e,{localCache:ha({tabManager:Va?ya(void 0):ba()})}),jl=va(_e),Kt=ga(_e,"asia-northeast1");async function B(e){try{return(await Ft(Kt,"logAuditEvent")(e)).data}catch(t){return console.error("Failed to log audit event:",t),{success:!1}}}const ie={login:()=>B({action:"user.login"}),logout:()=>B({action:"user.logout"}),passwordChange:()=>B({action:"user.password_change"}),teamCreate:(e,t)=>
2B({action:"team.create",targetType:"team",targetId:e,details:{teamName:t}}),teamUpdate:(e,t)=>B({action:"team.update",targetType:"team",targetId:e,details:t}),memberAdd:(e,t)=>B({action:"team.member_add",targetType:"team",targetId:e,details:{memberId:t}}),memberRemove:(e,t)=>B({action:"team.member_remove",targetType:"team",targetId:e,details:{memberId:t}}),taskCreate:(e,t)=>B({action:"task.create",targetType:"task",targetId:e,details:{taskTitle:t}}),taskStatusChange:(e,t,n)=>B({action:"task.status_change",targetType:"task",targetId:e,details:{fromStatus:t,toStatus:n}}),fileUpload:(e,t)=>B({action:"file.upload",targetType:"file",details:{fileName:e,fileSize:t}}),dataExport:e=>B({action:"data.export",details:{taskCount:e}}),dataImport:e=>B({action:"data.import",details:{taskCount:e}})};class qa{constructor(){he(this,"listeners",new Map)}registerListener(t,n){this.listeners.has(t)&&this.unregisterListener(t),this.listeners.set(t,n)}unregisterListener(t){const n=this.listeners.get(t);if(n){try{n()}catch(s){console.warn(`[ListenerManager] Failed to unsubscribe listener "${t}":`,s)}this.listeners.delete(t)}}unregisterAll(){const t=this.listeners.size;this.listeners.forEach((n,s)=>{try{n()}catch(r){console.warn(`[ListenerManager] Failed to unsubscribe listener "${s}":`,r)}}),this.listeners.clear(),t>0&&console.info(`[ListenerManager] Unregistered ${t} listener(s)`)}getActiveListenerCount(){return this.listeners.size}}const Ka=new qa,Me=re()(ue(e=>({selectedGroupId:null,setSelectedGroupId:t=>e({selectedGroupId:t}),clearSelectedGroup:()=>e({selectedGroupId:null})}),{name:"group-storage"})),za=(()=>{const e=new Map;return{getItem:t=>e.get(t)??null,setItem:(t,n)=>e.set(t,n),removeItem:t=>e.delete(t)}})();function Ha(){return typeof window<"u"&&window.sessionStorage?window.sessionStorage:za}const $a=re()(ue(e=>({currentGroupId:null,currentTaskId:null,setContext:({groupId:t,taskId:n})=>e(s=>({currentGroupId:t!==void 0?t:s.currentGroupId,currentTaskId:n!==void 0?n:s.currentTaskId})),clearContext:()=>e({currentGroupId:null,currentTaskId:null}),setGroup:t=>e({currentGroupId:t,currentTaskId:null}),setTask:(t,n)=>e(s=>({currentGroupId:n!==void 0?n:s.currentGroupId,currentTaskId:t}))}),{name:"app-context-store",storage:Tt(()=>Ha())})),Ja=re((e,t)=>({teamUnreadCounts:{},taskUnreadCounts:{},incrementUnread:(n,s)=>{e(r=>{const o=`${n}UnreadCounts`,i=r[o][s]||0;return{[o]:{...r[o],[s]:i+1}}})},decrementUnread:(n,s)=>{e(r=>{const o=`${n}UnreadCounts`,i=r[o][s]||0,l=Math.max(0,i-1);return{[o]:{...r[o],[s]:l}}})},setUnreadCount:(n,s,r)=>{e(o=>{const i=`${n}UnreadCounts`;return{[i]:{...o[i],[s]:Math.max(0,r)}}})},getUnreadCount:(n,s)=>{const r=t(),o=`${n}UnreadCounts`;return r[o][s]||0},clearUnread:(n,s)=>{e(r=>{const o=`${n}UnreadCounts`;return{[o]:{...r[o],[s]:0}}})},resetAll:()=>{e({teamUnreadCounts:{},taskUnreadCounts:{}})}})),Ya=["team-storage","app-context-store","wallpaper-storage","ai-settings","byoai-config","onboarding-completed","guide-dismissed"],Qa=["app-context-store"];function Xa(){Ka.unregisterAll(),Vt.clear(),Za(),es(),ts(),console.info("[SessionCleanup] Session data cleared successfully")}function Za(){Me.getState().clearSelectedGroup(),$a.getState().clearContext(),Ja.getState().resetAll()}function es(){try{Ya.forEach(e=>{localStorage.removeItem(e)})}catch(e){console.warn("[SessionCleanup] localStorage cleanup failed:",e)}}function ts(){try{Qa.forEach(e=>{sessionStorage.removeItem(e)})}catch(e){console.warn("[SessionCleanup] sessionStorage cleanup failed:",e)}}const ce=new ra;ce.addScope("profile");ce.addScope("email");ce.setCustomParameters({prompt:"select_account"});const ns=()=>typeof window>"u"?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),it=()=>!!ns();function as(){return c.useEffect(()=>{let s=!1;return(async()=>{try{const o=await oa(I);if(s)return;o!=null&&o.user&&(ie.login(),window.location.href="/")}catch(o){if(s)return;if(o&&typeof o=="object"&&"code"in o){const i=o.code;switch(i){case"auth/popup-closed-by-user":case"auth/cancelled-popup-request":break;case"auth/popup-blocked":break;case"auth/network-request-failed":console.error("[useLogin] Network error during auth");break;default:console.error("[useLogin] Redirect result error:",i)}}else console.error("[useLogin] Redirect result error:",o)}})(),()=>{s=!0}},[]),{login:async(s,r,o=!0)=>{await Oe(I,o?Ue:Be);const l=la(I,s,r),d=new Promise((u,p)=>setTimeout(()=>p(new Error("Login timeout - Firebase接続に失敗")),15e3));await Promise.race([l,d]),ie.login()},signInWithGoogle:async(s=!0)=>
2{if(await Oe(I,s?Ue:Be),it())return await Ie(I,ce),null;try{const o=await tt(I,ce);return ie.login(),o.user}catch(o){if(o&&typeof o=="object"&&"code"in o&&o.code==="auth/popup-blocked")return console.warn("[useLogin] Popup blocked, falling back to redirect"),await Ie(I,ce),null;throw o}},signInWithApple:async(s=!0)=>{await Oe(I,s?Ue:Be);const o=new ia("apple.com");if(o.addScope("email"),o.addScope("name"),it())return await Ie(I,o),null;try{const i=await tt(I,o);return ie.login(),i.user}catch(i){if(i&&typeof i=="object"&&"code"in i){const l=i.code;if(l==="auth/popup-closed-by-user")throw i;if(l==="auth/popup-blocked")return console.warn("[useLogin] Popup blocked for Apple, falling back to redirect"),await Ie(I,o),null}throw console.error("Apple Sign-In error:",i),new Error("Appleでのログインに失敗しました")}}}}function ss(){return{signup:async(t,n)=>{const s=await ca(I,t,n);let r=!0;try{await _t(s.user,{url:`${window.location.origin}/verify-email`,handleCodeInApp:!1})}catch(o){r=!1,console.warn("[useSignup] verification email send failed, will retry on verify page:",o)}return{user:s.user,verificationEmailSent:r}}}}function rs(e){return{updateDisplayName:async o=>{if(!I.currentUser)throw new Error("ユーザーがログインしていません");await st(I.currentUser,{displayName:o}),await I.currentUser.reload(),e==null||e()},updatePhotoURL:async o=>{if(!I.currentUser)throw new Error("ユーザーがログインしていません");await st(I.currentUser,{photoURL:o}),await I.currentUser.reload(),e==null||e()},changePassword:async(o,i)=>{if(!I.currentUser||!I.currentUser.email)throw new Error("ユーザーがログインしていません");const l=nt.credential(I.currentUser.email,o);await at(I.currentUser,l),await ua(I.currentUser,i),ie.passwordChange()},deleteAccount:async o=>{if(!I.currentUser||!I.currentUser.email)throw new Error("ユーザーがログインしていません");const i=nt.credential(I.currentUser.email,o);await at(I.currentUser,i),await da(I.currentUser)}}}function os(){return{resendVerificationEmail:async()=>{if(!I.currentUser)throw new Error("ユーザーがログインしていません");await _t(I.currentUser,{url:`${window.location.origin}/verify-email`,handleCodeInApp:!1})},sendPasswordReset:async n=>{const s={url:`${window.location.origin}/reset-password`,handleCodeInApp:!0};await ma(I,n,s)}}}const is=Ft(Kt,"updateLoginStreak");function J(){const[e,t]=c.useState(null),[n,s]=c.useState(!0),r=c.useRef(!1);c.useEffect(()=>{const v=setTimeout(()=>{s(!1)},5e3),T=pa(I,R=>{clearTimeout(v),t(R),s(!1),R&&!r.current&&(r.current=!0,is().catch(()=>{})),R||(r.current=!1)});return()=>{clearTimeout(v),T()}},[]);const o=c.useCallback(()=>{t(I.currentUser?{...I.currentUser}:null)},[]),{login:i,signInWithGoogle:l,signInWithApple:d}=as(),{signup:u}=ss(),{updateDisplayName:p,updatePhotoURL:m,changePassword:g,deleteAccount:h}=rs(o),{resendVerificationEmail:f,sendPasswordReset:b}=os();return{user:e,loading:n,login:i,signup:u,signInWithGoogle:l,signInWithApple:d,logout:async()=>{await ie.logout(),Xa(),await Mt(I)},resendVerificationEmail:f,sendPasswordReset:b,updateDisplayName:p,updatePhotoURL:m,changePassword:g,deleteAccount:h,isPasswordUser:()=>e?e.providerData.some(v=>v.providerId==="password"):!1}}const W={USERS:"users",TEAMS:"teams",TASKS:"tasks",CATEGORIES:"categories",AGENTS:"agents",EXECUTIONS:"executions",CONFIG:"config",INVITES:"invites",TEAM_INVITES:"teamInvites",TEAM_MEMBERSHIPS:"teamMemberships",TEAM_USAGE:"teamUsage",USER_OPERATIONS:"userOperations",NOTIFICATIONS:"notifications",FEEDBACK_CHATS:"feedback_chats",WAITLIST:"waitlist"},zt={SETTINGS:"settings",NOTIFICATIONS:"notifications",KUDOS:"kudos",REACTIONS:"reactions",REPLIES:"replies",AUDIT_LOG:"auditLog"},Ht={MAINTENANCE:"maintenance",LIMITS:"limits",REGISTRATION:"registration",WHITELIST:"whitelist",FEATURE_FLAGS:"featureFlags",OPERATION_LIMITS:"operationLimits"},Ll={MFA:"mfa",CONTACT:"contact",ICAL_TOKEN:"icalToken"};function ls(e=new Date){const t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),s=String(e.getDate()).padStart(2,"0"),r=String(e.getHours()).padStart(2,"0");return`${t}${n}${s}${r}`}async function $t(e){const t=ls(),n=`${e}_${t}`,s=E(x,W.USER_OPERATIONS,n);await xa(s,{userId:e,hourKey:t,count:ka(1),lastOperationAt:ee()},{merge:!0})}const Ye=-1,lt={teamsPerUser:1,tasksPerTeam:-1,tasksPerUser:-1};function Jt(e){return e===Ye}const Ve=new Map,cs=1e4;function Yt(e){const t=Ve.get(e);return t&&Date.now()<t.expires?t.count:(t&&Ve.delete(e),null)}function Qt(e,t,n=cs){Ve.set(e,{count:t,expires:Date.now()+n})}function qe(e,t,n){return`${e}:${t}:${n??"null"}`}async function ds(){var n,s;const e=E(x,W.CONFIG,Ht.LIMITS),t=await ve(e);if(t.exists()){const r=t.data();return{free:r.free??lt,pro:r.pro,updatedAt:((s=(n=r.updatedAt)==null?void 0:n.toDate)==null?void 0:s.call(n))??new Date}}return{free:lt,updatedAt:new Date}}async function us(e){const t=E(x,W.USERS,e),n=await ve(t);return n.exists()&&n.data().plan?n.data().plan:{type:"free"}}async function ms(e){try{const t=N(x,W.AGENTS),n=G(t,M("ownerId","==",e));return(await Je(n)).data().count>0}catch{return!1}}
2const ps={teamsPerUser:3,tasksPerTeam:-1,tasksPerUser:-1};async function Xt(e){const t=await ds(),n=await us(e);return await ms(e)&&n.type==="free"?{...ps,...n.customLimits}:{...t[n.type]||t.free,...n.customLimits}}async function gs(e){const t=await Xt(e);if(Jt(t.teamsPerUser))return{allowed:!0,current:0,limit:Ye};const n=qe("team","user",e),s=Yt(n);if(s!==null)return{allowed:s<t.teamsPerUser,current:s,limit:t.teamsPerUser};const r=N(x,W.TEAMS),o=G(r,M("ownerId","==",e)),l=(await Je(o)).data().count;return Qt(n,l),{allowed:l<t.teamsPerUser,current:l,limit:t.teamsPerUser}}async function fs(e,t,n){const s=await Xt(n),r=N(x,W.TASKS);let o,i,l;switch(e){case"team":o=s.tasksPerTeam,l=qe("task","team",t),i=G(r,M("teamId","==",t));break;case"personal":o=s.tasksPerUser,l=qe("task","personal",n),i=G(r,M("createdBy","==",n),M("teamId","==",null));break}if(Jt(o))return{allowed:!0,current:0,limit:Ye};const d=Yt(l);if(d!==null)return{allowed:d<o,current:d,limit:o};const p=(await Je(i)).data().count;return Qt(l,p),{allowed:p<o,current:p,limit:o}}const $="teams";async function hs(e,t,n,s){if(!e.isPersonal){const l=await gs(t);if(!l.allowed)throw new Error(`RESOURCE_LIMIT_REACHED:${_.t("error.group.limitReached",{limit:l.limit})}`)}const r=new Date,o={...e,ownerId:t,members:[{userId:t,email:n,displayName:s||null,role:"owner",joinedAt:P.fromDate(r)}],isPersonal:e.isPersonal??!1,startDate:e.startDate?P.fromDate(e.startDate):null,dueDate:e.dueDate?P.fromDate(e.dueDate):null,createdAt:ee(),updatedAt:ee()},i=await Ne(N(x,$),o);return await Gt(x),await $t(t),{id:i.id,...e,ownerId:t,memberIds:[],members:[{userId:t,email:n,displayName:s,role:"owner",joinedAt:r}],isPersonal:e.isPersonal??!1,startDate:e.startDate,dueDate:e.dueDate,createdAt:r,updatedAt:r}}async function ys(e,t,n){const s={updatedAt:ee()};t.name!==void 0&&(s.name=t.name),t.description!==void 0&&(s.description=t.description),t.startDate!==void 0&&(s.startDate=t.startDate?P.fromDate(t.startDate):null),t.dueDate!==void 0&&(s.dueDate=t.dueDate?P.fromDate(t.dueDate):null),await te(E(x,$,e),s)}async function bs(e,t){await Ot(E(x,$,e))}const De={MESSAGES_DEFAULT:100,MESSAGES_SEARCH:50,MESSAGES_UNREAD:200,TASKS_DEFAULT:200,TASKS_CHILDREN:50,TEAMS_DEFAULT:50,INVITES_DEFAULT:50,NOTIFICATIONS_DEFAULT:50,NOTIFICATIONS_UNREAD:100,CATEGORIES_DEFAULT:100,PROPOSALS_DEFAULT:50,AGENTS_DEFAULT:50,AGENT_EXECUTIONS_DEFAULT:100},de={opacity:.3,blur:0,position:"cover"};function H(e){if(e){if(e instanceof Date)return e;if(typeof e=="object"&&e!==null&&"toDate"in e&&typeof e.toDate=="function")return e.toDate();if(typeof e=="string")return new Date(e)}}function xs(e){if(e)return{url:e.url??void 0,opacity:typeof e.opacity=="number"?Math.max(0,Math.min(1,e.opacity)):de.opacity,blur:typeof e.blur=="number"?Math.max(0,Math.min(20,e.blur)):de.blur,position:["cover","contain","tile"].includes(e.position)?e.position:de.position}}function ks(e){return{...e,role:e.role==="member"?"participant":e.role,joinedAt:H(e.joinedAt)}}function Pe(e){return{...e,createdAt:H(e.createdAt),updatedAt:H(e.updatedAt),startDate:H(e.startDate),dueDate:H(e.dueDate),members:(Array.isArray(e.members)?e.members:[]).map(ks),memberIds:e.memberIds??[],icon:e.icon??void 0,iconColor:e.iconColor??void 0,isPersonal:e.isPersonal??!1,wallpaper:xs(e.w
2allpaper)}}function Qe(e){return{...e,createdAt:H(e.createdAt),updatedAt:H(e.updatedAt),startDate:H(e.startDate),dueDate:H(e.dueDate),deletedAt:H(e.deletedAt),progress:e.progress??0,hierarchyLevel:e.hierarchyLevel??0,childTaskIds:e.childTaskIds??[],dependsOnTaskIds:e.dependsOnTaskIds??[],category:e.category??[],icon:e.icon??void 0,iconColor:e.iconColor??void 0,isAllDay:e.isAllDay??!(e.startTime||e.dueTime),startTime:e.startTime??void 0,dueTime:e.dueTime??void 0}}async function Zt(e){if(!e)return console.warn("getUserGroups: userId is empty"),[];if(!x)throw console.error("getUserGroups: Firestore db is not initialized"),new Error("データベース接続エラー");try{const t=G(N(x,W.TEAM_MEMBERSHIPS),M("userId","==",e),ne(De.TEAMS_DEFAULT)),n=G(N(x,$),M("ownerId","==",e),ne(De.TEAMS_DEFAULT)),[s,r]=await Promise.all([Y(t).catch(u=>(console.warn("[getUserGroups] membershipQuery FAILED:",u.code,u.message),{docs:[]})),Y(n).catch(u=>(console.warn("[getUserGroups] ownerQuery FAILED:",u.code,u.message),{docs:[]}))]),o=s.docs.map(u=>u.data().teamId),i=new Map,l=u=>{try{if(!i.has(u.id)){const p=u.data();if(!p){console.warn("getUserGroups: doc.data() is null for doc:",u.id);return}i.set(u.id,Pe({id:u.id,...p}))}}catch(p){console.error("getUserGroups processDoc error:",p,"docId:",u.id)}};r.docs.forEach(l);const d=o.filter(u=>!i.has(u));if(d.length>0)for(let p=0;p<d.length;p+=30){const m=d.slice(p,p+30);try{const g=G(N(x,$),M(Ut(),"in",m));(await Y(g)).docs.forEach(f=>{i.set(f.id,Pe({id:f.id,...f.data()}))})}catch(g){console.warn("getUserGroups: batch fetch failed, falling back:",g);for(const h of m)try{const f=await ve(E(x,$,h));f.exists()&&i.set(h,Pe({id:f.id,...f.data()}))}catch{}}}return Array.from(i.values())}catch(t){throw console.error("getUserGroups error:",t),t}}async function Fe(e){const t=await ve(E(x,$,e));return t.exists()?Pe({id:t.id,...t.data()}):null}async function en(e,t){var i;const n=await Fe(e);if(!n)throw new Error("Group not found");if(!((i=n.members)==null?void 0:i.some(l=>l.userId===t)))throw new Error("Member not found");if(n.ownerId===t)throw new Error("Owner cannot be removed");const r=(n.members||[]).filter(l=>l.userId!==t),o=E(x,$,e);await te(o,{members:r,updatedAt:ee()})}async function ws(e,t,n){const s=await Fe(e);if(!s)throw new Error("Group not found");const r=s.members.map(o=>o.userId===t?{...o,role:n}:o);await te(E(x,$,e),{members:r,updatedAt:ee()})}async function Rl(e,t){var o;const n=await Zt(e),s=ge(x);let r=!1;for(const i of n){const l=(o=i.members)==null?void 0:o.find(d=>d.userId===e);if(l&&l.displayName!==t){const d=i.members.map(p=>p.userId===e?{...p,displayName:t}:p),u=E(x,$,i.id);s.update(u,{members:d,updatedAt:ee()}),r=!0}}r&&await s.commit()}const Ke="team_invites";async function vs(e){var l;const t=G(N(x,Ke),M("teamId","==",e.teamId),M("targetUserId","==",e.targetUserId),M("status","==","pending"));if(!(await Y(t)).empty)throw new Error(_.t("error.group.alreadyInvited"));const s=await Fe(e.teamId);if((l=s==null?void 0:s.members)!=null&&l.some(d=>d.userId===e.targetUserId))throw new Error(_.t("error.group.alreadyMember"));const r=new Date,o={teamId:e.teamId,teamName:e.teamName,senderId:e.senderId,senderEmail:e.senderEmail,senderName:e.senderName||null,targetUserId:e.targetUserId,targetEmail:e.targetEmail,status:"pending",createdAt:ee()};return{id:(await Ne(N(x,Ke),o)).id,...e,status:"pending",createdAt:r}}function Ts(e){var n,s,r,o;const t=e.data();return{id:e.id,teamId:t.teamId,teamName:t.teamName,senderId:t.senderId,senderEmail:t.senderEmail,senderName:t.senderName,targetUserId:t.targetUserId,targetEmail:t.targetEmail,status:t.status,createdAt:((s=(n=t.createdAt)==null?void 0:n.toDate)==null?void 0:s.call(n))??t.createdAt,respondedAt:((o=(r=t.respondedAt)==null?void 0:r.toDate)==null?void 0:o.call(r))??t.respondedAt}}async function Is(e){const t=G(N(x,Ke),M("teamId","==",e),Bt("createdAt","desc"),ne(De.INVITES_DEFAULT));return(await Y(t)).docs.map(Ts)}const As={"auth/user-not-found":"firebaseErrors.auth.userNotFound","auth/wrong-password":"firebaseErrors.auth.wrongPassword","auth/email-already-in-use":"firebaseErrors.auth.emailAlreadyInUse","auth/invalid-email":"firebaseErrors.auth.invalidEmail","auth/weak-password":"firebaseErrors.auth.weakPassword","auth/too-many-requests":"firebaseErrors.auth.tooManyRequests","auth/network-request-failed":"firebaseErrors.auth.networkError","auth/invalid-credential":"firebaseErrors.auth.invalidCredential","auth/requires-recent-login":"firebaseErrors.auth.requiresRecentLogin","auth/user-disabled":"firebaseErrors.auth.userDisabled","auth/operation-not-allowed":"firebaseErrors.auth.operationNotAllowed","auth/account-exists-with-different-credential":"firebaseErrors.auth.accountExistsDifferentCredential","auth/invalid-login-credentials":"firebaseErrors.auth.invalidCredential","auth/configuration-not-found":"firebaseErrors.auth.configurationNotFound","auth/popup-closed-by-user":"firebaseErrors.auth.popupClosedByUser","auth/popup-blocked":"firebaseErrors.auth.popupBlocked","auth/cancelled-popup-request":"firebaseErrors.auth.cancelledPopupRequest","auth/credential-already-in-use":"firebaseErrors.auth.credentialAlreadyInUse"},Ss={"permission-denied":"firebaseErrors.firestore.permissionDenied","firestore/permission-denied":"firebaseErrors.firestore.permissionDenied","not-found":"firebaseErrors.firestore.notFound","firestore/not-found":"firebaseErrors.firestore.notFound","already-exists":"firebaseErrors.firestore.alreadyExists","firestore/already-exists":"firebaseErrors.firestore.alreadyExists","resource-exhausted":"firebaseErrors.firestore.resourceExhausted","failed-precondition":"firebaseErrors.firestore.failedPrecondition",aborted:"firebaseErrors.firestore.aborted","out-of-range":"firebaseErrors.firestore.outOfRange",unimplemented:"firebaseErrors.firestore.unimplemented",internal:"firebaseErrors.firestore.internal",unavailable:"firebaseErrors.firestore.unavailable","data-loss":"firebaseErrors.firestore.dataLoss",unauthenticated:"firebaseErrors.firestore.unauthenticated",cancelled:"firebaseErrors.firestore.cancelled",unknown:"firebaseErrors.firestore.unknown","invali
2d-argument":"firebaseErrors.firestore.invalidArgument","deadline-exceeded":"firebaseErrors.firestore.deadlineExceeded"};function ze(e){const t=e,n=(t==null?void 0:t.code)||"";if((n==="permission-denied"||n==="firestore/permission-denied")&&I.currentUser&&!I.currentUser.emailVerified)return _.t("firebaseErrors.firestore.emailNotVerified");const s=As[n]||Ss[n];return s?_.t(s):_.t("firebaseErrors.default")}function Cs(e){const t=e==null?void 0:e.code;return t==="permission-denied"||t==="firestore/permission-denied"}function q(e){const t=V(),{successMessage:n,invalidateKeys:s,buildErrorMessage:r,onSuccess:o,onError:i,...l}=e;return It({...l,onSuccess:async(d,u,p)=>{n&&ae(n),s&&s.length>0&&s.forEach(m=>{t.invalidateQueries({queryKey:m})}),await(o==null?void 0:o(d,u,p))},onError:async(d,u,p)=>{const m=r?r(d,u,p):ze(d);m!==null&&le(m),await(i==null?void 0:i(d,u,p))}})}const U={all:["groups"],userGroups:e=>["groups",e],detail:e=>["group",e]};function Ge(e){return me({queryKey:U.userGroups(e),queryFn:()=>Zt(e),enabled:!!e,retry:2,retryDelay:t=>Math.min(1e3*2**t,1e4),staleTime:3e4})}function Nl(e){return me({queryKey:U.detail(e),queryFn:()=>Fe(e),enabled:!!e})}function Es(){const e=V();return q({mutationFn:({input:t,userId:n,userEmail:s,userName:r})=>hs(t,n,s,r),successMessage:"グループを作成しました",onSuccess:(t,n)=>{e.invalidateQueries({queryKey:U.userGroups(n.userId)})}})}function _l(){const e=V();return q({mutationFn:({groupId:t,teamId:n,input:s})=>ys(t||n,s),successMessage:"グループを更新しました",invalidateKeys:[U.all],onSuccess:(t,n)=>{e.invalidateQueries({queryKey:U.detail(n.groupId||n.teamId)})}})}function Ml(){const e=V();return q({mutationFn:t=>bs(t),successMessage:"グループを削除しました",invalidateKeys:[U.all],onSuccess:(t,n)=>{e.removeQueries({queryKey:U.detail(n)})}})}function Fl(){const e=V();return q({mutationFn:({groupId:t,teamId:n,userId:s})=>en(t||n,s),successMessage:"メンバーを削除しました",invalidateKeys:[U.all],onSuccess:(t,n)=>{e.invalidateQueries({queryKey:U.detail(n.groupId||n.teamId)})}})}function Gl(){const e=V();return q({mutationFn:({groupId:t,teamId:n,userId:s,newRole:r})=>ws(t||n,s,r),successMessage:"ロールを更新しました",invalidateKeys:[U.all],onSuccess:(t,n)=>{e.invalidateQueries({queryKey:U.detail(n.groupId||n.teamId)})}})}function Ol(){const e=V();return q({mutationFn:({groupId:t,teamId:n,userId:s})=>en(t||n,s),successMessage:"グループから脱退しました",invalidateKeys:[U.all],onSuccess:(t,n)=>{e.removeQueries({queryKey:U.detail(n.groupId||n.teamId)})}})}const tn=(()=>{const e=new Map;return{getItem:t=>e.get(t)??null,setItem:(t,n)=>{e.set(t,n)},removeItem:t=>{e.delete(t)}}})();function Ps(){const e=globalThis;return typeof globalThis<"u"&&e.__TASK_SCOPE_STORAGE__?e.__TASK_SCOPE_STORAGE__:typeof window<"u"&&window.localStorage?window.localStorage:tn}function Ds(){const e=Ps();return e&&typeof e.getItem=="function"&&typeof e.setItem=="function"&&typeof e.removeItem=="function"?e:tn}function js(e){return e==="all"?"all":e==="personal"?"personal":"group"}const Te=re()(ue(e=>({scopeSelection:"all",mode:"all",groupId:void 0,groupIds:[],setScopeSelection:(t,n)=>e(s=>{if(s.scopeSelection===t&&s.groupId===n)return s;const r=js(t),l=t==="personal"&&n?n:t!=="all"&&t!=="personal"?t:void 0;return{scopeSelection:t,mode:r,groupId:l,groupIds:l?[l]:[]}}),setMode:t=>e(n=>({mode:t,groupId:n.groupId,groupIds:n.groupIds,scopeSelection:t==="all"?"all":t==="personal"?"personal":n.groupId||"all"})),setGroupId:t=>e({groupId:t,groupIds:t?[t]:[],scopeSelection:t||"all"}),setGroupIds:t=>e(n=>({groupIds:t??[],groupId:t!=null&&t.length?t[0]:n.groupId,scopeSelection:t!=null&&t.length?t[0]:n.scopeSelection}))}),{name:"task-scope-store",storage:Tt(()=>Ds())})),nn=c.createContext(null),Xe=()=>{const e=c.useContext(nn);if(!e)throw new Error("useDropdownMenu must be used within a DropdownMenu");return e};function Ls({children:e}){const[t,n]=c.useState(!1),s=c.useRef(null);return c.useEffect(()=>{const r=o=>{o.key==="Escape"&&n(!1)};return t&&document.addEventListener("keydown",r),()=>{document.removeEventListener("keydown",r)}},[t]),a.jsx(nn.Provider,{value:{isOpen:t,setIsOpen:n,triggerRef:s},children:a.jsx("div",{className:"relative",ref:s,children:e})})}function Rs({children:e,asChild:t}){const{isOpen:n,setIsOpen:s}=Xe();if(t){const r=e;return a.jsx(a.Fragment,{children:At.cloneElement(r,{onClick:o=>{var l;o.stopPropagation(),s(!n);const i=(l=r.props)==null?void 0:l.onClick;i==null||i(o)},"aria-expanded":n,"aria-haspopup":"menu"})})}return a.jsx("button",{onClick:r=>{r.stopPropagation(),s(!n)},"aria-expanded":n,"aria-haspopup":"menu",children:e})}function Ns({children:e,align:t="end",className:n}){const{isOpen:s,setIsOpen:r,triggerRef:o}=Xe(),i=c.useRef(null),[l,d]=c.useState({top:0,left:0}),[u,p]=c.useState(!1);return c.useEffect(()=>{if(s&&o.current&&i.current){const m=o.current.getBoundingClientRect(),g=i.current.getBoundingClientRect(),h=g.width||160,f=g.height||120,b=8;let y=m.left,D=m.bottom+4;t==="end"?y=m.right-h:t==="center"&&(y=m.left+m.width/2-h/2);const v=window.innerWidth-h-b;y=Math.max(b,Math.min(y,v)),D+f>window.innerHeight-b&&(D=m.top-f-4),D<b&&(D=Math.max(b,Math.min(m.top,window.innerHeight-f-b)),y=m.right+8,y+h>window.innerWidth-b&&(y=m.left-h-8),y<b&&(y=Math.max(b,(window.innerWidth-h)/2))),d({top:D,left:y}),p(!0)}else p(!1)},[s,t,o]),c.useEffect(()=>{const m=g=>
2{i.current&&!i.current.contains(g.target)&&o.current&&!o.current.contains(g.target)&&r(!1)};return s&&document.addEventListener("mousedown",m),()=>{document.removeEventListener("mousedown",m)}},[s,r,o]),s?St.createPortal(a.jsx("div",{ref:i,className:w("fixed z-context-menu","min-w-dropdown-md","bg-surface-100 rounded-md shadow-lg border border-surface-200","py-1",!u&&"opacity-0",u&&"opacity-100 animate-in fade-in-0 zoom-in-95 duration-100",n),style:{top:`${l.top}px`,left:`${l.left}px`},role:"menu","aria-orientation":"vertical",children:e}),document.body):null}function Ul({children:e,onClick:t,className:n,"data-testid":s}){const{setIsOpen:r}=Xe(),o=i=>{i.stopPropagation(),t==null||t(),r(!1)};return a.jsx("button",{onClick:o,className:w("w-full min-h-touch-sm","flex items-center gap-2 px-3 py-2","text-left text-sm text-surface-700","hover:bg-surface-200","transition-colors duration-150",n),role:"menuitem","data-testid":s,children:e})}function Bl({children:e,className:t}){return a.jsx("div",{className:w("px-3 py-1.5 text-xs font-semibold text-surface-500",t),children:e})}function Wl({className:e}){return a.jsx("div",{className:w("h-px bg-surface-300 my-1",e),role:"separator"})}function _s(e,t){const n=t||(s=>s);return[{type:"label",label:n("common.groupContextMenu.sectionCreate")},{type:"item",icon:a.jsx(Et,{size:16}),label:n("common.groupContextMenu.createTask"),path:`/tasks?groupId=${e}&openCreate=true`,testId:`group-menu-create-task-${e}`},{type:"separator",label:""},{type:"label",label:n("common.groupContextMenu.sectionList")},{type:"item",icon:a.jsx(Pt,{size:16}),label:n("common.groupContextMenu.taskList"),path:`/tasks?groupId=${e}`,testId:`group-menu-task-list-${e}`},{type:"separator",label:""},{type:"label",label:n("common.groupContextMenu.sectionManage")},{type:"item",icon:a.jsx(_n,{size:16}),label:n("common.groupContextMenu.categoryList"),path:`/categories?groupId=${e}`,testId:`group-menu-categories-${e}`},{type:"item",icon:a.jsx(Mn,{size:16}),label:n("common.groupContextMenu.groupInvite"),path:`/groups/${e}/invite`,testId:`group-menu-invite-${e}`},{type:"item",icon:a.jsx(we,{size:16}),label:n("common.groupContextMenu.groupSettings"),path:`/groups/${e}/settings`,testId:`group-menu-settings-${e}`}]}function Ms({groupId:e,groupName:t,onNavigate:n,onClose:s,itemClassName:r="flex items-center gap-2 px-3 py-2 text-sm text-surface-700 hover:bg-surface-50  w-full text-left cursor-pointer",showSeparators:o=!0}){const{t:i}=C(),l=_s(e,i),d=u=>{n(u),s==null||s()};return a.jsxs(a.Fragment,{children:[t&&a.jsxs("div",{className:"px-3 py-2 border-b border-surface-200 ",children:[a.jsx("p",{className:"text-xs text-surface-500",children:i("common.groupContextMenu.group")}),a.jsx("p",{className:"font-medium text-foreground truncate",children:t})]}),l.map((u,p)=>u.type==="separator"?o?a.jsx("div",{className:"h-px bg-surface-200  my-1",role:"separator"},`separator-${p}`):null:u.type==="label"?o?a.jsx("div",{className:"px-3 py-1 text-xs font-semibold text-surface-500 uppercase tracking-wide",children:u.label},`label-${u.label}`):null:a.jsxs("button",{onClick:()=>d(u.path),className:r,"data-testid":u.testId,children:[u.icon,a.jsx("span",{children:u.label})]},u.path))]})}const Fs={team:"🏢"};function ct({icon:e,fallback:t,size:n=18}){return e!=null&&e.startsWith("http")?a.jsx("img",{src:e,alt:"",className:"rounded-full object-cover flex-shrink-0",style:{width:n,height:n}}):a.jsx("span",{className:"text-base flex-shrink-0","aria-hidden":"true",children:e||t})}function Gs({type:e,selectedId:t,selectedName:n,options:s,onSelect:r,isLoading:o=!1,disabled:i=!1,showMenu:l=!0,teamId:d,className:u}){const p=oe(),{t:m}=C(),[g,h]=c.useState(!1),f=c.useRef(null),b=Fs[e],y=s.find(T=>T.id===t),D=y==null?void 0:y.icon;c.useEffect(()=>{const T=R=>{f.current&&!f.current.contains(R.target)&&h(!1)};return g&&document.addEventListener("mousedown",T),()=>{document.removeEventListener("mousedown",T)}},[g]);const v=T=>{p(T)};return a.jsxs("div",{ref:f,className:w("relative flex items-center","bg-card","rounded-lg border border-border","shadow-sm",i&&"opacity-50 pointer-events-none",u),children:[a.jsxs("button",{onClick:T=>{T.stopPropagation(),h(!g)},disabled:i||o,className:w("flex-1 flex items-center gap-2 px-3 py-2","min-h-touch min-w-0","hover:bg-surface-200","active:bg-surface-300","transition-colors duration-150","focus:outline-none focus:ring-2 focus:ring-inset focus:ring-primary-500","group"),"aria-label":m("components.scopeCard.selectScope",{type:m("components.c
2ontextCard.group")}),"aria-expanded":g,"aria-haspopup":"listbox",title:o?m("common.loading"):n,children:[a.jsx(ct,{icon:D,fallback:b}),a.jsx("span",{className:"font-medium text-foreground truncate flex-1 text-left",children:o?m("common.loading"):n}),a.jsx(Dt,{className:w("w-4 h-4 text-surface-400 flex-shrink-0 transition-transform duration-200",g&&"rotate-180")})]}),l&&a.jsx("div",{className:"w-px h-6 bg-surface-300 flex-shrink-0"}),l&&t&&a.jsxs(Ls,{children:[a.jsx(Rs,{asChild:!0,children:a.jsx("button",{onClick:T=>T.stopPropagation(),disabled:i||o,className:w("w-11 h-11 flex-shrink-0","flex items-center justify-center","hover:bg-surface-200","active:bg-surface-300","transition-colors duration-150","focus:outline-none focus:ring-2 focus:ring-inset focus:ring-primary-500",(i||o)&&"opacity-50 cursor-not-allowed"),"aria-label":m("components.scopeCard.openSettingsMenu"),"aria-haspopup":"menu",children:a.jsx(Fn,{className:"w-5 h-5 text-surface-500"})})}),a.jsx(Ns,{align:"end",className:"z-sticky min-w-[180px] py-1",children:e==="team"&&a.jsx(Ms,{groupId:t,groupName:n,onNavigate:v})})]}),g&&a.jsxs("div",{className:w("absolute top-full left-0 mt-1","bg-white dark:bg-surface-50","border border-surface-200 dark:border-surface-200","rounded-lg","shadow-lg","z-popover","max-h-scroll-md overflow-y-auto","min-w-[200px] w-max max-w-[320px]"),role:"listbox","aria-label":m("components.scopeCard.scopeOptions",{type:m("components.contextCard.group")}),children:[s.map(T=>a.jsxs("button",{onClick:()=>{r(T.id),h(!1)},className:w("w-full px-4 py-3 text-left","flex items-center gap-2","min-h-touch","hover:bg-surface-100 dark:hover:bg-surface-100","transition-colors duration-150","focus:outline-none focus:bg-surface-100 dark:focus:bg-surface-100",T.id===t&&"bg-primary-500/15 dark:bg-primary-500/20"),role:"option","aria-selected":T.id===t,title:T.name,children:[a.jsx(ct,{icon:T.icon,fallback:b}),a.jsx("span",{className:w("text-sm flex-1",T.id===t?"font-medium text-primary-600 dark:text-primary-400":"text-surface-800"),children:T.name}),T.id===t&&a.jsx("span",{className:"ml-auto text-primary-600 dark:text-primary-400 flex-shrink-0",children:"✓"})]},T.id)),s.length===0&&a.jsx("div",{className:"px-4 py-3 text-sm text-surface-500 dark:text-surface-500",children:m("components.scopeCard.noOptions")})]})]})}function Ze(e){return N(x,W.USERS,e,zt.NOTIFICATIONS)}function an(e,t){var n;return{id:e,type:t.type,userId:t.userId,fromUserId:t.fromUserId,contextType:t.contextType,contextId:t.contextId,messageId:t.messageId,title:t.title,body:t.body,params:t.params,read:t.isRead??t.read??!1,createdAt:((n=t.createdAt)==null?void 0:n.toDate())??new Date}}async function sn(e){const t=Ze(e.userId),n={type:e.type,userId:e.userId,fromUserId:e.fromUserId,contextType:e.contextType,contextId:e.contextId,messageId:e.messageId,title:e.title,body:e.body,isRead:!1,createdAt:P.now()},s=await Ne(t,n);return an(s.id,n)}async function Os(e,t){if(t){const n=E(x,W.USERS,t,zt.NOTIFICATIONS,e);await te(n,{isRead:!0})}else{console.warn("markNotificationAsRead: userId not provided, using legacy path");const n=E(x,W.NOTIFICATIONS,e);await te(n,{read:!0})}}async function rn(e){const t=Ze(e),n=500,s=G(t,M("isRead","==",!1),ne(n)),r=await Y(s);if(r.empty)return;const o=r.docs;for(let i=0;i<o.length;i+=n){const l=ge(x);o.slice(i,i+n).forEach(u=>{l.update(u.ref,{isRead:!0})}),await l.commit()}o.length===n&&await rn(e)}function Us(e,t,n=50){const s=Ze(e),r=G(s,Bt("createdAt","desc"),ne(n));return Wt(r,i=>{const l=i.docs.map(d=>an(d.id,d.data()));t(l)})}async function Bs(e,t,n,s,r){return sn({type:"assignment",userId:e,fromUserId:t,contextType:"task",contextId:n,title:"タスクが割り当てられました",body:`${r}さんがあなたに「${s}」を割り当てました`})}async function Vl(e,t,n){return sn({type:"feedback_reply",userId:e,fromUserId:"system",contextType:"team",contextId:t,title:"フィードバックに返信がありました",body:n.length>50?`${n.slice(0,50)}...`:n})}function Ws(){const{user:e}=J(),[t,n]=c.useState([]),[s,r]=c.useState(!0),[o,i]=c.useState(null),l=t.filter(p=>!p.read).length;c.useEffect(()=>
2{if(!(e!=null&&e.uid)){n([]),r(!1);return}r(!0),i(null);let p;try{p=Us(e.uid,m=>{n(m),r(!1)})}catch(m){i(m instanceof Error?m:new Error("通知の取得に失敗しました")),r(!1)}return()=>{p&&p()}},[e==null?void 0:e.uid]);const d=c.useCallback(async p=>{if(e!=null&&e.uid)try{await Os(p,e.uid)}catch(m){throw console.error("Failed to mark notification as read:",m),m}},[e==null?void 0:e.uid]),u=c.useCallback(async()=>{if(e!=null&&e.uid)try{await rn(e.uid)}catch(p){throw console.error("Failed to mark all notifications as read:",p),p}},[e==null?void 0:e.uid]);return{notifications:t,unreadCount:l,isLoading:s,error:o,markAsRead:d,markAllAsRead:u}}function ql(){const e=V();return It({mutationFn:async t=>await vs({teamId:t.teamId,teamName:t.teamName,senderId:t.senderId,senderEmail:t.senderEmail,senderName:t.senderName,targetUserId:t.targetUserId,targetEmail:t.targetEmail}),onSuccess:()=>{e.invalidateQueries({queryKey:["team-invites"]})}})}function Kl(e,t){return me({queryKey:["team-invites",t],queryFn:async()=>t?await Is(t):[],enabled:!!t})}function Vs(){const{t:e}=C(),[t,n]=c.useState(!1),[s,r]=c.useState({top:0,right:0}),o=c.useRef(null),i=c.useRef(null),l=oe(),{user:d,logout:u}=J(),{unreadCount:p}=Ws(),m=c.useCallback(()=>{if(i.current){const f=i.current.getBoundingClientRect();
2r({top:f.bottom+8,right:window.innerWidth-f.right})}},[]),g=[{label:e("nav.userIcon.notifications"),path:"/notifications",icon:a.jsx(Gn,{size:18}),badge:p},{label:e("nav.userIcon.personalSettings"),path:"/settings",icon:a.jsx(we,{size:18})},{label:e("nav.userIcon.logout"),action:async()=>{await u(),l("/login")},icon:a.jsx(jt,{size:18})}];c.useEffect(()=>{if(!t)return;const f=y=>{o.current&&i.current&&!o.current.contains(y.target)&&!i.current.contains(y.target)&&n(!1)},b=y=>{var D;y.key==="Escape"&&(n(!1),(D=i.current)==null||D.focus())};return document.addEventListener("mousedown",f),document.addEventListener("keydown",b),()=>{document.removeEventListener("mousedown",f),document.removeEventListener("keydown",b)}},[t]),c.useEffect(()=>{t&&m()},[t,m]);const h=f=>{f.action?f.action():f.path&&l(f.path),n(!1)};return a.jsxs("div",{className:"relative",children:[a.jsxs("button",{ref:i,onClick:()=>n(!t),className:w("relative","min-w-touch min-h-touch","flex items-center justify-center","rounded-full","bg-surface-100 hover:bg-surface-200","transition-colors duration-150","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2"),"aria-label":p>0?e("nav.userIcon.openMenuWithBadge",{count:p}):e("nav.userIcon.openMenu"),"aria-expanded":t,"aria-haspopup":"menu",children:[d!=null&&d.photoURL?a.jsx("img",{src:d.photoURL,alt:d.displayName||e("nav.userIcon.user"),className:"w-8 h-8 rounded-full object-cover"}):a.jsx(On,{size:20,className:"text-surface-600","aria-hidden":"true"}),p>0&&a.jsx("span",{className:w("absolute -top-0.5 -right-0.5","min-w-[18px] h-[18px] px-1","flex items-center justify-center","bg-error text-white text-xs font-bold rounded-full","border-2 border-background"),children:p>99?"99+":p})]}),t&&a.jsxs("div",{ref:o,className:w("fixed","w-48","bg-surface-100 rounded-lg shadow-lg border border-surface-200","z-dropdown"),style:{top:s.top,right:s.right},role:"menu","aria-orientation":"vertical",children:[d&&a.jsxs("div",{className:"px-4 py-3 border-b border-surface-100",children:[a.jsx("p",{className:"text-sm font-medium text-surface-900 truncate",children:d.displayName||e("nav.userIcon.user")}),a.jsx("p",{className:"text-xs text-surface-500 truncate",children:d.email})]}),a.jsx("div",{className:"py-1",children:g.map((f,b)=>a.jsxs("button",{onClick:()=>h(f),className:w("w-full min-h-touch","flex items-center gap-3 px-4 py-2","text-left text-sm text-surface-700","hover:bg-surface-50","transition-colors duration-150",b===g.length-1&&"border-t border-surface-100"),role:"menuitem",children:[a.jsx("span",{"aria-hidden":"true",children:f.icon}),a.jsx("span",{className:"flex-1",children:f.label}),f.badge!==void 0&&f.badge>0&&a.jsx("span",{className:"min-w-[20px] h-5 px-1.5 flex items-center justify-center bg-error text-white text-xs font-bold rounded-full",children:f.badge>99?"99+":f.badge})]},f.label))})]})]})}c.forwardRef(function({isOpen:t,onToggle:n},s){const{t:r}=C();return a.jsx("button",{ref:s,onClick:n,className:w("fixed bottom-20 left-4 z-50","w-12 h-12","flex items-center justify-center","rounded-full",t?"bg-surface-200":"bg-surface-100 hover:bg-surface-200","shadow-md","transition-all duration-200","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2"),"aria-label":r(t?"nav.hamburger.closeMenu":"nav.hamburger.openMenu"),"aria-expanded":t,"aria-haspopup":"menu",children:a.jsxs("div",{className:"relative w-6 h-6",children:[a.jsx(Lt,{size:24,className:w("absolute inset-0 transition-all duration-200",t?"opacity-0 rotate-90 scale-50":"opacity-100 rotate-0 scale-100"),"aria-hidden":"true"}),a.jsx(Re,{size:24,className:w("absolute inset-0 transition-all duration-200",t?"opacity-100 rotate-0 scale-100":"opacity-0 -rotate-90 scale-50"),"aria-hidden":"true"})]})})});const xe={FEEDBACK:"/feedback",HELP:"/help",SETTINGS:"/settings"},qs={taskKey:"config.displayLabels.default.task",categoryKey:"config.displayLabels.default.category"};function Ks(){return qs}const zs=[{id:"tasks",labelKey:"nav.tasks",icon:a.jsx(Pt,{className:"w-4 h-4"}),path:"/tasks",matchPaths:["/tasks","/kanban","/wip","/calendar"]}];function Hs({className:e}){const{t}
2=C(),n=pe(),s=oe(),r=i=>i.matchPaths.some(l=>n.pathname.startsWith(l)),o=i=>{s(i.path)};return a.jsx("nav",{"data-tour":"feature-tabs",className:w("flex items-center gap-1",e),"aria-label":t("nav.featureTabs"),children:zs.map(i=>{const l=r(i);return a.jsxs("button",{onClick:()=>o(i),className:w("flex items-center gap-1.5 px-3 py-2 min-h-touch","rounded-lg text-sm font-medium","transition-colors duration-150","focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-1",l?"bg-primary-500/15 text-primary-600":"text-surface-600 hover:bg-surface-200"),"aria-current":l?"page":void 0,children:[i.icon,a.jsx("span",{children:t(i.labelKey)})]},i.id)})})}function $s({activeView:e,className:t}){const n=oe(),{t:s}=C(),r=Te(),o=[{type:"list",path:"/tasks",icon:Un,label:s("components.viewSwitcher.list"),title:s("components.viewSwitcher.taskList")},{type:"wip",path:"/kanban",icon:Bn,label:"WIP",title:s("components.viewSwitcher.wipBoard")},{type:"calendar",path:"/calendar",icon:Wn,label:s("components.viewSwitcher.calendar"),title:s("components.viewSwitcher.calendar")}],i=()=>{const d=new URLSearchParams;return r.scopeSelection!=="all"&&r.scopeSelection!=="personal"&&d.set("groupId",r.scopeSelection),d.toString()},l=d=>{const u=i();n(`${d}${u?`?${u}`:""}`)};return a.jsx("div",{"data-tour":"view-switcher",className:w("flex gap-1 bg-surface-200 rounded-lg p-1",t),children:o.map(({type:d,path:u,icon:p,title:m})=>a.jsx("button",{onClick:()=>l(u),className:w("p-2 rounded transition-all","min-w-touch min-h-touch flex items-center justify-center","focus:outline-none focus:ring-2 focus:ring-primary-500",e===d?"bg-surface-50 shadow-sm text-primary-600":"text-surface-600 hover:bg-surface-100 hover:shadow-sm hover:text-primary-600"),"aria-label":m,title:m,"aria-current":e===d?"page":void 0,children:a.jsx(p,{size:18})},d))})}const Js=c.lazy(()=>k(()=>import("./TourButton-1fv1wiBj.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])).then(e=>({default:e.TourButton})));function Ys({onOpenDrawer:e,activeView:t="list",showViewSwitcher:n=!1,className:s}){const{t:r}=C(),o=oe(),i=pe(),{user:l}=J(),d=/^\/(groups)\/[^/]+$/.test(i.pathname),u=/^\/(groups)\/[^/]+\/settings$/.test(i.pathname),{scopeSelection:p,setScopeSelection:m}=Te(),{setSelectedGroupId:g,clearSelectedGroup:h}=Me(),{data:f=[]}=Ge((l==null?void 0:l.uid)??""),b=f.filter(S=>!S.isPersonal),y=f.find(S=>S.isPersonal),D=(()=>{if(!(p==="all"||p==="personal"))return p})(),v=[{id:"all",name:r("common.all"),icon:"🌐"},...b.map(S=>({id:S.id,name:S.name,icon:S.icon||"🏢"})),{id:"personal",name:r("header.personal"),icon:(y==null?void 0:y.icon)||"👤"}],T=(()=>{if(p==="all")return r("common.all");if(p==="personal")return r("header.personal");const S=b.find(K=>K.id===p);return(S==null?void 0:S.name)||r("navigation.group")})(),R=c.useCallback((S,K)=>{S==="all"?h():S==="personal"?K?g(K):h():g(S)},[h,g]);c.useEffect(()=>{R(p,y==null?void 0:y.id)},[p,y==null?void 0:y.id,R]);const L=S=>{if(S==="personal"?(m("personal",y==null?void 0:y.id),R("personal",y==null?void 0:y.id)):(m(S),R(S)),u){o(S==="all"||S==="personal"?"/":`/groups/${S}`);return}if(d){o(S==="all"||S==="personal"?"/":`/groups/${S}`);return}if(/^\/tasks\/[^/]+$/.test(i.pathname)){o("/tasks");return}};return a.jsxs("header",{className:w("fixed top-0 left-0 right-0 z-40","bg-background","border-b border-border","w-full max-w-full overflow-visible"),style:{paddingTop:"env(safe-area-inset-top, 0px)"},children:[a.jsxs("div",{className:w("h-14 px-4 flex items-center gap-3",s),children:[a.jsx("button",{onClick:e,"data-tour":"hamburger-menu",className:w("w-11 h-11 flex items-center justify-center flex-shrink-0","rounded-lg","hover:bg-surface-200","active:bg-surface-300","transition-colors duration-150","focus:outline-none focus:ring-2 focus:ring-primary-500"),"aria-label":r("header.openMenu"),children:a.jsx(Lt,{className:"w-6 h-6 text-surface-700"})}),a.jsxs(Ct,{to:"/home",className:w("flex items-center gap-2 flex-shrink-0","hover:opacity-80 transition-opacity","cursor-pointer"),"aria-label":r("header.backToHome"),children:[a.jsx("img",{src:"/images/logo-icon.png",alt:"TasKudos",width:24,height:24,decoding:"async",className:"w-6 h-6"}),a.jsx("span",{className:"text-lg font-bold text-foreground hidden sm:inline",children:"TasKudos"})]}),a.jsx("div",{"data-tour":"scope-selector",className:"flex-1 flex items-center gap-2 min-w-0",children:a.jsx(Gs,{type:"team",selectedId:p==="all"||p==="personal"?p:D,selectedName:T,options:v,onSelect:L,showMenu:!!D,className:"min-w-[120px] max-w-[180px] flex-shrink-0"})}),a.jsxs("div",{"data-tour":"header-right",className:"flex items-center gap-1 flex-shrink-0",children:[a.jsx(c.Suspense,{fallback:null,children:a.jsx(Js,{})}),a.jsx(Vs,{})]})]}),a.jsxs("div",{className:"h-12 px-4 flex items-center justify-between border-t border-surface-200",children:[a.jsx(Hs,{}),n&&a.jsx($s,{activeView:t,className:"flex-shrink-0"})]})]})}function Qs({userName:e,showUserMenu:t,onToggle:n,onNavigate:s,onLogout:r,settingsPath:o}){const{t:i}=C();return a.jsxs("div",{className:"p-4 border-b border-border",children:[a.jsxs("button",{onClick:n,className:w("w-full flex items-center gap-3 p-2 rounded-lg","hover:bg-surface-200 transition-colors duration-150","focus:outline-none focus:ring-2 focus:ring-primary-500"),"data-testid":"user-info-area","aria-expanded":t,"aria-controls":"user-menu",children:[a.jsx("div",{className:"w-10 h-10 rounded-full bg-primary-500/15 flex items-center justify-center",children:a.jsx("span",{className:"text-primary-700 font-bold",children:e.charAt(0).toUpperCase()})}),a.jsxs("div",{className:"flex-1 min-w-0 text-left",children:[a.jsx("p",{className:"font-medium text-foreground truncate",children:e}),a.jsx("p",{className:"text-xs text-muted-foreground",children:i("navigation.personalSettings")})]}),t?a.jsx(Vn,{className:"w-4 h-4 text-surface-400"}):a.jsx(Dt,{className:"w-4 h-4 text-surface-400"})]}),t&&a.jsxs("div",{id:"user-menu","data-testid":"user-menu",className:"mt-2 py-1 bg-muted rounded-lg",children:[a.jsxs("button",{onClick:()=>s(o),className:w("w-full flex items-center gap-3 px-4 py-2.5","text-sm text-surface-700 text-left","hover:bg-surface-200 transition-colors duration-150"),children:[a.jsx(we,{className:"w-4 h-4"}),i("navigation.personalSettings")]}),a.jsxs("button",{onClick:r,className:w("w-full flex items-center gap-3 px-4 py-2.5","text-sm text-error text-left","hover:bg-error/10 transition-colors duration-150"),children:[a.jsx(jt,{className:"w-4 h-4"}),i("drawer.logout")]})]})]})}function Xs({groups:e,selectedGroupId:t,onGroupSelect:n,onCreateGroup:s}){const{t:r}=C();return a.jsxs("div",{className:"px-2 py-3 border-t border-border",children:[a.jsxs("div",{className:"px-3 mb-2 flex items-center justify-between",children:[a.jsx("h3",{className:"text-xs font-semibold text-muted-foreground uppercase tracking-wider",children:r("navigation.groups")}),a.jsx("button",{onClick:s,className:w("w-6 h-6 flex items-center justify-center rounded","text-surface-500 hover:text-primary-600 dark:hover:text-primary-400","hover:bg-surface-200","transition-colors duration-150"),"aria-label":r("drawer.createNewGroup"),children:a.jsx(Et,{className:"w-4 h-4"})})]}),a.jsxs("div",{className:"space-y-1",children:[e.map(o=>{const i=t===o.id;return a.jsx("div",{className:"space-y-0.5",children:a.jsx("div",{className:"flex items-center",children:a.jsxs("button",{onClick:()=>n(o.id),className:w("flex-1 flex items-center gap-2 px-2 py-2.5 min-h-touch rounded-lg","text-left text-sm","transition-colors duration-150",i?"bg-primary-500/20 text-primary-600 dark:text-primary-400 border-l-2 border-primary-500":"text-foreground hover:bg-muted"),"data-testid":"drawer-menu-item",children:[a.jsx(qn,{
2className:"w-4 h-4 flex-shrink-0"}),a.jsx("span",{className:"flex-1 truncate",children:o.name})]})})},o.id)}),e.length===0&&a.jsx("p",{className:"px-3 py-2 text-sm text-muted-foreground",children:r("drawer.noGroups")})]})]})}function Zs({currentPath:e,onHomeClick:t}){const{t:n}=C();return a.jsx("div",{className:"p-2",children:a.jsxs("button",{onClick:t,className:w("w-full flex items-center gap-3 px-3 py-3 min-h-touch rounded-lg","text-left font-medium","transition-colors duration-150",e==="/"?"bg-primary-500/20 text-primary-600 dark:text-primary-400 border-l-2 border-primary-500":"text-foreground hover:bg-muted"),"data-testid":"drawer-menu-item",children:[a.jsx(Rt,{className:"w-5 h-5"}),a.jsx("span",{children:n("drawer.home")})]})})}function er({currentPath:e,onNavigate:t}){const{t:n}=C();return a.jsx("div",{className:"border-t border-border",children:a.jsxs("div",{className:"p-2 space-y-0.5",children:[a.jsxs("button",{onClick:()=>t(xe.FEEDBACK),className:w("w-full flex items-center gap-3 px-3 py-3 min-h-touch rounded-lg","text-left text-sm","transition-colors duration-150",e===xe.FEEDBACK?"bg-primary-500/20 text-primary-600 dark:text-primary-400":"text-surface-700 hover:bg-surface-200"),"data-testid":"drawer-menu-item",children:[a.jsx(Kn,{className:"w-5 h-5"}),a.jsx("span",{children:n("navigation.feedback")})]}),a.jsxs("button",{onClick:()=>t(xe.SETTINGS),className:w("w-full flex items-center gap-3 px-3 py-3 min-h-touch rounded-lg","text-left text-sm","text-surface-700","hover:bg-surface-200","transition-colors duration-150"),"data-testid":"drawer-menu-item",children:[a.jsx(we,{className:"w-5 h-5"}),a.jsx("span",{children:n("nav.settings")})]}),a.jsxs("button",{onClick:()=>t(xe.HELP),className:w("w-full flex items-center gap-3 px-3 py-3 min-h-touch rounded-lg","text-left text-sm","text-surface-700","hover:bg-surface-200","transition-colors duration-150"),"data-testid":"drawer-menu-item",children:[a.jsx(zn,{className:"w-5 h-5"}),a.jsx("span",{children:n("navigation.help")})]})]})})}function tr({isOpen:e,onClose:t}){var R;const{t:n}=C(),s=oe(),r=pe(),{user:o,logout:i}=J(),{data:l=[]}=Ge((o==null?void 0:o.uid)??""),{selectedGroupId:d,setSelectedGroupId:u}=Me(),{setScopeSelection:p}=Te(),m=c.useRef(null),[g,h]=c.useState(!1),f=l.filter(L=>!L.isPersonal);c.useEffect(()=>{const L=K=>{K.key==="Escape"&&e&&t()},S=K=>{e&&m.current&&!m.current.contains(K.target)&&t()};return document.addEventListener("keydown",L),document.addEventListener("mousedown",S),()=>{document.removeEventListener("keydown",L),document.removeEventListener("mousedown",S)}},[e,t]);const b=$e({onSwipedLeft:()=>{e&&t()},trackMouse:!1,preventScrollOnSwipe:!0,delta:50}),y=L=>{s(L),t()},D=L=>{u(L),p(L),s(`/groups/${L}`),t()},v=async()=>{await i(),t(),s("/login")},T=(o==null?void 0:o.displayName)||((R=o==null?void 0:o.email)==null?void 0:R.split("@")[0])||n("drawer.user");return a.jsxs(a.Fragment,{children:[a.jsx("div",{className:w("fixed inset-0 bg-black/40 backdrop-blur-sm z-50","transition-opacity duration-300",e?"opacity-100":"opacity-0 pointer-events-none"),"aria-hidden":"true"}),a.jsxs("div",{...b,ref:m,"data-tour":"drawer-menu",className:w("fixed top-0 left-0 h-full w-80 max-w-[85vw] z-50","bg-background text-foreground","border-r border-border","shadow-xl","transform transition-transform duration-300 ease-out",e?"translate-x-0":"-translate-x-full"),role:"dialog","aria-modal":"true","aria-label":n("drawer.menu"),children:[a.jsxs("div",{className:"h-14 px-4 flex items-center justify-between border-b border-border",children:[a.jsx("h2",{className:"text-lg font-bold text-primary-600",children:"TasKudos"}),a.jsx("button",{onClick:t,className:"w-10 h-10 flex items-center justify-center rounded-lg hover:bg-surface-200 transition-colors duration-150 focus:outline-none focus:ring-2 focus:ring-primary-500","aria-label":n("drawer.closeMenu"),children:a.jsx(Re,{className:"w-5 h-5 text-muted-foreground"})})]}),a.jsxs("div",{className:"flex-1 overflow-y-auto",children:[a.jsx(Qs,{userName:T,showUserMenu:g,onToggle:()=>h(!g),onNavigate:L=>{h(!1),y(L)},onLogout:()=>{h(!1),v()},settingsPath:xe.SETTINGS}),a.jsx(Zs,{currentPath:r.pathname,onHomeClick:()=>{p("all"),y("/")}}),a.jsx(Xs,{groups:f,selectedGroupId:d,onGroupSelect:D,onCreateGroup:()=>y("/groups/new")})]}),a.jsx(er,{currentPath:r.pathname,onNavigate:y,onHomeClick:()=>{p("all"),y("/")}})]})]})}const nr={enabled:!1,hideAdvancedFeatures:!0,simplifiedUI:!0,defaultView:"list",enabledFeatures:{approval:!1,dependencies:!1,splitMerge:!1,difficulty:!1,cp:!1,burnout:!1,aiSummary:!0,categories:!0,taskType:!0}},dt={enabled:!1,hideAdvancedFeatures:!1,simplifiedUI:!1,defaultView:"list",enabledFeatures:{approval:!0,dependencies:!0,splitMerge:!0,difficulty:!0,cp:!0,burnout:!0,aiSummary:!0,categories:!0,taskType:!0}},ut=re()(ue((e,t)=>({settings:dt,onboarding:{completed:!1,currentStep:0,skipped:!1},enableFamilyMode:()=>{e({settings:{...nr,enabled:!0}})},disableFamilyMode:()=>{e({settings:{...dt,enabled:!1}})},toggleFamilyMode:()=>{const{settings:n}=t();n.enabled?t().disableFamilyMode():t().enableFamilyMode()},updateSettings:n=>
2{e(s=>({settings:{...s.settings,...n}}))},updateFeatureFlags:n=>{e(s=>({settings:{...s.settings,enabledFeatures:{...s.settings.enabledFeatures,...n}}}))},startOnboarding:()=>{e({onboarding:{completed:!1,currentStep:0,skipped:!1}})},completeOnboarding:()=>{e({onboarding:{completed:!0,currentStep:3,skipped:!1,completedAt:new Date().toISOString()}})},skipOnboarding:()=>{e({onboarding:{completed:!0,currentStep:0,skipped:!0,completedAt:new Date().toISOString()}})},advanceOnboardingStep:()=>{e(n=>{const s=n.onboarding.currentStep+1;return s>=3?{onboarding:{completed:!0,currentStep:3,skipped:!1,completedAt:new Date().toISOString()}}:{onboarding:{...n.onboarding,currentStep:s}}})},isFeatureEnabled:n=>{const{settings:s}=t();return s.enabled?s.enabledFeatures[n]:!0},shouldSuggestFamilyMode:n=>{const{settings:s,onboarding:r}=t();return s.enabled||r.completed?!1:n<=5}}),{name:"family-mode-storage",version:1}));function ar(){const e=ut(n=>n.settings),t=ut(n=>n.isFeatureEnabled);return{familyModeEnabled:e.enabled,settings:e,isFeatureEnabled:t}}function sr(){const e=pe(),{t}=C(),n=Ks(),{setScopeSelection:s}=Te(),{familyModeEnabled:r}=ar(),o=[{path:"/",label:t("nav.dashboard"),icon:a.jsx(Rt,{size:20})},{path:"/tasks",label:t(n.taskKey)||t("nav.tasks"),icon:a.jsx(Hn,{size:20})},{path:"/calendar",label:t("nav.calendar"),icon:a.jsx($n,{size:20}),hideInSimpleMode:!0},{path:"/settings",label:t("nav.settings"),icon:a.jsx(we,{size:20})}],i=r?o.filter(l=>!l.hideInSimpleMode):o;return a.jsx("nav",{className:w("md:hidden","fixed bottom-0 left-0 right-0 z-50","bg-nav-bg/95 backdrop-blur-md","border-t border-surface-200 dark:border-surface-700","shadow-soft-sm","w-full max-w-full overflow-x-hidden"),style:{paddingBottom:"env(safe-area-inset-bottom, 0px)"},role:"navigation","aria-label":t("nav.mainNavigation"),children:a.jsx("div",{className:"flex items-center justify-around py-1",children:i.map(l=>{const d=l.path==="/"?e.pathname==="/"||e.pathname==="/home":e.pathname.startsWith(l.path);return a.jsxs(Ct,{to:l.path,onClick:l.path==="/"?()=>s("all"):void 0,className:w("min-w-touch-sm min-h-touch-sm","relative flex flex-col items-center justify-center gap-0.5","rounded-soft mx-0.5","transition-all duration-200 ease-soft",d?"text-nav-text-active bg-primary-500/10":"text-nav-text hover:text-nav-text-active hover:bg-surface-100 dark:hover:bg-surface-200"),"aria-current":d?"page":void 0,children:[a.jsx("span",{"aria-hidden":"true",children:l.icon}),a.jsx("span",{className:w("text-xs",d?"font-semibold":"font-medium"),children:l.label})]},l.path)})})})}function je({fullScreen:e,message:t,subMessage:n,size:s="md",useLogo:r=!1}){const{t:o}=C(),i={sm:"w-8 h-8 border-2",md:"w-12 h-12 border-3",lg:"w-16 h-16 border-4"},l={sm:"w-8 h-8",md:"w-12 h-12",lg:"w-16 h-16"};return a.jsxs("div",{className:w("flex items-center justify-center",e&&"flex-col min-h-screen bg-background"),role:"status","aria-label":t||o("common.loading"),children:[r?a.jsxs("div",{className:"relative flex items-center justify-center",children:[a.jsx("div",{className:w("absolute rounded-full border-2 border-primary-200 border-t-primary-600 animate-spin",s==="sm"&&"w-12 h-12",s==="md"&&"w-16 h-16",s==="lg"&&"w-20 h-20"),style:{animationDuration:"1.2s"}}),a.jsx("img",{src:"/images/logo-icon.png",alt:"TasKudos",className:w(l[s],"animate-pulse"),style:{animationDuration:"1.5s"}})]}):a.jsxs("div",{className:"relative",children:[a.jsx("div",{className:w("roun
2ded-full border-primary-100 dark:border-primary-900/30",i[s])}),a.jsx("div",{className:w("absolute top-0 left-0 rounded-full animate-spin","border-primary-600 border-t-transparent dark:border-primary-400",i[s])})]}),t?a.jsx("p",{className:"mt-4 text-surface-600 font-medium animate-pulse-soft",children:t}):a.jsx("span",{className:"sr-only",children:o("common.loading")}),n&&a.jsx("p",{className:"mt-2 text-xs text-surface-400",children:n})]})}const se=c.forwardRef(({className:e,size:t="md",variant:n="primary",fullWidth:s,disabled:r,children:o,...i},l)=>{const d={sm:"min-w-touch-sm min-h-touch-sm px-4 text-sm",md:"min-w-touch-md min-h-touch-md px-6 text-base",lg:"min-w-touch-lg min-h-touch-lg px-8 text-lg"},u={primary:["bg-primary-600 text-white","hover:bg-primary-700 active:bg-primary-800","shadow-soft hover:shadow-soft-md active:shadow-soft-sm"].join(" "),secondary:["bg-surface-200 text-surface-700 border border-surface-300","hover:bg-surface-300 hover:border-surface-400 active:bg-surface-400","shadow-soft-xs hover:shadow-soft-sm"].join(" "),ghost:["bg-transparent text-surface-600","hover:bg-surface-200 active:bg-surface-300"].join(" "),danger:["bg-error text-white","hover:bg-error/80 active:bg-error/70","shadow-soft hover:shadow-soft-md active:shadow-soft-sm"].join(" ")};
2return a.jsx("button",{ref:l,className:w("rounded-soft font-medium","transition-all duration-200 ease-soft","flex items-center justify-center","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2","cursor-pointer",d[t],u[n],s&&"w-full",r&&"opacity-50 cursor-not-allowed pointer-events-none shadow-none",e),disabled:r,"aria-disabled":r,...i,children:o})});se.displayName="TouchFriendlyButton";const mt="email-verification-dismissed";function rr({email:e,onVerified:t}){const{t:n}=C(),{resendVerificationEmail:s,user:r}=J(),[o,i]=c.useState(!1),[l,d]=c.useState(!1),[u,p]=c.useState(!1);c.useEffect(()=>{sessionStorage.getItem(mt)==="true"&&p(!0)},[]);const m=()=>{sessionStorage.setItem(mt,"true"),p(!0)};if(u)return null;const g=async()=>{try{i(!0),await s(),ae(n("toast.email.resent"))}catch(f){const b=ze(f);le(b)}finally{i(!1)}},h=async()=>{if(r)try{d(!0),await r.reload(),r.emailVerified?(ae(n("toast.email.verified")),t==null||t(),window.location.reload()):le(n("toast.email.notVerified"))}catch(f){const b=ze(f);le(b)}finally{d(!1)}};return a.jsxs("div",{"data-testid":"verification-banner",className:"bg-warning/10 border border-warning/30 rounded-xl p-6 max-w-md mx-auto relative",children:[a.jsx("button",{onClick:m,className:"absolute top-3 right-3 p-1.5 rounded-full hover:bg-warning/20 transition-colors text-surface-500 hover:text-surface-700 dark:hover:text-surface-200","aria-label":n("emailVerification.dismissLabel"),title:n("emailVerification.dismissTitle"),children:a.jsx(Re,{size:18})}),a.jsxs("div",{className:"flex items-center gap-3 mb-4 pr-8",children:[a.jsx("div",{className:"p-2 bg-warning/20 rounded-full",children:a.jsx(Jn,{className:"text-warning",size:24})}),a.jsx("h2",{className:"text-lg font-semibold text-foreground",children:n("emailVerification.title")})]}),a.jsxs("div",{className:"space-y-3 text-sm text-muted-foreground",children:[a.jsx("p",{children:n("emailVerification.sentTo",{email:e||(r==null?void 0:r.email)})}),a.jsx("p",{children:n("emailVerification.clickLink")})]}),a.jsxs("div",{className:"mt-6 space-y-3",children:[a.jsxs(se,{variant:"primary",size:"lg",fullWidth:!0,onClick:h,disabled:l,children:[a.jsx(Nt,{size:18,className:"mr-2"}),n(l?"emailVerification.checking":"emailVerification.clickWhenDone")]}),a.jsxs(se,{variant:"secondary",size:"lg",fullWidth:!0,onClick:g,disabled:o,children:[a.jsx(Yn,{size:18,className:`mr-2 ${o?"animate-spin":""}`}),n(o?"emailVerification.sending":"emailVerification.resend")]})]}),a.jsx("p",{className:"mt-4 text-xs text-muted-foreground text-center",children:n("emailVerification.checkSpam")})]})}class or extends c.Component{constructor(n){super(n);he(this,"handleRetry",()=>{this.setState({hasError:!1,error:null}),window.location.reload()});he(this,"handleGoHome",()=>{this.setState({hasError:!1,error:null}),window.location.href="/"});this.state={hasError:!1,error:null,isFirestoreError:!1}}static getDerivedStateFromError(n){var s;return(s=n.message)!=null&&s.includes("INTERNAL ASSERTION FAILED")?(console.warn("Firestore internal error (ignorable):",n.message),{hasError:!1,error:null,isFirestoreError:!0}):{hasError:!0,error:n,isFirestoreError:!1}}componentDidCatch(n,s){var r;if((r=n.message)!=null&&r.includes("INTERNAL ASSERTION FAILED")){console.warn("Firestore internal error caught:",n.message);return}console.error("Error caught by boundary:",n,s),s.componentStack}render(){return this.state.hasError?this.props.fallback?this.props.fallback:a.jsx("div",{className:"min-h-screen flex items-center justify-center bg-surface-50 px-4",children:a.jsxs("div",{className:"max-w-md w-full text-center",children:[a.jsx("div",{className:"text-6xl mb-4",children:"😵"}),a.jsx("h1",{className:"text-2xl font-bold text-surface-900 mb-2",children:_.t("error.occurred")}),a.jsx("p",{className:"text-surface-600 mb-6",children:_.t("error.temporaryIssue")}),a.jsxs("div",{className:"flex gap-3 justify-center",children:[a.jsx("button",{onClick:this.handleGoHome,className:"px-4 py-2 border border-surface-300 rounded-lg text-surface-700 hover:bg-surface-100 transition-colors",children:_.t("error.goHome")}),a.jsx("button",{onClick:this.handleRetry,className:"px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors",children:_.t("error.reloadPage")})]}),!1]})}):this.props.children}}function ir({targetId:e="main-content",label:t="メインコンテンツへスキップ"}){const n=s=>{s.preventDefault();const r=document.getElementById(e);r&&(r.focus(),r.scrollIntoView({behavior:"smooth"}))};return a.jsx("a",{href:`#${e}`,onClick:n,className:`
3        sr-only focus:not-sr-only
4        focus:fixed focus:top-4 focus:left-4 focus:z-fixed
5        focus:px-4 focus:py-2
6        focus:bg-primary-600 focus:text-white
7        focus:rounded-lg focus:shadow-lg
8        focus:outline-none focus:ring-2 focus:ring-primary-400 focus:ring-offset-2
9        transition-all
10      `,children:t})}const z={creationAttemptedForUser:null,isCreating:!1};function lr(){const{user:e}=J(),{data:t,isLoading:n}=Ge((e==null?void 0:e.uid)||""),s=Es(),{selectedGroupId:r,setSelectedGroupId:o}=Me(),[i,l]=c.useState(!1),d=c.useRef(!1),u=c.useRef(null);return c.useEffect(()=>{(e==null?void 0:e.uid)!==u.current&&(d.current=!1,u.current=(e==null?void 0:e.uid)||null,e!=null&&e.uid&&z.creationAttemptedForUser!==e.uid&&(z.creationAttemptedForUser=null,z.isCreating=!1))},[e==null?void 0:e.uid]),c.useEffect(()=>{t&&t.length>0&&!r&&t[0]&&o(t[0].id)},[t,r,o]),c.useEffect(()=>{if(d.current||z.isCreating||e&&z.creationAttemptedForUser===e.uid||!e||n||i||!t||t.some(g=>g.isPersonal))return;d.current=!0,z.creationAttemptedForUser=e.uid,z.isCreating=!0,l(!0);const m=e.displayName?`${e.displayName}のグループ`:"マイグループ";s.mutate({input:{name:m,description:"個人用のデフォルトグループ",isPersonal:!0},userId:e.uid,userEmail:e.email,userName:e.displayName||void 0},{onSuccess:g=>{o(g.id),l(!1),z.isCreating=!1},onError:()=>{d.current=!1,z.creationAttemptedForUser=null,z.isCreating=!1,l(!1)}})},[e,t,n,i]),{isCreating:i}}const cr=1800*1e3,dr=300*1e3;function ur(e={}){const{timeout:t=cr,warningTime:n=dr,onWarning:s,onTimeout:r,enabled:o=!0}=e,i=c.useRef(null),l=c.useRef(null),d=c.useRef(Date.now()),u=c.useCallback(()=>{i.current&&(clearTimeout(i.current),i.current=null),l.current&&(clearTimeout(l.current),l.current=null)},[]),p=c.useCallback(async()=>{try{await Mt(I),r==null||r()}catch(g){console.error("Session timeout logout error:",g)}},[r]),m=c.useCallback(()=>{if(!o)return;d.current=Date.now(),u();const g=t-n;g>0&&(l.current=setTimeout(()=>{s==null||s()},g)),i.current=setTimeout(p,t)},[o,t,n,s,p,u]);return c.useEffect(()=>{if(!o)return;const g=["mousedown","keydown","touchstart","scroll","mousemove"];let h=0;const f=()=>{const b=Date.now();b-h>100&&(h=b,m())};return g.forEach(b=>{window.addEventListener(b,f,{passive:!0})}),m(),()=>{g.forEach(b=>{window.removeEventListener(b,f)}),u()}},[o,m,u]),c.useEffect(()=>{if(!o)return;const g=()=>{document.visibilityState==="visible"&&(Date.now()-d.current>=t?p():m())};return document.addEventListener("visibilitychange",g),()=>{document.removeEventListener("visibilitychange",g)}},[o,t,p,m]),{resetTimer:m,lastActivity:d.current}}const on=0,ln=100;function mr(e){return e===void 0?!0:typeof e=="number"&&Number.isInteger(e)&&e>=on&&e<=ln}function cn(e){if(e!==void 0){if(!mr(e))throw new Error(`progress must be an integer between ${on} and ${ln} (got: ${String(e)})`);return e}}const F="tasks";function dn(e){return Qe({id:e.id,...e.data()})}async function pr(e,t,n){const s=!n||n==="",i=await fs(s?"personal":"team",s?null:n,t);if(!i.allowed)throw new Error(`RESOURCE_LIMIT_REACHED:${_.t("error.task.limitReached",{limit:i.limit})}`);const l=0,d=P.now(),u=s?"personal":"private",p={title:e.title,description:e.description||null,status:e.status||"todo",priority:e.priority||"medium",difficulty:e.difficulty||"normal",baseCP:e.baseCP??null,taskType:e.taskType||"standard",createdBy:t,issuerId:e.issuerId||t,teamId:n,accessType:u,hierarchyLevel:l,childTaskIds:[],startDate:e.startDate?P.fromDate(new Date(e.startDate)):d,startTime:e.startTime||null,dueDate:e.dueDate?P.fromDate(new Date(e.dueDate)):null,dueTime:e.dueTime||null,isAllDay:e.isAllDay!==!1,category:e.category||null,progress:0,deletedAt:null,createdAt:d,updatedAt:d},m=await Ne(N(x,F),p);return await Gt(x),await $t(t),{id:m.id,...e,status:e.status||"todo",priority:e.priority||"medium",taskType:e.taskType||"standard",createdBy:t,issuerId:e.issuerId||t,teamId:n,accessType:u,hierarchyLevel:l,childTaskIds:[],startDate:e.startDate||new Date,progress:0,createdAt:new Date,updatedAt:new Date}}async function gr(e,t,n){const s=E(x,F,e),r={updatedAt:P.now()},o=["createdBy","teamId"];for(const[i,l]of Object.entries(t))l!==void 0&&(o.includes(i)||(i==="dueDate"||i==="startDate"?l===null||l===""?r[i]=null:l instanceof Date?r[i]=P.fromDate(l):typeof l=="string"&&(r[i]=P.fromDate(new Date(l))):i==="startTime"||i==="dueTime"?r[i]=l===null||l===""?null:l:i==="progress"?r[i]=cn(l):r[i]=l));await te(s,r)}async function fr(e,t){const n=E(x,F,e);await te(n,{deletedAt:P.now(),updatedAt:P.now()})}async function un(e){const t=E(x,F,e),n=await ve(t);return n.exists()?Qe({id:n.id,...n.data()}):null}async function hr(e){if(!e.length)return[];const t=30,n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return(await Promise.all(n.map(async r=>{const o=G(N(x,F),M(Ut(),"in",r));return(await Y(o)).docs.map(l=>Qe({id:l.id,...l.data()}))}))).flat()}async function zl(e){const t=E(x,F,e);await te(t,{deletedAt:null,updatedAt:P.now()})}
10async function Hl(e,t=50){const n=G(N(x,F),M("createdBy","==",e),M("deletedAt","!=",null),ne(t));return(await Y(n)).docs.map(dn)}async function $l(e){const t=E(x,F,e);await Ot(t)}async function yr(e,t,n,s){var d;const r=N(x,F),o=(d=e.groupIds)!=null&&d.length?e.groupIds:e.groupId?[e.groupId]:s?[s]:[],i=dn,l=async u=>{if(u.length===0)return[];const p=[],m=new Set,g=[];for(let h=0;h<u.length;h+=10)g.push(u.slice(h,h+10));for(const h of g){const f=G(r,M("deletedAt","==",null),M("teamId","in",h),ne(De.TASKS_DEFAULT));(await Y(f)).docs.forEach(y=>{m.has(y.id)||(m.add(y.id),p.push(i(y)))})}return p};if(e.mode==="all"){const u=n!=null&&n.length?n:o;return l(u)}return e.mode==="group"?o.length===0?[]:l(o):e.mode==="personal"?o.length===0?[]:l(o):[]}async function br(e){const{taskId:t,mode:n,newTaskTitles:s,userId:r,teamId:o}=e,i=await un(t);if(!i)throw new Error(_.t("error.task.splitSourceNotFound"));const l=ge(x),d=P.now(),u=[];if(n==="parent-child"){const m=i.hierarchyLevel+1;if(m>2)throw new Error(_.t("error.task.maxHierarchySplit"));const g=[];for(const f of s){const b=E(N(x,F));g.push(b.id),l.set(b,{title:f.trim(),status:"todo",priority:i.priority,createdBy:r,teamId:o,hierarchyLevel:m,parentTaskId:t,childTaskIds:[],deletedAt:null,createdAt:d,updatedAt:d}),u.push({id:b.id,title:f.trim(),status:"todo",priority:i.priority,createdBy:r,teamId:o,hierarchyLevel:m,parentTaskId:t,childTaskIds:[],createdAt:d.toDate(),updatedAt:d.toDate()})}const h=E(x,F,t);return l.update(h,{childTaskIds:wa(...g),updatedAt:d}),await l.commit(),{parentTask:{...i,childTaskIds:[...i.childTaskIds||[],...g],updatedAt:d.toDate()},childTasks:u}}else{for(const m of s){const g=E(N(x,F));l.set(g,{title:m.trim(),status:"todo",priority:i.priority,createdBy:r,teamId:o,hierarchyLevel:0,childTaskIds:[],deletedAt:null,createdAt:d,updatedAt:d}),u.push({id:g.id,title:m.trim(),status:"todo",priority:i.priority,createdBy:r,teamId:o,hierarchyLevel:0,childTaskIds:[],createdAt:d.toDate(),updatedAt:d.toDate()})}const p=E(x,F,t);return l.update(p,{deletedAt:d,updatedAt:d}),await l.commit(),{childTasks:u}}}async function Jl(e,t,n){if(e.length===0)return{success:0,errors:0};const s=ge(x),r=P.now();let o=0,i=0;for(const l of e)try{const d=E(x,F,l.id),u={title:l.title,description:l.description||null,status:l.status||"todo",priority:l.priority||"medium",assigneeId:l.assigneeId||null,createdBy:l.createdBy||t,teamId:l.teamId||n,startDate:l.startDate?P.fromDate(new Date(l.startDate)):null,dueDate:l.dueDate?P.fromDate(new Date(l.dueDate)):null,progress:cn(l.progress)??0,estimatedDays:l.estimatedDays||null,dependsOnTaskIds:l.dependsOnTaskIds||[],hierarchyLevel:l.hierarchyLevel??0,parentTaskId:l.parentTaskId||null,childTaskIds:l.childTaskIds||[],category:l.category||null,deletedAt:null,createdAt:l.createdAt?P.fromDate(new Date(l.createdAt)):r,updatedAt:r};s.set(d,u,{merge:!0}),o++}catch{i++}return await s.commit(),{success:o,errors:i}}async function xr(e,t,n){const s=e.map(l=>l.trim()).filter(l=>l.length>0).slice(0,100);if(s.length===0)return[];const r=ge(x),o=[],i=P.now();for(const l of s){const d=E(N(x,F)),u={title:l,status:"todo",priority:"medium",createdBy:t,teamId:n,hierarchyLevel:0,childTaskIds:[],deletedAt:null,createdAt:i,updatedAt:i};r.set(d,u),o.push({id:d.id,title:l,status:"todo",priority:"medium",createdBy:t,teamId:n,hierarchyLevel:0,childTaskIds:[],createdAt:i.toDate(),updatedAt:i.toDate()})}return await r.commit(),o}async function Yl(e,t,n){var r;const s={success:!0,createdCount:0,failedCount:0,taskIds:[],errors:[]};if(e.length===0)return{...s,success:!1,errors:["タスクが指定されていません"]};if(e.length>20)return{...s,success:!1,errors:["一度に登録できるタスクは20件までです"]};try{const o=ge(x),i=N(x,F),l=P.now();for(const d of e){if(!((r=d.title)!=null&&r.trim())){s.errors.push("タイトルが空のタスクがあります"),s.failedCount++;continue}const u=E(i),p=!d.startTime&&!d.dueTime,m={title:d.title.slice(0,100),description:d.description||null,status:"todo",priority:d.priority||"medium",difficulty:"normal",baseCP:null,teamId:t,createdBy:n,issuerId:n,assigneeId:d.assigneeId||null,startDate:d.startDate?P.fromDate(d.startDate):null,startTime:d.startTime||null,dueDate:d.dueDate?P.fromDate(d.dueDate):null,dueTime:d.dueTime||null,isAllDay:d.isAllDay??p,category:d.category||null,hierarchyLevel:0,childTaskIds:[],progress:0,deletedAt:null,createdAt:l,updatedAt:l};o.set(u,m),s.taskIds.push(u.id)}await o.commit(),s.createdCount=s.taskIds.length}catch(o){s.success=!1,s.failedCount=e.length-s.createdCount,s.errors.push(o instanceof Error?o.message:"Unknown error")}return s}
10const Q={all:["tasks"],list:(e,t,n)=>["tasks",e,t,n],detail:e=>["task",e],messages:e=>["messages",e]};function kr(e,t){return Cs(t)?!1:e<2}function Ql(e,t,n){var p;const{data:s,isLoading:r}=Ge(t??""),o=(s==null?void 0:s.map(m=>m.id))??[],i=(p=e.groupIds)!=null&&p.length?e.groupIds:e.groupId?[e.groupId]:n?[n]:[],l=e.mode==="all"?o:i,d=!r&&(e.mode==="all"&&!!t&&o.length>0||e.mode==="group"&&i.length>0||e.mode==="personal"&&!!t),u=[...l].sort().join(",");return me({queryKey:["tasks",e.mode,u,t],queryFn:()=>yr(e,t,o,n),enabled:d,staleTime:1e3,refetchOnWindowFocus:!1,retry:kr})}function Xl(e){return me({queryKey:["task",e],queryFn:()=>un(e),enabled:!!e})}function Zl(e){return me({queryKey:["tasks","byIds",e.sort().join(",")],queryFn:async()=>!e||e.length===0?[]:hr(e),enabled:e.length>0})}function ec(){const{t:e}=C();return q({mutationFn:({input:t,userId:n,teamId:s})=>pr(t,n,s),successMessage:e("toast.task.created"),invalidateKeys:[Q.all]})}function wr(){const{t:e}=C(),t=V();return q({mutationFn:({taskId:n,input:s})=>gr(n,s),successMessage:e("toast.task.updated"),invalidateKeys:[Q.all],onSuccess:async(n,s)=>{var r,o;if(t.setQueryData(Q.detail(s.taskId),i=>i&&{...i,...s.input}),t.invalidateQueries({queryKey:Q.detail(s.taskId)}),s.input.assigneeId&&((r=s.currentTask)==null?void 0:r.assigneeId)!==s.input.assigneeId&&s.fromUserId&&s.fromUserId!==s.input.assigneeId)try{await Bs(s.input.assigneeId,s.fromUserId,s.taskId,((o=s.currentTask)==null?void 0:o.title)||e("common.task"),s.fromUserName||e("common.user"))}catch(i){console.error("Failed to create assignment notification:",i)}}})}function tc(){const{t:e}=C(),t=V();return q({mutationFn:n=>fr(n),successMessage:e("toast.task.deleted"),invalidateKeys:[Q.all],onSuccess:(n,s)=>{t.removeQueries({queryKey:Q.detail(s)})}})}function nc(){const{t:e}=C();return q({mutationFn:({titles:t,userId:n,teamId:s})=>xr(t,n,s),invalidateKeys:[Q.all],onSuccess:t=>{ae(e("toast.task.batchCreated",{count:t.length}))}})}function ac(){const{t:e}=C(),t=V();return q({mutationFn:n=>br(n),invalidateKeys:[Q.all],onSuccess:(n,s)=>{t.invalidateQueries({queryKey:Q.detail(s.taskId)});const r=s.mode==="parent-child"?e("toast.task.splitParentChild"):e("toast.task.splitComplete");ae(e("toast.task.splitSuccess",{mode:r,count:n.childTasks.length}))}})}function vr({children:e}){const{t}=C(),[n,s]=c.useState(null),r=wr(),o=c.useCallback(d=>{var p;const u=(p=d.active.data.current)==null?void 0:p.task;u&&s(u)},[]),i=c.useCallback(d=>{var h;const{active:u,over:p}=d;if(s(null),!p)return;const m=(h=u.data.current)==null?void 0:h.task,g=p.data.current;if(!(!m||!g)&&!(g.type==="team"&&m.teamId===g.id)&&!(g.type==="personal"&&!m.teamId))try{g.type==="personal"?(r.mutate({taskId:m.id,input:{teamId:void 0}}),ae(t("tasks.dnd.movedToPersonal"))):g.type==="team"&&(r.mutate({taskId:m.id,input:{teamId:g.id}}),ae(t("tasks.dnd.movedToGroup")))}catch(f){console.error("Task move error:",f),le(t("tasks.dnd.moveError",{error:f instanceof Error?f.message:String(f)}))}},[r,t]),l=c.useCallback(()=>{s(null)},[]);return a.jsxs(Aa,{onDragStart:o,onDragEnd:i,onDragCancel:l,children:[e,a.jsx(Sa,{children:n&&a.jsxs("div",{className:"bg-surface-50 rounded-lg shadow-lg p-3 border-2 border-primary-400 opacity-90 max-w-[300px]",children:[a.jsx("p",{className:"font-medium text-sm truncate",children:n.title}),a.jsx("p",{className:"text-xs text-surface-500 mt-1",children:t("tasks.dnd.dropToMove")})]})})]})}const Tr=re()(ue(e=>({config:null,setWallpaper:t=>e({config:t}),clearWallpaper:()=>e({config:null})}),{name:"taskudos-wallpaper"}));function Ir(e){if(!(e!=null&&e.url))return{};const t=e.position??de.position??"cover";return{backgroundImage:`url(${e.url})`,backgroundSize:t==="tile"?"auto":t,backgroundPosition:"center",backgroundRepeat:t==="tile"?"repeat":"no-repeat",backgroundAttachment:"fixed"}}function Ar(e){if(!(e!=null&&e.url))return{};const t=e.opacity??de.opacity??.3,n=e.blur??de.blur??0;return{backdropFilter:n>0?`blur(${n}px)`:void 0,backgroundColor:`rgba(255, 255, 255, ${1-t})`}}const X={trialDurationDays:3,maxTasks:20,maxCategories:5,maxDataSizeBytes:1048576},mn="guest_",Sr=["notifications","groupInvite","gjSend","aiAssistant","export"],Cr=500,Er=200,pn=1440*60*1e3;function Pr(){const e=Date.now(),t=Math.random().toString(16).slice(2,10).padEnd(8,"0");return`${mn}${e}${t}`}function Dr(e){return e.startsWith(mn)}function et(e,t=X){return e+t.trialDurationDays*pn}function jr(e,t,n=X){return(t??Date.now())>=et(e,n)}function Lr(e,t,n=X){const s=t??Date.now(),o=et(e,n)-s;return o<=0?0:Math.ceil(o/pn)}function Rr(e,t=X){return e>=t.maxTasks?{allowed:!1,reason:`ゲストモードでは最大${t.maxTasks}件までタスクを作成できます`,currentCount:e,maxCount:t.maxTasks}:{allowed:!0,currentCount:e,maxCount:t.maxTasks}}function Nr(e,t=X){return e>=t.maxCategories?{allowed:!1,reason:`ゲストモードでは最大${t.maxCategories}件までカテゴリーを作成できます`,currentCount:e,maxCount:t.maxCategories}:{allowed:!0,currentCount:e,maxCount:t.maxCategories}}function _r(e){return!Sr.includes(e)}function Mr(e){return{notifications:"通知機能はアカウント作成後にご利用いただけます",groupInvite:"グループ招待はアカウント作成後にご利用いただけます",gjSend:"GJの送信はアカウント作成後にご利用いただけます",aiAssistant:"AIアシスタントはアカウント作成後にご利用いただけます",export:"データのエクスポートはアカウント作成後にご利用いただけます"}[e]??"この機能はアカウント作成後にご利用いただけます"}function gn(e,t){return e*Cr+t*Er}function Fr(e,t,n,s,r,o=X){const i=r??Date.now();return{guestId:e,startedAt:t,expiresAt:et(t,o),isExpired:jr(t,i,o),remainingDays:Lr(t,i,o),dataUsageBytes:gn(n,s),tasksCreated:n,categoriesCreated:s}}function pt(e,t){const n=gn(e,t),s=e>0||t>0,r=["ゲストモード中のタスクはFirestoreに移行されます"];return n>5e5&&r.push("データ量が多いため、移行に時間がかかる場合があります"),{tasksToMigrate:e,categoriesToMigrate:t,estimatedSizeBytes:n,canMigrate:s,warnings:r}}function Gr(e,t){return t?"お試し期間が終了しました | アカウントを作成してデータを引き継ぎましょう":e<=1?"お試し最終日 | アカウントを作成しましょう":`お試し中 | 残り${e}日 | アカウント作成`}function Or(e){let t=5381;for(let n=0;n<e.length;n++)t=(t<<5)+t+e.charCodeAt(n)&4294967295;return t.toString(36)}const Ur=4320*60*1e3;function fn(e,t,n){const s=`${n}:${e}:${t}`;return Or(s)}function Br(e,t,n){if(fn(e.guestId,e.startedAt,n)!==t){const r=[];
10return(!e.guestId||typeof e.guestId!="string")&&r.push("guestId"),(!e.startedAt||typeof e.startedAt!="number")&&r.push("startedAt"),r.length===0&&r.push("unknown"),{valid:!1,tamperedFields:r}}return{valid:!0}}function Wr(e,t=Ur,n){return Date.now()-e>=t}const ye="taskudos_guest_session",be="taskudos_guest_session_hash",gt="tkds_prod_v2_8f3a";function hn(e={}){const t=e.config??X,[n,s]=c.useState(()=>{if(typeof window>"u")return null;try{const v=localStorage.getItem(ye);if(!v)return null;const T=JSON.parse(v),R=localStorage.getItem(be);return R&&!Br({guestId:T.guestId,startedAt:T.startedAt},R,gt).valid?(localStorage.removeItem(ye),localStorage.removeItem(be),null):T}catch{return null}}),r=c.useMemo(()=>n?Fr(n.guestId,n.startedAt,n.tasksCreated,n.categoriesCreated,Date.now(),t):null,[n,t]);c.useEffect(()=>{typeof window>"u"||(n?localStorage.setItem(ye,JSON.stringify(n)):(localStorage.removeItem(ye),localStorage.removeItem(be)))},[n]);const o=c.useCallback(()=>{const v=Pr(),T=Date.now(),R=fn(v,T,gt);localStorage.setItem(be,R);const L={guestId:v,startedAt:T,tasksCreated:0,categoriesCreated:0};return localStorage.setItem(ye,JSON.stringify(L)),s(L),v},[]),i=c.useCallback(()=>{localStorage.removeItem(be),s(null)},[]),l=c.useCallback(()=>{s(v=>v&&{...v,tasksCreated:v.tasksCreated+1})},[]),d=c.useCallback(()=>{s(v=>v&&{...v,categoriesCreated:v.categoriesCreated+1})},[]),u=c.useCallback(()=>n?Rr(n.tasksCreated,t):{allowed:!0,currentCount:0,maxCount:t.maxTasks},[n,t]),p=c.useCallback(()=>n?Nr(n.categoriesCreated,t):{allowed:!0,currentCount:0,maxCount:t.maxCategories},[n,t]),m=c.useCallback(v=>n?_r(v):!0,[n]),g=c.useCallback(v=>Mr(v),[]),h=c.useCallback(()=>n?pt(n.tasksCreated,n.categoriesCreated):pt(0,0),[n]),f=n!==null&&Dr(n.guestId),b=n?Wr(n.startedAt):!1,y=(r==null?void 0:r.remainingDays)??0,D=f?Gr(y,b):"";return{isGuest:f,session:r,isExpired:b,remainingDays:y,bannerMessage:D,startGuestSession:o,endGuestSession:i,incrementTaskCount:l,incrementCategoryCount:d,canCreateTask:u,canCreateCategory:p,isFeatureEnabled:m,getDisabledMessage:g,getMigrationSummary:h}}const ft="tourHiddenNoticeShown";function Vr(){const{t:e}=C(),{user:t}=J(),[n,s]=c.useState(!1);return c.useEffect(()=>{const r=(t==null?void 0:t.level)??0,o=localStorage.getItem(ft)==="true";r>=5&&!n&&!o&&(Fa(e("onboarding.tour.hiddenNotice")),localStorage.setItem(ft,"true"),s(!0))},[t,n,e]),null}const qr=c.lazy(()=>k(()=>import("./CommandPalette-CXx9vHx3.js"),__vite__mapDeps([11,1,2,5,6,7,8,4,9,10]))),Kr=c.lazy(()=>k(()=>
10import("./CookieConsentBanner-wLdz1-Tj.js"),__vite__mapDeps([12,1,2,5,6]))),zr=c.lazy(()=>k(()=>import("./GuestModeIndicator-D0bDjE5m.js"),__vite__mapDeps([13,1,2,5,6,7,8,4,9,10])).then(e=>({default:e.GuestModeIndicator}))),Hr=c.lazy(()=>k(()=>import("./GuestLimitModal-BRPMI3uX.js"),__vite__mapDeps([14,1,2,5,6,7,8,4,9,10])).then(e=>({default:e.GuestLimitModal}))),$r=c.lazy(()=>k(()=>import("./GuestExitDialog-0zvgjjwJ.js"),__vite__mapDeps([15,1,2,5,6])).then(e=>({default:e.GuestExitDialog}))),Jr=c.lazy(()=>k(()=>import("./OnboardingTour-BQgT3Aii.js"),__vite__mapDeps([16,1,2,7,17,3,4,5,6,8,9,10])).then(e=>({default:e.OnboardingTour}))),Yr=c.lazy(()=>k(()=>import("./GlobalAIButton-Wu-ukxTs.js"),__vite__mapDeps([18,1,2,19,4,5,20,7,21,6,8,9,10]))),Qr=c.lazy(()=>k(()=>import("./InstallBanner-DkFS5q-9.js"),__vite__mapDeps([22,1,2,23,5,6]))),Xr=c.lazy(()=>k(()=>import("./OfflineIndicator-CcdI5_g0.js"),__vite__mapDeps([24,1,2,5,6,7,8,4,9,10])));function Zr(){const{t:e}=C(),t=oe(),n=pe(),{user:s,loading:r,isPasswordUser:o}=J(),{isCreating:i}=lr(),[l,d]=c.useState(!1),[u,p]=c.useState(!1),{isGuest:m,session:g,isExpired:h,remainingDays:f,endGuestSession:b}=hn(),[y,D]=c.useState(!1),[v,T]=c.useState(!1),[R,L]=c.useState(!1),S=c.useCallback(()=>{!!g&&(g.tasksCreated>0||g.categoriesCreated>0)?L(!0):(b(),t("/landing"))},[g,b,t]),K=c.useCallback(()=>{b(),L(!1),t("/landing")},[b,t]),yn=$e({onSwipedRight:O=>{O.initial[0]<=30&&!l&&n.pathname!=="/"&&t(-1)},trackMouse:!1,preventScrollOnSwipe:!1,delta:50}),{config:fe}=Tr(),bn=Te(O=>O.groupId),xn=c.useCallback(()=>{Ma(e("toast.session.warning"))},[e]),kn=c.useCallback(()=>{le(e("toast.session.timeout")),t("/login")},[t,e]);ur({enabled:!!s,onWarning:xn,onTimeout:kn}),c.useEffect(()=>{m&&h&&!v&&(D(!0),T(!0))},[m,h,v]);const wn=c.useMemo(()=>{const O=n.pathname;return O.startsWith("/kanban")||O.startsWith("/wip")?"wip":O.startsWith("/calendar")?"calendar":"list"},[n.pathname]),vn=c.useMemo(()=>{const O=n.pathname;return O==="/tasks"||O.startsWith("/kanban")||O.startsWith("/wip")||O.startsWith("/calendar")},[n.pathname]);if(r)return a.jsx(je,{fullScreen:!0,useLogo:!0});if(i)return a.jsx(je,{fullScreen:!0,useLogo:!0,message:e("rootLayout.preparingGroup")});const Tn=s&&o()&&!s.emailVerified&&!0;return a.jsxs(vr,{children:[a.jsx(ir,{}),a.jsxs("div",{...yn,className:"min-h-screen bg-background w-full max-w-full overflow-x-hidden",style:Ir(fe),children:[(fe==null?void 0:fe.url)&&a.jsx("div",{className:"fixed inset-0 pointer-events-none dark:bg-black/20",style:Ar(fe)}),a.jsx(Ys,{onOpenDrawer:()=>d(!0),activeView:wn,showViewSwitcher:vn}),m&&g&&a.jsx(c.Suspense,{fallback:null,children:a.jsx("div",{className:"fixed left-0 right-0 z-40",style:{top:"calc(104px + env(safe-area-inset-top, 0px))"},children:a.jsx(zr,{remainingDays:f,isExpired:h,tasksCreated:g.tasksCreated,maxTasks:X.maxTasks,variant:"banner",onExit:S})})}),a.jsx(tr,{isOpen:l,onClose:()=>d(!1)}),u&&a.jsx(c.Suspense,{fallback:null,children:a.jsx(qr,{isOpen:u,onClose:()=>p(!1)})}),a.jsxs("main",{id:"main-content",tabIndex:-1,className:"max-w-none px-4 lg:px-8 pb-8 md:pb-8 pb-20 overflow-x-hidden focus:outline-none",style:{paddingTop:`calc(${m?"148px":"104px"} + env(safe-area-inset-top, 0px))`},children:[Tn&&a.jsx("div",{className:"mb-6",children:a.jsx(rr,{email:(s==null?void 0:s.email)||void 0})}),a.jsx(or,{children:a.jsx(Dn,{})})]}),a.jsx(sr,{}),a.jsx(c.Suspense,{fallback:null,children:a.jsx(Jr,{})}),a.jsx(Vr,{}),s&&n.pathname!=="/help"&&a.jsx(c.Suspense,{fallback:null,children:a.jsx(Yr,{teamId:bn})}),a.jsx(c.Suspense,{fallback:null,children:a.jsx(Kr,{})}),a.jsx(c.Suspense,{fallback:null,children:a.jsx(Qr,{})}),a.jsx(c.Suspense,{fallback:null,children:a.jsx(Xr,{})}),m&&a.jsx(c.Suspense,{fallback:null,children:a.jsx(Hr,{isOpen:y,onClose:()=>D(!1),limitType:"expired",currentCount:(g==null?void 0:g.tasksCreated)||0,maxCount:X.maxTasks})}),m&&R&&a.jsx(c.Suspense,{fallback:null,children:a.jsx($r,{isOpen:R,onDiscardEnd:K,onCancel:()=>L(!1)})})]})]})}const ke={BIOMETRIC_ENABLED:"biometric_enabled",USER_ID:"auth_user_id",USER_EMAIL:"auth_user_email",LAST_LOGIN:"auth_last_login",VOICE_INPUT_ENABLED:"voice_input_enabled",VOICE_OUTPUT_ENABLED:"voice_output_enabled",VOICE_LANGUAGE:"voice_language"};function eo(){const e=c.useCallback(async(r,o)=>{localStorage.setItem(r,o)},[]),t=c.useCallback(async r=>localStorage.getItem(r),[]),n=c.useCallback(async r=>{localStorage.removeItem(r)},[]),s=c.useCallback(async()=>{await n(ke.BIOMETRIC_ENABLED),await n(ke.USER_ID),await n(ke.USER_EMAIL),await n(ke.LAST_LOGIN)},[n]);
10return{setItem:e,getItem:t,removeItem:n,clearAuthPrefs:s}}const to=c.lazy(()=>k(()=>import("./BiometricGuard-6r3_1q7H.js"),__vite__mapDeps([25,1,2])));function j({children:e,redirectTo:t="/landing"}){const{user:n,loading:s,logout:r}=J(),{isGuest:o}=hn(),{removeItem:i}=eo(),l=pe(),u=n&&n.email||o;return s?St.createPortal(a.jsx("div",{className:"flex items-center justify-center bg-background",style:{position:"fixed",top:0,left:0,right:0,bottom:0,zIndex:99999},children:a.jsx(je,{})}),document.body):u?o?a.jsx(a.Fragment,{children:e}):a.jsx(c.Suspense,{fallback:a.jsx(a.Fragment,{children:e}),children:a.jsx(to,{children:e})}):(n&&!n.email&&(console.warn("[ProtectedRoute] Invalid session (no email), cleaning up in background"),i(ke.BIOMETRIC_ENABLED).catch(console.error),r().catch(console.error)),a.jsx(Z,{to:t,state:{from:l},replace:!0}))}function We(){var r;const{t:e}=C(),t=jn();c.useEffect(()=>{console.error("[RouteError]",t)},[t]);let n=e("error.occurred"),s="";return Ln(t)&&(n=`${t.status} ${t.statusText}`,s=((r=t.data)==null?void 0:r.message)||""),a.jsx("div",{className:"min-h-screen flex items-center justify-center p-4 bg-background",children:a.jsxs("div",{className:"max-w-md w-full bg-card rounded-lg shadow-lg p-6 text-center",children:[a.jsx("h1",{className:"text-2xl font-bold text-foreground mb-4",children:n}),a.jsx("p",{className:"text-muted-foreground mb-4",children:e("error.unexpectedError")}),s&&a.jsx("pre",{className:"text-xs text-left bg-muted p-2 rounded mb-4 overflow-auto max-h-32",children:s}),a.jsxs("div",{className:"space-y-2",children:[a.jsx(se,{onClick:()=>window.location.href="/",variant:"primary",size:"lg",fullWidth:!0,children:e("error.goHome")}),a.jsx(se,{onClick:()=>window.location.reload(),variant:"secondary",size:"lg",fullWidth:!0,children:e("error.reloadPage")})]})]})})}function ht(){const{t:e}=C();return a.jsx("div",{className:"min-h-screen flex items-center justify-center p-4 bg-background",children:a.jsxs("div",{className:"max-w-md w-full bg-card rounded-lg shadow-lg p-6 text-center",children:[a.jsx("h1",{className:"text-4xl font-bold text-foreground mb-4",children:"404"}),a.jsx("p",{className:"text-xl text-muted-foreground mb-6",children:e("error.pageNotFound")}),a.jsx(se,{onClick:()=>window.location.href="/",variant:"primary",size:"lg",fullWidth:!0,children:e("error.goHome")})]})})}const no=c.lazy(()=>k(()=>import("./HomePage-1_jyebgH.js"),__vite__mapDeps([26,1,2,27,5,20,7,28,29,30,19,4,31,14,6,8,9,10,32,33,34,35,36,37,38]))),ao=c.lazy(()=>k(()=>import("./TasksPage-D1bDyTow.js"),__vite__mapDeps([39,1,2,27,5,40,6,41,42,43,10,28,29,30,19,4,31,14,7,8,9,32,20,17,34,35,36,44,45,38,46]))),so=c.lazy(()=>k(()=>import("./TaskDetailPage-BTX0T5k2.js"),__vite__mapDeps([47,1,2,44,6,46,5,4,37,43,48,49,17,20,7,28,29,30,19,31,14,8,9,10,32,50]))),yt=c.lazy(()=>k(()=>import("./KanbanPage-CW0bpZ45.js"),__vite__mapDeps([51,1,2,41,5,6,52,20,7,28,29,30,19,4,31,14,8,9,10,32,27,46]))),ro=c.lazy(()=>k(()=>import("./CalendarPage-D1kfnG6f.js"),__vite__mapDeps([53,1,2,7,46,5,41,48,49,17,52,6,27,20,28,29,30,19,4,31,14,8,9,10,32,50]))),oo=c.lazy(()=>k(()=>import("./SettingsPage-BSfzD4Ti.js").then(e=>e.S),__vite__mapDeps([54,1,2,5,36,4,6]))),io=c.lazy(()=>k(()=>import("./LoginPage-Br9xExEO.js"),__vite__mapDeps([55,1,2,29,30,5,4,6,56,7,8,9,10]))),lo=c.lazy(()=>k(()=>import("./SignupPage-Ao7I3MdY.js"),__vite__mapDeps([57,1,2,29,30,58,5,6,4,56,7,8,9,10]))),co=c.lazy(()=>k(()=>import("./GroupsPage-CLrB58Qi.js"),__vite__mapDeps([59,1,2,27,5,60,4,35,36,6,42,61,7,8,9,10]))),uo=c.lazy(()=>k(()=>import("./CreateGroupPage-BD6BdHIO.js"),__vite__mapDeps([62,1,2,5,7,6,8,4,9,10]))),mo=c.lazy(()=>k(()=>import("./GroupDetailPage-cyzYO8bj.js"),__vite__mapDeps([63,1,2,5,6,7,8,4,9,10]))),bt=c.lazy(()=>k(()=>import("./GroupSettingsPage-Crk4xCEf.js"),__vite__mapDeps([64,1,2,40,5,6,27,4,65,7,8,9,10]))),po=c.lazy(()=>k(()=>import("./TaskSettingsPage-D3fu2I_-.js"),__vite__mapDeps([66,1,2,5,6]))),go=c.lazy(()=>k(()=>import("./CreateTaskPage-BqIah524.js"),__vite__mapDeps([67,1,2,7,6,8,4,9,5,10]))),fo=c.lazy(()=>k(()=>import("./MemoTaskPage-BnvM2KiM.js"),__vite__mapDeps([68,1,2,44,19,4,5,6,37,7,8,9,10]))),ho=c.lazy(()=>k(()=>import("./CategoriesPage-BzbIAE-h.js"),__vite__mapDeps([69,1,2,17,5,31,14,6,7,8,4,9,10,45,38]))),yo=c.lazy(()=>k(()=>import("./LandingPage-CH3Mog2H.js"),__vite__mapDeps([70,1,2,5,6,7,8,4,9,10]))),bo=c.lazy(()=>k(()=>import("./InvitePage-BaiRQfYr.js"),__vite__mapDeps([71,1,2,4,5,72,37,6,7,8,9,10]))),xo=c.lazy(()=>k(()=>import("./HelpPage-UTRFk0xF.js"),__vite__mapDeps([73,1,2,20,7,5,6,8,4,9,10]))),ko=c.lazy(()=>k(()=>import("./FeedbackPage-BK090UXK.js"),__vite__mapDeps([74,1,2,29,30,4,5,6,7,8,9,10]))),wo=c.lazy(()=>k(()=>import("./AdminFeedbackPage-wUrfX8hU.js"),__vite__mapDeps([75,1,2,4,76,5,6,7,8,9,10]))),vo=c.lazy(()=>k(()=>import("./AdminWhitelistPage-BrPpGRHj.js"),__vite__mapDeps([77,1,2,76,4,5,6,7,8,9,10]))),To=c.lazy(()=>k(()=>import("./ForgotPasswordPage-D9mObJGn.js"),__vite__mapDeps([78,1,2,29,30,5,6,7,8,4,9,10]))),Io=c.lazy(()=>k(()=>import("./ResetPasswordPage-DvJGhcUd.js"),__vite__mapDeps([79,1,2,29,30,4,5,6,7,8,9,10]))),Ao=c.lazy(()=>k(()=>import("./VerifyEmailPage-R09MTD6a.js"),__vite__mapDeps([80,1,2,5,6,7,8,4,9,10]))),So=c.lazy(()=>k(()=>import("./NotificationsPage-CjI5p7du.js"),__vite__mapDeps([81,1,2,4,5,6,82,49,7,8,9,10]))),Co=c.lazy(()=>k(()=>import("./GroupInvitePage-T1S8mUo5.js"),__vite__mapDeps([83,1,2,60,4,35,36,5,6,61,7,8,9,10]))),Eo=c.lazy(()=>k(()=>import("./InviteAcceptPage-DFKQW5PP.js"),__vite__mapDeps([84,1,2,4,72,37,5,6,82,49,7,8,9,10]))),Po=c.lazy(()=>k(()=>import("./TermsPage-CLpzb-b-.js"),__vite__mapDeps([85,1,2,86,5,6,7,8,4,9,10]))),Do=c.lazy(()=>k(()=>import("./PrivacyPolicyPage-CjTQAWwQ.js"),__vite__mapDeps([87,1,2,86,5,6,7,8,4,9,10]))),jo=c.lazy(()=>k(()=>import("./TokushohoPage-RGgJ7tgx.js"),__vite__mapDeps([88,1,2,5,6]))),Lo=c.lazy(()=>k(()=>import("./TrashPage-B9R2cxHz.js"),__vite__mapDeps([89,1,2,4,5,7,6,8,9,10])));function Ro(){const{teamId:e}=He();return a.jsx(Z,{to:`/groups/${e}`,replace:!0})}function No(){const{teamId:e}=He();return a.jsx(Z,{to:`/groups/${e}/settings`,replace:!0})}function _o(){const{teamId:e}=He();return a.jsx(Z,{to:`/groups/${e}/invite`,replace:!0})}function A(){return a.jsx("div",{className:"min-h-screen flex items-center justify-center",children:a.jsx(je,{})})}const Mo=Rn([{path:"/landing",errorElement:a.jsx(We,{}),element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(yo,{})})},{path:"/login",errorElement:a.jsx(We,{}),element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(io,{})})},{path:"/signup",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(lo,{})})},{path:"/forgot-password",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(To,{})})},{path:"/reset-password",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(Io,{})})},{path:"/verify-email",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(Ao,{})})},{path:"/invite/:teamId/:token",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(bo,{})})},{path:"/invite/:inviteCode",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(Eo,{})})},{path:"/terms",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(Po,{})})},{path:"/privacy",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(Do,{})})},{path:"/tokushoho",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(jo,{})})},{path:"/home",element:a.jsx(Z,{to:"/",replace:!0})},{path:"/",element:a.jsx(Zr,{}),errorElement:a.jsx(We,{}),children:[{index:!0,element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(no,{})})})},{path:"tasks",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(ao,{})})})},{path:"tasks/:taskId",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(so,{})})})},{path:"groups",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(co,{})})})},{path:"groups/new",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(uo,{})})})},{path:"groups/:groupId",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(mo,{})})})},{path:"groups/:groupId/settings",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(bt,{})})})},{path:"groups/settings",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(bt,{})})})},{path:"tasks/new",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(go,{})})})},{path:"tasks/settings",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(po,{})})})},{path:"tasks/memo",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(fo,{})})})},{path:"kanban",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(yt,{})})})},{path:"wip",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(yt,{})})})},{path:"categories",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(ho,{})})})},{path:"calendar",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(ro,{})})})},{path:"settings",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(oo,{})})})},{path:"trash",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(Lo,{})})})},{path:"help",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(xo,{})})})},{path:"feedback",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(ko,{})})})},{path:"admin/feedback",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(wo,{})})})},{path:"admin/whitelist",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(vo,{})})})},{path:"notifications",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(So,{})})})},{path:"groups/:groupId/invite",element:a.jsx(c.Suspense,{fallback:a.jsx(A,{}),children:a.jsx(j,{children:a.jsx(Co,{})})})},{path:"teams",element:a.jsx(Z,{to:"/groups",replace:!0})},{path:"teams/new",element:a.jsx(Z,{to:"/groups/new",replace:!0})},{path:"teams/settings",element:a.jsx(Z,{to:"/groups/settings",replace:!0})},{path:"teams/:teamId",element:a.jsx(Ro,{})}
10,{path:"teams/:teamId/settings",element:a.jsx(No,{})},{path:"teams/:teamId/invite",element:a.jsx(_o,{})},{path:"*",element:a.jsx(ht,{})}]},{path:"*",element:a.jsx(ht,{})}]);class Fo extends c.Component{constructor(n){super(n);he(this,"handleReload",()=>{window.location.reload()});this.state={hasError:!1}}static getDerivedStateFromError(n){return{hasError:!0,error:n}}componentDidCatch(n,s){console.error("ErrorBoundary caught an error:",n,s),s.componentStack}render(){return this.state.hasError?a.jsx("div",{className:"min-h-screen flex items-center justify-center p-4",children:a.jsxs("div",{className:"max-w-md w-full bg-background rounded-lg shadow-lg p-6 text-center",children:[a.jsx("h1",{className:"text-2xl font-bold text-foreground mb-4",children:_.t("error.occurred")}),a.jsx("p",{className:"text-muted-foreground mb-6",children:_.t("error.unexpectedErrorRetry")}),a.jsx(se,{onClick:this.handleReload,variant:"primary",size:"lg",fullWidth:!0,children:_.t("error.reloadPage")})]})}):this.props.children}}const Go=50,Oo={success:{icon:Nt,bgClass:"bg-success"},error:{icon:Zn,bgClass:"bg-error"},warning:{icon:Xn,bgClass:"bg-warning"},info:{icon:Qn,bgClass:"bg-info"}};function Uo({id:e,message:t,type:n,visible:s,onDismiss:r}){const{t:o}=C(),[i,l]=c.useState(0),[d,u]=c.useState(!1),[p,m]=c.useState(null),{icon:g,bgClass:h}=Oo[n],f=c.useCallback(v=>{if(d)return;const T=v.deltaX;l(Math.max(-150,Math.min(150,T)))},[d]),b=c.useCallback(v=>{const T=v.deltaX;Math.abs(T)>Go?(u(!0),m(T>0?"right":"left"),setTimeout(()=>r(e),200)):l(0)},[e,r]),y=$e({onSwiping:f,onSwiped:b,trackMouse:!0,preventScrollOnSwipe:!0,delta:10}),D=d?0:Math.max(.3,1-Math.abs(i)/150);return a.jsx(Ca,{children:s&&a.jsxs(Ea.div,{...y,initial:{opacity:0,y:50,scale:.95},animate:{opacity:D,y:0,scale:1,x:d?p==="left"?-300:300:i},exit:{opacity:0,y:20,scale:.95},transition:{type:d?"tween":"spring",duration:d?.2:.1,stiffness:300,damping:30},className:w("flex items-center gap-3 px-4 py-3 rounded-xl shadow-lg","cursor-grab active:cursor-grabbing select-none","min-w-[280px] max-w-[90vw]",h,"text-white"),style:{touchAction:"pan-y"},children:[a.jsx(g,{className:"w-5 h-5 flex-shrink-0"}),a.jsx("span",{className:"flex-1 text-sm font-medium",children:t}),a.jsx("button",{type:"button",onClick:()=>r(e),className:"p-2.5 rounded-full hover:bg-white/20 transition-colors flex-shrink-0","aria-label":o("common.close"),children:a.jsx(Re,{className:"w-4 h-4"})})]})})}function Bo(e){return e.type==="success"?"success":e.type==="error"?"error":e.icon==="⚠️"?"warning":"info"}function Wo(e){return typeof e.message=="string"?e.message:"通知"}function Vo(){const{toasts:e,handlers:t}=ea(),{startPause:n,endPause:s}=t,r=e.filter(o=>o.visible).slice(0,3).reverse();return a.jsx("div",{className:"fixed bottom-20 left-0 right-0 z-toast flex flex-col items-center gap-2 px-4 pointer-events-none",onMouseEnter:n,onMouseLeave:s,children:r.map(o=>a.jsx("div",{className:"pointer-events-auto",children:a.jsx(Uo,{id:o.id,message:Wo(o),type:Bo(o),visible:o.visible,onDismiss:i=>ta.dismiss(i)})},o.id))})}function qo(){const[e,t]=c.useState(null),[n,s]=c.useState(!0),[r,o]=c.useState(null);return c.useEffect(()=>{const i=E(x,W.CONFIG,Ht.MAINTENANCE),l=setTimeout(()=>{console.warn("[useMaintenanceMode] Timeout - skipping maintenance check"),t(null),s(!1),o(new Error("Firestore connection timeout"))},1e4),d=Wt(i,u=>{var p,m,g,h;if(clearTimeout(l),u.exists()){const f=u.data();t({enabled:f.enabled??!1,message:f.message??_.t("pages.maintenance.defaultMessage"),estimatedEndTime:((m=(p=f.estimatedEndTime)==null?void 0:p.toDate)==null?void 0:m.call(p))??f.estimatedEndTime,allowedUserIds:f.allowedUserIds??[],updatedAt:((h=(g=f.updatedAt)==null?void 0:g.toDate)==null?void 0:h.call(g))??new Date})}else t(null);s(!1),o(null)},u=>{clearTimeout(l),console.warn("[useMaintenanceMode] Error:",u.code,u.message),t(null),s(!1),o(u)});return()=>{clearTimeout(l),d()}},[]),{maintenance:e,isLoading:n,error:r}}function Se(){return typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function Ce(e){if(typeof document<"u"){const t=document.documentElement;e==="dark"?t.classList.add("dark"):t.classList.remove("dark")}}function xt(e){typeof document<"u"&&document.documentElement.setAttribute("data-color-theme",e)}const kt=re()(ue((e,t)=>({theme:"system",resolvedTheme:Se(),colorTheme:"default",setTheme:n=>{const s=n==="system"?Se():n;Ce(s),e({theme:n,resolvedTheme:s})},setColorTheme:n=>{xt(n),e({colorTheme:n})},toggleDarkMode:()=>{const s=t().resolvedTheme==="dark"?"light":"dark";Ce(s),e({theme:s,resolvedTheme:s})},applySystemTheme:()=>{const{theme:n}=t();if(n==="system"){const s=Se();Ce(s),e({resolvedTheme:s})}}}),{name:"taskudos-theme",partialize:e=>({theme:e.theme,colorTheme:e.colorTheme}),onRehydrateStorage:()=>e=>{if(e){const t=e.theme==="system"?Se():e.theme;Ce(t),xt(e.colorTheme||"default"),e.resolvedTheme=t}}}));function Ko(){if(typeof window>"u"||!window.matchMedia)return()=>{};const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{kt.getState().applySystemTheme()},{theme:n,setTheme:s,colorTheme:r,setColorTheme:o}=kt.getState();return s(n),o(r||"default"),e.addEventListener("change",t),()=>{e.removeEventListener("change",t)}}if(typeof window<"u"&&window.location.hostname==="taskudos-ai.firebaseapp.com"){const e=window.location.pathname+window.location.search+window.location.hash;window.location.replace(`https://taskudos.net${e}`)}function zo(){const{t:e}=C(),{isLoading:t}=qo(),{loading:n}=J();return t||n?a.jsx("div",{style:{padding:"50px",fontSize:"18px",textAlign:"center"},children:e("common.loading")}):a.jsxs(a.Fragment,{children:[a.jsx(Nn,{router:Mo}),a.jsx(Vo,{})]})}function Ho(){return c.useEffect(()=>Ko(),[]),a.jsx(Fo,{children:a.jsx(Cn,{client:Vt,children:a.jsx(Pa,{features:Da,strict:!0,children:a.jsx(zo,{})})})})}var $o=function(t){return{type:"backend",init:function(s,r,o){},read:function(s,r,o){if(typeof t=="function"){if(t.length<3){try{var i=t(s,r);i&&typeof i.then=="function"?i.then(function(l){return o(null,l&&l.default||l)}).catch(o):o(null,i)}catch(l){o(l)}return}
10t(s,r,o);return}o(null,t&&t[s]&&t[s][r])}}};const Jo={access:{adminOnly:"このページはシステム管理者のみがアクセスできます。",goHome:"ホームに戻る",noPermission:"アクセス権限がありません"},anomaly:{actionAnomalyResolved:"異常解決",actionCpGranted:"CP付与",actionCpRevoked:"CP取消",actionTaskApproved:"タスク承認",actionTaskRejected:"タスク却下",actionUserWarned:"警告送信",alertCount:"アラート ({{count}}件)",alertItems:"{{count}}件のアラート",cancel:"キャンセル",close:"閉じる",colMainFactor:"主な要因",colStatus:"ステータス",colTotalScore:"総合スコア",colUpdatedAt:"更新日時",colUser:"ユーザー",factorBreakdown:"要因内訳",factorCompletionRate:"完了率異常",factorCpSpike:"CP急増",factorCreationVelocity:"作成速度異常",factorMutualApproval:"相互承認",factorTimingAnomaly:"時間帯異常",fetchError:"データの取得に失敗しました",level:{danger:"危険",normal:"正常",warning:"警告"},markResolved:"解決済みにする",noAlerts:"アラートはありません",noAuditLogs:"監査ログがありません",noData:"異常スコアデータがありません",noDataDescription:"異常検知システムが稼働すると、ここにデータが表示されます",recentActivityCount:"最近の活動 ({{count}}件)",resolved:"解決済み",send:"送信",sendWarning:"警告を送信",sortBy:"並び替え",sortDate:"更新日時",sortScore:"スコア順",sortUser:"ユーザー名",statusBlocked:"ブロック中",statusNormal:"正常",statusWarned:"警告済み",totalScore:"総合スコア",userAnomalyDetail:"ユーザー異常詳細",warningMessage:"警告メッセージ",warningPlaceholder:"ユーザーに送信する警告メッセージを入力..."},feedback:{admin:"管理者",adminLabel:"管理者",all:"すべて",cancel:"キャンセル",category:{bug:"バグ",bugReport:"バグ報告",feature:"新機能",featureRequest:"新機能の要望",improvement:"改善",other:"その他",unknown:"不明"},categoryBug:"バグ",categoryFeature:"新機能",categoryImprovement:"改善",categoryLabel:"カテゴリ",categoryOther:"その他",description:"ユーザーからのフィードバックを確認・管理できます",enterReply:"返信内容を入力してください",enterReplyLabel:"返信を入力",fetchError:"フィードバックの
10取得に失敗しました",filter:"フィルター",hideReplies:"返信を非表示",inReview:"確認中",invalidFeedback:"フィードバック情報が不正です",loginRequired:"ログインが必要です。ページをリロードしてください。",markRead:"確認中にする",markResolved:"対応済みにする",markReviewing:"確認中にする",markUnread:"未読に戻す",noFeedbacks:"フィードバックはまだありません",noFilteredFeedbacks:"フィルター条件に一致するフィードバックがありません",reply:"返信",replyCount:"{{count}}件の返信",replyError:"返信の送信に失敗しました",replyErrorDetail:"返信の送信に失敗: {{message}}",replyAriaLabel:"返信を入力",replyPlaceholder:"返信内容を入力してください...",replySent:"返信を送信しました",resolved:"対応済み",send:"送信",showReplies:"返信を表示 ({{count}}ä»¶)",stats:{inReview:"確認中",resolved:"対応済",total:"全件",unread:"未読"},status:{new:"新規",read:"確認中",resolved:"対応済",reviewing:"確認中",unknown:"不明",unread:"未読"},statusChanged:"ステータスを「{{status}}」に変更しました",statusLabel:"ステータス",statusUpdateError:"ステータスの更新に失敗しました",title:"フィードバック管理",unread:"未読",user:"ユーザー ({{name}})",userLabel:"ユーザー ({{name}})"},statistics:{activeUsers:"アクティブユーザー",anomalyTrend:"異常スコアトレンド",avgAnomalyScore:"平均異常スコア",blockCount:"ブロック数",completedTasks:"完了タスク",cpTrend:"CPトレンド",highRisk:"高リスク",issuedCP:"発行CP",loading:"読み込み中...",maxAnomalyScore:"最大異常スコア",noData:"データがありません",resolved:"解決済み",totalAuditLogs:"監査ログ総数",warningCount:"警告数"}},Yo={openRouter:{fetchError:"モデル一覧の取得に失敗しました",free:"無料",freeModels:"無料モデル ({{count}}ä»¶)",freeOnly:"無料モデルのみ",loading:"読み込み中...",loadingModels:"モデルを読み込み中...",moreResults:"さらに{{count}}件あります。検索を絞り込んでください。",noResults:"該当するモデルがありません",popularModels:"人気モデル",searchHint:"検索して400+のモデルから選択できます",searchPlaceholder:"モデルを検索...",searchResults:"検索結果 ({{count}}ä»¶)",selectModel:"モデルを選択..."},roleSettings:{lightMode:"軽量モード(速度優先)",notConfigured:"未設定(AI機能を使用しない)",standardMode:"標準モード"},settings:{add:"追加する",addAgent:"AIエージェントを追加",adding:"追加中...",agentName:"エージェント名",agentNameHint:"モデル名が自動設定されます。変更も可能です。",aiUsage:"AI使用量",apiKeyHint:"API キーは暗号化して保存されます(表示後5秒で自動非表示)",apiKeyLabel:"API キー",backToGeminiSetup:"← Geminiかんたん設定に戻る",byoaiDescription:"OpenAI、Anthropic、Google の API キーを登録して、タスク分析やチャットサポートなどの AI 機能を利用できます。",byoaiTitle:"BYOAI(自分のAIを持ち込む)",cancel:"キャンセル",claudeProWarningDescription:"Claude ProはWebアプリ専用です。APIを使用するには別途APIプランの契約が必要です。APIプランがない場合は、OpenRouter経由か、Custom(CLIProxyAPI)でClaude Pro/Maxを利用できます。",claudeProWarningTitle:"Claude Pro契約ではAPIキーが発行されません",deleteConfirm:"このエージェントを削除しますか?",emptyStateDescription:"上のボタンからAIエージェントを追加してください",emptyStateTitle:"登録されているエージェントはありません",endpointUrl:"エンドポイントURL",endpointUrlHint:"OpenAI互換APIエンドポイント(CLIProxyAPI, ProxyPal等)",endpointUrlPlaceholder:"例: http://localhost:8080/v1",modelPlaceholder:"例: claude-sonnet-4-20250514",agentNamePlaceholder:"ä¾
10‹: My Claude Assistant",getApiKey:"APIキーを取得する",model:"モデル",provider:"プロバイダー"},usage:{aiCalls:"AI呼び出し",allTime:"全期間の統計",callCount:"{{count}}回",cumulativeCost:"累計コスト",estimatedCost:"推定コスト",failed:"失敗",fetchError:"使用量データの取得に失敗しました",noUsageDescription:"タスク分析やサポート機能を使用すると、ここに履歴が表示されます",noUsageYet:"まだAIを使用していません",recentExecutions:"最近の実行",statusCompleted:"完了",statusFailed:"失敗",statusInProgress:"実行中",statusPending:"待機中",success:"成功",thisMonth:"今月の使用量",totalCalls:"総呼び出し"}},Qo={agentNotConfigured:"AIエージェントが未設定です",parseResponseFailed:"AI応答の解析に失敗しました",assistant:"AIアシスタント",cancelled:"キャンセルしました",configureGeminiApi:"設定画面でGemini APIを設定してください",dialog:{taskCompleted:"🎉 「{{taskTitle}}」を完了!"},globalButton:{openAssistant:"AIアシスタントを開く"},goToSettings:"設定へ",groupSummary:{active:"アクティブ",aiWillAnalyze:"AIがグループの活動を分析してサマリーを生成します",completed:"完了",fetchError:"データの取得に失敗しました",generateSummary:"サマリーを生成",generatingEllipsis:"生成中...",group:"グループ",memberStats:"{{tasks}}ä»¶ / {{cp}}CP",noAgentMessage:"AIサマリー機能を利用するにはAIエージェントを設定してください",overdue:"期限超過",periodMonth:"今月",periodToday:"今日",periodWeek:"今週",regenerate:"再生成",summaryTitle:"{{name}}サマリー",title:"AIグループサマリー",topContributors:"貢献度上位",viewGroupDetail:"グループ詳細を見る"},hideSummary:"サマリーを閉じる",inputPlaceholder:"メッセージを入力... (Ctrl+Enterで送信)",myTaskSummary:{addNewTask:"新しいタスクを追加してみましょう",allComplete:"お疲れ様!タスクは全て完了しています",analyzePrompt:"AIがあなたのタスクを分析してアドバイスします",analyzing:"分析中...",collapse:"折りたたむ",dueToday:"今日期限",getAdvice:"アドバイスを受ける",overdue:"期限切れ",regenerate:"再生成",remaining:"残り",setupRequired:"AIアドバイスを利用するにはAIエージェントを設定してください",showMore:"もっと見る",statusGood:"順調",statusNeedsAction:"要対応あり",title:"マイタスクサマリー",topPriority:"最優先タスク",urgent:"緊急",viewTaskList:"タスク一覧を見る"},no:"いいえ",send:"送信",showSummary:"サマリーを表示",summary:{actionRequired:"要対応あり",aiWillSummarize:"AIがあなたの活動をサマリーします",autoRefreshIn:"{{hours}}時間後に自動更新",dueToday:"今日期限",dueWithinDays:"3日以内 {{count}}ä»¶",generateSummary:"サマリーを生成",generating:"サマリーを生成中...",goToSettings:"設定へ",noAssignedTasks:"担当タスクはありません",overdue:"期限切れ",regenerate:"再生成",remaining:"残件 {{count}}ä»¶",setupRequired:`AIサマリーを利用するには
11AIエージェントを設定してください`,todaySummary:"今日のサマリー",yourTasks:"あなたの担当タスク"},taskCreated:"タスクを作成しました",taskCreateFailed:"タスクの作成に失敗しました",yesCreate:"はい、作成する"},Xo={acquisition:{channel:{direct:"直接",email:"メール",organic:"自然流入",other:"その他",paid:"広告",referral:"紹介",social:"SNS"},cta:{direct:"TasKudosで家事分担をもっとスムーズに!",email:"メールでご案内のTasKudosをインストール!",organic:"話題の家事分担アプリを試してみませんか?",other:"TasKudosで家族の家事分担を見える化!",paid:"今すぐTasKudosを無料で始めよう!",referral:"友達も使っているTasKudosを始めよう!",social:"SNSで話題のTasKudosをダウンロード!"},hashtag:{family:"家族",housework:"家事分担",taskudos:"TasKudos",thanks:"ありがとう"},platform:{facebook:"Facebook",instagram:"Instagram",line:"LINE",other:"その他SNS",tiktok:"TikTok",twitter:"X(Twitter)",youtube:"YouTube"},referral:{directAccess:"直接アクセス",searchEngine:"検索エンジン({{hostname}})",unknownSource:"不明なソース"},share:{gjReceived:{text:"「ありがとう」を{{taskCount}}回もらいました!TasKudosで家事分担をもっと楽しく。",textWithName:"{{name}}さんが「ありがとう」を{{taskCount}}回もらいました!TasKudosで家事分担をもっと楽しく。",title:"ありがとうをもらいました!"},taskCompleted:{text:"タスクを{{taskCount}}件完了しました!TasKudosで家事分担を見える化。",textWithName:"{{name}}さんがタスクを{{taskCount}}件完了しました!TasKudosで家事分担を見える化。",title:"タスク完了!"},weeklyReport:{text:"今週の家事レポートをシェアします!{{taskCount}}件のタスクを完了しました。",textWithGroup:"「{{groupName}}」の今週の家事レポートをシェアします!{{taskCount}}件のタスクを完了しました。",title:"今週の家事レポート"}},summary:{byChannel:"チャネル別: {{breakdown}}",channelEntry:"{{label}}: {{count}}人",organicRate:"自然流入率: {{percentage}}%",separator:"、",topCampaign:"トップキャンペーン: {{name}}({{count}}人)",totalUsers:"総ユーザー数: {{count}}人"},viral:{growthPotential:"成長見込みあり",naturalGrowth:"自然成長",needsImprovement:"改善が必要"},weeklyReport:{caption:"{{familyName}}の今週のがんばり!タスク{{tasksCompleted}}件完了、GJ{{gjCount}}回 #TasKudos #家事分担",imageAlt:"{{familyName}}の週次レポート: タスク{{tasksCompleted}}件完了、GJ{{gjCount}}回"}},activeMembers:"アクティブメンバー",brand:{abTest:{busyParentA:"忙しい親向け - バリアントA",busyParentB:"忙しい親向け - バリアントB",busyParentSubheadlineA:"忙しい毎日でも、家事の見える化で安心",busyParentSubheadlineB:"家事を分け合えば、時間も心も余裕が生まれる",ctaFamilyStart:"家族で始めよう",ctaFreeStart:"無料で始める",ctaInviteFamily:"家族を招待する",ctaTryNow:"今すぐ試す",emotionalSubheadline:"家族の「ありがとう」が自然に増える",emotionalVariant:"感情訴求バリアント",functionalSubheadline:"家事の分担と進捗を簡単に管理",functionalVariant:"機能訴求バリアント"},axis:{emotion:"感情訴求",functionality:"機能性",price:"価格競争力",simplicity:"シンプルさ"},blueOcean:{opportunity:"{{axis}}の領域は競争が少なく、差別化の機会があります(平均スコア: {{avgScore}})"},competitor:{apple:{weakness1:"感情訴求が弱く、家事特化の機能がない",weakness2:"家族間の感謝機能が存在しない",weakness3:"家事分担の可視化機能がない",weakness4:"家事カテゴリに特化したテンプレートがない"},timetree:{weakness1:"タスク管理機能が限定的",weakness2:"家事分担の分析機能がない",weakness3:"感謝機能がTasKudosほど充実していない",weakness4:"個人タスクの管理には不向き"},todoist:{weakness1:"感情面の訴求がほぼゼロ",weakness2:"家族向け機能が不十分",weakness3:"有料プランの価格が高い",weakness4:"家事分担に特化していない",weakness5:"UI がビジネス向けで家庭には馴染みにくい"},unknown:{needsAnalysis:"カスタム競合分析が必要です",noData:"{{competitor}}の詳細な分析データがありません"},yieto:{weakness1:"機能性がTasKudosと同等以下",weakness2:"感情訴求が限定的",weakness3:"AI機能が搭載されていない",weakness4:"ゲーミフィケーション要素が弱い"}},consistency:{addMoreKeywords:"より多くのメッセージにブランドキーワードを含めてください",balanceTone:"感情的なメッセージと機能的なメッセージのバランスを取ってください",createMessages:"ブランドメッセージを作成してください",missingKeyword:"「{{message}}...」にブランドキーワードが含まれていません",noMessages:"メッセージが提供されていません",toneImbalance:"感情訴求と機能訴求のバランスが偏っています",useMultipleKeywords:"各メッセージに複数のブランドキーワードを使用してください"},coreWord:{division:"分担",family:"家族",housework:"家事",share:"シェア",thanks:"ありがとう",visible:"見える"},gap:{achieved:"{{axis}}は目標値を達成しています",exceeded:"{{axis}}は目標を超えています({{gap}}ポイント余裕)",improve:"{{axis}}を改善してください(+{{gap}}ポイント)",significantImprovement:"{{axis}}を大幅に強化する必要があります(+{{gap}}ポイント)"},keyword:{emotional:{convey:"つたえる",effort:"がんばり",family:"家族",gratitude:"感謝",happiness:"幸せ",share:"シェア",smile:"笑顔",thanks:"ありがとう",visible:"見える"},functional:{app:"アプリ",auto:"自動",division:"分担",easy:"簡単",efficie
11ncy:"効率",management:"管理",schedule:"スケジュール",smooth:"スムーズ",visualization:"見える化"}},messaging:{busyParent:{coreMessage:"忙しい毎日でも、家族の家事に「ありがとう」を伝えられるアプリ",cta:"今すぐ無料で始めて、家事をもっとスムーズに",emotionalBenefit:"家族への感謝の気持ちが自然に伝わり、家庭の雰囲気が明るくなる",functionalBenefit:"家事の分担状況をリアルタイムで把握し、効率的に管理できる",proof1:"平均で家事の偏り30%改善",proof2:"1日3分の操作で完結",proof3:"500以上の家事テンプレート搭載",supporting1:"家事の進捗がひと目でわかる",supporting2:"タスクの分担が自動で最適化",supporting3:"お互いの頑張りが見える化される"},couple:{coreMessage:"ふたりの家事を「シェア」して、感謝を「シェア」するアプリ",cta:"ふたりで始めて、家事をもっと楽しく",emotionalBenefit:"パートナーとの信頼関係が深まり、毎日がもっと楽しくなる",functionalBenefit:"家事の公平な分担を実現し、余計なストレスを解消",proof1:"カップルの家事ストレス40%軽減",proof2:"相互感謝メッセージ機能",proof3:"公平な分担提案アルゴリズム",supporting1:"家事の分担でケンカを減らす",supporting2:"お互いの貢献をリアルタイムで確認",supporting3:"感謝のメッセージを簡単に送れる"},grandparent:{coreMessage:"離れて暮らす家族の家事を見守り、感謝を届けるアプリ",cta:"家族の「ありがとう」を、もっと身近に",emotionalBenefit:"離れていても家族の一員として繋がれる安心感",functionalBenefit:"簡単な操作で家族の活動を見守り、コミュニケーションできる",proof1:"大きな文字と簡単操作",proof2:"ワンタップで感謝を送信",proof3:"家族の活動ログを閲覧",supporting1:"家族の日々の様子がわかる",supporting2:"簡単操作で「ありがとう」を送れる",supporting3:"お孫さんの手伝いも記録される"},homemaker:{coreMessage:"毎日の家事を「見える化」して、家族からの感謝を実感できるアプリ",cta:"あなたのがんばりを見える化しよう",emotionalBenefit:"自分の頑張りが認められ、やりがいを感じられる",functionalBenefit:"家事の記録と分析で、効率的な家事計画が立てられる",proof1:"家事タスクの完了記録が自動保存",proof2:"家族メンバー全員の貢献度を可視化",proof3:"週次レポートで振り返り",supporting1:"自分のがんばりが数字で見える",supporting2:"家族に家事の大変さを共有できる",supporting3:"家事の偏りをデータで解消"},volunteer:{coreMessage:"グループの活動を管理し、メンバーの貢献を認め合うアプリ",cta:"グループの活動をもっと円滑に",emotionalBenefit:"メンバー全員が認められ、活動へのモチベーションが向上",functionalBenefit:"グループ活動の効率的な管理と公平な役割分担",proof1:"グループ向けタスク管理機能",proof2:"貢献ポイントシステム",proof3:"月次活動レポート自動生成",supporting1:"タスクの割り当てと進捗管理が簡単",supporting2:"メンバーの貢献度を可視化",supporting3:"活動報告の作成を自動化"}},recommendation:{consider:"検討可:改善の余地がありますが、テスト価値あり",needsImprovement:"要改善:大幅な修正を推奨します",recommend:"推奨:効果的なタグラインです。微調整で更に改善可能",stronglyRecommend:"強く推奨:このタグラインは高いインパクトが期待できます"},report:{targetBrand:"{{brand}}(目標)"},seo:{busyParent:{longTail1:"共働き家庭の家事分担アプリ",longTail2:"子育て中の家事管理",longTail3:"忙しいママの家事効率化",primary1:"家事分担",primary2:"家事管理アプリ",primary3:"家族タスク管理",secondary1:"共働き家事",secondary2:"家事効率化",secondary3:"子育て家事"},couple:{longTail1:"夫婦の家事分担を公平にするアプリ",longTail2:"カップルの家事ストレス解消",longTail3:"二人暮らしの家事管理アプリ",primary1:"カップル家事分担",primary2:"夫婦家事",primary3:"家事シェア",secondary1:"家事ã‚
11±ãƒ³ã‚«é˜²æ­¢",secondary2:"公平な家事分担",secondary3:"パートナー家事"},grandparent:{longTail1:"離れた家族とつながるアプリ",longTail2:"おじいちゃんおばあちゃん向け感謝アプリ",longTail3:"家族の活動を見守るアプリ",primary1:"家族見守り",primary2:"家族つながりアプリ",primary3:"感謝アプリ",secondary1:"シニア向けアプリ",secondary2:"家族コミュニケーション",secondary3:"ありがとうアプリ"},homemaker:{longTail1:"毎日の家事を記録するアプリ",longTail2:"家事の見える化で感謝される",longTail3:"家事の偏りを解消するアプリ",primary1:"家事記録",primary2:"家事見える化",primary3:"家事管理",secondary1:"家事リスト",secondary2:"家事カレンダー",secondary3:"家事タスク"},volunteer:{longTail1:"ボランティア団体の活動管理アプリ",longTail2:"グループの役割分担と貢献管理",longTail3:"メンバーの頑張りを見える化するアプリ",primary1:"グループタスク管理",primary2:"ボランティア管理",primary3:"活動管理アプリ",secondary1:"チーム貢献管理",secondary2:"役割分担アプリ",secondary3:"活動記録"}},tagline:{emotionalParent:"ありがとうが見える家事アプリ",familyThanks:"家族の家事に、ありがとうを",shareAndThank:"家事をシェアして、ありがとうをシェアしよう",shareChores:"わけあう家事、つたえるありがとう",smoothDivision:"家事分担をもっとスムーズに",visibleEffort:"家族のがんばりを見える化"}},kudosReceived:"GJ受信",overdueTasks:"期限超過タスク",taskCompletion:"タスク完了率",thisMonth:"今月",thisWeek:"今週",trend:"傾向"},Zo={alert:{cpSpike:"CP急増が検出されました (スコア: {{score}}/20)",mutualApproval:"相互承認パターンが検出されました (スコア: {{score}}/20)",timingAnomaly:"異常な時間帯での活動が検出されました (スコア: {{score}}/20)"}},ei={name:"TasKudos",tagline:"グループでタスクを楽しく管理"},ti={biometric:{authError:"認証エラー",authFailed:"認証に失敗しました",authTroubleHint:"認証に問題がある場合は「メール/パスワードでログイン」をお試しください",authenticateWith:"{{type}}で認証",checking:"認証を確認中...",emailLogin:"メール/パスワードでログイン",loggedInAs:"ログイン中: {{email}}",loginPrompt:"TasKudosにログイン",pleaseAuthenticate:"{{type}}で認証してください",retryWith:"{{type}}で再試行",confirmLogin:"ログインを確認",usePasscode:"パスコードを使用",unavailable:"生体認証が利用できません",typeTouchId:"Touch ID / 指紋認証",typeBiometric:"生体認証"},email:"メールアドレス",emailVerification:{backToHome:"ホームに戻る",backToLogin:"ログインページに戻る",checkEmail:"メールアドレスが正しいかご確認ください",checkSpam:"迷惑メールフォルダをご確認ください",completedDescription:"メールアドレスの認証が完了しています。",completedTitle:"メール認証完了",notReceived:"メールが届かない場合",requiredDescription:"アカウントのセキュリティを確保するため、メールアドレスの認証をお願いします。",requiredTitle:"メール認証が必要です",resendButton:"認証メールを再送信",resendSuccess:"認証メールを送信しました",sendError:"認証メールの送信に失敗しました。しばらく経ってから再度お試しください。",sending:"送信中...",sentTo:"送信先:",waitAndRetry:"数分待ってから再送信してください"},forgotPassword:{backToLogin:"ログインページに戻る",backToLoginShort:"ログインに戻る",checkSpam:"メールが届かない場合は、迷惑メールフォルダをご確認ください。",description:"登録したメールアドレスを入力してください。パスワードリセット用のリンクをお送りします。",emailLabel:"メールアドレス",emailSentDescription:"宛てにパスワードリセットメールをé€
11ä¿¡ã—ました。",emailSentInstruction:"メール内のリンクからパスワードを再設定してください。",emailSentTitle:"メールを送信しました",sending:"送信中...",submit:"リセットメールを送信",successToast:"パスワードリセットメールを送信しました",title:"パスワードをリセット"},login:{emailLabel:"メールアドレス",forgotPassword:"パスワードをお忘れですか?",loggingIn:"ログイン中...",noAccount:"アカウントをお持ちでない方は",or:"または",passwordLabel:"パスワード",rememberMe:"ログイン情報を記憶する",signupLink:"サインアップ",submit:"ログイン",success:"ログインしました",title:"ログイン",termsHint:"利用規約に同意すると、各ログインボタンが使えるようになります"},loginWithGoogle:"Googleでログイン",logout:"ログアウト",password:{errorLowercase:"パスワードに小文字を含めてください",errorMinLength:"パスワードは8文字以上で入力してください",errorNumber:"パスワードに数字を含めてください",errorUppercase:"パスワードに大文字を含めてください",label:"パスワード",lowercase:"小文字を含む",minLength:"8文字以上",number:"数字を含む",strengthFair:"やや弱い",strengthGood:"良い",strengthLabel:"パスワード強度",strengthStrong:"強い",strengthWeak:"弱い",symbol:"記号を含む(推奨)",uppercase:"大文字を含む"},resetPassword:{backToLogin:"ログインページに戻る",backToLoginShort:"ログインに戻る",changeButton:"パスワードを変更",changing:"変更中...",codeNotFound:"リセットコードが見つかりません",confirmPasswordLabel:"パスワードを確認",confirmPasswordPlaceholder:"もう一度入力",enterNewPassword:"{{email}} の新しいパスワードを入力してください。",goToLogin:"ログインページへ",invalidDescription:"パスワードリセットリンクが無効または期限切れです。",invalidLink:"無効なリンクです",invalidTitle:"リンクが無効です",linkExpired:"リンクが無効または期限切れです",linkExpiry:"リンクは発行から24時間以内に使用する必要があります。",newPasswordLabel:"新しいパスワード",newPasswordPlaceholder:"8文字以上、英字と数字を含む",resend:"パスワードリセットを再送信",setNewPassword:"新しいパスワードを設定",successDescription:"新しいパスワードでログインできます。",successTitle:"パスワードを変更しました",successToast:"パスワードを変更しました",tryAgain:"再度パスワードリセットをお試しください。",verifying:"確認中..."},signUp:"新規登録",signup:{accountCreated:"アカウントを作成しました",ageVerified:"✓ 年齢確認済み",confirmPasswordLabel:"パスワード(確認)",confirmPasswordPlaceholder:"パスワードを再入力",emailLabel:"メールアドレス",hasAccount:"既にアカウントをお持ちの方は",loading:"読み込み中...",loginLink:"ログイン",or:"または",passwordLabel:"パスワード",passwordPlaceholder:"8文字以上、大小英字+数字",signingUp:"サインアップ中...",submit:"サインアップ",title:"サインアップ",hidePassword:"パスワードを非表示",showPassword:"パスワードを表示",verificationEmailSent:"確認メールを送信しました。メールをご確認ください。"},social:{appleSignIn:"Appleでサインイン",googleLogin:"Googleでログイン"},validation:{emailInvalid:"有効なメールアドレスを入力してください",passwordComplexity:"パスワードは英大文字・英小文字・数字をそれぞれ1文字以上含めてください",passwordMin:"パスワードは{{min}}文字以上で入力してください",passwordMismatch:"パスワードが一致しません"},verifyEmail:{backToLogin:"ログインページに戻る",checkSpam:"メールが届かない場合は、迷惑メールフォルダをご確認ください。",checkVerification:"認証済みか確認する",clickLink:"メール内のリンクをクリックして認証を完了してください。",cooldown:"再送信まで {{seconds}}秒",emailSent:"{{email}}
11 に確認メールを送信しました。",goToLogin:"ログインページへ",loginRequired:"ログインが必要です",notYetVerified:"まだメールが確認されていません",resendButton:"確認メールを再送信",resendError:"送信に失敗しました。しばらく経ってからお試しください。",resendSuccess:"確認メールを再送信しました",sending:"送信中...",title:"メールアドレスの確認",verificationComplete:"メールアドレスが確認されました",verifyError:"確認に失敗しました。もう一度お試しください。",verifying:"確認中..."},waitlist:{currentlyFull:"現在満員です",emailLabel:"メールアドレス",errorToast:"登録に失敗しました。後でもう一度お試しください。",nameLabel:"お名前(任意)",pleaseWait:"しばらくお待ちください。",registerDescription:"メールアドレスを登録いただければ、空きが出次第ご招待します。",registerToWaitlist:"ウェイトリストに登録",registeredUsers:"登録ユーザー数",registrationComplete:"登録完了",registrationCompleteDesc:"ウェイトリストへの登録が完了しました。招待の準備ができ次第、メールでお知らせします。",registrationPaused:"申し訳ありません。現å
11œ¨ã€æ–°è¦ç™»éŒ²ã‚’一時停止しています。",submitting:"登録中...",successToast:"ウェイトリストに登録しました",waitingInfo:"現在の待機者数に応じて順次招待を行います。",invalidEmail:"有効なメールアドレスを入力してください",namePlaceholder:"山田 太郎"},age:{blocked:"ご利用いただけません",blockedDescription:"本サービスは13歳以上の方を対象としています。保護者の方と一緒にご利用を検討してください。",enterBirthDate:"生年月を入力してください",yearPlaceholder:"年(例: 2010)",monthPlaceholder:"月(1〜12)",notice:"※本サービスは13歳以上の方を対象としています(個人情報保護法/COPPA準拠)"}},ni={plans:{name:{free:"Free",pro:"Pro"}}},ai={lateNight:{appreciation:"遅くまでお疲れさまです!3日連続で深夜まで作業されていますね。十分な睡眠も生産性の秘訣ですよ。",message:"夜更かしが続いていますね"},overwork:{appreciation:"すごいですね!今週だけで50タスク以上達成しています。でも、適度な休憩も大切ですよ。",message:"頑張りすぎていませんか?"},weekendWork:{appreciation:"週末もお仕事、お疲れさまです!でも、リフレッシュする時間も取ってくださいね。",message:"休日も忙しそうですね"},dismissButton:"今は大丈夫",disableButton:"この通知をOFF"},si={createSheet:{submit:"作成",title:"タスクを作成"},fab:{addTask:"新しいタスクを追加",bulkAdd:"一括追加",bulkAddComingSoon:"一括追加機能は準備中です",createTask:"新規タスク作成"},fri:"金",header:{completed:"完了",count:"ä»¶",groupPeriod:"グループ期間",inProgress:"進行中",title:"カレンダー"},mon:"月",moreItems:"+{{count}}ä»¶",next:"次へ",noEventsInRange:"この日に予定されたタスクはありません",noTasks:"タスクなし",previous:"前へ",sat:"土",sun:"日",thu:"木",totalTasks:"合計: {{count}}ä»¶",tue:"火",wed:"æ°´",monthHeader:"{{year}}å¹´{{month}}月",monthView:"月間カレンダー",weekView:"週間カレンダー",weekViewTimeGrid:"週間タイムグリッド",dateLabel:"{{year}}å¹´{{month}}月{{day}}日({{dayOfWeek}})",weekRangeSameMonth:"{{year}}å¹´{{month}}月 {{startDay}}日〜{{endDay}}日",completedTasks:" / 完了: {{count}}ä»¶",viewMode:{label:"カレンダー表示モード",month:"月間",today:"今日",week:"週間"}},ri={categoryName:"カテゴリー名",categoryNamePlaceholder:"カテゴリー名を入力",color:"カラー",confirmDelete:"削除する",itemCount:"{{count}}ä»¶",noCategories:"カテゴリーがありません",preview:"プレビュー",update:"更新"},oi={all:"すべて",avatarLabel:"{{name}}のアバター",back:"戻る",cancel:"キャンセル",close:"閉じる",collapse:"折りたたむ",confirm:"確認",dataFetchError:"データの取得中にエラーが発生しました",cookie:{acceptAll:"すべて承認",description:"本サービスではログイン状態の維持や利用状況の分析のためにCookieを使用します。詳しくは",descriptionSuffix:"をご覧ください。",essentialOnly:"必須のみ",privacyPolicy:"プライバシーポリシー",reject:"拒否",title:"Cookieの使用について"},create:"作成",defaultUser:"ユーザー",delete:"削除",dialog:"ダイアログ",dueDateLabel:"期限: {{label}}",disabled:"無効",edit:"編集",emailVerification:{checkInbox:"受信トレイを確認し、メール内のリンクをクリックしてください。",required:"メールアドレスの確認が必要です。",verifiedClick:"確認した",checking:"確認中…",verified:"メールアドレスを確認しました。",notYetVerified:"まだ確認が完了していません。確認メール内のリンクを開いてから、もう一度お試しください。",checkError:"確認状態の取得に失敗しました。",resend:"確認メールを再送信",resendError:"メールの送信に失敗しました。時間をおいて再度お試しください。",resendSuccess:"確認メールを再送信しました。受信トレイをご確認ください。",sending:"送信中..."},enabled:"有効",error:"エラーが発生しました",expand:"展開する",export:"エクスポート",failure:"失敗",filter:"フィルター",groupContextMenu:{categoryList:"カテゴリー一覧",createTask:"タスク作成",group:"グループ",groupInvite:"グループ招待",groupSettings:"グループ設定",sectionCreate:"作成",sectionList:"一覧",sectionManage:"管理",taskList:"タスク一覧"},import:"インポート",listSeparator:"、",loading:"読み込み中...",noData:"データがありません",none:"なし",menuLabel:"{{name}}のメニュー",notification:{accepted:"承認済み",declined:"拒否済み",unread:"未読",unreadMessages:"{{count}}件の未読メッセージ"},offline:{offlineMode:"オフラインモード",pendingData:"{{count}}件の未同期データ",sync:"同期",syncComplete:"{{count}}件同期完了",syncFailed:"{{count}}件失敗",syncing:"同期中..."},or:"または",priority:{high:"高",low:"低",medium:"中",urgent:"緊急"},removeItemLabel:"{{name}}を削除",save:"保存",search:"検索",selectLanguage:"言語を選択",send:"送信",separator:"・",sort:"並べ替え",success:"成功",taskOptions:"タスクオプション",today:"今日",tomorrow:"明日",unknown:"不明",user:"ユーザー",warning:"警告",yesterday:"昨日",deleteFailedWithDetail:"削除に失敗しました: {{detail}}"},ii={breadcrumb:{collapse:"階層を折りたたむ",expand:"階層を展開する",personalTask:"個人{{task}}"},commandPalette:{calendar:"カレンダー",calendarDesc:"カレンダー表示",categoryDesc:"{{category}}管理ページに移動",groups:"グループ",groupsDesc:"グループ管理ページに移動",home:"ホーム",homeDesc:"ホームページに移動",navigate:"移動",noResults:"コマンドが見つかりませんでした",notifications:"通知",notificationsDesc:"通知一覧を表示",searchLabel:"コマンド検索",searchPlaceholder:"コマンドを検索...",select:"選択",settingsDesc:"設定ページに移動",taskListDesc:"{{task}}一覧を表示",title:"コマンドパレット",tryDifferentKeyword:"別のキーワードで検索してください",wipBoard:"WIPボード",wipB
11oardDesc:"WIPボードを表示"},contextCard:{editTask:"タスクの編集",group:"グループ",settingsMenu:"設定メニュー",task:"タスク"},limitModal:{checkPlan:"プランを確認(準備中)",countItems:"{{count}}件",currentPlan:"現在のプラン: 無料プラン",currentUsage:"現在の使用: {{count}}件",description:"現在のプランでは、これ以上{{resource}}を作成できません。",minutesRemaining:"(あと {{minutes}}分)",operationCount:"この1時間の操作: {{used}} / {{limit}}件",operationDescription:"サーバー保護のため、1時間あたりの操作数に制限を設けています。",operationTitle:"操作の上限に達しました",pleaseWait:"しばらくお待ちいただき、再度お試しください。",resetTime:"制限リセット: {{time}}",resourceLimit:"{{resource}}上限: {{limit}}",title:"{{resource}}作成の上限に達しました",unlimited:"無制限",upgradeHint:"より多くの{{resource}}を作成するには、プロプランへのアップグレードをご検討ください。"},memberList:{admin:"管理者",member:"メンバー",noMembers:"メンバーがいません",owner:"オーナー",title:"{{name}}のメンバー"},notifications:{accept:"承認",acceptInvite:"招待を承認",groupInvite:"グループへの招待があります",listLabel:"通知一覧",noNotifications:"通知はありません",notificationType:"通知: {{type}}",notificationsHint:"タスクが更新されるとここに通知が届きます",open:"開く",read:"既読",reject:"拒否",rejectInvite:"招待を拒否",swipeHint:"左にスワイプで既読",title:"通知",togglePanel:"通知パネルを開閉"},scopeBadge:{personal:"個人"},scopeCard:{noOptions:"選択肢がありません",openSettingsMenu:"設定メニューを開く",scopeOptions:"{{type}}の選択肢",selectScope:"{{type}}を選択"},sideNav:{adminGuide:"管理者ガイド",adminGuideExternal:"管理者ガイド(外部リンク)",fbManagement:"FB管理",feedback:"要望",feedbackManagement:"フィードバック管理",feedbackSend:"要望・フィードバック送信",help:"ヘルプ",helpPage:"ヘルプページ",home:"ホーム",homePage:"ホームページ",mainNavigation:"メインナビゲーション",notifications:"通知",notificationsPage:"通知一覧ページ",pricing:"料金プラン",pricingPage:"料金プランページ",resizeHandle:"ドラッグで幅を調整",settingsPage:"設定ページ"},viewSwitcher:{calendar:"カレンダー",list:"一覧",taskList:"タスク一覧",wipBoard:"WIPボード"}},li={aiProviders:{anthropic:{description:"Anthropic APIキーを取得してClaudeを利用できます",step1:"Anthropicコンソールにログイン",step2:"「Settings」→「API Keys」に移動",step3:"「Create Key」をクリック",step4:"生成されたキーをコピー"},custom:{description:"CLIProxyAPIやProxyPalを使ってClaude Pro/MaxサブスクをOpenAI互換APIとして利用できます",step1:"CLIProxyAPI/ProxyPalをローカルにセットアップ",step2:"プロキシサーバーを起動(例: http://localhost:8080)",step3:"エンドポイントURLを入力(例: http://localhost:8080/v1)",step4:"APIキーは任意(プロキシの設定による)"},google:{description:"Google AI StudioでAPIキーを取得してGeminiを利用できます",step1:"Google AI Studioにアクセス",step2:"Googleアカウントでログイン",step3:"「Get API key」をクリック",step4:"生成されたキーをコピー"},openai:{description:"OpenAI APIキーを取得してGPT-4などのモデルを利用できます",step1:"OpenAIのダッシュボードにログイン",step2:"左メニューから「API Keys」を選択",step3:"「Create new secret key」をクリック",step4:"生成されたキーをコピー(一度しか表示されません)"},openrouter:{description:"1つのAPIキーで400以上のAIモデル(Claude, GPT-4, Gemini等)を利用できます",step1:"OpenRouter.aiにアクセス",step2:"Googleアカウントでログイン",step3:"「Keys」ページで「Create Key」をクリック",step4:"生成されたキーをコピー"}},displayLabels:{default:{category:"カテゴリ",description:"一般的なタスク管理向けの標準設定",name:"タスク管理",task:"タスク"},event:{category:"ジャンル",description:"イベントやアクティビティの管理向け",name:"イベント管理",task:"アクティビティ"},homework:{category:"教科",description:"学校の課題や宿題の管理向け",name:"宿題管理",task:"課題"},housework:{category:"種類",description:"家庭の家事やタスクの管理向け",name:"家事管理",task:"家事"}},labelTemplates:{custom:{description:"自由にラベルを設定",name:"カスタム"},default:{description:"標準的なタスク管理向け",labels:{category:"カテゴリー",task:"タスク",team:"グループ"},name:"タスク管理"},event:{description:"イベント企画・運営向け",labels:{category:"担当",task:"ToDo",team:"実行委員会"},name:"イベント管理"},homework:{description:"学校や塾の宿題管理向け",labels:{category:"教科",task:"やること",team:"家族"},name:"宿題管理"},housework:{description:"家庭の家事分担向け",labels:{category:"場所",task:"やること",team:"家族"},name:"家事管理"}},notifications:{ai:{description:"AIからのタスク提案や分析結果",label:"AI提案"},gj:{description:"家族からありがとうが届いたとき",label:"ありがとう通知"},system:{description:"招待や重要なお知らせ",label:"お知らせ"},task:{description:"タスクの期限や完了",label:"タスク通知"}}},ci={collapse:"折りたたむ",description:"グループメンバーに共有する連絡先を設定できます。公開した連絡先は同じグループのメンバーのみが閲覧できます。",email:"メールアドレス",noPublicContacts:"公開連絡先はありません",phone:"電話番号",publishLabel:"{{label}}を公開",publishToGroup:"グループメンバーに公開",save:"保存",saveError:"保存に失敗しました",saveSuccess:"連絡先設定を保存しました",saving:"保存中...",showMore:"他{{count}}
11人を表示"},di={type:{bugReport:"バグ報告",documentCreated:"ドキュメント作成",manual:"手動付与",meetingAttended:"会議出席",milestoneBonus:"マイルストーン達成",mvpBonus:"MVP賞",proposalAccepted:"提案採用",reviewConducted:"レビュー実施",taskCompleted:"タスク完了",thanksReceived:"ありがとう"}},ui={challenger:"チャレンジャー",easy:"簡単",expert:"エキスパート",hard:"難しい",normal:"普通"},mi={closeMenu:"メニューを閉じる",createNewGroup:"新規グループ作成",home:"ホーム",logout:"ログアウト",menu:"メニュー",noGroups:"グループがありません",user:"ユーザー"},pi={checkSpam:"メールが届かない場合は、迷惑メールフォルダをご確認ください",checking:"確認中...",clickLink:"メール内のリンクをクリックして、メールアドレスの確認を完了してください。",clickWhenDone:"確認が完了したらクリック",dismissLabel:"後で確認する",dismissTitle:"後で確認する(このセッション中は表示されません)",resend:"確認メールを再送信",sending:"送信中...",sentTo:"{{email}} 宛に確認メールを送信しました。",title:"メールアドレスを確認してください"},gi={onboarding:{createTask:{title:"タスクを作ってみよう",description:"まずは簡単なタスクを1つ作成してみましょう"},sendGj:{title:"GJを送ろう",description:"完了したタスクに「いいね」「ありがとう」「すごい」を送りましょう"},inviteMember:{title:"家族を招待しよう",description:"家族や仲間を招待してグループで使ってみましょう"}}},fi={default:"エラーが発生しました",auth:{userNotFound:"このメールアドレスは登録されていません",wrongPassword:"パスワードが正しくありません",emailAlreadyInUse:"このメールアドレスは既に登録されています",invalidEmail:"メールアドレスの形式が正しくありません",weakPassword:"パスワードは8文字以上で設定してください",tooManyRequests:"ログイン試行回数が多すぎます。しばらく待ってから再試行してください",networkError:"ネットワークエラーが発生しました。接続を確認してください",invali
11dCredential:"メールアドレスまたはパスワードが間違っています",requiresRecentLogin:"再認証が必要です。ログインし直してください",userDisabled:"このアカウントは無効化されています。管理者にお問い合わせください",operationNotAllowed:"この認証方法は現在利用できません",accountExistsDifferentCredential:"このメールアドレスは別の認証方法で登録されています",configurationNotFound:"Firebase認証の設定が見つかりません。管理者にお問い合わせください",popupClosedByUser:"ログインがキャンセルされました",popupBlocked:"ポップアップがブロックされました。ポップアップを許可してください",cancelledPopupRequest:"ログイン処理がキャンセルされました",credentialAlreadyInUse:"この認証情報は別のアカウントで使用されています"},firestore:{permissionDenied:"アクセス権限がありません。再ログインをお試しください。",emailNotVerified:"メールアドレスの確認が必要です。確認メール内のリンクをクリックした後、画面上部の「確認した」を押すか、再ログインしてください。",notFound:"データが見つかりません",alreadyExists:"データは既に存在します",resourceExhausted:"リソース制限を超えました",failedPrecondition:"操作の前提条件が満たされていません",aborted:"操作が中止されました",outOfRange:"範囲外の値です",unimplemented:"この操作はサポートされていません",internal:"内部エラーが発生しました",unavailable:"サービスが一時的に利用できません",dataLoss:"データ損失が発生しました",unauthenticated:"認証が必要です",cancelled:"操作がキャンセルされました",unknown:"不明なエラーが発生しました",invalidArgument:"無効な引数です",deadlineExceeded:"タイムアウトしました"}},hi={ai:{summaryGenerationFailed:"サマリー生成に失敗しました"},anomaly:{noDetail:"詳細情報がありません",scoreNotFound:"異常スコアが見つかりません"},approval:{alreadyApproved:"既に承認済みです",cannotApproveOwn:"自分のタスクには承認できません",notFound:"承認が見つかりません",notQuickTask:"クイックタスク以外には承認できません",taskAlreadyDone:"完了済みタスクは承認できません"},errorDetailsDev:"エラー詳細(開発用)",goHome:"ホームに戻る",group:{alreadyInvited:"既に招待を送信済みです",alreadyMember:"既にグループメンバーです",inviteAlreadyProcessed:"この招待は既に処理されています",inviteNoPermission:"この招待に応答する権限がありません",inviteNotFound:"招待が見つかりません",limitReached:"グループ数が上限({{limit}})に達しています"},occurred:"エラーが発生しました",offline:{entryDeleted:'エントリID "{{id}}" は削除済みです',entryExists:'エントリID "{{id}}" は既に存在します',entryNotFound:'エントリID "{{id}}" が見つかりません',entryValidationFailed:'無効なストアデータ形式です: エントリ "{{key}}" のバリデーションに失敗しました',invalidEntryFormat:"無効なストアデータ形式です: エントリの形式が不正です",invalidJson:"無効なJSON形式です",invalidStoreData:"無効なストアデータ形式です",invalidStoreDataEntries:"無効なストアデータ形式です: entriesが配列ではありません",invalidStoreDataOperations:"無効なストアデータ形式です: operationsが配列ではありません",storeLimitReached:"ストアの上限({{max}}件)に達しています"},pageNotFound:"ページが見つかりません",reloadPage:"ページを再読み込み",schedule:{fieldValueOutOfRange:"{{field}}フィールドの値が範囲外です: {{value}} ({{min}}-{{max}})",invalidCron:"不正なcron式です: フィールドが5つ必要ですが{{count}}
11個です",invalidFieldValue:"{{field}}フィールドの値が不正です: {{value}}",invalidRange:"{{field}}フィールドの範囲が不正です: {{range}}",invalidRangeEnd:"{{field}}フィールドの範囲終了値が不正です: {{value}}",invalidRangeStart:"{{field}}フィールドの範囲開始値が不正です: {{value}}",invalidStepValue:"{{field}}フィールドのステップ値が不正です: {{value}}",nextOccurrenceNotFound:"次回実行日時が見つかりません",unknownTimezone:"不明なタイムゾーンです: {{timezone}}"},sync:{failed:"同期に失敗しました",handlerNotFound:"ハンドラーが見つかりません"},syncQueue:{alreadyCancelled:"既にキャンセル済みです",cannotCancelCompleted:"完了済みのアイテムはキャンセルできません",cannotCancelProcessing:"処理中のアイテムはキャンセルできません",itemNotFound:'キューアイテムID "{{id}}" が見つかりません',processingFailed:"処理に失敗しました"},task:{childMaxHierarchyMove:"子タスクが最大階層を超えるため移動できません",circularReference:"循環参照が発生するため移動できません",limitReached:"タスク数が上限({{limit}})に達しています",maxHierarchy:"最大3階層までしか作成できません",maxHierarchyMove:"最大3階層を超えるため移動できません",maxHierarchySplit:"最大3階層を超えるため分割できません",mergeMinTasks:"合体するには2つ以上のタスクを選択してください",mergeMinValidTasks:"有効なタスクが2つ以上必要です",mergeTargetNotFound:"マージ先タスクが見つかりません",newParentNotFound:"新しい親タスクが見つかりません",notFound:"タスクが見つかりません",parentNotFound:"親タスクが見つかりません",splitSourceNotFound:"分割元タスクが見つかりません"},temporaryIssue:"一時的な問題が発生しました。再度お試しください。",translation:{duplicateKey:"重複キー: {{namespace}}.{{key}} ({{locale}})",emptyValue:"空の翻訳値: {{namespace}}.{{key}} ({{locale}})"},unexpectedError:"申し訳ございません。予期しないエラーが発生しました。",unexpectedErrorRetry:"申し訳ございません。予期しないエラーが発生しました。ページを再読み込みしてもう一度お試しください。"},yi={adminLabel:"TasKudos運営",cancel:"キャンセル",category:{bug:"バグ報告",bugReport:"バグ報告",feature:"新機能の要望",featureRequest:"新機能の要望",improvement:"改善提案",label:"カテゴリ",other:"その他"},content:{label:"内容",placeholder:"ご意見・ご要望をお聞かせください(10〜1000文字)"},hasReply:"返信あり",hideChat:"チャットを非表示",history:{empty:"まだフィードバックを送信していません",loading:"読み込み中...",title:"送信履歴"},operator:"TasKudos運営",reply:"返信",replyButton:"返信する",replyPlaceholder:"返信を入力...",send:"送信",showChat:"チャットを表示 ({{count}}件)",status:{new:"新規",read:"確認中",resolved:"対応済み",reviewing:"確認中",unread:"未読"},submit:{send:"送信する",sending:"送信中..."},validation:{contentMax:"フィードバックは1000文字以内で入力してください",contentMin:"フィードバックは10文字以上で入力してください",maxLength:"フィードバックは1000文字以内で入力してください",minLength:"フィードバックは10文字以上で入力してください"},you:"あなた",youLabel:"あなた"},bi={completedThisWeek:"今週の完了",completedToday:"今日の完了",firstTask:{checkBadges:"獲得したバッジを確認",completed:"完了したタスク",continue:"続ける",title:"はじめてのタスク完了!",welcomeMessage:"おめでとうございます!TasKudosでの第一歩です。これからもタスクを完了して、バッジを集めましょう!"},milestone:{congratulations:"おめでとうございます!",fiftyTasks:"50個のタスクを達成!",firstTask:"はじめてのタスク完了!",fiveHundredTasks:"500個のタスク!すごい達成です!",fiveTasks:"5つ目のタスク完了!",hundredTasks:"100個のタスク達成!素晴らしい!",tenTasks:"10個のタスク達成!",thous
11andTasks:"1000個達成!伝説のタスクマスター!",twentyFiveTasks:"25個のタスク完了!"},progressSummary:"進捗サマリー",streakDays:"連続日数",totalCompleted:"累計完了",totalCount:"{{totalDone}}件"},xi={kudos:{alreadySent:"(送信済み)",awesome:"すごい!",backToTypeSelection:"タイプ選択に戻る",description:{awesome:"称賛・尊敬を表します",goodJob:"タスク完了を称えます",thanks:"感謝の気持ちを伝えます"},goodJob:"よくやった!",messagePlaceholder:"一言添える(任意)",moreMessages:"他{{count}}件のメッセージ",othersCount:"他{{count}}人",selectGJ:"GJを選択",sendGJ:"GJを送る",sending:"送信中...",suggestion:{awesome:{amazing:"さすが!",best:"最高!",genius:"天才!",wonderful:"すばらしい!"},goodJob:{fast:"早くて助かった!",nailed:"バッチリ!",nice:"いい感じ!",perfect:"完璧!"},thanks:{grateful:"感謝!",helped:"助かりました!",thanksShort:"サンクス!",thanksTo:"おかげさまで!"}},tapToSelect:"タップして選択",thanks:"ありがとう!",typeCount:"{{type}} ({{count}}人)"},calendar:{sun:"日",mon:"月",tue:"火",wed:"水",thu:"木",fri:"金",sat:"土",year:"年",today:"今日",prevMonth:"前月",nextMonth:"翌月",totalGj:"GJ合計",activeDays:"アクティブ日数",streak:"連続日数",noPartner:"パートナーなし",title:"ありがとうカレンダー"},milestone:{fifty:"50回目のありがとう!すごい!",first:"はじめてのありがとう!",fiveHundred:"500回目!ありがとうの達人!",hundred:"100回のありがとう!素晴らしい家族です!",ten:"10回目のありがとう!",thousand:"1000回達成!ありがとうの伝説!"},taskDone:{sendGjPrompt:"GJを送りますか?",celebration:"タスク完了!🎉"},notification:{body:"{{label}}!",bodyWithTask:"「{{taskTitle}}」に{{label}}!",title:"{{name}}さんから{{emoji}}"},quick:{clap1:"今日もおつかれさま!",clap2:"がんばってるね!",heart1:"大好きだよ!",heart2:"いつも感謝してる!",muscle1:"がんばれ!",muscle2:"応援してるよ!",party1:"おめでとう!🎊",party2:"やったね!",star1:"すごいね!",star2:"さすが!",thanks1:"いつもありがとう!",thanks2:"助かったよ!"},reaction:{addReaction:"リアクションを追加",alreadyAdded:"(追加済み)",description:{celebrate:"達成への祝福を表します",concern:"進捗確認・懸念を表します",contact:"外部連絡を要求します",like:"確認・同意を表します",urgent:"緊急対応を要請します"},label:{celebrate:"素晴らしい",concern:"大丈夫?",contact:"連絡して!",like:"いいね",urgent:"急げ!"},othersCount:"他{{count}}人",selectReaction:"リアクションを選択",typeCount:"{{type}} ({{count}}人)"},solo:{motivation:{celebration:"今日はたくさんがんばりましたね!",default:"今日も一つずつ、自分のペースで進めましょう!",encouragement:"いいペースです!この調子で続けましょう!",master:"マスターレベル到達!あなたは自分を大切にする達人です!",streak:"{{days}}日連続!素晴らしい継続力です!"},progress:{goalReached:"今日の目標達成!",oneLeft:"あと1つでクリア!",remaining:"あと{{count}}つでクリア!"},suggestion:{applause:"がんばった自分に拍手!",bestDay:"最高の一日!",didIt:"やったね!",goodWork:"おつかれさま!",greatToday:"今日もえらい!",nice:"ナイス!",niceJob:"いい仕事した!",proudOfMyself:"さすが自分!",selfGJ:"自分にGJ!",wellDone:"よくがんばった!"},tier:{beginner:"ビギナー",expert:"エキスパート",master:"マスター",regular:"レギュラー"},validation:{integer:"デイリーゴールは整数で入力してください",max:"デイリーゴールは{{max}}以下で設定してください",min:"デイリーゴールは1以上で設定してください"},weeklySummary:"今週は{{completed}}個のタスクを完了し、{{selfGj}}回自分をほめました!",welcomeMessage:"一人でも大丈夫!タスクを完了したら、自分にGJを送りましょう。"},stamp:{clean:"ピカピカ",delicious:"おいしかった",great:"すごい",happy:"うれしい",helpful:"助かった",love:"大好き",quickGJ:"いいね",star:"キラキラ",thanks:"ありがとう"},streak:{days:"{{days}}日連続ありがとう!",daysHot:"{{days}}日連続ありがとう🔥",master:"{{days}}日連続!ありがとうマスター!",start:"今日からありがとうを始めよう!"},type:{clap:"がんばったね",heart:"大好き",muscle:"ファイト",party:"おめでとう",smile:"えらい!",sparkle:"ベスト!",star:"すごい!",thanks:"ありがとう",unknown:"不明"},validation:{maxLength:"メッセージは{{max}}文字以内で入力してください",noEmail:"メールアドレスを含むメッセージは送信できません",noUrl:"URLを含むメッセージは送信できません"},weekly:{summary:"今週の家族のありがとう: 送信{{sent}}件、受信{{received}}件。",topReceiver:"{{name}}さんが最も感謝されました!"},timeline:{title:"GJタイムライン",empty:"まだGJがありません",emptyHint:"タスクを完了してGJをもらおう!",taskDoneBy:"{{userName}}が「{{taskTitle}}」を完了しました!",kudosSent:"{{userName}} {{message}}",milestone:"{{message}}",justNow:"たった今",minutesAgo:"{{count}}分前",hoursAgo:"{{count}}時間前",daysAgo:"{{count}}日前"}},ki={defaultName:"マイグループ",defaultNameWithUser:"{{name}}のグループ"},wi={create:{back:"戻る",cancel:"キャンセル",charCount:"{{count}}/{{max}}文字",creating:"作成中...",description:"新しいグループを作成して、メンバーと一緒にタスクを管理しましょう。",dueDate:"期限日
11(任意)",groupName:"グループ名",namePlaceholder:"例: 田中家",startDate:"開始日(任意)",submit:"グループを作成",title:"グループ作成"},detail:{addTaskToGroup:"このグループにタスクを追加",cancel:"キャンセル",create:"作成",createTask:"タスク作成",creating:"作成中...",fetchError:"グループの取得に失敗しました",groupList:"グループ一覧",groupSettings:"グループ設定",memberCount:"メンバー: {{count}}人",members:"メンバー",noMembers:"メンバー情報がありません",notFound:"グループが見つかりません",reload:"再読み込み",roleAdmin:"管理者",roleMember:"メンバー",roleOwner:"オーナー",taskList:"タスク一覧",taskNamePlaceholder:"タスク名を入力...",toList:"グループ一覧へ"},invite:{backToDetail:"グループ詳細へ戻る",copy:"コピー",copyFailed:"コピーに失敗しました",emailDescription:"メールアドレスを入力して直接招待を送信します",emailInvite:"メールで招待",emailNote:"招待を受け取ったユーザーは通知から参加できます。招待の有効期限は7日間です。",emailSent:"{{email}} に招待を送信しました",emailVerificationDescription:"グループ機能(メンバー招待、グループ設定など)を利用するには、メールアドレスの認証が必要です。",emailVerificationRequired:"メール認証が必要です",fetchUrlError:"招待URLの取得に失敗しました",generateFailed:"招待リンクを生成できませんでした",generateNewLink:"新しいリンクを生成",generateUrlError:"招待URLの生成に失敗しました",generating:"生成中...",groupNotFound:"グループが見つかりません",invite:"招待",inviteLink:"招待リンク",inviteMembers:"メンバーを招待",linkCopied:"招待リンクをコピーしました",newLinkGenerated:"新しい招待リンクを生成しました",qrCodeInvite:"QRコードで招待",scanToJoin:"QRコードをスキャンして参加",sendFailed:"招待の送信に失敗しました",shareLinkDescription:"このリンクを共有してメンバーを招待できます",toList:"グループ一覧へ",validUntil:"{{expiration}}有効"},inviteForm:{emailAriaLabel:"招待するユーザーのメールアドレス",emailPlaceholder:"メールアドレスを入力",invite:"招待",inviteList:"招待一覧",inviteMembers:"メンバーを招待",loading:"読み込み中...",noInvites:"招待はありません",sendInviteAriaLabel:"招待を送信",sentInvitesList:"送信済み招待一覧",statusAccepted:"承認済み",statusPending:"未承認",statusRejected:"拒否"},inviteModal:{close:"閉じる",copy:"コピー",copyError:"コピーに失敗しました",expiringSoon:"間もなく期限切れ",fetchError:"招待URLの取得に失敗しました",generateError:"招待URLの生成に失敗しました",generateNewLink:"新しいリンク生成",inviteToGroup:"「{{name}}」にメンバーを招待",linkCopied:"リンクをコピーしました",loadError:"招待リンクを読み込めませんでした",newLinkGenerated:"新しい招待リンクを生成しました",scanQR:"QRコードをスキャンして参加",shareLink:"このリンクを共有してメンバーを招待できます",title:"グループ招待",validForDays:"あと{{days}}日有効",validForHours:"あと{{hours}}時間有効",share:"リンクを共有",shareText:"「{{name}}」に招待されました。リンクから参加してください。",shareError:"共有に失敗しました"},list:{cancel:"キャンセル",confirmDeleteMessage:"「{{name}}」を削除します。この操作は取り消せません。",confirmDeleteTitle:"グループを削除しますか?",confirmLeaveMessage:"「{{name}}」から脱退します。再度参加するには招待が必要です。",confirmLeaveTitle:"グループから脱退しますか?",createFirst:"最初のグループを作成",createGroup:"グループ作成",delete:"削除する",deleting:"削除中...",description:"所属しているグループを管理できます",fetchError:"グループの取得に失敗しました",groupMenu:"{{name}}のメニュー",groupTasks:"グループタスク",leave:"脱退する",leaveGroup:"グループから脱退",leaving:"脱退中...",memberCount:"{{count}}人のメンバー",noGroups:"グループがありません",reload:"再読み込み",tasks:"タスク",title:"グループ一覧"},pendingInvites:{empty:"招待中のメンバーはいません",expires
11In:"に期限切れ",fetchError:"招待リストの取得に失敗しました",revoke:"取り消し",revokeConfirm:"{{email}} への招待を取り消しますか?",revokeError:"招待の取り消しに失敗しました"},settings:{aboutPermissions:"権限について",adminPermissions:"タスク・プロジェクト管理、メンバー招待",back:"戻る",backToList:"グループ一覧へ戻る",basicSettings:"基本設定",cancel:"キャンセル",change:"変更",clickToUpload:"クリックして画像をアップロード",confirmRemoveMember:"このメンバーをグループから削除しますか?",currentMembers:"現在のメンバー: {{count}}人",dangerZone:"危険な操作",deleteGroup:"グループを削除",deleteNotReady:"グループ削除機能は準備中です",deleteOwnerOnly:"※ グループ削除は管理者のみ可能です",deleteWarning:"グループを削除すると、関連するすべてのタスクも削除されます。この操作は取り消せません。",groupIcon:"グループアイコン",groupName:"グループ名",groupNotFound:"グループが見つかりません",imageFormats:"JPEG, PNG, GIF, WebP(最大5MB)",inviteMembers:"メンバー招待",memberManagement:"メンバー管理",memberPermissions:"タスク閲覧・編集(自分のタスクのみ)",ownerPermissions:"すべての管理権限(メンバー追加・削除・ロール変更)",removeMember:"メンバーを削除",roleAdmin:"管理者",roleMember:"メンバー",roleOwner:"オーナー",save:"保存",saving:"保存中...",title:"グループ設定",you:"あなた"}},vi={backToHome:"ホームに戻る",openMenu:"メニューを開く",personal:"個人"},Ti=JSON.parse('{"aiFaq":{"a1":"テキストを入力すると、AIが自動的にタスクを抽出して登録できる機能です。会議メモや議事録からタスクを素早く作成できます。","a2":"APIキーは暗号化処理の上、安全に保存されます。AI処理はあなたのAPIキーを使用して各AIサービスに送信されます。","a3":"OpenAI(GPT-4など)とGoogle Geminiに対応しています。設定ページからAPIキーを登録してください。","q1":"AIタスク抽出とは何ですか?","q2":"APIキーは安全に管理されていますか?","q3":"対応しているAIサービスは何ですか?","title":"AI機能"},"byoai":{"dataHandling":{"content":"## AIへのデータ送信について\\n\\n### 送信されるデータ\\nAI機能を使用すると、以下のデータが外部AIサービスに送信されます:\\n\\n- タスクのタイトル・説明\\n- メモ・コメント\\n- AIへの質問文\\n\\n### データの取り扱い\\n送信されたデータは、各AIサービスのプライバシーポリシーに従って処理されます:\\n\\n- **OpenAI**: API経由のデータは学習に使用しない(オプトアウト済み)\\n- **Anthropic**: API経由のデータは学習に使用しない\\n- **Google**: サービスにより異なる(要確認)\\n\\n### 重要な注意点\\n- 一度送信したデータは取り消せません\\n- 各AIサービスのデータ保持期間を確認してください\\n- 機密情報は送信しないでください","title":"AIへのデータ送信"},"overview":{"content":"## BYOAI(Bring Your Own AI)とは\\n\\nBYOAIは、あなた自身のAIサービスAPIキーを使用して、TasKudos内でAIアシスタント機能を利用できる仕組みです。\\n\\n### 対応AIサービス\\n- **OpenAI** (GPT-4, GPT-4o, GPT-3.5)\\n- **Anthropic** (Claude 3.5, Claude 3)\\n- **Google** (Gemini Pro, Gemini Flash)\\n\\n### メリット\\n- 自分のAPIキーで直接AIを利用\\n- 利用量に応じた従量課金(各AI提供元への支払い)\\n- APIキーは暗号化して安全に保存","title":"BYOAIとは"},"risks":{"content":"## BYOAIのリスクと注意事項\\n\\n### APIキーに関するリスク\\n\\n**重要**: APIキーは「パスワード」と同じです。\\n\\n| リスク | 説明 |\\n|-------|------|\\n| **漏洩リスク** | デバイスの紛失・盗難・マルウェア感染でAPIキーが漏洩する可能性 |\\n| **不正利用** | 漏洩したAPIキーで第三者が課金を発生させる可能性 |\\n| **高額請求** | 使用量に応じた課金のため、予期せぬ高額請求の可能性 |\\n\\n### 対策\\n- APIキーに利用上限を設定(各AIサービスの管理画面で)\\n- 定期的にAPIキーをローテーション\\n- 不審な利用がなã
11„か請求を定期確認\\n- 使用しないときはAPIキーを削除\\n\\n### 開発者の免責\\n- APIキーの管理責任はユーザーにあります\\n- APIキー漏洩・不正利用による損害は補償されません\\n- API利用料金は全額ユーザー負担です","title":"BYOAIのリスクと注意事項"},"setup":{"content":"## BYOAI設定方法\\n\\n### 1. APIキーの取得\\n各AIサービスのサイトでAPIキーを取得してください:\\n- OpenAI: https://platform.openai.com/api-keys\\n- Anthropic: https://console.anthropic.com/\\n- Google AI: https://aistudio.google.com/\\n\\n### 2. TasKudosでの設定\\n1. 設定 → AIアシスタント を開く\\n2. 使用したいAIサービスを選択\\n3. APIキーを入力\\n4. 「保存」をクリック\\n\\n### 3. 動作確認\\nAIアシスタントボタンをクリックして動作確認","title":"BYOAI設定方法"},"title":"BYOAI(AIアシスタント)"},"contact":{"support":{"content":"## サポートへの連絡\\n\\n### お問い合わせ方法\\n- **メール**: [email protected]\\n- **GitHub Issues**: バグ報告・機能要望\\n\\n### 返信までの目安\\n- 通常: 1-2営業日以内\\n- 緊急時: 24時間以内\\n\\n### 問い合わせ時のお願い\\n- 具体的な症状を記載\\n- スクリーンショットがあれば添付\\n- ブラウザ・OS情報を記載","title":"サポートへの連絡"},"title":"お問い合わせ"},"content":{"openToc":"目次を開く","selectFromMenu":"左のメニューから項目を選択してください","selectFromTocButton":"下の目次ボタンから項目を選択してください","tocTitle":"ヘルプ目次"},"description":"アプリケーションの使い方や機能について説明します","faq":{"deleteAccount":{"content":"## アカウント削除\\n\\n**注意**: アカウント削除は取り消せません。\\n\\n1. 設定ページを開く\\n2. 「アカウント削除」セクションへ移動\\n3. 確認事項を読み、「削除」をクリック\\n\\n削除前にデータのエクスポートをお勧めします。","title":"アカウントを削除したい"},"limits":{"content":"## リソース制限\\n\\n### プラン別の人数上限\\n| プラン | グループ人数上限 | 月額 |\\n|--------|----------------|------|\\n| **Free** | 10人 | 無料 |\\n| **Pro** | 20人 | Â¥480/月 |\\n\\n- Freeプランは1グループまで作成可能\\n- タスク数・リスト数は**全プラン無制限**\\n- 課金は管理者のみ\\n\\n### レート制限\\n- クイックタスク完了: 1日30件まで\\
11n- 一般操作: 1時間あたり100回まで\\n\\n### 制限の確認\\n設定 → データタブで現在の使用状況を確認できます。","title":"リソース制限について"},"maintenance":{"content":"## メンテナンス中の対応\\n\\n### メンテナンス中にできること\\n- メンテナンス画面で予定終了時刻を確認\\n- しばらく待ってから再度アクセス\\n\\n### 緊急の場合\\n管理者に連絡してください。","title":"メンテナンス中と表示される"},"notification":{"content":"## 通知が届かない場合\\n\\n### メール通知\\n- 迷惑メールフォルダを確認\\n- ドメイン設定で許可リストに追加\\n\\n### プッシュ通知\\n- ブラウザの通知設定を確認\\n- 設定ページで通知を有効化","title":"通知が届かない"},"password":{"content":"## パスワードを忘れた場合\\n\\n1. ログインページの「パスワードを忘れた方」をクリック\\n2. 登録済みメールアドレスを入力\\n3. 送信されたメールのリンクから再設定","title":"パスワードを忘れた"},"title":"FAQ"},"features":{"category":{"content":"## カテゴリー管理\\n\\n### カテゴリーとは\\nタスクを分類するためのタグです。\\n\\n### 作成方法\\n1. カテゴリーページで「新規カテゴリー」をクリック\\n2. 名前とカラーを設定\\n3. 「作成」をクリック\\n\\n### 使い方\\n- タスク作成時にカテゴリーを選択\\n- フィルター機能でカテゴリー別に絞り込み","title":"カテゴリー管理"},"displaySettings":{"content":"## 表示設定\\n\\n### ダークモード\\n設定 → 表示タブでダークモードを切り替え\\n\\n### 壁紙設定\\n1. 設定 → 表示タブを開く\\n2. プリセットから選択、またはカスタムURLを入力\\n3. 透明度・ぼかしを調整","title":"表示設定"},"gj":{"content":"## GJ(グッジョブ)\\n\\n### GJとは\\nグループメンバーの頑張りを認め合う機能です。タスクの完了やサポートに対して感謝のメッセージを送り、グループ全体のモチベーションを高めます。\\n\\n### GJの種類\\n| 種類 | アイコン | 上限 |\\n|------|---------|------|\\n| いいね | 👍 | 無制限 |\\n| ありがとう | 🙏 | 無制限 |\\n| すごい | ⭐ | 無制限 |\\n\\n### GJの送り方\\n1. タスク完了時のセレモニー画面でGJを送る\\n2. タスク詳細画面のGJボタンから送る\\n3. メッセージ(80文字以内)を添えることも可能\\n\\n### 特徴\\n- グループ内で公開される(DMではない)\\n- ポイントや経済的価値はなし\\n- 純粋に感謝と称賛を伝えるための機能\\n- 通知でGJの受信をすぐに確認できる","title":"GJ(グッジョブ)"},"group":{"content":"## グループ\\n\\n### グループの作成\\n1. グループページで「新規グループ」をクリック\\n2. グループ名と説明を入力\\n3. メンバーを招待\\n\\n### メンバーの役割\\n- **管理者**: グループ設定変更・メンバー招待・削除・プラン管理\\n- **メンバー**: タスク作成・編集・GJ送信","title":"グループ"},"invite":{"content":"## グループ招待\\n\\n### 招待方法\\n1. グループ設定ページを開く\\n2. 「招待リンクを作成」をクリック\\n3. 生成されたURLを共有\\n\\n### 招待リンクの設定\\n- **有効期限**: 1日〜無期限\\n- **使用回数**: 1回〜無制限\\n- リンクはいつでも無効化可能","title":"グループ招待"},"roles":{"content":"## メンバーの役割\\n\\n### 役割の種類\\n\\n| 役割 | 権限 |\\n|------|------|\\n| **管理者** | グループ設定変更・メンバー招待/削除・プラン管理・グループ解散 |\\n| **メンバー** | タスク作成/編集・GJ送信・リスト操作 |\\n\\n### 管理者の移設\\n1. 現管理者が「管理者を移設」を選択\\n2. 移設先メンバーを選択\\n3. 承認リクエスト通知が送られる","title":"メンバーの役割"},"taskManagement":{"content":"## タスク管理\\n\\n### タスクの作成\\n1. 画面下部の「+」ボタン(FAB)をタップ\\n2. タイトル、説明、期限を入力\\n3. 担当者、優先度(緊急/高/中/低)、カテゴリーを設定\\n4. 「作成」をタップ\\n\\n### タスクの状態\\n- **未完了(todo)**: 作成直後の状態\\n- **完了(done)**: タスク完了\\n- 進捗スライダー(0〜100%)で途中経過を記録可能\\n\\n### スワイプ操作(モバイル)\\n- **左スワイプ**: タスクを完了\\n- **右スワイプ**: タスクを延期\\n- **タップ**: 進捗スライダーと編集ボタンを表示\\n\\n### 繰り返しタスク\\n日次・週次・月次の繰り返しルールを設定して、タスクを自動生成できます。\\n\\n### ビュー切替\\n- **リスト / カード**: 一覧表示\\n- **カンバン**: 優先度別に管理\\n- **カレンダー**: 月間・週間・今日の3モード","title":"タスク管理"},"taskMemo":{"content":"## タスクメモ\\n\\n### タスクメモとは\\nタスクに100文字の共有メモを追加できる機能です。進捗や引き継ぎ情報を簡潔に共有できます。\\n\\n### 使い方\\n1. タスク詳細画面を開く\\n2. メモエリアにメモを入力\\n3. 最大100文字で保存\\n\\
11n### 活用例\\n- タスクの現在の進捗をサマリー\\n- グループメンバーへの引き継ぎ情報\\n- 実装時のポイント共有\\n- ブロッカーや課題の記録\\n\\n### 特徴\\n- リアルタイムで更新が反映\\n- タスク履歴に記録\\n- 100文字制限で簡潔な情報共有","title":"タスクメモ"},"title":"機能ガイド"},"gettingStarted":{"accountCreation":{"content":"## アカウント作成方法\\n\\n1. トップページの「新規登録」ボタンをクリック\\n2. メールアドレスとパスワードを入力\\n3. 確認メールが届いたらリンクをクリック\\n4. プロフィール設定を完了\\n\\n**注意**: パスワードは8文字以上、英数字を含む必要があります。","title":"アカウント作成"},"basicOperations":{"content":"## 基本操作\\n\\n### ナビゲーション\\n- **サイドバー**: グループ、タスクに素早くアクセス\\n- **ヘッダー**: 検索、通知、プロフィールメニュー\\n\\n### ショートカットキー\\n- `Ctrl/Cmd + K`: クイック検索\\n- `N`: 新規タスク作成\\n- `?`: ヘルプ表示","title":"基本操作"},"initialSetup":{"content":"## 初期設定\\n\\nログイン後、以下の設定を行うことをお勧めします:\\n\\n1. **プロフィール設定**: 設定ページでアバターや表示名を設定\\n2. **通知設定**: メール通知・プッシュ通知の有効/無効を選択\\n3. **グループ参加**: 招待リンクからグループに参加、または新規グループ作成","title":"初期設定"},"title":"はじめに"},"guideTour":"ガイドツアー","guideTourDesc":"インタラクティブなガイドで機能を学べます","platformLimitations":{"biometric":{"content":"## 生体認証の制限\\n\\n### 対応状況\\n\\n| 環境 | 対応状況 | 認証方式 |\\n|-----|---------|--------|\\n| **iOSアプリ** | ✅ 対応 | Face ID / Touch ID |\\n| **Androidアプリ** | ✅ 対応 | 指紋認証 / 顔認証 |\\n| **PWA/Webブラウザ** | ❌ 非対応 | - |\\n\\n### 生体認証を使いたい場合\\n\\n生体認証はネイティブアプリ(iOS/Android)でのみご利用いただけます。\\nWebブラウザ・PWAでは技術的制限により対応していません。","title":"生体認証の制限"},"offline":{"content":"## オフライン機能の制限\\n\\n### 基本的な制限\\n\\nTasKudosはクラウドベースのサービスのため、ほとんどの機能はインターネット接続が必要です。\\n\\n### オフラインでできること\\n\\n| 機能 | オフライン | 備考 |\\n|-----|-----------|------|\\n| **閲覧(キャッシュ)** | △ | 直前に開いたページのみ |\\n| **タスク作成** | ❌ | - |\\n| **AIアシスタント** | ❌ | - |\\n| **グループ機能** | ❌ | - |\\n\\n### PWAのオフライン動作\\n\\nPWAとしてインストールすると、アプリの起動自体はオフラインでも可能です。\\nただし、データの取得・更新にはインターネット接続が必要です。","title":"オフライン機能の制限"},"overview":{"content":"## 利用環境について\\n\\nTasKudosは以下の環境でご利用いただけます:\\n\\n| 環境 | 説明 |\\n|-----|------|\\n| **Webブラウザ** | Chrome、Safari、Firefox、Edgeなど |\\n| **PWA** | ホーム画面に追加してアプリのように利用 |\\n| **iOSアプリ** | TestFlight(内部テスト中) |\\n| **Androidアプリ** | Google Play(内部テスト中) |\\n\\n**注意**: 一部の機能は環境によって制限があります。詳細は以下をご確認ください。","title":"利用環境について"},"pushNotification":{"content":"## プッシュ通知の制限\\n\\n### 対応状況\\n\\n| 環境 | 対応状況 | 備考 |\\n|-----|---------|------|\\n| **PWA(Android)** | ✅ 対応 | - |\\n| **PWA(iOS 16.4+)** | ⚠️ 条件付き | ホーム画面追加必須 |\\n| **Chrome/Edge(PC)** | ✅ 対応 | - |\\n| **Safari(Mac)** | ✅ 対応 | macOS Ventura以降 |\\n| **iOSアプリ** | ✅ 対応 | - |\\n| **Androidアプリ** | ✅ 対応 | - |\\n\\n### iOS PWAでプッシュ通知を受け取るには\\n\\n1. iOS 16.4以上が必要\\n2. Safariで開いて「ホーム画面に追加」\\n3. 追加したアプリから通知を許可\\n\\n**注意**: Safariブラウザ単体ではプッシュ通知を受け取れません。","title":"プッシュ通知の
11制限"},"title":"環境別の制限事項","voiceInput":{"content":"## 音声入力の制限\\n\\nAIアシスタントの音声入力機能には、環境による制限があります。\\n\\n### 対応状況\\n\\n| 環境 | 対応状況 | 備考 |\\n|-----|---------|------|\\n| **Safari(iOS 14.5+)** | ✅ 対応 | マイク権限が必要 |\\n| **Chrome(PC)** | ✅ 対応 | マイク権限が必要 |\\n| **PWA(iOS)** | ❌ 非対応 | Apple制限 |\\n| **PWA(Android)** | ✅ 対応 | - |\\n| **Chrome(iOS)** | ❌ 非対応 | WebKit使用のため |\\n| **iOSアプリ** | ✅ 対応 | ネイティブ実装 |\\n| **Androidアプリ** | ✅ 対応 | ネイティブ実装 |\\n\\n### iOS PWAで音声入力を使いたい場合\\n\\niOS PWA(ホーム画面に追加したアプリ)では音声入力が動作しません。\\nこれはAppleの技術的制限によるものです。\\n\\n**回避方法**:\\n1. Safariブラウザで直接 https://taskudos.net にアクセス\\n2. 音声入力機能を使用\\n3. または、iOSアプリ(内部テスト中)をご利用ください\\n\\n### 権限設定(iOS Safari)\\n\\n1. 設定アプリを開く\\n2. Safari → Webサイトの設定\\n3. マイク → 許可に設定","title":"音声入力の制限"}},"security":{"accountSecurity":{"content":"## アカウントのセキュリティ\\n\\n### 強力なパスワードの設定\\n- 12文字以上を推奨\\n- 大文字・小文字・数字・記号を組み合わせ\\n- 他のサービスと同じパスワードを使わない\\n\\n### ログイン管理\\n- 「ログイン情報を記憶」は信頼できるデバイスのみで使用\\n- 共有PCでは必ずログアウト\\n- 不審なログインがあればパスワードを変更\\n\\n### セッション管理\\n- 長期間使用しない場合はログアウト\\n- ブラウザのプライベートモードの活用","title":"アカウントのセキュリティ"},"backupExport":{"content":"## バックアップとエクスポート\\n\\n### なぜバックアップが重要か\\n- サービス障害でデータが失われる可能性\\n- 誤操作による削除\\n- アカウントの問題\\n\\n### エクスポート方法\\n1. 設定 → データ を開く\\n2. 「エクスポート」をクリック\\n3. CSV形式でダウンロード\\n\\n### 推奨頻度\\n- 重要なプロジェクト: 週1回\\n- 通常利用: 月1回\\n\\n### 注意事項\\n- エクスポートファイルは安全な場所に保存\\n- 機密情報が含まれる場合は暗号化を検討","title":"バックアップとエクスポート"},"dataSafety":{"content":"## データの安全な取り扱い\\n\\n### 入力してはいけない情報\\n\\n**絶対に入力しないでください:**\\n- パスワード、APIキー、シークレットキー\\n- クレジットカード番号、銀行口座情報\\n- マイナンバー、社会保障番号\\n- 企業の機密情報、営業秘密\\n\\n### なぜ危険なのか\\n1. **データはクラウドに保存** → サーバー側での漏洩リスク\\n2. **グループ共有** → 他のメンバーに見られる可能性\\n3. **AI送信** → 外部AIサービスに送信される可能性\\n4. **バックアップ** → エクスポートデータに含まれる\\n\\n### 安全な使い方\\n- タスク内容は「何をするか」だけを記載\\n- 具体的な認証情報は別途安全な場所で管理\\n- 機密性の高い内容は「個人タスク」で管理を検討","title":"データの安全な取り扱い"},"liability":{"content":"## 免責事項・責任範囲\\n\\n### 開発者が責任を負わないもの\\n\\n| 項目 | 説明 |\\n|-----|------|\\n| **データ損失** | サーバー障害、バグ等によるデータ消失 |\\n| **BYOAI関連** | APIキー漏洩、高額請求、AI出力の誤り |\\n| **機密情報** | ユーザーが入力した機密情報の漏洩 |\\n| **第三者サービス** | Firebase、AI API等の障害 |\\n| **サービス中断** | メンテナンス、障害によるサービス停止 |\\n\\n### ユーザーの責任\\n- データのバックアップ\\n- APIキーの適切な管理\\n- 機密情報を入力しない判断\\n- 利用規約の遵守\\n\\n### 詳細\\n詳しくは「利用規約」をご確認ください。","title":"免責事項・責任範囲"},"title":"セキュリティ・データ安全"},"teamFaq":{"a1":"Freeプランでは1グループ(10人まで)を作成できます。Proプランは20人まで対応ã
11—ています。","a2":"グループ機能ではメンバー間でデータを共有するため、セキュリティ上の理由からメール認証済みのユーザーのみ利用可能としています。","a3":"管理者はグループ設定変更・メンバー招待/削除・プラン管理ができます。メンバーはタスク作成/編集・GJ送信が可能です。","q1":"グループは何個作れますか?","q2":"メール認証が必要なのはなぜですか?","q3":"管理者とメンバーの違いは?","title":"グループ機能"},"title":"ヘルプ・マニュアル","tours":{"ai":"AIを活用する","aiDesc":"AI機能の使い方を学びます(約2分)","basicTask":"はじめてのタスク","basicTaskDesc":"基本的なタスク操作を学びます(約2分)","team":"グループ運用ガイド","teamDesc":"グループ機能の使い方を学びます(約3分)","views":"ビューを使いこなす","viewsDesc":"様々な表示形式を学びます(約2分)"}}'),Ii={column:{dueDate:"期限",noTasks:"タスクがありません",priorityHigh:"高",priorityLow:"低",priorityMedium:"中",priorityUrgent:"緊急",showTasks:"{{label}}のタスクを一覧表示"},createSheet:{submit:"作成",title:"タスクを作成"},detail:{columnTasks:"{{column}} のタスク",dueDate:"期限: {{date}}",noTasks:"該当するタスクがありません",priority:"優先度: {{level}}",priorityHigh:"高",priorityLow:"低",priorityMedium:"中",priorityUrgent:"緊急",taskList:"タスク一覧"},fab:{addTask:"新しいタスクを追加",bulkAdd:"一括追加",bulkAddComingSoon:"一括追加機能は準備中です",createTask:"新規タスク作成"},help:{needsGroupCooperation:"グループで協力が必要",requestingHelp:"ヘルプを求めています({{count}}件)"},urgentSection:{dueDate:"期限: {{date}}",overdue:"期限切れ",title:"期限切れ・本日期限({{count}}件)",today:"本日"}},Ai={ai:{badge:"AI機能搭載",byoai:{description:"OpenAIやGeminiのAPIキーを設定して、AI機能を利用できます。データはあなたのAPIキーで直接処理されます。",title:"BYOAI(自分のAPIキー)"},memoBulk:{description:"箇条書きのメモをそのまま複数タスクに変換。思いついたことをすぐにタスク化できます。",title:"メモ書き一括登録"},subtitle:"AI技術で、タスク作成を効率化します",taskExtraction:{description:"テキストからタスクを自動抽出。会議メモや議事録からワンクリックでタスクを作成できます。",title:"AIタスク抽出"},title:"AIでタスク管理をもっとスマートに"},cta:{subtitle:"無料でアカウントを作成して、チームの頑張りを見える化しよう",title:"今すぐ始めましょう",viewPricing:"料金プランを見る →"},features:{calendarView:{description:"期限をカレンダーで一覧表示。スケジュール管理が簡単になります。",title:"カレンダービュー"},gj:{description:"メンバーの頑張りを認め合い、GJメッセージで感謝を伝えましょう。",title:"GJ(グッジョブ)"},groupCollaboration:{description:"グループでタスクを共有し、リアルタイムで進捗を確認。効率的なコラボレーションを実現します。",title:"グループコラボレーション"},subtitle:"TasKudosは、タスク管理に必要な主要機能を提供します",taskManagement:{description:"シンプルで直感的なタスク管理。優先度、期限、担当者を簡単に設定できます。",title:"タスク管理"},taskMemo:{description:"タスクに簡潔なメモを追加。80文字で要点を共有できます。",title:"タスクメモ"},title:"主な機能",wipBoard:{description:"カンバン形式でタスクの進捗を視覚的に管理。グループ全体の状況を一目で把握できます。",title:"WIPボード"}},footer:{contact:"お問い合わせ",privacy:"プライバシーポリシー",terms:"利用規約",dataDeletion:"データ削除リクエスト"},gj:{badge:"GJ文化を育む",benefit1:"メンバーにGJ(グッジョブ)を送れる",benefit2:"感謝のメッセージで貢献を認め合える",benefit3:"通知でGJの受信をすぐに確認",benefit4:"温かいグループ文化を育てる",de
11scription:"GJ(グッジョブ)は、メンバーの頑張りを認め合う機能です。タスクの完了やサポートに対して感謝のメッセージを送り、グループ全体のモチベーションを高めます。",showcase:{from1:"Aさん → Bさん",from2:"Cさん → Dさん",from3:"Eさん → Fさん",message1:"タスク完了おめでとう!",message2:"サポートありがとう!",message3:"素晴らしい仕事でした!",subtitle:"グループのGJ"},titleLine1:"GJで",titleLine2:"グループの絆を深める"},header:{free:"無料で",login:"ログイン",pricing:"料金プラン",start:"始める"},hero:{badge:"小さく始めて、小さく褒める。",ctaStart:"無料で始める",ctaStartSub:"登録で全機能・クラウド同期(ずっと無料)",recommendedBadge:"おすすめ",noSignupBadge:"登録不要",tryFirstSub:"ゲストで体験。作ったデータは登録時に引き継げます",guestNote:"※最大20タスク・5カテゴリ/通知・グループ招待は登録後",haveAccount:"すでにアカウントをお持ちの方は",description:"TasKudosは、家族やボランティア、習い事教室など小さなチームのためのタスク管理アプリ。メンバーの頑張りをGJ(グッジョブ)で認め合い、みんなのやる気を高めます。",titleHighlight:"GJ(グッジョブ)",titleLine1:"タスク管理と",titleLine2Suffix:"を",titleLine3:"一つに",tryFirst:"登録せずに試す"}},Si=JSON.parse('{"privacy":{"contactFooter":"ご質問がある場合は、お問い合わせフォーム(https://towanone.com)またはアプリ内設定ページからご連絡ください。","lastUpdatedDate":"2026å¹´7月6日","pageTitle":"プライバシーポリシー","section1":{"content":"本プライバシーポリシーは、とわのね(以下「当事業者」)が提供するTasKudos(以下「本サービス」)における個人情報およびデータの取り扱いについて説明します。本サービスをご利用になる前に、本ポリシーをよくお読みください。","title":"1. はじめに"},"section10":{"content":"本サービスでは以下の目的でCookie・ローカルストレージを使用します:\\n\\n• ログイン状態の維持\\n• ユーザー設定の保存\\n\\nブラウザ設定でCookieを無効にできますが、一部機能が制限される場合があります。\\n\\n本サービスは、ログイン状態の維持等に必要な必須Cookieのみを使用し、解析・広告目的のCookieやトラッキング技術は使用しません。モバイルアプリにおいても利用状況の計測は行いません(クラッシュ発生時の診断情報の収集(第2条2.5)はクラッシュ診断のみを目的とするものであり、利用状況の計測・トラッキングには該当しません)。","title":"10. Cookieの使用"},"section11":{"content":"本サービスは13歳以上の方を対象としています。13歳未満の方はご利用いただけません。アカウント登録時に生年を確認し、13歳未満の方の登録はブロックされます。","title":"11. 子どものプライバシー"},"section12":{"content":"本ポリシーは予告なく変更される場合があります。重要な変更がある場合は、本サービス内で通知します。継続して利用することで、変更後のポリシーに同意したものとみなします。","title":"12. ポリシーの変更"},"section13":{"content":"プライバシーに関するお問い合わせは、お問い合わせフォーム(https://towanone.com)またはアプリ内設定ページの「お問い合わせ」からご連絡ください。\\nメール: [email protected]","title":"13. お問い合わせ"},"section14":{"content":"本サービスは、以下の法的根拠に基づいて個人情報を取り扱います:\\n\\n• **契約の履行**: アカウント認証、タスク・称賛データの保存および同期は、本サービスの提供(利用契約の履行)に必要な範囲で行います\\n• **ご本人の同意**: プッシュ通知の配信は、通知機能を有効化されたご本人の同意に基づいて行います\\n\\n本サービスは、広告目的での個人情報の利用や、第三者への個人情報の販売を行いません。","title":"14. 個人情報を取り扱う法的根拠"},"section15":{"content":"本ポリシーおよび本サービスにおける個人情報の取り扱いは、日本の個人情報保護法(APPI)その他の適用される日本の法令に準拠します。","title":"15. 準拠法"},"section2":{"content":"**2.1 アカウント情報**\\n• メールアドレス\\n• 表示名ï¼
11ˆä»»æ„ï¼‰\\n• プロフィール画像(任意)\\n\\n**2.2 利用データ**\\n• タスク、グループ情報\\n• 操作ログ(作成日時、更新日時)\\n• デバイス情報(ブラウザ種別、OS)\\n\\n**2.3 BYOAI機能関連**\\n• ユーザーが設定したAIサービスのAPIキー\\n  ※APIキーはCloud Functionsを経由して暗号化処理の上、Firestoreに保存されます。平文のAPIキーがサーバーに保存されることはありません\\n\\n**2.4 プッシュ通知トークン**\\n• 通知を有効化した場合(モバイルアプリまたは対応ブラウザ)、通知配信のためのプッシュ通知トークンを保存します\\n• 通知トークンは通知配信の目的のみに使用します\\n\\n**2.5 クラッシュ診断情報(モバイルアプリ)**\\n• モバイルアプリでは、アプリの安定性改善のため Firebase Crashlytics により、クラッシュ発生時の診断情報(端末機種、OSバージョン、クラッシュ時のスタックトレース等)を収集します\\n• これはクラッシュ診断のみを目的とした収集であり、利用状況の計測(アクセス解析)や広告・行動トラッキングとは別枠です。収集した診断情報を広告目的で利用・第三者提供することはありません","title":"2. 収集する情報"},"section3":{"content":"**3.1 クラウドストレージ(Firebase)**\\n• アカウント情報、タスクデータ等はGoogle Firebase(Firestore)に保存されます\\n• データセンターは日本国内または米国に所在します\\n\\n**3.2 ローカルストレージ**\\n• 表示設定(ダークモード等)\\n• キャッシュデータ\\n\\nこれらはお使いのデバイスにのみ保存され、サーバーには送信されません。\\n\\n**3.3 暗号化クラウドストレージ**\\n• BYOAI APIキー(暗号化済み)\\n\\nAPIキーはCloud Functionsを経由して暗号化処理の上、Firestoreに保存されます。","title":"3. データの保存場所"},"section4":{"content":"**4.1 APIキーの管理**\\nBYOAI(Bring Your Own AI)機能では、ユーザー自身が契約する外部AIサービスのAPIキーを使用します。\\n\\n• APIキーはCloud Functionsを経由して暗号化処理の上、Firestoreに保存されます\\n• 平文のAPIキーがサーバー上に保存されることはありません\\n• APIキーの管理責任はユーザーにあります\\n\\n**4.2 外部AIサービスへのデータ送信**\\nAI機能を使用する際、以下のデータが外部AIサービスに送信される場合があります:\\n\\n• タスクの内容\\n• メモ・コメント\\n• AIへの質問文\\n\\n**重要**: 送信されたデータの取り扱いは、各AIサービス提供事業者(OpenAI、Google、Anthropic等)のプライバシーポリシーに準拠します。当社は外部AIサービスでのデータ取り扱いについて責任を負いません。\\n\\n**4.3 機密情報に関する警告**\\n以下の情報をタスクやメモに入力しないことを強く推奨します:\\n\\n• パスワード、APIキー、シークレットキー\\n• クレジットカード番号、銀行口座情報\\n• マイナンバー、社会保障番号\\n• 企業の営業秘密、機密情報\\n• 個人を特定できる詳細な情報\\n\\nこれらの情報を入力した場合のリスクは、すべてユーザーの責任となります。","title":"4. BYOAI機能に関する重要事項"},"section5":{"content":"収集したデータは以下の目的で利用します:\\n\\n• 本サービスの提供・運営\\n• ユーザーサポート\\n• サービスの改善・新機能開発\\n• サービスの品質向上および不具合調査(個人を特定しない範囲)\\n• 利用状況の分析(匿名化処理後)\\n• 不正利用の防止\\n\\nマーケティング目的での第三者へのデータ販売は行いません。","title":"5. データの利用目的"}
11,"section6":{"content":"**6.1 グループ内での共有**\\nグループに参加している場合、タスク情報は同じグループメンバーと共有されます。\\n\\n**6.2 第三者サービス**\\n本サービスは以下の第三者サービスを利用しています:\\n\\n• **Firebase (Google)**: 認証、データベース、ホスティング\\n• **外部AIサービス**: BYOAI機能使用時のみ(ユーザー選択)\\n\\n各サービスのプライバシーポリシーもご確認ください。\\n\\n**6.3 国際データ移転**\\n本サービスで取り扱うデータは、以下の理由により日本国外に移転される場合があります:\\n\\n• **Firebase(Google Cloud)**: データはGoogle Cloudの日本リージョン(asia-northeast1)を優先的に使用しますが、サービスの可用性確保のため米国等のデータセンターにレプリケーションされる場合があります\\n• **BYOAI機能**: ユーザーが選択した外部AIサービス(OpenAI、Google、Anthropic等)のサーバーにタスクデータが送信されます。各サービスのデータ保存先は提供事業者のポリシーに準じます\\n\\nこれらのデータ移転は、サービス提供に必要な範囲で行われます。","title":"6. データの共有"},"section7":{"content":"**7.1 データアクセス権**\\n設定ページから自身のデータを閲覧できます。\\n\\n**7.2 データ削除権**\\nアカウント削除により、関連するすべてのデータが削除されます(個人タスク、カテゴリ、エージェント設定等)。グループタスクについては、担当者の割り当てが解除されます。\\n※ローカルストレージのデータはブラウザの設定から手動で削除してください。\\n\\n**7.3 データ保持期間**\\n以下のデータには保持期間が設定されており、期間経過後に自動削除されます:\\n• 通知: 90日間\\n• デバイストークン: 180日間(最終利用日基準)\\n• 異常検知スコア: 180日間\\n• 監査ログ: 365日間\\n\\n**7.4 データエクスポート**\\nタスクデータのエクスポート機能を提供しています(CSV、iCal形式)。\\n\\n**7.5 BYOAI APIキーの削除**\\n設定ページからいつでもAPIキーを削除できます。\\n\\n**7.6 開示・訂正・利用停止の請求**\\n保有個人データの開示、訂正、追加、削除、利用停止、第三者提供の停止をご請求いただけます。窓口=[email protected]。ご本人からの請求であることを確認の上、法令に従い対応ã
11—ます。","title":"7. ユーザーの権利"},"section8":{"content":"**8.1 通信の暗号化**\\nすべての通信はHTTPS(TLS 1.2以上)で暗号化されています。\\n\\n**8.2 認証**\\nFirebase Authenticationによる安全な認証を提供しています。\\n\\n**8.3 アクセス制御**\\nFirestore Security Rulesにより、ユーザーは自身のデータにのみアクセスできます。\\n\\n**8.4 保存データの暗号化**\\nサーバーに保存されるデータは、Google Cloud のインフラストラクチャにおいて保存時に暗号化されます。\\n\\n**注意**: 100%安全なシステムは存在しません。重要なデータのバックアップを推奨します。","title":"8. セキュリティ"},"section9":{"content":"**【重要】本サービスの利用に起因または関連して生じたいかなる損害についても、開発者は一切の責任を負いません。**\\n\\n**9.1 包括的免責**\\n本サービスは「現状有姿(AS IS)」で提供されます。本サービスの利用により生じた直接的、間接的、偶発的、特別、または結果的な損害について、開発者は一切の責任を負いません。\\n\\n**9.2 データ損失・漏洩**\\nシステム障害、サーバー障害、プログラムの不具合、セキュリティ侵害、その他予期せぬ事態によるデータの損失、破損、または漏洩について、開発者は責任を負いません。\\n\\n**9.3 BYOAI機能**\\n以下を含む、BYOAI機能に関連するすべての損害について、開発者は責任を負いません:\\n• APIキーの漏洩、不正利用による損害\\n• 外部AIサービスの障害、仕様変更、サービス終了\\n• AI生成コンテンツの正確性、適切性\\n• 予期せぬAPI利用料金の発生\\n\\n**9.4 第三者サービス**\\nFirebase、外部AIサービス等の第三者サービスに起因する問題について、開発者は責任を負いません。\\n\\n**9.5 機密情報**\\nユーザーが機密情報を入力したことによる損害について、開発者は一切の責任を負いません。\\n\\n**9.6 不具合・障害**\\n本サービスに含まれるプログラムの不具合、エラー、障害、またはその他の技術的問題により生じた損害について、開発者は一切の責任を負いません。","title":"9. 免責事項"},"toc":"目次","versionInfo":"バージョン: {{version}} | 最終更新: {{date}}","viewTerms":"利用規約を見る"},"terms":{"agreePrefix":"","agreePostfix":"に同意します","appendix":{"content":"本規約は2026å¹´1月18日より施行します。\\n\\n**改定履歴**\\n• 2026å¹´4月15日: v2.1.0 - 事業者情報の正式記載(とわのね)\\n• 2026å¹´1月18日: v2.0.0 - BYOAI機能、免責事項の追加\\n• 2024å¹´12月25日: v1.0.0 - 初版制定","title":"附則"},"back":"戻る","lastUpdated":"最終更新日: {{date}}","lastUpdatedDate":"2026å¹´4月15日","loadError":"利用規約の読み込みに失敗しました","reload":"再読み込み","section1":{"content":"本規約は、本サービス「TasKudos」の利用に関する条件を定めるものであり、本サービスを利用するすべてのユーザーに適用されます。本サービスを利用することにより、本規約のすべての条項に同意したものとみなされます。","title":"第1条(適用)"},"section10":{"content":"本サービスに関する知的財産権は、開発者または正当な権利者に帰属します。ユーザーは、本サービスを通じて知的財産権を取得するものではありません。\\n\\nユーザーが作成したコンテンツ(タスク、メモ等)の権利はユーザーに帰属しますが、サービス提供に必要な範囲で開発者に利用を許諾するものとします。","title":"第10条(知的財産権)"},"section11":{"content":"1. 開発者は、ユーザーに通知することなく、本サービスの内容を変更し、または本サービスの提供を終了することができるものとします。\\n\\n2. サービス終了の場合、可能な限り事前に通知し、データエクスポートの機会を提供するよう努めます。\\n\\n3. 本サービスの変更、終了によりユーザーに生じた損害について、開発者は責任を負いません。","title":"第11条(サービスの変更・終了)"},"section12":{"content":"1. 開発者は、必要と判断した場合には、ユーザーに通知することなくいつでも本規約を変更することができるものとします。\\n\\n2. 変更後の利用規約は、本サービス内での掲示をもって効力を生じます。\\n\\n3. 本規約の変更後に本サービスを利用した場合、変更後の規約に同意したものとみなã
11—ます。\\n\\n4. 重要な変更がある場合は、本サービス内で通知するよう努めます。","title":"第12条(利用規約の変更)"},"section13":{"content":"本サービスの利用によって取得する個人情報については、別途定める「プライバシーポリシー」に従い適切に取り扱います。","title":"第13条(個人情報の取扱い)"},"section14":{"content":"1. 本規約の解釈にあたっては、日本法を準拠法とします。\\n\\n2. 本サービスに関して紛争が生じた場合には、東京地方裁判所を第一審の専属的合意管轄裁判所とします。","title":"第14条(準拠法・裁判管轄)"},"section15":{"content":"本規約のいずれかの条項が無効または執行不能と判断された場合でも、残りの条項は引き続き有効とします。","title":"第15条(分離可能性)"},"section2":{"content":"本規約において使用する用語の定義は以下のとおりとします。\\n\\n• **本サービス**: アプリケーション「TasKudos」およびそれに関連する一切のサービス\\n• **ユーザー**: 本サービスを利用するすべての方\\n• **BYOAI機能**: \\"Bring Your Own AI\\"の略称。ユーザーが自身のAPIキーを使用して外部AIサービスを利用する機能\\n• **当事業者**: 本サービスの提供者(とわのね)","title":"第2条(定義)"},"section3":{"content":"1. 登録希望者が本規約に同意の上、所定の方法によって利用登録を申請し、開発者がこれを承認することによって、利用登録が完了するものとします。\\n\\n2. ユーザーは、自己の責任において、本サービスのアカウント情報を適切に管理するものとします。","title":"第3条(利用登録)"},"section4":{"content":"**4.1 APIキーの管理責任**\\n• ユーザーは、BYOAI機能で使用するAPIキーを自己の責任において厳重に管理するものとします\\n• APIキーは暗号化処理の上、サーバー(Firestore)に保存されます\\n• デバイスの紛失、盗難、マルウェア感染、サーバー障害等によるAPIキー漏洩のリスクはユーザーが負担します\\n\\n**4.2 API利用料金**\\n• BYOAI機能を通じて発生する外部AIサービスの利用料金は、すべてユーザーの負担となります\\n• 開発者は、利用料金の計算、請求、支払い等には一切関与しません\\n• 予期せぬ高額請求が発生した場合でも、開発者は責任を負いません\\n\\n**4.3 外部AIサービスへのデータ送信**\\n• AI機能使用時、タスク内容等のデータが外部AIサービスに送信されます\\n• 送信されたデータの取り扱いは、各AIサービス提供事業者のプライバシーポリシーに準拠します\\n• 開発者は、外部AIサービスにおけるデータ取り扱いについて一切の保証を行いません\\n\\n**4.4 AI生成コンテンツ**\\n• AIが生成したコンテンツの正確性、適切性について、開発者は保証しません\\n• AI生成コンテンツに基づく判断・行動は、ユーザーの自己責任となります","title":"第4条(BYOAI機能に関する重要事項)"},"section5":{"content":"**5.1 入力してはならない情報**\\nユーザーは、以下の情報を本サービスに入力しないよう十分に注意するものとします:\\n\\n• パスワード、APIキー、シークレットキー、トークン\\n• クレジットカード番号、銀行口座情報\\n• マイナンバー、社会保障番号、運転免許証番号\\n• 企業の営業秘密、機密情報、未公開情報\\n• 個人を特定できる詳細な医療情報\\n• その他、第三者に知られた場合に損害が生じる可能性のある情報\\n\\n**5.2 機密情報入力時のリスク**\\n• 上記の情報を入力した場合、情報漏洩のリスクがあります\\n• 特にAI機能使用時は、外部サービスにデータが送信されるリスクがあります\\n• 機密情報の入力によって生じた損害について、開発者は一切の責任を負いません\\n\\n**5.3 ユーザーの責任**\\
11n• 機密情報の取り扱いに関する判断は、すべてユーザーの責任となります\\n• 企業データを扱う場合は、所属組織のセキュリティポリシーに従ってください","title":"第5条(機密情報の取り扱い)"},"section6":{"content":"ユーザーは、本サービスの利用にあたり、以下の行為をしてはなりません。\\n\\n• 法令または公序良俗に違反する行為\\n• 犯罪行為に関連する行為\\n• 本サービスの運営を妨害する行為\\n• 他のユーザーに迷惑をかける行為\\n• 当社のサーバーまたはネットワークに過度な負荷をかける行為\\n• 不正アクセスをし、またはこれを試みる行為\\n• 他のユーザーの個人情報等を収集または蓄積する行為\\n• 本サービスを利用した商業活動(許可された場合を除く)","title":"第6条(禁止事項)"},"section7":{"content":"**【重要】本サービスの利用は、すべてユーザー自身の責任において行われるものとします。本サービスの利用に起因または関連して生じたいかなる損害についても、開発者は一切の責任を負いません。**\\n\\n**7.1 包括的免責**\\n本サービスは「現状有姿(AS IS)」で提供されます。開発者は、明示または黙示を問わず、本サービスに関していかなる保証も行いません。本サービスの使用または使用不能から生じる直接的、間接的、偶発的、特別、懲罰的、または結果的な損害について、開発者は一切の責任を負いません。\\n\\n**7.2 サービスの保証の否認**\\n開発者は、本サービスに関して以下の事項を保証しません:\\n\\n• サービスの継続性・中断がないこと\\n• エラー、バグ、不具合がないこと\\n• データの完全性・正確性・安全性\\n• 特定目的への適合性\\n• セキュリティ上の欠陥がないこと\\n• ユーザーの期待する結果が得られること\\n\\n**7.3 データ損失**\\n通信回線の障害、サーバーの故障、メンテナンス、プログラムの不具合、その他予期せぬ事態により、ユーザーデータが消失、破損、または漏洩した場合でも、開発者は一切の責任を負いません。\\n\\n**7.4 サービス中断・終了**\\n開発者は、理由の如何を問わず、事前の通知なくサービスを一時停止または終了できるものとします。サービス中断・終了によるユーザーの損害について、開発者は責任を負いません。\\n\\n**7.5 第三者サービス**\\n本サービスは、Firebase(Google)、各種AI API等の第三者サービスに依存しています。これらのサービスの障害、仕様変更、サービス終了等に起因する問題について、開発者は責任を負いません。\\n\\n**7.6 ユーザー間の紛争**\\n本サービスに関連してユーザー間で生じた紛争について、開発者は一切関与しません。\\n\\n**7.7 不具合・障害**\\n本サービスに含まれるプログラムの不具合、エラー、障害、またはその他の技術的問題により生じた損害について、開発者は一切の責任を負いません。","title":"第7条(免責事項)"},"section8":{"content":"**8.1 完全免責**\\n開発者は、本サービスの利用に関連してユーザーに生じた損害について、その原因の如何を問わず、一切の責任を負いません。これには以下が含まれますが、これらに限定されません:\\n\\n• データの損失、破損、漏洩\\n• サービスの中断、遅延、停止\\n• プログラムの不具合、エラー、バグ\\n• セキュリティ侵害\\n• 第三者による不正アクセス\\n• ユーザーの誤操作\\n• 機密情報の漏洩\\n• 業務上の損失\\n\\n**8.2 賠償額の上限**\\n法律上、開発者の責任が認められる場合であっても、開発者の賠償責任は、ユーザーが本サービスに対して直接支払った金額を上限とします(無料ユーザーの場合は0円)。\\n\\
11n**8.3 間接損害の免責**\\n開発者は、逸失利益、事業機会の喪失、データ損失、間接損害、特別損害、付随的損害、懲罰的損害、または結果損害について、たとえそのような損害の可能性について知らされていた場合でも、いかなる場合も責任を負いません。","title":"第8条(損害賠償の制限)"},"section9":{"content":"**9.1 自己責任の原則**\\nユーザーは、自己の責任において本サービスを利用するものとします。\\n\\n**9.2 データバックアップ**\\nユーザーは、重要なデータについて定期的にバックアップを取ることを強く推奨します。データのエクスポート機能を活用してください。\\n\\n**9.3 セキュリティ対策**\\n• 強力なパスワードの使用\\n• 二要素認証の有効化(推奨)\\n• 不審なアクセスの報告\\n\\n**9.4 規約遵守**\\n本規約および関連法令を遵守してください。","title":"第9条(ユーザーの責任)"},"title":"利用規約","versionInfo":"バージョン {{version}} | 最終更新: {{date}}"},"tokushoho":{"address":{"label":"所在地","value":"販売事業者名、所在地、電話番号については、請求があった場合に遅滞なく開示いたします。お問い合わせフォームよりご連絡ください。"},"backToSettings":"設定に戻る","cancelMethod":{"label":"解約方法","value":"アプリ内の設定ページまたはお問い合わせフォームよりお手続きください。\\n※解約後も契約期間終了まで利用可能"},"contact":{"label":"連絡先","value":"お問い合わせフォーム(https://towanone.com)よりご連絡ください。\\nメール: [email protected]"},"deliveryTiming":{"label":"商品の引渡し時期","value":"決済完了後、即時にサービスをご利用いただけます。"},"lastUpdated":"2026å¹´4月15日","lastUpdatedLabel":"最終更新日: {{date}}","manager":{"label":"運営責任者","value":"販売事業者名、所在地、電話番号については、請求があった場合に遅滞なく開示いたします。お問い合わせフォームよりご連絡ください。"},"pageTitle":"特定商取引法に基づく表記","paymentMethod":{"label":"支払方法","value":"クレジットカード(Stripe経由)\\nApple App Store決済\\nGoogle Play決済"},"paymentTiming":{"label":"支払時期","value":"サブスクリプション契約時に即時決済。以降、契約期間に応じて自動更新時に決済。"},"price":{"label":"販売価格","value":"各プランの詳細ページに表示(税込価格)"},"returnPolicy":{"label":"返品・キャンセル","value":"デジタルサービスの性質上、購入後の返金は原則として承っておりません。サブスクリプションは次回更新日前にキャンセル可能です。"},"seller":{"label":"販売事業者","value":"とわのね"},"systemRequirements":{"label":"動作環境","value":"モダンブラウザ(Chrome, Safari, Firefox, Edge の最新版)、iOS 15以上、Android 10以上"}}}'),Ci={copied:"コピー済み",copy:"コピー",openInNewTab:"新しいタブで開く"},Ei={errors:{loginRequired:"ログインが必要です",planNotEligible:"プラン非対応",alreadyEnrolled:"既にMFAが登録されています",enrollmentFailed:"TOTP登録の開始に失敗しました",verificationFailed:"認証コードの検証に失敗しました",invalidSession:"登録セッションが無効です"},codeLabel:"確認コード(6桁)",description:"セキュリティのため、追加の認証が必要です。登録した電話番号に確認コードを送信します。",resendCode:"コードを再送信",sendCode:"確認コードを送信",sending:"送信中...",setup:{close:"閉じる",enterSixDigits:"6桁のコードを入力してください",incorrectCodeRetry:"認証コードが正しくありません。もう一度お試しください",mfaTitle:"多要素認証(MFA)",notAvailable:"MFAが利用できません",setupDescription:"認証アプリを使用してアカウントを保護します",setupTitle:"多要素認証(MFA)のセットアップ"},setupCard:{authApp:"認証アプリ",disableButton:"2段階認証を無効にする",disableError:"2段階認証の無効化に失敗しました",disableSuccess:"2段階認証を無効化しました",disabled:"無効",enabled:"有効",enabledMessage:"2段階認証が有効です",enrolled:"登録済み: {{factors}}",firebaseConsoleRequired:"Firebase ConsoleでMFAを有効化する必要があります。",recommendation:"アカウントのセキュリティを強化するため、2段階認証を有効にすることをお勧めします。",requiresFirebaseConsole:"2段階認証の設定にはFirebase Console設定が必要です",requiresRelogin:"セキュリティのため、再ログインが必要です",setupButton:"2段階認証を設定する",setupRequirements:"設定要件",smsAuth:"SMS認証",title:"2段階認証"},title:"2段階認証",totpSetup:{appGuide:{appReady:"アプリを用意しました",installInstructions:"以下のいずれかの認証アプリをスマートフォンにインストールしてください。",prepareApp:"認証アプリを準備してください"},backupCodes:{copied:"コピーしました",copyCodes:"コードをコピー",saveDescription:"認証アプリを紛失した場合、これらのコードでログインできます。安全な場所に保存してください。",saveTitle:"バックアップコードを保存してください",savedNext:"保存しました、次へ"},common:{back:"戻る",cancel:"キャンセル",verify:"確認する",verifying:"確認中..."},completion:{description:"アカウントは多要素認証で保護されています",done:"完了",title:"MFAセットアップ完了"},error:{defaultMessage:"エラーが発生しました。もう一度お試しください。",retry:"やり直す",title:"セットアップに失敗しました"},intro:{availableApps:"Google Authenticator、Microsoft Authenticator などが使用できます",loginAuth:"ログイン時の追加認証",passwordProtection:"パスワードå
11¤‰æ›´æ™‚の保護",protectedFeatures:"MFAで保護される機能",requirements:"必要なもの:",requirementsDetail:"スマートフォンと認証アプリ",settingsSecurity:"重要な設定変更時のセキュリティ",setupLater:"あとで設定する",startSetup:"セットアップを開始"},scanQR:{copyKey:"キーをコピー",manualEntryHint:"QRコードをスキャンできない場合は、以下のキーを手動入力してください",qrCodeAlt:"TOTP QRコード",scanInstructions:"認証アプリでこのQRコードをスキャンしてください",scanned:"スキャンしました"},steps:{complete:"完了",prepare:"準備",qrScan:"QRスキャン",verify:"確認"},verify:{enterCode:"認証コードを入力してください",enterCodeDescription:"認証アプリに表示されている6桁のコードを入力してください"}},totpVerify:{attemptsRemaining:"残り試行回数: {{count}}回",backupCode:{oneTimeWarning:"バックアップコードは一度しか使用できません。使用後は無効になります。",useAuthApp:"認証アプリを使用する"},common:{back:"戻る",cancel:"キャンセル",close:"閉じる",processing:"処理中...",verify:"確認する",verifying:"確認中..."},disabled:{description:"認証アプリを使用してアカウントを保護します",setup:"設定する",title:"多要素認証(MFA)"},enabled:{description:"アカウントは認証アプリで保護されています",disable:"無効にする",disableConfirmDescription:"無効にすると、アカウントのセキュリティが低下します。続行するには認証コードを入力してください。",disableConfirmTitle:"MFAを無効にしますか?",enrolledAt:"設定日: {{date}}",title:"多要素認証(MFA)有効"},ineligible:{businessRequired:"MFA機能はBusinessプラン以上で利用可能です",title:"多要素認証(MFA)",upgradeHint:"プランのアップグレードについては、設定 → アカウント をご確認ください"},lockedOut:{description:"認証の試行回数が上限に達しました。しばらく待ってからもう一度お試しください。",title:"認証がロックされました"},totpCode:{cannotUseApp:"認証アプリを使用できない場合"}},verify:"確認",verifying:"確認中..."},Pi={achievements:"実績",featureTabs:"機能切替",mainNavigation:"メインナビゲーション",admin:{adminGuide:"管理者ガイド",feedbackManagement:"FB管理"},analytics:"分析",breadcrumb:{ariaLabel:"パンくずリスト",calendar:"カレンダー",channels:"チャンネル",chat:"チャット",goHome:"ホームへ戻る",groups:"グループ",home:"ホーム",kanban:"カンバン",mentions:"メンション",new:"新規作成",notifications:"通知",settings:"設定",wip:"WIPボード"},calendar:"カレンダー",dashboard:"ダッシュボード",hamburger:{closeMenu:"メニューを閉じる",openMenu:"メニューを開く"},kanban:"カンバン",members:"メンバー",ranking:"ランキング",settings:"設定",tasks:"タスク",timeline:"タイムライン",userIcon:{logout:"ログアウト",notifications:"通知",openMenu:"ユーザーメニューを開く",openMenuWithBadge:"ユーザーメニューを開く({{count}}件の未読通知)",personalSettings:"個人設定",user:"ユーザー"}},Di={createGroup:"グループを作成",feedback:"要望・フィードバック",groups:"グループ",help:"ヘルプ",notifications:"通知",personalSettings:"個人設定",personalTasks:"個人タスク"},ji={bell:{label:"通知",withUnread:"通知(未読{{count}}件)"},list:{empty:"通知はありません",emptyDescription:"タスクが更新されるとここに通知が届きます",loading:"読み込み中...",markAllRead:"全て既読",title:"通知",unread:"未読"},byType:{team_updated:{title:"グループ名が変更されました",body:"グループ「{{oldName}}」が「{{newName}}」に変更されました"},reaction:{urgent:{title:"🔥 緊急対応の要請があります",body:"{{reactorName}}さんがタスク「{{taskTitle}}」に緊急対応を要請しました"}
11,concern:{title:"🤔 進捗確認のリアクションがあります",body:"{{reactorName}}さんがタスク「{{taskTitle}}」の進捗を確認しています"},contact:{title:"📞 連絡の要請があります",body:"{{reactorName}}さんがタスク「{{taskTitle}}」について連絡を求めています"}},gj_task_done:{title:"タスク完了",body:"{{completerName}}が「{{taskTitle}}」を完了しました!"},gj_kudos:{title:"ありがとうが届きました",body:"{{senderName}}さんから:{{message}}"},team_invitation:{title:"グループ招待",body:"{{inviterName}}さんから「{{teamName}}」への招待が届いています"},feedback_received:{title:"新しいフィードバック",body:"{{feedbackTitle}}",bodyEmpty:"新しいフィードバックが届きました"},feedback_reply:{from_admin:{title:"フィードバックへの返信",body:"{{excerpt}}",bodyEmpty:"管理者から返信がありました"},from_user:{title:"フィードバックに追加メッセージ",body:"{{excerpt}}",bodyEmpty:"ユーザーから追加メッセージがあります"}},task_deletion_warning:{title:"タスク自動削除のお知らせ",body:"{{taskCount}}件のタスクが30日後に自動削除されます"},cp_earned:{approval:{title:"承認報酬を獲得しました",body:"「{{taskTitle}}」の承認で {{points}} CPを獲得しました"},completion:{title:"CPを獲得しました",body:"「{{taskTitle}}」の完了で {{points}} CPを獲得しました"}}}},Li={back:"戻る",done:"完了",dontShowAgain:"次から表示しない",guide:"ガイド",next:"次へ",skip:"スキップ",startTour:"ガイドツアーを開始",tour:{ai:{description:"AIによるタスク入力補助やメモ解析機能を体験します。",duration:"2分",name:"AIを活用する"},basicTask:{description:"タスクを作成して完了する基本操作を体験します。",duration:"2分",name:"はじめてのタスク"},team:{description:"グループメンバーの招待やコミュニケーション方法を学びます。",duration:"3分",name:"グループ運用ガイド"},views:{description:"4種類のタスクビューを切り替えて使いこなします。",duration:"2分",name:"ビューを使いこなす"},hiddenNotice:"ガイドボタンが非表示になりました。ヘルプページからいつでも再開できます。"}},Ri={calendar:{errorOccurred:"エラーが発生しました: {{message}}"},categories:{aboutGroup:"グループカテゴリー: グループメンバー全員が使用できます",aboutPersonal:"個人カテゴリー: 自分のタスクにのみ使用できます",aboutTitle:"カテゴリーについて",add:"追加",addCategory:"カテゴリーを追加",addGroupCategory:"グループカテゴリーを追加",addPersonalCategory:"個人カテゴリーを追加",createCategory:"カテゴリーを作成",createFailed:"カテゴリの作成に失敗しました",createSuccess:"カテゴリーを作成しました",deleteFailed:"削除に失敗しました",deleteSuccess:"カテゴリーを削除しました",editCategory:"カテゴリーを編集",error:"エラーが発生しました",filterAll:"すべて",filterGroup:"グループ",filterPersonal:"個人",groupCategories:"グループカテゴリー",groupSharedCategories:"グループ共有カテゴリー",invalidUserId:"有効なユーザーIDがありません",loading:"読み込み中...",myCategories:"マイカテゴリー",noGroupCategories:"グループカテゴリーがありません",noPersonalCategories:"個人カテゴリーがありません",personalCategories:"個人カテゴリー",scopeFilter:"所属フィルタ",selectGroup:"グループを選択してください",showCategoryFilter:"{{label}}カテゴリーを表示",title:"カテゴリー管理",updateFailed:"更新に失敗しました",updateSuccess:"カテゴリーを更新しました"},feedback:{description:"TasKudosをより良くするためのご意見をお聞かせください。",enterReply:"返信内容を入力してください",loginRequired:"ログインが必要です",replyFailed:"返信の送信に失敗しました",replySent:"返信を送信しました",submitFailed:"送信に失敗しました。もう一度お試しください。",submitSuccess:"フィードバックを送信しました。ご意見ありがとうございます!",t
11itle:"要望・フィードバック"},help:{aiFeatures:"AI機能",description:"アプリケーションの使い方や機能について説明します",faq:"よくある質問",faqAdminVsMember:"管理者とメンバーの違いは?",faqAdminVsMemberAnswer:"管理者はグループ設定の変更やメンバーの招待・削除ができます。メンバーはタスクの閲覧・編集やGJの送信ができます。",faqAiExtraction:"AIタスク抽出とは何ですか?",faqAiExtractionAnswer:"テキストを入力すると、AIが自動的にタスクを抽出して登録できる機能です。会議メモや議事録からタスクを素早く作成できます。",faqApiKeySafety:"APIキーは安全に管理されていますか?",faqApiKeySafetyAnswer:"APIキーは暗号化処理の上、安全に保存されます。AI処理はあなたのAPIキーを使用して各AIサービスに送信されます。",faqGroupLimit:"グループはいくつ作れますか?",faqGroupLimitAnswer:"Freeプランでは1グループ(10人まで)作成できます。Proプランは20人まで対応しています。",faqSupportedAi:"対応しているAIサービスは何ですか?",faqSupportedAiAnswer:"OpenAI(GPT-4など)とGoogle Geminiに対応しています。設定ページからAPIキーを登録してください。",faqWhyEmailVerification:"メール認証が必要なのはなぜですか?",faqWhyEmailVerificationAnswer:"グループ機能ではメンバー間でデータを共有するため、セキュリティ上の理由からメール認証済みのユーザーのみ利用可能としています。",groupFeatures:"グループ機能",guideTour:"ガイドツアー",guideTourDescription:"インタラクティブなガイドで機能を学べます",title:"ヘルプ・マニュアル",tourAi:"AIを活用する",tourAiDesc:"AI機能の使い方を学びます(約2分)",tourBasicTask:"はじめてのタスク",tourBasicTaskDesc:"基本的なタスク操作を学びます(約2分)",tourGroup:"グループ運用ガイド",tourGroupDesc:"グループ機能の使い方を学びます(約3分)",tourViews:"ビューを使いこなす",tourViewsDesc:"様々な表示形式を学びます(約2分)"},home:{createTaskSheet:"タスク作成",daysLeft:"あと{{count}}日",dueDate:{daysAgo:"{{count}}日前",daysLater:"{{count}}日後",today:"今日",tomorrow:"明日"},dueToday:"今日まで",encouragement:"今日も素敵な一日になりますように",fab:{addTask:"タスクを追加",aiInput:"AIで入力",ariaLabel:"タスク追加メニューを開く",createFromMemo:"メモからタスク作成"},greeting:"こんにちは、{{name}}さん",noTasksThisWeek:"今週のタスクはありません",noWeeklyTasks:"今週期限のタスクはありません",overdue:"期限切れ",showMore:"もっと見る",today:"今日",unscheduledTasks:"日程未設定タスク",unscheduledTasksCount:"日程未設定のタスクが{{count}}件あります",unscheduledTasksHint:"タップして日程を設定",viewAll:"すべて見る",weeklyDeadlineTasks:"今週期限のタスク",weeklyTasks:"週間タスク",weeklyTasksFri:"金",weeklyTasksMon:"月",weeklyTasksSat:"土",weeklyTasksSun:"日",weeklyTasksThu:"木",weeklyTasksTue:"火",weeklyTasksWed:"水"},invite:{acceptFailed:"招待の承認に失敗しました。もう一度お試しください。",alreadyMember:"既にこのグループのメンバーです。",alreadyMemberDescription:"あなたは既に「{{name}}」のメンバーです。",alreadyMemberTitle:"既にメンバーです",alreadyProcessed:"この招待は既に{{status}}されています。",alreadyProcessedOrExpired:"この招待は既に処理されているか、期限切れです。",decline:"辞退する",declineFailed:"招待の辞退に失敗しました。もう一度お試しください。",expired:"この招待は期限切れです。新しい招待URLを発行してもらってください。",expiredOrMaxUsed:"この招待URLは期限切れまたは使用回数上限に達しています",expiredUrl:"招待URLの有効期限切れ",expiredUrlDescription:"この招待URLは有効期限が切れています。新しい招待URLを発行してもらってください。",expiresAt:"有効期限",fetchFailed:"招待情報の取得に失敗しました。",goHome:"ホームへ戻る",goToTasks:"タスク一覧へ",group:"グループ",groupInvitation:"グループへの招待",groupName:"グループ名",invalidUrl:"無効な招待URL",invali
11dUrlDescription:"この招待URLは無効です。新しい招待URLを発行してもらってください。",inviteError:"招待エラー",inviteNotFound:"招待が見つかりません",invitedTo:"「{{name}}」への招待です",inviter:"招待者",join:"参加する",joinComplete:"参加完了",joinConfirm:"「{{name}}」に参加しますか?",joinFailed:"グループへの参加に失敗しました",memberCapTitle:"サービス開始までお待ちください",memberCapMessage:"このグループは現在の人数上限(10人)に達しています。増員できる有料プランは近日提供予定です。公開までもうしばらくお待ちください。",joinedAndRedirecting:"「{{name}}」に参加しました。タスク一覧に移動します...",joinedGroup:"「{{name}}」に参加しました!",joiningGroup:"グループに参加中...",login:"ログイン",loginAndJoin:"ログインして参加",loginRequired:"参加するにはログインが必要です",noInviteCode:"招待コードが指定されていません。",notFound:"招待が見つかりません。URLが正しいか確認してください。",processing:"処理中...",redirectingToGroup:"グループページに移動します...",signup:"新規登録",statusAccepted:"承認",statusDeclined:"辞退",statusProcessed:"処理",thisGroup:"このグループ",usageLimitDescription:"この招待URLは使用回数の上限に達しました。新しい招待URLを発行してもらってください。",usageLimitReached:"招待URLの使用回数上限",wrongEmail:"この招待は別のメールアドレス宛てです。"},kanban:{description:"急ぎの案件とグループで考える案件を可視化",errorOccurred:"エラーが発生しました: {{message}}",title:"WIPボード"},maintenance:{apology:"ご不便をおかけして申し訳ございません。",autoAccessAfterComplete:"メンテナンス完了後、自動的にアクセス可能になります。",defaultMessage:"システムメンテナンス中です。しばらくお待ちください。",estimatedEnd:"終了予定",title:"メンテナンス中"},memoTask:{aiDescription:"AIがメモの内容を分析して、タスクを自動抽出します。",autoExtract:"メモからタスクを自動抽出",enterMemo:"メモを入力",extractTasks:"タスクを抽出",extractedCount:"{{count}}件のタスクを抽出しました",extracting:"抽出中...",formats:{assignee:"担当者: @名前",bulletList:"箇条書き(-、・、•)",checkbox:"チェックボックス([ ]、[x])",dueDate:"期限: 12/20、2024-01-15、明日、来週",numberedList:"番号付き(1.、1))",priority:"優先度: 優先度高、緊急、重要"},partialFailure:"一部のタスクの登録に失敗しました: {{error}}",placeholder:`例:
12- 企画書を作成する @田中 12/20まで 優先度高
13- クライアントに連絡
14- [ ] デザインレビュー
15- 1. 議事録をまとめる
16- 2. 次回のミーティング日程調整`,redo:"やり直す",regexDescription:"箇条書きや番号付きリストからタスクを抽出します。",registrationFailed:"タスクの登録に失敗しました",selectGroup:"グループを選択してください",supportedFormats:"対応形式:",tasksRegistered:"{{count}}件のタスクを登録しました",title:"メモからタスク登録",usedFallback:"正規表現によるパースを使用しました"},notifications:{empty:"通知はありません",emptyDescription:"グループ招待やタスクの更新があるとここに表示されます",error:"エラーが発生しました",markAllRead:"すべて既読にする",title:"通知"},taskSettings:{back:"戻る",categoryManagement:"カテゴリ/タグ管理",categoryManagementComingSoon:"カテゴリ/タグ管理機能は準備中です",categoryManagementHint:"タスクを分類するカテゴリやタグを管理できるようになります",defaultSettings:"デフォルト設定",defaultSettingsComingSoon:"新規タスクのデフォルト設定は準備中です",defaultSettingsHint:"優先度、期限、担当者などのデフォルト値を設定できるようになります",description:"タスクの表示や動作をカスタマイズできます",displaySettings:"表示設定",displaySettingsComingSoon:"タスク一覧の表示設定は準備中です",displaySettingsHint:"ソート順、表示項目、グループ化などを設定できるようになります",notificationSettings:"通知設定",notificationSettingsComingSoon:"タスク通知設定は準備中です",notificationSettingsHint:"期限前通知、ステータス変更通知などを設定できるようになります",title:"タスク設定"},tasks:{categoryCreateFailed:"カテゴリの作成に失敗しました",clearFilter:"フィルターをクリア",copyFailed:"コピーに失敗しました",createGroup:"グループを作成",createTaskHint:"右下のボタンから新しいタスクを作成できます",deleteConfirm:"「{{title}}」を削除しますか?この操作は取り消せません。",deleteFailed:"削除に失敗しました",fab:{ariaLabel:"新しいタスクを追加",batchAdd:"一括追加",fromMemo:"メモから登録",newTask:"新規タスク作成"},helpRequestCancelled:"ヘルプリクエストを取り消しました",helpRequested:"グループにヘルプをリクエストしました!WIPボードに表示されます",invali
16dDisplaySettings:"保存された表示設定が無効になっている可能性があります。",joinGroupDescription:"グループに参加するか、新しいグループを作成すると、タスクを管理できます。",joinGroupPrompt:"タスクを表示するには、グループに参加してください",loadFailed:"タスクの読み込みに失敗しました",noMatchingTasks:"該当するタスクがありません",noTasks:"タスクがありません",noValidGroupId:"有効なグループまたはユーザーIDがありません",personalDataNotFound:"個人用データが見つかりません。再ログインしてください。",resetDisplaySettings:"表示設定をリセット",syncPending:"権限情報の反映待ちの可能性があります。少し時間をおいて再試行してください。",retryLoad:"再試行",selectGroup:"グループを選択してください",taskDeleted:"タスクを削除しました",taskUncompleted:"タスクを未完了に戻しました",updateFailed:"更新に失敗しました",urlCopied:"URLをコピーしました"},trash:{autoDeleteNotice:"30日後に自動削除されます",cancel:"キャンセル",confirmDelete:"削除する",confirmMessage:"このタスクを完全に削除しますか?この操作は取り消せません。",deleteError:"削除に失敗しました",deletedAt:"削除日",empty:"ゴミ箱は空です",loadError:"ゴミ箱の読み込みに失敗しました",permanentDelete:"完全削除",permanentDeleteSuccess:"タスクを完全に削除しました",restore:"復元",restoreError:"復元に失敗しました",restoreSuccess:"タスクを復元しました",title:"ゴミ箱"}},Ni={high:"高",low:"低",medium:"中",urgent:"緊急"},_i={celebrate:"お祝い",clap:"拍手",fire:"ファイヤー",heart:"ハート",like:"いいね"},Mi={preparingGroup:"グループを準備しています..."},Fi={dailyAtHour:"毎日{{hour}}時に実行",dailyHourEveryMinute:"毎日{{hours}}時に毎分実行",dayName:{fri:"金",mon:"月",sat:"土",sun:"日",thu:"木",tue:"火",wed:"æ°´"},dayNameFull:{fri:"金曜日",mon:"月曜日",sat:"土曜日",sun:"日曜日",thu:"木曜日",tue:"火曜日",wed:"水曜日"},dayOfMonthLabel:"{{day}}日",everyMinute:"毎分実行",everyNMinutes:"{{step}}分ごとに実行",executeAt:"{{schedule}}に実行",executionSchedule:"実行スケジュール",field:{day:"日",hour:"時",minute:"分",month:"月",weekday:"曜日"},hourLabel:"{{hour}}時",minuteLabel:"{{minute}}分",monthLabel:"{{month}}月",reminder:{atDueTime:"期限時刻",daysAfter:"{{days}}日後",daysBefore:"{{days}}日前",hoursAfter:"{{hours}}時間後",hoursBefore:"{{hours}}時間前",minutesAfter:"{{minutes}}分後",minutesBefore:"{{minutes}}分前"},report:{busiestPeriod:"最繁忙時間帯",busiestPeriodContent:"最も実行が集中する時間帯は{{hour}}時台、曜日は{{day}}です。",executionCount:"実行回数",executionCountContent:"期間内の実行回数は{{count}}回です。",nextExecution:"次回実行",nextExecutionContent:"次回の実行は「{{label}}」({{timestamp}})です。",overview:"概要",overviewContent:"合計{{totalRules}}件のルールが登録されており、{{activeRules}}件が有効です。",ruleList:"ルール一覧",title:"スケジュールレポート"},timezone:{anchorage:"アンカレッジ (UTC-09:00)",auckland:"オークランド (UTC+12:00)",azores:"アゾレス (UTC-01:00)",bangkok:"バンコク (UTC+07:00)",berlin:"ベルリン (UTC+01:00)",chicago:"シカゴ (UTC-06:00)",denver:"デンバー (UTC-07:00)",dubai:"ドバイ (UTC+04:00)",hongKong:"香港 (UTC+08:00)",honolulu:"ホノルル (UTC-10:00)",kolkata:"コルカタ (UTC+05:30)",london:"ロンドン (UTC+00:00)",losAngeles:"ロサンゼルス (UTC-08:00)",midway:"ミッドウェー (UTC-11:00)",moscow:"モスクワ (UTC+03:00)",newYork:"ニューヨーク (UTC-05:00)",paris:"パリ (UTC+01:00)",saoPaulo:"サンパウロ (UTC-03:00)",seoul:"ソウル (UTC+09:00)",shanghai:"上海 (UTC+08:00)",sydney:"シドニー (UTC+11:00)",tokyo:"東京 (UTC+09:00)",utc:"協定世界時 (UTC+00:00)"},weekdayLabel:"{{day}}曜日"},Gi={personal:"個人"},Oi={clearQuery:"検索クエリをクリア",commandPaletteShortcut:"コマンドパレットを開くショートカット",globalSearch:"グローバル検索",placeholder:"検索... (⌘/)"},Ui={apiToken:"APIトークン",apiTokenDesc:"REST APIアクセスには有効なAPIトークンが必要です。設定ページで発行できます。",rateLimit:"レート制限",rateLimitDesc:"API保護のため、IP単位で100リクエスト/分、ユーザー単位で1000リクエスト/時間の制限があります。",recoveryKey:{backupReadError:"バックアップデータの読み込みに失敗しました",cancel:"キャンセル",clipboardError:"クリップボードへのコピーに失敗しました",confirmAndContinue:"リカバリーキーを確認して続行",confirmLabel:"確認のため、リカバリーキーを入力してください",copied:"コピー済み",copy:"コピー",download:"ダウンロード",downloaded:"ダウンロード済み",encryptionError:"暗号化に失敗しました",hintDownloadFolder:"ダウンロードフォルダ(taskudos-recovery-key.txt)",hintPasswordManager:"パスワードマネージャー",hintPrintedCopy:"安全な場所に印刷したもの",hintTitle:"リカバリーキーは以下の場所に保存さã
16‚Œã¦ã„る可能性があります:",incorrectKey:"リカバリーキーが正しくありません",invalidBackupData:"バックアップデータの形式が不正です",invalidFormat:"リカバリーキーの形式が正しくありません",label:"リカバリーキー",mismatchError:"入力されたリカバリーキーが一致しません",processing:"処理中...",recover:"復旧する",recovering:"復旧中...",restoreDescription:"セットアップ時に保存したリカバリーキーを入力してください。",restoreTitle:"パスフレーズの復旧",saveWarningDesc:"パスフレーズを忘れた場合、このリカバリーキーがないとデータを復旧できません。安全な場所に保管してください。",saveWarningTitle:"リカバリーキーを必ず保存してください"}},Bi=JSON.parse('{"account":{"accountDeleted":"アカウントを削除しました","cancel":"キャンセル","changePasswordButton":"パスワードを変更","changePasswordTitle":"パスワード変更","changingPassword":"変更中...","confirmDeletePassword":"確認のためパスワードを入力してください","confirmNewPasswordLabel":"新しいパスワード(確認)","confirmPasswordPlaceholder":"パスワードを再入力","currentPasswordLabel":"現在のパスワード","currentPasswordPlaceholder":"現在のパスワード","deleteAccount":"アカウントを削除する","hidePassword":"パスワードを非表示","deleteAccountTitle":"アカウントを削除","deleteButton":"削除する","deleteItem1":"プロジェクト、タスク、履歴がすべて削除されます","deleteItem2":"グループメンバーシップが解除されます","deleteItem3":"ログイン情報が無効になります","deleteWarning":"アカウントを削除すると、すべてのデータが完全に削除されます。この操作は取り消すことができません。","deleting":"削除中...","enterCurrentPassword":"現在のパスワードを入力してください","enterNewPassword":"新しいパスワードを入力してください","enterPassword":"パスワードを入力してください","googleLogin":"Googleアカウントでログインしています","googleManage":"アカウントの管理はGoogleアカウント側で行ってください","loggingOut":"ログアウト中...","logout":"ログアウト","logoutError":"ログアウトに失敗しました","logoutSuccess":"ログアウトしました","mfaHint":"2段階認証(MFA)の設定は「セキュリティ」タブで行えます","newPasswordLabel":"新しいパスワード","newPasswordPlaceholder":"8文字以上、大小英字+数字","passwordChanged":"パスワードを変更しました","showPassword":"パスワードを表示","passwordMismatch":"新しいパスワードが一致しません","passwordSameAsCurrent":"新しいパスワードは現在のパスワードと異なる必要があります","userInfoError":"ユーザー情報を取得できませんでした","warning":"警告"},"achievements":{"comingSoon":"実績機能は準備中です","gratitudeCalendar":"感謝カレンダー","noGjYet":"まだGJの記録がありません","startSendingGj":"タスクを完了したメンバーにGJを送ってみましょう!"},"apiTokens":"APIトークン","appearance":"外観","darkMode":"ダークモード","dataManagement":{"cancel":"キャンセル","duplicateDescription":"インポートするファイルに、既存のタスクと同じIDを持つタスクが含まれています。どのように処理しますか?","duplicateFound":"重複するタスクが見つかりました","duplicateKeepBoth":"両方保持(新しいIDで追加)","duplicateOverwrite":"上書き(インポートデータで置き換え)","duplicateSkip":"重複をスキップ(既存を維持)","export":"エクスポート","exportAs":"{{format}}でエクスポート","exportDescription":"自分が作成・担当しているタスク({{count}}件)を保存します。","exportError":"エクスポートに失敗しました","exporting":"エクスポート中...","formatCsvDesc":"Excel対応","formatJsonDesc":"復元可能","formatMarkdownDesc":"読みやすい","import":"インポート","importComplete":"インポートが完了しました","importDescription":"エã
16‚¯ã‚¹ãƒãƒ¼ãƒˆã—たJSONファイルからタスクを復元します。","importError":"インポートに失敗しました","importTasks":"タスクをインポート","importing":"インポート中...","invalidExportFile":"無効なエクスポートファイルです","newerVersionWarning":"このファイルは新しいバージョン({{fileVersion}})で作成されています。現在のアプリ({{appVersion}})では一部の機能が利用できない可能性があります。","noteNoSecrets":"※ エクスポートされるデータにはAPIキーなどの機密情報は含まれません。","noteVersionDiff":"※ バージョンが異なる場合、一部のフィールドが補完または無視される場合があります。","resultErrors":"エラー: {{count}}ä»¶","resultSkipped":"スキップ: {{count}}ä»¶","resultSuccess":"成功: {{count}}ä»¶","showErrorDetails":"エラー詳細を表示","title":"データ管理"},"display":{"appearanceMode":"外観モード","colorTheme":"カラーテーマ","colorThemeDesc":"アクセントカラーを選択してアプリの雰囲気を変えましょう","dark":"ダークモード","followSystem":"システム設定に従う","guideSettings":"ガイド設定","languageSettings":"言語設定","light":"ライトモード","reshowButton":"再表示する","reshowOnboarding":"オンボーディングを再表示","reshowOnboardingDesc":"初回ガイドを次回ログイン時に再度表示します","reshowToast":"次回ログイン時にオンボーディングガイドが表示されます","showGuideButton":"ガイドボタンを表示","showGuideButtonDesc":"画面右下にガイドボタンを表示します","themeSettings":"テーマ設定","toggleGuide":"ガイドボタンの表示を切り替え","voiceSettings":"音声設定","voiceSettingsDesc":"AIアシスタントとの音声対話を設定","wallpaper":"壁紙設定","displayCustom":"表示カスタマイズ","displayCustomDesc":"使いたい機能だけを表示して、画面をシンプルにできます","displayCustomPreset":"表示プリセット","displayCustomPresetDesc":"よく使うパターンを選んでください","displayCustomPresetSimple":"かんたん","displayCustomPresetSimpleDesc":"基本的なタスク管理に必要な機能だけ","displayCustomPresetStandard":"スタンダード","displayCustomPresetStandardDesc":"よく使われる機能をバランスよく表示","displayCustomPresetCustom":"カスタム","displayCustomPresetCustomDesc":"表示する機能を自分で選択","displayCustomSelectFeatures":"表示する機能を選択","displayCustomHideUnused":"不要な機能を非表示にして、シンプルに使えます","displayCustomAlwaysAvailable":"常に利用できる機能","displayCustomFeatureTask":"タスク作成・編集・削除","displayCustomFeatureGJ":"GJ(いいね・ありがとう・すごい)","displayCustomFeatureCategory":"カテゴリ設定","displayCustomFeatureDeadline":"期限設定","displayCustomFeatureAssignee":"担当者設定","displayCustomFeatureAI":"AI要約レポート","displayCustomApproval":"承認フロー","displayCustomApprovalDesc":"タスク完了時の承認プロセス","displayCustomDependencies":"依存関係","displayCustomDependenciesDesc":"タスク間の前後関係設定","displayCustomSplitMerge":"タスク分割/統合","displayCustomSplitMergeDesc":"大きなタスクを分割、または統合","displayCustomDifficulty":"難易度設定","displayCustomDifficultyDesc":"タスクの難易度レベル(簡単/普通/難しい)","displayCustomCp":"貢献度スコア(CP)","displayCustomCpDesc":"タスク完了時のポイント獲得","displayCustomBurnout":"バーンアウト検知","displayCustomBurnoutDesc":"過負荷状態の自動検知とアラート","colorThemeDefault":"デフォルト","colorThemeDefaultDesc":"標準のブルー","colorThemeOcean":"オーシャン","colorThemeOceanDesc":"爽やかなスカイブルー","colorThemeForest":"フォレスト","colorThemeForestDesc":"自然なグリーン","colorThemeSunset":"サンセット","colorThemeSunsetDesc":"温かみのあるオレンジ","colorThemeLavender":"ラベンダー","colorThemeLavenderDesc":"エレガントなパープル"},"qrExport":{"generateError":"QRコードの生成に失敗しました","expires
16In":"このQRコードは{{seconds}}秒後に消えます","generating":"QRコード生成中...","remaining":"残り: {{seconds}}秒","enterSamePassphrase":"受信側で同じパスフレーズを入力してください"},"qrImport":{"title":"QRコードをインポート","jsonOnlyError":"現在はJSONファイルのみ対応しています","readError":"QRコードの読み取りに失敗しました","fileReadError":"ファイルの読み込みに失敗しました","qrDataReadError":"QRデータの読み取りに失敗しました","passphrase":"パスフレーズ","loadFromFile":"ファイルから読み込む","selectFileHint":"QRコード画像またはJSONファイルを選択してください","pasteJsonData":"またはJSONデータを貼り付ける","pastePlaceholder":"QRコードのJSONデータをここに貼り付けてください..."},"geminiSetup":{"common":{"back":"戻る"},"genericError":"エラーが発生しました","guide":{"apiKeyCopied":"APIキーをコピーしました","copyUrl":"URLをコピー","step1":"Googleアカウントでログインします","step2":"「Get API key」または「APIキーを取得」をクリック","step3":"表示されたAPIキーをコピーします","title":"Google AI Studioでの操作手順"},"intro":{"feature1":"テキストからタスクを自動抽出","feature2":"タスクの優先度・期限を提案","feature3":"メモ書きから複数タスクを作成","noCreditCard":"クレジットカードは不要です。5分程度で完了します。","openAIStudio":"Google AI Studioを開く","requirementsLabel":"必要なもの:","requirementsValue":"Googleアカウント(Gmail)のみ","setupLater":"あとで設定する","title":"Gemini AIでできること"},"invalidApiKey":"APIキーが無効です","invalidKeyRetry":"APIキーが無効です。キーを確認して、もう一度お試しください","loginRequired":"ログイン後に設定してください","paste":{"ariaLabel":"Gemini APIキー","complete":"設定を完了する","label":"コピーしたAPIキーを貼り付けてください","securityNote":"APIキーは暗号化して安全に保存されます(表示後5秒で自動非表示)"},"quotaExceeded":"APIの利用上限に達しています。しばらく待ってからお試しください","setupFailed":"設定に失敗しました。時間をおいて再度お試しください","status":{"apiKeyVerified":"APIキーが正常に検証されました","errorTitle":"設定に失敗しました","getStarted":"使い始める","pleaseWait":"しばらくお待ちください","retry":"もう一度試す","startOver":"最初から","successDescription":"Gemini AIが利用できるようになりました","successTitle":"接続に成功しました!","verifying":"APIキーを検証しています..."},"stepLabels":{"configure":"設定","obtain":"取得","prepare":"準備"},"subtitle":"Googleアカウントがあれば、無料で設定できます","title":"AIをかんたん設定"},"general":"一般","groupLimit":{"atLimitWarning":"グループ数が上限に達しています。新しいグループを作成するには、既存のグループを削除してください。","inUse":"使用中: {{used}} / {{max}}","nearLimitWarning":"あと1グループのみ作成可能です。","personalGroups":"個人グループ","personalGroupsDesc":"自分のみのグループ","remaining":"残り: {{count}}","sharedGroups":"共有グループ","sharedGroupsDesc":"メンバーがいるグループ","title":"グループ使用状況"},"labelCustom":{"cancel":"キャンセル","createCustomLabels":"カスタムラベルを作成","currentSettings":"現在の設定","description":"用途に合わせて「グループ」「タスク」などの名称を変更できます。","edit":"編集","labelCategory":"カテゴリー","labelGroup":"グループ","labelTask":"タスク","save":"保存","template":"テンプレート","title":"名称カスタマイズ"},"language":"言語","lightMode":"ライトモード","notifications":{"comingSoon":"通知設定は準備中です","comingSoonDetail":"通知頻度、通知種類の設定など"},"privacy":{"contactSharing":"連絡先共有設定","legalDocuments":"法的ドã
16‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ","privacyPolicy":"プライバシーポリシー","termsOfService":"利用規約"},"profile":{"clickToUpload":"クリックして画像をアップロード","defaultUser":"ユーザー","displayName":"表示名","displayNamePlaceholder":"表示名を入力","displayNameTooLong":"表示名は50文字以内で入力してください","displayNameUpdated":"表示名を更新しました","emailLabel":"メールアドレス","enterDisplayName":"表示名を入力してください","groupCount":"{{count}}グループ","groupsLabel":"所属グループ","imageFormats":"JPEG, PNG, GIF, WebP(最大5MB)","noGroups":"グループなし","photoUpdated":"プロフィール画像を更新しました","profileImage":"プロフィール画像"},"resourceUsage":{"currentPlan":"現在のプラン: 無料プラン","groups":"グループ","loading":"読み込み中...","tasks":"タスク","title":"リソース使用状況","upgradeNote":"制限に近づくと警告が表示されます。プランのアップグレードで制限を拡張できます(準備中)。"},"security":{"authMethod":"認証方式","biometricAuth":"生体認証","biometricConfirm":"生体認証を有効にするために確認","biometricDescription":"Face ID / Touch IDでログインできるようにします","biometricDisabled":"生体認証を無効にしました","biometricEnabled":"生体認証を有効にしました","biometricFailed":"生体認証に失敗しました","biometricNextLogin":"次回起動時から{{type}}でログインできます","biometricToggle":"{{type}}の有効/無効を切り替え","biometricUnavailable":"生体認証を利用できません","biometricUnavailableHint":"お使いのデバイスで生体認証が設定されているか確認してください","changeInAccountTab":"アカウントタブで変更可能","emailPassword":"メール/パスワード","enableBiometric":"{{type}}を有効にする","googleAuth":"Google認証","googleLogin":"Googleアカウントでログインしています","googleMfaHint":"2段階認証はGoogleアカウント側で設定してください","manageInGoogle":"Googleアカウントで管理","mfaDescription":"認証アプリを使用してアカウントのセキュリティを強化します","mfaTitle":"2段階認証(MFA)","passwordChange":"パスワード変更","securityInfoTitle":"セキュリティ情報","tip1":"定期的にパスワードを変更しましょう","tip2":"2段階認証を有効にしてアカウントを保護しましょう","tip3":"不審なログインがあれば、すぐにパスワードを変更してください","tipsTitle":"セキュリティのヒント"},"system":"システム設定に従う","plan":{"changePlan":"プランを変更","currentPlan":"現在のプラン"},"tabs":{"account":"アカウント","achievements":"実績","ai":"AI","calendar":"カレンダー連携","data":"データ","display":"表示","notifications":"通知","privacy":"プライバシー","profile":"プロフィール","security":"セキュリティ"},"calendar":{"title":"カレンダー連携","description":"タスクを外部カレンダーと同期","icalUrl":"iCal購読URL","copy":"コピー","copied":"URLをコピーしました","copyError":"コピーに失敗しました","refresh":"URLを再生成","refreshed":"新しいURLを生成しました","refreshError":"URL再生成に失敗しました","revoke":"URLを無効化","revokeConfirm":"このURLを無効化しますか?外部カレンダーからの同期が停止します。","revoked":"URLを無効化しました","revokeError":"無効化に失敗しました","noToken":"カレンダー連携URLが設定されていません","generate":"URLを生成","fetchError":"URLの取得に失敗しました","howToUse":"使い方","step1Title":"URLをコピー","step1Desc":"上記の購読URLをコピーします","step2Title":"Googleカレンダーで追加","step2Desc":"Googleカレンダーの「他のカレンダー」→「URLで追加」を選択","step3Title":"URLを貼り付け","step3Desc":"コピーしたURLを貼り付けて「カレンダーを追加」","googleHelp":"Googleカレンダーのヘルプを見る","noteTitle":"注意事項","note1":"URLを知っている人は誰でもカレンダーを閲覧できます","note2":"URLを再生成すると、以前のURLは無効になります","note3":"反映には数時間かかる場合があります"},"theme":"テーマ","title":"設定","voice":{"inputDescription":"マイクを使って音声でテキストを入力","inputDisabled":"音声入力を無効にしました","inputEnabled":"音声入力を有効にしました","inputTitle":"音声入力","inputToggleLabel":"音声入力の有効/無効を切り替え","languageChanged":"音声言語を{{language}}に変更しました","languageTitle":"音声言語","outputDescription":"AIの返答を音声で読み上げ","outputDisabled":"音声出力を無効にしました","outputEnabled":"音声出力を有効にしました","outputTitle":"音声出力","outputToggleLabel":"音声出力の有効/無効を切り替え","saveError":"設定の保存に失敗しました"},"wallpaper":{"adjustBlur":"ぼかしを調整","adjustOpacity":"透明度を調整","blur":"ぼかし","contain":"収める","cover":"全体表示","displayMode":"表示方法","opacity":"透明度","tile":"タイル"}}'),Wi={done:"完了",in_progress:"進行中",review:"レビュー",split:"分割済み",todo:"未着手"},Vi={report:{count:"件数",errorDetails:"エラー詳細",failed:"失敗",item:"項目",processed:"処理済み",processingTime:"処理時間",result:"結果",skipped:"スキップ",title:"同期レポート"}},qi={actualTime:"実績時間",assignee:"担当者",category:"カテゴリ",complete:"完了",create:"タスクを作成",delete:"タスクを削除",description:"説明",difficulty:"難易度",dueDate:"期限",edit:"タスクを編集",estimatedTime:"想定時間",form:{createTitle:"新規タスク作成",editTitle:"タスク編集"},postpone:"延期",press:"{{key}}キーで{{action}}",priority:"優先度",progress:"進捗",quickAction:{gj:"GJ",header:"アクション",label:"クイックアクション"},reopen:"再開する",swipeCard:{tapToExpand:"タップでアクション展開"},startDate:"開始日",status:"ステータス",title:"タイトル",statusLabel:{todo:"未着手",inProgress:"進行中",review:"レビュー",done:"完了",split:"分割済み"},tree:{noTasks:"タスクがありません",taskStatus:"タスクステータス",childTasks:"{{title}}の子タスク",taskTree:"タスクツリー",addChildTask:"子タスクを追加",childTask:"子タスク",maxHierarchyTooltip:"最大3階層のため追加できません",levelLabel:{parent:"親",child:"子",grandchild:"å­«"},hierarchyLevel:"階層レベル: {{label}}タスク"},batch:{title:"タスク一括登録",description:"1行に1つずつタスクを入力してください。空行は無視されます。",placeholder:`例:
17会場予約
18参加者連絡
19資料準備
20当日スケジュール作成`,counter:"{{count}}件 / 最大{{max}}件",overLimit:"上限を超えています。最初の{{max}}
20件のみ登録されます。",submitting:"登録中...",submit:"{{count}}件を登録"},micro:{quickTask:"クイックタスク",count:"{{count}}件",completed:"✓ {{count}}完了",noPending:"未完了のクイックタスクはありません",markComplete:"完了にする",addQuickTask:"クイックタスクを追加"}},Ki={belongsTo:"所属: {{name}}",group:"グループ",personalTask:"個人のタスク"},zi={addToGoogleCalendar:"Googleカレンダーに追加",viewDetails:"詳細を見る",assigneeLabel:"担当: {{name}}",consultAI:"AIと相談",copyFailed:"コピーに失敗しました",copyUrl:"URLをコピー",hierarchyLevel:"階層レベル {{level}}",icalFile:"iCalファイル (.ics)",level:"レベル {{level}}",markComplete:"完了にする",markIncomplete:"未完了に戻す",noDateSet:"日程未設定",priorityLabel:"優先度: {{priority}}",progressLabel:"進捗 {{progress}}%",requestHelp:"ヘルプ!",statusLabel:"ステータス: {{status}}",taskMenu:"タスクメニュー",urlCopied:"URLをコピーしました",viewDetail:"詳細を見る"},Hi={belowExpectation:"期待以下",exceedsExpectation:"期待以上",gjAwesome:"すごい",gjLike:"いいね",gjThanks:"ありがとう",goodJob:"おつかれさまでした!",meetsExpectation:"期待通り",memberFeedback:"メンバーの評価",outstanding:"素晴らしい",sendGJ:"GJを送る",submitFeedback:"評価を送信",taskCompleted:"タスク完了!",taskTitle:"「{{title}}」"},$i={backToList:"タスク一覧に戻る",content:{personal:"個人"},deleteFailed:"タスクの削除に失敗しました",header:{back:"戻る",deleteTask:"タスクを削除",editTask:"タスクを編集",split:"分割",splitTask:"タスクを分割"},meta:{assignee:"担当者",createdAt:"作成日時",dueDate:"期限日",notSet:"未設定",unassigned:"未割当",updatedAt:"更新日時"},noAssigneeChangePermission:"担当者を変更する権限がありません",noProgressChangePermission:"このタスクの進捗を変更する権限がありません",noStatusChangePermission:"このタスクのステータスを変更する権限がありません",noUpdatePermission:"このタスクを更新する権限がありません",notFound:"タスクが見つかりません",notFoundDescription:"このタスクは削除されたか、アクセス権がありません。",progress:{changeStatus:"ステータスを変更",changeStatusTo:"ステータスを{{status}}に変更",loginRequired:"※ 進捗の変更にはログインが必要です",progress:"進捗",statusLoginRequired:"※ ステータスの変更にはログインが必要です",updateProgress:"進捗を更新",updating:"更新中..."},sections:{elapsedTime:"経過時間",estimateExceeded:"想定超過",estimated:"想定",externalLink:"外部リンク",quickTaskApproval:"クイックタスク承認",reactions:"リアクション"},sheets:{cancel:"キャンセル",delete:"削除する",deleteConfirmMessage:"このタスクを削除してもよろしいですか?この操作は取り消せません。",deleteTask:"タスクを削除",deleting:"削除中...",editTask:"タスクを編集",update:"更新"}},Ji={addCategory:"カテゴリーを追加...",aiInput:"AI入力",allDay:"終日(時間指定なし)",allDayTask:"終日タスク",analyzing:"解析中...",ariaLabel:"タスクフォーム",byoaiEnabled:"BYOAI有効",collapseDetails:"詳細を閉じる",descriptionPlaceholder:"例: 明日までに急ぎで見積書を作成する。12/25までに報告書を完成させる",dueTime:"期限時間",estimatedTimeHint:"推奨: 1〜2時間(それ以上は分割を検討)",expandDetails:"詳細を入力(優先度、カテゴリ、説明など)",hours:"時間",mediumDefault:"中(デフォルト)",minutes:"分",optional:"(任意)",ownerScope:"所有範囲",parsedWithRegex:"正規表現モードで解析しました",regexMode:"正規表現モード",required:"(必須)",requiredField:"は必須項目です",saving:"保存中...",smartInput:"スマート入力",startTime:"開始時間",titlePlaceholder:"タスクのタイトルを入力",todoDefault:"未着手(デフォルト)",validation:{startDateBeforeDueDate:"開始日は期限日より前に設定してください",titleMaxLength:"タスク名は100文字以内で入力してください",titleNoWhitespace:"タスク名に空白のみは使用できません",titleRequired:"タスク名は必須です"}},Yi={displayRange:"表示範囲",noGroups:"所属グループがありません",personal:"個人",scopeSelect:"スコープ選択"},Qi={approval:{approve:"承認する",approved:"承認済み",approvedCount:"承認: {{count}}人",cpHint:"承認すると10 CPを獲得(1日最大5回)",unknown:"不明"},note:{title:"メモ",placeholder:"タスクに関するメモを入力...",addPrompt:"メモを追加するには編集ボタンをクリック",empty:"メモなし",saveSuccess:"メモを保存しました",saveError:"メモの保存に失敗しました"},image:{label:"タスク画像",altText:"タスクの添付画像",selectPrompt:"クリックして画像を選択",constraints:"最大{{maxSize}}、{{maxWidth}}x{{maxHeight}}px",remove:"画像を削除",uploadError:"画像のアップロードに失敗しました",errorNotLoggedIn:"ログインが必要です"},sync:{synced:"同期済み",syncing:"同期中...",pending:"保存待ち",conflict:"競合あり",error:"同期エラー",userEditing:"{{name}}さんが編集中",conflictMessage:"他のユーザーがメモを更新しました。",acceptServer:"最新版を取得"},categoryFilter:{clear:"クリア",condition:"条件:",filtering:"絞り込み中:",modeAnd:"AND(すべて)",modeOr:"OR(いずれか)",title:"カテゴリーフィルター"},categoryInput:{add:"追加",addNewCategory:"新規カテゴリを追加",close:"閉じる",newCategoryPlaceholder:"新しいカテゴリ名を入力してEnter",noCategories:"カテゴリがまだありません。上のボタンから新規追加してください。",removeCategory:"{{name}}を削除",selected:"選択中"},dependency:{addPredecessor:"先行タスクを追加",allCompleted:"全ての先行タスクが完了しました",changePredecessor:"先行タスクを変更",circular:"循環",close:"閉じる",completionCount:"{{done}}/{{total}} 完了",deadline:"期限: {{date}}",description:"このタスクを開始する前に完了すべきタスクを選択",dueDate:"期限: {{date}}",missingTasks:"{{count}}件の先行タスクが見つかりません(削除済みの可能性)",noSelectableTasks:"選択可能なタスクがありません",optional:"(任意)",predecessorTask:"先行タスク",predecessorTasks:"先行タスク",removeTask:"{{title}}を削除",searchPlaceholder:"タスクを検索...",statusComplete:"完了",statusInProgress:"進行中",statusNotStarted:"未着手",statusReview:"レビュー",statusTodo:"未着手"},difficulty:{challenger:"チャレンジ",easy:"クイック",easyDescription:"すぐ終わる小さなタスク。グループでは承認が必要。",hard:"むずい",label:"難易度",n
20ormal:"ふつう"},dnd:{dropToMove:"ドロップして移動",moveError:"タスク移動エラー: {{error}}",movedToGroup:"タスクをグループに移動しました",movedToPersonal:"タスクを個人タスクに移動しました"},dropdown:{cancelHelp:"ヘルプ取り消し",copyUrl:"URLをコピー",delete:"削除",edit:"修正",markComplete:"完了にする",markIncomplete:"未完了に戻す",requestHelp:"ヘルプ!",taskMenu:"タスクメニュー",viewDetails:"詳細を見る"},filter:{boardView:"ボード表示",boardViewKanban:"ボード表示(カンバン)",cardView:"カード表示",swipeView:"スワイプ表示",swipeViewGesture:"スワイプ表示(ジェスチャー操作)",changeStatusFilter:"ステータスフィルターを変更",clear:"クリア",clearFilter:"フィルターをクリア",clearStatusFilter:"ステータスフィルターをクリア",current:"現在",dueDateAsc:"期限日↑",dueDateDesc:"期限日↓",filterLabel:"フィルター",listView:"リスト表示",overdueDescription:"(期限切れの未完了タスク)",sortScope:"スコープ",sortStatus:"ステータス",sortTasks:"タスクのソート",specialOverdue:"期限超過",specialUnscheduled:"日程未設定",status:"ステータス",statusDone:"完了",statusInProgress:"進行中",statusReview:"レビュー",statusTodo:"未着手"},listView:{personal:"個人"},merge:{autoConcatenate:"自動連結",autoConcatenateDesc:"説明文を連結",cancel:"キャンセル",createNewTask:"新規タスクを作成",createNewTaskDesc:"全てのタスクを削除して新しいタスクを作成",descriptionMerge:"説明文の統合",descriptionPreview:"説明文プレビュー",manualInput:"手動入力",manualInputDesc:"新しい説明を入力",manualInputPrompt:"(手動で入力してください)",merge:"合体する",mergeIntoThis:"このタスクに統合",mergeTarget:"マージ先",merging:"合体中...",mergingTasks:"合体するタスク({{count}}件)",newDescriptionPlaceholder:"新しい説明を入力...",noDescription:"(説明なし)",sheetTitle:"タスクを合体",titleLabel:"タイトル"},parsedEdit:{assignee:"担当者",assigneePlaceholder:"担当者名",cancel:"キャンセル",close:"閉じる",descriptionLabel:"説明",descriptionPlaceholder:"タスクの説明(オプション)",dueDate:"期限日",dueTime:"期限時刻",editTask:"タスクを編集",originalText:"元のテキスト: {{text}}",priority:"優先度",priorityHigh:"高",priorityLow:"低",priorityMedium:"中",priorityUrgent:"緊急",save:"保存",startDate:"開始日",startTime:"開始時刻",title:"タイトル",titlePlaceholder:"タスクのタイトル"},parsedTable:{delete:"削除",due:"期限",edit:"編集",noTasksFound:"タスクが見つかりませんでした",priorityHigh:"高",priorityLow:"低",priorityMedium:"中",priorityUrgent:"緊急",registerTasks:"{{count}}件のタスクを登録",registering:"登録中...",selectAll:"すべて選択 ({{selected}}/{{total}})",start:"開始"},priority:{high:"高",low:"低",medium:"中",urgent:"緊急"},result:{above:"期待以上",below:"期待未満",excellent:"素晴らしい",expected:"想定通り"},seasonal:{category:{cleaning:"掃除",clothing:"衣類",living:"生活",organizing:"整理",shopping:"買い物"},dec:{description:"新年を気持ちよく迎えるための大掃除",task:{bathroomDeepClean:"浴室の大掃除",declutter:"不用品の処分",kitchenGrease:"キッチンの油汚れ掃除",newYearDecoration:"お正月飾りの準備",windowCleaning:"窓・サッシの掃除"},tips:{kitchenGrease:"換気扇は重曹つけ置き"},title:"年末大掃除"},jan:{description:"お正月の片付けと新年のスタートダッシュ",task:{decorationCleanup:"お正月飾りの片付け",greetingCardSort:"年賀状の整理",winterDryCleaning:"冬物クリーニング出し"},title:"新年の準備・片付け"},jul:{description:"夏休みの計画と暑さ対策",task:{fanAcInspection:"扇風機・エアコンの点検",insectRepellent:"虫除け対策",summerClothingSwap:"夏の衣替ã
20ˆ"},title:"夏休み準備"},jun:{description:"カビ対策と湿気対策",task:{acFilterCleaning:"エアコンフィルター掃除",bathroomMold:"浴室のカビ取り",closetVentilation:"押し入れ・クローゼットの換気",dehumidifier:"除湿剤の設置・交換"},tips:{acFilterCleaning:"カビ予防に必須"},title:"梅雨対策"},mar:{description:"入学・進級準備と春の衣替え",task:{kidsRoomCleanup:"子供部屋の整理",schoolSupplies:"学用品の準備・購入",springClothingSwap:"春の衣替え"},tips:{springClothingSwap:"冬物を洗濯してから収納"},title:"新学期・新生活準備"},season:{autumn:"秋",spring:"春",summer:"夏",winter:"冬"},sep:{description:"夏物の片付けと秋支度",task:{autumnClothingSwap:"秋の衣替え",summerClothesStorage:"夏物の洗濯・収納",typhoonPrep:"台風対策の確認"},title:"秋の準備"},tag:{autumn:"秋",cleanup:"片付け",clothingSwap:"衣替え",deepCleaning:"大掃除",heatProtection:"暑さ対策",humidity:"湿気",moldPrevention:"カビ対策",newTerm:"新学期",newYear:"正月",newYearPrep:"正月準備",rainy:"梅雨",spring:"春",summerVacation:"夏休み",yearEnd:"年末"}},seasonalEvent:{christmas:{description:"クリスマスの準備と年末の計画を立てましょう",name:"クリスマス"},goldenWeek:{description:"GWの計画と家族の予定を整理しましょう",name:"ゴールデンウィーク"},halloween:{description:"ハロウィンの準備と秋のイベントを楽しみましょう",name:"ハロウィン"},newLife:{description:"新生活のスタートに必要なタスクを整理しましょう",name:"新生活"},newYear:{description:"新年の目標設定とお正月の準備を整理しましょう",name:"お正月"},springBreak:{description:"春休みの計画と新学期の準備を始めましょう",name:"春休み"},summerVacation:{description:"夏休みの計画と暑さ対策を準備しましょう",name:"夏休み"},valentine:{description:"バレンタインの準備と大切な人への贈り物を考えましょう",name:"バレンタイン"},yearEndCleanup:{description:"年末大掃除で新年を気持ちよく迎えましょう",name:"年末大掃除"}},split:{addTask:"タスクを追加",approvalNote:"この提案は他のメンバーの承認を得てから実行されます",cancel:"キャンセル",childTaskCount:"{{count}}件の子タスクを作成",childTaskInputGuide:"子タスクのタイトルを1行に1つずつ入力してください。",completeSplit:"完全分割",completeSplitDesc:"元タスクを削除",deleteTask:"削除",errorMinTasks:"少なくとも2つの新しいタスクを入力してください",errorReasonRequired:"分割理由を入力してください",errorSubmitFailed:"分割提案の送信に失敗しました",maxFive:"(最大5ä»¶)",minutes:"分",moreItems:"...他{{count}}ä»¶",newTaskCount:"{{count}}件の新規タスクを作成",newTaskInputGuide:"新しいタスクのタイトルを1行に1つずつ入力してください。元タスクは削除されます。",newTasksLabel:"新しいタスク",overFourHoursWarning:"⚠ 合計が4時間を超えています。さらに分割を検討してください。",parentChildDesc:"元タスクを親として残す",parentChildSplit:"親子分割",placeholder:`例:
21設計書作成
22実装
23テスト
24レビュー`,preview:"プレビュー",proposalDescription:"「{{title}}」を複数のタスクに分割します",proposalTitle:"タスク分割提案",reasonLabel:"分割理由",reasonPlaceholder:"想定より工数がかかるため、作業内容が多岐に渡るため...",sheetTitle:"タスクを分割",sourceTask:"分割元タスク",split:"分割する",splitMode:"分割モード",splitting:"分割中...",submitProposal:"提案として送信",submitting:"送信中...",taskTitlePlaceholder:"タスク {{num}} のタイトル",totalEstimatedTime:"合計想定時間"},status:{done:"完了",inProgress:"進行中",review:"レビュー",split:"分割済み",todo:"未着手"}
24,typeFilter:{all:"すべて",ariaLabel:"タスクタイプフィルター",quick:"クイック",standard:"タスク"},updateMessage:{anotherMember:"別のメンバー",assigneeChanged:"担当者を {{name}} に変更",assigneeUnset:"担当者を未割り当てに変更",priorityChanged:"優先度を「{{priority}}」に変更",progressUpdated:"進捗を {{progress}}% に更新",statusChanged:"ステータスを「{{status}}」に変更"}},Xi={admin:"管理者",invite:"招待",member:"メンバー",members:"メンバー",role:"役割",viewer:"閲覧者"},Zi={dark:"ダーク",darkMode:"ダークモード",light:"ライト",selectLabel:"テーマ選択",switchToDark:"ダークモードに切り替え",switchToLight:"ライトモードに切り替え",system:"システム"},el={ago:"{{time}}前",days:"{{count}}日",days_plural:"{{count}}日",hours:"{{count}}時間",hours_plural:"{{count}}時間",minutes:"{{count}}分",minutes_plural:"{{count}}分",remaining:"残り{{time}}",weeks:"{{count}}週間",weeks_plural:"{{count}}週間"},tl={email:{notVerified:"まだメールアドレスが確認されていません",resent:"確認メールを再送信しました",verified:"メールアドレスが確認されました"},link:{copied:"リンクをコピーしました",copyFailed:"コピーに失敗しました",unsafeUrl:"安全でないURLのため開けません"},mfa:{codeSent:"確認コードを送信しました",enterCode:"確認コードを入力してください",loginSuccess:"ログインしました"},session:{timeout:"セッションがタイムアウトしました。再度ログインしてください。",warning:"セッションがまもなく期限切れになります。操作を続けてください。"},sync:{allFailed:"同期に失敗しました({{count}}件)",error:"同期処理でエラーが発生しました",noData:"同期するデータはありません",offline:"オフラインのため同期できません",partial:"{{success}}件同期、{{failed}}件失敗",success:"{{count}}件の変更を同期しました",syncing:"{{count}}件の変更を同期中..."},task:{batchCreated:"{{count}}件のタスクを作成しました",childCreated:"子タスクを作成しました",created:"タスクを作成しました",deleted:"タスクを削除しました",merged:"{{count}}件のタスクを合体しました",moved:"タスクを移動しました",splitComplete:"完全分割",splitParentChild:"親子分割",splitSuccess:"{{mode}}で{{count}}件のタスクを作成しました",updated:"タスクを更新しました"}
24,wallpaper:{enterUrl:"URLを入力してください",invalidUrl:"有効なURLを入力してください",saveFailed:"壁紙の保存に失敗しました",saved:"壁紙を保存しました"}},nl={cultural:{contextApproval:"賛同・肯定の表現",contextCooperation:"依頼・協力の表現",contextEffort:"努力を称える表現",contextEncouragement:"応援・励ましの表現",contextEndOfWork:"業務終了時の丁寧な労いの表現",contextGratitude:"感謝を伝える表現",contextLeaving:"退勤時の挨拶",contextMorningGreeting:"朝の挨拶",contextPraise:"称賛・驚きの表現",contextTaskComplete:"タスク完了時の労いの表現"},effort:{allComplete:"翻訳は全て完了しています",estimate:"{{count}}件の未翻訳キー(推定{{hours}}時間、¥{{cost}})"},locale:{en:"英語",ja:"日本語",ko:"韓国語",zhTW:"繁体字中国語"},namespace:{billing:"課金",common:"共通",errors:"エラー",gj:"グッジョブ",groups:"グループ",onboarding:"オンボーディング",settings:"設定",tasks:"タスク"},pluralization:{en:"英語は単数形と複数形(1 item / 2 items)",ja:"日本語は数量による語形変化なし",ko:"韓国語は数量による語形変化なし",zhTW:"繁体字中国語は数量による語形変化なし"},progress:{allComplete:"全{{totalKeys}}キーの翻訳が完了しています(カバレッジ: 100%)",incomplete:"全{{totalKeys}}キー中{{missingCount}}件が未翻訳(全体カバレッジ: {{overallCoverage}}%)。{{localeDetails}}",noKeys:"翻訳キーが登録されていません"}},al={conflict:{cancel:"キャンセル",close:"閉じる",confirm:"決定",conflictingFields:"競合しているフィールド",defaultTitle:"データの競合",description:"オフライン中に行った変更がサーバーのデータと競合しています。どちらのデータを使用するか選択してください。",discardLocal:"ローカルの変更を破棄します",local:"ローカル",manualMerge:"手動でマージ",noValue:"(なし)",overwriteServer:"サーバーのデータを上書きします",selectPerField:"フィールドごとに選択します",server:"サーバー",useLocalData:"ローカルのデータを使用",useServerData:"サーバーのデータを使用"},pullToRefresh:{pullToRefresh:"引っ張って更新",refreshing:"更新中...",releaseToRefresh:"離して更新"},swipeable:{complete:"完了",delete:"削除"},tripleConfirm:{back:"戻る",cancel:"キャンセル",clickNextToContinue:"続行するには「次へ」をクリックしてください。",close:"閉じる",enterTextToConfirm:"確認のため、以下のテキストを入力してください:",execute:"実行",finalConfirmation:"最終確認",inputMismatch:"入力が一致しません",inputPlaceholder:'"{{text}}" と入力',irreversibleWarningPrefix:"この操作は取り消すことができません。上記の内容を理解し、",irreversibleWarningSuffix:"を実行することに同意します。",next:"次へ"},imageUploader:{invalidType:"JPEG, PNG, GIF, WebP形式のみ対応しています",fileTooLarge:"ファイルサイズは5MB以下にしてください",loginRequired:"ログインが必要です",uploadFailed:"アップロードに失敗しました",iconAlt:"アイコン",removeImage:"画像を削除",selectImage:"クリックして画像を選択",uploadImage:"画像をアップロード"},datePicker:{openCalendar:"カレンダーを開く"},timePicker:{selectTime:"時間を選択"},toast:{swipeHint:"左右にスワイプで閉じる"}},sl={invalidDate:"有効な日付を入力してください",invali
24dEmail:"有効なメールアドレスを入力してください",maxLength:"{{field}}は{{max}}文字以内で入力してください",minLength:"{{field}}は{{min}}文字以上で入力してください",required:"{{field}}は必須です"},rl={apply:"適用",customUrl:"カスタムURL",customUrlHint:"外部画像のURLを入力してください(HTTPS推奨)",note:"壁紙は個人設定として保存されます。グループ単位の壁紙設定は準備中です。",preset:{forest:"森林",minimal:"ミニマル",mountain:"山岳",night:"夜空",none:"空",ocean:"海",sakura:"桜"},presetTitle:"プリセット壁紙",preview:"プレビュー",previewAlt:"壁紙プレビュー",save:"保存",saving:"保存中..."},ol={title:"繰り返し",pattern:"繰り返しパターン",daily:"毎日",weekly:"毎週",monthly:"毎月",interval:"間隔",selectWeekdays:"曜日を選択",selectDayOfMonth:"日付を選択",weekday:{sun:"日曜日",mon:"月曜日",tue:"火曜日",wed:"水曜日",thu:"木曜日",fri:"金曜日",sat:"土曜日"},endCondition:{title:"終了条件",never:"終了しない",after:"指定回数後",date:"指定日まで"},unitDaily:"日ごと",unitWeekly:"週ごと",unitMonthly:"ヶ月ごと",unitDay:"日",endAfterCount:"回後に終了",everyDay:"毎日",everyWeek:"毎週",everyMonth:"毎月",everyN:{daily:"{{count}}日ごと",weekly:"{{count}}週ごと",monthly:"{{count}}ヶ月ごと"},errors:{invalidFrequency:"無効な繰り返し頻度です",invalidInterval:"間隔は1〜365の整数で指定してください",noDaysSelected:"曜日を1つ以上選択してください",invali
24dDayOfWeek:"曜日は0(日)〜6(土)で指定してください",invalidDayOfMonth:"日付は1〜31で指定してください",invalidMaxOccurrences:"最大回数は1〜365で指定してください"}},il={title:"フォーカスセッション",startSession:"フォーカスセッションを開始",targetTask:"対象タスク",customSettings:"カスタム設定",focusDuration:"集中時間(分)",breakDuration:"休憩時間(分)",longBreakDuration:"長休憩時間(分)",sessionsUntilLongBreak:"長休憩までのセッション数",autoStartBreak:"休憩を自動開始",autoStartNextSession:"次のセッションを自動開始",playSound:"終了時に音を鳴らす",durationTemplate:"{{focus}}分 / {{break}}分休憩",action:{start:"開始",resume:"再開"},sessionType:{pomodoro:"25分集中 + 5分休憩",deep_work:"90分の深い集中",quick_focus:"15分の短い集中",custom:"カスタム設定"},sessionTypeName:{pomodoro:"ポモドーロ(25分)",deep_work:"ディープワーク(90分)",quick_focus:"クイック集中(15分)",custom:"カスタム"},sessionTypeShort:{pomodoro:"ポモドーロ",deep_work:"ディープ",quick_focus:"クイック",custom:"カスタム"},state:{idle:"待機中",focus:"集中中",break:"休憩中",paused:"一時停止",completed:"完了"},achievement:{dailyHours:"{{hours}}時間集中達成",dailyMinutes:"{{minutes}}分集中達成",streak:"{{days}}日連続集中",totalSessions:"累計{{sessions}}セッション"},encouragement:{lastSprint:"ラストスパート!最後まで頑張りましょう",focusRemaining:"集中!残り{{remaining}}セッション",break:"お疲れ様!ストレッチや水分補給をしましょう",completed:"素晴らしい!全セッション完了です 🎉",paused:"一時停止中。準備ができたら再開しましょう",ready:"集中する準備はできましたか?"},notification:{timerEnd:"タイマー終了",timerEndBody:"セッションが終了しました"},history:{title:"セッション履歴",empty:"まだセッション履歴がありません",completed:"完了",incomplete:"未完了",focusTime:"集中",breakTime:"休憩",sessions:"セッション",interruptions:"中断",interruptionCount:"{{count}}回"},stats:{unitMinutes:"分",streakDays:"{{count}}日",today:"今日",thisWeek:"今週",thisMonth:"今月",title:"フォーカス統計",totalFocus:"総集中時間",sessions:"セッション",completionRate:"完了率",avgSession:"平均",mostProductiveHour:"最も集中できる時間",streak:"連続記録",breakTime:"休憩時間"},time:{seconds:"{{count}}秒",minutes:"{{count}}分",minutesSeconds:"{{minutes}}分{{seconds}}秒"},completed:"セッション完了!",interruptions:"中断: {{count}}回"},ll={expired:"期間終了",remainingDays:"残り{{days}}日",remainingDaysDetail:"お試し期間は残り{{days}}日です",trialEnded:"お試し期間が終了しました",trialActive:"お試し中",tasksUsed:"タスク使用数",createAccount:"アカウントを作成",signUp:"登録",bannerExpired:"お試し期間が終了しました。アカウントを作成してデータを引き継ぎましょう",bannerActive:"お試し中(残り{{days}}日)",exitLink:"ゲストをやめる",exitTitle:"ゲストを終了しますか?",exitMessage:"作成したデータは破棄されます(アカウントを作成すれば引き継げます)。",exitSave:"アカウント作成して保存",exitDiscard:"破棄して終了",limitModal:{taskTitle:"タスク作成数の上限に達しました",taskMessage:"ゲストモードでは{{max}}件までタスクを作成できます(現在{{current}}件)",categoryTitle:"カテゴリー作成数の上限に達しました",categoryMessage:"ゲストモードでは{{max}}件までカテゴリーを作成できます(現在{{current}}件)",expiredTitle:"お試し期間が終了しました",expiredMessage:"アカウントを作成してデータを引き継ぎ、すべての機能をご利用ください",benefitsTitle:"アカウント作成のメリット",benefit1:"タスク作成数の制限なし",benefit2:"グループでの共同作業",benefit3:"GJ(称賛)の送受信",benefit4:"AIアシスタント機能",createAccount:"無料でアカウント作成",continueLater:"あとで",dataMigrationNote:"※ゲストモード中のデータはアカウント作成時に引き継がれます"}},cl={common:{applyTemplate:"テンプレートを使う",andMore:"他{{count}}ä»¶"},selector:{title:"季節テンプレート",selectEvent:"イベントを選択",selectTasks:"追加するタスクを選択",current:"現在",apply:"{{count}}件のタスクを追加"},newYear:{title:"お正月準備",description:"新年を迎えるための準備タスク",tasks:{greetingCards:"年賀状を書く",osechi:"おせち料理の準備",shrine:"初詣に行く",cleanup:"大掃除"}},valentine:{title:"バレンタイン",description:"バレンタインデーの準備",tasks:{chocolate:"チョコレートを用意する",wrapping:"ラッピング",card:"メッセージカードを書く"}},springBreak:{title:"春休み",description:"春休みの計画と準備",tasks:{travel:"旅è
24¡Œã®è¨ˆç”»ã‚’立てる",preparation:"新学期の準備",supplies:"必要な物品を揃える"}},newLife:{title:"新生活",description:"新年度・新生活の準備",tasks:{moving:"引越しの準備",registration:"各種届出・登録",supplies:"必需品を揃える",greetings:"挨拶回り"}},goldenWeek:{title:"ゴールデンウィーク",description:"GW期間の計画",tasks:{travel:"旅行の計画",reservation:"宿・チケットの予約",homecoming:"帰省の準備"}},summerVacation:{title:"夏休み",description:"夏休みの計画と準備",tasks:{homework:"宿題を計画的に進める",research:"自由研究",travel:"夏の旅行計画",pool:"プール・海の準備"}},halloween:{title:"ハロウィン",description:"ハロウィンの準備",tasks:{costume:"仮装の準備",decoration:"飾り付け",candy:"お菓子を用意",party:"パーティーの企画"}},christmas:{title:"クリスマス",description:"クリスマスの準備",tasks:{present:"プレゼントを用意",decoration:"ツリーの飾り付け",cake:"ケーキを予約",party:"パーティーの企画"}},yearEnd:{title:"年末",description:"年末の整理と準備",tasks:{cleanup:"大掃除",organize:"整理整頓",shopping:"年末の買い出し",greetingCards:"年賀状の準備"}}},dl={title:"外部サイトへ移動",description:"TasKudos外のサイトに移動しようとしています。移動先のサイトはTasKudosとは関係ありません。",destinationUrl:"移動先URL:",trustDomain:"今後 {{domain}} へのリンクでは確認を表示しない",goToSite:"サイトへ移動"},ul={title:"はじめかたを選ぶ",subtitle:"用途に合わせてタスクとカテゴリの初期セットを用意します。あとから自由に変更できます。",skip:"自分で最初から作る",family:{name:"共働き家庭",description:"家事・買い物・こどもの予定を分担して、「ありがとう」を伝え合う",categories:{housework:"家事",shopping:"買い物",kids:"こども"},tasks:{trash:"ゴミ出し",laundry:"洗濯物をたたむ",dinnerShopping:"夕食の買い物",daycarePickup:"保育園のお迎え",thankPartner:"パートナーに「ありがとう」を送ってみる"}},smallTeam:{name:"小さなチーム",description:"進行中の仕事を見える化して、メンバーの貢献に感謝を贈る",categories:{planning:"企画",inProgress:"進行中",review:"レビュー"},tasks:{kickoff:"キックオフの準備",weeklyNotes:"週次ミーティングの議事録",draftDoc:"たたき台ドキュメントの作成",reviewRequest:"レビュー依頼を出す",thankTeammate:"メンバーに「ありがとう」を送ってみる"}}},ml={admin:Jo,agents:Yo,ai:Qo,analytics:Xo,anomaly:Zo,app:ei,auth:ti,billing:ni,burnout:ai,calendar:si,categories:ri,common:oi,components:ii,config:li,contactSettings:ci,contribution:di,difficulty:ui,drawer:mi,emailVerification:pi,familyMode:gi,firebaseErrors:fi,error:hi,export:{download:"ダウンロード",fields:{actualMinutes:"実績時間(分)",assignee:"担当者",baseCP:"基本CP",category:"カテゴリ",createdAt:"作成日",description:"説明",difficulty:"難易度",dueDate:"期限",earnedCP:"獲得CP",estimatedMinutes:"想定時間(分)",id:"ID",priority:"優先度",progress:"進捗",startDate:"開始日",status:"ステータス",title:"タイトル",updatedAt:"更新日"},filters:"フィルター",format:"形式",includeChildren:"子タスクを含める",modal:{exportButton:"エクスポート",fieldsLabel:"含めるフィールド",formatLabel:"エクスポート形式",includeChildren:"子タスクを含める",targetTasks:"対象タスク",taskCount:"{{count}}ä»¶",title:"タスクをエクスポート"},title:"エクスポート"},feedback:yi,gamification:bi,gj:xi,group:ki,groups:wi,header:vi,help:Ti,import:{complete:"インポート完了",dragDrop:"ファイルをドラッグ&ドロップ",failed:"インポート失敗",importing:"インポート中...",modal:{columnPriority:"優先度",columnStatus:"ステータス",columnTitle:"タイトル",dragAndDrop:"ファイルをドラッグ&ドロップ",import:"インポート",importComplete:"インポート完了",importFailed:"インポート失敗",importFailedMessage:"タスクのインポートに失敗しました",importTarget:"インポート対象",importedCount:"{{count}}件のタスクをインポートしました",importing:"インポート中...",itemCount:"{{count}}ä»¶",moreErrors:"...他{{count}}ä»¶",moreItems:"...他{{count}}ä»¶",noTasksToImport:"インポートするタスクがありません",rowError:"行{{row}}: {{message}}",selectCsvOrJson:"CSVまたはJSONファイルを選択してください",selectFile:"ファイルを選択",supportedFormats:"対応形式: CSV, JSON",title:"タスクをインポート"},preview:"プレビュー",selectFile:"ファイルを選択",supportedFormats:"対応形式: CSV, JSON",title:"インポート",errors:{fileReadFailed:"ファイルの読み込みに失敗しました",headerRequired:"ヘッダー行とデータ行が必要です",jsonParseFailed:"JSONファイルの解析に失敗しました",tasksArrayNotFound:"タスク配列が見つかりません",titleColumnNotFound:"タイトル列が見つかりません",titleEmpty:"タイトルが空です",titleMissing:"タイトルがありません",taskMissingFields:'タスク "{{id}}": タイトルまたはIDが不足しています',taskUnknownError:'タスク "{{id}}": {{error}}'}},kanban:Ii,landing:Ai,legal:Si,link:Ci,mfa:Ei,nav:Pi,navigation:Di,notifications:ji,onboarding:Li,pages:Ri,priority:Ni,reaction:_i,rootLayout:Mi,schedule:Fi,scopeNav:Gi,search:Oi,security:Ui,settings:Bi,status:Wi,syncQueue:Vi,task:qi,taskAffiliation:Ki,taskCard:zi,taskCompletion:Hi,taskDetail:$i,taskForm:Ji,taskScope:Yi,tasks:Qi,team:Xi,theme:Zi,time:el,toast:tl,translation:nl,ui:al,validation:sl,wallpaper:rl,re
24currence:ol,focus:il,guest:ll,seasonalTemplates:cl,externalLink:dl,onboardingTemplates:ul},sc=["ja","en","zh","ko","es"],rc={ja:"日本語",en:"English",zh:"中文",ko:"한국어",es:"Español"};_.use(Ta).use(Ia).use($o((e,t)=>{if(e==="ja")return;const s={en:()=>k(()=>import("./common-DouH6os9.js"),[]),zh:()=>k(()=>import("./common-DEOsRhLv.js"),[]),ko:()=>k(()=>import("./common-GxNGIKCO.js"),[]),es:()=>k(()=>import("./common-CESud7hj.js"),[])}[e];return s?s():void 0})).init({resources:{ja:{common:ml}},partialBundledLanguages:!0,fallbackLng:"ja",defaultNS:"common",ns:["common"],detection:{order:["localStorage","navigator","htmlTag"],caches:["localStorage"],lookupLocalStorage:"taskudos-language"},interpolation:{escapeValue:!1},react:{useSuspense:!1}});function pl(e={}){const{immediate:t=!1,onNeedRefresh:n,onOfflineReady:s,onRegistered:r,onRegisteredSW:o,onRegisterError:i}=e;let l,d;const u=async(m=!0)=>{await d};async function p(){if("serviceWorker"in navigator){if(l=await k(async()=>{const{Workbox:m}=await import("./workbox-window.prod.es5-BBnX5xw4.js");return{Workbox:m}},[]).then(({Workbox:m})=>new m("/sw.js",{scope:"/",type:"classic"})).catch(m=>{i==null||i(m)}),!l)return;l.addEventListener("activated",m=>{(m.isUpdate||m.isExternal)&&window.location.reload()}),l.addEventListener("installed",m=>{m.isUpdate||s==null||s()}),l.register({immediate:t}).then(m=>{o?o("/sw.js",m):r==null||r(m)}).catch(m=>{i==null||i(m)})}}return d=p(),u}const gl=3600*1e3;pl({immediate:!0,onRegisteredSW(e,t){t&&setInterval(()=>
24{t.update()},gl)},onOfflineReady(){console.log("[PWA] App ready to work offline")},onRegisterError(e){console.error("[PWA] SW registration error:",e)}});const wt=document.getElementById("root");wt&&Ra.createRoot(wt).render(a.jsx(At.StrictMode,{children:a.jsx(Ho,{})}));export{ql as $,wr as A,tc as B,W as C,Ls as D,nc as E,Cs as F,q as G,F as H,Dl as I,Qe as J,$t as K,je as L,Ms as M,$a as N,Xl as O,ac as P,De as Q,Zl as R,zt as S,se as T,Fa as U,Ml as V,Ol as W,_s as X,Bl as Y,Es as Z,k as _,kt as a,Kl as a0,_l as a1,Gl as a2,Fl as a3,Fe as a4,Vl as a5,rr as a6,Hl as a7,zl as a8,$l as a9,gs as aa,Xt as ab,Ye as ac,Rl as ad,Jl as ae,Ll as af,_e as ag,de as ah,eo as ai,ke as aj,ut as ak,Tr as al,sc as am,rc as an,Xa as ao,Ba as b,w as c,x as d,pr as e,J as f,Ge as g,Te as h,Kt as i,ze as j,ae as k,Yl as l,Me as m,Ql as n,ec as o,Nl as p,I as q,jl as r,le as s,hn as t,Ks as u,Ht as v,Rs as w,Ns as x,Ul as y,Wl as z};

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.