super-svelte-skeleton 0.0.3

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 (82) hide show
  1. package/.env.example +17 -0
  2. package/.github/workflows/ninja_i18n.yml +23 -0
  3. package/.prettierignore +9 -0
  4. package/.prettierrc +12 -0
  5. package/.vscode/extensions.json +5 -0
  6. package/.vscode/launch.json +15 -0
  7. package/.vscode/settings.json +30 -0
  8. package/README.md +237 -0
  9. package/_gitignore +27 -0
  10. package/eslint.config.js +40 -0
  11. package/messages/ar.json +70 -0
  12. package/messages/en.json +70 -0
  13. package/messages/es.json +70 -0
  14. package/package.json +54 -0
  15. package/project.inlang/settings.json +15 -0
  16. package/src/app.css +8 -0
  17. package/src/app.d.ts +20 -0
  18. package/src/app.html +40 -0
  19. package/src/auto-imports.d.ts +35 -0
  20. package/src/hooks.client.ts +17 -0
  21. package/src/hooks.server.ts +73 -0
  22. package/src/hooks.ts +15 -0
  23. package/src/lib/entities/auth/api/endpoints.ts +11 -0
  24. package/src/lib/entities/auth/api/service.ts +35 -0
  25. package/src/lib/entities/auth/index.ts +9 -0
  26. package/src/lib/entities/auth/store.svelte.ts +50 -0
  27. package/src/lib/entities/auth/types.ts +33 -0
  28. package/src/lib/entities/user/api/endpoints.ts +6 -0
  29. package/src/lib/entities/user/api/service.ts +10 -0
  30. package/src/lib/entities/user/index.ts +2 -0
  31. package/src/lib/entities/user/types.ts +18 -0
  32. package/src/lib/features/theme-editor/constants.ts +33 -0
  33. package/src/lib/features/theme-editor/index.ts +3 -0
  34. package/src/lib/features/theme-editor/types.ts +10 -0
  35. package/src/lib/features/theme-editor/ui/CSSOutput.svelte +17 -0
  36. package/src/lib/features/theme-editor/ui/ColorCard.svelte +66 -0
  37. package/src/lib/features/theme-editor/ui/ThemeEditorWidget.svelte +319 -0
  38. package/src/lib/features/theme-editor/ui/ThemePreview.svelte +121 -0
  39. package/src/lib/features/theme-editor/ui/TypographySettings.svelte +73 -0
  40. package/src/lib/features/theme-editor/utils.ts +10 -0
  41. package/src/lib/shared/api/client.ts +47 -0
  42. package/src/lib/shared/api/index.ts +3 -0
  43. package/src/lib/shared/api/types.ts +25 -0
  44. package/src/lib/shared/config/api.ts +1 -0
  45. package/src/lib/shared/config/index.ts +2 -0
  46. package/src/lib/shared/config/routes.ts +18 -0
  47. package/src/lib/shared/i18n/index.ts +1 -0
  48. package/src/lib/shared/index.ts +2 -0
  49. package/src/lib/tailwind.config.ts +28 -0
  50. package/src/lib/widgets/topbar/Topbar.svelte +122 -0
  51. package/src/lib/widgets/topbar/constants.ts +16 -0
  52. package/src/lib/widgets/topbar/index.ts +2 -0
  53. package/src/params/integer.ts +5 -0
  54. package/src/routes/(app)/(admin)/+layout.server.ts +14 -0
  55. package/src/routes/(app)/(admin)/admin/+page.svelte +101 -0
  56. package/src/routes/(app)/+layout.server.ts +9 -0
  57. package/src/routes/(app)/+layout.svelte +12 -0
  58. package/src/routes/(app)/settings/+page.svelte +48 -0
  59. package/src/routes/(app)/theme/+page.svelte +5 -0
  60. package/src/routes/(auth)/forgot-password/+page.svelte +83 -0
  61. package/src/routes/(auth)/login/+page.server.ts +66 -0
  62. package/src/routes/(auth)/login/+page.svelte +156 -0
  63. package/src/routes/(auth)/logout/+page.server.ts +16 -0
  64. package/src/routes/(auth)/register/+page.svelte +167 -0
  65. package/src/routes/(auth)/reset-password/+page.svelte +127 -0
  66. package/src/routes/+error.svelte +95 -0
  67. package/src/routes/+layout.svelte +36 -0
  68. package/src/routes/+layout.ts +24 -0
  69. package/src/routes/+page.svelte +192 -0
  70. package/src/routes/+page.ts +3 -0
  71. package/static/config/config.local.json +3 -0
  72. package/static/config/config.prod.json +3 -0
  73. package/static/favicon.svg +1 -0
  74. package/static/logo.svg +7 -0
  75. package/static/profile.avif +0 -0
  76. package/static/smile.jpg +0 -0
  77. package/static/styles/theme-dark.css +30 -0
  78. package/static/styles/theme-light.css +28 -0
  79. package/stats.html +4950 -0
  80. package/svelte.config.js +78 -0
  81. package/tsconfig.json +46 -0
  82. package/vite.config.ts +51 -0
