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.
Files changed (141) hide show
  1. package/index.js +35 -6
  2. package/package.json +1 -1
  3. package/templates/common/AI_CONTEXT.md +5 -2
  4. package/templates/{cv-starter → lupine-template-cv-starter}/api/package.json +6 -6
  5. package/templates/{doc-starter/api/src → lupine-template-cv-starter/api}/resources/config_default.json +6 -6
  6. package/templates/{cv-starter → lupine-template-cv-starter}/lupine.json +6 -6
  7. package/templates/{doc-starter → lupine-template-cv-starter}/web/package.json +6 -6
  8. package/templates/{doc-starter → lupine-template-cv-starter}/web/src/client-env-keys.ts +5 -5
  9. package/templates/{doc-starter/web/github-pj-name → lupine-template-cv-starter/web/src/lupine-template-cv-starter}/404.html +8 -5
  10. package/templates/lupine-template-cv-starter/web/src/lupine-template-cv-starter/assets/og-image.png +0 -0
  11. package/templates/lupine-template-cv-starter/web/src/lupine-template-cv-starter/index.html +73 -0
  12. package/templates/lupine-template-cv-starter/web/src/lupine-template-cv-starter/index.tsx +38 -0
  13. package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/en/01-experience/index.html +20 -20
  14. package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/en/02-projects/index.html +28 -28
  15. package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/en/03-skills/index.html +18 -18
  16. package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/en/04-education/index.html +10 -10
  17. package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/en/index.html +20 -20
  18. package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/zh/01-experience/index.html +20 -20
  19. package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/zh/02-projects/index.html +28 -28
  20. package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/zh/03-skills/index.html +18 -18
  21. package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/zh/04-education/index.html +11 -11
  22. package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/zh/index.html +20 -20
  23. package/templates/{cv-starter → lupine-template-cv-starter}/web/src/styles/base-css.ts +15 -15
  24. package/templates/lupine-template-doc-starter/api/package.json +6 -0
  25. package/templates/{hello-world → lupine-template-doc-starter}/api/resources/config_default.json +6 -6
  26. package/templates/lupine-template-doc-starter/api/src/resources/config_default.json +6 -0
  27. package/templates/{doc-starter → lupine-template-doc-starter}/lupine.json +9 -4
  28. package/templates/lupine-template-doc-starter/web/package.json +6 -0
  29. package/templates/{cv-starter → lupine-template-doc-starter}/web/src/client-env-keys.ts +5 -5
  30. package/templates/lupine-template-doc-starter/web/src/lupine-template-doc-starter/404.html +38 -0
  31. package/templates/{cv-starter/web/src → lupine-template-doc-starter/web/src/lupine-template-doc-starter}/index.html +13 -2
  32. package/templates/lupine-template-doc-starter/web/src/lupine-template-doc-starter/index.tsx +38 -0
  33. package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/en/essentials/list.html +8 -8
  34. package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/en/guide/install.html +8 -8
  35. package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/en/guide/started.html +12 -12
  36. package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/markdown-config.ts +25 -25
  37. package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/zh/essentials/list.html +8 -8
  38. package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/zh/guide/install.html +8 -8
  39. package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/zh/guide/started.html +12 -12
  40. package/templates/{doc-starter → lupine-template-doc-starter}/web/src/styles/base-css.ts +15 -15
  41. package/templates/{cv-starter/web → lupine-template-responsive-starter/api}/package.json +1 -1
  42. package/templates/lupine-template-responsive-starter/lupine.json +33 -0
  43. package/templates/{doc-starter/api → lupine-template-responsive-starter/web}/package.json +1 -1
  44. package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/app-icons.ts +4 -0
  45. package/templates/{cv-starter/web/github-pj-name → lupine-template-responsive-starter/web/src/lupine-template-responsive-starter}/404.html +4 -4
  46. package/templates/lupine-template-responsive-starter/web/src/lupine-template-responsive-starter/assets/favicon.ico +0 -0
  47. package/templates/lupine-template-responsive-starter/web/src/lupine-template-responsive-starter/assets/og-image.png +0 -0
  48. package/templates/lupine-template-responsive-starter/web/src/lupine-template-responsive-starter/index.html +49 -0
  49. package/templates/lupine-template-responsive-starter/web/src/lupine-template-responsive-starter/index.tsx +35 -0
  50. package/templates/cv-starter/web/github-pj-name/index.tsx +0 -33
  51. package/templates/doc-starter/web/github-pj-name/index.tsx +0 -33
  52. package/templates/hello-world/web/src/index.html +0 -16
  53. package/templates/responsive-starter/api/package.json +0 -6
  54. package/templates/responsive-starter/api/resources/config_default.json +0 -6
  55. package/templates/responsive-starter/lupine.json +0 -23
  56. package/templates/responsive-starter/web/package.json +0 -6
  57. /package/templates/{cv-starter → lupine-template-cv-starter}/api/resources/install.sqlite.sql +0 -0
  58. /package/templates/{cv-starter → lupine-template-cv-starter}/api/src/index.ts +0 -0
  59. /package/templates/{cv-starter → lupine-template-cv-starter}/web/assets/favicon.ico +0 -0
  60. /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/en/01-experience/index.md +0 -0
  61. /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/en/02-projects/index.md +0 -0
  62. /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/en/03-skills/index.md +0 -0
  63. /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/en/04-education/index.md +0 -0
  64. /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/en/index.md +0 -0
  65. /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/index.md +0 -0
  66. /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/zh/01-experience/index.md +0 -0
  67. /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/zh/02-projects/index.md +0 -0
  68. /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/zh/03-skills/index.md +0 -0
  69. /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/zh/04-education/index.md +0 -0
  70. /package/templates/{cv-starter → lupine-template-cv-starter}/web/markdown/zh/index.md +0 -0
  71. /package/templates/{cv-starter/web/github-pj-name → lupine-template-cv-starter/web/src}/index.html +0 -0
  72. /package/templates/{cv-starter → lupine-template-cv-starter}/web/src/index.tsx +0 -0
  73. /package/templates/{cv-starter/web/github-pj-name → lupine-template-cv-starter/web/src/lupine-template-cv-starter}/assets/favicon.ico +0 -0
  74. /package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/index.html +0 -0
  75. /package/templates/{cv-starter → lupine-template-cv-starter}/web/src/markdown-built/markdown-config.ts +0 -0
  76. /package/templates/{doc-starter → lupine-template-doc-starter}/api/resources/install.sqlite.sql +0 -0
  77. /package/templates/{doc-starter → lupine-template-doc-starter}/api/src/index.ts +0 -0
  78. /package/templates/{doc-starter → lupine-template-doc-starter}/api/src/resources/install.sqlite.sql +0 -0
  79. /package/templates/{doc-starter → lupine-template-doc-starter}/web/assets/favicon.ico +0 -0
  80. /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/en/essentials/index.md +0 -0
  81. /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/en/essentials/list.md +0 -0
  82. /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/en/guide/install.md +0 -0
  83. /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/en/guide/started.md +0 -0
  84. /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/en/index.md +0 -0
  85. /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/index.md +0 -0
  86. /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/zh/essentials/index.md +0 -0
  87. /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/zh/essentials/list.md +0 -0
  88. /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/zh/guide/install.md +0 -0
  89. /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/zh/guide/started.md +0 -0
  90. /package/templates/{doc-starter → lupine-template-doc-starter}/web/markdown/zh/index.md +0 -0
  91. /package/templates/{doc-starter/web/github-pj-name → lupine-template-doc-starter/web/src}/index.html +0 -0
  92. /package/templates/{doc-starter → lupine-template-doc-starter}/web/src/index.tsx +0 -0
  93. /package/templates/{doc-starter/web/github-pj-name → lupine-template-doc-starter/web/src/lupine-template-doc-starter}/assets/favicon.ico +0 -0
  94. /package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/en/essentials/index.html +0 -0
  95. /package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/en/index.html +0 -0
  96. /package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/index.html +0 -0
  97. /package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/zh/essentials/index.html +0 -0
  98. /package/templates/{doc-starter → lupine-template-doc-starter}/web/src/markdown-built/zh/index.html +0 -0
  99. /package/templates/{hello-world → lupine-template-hello-world}/api/package.json +0 -0
  100. /package/templates/{cv-starter → lupine-template-hello-world}/api/resources/config_default.json +0 -0
  101. /package/templates/{hello-world → lupine-template-hello-world}/api/resources/install.sqlite.sql +0 -0
  102. /package/templates/{hello-world → lupine-template-hello-world}/api/src/index.ts +0 -0
  103. /package/templates/{hello-world → lupine-template-hello-world}/api/src/service/root-api.ts +0 -0
  104. /package/templates/{hello-world → lupine-template-hello-world}/lupine.json +0 -0
  105. /package/templates/{hello-world → lupine-template-hello-world}/web/assets/favicon.ico +0 -0
  106. /package/templates/{hello-world → lupine-template-hello-world}/web/package.json +0 -0
  107. /package/templates/{doc-starter → lupine-template-hello-world}/web/src/index.html +0 -0
  108. /package/templates/{hello-world → lupine-template-hello-world}/web/src/index.tsx +0 -0
  109. /package/templates/{hello-world → lupine-template-hello-world}/web/src/styles/app.css +0 -0
  110. /package/templates/{hello-world → lupine-template-hello-world}/web/src/styles/base-css.ts +0 -0
  111. /package/templates/{hello-world → lupine-template-hello-world}/web/src/styles/global.css +0 -0
  112. /package/templates/{hello-world → lupine-template-hello-world}/web/src/styles/theme.ts +0 -0
  113. /package/templates/{doc-starter → lupine-template-responsive-starter}/api/resources/config_default.json +0 -0
  114. /package/templates/{responsive-starter → lupine-template-responsive-starter}/api/resources/install.sqlite.sql +0 -0
  115. /package/templates/{responsive-starter → lupine-template-responsive-starter}/api/src/index.ts +0 -0
  116. /package/templates/{responsive-starter → lupine-template-responsive-starter}/api/src/service/root-api.ts +0 -0
  117. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/assets/favicon.ico +0 -0
  118. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/input-history-component.tsx +0 -0
  119. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/mine-about-page.tsx +0 -0
  120. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/mine-premium-page.tsx +0 -0
  121. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/mine-settings-page.tsx +0 -0
  122. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/mobile-top-search-menu.tsx +0 -0
  123. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/note-detail.tsx +0 -0
  124. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/note-edit.tsx +0 -0
  125. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/note-search-page.tsx +0 -0
  126. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/search-input.tsx +0 -0
  127. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/components/side-menu-content.tsx +0 -0
  128. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/frames/app-responsive-frame.tsx +0 -0
  129. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/index.html +0 -0
  130. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/index.tsx +0 -0
  131. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/pages/about-page.tsx +0 -0
  132. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/pages/finance-page.tsx +0 -0
  133. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/pages/home-page.tsx +0 -0
  134. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/pages/mine-page.tsx +0 -0
  135. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/pages/tools-page.tsx +0 -0
  136. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/services/local-notes-service.ts +0 -0
  137. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/services/mine-service.ts +0 -0
  138. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/styles/app.css +0 -0
  139. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/styles/base-css.ts +0 -0
  140. /package/templates/{responsive-starter → lupine-template-responsive-starter}/web/src/styles/global.css +0 -0
  141. /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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-lupine",
