create-lupine 1.0.15 → 1.0.16
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/index.js +35 -6
- package/package.json +1 -1
- package/templates/common/AI_CONTEXT.md +5 -2
- package/templates/{cv-starter → lupine-template-cv-starter}/api/package.json +6 -6
- package/templates/{doc-starter/api/src → lupine-template-cv-starter/api}/resources/config_default.json +6 -6
- package/templates/{cv-starter → lupine-template-cv-starter}/lupine.json +6 -6
- package/templates/{doc-starter → lupine-template-cv-starter}/web/package.json +6 -6
- package/templates/{doc-starter → lupine-template-cv-starter}/web/src/client-env-keys.ts +5 -5
- package/templates/{doc-starter/web/github-pj-name → lupine-template-cv-starter/web/src/lupine-template-cv-starter}/404.html +8 -5
- package/templates/lupine-template-cv-starter/web/src/lupine-template-cv-starter/assets/og-image.png +0 -0
- package/templates/lupine-template-cv-starter/web/src/lupine-template-cv-starter/index.html +73 -0
- package/templates/lupine-template-cv-starter/web/src/lupine-template-cv-starter/index.tsx +38 -0
- package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/en/01-experience/index.html +20 -20
- package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/en/02-projects/index.html +28 -28
- package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/en/03-skills/index.html +18 -18
- package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/en/04-education/index.html +10 -10
- package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/en/index.html +20 -20
- package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/zh/01-experience/index.html +20 -20
- package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/zh/02-projects/index.html +28 -28
- package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/zh/03-skills/index.html +18 -18
- package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/zh/04-education/index.html +11 -11
- package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/zh/index.html +20 -20
- package/templates/{cv-starter → lupine-template-cv-starter}/web/src/styles/base-css.ts +15 -15
- package/templates/lupine-template-doc-starter/api/package.json +6 -0
- package/templates/{hello-world → lupine-template-doc-starter}/api/resources/config_default.json +6 -6
- package/templates/lupine-template-doc-starter/api/src/resources/config_default.json +6 -0
- package/templates/{doc-starter → lupine-template-doc-starter}/lupine.json +9 -4
- package/templates/lupine-template-doc-starter/web/package.json +6 -0
- package/templates/{cv-starter → lupine-template-doc-starter}/web/src/client-env-keys.ts +5 -5
- package/templates/lupine-template-doc-starter/web/src/lupine-template-doc-starter/404.html +38 -0
- package/templates/{cv-starter/web/src → lupine-template-doc-starter/web/src/lupine-template-doc-starter}/index.html +13 -2
- package/templates/lupine-template-doc-starter/web/src/lupine-template-doc-starter/index.tsx +38 -0
- package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/en/essentials/list.html +8 -8
- package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/en/guide/install.html +8 -8
- package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/en/guide/started.html +12 -12
- package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/markdown-config.ts +25 -25
- package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/zh/essentials/list.html +8 -8
- package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/zh/guide/install.html +8 -8
- package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/zh/guide/started.html +12 -12
- package/templates/{doc-starter → lupine-template-doc-starter}/web/src/styles/base-css.ts +15 -15
- package/templates/{cv-starter/web → lupine-template-responsive-starter/api}/package.json +1 -1
- package/templates/lupine-template-responsive-starter/lupine.json +33 -0
- package/templates/{doc-starter/api → lupine-template-responsive-starter/web}/package.json +1 -1
- package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/app-icons.ts +4 -0
- package/templates/{cv-starter/web/github-pj-name → lupine-template-responsive-starter/web/src/lupine-template-responsive-starter}/404.html +4 -4
- package/templates/lupine-template-responsive-starter/web/src/lupine-template-responsive-starter/assets/favicon.ico +0 -0
- package/templates/lupine-template-responsive-starter/web/src/lupine-template-responsive-starter/assets/og-image.png +0 -0
- package/templates/lupine-template-responsive-starter/web/src/lupine-template-responsive-starter/index.html +49 -0
- package/templates/lupine-template-responsive-starter/web/src/lupine-template-responsive-starter/index.tsx +35 -0
- package/templates/cv-starter/web/github-pj-name/index.tsx +0 -33
- package/templates/doc-starter/web/github-pj-name/index.tsx +0 -33
- package/templates/hello-world/web/src/index.html +0 -16
- package/templates/responsive-starter/api/package.json +0 -6
- package/templates/responsive-starter/api/resources/config_default.json +0 -6
- package/templates/responsive-starter/lupine.json +0 -23
- package/templates/responsive-starter/web/package.json +0 -6
- /package/templates/{cv-starter → lupine-template-cv-starter}/api/resources/install.sqlite.sql +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/api/src/index.ts +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/web/assets/favicon.ico +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/en/01-experience/index.md +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/en/02-projects/index.md +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/en/03-skills/index.md +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/en/04-education/index.md +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/en/index.md +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/index.md +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/zh/01-experience/index.md +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/zh/02-projects/index.md +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/zh/03-skills/index.md +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/zh/04-education/index.md +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/zh/index.md +0 -0
- /package/templates/{cv-starter/web/github-pj-name → lupine-template-cv-starter/web/src}/index.html +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/web/src/index.tsx +0 -0
- /package/templates/{cv-starter/web/github-pj-name → lupine-template-cv-starter/web/src/lupine-template-cv-starter}/assets/favicon.ico +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/index.html +0 -0
- /package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/markdown-config.ts +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/api/resources/install.sqlite.sql +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/api/src/index.ts +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/api/src/resources/install.sqlite.sql +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/assets/favicon.ico +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/en/essentials/index.md +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/en/essentials/list.md +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/en/guide/install.md +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/en/guide/started.md +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/en/index.md +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/index.md +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/zh/essentials/index.md +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/zh/essentials/list.md +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/zh/guide/install.md +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/zh/guide/started.md +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/zh/index.md +0 -0
- /package/templates/{doc-starter/web/github-pj-name → lupine-template-doc-starter/web/src}/index.html +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/src/index.tsx +0 -0
- /package/templates/{doc-starter/web/github-pj-name → lupine-template-doc-starter/web/src/lupine-template-doc-starter}/assets/favicon.ico +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/en/essentials/index.html +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/en/index.html +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/index.html +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/zh/essentials/index.html +0 -0
- /package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/zh/index.html +0 -0
- /package/templates/{hello-world → lupine-template-hello-world}/api/package.json +0 -0
- /package/templates/{cv-starter → lupine-template-hello-world}/api/resources/config_default.json +0 -0
- /package/templates/{hello-world → lupine-template-hello-world}/api/resources/install.sqlite.sql +0 -0
- /package/templates/{hello-world → lupine-template-hello-world}/api/src/index.ts +0 -0
- /package/templates/{hello-world → lupine-template-hello-world}/api/src/service/root-api.ts +0 -0
- /package/templates/{hello-world → lupine-template-hello-world}/lupine.json +0 -0
- /package/templates/{hello-world → lupine-template-hello-world}/web/assets/favicon.ico +0 -0
- /package/templates/{hello-world → lupine-template-hello-world}/web/package.json +0 -0
- /package/templates/{doc-starter → lupine-template-hello-world}/web/src/index.html +0 -0
- /package/templates/{hello-world → lupine-template-hello-world}/web/src/index.tsx +0 -0
- /package/templates/{hello-world → lupine-template-hello-world}/web/src/styles/app.css +0 -0
- /package/templates/{hello-world → lupine-template-hello-world}/web/src/styles/base-css.ts +0 -0
- /package/templates/{hello-world → lupine-template-hello-world}/web/src/styles/global.css +0 -0
- /package/templates/{hello-world → lupine-template-hello-world}/web/src/styles/theme.ts +0 -0
- /package/templates/{doc-starter → lupine-template-responsive-starter}/api/resources/config_default.json +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/api/resources/install.sqlite.sql +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/api/src/index.ts +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/api/src/service/root-api.ts +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/assets/favicon.ico +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/input-history-component.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/mine-about-page.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/mine-premium-page.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/mine-settings-page.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/mobile-top-search-menu.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/note-detail.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/note-edit.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/note-search-page.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/search-input.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/side-menu-content.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/frames/app-responsive-frame.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/index.html +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/index.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/pages/about-page.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/pages/finance-page.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/pages/home-page.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/pages/mine-page.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/pages/tools-page.tsx +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/services/local-notes-service.ts +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/services/mine-service.ts +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/styles/app.css +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/styles/base-css.ts +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/styles/global.css +0 -0
- /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/styles/theme.ts +0 -0
package/index.js
CHANGED
|
@@ -54,12 +54,14 @@ const cwd = process.cwd();
|
|
|
54
54
|
const TEMPLATES = [
|
|
55
55
|
{
|
|
56
56
|
name: 'hello-world',
|
|
57
|
+
dir: 'lupine-template-hello-world',
|
|
57
58
|
display: 'Hello World',
|
|
58
59
|
itemType: 'frontend',
|
|
59
60
|
color: green,
|
|
60
61
|
},
|
|
61
62
|
{
|
|
62
63
|
name: 'doc-starter',
|
|
64
|
+
dir: 'lupine-template-doc-starter',
|
|
63
65
|
display: 'Documentation Starter',
|
|
64
66
|
itemType: 'frontend',
|
|
65
67
|
color: green,
|
|
@@ -67,6 +69,7 @@ const TEMPLATES = [
|
|
|
67
69
|
},
|
|
68
70
|
{
|
|
69
71
|
name: 'cv-starter',
|
|
72
|
+
dir: 'lupine-template-cv-starter',
|
|
70
73
|
display: 'CV Starter',
|
|
71
74
|
itemType: 'frontend',
|
|
72
75
|
color: green,
|
|
@@ -74,7 +77,7 @@ const TEMPLATES = [
|
|
|
74
77
|
},
|
|
75
78
|
{
|
|
76
79
|
name: 'responsive-starter-tabs',
|
|
77
|
-
dir: 'responsive-starter',
|
|
80
|
+
dir: 'lupine-template-responsive-starter',
|
|
78
81
|
layout: 'tabs',
|
|
79
82
|
display: 'Responsive Starter (tabs)',
|
|
80
83
|
itemType: 'frontend',
|
|
@@ -82,7 +85,7 @@ const TEMPLATES = [
|
|
|
82
85
|
},
|
|
83
86
|
{
|
|
84
87
|
name: 'responsive-starter-sidemenu',
|
|
85
|
-
dir: 'responsive-starter',
|
|
88
|
+
dir: 'lupine-template-responsive-starter',
|
|
86
89
|
layout: 'sidemenu',
|
|
87
90
|
display: 'Responsive Starter (sidemenu)',
|
|
88
91
|
itemType: 'frontend',
|
|
@@ -174,16 +177,42 @@ async function init() {
|
|
|
174
177
|
const appName = path.basename(root);
|
|
175
178
|
const targetAppDir = path.join(appsDir, appName);
|
|
176
179
|
|
|
180
|
+
function replaceStr(filepath, fromToArr) {
|
|
181
|
+
let content = fs.readFileSync(filepath, 'utf-8');
|
|
182
|
+
for (const { from, to } of fromToArr) {
|
|
183
|
+
content = content.replace(new RegExp(from, 'g'), to);
|
|
184
|
+
}
|
|
185
|
+
fs.writeFileSync(filepath, content);
|
|
186
|
+
}
|
|
187
|
+
|
|
177
188
|
copyDir(templateDir, targetAppDir);
|
|
189
|
+
// if templateDir\web\src\appName exists, rename it to github-pj-name
|
|
190
|
+
const githubName = path.join(targetAppDir, `web/src/${templateObj?.dir}`);
|
|
191
|
+
if (templateObj?.dir && fs.existsSync(githubName)) {
|
|
192
|
+
fs.renameSync(githubName, path.join(targetAppDir, 'web/src/github-pj-name'));
|
|
193
|
+
replaceStr(path.join(targetAppDir, 'web/src/github-pj-name/index.tsx'), [
|
|
194
|
+
{ from: `/${templateObj?.dir}`, to: '/github-pj-name' },
|
|
195
|
+
{ from: `${templateObj?.dir}/`, to: 'github-pj-name/' },
|
|
196
|
+
]);
|
|
197
|
+
replaceStr(path.join(targetAppDir, 'web/src/github-pj-name/index.html'), [
|
|
198
|
+
{ from: `/${templateObj?.dir}`, to: '/github-pj-name' },
|
|
199
|
+
{ from: `${templateObj?.dir}/`, to: 'github-pj-name/' },
|
|
200
|
+
]);
|
|
201
|
+
replaceStr(path.join(targetAppDir, 'web/src/github-pj-name/404.html'), [
|
|
202
|
+
{ from: `/${templateObj?.dir}`, to: '/github-pj-name' },
|
|
203
|
+
{ from: `${templateObj?.dir}/`, to: 'github-pj-name/' },
|
|
204
|
+
]);
|
|
205
|
+
replaceStr(path.join(targetAppDir, 'lupine.json'), [
|
|
206
|
+
{ from: `/${templateObj?.dir}`, to: '/github-pj-name' },
|
|
207
|
+
{ from: `${templateObj?.dir}/`, to: 'github-pj-name/' },
|
|
208
|
+
]);
|
|
209
|
+
}
|
|
178
210
|
|
|
179
211
|
if (templateObj?.layout) {
|
|
180
212
|
const frameFile = path.join(targetAppDir, 'web/src/frames/app-responsive-frame.tsx');
|
|
181
213
|
if (fs.existsSync(frameFile)) {
|
|
182
214
|
let content = fs.readFileSync(frameFile, 'utf-8');
|
|
183
|
-
content = content.replace(
|
|
184
|
-
/const DEFAULT_LAYOUT = '.*';/,
|
|
185
|
-
`const DEFAULT_LAYOUT = '${templateObj.layout}';`
|
|
186
|
-
);
|
|
215
|
+
content = content.replace(/const DEFAULT_LAYOUT = '.*';/, `const DEFAULT_LAYOUT = '${templateObj.layout}';`);
|
|
187
216
|
fs.writeFileSync(frameFile, content);
|
|
188
217
|
}
|
|
189
218
|
}
|
package/package.json
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
## 1. Core Philosophy & Reactivity
|
|
14
14
|
|
|
15
15
|
- **`useState` — React-style local state (small/simple components)**:
|
|
16
|
+
|
|
16
17
|
- Import: `import { useState } from 'lupine.components';`
|
|
17
18
|
- Syntax: `const [value, setValue] = useState(initial);` — calling `setValue(...)` rerenders the **entire** component.
|
|
18
19
|
- ✅ **Use when**: The component is small, state drives most of the UI, and the React-style patterns feel natural.
|
|
@@ -20,6 +21,7 @@
|
|
|
20
21
|
- **`ref.onLoad` + useState**: `onLoad` is called **only on initial mount** (not on rerenders). It's the right place for async data fetch that populates state.
|
|
21
22
|
|
|
22
23
|
- **`HtmlVar` — Surgical partial updates (large/complex components)**:
|
|
24
|
+
|
|
23
25
|
- Use `HtmlVar` to wrap dynamic sections (lists, conditional renderings, async content).
|
|
24
26
|
- **Pattern**: `const dom = new HtmlVar(initialContent);` → JSX `{dom.node}` → `dom.value = updatedContent`.
|
|
25
27
|
- ✅ **Use when**: Only a small part of a large component changes (e.g. list inside a page, progress text), or state is updated by external hooks (`props.hook.onProgress`), or high-frequency updates (file upload progress).
|
|
@@ -426,12 +428,13 @@ export const DemoIcons = {
|
|
|
426
428
|
```
|
|
427
429
|
|
|
428
430
|
**2. Override the specific `.ifc-icon` via CSS Masking:**
|
|
429
|
-
Use the `maskImage` property wrapped in `url()` to apply the SVG data to the icon class. This ensures it inherits colors (`currentColor`) properly.
|
|
431
|
+
Use the `-webkit-mask-image` and `maskImage` property wrapped in `url()` to apply the SVG data to the icon class. This ensures it inherits colors (`currentColor`) properly.
|
|
430
432
|
|
|
431
433
|
```typescript
|
|
432
434
|
const css: CssProps = {
|
|
433
435
|
// Target the specific system icon class you wish to override
|
|
434
436
|
'.ifc-icon.ma-close': {
|
|
437
|
+
'-webkit-mask-image': `url("${DemoIcons['ma-close']}")`,
|
|
435
438
|
maskImage: `url("${DemoIcons['ma-close']}")`,
|
|
436
439
|
// If needed, specify mask sizing properties:
|
|
437
440
|
// maskRepeat: 'no-repeat',
|
|
@@ -446,7 +449,7 @@ const css: CssProps = {
|
|
|
446
449
|
When creating a new Cross-Platform App using `lupine.js`, follow this standard procedure for scaffolding the entry point, navigation, and icons:
|
|
447
450
|
|
|
448
451
|
1. **Custom Navigation Icons (`app-icons.ts`)**:
|
|
449
|
-
Instead of using the default icon font, you should export SVG Data URIs for your app's specific icons from `app-icons.ts`. Use a `reduce` function to generate the appropriate `CssProps` with `maskImage: 'url("' + svg + '")'` to override the `.ifc-icon.[icon-name]` classes. Avoid using backticks (\"\`\") when injecting SVG variables inside the maskImage URL to prevent escaping issues.
|
|
452
|
+
Instead of using the default icon font, you should export SVG Data URIs for your app's specific icons from `app-icons.ts`. Use a `reduce` function to generate the appropriate `CssProps` with `-webkit-mask-image: url("' + svg + '")'` and `maskImage: 'url("' + svg + '")'` to override the `.ifc-icon.[icon-name]` classes. Avoid using backticks (\"\`\") when injecting SVG variables inside the maskImage URL to prevent escaping issues.
|
|
450
453
|
|
|
451
454
|
2. **Base Styles (`base-css.ts`)**:
|
|
452
455
|
Create a `styles/base-css.ts` file that imports the dynamic icon styles (from `app-icons.ts`), and defines any placeholder wrappers (e.g., `.user-page-placeholder` having `width: '100%', height: '100%'`). Use `bindGlobalStyle('comm-css', baseCss, false, true)` in the index file to register these.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "cv-starter-api",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"dependencies": {},
|
|
5
|
-
"devDependencies": {}
|
|
6
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "lupine-template-cv-starter-api",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"dependencies": {},
|
|
5
|
+
"devDependencies": {}
|
|
6
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
{
|
|
2
|
-
"WEB.pageLimit": "15",
|
|
3
|
-
"WEB.siteTitle": "Sample title",
|
|
4
|
-
"WEB.siteEmail": "sample@sample.com",
|
|
5
|
-
"WEB.siteUrl": "https://sample.com"
|
|
6
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"WEB.pageLimit": "15",
|
|
3
|
+
"WEB.siteTitle": "Sample title",
|
|
4
|
+
"WEB.siteEmail": "sample@sample.com",
|
|
5
|
+
"WEB.siteUrl": "https://sample.com"
|
|
6
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "cv-starter",
|
|
2
|
+
"name": "lupine-template-cv-starter",
|
|
3
3
|
"markdownEntryPoints": {
|
|
4
4
|
"indir": "web/markdown",
|
|
5
5
|
"outdir": "web/src/markdown-built"
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
"outdir": "/"
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
|
-
"index": "web/
|
|
15
|
-
"html": "web/
|
|
16
|
-
"outdir": "/
|
|
14
|
+
"index": "web/src/lupine-template-cv-starter/index.tsx",
|
|
15
|
+
"html": "web/src/lupine-template-cv-starter/index.html",
|
|
16
|
+
"outdir": "/lupine-template-cv-starter"
|
|
17
17
|
}
|
|
18
18
|
],
|
|
19
19
|
"apiEntryPoint": "api/src/index.ts",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
"type": "web",
|
|
29
|
-
"from": "web/
|
|
30
|
-
"to": "
|
|
29
|
+
"from": "web/src/lupine-template-cv-starter/404.html",
|
|
30
|
+
"to": "lupine-template-cv-starter/404.html"
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
"type": "data",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"dependencies": {},
|
|
5
|
-
"devDependencies": {}
|
|
6
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "lupine-template-cv-starter-web",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"dependencies": {},
|
|
5
|
+
"devDependencies": {}
|
|
6
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export const enum ClientEnvKeys {
|
|
2
|
-
API_PORT = 'API_PORT',
|
|
3
|
-
API_BASE_URL = 'API_BASE_URL',
|
|
4
|
-
NODE_ENV = 'NODE_ENV',
|
|
5
|
-
}
|
|
1
|
+
export const enum ClientEnvKeys {
|
|
2
|
+
API_PORT = 'API_PORT',
|
|
3
|
+
API_BASE_URL = 'API_BASE_URL',
|
|
4
|
+
NODE_ENV = 'NODE_ENV',
|
|
5
|
+
}
|
|
@@ -17,18 +17,21 @@
|
|
|
17
17
|
}
|
|
18
18
|
</style>
|
|
19
19
|
<script type="text/javascript">
|
|
20
|
-
// Single Page Apps for GitHub Pages, change all "/
|
|
21
|
-
if (window.location.pathname.includes(
|
|
22
|
-
window.location.href =
|
|
20
|
+
// Single Page Apps for GitHub Pages, change all "/lupine-template-cv-starter/" to your github project name
|
|
21
|
+
if (window.location.pathname.includes("/lupine-template-cv-starter/")) {
|
|
22
|
+
window.location.href =
|
|
23
|
+
"/lupine-template-cv-starter/?redirect=" + window.location.pathname;
|
|
23
24
|
}
|
|
24
25
|
</script>
|
|
25
26
|
</head>
|
|
26
27
|
<body>
|
|
27
28
|
<main>
|
|
28
29
|
<h4 class="header404">404</h4>
|
|
29
|
-
<div class="content-404">
|
|
30
|
+
<div class="content-404">
|
|
31
|
+
Uh-oh! We couldn't find the page you are looking for.
|
|
32
|
+
</div>
|
|
30
33
|
<p>
|
|
31
|
-
<a href="/
|
|
34
|
+
<a href="/lupine-template-cv-starter/">Check our home page</a>
|
|
32
35
|
</p>
|
|
33
36
|
</main>
|
|
34
37
|
</body>
|
package/templates/lupine-template-cv-starter/web/src/lupine-template-cv-starter/assets/og-image.png
ADDED
|
Binary file
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html data-theme="<!--META-THEME-->">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<title><!--META-TITLE--></title>
|
|
6
|
+
<meta
|
|
7
|
+
name="description"
|
|
8
|
+
content="Lupine.js: The Lightweight Frontend & Efficient Backend. 7kb gzipped, React TSX syntax, SSR, Page Router, and CSS-in-JS. Build faster with less overhead."
|
|
9
|
+
/>
|
|
10
|
+
|
|
11
|
+
<!-- Open Graph / Facebook -->
|
|
12
|
+
<meta property="og:type" content="website" />
|
|
13
|
+
<meta
|
|
14
|
+
property="og:url"
|
|
15
|
+
content="https://uuware.github.io/lupine-template-cv-starter/"
|
|
16
|
+
/>
|
|
17
|
+
<meta property="og:title" content="CV Starter (Powered by Lupine.js)" />
|
|
18
|
+
<meta
|
|
19
|
+
property="og:description"
|
|
20
|
+
content="CV Starter (Powered by Lupine.js)"
|
|
21
|
+
/>
|
|
22
|
+
<meta
|
|
23
|
+
property="og:image"
|
|
24
|
+
content="https://uuware.github.io/lupine-template-cv-starter/assets/og-image.png?v=2"
|
|
25
|
+
/>
|
|
26
|
+
|
|
27
|
+
<!-- Twitter -->
|
|
28
|
+
<meta property="twitter:card" content="summary_large_image" />
|
|
29
|
+
<meta
|
|
30
|
+
property="twitter:url"
|
|
31
|
+
content="https://uuware.github.io/lupine-template-cv-starter/"
|
|
32
|
+
/>
|
|
33
|
+
<meta
|
|
34
|
+
property="twitter:title"
|
|
35
|
+
content="CV Starter (Powered by Lupine.js)"
|
|
36
|
+
/>
|
|
37
|
+
<meta
|
|
38
|
+
property="twitter:description"
|
|
39
|
+
content="CV Starter (Powered by Lupine.js)"
|
|
40
|
+
/>
|
|
41
|
+
<meta
|
|
42
|
+
property="twitter:image"
|
|
43
|
+
content="https://uuware.github.io/lupine-template-cv-starter/assets/og-image.png"
|
|
44
|
+
/>
|
|
45
|
+
|
|
46
|
+
<link
|
|
47
|
+
rel="icon"
|
|
48
|
+
type="image/x-icon"
|
|
49
|
+
href="{SUBDIR}/assets/favicon.ico"
|
|
50
|
+
type="image/x-icon"
|
|
51
|
+
/>
|
|
52
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
53
|
+
<!--META-ENV-START-->
|
|
54
|
+
<!--META-ENV-END-->
|
|
55
|
+
<link
|
|
56
|
+
rel="shortcut icon"
|
|
57
|
+
href="{SUBDIR}/assets/favicon.ico?t={hash}"
|
|
58
|
+
type="image/x-icon"
|
|
59
|
+
/>
|
|
60
|
+
<link rel="stylesheet" type="text/css" href="{SUBDIR}/index.css?t={hash}" />
|
|
61
|
+
<script defer src="{SUBDIR}/index.js#t={hash}"></script>
|
|
62
|
+
<!-- Remove Cloudflare Web Analytics if you clone this project -->
|
|
63
|
+
<script
|
|
64
|
+
defer
|
|
65
|
+
src="https://static.cloudflareinsights.com/beacon.min.js"
|
|
66
|
+
data-cf-beacon='{"token": "6d22338a0a564aa78523d3c7078109db"}'
|
|
67
|
+
></script>
|
|
68
|
+
<!-- End Cloudflare Web Analytics -->
|
|
69
|
+
</head>
|
|
70
|
+
<body>
|
|
71
|
+
<div class="lupine-root"></div>
|
|
72
|
+
</body>
|
|
73
|
+
</html>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import {
|
|
2
|
+
bindRouter,
|
|
3
|
+
PageRouter,
|
|
4
|
+
bindTheme,
|
|
5
|
+
bindLang,
|
|
6
|
+
setDefaultPageTitle,
|
|
7
|
+
isFrontEnd,
|
|
8
|
+
debugWatch,
|
|
9
|
+
webEnv,
|
|
10
|
+
bindAppGlobalStyle,
|
|
11
|
+
} from "lupine.components";
|
|
12
|
+
import {
|
|
13
|
+
bindPressData,
|
|
14
|
+
PressPage,
|
|
15
|
+
pressThemes,
|
|
16
|
+
setPressSubDir,
|
|
17
|
+
} from "lupine.press";
|
|
18
|
+
import { ClientEnvKeys } from "../src/client-env-keys";
|
|
19
|
+
import { baseCss } from "../src/styles/base-css";
|
|
20
|
+
import { markdownConfig } from "../src/markdown-built/markdown-config";
|
|
21
|
+
|
|
22
|
+
if (isFrontEnd() && webEnv(ClientEnvKeys.NODE_ENV, "") === "development") {
|
|
23
|
+
debugWatch(webEnv(ClientEnvKeys.API_PORT, 0));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
bindLang("en", {});
|
|
27
|
+
bindTheme("light", pressThemes);
|
|
28
|
+
bindAppGlobalStyle("comm-css", baseCss, false, true);
|
|
29
|
+
setDefaultPageTitle("Doc Starter");
|
|
30
|
+
|
|
31
|
+
bindPressData(markdownConfig);
|
|
32
|
+
setPressSubDir("/lupine-template-cv-starter");
|
|
33
|
+
|
|
34
|
+
const pageRouter = new PageRouter();
|
|
35
|
+
pageRouter.setSubDir("/lupine-template-cv-starter");
|
|
36
|
+
pageRouter.use("*", PressPage);
|
|
37
|
+
|
|
38
|
+
bindRouter(pageRouter);
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
<h1 id="experience"><a class="header-anchor" href="#experience">#</a>Experience</h1><h2 id="senior-frontend-engineer-techsolutions-nz-ltd"><a class="header-anchor" href="#senior-frontend-engineer-techsolutions-nz-ltd">#</a>Senior Frontend Engineer | TechSolutions NZ Ltd.</h2><p><strong>Auckland, NZ | June 2021 - Present</strong></p>
|
|
2
|
-
<ul>
|
|
3
|
-
<li><strong>Core Architecture</strong>: Spearheaded the architectural design and refactoring of the company's flagship product, successfully reducing First Contentful Paint (FCP) from 2.5s to 1.2s.</li>
|
|
4
|
-
<li><strong>Design System</strong>: Led the development and maintenance of the internal UI library <code>abc-ui</code>, boosting team development efficiency by over 30%.</li>
|
|
5
|
-
<li><strong>Performance Optimisation</strong>: Optimised rendering performance for large-scale data visualisation dashboards, enabling smooth handling of 100k+ data points.</li>
|
|
6
|
-
<li><strong>Mentorship</strong>: Mentored three junior developers, established coding standards, and conducted regular code reviews to ensure high code quality.</li>
|
|
7
|
-
</ul>
|
|
8
|
-
<h2 id="full-stack-developer-creative-web-agency"><a class="header-anchor" href="#full-stack-developer-creative-web-agency">#</a>Full Stack Developer | Creative Web Agency</h2><p><strong>Auckland, NZ | June 2018 - May 2021</strong></p>
|
|
9
|
-
<ul>
|
|
10
|
-
<li><strong>System Development</strong>: Took full ownership of the full-stack development for an e-commerce admin portal (Vue.js + Node.js), implementing key modules including order management and role-based access control (RBAC).</li>
|
|
11
|
-
<li><strong>API Design</strong>: Designed and implemented RESTful APIs, documenting them with Swagger to facilitate seamless frontend-backend integration.</li>
|
|
12
|
-
<li><strong>CI/CD</strong>: Implemented an automated build and deployment pipeline using Jenkins, cutting release times by 50%.</li>
|
|
13
|
-
<li><strong>Mobile Responsiveness</strong>: ensured all marketing H5 pages were fully responsive and cross-browser compatible across major devices.</li>
|
|
14
|
-
</ul>
|
|
15
|
-
<h2 id="frontend-intern-digital-innovation-studio"><a class="header-anchor" href="#frontend-intern-digital-innovation-studio">#</a>Frontend Intern | Digital Innovation Studio</h2><p><strong>Wellington, NZ | July 2017 - May 2018</strong></p>
|
|
16
|
-
<ul>
|
|
17
|
-
<li><strong>UI Implementation</strong>: Collaborated closely with UI/UX designers to deliver pixel-perfect web pages with semantic HTML and clean CSS.</li>
|
|
18
|
-
<li><strong>Interactivity</strong>: Implemented complex page interactions using Vanilla JS and jQuery.</li>
|
|
19
|
-
<li><strong>Maintenance</strong>: Assisted with daily bug fixes and feature maintenance tasks.</li>
|
|
20
|
-
</ul>
|
|
1
|
+
<h1 id="experience"><a class="header-anchor" href="#experience">#</a>Experience</h1><h2 id="senior-frontend-engineer-techsolutions-nz-ltd"><a class="header-anchor" href="#senior-frontend-engineer-techsolutions-nz-ltd">#</a>Senior Frontend Engineer | TechSolutions NZ Ltd.</h2><p><strong>Auckland, NZ | June 2021 - Present</strong></p>
|
|
2
|
+
<ul>
|
|
3
|
+
<li><strong>Core Architecture</strong>: Spearheaded the architectural design and refactoring of the company's flagship product, successfully reducing First Contentful Paint (FCP) from 2.5s to 1.2s.</li>
|
|
4
|
+
<li><strong>Design System</strong>: Led the development and maintenance of the internal UI library <code>abc-ui</code>, boosting team development efficiency by over 30%.</li>
|
|
5
|
+
<li><strong>Performance Optimisation</strong>: Optimised rendering performance for large-scale data visualisation dashboards, enabling smooth handling of 100k+ data points.</li>
|
|
6
|
+
<li><strong>Mentorship</strong>: Mentored three junior developers, established coding standards, and conducted regular code reviews to ensure high code quality.</li>
|
|
7
|
+
</ul>
|
|
8
|
+
<h2 id="full-stack-developer-creative-web-agency"><a class="header-anchor" href="#full-stack-developer-creative-web-agency">#</a>Full Stack Developer | Creative Web Agency</h2><p><strong>Auckland, NZ | June 2018 - May 2021</strong></p>
|
|
9
|
+
<ul>
|
|
10
|
+
<li><strong>System Development</strong>: Took full ownership of the full-stack development for an e-commerce admin portal (Vue.js + Node.js), implementing key modules including order management and role-based access control (RBAC).</li>
|
|
11
|
+
<li><strong>API Design</strong>: Designed and implemented RESTful APIs, documenting them with Swagger to facilitate seamless frontend-backend integration.</li>
|
|
12
|
+
<li><strong>CI/CD</strong>: Implemented an automated build and deployment pipeline using Jenkins, cutting release times by 50%.</li>
|
|
13
|
+
<li><strong>Mobile Responsiveness</strong>: ensured all marketing H5 pages were fully responsive and cross-browser compatible across major devices.</li>
|
|
14
|
+
</ul>
|
|
15
|
+
<h2 id="frontend-intern-digital-innovation-studio"><a class="header-anchor" href="#frontend-intern-digital-innovation-studio">#</a>Frontend Intern | Digital Innovation Studio</h2><p><strong>Wellington, NZ | July 2017 - May 2018</strong></p>
|
|
16
|
+
<ul>
|
|
17
|
+
<li><strong>UI Implementation</strong>: Collaborated closely with UI/UX designers to deliver pixel-perfect web pages with semantic HTML and clean CSS.</li>
|
|
18
|
+
<li><strong>Interactivity</strong>: Implemented complex page interactions using Vanilla JS and jQuery.</li>
|
|
19
|
+
<li><strong>Maintenance</strong>: Assisted with daily bug fixes and feature maintenance tasks.</li>
|
|
20
|
+
</ul>
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
<h1 id="projects"><a class="header-anchor" href="#projects">#</a>Projects</h1><h2 id="lupine-js-https-github-com-uuware-lupine-js-open-source"><a class="header-anchor" href="#lupine-js-https-github-com-uuware-lupine-js-open-source">#</a><a href="https://github.com/uuware/lupine.js">Lupine.js</a> (Open Source)</h2><p><strong>Stack</strong>: TypeScript, React, Node.js</p>
|
|
2
|
-
<ul>
|
|
3
|
-
<li><strong>Overview</strong>: A high-performance, modular full-stack development framework designed to streamline modern web application builds.</li>
|
|
4
|
-
<li><strong>Key Contributions</strong>:<ul>
|
|
5
|
-
<li>Architected and implemented the core runtime environment.</li>
|
|
6
|
-
<li>Designed a robust plugin system, enabling dynamic extension loading.</li>
|
|
7
|
-
<li>Authored comprehensive official documentation and example projects.</li>
|
|
8
|
-
</ul>
|
|
9
|
-
</li>
|
|
10
|
-
<li><strong>Impact</strong>: Garnered 1k+ Stars on GitHub; recognised as a core contributor.</li>
|
|
11
|
-
</ul>
|
|
12
|
-
<h2 id="personal-blog-generator"><a class="header-anchor" href="#personal-blog-generator">#</a>Personal Blog Generator</h2><p><strong>Stack</strong>: Next.js, Tailwind CSS, Markdown</p>
|
|
13
|
-
<ul>
|
|
14
|
-
<li><strong>Overview</strong>: A static site generator for personal blogs built with Next.js, featuring MDX rendering and customisable themes.</li>
|
|
15
|
-
<li><strong>Features</strong>:<ul>
|
|
16
|
-
<li>High-performance Static Site Generation (SSG) for optimal SEO.</li>
|
|
17
|
-
<li>Integrated commenting system and full-text search capability.</li>
|
|
18
|
-
<li>Native Dark Mode support.</li>
|
|
19
|
-
</ul>
|
|
20
|
-
</li>
|
|
21
|
-
<li><strong>Outcome</strong>: Actively maintained personal project with 500+ daily unique visitors.</li>
|
|
22
|
-
</ul>
|
|
23
|
-
<h2 id="real-time-collaborative-editor"><a class="header-anchor" href="#real-time-collaborative-editor">#</a>Real-time Collaborative Editor</h2><p><strong>Stack</strong>: Vue 3, Socket.io, Node.js, MongoDB</p>
|
|
24
|
-
<ul>
|
|
25
|
-
<li><strong>Overview</strong>: A collaborative online document editing tool similar to Google Docs.</li>
|
|
26
|
-
<li><strong>Challenge</strong>: Implemented Operational Transformation (OT) algorithms to handle conflict resolution during simultaneous multi-user editing.</li>
|
|
27
|
-
<li><strong>Outcome</strong>: Successfully supported 20+ concurrent users editing a single document with latency under 100ms.</li>
|
|
28
|
-
</ul>
|
|
1
|
+
<h1 id="projects"><a class="header-anchor" href="#projects">#</a>Projects</h1><h2 id="lupine-js-https-github-com-uuware-lupine-js-open-source"><a class="header-anchor" href="#lupine-js-https-github-com-uuware-lupine-js-open-source">#</a><a href="https://github.com/uuware/lupine.js">Lupine.js</a> (Open Source)</h2><p><strong>Stack</strong>: TypeScript, React, Node.js</p>
|
|
2
|
+
<ul>
|
|
3
|
+
<li><strong>Overview</strong>: A high-performance, modular full-stack development framework designed to streamline modern web application builds.</li>
|
|
4
|
+
<li><strong>Key Contributions</strong>:<ul>
|
|
5
|
+
<li>Architected and implemented the core runtime environment.</li>
|
|
6
|
+
<li>Designed a robust plugin system, enabling dynamic extension loading.</li>
|
|
7
|
+
<li>Authored comprehensive official documentation and example projects.</li>
|
|
8
|
+
</ul>
|
|
9
|
+
</li>
|
|
10
|
+
<li><strong>Impact</strong>: Garnered 1k+ Stars on GitHub; recognised as a core contributor.</li>
|
|
11
|
+
</ul>
|
|
12
|
+
<h2 id="personal-blog-generator"><a class="header-anchor" href="#personal-blog-generator">#</a>Personal Blog Generator</h2><p><strong>Stack</strong>: Next.js, Tailwind CSS, Markdown</p>
|
|
13
|
+
<ul>
|
|
14
|
+
<li><strong>Overview</strong>: A static site generator for personal blogs built with Next.js, featuring MDX rendering and customisable themes.</li>
|
|
15
|
+
<li><strong>Features</strong>:<ul>
|
|
16
|
+
<li>High-performance Static Site Generation (SSG) for optimal SEO.</li>
|
|
17
|
+
<li>Integrated commenting system and full-text search capability.</li>
|
|
18
|
+
<li>Native Dark Mode support.</li>
|
|
19
|
+
</ul>
|
|
20
|
+
</li>
|
|
21
|
+
<li><strong>Outcome</strong>: Actively maintained personal project with 500+ daily unique visitors.</li>
|
|
22
|
+
</ul>
|
|
23
|
+
<h2 id="real-time-collaborative-editor"><a class="header-anchor" href="#real-time-collaborative-editor">#</a>Real-time Collaborative Editor</h2><p><strong>Stack</strong>: Vue 3, Socket.io, Node.js, MongoDB</p>
|
|
24
|
+
<ul>
|
|
25
|
+
<li><strong>Overview</strong>: A collaborative online document editing tool similar to Google Docs.</li>
|
|
26
|
+
<li><strong>Challenge</strong>: Implemented Operational Transformation (OT) algorithms to handle conflict resolution during simultaneous multi-user editing.</li>
|
|
27
|
+
<li><strong>Outcome</strong>: Successfully supported 20+ concurrent users editing a single document with latency under 100ms.</li>
|
|
28
|
+
</ul>
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
<h1 id="technical-skills"><a class="header-anchor" href="#technical-skills">#</a>Technical Skills</h1><h2 id="frontend-core"><a class="header-anchor" href="#frontend-core">#</a>Frontend & Core</h2><ul>
|
|
2
|
-
<li><strong>JavaScript (ES6+) / TypeScript</strong>: Expert level; capable of writing strict, type-safe, and scalable code.</li>
|
|
3
|
-
<li><strong>HTML5 / CSS3</strong>: Proficient with semantic markup, Flexbox, Grid, and modern responsive design principles.</li>
|
|
4
|
-
<li><strong>React / Vue</strong>: Deep understanding of React Hooks and Vue 3 Composition API/Reactivity system.</li>
|
|
5
|
-
</ul>
|
|
6
|
-
<h2 id="backend-database"><a class="header-anchor" href="#backend-database">#</a>Backend & Database</h2><ul>
|
|
7
|
-
<li><strong>Node.js</strong>: Experienced with Express, Koa, and NestJS frameworks for building robust server-side applications.</li>
|
|
8
|
-
<li><strong>Databases</strong>: Competent with MySQL, MongoDB, and Redis, including schema design and basic performance tuning.</li>
|
|
9
|
-
</ul>
|
|
10
|
-
<h2 id="devops-tools"><a class="header-anchor" href="#devops-tools">#</a>DevOps & Tools</h2><ul>
|
|
11
|
-
<li><strong>Build Tools</strong>: Skilled locally with Webpack, Vite, and Rollup.</li>
|
|
12
|
-
<li><strong>Version Control</strong>: Proficient with Git and Git Flow workflows.</li>
|
|
13
|
-
<li><strong>CI/CD</strong>: Experienced in setting up pipelines with GitHub Actions, Jenkins, and Docker.</li>
|
|
14
|
-
</ul>
|
|
15
|
-
<h2 id="general"><a class="header-anchor" href="#general">#</a>General</h2><ul>
|
|
16
|
-
<li><strong>Languages</strong>: English (Professional working proficiency).</li>
|
|
17
|
-
<li><strong>Design</strong>: Comfortable using Figma/Sketch for inspecting designs; solid understanding of UI/UX principles.</li>
|
|
18
|
-
</ul>
|
|
1
|
+
<h1 id="technical-skills"><a class="header-anchor" href="#technical-skills">#</a>Technical Skills</h1><h2 id="frontend-core"><a class="header-anchor" href="#frontend-core">#</a>Frontend & Core</h2><ul>
|
|
2
|
+
<li><strong>JavaScript (ES6+) / TypeScript</strong>: Expert level; capable of writing strict, type-safe, and scalable code.</li>
|
|
3
|
+
<li><strong>HTML5 / CSS3</strong>: Proficient with semantic markup, Flexbox, Grid, and modern responsive design principles.</li>
|
|
4
|
+
<li><strong>React / Vue</strong>: Deep understanding of React Hooks and Vue 3 Composition API/Reactivity system.</li>
|
|
5
|
+
</ul>
|
|
6
|
+
<h2 id="backend-database"><a class="header-anchor" href="#backend-database">#</a>Backend & Database</h2><ul>
|
|
7
|
+
<li><strong>Node.js</strong>: Experienced with Express, Koa, and NestJS frameworks for building robust server-side applications.</li>
|
|
8
|
+
<li><strong>Databases</strong>: Competent with MySQL, MongoDB, and Redis, including schema design and basic performance tuning.</li>
|
|
9
|
+
</ul>
|
|
10
|
+
<h2 id="devops-tools"><a class="header-anchor" href="#devops-tools">#</a>DevOps & Tools</h2><ul>
|
|
11
|
+
<li><strong>Build Tools</strong>: Skilled locally with Webpack, Vite, and Rollup.</li>
|
|
12
|
+
<li><strong>Version Control</strong>: Proficient with Git and Git Flow workflows.</li>
|
|
13
|
+
<li><strong>CI/CD</strong>: Experienced in setting up pipelines with GitHub Actions, Jenkins, and Docker.</li>
|
|
14
|
+
</ul>
|
|
15
|
+
<h2 id="general"><a class="header-anchor" href="#general">#</a>General</h2><ul>
|
|
16
|
+
<li><strong>Languages</strong>: English (Professional working proficiency).</li>
|
|
17
|
+
<li><strong>Design</strong>: Comfortable using Figma/Sketch for inspecting designs; solid understanding of UI/UX principles.</li>
|
|
18
|
+
</ul>
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
<h1 id="education"><a class="header-anchor" href="#education">#</a>Education</h1><h2 id="university-of-auckland"><a class="header-anchor" href="#university-of-auckland">#</a>University of Auckland</h2><p><strong>Bachelor of Science in Computer Science</strong>
|
|
2
|
-
<strong>Feb 2014 - Nov 2017</strong></p>
|
|
3
|
-
<ul>
|
|
4
|
-
<li><strong>Key Coursework</strong>: Data Structures & Algorithms, Operating Systems, Computer Networks, Database Systems, Software Engineering.</li>
|
|
5
|
-
<li><strong>Achievements</strong>:<ul>
|
|
6
|
-
<li>Dean's Honours List (2016).</li>
|
|
7
|
-
<li>First Class Honours.</li>
|
|
8
|
-
</ul>
|
|
9
|
-
</li>
|
|
10
|
-
</ul>
|
|
1
|
+
<h1 id="education"><a class="header-anchor" href="#education">#</a>Education</h1><h2 id="university-of-auckland"><a class="header-anchor" href="#university-of-auckland">#</a>University of Auckland</h2><p><strong>Bachelor of Science in Computer Science</strong>
|
|
2
|
+
<strong>Feb 2014 - Nov 2017</strong></p>
|
|
3
|
+
<ul>
|
|
4
|
+
<li><strong>Key Coursework</strong>: Data Structures & Algorithms, Operating Systems, Computer Networks, Database Systems, Software Engineering.</li>
|
|
5
|
+
<li><strong>Achievements</strong>:<ul>
|
|
6
|
+
<li>Dean's Honours List (2016).</li>
|
|
7
|
+
<li>First Class Honours.</li>
|
|
8
|
+
</ul>
|
|
9
|
+
</li>
|
|
10
|
+
</ul>
|
package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/en/index.html
RENAMED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
<h1 id="alex-freeman"><a class="header-anchor" href="#alex-freeman">#</a>Alex Freeman</h1><blockquote>
|
|
2
|
-
<p>Full Stack Engineer | Open Source Enthusiast | Lifelong Learner</p>
|
|
3
|
-
</blockquote>
|
|
4
|
-
<ul>
|
|
5
|
-
<li>📧 Email: <a href="javascript:lpPressLoad('/en/mailto:your.email@example.com')">your.email@example.com</a></li>
|
|
6
|
-
<li>📱 Mobile: +64 21 123 4567</li>
|
|
7
|
-
<li>🔗 GitHub: <a href="https://github.com/yourusername">github.com/yourusername</a></li>
|
|
8
|
-
<li>🌐 Blog: <a href="https://yourblog.com">yourblog.com</a></li>
|
|
9
|
-
<li>📍 Location: Auckland, New Zealand</li>
|
|
10
|
-
</ul>
|
|
11
|
-
<h2 id="personal-statement"><a class="header-anchor" href="#personal-statement">#</a>Personal Statement</h2><p>A seasoned Full Stack Engineer with over 5 years of experience in designing and building high-performance, scalable web applications. Proficient in the modern JavaScript ecosystem, including React, Node.js, and TypeScript. Passionate about open source software and actively maintaining several popular repositories on GitHub.</p>
|
|
12
|
-
<p>A problem-solver at heart with strong collaborative and communication skills. Committed to writing clean, maintainable code and delivering exceptional user experiences.</p>
|
|
13
|
-
<h2 id="career-objectives"><a class="header-anchor" href="#career-objectives">#</a>Career Objectives</h2><ul>
|
|
14
|
-
<li><strong>Role</strong>: Senior Frontend Engineer / Full Stack Engineer</li>
|
|
15
|
-
<li><strong>Location</strong>: Auckland / Remote</li>
|
|
16
|
-
<li><strong>Availability</strong>: 4 weeks notice</li>
|
|
17
|
-
<li><strong>Visa Status</strong>: NZ Resident / Work Visa</li>
|
|
18
|
-
</ul>
|
|
19
|
-
<hr>
|
|
20
|
-
<p>Powered by <a href="https://github.com/uuware/lupine.js">Lupine.js</a>. If you find this template helpful, a star on GitHub is always appreciated ⭐️</p>
|
|
1
|
+
<h1 id="alex-freeman"><a class="header-anchor" href="#alex-freeman">#</a>Alex Freeman</h1><blockquote>
|
|
2
|
+
<p>Full Stack Engineer | Open Source Enthusiast | Lifelong Learner</p>
|
|
3
|
+
</blockquote>
|
|
4
|
+
<ul>
|
|
5
|
+
<li>📧 Email: <a href="javascript:lpPressLoad('/en/mailto:your.email@example.com')">your.email@example.com</a></li>
|
|
6
|
+
<li>📱 Mobile: +64 21 123 4567</li>
|
|
7
|
+
<li>🔗 GitHub: <a href="https://github.com/yourusername">github.com/yourusername</a></li>
|
|
8
|
+
<li>🌐 Blog: <a href="https://yourblog.com">yourblog.com</a></li>
|
|
9
|
+
<li>📍 Location: Auckland, New Zealand</li>
|
|
10
|
+
</ul>
|
|
11
|
+
<h2 id="personal-statement"><a class="header-anchor" href="#personal-statement">#</a>Personal Statement</h2><p>A seasoned Full Stack Engineer with over 5 years of experience in designing and building high-performance, scalable web applications. Proficient in the modern JavaScript ecosystem, including React, Node.js, and TypeScript. Passionate about open source software and actively maintaining several popular repositories on GitHub.</p>
|
|
12
|
+
<p>A problem-solver at heart with strong collaborative and communication skills. Committed to writing clean, maintainable code and delivering exceptional user experiences.</p>
|
|
13
|
+
<h2 id="career-objectives"><a class="header-anchor" href="#career-objectives">#</a>Career Objectives</h2><ul>
|
|
14
|
+
<li><strong>Role</strong>: Senior Frontend Engineer / Full Stack Engineer</li>
|
|
15
|
+
<li><strong>Location</strong>: Auckland / Remote</li>
|
|
16
|
+
<li><strong>Availability</strong>: 4 weeks notice</li>
|
|
17
|
+
<li><strong>Visa Status</strong>: NZ Resident / Work Visa</li>
|
|
18
|
+
</ul>
|
|
19
|
+
<hr>
|
|
20
|
+
<p>Powered by <a href="https://github.com/uuware/lupine.js">Lupine.js</a>. If you find this template helpful, a star on GitHub is always appreciated ⭐️</p>
|