package/.env.example ADDED
@@ -0,0 +1,17 @@
1
+ # =========================================================================
2
+ # SVELTEKIT ENVIRONMENT CONFIGURATION (.env)
3
+ # =========================================================================
4
+ # RULES FOR FORMATTING:
5
+ # 1. NO SPACES around the '=' sign (e.g., KEY=VALUE not KEY = VALUE).
6
+ # 2. USE QUOTES ("") if your value contains spaces (e.g., NAME="My App").
7
+ # 3. PUBLIC VARIABLES: Must start with 'PUBLIC_' (Available to browser & server).
8
+ # 4. PRIVATE VARIABLES: Do NOT start with 'PUBLIC_' (Available ONLY to server).
9
+ # 5. RESTART: You MUST stop and restart 'npm run dev' after editing .env.
10
+ # =========================================================================
11
+
12
+ # --- 1. PUBLIC (Accessible by browser and server) ---
13
+ PUBLIC_SITE_NAME="My Svelte 5 App"
14
+ PUBLIC_SITE_DESCRIPTION="A high-performance SvelteKit application."
15
+ PUBLIC_API_URL="https://api.myapp.com"
16
+ PUBLIC_CONFIG_ENV="local"
17
+ PUBLIC_BASE_PATH="/app"
@@ -0,0 +1,23 @@
1
+
2
+ name: Ninja i18n action
3
+
4
+ on: pull_request_target
5
+
6
+ # explicitly configure permissions, in case your GITHUB_TOKEN workflow permissions are set to read-only in repository settings
7
+ permissions:
8
+ pull-requests: write # Necessary to comment on PRs
9
+ issues: read # Necessary to read issue comments
10
+ contents: read # Necessary to access the repo content
11
+
12
+ jobs:
13
+ ninja-i18n:
14
+ name: Ninja i18n - GitHub Lint Action
15
+ runs-on: ubuntu-latest
16
+
17
+ steps:
18
+ - name: Run Ninja i18n
19
+ # @main ensures that the latest version of the action is used
20
+ uses: opral/ninja-i18n-action@main
21
+ env:
22
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
23
+
@@ -0,0 +1,9 @@
1
+ # Package Managers
2
+ package-lock.json
3
+ pnpm-lock.yaml
4
+ yarn.lock
5
+ bun.lock
6
+ bun.lockb
7
+
8
+ # Miscellaneous
9
+ /static/
package/.prettierrc ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "plugins": [
3
+ "prettier-plugin-svelte",
4
+ "prettier-plugin-tailwindcss"
5
+ ],
6
+
7
+ "semi": true,
8
+ "singleQuote": true,
9
+ "tabWidth": 4,
10
+ "useTabs": true,
11
+ "printWidth": 100
12
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "recommendations": [
3
+ "inlang.vs-code-extension"
4
+ ]
5
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "version": "0.2.0",
3
+ "configurations": [
4
+ {
5
+ "name": "SvelteKit Debug",
6
+ "type": "node",
7
+ "request": "launch",
8
+ "program": "${workspaceFolder}/node_modules/vite/bin/vite.js",
9
+ "args": ["dev"],
10
+ "cwd": "${workspaceFolder}",
11
+ "sourceMaps": true,
12
+ "skipFiles": ["<node_internals>/**"]
13
+ }
14
+ ]
15
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "editor.formatOnSave": true,
3
+
4
+ "[svelte]": {
5
+ "editor.defaultFormatter": "svelte.svelte-vscode"
6
+ },
7
+
8
+ "[typescript]": {
9
+ "editor.defaultFormatter": "TypeScriptTeam.native-preview"
10
+ },
11
+
12
+ "[javascript]": {
13
+ "editor.defaultFormatter": "TypeScriptTeam.native-preview"
14
+ },
15
+
16
+ "[css]": {
17
+ "editor.defaultFormatter": "michelemelluso.code-beautifier"
18
+ },
19
+
20
+ "[scss]": {
21
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
22
+ },
23
+
24
+ "[html]": {
25
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
26
+ },
27
+
28
+ "prettier.requireConfig": true,
29
+ "css.lint.unknownAtRules": "ignore"
30
+ }
package/README.md ADDED
@@ -0,0 +1,237 @@
1
+ # SvelteKit 5 Enterprise Application
2
+
3
+ A production-ready, fully-featured SvelteKit 5 application with Runes, Tailwind CSS v3, TypeScript, multi-language support (i18n), dark/light theming, authentication, and more.
4
+
5
+ ## 🚀 Quick Start
6
+
7
+ ```bash
8
+ # 1. Install dependencies
9
+ npm install
10
+
11
+ # 2. Copy environment file
12
+ cp .env.example .env.local
13
+
14
+ # 3. Start dev server
15
+ npm run dev
16
+ ```
17
+
18
+ Open [http://localhost:5173](http://localhost:5173)
19
+
20
+ ---
21
+
22
+ ## 📁 Project Structure
23
+
24
+ ```
25
+ src/
26
+ ├── app.css # Global styles + Tailwind directives
27
+ ├── app.html # HTML template (theme init script)
28
+ ├── app.d.ts # TypeScript app-level declarations
29
+ ├── hooks.server.ts # Server hooks: auth, security headers, route protection
30
+ ├── hooks.client.ts # Client hooks: error handling
31
+
32
+ ├── lib/
33
+ │ ├── components/
34
+ │ │ ├── ui/ # Reusable UI components (Button, Input, IToast, etc.)
35
+ │ │ ├── layout/ # Layout components (Sidebar, Header)
36
+ │ │ └── forms/ # Form-specific components
37
+ │ │
38
+ │ ├── stores/ # Svelte 5 Runes stores (reactive state)
39
+ │ │ ├── auth.store.svelte.ts # User authentication state
40
+ │ │ ├── theme.store.svelte.ts # Dark/light mode + accent color
41
+ │ │ ├── i18n.store.svelte.ts # Language / translations
42
+ │ │ ├── toast.store.svelte.ts # IToast notifications
43
+ │ │ └── ui.store.svelte.ts # UI state (sidebar, modals)
44
+ │ │
45
+ │ ├── types/ # TypeScript types, interfaces, enums
46
+ │ │ ├── auth.types.ts
47
+ │ │ ├── api.types.ts
48
+ │ │ ├── ui.types.ts
49
+ │ │ └── user.types.ts
50
+ │ │
51
+ │ ├── constants/ # App-wide constants (routes, config)
52
+ │ ├── utils/ # Utility functions (cn, format, validation)
53
+ │ ├── services/ # API service layer
54
+ │ └── i18n/ # Translations (en, ar, fr, de, es)
55
+
56
+ └── routes/
57
+ ├── +layout.svelte # Root layout (theme init, toast container)
58
+ ├── +layout.ts # Root layout load
59
+ ├── +layout.server.ts # Root layout server load (auth)
60
+ ├── +page.svelte # Landing page
61
+ ├── +error.svelte # Global error page
62
+
63
+ ├── (auth)/ # Auth route group (login, register)
64
+ │ ├── +layout.svelte # Auth layout (centered card)
65
+ │ ├── login/
66
+ │ ├── register/
67
+ │ └── forgot-password/
68
+
69
+ ├── (app)/ # App route group (requires auth)
70
+ │ ├── +layout.svelte # App layout (sidebar + header)
71
+ │ ├── +layout.server.ts # Auth guard
72
+ │ ├── dashboard/
73
+ │ ├── profile/
74
+ │ └── settings/
75
+
76
+ └── api/ # API endpoints
77
+ └── auth/
78
+ └── logout/
79
+ ```
80
+
81
+ ---
82
+
83
+ ## ✨ Features
84
+
85
+ ### 🔐 Authentication
86
+ - Login with email + password
87
+ - Registration with validation
88
+ - Forgot password flow
89
+ - ISession cookies (HTTP-only, secure)
90
+ - Auto-redirect (protected routes → login, auth routes → dashboard)
91
+ - Role-based access control (RBAC) with `EUserRole` enum
92
+
93
+ ### 🌍 Internationalization (i18n)
94
+ - 5 languages: English, Arabic (RTL!), French, German, Spanish
95
+ - Auto-detects browser language
96
+ - Persists to `localStorage`
97
+ - RTL layout support (Arabic)
98
+ - Reactive via `i18nStore`
99
+
100
+ ### 🌙 Theming
101
+ - Light / Dark / System theme
102
+ - 4 accent colors: Blue, Purple, Green, Rose
103
+ - CSS custom properties (easy to extend)
104
+ - Persists to `localStorage`
105
+ - FOUC prevention script in `app.html`
106
+
107
+ ### 📦 State Management (Svelte 5 Runes)
108
+ - `$state` for reactive variables
109
+ - `$derived` for computed values
110
+ - `$effect` for side effects
111
+ - No external state library needed
112
+
113
+ ### 🛡️ Security
114
+ - CSRF protection (SvelteKit built-in)
115
+ - HTTP-only session cookies
116
+ - Security headers (X-Frame-Options, etc.)
117
+ - Input validation with Zod schemas
118
+ - Server-side auth guards
119
+
120
+ ### 📐 TypeScript
121
+ - Strict mode enabled
122
+ - Full type coverage
123
+ - Enums: `EUserRole`, `Theme`, `ESnackType`, `ColorVariant`, etc.
124
+ - Interfaces for all data shapes
125
+ - Zod schemas for runtime validation
126
+
127
+ ---
128
+
129
+ ## 🛠️ Available Scripts
130
+
131
+ | Command | Description |
132
+ |---------|-------------|
133
+ | `npm run dev` | Start development server |
134
+ | `npm run build` | Build for production |
135
+ | `npm run preview` | Preview production build |
136
+ | `npm run check` | TypeScript + Svelte checks |
137
+ | `npm run lint` | ESLint |
138
+ | `npm run format` | Prettier |
139
+
140
+ ---
141
+
142
+ ## 🔧 Adding New Pages
143
+
144
+ ### 1. Public page
145
+ ```
146
+ src/routes/about/+page.svelte
147
+ ```
148
+
149
+ ### 2. Protected page (requires login)
150
+ ```
151
+ src/routes/(app)/reports/+page.svelte
152
+ src/routes/(app)/reports/+page.server.ts
153
+ ```
154
+
155
+ ### 3. API endpoint
156
+ ```
157
+ src/routes/api/users/+server.ts
158
+ ```
159
+
160
+ ---
161
+
162
+ ## 🌐 Adding a New Language
163
+
164
+ 1. Create `src/lib/i18n/locales/de.ts` (copy from `en.ts`)
165
+ 2. Add translations
166
+ 3. Import in `src/lib/i18n/index.ts`:
167
+ ```ts
168
+ import de from './locales/de';
169
+ const locales = { en, ar, fr, de };
170
+ ```
171
+ 4. Add to `SUPPORTED_LANGUAGES` in `src/lib/constants/index.ts`
172
+
173
+ ---
174
+
175
+ ## 🎨 Changing Theme Colors
176
+
177
+ Edit `THEME_COLORS` in `src/lib/constants/index.ts` and add RGB values.
178
+ The settings page automatically shows all available colors.
179
+
180
+ ---
181
+
182
+ ## 🚀 Deployment
183
+
184
+ This app uses `@sveltejs/adapter-auto` which auto-detects:
185
+ - **Vercel** → serverless functions
186
+ - **Netlify** → edge functions
187
+ - **Node.js** → node server
188
+
189
+ For specific targets, replace `adapter-auto` with:
190
+ - `@sveltejs/adapter-node`
191
+ - `@sveltejs/adapter-vercel`
192
+ - `@sveltejs/adapter-netlify`
193
+ - `@sveltejs/adapter-static` (for SSG)
194
+
195
+ ---
196
+
197
+ ## 🔑 Environment Variables
198
+
199
+ | Variable | Description |
200
+ |----------|-------------|
201
+ | `PUBLIC_APP_NAME` | App display name |
202
+ | `PUBLIC_APP_URL` | App URL |
203
+ | `AUTH_SECRET` | Secret for session signing (min 32 chars) |
204
+
205
+ ---
206
+
207
+ ## 🏗️ Production Checklist
208
+
209
+ - [ ] Replace demo auth with real database
210
+ - [ ] Use JWT or DB-backed sessions instead of base64 cookies
211
+ - [ ] Set `AUTH_SECRET` to a strong random string
212
+ - [ ] Enable HTTPS
213
+ - [ ] Set up error tracking (Sentry, etc.)
214
+ - [ ] Add rate limiting to auth endpoints
215
+ - [ ] Configure proper CORS if needed
216
+ - [ ] Remove demo data from dashboard
217
+
218
+ ---
219
+
220
+ ## 📚 Prerender
221
+ 📝 Prerendering (SvelteKit)
222
+ SvelteKit can prerender routes, generating static HTML at build time.
223
+ export const prerender = true; // enable prerender
224
+ export const prerender = false; // disable prerender
225
+ export const prerender = 'auto'; // prerender if possible, otherwise SSR
226
+ A route can be prerendered only if all users receive the same content. Pages with actions, user‑specific data, or server‑only logic cannot be prerendered.
227
+
228
+ ## 🌍 Paraglide (i18n) — How It Works
229
+ Paraglide adds simple multilingual support to SvelteKit. When you run npx sv add paraglide, it automatically sets up everything needed for translations:
230
+ Creates src/lib/paraglide/ → contains the translation engine and helper functions.
231
+ Adds i18n runtime + server middleware → detects the user’s language on each request.
232
+ Updates app.html → adds %paraglide.lang% so the correct <html lang=""> is injected.
233
+ Configures hooks.server.ts → connects Paraglide to SvelteKit’s request pipeline.
234
+ Creates a translation project → where your en.json, ar.json, etc. live.
235
+ Installs required dependencies → so translations work on both server and client.
236
+ Workflow:
237
+ Add your messages → import t() in components → Paraglide auto‑detects the user’s language and shows the right text.
package/_gitignore ADDED
@@ -0,0 +1,27 @@
1
+ node_modules
2
+
3
+ # Output
4
+ .output
5
+ .vercel
6
+ .netlify
7
+ .wrangler
8
+ .svelte-kit
9
+ .claude
10
+ /build
11
+
12
+ # OS
13
+ .DS_Store
14
+ Thumbs.db
15
+
16
+ # Env
17
+ .env
18
+ .env.*
19
+ !.env.example
20
+ !.env.test
21
+
22
+ # Vite
23
+ vite.config.js.timestamp-*
24
+ vite.config.ts.timestamp-*
25
+ # Paraglide
26
+ src/lib/paraglide
27
+ project.inlang/cache/
@@ -0,0 +1,40 @@
1
+ import prettier from 'eslint-config-prettier';
2
+ import path from 'node:path';
3
+ import { includeIgnoreFile } from '@eslint/compat';
4
+ import js from '@eslint/js';
5
+ import svelte from 'eslint-plugin-svelte';
6
+ import { defineConfig } from 'eslint/config';
7
+ import globals from 'globals';
8
+ import ts from 'typescript-eslint';
9
+ import svelteConfig from './svelte.config.js';
10
+
11
+ const gitignorePath = path.resolve(import.meta.dirname, '.gitignore');
12
+
13
+ export default defineConfig(
14
+ includeIgnoreFile(gitignorePath),
15
+ js.configs.recommended,
16
+ ...ts.configs.recommended,
17
+ ...svelte.configs.recommended,
18
+ prettier,
19
+ ...svelte.configs.prettier,
20
+ {
21
+ languageOptions: { globals: { ...globals.browser, ...globals.node } },
22
+ rules: {
23
+ // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects.
24
+ // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors
25
+ 'no-undef': 'off',
26
+ '@typescript-eslint/no-explicit-any': 'off'
27
+ }
28
+ },
29
+ {
30
+ files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'],
31
+ languageOptions: {
32
+ parserOptions: {
33
+ projectService: true,
34
+ extraFileExtensions: ['.svelte'],
35
+ parser: ts.parser,
36
+ svelteConfig
37
+ }
38
+ }
39
+ }
40
+ );
@@ -0,0 +1,70 @@
1
+ {
2
+ "home_title": "مرحباً",
3
+ "home_description": "سجّل الدخول أو أنشئ حساباً للمتابعة",
4
+ "home_welcome": "مرحباً بك في التطبيق",
5
+ "home_subtitle": "يرجى تسجيل الدخول أو إنشاء حساب جديد للمتابعة.",
6
+ "home_login_btn": "تسجيل الدخول",
7
+ "home_register_btn": "إنشاء حساب",
8
+ "app_name": "AppName",
9
+ "app_tagline": "بناء أشياء مذهلة",
10
+ "theme_toggle": "تبديل المظهر",
11
+ "language_label": "اللغة",
12
+ "divider_text": "أو",
13
+ "language_hint": "اختر لغتك والمظهر المفضل لديك",
14
+ "footer_copyright": "جميع الحقوق محفوظة",
15
+ "hero_eyebrow": "أعمال أصلية مختارة",
16
+ "hero_stat1_value": "٢٬٤٠٠+",
17
+ "hero_stat1_label": "أعمال أصلية",
18
+ "hero_stat2_value": "٣٤٠",
19
+ "hero_stat2_label": "فنانون",
20
+ "hero_stat3_value": "٩٨٪",
21
+ "hero_stat3_label": "موثّقة",
22
+ "hero_featured_label": "عمل مميز",
23
+ "hero_artwork_title": "صمت الجبل",
24
+ "hero_price_from": "يبدأ من",
25
+ "hero_price": "٤٩٩$",
26
+ "hero_card1_title": "عمل أصلي",
27
+ "hero_card1_subtitle": "موقّع من الفنان",
28
+ "hero_card2_title": "إصدار محدود",
29
+ "hero_card2_subtitle": "٥٠ نسخة فقط",
30
+ "marquee_1": "أعمال أصلية",
31
+ "marquee_2": "إصدارات محدودة",
32
+ "marquee_3": "فن موثّق",
33
+ "marquee_4": "معرض مختار",
34
+ "register_title": "إنشاء حساب",
35
+ "register_subtitle": "انضم إلى آلاف محبي الفن اليوم",
36
+ "register_name_label": "الاسم الكامل",
37
+ "register_name_placeholder": "جين دو",
38
+ "register_email_label": "البريد الإلكتروني",
39
+ "register_email_placeholder": "you@example.com",
40
+ "register_password_label": "كلمة المرور",
41
+ "register_password_placeholder": "٨ أحرف على الأقل",
42
+ "register_confirm_label": "تأكيد كلمة المرور",
43
+ "register_confirm_placeholder": "أعد كتابة كلمة المرور",
44
+ "register_submit": "إنشاء حساب",
45
+ "register_have_account": "هل لديك حساب بالفعل؟",
46
+ "register_sign_in": "سجّل الدخول",
47
+
48
+ "login_title": "تسجيل الدخول",
49
+ "login_subtitle": "مرحباً بعودتك، سجّل دخولك إلى حسابك",
50
+ "login_forgot_password": "نسيت كلمة المرور؟",
51
+ "login_remember_me": "تذكّرني",
52
+ "login_submit": "تسجيل الدخول",
53
+ "login_no_account": "ليس لديك حساب؟",
54
+ "login_sign_up": "إنشاء حساب",
55
+
56
+ "forgot_title": "نسيت كلمة المرور",
57
+ "forgot_subtitle": "أدخل بريدك الإلكتروني وسنرسل لك رابط إعادة التعيين",
58
+ "forgot_submit": "إرسال رابط الإعادة",
59
+ "forgot_back": "العودة إلى تسجيل الدخول",
60
+ "forgot_sent": "راجع بريدك الوارد!",
61
+ "forgot_sent_hint": "لقد أرسلنا رابط إعادة تعيين كلمة المرور إلى بريدك الإلكتروني.",
62
+
63
+ "reset_title": "إعادة تعيين كلمة المرور",
64
+ "reset_subtitle": "أدخل كلمة المرور الجديدة أدناه",
65
+ "reset_new_label": "كلمة المرور الجديدة",
66
+ "reset_new_placeholder": "٨ أحرف على الأقل",
67
+ "reset_confirm_label": "تأكيد كلمة المرور",
68
+ "reset_confirm_placeholder": "أعد كتابة كلمة المرور",
69
+ "reset_submit": "إعادة تعيين كلمة المرور"
70
+ }
@@ -0,0 +1,70 @@
1
+ {
2
+ "home_title": "Welcome",
3
+ "home_description": "Login or register to continue",
4
+ "home_welcome": "Welcome to the App",
5
+ "home_subtitle": "Please login or create an account to continue.",
6
+ "home_login_btn": "Login",
7
+ "home_register_btn": "Register",
8
+ "app_name": "AppName",
9
+ "app_tagline": "Build amazing things",
10
+ "theme_toggle": "Toggle theme",
11
+ "language_label": "Language",
12
+ "divider_text": "or",
13
+ "language_hint": "Choose your preferred language and theme",
14
+ "footer_copyright": "All rights reserved",
15
+ "hero_eyebrow": "Curated Originals",
16
+ "hero_stat1_value": "2,400+",
17
+ "hero_stat1_label": "Originals",
18
+ "hero_stat2_value": "340",
19
+ "hero_stat2_label": "Artists",
20
+ "hero_stat3_value": "98%",
21
+ "hero_stat3_label": "Authenticated",
22
+ "hero_featured_label": "Featured Work",
23
+ "hero_artwork_title": "Mountain Silence",
24
+ "hero_price_from": "From",
25
+ "hero_price": "$499",
26
+ "hero_card1_title": "Original Work",
27
+ "hero_card1_subtitle": "Signed by Artist",
28
+ "hero_card2_title": "Limited Edition",
29
+ "hero_card2_subtitle": "Only 50 Prints",
30
+ "marquee_1": "Original Works",
31
+ "marquee_2": "Limited Editions",
32
+ "marquee_3": "Authenticated Art",
33
+ "marquee_4": "Curated Gallery",
34
+ "register_title": "Create Account",
35
+ "register_subtitle": "Join thousands of art lovers today",
36
+ "register_name_label": "Full Name",
37
+ "register_name_placeholder": "Jane Doe",
38
+ "register_email_label": "Email",
39
+ "register_email_placeholder": "you@example.com",
40
+ "register_password_label": "Password",
41
+ "register_password_placeholder": "Min. 8 characters",
42
+ "register_confirm_label": "Confirm Password",
43
+ "register_confirm_placeholder": "Repeat your password",
44
+ "register_submit": "Create Account",
45
+ "register_have_account": "Already have an account?",
46
+ "register_sign_in": "Sign in",
47
+
48
+ "login_title": "Sign In",
49
+ "login_subtitle": "Welcome back, sign in to your account",
50
+ "login_forgot_password": "Forgot password?",
51
+ "login_remember_me": "Remember me",
52
+ "login_submit": "Sign In",
53
+ "login_no_account": "Don't have an account?",
54
+ "login_sign_up": "Sign up",
55
+
56
+ "forgot_title": "Forgot Password",
57
+ "forgot_subtitle": "Enter your email and we'll send you a reset link",
58
+ "forgot_submit": "Send Reset Link",
59
+ "forgot_back": "Back to login",
60
+ "forgot_sent": "Check your inbox!",
61
+ "forgot_sent_hint": "We've sent a password reset link to your email.",
62
+
63
+ "reset_title": "Reset Password",
64
+ "reset_subtitle": "Enter your new password below",
65
+ "reset_new_label": "New Password",
66
+ "reset_new_placeholder": "Min. 8 characters",
67
+ "reset_confirm_label": "Confirm Password",
68
+ "reset_confirm_placeholder": "Repeat your password",
69
+ "reset_submit": "Reset Password"
70
+ }
@@ -0,0 +1,70 @@
1
+ {
2
+ "home_title": "Bienvenido",
3
+ "home_description": "Inicia sesión o regístrate para continuar",
4
+ "home_welcome": "Bienvenido a la aplicación",
5
+ "home_subtitle": "Por favor inicia sesión o crea una cuenta para continuar.",
6
+ "home_login_btn": "Iniciar sesión",
7
+ "home_register_btn": "Registrarse",
8
+ "app_name": "AppName",
9
+ "app_tagline": "Construye cosas increíbles",
10
+ "theme_toggle": "Cambiar tema",
11
+ "language_label": "Idioma",
12
+ "divider_text": "o",
13
+ "language_hint": "Elige tu idioma y tema preferidos",
14
+ "footer_copyright": "Todos los derechos reservados",
15
+ "hero_eyebrow": "Originales Seleccionados",
16
+ "hero_stat1_value": "2.400+",
17
+ "hero_stat1_label": "Originales",
18
+ "hero_stat2_value": "340",
19
+ "hero_stat2_label": "Artistas",
20
+ "hero_stat3_value": "98%",
21
+ "hero_stat3_label": "Autenticados",
22
+ "hero_featured_label": "Obra Destacada",
23
+ "hero_artwork_title": "Silencio de Montaña",
24
+ "hero_price_from": "Desde",
25
+ "hero_price": "$499",
26
+ "hero_card1_title": "Obra Original",
27
+ "hero_card1_subtitle": "Firmada por el Artista",
28
+ "hero_card2_title": "Edición Limitada",
29
+ "hero_card2_subtitle": "Solo 50 Copias",
30
+ "marquee_1": "Obras Originales",
31
+ "marquee_2": "Ediciones Limitadas",
32
+ "marquee_3": "Arte Autenticado",
33
+ "marquee_4": "Galería Curada",
34
+ "register_title": "Crear Cuenta",
35
+ "register_subtitle": "Únete a miles de amantes del arte hoy",
36
+ "register_name_label": "Nombre Completo",
37
+ "register_name_placeholder": "Jane Doe",
38
+ "register_email_label": "Correo Electrónico",
39
+ "register_email_placeholder": "tú@ejemplo.com",
40
+ "register_password_label": "Contraseña",
41
+ "register_password_placeholder": "Mín. 8 caracteres",
42
+ "register_confirm_label": "Confirmar Contraseña",
43
+ "register_confirm_placeholder": "Repite tu contraseña",
44
+ "register_submit": "Crear Cuenta",
45
+ "register_have_account": "¿Ya tienes una cuenta?",
46
+ "register_sign_in": "Inicia sesión",
47
+
48
+ "login_title": "Iniciar Sesión",
49
+ "login_subtitle": "Bienvenido de nuevo, inicia sesión en tu cuenta",
50
+ "login_forgot_password": "¿Olvidaste tu contraseña?",
51
+ "login_remember_me": "Recuérdame",
52
+ "login_submit": "Iniciar Sesión",
53
+ "login_no_account": "¿No tienes cuenta?",
54
+ "login_sign_up": "Regístrate",
55
+
56
+ "forgot_title": "Olvidé mi Contraseña",
57
+ "forgot_subtitle": "Ingresa tu correo y te enviaremos un enlace de restablecimiento",
58
+ "forgot_submit": "Enviar Enlace",
59
+ "forgot_back": "Volver al inicio de sesión",
60
+ "forgot_sent": "¡Revisa tu bandeja de entrada!",
61
+ "forgot_sent_hint": "Hemos enviado un enlace de restablecimiento a tu correo.",
62
+
63
+ "reset_title": "Restablecer Contraseña",
64
+ "reset_subtitle": "Ingresa tu nueva contraseña a continuación",
65
+ "reset_new_label": "Nueva Contraseña",
66
+ "reset_new_placeholder": "Mín. 8 caracteres",
67
+ "reset_confirm_label": "Confirmar Contraseña",
68
+ "reset_confirm_placeholder": "Repite tu contraseña",
69
+ "reset_submit": "Restablecer Contraseña"
70
+ }