3
- "version": "1.0.15",
3
+ "version": "1.0.16",
4
4
  "description": "Scaffolding tool for Lupine.js projects",
5
5
  "bin": {
6
6
  "create-lupine": "index.js"
@@ -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/github-pj-name/index.tsx",
15
- "html": "web/github-pj-name/index.html",
16
- "outdir": "/github-pj-name"
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/github-pj-name/404.html",
30
- "to": "github-pj-name/404.html"
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": "doc-starter-web",
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 "/github-pj-name/" to your github project name
21
- if (window.location.pathname.includes('/github-pj-name/')) {
22
- window.location.href = '/github-pj-name/?redirect=' + window.location.pathname;
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">Uh-oh! We couldn't find the page you are looking for.</div>
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="/github-pj-name/">Check our home page</a>
34
+ <a href="/lupine-template-cv-starter/">Check our home page</a>
32
35
  </p>
33
36
  </main>
34
37
  </body>
@@ -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&#39;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&#39;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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; Algorithms, Operating Systems, Computer Networks, Database Systems, Software Engineering.</li>
5
- <li><strong>Achievements</strong>:<ul>
6
- <li>Dean&#39;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 &amp; Algorithms, Operating Systems, Computer Networks, Database Systems, Software Engineering.</li>
5
+ <li><strong>Achievements</strong>:<ul>
6
+ <li>Dean&#39;s Honours List (2016).</li>
7
+ <li>First Class Honours.</li>
8
+ </ul>
9
+ </li>
10
+ </ul>
@@ -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>