@nightkatana/kronosys-app 1.0.0-beta.0
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/README.md +81 -0
- package/app/api/action/route.ts +16 -0
- package/app/api/backup/route.ts +84 -0
- package/app/api/health/route.ts +22 -0
- package/app/api/state/route.ts +27 -0
- package/app/apple-icon.png +0 -0
- package/app/changelog/page.tsx +122 -0
- package/app/globals.css +210 -0
- package/app/guide/layout.tsx +11 -0
- package/app/guide/page.tsx +278 -0
- package/app/icon.png +0 -0
- package/app/layout.tsx +77 -0
- package/app/licenses/layout.tsx +11 -0
- package/app/licenses/page.tsx +246 -0
- package/app/manifest.ts +32 -0
- package/app/page.tsx +1610 -0
- package/app/reporting/page.tsx +2943 -0
- package/app/settings/layout.tsx +10 -0
- package/app/settings/page.tsx +3518 -0
- package/bin/kronosys.mjs +46 -0
- package/components/KronosysPackageVersionProvider.tsx +19 -0
- package/components/KronosysPayloadProvider.tsx +109 -0
- package/components/PwaRegister.tsx +25 -0
- package/components/SiteLegalFooter.tsx +21 -0
- package/components/ThemeProvider.tsx +78 -0
- package/components/dashboard/AppShellLiveSessionDrawer.tsx +394 -0
- package/components/dashboard/AppShellRouteNav.tsx +131 -0
- package/components/dashboard/AppVersionStamp.tsx +16 -0
- package/components/dashboard/DashboardCollapsibleSection.tsx +57 -0
- package/components/dashboard/DashboardColumnHintsBanner.tsx +159 -0
- package/components/dashboard/DashboardCommandCenter.tsx +470 -0
- package/components/dashboard/DashboardLangGateModal.tsx +118 -0
- package/components/dashboard/DashboardLoadingOverlay.tsx +42 -0
- package/components/dashboard/DashboardSimpleModal.tsx +337 -0
- package/components/dashboard/DashboardSuspenseFallback.tsx +52 -0
- package/components/dashboard/DashboardToastProvider.tsx +64 -0
- package/components/dashboard/DashboardTour.tsx +435 -0
- package/components/dashboard/DeferredDescriptionPopoverWrap.tsx +39 -0
- package/components/dashboard/DeleteSessionModal.tsx +130 -0
- package/components/dashboard/DescriptionTooltipPortaled.tsx +31 -0
- package/components/dashboard/GitIdentityQuickSetupModal.tsx +211 -0
- package/components/dashboard/HeaderIntegrationBadges.tsx +69 -0
- package/components/dashboard/InlineMetricHelpTrigger.tsx +102 -0
- package/components/dashboard/IssuePickerModal.tsx +168 -0
- package/components/dashboard/KronoFocusPanel.tsx +834 -0
- package/components/dashboard/KronosysDatetimePopoverField.tsx +357 -0
- package/components/dashboard/KronosysTimePopoverField.tsx +233 -0
- package/components/dashboard/LanguageMenu.tsx +123 -0
- package/components/dashboard/MongoMirrorSyncLine.tsx +57 -0
- package/components/dashboard/NewSessionScopeModal.tsx +410 -0
- package/components/dashboard/PageRefreshButton.tsx +130 -0
- package/components/dashboard/PlainHelpPopover.tsx +97 -0
- package/components/dashboard/ReportingPageToc.tsx +68 -0
- package/components/dashboard/ReportingTour.tsx +342 -0
- package/components/dashboard/SavedProjectPicker.tsx +92 -0
- package/components/dashboard/SavedTagPicker.tsx +115 -0
- package/components/dashboard/ScrollToTopFab.tsx +41 -0
- package/components/dashboard/SelectedSessionSidebarBlock.tsx +630 -0
- package/components/dashboard/SessionEndReasonEditor.tsx +114 -0
- package/components/dashboard/SessionListPanel.tsx +320 -0
- package/components/dashboard/SessionLocMetricsSection.tsx +128 -0
- package/components/dashboard/SettingsTagsProjectsSection.tsx +993 -0
- package/components/dashboard/SettingsTour.tsx +332 -0
- package/components/dashboard/TagPills.tsx +149 -0
- package/components/dashboard/TagsHelpTrigger.tsx +84 -0
- package/components/dashboard/TaskFocusPanel.tsx +1261 -0
- package/components/dashboard/TaskSessionLiveCard.tsx +832 -0
- package/components/dashboard/TaskSubtasksBlock.tsx +748 -0
- package/components/dashboard/ThemeToggle.test.tsx +26 -0
- package/components/dashboard/ThemeToggle.tsx +36 -0
- package/components/dashboard/UserGuideBodyText.tsx +62 -0
- package/components/dashboard/WorkspaceGitRepoCard.tsx +191 -0
- package/components/dashboard/taskFieldStyles.ts +139 -0
- package/components/dashboard/useAnchoredFloatingPortalStyle.ts +71 -0
- package/components/dashboard/useDescriptionPopoverAfterMs.ts +220 -0
- package/components/dashboard/useKronoFocusLiveSeconds.ts +36 -0
- package/components/dashboard/useSmoothStopwatchMs.ts +25 -0
- package/lib/appShellHeaderClasses.ts +12 -0
- package/lib/backupCsvExport.test.ts +149 -0
- package/lib/backupCsvExport.ts +392 -0
- package/lib/changelogCopy.ts +34 -0
- package/lib/concurrentTaskStartPreference.ts +29 -0
- package/lib/dashboardClockFormat.ts +13 -0
- package/lib/dashboardColumnChrome.ts +3 -0
- package/lib/dashboardColumnHintsStorage.ts +57 -0
- package/lib/dashboardCopy.ts +1831 -0
- package/lib/dashboardDetachedUrlHintStorage.ts +24 -0
- package/lib/dashboardGitIdentityBannerStorage.ts +36 -0
- package/lib/dashboardLangStorage.ts +72 -0
- package/lib/dashboardQuickSearch.ts +476 -0
- package/lib/dashboardQuickSearchQuery.test.ts +63 -0
- package/lib/dashboardQuickSearchQuery.ts +179 -0
- package/lib/dashboardSessionNav.ts +33 -0
- package/lib/dashboardShortcuts.ts +268 -0
- package/lib/dashboardTimeZone.ts +91 -0
- package/lib/dashboardTourStorage.ts +68 -0
- package/lib/dataDir.test.ts +87 -0
- package/lib/dataDir.ts +83 -0
- package/lib/devDataPreferenceFile.ts +55 -0
- package/lib/devDataRuntimeInfo.ts +34 -0
- package/lib/formatIsoShort.test.ts +46 -0
- package/lib/formatIsoShort.ts +29 -0
- package/lib/generatedUserChangelog.ts +34 -0
- package/lib/gitlabIssueSearch.ts +8 -0
- package/lib/kronoFocusDurationHistory.ts +71 -0
- package/lib/kronoFocusRhythm.test.ts +130 -0
- package/lib/kronoFocusRhythm.ts +46 -0
- package/lib/kronoFocusTimerUrgency.test.ts +74 -0
- package/lib/kronoFocusTimerUrgency.ts +24 -0
- package/lib/kronosysApi.ts +143 -0
- package/lib/legacyEditorPayloadKeys.ts +52 -0
- package/lib/legacyKronoFocusStorageKeys.test.ts +29 -0
- package/lib/legacyKronoFocusStorageKeys.ts +32 -0
- package/lib/licensesCopy.ts +128 -0
- package/lib/openPlainTextInNewTab.ts +49 -0
- package/lib/readKronosysPackageVersion.ts +10 -0
- package/lib/reportingAggregate.test.ts +325 -0
- package/lib/reportingAggregate.ts +819 -0
- package/lib/reportingDatePresets.ts +41 -0
- package/lib/reportingMetricHelp.ts +430 -0
- package/lib/reportingNonFinalIndicators.test.ts +157 -0
- package/lib/reportingNonFinalIndicators.ts +102 -0
- package/lib/reportingStrings.ts +491 -0
- package/lib/reportingTagWeekBreakdown.test.ts +141 -0
- package/lib/reportingTagWeekBreakdown.ts +181 -0
- package/lib/reportingWeekLayout.test.ts +239 -0
- package/lib/reportingWeekLayout.ts +313 -0
- package/lib/sessionAssiduity.test.ts +25 -0
- package/lib/sessionAssiduity.ts +33 -0
- package/lib/sessionEndReason.ts +55 -0
- package/lib/sessionEndWarnings.test.ts +200 -0
- package/lib/sessionEndWarnings.ts +125 -0
- package/lib/sessionListMerge.test.ts +101 -0
- package/lib/sessionListMerge.ts +70 -0
- package/lib/sessionTaskSidebarStats.test.ts +24 -0
- package/lib/sessionTaskSidebarStats.ts +54 -0
- package/lib/settingsCopy.ts +1276 -0
- package/lib/taskParsing.test.ts +153 -0
- package/lib/taskParsing.ts +737 -0
- package/lib/theme.ts +15 -0
- package/lib/translucentButtonClasses.ts +34 -0
- package/lib/usageProfile.test.ts +84 -0
- package/lib/usageProfile.ts +52 -0
- package/lib/userGuideCopy.ts +464 -0
- package/lib/workspaceLocDefaults.ts +21 -0
- package/next-env.d.ts +6 -0
- package/next.config.ts +15 -0
- package/package.json +87 -0
- package/postcss.config.mjs +12 -0
- package/public/apple-icon.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/file.svg +1 -0
- package/public/globe.svg +1 -0
- package/public/icon-192.png +0 -0
- package/public/icon-512.png +0 -0
- package/public/icon.png +0 -0
- package/public/next.svg +1 -0
- package/public/sw.js +13 -0
- package/public/traceback.png +0 -0
- package/public/vercel.svg +1 -0
- package/public/window.svg +1 -0
- package/server/actionDispatch.test.ts +723 -0
- package/server/actionDispatch.ts +1476 -0
- package/server/actionTaskSession.test.ts +713 -0
- package/server/actionTaskSession.ts +717 -0
- package/server/db.ts +42 -0
- package/server/defaultCfg.ts +87 -0
- package/server/gitlabTokenStore.ts +34 -0
- package/server/kronoFocusHydrate.test.ts +142 -0
- package/server/kronoFocusHydrate.ts +69 -0
- package/server/kronoFocusMigrate.test.ts +53 -0
- package/server/kronoFocusMigrate.ts +78 -0
- package/server/mainTimerHydrate.test.ts +65 -0
- package/server/mainTimerHydrate.ts +53 -0
- package/server/payloadStore.test.ts +78 -0
- package/server/payloadStore.ts +83 -0
- package/server/sessionWallHydrate.test.ts +46 -0
- package/server/sessionWallHydrate.ts +88 -0
- package/tsconfig.json +41 -0
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import type { Lang } from "./dashboardCopy";
|
|
2
|
+
|
|
3
|
+
export type UserGuideSection = {
|
|
4
|
+
id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
/** Intro humaine +, si besoin, une phrase de transition vers le concret. */
|
|
7
|
+
paragraphs: string[];
|
|
8
|
+
/**
|
|
9
|
+
* Étapes numérotées (enchainement dans l’interface) — mélange *pourquoi / comment*.
|
|
10
|
+
* Précéder souvent d’un premier paragraphe qui donne l’intention.
|
|
11
|
+
*/
|
|
12
|
+
steps?: string[];
|
|
13
|
+
/** Sous-titre du bloc d’étapes (sinon le libellé par défaut du bundle). */
|
|
14
|
+
stepsTitle?: string;
|
|
15
|
+
/** Listes d’**options** ou *cas d’usage* (choix, modes, onglets). */
|
|
16
|
+
options?: string[];
|
|
17
|
+
/** Sous-titre du bloc options (sinon le libellé par défaut du bundle). */
|
|
18
|
+
optionsTitle?: string;
|
|
19
|
+
/** Puces courtes (rappels, raccourcis, conflits). */
|
|
20
|
+
bullets?: string[];
|
|
21
|
+
/** Texte interne pour le filtre de recherche (mots-clés en plus du titre et des paragraphes). */
|
|
22
|
+
searchIndex: string;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export type UserGuideBundle = {
|
|
26
|
+
pageTitle: string;
|
|
27
|
+
pageSubtitle: string;
|
|
28
|
+
/** Titre de section par défaut au-dessus des listes `steps` si `stepsTitle` est omis. */
|
|
29
|
+
defaultStepBlockTitle: string;
|
|
30
|
+
/** Titre de section par défaut au-dessus des `options` si `optionsTitle` est omis. */
|
|
31
|
+
defaultOptionsBlockTitle: string;
|
|
32
|
+
searchPlaceholder: string;
|
|
33
|
+
searchAriaLabel: string;
|
|
34
|
+
searchNoResults: string;
|
|
35
|
+
tocHeading: string;
|
|
36
|
+
tocNavAria: string;
|
|
37
|
+
lastUpdated: string;
|
|
38
|
+
sections: UserGuideSection[];
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
function frBundle(): UserGuideBundle {
|
|
42
|
+
return {
|
|
43
|
+
pageTitle: "Guide d’utilisation",
|
|
44
|
+
pageSubtitle:
|
|
45
|
+
"Chaque rubrique mélange **l’intention** (à quoi ça sert *pour vous*), des **étapes** quand c’est enchainé à l’écran, et des **options** concrètes — le tout dans le **même thème** clair ou sombre que l’appli.",
|
|
46
|
+
defaultStepBlockTitle: "Procédure (pas à pas dans l’interface)",
|
|
47
|
+
defaultOptionsBlockTitle: "Options, modes et rappels",
|
|
48
|
+
searchPlaceholder: "Filtrer les rubriques (sens, étapes, options, KronoFocus…)",
|
|
49
|
+
searchAriaLabel: "Recherche dans le guide",
|
|
50
|
+
searchNoResults: "Aucune rubrique ne correspond à votre recherche. Essayez un autre mot-clé ou effacez le filtre.",
|
|
51
|
+
tocHeading: "Sur cette page",
|
|
52
|
+
tocNavAria: "Sommaire du guide d’utilisation",
|
|
53
|
+
lastUpdated: "Dernière mise à jour : avril 2026",
|
|
54
|
+
sections: [
|
|
55
|
+
{
|
|
56
|
+
id: "ug-essence",
|
|
57
|
+
title: "C’est quoi Kronosys — le sens, pas l’onglet",
|
|
58
|
+
searchIndex:
|
|
59
|
+
"but intention pourquoi aide bénéfice productivité focus temps mémoire concentration équipe client reconstituer oubli rythme travail vie attention local données chez soi",
|
|
60
|
+
paragraphs: [
|
|
61
|
+
"Kronosys, c’est un **compagnon** pour *temps* et *travail* : poser **ce** que vous faites, **combien** de temps, dans quel **sujet**, sans théâtre administratif. **À quoi ça sert ?** Moins d’amnésie sur *« j’y ai vraiment mis quoi, cette semaine ? »*, plus de **clôture** propre à la fin d’un bloc, un **récit** (pour vous, une équipe, un client) quand il le faut.",
|
|
62
|
+
"**Pour qui** est-ce pensé ? Les journées en **morceaux** (code, contenu, opérations, recherche…), les **contextes** qui s’entassent, ou le besoin d’**expliquer** sans tout refaire sur Excel. Kronosys reste *chez vous* côté données; Git, miroir, grosse sauvegarde, ce sont des **câbles** que l’on ajoute *quand vous voulez*.",
|
|
63
|
+
],
|
|
64
|
+
optionsTitle: "Trois « pièces » pour trois gestes",
|
|
65
|
+
options: [
|
|
66
|
+
"**Tableau de bord** — l’*atelier* (sessions, tâches, minuteur, raccourcis d’**étiquettes** / **@projets**).",
|
|
67
|
+
"**Rapports** — le *regard en hauteur* (période, thèmes, graphiques, sans refabriquer les chiffres).",
|
|
68
|
+
"**Paramètres** — l’*arrière-boutique* (habitudes, raccordements, zone où l’on *efface* l’histoire *avec prudence*). [Ouvrir Paramètres](/settings#settings-usage-profile).",
|
|
69
|
+
],
|
|
70
|
+
stepsTitle: "Premier contact en cinq pas (sans tout maîtriser le jour 1)",
|
|
71
|
+
steps: [
|
|
72
|
+
"Ouvrez l’**accueil** (tableau de bord) : c’est ici que démarre l’**atelier**.",
|
|
73
|
+
"Déclenchez **Nouvelle session** (ou laissez l’app en créer une *la première fois* qu’une tâche part).",
|
|
74
|
+
"Décrivez un **coup de tâche** (titre) ; un **#mot** = étiquette, un **@nom** = *projet* (le formulaire *devine* souvent l’un et l’autre).",
|
|
75
|
+
"Appuyez sur **Démarrer** (ou lancez le **KronoFocus** *à côté*) pour **tenir** un *créneau*.",
|
|
76
|
+
"Quand la journée le demande, ouvrez **Rapports** pour *voir* ce qui c’est *passé* dans la période — *sans* y passer la soirée en tableurs.",
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: "ug-nav-theme",
|
|
81
|
+
title: "Barre d’outils, thème et langue",
|
|
82
|
+
searchIndex: "thème clair sombre mode violet zinc langue fr en",
|
|
83
|
+
paragraphs: [
|
|
84
|
+
"La **barre du haut** est *toujours* la même famille : mêmes outils, même **ton** (zinc, accents **violet**), pour ne pas recharger le cerveau *à chaque page*. L’icône **roue** mène à [Paramètres](/settings#settings-usage-profile) (raccourci **Alt+Shift+S** depuis le tableau de bord).",
|
|
85
|
+
],
|
|
86
|
+
steps: [
|
|
87
|
+
"En **tableau de bord** : l’icône **Livre** mène ici, puis **Rapports** (graphe), **Paramètres** (roue).",
|
|
88
|
+
"Sur **les autres pages** : revenez à l’**accueil** (icône en **grille**), puis mêmes **Livre**, **Rapports**, **Paramètres** (et, sur **Licences** seule, l’icône **document**).",
|
|
89
|
+
"Le **bouton thème** bascule **clair / sombre** (le soir ou salle trop lumineuse).",
|
|
90
|
+
"Le bouton **actualiser** redemande l’**état** au serveur (utile si quelqu’un/quelque chose a changé dehors *sans* recharger toute l’**app**).",
|
|
91
|
+
"Ouvrez le **menu de langue** (FR / EN) ; la **préférence** peut se **mémoriser** côté moteur si c’est la configuration chez vous.",
|
|
92
|
+
],
|
|
93
|
+
options: [
|
|
94
|
+
"**Livre** = ce **guide** ; **graphe** = **Rapports** ; **roue** = **Paramètres** ; **fichier** = **Licences** (cette dernière **seule** sur l’icône document).",
|
|
95
|
+
"Changer de **thème** ne modifie **pas** le **fond** de vos enregistrements — seulement le **confort** visuel (même **décor** d’écran d’une page à l’autre, pour ne pas se **perdre** entre les onglets)."
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: "ug-layout",
|
|
100
|
+
title: "Où travailler, où regarder, où régler — + juridique",
|
|
101
|
+
searchIndex: "navigation tableaux bord rapports paramètres licences",
|
|
102
|
+
paragraphs: [
|
|
103
|
+
"Trois gestes, trois endroits : l’**atelier** (maintenant), les **Rapports** (retour sur une période), les **Paramètres** (coulisses, effacements sensibles, branchements). Puis **Licences**, la page d’honnêteté sur le code **open source** et les polices.",
|
|
104
|
+
],
|
|
105
|
+
options: [
|
|
106
|
+
"**Tableau de bord** — à gauche la **file des sessions** ; au centre les **tâches** (minuteurs, détail) ; à droite les raccourcis d’**étiquettes** et **@projets** pour ne pas retaper les mêmes mots. C’est l’usage **quotidien**.",
|
|
107
|
+
"**Rapports** — choisir une **plage de dates** et, si besoin, des **#étiquettes** ; lire résumés et graphiques. Une **visite guidée** est proposée la première fois sur l’écran.",
|
|
108
|
+
"**Paramètres** — profil, collecte, planification, étiquettes avancées, **Git** ou miroir en **option** ; la **zone dangereuse** supprime l’historique (avec saisie de confirmation). [Sommaire des paramètres](/settings#settings-usage-profile) · [zone de danger](/settings#settings-danger-zone). N’y entrez **que** quand vous le **décidez**.",
|
|
109
|
+
"**Licences** — textes MIT, logiciels tiers, polices ; icône **document** **uniquement** sur cette page."
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
id: "ug-sessions-tasks",
|
|
114
|
+
title: "Sessions, tâches, étiquettes et projets",
|
|
115
|
+
searchIndex: "session live archiver terminer tâche minuteur pause sous-tâche",
|
|
116
|
+
paragraphs: [
|
|
117
|
+
"La **session** est le **sac** où vient s’additionner le travail sur une période ; la **tâche** est le fil conducteur du moment. **#mot** = thème, **@nom** = projet (le formulaire en propose souvent) — c’est de la **classification**, pas un examen d’orthographe.",
|
|
118
|
+
],
|
|
119
|
+
optionsTitle: "Nouvelle session — le cadre, au choix",
|
|
120
|
+
options: [
|
|
121
|
+
"**Portée minimale** : pas de bordage particulier — vous lancez et c’est le flux qui mène.",
|
|
122
|
+
"**Durée max (horloge murale)** : l’onglet s’y prête (rappel, pas alarme) quand on veut cadrer un gros **morceau** de journée.",
|
|
123
|
+
"**Fenêtre calendrier** : dates de **début** et de **fin** (engagement auprès de vous-même ou d’un tiers).",
|
|
124
|
+
"**Semaine** : jours de la semaine + **plage horaire** (utile en rythme **fixe** — pas pour tout le monde, et c’est normal).",
|
|
125
|
+
"Dans les sélecteurs de dates/heures, les actions rapides **Aujourd’hui** et/ou **Maintenant** sont disponibles pour éviter la saisie manuelle.",
|
|
126
|
+
"Les **tâches** se suivent en **direct** (minuteur) ou s’inscrivent **dans le passé** (début / fin explicites) : honnête quand on remplit **après coup** le soir, sans théâtre."
|
|
127
|
+
],
|
|
128
|
+
stepsTitle: "Dès que vous avez cliqué « Démarrer » sur une tâche (ordre usuel)",
|
|
129
|
+
steps: [
|
|
130
|
+
"Taper un **titre** ; saupoudrer d’un **#** (étiquette) et/ou d’un **@** (projet) dès que le mot vient (aperçu souvent **sous** le champ de saisie).",
|
|
131
|
+
"Cliquer **Démarrer** sur la tâche — ou, si l’heure s’y prête, lancer d’**abord** le **KronoFocus** depuis cette tâche (même bateau, rythme différent).",
|
|
132
|
+
"Si le minuteur d’**une** autre tâche tourne déjà : l’appli offre **pause** sur l’ancienne, **terminer** l’ancienne, ou **tout** tenir en parallèle (vous **pouvez** mémoriser l’**option** pour les prochains lancements).",
|
|
133
|
+
"En **cours** : lister des **sous-tâches** ; les cocher, les reclasser au **glisser-déposer** ; **pause** / reprise en douceur.",
|
|
134
|
+
"**Terminer la session** quand le bloc a une fin (bouton d’en-tête ou bannière) ; une **raison** de clôture **facultative** (dans les temps, en avance, dépassement, autre + note) : pour poser mots sur la **fin** du cycle — d’**abord** pour vous, pas pour un **audit** froid."
|
|
135
|
+
],
|
|
136
|
+
bullets: [
|
|
137
|
+
"L’**option** **Commit** à la fin d’une tâche, quand elle apparaît, concerne **Git** (voir [Synchronisation Git](/settings#settings-git) côté paramètres) : elle n’est **là** que **si** l’intégration est en place — les **équipiers** **non** devs peuvent l’**ignorer** sereinement."
|
|
138
|
+
],
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: "ug-kronofocus",
|
|
142
|
+
title: "KronoFocus — retenir le rythme, pas un bulletin",
|
|
143
|
+
searchIndex: "pomodoro focus minuteur travail pause durée hh:mm",
|
|
144
|
+
paragraphs: [
|
|
145
|
+
"**Travail**, **pause**, **reprise**, **longue pause** : l’idée est l’**alternance** saine, pas une **note** sur le nombre de minutes. Proche d’un **pomodoro**, sans s’y figer si votre rythme diffère."
|
|
146
|
+
],
|
|
147
|
+
optionsTitle: "Où c’est proposé, quoi cliquer",
|
|
148
|
+
options: [
|
|
149
|
+
"Section [KronoFocus (tableau de bord)](/settings#settings-kronoFocus) dans **Paramètres** : minuteur **dans l’en-tête** et/ou **près des actions de tâche** — cocher selon l’encombrement (le **profil** d’usage peut **masquer** d’autres blocs ailleurs).",
|
|
150
|
+
"Sur le **panneau** : **Démarrer**, **Pause**, reprise ; **durée** en `HH:MM:SS` ; **durée par défaut** (p. ex. 25 min) d’un clic ; **historique** des durées pour **réappliquer** la même mesure **sans** la retaper.",
|
|
151
|
+
"Lier le KronoFocus **à** la tâche **active** : utile pour **retrouver** dans l’historique **quelle** tâche portait ce **bloc** de focus."
|
|
152
|
+
],
|
|
153
|
+
steps: [
|
|
154
|
+
"Ouvrez le KronoFocus (en-tête ou près d’une tâche) ; basculez **travail** / **pause** / **longue pause** selon l’**état** affiché.",
|
|
155
|
+
"Ajustez la **durée** (saisie ou raccourci) ; enregistrez souvent la **même** durée **dans l’historique** pour un **réemploi** en un clic.",
|
|
156
|
+
"Lancez le **décompte** ; en fin de phase, l’**écran** propose la **suite** (reprise, autre mode) selon le **flux** en cours."
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
id: "ug-search-palette",
|
|
161
|
+
title: "Recherche : données (tableau de bord) & rubriques (ce guide)",
|
|
162
|
+
searchIndex: "palette recherche données sessions tâches ctrl k",
|
|
163
|
+
paragraphs: [
|
|
164
|
+
"Même **allure** de champ (bordure zinc, focus **violet**) : **deux cibles** — d’**abord** l’**atelier** (sessions, tâches, étiquettes, mots du workspace) ; **ensuite** le **fil** en tête de **cette** page, qui ne filtre **que** les **rubriques** du **guide**."
|
|
165
|
+
],
|
|
166
|
+
stepsTitle: "Données — la palette (tableau de bord)",
|
|
167
|
+
steps: [
|
|
168
|
+
"Cliquer sur **Rechercher dans les données** ou presser **Ctrl+K** (Windows / Linux) / **⌘K** (macOS) : la **palette** s’ouvre (raccourci **réservé** : on ne le **redéfinit** **pas** dans la modale raccourcis).",
|
|
169
|
+
"Saisir **deux** ou **trois** **lettres** d’**une** **session**, d’**une** **tâche**, d’**un** **#** ou d’**un** **@** : la **liste** se **restreint** en **direct**.",
|
|
170
|
+
"Choisir **une** **ligne** (**Entrée** ou **clic**) : l’**écran** **saute** **vers** l’**objet** ; **Échap** **ferme** la **boîte** **sans** **toucher** le **fond**."
|
|
171
|
+
],
|
|
172
|
+
optionsTitle: "Ce guide — le champ collé en haut de page",
|
|
173
|
+
options: [
|
|
174
|
+
"Il ne **lit** **pas** la **base** Kronosys : **seules** les **sections** de **ce** texte d’aide (titres + corps) **subissent** le **filtre**.",
|
|
175
|
+
"Le **compteur** `n / total` (à **droite** du **champ**) rappelle **combien** de **rubriques** **restent** **visibles** **après** la **saisie**."
|
|
176
|
+
],
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
id: "ug-shortcuts",
|
|
180
|
+
title: "Raccourcis clavier (tableau de bord)",
|
|
181
|
+
searchIndex: "raccourcis clavier alt shift ctrl",
|
|
182
|
+
paragraphs: [
|
|
183
|
+
"Ouvrez la **modale des raccourcis** depuis le petit clavier près de la palette pour voir, **modifier** ou **réinitialiser** les combinaisons (les touches **Ctrl+K** / **⌘K** restent réservées à la palette de recherche de données). La relance de **certaines** visites guidées et des options d’**API** se gèrent aussi dans [Paramètres — Web & API](/settings#settings-web).",
|
|
184
|
+
],
|
|
185
|
+
bullets: [
|
|
186
|
+
"Nouvelle session : Alt+Shift+N (par défaut).",
|
|
187
|
+
"Rapports : Alt+Shift+G · Paramètres : Alt+Shift+S · **Guide (cette app)** : Alt+Shift+U.",
|
|
188
|
+
"Colonnes : Ctrl+Alt+H (sessions) · J (tâches) · Y (étiquettes).",
|
|
189
|
+
"Thème : Alt+Shift+T · Langue : Alt+Shift+L · Terminer session live : Alt+Shift+E.",
|
|
190
|
+
],
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
id: "ug-reporting",
|
|
194
|
+
title: "Rapports : la mémoire qui tient, quand on doit la raconter",
|
|
195
|
+
searchIndex: "agregats kpi plage date étiquette semaine assiduité retard heure planifiée",
|
|
196
|
+
paragraphs: [
|
|
197
|
+
"Les **rapports** ne jaugent pas votre humanité : ils aident à **répondre** à *est-ce qu’on peut, ensemble, s’y retrouver sur une période ?* Ce qui n’est **pas** **encore** fini reste **indiqué** (brouillon **honnête**, pas punition).",
|
|
198
|
+
"L’appli **agrège** ce que **vous** avez **déjà** posé (durées, tags, projets) ; parfois des **lignes** / **signaux** côté code et un **aperçu** de dossier **si** c’est **activé** chez vous. Une **visite** sur l’écran adoucit le **premier** tour.",
|
|
199
|
+
"Lorsque l’**hôte** d’enregistrement a **fourni** l’heure de **début prévue** à l’ouverture d’une session (p. ex. moteur lié à l’[horaire](/settings#settings-schedule) ou aux [sessions planifiées](/settings#settings-planned-sessions)), l’**écart** (retard ou avance) est **sauvegardé** sur la session et des **indicateurs d’assiduité** apparaissent dans le **résumé** des **Rapports** : ce n’est en général **pas** rempli par le seul bouton *Nouvelle session* du navigateur, sauf intégration explicite."
|
|
200
|
+
],
|
|
201
|
+
stepsTitle: "Parcours type sur l’écran Rapports",
|
|
202
|
+
steps: [
|
|
203
|
+
"Ouvrir **Rapports** (icône **graphe** ou raccourci **Alt+Shift+G** sur le tableau de bord).",
|
|
204
|
+
"Choisir une **plage** : champs **Du** / **Au**, bouton **Aujourd’hui**, ou préréglages **jour** / **semaine** / **mois** / **année** (selon ce que l’UI expose).",
|
|
205
|
+
"Optionnel : **sélectionner** une ou plusieurs **#étiquettes** pour **restreindre** les tâches (les **sessions** **sans** tâche **correspondante** **disparaissent** des **vues** **basées** **tâches**).",
|
|
206
|
+
"Lire les **blocs** : **résumé**, **tableaux** par **jour**, **temps** par **@projet** / **#tag**, **navigation** de **semaine** **le** **cas** **échéant** ; **lancer** la **visite** **guidée** **si** la **pancarte** **le** **propose**."
|
|
207
|
+
],
|
|
208
|
+
options: [
|
|
209
|
+
"**Indicateurs non finaux** (pastilles) : rappellent le **travail encore ouvert** dans la plage — lire prudemment, pas de chiffrage *figé* tant que des tâches *bougent* encore.",
|
|
210
|
+
"**Début de semaine** (lundi, dimanche ou samedi) : réglage souvent près des **calendriers** hebdo des rapports — choisissez **ce** qui coïncide avec **votre** semaine réelle.",
|
|
211
|
+
"Relancer la visite **Rapports** (aide **premier pas** sur l’écran) : [Paramètres — visite Rapports](/settings#settings-reporting-tour)."
|
|
212
|
+
],
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
id: "ug-settings-integrations",
|
|
216
|
+
title: "Paramètres, sauvegardes et bouts d’usine (quand vous êtes prêt·e)",
|
|
217
|
+
searchIndex: "export backup sqlite json csv gitlab mongo v4 v4-dev next dev développement local",
|
|
218
|
+
paragraphs: [
|
|
219
|
+
"Ici, vous **réglez** l’**appareil** (KronoFocus, **étiquettes** / **@** avancés, planification) et, **seulement si** vous voulez, le **câble** (Git, GitLab, miroir). La **zone dangereuse** : **lisez** le texte à l’**écran** et la **phrase** de confirmation avant de **valider** un **effacement**. L’[index de la page Paramètres](/settings#settings-usage-profile) liste toutes les sections (sommaire à gauche en grand écran)."
|
|
220
|
+
],
|
|
221
|
+
optionsTitle: "Principaux blocs (noms fréquents, selon votre version)",
|
|
222
|
+
options: [
|
|
223
|
+
"**Profil d’usage** ([ancre Profil d’utilisation](/settings#settings-usage-profile)) : ex. *gestion* masque des blocs (p. ex. Lignes de code) qu’un **dév** n’aurait pas caché.",
|
|
224
|
+
"[KronoFocus](/settings#settings-kronoFocus), [Collecte et tampons](/settings#settings-collection), [Horaire de travail](/settings#settings-schedule) ou [sessions planifiées](/settings#settings-planned-sessions), [Tâches et étiquettes](/settings#settings-task-tags) ; [Git](/settings#settings-git) / [MongoDB](/settings#settings-mongo) en branchement **opt-in** (rien n’impose d’ouvrir tout le premier soir).",
|
|
225
|
+
"**Corrections d’horaire** : commutateurs **on/off** dans [Tâches et étiquettes](/settings#settings-task-tags) pour le **début** et la **fin** d’une **tâche**, et le **début** et la **fin** d’une **session** (la fin : tâches et sessions déjà terminées).",
|
|
226
|
+
"**Général — mode développement (coffre local)** ([Paramètres → Général](/settings#settings-dev-data), seulement en `next dev`) : **Enregistrer** avec le bouton principal ; par défaut, **jeu de données** séparé de la **production** ; on peut partager le coffre `v4` (puis **redémarrer** le serveur de dev).",
|
|
227
|
+
"**Sauvegarde** (export) : côté technique l’**API** `GET /api/backup` sert le fichier (paramètre de **format**) ; côté **appli** voir aussi [Export par défaut](/settings#settings-export). L’**URL** de base et l’**install** = **README** côté déploiement."
|
|
228
|
+
],
|
|
229
|
+
stepsTitle: "Avant d’effacer l’historique (check-list courte)",
|
|
230
|
+
steps: [
|
|
231
|
+
"Préférer un **export** (souvent proposé dans l’**écran** d’avertissement) : JSON, CSV, copie **SQLite** selon ce qu’ouvre la **brique** d’hébergement **chez** vous, ou l’[export par défaut](/settings#settings-export) dans l’**UI** quand c’est proposé.",
|
|
232
|
+
"Relire [la zone dangereuse](/settings#settings-danger-zone) (liste de ce **qui** **disparaît** *vraiment*).",
|
|
233
|
+
"Saisir le **mot** de confirmation *exact* demandé ; annuler s’il reste le **doute**."
|
|
234
|
+
],
|
|
235
|
+
},
|
|
236
|
+
],
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function enBundle(): UserGuideBundle {
|
|
241
|
+
return {
|
|
242
|
+
pageTitle: "User guide",
|
|
243
|
+
pageSubtitle:
|
|
244
|
+
"Each section blends *why* it matters **to you**, **step-by-step** moves in the UI when order matters, and **options** you can actually pick — same **light or dark** look as the app.",
|
|
245
|
+
defaultStepBlockTitle: "Step by step in the app",
|
|
246
|
+
defaultOptionsBlockTitle: "Options, modes, and quick facts",
|
|
247
|
+
searchPlaceholder: "Filter topics (purpose, steps, options, KronoFocus…)",
|
|
248
|
+
searchAriaLabel: "Search the user guide",
|
|
249
|
+
searchNoResults: "No section matches. Try another keyword or clear the filter.",
|
|
250
|
+
tocHeading: "On this page",
|
|
251
|
+
tocNavAria: "User guide table of contents",
|
|
252
|
+
lastUpdated: "Last updated: April 2026",
|
|
253
|
+
sections: [
|
|
254
|
+
{
|
|
255
|
+
id: "ug-essence",
|
|
256
|
+
title: "What Kronosys is for — the heart, not the tab",
|
|
257
|
+
searchIndex:
|
|
258
|
+
"purpose why meaning help people benefit productivity time memory focus calm team client explain remember rhythm work life attention local your data",
|
|
259
|
+
paragraphs: [
|
|
260
|
+
"Kronosys is a **companion** for time and work: record **what** you are doing, **for how long**, in which **thread** — not to fill a paperwork show. **What is it for?** A little **less** amnesia about *“how much of my week was that, really?”*, a **clean** way to **end** a work block, and a **story** (for you, a team, a client) when the moment needs it.",
|
|
261
|
+
"Built for people who work in **chunks** (code, copy, operations, research…), **juggle** contexts, or have to **explain** without rebuilding Excel at midnight. Data stays **on your** machine; Git, mirrors, and large backups are **cables** you add when **you** choose.",
|
|
262
|
+
],
|
|
263
|
+
optionsTitle: "Three “rooms” for three moves",
|
|
264
|
+
options: [
|
|
265
|
+
"**Dashboard** — the workbench (sessions, tasks, focus timer, **#** tags and **@** projects).",
|
|
266
|
+
"**Reports** — the look back (range, themes, charts: numbers come from what you **already** logged).",
|
|
267
|
+
"**Settings** — the back room (habits, connections, the **danger** zone where you wipe history **carefully**). [Open Settings](/settings#settings-usage-profile).",
|
|
268
|
+
],
|
|
269
|
+
stepsTitle: "A calm first run (day one need not be perfect)",
|
|
270
|
+
steps: [
|
|
271
|
+
"Open the **home** (dashboard) — the workbench starts there.",
|
|
272
|
+
"Start a **new session** (or let the app start one the first time a task needs it).",
|
|
273
|
+
"Name a **task**; **#** = tag, **@** = project (the form often **suggests** both from what you type).",
|
|
274
|
+
"Press **Start** on the task, or add **KronoFocus** on the **side** if a ritual helps more than a bare timer in the list.",
|
|
275
|
+
"When you need the bigger picture, open **Reports** for a **date range** — you should not have to re-run the week in spreadsheets to see it.",
|
|
276
|
+
],
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
id: "ug-nav-theme",
|
|
280
|
+
title: "Toolbar, theme, and language",
|
|
281
|
+
searchIndex: "theme light dark language fr en brand",
|
|
282
|
+
paragraphs: [
|
|
283
|
+
"The top bar reuses the **same** **family** of controls (zinc, **violet** accents) on every page so **navigation** stays **light** on the brain. The **cog** icon opens [Settings](/settings#settings-usage-profile) (shortcut **Alt+Shift+S** from the dashboard).",
|
|
284
|
+
],
|
|
285
|
+
steps: [
|
|
286
|
+
"On the **dashboard**: **Book** → this guide; **chart** → **Reports**; **cog** → **Settings**.",
|
|
287
|
+
"On **other** pages: **grid** back to **home**; same book / chart / cog; on **Licenses** only, you also get a **file** icon.",
|
|
288
|
+
"**Theme** toggle: **light** or **dark** (evening work or a bright room).",
|
|
289
|
+
"**Refresh** fetches state again from the **server** (e.g. after a change you know happened elsewhere).",
|
|
290
|
+
"**Language** menu: **EN** / **FR**; if the server is configured, the choice can **stick** between visits.",
|
|
291
|
+
],
|
|
292
|
+
options: [
|
|
293
|
+
"**Book** = this guide; **Chart** = **Reports**; **Cog** = **Settings**; **File** = **Licenses** (only on the licenses page).",
|
|
294
|
+
"The **theme** only changes how the **UI** looks — it does **not** alter your stored work.",
|
|
295
|
+
],
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
id: "ug-layout",
|
|
299
|
+
title: "Where to work, where to look back, where to tune",
|
|
300
|
+
searchIndex: "workspace dashboard reports settings license legal",
|
|
301
|
+
paragraphs: [
|
|
302
|
+
"Three main moves: the workbench (now), **Reports** (then), **Settings** (how the app runs + serious cleanup). **Licenses** is the honest credit page for the open building blocks we use.",
|
|
303
|
+
],
|
|
304
|
+
options: [
|
|
305
|
+
"**Dashboard** — **sessions** on the left, **tasks** in the **centre**, **tag** and **@** **shortcuts** on the right so you stop retyping the same words.",
|
|
306
|
+
"**Reports** — pick a **date range** and, if needed, **#** tags; read **summaries** and **charts**; the **tour** may offer itself the first time you land there.",
|
|
307
|
+
"**Settings** — profile, collection, scheduling, **advanced** tags, optional **Git** or **remote**; the **danger zone** can **delete** all **history** (type-to-confirm). [Settings overview](/settings#settings-usage-profile) · [danger zone](/settings#settings-danger-zone).",
|
|
308
|
+
"**Licenses** — MIT, third parties, **fonts**; the **file** icon **only** on that page.",
|
|
309
|
+
],
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
id: "ug-sessions-tasks",
|
|
313
|
+
title: "Sessions, tasks, tags, and projects",
|
|
314
|
+
searchIndex: "session archive end task timer pause subtask",
|
|
315
|
+
paragraphs: [
|
|
316
|
+
"A **session** is the **bag** work piles into; a **task** is the **thread** of a moment. **#** and **@** are naming helpers, not a grammar test.",
|
|
317
|
+
],
|
|
318
|
+
optionsTitle: "New session — the frame, your choice",
|
|
319
|
+
options: [
|
|
320
|
+
"**No** extra frame in particular: start, and the flow **carries** you.",
|
|
321
|
+
"**Max wall** clock: a **nudge** to reframe a **very** long stint.",
|
|
322
|
+
"**Calendar** window: from / to **dates** (a commitment to your later self or someone else).",
|
|
323
|
+
"**Week** + time window on selected **weekdays** (handy in a **fixed** rhythm; skip it if you hate that).",
|
|
324
|
+
"Tasks in **real time** or back-filled with start and end: honest to log the evening for **yesterday**’s work.",
|
|
325
|
+
],
|
|
326
|
+
stepsTitle: "After you press “Start” on a task (usual order)",
|
|
327
|
+
steps: [
|
|
328
|
+
"Type a **title**; add **#** and/or **@** when the words come (a **live** **preview** often shows under the field).",
|
|
329
|
+
"Click **Start** on the task — or, if it fits, launch **KronoFocus** from that **task** first (same work, different rhythm).",
|
|
330
|
+
"If another **timer** is on: **pause** it, **finish** it, or allow both in **parallel** (you can **save** the choice for the next time).",
|
|
331
|
+
"While in progress: add **subtasks**; check them; **reorder** by **drag and drop**; use **pause** and **resume** kindly.",
|
|
332
|
+
"**End session** from the header or banner: optional end reason (on time, early, overrun, other + note) — a word for **how** the block **ended**, not a cold verdict.",
|
|
333
|
+
],
|
|
334
|
+
bullets: [
|
|
335
|
+
"When **Commit** on **finish** appears, it is about **Git** (see [Git sync](/settings#settings-git) in **Settings**) — you can **ignore** it with a clear head if you are not in that workflow.",
|
|
336
|
+
],
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
id: "ug-kronofocus",
|
|
340
|
+
title: "KronoFocus — the rhythm, not a report card",
|
|
341
|
+
searchIndex: "pomodoro timer focus work break duration",
|
|
342
|
+
paragraphs: [
|
|
343
|
+
"**Work**, **pause**, **resume**, long **pause**: the idea is **healthy** alternation at the **bench**, not a score in minutes. Close to a **Pomodoro** — without locking in if your day does not match.",
|
|
344
|
+
],
|
|
345
|
+
optionsTitle: "Where to find it, what the controls do",
|
|
346
|
+
options: [
|
|
347
|
+
"In **Settings**: the [KronoFocus (dashboard)](/settings#settings-kronoFocus) section — show the timer in the **header** and/or **on** the **task** (your **usage** profile can hide other panels elsewhere in the app).",
|
|
348
|
+
"On the **card**: **Start**, **Pause**, resume; **duration** as `HH:MM:SS`; a **one-tap** default (e.g. 25 min); **history** of durations to **reapply** without retyping.",
|
|
349
|
+
"Link the timer to the **active** **task** so you can later see **which** **task** carried that focus block in the **archive**.",
|
|
350
|
+
],
|
|
351
|
+
steps: [
|
|
352
|
+
"Open **KronoFocus** (header or on a **task**); pick **work** / **pause** / **long** **pause** from the state the bar shows.",
|
|
353
|
+
"Adjust the **duration**; add a favourite to **history** to reuse the same **measure** in one click.",
|
|
354
|
+
"Start the **count**down; when a phase ends, the **UI** suggests the **next** **step** in the current flow.",
|
|
355
|
+
],
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
id: "ug-search-palette",
|
|
359
|
+
title: "Search: data (dashboard) and topics (this guide)",
|
|
360
|
+
searchIndex: "palette data search ctrl k",
|
|
361
|
+
paragraphs: [
|
|
362
|
+
"Same field **look** (zinc **border**, **violet** ring on **focus**): first the **workshop** (sessions, tasks, **#** / **@**); on **this** page, the line at the top only **filters** this help text.",
|
|
363
|
+
],
|
|
364
|
+
stepsTitle: "Data — the search palette (dashboard)",
|
|
365
|
+
steps: [
|
|
366
|
+
"Click **search data** or press **Ctrl+K** (win/linux) / **⌘K** (mac) — the palette is **reserved**; you do **not** rebind that chord in the **shortcuts** **modal**.",
|
|
367
|
+
"Type a few **letters** of a **session**, **task**, **#**, or **@**; the list **tightens** as you type.",
|
|
368
|
+
"**Enter** a row to **jump**; **Esc** closes the box without a full **page** **reload**.",
|
|
369
|
+
],
|
|
370
|
+
optionsTitle: "This guide — filter at the top of the page",
|
|
371
|
+
options: [
|
|
372
|
+
"It does **not** read your Kronosys database; it only **filters** the **sections** of this **guide** (titles and body) for **reading** here.",
|
|
373
|
+
"The **n / total** to the right of the field: how many **headings** stay **visible** after you type.",
|
|
374
|
+
],
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
id: "ug-shortcuts",
|
|
378
|
+
title: "Keyboard shortcuts (dashboard)",
|
|
379
|
+
searchIndex: "keyboard hotkey alt shift",
|
|
380
|
+
paragraphs: [
|
|
381
|
+
"Open the **shortcuts** modal (small keyboard by the **search** **trigger**) to view, rebind, or **reset** combinations. **Ctrl+K** / **⌘K** stay reserved for the **data** **palette**. Re-running some **tours** and the **API** options live under [Settings — dashboard & API](/settings#settings-web).",
|
|
382
|
+
],
|
|
383
|
+
bullets: [
|
|
384
|
+
"New session: Alt+Shift+N (default).",
|
|
385
|
+
"Reporting: Alt+Shift+G · Settings: Alt+Shift+S · **This guide**: Alt+Shift+U.",
|
|
386
|
+
"Columns: Ctrl+Alt+H (sessions) · J (tasks) · Y (tags & projects).",
|
|
387
|
+
"Theme: Alt+Shift+T · Language: Alt+Shift+L · End live session: Alt+Shift+E.",
|
|
388
|
+
],
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
id: "ug-reporting",
|
|
392
|
+
title: "Reports: memory you can read back, not a verdict on you",
|
|
393
|
+
searchIndex: "filter date tag week kpi punctuality late schedule planned",
|
|
394
|
+
paragraphs: [
|
|
395
|
+
"Reports are for a **calm** read of a time span, not a moral tally. They help answer: can we, together, make sense of this **period**? Unfinished work stays **indicated** where the UI does — honest draft, not **punishment**.",
|
|
396
|
+
"The app **aggregates** what you **already** recorded (durations, tags, projects), sometimes with code-related lines and a **folder** peek if that is **on** in your **setup**; a **guided** **tour** may soften the **first** visit.",
|
|
397
|
+
"If the **recording** **host** **passed** a **planned** start instant when a session was opened (for example a worker tied to your [work schedule](/settings#settings-schedule) or [planned sessions](/settings#settings-planned-sessions)), the app stores the **offset** in minutes and shows **punctuality** **summary** KPIs on **Reporting** — a browser-only **New session** usually does **not** set this by itself, unless a connector does.",
|
|
398
|
+
],
|
|
399
|
+
stepsTitle: "A typical run on the Reports page",
|
|
400
|
+
steps: [
|
|
401
|
+
"Open **Reports** (chart icon, or **Alt+Shift+G** from the dashboard).",
|
|
402
|
+
"Set **from** and **to** (or a day / week / month / year **preset**, depending on what the UI offers).",
|
|
403
|
+
"Use **Today** / **Now** quick actions in date/time pickers whenever available to jump to the current value.",
|
|
404
|
+
"Optionally pick one or more **#** **tags** (sessions with **no** **matching** task may **disappear** from some **task**-based **views**).",
|
|
405
|
+
"Scroll the **summary**, per-day **tables**, **@project** / **#tag** **breakdowns**, and the week nudger when your data has **enough** **weeks** to flip through.",
|
|
406
|
+
"Start the **guided** **tour** if a prompt appears the **first** time.",
|
|
407
|
+
],
|
|
408
|
+
options: [
|
|
409
|
+
"**Non-final** chips mark work that is not **closed** in the **range** you are looking at: read them gently; the **draft** is not a **failure**.",
|
|
410
|
+
"**Week** starts on (Monday, Sunday, or Saturday) — often next to the tag-week **grids**; pick the one that **matches** how you read a week.",
|
|
411
|
+
"Re-launch the **Reports** first-time **tour** from [Settings — Reporting tour](/settings#settings-reporting-tour).",
|
|
412
|
+
],
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
id: "ug-settings-integrations",
|
|
416
|
+
title: "Settings, safety copies, and extra wiring (when you are ready)",
|
|
417
|
+
searchIndex: "export backup sqlite json gitlab mongo v4 v4-dev next dev local development",
|
|
418
|
+
paragraphs: [
|
|
419
|
+
"Here you tune how the app **presents** itself (KronoFocus, tags and **@** **advanced** paths, **schedule**) and, only if you want, the **cable** to **Git**, GitLab, a **mirror**… The **danger** **zone** — read the on-screen text and the **type**-**to**-**confirm** line before a full **wipe**. The [Settings page index](/settings#settings-usage-profile) links every section (left-hand **TOC** on a wide window).",
|
|
420
|
+
],
|
|
421
|
+
optionsTitle: "What you are likely to find (names can vary with version)",
|
|
422
|
+
options: [
|
|
423
|
+
"**Usage** profile ([Usage profile section](/settings#settings-usage-profile)): e.g. *manager* hides some developer-heavy **panels** you might still want in *dev* mode.",
|
|
424
|
+
"[KronoFocus](/settings#settings-kronoFocus), [Collection & buffers](/settings#settings-collection), [work schedule](/settings#settings-schedule) or [planned sessions](/settings#settings-planned-sessions), [Tasks & tags](/settings#settings-task-tags) ; [Git](/settings#settings-git) / [MongoDB mirror](/settings#settings-mongo) as **opt-in** (nothing forces you to turn everything on day one).",
|
|
425
|
+
"**Time correction**: **on/off** toggles in [Tasks & tags](/settings#settings-task-tags) for **task** and **session** **start** times, plus separate toggles for **end** times on **completed** tasks and **finished** sessions.",
|
|
426
|
+
"**General — local development (data store)** ([Settings → General](/settings#settings-dev-data), only under `next dev`): use the main **Save** button; by default, **dev** uses a **separate** data folder from **production**; you can opt into the same `v4` path, then **restart** the dev server.",
|
|
427
|
+
"**Backup** (export): technically `GET /api/backup` with a **format** query; in the app see also [Export defaults](/settings#settings-export). Base URL and deployment = **README** in your **environment**, not this page alone.",
|
|
428
|
+
],
|
|
429
|
+
stepsTitle: "Before clearing all history (short list)",
|
|
430
|
+
steps: [
|
|
431
|
+
"Prefer an **export** when the UI or hosting layer offers it (JSON, CSV, or **SQLite** copy, depending on what your stack exposes), or [Export defaults](/settings#settings-export) when the UI offers it.",
|
|
432
|
+
"Re-read the [danger zone](/settings#settings-danger-zone): what **actually** **goes** **away**.",
|
|
433
|
+
"Type the **confirmation** word **exact**ly; use **Cancel** if doubt remains.",
|
|
434
|
+
],
|
|
435
|
+
},
|
|
436
|
+
],
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
function stripInternalGuideLinks(s: string): string {
|
|
441
|
+
return s.replace(/\[([^\]]+)\]\(\/[^)]+\)/g, "$1");
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
function stripSimpleMarkdown(s: string): string {
|
|
445
|
+
return s.replaceAll("**", "");
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/** Même champs qu’en affichage, moins le gras et la syntaxe des liens (pour l’index de recherche). */
|
|
449
|
+
function stripForSearch(s: string): string {
|
|
450
|
+
return stripSimpleMarkdown(stripInternalGuideLinks(s));
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
export function userGuideBundle(lang: Lang): UserGuideBundle {
|
|
454
|
+
return lang === "fr" ? frBundle() : enBundle();
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/** Texte d’index pour la recherche (titre, paragraphes, puce, index explicite). */
|
|
458
|
+
export function sectionSearchHaystack(s: UserGuideSection): string {
|
|
459
|
+
const p = s.paragraphs.map(stripForSearch).join(" ");
|
|
460
|
+
const b = (s.bullets ?? []).map(stripForSearch).join(" ");
|
|
461
|
+
const st = (s.steps ?? []).map(stripForSearch).join(" ");
|
|
462
|
+
const o = (s.options ?? []).map(stripForSearch).join(" ");
|
|
463
|
+
return `${s.title} ${p} ${b} ${st} ${o} ${s.searchIndex}`.toLowerCase();
|
|
464
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Valeurs par défaut pour le formulaire Paramètres (instantané lignes de code).
|
|
3
|
+
* À tenir aligné avec `src/workspaceLocConfig.ts` et package.json.
|
|
4
|
+
*/
|
|
5
|
+
export const DEFAULT_WORKSPACE_LOC_EXCLUDED_DIRECTORY_NAMES: readonly string[] = [
|
|
6
|
+
"node_modules",
|
|
7
|
+
".git",
|
|
8
|
+
"dist",
|
|
9
|
+
"out",
|
|
10
|
+
"build",
|
|
11
|
+
".next",
|
|
12
|
+
"coverage",
|
|
13
|
+
"target",
|
|
14
|
+
"__pycache__",
|
|
15
|
+
".venv",
|
|
16
|
+
"venv",
|
|
17
|
+
"vendor",
|
|
18
|
+
".turbo",
|
|
19
|
+
".cache",
|
|
20
|
+
".idea",
|
|
21
|
+
] as const;
|
package/next-env.d.ts
ADDED
package/next.config.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import type { NextConfig } from "next";
|
|
4
|
+
|
|
5
|
+
const appDir = path.dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
|
|
7
|
+
const nextConfig: NextConfig = {
|
|
8
|
+
turbopack: {
|
|
9
|
+
root: appDir,
|
|
10
|
+
},
|
|
11
|
+
serverExternalPackages: ["better-sqlite3"],
|
|
12
|
+
outputFileTracingRoot: appDir,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default nextConfig;
|
package/package.json
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nightkatana/kronosys-app",
|
|
3
|
+
"version": "1.0.0-beta.0",
|
|
4
|
+
"description": "Kronosys — application Next.js (UI + API + SQLite).",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "nightkatana",
|
|
7
|
+
"packageManager": "npm@11.3.0",
|
|
8
|
+
"publishConfig": {
|
|
9
|
+
"access": "public"
|
|
10
|
+
},
|
|
11
|
+
"bin": {
|
|
12
|
+
"kronosys": "./bin/kronosys.mjs"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"README.md",
|
|
16
|
+
"bin",
|
|
17
|
+
"app",
|
|
18
|
+
"components",
|
|
19
|
+
"lib",
|
|
20
|
+
"public",
|
|
21
|
+
"server",
|
|
22
|
+
"next.config.ts",
|
|
23
|
+
"postcss.config.mjs",
|
|
24
|
+
"tsconfig.json",
|
|
25
|
+
"next-env.d.ts"
|
|
26
|
+
],
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=20"
|
|
29
|
+
},
|
|
30
|
+
"volta": {
|
|
31
|
+
"node": "22.22.0",
|
|
32
|
+
"npm": "11.3.0"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"dev": "next dev --webpack -H kronosys -p 5555",
|
|
36
|
+
"dev:e2e": "next dev --webpack -H 127.0.0.1 -p 5555",
|
|
37
|
+
"build": "next build --webpack",
|
|
38
|
+
"start": "next start -p 5555",
|
|
39
|
+
"lint": "eslint",
|
|
40
|
+
"test": "vitest run",
|
|
41
|
+
"test:coverage": "vitest run --coverage --reporter=default --reporter=junit --outputFile.junit=reports/vitest-junit.xml",
|
|
42
|
+
"test:watch": "vitest",
|
|
43
|
+
"test:e2e": "playwright test",
|
|
44
|
+
"test:e2e:ui": "playwright test --ui",
|
|
45
|
+
"test:e2e:install": "playwright install chromium",
|
|
46
|
+
"prepare": "husky",
|
|
47
|
+
"prepublishOnly": "npm run build",
|
|
48
|
+
"hooks:install": "husky",
|
|
49
|
+
"pack:release": "bash scripts/pack-with-zip.sh",
|
|
50
|
+
"changeset": "changeset",
|
|
51
|
+
"changelog:build": "node scripts/build-user-changelog.mjs",
|
|
52
|
+
"version:release": "changeset version && npm run changelog:build"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@dnd-kit/core": "^6.3.1",
|
|
56
|
+
"@dnd-kit/sortable": "^10.0.0",
|
|
57
|
+
"@dnd-kit/utilities": "^3.2.2",
|
|
58
|
+
"better-sqlite3": "^12.9.0",
|
|
59
|
+
"date-fns": "^4.1.0",
|
|
60
|
+
"fflate": "^0.8.2",
|
|
61
|
+
"lucide-react": "^1.8.0",
|
|
62
|
+
"mongodb": "^6.21.0",
|
|
63
|
+
"next": "16.2.3",
|
|
64
|
+
"react": "19.2.4",
|
|
65
|
+
"react-day-picker": "^9.14.0",
|
|
66
|
+
"react-dom": "19.2.4"
|
|
67
|
+
},
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@changesets/cli": "^2.31.0",
|
|
70
|
+
"@playwright/test": "^1.59.1",
|
|
71
|
+
"@tailwindcss/postcss": "^4",
|
|
72
|
+
"@testing-library/react": "^16.3.0",
|
|
73
|
+
"@testing-library/user-event": "^14.6.1",
|
|
74
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
75
|
+
"@types/node": "^22.15.21",
|
|
76
|
+
"@types/react": "^19",
|
|
77
|
+
"@types/react-dom": "^19",
|
|
78
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
79
|
+
"eslint": "^9",
|
|
80
|
+
"eslint-config-next": "16.2.3",
|
|
81
|
+
"husky": "^9.1.7",
|
|
82
|
+
"jsdom": "^26.1.0",
|
|
83
|
+
"tailwindcss": "^4",
|
|
84
|
+
"typescript": "^5.9.3",
|
|
85
|
+
"vitest": "^3.2.4"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
|
|
4
|
+
const appRoot = path.dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
|
|
6
|
+
const config = {
|
|
7
|
+
plugins: {
|
|
8
|
+
"@tailwindcss/postcss": { base: appRoot },
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default config;
|
|
Binary file
|
|
Binary file
|
package/public/file.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
|
package/public/globe.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
|
|
Binary file
|
|
Binary file
|
package/public/icon.png
ADDED
|
Binary file
|