create-freakpunch 0.0.0-stage → 0.2.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 (216) hide show
  1. package/README.md +24 -3
  2. package/bin/create-freakpunch.mjs +227 -0
  3. package/files/README.md +19 -0
  4. package/files/app.config.ts +50 -0
  5. package/files/locales.ts +10 -0
  6. package/files/registry.ts +17 -0
  7. package/package.json +23 -6
  8. package/template/.dockerignore +17 -0
  9. package/template/.oxlintrc.json +9 -0
  10. package/template/AGENTS.md +6 -0
  11. package/template/BACKEND.md +108 -0
  12. package/template/CLAUDE.md +297 -0
  13. package/template/Dockerfile +19 -0
  14. package/template/_gitignore +26 -0
  15. package/template/components.json +27 -0
  16. package/template/design/COMPONENTS.md +145 -0
  17. package/template/design/DESIGN.md +212 -0
  18. package/template/design/PATTERNS.md +110 -0
  19. package/template/index.html +25 -0
  20. package/template/nginx.conf +32 -0
  21. package/template/package-lock.json +6484 -0
  22. package/template/package.json +51 -0
  23. package/template/public/favicon.svg +1 -0
  24. package/template/public/robots.txt +2 -0
  25. package/template/src/app.config.ts +50 -0
  26. package/template/src/app.roles.ts +24 -0
  27. package/template/src/components/ui/alert-dialog.tsx +181 -0
  28. package/template/src/components/ui/avatar.tsx +116 -0
  29. package/template/src/components/ui/badge.tsx +57 -0
  30. package/template/src/components/ui/breadcrumb.tsx +130 -0
  31. package/template/src/components/ui/button.tsx +58 -0
  32. package/template/src/components/ui/calendar.tsx +277 -0
  33. package/template/src/components/ui/card.tsx +99 -0
  34. package/template/src/components/ui/chart.tsx +370 -0
  35. package/template/src/components/ui/checkbox.tsx +28 -0
  36. package/template/src/components/ui/combobox.tsx +329 -0
  37. package/template/src/components/ui/command.tsx +191 -0
  38. package/template/src/components/ui/dialog.tsx +162 -0
  39. package/template/src/components/ui/dropdown-menu.tsx +271 -0
  40. package/template/src/components/ui/empty.tsx +103 -0
  41. package/template/src/components/ui/field.tsx +236 -0
  42. package/template/src/components/ui/input-group.tsx +263 -0
  43. package/template/src/components/ui/input.tsx +45 -0
  44. package/template/src/components/ui/kbd.tsx +31 -0
  45. package/template/src/components/ui/label.tsx +17 -0
  46. package/template/src/components/ui/pagination.tsx +134 -0
  47. package/template/src/components/ui/popover.tsx +87 -0
  48. package/template/src/components/ui/radio-group.tsx +35 -0
  49. package/template/src/components/ui/select.tsx +204 -0
  50. package/template/src/components/ui/separator.tsx +25 -0
  51. package/template/src/components/ui/sheet.tsx +139 -0
  52. package/template/src/components/ui/sidebar.tsx +741 -0
  53. package/template/src/components/ui/skeleton.tsx +13 -0
  54. package/template/src/components/ui/sonner.tsx +78 -0
  55. package/template/src/components/ui/spinner.tsx +42 -0
  56. package/template/src/components/ui/switch.tsx +29 -0
  57. package/template/src/components/ui/table.tsx +121 -0
  58. package/template/src/components/ui/tabs.tsx +191 -0
  59. package/template/src/components/ui/textarea.tsx +17 -0
  60. package/template/src/components/ui/toggle-group.tsx +94 -0
  61. package/template/src/components/ui/toggle.tsx +48 -0
  62. package/template/src/components/ui/tooltip.tsx +91 -0
  63. package/template/src/core/api/demo.ts +8 -0
  64. package/template/src/core/api/http.ts +76 -0
  65. package/template/src/core/api/mock.ts +88 -0
  66. package/template/src/core/api/rest.ts +67 -0
  67. package/template/src/core/api/types.ts +21 -0
  68. package/template/src/core/audit/audit.service.ts +94 -0
  69. package/template/src/core/audit/hooks.ts +19 -0
  70. package/template/src/core/auth/auth-store.ts +52 -0
  71. package/template/src/core/auth/auth.service.ts +86 -0
  72. package/template/src/core/auth/can.tsx +39 -0
  73. package/template/src/core/auth/dev-role-switcher.tsx +64 -0
  74. package/template/src/core/auth/local-credentials.ts +46 -0
  75. package/template/src/core/auth/permissions.ts +115 -0
  76. package/template/src/core/auth/require-auth.tsx +16 -0
  77. package/template/src/core/auth/require-permission.tsx +24 -0
  78. package/template/src/core/auth/roles.ts +9 -0
  79. package/template/src/core/auth/types.ts +20 -0
  80. package/template/src/core/auth/use-auth.ts +19 -0
  81. package/template/src/core/company/company.service.ts +94 -0
  82. package/template/src/core/company/hooks.ts +40 -0
  83. package/template/src/core/company/password-policy.ts +40 -0
  84. package/template/src/core/company/types.ts +46 -0
  85. package/template/src/core/company/use-app-name.ts +7 -0
  86. package/template/src/core/components/button-link.tsx +14 -0
  87. package/template/src/core/components/confirm-dialog.tsx +116 -0
  88. package/template/src/core/components/data-table/data-table.tsx +297 -0
  89. package/template/src/core/components/data-table/features.ts +24 -0
  90. package/template/src/core/components/data-table/table-header-cell.tsx +13 -0
  91. package/template/src/core/components/data-table/toolbar.tsx +100 -0
  92. package/template/src/core/components/data-table/use-list-url-state.ts +108 -0
  93. package/template/src/core/components/date-picker.tsx +71 -0
  94. package/template/src/core/components/file-attachments.tsx +84 -0
  95. package/template/src/core/components/form-error.tsx +9 -0
  96. package/template/src/core/components/form-page.tsx +93 -0
  97. package/template/src/core/components/image-upload.tsx +86 -0
  98. package/template/src/core/components/page.tsx +75 -0
  99. package/template/src/core/components/phone-input.tsx +58 -0
  100. package/template/src/core/components/search-select.tsx +57 -0
  101. package/template/src/core/components/segmented.tsx +41 -0
  102. package/template/src/core/components/states.tsx +97 -0
  103. package/template/src/core/components/status-badge.tsx +26 -0
  104. package/template/src/core/components/user-avatar.tsx +23 -0
  105. package/template/src/core/config/runtime.ts +16 -0
  106. package/template/src/core/config/types.ts +37 -0
  107. package/template/src/core/i18n/i18n.ts +69 -0
  108. package/template/src/core/i18n/i18next.d.ts +12 -0
  109. package/template/src/core/i18n/keys.ts +37 -0
  110. package/template/src/core/i18n/language-switcher.tsx +45 -0
  111. package/template/src/core/i18n/types.ts +17 -0
  112. package/template/src/core/i18n/use-format.ts +31 -0
  113. package/template/src/core/layout/app-shell.tsx +50 -0
  114. package/template/src/core/layout/app-sidebar.tsx +285 -0
  115. package/template/src/core/layout/command-menu.tsx +117 -0
  116. package/template/src/core/layout/top-bar.tsx +100 -0
  117. package/template/src/core/lib/csv.ts +27 -0
  118. package/template/src/core/lib/format.ts +87 -0
  119. package/template/src/core/lib/phone.ts +50 -0
  120. package/template/src/core/lib/storage.ts +27 -0
  121. package/template/src/core/modules/lazy-page.ts +9 -0
  122. package/template/src/core/modules/navigation.ts +39 -0
  123. package/template/src/core/modules/types.ts +55 -0
  124. package/template/src/core/notifications/hooks.ts +84 -0
  125. package/template/src/core/notifications/notification-center.tsx +251 -0
  126. package/template/src/core/notifications/notifications.service.ts +132 -0
  127. package/template/src/core/notifications/types.ts +70 -0
  128. package/template/src/core/preferences/preferences-store.ts +70 -0
  129. package/template/src/core/setup/setup-gate.tsx +20 -0
  130. package/template/src/core/setup/setup.service.ts +101 -0
  131. package/template/src/core/theme/brand-context.tsx +53 -0
  132. package/template/src/core/theme/brand.ts +29 -0
  133. package/template/src/core/theme/theme-context.tsx +62 -0
  134. package/template/src/core/theme/theme-options.ts +8 -0
  135. package/template/src/core/theme/theme-toggle.tsx +45 -0
  136. package/template/src/core/users/hooks.ts +51 -0
  137. package/template/src/core/users/types.ts +37 -0
  138. package/template/src/core/users/users.service.ts +167 -0
  139. package/template/src/hooks/use-mobile.ts +19 -0
  140. package/template/src/index.css +321 -0
  141. package/template/src/lib/utils.ts +1 -0
  142. package/template/src/locales/en/account.ts +180 -0
  143. package/template/src/locales/en/auth.ts +18 -0
  144. package/template/src/locales/en/common.ts +151 -0
  145. package/template/src/locales/en/company.ts +380 -0
  146. package/template/src/locales/en/dashboard.ts +46 -0
  147. package/template/src/locales/en/errors.ts +18 -0
  148. package/template/src/locales/en/notifications.ts +43 -0
  149. package/template/src/locales/en/settings.ts +25 -0
  150. package/template/src/locales/en/setup.ts +45 -0
  151. package/template/src/locales/index.ts +58 -0
  152. package/template/src/locales/tr/account.ts +184 -0
  153. package/template/src/locales/tr/auth.ts +22 -0
  154. package/template/src/locales/tr/common.ts +154 -0
  155. package/template/src/locales/tr/company.ts +384 -0
  156. package/template/src/locales/tr/dashboard.ts +50 -0
  157. package/template/src/locales/tr/errors.ts +22 -0
  158. package/template/src/locales/tr/notifications.ts +47 -0
  159. package/template/src/locales/tr/settings.ts +29 -0
  160. package/template/src/locales/tr/setup.ts +49 -0
  161. package/template/src/main.tsx +16 -0
  162. package/template/src/modules/locales.ts +10 -0
  163. package/template/src/modules/registry.ts +17 -0
  164. package/template/src/pages/dashboard/dashboard-page.tsx +55 -0
  165. package/template/src/pages/dashboard/quick-actions.tsx +37 -0
  166. package/template/src/pages/login-page.tsx +152 -0
  167. package/template/src/pages/no-access-page.tsx +11 -0
  168. package/template/src/pages/not-found-page.tsx +61 -0
  169. package/template/src/pages/settings/account/account.service.ts +128 -0
  170. package/template/src/pages/settings/account/components/mock-qr.tsx +50 -0
  171. package/template/src/pages/settings/account/components/password-strength.tsx +38 -0
  172. package/template/src/pages/settings/account/components/two-factor-dialog.tsx +140 -0
  173. package/template/src/pages/settings/account/hooks.ts +73 -0
  174. package/template/src/pages/settings/account/notifications-page.tsx +103 -0
  175. package/template/src/pages/settings/account/preferences-page.tsx +157 -0
  176. package/template/src/pages/settings/account/profile-page.tsx +242 -0
  177. package/template/src/pages/settings/account/security-page.tsx +364 -0
  178. package/template/src/pages/settings/account/types.ts +37 -0
  179. package/template/src/pages/settings/company/audit-log-page.tsx +126 -0
  180. package/template/src/pages/settings/company/branding-page.tsx +278 -0
  181. package/template/src/pages/settings/company/components/invite-dialog.tsx +106 -0
  182. package/template/src/pages/settings/company/components/read-only-notice.tsx +13 -0
  183. package/template/src/pages/settings/company/danger-zone-page.tsx +127 -0
  184. package/template/src/pages/settings/company/general-page.tsx +234 -0
  185. package/template/src/pages/settings/company/integrations/api-keys-panel.tsx +170 -0
  186. package/template/src/pages/settings/company/integrations/hooks.ts +37 -0
  187. package/template/src/pages/settings/company/integrations/integrations-page.tsx +57 -0
  188. package/template/src/pages/settings/company/integrations/integrations.service.ts +153 -0
  189. package/template/src/pages/settings/company/integrations/settings-forms.tsx +299 -0
  190. package/template/src/pages/settings/company/integrations/webhooks-panel.tsx +179 -0
  191. package/template/src/pages/settings/company/modules-page.tsx +65 -0
  192. package/template/src/pages/settings/company/roles-page.tsx +116 -0
  193. package/template/src/pages/settings/company/security-policies-page.tsx +164 -0
  194. package/template/src/pages/settings/company/users-page.tsx +262 -0
  195. package/template/src/pages/settings/settings-layout.tsx +57 -0
  196. package/template/src/pages/settings/settings-nav.ts +69 -0
  197. package/template/src/pages/settings/settings-routes.tsx +49 -0
  198. package/template/src/pages/setup-page.tsx +387 -0
  199. package/template/src/providers.tsx +68 -0
  200. package/template/src/router.tsx +59 -0
  201. package/template/tools/check-design.mjs +73 -0
  202. package/template/tools/new-module.mjs +90 -0
  203. package/template/tools/templates/module/api/__id__.mock.ts.tpl +17 -0
  204. package/template/tools/templates/module/api/__id__.service.ts.tpl +51 -0
  205. package/template/tools/templates/module/hooks.ts.tpl +57 -0
  206. package/template/tools/templates/module/index.ts.tpl +44 -0
  207. package/template/tools/templates/module/locales/en.ts.tpl +51 -0
  208. package/template/tools/templates/module/locales/tr.ts.tpl +55 -0
  209. package/template/tools/templates/module/pages/__id__-detail-page.tsx.tpl +103 -0
  210. package/template/tools/templates/module/pages/__id__-form-page.tsx.tpl +121 -0
  211. package/template/tools/templates/module/pages/__id__-list-page.tsx.tpl +234 -0
  212. package/template/tools/templates/module/types.ts.tpl +32 -0
  213. package/template/tsconfig.app.json +32 -0
  214. package/template/tsconfig.json +12 -0
  215. package/template/tsconfig.node.json +23 -0
  216. package/template/vite.config.ts +47 -0
