nuxt-layer-core 2.0.1
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/.claude/settings.local.json +8 -0
- package/app/app.config.ts +5 -0
- package/app/app.vue +11 -0
- package/app/assets/css/main.css +113 -0
- package/app/components/.gitkeep +0 -0
- package/app/components/ui/sonner/Sonner.vue +62 -0
- package/app/components/ui/sonner/index.ts +1 -0
- package/app/composables/.gitkeep +0 -0
- package/app/layers/solution/app/assets/proxmox-css/main.css +89 -0
- package/app/layers/solution/app/assets/proxmox-css/proxmox-utils.css +68 -0
- package/app/layers/solution/app/components/ClusterDiagram.vue +72 -0
- package/app/layers/solution/app/components/CoursesSection.vue +246 -0
- package/app/layers/solution/app/components/CtaSection.vue +329 -0
- package/app/layers/solution/app/components/FeaturesSection.vue +67 -0
- package/app/layers/solution/app/components/HeroSection.vue +144 -0
- package/app/layers/solution/app/components/PricingPlansSection.vue +434 -0
- package/app/layers/solution/app/components/RegistrationForm.vue +256 -0
- package/app/layers/solution/app/components/TestimonialsSection.vue +58 -0
- package/app/layers/solution/app/components/TheFooter.vue +61 -0
- package/app/layers/solution/app/components/TheHeader.vue +189 -0
- package/app/layers/solution/app/components/proxmox/AppIcon.vue +45 -0
- package/app/layers/solution/app/components/proxmox/ComparisonSection.vue +54 -0
- package/app/layers/solution/app/components/proxmox/FaqSection.vue +58 -0
- package/app/layers/solution/app/components/proxmox/HciOverviewSection.vue +37 -0
- package/app/layers/solution/app/components/proxmox/HeroSection.vue +74 -0
- package/app/layers/solution/app/components/proxmox/TestimonialsSection.vue +44 -0
- package/app/layers/solution/app/components/proxmox/TrainingBenefitsSection.vue +37 -0
- package/app/layers/solution/app/components/proxmox/VeFeaturesSection.vue +55 -0
- package/app/layers/solution/app/composables/useActiveSection.ts +47 -0
- package/app/layers/solution/app/composables/useAuthApi.ts +244 -0
- package/app/layers/solution/app/composables/useAuthState.ts +16 -0
- package/app/layers/solution/app/composables/useCookie.ts +79 -0
- package/app/layers/solution/app/composables/useCookieHelper.ts +81 -0
- package/app/layers/solution/app/composables/useCrmApi.ts +32 -0
- package/app/layers/solution/app/composables/useDynamicCollection.ts +23 -0
- package/app/layers/solution/app/composables/useScrollAnimate.ts +40 -0
- package/app/layers/solution/app/composables/useScrollToSection.ts +13 -0
- package/app/layers/solution/app/composables/useSolutionApi.ts +55 -0
- package/app/layers/solution/app/composables/useToast.ts +14 -0
- package/app/layers/solution/app/data/proxmox-content.ts +158 -0
- package/app/layers/solution/app/images/Proxmox HCI.png +0 -0
- package/app/layers/solution/app/images/image_from_https_hercules_cdn.com_file_6dztkvkfnip0ud23tzzvu57c.png +0 -0
- package/app/layers/solution/app/layouts/default.vue +5 -0
- package/app/layers/solution/app/nuxt.config.ts +9 -0
- package/app/layers/solution/app/pages/cap-nhat-thong-tin/index.vue +302 -0
- package/app/layers/solution/app/pages/dang-ky/index.vue +627 -0
- package/app/layers/solution/app/pages/dang-nhap/index.vue +208 -0
- package/app/layers/solution/app/pages/doi-mat-khau/index.vue +237 -0
- package/app/layers/solution/app/pages/giai-phap-proxmox/[slug]/index.vue +37 -0
- package/app/layers/solution/app/pages/giai-phap-proxmox/[slug]/proxmox-hci/index.vue +45 -0
- package/app/layers/solution/app/pages/giai-phap-proxmox/dang-ky-khoa-hoc/[slug].vue +131 -0
- package/app/layers/solution/app/pages/quen-mat-khau/index.vue +136 -0
- package/app/layers/solution/app/pages/xac-thuc/index.vue +320 -0
- package/app/layers/solution/app/plugins/reveal.ts +56 -0
- package/app/layers/solution/app/public/images/image_from_https_hercules_cdn.com_file_6dztkvkfnip0ud23tzzvu57c.png +0 -0
- package/app/layers/solution/app/public/images/logo-lvs-1300x330.png +0 -0
- package/app/layouts/auth.vue +71 -0
- package/app/lib/utils.ts +7 -0
- package/app/middleware/.gitkeep +0 -0
- package/app/modules/layer-route-priority.ts +60 -0
- package/app/pages/index.vue +9 -0
- package/app/pages/san-pham-proxmox.vue +8 -0
- package/app/plugins/.gitkeep +0 -0
- package/app/plugins/sdk.ts +29 -0
- package/app/stores/.gitkeep +0 -0
- package/app/types/sdk.d.ts +15 -0
- package/components.json +24 -0
- package/nuxt.config.ts +104 -0
- package/package.json +52 -0
- package/public/.gitkeep +0 -0
- package/server/api/.gitkeep +0 -0
- package/server/utils/.gitkeep +0 -0
- package/tailwind.config.js +96 -0
- package/tsconfig.base.json +18 -0
- package/tsconfig.json +18 -0
- package/website-longvan-1.1.6.tgz +0 -0
- package/website-longvan-1.1.7.tgz +0 -0
- package/website-longvan-1.1.8.tgz +0 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// plugins/sdk.ts
|
|
2
|
+
|
|
3
|
+
import { SDK } from "@longvansoftware/service-js-client";
|
|
4
|
+
// import { SDK } from "../../../storefront-js-client/src/lib/SDK";
|
|
5
|
+
import { useRuntimeConfig } from '#app'
|
|
6
|
+
|
|
7
|
+
export default defineNuxtPlugin(nuxtApp => {
|
|
8
|
+
if (nuxtApp?.vueApp?.config?.globalProperties?.$sdk) return;
|
|
9
|
+
|
|
10
|
+
const config = useRuntimeConfig();
|
|
11
|
+
|
|
12
|
+
// Ép kiểu từ `unknown` thành kiểu cụ thể
|
|
13
|
+
const { ORG_ID, STORE_ID, ENVIROMENT } = config.public as unknown as {
|
|
14
|
+
ORG_ID: string;
|
|
15
|
+
STORE_ID: string;
|
|
16
|
+
ENVIROMENT: string;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// Tạo instance SDK
|
|
20
|
+
const sdkInstance = new SDK(
|
|
21
|
+
ORG_ID,
|
|
22
|
+
STORE_ID,
|
|
23
|
+
"U2FsdGVkX1/Cci00sR9oVNTJxPhwM7jKkQP6xg97IVI=",
|
|
24
|
+
ENVIROMENT
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
// Inject vào nuxtApp để sử dụng toàn ứng dụng
|
|
28
|
+
nuxtApp.provide("sdk", sdkInstance);
|
|
29
|
+
});
|
|
File without changes
|
package/components.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://shadcn-vue.com/schema.json",
|
|
3
|
+
"style": "reka-nova",
|
|
4
|
+
"font": "inter",
|
|
5
|
+
"typescript": true,
|
|
6
|
+
"tailwind": {
|
|
7
|
+
"config": "tailwind.config.js",
|
|
8
|
+
"css": "app/assets/css/main.css",
|
|
9
|
+
"baseColor": "neutral",
|
|
10
|
+
"cssVariables": true,
|
|
11
|
+
"prefix": ""
|
|
12
|
+
},
|
|
13
|
+
"iconLibrary": "lucide",
|
|
14
|
+
"rtl": false,
|
|
15
|
+
"pointer": false,
|
|
16
|
+
"aliases": {
|
|
17
|
+
"components": "@/components",
|
|
18
|
+
"utils": "@/lib/utils",
|
|
19
|
+
"ui": "@/components/ui",
|
|
20
|
+
"lib": "@/lib",
|
|
21
|
+
"composables": "@/composables"
|
|
22
|
+
},
|
|
23
|
+
"registries": {}
|
|
24
|
+
}
|
package/nuxt.config.ts
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export default defineNuxtConfig({
|
|
2
|
+
srcDir: "app/",
|
|
3
|
+
|
|
4
|
+
compatibilityDate: "2025-04-25",
|
|
5
|
+
|
|
6
|
+
ssr: true,
|
|
7
|
+
|
|
8
|
+
devtools: {
|
|
9
|
+
enabled: true,
|
|
10
|
+
},
|
|
11
|
+
|
|
12
|
+
future: {
|
|
13
|
+
compatibilityVersion: 4,
|
|
14
|
+
},
|
|
15
|
+
|
|
16
|
+
extends: [
|
|
17
|
+
"./app/layers/solution/app"
|
|
18
|
+
],
|
|
19
|
+
|
|
20
|
+
typescript: {
|
|
21
|
+
strict: true,
|
|
22
|
+
typeCheck: false,
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
modules: [
|
|
26
|
+
"@pinia/nuxt",
|
|
27
|
+
"@nuxt/icon",
|
|
28
|
+
"@nuxt/image",
|
|
29
|
+
"@nuxtjs/tailwindcss",
|
|
30
|
+
"@nuxtjs/sitemap",
|
|
31
|
+
"@nuxtjs/strapi",
|
|
32
|
+
"nuxt-gtag",
|
|
33
|
+
// "./app/modules/layer-route-priority"
|
|
34
|
+
],
|
|
35
|
+
|
|
36
|
+
// CSS loaded by consuming project via ~/assets/css/layer.css
|
|
37
|
+
// to ensure correct resolution when layer is in node_modules
|
|
38
|
+
// css: [
|
|
39
|
+
// "~/assets/css/main.css",
|
|
40
|
+
// ],
|
|
41
|
+
|
|
42
|
+
imports: {
|
|
43
|
+
dirs: [
|
|
44
|
+
"stores",
|
|
45
|
+
"services",
|
|
46
|
+
"utils",
|
|
47
|
+
"types",
|
|
48
|
+
"constants",
|
|
49
|
+
"hooks",
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
components: [
|
|
54
|
+
{
|
|
55
|
+
path: "~/components",
|
|
56
|
+
pathPrefix: false,
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
|
|
60
|
+
image: {
|
|
61
|
+
provider: "ipx",
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
icon: {
|
|
65
|
+
serverBundle: {
|
|
66
|
+
collections: ['lucide']
|
|
67
|
+
},
|
|
68
|
+
clientBundle: {
|
|
69
|
+
scan: false,
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
tailwindcss: {
|
|
74
|
+
viewer: false,
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
runtimeConfig: {
|
|
78
|
+
public: {
|
|
79
|
+
ORG_ID: process.env.ORG_ID,
|
|
80
|
+
STORE_ID: process.env.STORE_ID,
|
|
81
|
+
ENVIROMENT: process.env.ENVIROMENT,
|
|
82
|
+
ACCESSTOKEN_NAME: process.env.ACCESSTOKEN_NAME || 'accessToken',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
hooks: {
|
|
87
|
+
"pages:extend"(pages) {
|
|
88
|
+
|
|
89
|
+
const layerPages = pages.filter(page =>
|
|
90
|
+
page.file?.includes("layers")
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
const sourcePages = pages.filter(page =>
|
|
94
|
+
!page.file?.includes("layers")
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
console.log("Layer pages", layerPages)
|
|
99
|
+
console.log("Source pages", sourcePages)
|
|
100
|
+
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nuxt-layer-core",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"private": false,
|
|
5
|
+
"version": "2.0.1",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "env-cmd -f .env nuxt build",
|
|
8
|
+
"dev": "env-cmd -f .env nuxt dev"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@longvansoftware/service-js-client": "2.8.6",
|
|
12
|
+
"@lucide/vue": "^1.28.0",
|
|
13
|
+
"@nuxt/icon": "^2.1.0",
|
|
14
|
+
"@nuxt/image": "^2.0.0",
|
|
15
|
+
"@nuxtjs/sitemap": "^7.4.7",
|
|
16
|
+
"@nuxtjs/strapi": "^2.1.1",
|
|
17
|
+
"@nuxtjs/tailwindcss": "^6.14.0",
|
|
18
|
+
"@pinia/nuxt": "^0.11.3",
|
|
19
|
+
"@splidejs/vue-splide": "^0.6.12",
|
|
20
|
+
"@vueuse/core": "^14.4.0",
|
|
21
|
+
"aos": "^2.3.4",
|
|
22
|
+
"class-variance-authority": "^0.7.1",
|
|
23
|
+
"clsx": "^2.1.1",
|
|
24
|
+
"crypto-js": "^4.2.0",
|
|
25
|
+
"env-cmd": "^11.0.0",
|
|
26
|
+
"feather-icons": "^4.29.2",
|
|
27
|
+
"ipx": "^3.1.1",
|
|
28
|
+
"js-cookie": "^3.0.5",
|
|
29
|
+
"nuxt": "4.2.1",
|
|
30
|
+
"nuxt-gtag": "^4.1.0",
|
|
31
|
+
"pinia": "^3.0.4",
|
|
32
|
+
"qs": "^6.14.0",
|
|
33
|
+
"tailwind-merge": "^3.6.0",
|
|
34
|
+
"vue": "^3.5.24",
|
|
35
|
+
"vue-router": "^4.6.3",
|
|
36
|
+
"vue-sonner": "^2.0.9"
|
|
37
|
+
},
|
|
38
|
+
"packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610",
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@iconify-json/lucide": "^1.2.120",
|
|
41
|
+
"@types/js-cookie": "^3.0.6",
|
|
42
|
+
"@types/node": "^24.10.1",
|
|
43
|
+
"@types/qs": "^6.14.0",
|
|
44
|
+
"autoprefixer": "10.4.20",
|
|
45
|
+
"postcss": "8.4.35",
|
|
46
|
+
"sass": "^1.94.2",
|
|
47
|
+
"shadcn-vue": "^2.8.1",
|
|
48
|
+
"tailwindcss": "3.4.15",
|
|
49
|
+
"tw-animate-css": "^1.4.0",
|
|
50
|
+
"vite-tsconfig-paths": "^5.1.4"
|
|
51
|
+
}
|
|
52
|
+
}
|
package/public/.gitkeep
ADDED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/** @type {import('tailwindcss').Config} */
|
|
2
|
+
module.exports = {
|
|
3
|
+
darkMode: ["class"],
|
|
4
|
+
content: [
|
|
5
|
+
"./components/**/*.{vue,ts,js}",
|
|
6
|
+
"./layouts/**/*.{vue,ts,js}",
|
|
7
|
+
"./pages/**/*.{vue,ts,js}",
|
|
8
|
+
"./app.vue",
|
|
9
|
+
"./layers/**/*.{vue,ts,js}",
|
|
10
|
+
],
|
|
11
|
+
theme: {
|
|
12
|
+
extend: {
|
|
13
|
+
keyframes: {
|
|
14
|
+
'gentle-float': {
|
|
15
|
+
'0%, 100%': { transform: 'translateY(0)' },
|
|
16
|
+
'50%': { transform: 'translateY(-8px)' },
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
animation: {
|
|
20
|
+
'float': 'gentle-float 5s ease-in-out infinite',
|
|
21
|
+
'float-delayed': 'gentle-float 5s ease-in-out 1.2s infinite',
|
|
22
|
+
},
|
|
23
|
+
borderRadius: {
|
|
24
|
+
lg: 'var(--radius)',
|
|
25
|
+
md: 'calc(var(--radius) - 2px)',
|
|
26
|
+
sm: 'calc(var(--radius) - 4px)'
|
|
27
|
+
},
|
|
28
|
+
colors: {
|
|
29
|
+
background: 'hsl(var(--background))',
|
|
30
|
+
foreground: 'hsl(var(--foreground))',
|
|
31
|
+
card: {
|
|
32
|
+
DEFAULT: 'hsl(var(--card))',
|
|
33
|
+
foreground: 'hsl(var(--card-foreground))'
|
|
34
|
+
},
|
|
35
|
+
popover: {
|
|
36
|
+
DEFAULT: 'hsl(var(--popover))',
|
|
37
|
+
foreground: 'hsl(var(--popover-foreground))'
|
|
38
|
+
},
|
|
39
|
+
primary: {
|
|
40
|
+
DEFAULT: 'hsl(var(--primary))',
|
|
41
|
+
foreground: 'hsl(var(--primary-foreground))'
|
|
42
|
+
},
|
|
43
|
+
secondary: {
|
|
44
|
+
DEFAULT: 'hsl(var(--secondary))',
|
|
45
|
+
foreground: 'hsl(var(--secondary-foreground))'
|
|
46
|
+
},
|
|
47
|
+
muted: {
|
|
48
|
+
DEFAULT: 'hsl(var(--muted))',
|
|
49
|
+
foreground: 'hsl(var(--muted-foreground))'
|
|
50
|
+
},
|
|
51
|
+
accent: {
|
|
52
|
+
DEFAULT: 'hsl(var(--accent))',
|
|
53
|
+
foreground: 'hsl(var(--accent-foreground))'
|
|
54
|
+
},
|
|
55
|
+
destructive: {
|
|
56
|
+
DEFAULT: 'hsl(var(--destructive))',
|
|
57
|
+
foreground: 'hsl(var(--destructive-foreground))'
|
|
58
|
+
},
|
|
59
|
+
border: 'hsl(var(--border))',
|
|
60
|
+
input: 'hsl(var(--input))',
|
|
61
|
+
ring: 'hsl(var(--ring))',
|
|
62
|
+
chart: {
|
|
63
|
+
'1': 'hsl(var(--chart-1))',
|
|
64
|
+
'2': 'hsl(var(--chart-2))',
|
|
65
|
+
'3': 'hsl(var(--chart-3))',
|
|
66
|
+
'4': 'hsl(var(--chart-4))',
|
|
67
|
+
'5': 'hsl(var(--chart-5))'
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
plugins: [
|
|
73
|
+
function({ addUtilities }) {
|
|
74
|
+
addUtilities({
|
|
75
|
+
'.bg-grid': {
|
|
76
|
+
'background-image': 'linear-gradient(to right, rgba(15, 23, 42, 0.05) 1px, transparent 1px), linear-gradient(to bottom, rgba(15, 23, 42, 0.05) 1px, transparent 1px)',
|
|
77
|
+
'background-size': '40px 40px',
|
|
78
|
+
},
|
|
79
|
+
'[data-reveal]': {
|
|
80
|
+
'opacity': '0',
|
|
81
|
+
'transform': 'translateY(28px)',
|
|
82
|
+
'transition': 'opacity 0.7s cubic-bezier(0.16, 1, 0.3, 1), transform 0.7s cubic-bezier(0.16, 1, 0.3, 1)',
|
|
83
|
+
'will-change': 'opacity, transform',
|
|
84
|
+
},
|
|
85
|
+
'[data-reveal="fade"]': { 'transform': 'translateY(0)' },
|
|
86
|
+
'[data-reveal="left"]': { 'transform': 'translateX(-28px)' },
|
|
87
|
+
'[data-reveal="right"]': { 'transform': 'translateX(28px)' },
|
|
88
|
+
'[data-reveal="scale"]': { 'transform': 'scale(0.94)' },
|
|
89
|
+
'[data-reveal].reveal-visible': {
|
|
90
|
+
'opacity': '1',
|
|
91
|
+
'transform': 'translate(0, 0) scale(1)',
|
|
92
|
+
},
|
|
93
|
+
})
|
|
94
|
+
}
|
|
95
|
+
],
|
|
96
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ESNext",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "Node",
|
|
6
|
+
"strict": true,
|
|
7
|
+
"jsx": "preserve",
|
|
8
|
+
"esModuleInterop": true,
|
|
9
|
+
"skipLibCheck": true,
|
|
10
|
+
"types": ["node", "nuxt"],
|
|
11
|
+
"baseUrl": ".",
|
|
12
|
+
"paths": {
|
|
13
|
+
"#app": [".nuxt/types/app.d.ts"],
|
|
14
|
+
"#app/*": [".nuxt/types/app/*"]
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"exclude": ["node_modules", ".nuxt", "dist"]
|
|
18
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.base.json",
|
|
3
|
+
"files": [],
|
|
4
|
+
"references": [
|
|
5
|
+
{
|
|
6
|
+
"path": "./.nuxt/tsconfig.app.json"
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"path": "./.nuxt/tsconfig.server.json"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"path": "./.nuxt/tsconfig.shared.json"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"path": "./.nuxt/tsconfig.node.json"
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|