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.
- package/.env.example +17 -0
- package/.github/workflows/ninja_i18n.yml +23 -0
- package/.prettierignore +9 -0
- package/.prettierrc +12 -0
- package/.vscode/extensions.json +5 -0
- package/.vscode/launch.json +15 -0
- package/.vscode/settings.json +30 -0
- package/README.md +237 -0
- package/_gitignore +27 -0
- package/eslint.config.js +40 -0
- package/messages/ar.json +70 -0
- package/messages/en.json +70 -0
- package/messages/es.json +70 -0
- package/package.json +54 -0
- package/project.inlang/settings.json +15 -0
- package/src/app.css +8 -0
- package/src/app.d.ts +20 -0
- package/src/app.html +40 -0
- package/src/auto-imports.d.ts +35 -0
- package/src/hooks.client.ts +17 -0
- package/src/hooks.server.ts +73 -0
- package/src/hooks.ts +15 -0
- package/src/lib/entities/auth/api/endpoints.ts +11 -0
- package/src/lib/entities/auth/api/service.ts +35 -0
- package/src/lib/entities/auth/index.ts +9 -0
- package/src/lib/entities/auth/store.svelte.ts +50 -0
- package/src/lib/entities/auth/types.ts +33 -0
- package/src/lib/entities/user/api/endpoints.ts +6 -0
- package/src/lib/entities/user/api/service.ts +10 -0
- package/src/lib/entities/user/index.ts +2 -0
- package/src/lib/entities/user/types.ts +18 -0
- package/src/lib/features/theme-editor/constants.ts +33 -0
- package/src/lib/features/theme-editor/index.ts +3 -0
- package/src/lib/features/theme-editor/types.ts +10 -0
- package/src/lib/features/theme-editor/ui/CSSOutput.svelte +17 -0
- package/src/lib/features/theme-editor/ui/ColorCard.svelte +66 -0
- package/src/lib/features/theme-editor/ui/ThemeEditorWidget.svelte +319 -0
- package/src/lib/features/theme-editor/ui/ThemePreview.svelte +121 -0
- package/src/lib/features/theme-editor/ui/TypographySettings.svelte +73 -0
- package/src/lib/features/theme-editor/utils.ts +10 -0
- package/src/lib/shared/api/client.ts +47 -0
- package/src/lib/shared/api/index.ts +3 -0
- package/src/lib/shared/api/types.ts +25 -0
- package/src/lib/shared/config/api.ts +1 -0
- package/src/lib/shared/config/index.ts +2 -0
- package/src/lib/shared/config/routes.ts +18 -0
- package/src/lib/shared/i18n/index.ts +1 -0
- package/src/lib/shared/index.ts +2 -0
- package/src/lib/tailwind.config.ts +28 -0
- package/src/lib/widgets/topbar/Topbar.svelte +122 -0
- package/src/lib/widgets/topbar/constants.ts +16 -0
- package/src/lib/widgets/topbar/index.ts +2 -0
- package/src/params/integer.ts +5 -0
- package/src/routes/(app)/(admin)/+layout.server.ts +14 -0
- package/src/routes/(app)/(admin)/admin/+page.svelte +101 -0
- package/src/routes/(app)/+layout.server.ts +9 -0
- package/src/routes/(app)/+layout.svelte +12 -0
- package/src/routes/(app)/settings/+page.svelte +48 -0
- package/src/routes/(app)/theme/+page.svelte +5 -0
- package/src/routes/(auth)/forgot-password/+page.svelte +83 -0
- package/src/routes/(auth)/login/+page.server.ts +66 -0
- package/src/routes/(auth)/login/+page.svelte +156 -0
- package/src/routes/(auth)/logout/+page.server.ts +16 -0
- package/src/routes/(auth)/register/+page.svelte +167 -0
- package/src/routes/(auth)/reset-password/+page.svelte +127 -0
- package/src/routes/+error.svelte +95 -0
- package/src/routes/+layout.svelte +36 -0
- package/src/routes/+layout.ts +24 -0
- package/src/routes/+page.svelte +192 -0
- package/src/routes/+page.ts +3 -0
- package/static/config/config.local.json +3 -0
- package/static/config/config.prod.json +3 -0
- package/static/favicon.svg +1 -0
- package/static/logo.svg +7 -0
- package/static/profile.avif +0 -0
- package/static/smile.jpg +0 -0
- package/static/styles/theme-dark.css +30 -0
- package/static/styles/theme-light.css +28 -0
- package/stats.html +4950 -0
- package/svelte.config.js +78 -0
- package/tsconfig.json +46 -0
- 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
|
+
|
package/.prettierignore
ADDED
package/.prettierrc
ADDED
|
@@ -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/
|
package/eslint.config.js
ADDED
|
@@ -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
|
+
);
|
package/messages/ar.json
ADDED
|
@@ -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
|
+
}
|
package/messages/en.json
ADDED
|
@@ -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
|
+
}
|
package/messages/es.json
ADDED
|
@@ -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
|
+
}
|