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,384 @@
1
+ import type { Messages } from '@/core/i18n/types'
2
+ import type en from '../en/company'
3
+
4
+ const company: Messages<typeof en> = {
5
+ readOnly: 'Şirket ayarlarını yalnızca Sahip ve Yöneticiler değiştirebilir.',
6
+ general: {
7
+ title: 'Genel',
8
+ description: 'Faturalarda, e-postalarda ve belgelerde kullanılan yasal ve iletişim bilgileri.',
9
+ saved: 'Şirket bilgileri kaydedildi',
10
+ identity: {
11
+ title: 'Şirket',
12
+ description: 'Şirketinizin uygulamada ve e-postalarda nasıl görüneceği.',
13
+ name: 'Şirket adı',
14
+ legalName: 'Ticari unvan',
15
+ legalNameHint: 'Resmî olarak tescil edildiği tam ad.',
16
+ },
17
+ tax: {
18
+ title: 'Vergi bilgileri',
19
+ description: 'Faturalarda yer alır. Türkiye’deki şirketler 10 haneli VKN kullanır.',
20
+ office: 'Vergi dairesi',
21
+ number: 'Vergi numarası (VKN)',
22
+ numberInvalid: 'Vergi numarası tam olarak 10 haneli olmalıdır',
23
+ },
24
+ address: {
25
+ title: 'Adres',
26
+ description: 'Kayıtlı işyeri adresi.',
27
+ label: 'Adres',
28
+ },
29
+ contact: {
30
+ title: 'İletişim',
31
+ description: 'Müşterilerin ve iş ortaklarının size ulaşabileceği bilgiler.',
32
+ email: 'İletişim e-postası',
33
+ phone: 'İletişim telefonu',
34
+ },
35
+ locale: {
36
+ title: 'Bölgesel varsayılanlar',
37
+ description: 'Yeni kullanıcılar, e-postalar ve tutarlar için varsayılanlar. Kullanıcılar dil ve saat dilimini değiştirebilir.',
38
+ language: 'Varsayılan dil',
39
+ timeZone: 'Saat dilimi',
40
+ currency: 'Para birimi',
41
+ },
42
+ },
43
+ branding: {
44
+ title: 'Marka',
45
+ description: 'Uygulama genelinde kullanılan logolar, favicon ve vurgu rengi.',
46
+ saved: 'Marka ayarları kaydedildi',
47
+ logos: {
48
+ title: 'Logo',
49
+ description: 'Şeffaf arka planlı SVG veya PNG, en fazla 2 MB.',
50
+ light: 'Açık arka planlar için',
51
+ dark: 'Koyu arka planlar için',
52
+ uploadLight: 'Açık arka planlar için logo yükle',
53
+ uploadDark: 'Koyu arka planlar için logo yükle',
54
+ empty: 'Logo yok',
55
+ },
56
+ favicon: {
57
+ title: 'Favicon',
58
+ description: 'Tarayıcı sekmelerinde gösterilir. Kare SVG, PNG veya ICO.',
59
+ upload: 'Favicon yükle',
60
+ },
61
+ color: {
62
+ title: 'Marka rengi',
63
+ description: 'Birincil düğmeler, odak halkaları, seçimler ve etkin durumlar için kullanılır. Önizleme anında güncellenir.',
64
+ custom: 'Özel',
65
+ customLabel: 'Özel marka rengi',
66
+ reset: 'Varsayılana dön ({{name}})',
67
+ },
68
+ presets: {
69
+ indigo: 'Çivit',
70
+ blue: 'Mavi',
71
+ violet: 'Mor',
72
+ emerald: 'Zümrüt',
73
+ orange: 'Turuncu',
74
+ rose: 'Gül',
75
+ graphite: 'Grafit',
76
+ },
77
+ preview: {
78
+ title: 'Önizleme',
79
+ controls: 'Kontroller',
80
+ primary: 'Birincil',
81
+ secondary: 'İkincil',
82
+ new: 'Yeni',
83
+ enabled: 'Açık',
84
+ selected: 'Seçili',
85
+ focusRing: 'Odak halkası',
86
+ navigation: 'Gezinme',
87
+ activeItem: 'Etkin öğe',
88
+ inactiveItem: 'Pasif öğe',
89
+ link: '<a>Marka bağlantısı</a> içeren metin.',
90
+ },
91
+ imageError: {
92
+ tooLarge: 'Görsel 2 MB’den büyük.',
93
+ invalidType: 'SVG, PNG, JPG, WebP veya ICO dosyası seçin.',
94
+ },
95
+ },
96
+ users: {
97
+ title: 'Kullanıcılar',
98
+ description: 'Ekip arkadaşlarınızı davet edin, rollerini ve erişimlerini yönetin.',
99
+ invite: 'Kullanıcı davet et',
100
+ search: 'Ad veya e-posta ara…',
101
+ noun: 'kullanıcı',
102
+ you: 'Siz',
103
+ filters: {
104
+ role: 'Rol',
105
+ allRoles: 'Tüm roller',
106
+ status: 'Durum',
107
+ allStatuses: 'Tüm durumlar',
108
+ },
109
+ columns: { user: 'Kullanıcı', role: 'Rol', status: 'Durum', lastActive: 'Son etkinlik' },
110
+ status: { active: 'Aktif', invited: 'Davet edildi', deactivated: 'Devre dışı' },
111
+ never: 'Hiç',
112
+ pendingInvite: 'Davet {{when}} gönderildi',
113
+ ownerLocked: 'Sahip değiştirilemez. Sahiplik yalnızca tehlikeli bölgeden devredilebilir.',
114
+ actions: {
115
+ changeRole: 'Rolü değiştir',
116
+ resendInvite: 'Daveti tekrar gönder',
117
+ deactivate: 'Devre dışı bırak',
118
+ reactivate: 'Yeniden etkinleştir',
119
+ },
120
+ toasts: {
121
+ invited: 'Davet {{email}} adresine gönderildi',
122
+ resent: 'Davet {{email}} adresine tekrar gönderildi',
123
+ roleChanged: '{{name}} artık {{role}}',
124
+ deactivated: '{{name}} devre dışı bırakıldı',
125
+ reactivated: '{{name}} yeniden etkinleştirildi',
126
+ failed: 'Bir şeyler ters gitti',
127
+ forbidden: 'Bu kullanıcıyı değiştirme izniniz yok.',
128
+ },
129
+ deactivateConfirm: {
130
+ title: '{{name}} devre dışı bırakılsın mı?',
131
+ description: 'Oturumu kapatılacak ve erişimini hemen kaybedecek. Daha sonra yeniden etkinleştirebilirsiniz.',
132
+ },
133
+ inviteDialog: {
134
+ title: 'Ekip arkadaşı davet edin',
135
+ description: '{{company}} ekibine katılması için bağlantı içeren bir e-posta alacak.',
136
+ email: 'E-posta',
137
+ role: 'Rol',
138
+ submit: 'Davet gönder',
139
+ duplicate: 'Bu e-posta zaten bir ekip üyesine ait',
140
+ },
141
+ emptyTitle: 'Eşleşen kullanıcı yok',
142
+ emptyDescription: 'Farklı bir arama deneyin veya filtreleri temizleyin.',
143
+ },
144
+ roles: {
145
+ title: 'Roller ve izinler',
146
+ description: 'Roller, herkesin neyi görüp yapabileceğini belirler.',
147
+ members_one: '{{count}} üye',
148
+ members_other: '{{count}} üye',
149
+ descriptions: {
150
+ owner: 'Tehlikeli bölge dahil tam erişim. Yalnızca bir Sahip vardır; sahiplik yalnızca devredilebilir.',
151
+ admin: 'Tehlikeli bölge dışında her şey. Kullanıcıları yönetebilir ancak Sahibi düzenleyemez.',
152
+ editor: 'Modüllerde içerik oluşturur, düzenler ve siler. Şirket ayarlarına erişemez.',
153
+ viewer: 'Panoya ve modüllere salt okunur erişim.',
154
+ },
155
+ matrix: {
156
+ title: 'İzin matrisi',
157
+ description: 'Salt okunur. Her alanın altındaki izin adları arka uç yetkileriyle aynıdır.',
158
+ role: 'Rol',
159
+ resource: 'Alan',
160
+ granted: 'İzinli',
161
+ denied: 'İzinsiz',
162
+ notApplicable: 'Geçerli değil',
163
+ },
164
+ actions: { view: 'Görüntüle', create: 'Oluştur', edit: 'Düzenle', delete: 'Sil', manage: 'Yönet' },
165
+ resources: {
166
+ dashboard: 'Pano',
167
+ companySettings: 'Şirket ayarları',
168
+ users: 'Kullanıcılar',
169
+ roles: 'Roller',
170
+ audit: 'Denetim kaydı',
171
+ integrations: 'Entegrasyonlar',
172
+ company: 'Şirket (devir · silme)',
173
+ },
174
+ },
175
+ policies: {
176
+ title: 'Güvenlik politikaları',
177
+ description: 'Şirketteki herkes için geçerli kurallar.',
178
+ saved: 'Güvenlik politikaları kaydedildi',
179
+ twoFactor: {
180
+ title: 'İki adımlı doğrulama',
181
+ description: 'Herkesin devam edebilmek için bir doğrulama uygulaması kurması gerekir.',
182
+ label: 'İki adımlı doğrulamayı zorunlu tut',
183
+ },
184
+ password: {
185
+ title: 'Şifre kuralları',
186
+ description: 'Kullanıcılar şifre belirlerken veya değiştirirken uygulanır.',
187
+ minLength: 'En az uzunluk',
188
+ characters: '{{count}} karakter',
189
+ uppercase: 'Büyük harf zorunlu',
190
+ number: 'Rakam zorunlu',
191
+ symbol: 'Sembol zorunlu',
192
+ expiry: 'Şifre geçerlilik süresi',
193
+ never: 'Süresiz',
194
+ days: 'Her {{count}} günde bir',
195
+ },
196
+ session: {
197
+ title: 'Oturumlar',
198
+ description: 'Belirli bir süre işlem yapılmadığında oturumu kapatın.',
199
+ timeout: 'Oturum zaman aşımı',
200
+ minutes: '{{count}} dakika',
201
+ hours_one: '{{count}} saat',
202
+ hours_other: '{{count}} saat',
203
+ days_one: '{{count}} gün',
204
+ days_other: '{{count}} gün',
205
+ },
206
+ },
207
+ modules: {
208
+ emptyTitle: 'Henüz modül yok',
209
+ emptyDescription: 'Bu panele eklediğiniz özellikler burada listelenecek.',
210
+ title: 'Modüller',
211
+ description: 'Bu çalışma alanında kullanılabilen özellik alanları.',
212
+ note: 'Şimdilik salt okunur. Modüller <code>src/app.config.ts</code> içinde açılır; arka uç bu ayarı sakladığında bu sayfa düzenlenebilir olacak.',
213
+ enabled: 'Açık',
214
+ disabled: 'Kapalı',
215
+ toggleLabel: '{{name}} modülü',
216
+ permissions_one: '{{count}} izin',
217
+ permissions_other: '{{count}} izin',
218
+ },
219
+ integrations: {
220
+ title: 'Entegrasyonlar',
221
+ description: 'E-posta, dosya depolama, ödeme ve diğer servisleri bağlayın.',
222
+ saved: '{{name}} ayarları kaydedildi',
223
+ tabs: { smtp: 'E-posta (SMTP)', storage: 'Depolama', payments: 'Ödemeler', webhooks: 'Webhook’lar', apiKeys: 'API anahtarları' },
224
+ status: { connected: 'Bağlı', notConnected: 'Bağlı değil', testMode: 'Test modu', liveMode: 'Canlı' },
225
+ secretHint: 'Şifrelenmiş olarak saklanır. Mevcut değeri korumak için olduğu gibi bırakın.',
226
+ smtp: {
227
+ title: 'Giden e-posta',
228
+ description: 'Davetler, şifre sıfırlama ve bildirimler için kullanılır.',
229
+ server: 'Sunucu',
230
+ host: 'SMTP sunucusu',
231
+ port: 'Port',
232
+ encryption: 'Şifreleme',
233
+ encryptionOptions: { none: 'Yok', ssl: 'SSL', tls: 'STARTTLS' },
234
+ username: 'Kullanıcı adı',
235
+ password: 'Şifre',
236
+ sender: { title: 'Gönderen', description: 'Her e-postanın “Kimden” alanında gösterilir.' },
237
+ fromName: 'Gönderen adı',
238
+ fromEmail: 'Gönderen e-postası',
239
+ test: 'Test e-postası gönder',
240
+ testSent: 'Test e-postası {{email}} adresine gönderildi',
241
+ },
242
+ storage: {
243
+ title: 'Dosya depolama',
244
+ description: 'Yüklenen görsellerin ve belgelerin saklandığı yer.',
245
+ provider: 'Sağlayıcı',
246
+ providers: { local: 'Yerel disk', s3: 'Amazon S3', r2: 'Cloudflare R2', gcs: 'Google Cloud Storage' },
247
+ bucket: 'Bucket',
248
+ region: 'Bölge',
249
+ accessKey: 'Erişim anahtarı kimliği',
250
+ secretKey: 'Gizli erişim anahtarı',
251
+ localHint: 'Dosyalar uygulama sunucusunda saklanır. Yalnızca geliştirme için uygundur.',
252
+ },
253
+ payments: {
254
+ title: 'Ödeme sağlayıcısı',
255
+ description: 'Siparişler ve rezervasyonlar için kartla ödeme alın.',
256
+ provider: 'Sağlayıcı',
257
+ providers: { none: 'Yok', iyzico: 'iyzico', stripe: 'Stripe', paytr: 'PayTR' },
258
+ mode: 'Mod',
259
+ modes: { test: 'Test', live: 'Canlı' },
260
+ publicKey: 'API anahtarı',
261
+ secretKey: 'Gizli anahtar',
262
+ },
263
+ webhooks: {
264
+ title: 'Webhook’lar',
265
+ description: 'Olayları gerçekleştikleri anda kendi uç noktalarınıza gönderin.',
266
+ add: 'Webhook ekle',
267
+ empty: 'Henüz webhook yok',
268
+ emptyDescription: 'Ürün güncellemeleri gibi olayları almak için bir uç nokta ekleyin.',
269
+ events: 'Olaylar',
270
+ eventCount_one: '{{count}} olay',
271
+ eventCount_other: '{{count}} olay',
272
+ lastDelivery: 'Son gönderim {{when}}',
273
+ neverDelivered: 'Henüz gönderim yok',
274
+ active: 'Etkin',
275
+ toggle: '{{url}} adresini etkinleştir',
276
+ deleteLabel: '{{url}} adresini sil',
277
+ deleteConfirm: 'Bu webhook silinsin mi?',
278
+ deleteDescription: '{{url}} artık olay almayacak.',
279
+ deleted: 'Webhook silindi',
280
+ created: 'Webhook eklendi',
281
+ dialog: {
282
+ title: 'Webhook ekle',
283
+ description: 'Seçilen her olay için bu adrese JSON içerikli bir POST isteği göndereceğiz.',
284
+ url: 'Uç nokta adresi',
285
+ urlInvalid: 'https:// ile başlayan bir adres girin',
286
+ events: 'Olaylar',
287
+ eventsRequired: 'En az bir olay seçin',
288
+ },
289
+ eventNames: {
290
+ 'product.created': 'Ürün oluşturuldu',
291
+ 'product.updated': 'Ürün güncellendi',
292
+ 'product.deleted': 'Ürün silindi',
293
+ 'user.invited': 'Kullanıcı davet edildi',
294
+ 'user.deactivated': 'Kullanıcı devre dışı bırakıldı',
295
+ },
296
+ },
297
+ apiKeys: {
298
+ title: 'API anahtarları',
299
+ description: 'API’ye sunucudan sunucuya erişim anahtarları. Bunlara şifre gibi davranın.',
300
+ create: 'API anahtarı oluştur',
301
+ empty: 'Henüz API anahtarı yok',
302
+ emptyDescription: 'API’yi kendi servislerinizden çağırmak için bir anahtar oluşturun.',
303
+ created: '{{when}} oluşturuldu',
304
+ lastUsed: 'Son kullanım {{when}}',
305
+ neverUsed: 'Hiç kullanılmadı',
306
+ revoke: 'İptal et',
307
+ revokeLabel: '{{name}} anahtarını iptal et',
308
+ revokeConfirm: '“{{name}}” iptal edilsin mi?',
309
+ revokeDescription: 'Bu anahtarı kullanan istekler hemen reddedilecek.',
310
+ revoked: 'API anahtarı iptal edildi',
311
+ dialog: {
312
+ title: 'API anahtarı oluştur',
313
+ description: 'Nerede kullanıldığını bilmek için anahtara bir ad verin.',
314
+ name: 'Ad',
315
+ namePlaceholder: 'ör. Sipariş senkronizasyonu',
316
+ submit: 'Anahtar oluştur',
317
+ createdTitle: 'Yeni API anahtarınızı kopyalayın',
318
+ createdDescription: 'Anahtarın tamamı yalnızca bu kez gösterilir. Bir gizli anahtar yöneticisinde saklayın.',
319
+ keyLabel: 'API anahtarı',
320
+ },
321
+ },
322
+ },
323
+ audit: {
324
+ title: 'Denetim kaydı',
325
+ description: 'Kim neyi ne zaman değiştirdi. Kayıtlar 90 gün saklanır.',
326
+ noun: 'kayıt',
327
+ filters: {
328
+ user: 'Kullanıcı',
329
+ allUsers: 'Tüm kullanıcılar',
330
+ action: 'İşlem',
331
+ allActions: 'Tüm işlemler',
332
+ date: 'Tarih',
333
+ allTime: 'Tüm zamanlar',
334
+ last24h: 'Son 24 saat',
335
+ last7d: 'Son 7 gün',
336
+ last30d: 'Son 30 gün',
337
+ },
338
+ columns: { when: 'Zaman', user: 'Kullanıcı', action: 'İşlem', ip: 'IP adresi' },
339
+ emptyTitle: 'Kayıt yok',
340
+ emptyDescription: 'Bu filtrelere uyan bir şey yok.',
341
+ actions: {
342
+ generalUpdated: 'Şirket bilgilerini güncelledi',
343
+ brandingUpdated: 'Marka ayarlarını güncelledi',
344
+ securityUpdated: 'Güvenlik politikalarını güncelledi',
345
+ integrationUpdated: 'Bir entegrasyonu güncelledi',
346
+ webhookCreated: 'Webhook ekledi',
347
+ webhookDeleted: 'Webhook sildi',
348
+ apiKeyCreated: 'API anahtarı oluşturdu',
349
+ apiKeyRevoked: 'API anahtarı iptal etti',
350
+ userInvited: 'Kullanıcı davet etti',
351
+ inviteResent: 'Daveti tekrar gönderdi',
352
+ roleChanged: 'Rol değiştirdi',
353
+ userDeactivated: 'Kullanıcıyı devre dışı bıraktı',
354
+ userReactivated: 'Kullanıcıyı yeniden etkinleştirdi',
355
+ ownershipTransferred: 'Sahipliği devretti',
356
+ },
357
+ roleChange: '{{from}} → {{to}}',
358
+ },
359
+ danger: {
360
+ title: 'Tehlikeli bölge',
361
+ description: 'Geri alınamaz işlemler. Bu sayfayı yalnızca Sahip görebilir.',
362
+ transfer: {
363
+ title: 'Sahipliği devret',
364
+ description: 'Başka bir aktif üyeyi Sahip yapın. Siz Yönetici olursunuz ve bu sayfaya erişiminizi kaybedersiniz.',
365
+ select: 'Yeni sahip',
366
+ placeholder: 'Bir üye seçin',
367
+ button: 'Sahipliği devret',
368
+ confirmTitle: 'Sahiplik {{name}} kişisine devredilsin mi?',
369
+ confirmDescription: '{{name}}, {{company}} şirketinin Sahibi olacak. Siz Yönetici olacaksınız. Bunu yalnızca yeni Sahip geri alabilir.',
370
+ done: '{{name}} artık Sahip',
371
+ noCandidates: 'Önce bir üye davet edin veya yeniden etkinleştirin.',
372
+ },
373
+ delete: {
374
+ title: 'Şirketi sil',
375
+ description: '{{company}} şirketini, kullanıcılarını, ayarlarını ve tüm verilerini kalıcı olarak silin. Bu işlem geri alınamaz.',
376
+ button: 'Şirketi sil',
377
+ confirmTitle: '{{company}} kalıcı olarak silinsin mi?',
378
+ confirmDescription: 'Tüm kullanıcılar erişimini kaybeder ve her kayıt silinir. Bu demoda, yerel olarak saklanan tüm veriler temizlenir.',
379
+ done: 'Şirket silindi',
380
+ },
381
+ },
382
+ }
383
+
384
+ export default company
@@ -0,0 +1,50 @@
1
+ import type { Messages } from '@/core/i18n/types'
2
+ import type en from '../en/dashboard'
3
+
4
+ const dashboard: Messages<typeof en> = {
5
+ readyDescription: 'Paneliniz hazır.',
6
+ noModules: {
7
+ title: 'Henüz burada bir şey yok',
8
+ description: 'Bu panele eklediğiniz özellikler burada ve kenar çubuğunda görünecek.',
9
+ },
10
+ greeting: {
11
+ morning: 'Günaydın, {{name}}',
12
+ afternoon: 'İyi günler, {{name}}',
13
+ evening: 'İyi akşamlar, {{name}}',
14
+ fallbackName: 'merhaba',
15
+ },
16
+ description: 'Çalışma alanınızda olup bitenler.',
17
+ range: {
18
+ label: 'Tarih aralığı',
19
+ '7d': '7G',
20
+ '30d': '30G',
21
+ '90d': '90G',
22
+ last: 'son {{count}} gün',
23
+ },
24
+ kpis: {
25
+ revenue: 'Gelir',
26
+ orders: 'Siparişler',
27
+ customers: 'Yeni müşteriler',
28
+ conversion: 'Dönüşüm',
29
+ },
30
+ panels: {
31
+ revenue: 'Gelir',
32
+ quickActions: 'Hızlı işlemler',
33
+ activity: 'Son etkinlikler',
34
+ },
35
+ quickActions: {
36
+ appearance: 'Tercihler',
37
+ appearanceDescription: 'Tema, dil ve biçimler',
38
+ },
39
+ activity: {
40
+ system: 'Sistem',
41
+ payments: 'Ödemeler',
42
+ orderPlaced: '<b>{{actor}}</b>, <b>{{target}}</b> siparişini verdi',
43
+ lowStock: '<b>{{actor}}</b>, <b>{{target}}</b> için düşük stok uyarısı verdi',
44
+ updated: '<b>{{actor}}</b>, <b>{{target}}</b> ürününü güncelledi',
45
+ refund: '<b>{{actor}}</b>, <b>{{target}}</b> için iade yaptı',
46
+ published: '<b>{{actor}}</b>, <b>{{target}}</b> ürününü yayınladı',
47
+ },
48
+ }
49
+
50
+ export default dashboard
@@ -0,0 +1,22 @@
1
+ import type { Messages } from '@/core/i18n/types'
2
+ import type en from '../en/errors'
3
+
4
+ const errors: Messages<typeof en> = {
5
+ notFound: {
6
+ code: 'Hata 404',
7
+ title: 'Sayfa bulunamadı',
8
+ description: 'Aradığınız sayfa mevcut değil veya taşınmış.',
9
+ },
10
+ unexpected: {
11
+ code: 'Hata',
12
+ title: 'Bir şeyler ters gitti',
13
+ description: 'Beklenmeyen bir hata oluştu.',
14
+ },
15
+ noAccess: {
16
+ code: 'Hata 403',
17
+ title: 'Erişim yok',
18
+ description: 'Rolünüz bu sayfayı açma iznine sahip değil. Erişime ihtiyacınız varsa bir yöneticiye başvurun.',
19
+ },
20
+ }
21
+
22
+ export default errors
@@ -0,0 +1,47 @@
1
+ import type { Messages } from '@/core/i18n/types'
2
+ import type en from '../en/notifications'
3
+
4
+ const tr: Messages<typeof en> = {
5
+ title: 'Bildirimler',
6
+ bell: 'Bildirimler',
7
+ bellUnread_one: 'Bildirimler, {{count}} okunmamış',
8
+ bellUnread_other: 'Bildirimler, {{count}} okunmamış',
9
+ markAllRead: 'Tümünü okundu işaretle',
10
+ settings: 'Bildirim ayarları',
11
+ tabs: { all: 'Tümü', unread: 'Okunmamış' },
12
+ groups: { today: 'Bugün', earlier: 'Daha önce' },
13
+ unread: 'Okunmadı',
14
+ loadFailed: 'Bildirimler yüklenemedi',
15
+ empty: {
16
+ all: { title: 'Henüz bildirim yok', description: 'Ekibiniz, kataloğunuz ve hesabınızla ilgili güncellemeler burada görünür.' },
17
+ unread: { title: 'Hepsini okudunuz', description: 'Okunmamış bildiriminiz yok.' },
18
+ },
19
+ types: { info: 'Bilgi', success: 'Başarılı', warning: 'Uyarı', error: 'Önemli' },
20
+ templates: {
21
+ userInvited: { title: 'Yeni kullanıcı davet edildi', body: '{{name}}, {{email}} adresini {{role}} rolüyle davet etti.' },
22
+ userJoined: { title: 'Yeni ekip üyesi', body: '{{name}} daveti kabul etti ve şirkete katıldı.' },
23
+ roleChangedOther: { title: 'Rol değişti', body: '{{name}} artık {{role}} rolünde.' },
24
+ roleChangedYou: { title: 'Rolünüz değişti', body: '{{name}} rolünüzü {{role}} olarak değiştirdi.' },
25
+ lowStock: {
26
+ title: 'Düşük stok',
27
+ body_one: '{{count}} aktif ürünün stoğu azalıyor.',
28
+ body_other: '{{count}} aktif ürünün stoğu azalıyor.',
29
+ },
30
+ productUpdated: {
31
+ title: 'Ürünler güncellendi',
32
+ body_one: '{{name}} {{count}} ürünü güncelledi.',
33
+ body_other: '{{name}} {{count}} ürünü güncelledi.',
34
+ },
35
+ settingsChanged: { title: 'Şirket ayarları değişti', body: '{{name}} genel şirket ayarlarını güncelledi.' },
36
+ brandingChanged: { title: 'Marka güncellendi', body: '{{name}} şirket logosunu ve marka rengini değiştirdi.' },
37
+ securityAlert: {
38
+ title: 'Yeni oturum açma algılandı',
39
+ body: '{{location}} yakınında {{os}} üzerinde {{browser}}. Siz değilseniz şifrenizi değiştirin.',
40
+ },
41
+ passwordChanged: { title: 'Şifre değiştirildi', body: 'Şifreniz değiştirildi. Siz değilseniz bir yöneticiyle iletişime geçin.' },
42
+ weeklySummary: { title: 'Haftalık özetiniz', body: 'Geçen hafta {{orders}} sipariş ve {{revenue}} gelir.' },
43
+ announcement: { title: 'Yenilikler', body: 'Bildirimler geldi: ekip, katalog ve güvenlik güncellemeleri tek bir yerde.' },
44
+ },
45
+ }
46
+
47
+ export default tr
@@ -0,0 +1,29 @@
1
+ import type { Messages } from '@/core/i18n/types'
2
+ import type en from '../en/settings'
3
+
4
+ const settings: Messages<typeof en> = {
5
+ title: 'Ayarlar',
6
+ navLabel: 'Ayar bölümleri',
7
+ groups: {
8
+ account: 'Hesabım',
9
+ company: 'Şirket',
10
+ },
11
+ nav: {
12
+ profile: 'Profil',
13
+ security: 'Güvenlik',
14
+ notifications: 'Bildirimler',
15
+ preferences: 'Tercihler',
16
+ company: 'Şirket',
17
+ general: 'Genel',
18
+ branding: 'Marka',
19
+ users: 'Kullanıcılar',
20
+ roles: 'Roller ve izinler',
21
+ securityPolicies: 'Güvenlik politikaları',
22
+ modules: 'Modüller',
23
+ integrations: 'Entegrasyonlar',
24
+ auditLog: 'Denetim kaydı',
25
+ dangerZone: 'Tehlikeli bölge',
26
+ },
27
+ }
28
+
29
+ export default settings
@@ -0,0 +1,49 @@
1
+ import type { Messages } from '@/core/i18n/types'
2
+ import type en from '../en/setup'
3
+
4
+ const tr: Messages<typeof en> = {
5
+ title: 'Panelinizi kurun',
6
+ progress: 'Adım {{step}} / {{total}}',
7
+ next: 'Devam et',
8
+ finish: 'Kurulumu tamamla',
9
+ failed: 'Kurulum tamamlanamadı',
10
+ insecure: 'Hesap oluşturmak için paneli https veya localhost üzerinden açın.',
11
+ localNote: 'Henüz bir sunucu bağlı değil: bu hesap ve verileri yalnızca bu tarayıcıda saklanır. Yayına almadan önce bir sunucu bağlayın.',
12
+ company: {
13
+ title: 'Şirketiniz',
14
+ description: 'Bu ad panelin her yerinde görünür. Her şeyi daha sonra Ayarlar’dan değiştirebilirsiniz.',
15
+ name: 'Şirket adı',
16
+ language: 'Dil',
17
+ timeZone: 'Saat dilimi',
18
+ currency: 'Para birimi',
19
+ },
20
+ admin: {
21
+ title: 'Yönetici hesabınız',
22
+ description: 'Panele tam erişimi olan Sahip siz olacaksınız.',
23
+ firstName: 'Ad',
24
+ lastName: 'Soyad',
25
+ email: 'E-posta',
26
+ password: 'Şifre',
27
+ confirmPassword: 'Şifreyi doğrulayın',
28
+ passwordWeak: 'Bu şifre aşağıdaki kuralları karşılamıyor',
29
+ passwordMismatch: 'Şifreler eşleşmiyor',
30
+ },
31
+ branding: {
32
+ title: 'Görünümünüz',
33
+ description: 'Bir vurgu rengi seçin ve logo ekleyin. Logo isteğe bağlıdır.',
34
+ color: 'Vurgu rengi',
35
+ logo: 'Logo',
36
+ },
37
+ review: {
38
+ title: 'Bilgileri kontrol edin',
39
+ description: 'Her şey doğru mu?',
40
+ admin: 'Sahip',
41
+ },
42
+ done: {
43
+ title: 'Her şey hazır',
44
+ description: '{{name}} kullanıma hazır.',
45
+ open: 'Paneli aç',
46
+ },
47
+ }
48
+
49
+ export default tr
@@ -0,0 +1,16 @@
1
+ import { StrictMode } from 'react'
2
+ import { createRoot } from 'react-dom/client'
3
+ import { RouterProvider } from 'react-router/dom'
4
+
5
+ import './index.css'
6
+ import '@/core/i18n/i18n'
7
+ import { Providers } from './providers'
8
+ import { router } from './router'
9
+
10
+ createRoot(document.getElementById('root')!).render(
11
+ <StrictMode>
12
+ <Providers>
13
+ <RouterProvider router={router} />
14
+ </Providers>
15
+ </StrictMode>,
16
+ )
@@ -0,0 +1,10 @@
1
+ // fp:locale-imports
2
+
3
+ /** Translations owned by modules; each key is the module's namespace. */
4
+ export const moduleLocalesEn = {
5
+ // fp:locale-en
6
+ }
7
+
8
+ export const moduleLocalesTr: typeof moduleLocalesEn = {
9
+ // fp:locale-tr
10
+ }
@@ -0,0 +1,17 @@
1
+ import { appConfig } from '@/app.config'
2
+ import type { AppModule } from '@/core/modules/types'
3
+ // fp:module-imports
4
+
5
+ /**
6
+ * Every module in this panel. `npm run new-module` registers new ones here and
7
+ * enables them in src/app.config.ts → `modules`.
8
+ */
9
+ export const moduleRegistry = {
10
+ // fp:module-registry
11
+ } satisfies Record<string, AppModule>
12
+
13
+ export type ModuleId = keyof typeof moduleRegistry
14
+
15
+ export const enabledModules: AppModule[] = (Object.keys(moduleRegistry) as ModuleId[])
16
+ .filter((id) => appConfig.modules[id])
17
+ .map((id) => moduleRegistry[id])