organify-ui 0.1.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/dist/chunk-7GFTSEVQ.js +77 -0
- package/dist/chunk-7GFTSEVQ.js.map +1 -0
- package/dist/chunk-FWI3KZVO.js +508 -0
- package/dist/chunk-FWI3KZVO.js.map +1 -0
- package/dist/chunk-WPZJKIZT.js +248 -0
- package/dist/chunk-WPZJKIZT.js.map +1 -0
- package/dist/chunk-YIVDY4T6.js +412 -0
- package/dist/chunk-YIVDY4T6.js.map +1 -0
- package/dist/i18n/index.d.ts +169 -0
- package/dist/i18n/index.js +3 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/icons/index.d.ts +84 -0
- package/dist/icons/index.js +3 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/index.d.ts +430 -0
- package/dist/index.js +1453 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/theme-provider.d.ts +25 -0
- package/dist/providers/theme-provider.js +3 -0
- package/dist/providers/theme-provider.js.map +1 -0
- package/dist/tailwind-preset.d.ts +16 -0
- package/dist/tailwind-preset.js +91 -0
- package/dist/tailwind-preset.js.map +1 -0
- package/dist/tokens/index.d.ts +336 -0
- package/dist/tokens/index.js +59 -0
- package/dist/tokens/index.js.map +1 -0
- package/package.json +96 -0
- package/src/globals.css +396 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/providers/theme-provider.tsx
|
|
5
|
+
var ThemeContext = React.createContext(void 0);
|
|
6
|
+
var STORAGE_KEY = "organify-theme";
|
|
7
|
+
function getSystemTheme() {
|
|
8
|
+
if (typeof window === "undefined") return "dark";
|
|
9
|
+
return window.matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark";
|
|
10
|
+
}
|
|
11
|
+
function resolveTheme(theme) {
|
|
12
|
+
return theme === "system" ? getSystemTheme() : theme;
|
|
13
|
+
}
|
|
14
|
+
function ThemeProvider({
|
|
15
|
+
children,
|
|
16
|
+
defaultTheme = "system",
|
|
17
|
+
forcedTheme,
|
|
18
|
+
storageKey = STORAGE_KEY,
|
|
19
|
+
attribute = "data-theme"
|
|
20
|
+
}) {
|
|
21
|
+
const [theme, setThemeState] = React.useState(() => {
|
|
22
|
+
if (forcedTheme) return forcedTheme;
|
|
23
|
+
if (typeof window === "undefined") return defaultTheme;
|
|
24
|
+
try {
|
|
25
|
+
const stored = localStorage.getItem(storageKey);
|
|
26
|
+
if (stored === "dark" || stored === "light" || stored === "system") return stored;
|
|
27
|
+
} catch {
|
|
28
|
+
}
|
|
29
|
+
return defaultTheme;
|
|
30
|
+
});
|
|
31
|
+
const [resolvedTheme, setResolvedTheme] = React.useState(
|
|
32
|
+
() => forcedTheme ?? resolveTheme(theme)
|
|
33
|
+
);
|
|
34
|
+
const setTheme = React.useCallback(
|
|
35
|
+
(newTheme) => {
|
|
36
|
+
if (forcedTheme) return;
|
|
37
|
+
setThemeState(newTheme);
|
|
38
|
+
try {
|
|
39
|
+
localStorage.setItem(storageKey, newTheme);
|
|
40
|
+
} catch {
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
[forcedTheme, storageKey]
|
|
44
|
+
);
|
|
45
|
+
React.useEffect(() => {
|
|
46
|
+
const resolved = forcedTheme ?? resolveTheme(theme);
|
|
47
|
+
setResolvedTheme(resolved);
|
|
48
|
+
const root = document.documentElement;
|
|
49
|
+
root.setAttribute(attribute, resolved);
|
|
50
|
+
root.style.colorScheme = resolved;
|
|
51
|
+
if (theme === "system" && !forcedTheme) {
|
|
52
|
+
const mq = window.matchMedia("(prefers-color-scheme: light)");
|
|
53
|
+
const handler = (e) => {
|
|
54
|
+
const r = e.matches ? "light" : "dark";
|
|
55
|
+
setResolvedTheme(r);
|
|
56
|
+
root.setAttribute(attribute, r);
|
|
57
|
+
root.style.colorScheme = r;
|
|
58
|
+
};
|
|
59
|
+
mq.addEventListener("change", handler);
|
|
60
|
+
return () => mq.removeEventListener("change", handler);
|
|
61
|
+
}
|
|
62
|
+
}, [theme, forcedTheme, attribute]);
|
|
63
|
+
const value = React.useMemo(
|
|
64
|
+
() => ({ theme, resolvedTheme, setTheme }),
|
|
65
|
+
[theme, resolvedTheme, setTheme]
|
|
66
|
+
);
|
|
67
|
+
return /* @__PURE__ */ jsx(ThemeContext.Provider, { value, children });
|
|
68
|
+
}
|
|
69
|
+
function useTheme() {
|
|
70
|
+
const ctx = React.useContext(ThemeContext);
|
|
71
|
+
if (!ctx) throw new Error("useTheme must be used within a <ThemeProvider>");
|
|
72
|
+
return ctx;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export { ThemeProvider, useTheme };
|
|
76
|
+
//# sourceMappingURL=chunk-7GFTSEVQ.js.map
|
|
77
|
+
//# sourceMappingURL=chunk-7GFTSEVQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/theme-provider.tsx"],"names":[],"mappings":"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","file":"chunk-7GFTSEVQ.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\n\nexport type Theme = 'dark' | 'light' | 'system';\ntype ResolvedTheme = 'dark' | 'light';\n\ninterface ThemeContextValue {\n theme: Theme;\n resolvedTheme: ResolvedTheme;\n setTheme: (theme: Theme) => void;\n}\n\nconst ThemeContext = React.createContext<ThemeContextValue | undefined>(undefined);\n\nconst STORAGE_KEY = 'organify-theme';\n\nfunction getSystemTheme(): ResolvedTheme {\n if (typeof window === 'undefined') return 'dark';\n return window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark';\n}\n\nfunction resolveTheme(theme: Theme): ResolvedTheme {\n return theme === 'system' ? getSystemTheme() : theme;\n}\n\nexport interface ThemeProviderProps {\n children: React.ReactNode;\n /** Default theme when no preference is stored */\n defaultTheme?: Theme;\n /** Force a specific theme (overrides user choice) */\n forcedTheme?: ResolvedTheme;\n /** Storage key for persistence */\n storageKey?: string;\n /** Apply to a specific element instead of <html> */\n attribute?: string;\n}\n\nfunction ThemeProvider({\n children,\n defaultTheme = 'system',\n forcedTheme,\n storageKey = STORAGE_KEY,\n attribute = 'data-theme',\n}: ThemeProviderProps) {\n const [theme, setThemeState] = React.useState<Theme>(() => {\n if (forcedTheme) return forcedTheme;\n if (typeof window === 'undefined') return defaultTheme;\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored === 'dark' || stored === 'light' || stored === 'system') return stored;\n } catch {}\n return defaultTheme;\n });\n\n const [resolvedTheme, setResolvedTheme] = React.useState<ResolvedTheme>(() =>\n forcedTheme ?? resolveTheme(theme),\n );\n\n const setTheme = React.useCallback(\n (newTheme: Theme) => {\n if (forcedTheme) return;\n setThemeState(newTheme);\n try {\n localStorage.setItem(storageKey, newTheme);\n } catch {}\n },\n [forcedTheme, storageKey],\n );\n\n // Apply data-theme attribute and listen for system changes\n React.useEffect(() => {\n const resolved = forcedTheme ?? resolveTheme(theme);\n setResolvedTheme(resolved);\n\n const root = document.documentElement;\n root.setAttribute(attribute, resolved);\n root.style.colorScheme = resolved;\n\n // Listen for system theme changes when in system mode\n if (theme === 'system' && !forcedTheme) {\n const mq = window.matchMedia('(prefers-color-scheme: light)');\n const handler = (e: MediaQueryListEvent) => {\n const r: ResolvedTheme = e.matches ? 'light' : 'dark';\n setResolvedTheme(r);\n root.setAttribute(attribute, r);\n root.style.colorScheme = r;\n };\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }\n }, [theme, forcedTheme, attribute]);\n\n const value = React.useMemo(\n () => ({ theme, resolvedTheme, setTheme }),\n [theme, resolvedTheme, setTheme],\n );\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nfunction useTheme(): ThemeContextValue {\n const ctx = React.useContext(ThemeContext);\n if (!ctx) throw new Error('useTheme must be used within a <ThemeProvider>');\n return ctx;\n}\n\nexport { ThemeProvider, useTheme };\n"]}
|
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/i18n/index.tsx
|
|
5
|
+
|
|
6
|
+
// src/i18n/locales/pt-BR.ts
|
|
7
|
+
var ptBR = {
|
|
8
|
+
common: {
|
|
9
|
+
loading: "Carregando\u2026",
|
|
10
|
+
save: "Salvar",
|
|
11
|
+
cancel: "Cancelar",
|
|
12
|
+
delete: "Excluir",
|
|
13
|
+
edit: "Editar",
|
|
14
|
+
create: "Criar",
|
|
15
|
+
search: "Pesquisar",
|
|
16
|
+
filter: "Filtrar",
|
|
17
|
+
sort: "Ordenar",
|
|
18
|
+
close: "Fechar",
|
|
19
|
+
confirm: "Confirmar",
|
|
20
|
+
back: "Voltar",
|
|
21
|
+
next: "Pr\xF3ximo",
|
|
22
|
+
previous: "Anterior",
|
|
23
|
+
yes: "Sim",
|
|
24
|
+
no: "N\xE3o",
|
|
25
|
+
or: "ou",
|
|
26
|
+
and: "e",
|
|
27
|
+
all: "Todos",
|
|
28
|
+
none: "Nenhum",
|
|
29
|
+
more: "Mais",
|
|
30
|
+
less: "Menos",
|
|
31
|
+
show: "Mostrar",
|
|
32
|
+
hide: "Ocultar",
|
|
33
|
+
copy: "Copiar",
|
|
34
|
+
copied: "Copiado!",
|
|
35
|
+
download: "Baixar",
|
|
36
|
+
upload: "Enviar",
|
|
37
|
+
retry: "Tentar novamente",
|
|
38
|
+
noResults: "Nenhum resultado encontrado",
|
|
39
|
+
required: "Obrigat\xF3rio",
|
|
40
|
+
optional: "Opcional"
|
|
41
|
+
},
|
|
42
|
+
auth: {
|
|
43
|
+
login: "Entrar",
|
|
44
|
+
logout: "Sair",
|
|
45
|
+
signUp: "Criar conta",
|
|
46
|
+
email: "E-mail",
|
|
47
|
+
password: "Senha",
|
|
48
|
+
forgotPassword: "Esqueceu a senha?",
|
|
49
|
+
resetPassword: "Redefinir senha",
|
|
50
|
+
welcomeBack: "Bem-vindo de volta",
|
|
51
|
+
createAccount: "Crie sua conta"
|
|
52
|
+
},
|
|
53
|
+
nav: {
|
|
54
|
+
home: "In\xEDcio",
|
|
55
|
+
dashboard: "Dashboard",
|
|
56
|
+
projects: "Projetos",
|
|
57
|
+
boards: "Quadros",
|
|
58
|
+
sprints: "Sprints",
|
|
59
|
+
calendar: "Calend\xE1rio",
|
|
60
|
+
reports: "Relat\xF3rios",
|
|
61
|
+
team: "Equipe",
|
|
62
|
+
settings: "Configura\xE7\xF5es",
|
|
63
|
+
notifications: "Notifica\xE7\xF5es",
|
|
64
|
+
integrations: "Integra\xE7\xF5es",
|
|
65
|
+
billing: "Faturamento",
|
|
66
|
+
profile: "Perfil"
|
|
67
|
+
},
|
|
68
|
+
theme: {
|
|
69
|
+
dark: "Escuro",
|
|
70
|
+
light: "Claro",
|
|
71
|
+
system: "Sistema",
|
|
72
|
+
label: "Tema"
|
|
73
|
+
},
|
|
74
|
+
locale: {
|
|
75
|
+
label: "Idioma",
|
|
76
|
+
ptBR: "Portugu\xEAs (Brasil)",
|
|
77
|
+
en: "English",
|
|
78
|
+
es: "Espa\xF1ol"
|
|
79
|
+
},
|
|
80
|
+
board: {
|
|
81
|
+
createBoard: "Criar quadro",
|
|
82
|
+
newColumn: "Nova coluna",
|
|
83
|
+
newTask: "Nova tarefa",
|
|
84
|
+
moveTask: "Mover tarefa",
|
|
85
|
+
archiveTask: "Arquivar tarefa",
|
|
86
|
+
emptyColumn: "Coluna vazia",
|
|
87
|
+
dragHint: "Arraste para reordenar"
|
|
88
|
+
},
|
|
89
|
+
sprint: {
|
|
90
|
+
createSprint: "Criar sprint",
|
|
91
|
+
startSprint: "Iniciar sprint",
|
|
92
|
+
completeSprint: "Finalizar sprint",
|
|
93
|
+
sprintGoal: "Objetivo do sprint",
|
|
94
|
+
velocity: "Velocidade",
|
|
95
|
+
burndown: "Burndown",
|
|
96
|
+
remaining: "Restante",
|
|
97
|
+
completed: "Conclu\xEDdo",
|
|
98
|
+
inProgress: "Em progresso"
|
|
99
|
+
},
|
|
100
|
+
report: {
|
|
101
|
+
generate: "Gerar relat\xF3rio",
|
|
102
|
+
export: "Exportar",
|
|
103
|
+
dateRange: "Per\xEDodo",
|
|
104
|
+
performance: "Desempenho",
|
|
105
|
+
productivity: "Produtividade",
|
|
106
|
+
overview: "Vis\xE3o geral"
|
|
107
|
+
},
|
|
108
|
+
feedback: {
|
|
109
|
+
success: "Sucesso",
|
|
110
|
+
error: "Erro",
|
|
111
|
+
warning: "Aten\xE7\xE3o",
|
|
112
|
+
info: "Informa\xE7\xE3o",
|
|
113
|
+
taskCreated: "Tarefa criada com sucesso",
|
|
114
|
+
taskUpdated: "Tarefa atualizada",
|
|
115
|
+
taskDeleted: "Tarefa exclu\xEDda",
|
|
116
|
+
savedSuccessfully: "Salvo com sucesso",
|
|
117
|
+
errorOccurred: "Ocorreu um erro",
|
|
118
|
+
tryAgain: "Tente novamente",
|
|
119
|
+
connectionLost: "Conex\xE3o perdida",
|
|
120
|
+
reconnecting: "Reconectando\u2026"
|
|
121
|
+
},
|
|
122
|
+
empty: {
|
|
123
|
+
noTasks: "Nenhuma tarefa encontrada",
|
|
124
|
+
noTeamMembers: "Nenhum membro na equipe",
|
|
125
|
+
noProjects: "Nenhum projeto ainda",
|
|
126
|
+
noNotifications: "Sem notifica\xE7\xF5es",
|
|
127
|
+
noReports: "Nenhum relat\xF3rio gerado",
|
|
128
|
+
getStarted: "Comece agora",
|
|
129
|
+
createFirst: "Crie seu primeiro"
|
|
130
|
+
},
|
|
131
|
+
time: {
|
|
132
|
+
today: "Hoje",
|
|
133
|
+
yesterday: "Ontem",
|
|
134
|
+
tomorrow: "Amanh\xE3",
|
|
135
|
+
thisWeek: "Esta semana",
|
|
136
|
+
lastWeek: "Semana passada",
|
|
137
|
+
thisMonth: "Este m\xEAs",
|
|
138
|
+
dueDate: "Data de entrega",
|
|
139
|
+
overdue: "Atrasado",
|
|
140
|
+
dueToday: "Vence hoje",
|
|
141
|
+
dueSoon: "Vence em breve"
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
// src/i18n/locales/en.ts
|
|
146
|
+
var en = {
|
|
147
|
+
common: {
|
|
148
|
+
loading: "Loading\u2026",
|
|
149
|
+
save: "Save",
|
|
150
|
+
cancel: "Cancel",
|
|
151
|
+
delete: "Delete",
|
|
152
|
+
edit: "Edit",
|
|
153
|
+
create: "Create",
|
|
154
|
+
search: "Search",
|
|
155
|
+
filter: "Filter",
|
|
156
|
+
sort: "Sort",
|
|
157
|
+
close: "Close",
|
|
158
|
+
confirm: "Confirm",
|
|
159
|
+
back: "Back",
|
|
160
|
+
next: "Next",
|
|
161
|
+
previous: "Previous",
|
|
162
|
+
yes: "Yes",
|
|
163
|
+
no: "No",
|
|
164
|
+
or: "or",
|
|
165
|
+
and: "and",
|
|
166
|
+
all: "All",
|
|
167
|
+
none: "None",
|
|
168
|
+
more: "More",
|
|
169
|
+
less: "Less",
|
|
170
|
+
show: "Show",
|
|
171
|
+
hide: "Hide",
|
|
172
|
+
copy: "Copy",
|
|
173
|
+
copied: "Copied!",
|
|
174
|
+
download: "Download",
|
|
175
|
+
upload: "Upload",
|
|
176
|
+
retry: "Retry",
|
|
177
|
+
noResults: "No results found",
|
|
178
|
+
required: "Required",
|
|
179
|
+
optional: "Optional"
|
|
180
|
+
},
|
|
181
|
+
auth: {
|
|
182
|
+
login: "Sign in",
|
|
183
|
+
logout: "Sign out",
|
|
184
|
+
signUp: "Sign up",
|
|
185
|
+
email: "Email",
|
|
186
|
+
password: "Password",
|
|
187
|
+
forgotPassword: "Forgot password?",
|
|
188
|
+
resetPassword: "Reset password",
|
|
189
|
+
welcomeBack: "Welcome back",
|
|
190
|
+
createAccount: "Create your account"
|
|
191
|
+
},
|
|
192
|
+
nav: {
|
|
193
|
+
home: "Home",
|
|
194
|
+
dashboard: "Dashboard",
|
|
195
|
+
projects: "Projects",
|
|
196
|
+
boards: "Boards",
|
|
197
|
+
sprints: "Sprints",
|
|
198
|
+
calendar: "Calendar",
|
|
199
|
+
reports: "Reports",
|
|
200
|
+
team: "Team",
|
|
201
|
+
settings: "Settings",
|
|
202
|
+
notifications: "Notifications",
|
|
203
|
+
integrations: "Integrations",
|
|
204
|
+
billing: "Billing",
|
|
205
|
+
profile: "Profile"
|
|
206
|
+
},
|
|
207
|
+
theme: {
|
|
208
|
+
dark: "Dark",
|
|
209
|
+
light: "Light",
|
|
210
|
+
system: "System",
|
|
211
|
+
label: "Theme"
|
|
212
|
+
},
|
|
213
|
+
locale: {
|
|
214
|
+
label: "Language",
|
|
215
|
+
ptBR: "Portugu\xEAs (Brasil)",
|
|
216
|
+
en: "English",
|
|
217
|
+
es: "Espa\xF1ol"
|
|
218
|
+
},
|
|
219
|
+
board: {
|
|
220
|
+
createBoard: "Create board",
|
|
221
|
+
newColumn: "New column",
|
|
222
|
+
newTask: "New task",
|
|
223
|
+
moveTask: "Move task",
|
|
224
|
+
archiveTask: "Archive task",
|
|
225
|
+
emptyColumn: "Empty column",
|
|
226
|
+
dragHint: "Drag to reorder"
|
|
227
|
+
},
|
|
228
|
+
sprint: {
|
|
229
|
+
createSprint: "Create sprint",
|
|
230
|
+
startSprint: "Start sprint",
|
|
231
|
+
completeSprint: "Complete sprint",
|
|
232
|
+
sprintGoal: "Sprint goal",
|
|
233
|
+
velocity: "Velocity",
|
|
234
|
+
burndown: "Burndown",
|
|
235
|
+
remaining: "Remaining",
|
|
236
|
+
completed: "Completed",
|
|
237
|
+
inProgress: "In progress"
|
|
238
|
+
},
|
|
239
|
+
report: {
|
|
240
|
+
generate: "Generate report",
|
|
241
|
+
export: "Export",
|
|
242
|
+
dateRange: "Date range",
|
|
243
|
+
performance: "Performance",
|
|
244
|
+
productivity: "Productivity",
|
|
245
|
+
overview: "Overview"
|
|
246
|
+
},
|
|
247
|
+
feedback: {
|
|
248
|
+
success: "Success",
|
|
249
|
+
error: "Error",
|
|
250
|
+
warning: "Warning",
|
|
251
|
+
info: "Information",
|
|
252
|
+
taskCreated: "Task created successfully",
|
|
253
|
+
taskUpdated: "Task updated",
|
|
254
|
+
taskDeleted: "Task deleted",
|
|
255
|
+
savedSuccessfully: "Saved successfully",
|
|
256
|
+
errorOccurred: "An error occurred",
|
|
257
|
+
tryAgain: "Try again",
|
|
258
|
+
connectionLost: "Connection lost",
|
|
259
|
+
reconnecting: "Reconnecting\u2026"
|
|
260
|
+
},
|
|
261
|
+
empty: {
|
|
262
|
+
noTasks: "No tasks found",
|
|
263
|
+
noTeamMembers: "No team members",
|
|
264
|
+
noProjects: "No projects yet",
|
|
265
|
+
noNotifications: "No notifications",
|
|
266
|
+
noReports: "No reports generated",
|
|
267
|
+
getStarted: "Get started",
|
|
268
|
+
createFirst: "Create your first"
|
|
269
|
+
},
|
|
270
|
+
time: {
|
|
271
|
+
today: "Today",
|
|
272
|
+
yesterday: "Yesterday",
|
|
273
|
+
tomorrow: "Tomorrow",
|
|
274
|
+
thisWeek: "This week",
|
|
275
|
+
lastWeek: "Last week",
|
|
276
|
+
thisMonth: "This month",
|
|
277
|
+
dueDate: "Due date",
|
|
278
|
+
overdue: "Overdue",
|
|
279
|
+
dueToday: "Due today",
|
|
280
|
+
dueSoon: "Due soon"
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
// src/i18n/locales/es.ts
|
|
285
|
+
var es = {
|
|
286
|
+
common: {
|
|
287
|
+
loading: "Cargando\u2026",
|
|
288
|
+
save: "Guardar",
|
|
289
|
+
cancel: "Cancelar",
|
|
290
|
+
delete: "Eliminar",
|
|
291
|
+
edit: "Editar",
|
|
292
|
+
create: "Crear",
|
|
293
|
+
search: "Buscar",
|
|
294
|
+
filter: "Filtrar",
|
|
295
|
+
sort: "Ordenar",
|
|
296
|
+
close: "Cerrar",
|
|
297
|
+
confirm: "Confirmar",
|
|
298
|
+
back: "Volver",
|
|
299
|
+
next: "Siguiente",
|
|
300
|
+
previous: "Anterior",
|
|
301
|
+
yes: "S\xED",
|
|
302
|
+
no: "No",
|
|
303
|
+
or: "o",
|
|
304
|
+
and: "y",
|
|
305
|
+
all: "Todos",
|
|
306
|
+
none: "Ninguno",
|
|
307
|
+
more: "M\xE1s",
|
|
308
|
+
less: "Menos",
|
|
309
|
+
show: "Mostrar",
|
|
310
|
+
hide: "Ocultar",
|
|
311
|
+
copy: "Copiar",
|
|
312
|
+
copied: "\xA1Copiado!",
|
|
313
|
+
download: "Descargar",
|
|
314
|
+
upload: "Subir",
|
|
315
|
+
retry: "Reintentar",
|
|
316
|
+
noResults: "No se encontraron resultados",
|
|
317
|
+
required: "Obligatorio",
|
|
318
|
+
optional: "Opcional"
|
|
319
|
+
},
|
|
320
|
+
auth: {
|
|
321
|
+
login: "Iniciar sesi\xF3n",
|
|
322
|
+
logout: "Cerrar sesi\xF3n",
|
|
323
|
+
signUp: "Registrarse",
|
|
324
|
+
email: "Correo electr\xF3nico",
|
|
325
|
+
password: "Contrase\xF1a",
|
|
326
|
+
forgotPassword: "\xBFOlvidaste tu contrase\xF1a?",
|
|
327
|
+
resetPassword: "Restablecer contrase\xF1a",
|
|
328
|
+
welcomeBack: "Bienvenido de vuelta",
|
|
329
|
+
createAccount: "Crea tu cuenta"
|
|
330
|
+
},
|
|
331
|
+
nav: {
|
|
332
|
+
home: "Inicio",
|
|
333
|
+
dashboard: "Dashboard",
|
|
334
|
+
projects: "Proyectos",
|
|
335
|
+
boards: "Tableros",
|
|
336
|
+
sprints: "Sprints",
|
|
337
|
+
calendar: "Calendario",
|
|
338
|
+
reports: "Informes",
|
|
339
|
+
team: "Equipo",
|
|
340
|
+
settings: "Configuraci\xF3n",
|
|
341
|
+
notifications: "Notificaciones",
|
|
342
|
+
integrations: "Integraciones",
|
|
343
|
+
billing: "Facturaci\xF3n",
|
|
344
|
+
profile: "Perfil"
|
|
345
|
+
},
|
|
346
|
+
theme: {
|
|
347
|
+
dark: "Oscuro",
|
|
348
|
+
light: "Claro",
|
|
349
|
+
system: "Sistema",
|
|
350
|
+
label: "Tema"
|
|
351
|
+
},
|
|
352
|
+
locale: {
|
|
353
|
+
label: "Idioma",
|
|
354
|
+
ptBR: "Portugu\xEAs (Brasil)",
|
|
355
|
+
en: "English",
|
|
356
|
+
es: "Espa\xF1ol"
|
|
357
|
+
},
|
|
358
|
+
board: {
|
|
359
|
+
createBoard: "Crear tablero",
|
|
360
|
+
newColumn: "Nueva columna",
|
|
361
|
+
newTask: "Nueva tarea",
|
|
362
|
+
moveTask: "Mover tarea",
|
|
363
|
+
archiveTask: "Archivar tarea",
|
|
364
|
+
emptyColumn: "Columna vac\xEDa",
|
|
365
|
+
dragHint: "Arrastra para reordenar"
|
|
366
|
+
},
|
|
367
|
+
sprint: {
|
|
368
|
+
createSprint: "Crear sprint",
|
|
369
|
+
startSprint: "Iniciar sprint",
|
|
370
|
+
completeSprint: "Completar sprint",
|
|
371
|
+
sprintGoal: "Objetivo del sprint",
|
|
372
|
+
velocity: "Velocidad",
|
|
373
|
+
burndown: "Burndown",
|
|
374
|
+
remaining: "Pendiente",
|
|
375
|
+
completed: "Completado",
|
|
376
|
+
inProgress: "En progreso"
|
|
377
|
+
},
|
|
378
|
+
report: {
|
|
379
|
+
generate: "Generar informe",
|
|
380
|
+
export: "Exportar",
|
|
381
|
+
dateRange: "Rango de fechas",
|
|
382
|
+
performance: "Rendimiento",
|
|
383
|
+
productivity: "Productividad",
|
|
384
|
+
overview: "Resumen"
|
|
385
|
+
},
|
|
386
|
+
feedback: {
|
|
387
|
+
success: "\xC9xito",
|
|
388
|
+
error: "Error",
|
|
389
|
+
warning: "Advertencia",
|
|
390
|
+
info: "Informaci\xF3n",
|
|
391
|
+
taskCreated: "Tarea creada exitosamente",
|
|
392
|
+
taskUpdated: "Tarea actualizada",
|
|
393
|
+
taskDeleted: "Tarea eliminada",
|
|
394
|
+
savedSuccessfully: "Guardado exitosamente",
|
|
395
|
+
errorOccurred: "Ocurri\xF3 un error",
|
|
396
|
+
tryAgain: "Int\xE9ntalo de nuevo",
|
|
397
|
+
connectionLost: "Conexi\xF3n perdida",
|
|
398
|
+
reconnecting: "Reconectando\u2026"
|
|
399
|
+
},
|
|
400
|
+
empty: {
|
|
401
|
+
noTasks: "No se encontraron tareas",
|
|
402
|
+
noTeamMembers: "Sin miembros del equipo",
|
|
403
|
+
noProjects: "Sin proyectos a\xFAn",
|
|
404
|
+
noNotifications: "Sin notificaciones",
|
|
405
|
+
noReports: "Sin informes generados",
|
|
406
|
+
getStarted: "Comienza ahora",
|
|
407
|
+
createFirst: "Crea tu primer"
|
|
408
|
+
},
|
|
409
|
+
time: {
|
|
410
|
+
today: "Hoy",
|
|
411
|
+
yesterday: "Ayer",
|
|
412
|
+
tomorrow: "Ma\xF1ana",
|
|
413
|
+
thisWeek: "Esta semana",
|
|
414
|
+
lastWeek: "Semana pasada",
|
|
415
|
+
thisMonth: "Este mes",
|
|
416
|
+
dueDate: "Fecha de entrega",
|
|
417
|
+
overdue: "Atrasado",
|
|
418
|
+
dueToday: "Vence hoy",
|
|
419
|
+
dueSoon: "Vence pronto"
|
|
420
|
+
}
|
|
421
|
+
};
|
|
422
|
+
var dictionaries = {
|
|
423
|
+
"pt-BR": ptBR,
|
|
424
|
+
en,
|
|
425
|
+
es
|
|
426
|
+
};
|
|
427
|
+
var I18nContext = React.createContext(void 0);
|
|
428
|
+
var STORAGE_KEY = "organify-locale";
|
|
429
|
+
function getNestedValue(obj, path) {
|
|
430
|
+
const keys = path.split(".");
|
|
431
|
+
let current = obj;
|
|
432
|
+
for (const key of keys) {
|
|
433
|
+
if (current == null || typeof current !== "object") return path;
|
|
434
|
+
current = current[key];
|
|
435
|
+
}
|
|
436
|
+
return typeof current === "string" ? current : path;
|
|
437
|
+
}
|
|
438
|
+
function interpolate(template, params) {
|
|
439
|
+
if (!params) return template;
|
|
440
|
+
return template.replace(
|
|
441
|
+
/\{\{(\w+)\}\}/g,
|
|
442
|
+
(_, key) => params[key] !== void 0 ? String(params[key]) : `{{${key}}}`
|
|
443
|
+
);
|
|
444
|
+
}
|
|
445
|
+
function I18nProvider({
|
|
446
|
+
children,
|
|
447
|
+
defaultLocale = "pt-BR",
|
|
448
|
+
forcedLocale
|
|
449
|
+
}) {
|
|
450
|
+
const [locale, setLocaleState] = React.useState(() => {
|
|
451
|
+
if (forcedLocale) return forcedLocale;
|
|
452
|
+
if (typeof window === "undefined") return defaultLocale;
|
|
453
|
+
try {
|
|
454
|
+
const stored = localStorage.getItem(STORAGE_KEY);
|
|
455
|
+
if (stored === "pt-BR" || stored === "en" || stored === "es") return stored;
|
|
456
|
+
} catch {
|
|
457
|
+
}
|
|
458
|
+
return defaultLocale;
|
|
459
|
+
});
|
|
460
|
+
React.useEffect(() => {
|
|
461
|
+
if (forcedLocale) setLocaleState(forcedLocale);
|
|
462
|
+
}, [forcedLocale]);
|
|
463
|
+
const setLocale = React.useCallback(
|
|
464
|
+
(newLocale) => {
|
|
465
|
+
if (forcedLocale) return;
|
|
466
|
+
setLocaleState(newLocale);
|
|
467
|
+
try {
|
|
468
|
+
localStorage.setItem(STORAGE_KEY, newLocale);
|
|
469
|
+
} catch {
|
|
470
|
+
}
|
|
471
|
+
if (typeof document !== "undefined") {
|
|
472
|
+
document.documentElement.lang = newLocale;
|
|
473
|
+
}
|
|
474
|
+
},
|
|
475
|
+
[forcedLocale]
|
|
476
|
+
);
|
|
477
|
+
React.useEffect(() => {
|
|
478
|
+
if (typeof document !== "undefined") {
|
|
479
|
+
document.documentElement.lang = locale;
|
|
480
|
+
}
|
|
481
|
+
}, [locale]);
|
|
482
|
+
const t = React.useCallback(
|
|
483
|
+
(key, params) => {
|
|
484
|
+
const dict = dictionaries[locale] ?? dictionaries["pt-BR"];
|
|
485
|
+
const value2 = getNestedValue(dict, key);
|
|
486
|
+
return interpolate(value2, params);
|
|
487
|
+
},
|
|
488
|
+
[locale]
|
|
489
|
+
);
|
|
490
|
+
const value = React.useMemo(() => ({ locale, setLocale, t }), [locale, setLocale, t]);
|
|
491
|
+
return /* @__PURE__ */ jsx(I18nContext.Provider, { value, children });
|
|
492
|
+
}
|
|
493
|
+
function useI18n() {
|
|
494
|
+
const ctx = React.useContext(I18nContext);
|
|
495
|
+
if (!ctx) throw new Error("useI18n must be used within an <I18nProvider>");
|
|
496
|
+
return ctx;
|
|
497
|
+
}
|
|
498
|
+
function createTranslator(locale = "pt-BR") {
|
|
499
|
+
const dict = dictionaries[locale] ?? dictionaries["pt-BR"];
|
|
500
|
+
return (key, params) => {
|
|
501
|
+
const value = getNestedValue(dict, key);
|
|
502
|
+
return interpolate(value, params);
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
export { I18nProvider, createTranslator, dictionaries, useI18n };
|
|
507
|
+
//# sourceMappingURL=chunk-FWI3KZVO.js.map
|
|
508
|
+
//# sourceMappingURL=chunk-FWI3KZVO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/i18n/locales/pt-BR.ts","../src/i18n/locales/en.ts","../src/i18n/locales/es.ts","../src/i18n/index.tsx"],"names":["value"],"mappings":"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","file":"chunk-FWI3KZVO.js","sourcesContent":["// ─────────────────────────────────────────────\n// @organify/ui — i18n Translations (pt-BR)\n// ─────────────────────────────────────────────\n\nexport const ptBR = {\n common: {\n loading: 'Carregando…',\n save: 'Salvar',\n cancel: 'Cancelar',\n delete: 'Excluir',\n edit: 'Editar',\n create: 'Criar',\n search: 'Pesquisar',\n filter: 'Filtrar',\n sort: 'Ordenar',\n close: 'Fechar',\n confirm: 'Confirmar',\n back: 'Voltar',\n next: 'Próximo',\n previous: 'Anterior',\n yes: 'Sim',\n no: 'Não',\n or: 'ou',\n and: 'e',\n all: 'Todos',\n none: 'Nenhum',\n more: 'Mais',\n less: 'Menos',\n show: 'Mostrar',\n hide: 'Ocultar',\n copy: 'Copiar',\n copied: 'Copiado!',\n download: 'Baixar',\n upload: 'Enviar',\n retry: 'Tentar novamente',\n noResults: 'Nenhum resultado encontrado',\n required: 'Obrigatório',\n optional: 'Opcional',\n },\n auth: {\n login: 'Entrar',\n logout: 'Sair',\n signUp: 'Criar conta',\n email: 'E-mail',\n password: 'Senha',\n forgotPassword: 'Esqueceu a senha?',\n resetPassword: 'Redefinir senha',\n welcomeBack: 'Bem-vindo de volta',\n createAccount: 'Crie sua conta',\n },\n nav: {\n home: 'Início',\n dashboard: 'Dashboard',\n projects: 'Projetos',\n boards: 'Quadros',\n sprints: 'Sprints',\n calendar: 'Calendário',\n reports: 'Relatórios',\n team: 'Equipe',\n settings: 'Configurações',\n notifications: 'Notificações',\n integrations: 'Integrações',\n billing: 'Faturamento',\n profile: 'Perfil',\n },\n theme: {\n dark: 'Escuro',\n light: 'Claro',\n system: 'Sistema',\n label: 'Tema',\n },\n locale: {\n label: 'Idioma',\n ptBR: 'Português (Brasil)',\n en: 'English',\n es: 'Español',\n },\n board: {\n createBoard: 'Criar quadro',\n newColumn: 'Nova coluna',\n newTask: 'Nova tarefa',\n moveTask: 'Mover tarefa',\n archiveTask: 'Arquivar tarefa',\n emptyColumn: 'Coluna vazia',\n dragHint: 'Arraste para reordenar',\n },\n sprint: {\n createSprint: 'Criar sprint',\n startSprint: 'Iniciar sprint',\n completeSprint: 'Finalizar sprint',\n sprintGoal: 'Objetivo do sprint',\n velocity: 'Velocidade',\n burndown: 'Burndown',\n remaining: 'Restante',\n completed: 'Concluído',\n inProgress: 'Em progresso',\n },\n report: {\n generate: 'Gerar relatório',\n export: 'Exportar',\n dateRange: 'Período',\n performance: 'Desempenho',\n productivity: 'Produtividade',\n overview: 'Visão geral',\n },\n feedback: {\n success: 'Sucesso',\n error: 'Erro',\n warning: 'Atenção',\n info: 'Informação',\n taskCreated: 'Tarefa criada com sucesso',\n taskUpdated: 'Tarefa atualizada',\n taskDeleted: 'Tarefa excluída',\n savedSuccessfully: 'Salvo com sucesso',\n errorOccurred: 'Ocorreu um erro',\n tryAgain: 'Tente novamente',\n connectionLost: 'Conexão perdida',\n reconnecting: 'Reconectando…',\n },\n empty: {\n noTasks: 'Nenhuma tarefa encontrada',\n noTeamMembers: 'Nenhum membro na equipe',\n noProjects: 'Nenhum projeto ainda',\n noNotifications: 'Sem notificações',\n noReports: 'Nenhum relatório gerado',\n getStarted: 'Comece agora',\n createFirst: 'Crie seu primeiro',\n },\n time: {\n today: 'Hoje',\n yesterday: 'Ontem',\n tomorrow: 'Amanhã',\n thisWeek: 'Esta semana',\n lastWeek: 'Semana passada',\n thisMonth: 'Este mês',\n dueDate: 'Data de entrega',\n overdue: 'Atrasado',\n dueToday: 'Vence hoje',\n dueSoon: 'Vence em breve',\n },\n} as const;\n\nexport type TranslationKeys = typeof ptBR;\n","// ─────────────────────────────────────────────\n// @organify/ui — i18n Translations (en)\n// ─────────────────────────────────────────────\n\nimport type { TranslationKeys } from './pt-BR';\n\nexport const en: TranslationKeys = {\n common: {\n loading: 'Loading…',\n save: 'Save',\n cancel: 'Cancel',\n delete: 'Delete',\n edit: 'Edit',\n create: 'Create',\n search: 'Search',\n filter: 'Filter',\n sort: 'Sort',\n close: 'Close',\n confirm: 'Confirm',\n back: 'Back',\n next: 'Next',\n previous: 'Previous',\n yes: 'Yes',\n no: 'No',\n or: 'or',\n and: 'and',\n all: 'All',\n none: 'None',\n more: 'More',\n less: 'Less',\n show: 'Show',\n hide: 'Hide',\n copy: 'Copy',\n copied: 'Copied!',\n download: 'Download',\n upload: 'Upload',\n retry: 'Retry',\n noResults: 'No results found',\n required: 'Required',\n optional: 'Optional',\n },\n auth: {\n login: 'Sign in',\n logout: 'Sign out',\n signUp: 'Sign up',\n email: 'Email',\n password: 'Password',\n forgotPassword: 'Forgot password?',\n resetPassword: 'Reset password',\n welcomeBack: 'Welcome back',\n createAccount: 'Create your account',\n },\n nav: {\n home: 'Home',\n dashboard: 'Dashboard',\n projects: 'Projects',\n boards: 'Boards',\n sprints: 'Sprints',\n calendar: 'Calendar',\n reports: 'Reports',\n team: 'Team',\n settings: 'Settings',\n notifications: 'Notifications',\n integrations: 'Integrations',\n billing: 'Billing',\n profile: 'Profile',\n },\n theme: {\n dark: 'Dark',\n light: 'Light',\n system: 'System',\n label: 'Theme',\n },\n locale: {\n label: 'Language',\n ptBR: 'Português (Brasil)',\n en: 'English',\n es: 'Español',\n },\n board: {\n createBoard: 'Create board',\n newColumn: 'New column',\n newTask: 'New task',\n moveTask: 'Move task',\n archiveTask: 'Archive task',\n emptyColumn: 'Empty column',\n dragHint: 'Drag to reorder',\n },\n sprint: {\n createSprint: 'Create sprint',\n startSprint: 'Start sprint',\n completeSprint: 'Complete sprint',\n sprintGoal: 'Sprint goal',\n velocity: 'Velocity',\n burndown: 'Burndown',\n remaining: 'Remaining',\n completed: 'Completed',\n inProgress: 'In progress',\n },\n report: {\n generate: 'Generate report',\n export: 'Export',\n dateRange: 'Date range',\n performance: 'Performance',\n productivity: 'Productivity',\n overview: 'Overview',\n },\n feedback: {\n success: 'Success',\n error: 'Error',\n warning: 'Warning',\n info: 'Information',\n taskCreated: 'Task created successfully',\n taskUpdated: 'Task updated',\n taskDeleted: 'Task deleted',\n savedSuccessfully: 'Saved successfully',\n errorOccurred: 'An error occurred',\n tryAgain: 'Try again',\n connectionLost: 'Connection lost',\n reconnecting: 'Reconnecting…',\n },\n empty: {\n noTasks: 'No tasks found',\n noTeamMembers: 'No team members',\n noProjects: 'No projects yet',\n noNotifications: 'No notifications',\n noReports: 'No reports generated',\n getStarted: 'Get started',\n createFirst: 'Create your first',\n },\n time: {\n today: 'Today',\n yesterday: 'Yesterday',\n tomorrow: 'Tomorrow',\n thisWeek: 'This week',\n lastWeek: 'Last week',\n thisMonth: 'This month',\n dueDate: 'Due date',\n overdue: 'Overdue',\n dueToday: 'Due today',\n dueSoon: 'Due soon',\n },\n} as const;\n","// ─────────────────────────────────────────────\n// @organify/ui — i18n Translations (es)\n// ─────────────────────────────────────────────\n\nimport type { TranslationKeys } from './pt-BR';\n\nexport const es: TranslationKeys = {\n common: {\n loading: 'Cargando…',\n save: 'Guardar',\n cancel: 'Cancelar',\n delete: 'Eliminar',\n edit: 'Editar',\n create: 'Crear',\n search: 'Buscar',\n filter: 'Filtrar',\n sort: 'Ordenar',\n close: 'Cerrar',\n confirm: 'Confirmar',\n back: 'Volver',\n next: 'Siguiente',\n previous: 'Anterior',\n yes: 'Sí',\n no: 'No',\n or: 'o',\n and: 'y',\n all: 'Todos',\n none: 'Ninguno',\n more: 'Más',\n less: 'Menos',\n show: 'Mostrar',\n hide: 'Ocultar',\n copy: 'Copiar',\n copied: '¡Copiado!',\n download: 'Descargar',\n upload: 'Subir',\n retry: 'Reintentar',\n noResults: 'No se encontraron resultados',\n required: 'Obligatorio',\n optional: 'Opcional',\n },\n auth: {\n login: 'Iniciar sesión',\n logout: 'Cerrar sesión',\n signUp: 'Registrarse',\n email: 'Correo electrónico',\n password: 'Contraseña',\n forgotPassword: '¿Olvidaste tu contraseña?',\n resetPassword: 'Restablecer contraseña',\n welcomeBack: 'Bienvenido de vuelta',\n createAccount: 'Crea tu cuenta',\n },\n nav: {\n home: 'Inicio',\n dashboard: 'Dashboard',\n projects: 'Proyectos',\n boards: 'Tableros',\n sprints: 'Sprints',\n calendar: 'Calendario',\n reports: 'Informes',\n team: 'Equipo',\n settings: 'Configuración',\n notifications: 'Notificaciones',\n integrations: 'Integraciones',\n billing: 'Facturación',\n profile: 'Perfil',\n },\n theme: {\n dark: 'Oscuro',\n light: 'Claro',\n system: 'Sistema',\n label: 'Tema',\n },\n locale: {\n label: 'Idioma',\n ptBR: 'Português (Brasil)',\n en: 'English',\n es: 'Español',\n },\n board: {\n createBoard: 'Crear tablero',\n newColumn: 'Nueva columna',\n newTask: 'Nueva tarea',\n moveTask: 'Mover tarea',\n archiveTask: 'Archivar tarea',\n emptyColumn: 'Columna vacía',\n dragHint: 'Arrastra para reordenar',\n },\n sprint: {\n createSprint: 'Crear sprint',\n startSprint: 'Iniciar sprint',\n completeSprint: 'Completar sprint',\n sprintGoal: 'Objetivo del sprint',\n velocity: 'Velocidad',\n burndown: 'Burndown',\n remaining: 'Pendiente',\n completed: 'Completado',\n inProgress: 'En progreso',\n },\n report: {\n generate: 'Generar informe',\n export: 'Exportar',\n dateRange: 'Rango de fechas',\n performance: 'Rendimiento',\n productivity: 'Productividad',\n overview: 'Resumen',\n },\n feedback: {\n success: 'Éxito',\n error: 'Error',\n warning: 'Advertencia',\n info: 'Información',\n taskCreated: 'Tarea creada exitosamente',\n taskUpdated: 'Tarea actualizada',\n taskDeleted: 'Tarea eliminada',\n savedSuccessfully: 'Guardado exitosamente',\n errorOccurred: 'Ocurrió un error',\n tryAgain: 'Inténtalo de nuevo',\n connectionLost: 'Conexión perdida',\n reconnecting: 'Reconectando…',\n },\n empty: {\n noTasks: 'No se encontraron tareas',\n noTeamMembers: 'Sin miembros del equipo',\n noProjects: 'Sin proyectos aún',\n noNotifications: 'Sin notificaciones',\n noReports: 'Sin informes generados',\n getStarted: 'Comienza ahora',\n createFirst: 'Crea tu primer',\n },\n time: {\n today: 'Hoy',\n yesterday: 'Ayer',\n tomorrow: 'Mañana',\n thisWeek: 'Esta semana',\n lastWeek: 'Semana pasada',\n thisMonth: 'Este mes',\n dueDate: 'Fecha de entrega',\n overdue: 'Atrasado',\n dueToday: 'Vence hoy',\n dueSoon: 'Vence pronto',\n },\n} as const;\n","'use client';\n\nimport * as React from 'react';\nimport { ptBR, type TranslationKeys } from './locales/pt-BR';\nimport { en } from './locales/en';\nimport { es } from './locales/es';\n\n// ─── Types ───────────────────────────────────────────────\nexport type Locale = 'pt-BR' | 'en' | 'es';\n\n/** Flatten nested object keys into dot-path union */\ntype FlattenKeys<T, Prefix extends string = ''> = {\n [K in keyof T]: T[K] extends Record<string, unknown>\n ? FlattenKeys<T[K], `${Prefix}${K & string}.`>\n : `${Prefix}${K & string}`;\n}[keyof T];\n\nexport type TranslationKey = FlattenKeys<TranslationKeys>;\n\n// ─── Dictionary map ──────────────────────────────────────\nconst dictionaries: Record<Locale, TranslationKeys> = {\n 'pt-BR': ptBR,\n en,\n es,\n};\n\n// ─── Context ─────────────────────────────────────────────\ninterface I18nContextValue {\n locale: Locale;\n setLocale: (locale: Locale) => void;\n t: (key: TranslationKey, params?: Record<string, string | number>) => string;\n}\n\nconst I18nContext = React.createContext<I18nContextValue | undefined>(undefined);\n\nconst STORAGE_KEY = 'organify-locale';\n\n// ─── Helper ──────────────────────────────────────────────\nfunction getNestedValue(obj: Record<string, unknown>, path: string): string {\n const keys = path.split('.');\n let current: unknown = obj;\n for (const key of keys) {\n if (current == null || typeof current !== 'object') return path;\n current = (current as Record<string, unknown>)[key];\n }\n return typeof current === 'string' ? current : path;\n}\n\nfunction interpolate(template: string, params?: Record<string, string | number>): string {\n if (!params) return template;\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) =>\n params[key] !== undefined ? String(params[key]) : `{{${key}}}`,\n );\n}\n\n// ─── Provider ────────────────────────────────────────────\nexport interface I18nProviderProps {\n children: React.ReactNode;\n /** Default locale */\n defaultLocale?: Locale;\n /** Override locale (e.g. from user settings / DB) */\n forcedLocale?: Locale;\n}\n\nfunction I18nProvider({\n children,\n defaultLocale = 'pt-BR',\n forcedLocale,\n}: I18nProviderProps) {\n const [locale, setLocaleState] = React.useState<Locale>(() => {\n if (forcedLocale) return forcedLocale;\n if (typeof window === 'undefined') return defaultLocale;\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored === 'pt-BR' || stored === 'en' || stored === 'es') return stored;\n } catch {}\n return defaultLocale;\n });\n\n // Sync with forcedLocale changes (e.g. user settings loaded async)\n React.useEffect(() => {\n if (forcedLocale) setLocaleState(forcedLocale);\n }, [forcedLocale]);\n\n const setLocale = React.useCallback(\n (newLocale: Locale) => {\n if (forcedLocale) return;\n setLocaleState(newLocale);\n try {\n localStorage.setItem(STORAGE_KEY, newLocale);\n } catch {}\n // Update <html lang> for accessibility\n if (typeof document !== 'undefined') {\n document.documentElement.lang = newLocale;\n }\n },\n [forcedLocale],\n );\n\n // Set lang on mount\n React.useEffect(() => {\n if (typeof document !== 'undefined') {\n document.documentElement.lang = locale;\n }\n }, [locale]);\n\n const t = React.useCallback(\n (key: TranslationKey, params?: Record<string, string | number>): string => {\n const dict = dictionaries[locale] ?? dictionaries['pt-BR'];\n const value = getNestedValue(dict as unknown as Record<string, unknown>, key);\n return interpolate(value, params);\n },\n [locale],\n );\n\n const value = React.useMemo(() => ({ locale, setLocale, t }), [locale, setLocale, t]);\n\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n}\n\nfunction useI18n(): I18nContextValue {\n const ctx = React.useContext(I18nContext);\n if (!ctx) throw new Error('useI18n must be used within an <I18nProvider>');\n return ctx;\n}\n\n/**\n * Standalone t() for server-side or non-hook usage.\n */\nfunction createTranslator(locale: Locale = 'pt-BR') {\n const dict = dictionaries[locale] ?? dictionaries['pt-BR'];\n return (key: TranslationKey, params?: Record<string, string | number>): string => {\n const value = getNestedValue(dict as unknown as Record<string, unknown>, key);\n return interpolate(value, params);\n };\n}\n\nexport { I18nProvider, useI18n, createTranslator, dictionaries };\nexport type { TranslationKeys };\n"]}
|