@@ -0,0 +1,380 @@
1
+ /** Settings → Company: general, branding, users, roles, policies, modules, integrations, audit log, danger zone. */
2
+ export default {
3
+ readOnly: 'Only Owners and Admins can change company settings.',
4
+ general: {
5
+ title: 'General',
6
+ description: 'Legal and contact details used on invoices, emails and documents.',
7
+ saved: 'Company details saved',
8
+ identity: {
9
+ title: 'Company',
10
+ description: 'How your company appears in the app and in emails.',
11
+ name: 'Company name',
12
+ legalName: 'Legal name',
13
+ legalNameHint: 'The full name as officially registered.',
14
+ },
15
+ tax: {
16
+ title: 'Tax information',
17
+ description: 'Printed on invoices. Turkish companies use a 10-digit VKN.',
18
+ office: 'Tax office',
19
+ number: 'Tax number (VKN)',
20
+ numberInvalid: 'The tax number must be exactly 10 digits',
21
+ },
22
+ address: {
23
+ title: 'Address',
24
+ description: 'Registered business address.',
25
+ label: 'Address',
26
+ },
27
+ contact: {
28
+ title: 'Contact',
29
+ description: 'Where customers and partners can reach you.',
30
+ email: 'Contact email',
31
+ phone: 'Contact phone',
32
+ },
33
+ locale: {
34
+ title: 'Regional defaults',
35
+ description: 'Defaults for new users, emails and amounts. Users can override language and time zone.',
36
+ language: 'Default language',
37
+ timeZone: 'Time zone',
38
+ currency: 'Currency',
39
+ },
40
+ },
41
+ branding: {
42
+ title: 'Branding',
43
+ description: 'Logos, favicon and the accent color used across the app.',
44
+ saved: 'Branding saved',
45
+ logos: {
46
+ title: 'Logo',
47
+ description: 'SVG or PNG on a transparent background, up to 2 MB.',
48
+ light: 'For light backgrounds',
49
+ dark: 'For dark backgrounds',
50
+ uploadLight: 'Upload logo for light backgrounds',
51
+ uploadDark: 'Upload logo for dark backgrounds',
52
+ empty: 'No logo',
53
+ },
54
+ favicon: {
55
+ title: 'Favicon',
56
+ description: 'Shown in browser tabs. Square SVG, PNG or ICO.',
57
+ upload: 'Upload favicon',
58
+ },
59
+ color: {
60
+ title: 'Brand color',
61
+ description: 'Used for primary buttons, focus rings, selections and active states. The preview updates live.',
62
+ custom: 'Custom',
63
+ customLabel: 'Custom brand color',
64
+ reset: 'Reset to default ({{name}})',
65
+ },
66
+ presets: {
67
+ indigo: 'Indigo',
68
+ blue: 'Blue',
69
+ violet: 'Violet',
70
+ emerald: 'Emerald',
71
+ orange: 'Orange',
72
+ rose: 'Rose',
73
+ graphite: 'Graphite',
74
+ },
75
+ preview: {
76
+ title: 'Preview',
77
+ controls: 'Controls',
78
+ primary: 'Primary',
79
+ secondary: 'Secondary',
80
+ new: 'New',
81
+ enabled: 'Enabled',
82
+ selected: 'Selected',
83
+ focusRing: 'Focus ring',
84
+ navigation: 'Navigation',
85
+ activeItem: 'Active item',
86
+ inactiveItem: 'Inactive item',
87
+ link: 'Text with a <a>brand link</a>.',
88
+ },
89
+ imageError: {
90
+ tooLarge: 'The image is larger than 2 MB.',
91
+ invalidType: 'Choose an SVG, PNG, JPG, WebP or ICO file.',
92
+ },
93
+ },
94
+ users: {
95
+ title: 'Users',
96
+ description: 'Invite teammates and manage their roles and access.',
97
+ invite: 'Invite user',
98
+ search: 'Search name or email…',
99
+ noun: 'users',
100
+ you: 'You',
101
+ filters: {
102
+ role: 'Role',
103
+ allRoles: 'All roles',
104
+ status: 'Status',
105
+ allStatuses: 'All statuses',
106
+ },
107
+ columns: { user: 'User', role: 'Role', status: 'Status', lastActive: 'Last active' },
108
+ status: { active: 'Active', invited: 'Invited', deactivated: 'Deactivated' },
109
+ never: 'Never',
110
+ pendingInvite: 'Invitation sent {{when}}',
111
+ ownerLocked: 'The Owner can’t be changed. Ownership can only be transferred in the danger zone.',
112
+ actions: {
113
+ changeRole: 'Change role',
114
+ resendInvite: 'Resend invitation',
115
+ deactivate: 'Deactivate',
116
+ reactivate: 'Reactivate',
117
+ },
118
+ toasts: {
119
+ invited: 'Invitation sent to {{email}}',
120
+ resent: 'Invitation resent to {{email}}',
121
+ roleChanged: '{{name}} is now {{role}}',
122
+ deactivated: '{{name}} deactivated',
123
+ reactivated: '{{name}} reactivated',
124
+ failed: 'Something went wrong',
125
+ forbidden: 'You don’t have permission to change this user.',
126
+ },
127
+ deactivateConfirm: {
128
+ title: 'Deactivate {{name}}?',
129
+ description: 'They will be signed out and lose access immediately. You can reactivate them later.',
130
+ },
131
+ inviteDialog: {
132
+ title: 'Invite a teammate',
133
+ description: 'They’ll get an email with a link to join {{company}}.',
134
+ email: 'Email',
135
+ role: 'Role',
136
+ submit: 'Send invitation',
137
+ duplicate: 'This email already belongs to a team member',
138
+ },
139
+ emptyTitle: 'No matching users',
140
+ emptyDescription: 'Try a different search or clear the filters.',
141
+ },
142
+ roles: {
143
+ title: 'Roles & permissions',
144
+ description: 'Roles control what each person can see and do.',
145
+ members_one: '{{count}} member',
146
+ members_other: '{{count}} members',
147
+ descriptions: {
148
+ owner: 'Full access, including the danger zone. There is exactly one Owner; ownership can only be transferred.',
149
+ admin: 'Everything except the danger zone. Can manage users but can’t edit the Owner.',
150
+ editor: 'Create, edit and delete content in modules. No access to company settings.',
151
+ viewer: 'Read-only access to the dashboard and modules.',
152
+ },
153
+ matrix: {
154
+ title: 'Permission matrix',
155
+ description: 'Read-only. Permission names under each area match the backend authorities.',
156
+ role: 'Role',
157
+ resource: 'Area',
158
+ granted: 'Allowed',
159
+ denied: 'Not allowed',
160
+ notApplicable: 'Not applicable',
161
+ },
162
+ actions: { view: 'View', create: 'Create', edit: 'Edit', delete: 'Delete', manage: 'Manage' },
163
+ resources: {
164
+ dashboard: 'Dashboard',
165
+ companySettings: 'Company settings',
166
+ users: 'Users',
167
+ roles: 'Roles',
168
+ audit: 'Audit log',
169
+ integrations: 'Integrations',
170
+ company: 'Company (transfer · delete)',
171
+ },
172
+ },
173
+ policies: {
174
+ title: 'Security policies',
175
+ description: 'Rules that apply to everyone in the company.',
176
+ saved: 'Security policies saved',
177
+ twoFactor: {
178
+ title: 'Two-factor authentication',
179
+ description: 'Everyone must set up an authenticator app before they can continue.',
180
+ label: 'Require two-factor authentication',
181
+ },
182
+ password: {
183
+ title: 'Password rules',
184
+ description: 'Applied when people set or change their password.',
185
+ minLength: 'Minimum length',
186
+ characters: '{{count}} characters',
187
+ uppercase: 'Require an uppercase letter',
188
+ number: 'Require a number',
189
+ symbol: 'Require a symbol',
190
+ expiry: 'Password expiry',
191
+ never: 'Never',
192
+ days: 'Every {{count}} days',
193
+ },
194
+ session: {
195
+ title: 'Sessions',
196
+ description: 'Sign people out after a period of inactivity.',
197
+ timeout: 'Session timeout',
198
+ minutes: '{{count}} minutes',
199
+ hours_one: '{{count}} hour',
200
+ hours_other: '{{count}} hours',
201
+ days_one: '{{count}} day',
202
+ days_other: '{{count}} days',
203
+ },
204
+ },
205
+ modules: {
206
+ emptyTitle: 'No modules yet',
207
+ emptyDescription: 'Features you add to this panel will be listed here.',
208
+ title: 'Modules',
209
+ description: 'Feature areas available in this workspace.',
210
+ note: 'Read-only for now. Modules are switched on in <code>src/app.config.ts</code>; this page will be editable once the backend stores the setting.',
211
+ enabled: 'Enabled',
212
+ disabled: 'Disabled',
213
+ toggleLabel: '{{name}} module',
214
+ permissions_one: '{{count}} permission',
215
+ permissions_other: '{{count}} permissions',
216
+ },
217
+ integrations: {
218
+ title: 'Integrations',
219
+ description: 'Connect email, file storage, payments and other services.',
220
+ saved: '{{name}} settings saved',
221
+ tabs: { smtp: 'Email (SMTP)', storage: 'Storage', payments: 'Payments', webhooks: 'Webhooks', apiKeys: 'API keys' },
222
+ status: { connected: 'Connected', notConnected: 'Not connected', testMode: 'Test mode', liveMode: 'Live' },
223
+ secretHint: 'Stored encrypted. Leave as is to keep the current value.',
224
+ smtp: {
225
+ title: 'Outgoing email',
226
+ description: 'Used for invitations, password resets and notifications.',
227
+ server: 'Server',
228
+ host: 'SMTP host',
229
+ port: 'Port',
230
+ encryption: 'Encryption',
231
+ encryptionOptions: { none: 'None', ssl: 'SSL', tls: 'STARTTLS' },
232
+ username: 'Username',
233
+ password: 'Password',
234
+ sender: { title: 'Sender', description: 'Shown as the “From” of every email.' },
235
+ fromName: 'From name',
236
+ fromEmail: 'From email',
237
+ test: 'Send test email',
238
+ testSent: 'Test email sent to {{email}}',
239
+ },
240
+ storage: {
241
+ title: 'File storage',
242
+ description: 'Where uploaded images and documents are kept.',
243
+ provider: 'Provider',
244
+ providers: { local: 'Local disk', s3: 'Amazon S3', r2: 'Cloudflare R2', gcs: 'Google Cloud Storage' },
245
+ bucket: 'Bucket',
246
+ region: 'Region',
247
+ accessKey: 'Access key ID',
248
+ secretKey: 'Secret access key',
249
+ localHint: 'Files are stored on the application server. Fine for development only.',
250
+ },
251
+ payments: {
252
+ title: 'Payment provider',
253
+ description: 'Take card payments for orders and bookings.',
254
+ provider: 'Provider',
255
+ providers: { none: 'None', iyzico: 'iyzico', stripe: 'Stripe', paytr: 'PayTR' },
256
+ mode: 'Mode',
257
+ modes: { test: 'Test', live: 'Live' },
258
+ publicKey: 'API key',
259
+ secretKey: 'Secret key',
260
+ },
261
+ webhooks: {
262
+ title: 'Webhooks',
263
+ description: 'Send events to your own endpoints as they happen.',
264
+ add: 'Add webhook',
265
+ empty: 'No webhooks yet',
266
+ emptyDescription: 'Add an endpoint to receive events like product updates.',
267
+ events: 'Events',
268
+ eventCount_one: '{{count}} event',
269
+ eventCount_other: '{{count}} events',
270
+ lastDelivery: 'Last delivery {{when}}',
271
+ neverDelivered: 'No deliveries yet',
272
+ active: 'Active',
273
+ toggle: 'Enable {{url}}',
274
+ deleteLabel: 'Delete {{url}}',
275
+ deleteConfirm: 'Delete this webhook?',
276
+ deleteDescription: '{{url}} will stop receiving events.',
277
+ deleted: 'Webhook deleted',
278
+ created: 'Webhook added',
279
+ dialog: {
280
+ title: 'Add webhook',
281
+ description: 'We’ll POST a JSON payload to this URL for each selected event.',
282
+ url: 'Endpoint URL',
283
+ urlInvalid: 'Enter an https:// URL',
284
+ events: 'Events',
285
+ eventsRequired: 'Choose at least one event',
286
+ },
287
+ eventNames: {
288
+ 'product.created': 'Product created',
289
+ 'product.updated': 'Product updated',
290
+ 'product.deleted': 'Product deleted',
291
+ 'user.invited': 'User invited',
292
+ 'user.deactivated': 'User deactivated',
293
+ },
294
+ },
295
+ apiKeys: {
296
+ title: 'API keys',
297
+ description: 'Keys for server-to-server access to the API. Treat them like passwords.',
298
+ create: 'Create API key',
299
+ empty: 'No API keys yet',
300
+ emptyDescription: 'Create a key to call the API from your own services.',
301
+ created: 'Created {{when}}',
302
+ lastUsed: 'Last used {{when}}',
303
+ neverUsed: 'Never used',
304
+ revoke: 'Revoke',
305
+ revokeLabel: 'Revoke {{name}}',
306
+ revokeConfirm: 'Revoke “{{name}}”?',
307
+ revokeDescription: 'Requests using this key will be rejected immediately.',
308
+ revoked: 'API key revoked',
309
+ dialog: {
310
+ title: 'Create API key',
311
+ description: 'Give the key a name so you know where it is used.',
312
+ name: 'Name',
313
+ namePlaceholder: 'e.g. Order sync',
314
+ submit: 'Create key',
315
+ createdTitle: 'Copy your new API key',
316
+ createdDescription: 'This is the only time the full key is shown. Store it in a secret manager.',
317
+ keyLabel: 'API key',
318
+ },
319
+ },
320
+ },
321
+ audit: {
322
+ title: 'Audit log',
323
+ description: 'Who changed what and when. Entries are kept for 90 days.',
324
+ noun: 'entries',
325
+ filters: {
326
+ user: 'User',
327
+ allUsers: 'All users',
328
+ action: 'Action',
329
+ allActions: 'All actions',
330
+ date: 'Date',
331
+ allTime: 'All time',
332
+ last24h: 'Last 24 hours',
333
+ last7d: 'Last 7 days',
334
+ last30d: 'Last 30 days',
335
+ },
336
+ columns: { when: 'When', user: 'User', action: 'Action', ip: 'IP address' },
337
+ emptyTitle: 'No entries',
338
+ emptyDescription: 'Nothing matches these filters.',
339
+ actions: {
340
+ generalUpdated: 'Updated company details',
341
+ brandingUpdated: 'Updated branding',
342
+ securityUpdated: 'Updated security policies',
343
+ integrationUpdated: 'Updated an integration',
344
+ webhookCreated: 'Added a webhook',
345
+ webhookDeleted: 'Deleted a webhook',
346
+ apiKeyCreated: 'Created an API key',
347
+ apiKeyRevoked: 'Revoked an API key',
348
+ userInvited: 'Invited a user',
349
+ inviteResent: 'Resent an invitation',
350
+ roleChanged: 'Changed a role',
351
+ userDeactivated: 'Deactivated a user',
352
+ userReactivated: 'Reactivated a user',
353
+ ownershipTransferred: 'Transferred ownership',
354
+ },
355
+ roleChange: '{{from}} → {{to}}',
356
+ },
357
+ danger: {
358
+ title: 'Danger zone',
359
+ description: 'Irreversible actions. Only the Owner can see this page.',
360
+ transfer: {
361
+ title: 'Transfer ownership',
362
+ description: 'Make another active member the Owner. You become an Admin and lose access to this page.',
363
+ select: 'New owner',
364
+ placeholder: 'Choose a member',
365
+ button: 'Transfer ownership',
366
+ confirmTitle: 'Transfer ownership to {{name}}?',
367
+ confirmDescription: '{{name}} will become the Owner of {{company}}. You will become an Admin. Only the new Owner can undo this.',
368
+ done: '{{name}} is now the Owner',
369
+ noCandidates: 'Invite or reactivate a member first.',
370
+ },
371
+ delete: {
372
+ title: 'Delete company',
373
+ description: 'Permanently delete {{company}}, its users, settings and all data. This cannot be undone.',
374
+ button: 'Delete company',
375
+ confirmTitle: 'Delete {{company}} permanently?',
376
+ confirmDescription: 'All users lose access and every record is erased. In this demo, all locally stored data is cleared.',
377
+ done: 'Company deleted',
378
+ },
379
+ },
380
+ }
@@ -0,0 +1,46 @@
1
+ /** Dashboard home. */
2
+ export default {
3
+ readyDescription: 'Your panel is ready.',
4
+ noModules: {
5
+ title: 'Nothing here yet',
6
+ description: 'Features you add to this panel will appear here and in the sidebar.',
7
+ },
8
+ greeting: {
9
+ morning: 'Good morning, {{name}}',
10
+ afternoon: 'Good afternoon, {{name}}',
11
+ evening: 'Good evening, {{name}}',
12
+ fallbackName: 'there',
13
+ },
14
+ description: "Here's what's happening across your workspace.",
15
+ range: {
16
+ label: 'Date range',
17
+ '7d': '7D',
18
+ '30d': '30D',
19
+ '90d': '90D',
20
+ last: 'last {{count}} days',
21
+ },
22
+ kpis: {
23
+ revenue: 'Revenue',
24
+ orders: 'Orders',
25
+ customers: 'New customers',
26
+ conversion: 'Conversion',
27
+ },
28
+ panels: {
29
+ revenue: 'Revenue',
30
+ quickActions: 'Quick actions',
31
+ activity: 'Recent activity',
32
+ },
33
+ quickActions: {
34
+ appearance: 'Preferences',
35
+ appearanceDescription: 'Theme, language and formats',
36
+ },
37
+ activity: {
38
+ system: 'System',
39
+ payments: 'Payments',
40
+ orderPlaced: '<b>{{actor}}</b> placed order <b>{{target}}</b>',
41
+ lowStock: '<b>{{actor}}</b> flagged low stock on <b>{{target}}</b>',
42
+ updated: '<b>{{actor}}</b> updated <b>{{target}}</b>',
43
+ refund: '<b>{{actor}}</b> issued a refund for <b>{{target}}</b>',
44
+ published: '<b>{{actor}}</b> published <b>{{target}}</b>',
45
+ },
46
+ }
@@ -0,0 +1,18 @@
1
+ /** Full-page error screens: 404, unexpected errors, missing permissions. */
2
+ export default {
3
+ notFound: {
4
+ code: 'Error 404',
5
+ title: 'Page not found',
6
+ description: "The page you're looking for doesn't exist or has been moved.",
7
+ },
8
+ unexpected: {
9
+ code: 'Error',
10
+ title: 'Something went wrong',
11
+ description: 'An unexpected error occurred.',
12
+ },
13
+ noAccess: {
14
+ code: 'Error 403',
15
+ title: 'No access',
16
+ description: "Your role doesn't include permission to open this page. Ask an admin if you need access.",
17
+ },
18
+ }
@@ -0,0 +1,43 @@
1
+ /** In-app notifications: top-bar bell, panel and message templates. */
2
+ export default {
3
+ title: 'Notifications',
4
+ bell: 'Notifications',
5
+ bellUnread_one: 'Notifications, {{count}} unread',
6
+ bellUnread_other: 'Notifications, {{count}} unread',
7
+ markAllRead: 'Mark all as read',
8
+ settings: 'Notification settings',
9
+ tabs: { all: 'All', unread: 'Unread' },
10
+ groups: { today: 'Today', earlier: 'Earlier' },
11
+ unread: 'Unread',
12
+ loadFailed: 'Could not load notifications',
13
+ empty: {
14
+ all: { title: 'No notifications yet', description: 'Updates about your team, catalog and account will show up here.' },
15
+ unread: { title: 'You’re all caught up', description: 'You have no unread notifications.' },
16
+ },
17
+ types: { info: 'Info', success: 'Success', warning: 'Warning', error: 'Important' },
18
+ templates: {
19
+ userInvited: { title: 'New user invited', body: '{{name}} invited {{email}} as {{role}}.' },
20
+ userJoined: { title: 'New team member', body: '{{name}} accepted the invite and joined the company.' },
21
+ roleChangedOther: { title: 'Role changed', body: '{{name}} is now {{role}}.' },
22
+ roleChangedYou: { title: 'Your role changed', body: '{{name}} changed your role to {{role}}.' },
23
+ lowStock: {
24
+ title: 'Low stock',
25
+ body_one: '{{count}} active product is running low on stock.',
26
+ body_other: '{{count}} active products are running low on stock.',
27
+ },
28
+ productUpdated: {
29
+ title: 'Products updated',
30
+ body_one: '{{name}} updated {{count}} product.',
31
+ body_other: '{{name}} updated {{count}} products.',
32
+ },
33
+ settingsChanged: { title: 'Company settings changed', body: '{{name}} updated the general company settings.' },
34
+ brandingChanged: { title: 'Branding updated', body: '{{name}} changed the company logo and brand color.' },
35
+ securityAlert: {
36
+ title: 'New sign-in detected',
37
+ body: '{{browser}} on {{os}} near {{location}}. If this wasn’t you, change your password.',
38
+ },
39
+ passwordChanged: { title: 'Password changed', body: 'Your password was changed. If this wasn’t you, contact an admin.' },
40
+ weeklySummary: { title: 'Your weekly summary', body: '{{orders}} orders and {{revenue}} in revenue last week.' },
41
+ announcement: { title: 'What’s new', body: 'Notifications are here: team, catalog and security updates in one place.' },
42
+ },
43
+ }
@@ -0,0 +1,25 @@
1
+ /** Settings shell: sub-navigation and section names. Page content lives in `account` and `company`. */
2
+ export default {
3
+ title: 'Settings',
4
+ navLabel: 'Settings sections',
5
+ groups: {
6
+ account: 'My account',
7
+ company: 'Company',
8
+ },
9
+ nav: {
10
+ profile: 'Profile',
11
+ security: 'Security',
12
+ notifications: 'Notifications',
13
+ preferences: 'Preferences',
14
+ company: 'Company',
15
+ general: 'General',
16
+ branding: 'Branding',
17
+ users: 'Users',
18
+ roles: 'Roles & permissions',
19
+ securityPolicies: 'Security policies',
20
+ modules: 'Modules',
21
+ integrations: 'Integrations',
22
+ auditLog: 'Audit log',
23
+ dangerZone: 'Danger zone',
24
+ },
25
+ }
@@ -0,0 +1,45 @@
1
+ /** First-run setup wizard. */
2
+ export default {
3
+ title: 'Set up your panel',
4
+ progress: 'Step {{step}} of {{total}}',
5
+ next: 'Continue',
6
+ finish: 'Finish setup',
7
+ failed: 'Setup failed',
8
+ insecure: 'Open the panel on https or localhost to create an account.',
9
+ localNote: 'No backend connected yet: this account and its data are saved only in this browser. Connect a backend before going live.',
10
+ company: {
11
+ title: 'Your company',
12
+ description: 'This name appears across the panel. You can change everything later in Settings.',
13
+ name: 'Company name',
14
+ language: 'Language',
15
+ timeZone: 'Time zone',
16
+ currency: 'Currency',
17
+ },
18
+ admin: {
19
+ title: 'Your admin account',
20
+ description: 'You will be the Owner, with full access to the panel.',
21
+ firstName: 'First name',
22
+ lastName: 'Last name',
23
+ email: 'Email',
24
+ password: 'Password',
25
+ confirmPassword: 'Confirm password',
26
+ passwordWeak: 'This password does not meet the rules below',
27
+ passwordMismatch: 'The passwords do not match',
28
+ },
29
+ branding: {
30
+ title: 'Your look',
31
+ description: 'Pick an accent color and add a logo. The logo is optional.',
32
+ color: 'Accent color',
33
+ logo: 'Logo',
34
+ },
35
+ review: {
36
+ title: 'Check the details',
37
+ description: 'Everything look right?',
38
+ admin: 'Owner',
39
+ },
40
+ done: {
41
+ title: 'You are all set',
42
+ description: '{{name}} is ready to use.',
43
+ open: 'Open the panel',
44
+ },
45
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * All translation resources. English is the source of truth and the
3
+ * fallback; every other language is typed against it (see Messages<T>).
4
+ *
5
+ * To add a core namespace: create en/<ns>.ts and tr/<ns>.ts and register both
6
+ * below. Modules register src/modules/<module>/locales/{en,tr}.ts in
7
+ * src/modules/locales.ts. Use it with useTranslation('<ns>').
8
+ */
9
+ import { moduleLocalesEn, moduleLocalesTr } from '@/modules/locales'
10
+ import accountEn from './en/account'
11
+ import authEn from './en/auth'
12
+ import companyEn from './en/company'
13
+ import commonEn from './en/common'
14
+ import dashboardEn from './en/dashboard'
15
+ import errorsEn from './en/errors'
16
+ import notificationsEn from './en/notifications'
17
+ import settingsEn from './en/settings'
18
+ import setupEn from './en/setup'
19
+ import accountTr from './tr/account'
20
+ import authTr from './tr/auth'
21
+ import companyTr from './tr/company'
22
+ import commonTr from './tr/common'
23
+ import dashboardTr from './tr/dashboard'
24
+ import errorsTr from './tr/errors'
25
+ import notificationsTr from './tr/notifications'
26
+ import settingsTr from './tr/settings'
27
+ import setupTr from './tr/setup'
28
+
29
+ const en = {
30
+ common: commonEn,
31
+ auth: authEn,
32
+ errors: errorsEn,
33
+ dashboard: dashboardEn,
34
+ settings: settingsEn,
35
+ setup: setupEn,
36
+ account: accountEn,
37
+ company: companyEn,
38
+ notifications: notificationsEn,
39
+ ...moduleLocalesEn,
40
+ }
41
+
42
+ const tr: typeof en = {
43
+ common: commonTr,
44
+ auth: authTr,
45
+ errors: errorsTr,
46
+ dashboard: dashboardTr,
47
+ settings: settingsTr,
48
+ setup: setupTr,
49
+ account: accountTr,
50
+ company: companyTr,
51
+ notifications: notificationsTr,
52
+ ...moduleLocalesTr,
53
+ }
54
+
55
+ export const resources = { en, tr }
56
+ export type Resources = typeof en
57
+ export type Namespace = keyof Resources
58
+ export const namespaces = Object.keys(en) as Namespace[]