@autocode-cli/autocode 0.2.1 → 0.3.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.
Files changed (47) hide show
  1. package/dist/server/dashboard/pages/autocreate.js +3 -3
  2. package/dist/server/dashboard/pages/changelog.d.ts.map +1 -1
  3. package/dist/server/dashboard/pages/changelog.js +20 -11
  4. package/dist/server/dashboard/pages/changelog.js.map +1 -1
  5. package/dist/server/dashboard/pages/column-edit.js +2 -2
  6. package/dist/server/dashboard/pages/column-prompt.d.ts.map +1 -1
  7. package/dist/server/dashboard/pages/column-prompt.js +21 -0
  8. package/dist/server/dashboard/pages/column-prompt.js.map +1 -1
  9. package/dist/server/dashboard/pages/column-terminal.d.ts.map +1 -1
  10. package/dist/server/dashboard/pages/column-terminal.js +21 -0
  11. package/dist/server/dashboard/pages/column-terminal.js.map +1 -1
  12. package/dist/server/dashboard/pages/issue-graph.d.ts.map +1 -1
  13. package/dist/server/dashboard/pages/issue-graph.js +70 -22
  14. package/dist/server/dashboard/pages/issue-graph.js.map +1 -1
  15. package/dist/server/dashboard/pages/issue-shared.d.ts.map +1 -1
  16. package/dist/server/dashboard/pages/issue-shared.js +54 -122
  17. package/dist/server/dashboard/pages/issue-shared.js.map +1 -1
  18. package/dist/server/dashboard/pages/issue-view.js +1 -1
  19. package/dist/server/dashboard/pages/new-issue.d.ts.map +1 -1
  20. package/dist/server/dashboard/pages/new-issue.js +34 -128
  21. package/dist/server/dashboard/pages/new-issue.js.map +1 -1
  22. package/dist/server/dashboard/pages/pipeline-configurator.d.ts.map +1 -1
  23. package/dist/server/dashboard/pages/pipeline-configurator.js +39 -183
  24. package/dist/server/dashboard/pages/pipeline-configurator.js.map +1 -1
  25. package/dist/server/dashboard/pages/stats-page.d.ts.map +1 -1
  26. package/dist/server/dashboard/pages/stats-page.js +43 -109
  27. package/dist/server/dashboard/pages/stats-page.js.map +1 -1
  28. package/dist/server/dashboard/scripts/index.d.ts.map +1 -1
  29. package/dist/server/dashboard/scripts/index.js +48 -253
  30. package/dist/server/dashboard/scripts/index.js.map +1 -1
  31. package/dist/server/dashboard/shared/header.d.ts +88 -0
  32. package/dist/server/dashboard/shared/header.d.ts.map +1 -0
  33. package/dist/server/dashboard/shared/header.js +209 -0
  34. package/dist/server/dashboard/shared/header.js.map +1 -0
  35. package/dist/server/dashboard/shared/i18n-script.d.ts +45 -0
  36. package/dist/server/dashboard/shared/i18n-script.d.ts.map +1 -0
  37. package/dist/server/dashboard/shared/i18n-script.js +204 -0
  38. package/dist/server/dashboard/shared/i18n-script.js.map +1 -0
  39. package/dist/server/dashboard/shared/index.d.ts +19 -0
  40. package/dist/server/dashboard/shared/index.d.ts.map +1 -0
  41. package/dist/server/dashboard/shared/index.js +22 -0
  42. package/dist/server/dashboard/shared/index.js.map +1 -0
  43. package/dist/server/dashboard/shared/translations.d.ts +515 -0
  44. package/dist/server/dashboard/shared/translations.d.ts.map +1 -0
  45. package/dist/server/dashboard/shared/translations.js +591 -0
  46. package/dist/server/dashboard/shared/translations.js.map +1 -0
  47. package/package.json +1 -1
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Centralized header component generator
3
+ *
4
+ * This module generates the header HTML for all dashboard pages.
5
+ * It includes the language switcher and preserves all dashboard functionality.
6
+ */
7
+ /**
8
+ * Configuration for the header component
9
+ */
10
+ export interface HeaderConfig {
11
+ /**
12
+ * Page type determines the header layout
13
+ */
14
+ pageType: 'dashboard' | 'issue' | 'settings' | 'stats' | 'changelog' | 'graph' | 'terminal' | 'new-issue' | 'column';
15
+ /**
16
+ * Static title text
17
+ */
18
+ title?: string;
19
+ /**
20
+ * i18n key for the title (uses data-i18n attribute)
21
+ */
22
+ titleKey?: string;
23
+ /**
24
+ * Back link configuration
25
+ */
26
+ backLink?: {
27
+ href: string;
28
+ label?: string;
29
+ labelKey?: string;
30
+ };
31
+ /**
32
+ * Issue-specific header info (for issue pages)
33
+ */
34
+ issueInfo?: {
35
+ issueKey: string;
36
+ title: string;
37
+ };
38
+ /**
39
+ * Column-specific header info (for column pages)
40
+ */
41
+ columnInfo?: {
42
+ issueKey: string;
43
+ columnSlug: string;
44
+ pageTitle: string;
45
+ };
46
+ /**
47
+ * Show the logo and title section (dashboard only)
48
+ */
49
+ showLogo?: boolean;
50
+ /**
51
+ * Show navigation icons (Graph, Configurator) (dashboard only)
52
+ */
53
+ showNavIcons?: boolean;
54
+ /**
55
+ * Show the stats bar (dashboard only)
56
+ */
57
+ showStats?: boolean;
58
+ /**
59
+ * Show filters (priority select, search) (dashboard only)
60
+ */
61
+ showFilters?: boolean;
62
+ /**
63
+ * Show the "New issue" button (dashboard only)
64
+ */
65
+ showNewIssueButton?: boolean;
66
+ /**
67
+ * Custom content to add at the right side of the header
68
+ */
69
+ customRight?: string;
70
+ }
71
+ /**
72
+ * Generate the language switcher HTML
73
+ * This is included in ALL headers
74
+ */
75
+ export declare function generateLangSwitcher(): string;
76
+ /**
77
+ * Generate the header HTML based on configuration
78
+ */
79
+ export declare function generateHeader(config: HeaderConfig): string;
80
+ /**
81
+ * Generate the stats page header
82
+ */
83
+ export declare function generateStatsHeader(): string;
84
+ /**
85
+ * Generate the changelog page header
86
+ */
87
+ export declare function generateChangelogHeader(lang: 'en' | 'fr'): string;
88
+ //# sourceMappingURL=header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/shared/header.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,QAAQ,EACJ,WAAW,GACX,OAAO,GACP,UAAU,GACV,OAAO,GACP,WAAW,GACX,OAAO,GACP,UAAU,GACV,WAAW,GACX,QAAQ,CAAC;IAEb;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF;;OAEG;IACH,SAAS,CAAC,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAEF;;OAEG;IACH,UAAU,CAAC,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAMF;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAO7C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAuB3D;AAiJD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAU5C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,CAWjE"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Centralized header component generator
3
+ *
4
+ * This module generates the header HTML for all dashboard pages.
5
+ * It includes the language switcher and preserves all dashboard functionality.
6
+ */
7
+ /**
8
+ * Escape HTML special characters
9
+ */
10
+ function escapeHtml(text) {
11
+ if (!text)
12
+ return '';
13
+ return text
14
+ .replace(/&/g, '&')
15
+ .replace(/</g, '&lt;')
16
+ .replace(/>/g, '&gt;')
17
+ .replace(/"/g, '&quot;')
18
+ .replace(/'/g, '&#39;');
19
+ }
20
+ /**
21
+ * Generate the language switcher HTML
22
+ * This is included in ALL headers
23
+ */
24
+ export function generateLangSwitcher() {
25
+ return `
26
+ <div class="lang-switcher" id="lang-switcher">
27
+ <button class="lang-btn" data-lang="en">EN</button>
28
+ <button class="lang-btn" data-lang="fr">FR</button>
29
+ </div>
30
+ `;
31
+ }
32
+ /**
33
+ * Generate the header HTML based on configuration
34
+ */
35
+ export function generateHeader(config) {
36
+ switch (config.pageType) {
37
+ case 'dashboard':
38
+ return generateDashboardHeader(config);
39
+ case 'issue':
40
+ return generateIssueHeader(config);
41
+ case 'stats':
42
+ return generateSimpleHeader(config);
43
+ case 'changelog':
44
+ return generateSimpleHeader(config);
45
+ case 'graph':
46
+ return generateGraphHeader(config);
47
+ case 'new-issue':
48
+ return generateSimpleHeader(config);
49
+ case 'settings':
50
+ return generateSimpleHeader(config);
51
+ case 'terminal':
52
+ return generateSimpleHeader(config);
53
+ case 'column':
54
+ return generateColumnHeader(config);
55
+ default:
56
+ return generateSimpleHeader(config);
57
+ }
58
+ }
59
+ /**
60
+ * Generate the main dashboard header with all features
61
+ */
62
+ function generateDashboardHeader(config) {
63
+ const logoSection = `
64
+ <div class="header-logo">
65
+ <a href="/" class="logo-link"><span>&#9889;</span> AutoCode</a>
66
+ <span class="header-title">Dashboard</span>
67
+ <a href="/issues/graph" class="header-icon-link" title="Issues Graph">&#128256;</a>
68
+ <a href="/settings/pipeline/configurator" class="header-icon-link" title="Pipeline Configurator">&#9881;&#65039;</a>
69
+ </div>
70
+ `;
71
+ const statsSection = config.showStats !== false ? '<div class="stats" id="stats"></div>' : '';
72
+ const filtersSection = config.showFilters !== false
73
+ ? `
74
+ <div class="filters">
75
+ <select id="filter-priority">
76
+ <option value="" data-i18n="filter.allPriorities">All priorities</option>
77
+ <option value="P0">P0</option>
78
+ <option value="P1">P1</option>
79
+ <option value="P2">P2</option>
80
+ <option value="P3">P3</option>
81
+ </select>
82
+ <input type="text" id="filter-search" placeholder="Search..." data-i18n-placeholder="filter.search">
83
+ ${generateLangSwitcher()}
84
+ <a href="/issue/new" class="btn btn-primary" data-i18n="btn.newIssue">+ New issue</a>
85
+ </div>
86
+ `
87
+ : generateLangSwitcher();
88
+ return `
89
+ <header>
90
+ ${logoSection}
91
+ ${statsSection}
92
+ ${filtersSection}
93
+ </header>
94
+ `;
95
+ }
96
+ /**
97
+ * Generate the issue page header
98
+ */
99
+ function generateIssueHeader(config) {
100
+ const backLink = config.backLink || { href: '/', label: 'Dashboard' };
101
+ const backLinkHtml = `<a href="${backLink.href}" class="back-btn">← ${escapeHtml(backLink.label || 'Dashboard')}</a>`;
102
+ const issueInfoHtml = config.issueInfo
103
+ ? `
104
+ <div class="issue-header-info">
105
+ <span class="issue-key">${escapeHtml(config.issueInfo.issueKey)}</span>
106
+ <span class="issue-title">${escapeHtml(config.issueInfo.title)}</span>
107
+ </div>
108
+ `
109
+ : '';
110
+ return `
111
+ <header class="header">
112
+ ${backLinkHtml}
113
+ ${issueInfoHtml}
114
+ ${generateLangSwitcher()}
115
+ </header>
116
+ `;
117
+ }
118
+ /**
119
+ * Generate a simple header with back link, title, and lang switcher
120
+ */
121
+ function generateSimpleHeader(config) {
122
+ const backLinkHtml = config.backLink
123
+ ? `<a href="${config.backLink.href}" class="back-btn"${config.backLink.labelKey ? ` data-i18n="${config.backLink.labelKey}"` : ''}>← ${escapeHtml(config.backLink.label || 'Back')}</a>`
124
+ : '';
125
+ const titleHtml = config.title
126
+ ? `<h1 class="title"${config.titleKey ? ` data-i18n="${config.titleKey}"` : ''}>${escapeHtml(config.title)}</h1>`
127
+ : '';
128
+ const customRightHtml = config.customRight || '';
129
+ return `
130
+ <header class="header">
131
+ ${backLinkHtml}
132
+ ${titleHtml}
133
+ ${generateLangSwitcher()}
134
+ ${customRightHtml}
135
+ </header>
136
+ `;
137
+ }
138
+ /**
139
+ * Generate the issue graph header
140
+ */
141
+ function generateGraphHeader(config) {
142
+ const backLink = config.backLink || { href: '/', label: 'Back to Dashboard' };
143
+ return `
144
+ <header class="graph-header">
145
+ <div class="header-left">
146
+ <a href="${backLink.href}" class="back-link"${config.backLink?.labelKey ? ` data-i18n="${config.backLink.labelKey}"` : ''}>← ${escapeHtml(backLink.label || 'Back to Dashboard')}</a>
147
+ <h1${config.titleKey ? ` data-i18n="${config.titleKey}"` : ''}>${escapeHtml(config.title || 'Issue Hierarchy')}</h1>
148
+ </div>
149
+ <div class="header-stats">
150
+ <span class="stat"><span class="stat-label" data-i18n="graph.rootIssues">Root issues</span>: <span id="root-count">-</span></span>
151
+ <span class="stat"><span class="stat-label" data-i18n="graph.totalIssues">Total issues</span>: <span id="total-count">-</span></span>
152
+ <span class="stat"><span class="stat-label" data-i18n="graph.maxDepth">Max depth</span>: <span id="max-depth">-</span></span>
153
+ </div>
154
+ ${generateLangSwitcher()}
155
+ <div class="zoom-controls">
156
+ <button onclick="zoomIn()" title="Zoom in" data-i18n-title="graph.zoomIn">+</button>
157
+ <button onclick="resetZoom()" title="Reset" data-i18n-title="graph.resetZoom">100%</button>
158
+ <button onclick="zoomOut()" title="Zoom out" data-i18n-title="graph.zoomOut">-</button>
159
+ </div>
160
+ </header>
161
+ `;
162
+ }
163
+ /**
164
+ * Generate the column page header (terminal, prompt, edit)
165
+ */
166
+ function generateColumnHeader(config) {
167
+ if (!config.columnInfo) {
168
+ return generateSimpleHeader(config);
169
+ }
170
+ const { issueKey, columnSlug, pageTitle } = config.columnInfo;
171
+ return `
172
+ <header class="header">
173
+ <a href="/issue/${escapeHtml(issueKey)}" class="back-btn">← Back to issue</a>
174
+ <span class="issue-key">${escapeHtml(issueKey)}</span>
175
+ <span class="column-slug">${escapeHtml(columnSlug)}</span>
176
+ <div class="page-title">${escapeHtml(pageTitle)}</div>
177
+ ${generateLangSwitcher()}
178
+ </header>
179
+ `;
180
+ }
181
+ /**
182
+ * Generate the stats page header
183
+ */
184
+ export function generateStatsHeader() {
185
+ return `
186
+ <div class="stats-header">
187
+ <h1><span data-i18n="stats.pageTitle">Claude Statistics</span> <span id="refresh-indicator" class="refresh-indicator"></span></h1>
188
+ <div class="header-actions">
189
+ ${generateLangSwitcher()}
190
+ <a href="/" class="btn-back" data-i18n="btn.backToDashboard">Back to dashboard</a>
191
+ </div>
192
+ </div>
193
+ `;
194
+ }
195
+ /**
196
+ * Generate the changelog page header
197
+ */
198
+ export function generateChangelogHeader(lang) {
199
+ const title = lang === 'fr' ? 'Journal des modifications' : 'Changelog';
200
+ const backText = lang === 'fr' ? 'Retour au dashboard' : 'Back to dashboard';
201
+ return `
202
+ <header class="changelog-page-header">
203
+ <a href="/" class="back-link">← ${backText}</a>
204
+ <h1>${title}</h1>
205
+ ${generateLangSwitcher()}
206
+ </header>
207
+ `;
208
+ }
209
+ //# sourceMappingURL=header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.js","sourceRoot":"","sources":["../../../../src/server/dashboard/shared/header.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Centralized i18n JavaScript generator
3
+ *
4
+ * This module generates the client-side JavaScript for language switching.
5
+ * All pages should use this instead of defining their own switchLanguage function.
6
+ */
7
+ import { type TranslationKey } from './translations.js';
8
+ export interface I18nScriptConfig {
9
+ /**
10
+ * If specified, only include these translation keys (smaller bundle).
11
+ * If not specified, includes all translations.
12
+ */
13
+ keys?: TranslationKey[];
14
+ /**
15
+ * Optional callback function name to call after language change.
16
+ * The function must be defined in the page's script.
17
+ * Example: 'onLanguageChange' will call onLanguageChange() after switching.
18
+ */
19
+ onLangChangeCallback?: string;
20
+ /**
21
+ * If true, also set a global variable for ACTION.md editor language.
22
+ * Used by the main dashboard.
23
+ */
24
+ includeActionLang?: boolean;
25
+ }
26
+ /**
27
+ * Generate the i18n JavaScript for a page.
28
+ *
29
+ * This returns a JavaScript string that can be embedded in a <script> tag.
30
+ * It provides:
31
+ * - STORAGE_KEY constant
32
+ * - currentLang variable (from localStorage, defaults to 'fr')
33
+ * - translations object (all or filtered)
34
+ * - t(key) function for getting translations
35
+ * - switchLanguage(lang) function (NO page reload)
36
+ * - updateLangUI() function for updating DOM
37
+ * - Auto-initialization on page load
38
+ */
39
+ export declare function generateI18nScript(config?: I18nScriptConfig): string;
40
+ /**
41
+ * Generate a minimal i18n script for pages that only need language switching
42
+ * without the full translations object (translations are embedded in HTML).
43
+ */
44
+ export declare function generateMinimalI18nScript(): string;
45
+ //# sourceMappingURL=i18n-script.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n-script.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/shared/i18n-script.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC;IAExB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,gBAAqB,GAAG,MAAM,CAoIxE;AA0BD;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CA6BlD"}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Centralized i18n JavaScript generator
3
+ *
4
+ * This module generates the client-side JavaScript for language switching.
5
+ * All pages should use this instead of defining their own switchLanguage function.
6
+ */
7
+ import { translations } from './translations.js';
8
+ /**
9
+ * Generate the i18n JavaScript for a page.
10
+ *
11
+ * This returns a JavaScript string that can be embedded in a <script> tag.
12
+ * It provides:
13
+ * - STORAGE_KEY constant
14
+ * - currentLang variable (from localStorage, defaults to 'fr')
15
+ * - translations object (all or filtered)
16
+ * - t(key) function for getting translations
17
+ * - switchLanguage(lang) function (NO page reload)
18
+ * - updateLangUI() function for updating DOM
19
+ * - Auto-initialization on page load
20
+ */
21
+ export function generateI18nScript(config = {}) {
22
+ // Filter translations if keys specified
23
+ const translationsToInclude = config.keys
24
+ ? filterTranslations(config.keys)
25
+ : translations;
26
+ const actionLangCode = config.includeActionLang
27
+ ? 'let currentActionLang = currentLang;'
28
+ : '';
29
+ const actionLangUpdate = config.includeActionLang
30
+ ? 'currentActionLang = lang;'
31
+ : '';
32
+ const callbackCode = config.onLangChangeCallback
33
+ ? `if (typeof ${config.onLangChangeCallback} === 'function') { ${config.onLangChangeCallback}(); }`
34
+ : '';
35
+ return `
36
+ // ========================================
37
+ // CENTRALIZED i18n SYSTEM
38
+ // ========================================
39
+ const STORAGE_KEY = 'autocode-lang';
40
+ let currentLang = localStorage.getItem(STORAGE_KEY) || 'fr';
41
+ ${actionLangCode}
42
+
43
+ const translations = ${JSON.stringify(translationsToInclude, null, 2)};
44
+
45
+ /**
46
+ * Get translation for a key
47
+ */
48
+ function t(key) {
49
+ return translations[currentLang]?.[key] || translations['en']?.[key] || key;
50
+ }
51
+
52
+ /**
53
+ * Switch language and update all UI elements
54
+ * NO page reload - updates DOM directly
55
+ */
56
+ function switchLanguage(lang) {
57
+ if (lang === currentLang) return;
58
+
59
+ currentLang = lang;
60
+ ${actionLangUpdate}
61
+ localStorage.setItem(STORAGE_KEY, lang);
62
+ document.documentElement.lang = lang;
63
+
64
+ updateLangUI();
65
+ ${callbackCode}
66
+ }
67
+
68
+ /**
69
+ * Update all UI elements with translations
70
+ */
71
+ function updateLangUI() {
72
+ // Update lang switcher buttons
73
+ document.querySelectorAll('.lang-switcher .lang-btn').forEach(btn => {
74
+ btn.classList.toggle('active', btn.dataset.lang === currentLang);
75
+ });
76
+
77
+ // Update all elements with data-i18n (text content)
78
+ document.querySelectorAll('[data-i18n]').forEach(el => {
79
+ const key = el.getAttribute('data-i18n');
80
+ const translated = t(key);
81
+ if (translated && translated !== key) {
82
+ // Preserve child elements (like badges, icons)
83
+ const preservedChildren = [];
84
+ el.querySelectorAll('.tab-badge, .count-badge, .badge, .icon').forEach(child => {
85
+ preservedChildren.push(child.cloneNode(true));
86
+ });
87
+
88
+ el.textContent = translated;
89
+
90
+ // Re-append preserved children
91
+ preservedChildren.forEach(child => {
92
+ el.appendChild(document.createTextNode(' '));
93
+ el.appendChild(child);
94
+ });
95
+ }
96
+ });
97
+
98
+ // Update placeholders
99
+ document.querySelectorAll('[data-i18n-placeholder]').forEach(el => {
100
+ const key = el.getAttribute('data-i18n-placeholder');
101
+ const translated = t(key);
102
+ if (translated && translated !== key) {
103
+ el.placeholder = translated;
104
+ }
105
+ });
106
+
107
+ // Update select options
108
+ document.querySelectorAll('select option[data-i18n]').forEach(el => {
109
+ const key = el.getAttribute('data-i18n');
110
+ const translated = t(key);
111
+ if (translated && translated !== key) {
112
+ el.textContent = translated;
113
+ }
114
+ });
115
+
116
+ // Update title attributes
117
+ document.querySelectorAll('[data-i18n-title]').forEach(el => {
118
+ const key = el.getAttribute('data-i18n-title');
119
+ const translated = t(key);
120
+ if (translated && translated !== key) {
121
+ el.title = translated;
122
+ }
123
+ });
124
+
125
+ // Update page title if data-i18n-page-title exists
126
+ const pageTitleKey = document.body.getAttribute('data-i18n-page-title');
127
+ if (pageTitleKey) {
128
+ const translated = t(pageTitleKey);
129
+ if (translated && translated !== pageTitleKey) {
130
+ document.title = translated + ' - AutoCode';
131
+ }
132
+ }
133
+ }
134
+
135
+ // Initialize language switcher
136
+ (function initLangSwitcher() {
137
+ // Set initial language state
138
+ document.documentElement.lang = currentLang;
139
+
140
+ // Attach event listeners to lang buttons
141
+ document.querySelectorAll('.lang-switcher .lang-btn').forEach(btn => {
142
+ btn.addEventListener('click', () => switchLanguage(btn.dataset.lang));
143
+ });
144
+
145
+ // Update UI with current language
146
+ updateLangUI();
147
+ })();
148
+ `;
149
+ }
150
+ /**
151
+ * Filter translations to include only specified keys
152
+ */
153
+ function filterTranslations(keys) {
154
+ const keySet = new Set(keys);
155
+ const filteredEn = {};
156
+ const filteredFr = {};
157
+ for (const key of keys) {
158
+ if (key in translations.en) {
159
+ filteredEn[key] = translations.en[key];
160
+ }
161
+ if (key in translations.fr) {
162
+ filteredFr[key] = translations.fr[key];
163
+ }
164
+ }
165
+ return {
166
+ en: filteredEn,
167
+ fr: filteredFr,
168
+ };
169
+ }
170
+ /**
171
+ * Generate a minimal i18n script for pages that only need language switching
172
+ * without the full translations object (translations are embedded in HTML).
173
+ */
174
+ export function generateMinimalI18nScript() {
175
+ return `
176
+ // Minimal i18n - just language switching
177
+ const STORAGE_KEY = 'autocode-lang';
178
+ let currentLang = localStorage.getItem(STORAGE_KEY) || 'fr';
179
+
180
+ function switchLanguage(lang) {
181
+ if (lang === currentLang) return;
182
+ currentLang = lang;
183
+ localStorage.setItem(STORAGE_KEY, lang);
184
+ document.documentElement.lang = lang;
185
+ updateLangUI();
186
+ }
187
+
188
+ function updateLangUI() {
189
+ document.querySelectorAll('.lang-switcher .lang-btn').forEach(btn => {
190
+ btn.classList.toggle('active', btn.dataset.lang === currentLang);
191
+ });
192
+ }
193
+
194
+ // Initialize
195
+ (function() {
196
+ document.documentElement.lang = currentLang;
197
+ document.querySelectorAll('.lang-switcher .lang-btn').forEach(btn => {
198
+ btn.addEventListener('click', () => switchLanguage(btn.dataset.lang));
199
+ });
200
+ updateLangUI();
201
+ })();
202
+ `;
203
+ }
204
+ //# sourceMappingURL=i18n-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n-script.js","sourceRoot":"","sources":["../../../../src/server/dashboard/shared/i18n-script.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAuB,MAAM,mBAAmB,CAAC;AAuBtE;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAA2B,EAAE;IAC9D,wCAAwC;IACxC,MAAM,qBAAqB,GAAG,MAAM,CAAC,IAAI;QACvC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC;QACjC,CAAC,CAAC,YAAY,CAAC;IAEjB,MAAM,cAAc,GAAG,MAAM,CAAC,iBAAiB;QAC7C,CAAC,CAAC,sCAAsC;QACxC,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,gBAAgB,GAAG,MAAM,CAAC,iBAAiB;QAC/C,CAAC,CAAC,2BAA2B;QAC7B,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,YAAY,GAAG,MAAM,CAAC,oBAAoB;QAC9C,CAAC,CAAC,cAAc,MAAM,CAAC,oBAAoB,sBAAsB,MAAM,CAAC,oBAAoB,OAAO;QACnG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;;;;MAMH,cAAc;;2BAEO,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC;;;;;;;;;;;;;;;;;QAiBjE,gBAAgB;;;;;QAKhB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFjB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAAsB;IAChD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAE7B,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,MAAM,UAAU,GAA2B,EAAE,CAAC;IAE9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,IAAI,YAAY,CAAC,EAAE,EAAE,CAAC;YAC3B,UAAU,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,GAAG,IAAI,YAAY,CAAC,EAAE,EAAE,CAAC;YAC3B,UAAU,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,UAAU;QACd,EAAE,EAAE,UAAU;KACQ,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB;IACvC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Shared components for the AutoCode dashboard
3
+ *
4
+ * This module re-exports all shared components for easy importing.
5
+ *
6
+ * Usage:
7
+ * ```typescript
8
+ * import {
9
+ * translations,
10
+ * generateI18nScript,
11
+ * generateHeader,
12
+ * generateLangSwitcher,
13
+ * } from '../shared/index.js';
14
+ * ```
15
+ */
16
+ export { translations, getTranslator, type Language, type TranslationKey, } from './translations.js';
17
+ export { generateI18nScript, generateMinimalI18nScript, type I18nScriptConfig, } from './i18n-script.js';
18
+ export { generateHeader, generateLangSwitcher, generateStatsHeader, generateChangelogHeader, type HeaderConfig, } from './header.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/shared/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,KAAK,QAAQ,EACb,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Shared components for the AutoCode dashboard
3
+ *
4
+ * This module re-exports all shared components for easy importing.
5
+ *
6
+ * Usage:
7
+ * ```typescript
8
+ * import {
9
+ * translations,
10
+ * generateI18nScript,
11
+ * generateHeader,
12
+ * generateLangSwitcher,
13
+ * } from '../shared/index.js';
14
+ * ```
15
+ */
16
+ // Translations
17
+ export { translations, getTranslator, } from './translations.js';
18
+ // i18n Script Generator
19
+ export { generateI18nScript, generateMinimalI18nScript, } from './i18n-script.js';
20
+ // Header Component
21
+ export { generateHeader, generateLangSwitcher, generateStatsHeader, generateChangelogHeader, } from './header.js';
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/dashboard/shared/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,eAAe;AACf,OAAO,EACL,YAAY,EACZ,aAAa,GAGd,MAAM,mBAAmB,CAAC;AAE3B,wBAAwB;AACxB,OAAO,EACL,kBAAkB,EAClB,yBAAyB,GAE1B,MAAM,kBAAkB,CAAC;AAE1B,mBAAmB;AACnB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,GAExB,MAAM,aAAa,CAAC"}