@nightkatana/kronosys-app 1.0.0-beta.48 → 1.0.0-beta.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/action/route.js +2 -2
- package/.next/standalone/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/guide/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/implementation/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/licenses/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/logs/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/page.js +2 -2
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/reporting/page.js +1 -1
- package/.next/standalone/.next/server/app/reporting/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/277.js +1 -1
- package/.next/standalone/.next/server/chunks/752.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/static/chunks/400-cac6dc0640f386c4.js +1 -0
- package/.next/standalone/.next/static/chunks/840-28f9828e00e2f8c3.js +1 -0
- package/.next/standalone/.next/static/chunks/app/{page-c5be0f23f5bc42fd.js → page-1766656a21070335.js} +2 -2
- package/.next/standalone/.next/static/chunks/app/reporting/page-0615e693da39c7c7.js +1 -0
- package/.next/standalone/.next/static/chunks/app/settings/page-4c3075515a042cab.js +1 -0
- package/.next/standalone/.next/static/css/4405bf3014ccb6d4.css +1 -0
- package/.next/standalone/kronosys-package-meta.json +1 -1
- package/.next/standalone/package.json +1 -1
- package/package.json +1 -1
- package/.next/standalone/.next/static/chunks/400-2e05c0740eee8135.js +0 -1
- package/.next/standalone/.next/static/chunks/840-83aa65cc3eee5ac5.js +0 -1
- package/.next/standalone/.next/static/chunks/app/reporting/page-e5506b66f4ed8196.js +0 -1
- package/.next/standalone/.next/static/chunks/app/settings/page-6bc04b3bf71dae02.js +0 -1
- package/.next/standalone/.next/static/css/ac2f8ba1e863e1ef.css +0 -1
- /package/.next/standalone/.next/static/{UFeDt42q5AGTIPvMliAsx → 3fUAt3ojvE1CqWQDFTi7g}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{UFeDt42q5AGTIPvMliAsx → 3fUAt3ojvE1CqWQDFTi7g}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],lowPriorityFiles:["static/
|
|
1
|
+
globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],lowPriorityFiles:["static/3fUAt3ojvE1CqWQDFTi7g/_buildManifest.js","static/3fUAt3ojvE1CqWQDFTi7g/_ssgManifest.js"],rootMainFiles:["static/chunks/webpack-72874cc65370f1cd.js","static/chunks/4bd1b696-215e5051988c3dde.js","static/chunks/794-307f158afcf5cb52.js","static/chunks/main-app-bdb688080b70ecf6.js"],rootMainFilesTree:{},pages:{"/_app":[]}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-72874cc65370f1cd.js"/><script src="/_next/static/chunks/4bd1b696-215e5051988c3dde.js" async=""></script><script src="/_next/static/chunks/794-307f158afcf5cb52.js" async=""></script><script src="/_next/static/chunks/main-app-bdb688080b70ecf6.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-72874cc65370f1cd.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[7121,[],\"\"]\n3:I[4581,[],\"\"]\n4:I[484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[484,[],\"ViewportBoundary\"]\na:I[484,[],\"MetadataBoundary\"]\nc:I[7123,[],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{}]}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"
|
|
1
|
+
<!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-72874cc65370f1cd.js"/><script src="/_next/static/chunks/4bd1b696-215e5051988c3dde.js" async=""></script><script src="/_next/static/chunks/794-307f158afcf5cb52.js" async=""></script><script src="/_next/static/chunks/main-app-bdb688080b70ecf6.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-72874cc65370f1cd.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[7121,[],\"\"]\n3:I[4581,[],\"\"]\n4:I[484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[484,[],\"ViewportBoundary\"]\na:I[484,[],\"MetadataBoundary\"]\nc:I[7123,[],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{}]}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"3fUAt3ojvE1CqWQDFTi7g\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[]\n"])</script></body></html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[400],{6400:(e,t,s)=>{s.d(t,{x:()=>r});let a=[{version:"1.0.0-beta.49",items:["**Variance hors cong\xe9s** : la ligne d'\xe9cart (Variance / \xc9cart) dans le tableau \xab Temps enregistr\xe9 par projet \xbb exclut d\xe9sormais les jours marqu\xe9s comme f\xe9ri\xe9s, vacances, maladie ou autre cong\xe9.","**Calendrier provincial** : dans les param\xe8tres, un s\xe9lecteur de province canadienne g\xe9n\xe8re automatiquement les jours f\xe9ri\xe9s dans le calendrier des rapports.","**D\xe9placement des cong\xe9s** : chaque jour f\xe9ri\xe9 g\xe9n\xe9r\xe9 peut \xeatre modifi\xe9, d\xe9plac\xe9 ou supprim\xe9 depuis la page des rapports."]},{version:"1.0.0-beta.48",items:["**T\xe2ches planifi\xe9es exclues** : les t\xe2ches planifi\xe9es (d\xe9but dans le futur) ne sont plus compt\xe9es dans les totaux de temps enregistr\xe9 (grilles par \xe9tiquette, par projet, et breakdown par session).","**Scope projet sur le breakdown session** : le breakdown par session respecte maintenant le filtre work/personal/all, alignant ses totaux avec les grilles par \xe9tiquette et par projet.","**D\xe9tails de t\xe2che — session unique** : la modale de d\xe9tails d'une t\xe2che n'affiche plus qu'une seule session (celle avec la dur\xe9e la plus \xe9lev\xe9e) au lieu de lister toutes les sessions contenant un snapshot de la t\xe2che.","**Tableau d'anomalies** : nouvelle section dans l'onglet Avanc\xe9 d\xe9tectant 7 types d'anomalies (sessions sans t\xe2ches, t\xe2ches sans dur\xe9e, dur\xe9es > 24 h, chevauchements, t\xe2ches dupliqu\xe9es entre sessions, \xe9carts dur\xe9e session vs somme t\xe2ches).","**Totaux align\xe9s** : le footer du Gantt somme maintenant par t\xe2che unique (pas par lap), ce qui correspond au total affich\xe9 dans le panneau lat\xe9ral de session. Le nombre de t\xe2ches est affich\xe9.","**Alignement horizontal** : les lignes de noms et de barres utilisent une hauteur fixe identique (`h-11`) — plus de d\xe9calage vertical entre les deux colonnes.","**Popover d\xe9tails** : au survol du nom d'une t\xe2che, un popover affiche le nom complet, le projet, les heures d\xe9but/fin et la dur\xe9e track\xe9e.","**Prolongation de t\xe2che termin\xe9e** : lorsqu'une t\xe2che termin\xe9e est rouverte (heure de fin repouss\xe9e), les ancres de minuteur (`MAIN_TIMER_SEGMENT_STARTED_AT`, `TASK_CURRENT_LAP_STARTED_AT`) sont positionn\xe9es \xe0 `nowMs` au lieu de rester vides. Cela emp\xeache la cr\xe9ation d'un nouveau lap qui chevaucherait l'ancien.","**Affichage \xe9tiquettes scop\xe9es** : `formatTagDisplay` n'ajoute plus le pr\xe9fixe `@` pour les \xe9tiquettes `projet#code` (ex. `acme#dev` reste `acme#dev`, pas `@acme#dev`).","**Activation minuteur planifi\xe9** : `activateDuePlannedTaskTimersInSession` ancre le minuteur au `startTime` de la t\xe2che (pas `nowMs`) pour que la dur\xe9e s'accumule correctement depuis le d\xe9but planifi\xe9.","next 16.2.3 → 16.2.9, react 19.2.4 → 19.2.7, react-dom 19.2.4 → 19.2.7, eslint-config-next 16.2.3 → 16.2.9, plus mises \xe0 jour semver-range (playwright, tailwindcss, date-fns, lucide-react, vitest, etc.)."]},{version:"1.0.0-beta.47",items:["**Correction d\xe9but/fin** : lorsqu’une session **cl\xf4tur\xe9e** a ses bornes modifi\xe9es, `sessionDurationMinutes` est recalcul\xe9e \xe0 partir de la **nouvelle plage** en conservant l’\xe9cart de pause implicite (plus seulement un delta qui laissait une dur\xe9e obsol\xe8te, p. ex. 24 h pour une fen\xeatre de 8 h 30). \xc0 la **cl\xf4ture live** avec une fin pass\xe9e, la dur\xe9e est **plafonn\xe9e** au span mural `d\xe9but → fin`."]},{version:"1.0.0-beta.46",items:["**Tri chronologique** : les t\xe2ches planifi\xe9es sont maintenant affich\xe9es de la plus proche (en haut) \xe0 la plus \xe9loign\xe9e (en bas), tri\xe9es par `startTime` ascendant.","**Compteur \xe0 z\xe9ro** : les t\xe2ches planifi\xe9es affichent `0:00` au lieu de leur dur\xe9e planifi\xe9e, puisqu'elles n'ont pas encore d\xe9marr\xe9."]},{version:"1.0.0-beta.45",items:["**Bouton +N min** : dans la carte lat\xe9rale et la liste des sessions, un bouton ambre prolonge la session de N minutes (configurable via `dashboardSessionExtendMinutes`, d\xe9faut 30).",'**Fin auto planifi\xe9e** : le mode "Planifi\xe9" de la nouvelle session calcule automatiquement la fin \xe0 `d\xe9but + heures de base` (configurable via `dashboardBaseDailyHours`).',"**Nouveau param\xe8tre** : `dashboardSessionExtendMinutes` (30 par d\xe9faut) dans les param\xe8tres serveur.","**Minuteur t\xe2che temps r\xe9el** : correction du red\xe9marrage toutes les 2 secondes — `derivedLiveBaseMs` utilise d\xe9sormais `task.durationMs` quand il n'y a pas de laps, au lieu de repartir de z\xe9ro.","**Heure de fin sur t\xe2che temps r\xe9el** : le champ `taskEndDraft` n'est plus auto-rempli avec `startTime + dur\xe9e mini` pour les t\xe2ches sans heure de fin explicite.","**Suggestions de mod\xe8les invisibles** : la liste `<ul>` \xe9tait rendue dans un anc\xeatre avec `backdrop-filter`, ce qui brisait le positionnement `fixed`. Passage par `createPortal` → `document.body`.","**Format `@projet#tag` dans les mod\xe8les** : les tags scop\xe9s sont maintenant format\xe9s correctement (`@acme#dev` au lieu de `#acme#dev`) et le projet implicite n'est plus dupliqu\xe9.",'**Autocomplete navigateur d\xe9sactiv\xe9** : `autoComplete="off"` sur le champ titre de t\xe2che pour ne plus m\xe9langer suggestions navigateur et mod\xe8les Kronosys.',"**D\xe9filement panneaux lat\xe9raux** : \xe9couteur `scroll` ajout\xe9 dans `DashboardSideDrawerTopSync` + `overflow-y-auto` sur le `<nav>` de la liste des sessions.",'**Titre panneau droit** : mis \xe0 jour en "\xc9tiquettes, projets et mod\xe8les" (FR) / "Tags, projects & templates" (EN).']},{version:"1.0.0-beta.44",items:["**Before/After payload** : chaque action enregistre maintenant un snapshot JSON de la session live avant et apr\xe8s l'ex\xe9cution. Dans `/logs`, cliquez sur une ligne pour voir le d\xe9tail (requ\xeate, \xe9tat avant, \xe9tat apr\xe8s)."]},{version:"1.0.0-beta.43",items:['**T\xe2ches planifi\xe9es** : les t\xe2ches dont le d\xe9but est dans le futur s\'affichent avec un style distinct (fond sky, bordure pointill\xe9e, pastille "Planifi\xe9" dans la colonne des noms). L\xe9gende mise \xe0 jour.',"**Correction d\xe9rive affichage minuteur** : si `mainTimerSegmentStartedAt` est ant\xe9rieur \xe0 `startTime`, le calcul utilise `startTime` comme borne minimale → plus de dur\xe9es gonfl\xe9es."]},{version:"1.0.0-beta.42",items:["**Ajout de laps manuel** : nouvelle action serveur `addTaskTimerLap` pour ins\xe9rer un laps dans une t\xe2che existante, avec recalcule de `durationMs`. Permet de combler les trous dans la frise sans recr\xe9er une t\xe2che.","**Clic sur les trous** : cliquez sur une zone vide du Gantt pour ajouter une t\xe2che \xe0 cet instant pr\xe9cis.","**Suppression de t\xe2che** : le bouton Corbeille est r\xe9activ\xe9 dans la modale d'inspection des t\xe2ches (Rapports), avec confirmation de suppression."]},{version:"1.0.0-beta.41",items:["**Timeline dans Rapports** : s\xe9lectionnez une journ\xe9e dans le tableau \xab Recorded time by project \xbb pour afficher le Gantt (t\xe2ches, laps, barres). Bouton \xab + Ajouter une t\xe2che \xbb pour ajouter une t\xe2che oubli\xe9e \xe0 une session de la journ\xe9e. Navigation par semaine int\xe9gr\xe9e.","**Gantt — colonne sticky** : les noms de t\xe2ches restent fixes au scroll horizontal (tableau → `position: sticky`).","**Gantt — barres cliquables** : cliquez sur une barre pour ouvrir la modale de modification de la t\xe2che.","**Gantt — fen\xeatre temporelle** : d\xe9but 30 min avant la session, fin 30 min apr\xe8s (ou fin de journ\xe9e si session live). Scroll automatique \xe0 la premi\xe8re t\xe2che.","**Boutons Today/Now** : \xab Today \xbb conserve l'heure s\xe9lectionn\xe9e (ne change que la date) ; \xab Now \xbb met date et heure \xe0 l'instant courant.","**Scroll restoration** : la sauvegarde/restauration de position dans Rapports ne s'ex\xe9cute qu'au premier chargement, plus de fighting avec le scroll.",'**Variance nette** : la colonne totale de la ligne "\xc9cart" affiche maintenant la diff\xe9rence nette entre le temps enregistr\xe9 et les heures de base (ex. `+2 h 30 min`) au lieu des heures de base seules, avec la m\xeame colorim\xe9trie que les cellules individuelles.']},{version:"1.0.0-beta.39",items:["**Gantt \xab Aujourd'hui \xbb** : les laps des t\xe2ches \xe9taient perdus dans la vue \xab Today timeline \xbb — une seule barre apparaissait par t\xe2che au lieu d'une barre par lap. Corrig\xe9 en copiant `taskTimerLaps` et `taskCurrentLapStartedAt` dans les t\xe2ches merg\xe9es."]},{version:"1.0.0-beta.38",items:["**@default** : les t\xe2ches sans projet explicite re\xe7oivent automatiquement le projet `@default` pour un suivi \xe9quilibr\xe9 dans les rapports.","**Avertissement** : un bandeau appara\xeet dans *Billing allocation* quand du temps est allou\xe9 \xe0 `@default`.","**Heures de base** : nouveau champ configurable dans *Settings* (d\xe9faut 7,5 h/jour) avec tol\xe9rance (d\xe9faut \xb110 min).",'**Ligne d\'\xe9cart** : dans *Recorded time by project*, une ligne "\xc9cart" compare le total journalier aux heures de base. Color\xe9e en \uD83D\uDD34\uD83D\uDFE2\uD83D\uDFE0 selon le seuil de tol\xe9rance.',"**Arrondi quart d'heure** : chaque cellule dur\xe9e affiche l'arrondi au 15 min entre parenth\xe8ses (ex. `31 min 55 s (0,50 h)`).","**Chevron align\xe9** : le bouton collapse/expand est maintenant \xe0 droite du nom du projet dans le tableau, pour un alignement vertical parfait.","**Abr\xe9viation** : toutes les dates (sessions, t\xe2ches, Gantt) incluent le jour de la semaine (ex. `lun. 2026-06-03`).","**Inspecteur persistant** : le panneau de d\xe9tail des t\xe2ches (clic sur une cellule dur\xe9e) ne se ferme plus au clic \xe0 l'ext\xe9rieur — permet des modifications multiples sans rouvrir.","**R\xe9sum\xe9 session** : l'en-t\xeate du panneau affiche maintenant les bornes d\xe9but/fin de la session concern\xe9e, pour \xe9viter de corriger des entr\xe9es hors p\xe9riode.","**Timer t\xe2che planifi\xe9e** : le minuteur n'affiche plus la dur\xe9e totale depuis le d\xe9but pr\xe9vu au moment de l'activation (ex. 30 min pour une t\xe2che 9h30 activ\xe9e \xe0 10h). Il d\xe9marre maintenant pr\xe8s de z\xe9ro et s'accumule progressivement.","**Conflit concurrent** : la modale de conflit ne s'affiche plus quand on ajoute une t\xe2che pass\xe9e (mode *past*) alors qu'une t\xe2che est active dans la session live.","**S\xe9lecteur de mode t\xe2che** : les ic\xf4nes Temps r\xe9el (⚡) et Pass\xe9 (\uD83D\uDD50) ont maintenant un anneau violet (`ring-2`) quand elles sont s\xe9lectionn\xe9es, pour un rep\xe8re visuel clair sur les deux th\xe8mes.","**Ic\xf4nes plus nettes** : dimensions des boutons ic\xf4nes pass\xe9es de `rem` \xe0 `px` (`30px`), `strokeWidth` uniformis\xe9 \xe0 `2`, et `box-sizing: border-box` ajout\xe9 — \xe9limine le flou d\xfb aux dimensions fractionnaires.","**Format chronom\xe8tre** : le temps est toujours affich\xe9 `HH:MM:SS.cc` (ex. `00:02:00.00` au lieu de `2:00.00`) pour \xe9viter la confusion entre minutes et heures."]},{version:"1.0.0-beta.37",items:["**Migration compl\xe8te** : toutes les pr\xe9f\xe9rences locales (`localStorage`) sont d\xe9sormais g\xe9r\xe9es par **Zustand** avec middleware `persist`, rempla\xe7ant le pattern manuel `useState` + `useEffect` + `read/write`. 8 stores, ~200 lignes de code en moins.","**Vue active** (Allocation / Rythme / Avanc\xe9) : conserv\xe9e entre les visites.","**Scope Travail/Personnel** : m\xe9moris\xe9.","**Filtres p\xe9riode et tags** : persist\xe9s.","**D\xe9tail des sections** (d\xe9pli\xe9/repli\xe9) : conserv\xe9.","**Position de d\xe9filement** : restaur\xe9e en revenant sur la page (sauvegard\xe9e par onglet).","**194 issues utilisateur** cr\xe9\xe9es sur GitLab \xe0 partir des *user stories* de la page `/implementation`.","**Labels** : `group::*` (8 groupes), `implemented`, `integration-checked`, `e2e-checked`, `discarded`.","**Synchro au build** : `npm run build` met \xe0 jour `implementationNotes.ts` depuis GitLab (si token configur\xe9), les flags `implemented`/`integrationChecked`/`e2eChecked` sont align\xe9s sur les labels GitLab.","**D\xe9pendance** : `zustand` (state management).","**Refactor** : 6 anciens fichiers de stockage localStorage supprim\xe9s, ~150 lignes de hooks et `useEffect` retir\xe9es.","**Pipeline** : la commande `build` inclut d\xe9sormais `node scripts/sync-implementation.mjs` avant Next build."]},{version:"1.0.0-beta.36",items:["**D\xe9filement (xl+)** : la liste des sessions d\xe9file **dans le tiroir** (une seule zone scroll) ; la carte session s\xe9lectionn\xe9e reste fixe au-dessus de la liste quand elle y est affich\xe9e. Corrige le double scroll ou le d\xe9filement bloqu\xe9 avec les tiroirs lat\xe9raux.","**Dur\xe9e session** (correction d\xe9but/fin) : l'ajustement du d\xe9but ou de la fin d'une session modifie `sessionDurationMinutes` par **\xe9cart** (delta) au lieu de recalculer toute la plage `d\xe9but → fin` — le temps de pause reste donc d\xe9duit quand on recale les bornes.","**Finalisation intempestive** : le s\xe9lecteur date/heure ne conserve plus des `hour`/`minute` obsol\xe8tes du montage initial — un `useEffect` rafra\xeechit les parties \xab maintenant \xbb \xe0 chaque ouverture, ce qui \xe9vite la soumission involontaire d'un horaire pass\xe9 et la finalisation de session au moment de choisir une fin future.","**Affichage dur\xe9e** : le panneau session pr\xe9f\xe8re la valeur serveur `sessionDurationMinutes` (qui d\xe9duit les pauses) \xe0 la d\xe9rivation `endAt − startAt` c\xf4t\xe9 client.","**Saisie automatique des horaires** : lorsqu'un mod\xe8le fournit `lastUsedStartTime` et `lastUsedEndTime`, la modale horaire est **contourn\xe9e** ; les cr\xe9neaux (d\xe9cal\xe9s sur la journ\xe9e courante) et la dur\xe9e du minuteur sont pr\xe9remplis directement dans le lanceur — l'utilisateur peut valider imm\xe9diatement par **Entr\xe9e**, sans confirmation interm\xe9diaire.","**Point vert dans la barre d'outils** : un **point vert puls\xe9** appara\xeet dans la barre de navigation (\xe0 c\xf4t\xe9 des ic\xf4nes de route) lorsqu'une **version plus r\xe9cente** est disponible sur le registre npm. Au survol, un tooltip affiche le num\xe9ro de version (`vX.Y.Z`) ; un clic m\xe8ne au **changelog** (`/changelog`). La v\xe9rification est mise en cache **1 heure** c\xf4t\xe9 serveur (`GET /api/version-check`) et rafra\xeechie toutes les heures c\xf4t\xe9 client.","**Dur\xe9e session delta** : trois tests unitaires (`server/actionDispatch.test.ts`) v\xe9rifient que `setSessionStartTime` et `setSessionEndTime` ajustent `sessionDurationMinutes` par \xe9cart (delta) plut\xf4t que par recalcul int\xe9gral — y compris pour une session live avec pause.","**Comparaison semver** : `lib/semverCompare.test.ts` — `isNewerVersion` couvre majeurs, mineurs, correctifs, pr\xe9release (beta.N) et formats invalides (8 cas).","**Guide utilisateur** : mod\xe8les de t\xe2che — contournement de la modale quand les horaires sont fournis par le mod\xe8le (`lib/userGuideCopy.ts`, `docs/USER_GUIDE.md`).","**Impl\xe9mentation** : `lib/implementationNotes.ts`, `docs/IMPLEMENTATION_DETAILS.md` — p\xe9rim\xe8tre **1.0.0-beta.36** (nouvelle story **indicateur version**, flags `integrationChecked` sur correction horodatage)."]},{version:"1.0.0-beta.35",items:["**Dur\xe9e totale planifi\xe9e** : affich\xe9e seulement lorsqu’une session live a une **fin planifi\xe9e** (`scheduledEndAt`) ; ligne masqu\xe9e sinon. **Total planifi\xe9 (t\xe2ches)** : idem — uniquement s’il existe des t\xe2ches encore planifi\xe9es.","**D\xe9but / fin** sur les cartes (planifi\xe9es, en cours, termin\xe9es) : **m\xeame interaction** que le lanceur en mode pass\xe9 — bouton r\xe9sum\xe9 **d\xe9but → fin** ouvrant une **seule modale** avec les deux calendriers **inline** (plus de popover/modale empil\xe9e) ; **fin facultative** ; dur\xe9e du minuteur affich\xe9e seulement si une fin est renseign\xe9e. **Laps de suivi** : m\xeame bouton et modale, avec le **#** et la **dur\xe9e** du lap sur la ligne. **Nouvelle session** : calendriers pass\xe9 / imm\xe9diat \xe9galement inline dans la modale.","**Allocation facturation** : le KPI **Temps de t\xe2che enregistr\xe9** refl\xe8te le **total de la semaine affich\xe9e** (navigation de semaine), pas toute la plage filtr\xe9e.","**Vues** : trois **cartes centr\xe9es** (Allocation facturation, Rythme, Avanc\xe9) avec une courte description de l’objectif de chaque vue.","**Aide (?)** : **un seul** bouton d’aide par section (grilles #/@, graphiques, synth\xe8se, tableau journalier, etc.) ; sous-titres \xab Calendrier hebdomadaire \xbb redondants retir\xe9s.","**Mise en page** : sections **Temps par \xe9tiquette** et **Temps par projet** align\xe9es (m\xeame encadr\xe9, m\xeame indentation des colonnes).","**Guide utilisateur** : modale horaire unique (calendriers inline, fin facultative), laps de suivi, rapports et totaux planifi\xe9s session (`lib/userGuideCopy.ts`, `docs/USER_GUIDE.md`).","**Impl\xe9mentation** : `lib/implementationNotes.ts`, `docs/IMPLEMENTATION_DETAILS.md` — p\xe9rim\xe8tre **1.0.0-beta.35**.","Release **1.0.0-beta.35** : `npm test`, `npm run changelog:build`, `npm run pack:release`, `npm run release:verify` (voir `.cursor/rules/release-workflow.mdc`)."]},{version:"1.0.0-beta.34",items:["**Correctif tarball** : le paquet npm embarque un **changelog in-app** et un **`kronosys-package-meta.json`** align\xe9s sur la version semver du paquet (corrige **1.0.0-beta.33**, publi\xe9e avec un build stale affichant encore **beta.32** dans le changelog et la version standalone).","**Garde-fous release** (obligatoires avant publish) :","`scripts/lib/releaseVersionAlignment.mjs` — logique partag\xe9e + tests ;","`verify-standalone-pack-alignment.mjs` — pr\xe9-pack : semver, lockfile, m\xe9ta standalone, changelog embarqu\xe9 ;","`verify-packed-tarball.mjs` — post-pack : contenu r\xe9el du `.tgz` ;","`pack-with-zip.sh` — build explicite → v\xe9rif pr\xe9-pack → `npm pack --ignore-scripts` → v\xe9rif tarball ;","`prepublishOnly` — rebuild + v\xe9rif standalone si publish sans tarball pr\xe9-construit ;","`sync-standalone-assets.mjs` — auto-v\xe9rif apr\xe8s \xe9criture du m\xe9ta-fichier."]},{version:"1.0.0-beta.33",items:["**Sessions** (gauche) et **\xc9tiquettes / projets** (droite) : tiroirs **coll\xe9s au bord du viewport** (`left` / `right` : 0 + encoche safe-area) au lieu d’\xeatre d\xe9cal\xe9s vers le centre du conteneur max 1920px ; largeur ouverte toujours proportionnelle (**1fr** de l’ancienne grille `1fr / 2,25fr / 1fr`, calcul\xe9e sur **100vw**). La colonne **T\xe2ches** reste centr\xe9e dans le flux ; repli\xe9 : bande **2,75 rem** au bord d’\xe9cran. Mode focus inchang\xe9 (alignement bord + repli haut).","**Mode pass\xe9 / archive** : bouton **R\xe9gler d\xe9but, fin et dur\xe9e…** ouvrant une **modale** (d\xe9but, fin, dur\xe9e du minuteur) — plus de bloc horaire inline dans le lanceur ; les calendriers internes s’ouvrent en popover ancr\xe9 dans cette modale.","**Mod\xe8les et titres r\xe9currents** : liste d\xe9roulante **pleine largeur** de la ligne titre (remplace le `datalist` natif \xe9troit) ; filtrage diff\xe9r\xe9 inchang\xe9 ; m\xe9morisation des **derni\xe8res heures de d\xe9but/fin** utilis\xe9es (r\xe9appliqu\xe9es sur la **journ\xe9e courante** \xe0 la s\xe9lection, mode pass\xe9).","**Carte t\xe2che — horaires** : calendriers **d\xe9but** / **fin** (et laps) en **modale centr\xe9e** plein \xe9cran (portail `document.body`, plus de popover rogn\xe9 dans la carte) ; question d’**ajustement de dur\xe9e** uniquement \xe0 la modification de la **fin** ; le **d\xe9but** s’applique directement et **r\xe9aligne** le lap en cours (minuteur actif ou en pause) sur le nouveau d\xe9but ; t\xe2che **termin\xe9e** \xe0 un seul lap : le lap suit les bornes corrig\xe9es. **Correctif** : \xe0 la terminaison, `durationMs` est **r\xe9concili\xe9** sur la somme des laps (\xe9vite l’affichage 1 h pour un cr\xe9neau 10:30→11:00 avec lap 30 min).","**Points de d\xe9tail** : lien **Ajouter un point de d\xe9tail** (comme **Ajouter une note**) tant qu’il n’y en a aucun ; le champ d’ajout n’appara\xeet qu’apr\xe8s clic ou lorsqu’au moins un point est d\xe9j\xe0 list\xe9.","**Correctif terminer une t\xe2che** : une t\xe2che **termin\xe9e** (bouton Terminer) n’appara\xeet plus \xe0 tort dans **En pause** lorsque la pile active contenait des copies dupliqu\xe9es du m\xeame identifiant.","**Correctif lanceur pass\xe9** : le bascule **Temps r\xe9el / Pass\xe9** et les champs d\xe9but/fin/dur\xe9e restent accessibles **sans session live** (ex. apr\xe8s cl\xf4ture) ; l’ajout d’une t\xe2che pass\xe9e **cr\xe9e la session** automatiquement si besoin.","**Correctif minuteur t\xe2che planifi\xe9e** : apr\xe8s correction du **d\xe9but** (alignement au cr\xe9neau), le gros compteur vert ne **double** plus le temps (ex. ~58 min affich\xe9es pour ~28 min r\xe9elles) ; une **fin planifi\xe9e future** ne gonfle plus `durationMs` sur toute la plage lors du recalcul des bornes.","**Guide utilisateur** : modale **entr\xe9e pass\xe9e** (lanceur), calendriers modale sur cartes t\xe2che, tiroirs bord viewport, correctifs minuteur / terminaison (`lib/userGuideCopy.ts`, `docs/USER_GUIDE.md`)."]},{version:"1.0.0-beta.32",items:["**Fin planifi\xe9e / fin renseign\xe9e** : la **barre de progression** est sur la **m\xeame ligne** que **D\xe9but** et **Fin** (\xe0 droite), au lieu d’une ligne pleine largeur en dessous.","**Note libre** : lien **Ajouter une note** / **Add a note** pour afficher le champ ; si la note est **vide**, le bloc est masqu\xe9 (carte et lanceur). Au **lanceur**, le champ source n’appara\xeet qu’apr\xe8s ouverture explicite du lien (brouillon non vide sans \xe9diteur ouvert reste masqu\xe9). Une note **enregistr\xe9e** sur une carte reste affich\xe9e en lecture (clic pour modifier) ; aide Markdown **(?)** \xe0 c\xf4t\xe9 du lien ou du champ.","**Correctif note au lanceur** : suppression de l’aper\xe7u Markdown sous le champ pendant la saisie — le texte n’appara\xeet plus en double (source + rendu).","**Espacement** : r\xe9duction de l’\xe9cart entre la note et le bloc **sous-t\xe2ches**.","**Disposition align\xe9e sur les cartes** : mode maintenant/pass\xe9, KronoFocus, aide et pastilles projet / `#\xe9tiquettes` **en haut \xe0 droite** ; **titre** avec bouton **D\xe9marrer / Ajouter** **en fin de ligne** (comme avant pour ce seul contr\xf4le), puis **note** en dessous (`TaskFocusPanel.tsx`).","**Tiroir repliable (xl+)** : le lanceur est encadr\xe9 comme les tiroirs lat\xe9raux (bordure, flou, coins arrondis) ; **une seule ligne d’en-t\xeate** fusionne le titre **T\xe2ches** / **Tasks**, le **d\xe9compte par statut**, l’indicateur **SUIVI**, les **dates pass\xe9es** (mode pass\xe9) et le **chevron** d\xe9plier / replier (pas de languette) ; repli\xe9 : bandeau compact (m\xeame ligne, formulaire masqu\xe9) ; \xe9tat m\xe9moris\xe9 (`kronosys.dashboard.taskLauncherDrawer.open.v1`, `DashboardTaskLauncherDrawer.tsx`). Sous xl : toujours d\xe9ploy\xe9.","**Libell\xe9 du lanceur** : l’en-t\xeate du formulaire d’entr\xe9e et l’en-t\xeate repli\xe9 affichent **T\xe2ches** / **Tasks** (align\xe9 sur la colonne) au lieu de **En cours** / **In focus** ; **En cours (minuteur)** reste r\xe9serv\xe9 \xe0 la liste des t\xe2ches au minuteur actif.","**Guide utilisateur** : note repliable, position de la barre de progression sur les cartes, disposition du **lanceur de t\xe2che** (libell\xe9 **T\xe2ches** / **Tasks**, **expand/collapse** par chevron), **tiroir repliable** du lanceur (`lib/userGuideCopy.ts`, `docs/USER_GUIDE.md`).","**Aide (?)** : texte d’intro Markdown align\xe9 sur le flux **Ajouter une note** (`lib/dashboardCopy.ts`).","Release **1.0.0-beta.32** : bump semver, `npm run build`, `npm run pack:release`, `npm run changelog:build`, `npm run release:verify`. Publication npm au commit `chore(release): 1.0.0-beta.32` (voir `.cursor/rules/release-workflow.mdc`)."]},{version:"1.0.0-beta.31",items:["**Changelog in-app** : r\xe9g\xe9n\xe9ration `lib/generatedUserChangelog.ts` (`npm run changelog:build`) align\xe9e sur **1.0.0-beta.31**.","**Guide utilisateur** : en-t\xeate `docs/USER_GUIDE.md` et r\xe9f\xe9rences semver **`1.0.0-beta.31`** (2026-05-29).","**Impl\xe9mentation** : `lib/implementationNotes.ts`, `docs/IMPLEMENTATION_DETAILS.md`, `docs/README.md`, `README.md` — r\xe9f\xe9rences semver synchronis\xe9es.","**Workflow release** : script `scripts/verify-release-alignment.mjs` et r\xe8gle `.cursor/rules/release-workflow.mdc` — v\xe9rification locale avant tag et publish.","**Build standalone** : `npm run build` obligatoire avant `npm run pack:release` pour garantir un tarball npm avec l’UI \xe0 jour.","Release **1.0.0-beta.31** : bump semver, `npm run build`, `npm run pack:release`, `npm run changelog:build`, `npm run release:verify`. Publication npm au commit `chore(release): 1.0.0-beta.31` (voir `.cursor/rules/release-workflow.mdc`)."]},{version:"1.0.0-beta.30",items:["**Mode focus** : masque l’en-t\xeate, les bandeaux et le pied de page pour n’afficher que les **trois colonnes** (sessions, t\xe2ches, \xe9tiquettes / projets). Bouton **agrandir** dans la barre d’outils (\xe0 c\xf4t\xe9 du th\xe8me) ; **\xc9chap** ou bouton **r\xe9duire** en haut \xe0 droite pour quitter. Raccourci par d\xe9faut : **Alt+Shift+F** (modifiable dans la modale raccourcis). Pr\xe9f\xe9rence m\xe9moris\xe9e dans le navigateur.","**Palette donn\xe9es** (Ctrl+K / ⌘K) : commande **Basculer le mode focus** (`toggle-focus-mode`, `DashboardCommandCenter`) — en compl\xe9ment du bouton **agrandir**, du raccourci **Alt+Shift+F** et de la sortie **\xc9chap** / bouton **r\xe9duire**.","**Sessions** (gauche) et **\xc9tiquettes et projets** (droite) : panneaux repliables en tiroirs (`DashboardSideDrawer`, xl+) ; \xe0 l’ouverture, largeur lat\xe9rale identique \xe0 l’ancienne colonne **1fr** (grille `1fr / 2.25fr / 1fr`, conteneur max 1920px) ; repli\xe9 : languette **2,75 rem** avec libell\xe9 vertical (titre de colonne). La colonne **T\xe2ches** reste centr\xe9e sans d\xe9calage ; sa largeur max augmente de **20 % par tiroir repli\xe9** (base **42 rem**). \xc9tat m\xe9moris\xe9 dans le navigateur (`lib/dashboardSideDrawerStorage.ts`). Sous xl : disposition empil\xe9e inchang\xe9e.","**Bande repli\xe9e** : ic\xf4ne de colonne (`DashboardColumnTitleIcon`) au-dessus du **libell\xe9 vertical** ; languette vers la colonne T\xe2ches ; **Alignement sous l’en-t\xeate** via `DashboardSideDrawerTopSync` (`--kronosys-dash-drawer-top`) ; en mode focus, tiroirs cal\xe9s en haut de page.","**Ligne de titre** : \xe0 c\xf4t\xe9 du **total**, d\xe9compte par bloc (**En cours**, **Planifi\xe9es**, **En pause**, **Compl\xe9t\xe9es**, **Non termin\xe9es (instantan\xe9)**) — segments non nuls align\xe9s sur les en-t\xeates de `TaskFocusPanel` (`lib/taskColumnStatusSummary.ts`).","**KronoFocus** reste **toujours visible** dans la barre d’outils (\xe0 c\xf4t\xe9 de l’horloge), sur toutes les pages principales.","**Carte t\xe2che** : **minuteur live** \xe0 droite sur la **ligne du titre** ; boutons d’action ic\xf4ne compacts sur une ligne sous le titre.","**Dur\xe9e restante** sous **Dur\xe9e** lorsque `scheduledEndAt` est renseign\xe9 ; barre de progression sous **Fin** ; **Nouvelle session** avec fin planifi\xe9e optionnelle → cl\xf4ture automatique.","**Markdown** titre (inline) et note (block) ; aide **(?)** ; GFM ; popover **laps de suivi** au survol Gantt.","**Note** : champ source auto-ajust\xe9 en hauteur (`TaskNoteTextarea`, `ResizeObserver`).","**D\xe9but avec minuteur actif** : modale **Tour de minuteur en cours** (`lapAdjustMode`).","**Laps enregistr\xe9s** : \xe9dition d\xe9but/fin et suppression sur la carte.","**Rouvrir** (↺) une t\xe2che termin\xe9e ; **dur\xe9e minimale** et pr\xe9remplissage fin ; **\xe9tiquette \xab d\xe9faut \xbb** et retrait automatique avec `#tag` explicite.","**Nouvelle session** d\xe9but r\xe9troactif + fin future → session live planifi\xe9e.","Bascule **Prod** / **QA** imm\xe9diate (`resetSqliteConnection`) — sans red\xe9marrage requis.","**Param\xe8tres → Tableau de bord web** : **\xab Ne pas distinguer par la couleur seule \xbb** — pr\xe9fixes `#` / `@` / `!` et bordures distinctes sur les pastilles (`lib/semanticChipAccessibleMode.ts`).","**Guide utilisateur** : `lib/userGuideCopy.ts`, `docs/USER_GUIDE.md` — en-t\xeate **`1.0.0-beta.30`** (2026-05-28).","**Impl\xe9mentation** : `lib/implementationNotes.ts`, `docs/IMPLEMENTATION_DETAILS.md`, `docs/README.md`.","**Tests** : suite Vitest compl\xe8te (543 tests) ; couverture tiroirs, focus mode, r\xe9sum\xe9 statuts, pastilles accessibles, Markdown, laps, QA switch, etc.","**Correctifs build** : `lib/taskMarkdownComponents.tsx`, `lib/taskTimelineGantt.ts`, `formatProjectDisplay` (libell\xe9s `!` en rapports).","Release **1.0.0-beta.30** : bump semver, `npm run build`, `npm run pack:release`, `npm run changelog:build`, `npm run release:verify`. Publication npm au commit `chore(release): 1.0.0-beta.30` (voir `.cursor/rules/release-workflow.mdc`)."]},{version:"1.0.0-beta.29",items:["**Mode focus** : masque l’en-t\xeate, les bandeaux et le pied de page pour n’afficher que les **trois colonnes** (sessions, t\xe2ches, \xe9tiquettes / projets). Bouton **agrandir** dans la barre d’outils (\xe0 c\xf4t\xe9 du th\xe8me) ; **\xc9chap** ou bouton **r\xe9duire** en haut \xe0 droite pour quitter. Raccourci par d\xe9faut : **Alt+Shift+F** (modifiable dans la modale raccourcis). Pr\xe9f\xe9rence m\xe9moris\xe9e dans le navigateur.","**Palette donn\xe9es** (Ctrl+K / ⌘K) : commande **Basculer le mode focus** (`toggle-focus-mode`, `DashboardCommandCenter`) — en compl\xe9ment du bouton **agrandir**, du raccourci **Alt+Shift+F** et de la sortie **\xc9chap** / bouton **r\xe9duire**.","**Sessions** (gauche) et **\xc9tiquettes et projets** (droite) : panneaux repliables en tiroirs (`DashboardSideDrawer`, xl+) ; \xe0 l’ouverture, largeur lat\xe9rale identique \xe0 l’ancienne colonne **1fr** (grille `1fr / 2.25fr / 1fr`, conteneur max 1920px) ; repli\xe9 : languette **2,75 rem** avec libell\xe9 vertical (titre de colonne). La colonne **T\xe2ches** reste centr\xe9e sans d\xe9calage \xe0 l’ouverture ou la fermeture ; sa largeur max augmente de **20 % par tiroir repli\xe9** (base **42 rem**). \xc9tat m\xe9moris\xe9 dans le navigateur (`lib/dashboardSideDrawerStorage.ts`). Sous xl : disposition empil\xe9e inchang\xe9e.","**Bande repli\xe9e** : ic\xf4ne de colonne (`DashboardColumnTitleIcon` — Historique / \xc9tiquettes) au-dessus du **libell\xe9 vertical** du titre ; m\xeame pictogramme que la rang\xe9e titre ouverte.","**Languette** : centr\xe9e verticalement sur le **bord int\xe9rieur** (vers la colonne T\xe2ches) ; en repli, positionn\xe9e vers le bas pour \xe9viter le chevauchement du libell\xe9 vertical.","**Alignement sous l’en-t\xeate** : `DashboardSideDrawerTopSync` mesure la bande des colonnes et pose `--kronosys-dash-drawer-top` pour que les tiroirs restent visibles sous la barre d’outils ; en **mode focus**, les tiroirs se calent en haut de page (`app/globals.css`).","**Ligne de titre** : \xe0 c\xf4t\xe9 du **total**, d\xe9compte par bloc (**En cours**, **Planifi\xe9es**, **En pause**, **Compl\xe9t\xe9es**, **Non termin\xe9es (instantan\xe9)**) — segments non nuls align\xe9s sur les en-t\xeates de `TaskFocusPanel` (`lib/taskColumnStatusSummary.ts`, `buildTaskColumnStatusSegments`).","**Panneau timing** : sous **Dur\xe9e**, **Dur\xe9e restante** affiche le temps jusqu’\xe0 la fin planifi\xe9e (`scheduledEndAt`) lorsqu’une heure de fin est renseign\xe9e ; sinon **Ind\xe9termin\xe9e** — bloc **Session en cours** (`SelectedSessionSidebarBlock.tsx`).","**Fin planifi\xe9e** : barre de progression sous la ligne **Fin** (m\xeame logique que les cartes t\xe2che : avancement de `startAt` vers `scheduledEndAt`, alerte visuelle < 15 / 5 min).","**Actions session** : boutons Gantt / terminer la session, **Nouvelle session** (+), **Archives**, crayon nom, et ic\xf4nes de ligne de liste — gabarit compact des cartes t\xe2che (`TASK_CARD_ICON_BTN_*`, 30\xd730 px, ic\xf4nes 14 px).","**Nouvelle session (Maintenant)** : fin planifi\xe9e optionnelle d\xe8s la modale **Nouvelle session** → cl\xf4ture automatique \xe0 l’\xe9ch\xe9ance (`scheduledEndAt` sur `newSession`).","**Actions** : boutons ic\xf4ne compacts (m\xeame \xe9chelle que les pastilles `#` / `@`) sur une **ligne sous le titre** ; le titre occupe toute la largeur (minuteur live \xe0 droite sur la ligne du titre).","**Fin planifi\xe9e** : barre de progression sous **D\xe9but** / **Fin** lorsque `scheduledEndAt` est d\xe9fini (avancement de `startTime` vers l’\xe9ch\xe9ance).","**Modale enrichie** : lorsqu’une t\xe2che **au minuteur** (lap en cours) voit son **d\xe9but** modifi\xe9, une section **Tour de minuteur en cours** propose de **conserver** le lap, le **cl\xf4turer** (enregistr\xe9 dans `taskTimerLaps`) ou le **r\xe9aligner** sur le nouveau d\xe9but — en plus du recalcul de la **dur\xe9e totale** d\xe9j\xe0 existant.","**Serveur** : `setTaskStartTime` accepte `lapAdjustMode` (`keep` | `flush` | `align_start`) ; impl\xe9ment\xe9 dans `updateTaskStartTimeInSession`.","**Titre** : en lecture sur la carte, Markdown **inline** rendu (`TaskMarkdownContent`, variante `inline`) — gras, italique, lien, code ; les listes et aper\xe7us compacts retirent la syntaxe (`stripTaskMarkdownPlainText`).","**Note libre** : Markdown **block** rendu sur la carte (`TaskNoteField`) ; clic pour \xe9diter la source ; aper\xe7u live sous le champ au **lanceur** de t\xe2che ; ic\xf4ne **(?)** (`TaskMarkdownHelpTrigger`) avec exemples source + rendu.","**Saisie note** : le champ source (`TaskNoteTextarea`) s’**ajuste en hauteur** automatiquement \xe0 la saisie (`ResizeObserver`) — meilleure lisibilit\xe9 lors de l’\xe9dition Markdown.","**S\xe9curit\xe9** : pas de HTML brut (`react-markdown` sans `rehype-raw`) ; liens externes `noopener`.","**GFM** : plugin `remark-gfm` — tableaux, `~~barr\xe9~~`, listes `- [ ]` / `- [x]`, autolinks ; hors scope GitLab : Mermaid, @mentions, alertes `> [!note]`, HTML.","**Gantt** : survol d’un segment de t\xe2che — popover listant tous les **laps de suivi** (`TaskTimelineGanttModal`).","**Carte t\xe2che** : section **Laps de suivi** — correction **d\xe9but/fin** par lap (popover date-heure) et **suppression** avec confirmation ; le lap **en cours** reste en lecture seule jusqu’\xe0 cl\xf4ture.","**Serveur** : actions `setTaskTimerLap` et `deleteTaskTimerLap` (`updateTaskTimerLapInSession`, `deleteTaskTimerLapInSession`) — ajustement de `durationMs` par delta, ordre chronologique entre laps contigus.","**Correctif** : la bascule **Prod** / **QA** rouvre imm\xe9diatement le bon fichier SQLite (`resetSqliteConnection` avant toute \xe9criture payload) — y compris lorsque le coffre QA existe d\xe9j\xe0 (sans modale d’amor\xe7age) ou via **Param\xe8tres → G\xe9n\xe9ral**.","**Documentation** : guide in-app (`lib/userGuideCopy.ts`) et `docs/USER_GUIDE.md` (FR/EN) — bascule **imm\xe9diate** (plus de red\xe9marrage requis) ; `lib/settingsCopy.ts` (libell\xe9s coffres) ; `lib/implementationNotes.ts` et `docs/IMPLEMENTATION_DETAILS.md`.","**Param\xe8tre** `taskMinimumDurationMinutes` (d\xe9faut **30 min**, plage **15–480**) dans **Param\xe8tres → T\xe2ches et \xe9tiquettes** (`/settings#settings-task-tags`).","**Entr\xe9e pass\xe9e** (mode \xab Pass\xe9 \xbb ou session archiv\xe9e) : le **d\xe9but** est arrondi \xe0 la **demi-heure pr\xe9c\xe9dente** ; la **fin** est pr\xe9remplie \xe0 **d\xe9but + dur\xe9e minimale** (recalcul\xe9e quand le d\xe9but change) ; la **dur\xe9e du minuteur** suit la plage d\xe9but/fin.","**T\xe2che planifi\xe9e** : sur la carte t\xe2che, la **fin** (brouillon) suit le **d\xe9but** avec le m\xeame \xe9cart ; si aucune fin n’\xe9tait encore enregistr\xe9e, une **fin planifi\xe9e** est pos\xe9e automatiquement \xe0 la validation du d\xe9but (`scheduledEndAt` via `setTaskEndTime`).","**Correctif** : une t\xe2che **termin\xe9e** dont le cr\xe9neau planifi\xe9 (d\xe9but + fin futurs) atteint son **d\xe9but** se **rouvre** et **active** le minuteur automatiquement au lieu de rester dans **Compl\xe9t\xe9es** ; un d\xe9but futur sur une t\xe2che ouverte **l\xe8ve** la pause manuelle pour permettre l’activation \xe0 l’\xe9ch\xe9ance.","**Seau par d\xe9faut** (`taskDefaultTagBucketEnabled`, inchang\xe9) : une t\xe2che **sans** `#` explicite re\xe7oit l’\xe9tiquette r\xe9serv\xe9e `default` (affich\xe9e \xab d\xe9faut \xbb en fran\xe7ais).","**Retrait automatique** (`taskStripDefaultTagWhenExplicitTags`, **activ\xe9** par d\xe9faut) : d\xe8s qu’**au moins une autre** \xe9tiquette explicite est pr\xe9sente (saisie `#…`, tableau `tags`, \xe9dition du titre), l’\xe9tiquette `default` est **retir\xe9e** — y compris lors d’une **cr\xe9ation** avec `#tag` dans le titre ou d’une **mise \xe0 jour** (`updateTask`).","**Persistance serveur** : fusion titre + `tags` \xe0 la cr\xe9ation (`startTask`, `addHistoricalTask`) via `resolveStoredTaskTagsFromTaskLine` ; normalisation centralis\xe9e dans `normalizeTaskTagsForStorage` (`lib/taskParsing.ts`).","**Param\xe8tres** : second commutateur dans **T\xe2ches et \xe9tiquettes** (`#settings-task-tags`) pour conserver volontairement `default` \xe0 c\xf4t\xe9 d’autres \xe9tiquettes.","**Fin future autoris\xe9e** : en mode \xab Dans le pass\xe9 \xbb, une **fin encore \xe0 venir** ouvre une **session live** avec `startAt` r\xe9troactif et **`scheduledEndAt`** ; l’horloge murale part du d\xe9but saisi (dur\xe9e initiale = maintenant − d\xe9but) et la session se **cl\xf4ture automatiquement** \xe0 l’\xe9ch\xe9ance — m\xeame m\xe9canisme que `setSessionEndTime` sur une session live. Si la fin est **d\xe9j\xe0 pass\xe9e**, la plage **close** reste **historis\xe9e** comme avant.","**Session live d\xe9j\xe0 ouverte** : un d\xe9but r\xe9troactif avec **fin future** d\xe9clenche d’abord le flux **fin de session** (comme \xab Maintenant \xbb), en conservant les bornes saisies ; une session **enti\xe8rement pass\xe9e** n’interrompt toujours **pas** la session active.","**Bouton Rouvrir** (↺) sur chaque carte **termin\xe9e** (session live ou archive).","**Modale** : reprendre le **minuteur** (dur\xe9e conserv\xe9e), rouvrir en **pause**, **dur\xe9e manuelle** (h/m/s) ou **remise \xe0 z\xe9ro** ; les **sous-t\xe2ches** sont rouvertes.","**Session live** : si un autre minuteur tourne d\xe9j\xe0 lors d’une **reprise**, modale **pause / terminer / parall\xe8le** (m\xeame m\xe9morisation que pour un d\xe9marrage).","**Instantan\xe9 cl\xf4tur\xe9** : pas de minuteur live — correction de **statut** et de **dur\xe9e** ; regroupement **Non termin\xe9es (instantan\xe9)** dans la colonne t\xe2ches.","**Param\xe8tres → Tableau de bord web** : option **\xab Ne pas distinguer par la couleur seule \xbb** (`dashboardSemanticChipAccessibleMode`) — pr\xe9fixes `#` / `@` / `!` et bordures distinctes (pleine, double, pointill\xe9e) sur les pastilles \xe9tiquette / projet travail / projet personnel, en compl\xe9ment des teintes vert / bleu ciel / rose (`lib/semanticChipAccessibleMode.ts`, `globals.css`, `taskFieldStyles.ts`).","**Guide utilisateur** : `lib/userGuideCopy.ts`, `docs/USER_GUIDE.md` — lot **beta.28–beta.29** (mode focus et palette, tiroirs lat\xe9raux xl+, r\xe9sum\xe9 statuts colonne T\xe2ches, note auto-ajust\xe9e, Markdown t\xe2che, laps, rouvrir t\xe2che, dur\xe9e minimale, \xe9tiquette d\xe9faut, nouvelle session fin future, pastilles accessibles, coffres Prod/QA imm\xe9diats) ; en-t\xeate **`1.0.0-beta.29`**.","**Impl\xe9mentation** : `lib/implementationNotes.ts`, `docs/IMPLEMENTATION_DETAILS.md`, `docs/README.md` — cartographie compl\xe8te du cycle ; user stories **beta.28** et **beta.29**.","**Tests** : `server/actionDispatch.test.ts`, `server/actionTaskSession.test.ts`, `test/integration/apiActionNewSessionScope.test.ts`, `test/integration/apiActionDataEnvironmentQaSeed.test.ts` ; `lib/taskMinimumDuration.test.ts`, `lib/taskParsing.test.ts`, `lib/taskColumnStatusSummary.test.ts` ; `lib/dashboardSideDrawerStorage.test.ts`, `lib/dashboardFocusMode.test.ts`, `lib/dashboardSideDrawerLayout.test.ts`, `lib/semanticChipAccessibleMode.test.ts` ; `server/mainTimerHydrate.test.ts` ; composants Markdown (`TaskMarkdownContent.test.tsx`, `TaskMarkdownHelpTrigger.test.tsx`, `TaskNotesDisplay.test.tsx`).","Release **1.0.0-beta.29** sur npm (dist-tag `beta`) : lot **beta.28** non publi\xe9 s\xe9par\xe9ment — contenu usager consolid\xe9 sous cette section ; bump `package.json` / `package-lock.json`, r\xe9g\xe9n\xe9ration `lib/generatedUserChangelog.ts` (`npm run changelog:build`), v\xe9rification `npm run release:verify` (voir `.cursor/rules/release-workflow.mdc`)."]},{version:"1.0.0-beta.28",items:["**Version non publi\xe9e sur npm** : le d\xe9veloppement \xe9tiquet\xe9 beta.28 a \xe9t\xe9 livr\xe9 dans le paquet **1.0.0-beta.29** ; l’historique d\xe9taill\xe9 des changements usagers figure dans la section **1.0.0-beta.29** ci-dessus."]},{version:"1.0.0-beta.27",items:["**Toast global** : lorsqu’une **t\xe2che planifi\xe9e** atteint son heure de d\xe9but (`startTime`) ou qu’une **session live** atteint son **`startAt` officiel**, un message temporaire s’affiche en bas \xe0 droite **sur toute route** de l’app (tableau de bord, param\xe8tres, rapports, guide, etc.) — le titre de la t\xe2che ou le nom de la session est rappel\xe9 dans le libell\xe9.","La **modale de conflit** (pause / terminer / parall\xe8le) reste affich\xe9e lorsque le passage planifi\xe9 → en cours co\xefncide avec un autre minuteur d\xe9j\xe0 actif ; le toast d’activation s’ajoute en compl\xe9ment, pas en remplacement.","**Alignement livraison** : `lib/userGuideCopy.ts`, `docs/USER_GUIDE.md`, `lib/implementationNotes.ts` et `docs/IMPLEMENTATION_DETAILS.md` — p\xe9rim\xe8tre **beta.26** document\xe9 de fa\xe7on homog\xe8ne (coffres Prod/QA et amor\xe7age QA, journal `/logs`, cr\xe9neaux planifi\xe9s, suggestions `#` / `@` / `!`, rapports avec **Travail / Personnel** et **Total jour**) ; **beta.27** : toast global \xe0 l’activation d’un cr\xe9neau planifi\xe9 ; en-t\xeates et r\xe9f\xe9rences de version **`1.0.0-beta.27`**.","**Index d\xe9p\xf4t** : `docs/README.md` (r\xf4les des fichiers, cartographie, r\xe8gles de maintenance) ; `README.md` racine — section **API HTTP** compl\xe8te (six routes, plus de mention \xab stub \xbb pour `/api/state`).","**Conception** : `docs/IMPLEMENTATION_DETAILS.md` — cartographie du code, contrats API ; **documentation in-code** sur le noyau (`server/payloadStore`, `actionDispatch`, `db`, `userActionLog`, `app/api/*`, `lib/kronosysApi.ts`).","**CHANGELOG usager** : r\xe9g\xe9n\xe9ration via `npm run changelog:build` (`lib/generatedUserChangelog.ts`).","**Tests** : `lib/plannedScheduleActivation.test.ts` — d\xe9tection planifi\xe9 → minuteur et session ; composant global `PlannedScheduleActivationWatcher` (layout racine).","Les versions **pr\xe9release** (`1.0.0-beta.*`) doivent \xeatre publi\xe9es avec un dist-tag explicite, par ex. `npm publish … --access public --tag beta` (sinon npm refuse la publication).","Bump applicatif : **`1.0.0-beta.27`** (`package.json`, `package-lock.json`)."]},{version:"1.0.0-beta.26",items:["**Deux coffres SQLite** : lorsque l’option est activ\xe9e dans **Param\xe8tres → G\xe9n\xe9ral** (*Coffres production et QA*), les donn\xe9es de production restent dans `…/v4` et un coffre **QA** isol\xe9 vit dans `…/v4-qa` (pr\xe9f\xe9rence sur disque : `data-environment-preference.json`, hors des deux dossiers).","**Bascule** : boutons **Prod** / **QA** dans la barre de navigation (visible seulement si les deux coffres sont activ\xe9s) ; action `switchDataEnvironment` ; **red\xe9marrage du serveur** requis pour ouvrir le bon fichier SQLite (comme tout changement de r\xe9pertoire de donn\xe9es).",'**Rep\xe8re visuel QA** : bandeau violet persistant, liser\xe9 et fond l\xe9g\xe8rement teint\xe9s (`data-kronosys-env="qa"` sur `<html>`) lorsque le processus sert effectivement le coffre QA.',"**Priorit\xe9** : si `TRACE_DATA_DIR` est d\xe9fini, les options prod/QA sont d\xe9sactiv\xe9es ; en `next dev`, lorsque les deux coffres sont activ\xe9s, ils priment sur le segment `v4-dev` (coffres `v4` ou `v4-qa`).","**Premier passage en QA** : si le coffre `v4-qa` n’existe pas encore, une modale propose de **copier la production** ou de **d\xe9marrer vide** avant d’enregistrer la bascule (`switchDataEnvironment` avec `qaSeed`).","**Page** `/logs` (ic\xf4ne **liste** dans le bloc navigation principal) : historique des **mutations** pass\xe9es par `POST /api/action` (type d’action, succ\xe8s/\xe9chec, horodatage, session li\xe9e, IP source).","**Persistance** : table SQLite `user_action_log` (`server/userActionLog.ts`) ; champs sensibles du corps (`token`, `password`, `uri`) **masqu\xe9s** dans le JSON archiv\xe9.","**Lecture** : `GET /api/action-logs?limit=…` ; action `clearUserActionLogs` pour vider le journal depuis l’UI.","**D\xe9but planifi\xe9** : tant que le **d\xe9but officiel** (`startTime`) d’une t\xe2che **non termin\xe9e** est encore **futur**, le **serveur** n’accumule **pas** de dur\xe9e et ne laisse **pas** tourner un segment de minuteur en arri\xe8re-plan ; \xe0 l’**heure de d\xe9but**, la t\xe2che **rejoint le suivi actif** (pile `activeTasks` si besoin) et le minuteur s’**ancre** \xe0 ce `startTime` (synchronisation d’\xe9tat, typiquement toutes les **~2 s** via `/api/state`).","**Fin planifi\xe9e** : une **heure de fin** sur une t\xe2che **en cours** pose toujours `scheduledEndAt` ; \xe0 l’\xe9ch\xe9ance, la t\xe2che se **termine** automatiquement (comportement existant, coh\xe9rent avec le d\xe9but planifi\xe9).","**`setTaskStartTime`** : un d\xe9but **futur** ne pose plus de segment de minuteur **imm\xe9diat**.","**Conflit planifi\xe9 → en cours** : si plusieurs cr\xe9neaux deviennent actifs en m\xeame temps qu’un autre minuteur tournait d\xe9j\xe0, la **modale** pause / terminer / parall\xe8le (m\xe9morisation possible) s’applique comme avant.","**Liste d\xe9roulante** : lorsque le jeton **`#`** (\xe9tiquette), **`@`** (projet travail) ou **`!`** (projet personnel) est actif dans le champ \xab sur quoi travaillez-vous \xbb ou en **\xe9dition du titre** d’une t\xe2che, une liste propose les choix **les plus utilis\xe9s** puis **les plus r\xe9cents** (fr\xe9quence dans l’historique des t\xe2ches, puis listes `knownTags` / `knownProjects` / `knownPersonalProjects`).","**Interaction** : filtrage au fil de la frappe ; navigation clavier (**↑** / **↓**, **Entr\xe9e**, **Tab**, **\xc9chap**) et s\xe9lection \xe0 la souris.","**Port\xe9e projet** : apr\xe8s `@projet#` ou `!projet#`, les suggestions **`#`** ciblent les **\xe9tiquettes li\xe9es** \xe0 ce projet.","Les **mod\xe8les de t\xe2che** (pr\xe9fixe **Mod\xe8le :**) restent propos\xe9s via le m\xe9canisme existant (`datalist`), en parall\xe8le de cette liste.","**Sessions par jour — temps des t\xe2ches** : sous chaque t\xe2che, chaque **#** affiche la **dur\xe9e compl\xe8te** enregistr\xe9e (m\xeame r\xe8gle que les grilles d’allocation #) — **plus** de r\xe9partition \xe0 parts \xe9gales lorsque plusieurs \xe9tiquettes portent sur la m\xeame ligne.","**Temps enregistr\xe9 vs planifi\xe9** : les **totaux**, graphiques et grilles # / @ ne comptent que le **temps r\xe9ellement pass\xe9** (`durationMs`, r\xe8gles d’archives inchang\xe9es). Les t\xe2ches dont le cr\xe9neau est encore **dans le futur** (m\xeame crit\xe8re d’affichage \xab planifi\xe9 \xbb que le tableau de bord) montrent une **fen\xeatre planifi\xe9e** \xe0 part (libell\xe9 ambre), sans l’ajouter aux totaux enregistr\xe9s.","**Calendriers hebdomadaires** (# et @) : ligne **Total jour** en bas de chaque tableau de semaine — **somme par colonne** (chaque jour) et **total de semaine** dans la derni\xe8re colonne.","**Grille par projet (@)** : s\xe9lecteur **Travail (@)** / **Personnel (!)** sous le calendrier hebdomadaire par projet — **Travail** (d\xe9faut) exclut le registre personnel ; **Personnel** n’affiche que le temps `!` (`personalProject` ou jeton `!` reconnu dans le titre si le drapeau manque sur d’anciennes donn\xe9es).","**Tests** : `lib/dataDir.test.ts`, `lib/dataEnvironmentPreferenceFile.test.ts` — r\xe9solution `v4` / `v4-qa`, priorit\xe9 du double coffre en dev ; `server/mainTimerHydrate.test.ts`, `server/actionTaskSession.test.ts` — d\xe9but planifi\xe9 (pas d’accumulation avant l’heure, activation et fin \xe0 l’\xe9ch\xe9ance) ; `setTaskStartTime` avec d\xe9but futur sans segment imm\xe9diat.","**Tests** : `lib/taskEntryTokenSuggest.test.ts` — d\xe9tection des jetons actifs, classement et insertion d’une suggestion.","**Tests** : `lib/reportingAggregate.test.ts` — temps planifi\xe9 exclu des agr\xe9gats enregistr\xe9s ; `lib/reportingWeekLayout.test.ts` — `sumWeekCalendarSlots`.","**Tests** : `test/integration/apiActionLogs.test.ts`, `test/integration/apiActionDataEnvironmentQaSeed.test.ts`.","**Guide utilisateur** : `lib/userGuideCopy.ts` et `docs/USER_GUIDE.md` (FR/EN) — **coffres production / QA** (activation, bascule Prod/QA, amor\xe7age QA, red\xe9marrage, rep\xe8re visuel) ; **journal des actions** (`/logs`) ; **cr\xe9neau planifi\xe9** (activation au d\xe9but, fin automatique) ; liste d\xe9roulante `#` / `@` / `!` ; **Rapports** (dur\xe9e compl\xe8te par # en sessions/jour, temps planifi\xe9 \xe0 part, **Total jour** sur calendriers hebdo, s\xe9lecteur **Travail / Personnel** sur la grille @) ; en-t\xeate **`1.0.0-beta.26`**.","**Impl\xe9mentation** : `lib/implementationNotes.ts` (FR + EN, `lastUpdated`) ; `docs/IMPLEMENTATION_DETAILS.md` — `lib/dataDir.ts` / `lib/dataEnvironmentPreferenceFile.ts`, `switchDataEnvironment`, `server/userActionLog.ts`, `activateDuePlannedTaskTimersInSession` / `deferFutureStartMainTimersInSession`, `lib/taskEntryTokenSuggest.ts`, agr\xe9gats reporting (scopes `work` / `personal`).","**D\xe9p\xf4t** : `README.md` (r\xe9f\xe9rence de version npm).","**Aide Rapports** : `lib/reportingStrings.ts` (textes **Rythme**, calendriers, totaux journaliers).","Bump applicatif : **`1.0.0-beta.26`** (`package.json`, `package-lock.json`) ; **CHANGELOG** usager r\xe9g\xe9n\xe9r\xe9 (`npm run changelog:build`)."]},{version:"1.0.0-beta.25",items:["**Cause** : en production, **`node server.js`** s’ex\xe9cute avec **`cwd` = `.next/standalone`** ; le tarball npm ne publie pas le **`package.json`** racine de l’app, et le **`package.json`** minimal g\xe9n\xe9r\xe9 par Next dans le standalone ne porte pas la version **`@nightkatana/kronosys-app`** — l’UI et **`/api/health`** pouvaient donc afficher une version **d\xe9cal\xe9e** (ex. livraison **beta.24** lue comme **beta.23**).","**Correctif** : apr\xe8s **`next build`**, **`scripts/sync-standalone-assets.mjs`** \xe9crit **`kronosys-package-meta.json`** dans le standalone avec la **`version`** du **`package.json`** source ; **`readKronosysPackageVersion()`** lit ce fichier (ou **`KRONOSYS_APP_VERSION`**, pos\xe9e par **`bin/kronosys.mjs`** au lancement du serveur standalone).","**`app/layout.tsx`** : le layout reste **`force-dynamic`** pour \xe9viter une version RSC fig\xe9e au build lorsque la lecture fichier est pertinente.","Bump applicatif : **`1.0.0-beta.25`** (`package.json`, `package-lock.json`) ; **CHANGELOG** usager r\xe9g\xe9n\xe9r\xe9 (`npm run changelog:build`)."]},{version:"1.0.0-beta.24",items:['**`output: "standalone"`** (`next.config.ts`) + **`scripts/sync-standalone-assets.mjs`** apr\xe8s **`npm run build`** : **`kronosys start`** et **`npm run start`** ex\xe9cutent **`node server.js`** dans **`.next/standalone`** (plus **`next start`** sur ce livrable).','**`package.json` → `"files"`** : le tarball publi\xe9 se limite \xe0 **`bin/`**, **`.next/BUILD_ID`** et **`.next/standalone`** (sans sources `app/` / `server/`), pour une archive nettement plus l\xe9g\xe8re qu’un paquet monolithique.',"**Portabilit\xe9** : exclusion du tra\xe7age **`sharp` / `@img/sharp*`** (**`outputFileTracingExcludes`**) + **`images.unoptimized`**, afin d’\xe9viter des binaires **Linux-only** dans un paquet vis\xe9 **Windows / macOS**.","**Docker** : image d’ex\xe9cution all\xe9g\xe9e (**`node server.js`** depuis le standalone copi\xe9).","**`kronosys dev`** : refus explicite depuis un install tarball slim sans dossier **`app/`** (flux dev = checkout source).","Bump applicatif : **`1.0.0-beta.24`** (`package.json`, `package-lock.json`) ; **CHANGELOG** usager r\xe9g\xe9n\xe9r\xe9 (`npm run changelog:build`)."]},{version:"1.0.0-beta.23",items:["**SQLite** : **`better-sqlite3` retir\xe9** au profit de **`node:sqlite`** (`DatabaseSync`) ; **`engines.node`** **≥ 22.13.0** ; r\xe8gle **`.cursor/rules/platform-native-deps.mdc`**.","**Publication / CLI** : cadre **Linux, Windows, macOS** et strat\xe9gie **`kronosys`** — r\xe8gle **`.cursor/rules/kronosys-npm-packaging.mdc`** (it\xe9rations ult\xe9rieures du contenu du tarball : voir **1.0.0-beta.25**).","Bump applicatif : **`1.0.0-beta.23`** (`package.json`, `package-lock.json`) ; **CHANGELOG** usager r\xe9g\xe9n\xe9r\xe9 (`npm run changelog:build`)."]},{version:"1.0.0-beta.22",items:["**Plus de barre de d\xe9filement horizontale** sur la barre d’outils d’en-t\xeate (`lib/appShellHeaderClasses.ts`) : les segments **horloge / KronoFocus / palette de commandes / navigation de routes / utilitaires (th\xe8me, actualiser, langue)** passent d\xe9sormais **\xe0 la ligne** (`flex-wrap`) lorsqu’ils ne tiennent plus, en gardant chaque rang\xe9e **centr\xe9e**, au lieu de produire un ascenseur horizontal sur le conteneur. Le comportement est identique sur **toutes** les routes principales (tableau de bord, rapports, param\xe8tres, journaux, guide, impl\xe9mentation, changelog, licences).","**Bandeau \xab Donn\xe9es actualis\xe9es \xbb du bouton actualiser** (`components/dashboard/PageRefreshButton.tsx`) : rendu via **portail** vers `document.body` avec **`position: fixed`** au lieu d’un positionnement absolu sous le bouton. Corrige l’apparition intermittente d’une **barre de d\xe9filement verticale** sur la page \xe0 chaque clic — l’\xe9l\xe9ment absolu participait au d\xe9bordement du `<body>` et faisait osciller le `scrollHeight` pendant les ~2,8 s d’affichage du libell\xe9.",'**Popover d’\xe9dition de dur\xe9e KronoFocus** (`components/dashboard/KronoFocusPanel.tsx`) : ouvrir le temps depuis l’en-t\xeate (`variant="headerBar"`) ne d\xe9clenche plus l’apparition de **scrollbars sur les deux axes** dans l’alv\xe9ole du ruban. La cause \xe9tait la combinaison `overflow-x-auto` sur l’alv\xe9ole + popover en `position: absolute` : selon la spec CSS, d\xe8s qu’un axe d’overflow n’est pas `visible`, l’autre est promu en `auto`, donc deux ascenseurs apparaissaient sit\xf4t que le panneau d\xe9passait. Le popover est d\xe9sormais rendu en **portail** avec `position: fixed` centr\xe9 sous le bouton du temps. D\xe9tection click-outside r\xe9vis\xe9e pour v\xe9rifier le **d\xe9clencheur** et le **panneau** par leurs `ref` distinctes (ils ne partagent plus de sous-arbre DOM).',"**Surcouche carte \xab compl\xe8te \xbb** (variante `default` de `KronoFocusPanel`) align\xe9e sur le m\xeame pattern portail pour rester coh\xe9rente.",'**`useAnchoredFloatingPortalStyle`** (`components/dashboard/useAnchoredFloatingPortalStyle.ts`) gagne l’alignement **`"center"`** en plus de `start` / `end` : le panneau portail peut maintenant \xeatre centr\xe9 horizontalement sous son d\xe9clencheur. Les autres consommateurs (`PageRefreshButton`, `PlainHelpPopover`, `TagsHelpTrigger`, `InlineMetricHelpTrigger`) conservent leurs alignements existants ; le hook continue de g\xe9rer la contrainte au viewport (marge 10 px) et le **basculement au-dessus** du d\xe9clencheur s’il manque de place en bas.',"**Guide utilisateur** : `lib/userGuideCopy.ts` et `docs/USER_GUIDE.md` (FR/EN) — note explicite sur le repli en plusieurs rang\xe9es de la barre d’outils sur \xe9cran \xe9troit ; en-t\xeate de version pointe **`1.0.0-beta.22`**.","**Impl\xe9mentation** : `lib/implementationNotes.ts` (FR + EN, `lastUpdated`) ; `docs/IMPLEMENTATION_DETAILS.md` — date d’en-t\xeate et note sur le pattern \xab portail + `position: fixed` \xbb pour les surcouches ancr\xe9es \xe0 des \xe9l\xe9ments d’en-t\xeate (\xe9vite la propagation au `scrollableOverflow` du `<body>`).","**D\xe9p\xf4t** : `README.md` (r\xe9f\xe9rence de version npm).","Bump applicatif : **`1.0.0-beta.22`** (`package.json`, `package-lock.json`) ; **CHANGELOG** usager r\xe9g\xe9n\xe9r\xe9 (`npm run changelog:build`)."]},{version:"1.0.0-beta.21",items:["**Parsing** : `findProjectTokens` (`lib/taskParsing.ts`) reconna\xeet d\xe9sormais **`!projet`** et **`!projet#sous-\xe9tiquette`** lorsque le **`!`** suit **directement** un caract\xe8re autoris\xe9 (sans espace avant le sigil), sur le m\xeame principe que les **`#\xe9tiquettes`** \xab coll\xe9es \xbb au mot pr\xe9c\xe9dent. Les jetons **`@`** restent limit\xe9s \xe0 une **fronti\xe8re d\xe9but de cha\xeene ou espace** afin d’\xe9viter les faux positifs (ex. adresses courriel du type `contact@domaine`).","**Effet** : la modification d’un libell\xe9 du type `Courrier!perso#dentiste` met correctement \xe0 jour **`project`**, **`personalProject`** et les **\xe9tiquettes** persist\xe9es (y compris via **`updateTask`**), ce qui aligne le **reporting** (\xe9tiquettes, ventilation par projet selon le scope) sur l’intention utilisateur.","**Guide utilisateur** : `lib/userGuideCopy.ts` et `docs/USER_GUIDE.md` (FR/EN) — pr\xe9cision sur l’espace optionnel avant **`!`** ; en-t\xeate et exemples de livraison pointent **`1.0.0-beta.21`**.","**Impl\xe9mentation** : `docs/IMPLEMENTATION_DETAILS.md` (r\xe8gle de fronti\xe8re `!` / `@`) ; `lib/implementationNotes.ts` (version affich\xe9e et d\xe9tail parsing scoped `!`).","**D\xe9p\xf4t** : `README.md` (r\xe9f\xe9rence de version npm).","**Tests** : `lib/taskParsing.test.ts` — cas `Courrier!perso#dentiste` ; attentes **`personalProject`** pour `parseQuickAddTagOrProjectLine` / `buildStartTaskFromInput` lorsqu’un projet est pr\xe9sent.","Bump applicatif : **`1.0.0-beta.21`** (`package.json`, `package-lock.json`) ; **CHANGELOG** usager r\xe9g\xe9n\xe9r\xe9 (`npm run changelog:build`)."]},{version:"1.0.0-beta.20",items:["**D\xe9pendances runtime** : `@types/node`, `@types/react` et `@types/react-dom` pass\xe9es en **`dependencies`** avec `typescript` — Next.js 16 exige ces paquets pour la phase \xab Running TypeScript \xbb du `next build` ; une installation **`npm install --omit=dev`** ne les omet plus (\xe9vite le message *It looks like you're trying to use TypeScript…* hors environnement de d\xe9veloppement complet).","**Contenu du tarball publi\xe9** : suppression du champ **`files`** dans `package.json` (il neutralisait **`.npmignore`**, comportement **npm-packlist**) ; filtrage du paquet via **`.npmignore`** (fichiers `*.test.*` / `*.spec.*`, dossiers `e2e/`, `test/`, `docs/`, outils CI, etc.) en conservant les sources n\xe9cessaires au build.","Bump applicatif : **`1.0.0-beta.20`** (`package.json`, `package-lock.json`) ; **CHANGELOG** usager r\xe9g\xe9n\xe9r\xe9 (`npm run changelog:build`)."]},{version:"1.0.0-beta.19",items:["**Affichage planifi\xe9** : regroupement sous **Planifi\xe9es**, styles distincts (section, fond, point d’\xe9tat) ; **suppression des pastilles texte** \xab planifi\xe9 \xbb sur les cartes t\xe2che et les lignes de session. T\xe2che **non termin\xe9e** dont le **d\xe9but** (`startTime`) est encore **futur** : pas de minuteur \xab en direct \xbb. T\xe2che **termin\xe9e** : regroupement planifi\xe9 seulement si **d\xe9but et fin** parseables sont **tous deux** strictement futurs — une **fin** future seule ne retient plus la carte sous Planifi\xe9es lorsque le d\xe9but est d\xe9j\xe0 pass\xe9 (`isTaskDisplayPlanned`). Session live \xe0 **startAt** futur : ligne distincte dans la liste ; d\xe9compte planifi\xe9es sur la carte session ; tiroir AppShell sans ces entr\xe9es comme suivi actif.","**Fronti\xe8re planifi\xe9 → en cours** : lorsqu’une t\xe2che rejoint les minuteurs **en cours** alors qu’**au moins un** autre minuteur \xe9tait d\xe9j\xe0 visible comme en cours, une **modale** (pause / terminer / parall\xe8le, m\xeame m\xe9morisation que le d\xe9marrage manuel) s’applique aux t\xe2ches d\xe9j\xe0 au minuteur ; hors route `/`, l’ic\xf4ne **Tableau de bord** peut **pulser**.","**Modales globales** : correction d’un d\xe9calage de positionnement lors des transitions de route ; l’animation de conteneur ne transporte plus de `transform`, ce qui r\xe9tablit l’ancrage viewport des modales en `position: fixed`.","**Horloge murale** permanente dans la barre d’outils : fuseau IANA et format 12/24 h des param\xe8tres **Tableau de bord web**, tick chaque seconde ; correctif d’**hydratation** SSR/CSR sur les secondes au premier rendu.","**S\xe9lecteurs date/heure** : bouton **crochet** pour valider et fermer le calendrier ; pr\xe9remplissage **d\xe9but** avec minutes `:00` (bouton **Today** idem) ; **Now** \xe0 l’instant exact ; champs de **fin** arrondis \xe0 la **demi-heure** suivante (**Today** inclus).","**Heure de fin planifi\xe9e** (t\xe2che ou session) : clignotement doux entre 15 et 5 minutes restantes, puis plus rapide jusqu’\xe0 0.","**Colonne t\xe2ches** : suppression d’une troncature visuelle pendant l’animation d’ouverture ; d\xe9filement correct sur les listes longues.","**Installation desktop / PWA** : priorit\xe9 **512x512** + r\xf4le `maskable` pour l’ic\xf4ne install\xe9e.","**Jeton `!`** : en parall\xe8le de `@projet`, le libell\xe9 de t\xe2che accepte **`!projet`** et les \xe9tiquettes sous port\xe9e **`!projet#sous-\xe9tiquette`** ; le moteur distingue **`personalProject`** sur les t\xe2ches et maintient **`knownPersonalProjects`** sur le payload (liste distincte de `knownProjects`).","**Actions** : `startTask`, `addHistoricalTask`, `updateTask`, `saveTaskTemplate` ; renommage serveur avec **`renameProjectMetadata`** et **`personalOnly`** (pas encore d’inline Param\xe8tres d\xe9di\xe9 aux listes `!`).","**UI** : pastilles et suggestions **rose** pour le personnel (`taskFieldStyles`, `TaskFocusPanel`, `TaskSessionLiveCard`, `SavedProjectPicker`, `TagPills`) ; **Gantt** d’une t\xe2che : barres et **totaux s\xe9par\xe9s** temps productif (`@`) vs personnel (`!`).","**Rapports** : les grilles \xab par projet \xbb utilisent par d\xe9faut le scope **`work`** (`aggregateProjectTaskMinutesByDay`) — le temps `!` n’y est pas m\xe9lang\xe9 ; les scopes **`personal`** / **`all`** existent dans `lib/reportingAggregate.ts` pour une future vue UI d\xe9di\xe9e.","**Qualit\xe9** : tests unitaires sur les mod\xe8les avec projet personnel (`lib/taskTemplateDraft.test.ts`) ; pas de parcours E2E Playwright d\xe9di\xe9 aux jetons `!` dans cette version.","**Guide utilisateur** : `lib/userGuideCopy.ts` et `docs/USER_GUIDE.md` (FR/EN) — convention **`#` / `@` / `!`**, rapports (grilles projet `@` sans m\xe9langer `!`), limite actuelle c\xf4t\xe9 Param\xe8tres pour les projets personnels.","**Impl\xe9mentation** : `lib/implementationNotes.ts` (user stories et coches int\xe9gration/E2E) ; **`docs/IMPLEMENTATION_DETAILS.md`** — section projets personnels et scopes reporting.","**Changelog usager** : r\xe9g\xe9n\xe9ration via `npm run changelog:build` (`lib/generatedUserChangelog.ts`).","**Paquet npm** : version **`1.0.0-beta.19`** ; script **`prepublishOnly`** = `npm run build` avant `npm publish` sur `@nightkatana/kronosys-app`."]},{version:"1.0.0-beta.18",items:["Nouveaut\xe9s — Sauvegarde/restauration: ajout de l’API `POST /api/restore` (import `json` ou `sqlite`) avec couverture d’int\xe9gration d\xe9di\xe9e.","Nouveaut\xe9s — User stories in-app: ajout de la page **Impl\xe9mentation** (`/implementation`) avec inventaire exhaustif ✓/✗, checklist locale \xab revue \xbb et acc\xe8s direct au changelog usager.","Nouveaut\xe9s — Mod\xe8les de t\xe2che: section d\xe9di\xe9e dans Param\xe8tres, cr\xe9ation depuis une t\xe2che, suggestions \xab Mod\xe8le : \xbb dans la saisie, disponibilit\xe9 dans la palette **Spotlight**.","Nouveaut\xe9s — Vue **Gantt du jour**: modal timeline globale des intervalles de t\xe2ches sur les sessions de la journ\xe9e.","Nouveaut\xe9s — Pause globale contextuelle: modal de confirmation enrichie avec r\xe9sum\xe9 d\xe9taill\xe9 (murale, temps actifs/codage, compteurs t\xe2ches/sous-t\xe2ches, ventilation minuteurs).","Nouveaut\xe9s — Nom de session par d\xe9faut: gabarit configurable (`%UUID` + tokens `strftime`) appliqu\xe9 \xe0 la cr\xe9ation de session.","Am\xe9liorations — Tableau de bord: en-t\xeate AppShell consolid\xe9 (m\xe9tadonn\xe9es de session, placeholder commande, navigation), transitions de route et coh\xe9rence inter-pages accrues.","Am\xe9liorations — Reporting: ajout du temps non concurrent par jour, ventilation des sessions par type de cl\xf4ture, aides m\xe9triques et pr\xe9cision accrue des agr\xe9gats.","Am\xe9liorations — Sessions/t\xe2ches: consolidation des statistiques lat\xe9rales, gestion des notes et meilleure continuit\xe9 live/historique.","Am\xe9liorations — Param\xe8tres: \xe9volution des sections \xc9tiquettes/Projets/Mod\xe8les et meilleure ergonomie des flux de configuration.","Qualit\xe9 — Tests: renforcement substantiel de la couverture (unitaires + int\xe9gration + E2E) sur restore API, templates, Gantt, pause globale, agr\xe9gats reporting et flux session/t\xe2che.","Documentation — Guide utilisateur synchronis\xe9 pour `beta.18` sur les deux surfaces (`/guide` et `docs/USER_GUIDE.md`), Spotlight harmonis\xe9, page `/implementation` et `docs/IMPLEMENTATION_DETAILS.md` align\xe9s.","Maintenance — Bump applicatif vers `1.0.0-beta.18` (`package.json`, `package-lock.json`) et r\xe9g\xe9n\xe9ration du changelog usager (`lib/generatedUserChangelog.ts`)."]},{version:"1.0.0-beta.17",items:["Nouveaut\xe9s — Notes libres: ajout d’une **note de t\xe2che** et d’une **note de session** (texte libre) pour documenter le contexte de travail directement sur l’activit\xe9 concern\xe9e.","Am\xe9liorations — Tableau de bord: la note de t\xe2che est affich\xe9e **avant** la liste des sous-t\xe2ches pour garder le contexte visible pendant la d\xe9composition.","Am\xe9liorations — Sessions et archives: aper\xe7u de note de session (ic\xf4ne + extrait) dans la liste des sessions et dans la liste des sessions archiv\xe9es.","Qualit\xe9 — Tests: ajout de tests unitaires UI pour l’ordre d’affichage note/sous-t\xe2ches et la pr\xe9sence de l’aper\xe7u de note en liste de sessions, en plus des tests serveur sur la persistance des notes.","Documentation — Mise \xe0 jour du guide utilisateur (in-app + d\xe9p\xf4t) et des d\xe9tails d’impl\xe9mentation pour les notes de t\xe2ches/sessions.","Nouveaut\xe9s — Planification d’heure de fin sur les **t\xe2ches en cours** : d\xe9finir une heure de fin programme l’\xe9ch\xe9ance et met automatiquement le minuteur en pause lorsqu’elle est atteinte.","Nouveaut\xe9s — Planification d’heure de fin sur la **session live** : d\xe9finir une heure de fin agit comme \xe9ch\xe9ance de session et met automatiquement en pause la dur\xe9e murale \xe0 l’instant pr\xe9vu.","Am\xe9liorations — Tableau de bord : le s\xe9lecteur **Fin** est disponible aussi sur t\xe2ches/sessions en cours (plus seulement sur les \xe9l\xe9ments d\xe9j\xe0 termin\xe9s), avec affichage de l’\xe9ch\xe9ance planifi\xe9e.","Qualit\xe9 — Tests : renforcement de la couverture (dispatch + hydratation minuteurs/session) pour les sc\xe9narios planifi\xe9s et les cas d’\xe9ch\xe9ance d\xe9pass\xe9e.","Documentation — Guide utilisateur et d\xe9tails d’impl\xe9mentation mis \xe0 jour pour expliciter la diff\xe9rence \xab fin r\xe9elle \xbb vs \xab fin planifi\xe9e (auto-pause) \xbb.","Nouveaut\xe9s — \xc9tiquettes et projets : renommage **inline** dans la colonne droite du tableau de bord (\xe9dition en place, validation **Entr\xe9e**, annulation **\xc9chap**).","Am\xe9liorations — Confirmation de renommage : avertissement explicite sur l’impact reporting + option \xab ne plus afficher \xbb m\xe9moris\xe9e localement.","Qualit\xe9 — UX : suppression des ambigu\xeft\xe9s d’actions (pas de bouton de sauvegarde en double pendant le renommage inline)."]},{version:"1.0.0-beta.16",items:["Nouveaut\xe9s — Page Impl\xe9mentation (`/implementation`) avec inventaire exhaustif des user stories (✓ livr\xe9 \xb7 ✗ absent/hors p\xe9rim\xe8tre), checklist locale \xab revue \xbb et acc\xe8s direct au changelog usager.","Nouveaut\xe9s — Documentation technique d’impl\xe9mentation ajout\xe9e dans `docs/IMPLEMENTATION_DETAILS.md` (mod\xe8le temps session murale vs minuteurs de t\xe2ches, pauses, reporting, architecture et maintenance).","Nouveaut\xe9s — Mod\xe8les de t\xe2che: sauvegarde depuis une t\xe2che, suggestions \xab Mod\xe8le: \xbb dans la saisie, pr\xe9sence dans la palette `Ctrl+K`, gestion d\xe9di\xe9e dans Param\xe8tres.","Nouveaut\xe9s — Pause globale contextuelle avec modale de confirmation et aper\xe7u d\xe9taill\xe9 (murale, temps actif/codage, compteurs t\xe2ches/sous-t\xe2ches, ventilation des minuteurs).","Nouveaut\xe9s — Vue Gantt du jour: frise des intervalles de t\xe2ches sur l’ensemble des sessions de la journ\xe9e.","Nouveaut\xe9s — Nom de session par d\xe9faut avec gabarit configurable (`%UUID` + tokens `strftime`) dans les param\xe8tres.","Nouveaut\xe9s — Restauration locale via `POST /api/restore` (`json` ou `sqlite`) en compl\xe9ment de `GET /api/backup`.","Am\xe9liorations — Reporting: ajout du temps non concurrent par jour, ventilation des sessions par type de cl\xf4ture, m\xe9triques d’assiduit\xe9 quand une heure pr\xe9vue est fournie.","Am\xe9liorations — Spotlight: la palette de recherche rapide est d\xe9sormais explicitement nomm\xe9e \xab Spotlight \xbb dans l’interface.","Qualit\xe9 — Tests: ajout/renforcement des parcours E2E et tests unitaires (impl\xe9mentation, templates, pause globale, restauration API, agr\xe9gats).","Documentation — Guide utilisateur: mise \xe0 jour compl\xe8te in-app + d\xe9p\xf4t, et alignement des cha\xeenes FR/EN (dashboard, reporting, param\xe8tres, licences, impl\xe9mentation)."]},{version:"1.0.0-beta.15",items:["Ajout de la commande de version CLI: `kronosys --version` affiche d\xe9sormais la version install\xe9e.","Ajout des alias `kronosys -v` et `kronosys version` pour afficher la version install\xe9e."]},{version:"1.0.0-beta.14",items:["Ajout de la page **Impl\xe9mentation** (`/implementation`) avec inventaire exhaustif des user stories livr\xe9es ou hors p\xe9rim\xe8tre.","Ajout des **mod\xe8les de t\xe2che** (cr\xe9ation depuis une t\xe2che, gestion dans Param\xe8tres, recherche rapide Ctrl+K).","Ajout d’une **pause globale contextuelle** avec modale de confirmation et aper\xe7u des dur\xe9es associ\xe9es.","Ajout de la vue **Gantt du jour** pour visualiser les intervalles de t\xe2ches de la session affich\xe9e."]},{version:"1.0.0-beta.13",items:["Version interm\xe9diaire de stabilisation (pas de nouveaut\xe9 utilisateur majeure document\xe9e)."]},{version:"1.0.0-beta.12",items:["Correctif du runtime CLI: installation des d\xe9pendances avec `--ignore-scripts` pour \xe9viter les erreurs Husky hors d\xe9p\xf4t."]},{version:"1.0.0-beta.11",items:["Correctif Windows du lanceur CLI (PowerShell + installation runtime locale).","Rebuild explicite de `better-sqlite3` dans le runtime local."]},{version:"1.0.0-beta.10",items:["Correctif de dispatch des commandes Windows pour le runtime CLI."]},{version:"1.0.0-beta.9",items:["Correctif de quoting des commandes Windows dans le lanceur CLI."]},{version:"1.0.0-beta.8",items:["Correctif initial Windows du launcher (`npm.cmd`/`npx.cmd`)."]},{version:"1.0.0-beta.7",items:["Stabilisation du packaging b\xeata et g\xe9n\xe9ration des archives de distribution."]},{version:"1.0.0-beta.6",items:["Correctif de r\xe9solution d’alias d’import (`@/...`) pour le build de production."]},{version:"1.0.0-beta.5",items:["Retour temporaire au mode build \xe0 la premi\xe8re ex\xe9cution pour am\xe9liorer la compatibilit\xe9 multiplateforme."]},{version:"1.0.0-beta.4",items:["Ajustements de packaging et de lancement CLI pour la s\xe9rie b\xeata."]},{version:"1.0.0-beta.2",items:["Correctif des d\xe9pendances de build n\xe9cessaires au runtime CLI."]},{version:"1.0.0-beta.1",items:["`kronosys` lance maintenant le build de production automatiquement si `.next` est absent."]},{version:"1.0.0-beta.0",items:["Premi\xe8re version b\xeata publi\xe9e."]},{version:"0.1.1",items:["Added an in-app user CHANGELOG page (`/changelog`).","Added an update modal on Dashboard startup that opens the CHANGELOG after a version change.","Added browser-local tracking of the last seen app version to show update notes once per version."]}],n={title:"User CHANGELOG",subtitle:"This page lists user-visible changes after each software update.",empty:"No changelog entry is available yet.",entries:a},i={title:"CHANGELOG usager",subtitle:"Cette page liste les changements visibles c\xf4t\xe9 utilisateur apr\xe8s chaque mise \xe0 jour du logiciel.",empty:"Aucune entr\xe9e de changelog n’est encore disponible.",entries:a};function r(e){return"fr"===e?i:n}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[840],{9840:(e,t,s)=>{s.d(t,{J:()=>r});let a={title:"Settings",subtitle:"Kronosys options stored locally on this machine.",loading:"Loading settings…",reload:"Reload from server",save:"Save",saving:"Saving…",savedOk:"Settings saved.",settingsUnsavedStickyHint:"You have unsaved changes.",resetToDefaults:"Reset to defaults",resetToDefaultsConfirm:"Restore every Kronosys option to its factory default? Stored GitLab tokens and MongoDB connection flags are not removed from secure storage; only the settings shown on this page are reset.",resettingDefaults:"Resetting…",resetDefaultsDone:"Defaults applied.",openIdeSettings:"These fields map to persisted configuration keys in the local store.",tocHeading:"On this page",tocNavAriaLabel:"Jump to a settings section",tocSearchPlaceholder:"Filter table of contents…",tocSearchAriaLabel:"Filter settings sections in the table of contents",tocSearchNoResults:"No section title matches.",sectionUsageProfile:"Usage profile",usageProfile:"Profile",usageProfileDesc:"Developer: lines written, per-language stats, coding-signal counts, workspace LOC snapshot, and Git repo card. Manager: tasks, sessions, KronoFocus, and time only — no code-linked metrics or UI.",profileDeveloper:"Developer",profileManager:"Manager",workspaceLocSectionHiddenManager:"These options apply only in Developer profile (workspace code snapshot on Reporting).",sectionGeneral:"General",sectionPrivacy:"Privacy",sectionKronoFocus:"KronoFocus (dashboard)",kronoFocusHeaderPinnedNote:"The KronoFocus timer and controls always stay in the app header toolbar (next to the clock and command palette) so the navigation bar keeps the same width on every page. While you inspect an archive, the controls stay visible but target the live session.",kronoFocusShowInTaskOps:"Show in task action buttons",kronoFocusShowInTaskOpsDesc:"KronoFocus start on active tasks and the optional “start KronoFocus with new task” toggle in the task launcher.",sectionTaskTags:"Tasks & tags",taskDefaultTagBucketEnabled:"Implicit default tag for tasks without #tags",taskDefaultTagBucketEnabledDesc:"When enabled, any task with no hashtag labels after cleanup is stored with the reserved default bucket (shown as “default” in English or “d\xe9faut” in French). When disabled, such tasks keep an empty label list until you add one.",taskStripDefaultTagWhenExplicitTags:"Drop default tag when another #tag is added",taskStripDefaultTagWhenExplicitTagsDesc:"When enabled, as soon as a task carries at least one explicit hashtag label other than the reserved default bucket, the default label is removed automatically. When disabled, default can stay alongside other labels.",taskMinimumDurationMinutes:"Minimum task duration (minutes)",taskMinimumDurationMinutesDesc:"Default span for past or planned task entry: the end time is prefilled as start plus this many minutes (e.g. 30 or 60). Range: 15–480.",dashboardAllowTaskStartTimeEdit:"Allow task start-time correction in the dashboard",dashboardAllowTaskStartTimeEditDesc:"Shows controls to edit a task start time from the Tasks column while it is running or after it is completed.",dashboardAllowSessionStartTimeEdit:"Allow session start-time correction in the dashboard",dashboardAllowSessionStartTimeEditDesc:"Shows controls to edit a session start time from the Sessions column for the live session or a historical session.",dashboardAllowTaskEndTimeEdit:"Allow task end-time correction in the dashboard",dashboardAllowTaskEndTimeEditDesc:"Shows controls to set or edit task end time in the Tasks column, including while a task is running (the task completes automatically when that planned end is reached).",dashboardAllowSessionEndTimeEdit:"Allow session end-time correction in the dashboard",dashboardAllowSessionEndTimeEditDesc:"Shows controls to set or edit a session end time in the Sessions column, including while a live session is open (the session closes automatically when that planned end is reached).",sectionCollection:"Collection & buffers",sectionHistory:"Session history",sectionDangerZone:"Danger zone",dangerClearHistoryTitle:"Clear all local dashboard data",dangerClearHistoryBodyIntro:"Permanently removes, in this dashboard’s local store:",dangerClearHistoryBodyBullets:["Every session (live view, history list, and archived list) and the session you were inspecting","All tag & project shortcuts: pinned tags, tags hidden from chips, tag/project descriptions, known tag & project suggestion lists","Git identity saved here (display name, email, forge login) and the Git statistics card data","The cached workspace lines-of-code snapshot used on Reporting (Developer profile)","The “skip archive confirm” preference for this dashboard","The browser’s saved dashboard language and explicit language choice (you will pick English or Fran\xe7ais again before the guided tour)"],dangerClearHistoryBodyAfterList1:"Afterwards, the welcome guided tour will be offered again on the dashboard, and the “show welcome on startup” option is turned back on in settings.",dangerClearHistoryBodyAfterList2:"This cannot be undone.",dangerClearHistoryButton:"Clear all local data…",dangerClearHistoryConfirm:"You are about to erase everything listed in the danger-zone description above (sessions, tags/projects metadata, Git identity in this store, etc.). Continue?",dangerClearHistoryVaultTargetTitle:"Vault targeted by this erase",dangerClearHistoryVaultTargetTrace:"Erase applies to the directory forced by TRACE_DATA_DIR: {path}. No other Kronosys vault is involved.",dangerClearHistoryVaultTargetDual:"Erase applies only to the {env} vault currently loaded by this server ({path}). The {otherEnv} vault ({otherPath}) is not modified.",dangerClearHistoryVaultTargetSingle:"Erase applies to the data directory currently loaded by this server ({path}).",dangerClearHistoryVaultTargetDev:"Erase applies to the development data directory currently loaded by this server ({path}), not the packaged production vault unless you explicitly share it.",dangerClearHistoryVaultMismatch:"Note: your saved preference points to {preferredEnv} ({preferredPath}) after restart, but this process is still using {activePath}. The erase will affect the directory in use now.",dangerClearHistoryConfirmPhrase:"DELETE",dangerClearHistoryTypeInstruction:"To enable “Confirm”, type {phrase} exactly below (all capitals, no spaces).",dangerClearHistoryTypeFieldLabel:"Confirmation word",dangerClearHistoryTypeInputAria:"Type the confirmation word to allow the full erase described above (sessions, metadata, Git identity, etc.)",dangerClearHistoryBackupIntro:"Before you confirm, you can download a local backup (same data the dashboard uses on this machine):",dangerClearHistoryBackupJson:"JSON — full state snapshot",dangerClearHistoryBackupJsonHint:"Entire persisted Kronosys payload in one file (sessions including live `current`, tasks, tag/project metadata, Git identity, `cfg`, Git stats snapshot, workspace LOC snapshot, etc.).",dangerClearHistoryBackupCsvBlockTitle:"CSV — multiple tables (one download per link)",dangerClearHistoryBackupCsvBlockHint:"Together these tables mirror what the danger-zone erase removes: sessions (with a full JSON column per row), every task and subtask, tag/project lists and descriptions, Git identity, plus configuration and JSON blobs (`cfg`, Git stats, workspace code snapshot, inspecting session id, etc.).",dangerClearHistoryBackupCsvZip:"CSV — all tables (ZIP)",dangerClearHistoryBackupCsvZipHint:"One download containing the eight UTF-8 CSV files.",dangerClearHistoryBackupCsvSeparateTitle:"Individual files (optional)",dangerClearHistoryBackupCsvSessions:"Sessions — extended metrics + full session JSON",dangerClearHistoryBackupCsvTasks:"Tasks — one row per task + full task JSON",dangerClearHistoryBackupCsvSubtasks:"Subtasks — one row per checklist item + JSON",dangerClearHistoryBackupCsvRegistry:"Tag & project registry — known / pinned / hidden lists",dangerClearHistoryBackupCsvTagDesc:"Tag descriptions",dangerClearHistoryBackupCsvProjectDesc:"Project descriptions",dangerClearHistoryBackupCsvGitId:"Git identity (saved in this store)",dangerClearHistoryBackupCsvStoreBlobs:"Config & snapshots — `cfg`, Git stats, workspace LOC, UI prefs",dangerClearHistoryBackupSqlite:"SQLite — database file",dangerClearHistoryBackupSqliteHint:"Raw kronosys.sqlite after a WAL checkpoint (restore by replacing the file when the app is stopped).",dangerBackupRestoreTitle:"Backups and full restore",dangerBackupRestoreIntro:"Download a full backup first, then restore from a previous backup file when needed (JSON snapshot or SQLite file).",dangerRestorePickFile:"Restore file (`.json` or `.sqlite`)",dangerRestoreHint:"Restoring replaces the current local store on this machine. Create a backup right before restoring if you are unsure.",dangerRestoreButton:"Restore from backup…",dangerRestoreBusy:"Restoring…",dangerRestoreConfirm:"Restore this backup file now? The current local data store will be replaced for this environment.",dangerRestoreNoFile:"Choose a backup file before starting restore.",dangerRestoreDoneJson:"Restore completed from JSON snapshot. The dashboard data has been reloaded.",dangerRestoreDoneSqlite:"Restore completed from SQLite file. The dashboard data has been reloaded.",dangerRestoreFailed:"Restore failed: {detail}",sectionArchivedSessions:"Archived sessions",archivedSessionsIntro:"Sessions hidden from the main dashboard list, newest first. Restore adds them back to the Sessions column.",archivesPaginationPrev:"Previous page",archivesPaginationNext:"Next page",archivesPaginationNavAria:"Archived sessions pagination",archivesPaginationRange:"{from}–{to} of {total}",sectionExport:"Export defaults",sectionGit:"Git sync",sectionMongo:"MongoDB mirror",sectionWeb:"Dashboard & API",devDataBlockTitle:"Development mode (local data store)",devDataIntro:"While you run the Next.js dev server (`next dev`), SQLite and local state use a separate folder (`…/v4-dev` by default) from the production build (`next start`, `…/v4`) so you do not overwrite your real data. Save with the main **Save** button at the bottom of this page, like any other setting.",devDataUseProdLabel:"Use the same data directory as production (v4)",devDataUseProdDesc:"When off (default), dev uses an isolated `v4-dev` directory. When on, dev reads and writes the same `v4` path as a packaged or `next start` run. After changing this, restart the dev server so it opens the right database file.",devDataActivePath:"Data directory in use (this process)",devDataPreferredPath:"Would apply after restart",devDataProdPath:"Default production directory (v4)",devDataPrefsFile:"Preference file on disk",devDataTraceOverride:"The server was started with TRACE_DATA_DIR; that path is used and this toggle is disabled.",devDataEnvOverride:"The environment variable KRONOSYS_DEV_USE_PROD_DATA is set; the dev server uses the production v4 path and this toggle is disabled.",devDataRestartHint:"Your saved preference no longer matches the open database. Restart the Next.js dev server to apply it.",devDataHiddenNotDev:"This block is only shown when the dashboard is served in development mode (`next dev`).",dataEnvBlockTitle:"Production and QA data stores",dataEnvIntro:"Keep your real sessions in the production folder (`…/v4`) and use a separate QA folder (`…/v4-qa`) to try features or reproduce issues without touching production data. Enable both stores below, then switch with **Prod / QA** in the navigation bar (immediate) or change the active environment here and **Save**.",dataEnvDualLabel:"Enable separate production and QA data stores",dataEnvDualDesc:"When on, SQLite and local state use either `v4` (production) or `v4-qa` (QA) depending on the active environment. When off, only the production store is used.",dataEnvActiveLabel:"Active environment",dataEnvActiveDesc:"Folder opened by this server process. You can also switch from the navigation bar without opening Settings.",dataEnvActiveProduction:"Production (v4)",dataEnvActiveQa:"QA (v4-qa)",dataEnvActivePath:"Data directory in use (this process)",dataEnvPreferredPath:"Saved preference (should match when in sync)",dataEnvProdPath:"Production directory (v4)",dataEnvQaPath:"QA directory (v4-qa)",dataEnvPrefsFile:"Preference file on disk",dataEnvTraceOverride:"The server was started with TRACE_DATA_DIR; that path is used and these options are disabled.",dataEnvRestartHint:"Your saved environment no longer matches the open database. Restart the Kronosys server to apply it.",sectionWorkspaceLoc:"Reporting — workspace code snapshot",sectionTagsProjects:"Tags & saved projects",sectionTaskTemplates:"Task templates",taskTemplatesIntro:"Saved lines for the “what are you working on” field (title, optional #tags and @project). You can still save a template from an active or completed task on the dashboard.",taskTemplatesHelpAria:"Help: task templates",taskTemplatesHelpBody:"Templates only prefill the task draft — they do not start a timer or change recorded tasks.\n\nUse the same syntax as on the dashboard: a title, optional #tags, optional @project. Editing or deleting a template does not modify existing sessions or tasks.",taskTemplatesEmpty:"No task templates yet. Add one above or save one from the dashboard.",taskTemplatesDraftPlaceholder:"e.g. Deep work #focus @acme",taskTemplatesAddBtn:"Add template",taskTemplatesSavedToast:"Task template saved.",taskTemplatesRemovedToast:"Task template removed.",taskTemplatesUpdatedToast:"Task template updated.",taskTemplatesColDraft:"Template",taskTemplatesColUpdated:"Updated",taskTemplatesColActions:"Actions",taskTemplatesEditBtn:"Edit template",taskTemplatesSaveBtn:"Save changes",taskTemplatesCancelBtn:"Cancel",taskTemplatesDeleteBtn:"Delete template",taskTemplatesDeleteConfirm:"Remove this task template from the saved list?",tagsProjectsIntro:"Manage global tags, saved projects, and project-linked tags separately. The same controls appear in the right column on the main dashboard. Actions here do not bulk-edit tasks or session files.",tagsProjectsHelpAria:"Help: impact of tag and project changes",tagsProjectsHelpBody:"This page is split into three areas: global tags (no project), saved projects, then project-linked tags grouped under each project.\n\nHide (eye-off icon): the tag no longer appears in suggestion chips. Tasks are unchanged.\n\nDelete permanently (trash icon): removes the tag from pinned and hidden lists and clears its description. Tasks are unchanged.\n\nPin icons: manage your pinned shortcut list.\n\nProject-scoped tags: use @Project#code in a task title (stored as Project#code). Suggestion chips only show that code when the task’s project matches Project.\n\nDescriptions: optional local notes; tooltips on dashboard chips.\n\nDelete project (trash): removes the project from the saved list, clears its description, and purges metadata for tags stored as Project#… under that project. Tasks are unchanged.",tagsGlobalHeading:"Global tags (no project)",tagsGlobalIntro:"Shortcuts for tags that are not tied to a specific project. They are suggested on every task, regardless of @project.",tagsByProjectHeading:"Project-linked tags",tagsByProjectIntro:"Each block is a project key; tags stored as Project#code appear under that project. Pin, hide, and descriptions are still per tag.",tagsByProjectOrphanIntro:"Project#code scopes that do not match any saved project above. Pin or edit them here, or add the project to the list first.",tagsByProjectOrphanHelpAria:"Help: project-linked tags without a matching saved project",tocSubTagsGlobal:"Global tags",tocSubTagsProjects:"Projects",tocSubTagsByProject:"Tags by project",tagsHiddenHeading:"Hidden from shortcuts",tagsPinFieldLabel:"Pin a global tag",tagsPinPlaceholder:"e.g. bugfix or deep-work",tagsPinScopedFieldLabel:"Pin a project-linked tag",tagsPinScopedPlaceholder:"e.g. 204822-1530 or ClientABC#204822-1530",tagsPinAddBtn:"Pin",tagsTableTagCol:"Tag",tagsTableActionsCol:"Actions",tagBadgePinned:"Pinned",tagPinBtn:"Add tag to pinned shortcuts",tagUnpinBtn:"Remove tag from pinned shortcuts",tagExcludeBtn:"Hide tag from suggestion shortcuts",tagRestoreBtn:"Show tag in shortcuts again",tagPurgeAriaLabel:"Delete tag metadata permanently",tagPurgeConfirm:"Permanently delete this tag’s metadata? Its description will be cleared, it will be unpinned, and it will be hidden from dashboard tag lists (it appears under “Hidden from shortcuts” if tasks still reference it). Tasks are not modified.",tagPurgeHiddenConfirm:"Remove this tag from the hidden list and clear its description? If tasks still use it, it can show again in shortcuts. Tasks are not modified.",tagPurgeHiddenAriaLabel:"Permanently delete this hidden tag’s metadata",tagRenameBtn:"Rename tag",tagRenamePrompt:"New tag name",tagRenameImpactConfirm:"Rename this tag everywhere? Reporting and historical task breakdowns will now use the new name. Existing sessions and task entries will be updated.",renameImpactDontShowAgain:"Remember this choice and don’t show again",tagUnpinConfirm:"Remove this tag from your pinned list? It may still appear if used on tasks.",tagExcludeConfirm:"Hide this tag from dashboard shortcuts? Task and session data are not changed; existing tasks keep the tag and reporting can still count it.",projectsHeading:"Saved projects",projectsIntro:"Projects you added via @project or the dashboard.",projectsHelpAria:"Help: saved projects",projectsHelpBody:"Deleting a project (trash icon) removes it from the saved list, clears its description, and purges metadata for tags stored as Project#… for that project. Tasks are not modified; any task that still references @project keeps it.",projectsAddFieldLabel:"Add a project",projectsAddPlaceholder:"e.g. ClientABC",projectsAddBtn:"Add project",projectsTableProjectCol:"Project",projectsRenameBtn:"Rename project",projectsRenamePrompt:"New project name",projectRenameImpactConfirm:"Rename this project everywhere? Reporting by project and historical task breakdowns will now use the new name. Existing sessions and task entries will be updated.",projectsRemoveBtn:"Delete project and related tag metadata",projectRemoveConfirm:"Permanently delete this project’s metadata? It will be removed from the saved list, its description cleared, and pinned/hidden/description data for tags in the form Project#… under this project will be removed. Tasks are not modified.",tagDescriptionLabel:"Description (tooltip in dashboard)",projectDescriptionLabel:"Description (tooltip in dashboard)",descriptionSaveBtn:"Save description",tagStartTrackedTaskBtn:"Start tracking a task with this tag (and project if linked)",tagStartTrackedTaskFromProjectBtn:"Start tracking a task with this project",tagStartTaskAutoSessionToast:"No active session — starting one now so your task can be tracked in this session.",tagStartTaskConflictTitle:"Tracking already active",tagStartTaskConflictMessage:"One or more tasks already have a running timer. Choose what to do with them before starting this task: finish them (moved to completed), pause them (resume later from the paused list), or keep them running and start this task in parallel.",tagStartTaskConflictPauseBtn:"Pause active tasks",tagStartTaskConflictFinishBtn:"Finish active tasks",tagStartTaskConflictParallelBtn:"Start in parallel (keep timers running)",tagStartTaskConflictDontShowAgain:"Remember this choice and don’t show this dialog again (the same action will run automatically next time).",tagsScopeToolHeading:"Tag scope migration",tagsScopeToolSourceLabel:"Source tag",tagsScopeToolTargetProjectLabel:"Target project scope",tagsScopeToolTargetGlobalOption:"Global (no project)",tagsScopeToolCopyBtn:"Copy to target scope",tagsScopeToolMoveBtn:"Move to target scope",tagsScopeToolNoTags:"No known tag available to migrate yet.",tagsEmptyGlobal:"No global tags in shortcuts yet. Pin one above or add #tags on tasks.",tagsByProjectSectionEmpty:"No project-linked tags in shortcuts yet. Use @Project#code on a task or pin one below.",tagsByProjectSubEmpty:"No linked tag for this project in shortcuts yet.",projectsEmpty:"No saved projects yet. Use @project on a task or pick a project on the dashboard.",hiddenTagsEmpty:"No tags hidden.",workspaceLocExcludedDirs:"Excluded directory name segments",workspaceLocExcludedDirsDesc:"One name per line (a single path segment, not a full path). If any segment of a file path equals a listed name, that file is skipped — for both Git-tracked lists and folder walks. Examples: node_modules, .git, .husky, .venv, dist.",workspaceLocExcludedPatterns:"Excluded path patterns",workspaceLocExcludedPatternsDesc:"One pattern per line (minimatch syntax: *, ?, **), relative to the workspace root. Examples: **/*.min.js, generated/**, **/*.gen.ts. After saving, refresh the snapshot from the Reporting page.",pickStorageFolder:"Choose folder…",hintPortRestart:"After changing the port, restart the Kronosys server process so the API listens on the new port.",hintDashboardUrl:"Display-only reference URL; does not start the Next.js server.",tocSubDashboardTour:"Guided tour",tocSubReportingTour:"Reporting tour",tocSubDashboardColumnHints:"Three-column guide",dashboardColumnHintsBlockTitle:"Three-column guide on the dashboard",dashboardColumnHintsBlockIntro:"If you removed the strip under the dashboard header (X button), restore it here. This preference is stored in the browser for this site.",dashboardColumnHintsRestoreBtn:"Show three-column guide again",dashboardColumnHintsRestoreDone:"Preference reset. Open the dashboard to see the strip.",tagsProjectsTabsAriaLabel:"Tags column sections",tagsProjectsTabGlobal:"Global tags",tagsProjectsTabProjects:"Projects & linked tags",tagsProjectsTabTemplates:"Task templates",tocSubSessionDurationAlert:"Session duration alert",tocSubDefaultSessionNameTemplate:"Default session name",dashboardSessionDurationAlertHours:"Session duration alert (hours)",dashboardSessionDurationAlertHoursDesc:"Wall-clock session duration in the dashboard sidebar: when it reaches this many hours or more, the value is shown in red with a slow blink. Default: 24. Range: 1–8760.",dashboardTourBlockTitle:"Dashboard guided tour",dashboardTourBlockIntro:"Five short steps explain sessions, tasks, tags, and shortcuts. You can reopen the tour anytime from here.",dashboardTourReplayLinkLabel:"Open dashboard and start tour",reportingTourBlockTitle:"Reporting guided tour",reportingTourBlockIntro:"Filters, KPIs, charts, and tag/project splits on the Reporting page. You can reopen this walkthrough anytime.",reportingTourReplayLinkLabel:"Open Reporting and start tour",enabled:"Enable activity collection",enabledDesc:"Global switch for activity collection.",autoStart:"Auto-start",autoStartDesc:"Start collection when the Kronosys process starts.",sectionSchedule:"Work Schedule",scheduleEnabled:"Enable automatic schedule",scheduleEnabledDesc:"Automatically start and stop tracking sessions based on your working hours.",scheduleDays:"Active days",scheduleDaysDesc:"Days of the week when auto-tracking is active.",scheduleStartTime:"Start time",scheduleEndTime:"End time",timePickerPopoverTimeLabel:"Time (24 h)",timePickerPopoverHourAria:"Hour (24 h)",timePickerPopoverMinuteAria:"Minutes",scheduleCreateDailySession:"Create daily session",scheduleCreateDailySessionDesc:"Automatically create a new session at the schedule start time for each active day.",scheduleTransferTasks:"Transfer active tasks",scheduleTransferTasksDesc:"Automatically transfer active tasks from the previous session into the new session.",schedulePauseTasks:"Pause tasks on stop",schedulePauseTasksDesc:"Automatically pause active tasks when the work schedule ends.",sectionPlannedSessions:"Specific Planned Sessions",plannedSessionsIntro:"Add specific recurring sessions. These take precedence over the general work schedule during their time block.",plannedSessionAdd:"Add planned session",plannedSessionName:"Session name",plannedSessionTags:"Tags (comma-separated)",plannedSessionProject:"Project",plannedSessionRemove:"Remove this session",showWelcome:"Welcome screen",showWelcomeDesc:"Show welcome until dismissed.",anonymizePaths:"Anonymize paths",anonymizePathsDesc:"Hash file paths before writing events.",flushInterval:"Flush interval (seconds)",flushIntervalDesc:"How often buffered events are written to storage (5–3600).",heartbeatInterval:"Heartbeat interval (seconds)",heartbeatIntervalDesc:"Minimum time between heartbeat events (30–86400).",maxBuffered:"Max buffered events",maxBufferedDesc:"Events kept in memory before trimming (100–100000).",historyPath:"History storage path",historyPathDesc:"Leave empty for the default application data directory. ~ is your home directory.",historyPartition:"History file partition",historyPartitionDesc:"How session files are split on disk.",localPersistenceDriver:"Local session storage",localPersistenceDriverDesc:"JSON keeps the legacy partitioned files. SQLite stores sessions in a single database file in the same folder; existing JSON is imported once. MongoDB mirror (if enabled) is unchanged. Restart the process after changing this.",persistenceDriverJson:"JSON files",persistenceDriverSqlite:"SQLite",localPersistenceReloadHint:"After changing the driver, restart the Kronosys process so the new setting is applied.",partitionDaily:"Daily",partitionWeekly:"Weekly",partitionMonthly:"Monthly",sessionStartMode:"When tracking starts",sessionStartModeDesc:"Continue previous session or always start fresh.",modeContinue:"Continue previous session",modeNew:"Always new session",exportFormat:"Default export format",exportFormatDesc:"Used for session history exports.",fmtJson:"JSON",fmtCsv:"CSV",fmtJira:"Jira table",fmtSap:"SAP",csvDelimiter:"CSV delimiter",csvDelimiterDesc:"Single character, e.g. , or ;",autoGitSync:"Auto Git sync",autoGitSyncDesc:"Optional: after each local save, commit and push the history folder to your remote. Session list still loads from local JSON only.",gitRemoteUrl:"Git remote URL",gitRemoteUrlDesc:"Required if auto sync is enabled.",tocSubGitIdentity:"Git author (dashboard)",gitIdentitySubheading:"Git author shown in the dashboard",gitIdentityIntro:"Stored locally with your Kronosys data (SQLite). Shown in the dashboard header next to workspace paths — this does not run git config on your machine.",gitIdentityNameLabel:"Display name",gitIdentityNameDesc:"Like git config user.name (how you want to be credited).",gitIdentityEmailLabel:"Email",gitIdentityEmailDesc:"Like git config user.email (for display only here).",gitIdentityLoginLabel:"Forge username",gitIdentityLoginDesc:"Optional: GitHub, GitLab, or other host login (not the same as the display name).",gitIdentitySave:"Save Git author",gitIdentitySaving:"Saving…",gitIdentitySavedFlash:"Git author saved.",glabRemoteSuggest:"GitLab CLI (glab) is available and a token is configured: you can create a private remote named kronosys-sessions and enable auto sync in one step.",glabRemoteCreate:"Create GitLab repo with glab",glabRemoteCreating:"Creating repository…",gitlabToken:"GitLab token",gitlabTokenDesc:"Optional personal access token for glab (private repo creation, issue list). In this dashboard, saving stores the token in local SQLite (not in the JSON state) so issue import can call GitLab; it overrides GITLAB_TOKEN from the server environment when saved. Use Test connection to enable “Import issue from Git”.",gitlabTokenSave:"Save token",gitlabTokenClear:"Clear stored token",gitlabTokenSaveNeedValue:"Paste your token in the field first — saving with an empty field does not keep a secret on this server.",gitlabTokenStoredYes:"A token is stored in the local secret store; it takes precedence over GITLAB_TOKEN when calling glab.",gitlabTokenFromEnvYes:"No stored token; glab uses GITLAB_TOKEN from the server environment.",gitlabTokenNone:"No token yet — save one below or set GITLAB_TOKEN for the dashboard server process.",gitlabInstanceUrl:"GitLab instance URL",gitlabInstanceUrlDesc:"Origin only (no /api/v4 path). Leave empty for GitLab.com. For self-managed GitLab, set your instance (e.g. https://gitlab.example.org). You can also set GITLAB_INSTANCE_URL on the server process.",gitlabTest401Help:"401 usually means the token does not match this host (wrong instance URL), or the token is expired, revoked, or missing the api scope.",gitlabTestConnection:"Test GitLab connection",gitlabTestConnectionAria:"Test GitLab API token",gitlabTestRunning:"Testing GitLab…",gitlabTestOk:"GitLab API responded successfully. Issue import is enabled in the task column.",gitlabTestFail:"GitLab API test failed. Check the token, the instance URL field above, and your network.",gitlabTestNoToken:"No token to test: paste a token in the field, save it, or ensure GITLAB_TOKEN is available to this dashboard process when using the environment token.",gitlabTestErrorGeneric:"Could not run the GitLab connection test.",gitlabApiVerifiedYes:"GitLab API: verified — task issue import is available.",gitlabApiVerifiedNo:"GitLab API: not verified — run Test connection to enable task issue import.",gitlabTestPasteStoredHint:"To test a token already saved locally, paste it temporarily in the field above (this dashboard cannot read the secret back from storage).",historyLocalFirstHint:"Session history is read from local JSON files or SQLite (see Local session storage). Git auto-sync pushes the folder after saves when enabled. MongoDB is updated only when you push sessions from the dashboard or use Resync in settings.",mongoEnabled:"MongoDB integration",mongoEnabledDesc:"When enabled, you can push individual sessions to MongoDB from the dashboard (and bulk-resync in settings). Nothing is sent automatically on each save. The dashboard still reads local storage only (JSON or SQLite).",mongoDatabase:"MongoDB database",mongoDatabaseDesc:"Database name (letters, digits, underscore, hyphen).",mongoCollection:"MongoDB collection",mongoCollectionDesc:"Collection name (one document per session).",sectionMongoConnection:"MongoDB connection",mongoConnectionIntro:"Build mongodb://user:pass@host:port/?authSource=… from the fields below, or set a full URI in Advanced. A stored full URI takes precedence. Main Save also applies host/port/user/auth and stores password or manual URI when those fields are not empty.",mongoHost:"Host",mongoHostDesc:"Hostname or IP (e.g. 127.0.0.1).",mongoPort:"Port",mongoPortDesc:"TCP port (default 27017).",mongoUser:"Username",mongoUserDesc:"Leave empty for no authentication. If set, a password is required (stored in the secret store).",mongoPassword:"Password",mongoPasswordDesc:"Stored in the local secret store only. Use Save password or the main Save button when the field is not empty.",mongoPasswordSave:"Save password",mongoPasswordClear:"Clear stored password",mongoPasswordConfiguredYes:"A password is stored.",mongoPasswordConfiguredNo:"No password stored.",mongoAuthSource:"authSource",mongoAuthSourceDesc:"Database for authentication (often admin).",mongoManualUri:"Full URI (advanced)",mongoManualUriDesc:"If set, this URI is used instead of host/user/password. Stored in the secret store. Clear to use the built connection again.",mongoUri:"Connection URI",mongoUriDesc:"mongodb:// or mongodb+srv:// — main Save stores this when not empty.",mongoUriSave:"Save URI",mongoUriClear:"Clear stored URI",mongoUriConfiguredYes:"A full connection URI is stored (advanced).",mongoUriConfiguredNo:"No full URI stored; built connection is used when possible.",mongoRemoteStatus:"MongoDB status",mongoStatusConnected:"Connected",mongoStatusFailed:"Failed or misconfigured",mongoStatusPending:"Checking…",mongoConnectionResolvableYes:"Connection parameters are sufficient.",mongoConnectionResolvableNo:"Incomplete (e.g. set password if username is filled).",mongoTestConnection:"Test connection",mongoTestConnectionAria:"Test MongoDB connection",mongoTestRunning:"Testing connection…",mongoTestOk:"Connection test succeeded (ping on the configured database).",mongoTestFail:"Connection test failed. Check host, port, credentials, URI, and network.",mongoTestDisabled:"Enable the MongoDB mirror above to run a connection test.",mongoTestErrorGeneric:"Could not run the connection test via the local API.",mongoTestUsesSavedConfigHint:"Host, port, database, collection, and user below are used for the test even if you have not clicked Save. A stored full URI or password (via the dedicated buttons) always comes from the local secret store.",mongoSyncSectionTitle:"Local vs MongoDB",mongoResyncButton:"Resync all sessions to MongoDB",mongoResyncAriaLabel:"Resync all local sessions to the MongoDB mirror",mongoResyncConfirm:"Upsert every local session snapshot into MongoDB? This can take a moment if you have many sessions.",mongoResyncRunning:"Resyncing…",mongoResyncDone:"Resync finished: {upserted} sessions written, {failed} failed.",mongoResyncHint:"Upserts every local session into MongoDB and updates push metadata in JSON. Extra documents already in MongoDB are not deleted.",mongoResyncDisabled:"Enable the MongoDB mirror in settings before resyncing.",mongoResyncUnsupported:"This storage backend does not support Mongo resync.",mongoResyncErrorGeneric:"Could not run the resync action.",mongoResyncErrorDetail:"Resync failed: {detail}",workspaceFoldersLabel:"Workspace roots",workspaceFoldersEmpty:"No workspace root is configured for this dashboard.",localApiPort:"Local API port",localApiPortDesc:"Loopback HTTP API for this dashboard (127.0.0.1 only).",dashboardWebUrl:"Dashboard URL (display)",dashboardWebUrlDesc:"Suggested URL for opening the dashboard in a browser (e.g. bookmarks). Use a loopback URL (localhost, 127.0.0.1, [::1]) or a hostname in /etc/hosts that resolves to loopback (e.g. kronosys).",dashboardDisplayTimeZone:"Display time zone",dashboardDisplayTimeZoneDesc:"Used for session dates on the dashboard, task timestamps, and reporting day buckets. Pick a suggestion or type any IANA time zone (e.g. Europe/Brussels). Default is Eastern Time (America/Toronto).",dashboardClockFormat:"Clock format",dashboardClockFormatDesc:"How times are shown on the dashboard (task start/end, past-task date preview) and in schedule time previews. Dates are unchanged.",dashboardClock24hOption:"24-hour",dashboardClock12hOption:"12-hour (AM/PM)",dashboardCalendarWeekStartsOn:"Week starts on",dashboardCalendarWeekStartsOnDesc:"First column in date-picker calendars (dashboard task times, past sessions) and weekly grids in Reports. The date filter preset “Week” still uses Monday–Sunday.",calendarWeekStartsSunday:"Sunday",calendarWeekStartsMonday:"Monday",calendarWeekStartsSaturday:"Saturday",dashboardLightThemeVariant:"Light theme tint",dashboardLightThemeVariantDesc:"Applies when the dashboard is in light mode (moon icon in the toolbar). Dark mode is unchanged. Your choice is saved in this browser and in local settings.",dashboardLightThemeWarm:"Warm",dashboardLightThemeSoft:"Soft",dashboardLightThemeContrast:"High contrast",dashboardSemanticChipAccessibleMode:"Do not rely on color alone",dashboardSemanticChipAccessibleModeDesc:"When enabled, tag, work project, and personal project chips show #, @, and ! prefixes plus distinct border styles (solid, double, dashed) in addition to their colors — on the dashboard, reporting filters, and anywhere those chips appear. Saved in this browser and in local settings.",dashboardBaseDailyHours:"Base daily hours",dashboardBaseDailyHoursDesc:"Reference hours per day for variance tracking in Billing allocation reports.",dashboardBaseDailyToleranceMinutes:"Tolerance (minutes)",dashboardBaseDailyToleranceMinutesDesc:"Allowed deviation from base hours before highlighting (default: 10 min).",dashboardDefaultSessionNameTemplate:"Default new session name template",dashboardDefaultSessionNameTemplateDesc:"Applied when a brand-new live session is created (dashboard “New session”, or the implicit session when the first task starts with no session yet). Leave empty to leave the name blank. Tokens: `%%` for a literal percent; `%UUID` for the full session id; `%Y` `%y` `%m` `%d` `%H` `%M` `%S` plus `%F` (same as `%Y-%m-%d`) follow POSIX strftime semantics (IEEE / Open Group reference: https://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html). Note: `%m` is the month; `%M` is minutes. Expansion uses the Display time zone chosen above (consistent with dashboard reporting day buckets).",invalidDashboardTimeZone:"Unrecognized time zone. Enter a valid IANA name (e.g. America/Toronto).",dialogOkBtn:"OK",dialogCancelBtn:"Cancel",dialogConfirmBtn:"Confirm",scrollToTopAria:"Back to top",licensesPageLink:"Licenses & third-party notices",sectionHolidayCalendar:"Holiday calendar",holidayCalendarProvince:"Province",holidayCalendarProvinceDesc:"Select a province to automatically populate public holidays in the reporting calendar.",holidayCalendarProvinceNone:"None",holidayCalendarApplyBtn:"Apply province holidays",holidayCalendarApplied:"Province holidays have been applied to the reporting calendar.",holidayCalendarHint:"Public holidays are populated for the current and upcoming years. You can adjust or move any holiday directly from the reporting page using the day marker control."},o={title:"Param\xe8tres",subtitle:"Options Kronosys enregistr\xe9es localement sur cette machine.",loading:"Chargement des param\xe8tres…",reload:"Recharger depuis le serveur",save:"Enregistrer",saving:"Enregistrement…",savedOk:"Param\xe8tres enregistr\xe9s.",settingsUnsavedStickyHint:"Modifications non enregistr\xe9es.",resetToDefaults:"R\xe9initialiser aux valeurs par d\xe9faut",resetToDefaultsConfirm:"R\xe9tablir toutes les options Kronosys \xe0 leurs valeurs d’usine ? Les jetons GitLab et les indicateurs de connexion MongoDB d\xe9j\xe0 enregistr\xe9s dans le stockage s\xe9curis\xe9 ne sont pas supprim\xe9s ; seuls les champs de configuration affich\xe9s sur cette page sont remis \xe0 z\xe9ro.",resettingDefaults:"R\xe9initialisation…",resetDefaultsDone:"Valeurs par d\xe9faut appliqu\xe9es.",openIdeSettings:"Ces champs correspondent aux cl\xe9s de configuration persist\xe9es dans le stockage local.",tocHeading:"Sur cette page",tocNavAriaLabel:"Aller \xe0 une section des param\xe8tres",tocSearchPlaceholder:"Filtrer le sommaire…",tocSearchAriaLabel:"Filtrer les sections affich\xe9es dans le sommaire",tocSearchNoResults:"Aucun titre de section ne correspond.",sectionUsageProfile:"Profil d’utilisation",usageProfile:"Profil",usageProfileDesc:"D\xe9veloppeur : lignes \xe9crites, stats par langage, signaux de codage, instantan\xe9 LOC et carte Git du d\xe9p\xf4t. Gestionnaire : t\xe2ches, sessions, KronoFocus et temps seulement — pas de m\xe9triques ni d’affichages li\xe9s au code source.",profileDeveloper:"D\xe9veloppeur",profileManager:"Gestionnaire",workspaceLocSectionHiddenManager:"Ces options ne s’appliquent qu’au profil D\xe9veloppeur (instantan\xe9 lignes de code dans Rapports).",sectionGeneral:"G\xe9n\xe9ral",sectionPrivacy:"Confidentialit\xe9",sectionKronoFocus:"KronoFocus (tableau de bord)",kronoFocusHeaderPinnedNote:"Le minuteur KronoFocus et ses contr\xf4les restent toujours dans la barre d’outils de l’application (\xe0 c\xf4t\xe9 de l’horloge et de la palette de commandes), afin que la barre de navigation garde la m\xeame largeur sur toutes les pages. En consultation d’archive, les contr\xf4les restent visibles mais ciblent la session live.",kronoFocusShowInTaskOps:"Afficher dans les boutons op\xe9rationnels des t\xe2ches",kronoFocusShowInTaskOpsDesc:"Bouton pour lancer le KronoFocus depuis une t\xe2che suivie et option \xab lancer aussi le KronoFocus \xbb lors de la cr\xe9ation d’une t\xe2che.",sectionTaskTags:"T\xe2ches et \xe9tiquettes",taskDefaultTagBucketEnabled:"\xc9tiquette \xab d\xe9faut \xbb pour les t\xe2ches sans #",taskDefaultTagBucketEnabledDesc:"Activ\xe9 : une t\xe2che sans aucune \xe9tiquette explicite re\xe7oit l’\xe9tiquette r\xe9serv\xe9e (affich\xe9e \xab d\xe9faut \xbb). D\xe9sactiv\xe9 : la liste d’\xe9tiquettes reste vide jusqu’\xe0 ce que vous en ajoutiez une.",taskStripDefaultTagWhenExplicitTags:"Retirer \xab d\xe9faut \xbb lorsqu’une autre \xe9tiquette est ajout\xe9e",taskStripDefaultTagWhenExplicitTagsDesc:"Activ\xe9 : d\xe8s qu’une t\xe2che re\xe7oit au moins une \xe9tiquette explicite (#autre que \xab d\xe9faut \xbb), l’\xe9tiquette r\xe9serv\xe9e \xab d\xe9faut \xbb est retir\xe9e automatiquement. D\xe9sactiv\xe9 : \xab d\xe9faut \xbb peut coexister avec d’autres \xe9tiquettes.",taskMinimumDurationMinutes:"Dur\xe9e minimale d’une t\xe2che (minutes)",taskMinimumDurationMinutesDesc:"\xc9cart par d\xe9faut pour la saisie pass\xe9e ou planifi\xe9e : la fin est pr\xe9remplie au d\xe9but plus cette dur\xe9e (ex. 30 ou 60). Plage : 15–480.",dashboardAllowTaskStartTimeEdit:"Autoriser la correction de l’heure de d\xe9but des t\xe2ches dans le tableau de bord",dashboardAllowTaskStartTimeEditDesc:"Affiche des contr\xf4les pour modifier l’heure de d\xe9but d’une t\xe2che dans la colonne T\xe2ches, pendant son ex\xe9cution ou apr\xe8s sa fin.",dashboardAllowSessionStartTimeEdit:"Autoriser la correction de l’heure de d\xe9but des sessions dans le tableau de bord",dashboardAllowSessionStartTimeEditDesc:"Affiche des contr\xf4les pour modifier l’heure de d\xe9but d’une session dans la colonne Sessions, en cours ou dans l’historique.",dashboardAllowTaskEndTimeEdit:"Autoriser la correction de l’heure de fin des t\xe2ches dans le tableau de bord",dashboardAllowTaskEndTimeEditDesc:"Affiche des contr\xf4les pour d\xe9finir ou modifier l’heure de fin d’une t\xe2che dans la colonne T\xe2ches, y compris pendant son ex\xe9cution (la t\xe2che se termine automatiquement \xe0 l’heure planifi\xe9e).",dashboardAllowSessionEndTimeEdit:"Autoriser la correction de l’heure de fin des sessions dans le tableau de bord",dashboardAllowSessionEndTimeEditDesc:"Affiche des contr\xf4les pour d\xe9finir ou modifier l’heure de fin d’une session dans la colonne Sessions, y compris sur une session live (la session se cl\xf4t automatiquement \xe0 l’heure planifi\xe9e).",sectionCollection:"Collecte et tampons",sectionHistory:"Historique des sessions",sectionDangerZone:"Zone de danger",dangerClearHistoryTitle:"Effacer toutes les donn\xe9es locales du tableau de bord",dangerClearHistoryBodyIntro:"Supprime d\xe9finitivement, dans le stockage local de ce tableau de bord :",dangerClearHistoryBodyBullets:["Toutes les sessions (vue en cours, liste principale et archives) ainsi que la session consult\xe9e","Toute la m\xe9tadonn\xe9e \xe9tiquettes / projets : raccourcis \xe9pingl\xe9s, \xe9tiquettes masqu\xe9es des pastilles, descriptions, listes de suggestions connues","L’identit\xe9 Git enregistr\xe9e ici (nom affich\xe9, courriel, identifiant forge) et les donn\xe9es de la carte statistiques Git","L’instantan\xe9 lignes de code du workspace mis en cache pour Rapports (profil D\xe9veloppeur)","La pr\xe9f\xe9rence locale \xab ne plus demander confirmation d’archivage \xbb","La langue du tableau de bord m\xe9moris\xe9e dans le navigateur et le marqueur de choix explicite (vous choisirez \xe0 nouveau anglais ou fran\xe7ais avant la visite guid\xe9e)"],dangerClearHistoryBodyAfterList1:"Ensuite, la visite guid\xe9e d’accueil sera repropos\xe9e sur le tableau de bord et l’option \xab \xe9cran d’accueil au d\xe9marrage \xbb est r\xe9activ\xe9e dans les param\xe8tres.",dangerClearHistoryBodyAfterList2:"Action irr\xe9versible.",dangerClearHistoryButton:"Tout effacer…",dangerClearHistoryConfirm:"Vous effacez tout ce qui est d\xe9crit ci-dessus dans la zone de danger (sessions, m\xe9tadonn\xe9es \xe9tiquettes/projets, identit\xe9 Git dans ce stockage, etc.). Poursuivre ?",dangerClearHistoryVaultTargetTitle:"Coffre cibl\xe9 par cet effacement",dangerClearHistoryVaultTargetTrace:"L’effacement porte sur le r\xe9pertoire impos\xe9 par TRACE_DATA_DIR : {path}. Aucun autre coffre Kronosys n’est concern\xe9.",dangerClearHistoryVaultTargetDual:"L’effacement ne concerne que le coffre {env} actuellement charg\xe9 par ce serveur ({path}). Le coffre {otherEnv} ({otherPath}) n’est pas modifi\xe9.",dangerClearHistoryVaultTargetSingle:"L’effacement porte sur le r\xe9pertoire de donn\xe9es actuellement charg\xe9 par ce serveur ({path}).",dangerClearHistoryVaultTargetDev:"L’effacement porte sur le r\xe9pertoire de d\xe9veloppement actuellement charg\xe9 par ce serveur ({path}), pas sur le coffre production packag\xe9 sauf si vous le partagez explicitement.",dangerClearHistoryVaultMismatch:"Attention : la pr\xe9f\xe9rence enregistr\xe9e vise {preferredEnv} ({preferredPath}) au prochain red\xe9marrage, mais ce processus utilise encore {activePath}. L’effacement portera sur le r\xe9pertoire en cours d’utilisation.",dangerClearHistoryConfirmPhrase:"EFFACER",dangerClearHistoryTypeInstruction:"Pour activer \xab Confirmer \xbb, saisissez exactement {phrase} ci-dessous (toutes majuscules, sans espaces).",dangerClearHistoryTypeFieldLabel:"Mot de confirmation",dangerClearHistoryTypeInputAria:"Saisir le mot de confirmation pour autoriser l’effacement complet d\xe9crit ci-dessus (sessions, m\xe9tadonn\xe9es, identit\xe9 Git, etc.)",dangerClearHistoryBackupIntro:"Avant de confirmer, vous pouvez t\xe9l\xe9charger une copie locale (les m\xeames donn\xe9es que le tableau de bord sur cette machine) :",dangerClearHistoryBackupJson:"JSON — instantan\xe9 complet d’\xe9tat",dangerClearHistoryBackupJsonHint:"Charge utile Kronosys enti\xe8re dans un seul fichier (sessions y compris la session active `current`, t\xe2ches, m\xe9tadonn\xe9es \xe9tiquettes/projets, identit\xe9 Git, `cfg`, instantan\xe9 statistiques Git, instantan\xe9 lignes de code du workspace, etc.).",dangerClearHistoryBackupCsvBlockTitle:"CSV — plusieurs tableaux (un t\xe9l\xe9chargement par lien)",dangerClearHistoryBackupCsvBlockHint:"R\xe9unis, ces fichiers refl\xe8tent ce que l’effacement de la zone de danger supprime : sessions (avec une colonne JSON compl\xe8te par ligne), chaque t\xe2che et sous-t\xe2che, listes et descriptions d’\xe9tiquettes/projets, identit\xe9 Git, ainsi que la configuration et les blocs JSON (`cfg`, stats Git, instantan\xe9 lignes de code, session inspect\xe9e, etc.).",dangerClearHistoryBackupCsvZip:"CSV — tous les tableaux (ZIP)",dangerClearHistoryBackupCsvZipHint:"Un seul t\xe9l\xe9chargement contenant les huit fichiers CSV en UTF-8.",dangerClearHistoryBackupCsvSeparateTitle:"Fichiers s\xe9par\xe9s (optionnel)",dangerClearHistoryBackupCsvSessions:"Sessions — indicateurs \xe9tendus + JSON de session complet",dangerClearHistoryBackupCsvTasks:"T\xe2ches — une ligne par t\xe2che + JSON de t\xe2che complet",dangerClearHistoryBackupCsvSubtasks:"Sous-t\xe2ches — une ligne par \xe9l\xe9ment de liste + JSON",dangerClearHistoryBackupCsvRegistry:"Registre \xe9tiquettes / projets — listes connues, \xe9pingl\xe9es, masqu\xe9es",dangerClearHistoryBackupCsvTagDesc:"Descriptions d’\xe9tiquettes",dangerClearHistoryBackupCsvProjectDesc:"Descriptions de projets",dangerClearHistoryBackupCsvGitId:"Identit\xe9 Git (enregistr\xe9e dans ce stockage)",dangerClearHistoryBackupCsvStoreBlobs:"Configuration et instantan\xe9s — `cfg`, stats Git, LOC workspace, pr\xe9f\xe9rences d’affichage",dangerClearHistoryBackupSqlite:"SQLite — fichier de base de donn\xe9es",dangerClearHistoryBackupSqliteHint:"Fichier kronosys.sqlite apr\xe8s pointage WAL (restauration en rempla\xe7ant le fichier \xe0 l’arr\xeat de l’application).",dangerBackupRestoreTitle:"Sauvegardes et restauration compl\xe8te",dangerBackupRestoreIntro:"T\xe9l\xe9chargez d’abord une sauvegarde compl\xe8te, puis restaurez un fichier de sauvegarde ant\xe9rieur au besoin (instantan\xe9 JSON ou fichier SQLite).",dangerRestorePickFile:"Fichier de restauration (`.json` ou `.sqlite`)",dangerRestoreHint:"La restauration remplace le stockage local courant sur cette machine. Faites une sauvegarde juste avant si vous avez un doute.",dangerRestoreButton:"Restaurer depuis une sauvegarde…",dangerRestoreBusy:"Restauration…",dangerRestoreConfirm:"Restaurer ce fichier de sauvegarde maintenant ? Le stockage local courant sera remplac\xe9 pour cet environnement.",dangerRestoreNoFile:"Choisissez un fichier de sauvegarde avant de lancer la restauration.",dangerRestoreDoneJson:"Restauration termin\xe9e depuis l’instantan\xe9 JSON. Les donn\xe9es du tableau de bord ont \xe9t\xe9 recharg\xe9es.",dangerRestoreDoneSqlite:"Restauration termin\xe9e depuis le fichier SQLite. Les donn\xe9es du tableau de bord ont \xe9t\xe9 recharg\xe9es.",dangerRestoreFailed:"\xc9chec de la restauration : {detail}",sectionArchivedSessions:"Sessions archiv\xe9es",archivedSessionsIntro:"Sessions retir\xe9es de la liste principale du tableau de bord, tri\xe9es par enregistrement le plus r\xe9cent. Restaurer les r\xe9int\xe8gre dans la colonne Sessions.",archivesPaginationPrev:"Page pr\xe9c\xe9dente",archivesPaginationNext:"Page suivante",archivesPaginationNavAria:"Pagination des sessions archiv\xe9es",archivesPaginationRange:"{from}–{to} sur {total}",sectionExport:"Export par d\xe9faut",sectionGit:"Synchronisation Git",sectionMongo:"Miroir MongoDB",sectionWeb:"Tableau de bord et API",devDataBlockTitle:"Mode d\xe9veloppement (coffre local)",devDataIntro:"Lorsque le serveur de d\xe9veloppement Next.js est utilis\xe9 (`next dev`), SQLite et l’\xe9tat local vont par d\xe9faut dans un dossier distinct (`…/v4-dev`) de l’instance de production (`next start`, `…/v4`) afin d’\xe9viter d’\xe9craser vos vraies donn\xe9es. Enregistrez avec le bouton **Enregistrer** en bas de page, comme les autres param\xe8tres.",devDataUseProdLabel:"Utiliser le m\xeame r\xe9pertoire de donn\xe9es qu’en production (v4)",devDataUseProdDesc:"D\xe9sactiv\xe9 (d\xe9faut) : le mode dev utilise un r\xe9pertoire isol\xe9 `v4-dev`. Activ\xe9 : le mode dev lit et \xe9crit le chemin `v4` comme une ex\xe9cution packag\xe9e ou `next start`. Apr\xe8s modification, red\xe9marrez le serveur de dev pour ouvrir le bon fichier SQLite.",devDataActivePath:"R\xe9pertoire de donn\xe9es utilis\xe9 (ce processus)",devDataPreferredPath:"S’appliquerait au prochain red\xe9marrage",devDataProdPath:"R\xe9pertoire production par d\xe9faut (v4)",devDataPrefsFile:"Fichier de pr\xe9f\xe9rence sur le disque",devDataTraceOverride:"Le serveur a \xe9t\xe9 lanc\xe9 avec TRACE_DATA_DIR ; ce chemin est utilis\xe9 et ce commutateur est d\xe9sactiv\xe9.",devDataEnvOverride:"La variable d’environnement KRONOSYS_DEV_USE_PROD_DATA est d\xe9finie ; le mode dev utilise le chemin v4 de production et ce commutateur est d\xe9sactiv\xe9.",devDataRestartHint:"La pr\xe9f\xe9rence enregistr\xe9e ne correspond plus \xe0 la base ouverte. Red\xe9marrez le serveur `next dev` pour l’appliquer.",devDataHiddenNotDev:"Ce bloc s’affiche seulement lorsque le tableau de bord est servi en mode d\xe9veloppement (`next dev`).",dataEnvBlockTitle:"Coffres production et QA",dataEnvIntro:"Conservez vos vraies sessions dans le dossier de production (`…/v4`) et utilisez un dossier QA distinct (`…/v4-qa`) pour essayer des fonctions ou reproduire un probl\xe8me sans toucher \xe0 la production. Activez les deux coffres ci-dessous, puis basculez avec **Prod / QA** dans la barre de navigation (effet imm\xe9diat) ou changez l’environnement actif ici et **Enregistrez**.",dataEnvDualLabel:"Activer deux coffres de donn\xe9es (production et QA)",dataEnvDualDesc:"Activ\xe9 : SQLite et l’\xe9tat local utilisent `v4` (production) ou `v4-qa` (QA) selon l’environnement actif. D\xe9sactiv\xe9 : seul le coffre de production est utilis\xe9.",dataEnvActiveLabel:"Environnement actif",dataEnvActiveDesc:"Dossier ouvert par ce processus serveur. Vous pouvez aussi basculer depuis la barre de navigation sans ouvrir les param\xe8tres.",dataEnvActiveProduction:"Production (v4)",dataEnvActiveQa:"QA (v4-qa)",dataEnvActivePath:"R\xe9pertoire de donn\xe9es utilis\xe9 (ce processus)",dataEnvPreferredPath:"Pr\xe9f\xe9rence enregistr\xe9e (doit correspondre si synchronis\xe9)",dataEnvProdPath:"R\xe9pertoire production (v4)",dataEnvQaPath:"R\xe9pertoire QA (v4-qa)",dataEnvPrefsFile:"Fichier de pr\xe9f\xe9rence sur le disque",dataEnvTraceOverride:"Le serveur a \xe9t\xe9 d\xe9marr\xe9 avec TRACE_DATA_DIR ; ce chemin est utilis\xe9 et ces options sont d\xe9sactiv\xe9es.",dataEnvRestartHint:"L’environnement enregistr\xe9 ne correspond plus \xe0 la base ouverte. Red\xe9marrez le serveur Kronosys pour l’appliquer.",sectionWorkspaceLoc:"Rapports — instantan\xe9 lignes de code",sectionTagsProjects:"\xc9tiquettes et projets enregistr\xe9s",sectionTaskTemplates:"Mod\xe8les de t\xe2che",taskTemplatesIntro:"Lignes enregistr\xe9es pour le champ \xab sur quoi travaillez-vous \xbb (titre, #\xe9tiquettes et @projet facultatifs). Vous pouvez aussi enregistrer un mod\xe8le depuis une t\xe2che en cours ou termin\xe9e sur le tableau de bord.",taskTemplatesHelpAria:"Aide : mod\xe8les de t\xe2che",taskTemplatesHelpBody:"Les mod\xe8les ne font que pr\xe9remplir le brouillon de t\xe2che — ils ne d\xe9marrent pas le minuteur ni ne modifient les enregistrements existants.\n\nM\xeame syntaxe que sur le tableau de bord : un titre, des #\xe9tiquettes facultatives, un @projet facultatif. Modifier ou supprimer un mod\xe8le ne change pas les sessions ou t\xe2ches d\xe9j\xe0 saisies.",taskTemplatesEmpty:"Aucun mod\xe8le de t\xe2che. Ajoutez-en un ci-dessus ou enregistrez-en un depuis le tableau de bord.",taskTemplatesDraftPlaceholder:"ex. Travail profond #focus @acme",taskTemplatesAddBtn:"Ajouter le mod\xe8le",taskTemplatesSavedToast:"Mod\xe8le de t\xe2che enregistr\xe9.",taskTemplatesRemovedToast:"Mod\xe8le de t\xe2che supprim\xe9.",taskTemplatesUpdatedToast:"Mod\xe8le de t\xe2che mis \xe0 jour.",taskTemplatesColDraft:"Mod\xe8le",taskTemplatesColUpdated:"Mis \xe0 jour",taskTemplatesColActions:"Actions",taskTemplatesEditBtn:"Modifier le mod\xe8le",taskTemplatesSaveBtn:"Enregistrer",taskTemplatesCancelBtn:"Annuler",taskTemplatesDeleteBtn:"Supprimer le mod\xe8le",taskTemplatesDeleteConfirm:"Retirer ce mod\xe8le de la liste enregistr\xe9e ?",tagsProjectsIntro:"G\xe9rez \xe0 part les \xe9tiquettes globales, les projets enregistr\xe9s et les \xe9tiquettes li\xe9es regroup\xe9es par projet. Les m\xeames contr\xf4les sont disponibles dans la colonne de droite du tableau de bord. Ces actions ne r\xe9\xe9crivent pas en masse les t\xe2ches ni les fichiers de session.",tagsProjectsHelpAria:"Aide : impact des changements d’\xe9tiquettes et de projets",tagsProjectsHelpBody:"Cette page comporte trois zones : \xe9tiquettes globales (sans projet), projets enregistr\xe9s, puis \xe9tiquettes li\xe9es regroup\xe9es par projet.\n\nMasquer (ic\xf4ne œil barr\xe9) : l’\xe9tiquette dispara\xeet des pastilles de suggestion ; les t\xe2ches ne sont pas modifi\xe9es.\n\nSupprimer d\xe9finitivement (ic\xf4ne corbeille) : retire l’\xe9tiquette des listes \xe9pingl\xe9es et masqu\xe9es et efface sa description ; les t\xe2ches ne sont pas modifi\xe9es.\n\nIc\xf4nes d’\xe9pingle : g\xe8rent la liste de raccourcis \xe9pingl\xe9s.\n\n\xc9tiquettes li\xe9es : dans une t\xe2che, @Projet#code (stock\xe9 Projet#code) ; les suggestions ne montrent le code que si le projet de la t\xe2che correspond.\n\nDescriptions : notes locales ; infobulles sur le tableau de bord.\n\nSupprimer un projet (corbeille) : retire le projet enregistr\xe9, efface sa description et purge les m\xe9tadonn\xe9es des \xe9tiquettes Projet#… associ\xe9es ; les t\xe2ches ne sont pas modifi\xe9es.",tagsGlobalHeading:"\xc9tiquettes globales (sans projet)",tagsGlobalIntro:"Raccourcis pour des \xe9tiquettes qui ne sont pas li\xe9es \xe0 un projet pr\xe9cis : elles sont propos\xe9es sur toute t\xe2che, avec ou sans @projet.",tagsByProjectHeading:"\xc9tiquettes li\xe9es \xe0 un projet",tagsByProjectIntro:"Chaque bloc correspond \xe0 une cl\xe9 de projet ; les \xe9tiquettes enregistr\xe9es sous la forme Projet#code y sont regroup\xe9es. \xc9pinglage, masquage et descriptions restent propres \xe0 chaque \xe9tiquette.",tagsByProjectOrphanIntro:"Port\xe9es Projet#code sans projet correspondant dans la liste enregistr\xe9e ci-dessus. \xc9pinglez ou modifiez-les ici, ou ajoutez d’abord le projet \xe0 la liste.",tagsByProjectOrphanHelpAria:"Aide : \xe9tiquettes li\xe9es sans projet enregistr\xe9 correspondant",tocSubTagsGlobal:"\xc9tiquettes globales",tocSubTagsProjects:"Projets",tocSubTagsByProject:"\xc9tiquettes par projet",tagsHiddenHeading:"Masqu\xe9es des raccourcis",tagsPinFieldLabel:"\xc9pingler une \xe9tiquette globale",tagsPinPlaceholder:"ex. bugfix ou deep-work",tagsPinScopedFieldLabel:"\xc9pingler une \xe9tiquette li\xe9e \xe0 un projet",tagsPinScopedPlaceholder:"ex. 204822-1530 ou ClientABC#204822-1530",tagsPinAddBtn:"\xc9pingler",tagsTableTagCol:"\xc9tiquette",tagsTableActionsCol:"Actions",tagBadgePinned:"\xc9pingl\xe9e",tagPinBtn:"Ajouter l’\xe9tiquette aux raccourcis \xe9pingl\xe9s",tagUnpinBtn:"Retirer l’\xe9tiquette des raccourcis \xe9pingl\xe9s",tagExcludeBtn:"Masquer l’\xe9tiquette des raccourcis de suggestion",tagRestoreBtn:"R\xe9afficher l’\xe9tiquette dans les raccourcis",tagPurgeAriaLabel:"Supprimer d\xe9finitivement les m\xe9tadonn\xe9es de l’\xe9tiquette",tagPurgeConfirm:"Supprimer d\xe9finitivement les m\xe9tadonn\xe9es de cette \xe9tiquette ? Sa description sera effac\xe9e, elle sera d\xe9s\xe9pingl\xe9e et masqu\xe9e des listes du tableau de bord (elle appara\xeet sous \xab Masqu\xe9es des raccourcis \xbb si des t\xe2ches y font encore r\xe9f\xe9rence). Les t\xe2ches ne sont pas modifi\xe9es.",tagPurgeHiddenConfirm:"Retirer cette \xe9tiquette de la liste masqu\xe9e et effacer sa description ? Si des t\xe2ches l’utilisent encore, elle peut r\xe9appara\xeetre dans les raccourcis. Les t\xe2ches ne sont pas modifi\xe9es.",tagPurgeHiddenAriaLabel:"Supprimer d\xe9finitivement les m\xe9tadonn\xe9es de cette \xe9tiquette masqu\xe9e",tagRenameBtn:"Renommer l’\xe9tiquette",tagRenamePrompt:"Nouveau nom de l’\xe9tiquette",tagRenameImpactConfirm:"Renommer cette \xe9tiquette partout ? Les rapports et les ventilations historiques des t\xe2ches utiliseront d\xe9sormais le nouveau nom. Les sessions et entr\xe9es de t\xe2ches existantes seront mises \xe0 jour.",renameImpactDontShowAgain:"M\xe9moriser ce choix et ne plus afficher",tagUnpinConfirm:"Retirer cette \xe9tiquette de la liste \xe9pingl\xe9e ? Elle peut r\xe9appara\xeetre si des t\xe2ches l’utilisent encore.",tagExcludeConfirm:"Masquer cette \xe9tiquette des raccourcis du tableau de bord ? Les donn\xe9es des t\xe2ches et sessions ne sont pas modifi\xe9es ; les t\xe2ches existantes gardent l’\xe9tiquette et les bilans peuvent encore la compter.",projectsHeading:"Projets enregistr\xe9s",projectsIntro:"Projets ajout\xe9s via @projet ou le tableau de bord.",projectsHelpAria:"Aide : projets enregistr\xe9s",projectsHelpBody:"La suppression (ic\xf4ne corbeille) retire le projet de la liste enregistr\xe9e, efface sa description et purge les m\xe9tadonn\xe9es des \xe9tiquettes enregistr\xe9es sous la forme Projet#… pour ce projet. Les t\xe2ches ne sont pas modifi\xe9es.",projectsAddFieldLabel:"Ajouter un projet",projectsAddPlaceholder:"ex. ClientABC",projectsAddBtn:"Ajouter le projet",projectsTableProjectCol:"Projet",projectsRenameBtn:"Renommer le projet",projectsRenamePrompt:"Nouveau nom du projet",projectRenameImpactConfirm:"Renommer ce projet partout ? Les rapports par projet et les ventilations historiques des t\xe2ches utiliseront d\xe9sormais le nouveau nom. Les sessions et entr\xe9es de t\xe2ches existantes seront mises \xe0 jour.",projectsRemoveBtn:"Supprimer le projet et les m\xe9tadonn\xe9es d’\xe9tiquettes li\xe9es",projectRemoveConfirm:"Supprimer d\xe9finitivement les m\xe9tadonn\xe9es de ce projet ? Il sera retir\xe9 de la liste enregistr\xe9e, sa description effac\xe9e, et les donn\xe9es \xe9pingl\xe9es / masqu\xe9es / descriptions des \xe9tiquettes Projet#… sous ce projet seront supprim\xe9es. Les t\xe2ches ne sont pas modifi\xe9es.",tagDescriptionLabel:"Description (infobulle dans le tableau de bord)",projectDescriptionLabel:"Description (infobulle dans le tableau de bord)",descriptionSaveBtn:"Enregistrer la description",tagStartTrackedTaskBtn:"D\xe9marrer le suivi d’une t\xe2che avec cette \xe9tiquette (et ce projet si li\xe9)",tagStartTrackedTaskFromProjectBtn:"D\xe9marrer le suivi d’une t\xe2che avec ce projet",tagStartTaskAutoSessionToast:"Aucune session en cours — d\xe9marrage d’une session pour y rattacher cette t\xe2che.",tagStartTaskConflictTitle:"Suivi d\xe9j\xe0 actif",tagStartTaskConflictMessage:"Au moins une t\xe2che a d\xe9j\xe0 un minuteur actif. Indiquez ce que vous en faites avant de lancer celle-ci : les terminer (elles passent dans \xab termin\xe9es \xbb), les mettre en pause (reprise plus tard dans \xab en pause \xbb), ou les laisser tourner et d\xe9marrer la nouvelle t\xe2che en parall\xe8le.",tagStartTaskConflictPauseBtn:"Mettre les t\xe2ches actives en pause",tagStartTaskConflictFinishBtn:"Terminer les t\xe2ches actives",tagStartTaskConflictParallelBtn:"D\xe9marrer en parall\xe8le (garder les minuteurs)",tagStartTaskConflictDontShowAgain:"M\xe9moriser ce choix et ne plus afficher cette bo\xeete (la m\xeame action sera appliqu\xe9e automatiquement la prochaine fois).",tagsScopeToolHeading:"Migration de port\xe9e des \xe9tiquettes",tagsScopeToolSourceLabel:"\xc9tiquette source",tagsScopeToolTargetProjectLabel:"Port\xe9e projet cible",tagsScopeToolTargetGlobalOption:"Globale (sans projet)",tagsScopeToolCopyBtn:"Copier vers la port\xe9e cible",tagsScopeToolMoveBtn:"D\xe9placer vers la port\xe9e cible",tagsScopeToolNoTags:"Aucune \xe9tiquette connue \xe0 migrer pour le moment.",tagsEmptyGlobal:"Aucune \xe9tiquette globale dans les raccourcis pour l’instant. \xc9pinglez-en une ci-dessus ou utilisez des #tags sur les t\xe2ches.",tagsByProjectSectionEmpty:"Aucune \xe9tiquette li\xe9e \xe0 un projet dans les raccourcis pour l’instant. Utilisez @Projet#code sur une t\xe2che ou \xe9pinglez un code ci-dessous.",tagsByProjectSubEmpty:"Aucune \xe9tiquette li\xe9e \xe0 ce projet dans les raccourcis pour l’instant.",projectsEmpty:"Aucun projet enregistr\xe9 pour l’instant. Utilisez @projet sur une t\xe2che ou choisissez un projet sur le tableau de bord.",hiddenTagsEmpty:"Aucune \xe9tiquette masqu\xe9e.",workspaceLocExcludedDirs:"Segments de dossiers exclus",workspaceLocExcludedDirsDesc:"Un nom par ligne (un seul segment de chemin, pas un chemin complet). Si un segment du chemin d’un fichier correspond \xe0 une entr\xe9e, le fichier est ignor\xe9 — pour la liste Git et le parcours disque. Ex. : node_modules, .git, .husky, .venv, dist.",workspaceLocExcludedPatterns:"Motifs de chemins exclus",workspaceLocExcludedPatternsDesc:"Un motif par ligne (syntaxe minimatch : *, ?, **), relatif \xe0 la racine du workspace. Ex. : **/*.min.js, generated/**, **/*.gen.ts. Apr\xe8s enregistrement, actualisez l’instantan\xe9 depuis la page Rapports.",pickStorageFolder:"Choisir un dossier…",hintPortRestart:"Apr\xe8s un changement de port, red\xe9marrez le processus Kronosys pour que l’API \xe9coute sur le nouveau port.",hintDashboardUrl:"URL de r\xe9f\xe9rence affich\xe9e seulement ; ne d\xe9marre pas le serveur Next.js.",tocSubDashboardTour:"Visite guid\xe9e",tocSubReportingTour:"Visite Rapports",tocSubDashboardColumnHints:"Aide trois colonnes",dashboardColumnHintsBlockTitle:"Aide \xab trois colonnes \xbb sur le tableau de bord",dashboardColumnHintsBlockIntro:"Si vous avez masqu\xe9 le bandeau sous l’en-t\xeate du tableau de bord (bouton X), vous pouvez le r\xe9afficher ici. Cette pr\xe9f\xe9rence est stock\xe9e dans le navigateur pour ce site.",dashboardColumnHintsRestoreBtn:"R\xe9afficher l’aide des trois colonnes",dashboardColumnHintsRestoreDone:"Pr\xe9f\xe9rence r\xe9initialis\xe9e. Ouvrez le tableau de bord pour voir le bandeau.",tagsProjectsTabsAriaLabel:"Sections de la colonne \xe9tiquettes",tagsProjectsTabGlobal:"\xc9tiquettes globales",tagsProjectsTabProjects:"Projets et \xe9tiquettes li\xe9es",tagsProjectsTabTemplates:"Mod\xe8les de t\xe2che",tocSubSessionDurationAlert:"Alerte dur\xe9e de session",tocSubDefaultSessionNameTemplate:"Nom de session par d\xe9faut",dashboardSessionDurationAlertHours:"Seuil d’alerte dur\xe9e de session (heures)",dashboardSessionDurationAlertHoursDesc:"Dur\xe9e murale de session (panneau lat\xe9ral du tableau de bord) : d\xe8s qu’elle atteint ce nombre d’heures (ou plus), la valeur s’affiche en rouge avec un clignotement lent. D\xe9faut : 24. Plage : 1–8760.",dashboardTourBlockTitle:"Visite guid\xe9e du tableau de bord",dashboardTourBlockIntro:"Cinq courtes \xe9tapes pr\xe9sentent les sessions, les t\xe2ches, les \xe9tiquettes et les raccourcis. Vous pouvez relancer la visite \xe0 tout moment depuis ici.",dashboardTourReplayLinkLabel:"Ouvrir le tableau de bord et lancer la visite",reportingTourBlockTitle:"Visite guid\xe9e Rapports",reportingTourBlockIntro:"Filtres, indicateurs, graphiques et ventilation par \xe9tiquette ou par projet sur la page Rapports. Vous pouvez relancer cette visite \xe0 tout moment.",reportingTourReplayLinkLabel:"Ouvrir Rapports et lancer la visite",enabled:"Activer la collecte d’activit\xe9",enabledDesc:"Interrupteur global de la collecte d’activit\xe9.",autoStart:"D\xe9marrage automatique",autoStartDesc:"Lancer la collecte au d\xe9marrage du processus Kronosys.",sectionSchedule:"Horaire de travail",scheduleEnabled:"Activer l’horaire automatique",scheduleEnabledDesc:"D\xe9marrer et arr\xeater automatiquement les sessions selon vos heures de travail.",scheduleDays:"Jours actifs",scheduleDaysDesc:"Jours de la semaine o\xf9 le suivi est actif.",scheduleStartTime:"Heure de d\xe9but",scheduleEndTime:"Heure de fin",timePickerPopoverTimeLabel:"Heure (24 h)",timePickerPopoverHourAria:"Heure (24 h)",timePickerPopoverMinuteAria:"Minutes",scheduleCreateDailySession:"Cr\xe9er une session par jour",scheduleCreateDailySessionDesc:"Cr\xe9er automatiquement une nouvelle session au d\xe9marrage de l'horaire pour chaque jour actif.",scheduleTransferTasks:"Transposer les t\xe2ches",scheduleTransferTasksDesc:"Transf\xe9rer automatiquement les t\xe2ches actives de la session pr\xe9c\xe9dente vers la nouvelle session.",schedulePauseTasks:"Mettre les t\xe2ches en pause \xe0 l'arr\xeat",schedulePauseTasksDesc:"Mettre automatiquement en pause les t\xe2ches actives lorsque l'horaire de travail se termine.",sectionPlannedSessions:"Sessions Sp\xe9cifiques Planifi\xe9es",plannedSessionsIntro:"Ajoutez des sessions r\xe9currentes sp\xe9cifiques. Celles-ci ont priorit\xe9 sur l'horaire de travail g\xe9n\xe9ral pendant leur plage horaire.",plannedSessionAdd:"Ajouter une session planifi\xe9e",plannedSessionName:"Nom de la session",plannedSessionTags:"\xc9tiquettes (s\xe9par\xe9es par des virgules)",plannedSessionProject:"Projet",plannedSessionRemove:"Supprimer cette session",showWelcome:"\xc9cran d’accueil",showWelcomeDesc:"Afficher l’accueil tant qu’il n’est pas ferm\xe9.",anonymizePaths:"Anonymiser les chemins",anonymizePathsDesc:"Hacher les chemins de fichiers avant d’\xe9crire les \xe9v\xe9nements.",flushInterval:"Intervalle de vidage (secondes)",flushIntervalDesc:"Fr\xe9quence d’\xe9criture du tampon vers le stockage (5–3600).",heartbeatInterval:"Intervalle des battements (secondes)",heartbeatIntervalDesc:"Temps minimal entre deux \xe9v\xe9nements \xab heartbeat \xbb (30–86400).",maxBuffered:"\xc9v\xe9nements tampon max",maxBufferedDesc:"\xc9v\xe9nements en m\xe9moire avant r\xe9duction (100–100000).",historyPath:"Chemin du stockage d’historique",historyPathDesc:"Vide = r\xe9pertoire de donn\xe9es applicatif par d\xe9faut. ~ d\xe9signe le dossier personnel.",historyPartition:"Partition des fichiers d’historique",historyPartitionDesc:"D\xe9coupage des fichiers de sessions sur le disque.",localPersistenceDriver:"Stockage local des sessions",localPersistenceDriverDesc:"JSON conserve l’historique en fichiers partitionn\xe9s. SQLite enregistre les sessions dans un fichier unique dans le m\xeame dossier ; les JSON existants sont import\xe9s une fois. Le miroir MongoDB (s’il est activ\xe9) reste inchang\xe9. Red\xe9marrez le processus apr\xe8s modification.",persistenceDriverJson:"Fichiers JSON",persistenceDriverSqlite:"SQLite",localPersistenceReloadHint:"Apr\xe8s un changement de moteur, red\xe9marrez le processus Kronosys pour appliquer le r\xe9glage.",partitionDaily:"Quotidien",partitionWeekly:"Hebdomadaire",partitionMonthly:"Mensuel",sessionStartMode:"Au d\xe9marrage du suivi",sessionStartModeDesc:"Reprendre la session pr\xe9c\xe9dente ou toujours repartir \xe0 neuf.",modeContinue:"Poursuivre la session pr\xe9c\xe9dente",modeNew:"Toujours une nouvelle session",exportFormat:"Format d’export par d\xe9faut",exportFormatDesc:"Utilis\xe9 pour les exports d’historique de sessions.",fmtJson:"JSON",fmtCsv:"CSV",fmtJira:"Table Jira",fmtSap:"SAP",csvDelimiter:"S\xe9parateur CSV",csvDelimiterDesc:"Un seul caract\xe8re, ex. , ou ;",autoGitSync:"Sync Git automatique",autoGitSyncDesc:"Optionnel : apr\xe8s chaque sauvegarde locale, valider et pousser le dossier d’historique vers le d\xe9p\xf4t distant. La liste des sessions reste lue depuis les fichiers JSON locaux.",gitRemoteUrl:"URL du d\xe9p\xf4t Git distant",gitRemoteUrlDesc:"Requis si la sync automatique est activ\xe9e.",tocSubGitIdentity:"Auteur Git (tableau de bord)",gitIdentitySubheading:"Auteur Git affich\xe9 dans le tableau de bord",gitIdentityIntro:"Enregistr\xe9 localement avec vos donn\xe9es Kronosys (SQLite). Affich\xe9 sous le titre du tableau de bord \xe0 c\xf4t\xe9 des chemins du workspace — cela n’ex\xe9cute pas git config sur votre machine.",gitIdentityNameLabel:"Nom affich\xe9",gitIdentityNameDesc:"\xc9quivalent \xe0 git config user.name (cr\xe9dit souhait\xe9).",gitIdentityEmailLabel:"Courriel",gitIdentityEmailDesc:"\xc9quivalent \xe0 git config user.email (affichage seulement ici).",gitIdentityLoginLabel:"Identifiant sur la forge",gitIdentityLoginDesc:"Optionnel : compte GitHub, GitLab ou autre h\xe9bergeur (distinct du nom affich\xe9).",gitIdentitySave:"Enregistrer l’auteur Git",gitIdentitySaving:"Enregistrement…",gitIdentitySavedFlash:"Auteur Git enregistr\xe9.",glabRemoteSuggest:"L’outil glab est disponible et un jeton est configur\xe9 : vous pouvez cr\xe9er un d\xe9p\xf4t priv\xe9 nomm\xe9 kronosys-sessions et activer la sync automatique en une \xe9tape.",glabRemoteCreate:"Cr\xe9er le d\xe9p\xf4t GitLab avec glab",glabRemoteCreating:"Cr\xe9ation du d\xe9p\xf4t…",gitlabToken:"Jeton GitLab",gitlabTokenDesc:"Jeton d’acc\xe8s personnel facultatif pour glab (cr\xe9ation de d\xe9p\xf4t priv\xe9, liste des issues). Dans ce tableau de bord, l’enregistrement conserve le jeton dans SQLite local (hors JSON d’\xe9tat) pour que l’import d’issues appelle GitLab ; il remplace GITLAB_TOKEN de l’environnement du serveur une fois enregistr\xe9. Utilisez \xab Tester la connexion \xbb pour activer \xab Importer une issue Git \xbb.",gitlabTokenSave:"Enregistrer le jeton",gitlabTokenClear:"Effacer le jeton stock\xe9",gitlabTokenSaveNeedValue:"Collez d’abord votre jeton dans le champ — enregistrer avec un champ vide ne conserve pas de secret sur ce serveur.",gitlabTokenStoredYes:"Un jeton est enregistr\xe9 dans le coffre de secrets local ; il est prioritaire sur GITLAB_TOKEN pour les appels \xe0 glab.",gitlabTokenFromEnvYes:"Aucun jeton enregistr\xe9 ; glab utilise GITLAB_TOKEN de l’environnement du serveur.",gitlabTokenNone:"Aucun jeton pour l’instant — enregistrez-en un ci-dessous ou d\xe9finissez GITLAB_TOKEN pour le processus du tableau de bord.",gitlabInstanceUrl:"URL de l’instance GitLab",gitlabInstanceUrlDesc:"Origine seulement (sans chemin /api/v4). Laissez vide pour GitLab.com. Pour une instance auto-h\xe9berg\xe9e, indiquez son URL (p. ex. https://gitlab.entreprise.com). Vous pouvez aussi d\xe9finir GITLAB_INSTANCE_URL sur le processus serveur.",gitlabTest401Help:"401 : souvent le jeton ne correspond pas \xe0 cet h\xf4te (mauvaise URL d’instance), ou le jeton est expir\xe9/r\xe9voqu\xe9 ou sans port\xe9e api.",gitlabTestConnection:"Tester la connexion GitLab",gitlabTestConnectionAria:"Tester le jeton d’API GitLab",gitlabTestRunning:"Test GitLab en cours…",gitlabTestOk:"L’API GitLab a r\xe9pondu correctement. L’import d’issues est activ\xe9 dans la colonne des t\xe2ches.",gitlabTestFail:"\xc9chec du test GitLab. V\xe9rifiez le jeton, l’URL d’instance ci-dessus et le r\xe9seau.",gitlabTestNoToken:"Aucun jeton \xe0 tester : collez un jeton dans le champ, enregistrez-le, ou assurez-vous que GITLAB_TOKEN est disponible pour ce processus lorsque vous utilisez le jeton d’environnement.",gitlabTestErrorGeneric:"Impossible d’ex\xe9cuter le test de connexion GitLab.",gitlabApiVerifiedYes:"API GitLab : v\xe9rifi\xe9e — l’import d’issues dans les t\xe2ches est disponible.",gitlabApiVerifiedNo:"API GitLab : non v\xe9rifi\xe9e — lancez \xab Tester la connexion \xbb pour activer l’import d’issues dans les t\xe2ches.",gitlabTestPasteStoredHint:"Pour tester un jeton d\xe9j\xe0 enregistr\xe9 localement, collez-le temporairement dans le champ ci-dessus (ce tableau de bord ne peut pas relire le secret depuis le stockage).",historyLocalFirstHint:"L’historique des sessions est lu depuis les fichiers JSON locaux ou SQLite (voir Stockage local des sessions). La sync Git automatique pousse le dossier apr\xe8s les sauvegardes si elle est activ\xe9e. MongoDB n’est mis \xe0 jour que lorsque l’envoi est d\xe9clench\xe9 depuis le tableau de bord ou via Resynchroniser dans les param\xe8tres.",mongoEnabled:"Int\xe9gration MongoDB",mongoEnabledDesc:"Si activ\xe9, vous pouvez envoyer chaque session vers MongoDB depuis le tableau de bord (et tout resynchroniser dans les param\xe8tres). Rien n’est envoy\xe9 automatiquement \xe0 chaque sauvegarde locale. Le tableau de bord lit toujours le stockage local (JSON ou SQLite).",mongoDatabase:"Base MongoDB",mongoDatabaseDesc:"Nom de la base (lettres, chiffres, tiret, soulign\xe9).",mongoCollection:"Collection MongoDB",mongoCollectionDesc:"Nom de la collection (un document par session).",sectionMongoConnection:"Connexion MongoDB",mongoConnectionIntro:"Construire mongodb://utilisateur:motdepasse@h\xf4te:port/?authSource=… avec les champs ci-dessous, ou d\xe9finir une URI compl\xe8te en mode avanc\xe9. Une URI compl\xe8te enregistr\xe9e est prioritaire. Le bouton Enregistrer en haut applique aussi h\xf4te/port/utilisateur/authSource et enregistre le mot de passe ou l’URI manuelle si les champs sont remplis.",mongoHost:"H\xf4te",mongoHostDesc:"Nom d’h\xf4te ou adresse IP (ex. 127.0.0.1).",mongoPort:"Port",mongoPortDesc:"Port TCP (d\xe9faut 27017).",mongoUser:"Utilisateur",mongoUserDesc:"Vide = sans authentification. Si renseign\xe9, un mot de passe est requis (stock\xe9 dans le coffre de secrets).",mongoPassword:"Mot de passe",mongoPasswordDesc:"Stock\xe9 uniquement dans le coffre de secrets local. Utilisez Enregistrer le mot de passe ou le bouton Enregistrer en haut si le champ n’est pas vide.",mongoPasswordSave:"Enregistrer le mot de passe",mongoPasswordClear:"Effacer le mot de passe stock\xe9",mongoPasswordConfiguredYes:"Un mot de passe est enregistr\xe9.",mongoPasswordConfiguredNo:"Aucun mot de passe enregistr\xe9.",mongoAuthSource:"authSource",mongoAuthSourceDesc:"Base d’authentification (souvent admin).",mongoManualUri:"URI compl\xe8te (avanc\xe9)",mongoManualUriDesc:"Si d\xe9finie, cette URI remplace h\xf4te / utilisateur / mot de passe. Stock\xe9e dans le coffre de secrets. Effacer pour revenir \xe0 la connexion construite.",mongoUri:"URI de connexion",mongoUriDesc:"mongodb:// ou mongodb+srv:// — le bouton Enregistrer en haut enregistre aussi cette URI si le champ n’est pas vide.",mongoUriSave:"Enregistrer l’URI",mongoUriClear:"Effacer l’URI stock\xe9e",mongoUriConfiguredYes:"Une URI compl\xe8te est enregistr\xe9e (mode avanc\xe9).",mongoUriConfiguredNo:"Aucune URI compl\xe8te ; la connexion construite est utilis\xe9e si possible.",mongoRemoteStatus:"\xc9tat MongoDB",mongoStatusConnected:"Connect\xe9",mongoStatusFailed:"\xc9chec ou configuration incompl\xe8te",mongoStatusPending:"V\xe9rification…",mongoConnectionResolvableYes:"Param\xe8tres de connexion suffisants.",mongoConnectionResolvableNo:"Incomplet (ex. mot de passe si l’utilisateur est renseign\xe9).",mongoTestConnection:"Tester la connexion",mongoTestConnectionAria:"Tester la connexion MongoDB",mongoTestRunning:"Test de connexion en cours…",mongoTestOk:"Test de connexion r\xe9ussi (ping sur la base configur\xe9e).",mongoTestFail:"\xc9chec du test de connexion. V\xe9rifiez l’h\xf4te, le port, les identifiants, l’URI et le r\xe9seau.",mongoTestDisabled:"Activez le miroir MongoDB ci-dessus pour lancer un test de connexion.",mongoTestErrorGeneric:"Impossible d’ex\xe9cuter le test de connexion via l’API locale.",mongoTestUsesSavedConfigHint:"L’h\xf4te, le port, la base, la collection et l’utilisateur ci-dessous sont pris en compte pour le test m\xeame sans cliquer sur Enregistrer. Une URI compl\xe8te ou un mot de passe enregistr\xe9 (boutons d\xe9di\xe9s) provient toujours du coffre de secrets local.",mongoSyncSectionTitle:"Fichiers locaux et MongoDB",mongoResyncButton:"Resynchroniser toutes les sessions vers MongoDB",mongoResyncAriaLabel:"Resynchroniser toutes les sessions locales vers le miroir MongoDB",mongoResyncConfirm:"Enregistrer chaque session locale dans MongoDB (upsert) ? Cela peut prendre du temps s’il y a beaucoup de sessions.",mongoResyncRunning:"Resynchronisation…",mongoResyncDone:"Resynchronisation termin\xe9e : {upserted} sessions \xe9crites, {failed} \xe9checs.",mongoResyncHint:"\xc9crit toutes les sessions locales dans MongoDB et met \xe0 jour les m\xe9tadonn\xe9es d’envoi dans les JSON. Les documents suppl\xe9mentaires d\xe9j\xe0 pr\xe9sents dans MongoDB ne sont pas supprim\xe9s.",mongoResyncDisabled:"Activez le miroir MongoDB dans les param\xe8tres avant de resynchroniser.",mongoResyncUnsupported:"Ce stockage ne prend pas en charge la resynchronisation MongoDB.",mongoResyncErrorGeneric:"Impossible d’ex\xe9cuter la resynchronisation.",mongoResyncErrorDetail:"\xc9chec de la resynchronisation : {detail}",workspaceFoldersLabel:"Racines du workspace",workspaceFoldersEmpty:"Aucune racine de workspace n’est configur\xe9e pour ce tableau de bord.",localApiPort:"Port de l’API locale",localApiPortDesc:"API HTTP loopback pour ce tableau de bord (127.0.0.1 uniquement).",dashboardWebUrl:"URL du tableau de bord (affichage)",dashboardWebUrlDesc:"URL sugg\xe9r\xe9e pour ouvrir le tableau de bord dans un navigateur (signets, etc.). Utilisez une URL loopback (localhost, 127.0.0.1, [::1]) ou un nom d’h\xf4te dans /etc/hosts r\xe9solu vers loopback (ex. kronosys).",dashboardDisplayTimeZone:"Fuseau horaire d’affichage",dashboardDisplayTimeZoneDesc:"Sert aux dates des sessions sur le tableau de bord, aux horodatages des t\xe2ches et au regroupement par jour dans les rapports. Choisissez une suggestion ou saisissez un fuseau IANA (ex. Europe/Brussels). Par d\xe9faut : heure de l’Est (America/Toronto).",dashboardClockFormat:"Format de l’horloge",dashboardClockFormatDesc:"Affichage des heures sur le tableau de bord (d\xe9but et fin des t\xe2ches, aper\xe7u des dates de t\xe2ches pass\xe9es) et dans les aper\xe7us des s\xe9lecteurs d’heure du calendrier. Les dates ne changent pas.",dashboardClock24hOption:"24 heures",dashboardClock12hOption:"12 heures (AM/PM)",dashboardCalendarWeekStartsOn:"La semaine commence",dashboardCalendarWeekStartsOnDesc:"Premi\xe8re colonne des calendriers (s\xe9lecteurs de date du tableau de bord, sessions pass\xe9es) et grilles hebdomadaires des rapports. Le pr\xe9r\xe9glage de plage \xab Semaine \xbb reste lundi–dimanche.",calendarWeekStartsSunday:"Dimanche",calendarWeekStartsMonday:"Lundi",calendarWeekStartsSaturday:"Samedi",dashboardLightThemeVariant:"Teinte du th\xe8me clair",dashboardLightThemeVariantDesc:"S’applique lorsque le tableau de bord est en mode clair (ic\xf4ne lune dans la barre d’outils). Le mode sombre n’est pas modifi\xe9. Le choix est enregistr\xe9 dans ce navigateur et dans les param\xe8tres locaux.",dashboardLightThemeWarm:"Chaud",dashboardLightThemeSoft:"Doux",dashboardLightThemeContrast:"Contraste",dashboardSemanticChipAccessibleMode:"Ne pas distinguer par la couleur seule",dashboardSemanticChipAccessibleModeDesc:"Si activ\xe9, les pastilles d'\xe9tiquette, de projet travail et de projet personnel affichent les pr\xe9fixes #, @ et ! ainsi que des bordures distinctes (pleine, double, pointill\xe9e) en compl\xe9ment de leurs couleurs — tableau de bord, filtres des rapports et partout o\xf9 ces pastilles apparaissent. Enregistr\xe9 dans ce navigateur et dans les param\xe8tres locaux.",dashboardBaseDailyHours:"Heures de base par jour",dashboardBaseDailyHoursDesc:"Heures de r\xe9f\xe9rence par jour pour le suivi d'\xe9cart dans les rapports d'allocation.",dashboardBaseDailyToleranceMinutes:"Tol\xe9rance (minutes)",dashboardBaseDailyToleranceMinutesDesc:"\xc9cart autoris\xe9 par rapport aux heures de base avant surbrillance (d\xe9faut : 10 min).",dashboardDefaultSessionNameTemplate:"Gabarit du nom des nouvelles sessions",dashboardDefaultSessionNameTemplateDesc:"Renseign\xe9 lors du d\xe9marrage d’une nouvelle session active (commande \xab Nouvelle session \xbb ou session implicite cr\xe9\xe9e par la premi\xe8re t\xe2che). Laissez vide pour garder le champ vide. S\xe9quences : `%%` pour un pourcentage litt\xe9ral ; `%UUID` pour l’identifiant complet de session ; `%Y` `%y` `%m` `%d` `%H` `%M` `%S` ainsi que `%F` (\xe9quivalent `%Y-%m-%d`) suivent la s\xe9mantique de `strftime()` POSIX (r\xe9f\xe9rence IEEE / Open Group : https://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html). Attention : `%m` est le mois ; `%M` repr\xe9sente les minutes. Les valeurs utilisent le fuseau d’affichage choisi ci-dessus (coh\xe9rent avec les regroupements quotidiens des rapports).",invalidDashboardTimeZone:"Fuseau horaire non reconnu. Saisissez un nom IANA valide (ex. America/Toronto).",dialogOkBtn:"OK",dialogCancelBtn:"Annuler",dialogConfirmBtn:"Confirmer",scrollToTopAria:"Retour en haut de la page",licensesPageLink:"Licences et logiciels tiers",sectionHolidayCalendar:"Calendrier des jours f\xe9ri\xe9s",holidayCalendarProvince:"Province",holidayCalendarProvinceDesc:"S\xe9lectionnez une province pour ins\xe9rer automatiquement les jours f\xe9ri\xe9s dans le calendrier des rapports.",holidayCalendarProvinceNone:"Aucun",holidayCalendarApplyBtn:"Appliquer les jours f\xe9ri\xe9s",holidayCalendarApplied:"Les jours f\xe9ri\xe9s ont \xe9t\xe9 appliqu\xe9s au calendrier des rapports.",holidayCalendarHint:"Les jours f\xe9ri\xe9s sont g\xe9n\xe9r\xe9s pour l'ann\xe9e courante et les ann\xe9es \xe0 venir. Vous pouvez ajuster ou d\xe9placer chaque jour f\xe9ri\xe9 directement depuis la page des rapports \xe0 l'aide du s\xe9lecteur de marqueur de journ\xe9e."};function r(e){return"fr"===e?o:a}}}]);
|