@rk-web/create 0.0.1 → 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/dist/create.d.ts +1 -1
- package/dist/create.d.ts.map +1 -1
- package/dist/create.js +59 -157
- package/dist/create.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -1
- package/dist/index.js.map +1 -1
- package/package.json +8 -11
- package/templates/minimal/.editorconfig +12 -0
- package/templates/minimal/.gitignore +9 -0
- package/templates/minimal/.prettierrc +8 -0
- package/templates/minimal/README.md +37 -0
- package/templates/minimal/config.json +2 -5
- package/templates/minimal/eslint.config.js +14 -0
- package/templates/minimal/package.json +29 -0
- package/templates/minimal/src/assets/styles/main.css +7 -3
- package/templates/minimal/src/components/footer.html +1 -1
- package/templates/minimal/src/layouts/base.html +3 -3
- package/templates/minimal/src/pages/about.html +7 -0
- package/templates/minimal/src/pages/index.html +4 -6
- package/templates/minimal/src/scripts/main.ts +1 -1
- package/templates/minimal/tsconfig.json +15 -0
- package/templates/minimal/vite.config.ts +45 -0
- package/templates/landing/config.json +0 -28
- package/templates/landing/src/assets/styles/main.css +0 -474
- package/templates/landing/src/components/cta.html +0 -13
- package/templates/landing/src/components/features.html +0 -17
- package/templates/landing/src/components/footer.html +0 -18
- package/templates/landing/src/components/header.html +0 -11
- package/templates/landing/src/components/hero.html +0 -26
- package/templates/landing/src/components/pricing.html +0 -28
- package/templates/landing/src/components/testimonials.html +0 -24
- package/templates/landing/src/data/landing.json +0 -93
- package/templates/landing/src/layouts/base.html +0 -22
- package/templates/landing/src/pages/index.html +0 -12
package/dist/create.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function createProject(
|
|
1
|
+
export declare function createProject(projectName: string, template: string): Promise<void>;
|
|
2
2
|
//# sourceMappingURL=create.d.ts.map
|
package/dist/create.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAUA,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBA+DxE"}
|
package/dist/create.js
CHANGED
|
@@ -1,179 +1,81 @@
|
|
|
1
|
-
import fs from 'fs
|
|
1
|
+
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { execSync } from 'node:child_process';
|
|
4
5
|
import pc from 'picocolors';
|
|
6
|
+
import prompts from 'prompts';
|
|
5
7
|
const __filename = fileURLToPath(import.meta.url);
|
|
6
8
|
const __dirname = path.dirname(__filename);
|
|
7
|
-
export async function createProject(
|
|
8
|
-
console.log(pc.blue(`\nСоздание проекта: ${pc.bold(
|
|
9
|
+
export async function createProject(projectName, template) {
|
|
10
|
+
console.log(pc.blue(`\nСоздание проекта: ${pc.bold(projectName)}`));
|
|
9
11
|
console.log(pc.blue(`Шаблон: ${pc.bold(template)}\n`));
|
|
10
|
-
const targetDir = path.resolve(process.cwd(),
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const files = await fs.readdir(targetDir);
|
|
12
|
+
const targetDir = path.resolve(process.cwd(), projectName);
|
|
13
|
+
if (fs.existsSync(targetDir)) {
|
|
14
|
+
const files = fs.readdirSync(targetDir);
|
|
14
15
|
if (files.length > 0) {
|
|
15
|
-
console.error(pc.red(`\nОшибка: Директория "${
|
|
16
|
+
console.error(pc.red(`\nОшибка: Директория "${projectName}" уже существует и не пуста`));
|
|
16
17
|
console.error(pc.gray('Удалите директорию или выберите другое имя'));
|
|
17
18
|
process.exit(1);
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
//
|
|
23
|
-
const templateDir =
|
|
24
|
-
if (!templateDir) {
|
|
21
|
+
// Копирование шаблона из templates/
|
|
22
|
+
// При работе из published пакета: __dirname = dist/ → templates в parent dir
|
|
23
|
+
// При работе из репозитория: __dirname = dist/ → templates в parent dir
|
|
24
|
+
const templateDir = path.resolve(__dirname, '../templates', template);
|
|
25
|
+
if (!fs.existsSync(templateDir)) {
|
|
25
26
|
console.error(pc.red(`\nОшибка: Шаблон "${template}" не найден`));
|
|
26
|
-
console.error(pc.gray(`Доступные шаблоны: minimal
|
|
27
|
+
console.error(pc.gray(`Доступные шаблоны: minimal`));
|
|
27
28
|
process.exit(1);
|
|
28
29
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
// Рекурсивное копирование
|
|
31
|
+
copyDirRecursive(templateDir, targetDir);
|
|
32
|
+
// Замена PROJECT_NAME в package.json
|
|
33
|
+
const pkgPath = path.join(targetDir, 'package.json');
|
|
34
|
+
if (fs.existsSync(pkgPath)) {
|
|
35
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
36
|
+
pkg.name = projectName;
|
|
37
|
+
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
|
|
38
|
+
}
|
|
39
|
+
console.log(pc.green('\n✓ Проект создан!\n'));
|
|
40
|
+
console.log(pc.cyan(` cd ${projectName}`));
|
|
41
|
+
console.log(pc.cyan(' npm install'));
|
|
42
|
+
console.log(pc.cyan(' npm run dev'));
|
|
43
|
+
console.log(pc.cyan(' npm run build # production сборка\n'));
|
|
44
|
+
// Автоматическая установка зависимостей
|
|
45
|
+
const { install } = await prompts({
|
|
46
|
+
type: 'confirm',
|
|
47
|
+
name: 'install',
|
|
48
|
+
message: 'Установить зависимости сейчас?',
|
|
49
|
+
initial: true
|
|
32
50
|
});
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
},
|
|
45
|
-
devDependencies: {
|
|
46
|
-
'@rk-web/core': 'latest',
|
|
47
|
-
vite: '^6.4.1'
|
|
51
|
+
if (install) {
|
|
52
|
+
console.log(pc.blue('\nУстановка зависимостей...'));
|
|
53
|
+
try {
|
|
54
|
+
execSync('npm install', { cwd: targetDir, stdio: 'inherit' });
|
|
55
|
+
console.log(pc.green('\n✓ Зависимости установлены!\n'));
|
|
56
|
+
console.log(pc.cyan(` cd ${projectName}`));
|
|
57
|
+
console.log(pc.cyan(' npm run dev\n'));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
console.error(pc.red('\nОшибка установки зависимостей'));
|
|
61
|
+
console.error(pc.gray(`Выполните вручную: cd ${projectName} && npm install`));
|
|
48
62
|
}
|
|
49
|
-
};
|
|
50
|
-
await fs.writeJson(path.join(targetDir, 'package.json'), packageJson, { spaces: 2 });
|
|
51
|
-
// Создание базового config.json если его нет
|
|
52
|
-
const configPath = path.join(targetDir, 'config.json');
|
|
53
|
-
if (!await fs.pathExists(configPath)) {
|
|
54
|
-
const configJson = {
|
|
55
|
-
site: {
|
|
56
|
-
title: name,
|
|
57
|
-
description: 'Описание сайта',
|
|
58
|
-
lang: 'ru',
|
|
59
|
-
url: 'https://example.com'
|
|
60
|
-
},
|
|
61
|
-
navigation: [
|
|
62
|
-
{ label: 'Главная', url: '/' }
|
|
63
|
-
],
|
|
64
|
-
footer: {
|
|
65
|
-
copyright: new Date().getFullYear().toString()
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
await fs.writeJson(configPath, configJson, { spaces: 2 });
|
|
69
|
-
}
|
|
70
|
-
// Создание vite.config.ts если его нет
|
|
71
|
-
const viteConfigPath = path.join(targetDir, 'vite.config.ts');
|
|
72
|
-
if (!await fs.pathExists(viteConfigPath)) {
|
|
73
|
-
const viteConfig = `import { defineConfig } from 'vite'
|
|
74
|
-
import { staticBuilder } from '@rk-web/core'
|
|
75
|
-
|
|
76
|
-
export default defineConfig({
|
|
77
|
-
plugins: [
|
|
78
|
-
staticBuilder({
|
|
79
|
-
template: {
|
|
80
|
-
includePath: 'src/components',
|
|
81
|
-
layoutPath: 'src/layouts',
|
|
82
|
-
dataPath: 'src/data',
|
|
83
|
-
configFile: 'config.json'
|
|
84
|
-
},
|
|
85
|
-
images: {
|
|
86
|
-
formats: ['avif', 'webp', 'jpg'],
|
|
87
|
-
quality: { avif: 50, webp: 80, jpg: 85 },
|
|
88
|
-
sizes: [320, 640, 960, 1280, 1920],
|
|
89
|
-
placeholder: 'blur',
|
|
90
|
-
lazyLoad: true,
|
|
91
|
-
decoding: 'async'
|
|
92
|
-
},
|
|
93
|
-
fonts: {
|
|
94
|
-
formats: ['woff2', 'woff'],
|
|
95
|
-
subsets: ['cyrillic', 'latin'],
|
|
96
|
-
preload: true,
|
|
97
|
-
display: 'swap'
|
|
98
|
-
},
|
|
99
|
-
seo: {
|
|
100
|
-
sitemap: true,
|
|
101
|
-
robots: true,
|
|
102
|
-
manifest: true,
|
|
103
|
-
rss: false,
|
|
104
|
-
ogImage: true
|
|
105
|
-
},
|
|
106
|
-
validate: {
|
|
107
|
-
html: true,
|
|
108
|
-
accessibility: true,
|
|
109
|
-
lighthouse: true
|
|
110
|
-
},
|
|
111
|
-
critical: {
|
|
112
|
-
enabled: true,
|
|
113
|
-
inline: true
|
|
114
|
-
}
|
|
115
|
-
})
|
|
116
|
-
]
|
|
117
|
-
})
|
|
118
|
-
`;
|
|
119
|
-
await fs.writeFile(viteConfigPath, viteConfig);
|
|
120
|
-
}
|
|
121
|
-
// Создание структуры директорий
|
|
122
|
-
const dirs = [
|
|
123
|
-
'src/pages',
|
|
124
|
-
'src/components',
|
|
125
|
-
'src/layouts',
|
|
126
|
-
'src/data',
|
|
127
|
-
'src/assets/images',
|
|
128
|
-
'src/assets/styles',
|
|
129
|
-
'src/assets/fonts',
|
|
130
|
-
'src/scripts',
|
|
131
|
-
'public/images',
|
|
132
|
-
'public/fonts'
|
|
133
|
-
];
|
|
134
|
-
for (const dir of dirs) {
|
|
135
|
-
await fs.ensureDir(path.join(targetDir, dir));
|
|
136
63
|
}
|
|
137
|
-
// Создание .gitignore
|
|
138
|
-
const gitignore = `# Dependencies
|
|
139
|
-
node_modules/
|
|
140
|
-
|
|
141
|
-
# Builds
|
|
142
|
-
dist/
|
|
143
|
-
|
|
144
|
-
# Environment
|
|
145
|
-
.env
|
|
146
|
-
.env.*
|
|
147
|
-
|
|
148
|
-
# IDE
|
|
149
|
-
.vscode/
|
|
150
|
-
.idea/
|
|
151
|
-
|
|
152
|
-
# OS
|
|
153
|
-
.DS_Store
|
|
154
|
-
Thumbs.db
|
|
155
|
-
|
|
156
|
-
# Cache
|
|
157
|
-
.cache/
|
|
158
|
-
.vite/
|
|
159
|
-
.sharp-cache/
|
|
160
|
-
`;
|
|
161
|
-
await fs.writeFile(path.join(targetDir, '.gitignore'), gitignore);
|
|
162
|
-
console.log(pc.green('\n✓ Проект успешно создан!\n'));
|
|
163
|
-
console.log(pc.cyan(` cd ${name}`));
|
|
164
|
-
console.log(pc.cyan(' npm install # или pnpm install / yarn install'));
|
|
165
|
-
console.log(pc.cyan(' npm run dev # запустить режим разработки\n'));
|
|
166
64
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
for (const
|
|
173
|
-
|
|
174
|
-
|
|
65
|
+
function copyDirRecursive(src, dest) {
|
|
66
|
+
if (!fs.existsSync(dest)) {
|
|
67
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
68
|
+
}
|
|
69
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
70
|
+
for (const entry of entries) {
|
|
71
|
+
const srcPath = path.join(src, entry.name);
|
|
72
|
+
const destPath = path.join(dest, entry.name);
|
|
73
|
+
if (entry.isDirectory()) {
|
|
74
|
+
copyDirRecursive(srcPath, destPath);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
fs.copyFileSync(srcPath, destPath);
|
|
175
78
|
}
|
|
176
79
|
}
|
|
177
|
-
return null;
|
|
178
80
|
}
|
|
179
81
|
//# sourceMappingURL=create.js.map
|
package/dist/create.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {};
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,31 @@
|
|
|
1
|
-
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import pc from 'picocolors';
|
|
3
|
+
import prompts from 'prompts';
|
|
4
|
+
import { createProject } from './create.js';
|
|
5
|
+
const program = new Command();
|
|
6
|
+
program
|
|
7
|
+
.name('create-my-static-builder')
|
|
8
|
+
.description(pc.bold('Создание нового проекта статического сайта'))
|
|
9
|
+
.version('0.0.1');
|
|
10
|
+
program
|
|
11
|
+
.argument('[project-name]', 'Имя проекта')
|
|
12
|
+
.option('-t, --template <name>', 'Шаблон (minimal)', 'minimal')
|
|
13
|
+
.action(async (projectName, options) => {
|
|
14
|
+
let name = projectName;
|
|
15
|
+
if (!name) {
|
|
16
|
+
const response = await prompts({
|
|
17
|
+
type: 'text',
|
|
18
|
+
name: 'name',
|
|
19
|
+
message: 'Введите имя проекта:',
|
|
20
|
+
initial: 'my-site'
|
|
21
|
+
});
|
|
22
|
+
name = response.name;
|
|
23
|
+
}
|
|
24
|
+
if (!name) {
|
|
25
|
+
console.error(pc.red('Имя проекта не указано'));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
await createProject(name, options.template);
|
|
29
|
+
});
|
|
30
|
+
program.parse();
|
|
2
31
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,0BAA0B,CAAC;KAChC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;KAClE,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,OAAO;KACJ,QAAQ,CAAC,gBAAgB,EAAE,aAAa,CAAC;KACzC,MAAM,CAAC,uBAAuB,EAAE,kBAAkB,EAAE,SAAS,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,WAA+B,EAAE,OAA6B,EAAE,EAAE;IAC/E,IAAI,IAAI,GAAG,WAAW,CAAA;IAEtB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;YAC7B,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,sBAAsB;YAC/B,OAAO,EAAE,SAAS;SACnB,CAAC,CAAA;QACF,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;IACtB,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAA;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;AAC7C,CAAC,CAAC,CAAA;AAEJ,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rk-web/create",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "CLI для создания новых проектов",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -20,11 +20,12 @@
|
|
|
20
20
|
"files": [
|
|
21
21
|
"dist",
|
|
22
22
|
"bin",
|
|
23
|
-
"templates"
|
|
23
|
+
"templates/minimal",
|
|
24
|
+
"templates/blog",
|
|
25
|
+
"templates/portfolio"
|
|
24
26
|
],
|
|
25
27
|
"scripts": {
|
|
26
|
-
"build": "
|
|
27
|
-
"copy:templates": "node ./scripts/copy-templates.mjs",
|
|
28
|
+
"build": "tsc",
|
|
28
29
|
"dev": "tsc --watch",
|
|
29
30
|
"lint": "eslint src --ext .ts",
|
|
30
31
|
"typecheck": "tsc --noEmit",
|
|
@@ -40,19 +41,15 @@
|
|
|
40
41
|
"dependencies": {
|
|
41
42
|
"commander": "^12.0.0",
|
|
42
43
|
"picocolors": "^1.0.0",
|
|
43
|
-
"prompts": "^2.4.2"
|
|
44
|
-
"fs-extra": "^11.2.0"
|
|
44
|
+
"prompts": "^2.4.2"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@types/node": "^20.11.0",
|
|
48
48
|
"@types/prompts": "^2.4.9",
|
|
49
|
-
"
|
|
50
|
-
"
|
|
49
|
+
"typescript": "^5.4.0",
|
|
50
|
+
"rimraf": "^6.0.0"
|
|
51
51
|
},
|
|
52
52
|
"engines": {
|
|
53
53
|
"node": ">=18.0.0"
|
|
54
|
-
},
|
|
55
|
-
"publishConfig": {
|
|
56
|
-
"access": "public"
|
|
57
54
|
}
|
|
58
55
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Мой сайт
|
|
2
|
+
|
|
3
|
+
Сайт создан на [@rk-web/core](https://github.com/RNKuchin/statik-builder)
|
|
4
|
+
|
|
5
|
+
## Команды
|
|
6
|
+
|
|
7
|
+
| Команда | Описание |
|
|
8
|
+
|---------|----------|
|
|
9
|
+
| `npm run dev` | Режим разработки |
|
|
10
|
+
| `npm run build` | Сборка production |
|
|
11
|
+
| `npm run preview` | Превью собранного |
|
|
12
|
+
| `npm run validate` | Валидация |
|
|
13
|
+
| `npm run format` | Форматирование кода |
|
|
14
|
+
| `npm run lint` | Линтинг |
|
|
15
|
+
|
|
16
|
+
## Структура
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
src/
|
|
20
|
+
├── pages/ # HTML страницы
|
|
21
|
+
├── layouts/ # Layout шаблоны
|
|
22
|
+
├── components/ # Компоненты (header, footer и тд)
|
|
23
|
+
├── data/ # JSON данные
|
|
24
|
+
├── assets/ # CSS, шрифты, изображения
|
|
25
|
+
│ ├── styles/
|
|
26
|
+
│ └── fonts/
|
|
27
|
+
└── scripts/ # TypeScript/JS скрипты
|
|
28
|
+
public/ # Статические файлы (копируются как есть)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Шаблонизатор
|
|
32
|
+
|
|
33
|
+
- `{{ site.title }}` — переменные из config.json
|
|
34
|
+
- `<!-- for: item in data.items -->` — циклы
|
|
35
|
+
- `<!-- if: condition -->` — условия
|
|
36
|
+
- `<!-- include: components/header.html -->` — компоненты
|
|
37
|
+
- `<!-- layout: base.html -->` — наследование
|
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
"description": "Описание моего сайта",
|
|
5
5
|
"lang": "ru",
|
|
6
6
|
"url": "https://example.com",
|
|
7
|
-
"author": "
|
|
8
|
-
"email": "dev@example.com"
|
|
7
|
+
"author": "Имя автора"
|
|
9
8
|
},
|
|
10
9
|
"seo": {
|
|
11
10
|
"ogImage": "images/og-default.jpg",
|
|
@@ -17,8 +16,6 @@
|
|
|
17
16
|
],
|
|
18
17
|
"footer": {
|
|
19
18
|
"copyright": "2024",
|
|
20
|
-
"links": [
|
|
21
|
-
{ "label": "Политика конфиденциальности", "url": "/privacy/" }
|
|
22
|
-
]
|
|
19
|
+
"links": []
|
|
23
20
|
}
|
|
24
21
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "PROJECT_NAME",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "vite",
|
|
8
|
+
"build": "vite build",
|
|
9
|
+
"preview": "vite preview",
|
|
10
|
+
"validate": "vite build --mode validate",
|
|
11
|
+
"lint": "eslint src",
|
|
12
|
+
"format": "prettier --write \"src/**/*.{html,css,ts,js}\"",
|
|
13
|
+
"typecheck": "tsc --noEmit"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@rk-web/core": "0.0.1",
|
|
17
|
+
"@rk-web/vite-plugin-html-template": "0.0.1",
|
|
18
|
+
"@rk-web/vite-plugin-image-optimizer": "0.0.1",
|
|
19
|
+
"@rk-web/vite-plugin-font-optimizer": "0.0.1",
|
|
20
|
+
"@rk-web/vite-plugin-seo": "0.0.1",
|
|
21
|
+
"@rk-web/vite-plugin-validate": "0.0.1",
|
|
22
|
+
"@rk-web/vite-plugin-critical": "0.0.1",
|
|
23
|
+
"@types/node": "^20.11.0",
|
|
24
|
+
"eslint": "^9.0.0",
|
|
25
|
+
"prettier": "^3.2.0",
|
|
26
|
+
"typescript": "^5.4.0",
|
|
27
|
+
"vite": "^6.0.0"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/* Минимальные стили */
|
|
2
1
|
* {
|
|
3
2
|
margin: 0;
|
|
4
3
|
padding: 0;
|
|
@@ -6,7 +5,7 @@
|
|
|
6
5
|
}
|
|
7
6
|
|
|
8
7
|
body {
|
|
9
|
-
font-family: -apple-system,
|
|
8
|
+
font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
|
|
10
9
|
line-height: 1.6;
|
|
11
10
|
color: #333;
|
|
12
11
|
max-width: 1200px;
|
|
@@ -27,7 +26,7 @@ nav {
|
|
|
27
26
|
|
|
28
27
|
nav a {
|
|
29
28
|
text-decoration: none;
|
|
30
|
-
color: #
|
|
29
|
+
color: #2563eb;
|
|
31
30
|
}
|
|
32
31
|
|
|
33
32
|
nav a:hover {
|
|
@@ -35,6 +34,7 @@ nav a:hover {
|
|
|
35
34
|
}
|
|
36
35
|
|
|
37
36
|
main {
|
|
37
|
+
min-height: 60vh;
|
|
38
38
|
padding: 2rem 0;
|
|
39
39
|
}
|
|
40
40
|
|
|
@@ -42,6 +42,10 @@ h1 {
|
|
|
42
42
|
margin-bottom: 1rem;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
.description {
|
|
46
|
+
color: #666;
|
|
47
|
+
}
|
|
48
|
+
|
|
45
49
|
footer {
|
|
46
50
|
padding: 2rem 0;
|
|
47
51
|
border-top: 1px solid #eee;
|
|
@@ -5,16 +5,16 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>{{ site.title }}</title>
|
|
7
7
|
<meta name="description" content="{{ site.description }}">
|
|
8
|
-
|
|
9
|
-
<!-- SEO -->
|
|
10
8
|
<meta property="og:title" content="{{ site.title }}">
|
|
11
9
|
<meta property="og:description" content="{{ site.description }}">
|
|
12
10
|
<meta property="og:image" content="{{ seo.ogImage }}">
|
|
13
11
|
<meta property="og:type" content="{{ seo.ogType }}">
|
|
14
12
|
</head>
|
|
15
13
|
<body>
|
|
14
|
+
<!-- include: components/header.html -->
|
|
15
|
+
|
|
16
16
|
<!-- slot: content -->
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
<!-- include: components/footer.html -->
|
|
19
19
|
</body>
|
|
20
20
|
</html>
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
<!-- layout:
|
|
1
|
+
<!-- layout: base.html -->
|
|
2
2
|
|
|
3
3
|
<!-- slot: content -->
|
|
4
4
|
<main>
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
<p>Это минимальный шаблон для @my-static-builder</p>
|
|
9
|
-
|
|
5
|
+
<h1>Добро пожаловать!</h1>
|
|
6
|
+
<p>Это ваш новый сайт на @rk-web/core</p>
|
|
7
|
+
|
|
10
8
|
<!-- if: site.description -->
|
|
11
9
|
<p class="description">{{ site.description }}</p>
|
|
12
10
|
<!-- endif -->
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
// Main script
|
|
1
|
+
// Main script — добавьте свой код сюда
|
|
2
2
|
console.log('Site loaded')
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "bundler",
|
|
6
|
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noUnusedLocals": true,
|
|
9
|
+
"noUnusedParameters": true,
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
"skipLibCheck": true,
|
|
12
|
+
"resolveJsonModule": true
|
|
13
|
+
},
|
|
14
|
+
"include": ["vite.config.ts", "src/**/*.ts"]
|
|
15
|
+
}
|