@nightkatana/kronosys-app 1.0.0-beta.37 → 1.0.0-beta.39
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 +1 -1
- 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 +3 -3
- 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/23.js +1 -1
- package/.next/standalone/.next/server/chunks/277.js +1 -1
- package/.next/standalone/.next/server/chunks/642.js +1 -1
- package/.next/standalone/.next/server/chunks/740.js +1 -1
- package/.next/standalone/.next/server/chunks/752.js +3 -3
- 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/{227-36e1856ef492dee1.js → 227-ac9bbcd07955fca9.js} +1 -1
- package/.next/standalone/.next/static/chunks/400-cbb295eb4a4632f3.js +1 -0
- package/.next/standalone/.next/static/chunks/569-aafda3bfeb1cb4e5.js +1 -0
- package/.next/standalone/.next/static/chunks/702-033cf3571bb1add5.js +3 -0
- package/.next/standalone/.next/static/chunks/840-83aa65cc3eee5ac5.js +1 -0
- package/.next/standalone/.next/static/chunks/918-30897bc0b3f88e97.js +1 -0
- package/.next/standalone/.next/static/chunks/952-4037952633818146.js +1 -0
- package/.next/standalone/.next/static/chunks/app/page-74a25ca62ff92f6d.js +25 -0
- package/.next/standalone/.next/static/chunks/app/reporting/page-8e6695901d8adc26.js +1 -0
- package/.next/standalone/.next/static/chunks/app/settings/page-2881390ef5c8c138.js +1 -0
- package/.next/standalone/.next/static/css/2cef87557f7a0efb.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-61f952b1ee828fea.js +0 -1
- package/.next/standalone/.next/static/chunks/569-87eaac9eac7c21d8.js +0 -1
- package/.next/standalone/.next/static/chunks/702-8aac482ad91ed5d5.js +0 -3
- package/.next/standalone/.next/static/chunks/840-81defb97b2783f89.js +0 -1
- package/.next/standalone/.next/static/chunks/918-6b01bbc7d03b08e7.js +0 -1
- package/.next/standalone/.next/static/chunks/952-150a5b20c9255b4a.js +0 -1
- package/.next/standalone/.next/static/chunks/app/page-f90f10d17428272f.js +0 -25
- package/.next/standalone/.next/static/chunks/app/reporting/page-eb784ca2579dab1f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/settings/page-e32584d89b43e548.js +0 -1
- package/.next/standalone/.next/static/css/bda87aa373a08430.css +0 -1
- /package/.next/standalone/.next/static/{U4YV5CT2J48wEvakHC8wa → 6ttfOnXHYUIE_dlJ927gI}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{U4YV5CT2J48wEvakHC8wa → 6ttfOnXHYUIE_dlJ927gI}/_ssgManifest.js +0 -0
|
@@ -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"},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"};function r(e){return"fr"===e?o:a}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[918],{149:(e,r,o)=>{o.d(r,{ID:()=>s,Nj:()=>k,O6:()=>t,Pe:()=>z,VY:()=>h,Vd:()=>m,W1:()=>I,XB:()=>$,XO:()=>f,Xd:()=>_,Xk:()=>y,Yu:()=>b,Zm:()=>g,_L:()=>x,bS:()=>j,bu:()=>N,fg:()=>n,i2:()=>E,kY:()=>v,rw:()=>a,st:()=>D,t:()=>X,ts:()=>l,v8:()=>d,xe:()=>p,zE:()=>C,zo:()=>i,zy:()=>w});let d="h-10 min-h-10 min-w-0 w-full flex-1 border-0 border-b border-zinc-400 bg-transparent px-0 text-base font-medium leading-snug text-zinc-900 outline-none placeholder:text-zinc-500 focus:border-zinc-600 focus:ring-0 rounded-none dark:border-zinc-500 dark:text-white dark:placeholder:text-zinc-600 dark:focus:border-zinc-200",n="group/datetime-trigger inline-flex min-h-0 w-auto min-w-0 max-w-[13rem] shrink-0 cursor-pointer items-center gap-1 border-0 bg-transparent p-0 font-mono text-xs tabular-nums shadow-none outline-none transition-[opacity,color] [color-scheme:light] hover:opacity-90 focus-visible:rounded-sm focus-visible:ring-2 focus-visible:ring-zinc-400/45 focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--background)] dark:[color-scheme:dark] dark:focus-visible:ring-zinc-500/40 dark:focus-visible:ring-offset-[var(--background)]",t="text-base font-medium leading-snug [scrollbar-width:thin]",i="h-10 w-full min-w-0 border-0 border-b border-zinc-400 bg-transparent px-0 text-base font-medium leading-snug text-zinc-900 outline-none ring-0 placeholder:text-zinc-500 focus:border-zinc-600 focus:ring-0 rounded-none dark:border-zinc-500 dark:text-white dark:placeholder:text-zinc-600 dark:focus:border-zinc-200",a="h-10 w-full min-w-0 border-0 border-b border-violet-500/70 bg-transparent px-0 text-base font-medium leading-snug text-zinc-900 outline-none ring-0 placeholder:text-zinc-500 focus:border-violet-500 focus:ring-0 rounded-none dark:text-zinc-100 dark:placeholder:text-zinc-600 dark:focus:border-violet-400",s="min-h-10 w-full border-0 border-b border-zinc-400/90 bg-transparent px-0 py-2 text-base font-medium leading-snug text-zinc-900 outline-none placeholder:text-zinc-500 focus:border-zinc-600 focus:ring-0 rounded-none dark:border-zinc-600/80 dark:text-zinc-100 dark:placeholder:text-zinc-600 dark:focus:border-zinc-400",l="h-[30px] min-h-[30px] max-h-[30px]",b="pointer-events-none min-w-0 max-w-[14rem] truncate leading-none",c=`box-border inline-flex ${l} shrink-0 max-w-full items-center gap-1 overflow-hidden px-1.5 py-0 text-xs font-medium leading-none`,u="kronosys-semantic-chip kronosys-semantic-chip--tag",k="box-border min-h-[2.75rem] w-full min-w-0 resize-none overflow-hidden break-words rounded-lg border border-zinc-300 bg-white/90 px-3 py-2.5 text-sm leading-relaxed text-zinc-800 outline-none transition focus:border-violet-500 dark:border-zinc-700 dark:bg-zinc-900/70 dark:text-zinc-100",g=`${k} min-h-0 cursor-text overflow-x-hidden [overflow-wrap:anywhere]`,h=`inline-flex ${l} w-[30px] shrink-0 items-center justify-center rounded-md border border-zinc-300 bg-white text-zinc-700 transition-colors hover:bg-zinc-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-zinc-500/35 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:border-zinc-600 dark:bg-transparent dark:text-zinc-300 dark:hover:bg-zinc-800 dark:focus-visible:ring-offset-zinc-900 [&_svg]:shrink-0 box-border`,v=`${h} border-emerald-500/50 bg-emerald-500/10 text-emerald-800 hover:border-emerald-500/75 hover:bg-emerald-500/18 dark:border-emerald-500/40 dark:bg-emerald-950/35 dark:text-emerald-200 dark:hover:border-emerald-400/55 dark:hover:bg-emerald-950/50 focus-visible:ring-emerald-500/40`,m=`${h} border-violet-500/45 bg-violet-50 text-violet-900 hover:bg-violet-100/90 dark:border-violet-600/45 dark:bg-violet-950/30 dark:text-violet-200 dark:hover:bg-violet-900/40 focus-visible:ring-violet-500/45`,f=`${h} border-sky-400/70 bg-sky-50 text-sky-800 hover:bg-sky-100 dark:border-sky-600/55 dark:bg-sky-950/35 dark:text-sky-200 dark:hover:bg-sky-900/45`,x=`${h} border-emerald-400/70 bg-emerald-50 text-emerald-700 hover:bg-emerald-100 dark:border-emerald-700/70 dark:bg-emerald-950/40 dark:text-emerald-300 dark:hover:bg-emerald-900/55`,z=`${h} text-zinc-600 hover:border-red-600/60 hover:bg-red-50 hover:text-red-800 dark:text-zinc-400 dark:hover:border-red-800/70 dark:hover:bg-red-950/45 dark:hover:text-red-300`,p=`${c} ${u} cursor-default select-none rounded-md border border-zinc-300 bg-zinc-100 text-zinc-800 dark:border-zinc-600/65 dark:bg-zinc-800/55 dark:text-zinc-400`,w=`${c} ${u} cursor-default select-none rounded-md border border-emerald-600/70 bg-emerald-100 text-emerald-950 dark:border-emerald-500/55 dark:bg-emerald-950/45 dark:text-emerald-200`,y=`${p} !cursor-pointer hover:border-zinc-400 hover:bg-zinc-200/90 hover:text-zinc-950 dark:hover:border-zinc-500 dark:hover:bg-zinc-700/45 dark:hover:text-zinc-200`,$=`${w} !cursor-pointer hover:border-emerald-700/75 hover:bg-emerald-200 dark:hover:border-emerald-400/70 dark:hover:bg-emerald-900/40`,j=`${c} ${u} cursor-default select-none rounded-md border border-emerald-600/70 bg-emerald-100/90 text-emerald-950 dark:border-emerald-500/60 dark:bg-transparent dark:text-emerald-300`,_=`${j} !cursor-pointer transition-colors hover:border-emerald-700/80 hover:bg-emerald-200 dark:hover:border-emerald-400/75 dark:hover:bg-emerald-400/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-emerald-500/35 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-zinc-900`,E=`${c} kronosys-semantic-chip kronosys-semantic-chip--project-work cursor-default select-none rounded-md border border-sky-600/70 bg-sky-100 text-sky-950 dark:border-sky-500/55 dark:bg-sky-950/40 dark:text-sky-100`,N=`${c} kronosys-semantic-chip kronosys-semantic-chip--project-personal cursor-default select-none rounded-md border border-rose-600/70 bg-rose-100 text-rose-950 dark:border-rose-500/55 dark:bg-rose-950/40 dark:text-rose-100`,I=`${E} !cursor-pointer hover:border-sky-700/75 hover:bg-sky-200 dark:hover:border-sky-400/70 dark:hover:bg-sky-900/40`,X=`${N} !cursor-pointer hover:border-rose-700/75 hover:bg-rose-200 dark:hover:border-rose-400/70 dark:hover:bg-rose-900/40`,C=`${c} ${u} cursor-pointer select-none rounded-md border border-zinc-300 bg-white text-zinc-600 hover:border-zinc-400 hover:bg-zinc-50 dark:border-zinc-600 dark:bg-zinc-950 dark:text-zinc-400 dark:hover:border-zinc-500`,D=`${c} ${u} cursor-pointer select-none rounded-md border border-violet-500/80 bg-violet-100 text-violet-900 dark:border-violet-500/55 dark:bg-violet-950/50 dark:text-violet-200`},1532:(e,r,o)=>{o.d(r,{F:()=>n});var d=o(2115);function n(e,r){let o=Math.max(0,Math.floor(e)),[n,t]=(0,d.useState)(o);return(0,d.useEffect)(()=>{if(!r)return void t(o);t(o);let e=Date.now(),d=globalThis.setInterval(()=>{t(o+(Date.now()-e))},50);return()=>globalThis.clearInterval(d)},[r,o]),r?n:o}},4435:(e,r,o)=>{o.d(r,{I:()=>a,q:()=>i});var d=o(5155),n=o(2115),t=o(149);function i(e){e&&(e.style.height="auto",e.style.height=`${e.scrollHeight}px`)}function a({value:e,onChange:r,textareaRef:o,rows:s=1,className:l,...b}){let c=(0,n.useRef)(null),u=o??c;return(0,n.useLayoutEffect)(()=>{let e=u.current;if(!e)return;let r=()=>i(e);r();let o=new ResizeObserver(r);return o.observe(e),()=>o.disconnect()},[u,e]),(0,d.jsx)("textarea",{ref:u,className:l??t.Nj,value:e,rows:s,onChange:e=>r(e.target.value),...b})}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[952],{1275:(e,t,a)=>{function n(e){let t=e.trim();if(!t)return;let a=new Date(t);return Number.isNaN(a.getTime())?void 0:a}function r(e,t,a,r){let i=n(e),s=n(t);if(!i)return null;let l=new Intl.DateTimeFormat("fr"===a?"fr-CA":"en-CA",{dateStyle:"short",timeStyle:"short",hour12:!r});return s?`${l.format(i)} → ${l.format(s)}`:l.format(i)}a.d(t,{T:()=>r}),a(2934),a(1555)},1329:(e,t,a)=>{a.d(t,{_:()=>i});var n=a(5155),r=a(7420);function i({label:e,fallbackLabel:t,rangeValid:a,durationValid:s,ariaLabel:l,onClick:o,disabled:d=!1,className:c="w-full"}){return(0,n.jsxs)("button",{type:"button",disabled:d,className:`flex min-w-0 items-center justify-center gap-2 rounded-lg border px-3 py-2 text-left text-sm transition-colors disabled:cursor-default disabled:opacity-70 ${c} ${a&&s?"border-zinc-200/90 bg-zinc-50/80 text-zinc-700 hover:border-violet-400/45 hover:bg-violet-50/40 dark:border-zinc-700/80 dark:bg-zinc-900/45 dark:text-zinc-300 dark:hover:border-violet-400/45 dark:hover:bg-violet-950/25":"border-amber-500/45 bg-amber-50/50 text-amber-900 hover:bg-amber-50/80 dark:border-amber-500/40 dark:bg-amber-950/20 dark:text-amber-200 dark:hover:bg-amber-950/35"}`,"aria-label":l,onClick:o,children:[(0,n.jsx)(r.A,{className:"h-3.5 w-3.5 shrink-0 opacity-70",strokeWidth:1.75,"aria-hidden":!0}),(0,n.jsx)("span",{className:"min-w-0 truncate tabular-nums",children:e??t})]})}},1421:(e,t,a)=>{a.d(t,{E:()=>x});var n=a(5155),r=a(8426),i=a(2957);let s="rounded bg-zinc-200/70 px-1 py-0.5 font-mono text-[0.85em] dark:bg-zinc-700/80";function l({children:e,href:t}){if(!t||!(t.startsWith("http://")||t.startsWith("https://")||t.startsWith("mailto:")||t.startsWith("/")||t.startsWith("#")))return(0,n.jsx)("span",{children:e});let a=t.startsWith("http://")||t.startsWith("https://");return(0,n.jsx)("a",{href:t,className:"text-violet-700 underline decoration-violet-400/80 underline-offset-2 hover:text-violet-900 dark:text-violet-300 dark:decoration-violet-500/60 dark:hover:text-violet-200",...a?{target:"_blank",rel:"noopener noreferrer"}:{},children:e})}function o({src:e,alt:t}){return e&&(e.startsWith("http://")||e.startsWith("https://")||e.startsWith("/"))?(0,n.jsx)("img",{src:e,alt:t??"",className:"my-1 max-h-48 max-w-full rounded-md border border-zinc-200 object-contain dark:border-zinc-700",loading:"lazy"}):null}let d="break-words border border-zinc-200 px-2 py-1 align-top dark:border-zinc-700",c=`${d} bg-zinc-100 font-semibold dark:bg-zinc-800/80`,u={p:({children:e})=>(0,n.jsx)("span",{children:e}),strong:({children:e})=>(0,n.jsx)("strong",{className:"font-semibold",children:e}),em:({children:e})=>(0,n.jsx)("em",{className:"italic",children:e}),del:({children:e})=>(0,n.jsx)("del",{className:"line-through opacity-80",children:e}),a:({children:e,href:t})=>(0,n.jsx)(l,{href:t,children:e}),code:({children:e})=>(0,n.jsx)("code",{className:s,children:e}),img:({src:e,alt:t})=>(0,n.jsx)(o,{src:"string"==typeof e?e:void 0,alt:t})},m={...u,p:({children:e})=>(0,n.jsx)("p",{className:"mb-2 last:mb-0",children:e}),ul:({children:e})=>(0,n.jsx)("ul",{className:"mb-2 list-disc space-y-0.5 pl-5 last:mb-0 [&_li:has(input[type=checkbox])]:list-none [&_li:has(input[type=checkbox])]:pl-0",children:e}),ol:({children:e})=>(0,n.jsx)("ol",{className:"mb-2 list-decimal space-y-0.5 pl-5 last:mb-0",children:e}),li:({children:e,className:t})=>(0,n.jsx)("li",{className:[t,"leading-snug [&>input[type=checkbox]]:mr-1.5 [&>input[type=checkbox]]:align-middle"].filter(Boolean).join(" "),children:e}),h1:({children:e})=>(0,n.jsx)("p",{className:"mb-2 text-base font-semibold last:mb-0",children:e}),h2:({children:e})=>(0,n.jsx)("p",{className:"mb-2 text-sm font-semibold last:mb-0",children:e}),h3:({children:e})=>(0,n.jsx)("p",{className:"mb-2 text-sm font-medium last:mb-0",children:e}),h4:({children:e})=>(0,n.jsx)("p",{className:"mb-1 text-sm font-medium last:mb-0",children:e}),h5:({children:e})=>(0,n.jsx)("p",{className:"mb-1 text-sm font-medium last:mb-0",children:e}),h6:({children:e})=>(0,n.jsx)("p",{className:"mb-1 text-sm font-medium last:mb-0",children:e}),blockquote:({children:e})=>(0,n.jsx)("blockquote",{className:"mb-2 border-l-2 border-zinc-300 pl-3 text-zinc-600 last:mb-0 dark:border-zinc-600 dark:text-zinc-400",children:e}),pre:({children:e})=>(0,n.jsx)("pre",{className:"mb-2 overflow-x-hidden whitespace-pre-wrap break-words rounded-md bg-zinc-100 p-2 font-mono text-xs last:mb-0 dark:bg-zinc-800/90",children:e}),code:({className:e,children:t})=>e?.includes("language-")?(0,n.jsx)("code",{className:e,children:t}):(0,n.jsx)("code",{className:s,children:t}),hr:()=>(0,n.jsx)("hr",{className:"my-2 border-zinc-200 dark:border-zinc-700","aria-hidden":!0}),table:({children:e})=>(0,n.jsx)("div",{className:"mb-2 last:mb-0",children:(0,n.jsx)("table",{className:"mb-2 w-full min-w-[12rem] border-collapse text-left text-[0.85em] last:mb-0",children:e})}),thead:({children:e})=>(0,n.jsx)("thead",{children:e}),tbody:({children:e})=>(0,n.jsx)("tbody",{children:e}),tr:({children:e})=>(0,n.jsx)("tr",{children:e}),th:({children:e})=>(0,n.jsx)("th",{className:c,children:e}),td:({children:e})=>(0,n.jsx)("td",{className:d,children:e}),input:({type:e,checked:t,disabled:a})=>"checkbox"!==e?null:(0,n.jsx)("input",{type:"checkbox",checked:t,disabled:a??!0,readOnly:!0,"aria-readonly":"true",className:"size-3.5 shrink-0 rounded border-zinc-400 accent-violet-600 dark:border-zinc-500"})},b=[i.A];function x({source:e,variant:t="block",className:a}){let i=e.trim();return i?(0,n.jsx)("div",{className:["min-w-0 break-words [overflow-wrap:anywhere]",a].filter(Boolean).join(" "),children:(0,n.jsx)(r.oz,{remarkPlugins:b,components:"inline"===t?u:m,children:i})}):null}},1422:(e,t,a)=>{a.d(t,{E:()=>ee});var n=a(5155),r=a(2115),i=a(9199),s=a(7635),l=a(1762),o=a(5243),d=a(8459),c=a(5335),u=a(4152),m=a(232),b=a(2651),x=a(2934),p=a(1555),h=a(5486),k=a(8577),g=a(6969),f=a(6749),v=a(1275),j=a(5172),y=a(1329),z=a(1421),N=a(5865),w=a(149),T=a(4923),S=a(7256),M=a(9768),C=a(9883),D=a(9921),L=a(6088),E=a(1532);function A({durationMs:e,isTracking:t,className:a}){let r=Math.max(0,Math.floor(e)),i=(0,E.F)(r,t),s=(0,h.Td)(i);return(0,n.jsx)("span",{className:a,title:s,children:s})}let $="min-w-[6.25rem] shrink-0 text-right text-[0.65rem] font-medium leading-none tracking-tight text-zinc-400 dark:text-zinc-500";function I({durationMs:e,isTracking:t,enableSubtaskTimer:a,subtaskDone:r,subtasksReadOnly:i,t:s}){let l=Math.max(0,Math.floor(e??0));return l>0||t?(0,n.jsx)(A,{durationMs:l,isTracking:t,className:`shrink-0 font-mono tabular-nums text-[0.7rem] tracking-tight ${t?"font-semibold text-emerald-700 dark:text-emerald-400":"text-zinc-500"}`}):a?(0,n.jsx)("span",{className:$,title:s.subtaskDurationTooltipNotMeasured,children:s.subtaskDurationNotMeasured}):i&&r?(0,n.jsx)("span",{className:$,title:s.subtaskDurationTooltipNotShown,children:s.subtaskDurationNotShown}):(0,n.jsx)("span",{className:$,title:s.subtaskDurationTooltipNotRecorded,children:s.subtaskDurationNotRecorded})}function P({draft:e,setDraft:t,taskId:a,send:r,t:i,autoFocus:s,onDismissIfEmpty:l}){return(0,n.jsx)("input",{autoFocus:s,className:w.ID,placeholder:i.addSubtaskPlaceholder,value:e,onChange:e=>t(e.target.value),onBlur:()=>{e.trim()||l?.()},onKeyDown:n=>{"Enter"===n.key&&e.trim()&&(n.preventDefault(),r({type:"addSubtask",taskId:a,title:e.trim()}),t("")),"Escape"===n.key&&(t(""),l?.())},"aria-label":i.addSubtaskPlaceholder})}let F="h-4 w-4 shrink-0 cursor-pointer rounded border-zinc-400 bg-white text-violet-600 accent-violet-600 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-violet-500/70 dark:border-zinc-500 dark:bg-zinc-900 dark:text-violet-500 dark:accent-violet-500",B="text-zinc-400 line-through decoration-zinc-500/[0.35] decoration-[1.5px]",R="rounded-md px-1.5 -mx-1.5 py-0.5 -my-0.5 transition-colors duration-150 hover:bg-violet-100 hover:ring-1 hover:ring-violet-400/75 dark:hover:bg-violet-950/65 dark:hover:ring-violet-500/55";function H({st:e,ord:t,isTracking:a,enableSubtaskTimer:r,subtasksReadOnly:i,showReorderGutter:s,t:l}){return(0,n.jsxs)("div",{className:"pointer-events-none flex min-h-10 max-w-[min(100vw-2rem,36rem)] cursor-grabbing items-center gap-1.5 rounded-lg border-2 border-violet-600 bg-white px-2 py-1.5 shadow-xl ring-2 ring-violet-500/30 dark:border-violet-400 dark:bg-zinc-900 dark:ring-violet-400/25 sm:gap-2",children:[(0,n.jsx)(C.A,{className:"size-4 shrink-0 text-violet-600 dark:text-violet-400","aria-hidden":!0}),s?(0,n.jsxs)("span",{className:"flex w-[1.125rem] shrink-0 flex-col items-center justify-center gap-0 opacity-40","aria-hidden":!0,children:[(0,n.jsx)(D.A,{className:"size-3.5",strokeWidth:2.5}),(0,n.jsx)(L.A,{className:"size-3.5",strokeWidth:2.5})]}):null,(0,n.jsxs)("span",{className:"w-6 shrink-0 text-right font-mono text-[0.7rem] font-semibold tabular-nums text-zinc-500 dark:text-zinc-400",children:[t,"."]}),(0,n.jsx)("input",{type:"checkbox",readOnly:!0,checked:e.done,className:F,tabIndex:-1}),(0,n.jsx)("span",{className:`min-w-0 flex-1 truncate text-left text-base font-medium leading-snug ${e.done?B:"text-zinc-900 dark:text-zinc-100"}`,children:e.title}),(0,n.jsx)(I,{durationMs:e.durationMs,isTracking:a,enableSubtaskTimer:r,subtaskDone:e.done,subtasksReadOnly:i,t:l})]})}function _({st:e,index:t,showOrdinal:a,activeDragId:r,taskId:i,enableSubtaskTimer:s,activeSubtaskTimerId:l,subtasksReadOnly:o,t:c,editingId:b,editVal:x,setEditingId:p,setEditVal:h,send:k,dragLabel:g,listLength:f,onReorderStep:v}){let{attributes:j,listeners:y,setNodeRef:z,transform:N,transition:T,isDragging:E}=(0,S.gl)({id:e.id}),A=s&&String(l??"").trim()===String(e.id).trim(),$=t+1,P={transform:M.Ks.Transform.toString(N),transition:T},H=!!(r&&r!==e.id);return(0,n.jsxs)("li",{ref:z,style:P,className:`relative z-[1] flex min-h-10 items-center gap-1.5 py-1.5 first:pt-0 sm:gap-2 ${R} ${H?"opacity-[0.22] saturate-[0.65]":""} ${E?"z-10 opacity-0":""}`,children:[(0,n.jsx)("button",{type:"button",className:"shrink-0 cursor-grab rounded p-0.5 text-zinc-500 touch-none hover:bg-violet-200/60 hover:text-violet-900 active:cursor-grabbing dark:text-zinc-400 dark:hover:bg-violet-900/50 dark:hover:text-violet-100",title:g,"aria-label":g,...j,...y,children:(0,n.jsx)(C.A,{size:16,strokeWidth:2,"aria-hidden":!0})}),!o&&f>1?(0,n.jsxs)("span",{className:"flex w-[1.125rem] shrink-0 flex-col items-center justify-center gap-0",children:[(0,n.jsx)("button",{type:"button",disabled:0===t,className:"rounded p-0.5 text-zinc-600 hover:bg-violet-100 hover:text-violet-900 disabled:pointer-events-none disabled:opacity-25 dark:text-zinc-400 dark:hover:bg-violet-900/45 dark:hover:text-violet-100",title:c.subtaskMoveUp,"aria-label":c.subtaskMoveUp,onClick:()=>v(t,-1),children:(0,n.jsx)(D.A,{size:14,strokeWidth:2.5,"aria-hidden":!0})}),(0,n.jsx)("button",{type:"button",disabled:t>=f-1,className:"rounded p-0.5 text-zinc-600 hover:bg-violet-100 hover:text-violet-900 disabled:pointer-events-none disabled:opacity-25 dark:text-zinc-400 dark:hover:bg-violet-900/45 dark:hover:text-violet-100",title:c.subtaskMoveDown,"aria-label":c.subtaskMoveDown,onClick:()=>v(t,1),children:(0,n.jsx)(L.A,{size:14,strokeWidth:2.5,"aria-hidden":!0})})]}):null,(0,n.jsx)("span",{className:"w-6 shrink-0 text-right font-mono text-[0.7rem] font-semibold tabular-nums text-zinc-500 dark:text-zinc-500","aria-hidden":!a,children:a?`${$}.`:""}),(0,n.jsx)("input",{type:"checkbox",className:o?`${F} cursor-not-allowed opacity-50`:F,checked:e.done,disabled:o,onChange:()=>{o||k({type:"toggleSubtask",taskId:i,subtaskId:e.id})},title:e.done?c.subtaskMarkUndone:c.subtaskMarkDone,"aria-label":e.done?c.subtaskMarkUndone:c.subtaskMarkDone}),b!==e.id||o?o?(0,n.jsx)("span",{className:`min-w-0 flex-1 truncate text-left text-base font-medium leading-snug ${e.done?B:"text-zinc-900 dark:text-zinc-200"}`,children:e.title}):(0,n.jsx)("button",{type:"button",className:`min-w-0 flex-1 truncate text-left text-base font-medium leading-snug outline-none hover:text-violet-800 focus-visible:ring-2 focus-visible:ring-violet-500/50 rounded-sm dark:hover:text-zinc-100 ${e.done?B:"text-zinc-900 dark:text-zinc-200"}`,onClick:()=>{p(e.id),h(e.title)},children:e.title}):(0,n.jsx)("input",{autoFocus:!0,className:`${w.rw} min-w-0 flex-1`,value:x,onChange:e=>h(e.target.value),onBlur:()=>{x.trim()&&x.trim()!==e.title&&k({type:"updateSubtaskTitle",taskId:i,subtaskId:e.id,title:x.trim()}),p(null)},onKeyDown:e=>{"Enter"===e.key&&e.target.blur(),"Escape"===e.key&&p(null)},"aria-label":c.subtasksHeading}),(0,n.jsx)(I,{durationMs:e.durationMs,isTracking:A,enableSubtaskTimer:s,subtaskDone:e.done,subtasksReadOnly:o,t:c}),(0,n.jsxs)("div",{className:"flex shrink-0 items-center gap-0.5",children:[s&&!e.done&&!o&&(0,n.jsx)("button",{type:"button",className:`rounded p-1.5 ${A?"bg-emerald-200 text-emerald-900 dark:bg-emerald-600/30 dark:text-emerald-300":"text-zinc-600 hover:bg-zinc-200/90 dark:text-zinc-400 dark:hover:bg-zinc-800"}`,title:A?c.subtaskTimerStop:c.subtaskTimerStart,"aria-label":A?c.subtaskTimerStop:c.subtaskTimerStart,onClick:()=>void k({type:"setActiveSubtaskTimer",taskId:i,subtaskId:A?null:e.id}),children:A?(0,n.jsx)(u.A,{size:14}):(0,n.jsx)(m.A,{size:14})}),o?null:(0,n.jsx)("button",{type:"button",className:"rounded p-1.5 text-zinc-600 hover:bg-red-100 hover:text-red-800 dark:text-zinc-500 dark:hover:bg-red-950/50 dark:hover:text-red-400",title:c.subtaskDelete,"aria-label":c.subtaskDelete,onClick:()=>void k({type:"deleteSubtask",taskId:i,subtaskId:e.id}),children:(0,n.jsx)(d.A,{size:14})})]})]})}function W({st:e,index:t,taskId:a,enableSubtaskTimer:r,activeSubtaskTimerId:i,subtasksReadOnly:s,t:l,editingId:o,editVal:c,setEditingId:b,setEditVal:x,send:p}){let h=r&&String(i??"").trim()===String(e.id).trim();return(0,n.jsxs)("li",{className:`relative flex min-h-10 items-center gap-1.5 py-1.5 first:pt-0 sm:gap-2 ${R}`,children:[(0,n.jsx)("span",{className:"w-4 shrink-0 sm:w-[1.125rem]","aria-hidden":!0}),(0,n.jsxs)("span",{className:"w-6 shrink-0 text-right font-mono text-[0.7rem] font-semibold tabular-nums text-zinc-500 dark:text-zinc-500","aria-hidden":!0,children:[t+1,"."]}),(0,n.jsx)("input",{type:"checkbox",className:s?`${F} cursor-not-allowed opacity-50`:F,checked:e.done,disabled:s,onChange:()=>{s||p({type:"toggleSubtask",taskId:a,subtaskId:e.id})},title:e.done?l.subtaskMarkUndone:l.subtaskMarkDone,"aria-label":e.done?l.subtaskMarkUndone:l.subtaskMarkDone}),o!==e.id||s?s?(0,n.jsx)("span",{className:`min-w-0 flex-1 truncate text-left text-base font-medium leading-snug ${e.done?B:"text-zinc-900 dark:text-zinc-200"}`,children:e.title}):(0,n.jsx)("button",{type:"button",className:`min-w-0 flex-1 truncate text-left text-base font-medium leading-snug outline-none hover:text-violet-800 focus-visible:ring-2 focus-visible:ring-violet-500/50 rounded-sm dark:hover:text-zinc-100 ${e.done?B:"text-zinc-900 dark:text-zinc-200"}`,onClick:()=>{b(e.id),x(e.title)},children:e.title}):(0,n.jsx)("input",{autoFocus:!0,className:`${w.rw} min-w-0 flex-1`,value:c,onChange:e=>x(e.target.value),onBlur:()=>{c.trim()&&c.trim()!==e.title&&p({type:"updateSubtaskTitle",taskId:a,subtaskId:e.id,title:c.trim()}),b(null)},onKeyDown:e=>{"Enter"===e.key&&e.target.blur(),"Escape"===e.key&&b(null)},"aria-label":l.subtasksHeading}),(0,n.jsx)(I,{durationMs:e.durationMs,isTracking:h,enableSubtaskTimer:r,subtaskDone:e.done,subtasksReadOnly:s,t:l}),(0,n.jsxs)("div",{className:"flex shrink-0 items-center gap-0.5",children:[r&&!e.done&&!s&&(0,n.jsx)("button",{type:"button",className:`rounded p-1.5 ${h?"bg-emerald-200 text-emerald-900 dark:bg-emerald-600/30 dark:text-emerald-300":"text-zinc-600 hover:bg-zinc-200/90 dark:text-zinc-400 dark:hover:bg-zinc-800"}`,title:h?l.subtaskTimerStop:l.subtaskTimerStart,"aria-label":h?l.subtaskTimerStop:l.subtaskTimerStart,onClick:()=>void p({type:"setActiveSubtaskTimer",taskId:a,subtaskId:h?null:e.id}),children:h?(0,n.jsx)(u.A,{size:14}):(0,n.jsx)(m.A,{size:14})}),s?null:(0,n.jsx)("button",{type:"button",className:"rounded p-1.5 text-zinc-600 hover:bg-red-100 hover:text-red-800 dark:text-zinc-500 dark:hover:bg-red-950/50 dark:hover:text-red-400",title:l.subtaskDelete,"aria-label":l.subtaskDelete,onClick:()=>void p({type:"deleteSubtask",taskId:a,subtaskId:e.id}),children:(0,n.jsx)(d.A,{size:14})})]})]})}function O({taskId:e,sessionId:t,subtasks:a,enableSubtaskTimer:i=!1,activeSubtaskTimerId:s,allowAddSubtasks:l=!1,subtasksReadOnly:o=!1,t:d,post:c}){let[u,m]=(0,r.useState)(""),[b,x]=(0,r.useState)(null),[p,h]=(0,r.useState)(""),[k,g]=(0,r.useState)(!1),[f,v]=(0,r.useState)(null),[j,y]=(0,r.useState)(null),[z,N]=(0,r.useState)(1),w=a??[],M=(0,T.FR)((0,T.MS)(T.AN,{activationConstraint:{distance:6}}),(0,T.MS)(T.uN,{coordinateGetter:S.JR}));(0,r.useEffect)(()=>{o&&(x(null),m(""),g(!1))},[o]),(0,r.useEffect)(()=>{x(null),m(""),g(!1)},[e]);let C=async e=>{await c({...e,...t?{sessionId:t}:{}})},D=w.length>0,L=l&&!o,E=L&&!D&&!k,A=L&&(D||k),$=!o&&w.length>1;if(!D&&!L)return null;if(E)return(0,n.jsx)("button",{type:"button",className:"text-left text-[0.7rem] font-medium text-zinc-600 underline decoration-zinc-400/70 underline-offset-2 hover:text-zinc-900 dark:text-zinc-400 dark:decoration-zinc-500/70 dark:hover:text-zinc-200",onClick:()=>g(!0),children:d.addSubtaskLinkBtn});let I=w.map(e=>e.id),F=!f,B=(t,a)=>{let n=t+a;n<0||n>=w.length||C({type:"reorderSubtasks",taskId:e,orderedSubtaskIds:(0,S.be)(w,t,n).map(e=>e.id)})},R=$?(0,n.jsxs)(T.Mp,{sensors:M,collisionDetection:T.fp,onDragStart:e=>{let t=String(e.active.id);v(t);let a=w.findIndex(e=>e.id===t),n=w[a];n&&(y(n),N(a+1))},onDragOver:e=>{let{over:t}=e;if(!t)return;let a=w.findIndex(e=>e.id===String(t.id));a>=0&&N(a+1)},onDragEnd:t=>{let{active:a,over:n}=t;if(v(null),y(null),!n||a.id===n.id)return;let r=w.findIndex(e=>e.id===a.id),i=w.findIndex(e=>e.id===n.id);r<0||i<0||C({type:"reorderSubtasks",taskId:e,orderedSubtaskIds:(0,S.be)(w,r,i).map(e=>e.id)})},onDragCancel:()=>{v(null),y(null)},children:[(0,n.jsx)("div",{className:`relative rounded-lg px-0 py-0.5 transition-[background-color,box-shadow] duration-200 ${f?"bg-zinc-500/20 shadow-inner ring-1 ring-zinc-500/45 dark:bg-black/55 dark:ring-zinc-600/55":""}`,children:(0,n.jsx)(S.gB,{items:I,strategy:S._G,children:(0,n.jsx)("ul",{className:"divide-y divide-zinc-200 dark:divide-zinc-800/90",children:w.map((t,a)=>(0,n.jsx)(_,{st:t,index:a,showOrdinal:F,activeDragId:f,taskId:e,enableSubtaskTimer:i,activeSubtaskTimerId:s,subtasksReadOnly:o,t:d,editingId:b,editVal:p,setEditingId:x,setEditVal:h,send:C,dragLabel:d.subtaskDragReorderHandle,listLength:w.length,onReorderStep:B},t.id))})})}),(0,n.jsx)(T.Hd,{dropAnimation:{duration:220,easing:"cubic-bezier(0.22, 1, 0.36, 1)"},children:j?(0,n.jsx)(H,{st:j,ord:z,isTracking:i&&String(s??"").trim()===String(j.id).trim(),enableSubtaskTimer:i,subtasksReadOnly:o,showReorderGutter:!0,t:d}):null})]}):(0,n.jsx)("ul",{className:"divide-y divide-zinc-200 dark:divide-zinc-800/90",children:w.map((t,a)=>(0,n.jsx)(W,{st:t,index:a,taskId:e,enableSubtaskTimer:i,activeSubtaskTimerId:s,subtasksReadOnly:o,t:d,editingId:b,editVal:p,setEditingId:x,setEditVal:h,send:C},t.id))});return(0,n.jsxs)("div",{className:D?"mt-4 border-l border-zinc-300 pl-3 ml-0.5 dark:border-zinc-700/55":void 0,children:[D?(0,n.jsx)("div",{className:"mb-1.5 text-[0.65rem] font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-500",children:d.subtasksHeading}):null,D?R:null,A?(0,n.jsx)("div",{className:D?"mt-2 border-t border-zinc-200 pt-2 dark:border-zinc-800/80":void 0,children:(0,n.jsx)(P,{draft:u,setDraft:m,taskId:e,send:C,t:d,autoFocus:k&&!D,onDismissIfEmpty:()=>g(!1)})}):null]})}var q=a(8783),K=a(7018),U=a(9474),V=a(8949);let Y=`inline-flex ${w.ts} w-[1.875rem] shrink-0 items-center justify-center rounded-md border border-zinc-300/90 bg-white/80 text-zinc-600 hover:bg-zinc-100 dark:border-zinc-600/90 dark:bg-zinc-900/40 dark:text-zinc-400 dark:hover:bg-zinc-800`;function G({colorKey:e,pressed:t,label:a,onPick:r}){return(0,n.jsx)("button",{type:"button",title:a,"aria-label":a,"aria-pressed":t,onClick:r,className:`size-4 shrink-0 rounded-full border transition focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-violet-500/60 ${null===e?t?"border-violet-500/70 bg-zinc-100 ring-1 ring-violet-500/35 dark:bg-zinc-800":"border-dashed border-zinc-400/80 bg-zinc-50 dark:border-zinc-500/80 dark:bg-zinc-900/60":`${V.le[e]} ${t?"border-white ring-1 ring-violet-500/55 dark:border-zinc-900":"border-transparent opacity-80 hover:opacity-100"}`}`})}function Z({value:e,onChange:t,t:a,disabled:i=!1,size:s="default"}){let[l,o]=(0,r.useState)(!1),d=(0,r.useRef)(null),c=(0,r.useId)(),u=(0,V.dM)(e),m=void 0===u?null:u;(0,r.useEffect)(()=>{if(!l)return;let e=e=>{d.current?.contains(e.target)||o(!1)},t=e=>{"Escape"===e.key&&o(!1)};return document.addEventListener("pointerdown",e),document.addEventListener("keydown",t),()=>{document.removeEventListener("pointerdown",e),document.removeEventListener("keydown",t)}},[l]);let b=e=>{t(e),o(!1)},x=null===m?a.ganttColorPickerAuto:a.ganttColorPickerSwatch.replace("{color}",m);return(0,n.jsxs)("div",{ref:d,className:"relative",children:[(0,n.jsx)("button",{type:"button",disabled:i,className:`${"compact"===s?Y:"inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-lg border border-zinc-300/90 bg-white/80 text-zinc-600 hover:bg-zinc-100 dark:border-zinc-600/90 dark:bg-zinc-900/40 dark:text-zinc-400 dark:hover:bg-zinc-800"} disabled:opacity-40`,title:a.taskGanttColorLabel,"aria-label":x,"aria-expanded":l,"aria-controls":l?c:void 0,onClick:()=>o(e=>!e),children:(0,n.jsx)("span",{className:`${"compact"===s?"size-2.5 rounded-full":"size-3.5 rounded-full"} ${null===m?"border border-dashed border-zinc-400/90 bg-zinc-200/50 dark:border-zinc-500/90 dark:bg-zinc-700/40":`${V.le[m]} ring-1 ring-black/10 dark:ring-white/15`}`,"aria-hidden":!0})}),l?(0,n.jsxs)("div",{id:c,role:"group","aria-label":a.ganttColorPickerAria,className:"absolute right-0 top-[calc(100%+0.25rem)] z-30 flex items-center gap-0.5 rounded-lg border border-zinc-200/90 bg-white/95 p-1 shadow-md shadow-zinc-900/10 backdrop-blur-sm dark:border-zinc-700/90 dark:bg-zinc-900/95 dark:shadow-black/30",children:[(0,n.jsx)(G,{colorKey:null,pressed:null===m,label:a.ganttColorPickerAuto,onPick:()=>b(null)}),V.e$.map(e=>(0,n.jsx)(G,{colorKey:e,pressed:m===e,label:a.ganttColorPickerSwatch.replace("{color}",e),onPick:()=>b(e)},e))]}):null]})}var X=a(2047);let Q="kronosys_finish_task_subtasks_warn_dismiss_v1";function J(e){let t,a=Array.isArray(t=e.taskTimerLaps)&&0!==t.length?t.reduce((e,t)=>{let a="number"==typeof t?.durationMs&&Number.isFinite(t.durationMs)?Math.max(0,Math.floor(t.durationMs)):NaN;if(Number.isFinite(a)&&a>0)return e+a;let n="string"==typeof t?.startTime?t.startTime.trim():"",r="string"==typeof t?.endTime?t.endTime.trim():"";return n&&r?e+Math.max(0,Date.parse(r)-Date.parse(n)):e},0):0;if(a>0)return a;let n=e.durationMs;if("number"==typeof n&&Number.isFinite(n)&&n>0)return Math.max(0,Math.floor(n));let r="string"==typeof e.startTime?new Date(e.startTime).getTime():NaN,i="string"==typeof e.endTime?new Date(e.endTime).getTime():NaN;return Number.isFinite(r)&&Number.isFinite(i)&&i>=r?Math.max(0,Math.floor(i-r)):0}function ee({task:e,lang:t,displayTimeZone:a=p.GB,use24HourClock:T=!0,calendarWeekStartsOn:S="sunday",isInspecting:M,inspectingId:C,knownTags:D,knownProjects:L,knownPersonalProjects:A=[],post:$,t:I,confirmDeleteTask:P,kronoFocusIsRunningOrPaused:F,showKronoFocusTaskActions:B=!0,startKronoFocusFromTask:R,onDuplicateTask:H,onSaveAsTemplate:_,isAlreadyTemplate:W=!1,pausePlayMode:V,onPausePlay:Y,anchorId:G,variant:et="card",allowTaskStartTimeEdit:ea=!0,allowTaskEndTimeEdit:en=!0,showTaskActionButtons:er=!0,allowAddSubtasks:ei=!0,showLiveTimerWhenInspecting:es=!1,deriveLiveTimerFromStartTime:el=!0,temporalPlanned:eo=!1,taskMinimumDurationMinutes:ed=30,reopenTaskContext:ec}){let eu,em=(0,r.useId)(),[eb,ex]=(0,r.useState)(!1),[ep,eh]=(0,r.useState)(!1),[ek,eg]=(0,r.useState)(!1),[ef,ev]=(0,r.useState)(""),[ej,ey]=(0,r.useState)(()=>"string"==typeof e.note?e.note:""),[ez,eN]=(0,r.useState)(""),[ew,eT]=(0,r.useState)(null),[eS,eM]=(0,r.useState)(null),[eC,eD]=(0,r.useState)(""),[eL,eE]=(0,r.useState)([]),[eA,e$]=(0,r.useState)(null),[eI,eP]=(0,r.useState)(null),[eF,eB]=(0,r.useState)(!1),[eR,eH]=(0,r.useState)(null),[e_,eW]=(0,r.useState)("0"),[eO,eq]=(0,r.useState)("0"),[eK,eU]=(0,r.useState)("0"),eV=(0,r.useRef)(!1),[eY,eG]=(0,r.useState)("0"),[eZ,eX]=(0,r.useState)("0"),[eQ,eJ]=(0,r.useState)("0"),e0=(0,r.useRef)(!1),[e1,e5]=(0,r.useState)(!1),[e2,e4]=(0,r.useState)("keep"),[e6,e9]=(0,r.useState)("align_start"),e3=(0,r.useId)(),[e8,e7]=(0,r.useState)("0"),[te,tt]=(0,r.useState)("0"),[ta,tn]=(0,r.useState)("0"),[tr,ti]=(0,r.useState)(null),ts=(0,r.useRef)(null),tl=(0,r.useRef)(!1),to=(0,r.useRef)(!1),[td,tc]=(0,r.useState)(!1),[tu,tm]=(0,r.useState)(()=>Date.now()),[tb,tx]=(0,r.useState)(()=>Date.now()),[tp,th]=(0,r.useState)(!1),[tk,tg]=(0,r.useState)("paused"),[tf,tv]=(0,r.useState)("0"),[tj,ty]=(0,r.useState)("0"),[tz,tN]=(0,r.useState)("0"),[tw,tT]=(0,r.useState)(!1),[tS,tM]=(0,r.useState)(!1),tC=(0,r.useRef)(!1),tD=(0,r.useId)(),tL=ec?.canResumeTimer===!0,tE=ec?.otherRunningTaskIds??[];(0,r.useEffect)(()=>{tC.current=tS},[tS]);let tA=(0,h.hk)(e.name,e.tags),t$=e.project?.trim()??"",tI=!0===e.personalProject,tP=(0,h.ZW)(e.name),tF=(0,h.I6)(e.name),tB=(0,h.jN)(e.name),tR=!0===e.isDone,tH=!tR&&"resume"===V,t_=!tR&&"pause"===V,tW=!eo&&!tR&&(!M||es)&&"pause"===V,tO=null!==ew?ew:null!==eS?eS:tR?J(e):Math.max(0,e.durationMs??0),tq=(0,E.F)(tO,tW),tK=tW?"text-emerald-700 dark:text-emerald-400":eo?"text-sky-700 dark:text-sky-300/90":tR?"text-zinc-600 dark:text-zinc-400":"text-zinc-700 dark:text-zinc-300",tU=(0,n.jsx)("span",{className:`block font-mono text-lg font-bold leading-none tabular-nums tracking-tight sm:text-xl ${tK}`,"aria-live":tW?"polite":void 0,title:(0,h.Td)(tq),children:(0,h.Td)(tq)}),tV="string"==typeof e.startTime?(0,x._)(e.startTime,t,a,T):null,tY="string"==typeof e.endTime&&""!==e.endTime.trim()?e.endTime:"string"==typeof e.scheduledEndAt&&""!==e.scheduledEndAt.trim()?e.scheduledEndAt:void 0,tG="string"==typeof tY?(0,x._)(tY,t,a,T):null,tZ=tR?null!==eI?eI:(eu=J(e))>0?eu/6e4:null:null,tX=null!==tZ?(0,h.a3)(tZ):null,tQ="string"==typeof e.startTime&&""!==e.startTime.trim(),tJ="string"==typeof tY&&""!==tY.trim(),t0=Array.isArray(e.taskTimerLaps)?e.taskTimerLaps.map((n,r)=>{let i="string"==typeof n?.startTime?n.startTime.trim():"",s="string"==typeof n?.endTime?n.endTime.trim():"";if(!i||!s)return null;let l="number"==typeof n?.durationMs&&Number.isFinite(n.durationMs)?Math.max(0,Math.floor(n.durationMs)):Math.max(0,Date.parse(s)-Date.parse(i));if(l<1e3)return null;let o=(0,x._)(i,t,a,T),d=(0,x._)(s,t,a,T);return{id:`${e.id}-lap-${r}-${i}`,lapIndex:r,startLabel:o,endLabel:d,durationLabel:(0,h.Td)(l)}}).filter(e=>null!==e).map((e,t)=>({...e,index:t+1})):[],t1=e.taskCurrentLapStartedAt,t5="string"==typeof t1?Date.parse(t1):"number"==typeof t1&&Number.isFinite(t1)?t1:NaN,t2=t_&&Number.isFinite(t5)?{id:`${e.id}-lap-running-${t5}`,index:t0.length+1,startLabel:(0,x._)(new Date(t5).toISOString(),t,a,T),endLabel:I.taskTimerLapRunningLabel,durationLabel:(0,h.Td)(Math.max(0,tb-t5)),isRunning:!0}:null,t4=null!==t2?[...t0,t2]:t0,t6=(!!tR||ea)&&tQ,t9=(!!tR||en)&&(tQ||tJ),t3=t6||t9||null!==tV||null!==tG||tR&&null!==tX,t8=!!tR||ea,t7=t6||t9,ae=(0,f.L)(ez,eC),at=(0,f.s1)(ez,eC,eY,eZ,eQ),aa=(0,f.t6)(ez,eC,eY,eZ,eQ),an=(0,r.useMemo)(()=>Array.isArray(e.taskTimerLaps)&&e.taskTimerLaps.length>0,[e.taskTimerLaps])&&tW?"fr"===t?"Cette t\xe2che a des laps enregistr\xe9s. La modification du d\xe9but peut cr\xe9er un chevauchement avec le lap en cours.":"This task has recorded laps. Changing the start time may create overlap with the running lap.":"",ar=(0,v.T)(ez,eC,t,T),ai=null!==eR?eL[eR]?.start??"":"",as=null!==eR?eL[eR]?.end??"":"",al=(0,r.useMemo)(()=>{if(null===eR)return"";let a=ai.trim(),n=as.trim();if(!a||!n)return"";let r=Date.parse(a),i=Date.parse(n);if(!Number.isFinite(r)||!Number.isFinite(i))return"";let s=Array.isArray(e.taskTimerLaps)?e.taskTimerLaps:[];if(eR>0){let e=s[eR-1],a="string"==typeof e?.endTime?Date.parse(e.endTime):NaN;if(Number.isFinite(a)&&r<a)return"fr"===t?`Le d\xe9but chevauche le lap #${eR} (fin \xe0 ${new Date(a).toLocaleTimeString()})`:`Start overlaps lap #${eR} (ends at ${new Date(a).toLocaleTimeString()})`}if(eR<s.length-1){let e=s[eR+1],a="string"==typeof e?.startTime?Date.parse(e.startTime):NaN;if(Number.isFinite(a)&&i>a)return"fr"===t?`La fin chevauche le lap #${eR+2} (d\xe9but \xe0 ${new Date(a).toLocaleTimeString()})`:`End overlaps lap #${eR+2} (starts at ${new Date(a).toLocaleTimeString()})`}return""},[eR,ai,as,e.taskTimerLaps,t]),ao=null!==eR&&(0,f.t6)(ai,as,e_,eO,eK,{requireEnd:!0})&&!al,ad=[tV?`${I.archiveTaskStartLabel} ${tV}`:"",tG?`${I.archiveTaskEndLabel} ${tG}`:"",tX?`${I.taskTimingDurationLabel} ${tX}`:""].filter(Boolean).join(", "),ac="string"==typeof e.scheduledEndAt&&""!==e.scheduledEndAt.trim()?Date.parse(e.scheduledEndAt):NaN,au=Number.isFinite(ac)?ac-tu:NaN;(0,r.useEffect)(()=>{eg(!1)},[e.id]),(0,r.useEffect)(()=>{if("string"!=typeof tY||""===tY.trim()||tR)return;let e=globalThis.setInterval(()=>{tm(Date.now())},1e3);return()=>globalThis.clearInterval(e)},[tY,tR,e.id]),(0,r.useEffect)(()=>{if(!t_||!Number.isFinite(t5))return;let e=globalThis.setInterval(()=>{tx(Date.now())},1e3);return()=>globalThis.clearInterval(e)},[t_,t5,e.id]),(0,r.useEffect)(()=>{ey("string"==typeof e.note?e.note:"")},[e.id,e.note]),(0,r.useEffect)(()=>{if(!tR){to.current=!1;return}if(to.current)return;let t="string"==typeof e.endTime?Date.parse(e.endTime):NaN;if(!Number.isFinite(t)||Math.abs(Date.now()-t)>2600)return;to.current=!0,tc(!0);let a=globalThis.setTimeout(()=>tc(!1),750);return()=>globalThis.clearTimeout(a)},[e.id,tR,e.endTime]),(0,r.useEffect)(()=>{let t="string"==typeof e.startTime?e.startTime.trim():"",a=t?new Date(t):null;!a||Number.isNaN(a.getTime())?eN(""):eN((0,U.Pw)(a))},[e.id,e.startTime]),(0,r.useEffect)(()=>{let t="string"==typeof e.endTime&&""!==e.endTime.trim()?e.endTime.trim():"string"==typeof e.scheduledEndAt?e.scheduledEndAt.trim():"",a=t?new Date(t):null;!a||Number.isNaN(a.getTime())?eD(""):eD((0,U.Pw)(a))},[e.id,e.endTime,e.scheduledEndAt]),(0,r.useEffect)(()=>{eE((Array.isArray(e.taskTimerLaps)?e.taskTimerLaps:[]).map(e=>{let t="string"==typeof e?.startTime?Date.parse(e.startTime):NaN,a="string"==typeof e?.endTime?Date.parse(e.endTime):NaN;return{start:Number.isFinite(t)?(0,U.Pw)(new Date(t)):"",end:Number.isFinite(a)?(0,U.Pw)(new Date(a)):""}}))},[e.id,e.taskTimerLaps]),(0,r.useEffect)(()=>{eT(null)},[e.id,e.durationMs]),(0,r.useEffect)(()=>{eP(null)},[e.id,e.durationMs,e.endTime]),(0,r.useEffect)(()=>{let t=Math.max(0,Math.floor((e.durationMs??0)/1e3));t>=3600&&(t=60*Math.floor(t/60));let a=Math.floor(t/3600),n=Math.floor(t%3600/60),r=t%60;e7(String(a)),tt(String(n)),tn(String(r))},[e.id,e.durationMs]),(0,r.useEffect)(()=>{let t=ez.trim()?new Date(ez).getTime():NaN,a=eC.trim()?new Date(eC).getTime():NaN;if(!Number.isFinite(t)||!Number.isFinite(a)||a<=t)return;let n=a-t,r=tR&&"number"==typeof e.durationMs?Math.min(Math.max(0,e.durationMs),n):n,i=(0,f.hE)(r/1e3);eG(i.h),eX(i.m),eJ(i.s)},[ez,eC,tR,e.durationMs,e.id]),(0,r.useEffect)(()=>{if(!tW||!el||eo)return void eM(null);let t=Math.max(0,e.durationMs??0),a="string"==typeof e.activeSubtaskTimerId&&""!==e.activeSubtaskTimerId.trim()?e.subtaskTimerStartedAt:e.mainTimerSegmentStartedAt,n="string"==typeof a?Date.parse(a):"number"==typeof a&&Number.isFinite(a)?a:NaN;if(!Number.isFinite(n))return void eM(null);let r="string"==typeof e.startTime?e.startTime.trim():"",i=r?Date.parse(r):NaN,s=Math.max(0,Date.now()-n);Number.isFinite(i)&&n<=i+2e3?eM(t+Math.min(s,2e3)):eM(t+s)},[el,tW,e.durationMs,e.startTime,e.activeSubtaskTimerId,e.subtaskTimerStartedAt,e.mainTimerSegmentStartedAt,e.id,eo]),(0,r.useEffect)(()=>{if(ek&&ts.current){let e=ts.current;e.focus();let t=e.value.length;e.setSelectionRange(t,t)}},[ek]);let am=(0,r.useCallback)(()=>{ev(tB),eg(!0)},[tB]),ab=(0,r.useCallback)(()=>{let t=ef.trim();if(eg(!1),""===t||t===tB)return;let a=/[@!]/.test(t),n=(0,h.H_)(t),r=(0,h.hk)(t,tA),i=a?(0,h.jM)(t):void 0,s=a?(0,h.v8)(t):void 0,l=void 0!==i?i:e.project??null,o=(0,h.Ds)(r,l),d=n.name.trim();if(d||(d=a&&n.project&&tB.trim()?tB.trim():(0,h.xm)(t,o,l??void 0)),!d.trim()&&0===o.length&&!l)return;let c={type:"updateTask",taskId:e.id,name:d,tags:o};C&&(c.sessionId=C),void 0!==i&&(c.project=i),void 0!==s&&(c.personalProject=s),$(c)},[ef,tB,e.id,e.project,tA,C,$]),ax=(0,r.useCallback)(()=>{tl.current=!0,ev(tB),eg(!1)},[tB]),ap=(0,r.useCallback)(()=>{$({type:"finishTask",taskId:e.id})},[$,e.id]),ah=(0,r.useCallback)(t=>{let a={type:"updateTask",taskId:e.id,name:e.name,tags:e.tags??[],ganttColor:t};void 0!==e.project&&(a.project=e.project),!0===e.personalProject&&(a.personalProject=!0),C&&(a.sessionId=C),$(a)},[C,$,e.id,e.name,e.personalProject,e.project,e.tags]),ak=(0,r.useCallback)(()=>{if(tR)return;let t=e.subtasks;if((Array.isArray(t)?t.filter(e=>!e.done).length:0)>0&&!function(){try{return globalThis.localStorage?.getItem(Q)==="1"}catch{return!1}}()){eh(!1),ex(!0);return}ap()},[tR,e.subtasks,ap]),ag=(0,r.useCallback)(()=>{let t=Math.max(0,Math.floor(e.durationMs??0)),a=Math.floor(t/36e5),n=Math.floor(t%36e5/6e4),r=Math.floor(t%6e4/1e3);tv(String(a)),ty(String(n)),tN(String(r))},[e.durationMs]),af=(0,r.useCallback)(async t=>{let a={type:"reopenTask",taskId:e.id,timerMode:tk,parallelTimer:t};"manual"===tk&&(a.manualDurationMs=(3600*Math.max(0,Math.floor(Number(tf)||0))+60*Math.max(0,Math.floor(Number(tj)||0))+Math.max(0,Math.floor(Number(tz)||0)))*1e3),C&&(a.sessionId=C),th(!1),tT(!1),await $(a)},[C,$,tf,tj,tz,tk,e.id]),av=(0,r.useCallback)(async(e,t)=>{t&&K.n.getState().setConcurrentTaskStartPreference(e),tT(!1),tM(!1);try{if("parallel"!==e)for(let t of tE){let a={taskId:t};C&&(a.sessionId=C),"pause"===e?await $({...a,type:"setTaskTimerPaused",paused:!0}):await $({...a,type:"finishTask"})}await af("parallel"===e)}finally{th(!1)}},[af,C,tE,$]),aj=(0,r.useCallback)(()=>{if("resume"===tk&&tL&&tE.length>0){let e=K.n.getState().concurrentTaskStartPreference;return(th(!1),"pause"===e)?void av("pause",!1):"finish"===e?void av("finish",!1):"parallel"===e?void av("parallel",!1):(tM(!1),void tT(!0))}af(!1)},[tL,af,tE.length,tk,av]),ay=(0,r.useCallback)(()=>{tg("paused"),ag(),th(!0)},[ag]),az=(0,n.jsx)("button",{type:"button",className:w.XO,title:I.reopenTaskBtn,"aria-label":I.reopenTaskBtn,onClick:ay,children:(0,n.jsx)(i.A,{size:14})}),aN=(0,r.useCallback)(e=>{eN(e)},[]),aw=(0,r.useCallback)(e=>{e0.current=!0,eD(e)},[]);(0,r.useEffect)(()=>{if(tR)return;if(e0.current){e0.current=!1;return}let e=ez.trim();if(!e)return;let t=Date.parse(e);if(!Number.isFinite(t))return;let a=(0,X.QF)(t,ed);eD((0,U.Pw)(new Date(a)))},[tR,ed,ez]);let aT=(0,r.useCallback)(async(t,a,n)=>{let r="string"==typeof e.scheduledEndAt&&""!==e.scheduledEndAt.trim()||"string"==typeof e.endTime&&""!==e.endTime.trim(),i={type:"setTaskStartTime",taskId:e.id,startTime:t,durationAdjustMode:r?"from_bounds":"keep"};if(n?.lapAdjustMode&&(i.lapAdjustMode=n.lapAdjustMode),C&&(i.sessionId=C),tW&&eT(Math.max(0,Date.now()-a)),await $(i),!tR&&!r){let t=new Date((0,X.QF)(a,ed)).toISOString(),n={type:"setTaskEndTime",taskId:e.id,endTime:t,durationAdjustMode:"from_bounds"};C&&(n.sessionId=C),await $(n)}},[C,tR,$,tW,e.endTime,e.id,e.scheduledEndAt,ed]),aS=(0,r.useCallback)(async()=>{if(!aa)return;let t=new Date(ez).getTime(),a=""!==eC.trim(),n=a?new Date(eC).getTime():NaN,r=a?(0,f.ir)(eY,eZ,eQ):0,i=new Date(t).toISOString(),s=a?new Date(n).toISOString():"",l="string"==typeof e.startTime?e.startTime.trim():"",o="string"==typeof e.endTime&&""!==e.endTime.trim()?e.endTime.trim():"string"==typeof e.scheduledEndAt?e.scheduledEndAt.trim():"",d=t6&&i!==l,c=t9&&a&&s!==o;if(tR){if(d){let t={type:"setTaskStartTime",taskId:e.id,startTime:i,durationAdjustMode:"manual",manualDurationMs:r};C&&(t.sessionId=C),await $(t)}if(a&&(c||!d&&r!==(e.durationMs??0))){let t={type:"setTaskEndTime",taskId:e.id,endTime:s,durationAdjustMode:"manual",manualDurationMs:r};C&&(t.sessionId=C),await $(t),eP(r/6e4)}return}if(d&&await aT(i,t),c&&a){let a=r!==n-t,i={type:"setTaskEndTime",taskId:e.id,endTime:s,durationAdjustMode:a?"manual":"from_bounds"};a&&(i.manualDurationMs=r),C&&(i.sessionId=C),await $(i)}},[t9,t6,C,tR,$,aT,e.durationMs,e.endTime,e.id,e.scheduledEndAt,e.startTime,eC,ez,aa,eY,eZ,eQ]),aM=(0,r.useCallback)((e,t,a)=>{eE(n=>{let r=[...n];return r[e]?(r[e]={...r[e],[t]:a},r):n})},[]),aC=(0,r.useCallback)(t=>{if(!t8)return;let a=(Array.isArray(e.taskTimerLaps)?e.taskTimerLaps:[])[t],n=eL[t];if(!a||!n)return;let r=Date.parse(n.start),i=Date.parse(n.end);if(!Number.isFinite(r)||!Number.isFinite(i))return;let s=new Date(r).toISOString(),l=new Date(i).toISOString(),o="string"==typeof a.startTime?a.startTime.trim():"",d="string"==typeof a.endTime?a.endTime.trim():"";if(s===o&&l===d)return;let c={type:"setTaskTimerLap",taskId:e.id,lapIndex:t,startTime:s,endTime:l};C&&(c.sessionId=C),$(c)},[t8,C,eL,$,e.id,e.taskTimerLaps]),aD=(0,r.useCallback)(e=>{null!==eR&&aM(eR,"start",e)},[eR,aM]),aL=(0,r.useCallback)(e=>{null!==eR&&(eV.current=!0,aM(eR,"end",e))},[eR,aM]);(0,r.useEffect)(()=>{if(null===eR)return;let e=ai.trim()?new Date(ai).getTime():NaN,t=as.trim()?new Date(as).getTime():NaN;if(!Number.isFinite(e)||!Number.isFinite(t)||t<=e)return;let a=(0,f.hE)((t-e)/1e3);eW(a.h),eq(a.m),eU(a.s)},[as,ai,eR]),(0,r.useEffect)(()=>{if(null===eR)return;let e=as.trim(),t=ai.trim();if(!t||e)return;if(eV.current){eV.current=!1;return}let a=Date.parse(t);if(!Number.isFinite(a))return;let n=(0,X.QF)(a,ed);aM(eR,"end",(0,U.Pw)(new Date(n)))},[ai,as,eR,ed,aM]);let aE=(0,r.useCallback)(()=>{null===eR||ao&&aC(eR)},[aC,ao,eR]),aA=(0,r.useCallback)(()=>{if(null===eA)return;let t={type:"deleteTaskTimerLap",taskId:e.id,lapIndex:eA};C&&(t.sessionId=C),$(t),e$(null)},[eA,C,$,e.id]),a$=(0,r.useCallback)(()=>{if(!tr)return void e5(!1);if("start"===tr.kind){aT(tr.nextIso,tr.startMs,{lapAdjustMode:tr.needsLapAdjust?e6:void 0}),e5(!1),ti(null);return}let t={type:"setTaskEndTime",taskId:e.id,durationAdjustMode:e2,endTime:tr.nextIso};"manual"===e2&&(t.manualDurationMs=(3600*Math.max(0,Math.floor(Number(e8)||0))+60*Math.max(0,Math.floor(Number(te)||0))+Math.max(0,Math.floor(Number(ta)||0)))*1e3),C&&(t.sessionId=C),"from_bounds"===e2&&null!==tr.endMs&&eP((tr.endMs-tr.startMs)/6e4),e5(!1),ti(null),$(t)},[C,e8,te,ta,tr,$,aT,e2,e6]),aI="string"==typeof e.startTime?Date.parse(e.startTime):NaN,aP="string"==typeof tY?Date.parse(tY):NaN,aF=null!==tG&&Number.isFinite(aI)&&Number.isFinite(aP)&&aP>aI,aB=aF?tR?100:Math.min(100,Math.max(0,(tu-aI)/(aP-aI)*100)):0,aR="fr"===t?`Progression vers la fin : ${Math.round(aB)} %`:`Progress toward end: ${Math.round(aB)}%`,aH="rounded-xl border border-zinc-200/90 bg-white p-5 shadow-sm shadow-zinc-900/5 dark:border-zinc-800 dark:bg-black/20 dark:shadow-none sm:p-6",a_=G?`scroll-mt-24 ${aH}`:aH,aW=eo?"plain"===et?"text-sky-900 dark:text-sky-100":"text-sky-950 dark:text-sky-50":tR?"plain"===et?"text-zinc-500 line-through decoration-zinc-400/[0.35] decoration-[1.5px] dark:text-zinc-400 dark:decoration-zinc-500/[0.35]":"text-zinc-500 line-through decoration-zinc-400/[0.35] decoration-[1.5px] dark:text-zinc-300 dark:decoration-zinc-500/[0.35]":"plain"===et?"text-zinc-900 dark:text-zinc-100":"text-zinc-950 dark:text-zinc-50",aO=W?w._L:w.VY,aq=W?I.taskAlreadyTemplateBtn:I.taskSaveTemplateBtn,aK=()=>{let t={type:"updateTask",taskId:e.id,name:e.name,tags:e.tags??[],project:null,personalProject:!1};C&&(t.sessionId=C),$(t)},aU=t$?(0,n.jsxs)("span",{role:"button",tabIndex:0,className:`${tI?w.t:w.W1} max-w-full`,title:(0,h.Bf)(t$,{personal:tI}),onClick:aK,onKeyDown:e=>{("Enter"===e.key||" "===e.key)&&(e.preventDefault(),aK())},children:[(0,n.jsx)("span",{className:w.Yu,children:(0,h.Bf)(t$,{personal:tI})}),(0,n.jsx)("span",{className:"pointer-events-none shrink-0 text-[0.625rem] leading-none font-normal text-zinc-400 dark:text-zinc-500",children:"\xd7"})]}):null,aV=tA.length>0?(0,n.jsx)(k.Z,{variant:"applied",differentiateProjectScopedTags:!0,className:"flex min-w-0 max-w-full flex-wrap items-center justify-end gap-x-1.5 gap-y-1.5",tags:tA,defaultTagBucketLabel:I.taskTagDefaultBucket,taskProject:e.project??null,taskPersonalProject:!0===e.personalProject,onRemove:t=>{let a=tA.filter(e=>(0,h.$U)(e)!==(0,h.$U)(t)),n=(0,h.Ds)(a,e.project??null),r={type:"updateTask",taskId:e.id,name:e.name,tags:n};void 0!==e.project&&(r.project=e.project),!0===e.personalProject&&(r.personalProject=!0),C&&(r.sessionId=C),$(r)}}):null,aY=er&&M?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(Z,{value:e.ganttColor,onChange:ah,t:I,size:"compact"}),(0,n.jsx)("button",{type:"button",className:w.VY,title:I.taskDuplicateTooltip,"aria-label":I.taskDuplicateBtn,onClick:()=>H(e),children:(0,n.jsx)(s.A,{size:14})}),_?(0,n.jsx)("button",{type:"button",className:aO,title:aq,"aria-label":aq,onClick:()=>_(e),children:W?(0,n.jsx)(l.A,{size:14}):(0,n.jsx)(o.A,{size:14})}):null,tR?az:null,(0,n.jsx)("button",{type:"button",className:w.Pe,title:I.taskDeleteBtn,"aria-label":I.taskDeleteBtn,onClick:()=>P(e.id),children:(0,n.jsx)(d.A,{size:14})})]}):null,aG=er&&!M?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(Z,{value:e.ganttColor,onChange:ah,t:I,size:"compact"}),!tR&&B?(0,n.jsx)("button",{type:"button",className:`${w.Vd} ${F?"border-violet-500/55 bg-violet-100 dark:border-violet-500/55 dark:bg-violet-950/45":""}`,title:I.startKronoFocusFromActiveTask,"aria-label":I.startKronoFocusFromActiveTask,onClick:()=>void R(),children:(0,n.jsx)(c.A,{size:14})}):null,tR?az:null===V?(0,n.jsx)("span",{className:"inline-flex h-[1.875rem] w-[1.875rem] shrink-0","aria-hidden":!0}):(0,n.jsx)("button",{type:"button",className:w.VY,title:"pause"===V?I.pauseTaskBtn:I.resumeTaskBtn,"aria-label":"pause"===V?I.pauseTaskBtn:I.resumeTaskBtn,onClick:Y,children:"pause"===V?(0,n.jsx)(u.A,{size:14}):(0,n.jsx)(m.A,{size:14,className:"ml-px"})}),tR?null:(0,n.jsx)("button",{type:"button",className:w.kY,title:I.finishTaskBtn,"aria-label":I.finishTaskBtn,onClick:()=>ak(),children:(0,n.jsx)(b.A,{size:14})}),(0,n.jsx)("button",{type:"button",className:w.VY,title:I.taskDuplicateTooltip,"aria-label":I.taskDuplicateBtn,onClick:()=>H(e),children:(0,n.jsx)(s.A,{size:14})}),_?(0,n.jsx)("button",{type:"button",className:aO,title:aq,"aria-label":aq,onClick:()=>_(e),children:W?(0,n.jsx)(l.A,{size:14}):(0,n.jsx)(o.A,{size:14})}):null,(0,n.jsx)("button",{type:"button",className:w.Pe,title:I.taskDeleteBtn,"aria-label":I.taskDeleteBtn,onClick:()=>P(e.id),children:(0,n.jsx)(d.A,{size:14})})]}):null,aZ=aU||aY||aG?(0,n.jsxs)("div",{className:"flex shrink-0 flex-wrap items-center justify-end gap-1.5",children:[aU,aY,aG]}):null,aX=!!(aZ||aV),aQ=(0,n.jsxs)("div",{className:"flex min-w-0 items-start justify-between gap-4",children:[(0,n.jsx)("div",{className:"min-w-0 shrink-0 self-center",children:tU}),aX?(0,n.jsxs)("div",{className:"flex min-w-0 flex-1 flex-col items-end gap-1.5",children:[aZ,aV]}):null]});return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{id:G,className:[a_,eo?"border-sky-400/85 bg-sky-50/80 dark:border-sky-500/55 dark:bg-sky-950/35":"",t_&&!eo?"kronosys-task-running-pulse":"",tH?"kronosys-task-paused-blink":"",td?"kronosys-task-finish-celebrate":""].filter(Boolean).join(" "),children:(0,n.jsxs)("div",{className:"flex min-w-0 flex-col gap-2.5",children:[aQ,tR&&t0.length>0?(()=>{let a="string"==typeof e.startTime?Date.parse(e.startTime):NaN,r="string"==typeof e.endTime?Date.parse(e.endTime):NaN,i="";if(Number.isFinite(a)&&Number.isFinite(r)&&r>a){let e=t0.reduce((e,t)=>e+("number"==typeof t.durationMs?Math.max(0,Math.floor(t.durationMs)):0),0),n=Math.floor(r-a);if(e>n){let a=(0,h.a3)(Math.round((e-n)/6e4));i="fr"===t?`Laps (${(0,h.a3)(Math.round(e/6e4))}) d\xe9passent la plage ${(0,h.a3)(Math.round(n/6e4))} de ${a}`:`Laps (${(0,h.a3)(Math.round(e/6e4))}) exceed bounds ${(0,h.a3)(Math.round(n/6e4))} by ${a}`}if(!i&&t0.length>0){let e=t0[t0.length-1],a="string"==typeof e.endTime?Date.parse(e.endTime):NaN;Number.isFinite(a)&&Math.abs(a-r)>6e4&&(i="fr"===t?`Dernier lap finit \xe0 ${(0,x._)(new Date(a).toISOString(),t)} au lieu de ${(0,x._)(new Date(r).toISOString(),t)}`:`Last lap ends at ${(0,x._)(new Date(a).toISOString(),t)} instead of ${(0,x._)(new Date(r).toISOString(),t)}`)}if(!i&&t0.length>1)for(let e=1;e<t0.length;e++){let a=t0[e-1],n=t0[e],r="string"==typeof a.endTime?Date.parse(a.endTime):NaN,s="string"==typeof n.startTime?Date.parse(n.startTime):NaN;if(Number.isFinite(r)&&Number.isFinite(s)&&s<r){i="fr"===t?`Lap #${e} et #${e+1} se chevauchent`:`Lap #${e} and #${e+1} overlap`;break}}}return i?(0,n.jsxs)("div",{className:"flex items-center gap-1.5 rounded-md border border-amber-300/70 bg-amber-50/90 px-2 py-1 dark:border-amber-700/60 dark:bg-amber-950/40",children:[(0,n.jsx)("span",{className:"size-1.5 rounded-full bg-amber-500 animate-pulse shrink-0","aria-hidden":!0}),(0,n.jsx)("span",{className:"text-[0.6rem] font-medium text-amber-800 dark:text-amber-200",children:i})]}):null})():null,(0,n.jsx)("div",{className:`flex min-h-10 min-w-0 flex-col justify-center bg-transparent ${"plain"===et?"border-b border-zinc-300 dark:border-zinc-600":"border-b border-zinc-300 bg-transparent dark:border-zinc-600"}`,children:ek?(0,n.jsx)(g.V,{inputRef:ts,type:"text",commitOnEnter:!0,className:w.zo,value:ef,onChange:ev,knownTags:D,knownProjects:L,knownPersonalProjects:A,usageTasks:[e],t:I,onBlur:()=>{if(tl.current){tl.current=!1;return}ab()},onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),tl.current=!0,ab()),"Escape"===e.key&&(e.preventDefault(),ax())},"aria-label":I.activeTaskTitleInputAria}):(0,n.jsx)("div",{role:"button",tabIndex:0,className:`flex h-full min-h-10 min-w-0 flex-1 cursor-pointer items-center rounded-sm outline-none focus-visible:ring-2 focus-visible:ring-zinc-500/40 ${"plain"===et?"hover:bg-zinc-200/60 dark:hover:bg-zinc-800/40":"hover:bg-zinc-200/70 dark:hover:bg-zinc-800/40"}`,onClick:()=>am(),onKeyDown:e=>{("Enter"===e.key||" "===e.key)&&(e.preventDefault(),am())},title:I.activeTaskTitleEditHint,"aria-label":I.activeTaskTitleEditHint,children:(0,n.jsx)("div",{className:`flex h-full min-h-0 min-w-0 flex-1 flex-wrap items-center overflow-x-auto overflow-y-hidden ${w.O6} ${aW}`,children:tF.trim()?(0,n.jsx)(z.E,{source:tF,variant:"inline"}):(0,n.jsx)("span",{children:tP||"—"})})})}),t3?(0,n.jsxs)("div",{className:"space-y-1.5","aria-label":ad||void 0,children:[(0,n.jsx)(y._,{label:ar,fallbackLabel:I.pastTaskTimingEditBtn,rangeValid:ae,durationValid:""===eC.trim()?ae:at,ariaLabel:I.pastTaskTimingSummaryAria,disabled:!t7,onClick:()=>{t7&&eB(!0)}}),aF?(0,n.jsx)("div",{className:"flex min-w-0 w-full max-w-full items-center",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(aB),"aria-label":aR,children:(0,n.jsx)("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-zinc-200/90 dark:bg-zinc-700/80",children:(0,n.jsx)("div",{className:`h-full rounded-full bg-emerald-500/80 transition-[width] duration-1000 ease-linear dark:bg-emerald-400/75 ${Number.isFinite(au)&&au>0&&au<=3e5?"kronosys-end-time-alert-fast":Number.isFinite(au)&&au>0&&au<=9e5?"kronosys-end-time-alert-slow":""}`,style:{width:`${aB}%`}})})}):null]}):null,t4.length>0?(0,n.jsxs)("div",{className:"space-y-2.5 border-t border-zinc-200/80 pt-3 dark:border-zinc-700/70",children:[(0,n.jsx)("div",{className:"text-[0.65rem] font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400",children:I.taskTimerLapsHeading}),(0,n.jsxs)("div",{className:"space-y-1.5",children:[t0.map(e=>{let a=eL[e.lapIndex],r=(0,v.T)(a?.start??"",a?.end??"",t,T)??(e.startLabel&&e.endLabel?`${e.startLabel} → ${e.endLabel}`:null),i=(0,f.L)(a?.start??"",a?.end??"",{requireEnd:!0});return(0,n.jsxs)("div",{className:"flex min-w-0 items-center gap-2 text-[0.72rem] leading-tight text-zinc-700 dark:text-zinc-300",children:[(0,n.jsxs)("span",{className:"w-6 shrink-0 tabular-nums font-semibold text-zinc-500 dark:text-zinc-400",children:["#",e.index]}),(0,n.jsx)(y._,{className:"min-w-0 flex-1 text-xs",label:r,fallbackLabel:I.pastTaskTimingEditBtn,rangeValid:i,durationValid:i,ariaLabel:`${I.pastTaskTimingSummaryAria} #${e.index}`,disabled:!t8,onClick:()=>{t8&&eH(e.lapIndex)}}),(0,n.jsx)("span",{className:"shrink-0 tabular-nums font-medium text-zinc-900 dark:text-zinc-100",children:e.durationLabel}),t8?(0,n.jsx)("button",{type:"button",className:w.Pe,title:I.taskTimerLapDeleteBtn,"aria-label":I.taskTimerLapDeleteBtn,onClick:()=>e$(e.lapIndex),children:(0,n.jsx)(d.A,{size:14})}):null]},e.id)}),t2?(0,n.jsxs)("div",{className:"flex min-w-0 items-center gap-2 text-[0.72rem] leading-tight text-zinc-700 dark:text-zinc-300",children:[(0,n.jsxs)("span",{className:"w-6 shrink-0 tabular-nums font-semibold text-zinc-500 dark:text-zinc-400",children:["#",t2.index]}),(0,n.jsx)(y._,{className:"min-w-0 flex-1 text-xs",label:t2.startLabel?`${t2.startLabel} → ${t2.endLabel}`:null,fallbackLabel:I.pastTaskTimingEditBtn,rangeValid:!0,durationValid:!0,ariaLabel:`${I.pastTaskTimingSummaryAria} #${t2.index}`,disabled:!0,onClick:()=>{}}),(0,n.jsx)("span",{className:"shrink-0 tabular-nums font-medium text-emerald-700 dark:text-emerald-400",children:t2.durationLabel})]}):null]})]}):null,(0,n.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,n.jsx)(N.a,{t:I,resetKey:e.id,value:ej,onChange:ey,onCommit:()=>{if(ej===("string"==typeof e.note?e.note:""))return;let t={type:"updateTask",taskId:e.id,note:ej};C&&(t.sessionId=C),$(t)}}),(0,n.jsx)(O,{taskId:e.id,sessionId:C,subtasks:e.subtasks,enableSubtaskTimer:!M&&!tR,activeSubtaskTimerId:e.activeSubtaskTimerId,allowAddSubtasks:ei&&!tR,subtasksReadOnly:tR,t:I,post:$})]})]})}),(0,n.jsx)(j.v,{open:eF,onClose:()=>eB(!1),onConfirm:()=>{aS()},lang:t,t:I,calendarWeekStartsOn:S,pastStartLocal:ez,onPastStartChange:aN,pastEndLocal:eC,onPastEndChange:aw,pastManualHours:eY,onPastManualHoursChange:eG,pastManualMinutes:eZ,onPastManualMinutesChange:eX,pastManualSeconds:eQ,onPastManualSecondsChange:eJ,canConfirm:aa,lapTimingConflictMessage:an||void 0}),(0,n.jsx)(j.v,{open:null!==eR,onClose:()=>eH(null),onConfirm:aE,lang:t,t:I,calendarWeekStartsOn:S,pastStartLocal:ai,onPastStartChange:aD,pastEndLocal:as,onPastEndChange:aL,pastManualHours:e_,onPastManualHoursChange:eW,pastManualMinutes:eO,onPastManualMinutesChange:eq,pastManualSeconds:eK,onPastManualSecondsChange:eU,canConfirm:ao,lapTimingConflictMessage:al||void 0}),(0,n.jsx)(q.qR,{open:null!==eA,title:I.taskTimerLapDeleteConfirmTitle,message:I.taskTimerLapDeleteConfirmMessage,cancelLabel:I.dialogCancelBtn,confirmLabel:I.taskTimerLapDeleteBtn,onCancel:()=>e$(null),onConfirm:aA}),(0,n.jsx)(q.qR,{open:eb,title:I.finishTaskOpenSubtasksWarnTitle,message:I.finishTaskOpenSubtasksWarnBody,cancelLabel:I.dialogCancelBtn,confirmLabel:I.finishTaskBtn,dismissCheckbox:{label:I.sessionArchiveDontShowAgain,checked:ep,onChange:eh},onCancel:()=>{ex(!1),eh(!1)},onConfirm:()=>{ep&&function(){try{globalThis.localStorage?.setItem(Q,"1")}catch{}}(),ex(!1),ap()}}),(0,n.jsx)(q.qR,{open:e1,title:I.taskTimingAdjustModalTitle,message:tr?.kind==="start"&&tr.needsLapAdjust?I.taskTimingAdjustModalMessageRunning:I.taskTimingAdjustModalMessage,cancelLabel:I.dialogCancelBtn,confirmLabel:I.dialogConfirmBtn,onCancel:()=>{e5(!1),ti(null)},onConfirm:a$,extra:(0,n.jsxs)("div",{className:"space-y-3 text-sm",children:[tr?.kind==="start"&&tr.needsLapAdjust?(0,n.jsxs)("div",{className:"space-y-2 rounded-lg border border-zinc-200 bg-zinc-50/90 p-3 dark:border-zinc-700 dark:bg-zinc-900/60",children:[(0,n.jsx)("div",{className:"text-xs font-semibold uppercase tracking-wide text-zinc-600 dark:text-zinc-400",children:I.taskTimingAdjustLapSectionTitle.replace("{n}",String(tr.runningLapIndex))}),(0,n.jsxs)("label",{className:"flex items-start gap-2",children:[(0,n.jsx)("input",{type:"radio",name:`kronosys-task-lap-adjust-${e3}`,checked:"keep"===e6,onChange:()=>e9("keep")}),(0,n.jsx)("span",{children:I.taskTimingAdjustLapKeep})]}),(0,n.jsxs)("label",{className:"flex items-start gap-2",children:[(0,n.jsx)("input",{type:"radio",name:`kronosys-task-lap-adjust-${e3}`,checked:"flush"===e6,onChange:()=>e9("flush")}),(0,n.jsx)("span",{children:I.taskTimingAdjustLapFlush})]}),(0,n.jsxs)("label",{className:"flex items-start gap-2",children:[(0,n.jsx)("input",{type:"radio",name:`kronosys-task-lap-adjust-${e3}`,checked:"align_start"===e6,onChange:()=>e9("align_start")}),(0,n.jsx)("span",{children:I.taskTimingAdjustLapAlignStart})]})]}):null,tr?.kind==="end"?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{className:"text-xs font-semibold uppercase tracking-wide text-zinc-600 dark:text-zinc-400",children:I.taskTimingDurationLabel}),(0,n.jsxs)("label",{className:"flex items-start gap-2",children:[(0,n.jsx)("input",{type:"radio",name:`kronosys-task-timing-adjust-mode-${em}`,checked:"keep"===e2,onChange:()=>e4("keep")}),(0,n.jsx)("span",{children:I.taskTimingAdjustKeepDuration})]}),(0,n.jsxs)("label",{className:"flex items-start gap-2",children:[(0,n.jsx)("input",{type:"radio",name:`kronosys-task-timing-adjust-mode-${em}`,checked:"manual"===e2,onChange:()=>e4("manual")}),(0,n.jsx)("span",{children:I.taskTimingAdjustManualDuration})]}),"manual"===e2?(0,n.jsxs)("div",{className:"grid grid-cols-3 gap-2",children:[(0,n.jsxs)("label",{className:"text-xs",children:[I.taskTimingAdjustHours,(0,n.jsx)("input",{type:"number",min:0,value:e8,onChange:e=>e7(e.target.value),className:"mt-1 w-full rounded border border-zinc-300 px-2 py-1 dark:border-zinc-600 dark:bg-zinc-900"})]}),(0,n.jsxs)("label",{className:"text-xs",children:[I.taskTimingAdjustMinutes,(0,n.jsx)("input",{type:"number",min:0,max:59,value:te,onChange:e=>tt(e.target.value),className:"mt-1 w-full rounded border border-zinc-300 px-2 py-1 dark:border-zinc-600 dark:bg-zinc-900"})]}),(0,n.jsxs)("label",{className:"text-xs",children:[I.taskTimingAdjustSeconds,(0,n.jsx)("input",{type:"number",min:0,max:59,value:ta,onChange:e=>tn(e.target.value),className:"mt-1 w-full rounded border border-zinc-300 px-2 py-1 dark:border-zinc-600 dark:bg-zinc-900"})]})]}):null,(0,n.jsxs)("label",{className:"flex items-start gap-2",children:[(0,n.jsx)("input",{type:"radio",name:`kronosys-task-timing-adjust-mode-${em}`,checked:"from_bounds"===e2,onChange:()=>e4("from_bounds"),disabled:tr?.endMs===null}),(0,n.jsx)("span",{children:I.taskTimingAdjustFromBounds})]})]}):null]})}),(0,n.jsx)(q.qR,{open:tp,title:I.reopenTaskModalTitle,message:I.reopenTaskModalMessage,cancelLabel:I.dialogCancelBtn,confirmLabel:I.reopenTaskBtn,onCancel:()=>th(!1),onConfirm:aj,extra:(0,n.jsxs)("div",{className:"space-y-3 text-sm",children:[tL?null:(0,n.jsx)("p",{className:"text-xs text-zinc-500 dark:text-zinc-400",children:I.reopenTaskEndedSessionHint}),tL?(0,n.jsxs)("label",{className:"flex items-start gap-2",children:[(0,n.jsx)("input",{type:"radio",name:`kronosys-task-reopen-mode-${tD}`,checked:"resume"===tk,onChange:()=>tg("resume")}),(0,n.jsx)("span",{children:I.reopenTaskTimerResume})]}):null,(0,n.jsxs)("label",{className:"flex items-start gap-2",children:[(0,n.jsx)("input",{type:"radio",name:`kronosys-task-reopen-mode-${tD}`,checked:"paused"===tk,onChange:()=>tg("paused")}),(0,n.jsx)("span",{children:I.reopenTaskTimerPaused})]}),(0,n.jsxs)("label",{className:"flex items-start gap-2",children:[(0,n.jsx)("input",{type:"radio",name:`kronosys-task-reopen-mode-${tD}`,checked:"manual"===tk,onChange:()=>tg("manual")}),(0,n.jsx)("span",{children:I.reopenTaskTimerManual})]}),"manual"===tk?(0,n.jsxs)("div",{className:"grid grid-cols-3 gap-2",children:[(0,n.jsxs)("label",{className:"text-xs",children:[I.taskTimingAdjustHours,(0,n.jsx)("input",{type:"number",min:0,value:tf,onChange:e=>tv(e.target.value),className:"mt-1 w-full rounded border border-zinc-300 px-2 py-1 dark:border-zinc-600 dark:bg-zinc-900"})]}),(0,n.jsxs)("label",{className:"text-xs",children:[I.taskTimingAdjustMinutes,(0,n.jsx)("input",{type:"number",min:0,max:59,value:tj,onChange:e=>ty(e.target.value),className:"mt-1 w-full rounded border border-zinc-300 px-2 py-1 dark:border-zinc-600 dark:bg-zinc-900"})]}),(0,n.jsxs)("label",{className:"text-xs",children:[I.taskTimingAdjustSeconds,(0,n.jsx)("input",{type:"number",min:0,max:59,value:tz,onChange:e=>tN(e.target.value),className:"mt-1 w-full rounded border border-zinc-300 px-2 py-1 dark:border-zinc-600 dark:bg-zinc-900"})]})]}):null,(0,n.jsxs)("label",{className:"flex items-start gap-2",children:[(0,n.jsx)("input",{type:"radio",name:`kronosys-task-reopen-mode-${tD}`,checked:"reset"===tk,onChange:()=>tg("reset")}),(0,n.jsx)("span",{children:I.reopenTaskTimerReset})]}),(0,n.jsx)("p",{className:"text-xs text-zinc-500 dark:text-zinc-400",children:I.reopenTaskSubtasksNote})]})}),(0,n.jsx)(q.NH,{open:tw,title:I.taskConcurrentTrackingConflictTitle,message:I.taskConcurrentTrackingConflictMessage,dismissLabel:I.dialogCancelBtn,tertiaryLabel:I.taskConcurrentTrackingConflictParallelBtn,secondaryLabel:I.taskConcurrentTrackingConflictPauseBtn,primaryLabel:I.taskConcurrentTrackingConflictFinishBtn,primaryVariant:"danger",dismissCheckbox:{label:I.taskConcurrentTrackingDontShowAgain,checked:tS,onChange:tM},onDismiss:()=>tT(!1),onTertiary:()=>void av("parallel",tC.current),onSecondary:()=>void av("pause",tC.current),onPrimary:()=>void av("finish",tC.current)})]})}},2047:(e,t,a)=>{function n(e){let t=e?.taskMinimumDurationMinutes;return Math.min(Math.max(Math.round("number"==typeof t&&Number.isFinite(t)?t:30),15),480)}function r(e){let t=new Date(e),a=t.getMinutes();return t.setMinutes(a<30?0:30,0,0),t}function i(e,t){return e+6e4*t}a.d(t,{QF:()=>i,SD:()=>r,rv:()=>n})},2194:(e,t,a)=>{a.d(t,{F7:()=>d,I2:()=>o,dM:()=>l});var n=a(5112);let r="dashboardCalendarWeekStartsOn",i={sunday:0,monday:1,saturday:6};function s(e){return"monday"===e||"sunday"===e||"saturday"===e}function l(e){let t=e?.[r];return s(t)?t:"sunday"}function o(e){let t=e?.[r];return s(t)?t:(0,n.EU)()}function d(e){return i[e]}},4747:(e,t,a)=>{a.d(t,{r:()=>l});var n=a(1934),r=a(9311);let i={dashboard:"kronosys.dashboard.tour.completed.v1",settings:"kronosys.settings.tour.completed.v1",reporting:"kronosys.reporting.tour.completed.v1"},s="kronosys.dashboard.tours.v2";!function(){if(window.localStorage.getItem(s))return;let e={},t=!1;for(let[a,n]of Object.entries(i))if("1"===window.localStorage.getItem(n)){e[a]=!0,t=!0;try{window.localStorage.removeItem(n)}catch{}}if(t)try{window.localStorage.setItem(s,JSON.stringify({state:e,version:0}))}catch{}}();let l=(0,n.v)()((0,r.Zr)(e=>({dashboard:!1,settings:!1,reporting:!1,markDashboardCompleted:()=>e({dashboard:!0}),markSettingsCompleted:()=>e({settings:!0}),markReportingCompleted:()=>e({reporting:!0}),resetDashboard:()=>e({dashboard:!1}),resetSettings:()=>e({settings:!1}),resetReporting:()=>e({reporting:!1})}),{name:s,partialize:e=>({dashboard:e.dashboard,settings:e.settings,reporting:e.reporting})}))},5172:(e,t,a)=>{a.d(t,{v:()=>c});var n=a(5155),r=a(2115),i=a(7650),s=a(3210),l=a(777),o=a(9474);function d({children:e}){return"u"<typeof document?null:(0,i.createPortal)(e,document.body)}function c({open:e,onClose:t,lang:a,t:i,calendarWeekStartsOn:u="sunday",pastStartLocal:m,onPastStartChange:b,pastEndLocal:x,onPastEndChange:p,pastManualHours:h,onPastManualHoursChange:k,pastManualMinutes:g,onPastManualMinutesChange:f,pastManualSeconds:v,onPastManualSecondsChange:j,canConfirm:y,onConfirm:z,lapTimingConflictMessage:N}){let w=(0,r.useId)();return((0,r.useEffect)(()=>{if(!e)return;let a=e=>{"Escape"===e.key&&t()};return document.addEventListener("keydown",a),()=>document.removeEventListener("keydown",a)},[e,t]),(0,r.useEffect)(()=>{if(!e)return;let t=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=t}},[e]),e)?(0,n.jsx)(d,{children:(0,n.jsx)("div",{className:"fixed inset-0 z-[250] flex items-center justify-center bg-black/60 p-4",role:"presentation",onMouseDown:e=>{e.target===e.currentTarget&&t()},children:(0,n.jsxs)("div",{role:"dialog","aria-modal":"true","aria-labelledby":w,className:"flex max-h-[90vh] w-full max-w-3xl flex-col overflow-hidden rounded-xl border border-zinc-200 bg-white shadow-2xl dark:border-zinc-700 dark:bg-zinc-900",onMouseDown:e=>e.stopPropagation(),children:[(0,n.jsxs)("div",{className:"flex shrink-0 items-start justify-between gap-3 border-b border-zinc-200 px-4 py-3 dark:border-zinc-700",children:[(0,n.jsx)("h2",{id:w,className:"text-base font-semibold text-zinc-900 dark:text-zinc-100",children:i.pastTaskTimingModalTitle}),(0,n.jsx)("button",{type:"button",className:"shrink-0 rounded-md p-1 text-zinc-500 hover:bg-zinc-100 hover:text-zinc-800 dark:hover:bg-zinc-800 dark:hover:text-zinc-200","aria-label":i.pastTaskTimingModalCancel,onClick:t,children:(0,n.jsx)(s.A,{className:"h-4 w-4",strokeWidth:2,"aria-hidden":!0})})]}),(0,n.jsxs)("div",{className:"min-h-0 flex-1 space-y-4 overflow-y-auto overscroll-y-contain px-4 py-4",children:[(0,n.jsxs)("div",{className:"grid gap-4 sm:grid-cols-2",children:[(0,n.jsxs)("label",{className:"flex min-w-0 flex-col text-sm text-zinc-700 dark:text-zinc-300",children:[(0,n.jsx)("span",{className:"mb-1 block font-medium text-zinc-800 dark:text-zinc-200",children:i.archiveTaskStartLabel}),(0,n.jsx)(o.Fe,{value:m,onChange:b,"aria-label":i.archiveTaskStartLabel,lang:a,defaultTimeMode:"last-half-hour",calendarWeekStartsOn:u,presentation:"inline",t:i})]}),(0,n.jsxs)("label",{className:"flex min-w-0 flex-col text-sm text-zinc-700 dark:text-zinc-300",children:[(0,n.jsxs)("span",{className:"mb-1 block font-medium text-zinc-800 dark:text-zinc-200",children:[i.archiveTaskEndLabel,(0,n.jsxs)("span",{className:"ml-1 font-normal text-zinc-500 dark:text-zinc-400",children:["(",i.pastTaskTimingEndOptional,")"]})]}),(0,n.jsx)(o.Fe,{value:x,onChange:p,"aria-label":i.archiveTaskEndLabel,lang:a,calendarWeekStartsOn:u,presentation:"inline",t:i})]})]}),""!==x.trim()?(0,n.jsxs)("div",{className:"space-y-2 border-t border-zinc-200 pt-4 dark:border-zinc-700",children:[(0,n.jsx)("div",{className:"text-center text-[0.65rem] font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-500",children:i.archiveTaskTimerDurationLabel}),(0,n.jsxs)("div",{className:"flex flex-wrap items-end justify-center gap-x-2 gap-y-1",children:[(0,n.jsxs)("label",{className:"flex w-[3.25rem] shrink-0 flex-col text-xs",children:[i.taskTimingAdjustHours,(0,n.jsx)("input",{type:"number",min:0,value:h,onChange:e=>k(e.target.value),className:"mt-1 w-full min-w-0 rounded border border-zinc-300 px-1.5 py-1 text-center tabular-nums dark:border-zinc-600 dark:bg-zinc-900"})]}),(0,n.jsxs)("label",{className:"flex w-[3.25rem] shrink-0 flex-col text-xs",children:[i.taskTimingAdjustMinutes,(0,n.jsx)("input",{type:"number",min:0,max:59,value:g,onChange:e=>f(e.target.value),className:"mt-1 w-full min-w-0 rounded border border-zinc-300 px-1.5 py-1 text-center tabular-nums dark:border-zinc-600 dark:bg-zinc-900"})]}),(0,n.jsxs)("label",{className:"flex w-[3.25rem] shrink-0 flex-col text-xs",children:[i.taskTimingAdjustSeconds,(0,n.jsx)("input",{type:"number",min:0,max:59,value:v,onChange:e=>j(e.target.value),className:"mt-1 w-full min-w-0 rounded border border-zinc-300 px-1.5 py-1 text-center tabular-nums dark:border-zinc-600 dark:bg-zinc-900"})]})]})]}):null,N?(0,n.jsx)("p",{className:"rounded-md border border-amber-300 bg-amber-50 px-3 py-2 text-xs font-medium text-amber-800 dark:border-amber-700 dark:bg-amber-950 dark:text-amber-200",children:N}):null]}),(0,n.jsxs)("div",{className:"flex shrink-0 justify-end gap-2 border-t border-zinc-200 px-4 py-3 dark:border-zinc-700",children:[(0,n.jsx)("button",{type:"button",className:"rounded-lg border border-zinc-300 px-3 py-1.5 text-sm font-medium text-zinc-700 hover:bg-zinc-50 dark:border-zinc-600 dark:text-zinc-200 dark:hover:bg-zinc-800",onClick:t,children:i.pastTaskTimingModalCancel}),(0,n.jsx)("button",{type:"button",className:l.Sx,disabled:!y,onClick:()=>{y&&(z?.(),t())},children:i.pastTaskTimingModalConfirm})]})]})})}):null}},5865:(e,t,a)=>{a.d(t,{a:()=>k});var n=a(5155),r=a(2115),i=a(7650),s=a(4961),l=a(1421),o=a(1908);let d={position:"fixed",top:0,left:0,width:384,zIndex:80,visibility:"hidden",pointerEvents:"none"},c=["**bold** and *italic* and ~~strike~~","- first item\n- second item","- [ ] todo\n- [x] done","| A | B |\n| --- | --- |\n| 1 | 2 |","[link label](https://example.com)","https://example.com","`inline code`"],u=["**Priority** — next step","See [`docs`](https://example.com)","~~cancelled~~ item"];function m({source:e,variant:t}){return(0,n.jsxs)("div",{className:"rounded-md border border-zinc-200/90 bg-zinc-50/90 p-2 dark:border-zinc-700/80 dark:bg-zinc-950/40",children:[(0,n.jsx)("pre",{className:"overflow-x-auto whitespace-pre-wrap font-mono text-[0.62rem] leading-snug text-zinc-600 dark:text-zinc-400",children:e}),(0,n.jsx)("div",{className:"mt-1.5 border-t border-zinc-200/80 pt-1.5 text-sm dark:border-zinc-700/70",children:(0,n.jsx)(l.E,{source:e,variant:t})})]})}function b({t:e,compact:t}){let[a,l]=(0,r.useState)(!1),x=(0,r.useRef)(null),p=(0,r.useRef)(null),h=(0,r.useId)(),k=(0,o.l)(a,x,p,{align:"end",maxWidthRem:24});(0,r.useEffect)(()=>{if(!a)return;let e=e=>{let t=e.target;x.current?.contains(t)||p.current?.contains(t)||l(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[a]);let g=k??(a?d:void 0),f=a&&"u">typeof document&&g?(0,i.createPortal)((0,n.jsxs)("div",{ref:p,id:`${h}-task-md-help`,style:g,className:"max-h-[min(70vh,28rem)] overflow-y-auto rounded-lg border border-zinc-200 bg-white p-2.5 text-left shadow-xl dark:border-zinc-600 dark:bg-zinc-900",role:"region","aria-label":e.taskMarkdownHelpAriaLabel,children:[(0,n.jsx)("p",{className:"text-[0.7rem] leading-snug text-zinc-700 dark:text-zinc-300",children:e.taskMarkdownHelpIntro}),(0,n.jsx)("p",{className:"mt-2 text-[0.65rem] font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400",children:e.taskMarkdownHelpNoteHeading}),(0,n.jsx)("div",{className:"mt-1.5 space-y-1.5",children:c.map(e=>(0,n.jsx)(m,{source:e,variant:"block"},e))}),(0,n.jsx)("p",{className:"mt-2 text-[0.65rem] font-semibold uppercase tracking-wide text-zinc-500 dark:text-zinc-400",children:e.taskMarkdownHelpTitleHeading}),(0,n.jsx)("div",{className:"mt-1.5 space-y-1.5",children:u.map(e=>(0,n.jsx)(m,{source:e,variant:"inline"},e))}),(0,n.jsx)("p",{className:"mt-2 text-[0.65rem] leading-snug text-zinc-600 dark:text-zinc-400",children:e.taskMarkdownHelpSecurity}),(0,n.jsx)("p",{className:"mt-1.5 text-[0.65rem] leading-snug text-zinc-600 dark:text-zinc-400",children:e.taskMarkdownHelpGfmLimits})]}),document.body):null;return(0,n.jsxs)("div",{className:`relative flex shrink-0 items-center justify-center self-center ${t?"h-5 min-w-5":"h-10"}`,ref:x,children:[(0,n.jsx)("button",{type:"button",className:`text-zinc-500 hover:bg-zinc-200/90 hover:text-zinc-800 dark:hover:bg-zinc-800 dark:hover:text-zinc-300 ${t?"flex size-full items-center justify-center rounded-sm p-0":"rounded-md p-1.5"}`,"aria-label":e.taskMarkdownHelpAriaLabel,"aria-expanded":a?"true":"false","aria-controls":`${h}-task-md-help`,onClick:()=>l(e=>!e),children:(0,n.jsx)(s.A,{size:t?11:18,strokeWidth:1.75,"aria-hidden":!0})}),f]})}var x=a(4435),p=a(149);function h({value:e,onChange:t,onCommit:a,onDismiss:i,placeholder:s,ariaLabel:o,editHint:d}){let[c,u]=(0,r.useState)(()=>0===e.trim().length),m=(0,r.useRef)(null);(0,r.useEffect)(()=>{e.trim()&&document.activeElement!==m.current&&u(!1)},[e]);let b=()=>{u(!0),requestAnimationFrame(()=>{let e=m.current;if(!e)return;e.focus(),(0,x.q)(e);let t=e.value.length;e.setSelectionRange(t,t)})};return!c&&e.trim()?(0,n.jsx)("div",{role:"button",tabIndex:0,className:p.Zm,title:d,"aria-label":o,onClick:b,onKeyDown:e=>{("Enter"===e.key||" "===e.key)&&(e.preventDefault(),b())},children:(0,n.jsx)(l.E,{source:e,variant:"block"})}):(0,n.jsx)(x.I,{textareaRef:m,placeholder:s,value:e,"aria-label":o,onChange:t,onBlur:()=>{a?.(),e.trim()?u(!1):i?.()}})}function k({t:e,value:t,onChange:a,onCommit:i,launcherPreview:s=!1,resetKey:l}){let[o,d]=(0,r.useState)(!1),c=s?"launcher":"card";(0,r.useEffect)(()=>{s&&t.trim()?d(!0):d(!1)},[s,l]);let u=function(e,t,a="card"){return"launcher"===a?!t:0===e.trim().length&&!t}(t,o,c),m=function(e,t,a="card"){return"launcher"===a?t:t||e.trim().length>0}(t,o,c);return(0,n.jsxs)("div",{className:"space-y-0.5",children:[(0,n.jsx)("span",{className:"sr-only",children:e.taskNoteLabel}),u?(0,n.jsxs)("div",{className:"flex min-w-0 items-center justify-between gap-2",children:[(0,n.jsx)("button",{type:"button",className:"text-left text-[0.7rem] font-medium text-zinc-600 underline decoration-zinc-400/70 underline-offset-2 hover:text-zinc-900 dark:text-zinc-400 dark:decoration-zinc-500/70 dark:hover:text-zinc-200",onClick:()=>d(!0),children:e.taskNoteAddBtn}),(0,n.jsx)(b,{t:e,compact:!0})]}):null,m?s?(0,n.jsxs)("div",{className:"flex min-w-0 items-start gap-2",children:[(0,n.jsx)(x.I,{className:"min-w-0 flex-1",placeholder:e.taskNotePlaceholder,value:t,"aria-label":e.taskNoteLabel,onChange:a,onBlur:()=>{t.trim()||d(!1)}}),(0,n.jsx)(b,{t:e,compact:!0})]}):(0,n.jsx)(h,{value:t,onChange:a,onCommit:i,onDismiss:()=>{t.trim()||d(!1)},placeholder:e.taskNotePlaceholder,ariaLabel:e.taskNoteLabel,editHint:e.taskNoteEditHint}):null,m&&!s?(0,n.jsx)("div",{className:"flex items-center justify-end",children:(0,n.jsx)(b,{t:e,compact:!0})}):null]})}},6749:(e,t,a)=>{function n(e){let t=Math.max(0,Math.floor(e));t>=3600&&(t=60*Math.floor(t/60));let a=Math.floor(t/3600),n=Math.floor(t%3600/60),r=t%60;return{h:String(a),m:String(n),s:String(r)}}function r(e,t,a){return(3600*Math.max(0,Math.floor(Number(e)||0))+60*Math.max(0,Math.floor(Number(t)||0))+Math.max(0,Math.floor(Number(a)||0)))*1e3}function i(e){return""!==e.trim()&&Number.isFinite(new Date(e).getTime())}function s(e,t,a){if(!i(e))return!1;if(""===t.trim())return a?.requireEnd!==!0;let n=new Date(e).getTime(),r=new Date(t).getTime();return Number.isFinite(r)&&r>n}function l(e,t,a,n,s){if(!i(e))return!1;if(""===t.trim())return!0;let l=Math.round(new Date(t).getTime()-new Date(e).getTime()),o=r(a,n,s);return o>0&&o<=l}function o(e,t,a,n,r,i){return!!s(e,t,i)&&(""===t.trim()||l(e,t,a,n,r))}a.d(t,{L:()=>s,hE:()=>n,ir:()=>r,s1:()=>l,t6:()=>o})},6969:(e,t,a)=>{a.d(t,{V:()=>d});var n=a(5155),r=a(2115),i=a(5486);function s(e,t){let a=t.toLowerCase();e.set(a,(e.get(a)??0)+1)}function l(e,t){let a=Math.min(Math.max(0,t),e.length),n=e.slice(0,a),r=null,s=e=>{if(e){if(!r||e.replaceStart>r.replaceStart){r=e;return}e.replaceStart===r.replaceStart&&e.scopedProjectKey&&!r.scopedProjectKey&&(r=e)}},l=n.match(/(?:^|\s)([@!])([^\s@!#]+)#([^\s@!#\s]*)$/);if(l){let e=l[1],t=(0,i.qu)(l[2]),n=l[3];t&&s({kind:"#",query:n,replaceStart:a-n.length-1,replaceEnd:a,scopedProjectKey:t,scopedPersonal:"!"===e})}let o=n.match(/(?:^|\s|[^\s#])(#[^\s@!#\s]*)$/);if(o){let e=o[0],t=e.lastIndexOf("#");s({kind:"#",query:e.slice(t+1),replaceStart:a-e.length+t,replaceEnd:a})}let d=n.match(/(?:^|\s)(@[^\s@!#\s]*)$/);if(d){let e=d[0],t=e.lastIndexOf("@");s({kind:"@",query:e.slice(t+1),replaceStart:a-e.length+t,replaceEnd:a})}let c=n.match(/(?:^|\s|[^\s!#])(![^\s@!#\s]*)$/);if(c){let e=c[0],t=e.lastIndexOf("!");s({kind:"!",query:e.slice(t+1),replaceStart:a-e.length+t,replaceEnd:a})}return r}function o(e,t,a,n,r,i){let s=t.trim().toLowerCase(),l=new Map(n.map((e,t)=>[r(e).toLowerCase(),t])),o=new Set,d=[];for(let t of e){let e=r(t),a=e.toLowerCase();!(!e||o.has(a))&&(o.add(a),(!s||a.startsWith(s)||e.toLowerCase().includes(s))&&d.push(e))}return d.sort((e,t)=>{let n=a.get(e.toLowerCase())??0,r=a.get(t.toLowerCase())??0;if(r!==n)return r-n;let i=l.get(e.toLowerCase())??-1,s=l.get(t.toLowerCase())??-1;return s!==i?s-i:e.localeCompare(t,void 0,{sensitivity:"base"})}),d.slice(0,i)}function d({value:e,onChange:t,onKeyDown:a,inputRef:c,suggestAnchorRef:u,knownTags:m,knownProjects:b,knownPersonalProjects:x,usageTasks:p,usage:h,titleSuggestions:k,titleSuggestionsAria:g,onTitleSuggestionSelect:f,onDeleteTitleSuggestion:v,t:j,commitOnEnter:y=!1,className:z,onBlur:N,onFocus:w,...T}){var S;let M=(0,r.useId)(),C=(0,r.useRef)(null),D=c??C,[L,E]=(0,r.useState)(0),[A,$]=(0,r.useState)(!1),[I,P]=(0,r.useState)(!1),[F,B]=(0,r.useState)(0),[R,H]=(0,r.useState)(null),_=(0,r.useMemo)(()=>h||function(e){let t=new Map,a=new Map,n=new Map;for(let r of e){let e=(0,i.H_)("string"==typeof r.name?r.name:""),l=new Set;for(let t of[...r.tags??[],...e.tags])"string"==typeof t&&t.trim()&&l.add((0,i.$U)(t));for(let e of l)s(t,e);let o=("string"==typeof r.project&&r.project.trim()?r.project.trim():void 0)??e.project;if(o){let t=(0,i.qu)(o);!0===r.personalProject||!0===e.personalProject?s(n,t):s(a,t)}}return{tagCounts:t,workProjectCounts:a,personalProjectCounts:n}}(p??[]),[h,p]),W=(0,r.useMemo)(()=>A?l(e,L):null,[A,e,L]),O=(0,r.useMemo)(()=>W?function(e,t){let a=t.limit??8,{knownTags:n,knownProjects:r,knownPersonalProjects:s,usage:l}=t;if("@"===e.kind)return o([...r,...l.workProjectCounts.keys()],e.query,l.workProjectCounts,r,i.qu,a).map(e=>({value:e,label:(0,i.cD)(e,{personal:!1})}));if("!"===e.kind)return o([...s,...l.personalProjectCounts.keys()],e.query,l.personalProjectCounts,s,i.qu,a).map(e=>({value:e,label:(0,i.cD)(e,{personal:!0})}));let d=e.scopedProjectKey;if(d){let t=(0,i.jC)(n,d).map(e=>{let t=(0,i.T8)((0,i.$U)(e));return t&&t.projectKey.toLowerCase()===d.toLowerCase()?t.localTag:null}).filter(e=>!!e),r=new Map;for(let[e,t]of l.tagCounts){let a=(0,i.T8)(e);a&&a.projectKey.toLowerCase()===d.toLowerCase()&&r.set(a.localTag.toLowerCase(),(r.get(a.localTag.toLowerCase())??0)+t)}return o([...t,...r.keys()],e.query,r,t,e=>(0,i.$U)(e),a).map(e=>({value:e,label:(0,i.jo)(`${d}#${e}`)}))}return o([...n.filter(e=>!(0,i.T8)(e)),...l.tagCounts.keys()],e.query,l.tagCounts,n,i.$U,a).map(e=>({value:e,label:(0,i.jo)(e)}))}(W,{knownTags:m,knownProjects:b,knownPersonalProjects:x,usage:_}):[],[W,m,b,x,_]),q=(0,r.useMemo)(()=>!I||W?[]:k??[],[W,I,k]),K=W?O:q,U=(0,r.useCallback)(()=>{let e;H((e=u?.current??D.current)?e.getBoundingClientRect():null)},[D,u]);(0,r.useEffect)(()=>{B(0)},[K,W?.kind,W?.query]),(0,r.useEffect)(()=>{if(!(A&&W&&O.length>0||I&&q.length>0))return;U();let e=()=>U();return window.addEventListener("resize",e),window.addEventListener("scroll",e,!0),()=>{window.removeEventListener("resize",e),window.removeEventListener("scroll",e,!0)}},[W,U,I,A,O.length,e,L,q.length]);let V=(0,r.useCallback)(()=>{$(!1),P(!1)},[]),Y=(0,r.useCallback)(a=>{if(W){var n;let r,i=O[a];if(!i)return;let{next:s,caret:l}=(n=i.value,r="#"===W.kind&&W.scopedProjectKey?`#${n}`:`${W.kind}${n}`,{next:e.slice(0,W.replaceStart)+r+e.slice(W.replaceEnd),caret:W.replaceStart+r.length});t(s),V(),requestAnimationFrame(()=>{let e=D.current;e&&(e.focus(),e.setSelectionRange(l,l),E(l))});return}let r=q[a];r&&(t(r.value),f?.(r),V(),requestAnimationFrame(()=>{let e=D.current;if(!e)return;e.focus();let t=r.value.length;e.setSelectionRange(t,t),E(t)}))},[W,V,D,t,f,O,e,q]),G=(0,r.useCallback)(()=>{let t=D.current;t&&E(t.selectionStart??e.length)},[D,e.length]),Z=(0,r.useCallback)(e=>{t(e.target.value);let a=e.target.selectionStart??e.target.value.length;E(a);let n=l(e.target.value,a);$(!!n),P(!n)},[t]),X=(0,r.useCallback)(e=>{if("Enter"===e.key&&y){V(),a?.(e);return}if((A||I)&&K.length>0){if("ArrowDown"===e.key){e.preventDefault(),B(e=>Math.min(e+1,K.length-1));return}if("ArrowUp"===e.key){e.preventDefault(),B(e=>Math.max(e-1,0));return}if("Enter"===e.key||"Tab"===e.key){e.preventDefault(),Y(F);return}if("Escape"===e.key){e.preventDefault(),V();return}}a?.(e)},[K.length,Y,V,y,F,a,I,A]),Q=A&&!!W&&O.length>0,J=I&&!W&&q.length>0,ee=(Q||J)&&R,et=W?(S=W.kind,"@"===S?j.taskTokenSuggestWorkProjectsAria:"!"===S?j.taskTokenSuggestPersonalProjectsAria:j.taskTokenSuggestTagsAria):g??j.taskTitleTemplateSuggestAria;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("input",{...T,ref:D,className:z,value:e,onChange:Z,onKeyDown:X,onClick:G,onKeyUp:G,onSelect:G,onFocus:t=>{G();let a=D.current;if(a){let t=a.selectionStart??e.length,n=l(e,t);$(!!n),P(!n)}w?.(t)},onBlur:e=>{globalThis.setTimeout(V,120),N?.(e)},"aria-autocomplete":ee?"list":void 0,"aria-controls":ee?M:void 0,"aria-expanded":ee?"true":"false"}),ee?(0,n.jsx)("ul",{id:M,role:"listbox","data-testid":Q?"task-token-suggest":"task-title-suggest","aria-label":et,className:"fixed z-[220] max-h-52 overflow-y-auto rounded-lg border border-zinc-200 bg-white py-1 text-left text-sm shadow-lg dark:border-zinc-600 dark:bg-zinc-900",style:{top:R.bottom+4,left:R.left,width:Math.max(R.width,200)},children:(Q?O:q).map((e,t)=>(0,n.jsx)("li",{role:"option","aria-selected":t===F?"true":"false",children:(0,n.jsxs)("button",{type:"button",tabIndex:-1,className:`flex w-full items-center px-3 py-1.5 text-left ${t===F?"bg-violet-500/15 text-violet-950 dark:bg-violet-500/25 dark:text-violet-50":"text-zinc-800 hover:bg-zinc-100 dark:text-zinc-100 dark:hover:bg-zinc-800"}`,onMouseDown:e=>{e.preventDefault(),Y(t)},onMouseEnter:()=>B(t),children:[(0,n.jsx)("span",{className:"truncate font-medium",children:e.label}),!Q&&e.id&&v?(0,n.jsx)("span",{className:"ml-auto shrink-0 px-1 text-zinc-400 hover:text-red-600 dark:hover:text-red-400",role:"button",tabIndex:-1,"aria-label":j.taskDeleteBtn,onPointerDown:t=>{t.stopPropagation(),v(e.id)},children:(0,n.jsx)("svg",{className:"size-3.5",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:2,children:(0,n.jsx)("path",{d:"M4 4l8 8M12 4l-8 8"})})}):null]})},`${e.value}-${t}`))}):null]})}},7856:(e,t,a)=>{a.d(t,{p:()=>d});var n=a(5155),r=a(2115),i=a(7650),s=a(4961),l=a(1908);let o={position:"fixed",top:0,left:0,width:288,zIndex:80,visibility:"hidden",pointerEvents:"none"};function d({ariaLabel:e,body:t,align:a="start",preserveLineBreaks:c=!1,panelClassName:u}){let[m,b]=(0,r.useState)(!1),x=(0,r.useRef)(null),p=(0,r.useRef)(null),h=(0,r.useId)(),k=(0,l.l)(m,x,p,{align:a,maxWidthRem:u?24:18});(0,r.useEffect)(()=>{if(!m)return;let e=e=>{let t=e.target;x.current?.contains(t)||p.current?.contains(t)||b(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[m]);let g=k??(m?o:void 0),f=m&&"u">typeof document&&g?(0,i.createPortal)((0,n.jsx)("div",{ref:p,id:`${h}-metric-help`,style:g,className:`rounded-lg border border-zinc-200 bg-white p-2.5 text-left shadow-lg normal-case dark:border-zinc-600 dark:bg-zinc-900${u?` ${u}`:""}`,role:"region","aria-label":e,children:(0,n.jsx)("p",{className:`text-[0.7rem] leading-snug text-zinc-700 dark:text-zinc-300${c?" whitespace-pre-line":""} ${!u?"max-w-full":""}`,children:t})}),document.body):null;return(0,n.jsxs)("div",{className:"relative inline-flex shrink-0",ref:x,children:[(0,n.jsx)("button",{type:"button",className:"rounded p-0.5 text-zinc-500 hover:bg-zinc-200/90 hover:text-zinc-800 dark:hover:bg-zinc-800 dark:hover:text-zinc-300","aria-label":e,"aria-expanded":m?"true":"false","aria-controls":`${h}-metric-help`,onClick:()=>b(e=>!e),children:(0,n.jsx)(s.A,{size:13,strokeWidth:1.75,"aria-hidden":!0})}),f]})}},8090:(e,t,a)=>{a.d(t,{v:()=>o});var n=a(5155),r=a(6296),i=a(4755),s=a(1958),l=a(4897);function o({phase:e,dt:t,lang:a,technicalDetail:d,onRetry:c,retryBusy:u}){let m="loading"===e,b=(0,l.iM)(d,a),x="string"==typeof d?d.trim():"",p=x.length>0&&"string"==typeof b&&x!==b;return(0,n.jsx)("div",{className:"fixed inset-0 z-[60] flex items-center justify-center bg-zinc-200/55 backdrop-blur-sm dark:bg-black/45",role:"status","aria-live":"polite","aria-busy":m?"true":"false","aria-label":m?t.dashboardLoadingAriaLabel:t.dashboardConnectionErrorAriaLabel,children:(0,n.jsxs)("div",{className:"flex min-h-[10.5rem] max-w-sm flex-col items-center justify-center gap-4 rounded-2xl border border-zinc-200/90 bg-white/95 px-10 py-9 shadow-2xl dark:border-zinc-600/60 dark:bg-zinc-900/95",children:[m?(0,n.jsx)(r.A,{className:"size-12 shrink-0 animate-spin text-violet-600 dark:text-violet-400",strokeWidth:2,"aria-hidden":!0}):(0,n.jsx)(i.A,{className:"size-12 shrink-0 text-amber-600 dark:text-amber-400",strokeWidth:2,"aria-hidden":!0}),(0,n.jsxs)("div",{className:"flex min-h-[2.75rem] flex-col items-center justify-center gap-2 text-center",children:[(0,n.jsx)("p",{className:"text-sm font-medium leading-snug text-zinc-800 dark:text-zinc-100",children:m?t.dashboardLoadingMessage:t.dashboardConnectionErrorTitle}),m?null:(0,n.jsx)("p",{className:"max-w-[22rem] text-sm leading-snug text-zinc-600 dark:text-zinc-300",children:t.dashboardConnectionErrorBody}),!m&&b?(0,n.jsx)("p",{className:"max-w-[22rem] text-xs leading-snug text-zinc-500 dark:text-zinc-400",children:b}):null]}),!m&&c?(0,n.jsxs)("button",{type:"button",className:"mt-1 inline-flex items-center justify-center gap-2 rounded-lg bg-violet-600 px-4 py-2 text-sm font-medium text-white hover:bg-violet-500 focus:outline-none focus-visible:ring-2 focus-visible:ring-violet-400 focus-visible:ring-offset-2 focus-visible:ring-offset-white disabled:cursor-wait disabled:opacity-70 dark:focus-visible:ring-offset-zinc-900",onClick:c,disabled:!0===u,children:[(0,n.jsx)(s.A,{className:`size-4 shrink-0 ${u?"animate-spin":""}`,"aria-hidden":!0}),t.dashboardConnectionRetryLabel]}):null,!m&&p?(0,n.jsxs)("details",{className:"mt-2 max-w-sm text-left",children:[(0,n.jsx)("summary",{className:"cursor-pointer text-xs text-zinc-500 hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-200",children:t.dashboardConnectionTechnicalDetailsLabel}),(0,n.jsx)("pre",{className:"mt-2 max-h-32 overflow-auto rounded-md border border-zinc-200/80 bg-zinc-50/90 px-3 py-2 text-[0.65rem] leading-relaxed text-zinc-700 dark:border-zinc-600/50 dark:bg-zinc-950/80 dark:text-zinc-300",children:d})]}):null]})})}},8577:(e,t,a)=>{a.d(t,{Z:()=>u});var n=a(5155),r=a(2115),i=a(5486),s=a(149),l=a(7650);function o({domId:e,style:t,text:a,onPointerEnter:r,onPointerLeave:i}){return(0,n.jsx)("div",{id:e,role:"tooltip",style:t,className:"pointer-events-auto whitespace-pre-line rounded-lg border border-zinc-600 bg-zinc-900 p-2.5 text-left text-[0.7rem] leading-snug text-zinc-200 shadow-lg dark:bg-zinc-950",onPointerEnter:r,onPointerLeave:i,children:a})}let d={position:"fixed",top:0,left:0,width:288,zIndex:90,visibility:"hidden",pointerEvents:"none"};function c({tag:e,chip:t,onRemove:a,description:u,defaultTagBucketLabel:m,taskProject:b,taskPersonalProject:x}){let{hasDescription:p,triggerProps:h,popoverLayer:k,anchorWrapperProps:g}=function(e,t=3e3){let[a,n]=(0,r.useState)(!1),i=(0,r.useRef)(null),s=(0,r.useRef)(null),c=(0,r.useRef)(null),u=(0,r.useId)().replace(/:/g,""),m=`kronosys-desc-tip-${u}`,b=e?.trim()??"",x=(0,r.useCallback)(()=>{null!==i.current&&(clearTimeout(i.current),i.current=null)},[]),p=(0,r.useCallback)(()=>{null!==s.current&&(clearTimeout(s.current),s.current=null)},[]),h=(0,r.useCallback)(()=>{b&&(x(),i.current=setTimeout(()=>n(!0),t))},[b,t,x]),k=(0,r.useCallback)(()=>{x(),p(),n(!1)},[x,p]),g=(0,r.useCallback)(()=>{p(),s.current=setTimeout(()=>{s.current=null,n(!1)},200)},[p]);(0,r.useEffect)(()=>()=>{x(),p()},[x,p]),(0,r.useEffect)(()=>{b||k()},[b,k]);let[f,v]=(0,r.useState)(void 0);(0,r.useLayoutEffect)(()=>{if(!a||!b)return void v(void 0);let e=()=>{let e=c.current;if(!e)return;let t=e.getBoundingClientRect(),a=globalThis.innerWidth,n=globalThis.innerHeight,r=Math.min(288,a-20),i=t.left;i=Math.max(10,Math.min(i,a-r-10));let s=t.bottom-4,l=document.getElementById(m);if(l instanceof HTMLElement){let e=l.getBoundingClientRect().height;s+e>n-10&&(s=Math.max(10,t.top-4-e))}s<10&&(s=10),v({position:"fixed",top:s,left:i,width:r,zIndex:90})};e();let t=requestAnimationFrame(e);return globalThis.addEventListener("scroll",e,!0),globalThis.addEventListener("resize",e),()=>{cancelAnimationFrame(t),globalThis.removeEventListener("scroll",e,!0),globalThis.removeEventListener("resize",e)}},[a,b,m]);let j=(0,r.useCallback)(e=>{c.current=e},[]);if(!b)return{hasDescription:!1,triggerProps:{onPointerEnter:()=>{},onPointerLeave:()=>{},onPointerCancel:()=>{},onFocus:()=>{},onBlur:()=>{}},popoverLayer:null,anchorWrapperProps:{ref:j,onPointerEnter:()=>{},onPointerLeave:()=>{}}};let y=f??(a?d:void 0);return{hasDescription:!0,triggerProps:{onPointerEnter:h,onPointerLeave:x,onPointerCancel:x,onFocus:h,onBlur:k},popoverLayer:a&&"u">typeof document&&y?(0,l.createPortal)((0,r.createElement)(o,{domId:m,style:y,text:b,onPointerEnter:p,onPointerLeave:g}),document.body):null,anchorWrapperProps:{ref:j,onPointerEnter:p,onPointerLeave:g}}}(u),f=!!a,v=(0,n.jsxs)("span",{role:f?"button":void 0,tabIndex:f?0:void 0,className:[t,f?"":p?"cursor-help":"","min-w-0 max-w-full"].filter(Boolean).join(" "),...h,...a?{onClick:()=>a(e),onKeyDown:t=>{("Enter"===t.key||" "===t.key)&&(t.preventDefault(),a(e))}}:{},children:[(0,n.jsx)("span",{className:s.Yu,children:(0,i.CH)(e,m,{taskProject:b,personalProject:x})}),f?(0,n.jsx)("span",{className:"pointer-events-none shrink-0 text-[0.625rem] leading-none font-normal text-zinc-400 dark:text-zinc-500",children:"\xd7"}):null]});return p?(0,n.jsxs)(r.Fragment,{children:[(0,n.jsx)("span",{className:"relative inline-flex min-w-0 max-w-full",...g,children:v}),k]}):v}function u({tags:e,onRemove:t,className:a,variant:r="default",differentiateProjectScopedTags:l=!1,tagDescriptions:o,defaultTagBucketLabel:d,taskProject:m,taskPersonalProject:b}){let x=e.slice().sort((e,t)=>{let a=l&&(0,i.SN)((0,i.$U)(e)),n=l&&(0,i.SN)((0,i.$U)(t));return a&&!n?-1:!a&&n?1:e.localeCompare(t)});return(0,n.jsx)("div",{className:a??"mt-1 flex flex-wrap items-center gap-x-2 gap-y-1.5 [&>*]:max-w-full",children:x.map(e=>{var a;let u;return(0,n.jsx)(c,{tag:e,chip:(a=e,u=l&&(0,i.SN)((0,i.$U)(a)),"applied"===r?u?t?s.Xd:s.bS:t?s.XB:s.zy:u?t?s.Xd:s.bS:t?s.Xk:s.xe),onRemove:t,description:(e=>{if(o)return o[(0,i.$U)(e).toLowerCase()]??o[(0,i.$U)(e)]})(e),defaultTagBucketLabel:d,taskProject:m,taskPersonalProject:b},e)})})}},8949:(e,t,a)=>{a.d(t,{VB:()=>o,dM:()=>l,e$:()=>n,le:()=>s,mv:()=>i,pb:()=>d});let n=["violet","emerald","amber","sky","rose","fuchsia"],r=new Set(n),i={violet:"bg-violet-500/85 dark:bg-violet-500/75",emerald:"bg-emerald-500/85 dark:bg-emerald-500/75",amber:"bg-amber-500/85 dark:bg-amber-500/75",sky:"bg-sky-500/85 dark:bg-sky-500/75",rose:"bg-rose-500/85 dark:bg-rose-500/75",fuchsia:"bg-fuchsia-500/80 dark:bg-fuchsia-500/70"},s={violet:"bg-violet-500",emerald:"bg-emerald-500",amber:"bg-amber-500",sky:"bg-sky-500",rose:"bg-rose-500",fuchsia:"bg-fuchsia-500"};function l(e){if(void 0===e)return;if(null===e||""===e)return null;let t=String(e).trim().toLowerCase();return""===t||"auto"===t||"default"===t?null:r.has(t)?t:void 0}function o(e){let t=l(e);return void 0===t?null:t}function d(e){if(e.ganttColor&&(t=e.ganttColor,r.has(t)))return i[e.ganttColor];if(!0===e.personalProject)return i.rose;var t,a=e.id;let s=0;for(let e=0;e<a.length;e++)s=31*s+a.charCodeAt(e)>>>0;return i[n[s%n.length]??n[0]]}},9474:(e,t,a)=>{a.d(t,{Fe:()=>f,Pw:()=>h});var n=a(5155),r=a(2115),i=a(7650),s=a(4514),l=a(7420),o=a(6854),d=a(1279),c=a(6776);a(1299);var u=a(2194),m=a(1555),b=a(2047),x=a(149);function p(e){return String(e).padStart(2,"0")}function h(e){return`${e.getFullYear()}-${p(e.getMonth()+1)}-${p(e.getDate())}T${p(e.getHours())}:${p(e.getMinutes())}`}function k(e){let t=e.trim();if(!t)return;let a=new Date(t);return Number.isNaN(a.getTime())?void 0:a}function g({children:e}){return"u"<typeof document?null:(0,i.createPortal)(e,document.body)}function f({value:e,onChange:t,onBlur:a,"aria-label":i,lang:v,displayTimeZone:j=m.GB,use24HourClock:y=!0,defaultTimeMode:z="current-hour",calendarWeekStartsOn:N="sunday",presentation:w="modal",t:T}){var S;let M=(0,r.useCallback)(()=>{let e=new Date;if("next-half-hour"===z)return 30>e.getMinutes()?{hour:e.getHours(),minute:30}:{hour:(e.getHours()+1)%24,minute:0};if("last-half-hour"===z){let t=(0,b.SD)(e);return{hour:t.getHours(),minute:t.getMinutes()}}return{hour:e.getHours(),minute:0}},[z]),[C,D]=(0,r.useState)(!1),L=(0,r.useRef)(!1),[E,A]=(0,r.useState)({top:0,left:0,maxW:300}),$=(0,r.useRef)(null),I=(0,r.useRef)(null),P=k(e),F=M(),[B,R]=(0,r.useState)(P),[H,_]=(0,r.useState)(P?.getHours()??F.hour),[W,O]=(0,r.useState)(P?.getMinutes()??F.minute);(0,r.useEffect)(()=>{let t=k(e);R(t),t&&(_(t.getHours()),O(t.getMinutes()))},[e]),(0,r.useEffect)(()=>{if(!C||P)return;let e=M();_(e.hour),O(e.minute)},[C]);let q=(0,r.useCallback)((e,a,n)=>{let r=new Date(e??B??new Date);r.setHours(a,n,0,0),t(h(r))},[t,B]),K=(0,r.useCallback)(()=>{let e=$.current;if(!e)return;let t=e.getBoundingClientRect(),a=window.innerWidth,n=window.innerHeight,r=Math.min(300,a-16),i=t.bottom+8,s=t.left+t.width/2-r/2;s=Math.max(8,Math.min(s,a-r-8)),i+480>n-8&&(i=Math.max(8,t.top-8-480)),A({top:i,left:s,maxW:r})},[]);(0,r.useLayoutEffect)(()=>{if(!C||"popover"!==w)return;K();let e=()=>K();return window.addEventListener("resize",e),window.addEventListener("scroll",e,!0),()=>{window.removeEventListener("resize",e),window.removeEventListener("scroll",e,!0)}},[C,w,K]),(0,r.useEffect)(()=>{if(!C)return;let e=e=>{let t=e.target;I.current?.contains(t)||$.current?.contains(t)||D(!1)},t=e=>{"Escape"===e.key&&D(!1)};return document.addEventListener("mousedown",e),document.addEventListener("keydown",t),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("keydown",t)}},[C]),(0,r.useEffect)(()=>{if(C){L.current=!0;return}L.current&&(L.current=!1,a?.())},[C,a]),S=C&&"modal"===w,(0,r.useEffect)(()=>{if(!S)return;let e=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=e}},[S]);let U="fr"===v?d.fr:c.c,V=void 0!==P?new Intl.DateTimeFormat("fr"===v?"fr-CA":"en-CA",{dateStyle:"short",timeStyle:"short",hour12:!y,...j.trim()&&(0,m.DP)(j.trim())?{timeZone:j.trim()}:{}}).format(P):null,Y=Array.from({length:24},(e,t)=>t),G=Array.from({length:60},(e,t)=>t),Z="kronosys-datetime-popover flex flex-col gap-3 rounded-xl border border-violet-500/45 bg-zinc-50 p-3 shadow-2xl dark:border-violet-400/45 dark:bg-zinc-900",X=`${Z} overflow-hidden`,Q=(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{className:"min-h-0 min-w-0 flex-1 overflow-x-hidden overflow-y-auto overscroll-y-contain",children:(0,n.jsx)(o.h,{mode:"single",required:!1,selected:B,defaultMonth:B??new Date,weekStartsOn:(0,u.F7)(N),onSelect:e=>{R(e),e&&q(e,H,W)},locale:U,classNames:{button_previous:"rdp-button_previous rounded-lg border border-zinc-300 bg-white text-zinc-800 hover:bg-zinc-100 dark:border-zinc-600 dark:bg-zinc-800 dark:text-zinc-100 dark:hover:bg-zinc-700",button_next:"rdp-button_next rounded-lg border border-zinc-300 bg-white text-zinc-800 hover:bg-zinc-100 dark:border-zinc-600 dark:bg-zinc-800 dark:text-zinc-100 dark:hover:bg-zinc-700",caption_label:"rdp-caption_label text-sm font-semibold text-zinc-800 dark:text-zinc-100",weekday:"rdp-weekday text-zinc-500 dark:text-zinc-400"},components:{Chevron:e=>"left"===e.orientation?(0,n.jsx)("span",{className:"text-base leading-none font-semibold","aria-hidden":!0,children:"‹"}):(0,n.jsx)("span",{className:"text-base leading-none font-semibold","aria-hidden":!0,children:"›"})}})}),(0,n.jsxs)("div",{className:"relative z-[1] shrink-0 space-y-3 border-t border-zinc-200 bg-zinc-50 pt-3 dark:border-zinc-700/80 dark:bg-zinc-900",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center justify-center gap-2",children:[(0,n.jsx)("button",{type:"button",className:"rounded-lg border border-zinc-300 bg-white px-2.5 py-1 text-xs font-medium text-zinc-700 hover:bg-zinc-100 dark:border-zinc-600 dark:bg-zinc-800 dark:text-zinc-200 dark:hover:bg-zinc-700",onClick:()=>{let e=new Date,t=M(),a=new Date(e.getFullYear(),e.getMonth(),e.getDate(),t.hour,t.minute,0,0);R(a),_(t.hour),O(t.minute),q(a,t.hour,t.minute)},children:T.taskPastDatetimeTodayBtn}),(0,n.jsx)("button",{type:"button",className:"rounded-lg border border-violet-500/45 bg-violet-50 px-2.5 py-1 text-xs font-medium text-violet-700 hover:bg-violet-100 dark:border-violet-400/55 dark:bg-violet-950/35 dark:text-violet-200 dark:hover:bg-violet-900/40",onClick:()=>{let e=new Date,t=e.getHours(),a=e.getMinutes();R(e),_(t),O(a),q(e,t,a)},children:T.taskPastDatetimeNowBtn})]}),(0,n.jsxs)("div",{className:"flex flex-wrap items-center justify-start gap-2 sm:justify-center",children:[(0,n.jsxs)("label",{className:"flex max-w-full flex-wrap items-center gap-1.5 text-xs font-medium text-zinc-600 dark:text-zinc-400",children:[(0,n.jsx)("span",{className:"whitespace-nowrap",children:T.taskPastDatetimeTimeLabel}),(0,n.jsx)("select",{className:"h-8 w-16 min-w-0 rounded-lg border border-violet-500/45 bg-white px-2 text-xs font-mono text-zinc-900 outline-none dark:border-violet-400/50 dark:bg-zinc-800 dark:text-zinc-100",value:H,onChange:e=>{let t=Number(e.target.value);_(t),q(B,t,W)},"aria-label":T.taskPastDatetimeHourAria,children:Y.map(e=>(0,n.jsx)("option",{value:e,children:p(e)},e))}),(0,n.jsx)("span",{className:"font-mono text-zinc-500",children:":"}),(0,n.jsx)("select",{className:"h-8 w-16 min-w-0 rounded-lg border border-violet-500/45 bg-white px-2 text-xs font-mono text-zinc-900 outline-none dark:border-violet-400/50 dark:bg-zinc-800 dark:text-zinc-100",value:W,onChange:e=>{let t=Number(e.target.value);O(t),q(B,H,t)},"aria-label":T.taskPastDatetimeMinuteAria,children:G.map(e=>(0,n.jsx)("option",{value:e,children:p(e)},e))})]}),"inline"!==w?(0,n.jsx)("button",{type:"button",className:"inline-flex h-8 w-8 items-center justify-center rounded-lg border border-emerald-500/50 bg-emerald-50 text-emerald-700 hover:bg-emerald-100 dark:border-emerald-400/60 dark:bg-emerald-950/35 dark:text-emerald-200 dark:hover:bg-emerald-900/40","aria-label":"fr"===v?"Accepter la date et l'heure":"Accept date and time",onClick:()=>{q(B,H,W),D(!1)},children:(0,n.jsx)(s.A,{className:"h-4 w-4",strokeWidth:2.5,"aria-hidden":!0})}):null]})]})]}),J=C&&"modal"===w?(0,n.jsx)(g,{children:(0,n.jsx)("div",{className:"fixed inset-0 z-[260] flex items-center justify-center bg-black/60 p-4",role:"presentation",onMouseDown:e=>{e.target===e.currentTarget&&D(!1)},children:(0,n.jsx)("div",{ref:I,role:"dialog","aria-modal":"true","aria-label":i,className:`${Z} max-h-[90vh] w-full max-w-sm overflow-y-auto overscroll-y-contain`,onMouseDown:e=>e.stopPropagation(),children:Q})})}):null;if("inline"===w)return(0,n.jsx)("div",{className:`${Z} w-full max-h-[min(320px,42vh)] overflow-y-auto overscroll-y-contain`,role:"group","aria-label":i,children:Q});let ee=C&&"popover"===w?(0,n.jsx)(g,{children:(0,n.jsx)("div",{ref:I,role:"dialog","aria-modal":"true","aria-label":i,className:`${X} fixed z-[200]`,style:{top:E.top,left:E.left,width:E.maxW,maxHeight:"min(480px, calc(100vh - 16px))"},children:Q})}):null;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{className:"inline-flex min-w-0 max-w-full shrink-0",children:(0,n.jsxs)("button",{ref:$,type:"button",className:`${x.fg} max-w-full text-left`,"aria-label":i,"aria-expanded":C,"aria-haspopup":"dialog",onClick:()=>D(e=>!e),children:[(0,n.jsx)("span",{className:`inline-block min-w-0 max-w-full flex-1 truncate text-left ${V?"text-zinc-500 dark:text-zinc-500":"text-zinc-400 dark:text-zinc-500/75"}`,children:V??T.taskPastDatetimePlaceholder}),(0,n.jsx)(l.A,{className:"h-3 w-3 shrink-0 text-zinc-400/70 opacity-80 transition-[opacity,color] group-hover/datetime-trigger:text-zinc-500 group-hover/datetime-trigger:opacity-100 dark:text-zinc-500/55 dark:group-hover/datetime-trigger:text-zinc-400",strokeWidth:1.5,"aria-hidden":!0})]})}),J,ee]})}}}]);
|