@nguyenphp/antigravity-marketing 1.0.15 → 1.0.18
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/README.md +16 -8
- package/bin/index.js +34 -12
- package/package.json +1 -1
- package/templates/.agent/agents/backend-specialist.md +263 -0
- package/templates/.agent/agents/database-architect.md +226 -0
- package/templates/.agent/agents/debugger.md +225 -0
- package/templates/.agent/agents/devops-engineer.md +242 -0
- package/templates/.agent/agents/documentation-writer.md +104 -0
- package/templates/.agent/agents/explorer-agent.md +73 -0
- package/templates/.agent/agents/frontend-specialist.md +527 -0
- package/templates/.agent/agents/game-developer.md +162 -0
- package/templates/.agent/agents/mobile-developer.md +377 -0
- package/templates/.agent/agents/orchestrator.md +400 -0
- package/templates/.agent/agents/penetration-tester.md +188 -0
- package/templates/.agent/agents/performance-optimizer.md +187 -0
- package/templates/.agent/agents/project-planner.md +403 -0
- package/templates/.agent/agents/security-auditor.md +170 -0
- package/templates/.agent/agents/seo-specialist.md +111 -0
- package/templates/.agent/agents/test-engineer.md +158 -0
- package/templates/.agent/rules/GEMINI.md +248 -0
- package/templates/.agent/skills/analytics-marketing/SKILL.md +172 -324
- package/templates/.agent/skills/api-patterns/SKILL.md +81 -0
- package/templates/.agent/skills/api-patterns/api-style.md +42 -0
- package/templates/.agent/skills/api-patterns/auth.md +24 -0
- package/templates/.agent/skills/api-patterns/documentation.md +26 -0
- package/templates/.agent/skills/api-patterns/graphql.md +41 -0
- package/templates/.agent/skills/api-patterns/rate-limiting.md +31 -0
- package/templates/.agent/skills/api-patterns/response.md +37 -0
- package/templates/.agent/skills/api-patterns/rest.md +40 -0
- package/templates/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
- package/templates/.agent/skills/api-patterns/security-testing.md +122 -0
- package/templates/.agent/skills/api-patterns/trpc.md +41 -0
- package/templates/.agent/skills/api-patterns/versioning.md +22 -0
- package/templates/.agent/skills/app-builder/SKILL.md +75 -0
- package/templates/.agent/skills/app-builder/agent-coordination.md +71 -0
- package/templates/.agent/skills/app-builder/feature-building.md +53 -0
- package/templates/.agent/skills/app-builder/project-detection.md +34 -0
- package/templates/.agent/skills/app-builder/scaffolding.md +118 -0
- package/templates/.agent/skills/app-builder/tech-stack.md +40 -0
- package/templates/.agent/skills/app-builder/templates/SKILL.md +39 -0
- package/templates/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/templates/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/templates/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/templates/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/templates/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/templates/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/templates/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/templates/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +82 -0
- package/templates/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +100 -0
- package/templates/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +106 -0
- package/templates/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +101 -0
- package/templates/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/templates/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +93 -0
- package/templates/.agent/skills/architecture/SKILL.md +55 -0
- package/templates/.agent/skills/architecture/context-discovery.md +43 -0
- package/templates/.agent/skills/architecture/examples.md +94 -0
- package/templates/.agent/skills/architecture/pattern-selection.md +68 -0
- package/templates/.agent/skills/architecture/patterns-reference.md +50 -0
- package/templates/.agent/skills/architecture/trade-off-analysis.md +77 -0
- package/templates/.agent/skills/banner-design/SKILL.md +192 -0
- package/templates/.agent/skills/banner-design/references/banner-sizes-and-styles.md +118 -0
- package/templates/.agent/skills/bash-linux/SKILL.md +199 -0
- package/templates/.agent/skills/behavioral-modes/SKILL.md +242 -0
- package/templates/.agent/skills/brainstorming/SKILL.md +163 -0
- package/templates/.agent/skills/brainstorming/dynamic-questioning.md +350 -0
- package/templates/.agent/skills/brand/SKILL.md +97 -0
- package/templates/.agent/skills/brand/references/approval-checklist.md +169 -0
- package/templates/.agent/skills/brand/references/asset-organization.md +157 -0
- package/templates/.agent/skills/brand/references/brand-guideline-template.md +140 -0
- package/templates/.agent/skills/brand/references/color-palette-management.md +186 -0
- package/templates/.agent/skills/brand/references/consistency-checklist.md +94 -0
- package/templates/.agent/skills/brand/references/logo-usage-rules.md +185 -0
- package/templates/.agent/skills/brand/references/messaging-framework.md +85 -0
- package/templates/.agent/skills/brand/references/typography-specifications.md +214 -0
- package/templates/.agent/skills/brand/references/update.md +118 -0
- package/templates/.agent/skills/brand/references/visual-identity.md +96 -0
- package/templates/.agent/skills/brand/references/voice-framework.md +88 -0
- package/templates/.agent/skills/brand/scripts/extract-colors.cjs +341 -0
- package/templates/.agent/skills/brand/scripts/inject-brand-context.cjs +349 -0
- package/templates/.agent/skills/brand/scripts/sync-brand-to-tokens.cjs +266 -0
- package/templates/.agent/skills/brand/scripts/validate-asset.cjs +387 -0
- package/templates/.agent/skills/brand/templates/brand-guidelines-starter.md +275 -0
- package/templates/.agent/skills/clean-code/SKILL.md +201 -0
- package/templates/.agent/skills/code-review-checklist/SKILL.md +109 -0
- package/templates/.agent/skills/copywriting/SKILL.md +250 -0
- package/templates/.agent/skills/database-design/SKILL.md +52 -0
- package/templates/.agent/skills/database-design/database-selection.md +43 -0
- package/templates/.agent/skills/database-design/indexing.md +39 -0
- package/templates/.agent/skills/database-design/migrations.md +48 -0
- package/templates/.agent/skills/database-design/optimization.md +36 -0
- package/templates/.agent/skills/database-design/orm-selection.md +30 -0
- package/templates/.agent/skills/database-design/schema-design.md +56 -0
- package/templates/.agent/skills/database-design/scripts/schema_validator.py +172 -0
- package/templates/.agent/skills/deployment-procedures/SKILL.md +241 -0
- package/templates/.agent/skills/docker-expert/SKILL.md +409 -0
- package/templates/.agent/skills/frontend-design/animation-guide.md +331 -0
- package/templates/.agent/skills/frontend-design/color-system.md +311 -0
- package/templates/.agent/skills/frontend-design/decision-trees.md +418 -0
- package/templates/.agent/skills/frontend-design/motion-graphics.md +306 -0
- package/templates/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/templates/.agent/skills/frontend-design/scripts/ux_audit.py +722 -0
- package/templates/.agent/skills/frontend-design/typography-system.md +345 -0
- package/templates/.agent/skills/frontend-design/ux-psychology.md +541 -0
- package/templates/.agent/skills/frontend-design/visual-effects.md +383 -0
- package/templates/.agent/skills/frontend-slides/SKILL.md +92 -0
- package/templates/.agent/skills/frontend-slides/STYLE_PRESETS.md +347 -0
- package/templates/.agent/skills/frontend-slides/animation-patterns.md +110 -0
- package/templates/.agent/skills/frontend-slides/examples/n8n-jupviec-automation.html +789 -0
- package/templates/.agent/skills/frontend-slides/examples/n8n-jupviec-automation.pptx +0 -0
- package/templates/.agent/skills/frontend-slides/html-template.md +347 -0
- package/templates/.agent/skills/frontend-slides/scripts/export-pptx.py +58 -0
- package/templates/.agent/skills/frontend-slides/scripts/extract-pptx.py +96 -0
- package/templates/.agent/skills/frontend-slides/viewport-base.css +153 -0
- package/templates/.agent/skills/game-development/2d-games/SKILL.md +119 -0
- package/templates/.agent/skills/game-development/3d-games/SKILL.md +135 -0
- package/templates/.agent/skills/game-development/SKILL.md +167 -0
- package/templates/.agent/skills/game-development/game-art/SKILL.md +185 -0
- package/templates/.agent/skills/game-development/game-audio/SKILL.md +190 -0
- package/templates/.agent/skills/game-development/game-design/SKILL.md +129 -0
- package/templates/.agent/skills/game-development/mobile-games/SKILL.md +108 -0
- package/templates/.agent/skills/game-development/multiplayer/SKILL.md +132 -0
- package/templates/.agent/skills/game-development/pc-games/SKILL.md +144 -0
- package/templates/.agent/skills/game-development/vr-ar/SKILL.md +123 -0
- package/templates/.agent/skills/game-development/web-games/SKILL.md +150 -0
- package/templates/.agent/skills/geo-fundamentals/SKILL.md +156 -0
- package/templates/.agent/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/templates/.agent/skills/growth-engine/SKILL.md +244 -0
- package/templates/.agent/skills/i18n-localization/SKILL.md +154 -0
- package/templates/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/templates/.agent/skills/lint-and-validate/SKILL.md +45 -0
- package/templates/.agent/skills/lint-and-validate/scripts/lint_runner.py +172 -0
- package/templates/.agent/skills/lint-and-validate/scripts/type_coverage.py +173 -0
- package/templates/.agent/skills/mcp-builder/SKILL.md +176 -0
- package/templates/.agent/skills/mobile-design/SKILL.md +394 -0
- package/templates/.agent/skills/mobile-design/decision-trees.md +516 -0
- package/templates/.agent/skills/mobile-design/mobile-backend.md +491 -0
- package/templates/.agent/skills/mobile-design/mobile-color-system.md +420 -0
- package/templates/.agent/skills/mobile-design/mobile-debugging.md +122 -0
- package/templates/.agent/skills/mobile-design/mobile-design-thinking.md +357 -0
- package/templates/.agent/skills/mobile-design/mobile-navigation.md +458 -0
- package/templates/.agent/skills/mobile-design/mobile-performance.md +767 -0
- package/templates/.agent/skills/mobile-design/mobile-testing.md +356 -0
- package/templates/.agent/skills/mobile-design/mobile-typography.md +433 -0
- package/templates/.agent/skills/mobile-design/platform-android.md +666 -0
- package/templates/.agent/skills/mobile-design/platform-ios.md +561 -0
- package/templates/.agent/skills/mobile-design/scripts/mobile_audit.py +670 -0
- package/templates/.agent/skills/mobile-design/touch-psychology.md +537 -0
- package/templates/.agent/skills/nestjs-expert/SKILL.md +552 -0
- package/templates/.agent/skills/nextjs-best-practices/SKILL.md +203 -0
- package/templates/.agent/skills/nodejs-best-practices/SKILL.md +333 -0
- package/templates/.agent/skills/parallel-agents/SKILL.md +175 -0
- package/templates/.agent/skills/performance-profiling/SKILL.md +143 -0
- package/templates/.agent/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/templates/.agent/skills/plan-writing/SKILL.md +152 -0
- package/templates/.agent/skills/powershell-windows/SKILL.md +167 -0
- package/templates/.agent/skills/ppc-advertising/SKILL.md +183 -475
- package/templates/.agent/skills/prisma-expert/SKILL.md +355 -0
- package/templates/.agent/skills/python-patterns/SKILL.md +441 -0
- package/templates/.agent/skills/react-patterns/SKILL.md +198 -0
- package/templates/.agent/skills/red-team-tactics/SKILL.md +199 -0
- package/templates/.agent/skills/remotion-best-practices/SKILL.md +45 -111
- package/templates/.agent/skills/remotion-best-practices/rules/3d.md +4 -4
- package/templates/.agent/skills/remotion-best-practices/rules/animations.md +5 -7
- package/templates/.agent/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
- package/templates/.agent/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
- package/templates/.agent/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +103 -0
- package/templates/.agent/skills/remotion-best-practices/rules/assets.md +78 -0
- package/templates/.agent/skills/remotion-best-practices/rules/audio-visualization.md +198 -0
- package/templates/.agent/skills/remotion-best-practices/rules/audio.md +1 -4
- package/templates/.agent/skills/remotion-best-practices/rules/calculate-metadata.md +47 -17
- package/templates/.agent/skills/remotion-best-practices/rules/can-decode.md +75 -0
- package/templates/.agent/skills/remotion-best-practices/rules/charts.md +80 -48
- package/templates/.agent/skills/remotion-best-practices/rules/compositions.md +22 -14
- package/templates/.agent/skills/remotion-best-practices/rules/display-captions.md +79 -21
- package/templates/.agent/skills/remotion-best-practices/rules/extract-frames.md +229 -0
- package/templates/.agent/skills/remotion-best-practices/rules/ffmpeg.md +38 -0
- package/templates/.agent/skills/remotion-best-practices/rules/fonts.md +96 -54
- package/templates/.agent/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
- package/templates/.agent/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
- package/templates/.agent/skills/remotion-best-practices/rules/get-video-duration.md +60 -0
- package/templates/.agent/skills/remotion-best-practices/rules/gifs.md +21 -18
- package/templates/.agent/skills/remotion-best-practices/rules/images.md +6 -2
- package/templates/.agent/skills/remotion-best-practices/rules/import-srt-captions.md +69 -0
- package/templates/.agent/skills/remotion-best-practices/rules/light-leaks.md +73 -0
- package/templates/.agent/skills/remotion-best-practices/rules/lottie.md +10 -7
- package/templates/.agent/skills/remotion-best-practices/rules/maps.md +412 -0
- package/templates/.agent/skills/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
- package/templates/.agent/skills/remotion-best-practices/rules/measuring-text.md +140 -0
- package/templates/.agent/skills/remotion-best-practices/rules/parameters.md +109 -0
- package/templates/.agent/skills/remotion-best-practices/rules/sequencing.md +13 -1
- package/templates/.agent/skills/remotion-best-practices/rules/sfx.md +26 -0
- package/templates/.agent/skills/remotion-best-practices/rules/subtitles.md +36 -0
- package/templates/.agent/skills/remotion-best-practices/rules/tailwind.md +11 -0
- package/templates/.agent/skills/remotion-best-practices/rules/text-animations.md +4 -115
- package/templates/.agent/skills/remotion-best-practices/rules/timing.md +19 -19
- package/templates/.agent/skills/remotion-best-practices/rules/transcribe-captions.md +70 -0
- package/templates/.agent/skills/remotion-best-practices/rules/transitions.md +117 -42
- package/templates/.agent/skills/remotion-best-practices/rules/transparent-videos.md +106 -0
- package/templates/.agent/skills/remotion-best-practices/rules/trimming.md +51 -0
- package/templates/.agent/skills/remotion-best-practices/rules/voiceover.md +99 -0
- package/templates/.agent/skills/seo-fundamentals/SKILL.md +83 -441
- package/templates/.agent/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/templates/.agent/skills/server-management/SKILL.md +161 -0
- package/templates/.agent/skills/systematic-debugging/SKILL.md +109 -0
- package/templates/.agent/skills/tdd-workflow/SKILL.md +149 -0
- package/templates/.agent/skills/testing-patterns/SKILL.md +178 -0
- package/templates/.agent/skills/testing-patterns/scripts/test_runner.py +219 -0
- package/templates/.agent/skills/typescript-expert/SKILL.md +429 -0
- package/templates/.agent/skills/ui-ux-pro-max/SKILL.md +585 -170
- package/templates/.agent/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/prompts.csv +24 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/styles.csv +59 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/templates/.agent/skills/ui-ux-pro-max/scripts/core.py +257 -0
- package/templates/.agent/skills/ui-ux-pro-max/scripts/design_system.py +487 -0
- package/templates/.agent/skills/ui-ux-pro-max/scripts/search.py +76 -0
- package/templates/.agent/skills/vue-expert/SKILL.md +374 -0
- package/templates/.agent/skills/vulnerability-scanner/SKILL.md +276 -0
- package/templates/.agent/skills/vulnerability-scanner/checklists.md +121 -0
- package/templates/.agent/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/templates/.agent/skills/webapp-testing/SKILL.md +187 -0
- package/templates/.agent/skills/webapp-testing/scripts/playwright_runner.py +173 -0
- package/templates/.agent/workflows/brainstorm.md +113 -0
- package/templates/.agent/workflows/create.md +59 -0
- package/templates/.agent/workflows/debug.md +103 -0
- package/templates/.agent/workflows/deploy.md +176 -0
- package/templates/.agent/workflows/enhance.md +63 -0
- package/templates/.agent/workflows/orchestrate.md +237 -0
- package/templates/.agent/workflows/plan.md +89 -0
- package/templates/.agent/workflows/preview.md +80 -0
- package/templates/.agent/workflows/status.md +86 -0
- package/templates/.agent/workflows/test.md +144 -0
- package/templates/.agent/workflows/ui-ux-pro-max.md +231 -0
|
@@ -0,0 +1,789 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="vi">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>n8n Content Automation - JupViec.vn</title>
|
|
7
|
+
|
|
8
|
+
<!-- Fonts -->
|
|
9
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
10
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
11
|
+
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap" rel="stylesheet">
|
|
12
|
+
|
|
13
|
+
<style>
|
|
14
|
+
/* ===========================================
|
|
15
|
+
JUPVIEC DESIGN SYSTEM & THEME
|
|
16
|
+
=========================================== */
|
|
17
|
+
:root {
|
|
18
|
+
/* Colors */
|
|
19
|
+
--jv-green: #8CC63F;
|
|
20
|
+
--jv-blue: #00AEEF;
|
|
21
|
+
--jv-dark: #1E1E1E;
|
|
22
|
+
--jv-gray: #F5F5F5;
|
|
23
|
+
--jv-white: #FFFFFF;
|
|
24
|
+
|
|
25
|
+
--bg-primary: var(--jv-white);
|
|
26
|
+
--bg-accent: var(--jv-dark);
|
|
27
|
+
--text-primary: var(--jv-dark);
|
|
28
|
+
--text-secondary: #555555;
|
|
29
|
+
--text-light: var(--jv-white);
|
|
30
|
+
|
|
31
|
+
/* Spacing */
|
|
32
|
+
--slide-padding: clamp(1.5rem, 5vw, 4rem);
|
|
33
|
+
--content-gap: clamp(1rem, 3vw, 2.5rem);
|
|
34
|
+
|
|
35
|
+
/* Animation */
|
|
36
|
+
--ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
|
|
37
|
+
--duration-normal: 0.6s;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* --- Viewport Base (Mandatory) --- */
|
|
41
|
+
html, body {
|
|
42
|
+
height: 100%;
|
|
43
|
+
overflow: hidden;
|
|
44
|
+
margin: 0;
|
|
45
|
+
padding: 0;
|
|
46
|
+
font-family: 'Roboto', sans-serif;
|
|
47
|
+
background: var(--bg-primary);
|
|
48
|
+
color: var(--text-primary);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
html {
|
|
52
|
+
scroll-snap-type: y mandatory;
|
|
53
|
+
scroll-behavior: smooth;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.slide {
|
|
57
|
+
width: 100vw;
|
|
58
|
+
height: 100vh;
|
|
59
|
+
height: 100dvh;
|
|
60
|
+
overflow: hidden;
|
|
61
|
+
scroll-snap-align: start;
|
|
62
|
+
display: flex;
|
|
63
|
+
flex-direction: column;
|
|
64
|
+
position: relative;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.slide-content {
|
|
68
|
+
flex: 1;
|
|
69
|
+
display: flex;
|
|
70
|
+
flex-direction: column;
|
|
71
|
+
justify-content: center;
|
|
72
|
+
max-height: 100%;
|
|
73
|
+
padding: var(--slide-padding);
|
|
74
|
+
padding-top: 100px; /* Space for sticky header */
|
|
75
|
+
z-index: 1;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* --- JupViec Header --- */
|
|
79
|
+
.page-header {
|
|
80
|
+
position: fixed;
|
|
81
|
+
top: 0;
|
|
82
|
+
left: 0;
|
|
83
|
+
width: 100%;
|
|
84
|
+
z-index: 100;
|
|
85
|
+
background: white;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.top-bar {
|
|
89
|
+
height: 6px;
|
|
90
|
+
width: 100%;
|
|
91
|
+
display: flex;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.top-bar .green { background: var(--jv-green); flex: 1; }
|
|
95
|
+
.top-bar .blue { background: var(--jv-blue); flex: 4; }
|
|
96
|
+
|
|
97
|
+
.header-main {
|
|
98
|
+
padding: 15px 40px;
|
|
99
|
+
display: flex;
|
|
100
|
+
align-items: center;
|
|
101
|
+
gap: 20px;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.jv-logo {
|
|
105
|
+
height: 40px;
|
|
106
|
+
display: flex;
|
|
107
|
+
align-items: center;
|
|
108
|
+
font-weight: 700;
|
|
109
|
+
font-size: 24px;
|
|
110
|
+
color: var(--jv-green);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.jv-logo span { color: var(--jv-blue); }
|
|
114
|
+
|
|
115
|
+
.vertical-divider {
|
|
116
|
+
width: 1px;
|
|
117
|
+
height: 30px;
|
|
118
|
+
background: #ddd;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.slogan {
|
|
122
|
+
font-size: 14px;
|
|
123
|
+
color: var(--text-secondary);
|
|
124
|
+
font-weight: 300;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.ladle-icon {
|
|
128
|
+
width: 32px;
|
|
129
|
+
height: 32px;
|
|
130
|
+
background: var(--jv-green);
|
|
131
|
+
border-radius: 50%;
|
|
132
|
+
display: flex;
|
|
133
|
+
align-items: center;
|
|
134
|
+
justify-content: center;
|
|
135
|
+
margin-left: auto;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.ladle-icon svg {
|
|
139
|
+
width: 18px;
|
|
140
|
+
height: 18px;
|
|
141
|
+
fill: white;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* --- Typography --- */
|
|
145
|
+
h1 { font-size: clamp(2rem, 6vw, 4.5rem); line-height: 1.1; margin-bottom: 0.5em; font-weight: 700; }
|
|
146
|
+
h2 { font-size: clamp(1.5rem, 4vw, 3rem); line-height: 1.2; margin-bottom: 0.5em; font-weight: 700; color: var(--jv-green); }
|
|
147
|
+
p { font-size: clamp(1rem, 1.5vw, 1.25rem); line-height: 1.6; margin-bottom: 1em; max-width: 800px; }
|
|
148
|
+
|
|
149
|
+
/* --- Reveal Animations --- */
|
|
150
|
+
.reveal {
|
|
151
|
+
opacity: 0;
|
|
152
|
+
transform: translateY(30px);
|
|
153
|
+
transition: opacity var(--duration-normal) var(--ease-out-expo),
|
|
154
|
+
transform var(--duration-normal) var(--ease-out-expo);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.slide.visible .reveal {
|
|
158
|
+
opacity: 1;
|
|
159
|
+
transform: translateY(0);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.reveal:nth-child(2) { transition-delay: 0.1s; }
|
|
163
|
+
.reveal:nth-child(3) { transition-delay: 0.2s; }
|
|
164
|
+
.reveal:nth-child(4) { transition-delay: 0.3s; }
|
|
165
|
+
|
|
166
|
+
/* --- Flowchart Styles --- */
|
|
167
|
+
.flowchart {
|
|
168
|
+
display: flex;
|
|
169
|
+
align-items: center;
|
|
170
|
+
justify-content: center;
|
|
171
|
+
gap: 20px;
|
|
172
|
+
margin-top: 20px;
|
|
173
|
+
flex-wrap: wrap; /* Allow wrapping on small screens */
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.workflow-image-container {
|
|
177
|
+
width: 100%;
|
|
178
|
+
max-height: 40vh;
|
|
179
|
+
margin-bottom: 20px;
|
|
180
|
+
border-radius: 12px;
|
|
181
|
+
overflow: hidden;
|
|
182
|
+
box-shadow: 0 10px 30px rgba(0,0,0,0.1);
|
|
183
|
+
background: #000;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.workflow-image-container img {
|
|
187
|
+
width: 100%;
|
|
188
|
+
height: 100%;
|
|
189
|
+
object-fit: contain;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.node {
|
|
193
|
+
background: var(--jv-white);
|
|
194
|
+
color: var(--jv-dark);
|
|
195
|
+
padding: 24px 20px;
|
|
196
|
+
border-radius: 16px;
|
|
197
|
+
box-shadow: 0 10px 40px rgba(0,0,0,0.06);
|
|
198
|
+
position: relative;
|
|
199
|
+
min-width: 200px;
|
|
200
|
+
text-align: center;
|
|
201
|
+
border: 2px solid #eee;
|
|
202
|
+
transition: all 0.3s ease;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.node:hover {
|
|
206
|
+
transform: translateY(-5px);
|
|
207
|
+
border-color: var(--jv-green);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.node-icon {
|
|
211
|
+
width: 48px;
|
|
212
|
+
height: 48px;
|
|
213
|
+
margin: 0 auto 12px;
|
|
214
|
+
display: flex;
|
|
215
|
+
align-items: center;
|
|
216
|
+
justify-content: center;
|
|
217
|
+
background: rgba(140, 198, 63, 0.1);
|
|
218
|
+
border-radius: 12px;
|
|
219
|
+
font-size: 24px;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.node-title { font-weight: 700; font-size: 16px; margin-bottom: 8px; color: var(--jv-dark); }
|
|
223
|
+
.node-desc { font-size: 13px; color: var(--text-secondary); line-height: 1.4; }
|
|
224
|
+
|
|
225
|
+
.connector {
|
|
226
|
+
width: 40px;
|
|
227
|
+
height: 2px;
|
|
228
|
+
background: var(--jv-green);
|
|
229
|
+
position: relative;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.connector::after {
|
|
233
|
+
content: '';
|
|
234
|
+
position: absolute;
|
|
235
|
+
right: 0;
|
|
236
|
+
top: -4px;
|
|
237
|
+
border-left: 6px solid var(--jv-green);
|
|
238
|
+
border-top: 5px solid transparent;
|
|
239
|
+
border-bottom: 5px solid transparent;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/* --- Inline Edit UI --- */
|
|
243
|
+
.edit-hotzone {
|
|
244
|
+
position: fixed; top: 0; left: 0;
|
|
245
|
+
width: 80px; height: 80px;
|
|
246
|
+
z-index: 10000;
|
|
247
|
+
cursor: pointer;
|
|
248
|
+
}
|
|
249
|
+
.edit-toggle {
|
|
250
|
+
position: fixed; top: 20px; left: 20px;
|
|
251
|
+
opacity: 0;
|
|
252
|
+
pointer-events: none;
|
|
253
|
+
transition: opacity 0.3s ease;
|
|
254
|
+
z-index: 10001;
|
|
255
|
+
background: var(--jv-dark);
|
|
256
|
+
color: white;
|
|
257
|
+
border: none;
|
|
258
|
+
border-radius: 50%;
|
|
259
|
+
width: 40px;
|
|
260
|
+
height: 40px;
|
|
261
|
+
cursor: pointer;
|
|
262
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.2);
|
|
263
|
+
}
|
|
264
|
+
.edit-toggle.show, .edit-toggle.active {
|
|
265
|
+
opacity: 1;
|
|
266
|
+
pointer-events: auto;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
.edit-toggle.active {
|
|
270
|
+
background: var(--jv-green);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/* Highlight editable elements in edit mode */
|
|
274
|
+
body.editing-mode .reveal,
|
|
275
|
+
body.editing-mode p,
|
|
276
|
+
body.editing-mode h1,
|
|
277
|
+
body.editing-mode h2,
|
|
278
|
+
body.editing-mode .node-title,
|
|
279
|
+
body.editing-mode .node-desc {
|
|
280
|
+
outline: 2px dashed var(--jv-blue);
|
|
281
|
+
outline-offset: 4px;
|
|
282
|
+
cursor: text;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/* --- Grid & Lists --- */
|
|
286
|
+
.slide-grid {
|
|
287
|
+
display: grid;
|
|
288
|
+
grid-template-columns: repeat(2, 1fr);
|
|
289
|
+
gap: 30px;
|
|
290
|
+
margin-top: 20px;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
.benefit-card {
|
|
294
|
+
background: #fff;
|
|
295
|
+
padding: 24px;
|
|
296
|
+
border-radius: 12px;
|
|
297
|
+
border-left: 4px solid var(--jv-green);
|
|
298
|
+
box-shadow: 0 4px 15px rgba(0,0,0,0.05);
|
|
299
|
+
transition: transform 0.3s ease;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.benefit-card:hover { transform: translateY(-5px); }
|
|
303
|
+
.benefit-card h3 { font-size: 18px; margin-bottom: 10px; color: var(--jv-blue); }
|
|
304
|
+
.benefit-card p { font-size: 14px; margin-bottom: 0; }
|
|
305
|
+
|
|
306
|
+
.marketing-section {
|
|
307
|
+
background: var(--jv-dark);
|
|
308
|
+
color: white;
|
|
309
|
+
padding: 40px;
|
|
310
|
+
border-radius: 20px;
|
|
311
|
+
margin-top: 20px;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
.marketing-grid {
|
|
315
|
+
display: grid;
|
|
316
|
+
grid-template-columns: repeat(3, 1fr);
|
|
317
|
+
gap: 20px;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.m-item {
|
|
321
|
+
background: rgba(255,255,255,0.05);
|
|
322
|
+
padding: 15px;
|
|
323
|
+
border-radius: 10px;
|
|
324
|
+
border: 1px solid rgba(255,255,255,0.1);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
.m-item h4 { color: var(--jv-green); margin-bottom: 5px; font-size: 16px; }
|
|
328
|
+
.m-item p { font-size: 13px; opacity: 0.8; margin-bottom: 0; }
|
|
329
|
+
|
|
330
|
+
/* --- Footer Info --- */
|
|
331
|
+
.slide-footer {
|
|
332
|
+
position: absolute; bottom: 30px; left: var(--slide-padding);
|
|
333
|
+
font-size: 12px; color: #999;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/* --- Navigation --- */
|
|
337
|
+
.progress-bar {
|
|
338
|
+
position: fixed; bottom: 0; left: 0;
|
|
339
|
+
height: 4px; background: var(--jv-blue);
|
|
340
|
+
width: 0%; z-index: 101; transition: width 0.3s ease;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.nav-dots {
|
|
344
|
+
position: fixed; right: 20px; top: 50%;
|
|
345
|
+
transform: translateY(-50%); z-index: 101;
|
|
346
|
+
display: flex; flex-direction: column; gap: 10px;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.dot {
|
|
350
|
+
width: 10px; height: 10px; border-radius: 50%;
|
|
351
|
+
background: rgba(0,0,0,0.2); cursor: pointer;
|
|
352
|
+
transition: all 0.3s ease;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
.dot.active { background: var(--jv-blue); transform: scale(1.3); }
|
|
356
|
+
|
|
357
|
+
/* ===========================================
|
|
358
|
+
RESPONSIVE FIXES
|
|
359
|
+
=========================================== */
|
|
360
|
+
@media (max-width: 768px) {
|
|
361
|
+
.header-main { padding: 10px 20px; gap: 10px; }
|
|
362
|
+
.jv-logo { font-size: 20px; }
|
|
363
|
+
.slogan { display: none; }
|
|
364
|
+
.vertical-divider { display: none; }
|
|
365
|
+
|
|
366
|
+
.slide-content { padding-top: 80px; }
|
|
367
|
+
|
|
368
|
+
.flowchart { flex-direction: column; gap: 15px; }
|
|
369
|
+
.connector { width: 2px; height: 15px; margin: 0 auto; }
|
|
370
|
+
.connector::after {
|
|
371
|
+
right: -4px; bottom: 0; top: auto;
|
|
372
|
+
border-left: 5px solid transparent;
|
|
373
|
+
border-right: 5px solid transparent;
|
|
374
|
+
border-top: 6px solid var(--jv-green);
|
|
375
|
+
border-bottom: none;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
.node { min-width: 100%; padding: 15px; border-radius: 10px; }
|
|
379
|
+
.node-icon { width: 32px; height: 32px; font-size: 18px; margin-bottom: 5px; }
|
|
380
|
+
.node-title { font-size: 14px; margin-bottom: 3px; }
|
|
381
|
+
.node-desc { font-size: 11px; }
|
|
382
|
+
|
|
383
|
+
.workflow-image-container { max-height: 25vh; }
|
|
384
|
+
|
|
385
|
+
.slide-grid, .marketing-grid {
|
|
386
|
+
grid-template-columns: 1fr;
|
|
387
|
+
gap: 15px;
|
|
388
|
+
overflow-y: auto;
|
|
389
|
+
padding-right: 5px;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
.benefit-card { padding: 15px; }
|
|
393
|
+
.benefit-card h3 { font-size: 16px; }
|
|
394
|
+
.benefit-card p { font-size: 13px; }
|
|
395
|
+
|
|
396
|
+
.marketing-section { padding: 20px; border-radius: 15px; }
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
@media (max-height: 700px) {
|
|
400
|
+
.workflow-image-container { display: none; } /* Hide image on very short screens to keep text */
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
</style>
|
|
404
|
+
</head>
|
|
405
|
+
<body>
|
|
406
|
+
|
|
407
|
+
<header class="page-header">
|
|
408
|
+
<div class="top-bar">
|
|
409
|
+
<div class="green"></div>
|
|
410
|
+
<div class="blue"></div>
|
|
411
|
+
</div>
|
|
412
|
+
<div class="header-main">
|
|
413
|
+
<div class="jv-logo">Jup<span>Viec</span>.vn</div>
|
|
414
|
+
<div class="vertical-divider"></div>
|
|
415
|
+
<div class="slogan">Thay đổi cuộc sống phụ nữ Việt</div>
|
|
416
|
+
<div class="ladle-icon">
|
|
417
|
+
<svg viewBox="0 0 24 24"><path d="M11,21H13V15.5C13,14.67 12.33,14 11.5,14C10.67,14 10,14.67 10,15.5V21H11M14,10H10C6.69,10 4,12.69 4,16V17H20V16C20,12.69 17.31,10 14,10M12,2C10.12,2 8.35,2.46 6.81,3.27C5.69,3.87 5,5.03 5,6.31V9H19V6.31C19,5.03 18.31,3.87 17.19,3.27C15.65,2.46 13.88,2 12,2M12,4C13.43,4 14.8,4.35 16,5H8C9.2,4.35 10.57,4 12,4Z"/></svg>
|
|
418
|
+
</div>
|
|
419
|
+
</div>
|
|
420
|
+
</header>
|
|
421
|
+
|
|
422
|
+
<div class="progress-bar" id="progressBar"></div>
|
|
423
|
+
<nav class="nav-dots" id="navDots"></nav>
|
|
424
|
+
|
|
425
|
+
<div class="edit-hotzone"></div>
|
|
426
|
+
<button class="edit-toggle" id="editToggle" title="Chế độ sửa (E)">✏️</button>
|
|
427
|
+
|
|
428
|
+
<!-- Slide 1: Title -->
|
|
429
|
+
<section class="slide visible" id="slide1">
|
|
430
|
+
<div class="slide-content">
|
|
431
|
+
<h1 class="reveal">Tự động hóa Content<br>với <span style="color:var(--jv-blue)">n8n</span></h1>
|
|
432
|
+
<p class="reveal">Giải pháp tối ưu hiệu năng và chi phí cho JupViec.vn</p>
|
|
433
|
+
</div>
|
|
434
|
+
<div class="slide-footer">AI Automation | JupViec.vn</div>
|
|
435
|
+
</section>
|
|
436
|
+
|
|
437
|
+
<!-- Slide 2: n8n Workflow -->
|
|
438
|
+
<section class="slide" id="slide2">
|
|
439
|
+
<div class="slide-content">
|
|
440
|
+
<h2 class="reveal">Quy trình vận hành n8n</h2>
|
|
441
|
+
|
|
442
|
+
<!-- Added Actual Workflow Image -->
|
|
443
|
+
<div class="workflow-image-container reveal">
|
|
444
|
+
<img src="assets/n8n-workflow.png" alt="n8n Workflow Screenshot">
|
|
445
|
+
</div>
|
|
446
|
+
|
|
447
|
+
<div class="flowchart reveal">
|
|
448
|
+
<div class="node">
|
|
449
|
+
<div class="node-icon">📥</div>
|
|
450
|
+
<div class="node-title">Nguồn dữ liệu</div>
|
|
451
|
+
<div class="node-desc">RSS, Social, Sheets</div>
|
|
452
|
+
</div>
|
|
453
|
+
<div class="connector"></div>
|
|
454
|
+
<div class="node">
|
|
455
|
+
<div class="node-icon">🧠</div>
|
|
456
|
+
<div class="node-title">AI Processing</div>
|
|
457
|
+
<div class="node-desc">Gemini / OpenAI</div>
|
|
458
|
+
</div>
|
|
459
|
+
<div class="connector"></div>
|
|
460
|
+
<div class="node" style="border-color: var(--jv-blue);">
|
|
461
|
+
<div class="node-icon">🔍</div>
|
|
462
|
+
<div class="node-title">Review & Edit</div>
|
|
463
|
+
<div class="node-desc">Duyệt trước khi đăng</div>
|
|
464
|
+
</div>
|
|
465
|
+
<div class="connector"></div>
|
|
466
|
+
<div class="node">
|
|
467
|
+
<div class="node-icon">📤</div>
|
|
468
|
+
<div class="node-title">Publishing</div>
|
|
469
|
+
<div class="node-desc">WordPress, FB, Insta</div>
|
|
470
|
+
</div>
|
|
471
|
+
</div>
|
|
472
|
+
</div>
|
|
473
|
+
<div class="slide-footer">Workflow Logic | Slide 02</div>
|
|
474
|
+
</section>
|
|
475
|
+
|
|
476
|
+
<!-- Slide 3: Detailed Process -->
|
|
477
|
+
<section class="slide" id="slide3">
|
|
478
|
+
<div class="slide-content">
|
|
479
|
+
<h2 class="reveal">Chi tiết các bước thực hiện</h2>
|
|
480
|
+
<div class="slide-grid reveal">
|
|
481
|
+
<div class="benefit-card">
|
|
482
|
+
<h3>1. Nhập liệu (Input)</h3>
|
|
483
|
+
<p>Tự động lấy dữ liệu từ Google Sheets, RSS feed tin tức gia đình, hoặc trend mới nhất từ Social Media.</p>
|
|
484
|
+
</div>
|
|
485
|
+
<div class="benefit-card">
|
|
486
|
+
<h3>2. Phân tích & Viết (AI Write)</h3>
|
|
487
|
+
<p>Sử dụng LLM (Gemini/GPT) để lên đề cương, viết nội dung chi tiết và tạo hình ảnh minh họa qua n8n nodes.</p>
|
|
488
|
+
</div>
|
|
489
|
+
<div class="benefit-card">
|
|
490
|
+
<h3>3. Kiểm duyệt (Human-in-the-loop)</h3>
|
|
491
|
+
<p>Workflow gửi thông báo qua Slack/Telegram cho Admin duyệt. Chỉ cần nhấn "Duyệt" để tiến hành đăng tải.</p>
|
|
492
|
+
</div>
|
|
493
|
+
<div class="benefit-card">
|
|
494
|
+
<h3>4. Phân phối (Publishing)</h3>
|
|
495
|
+
<p>Tự động đăng bài lên WordPress blog, Fanpage Facebook, Group cộng đồng và gửi Newsletter email.</p>
|
|
496
|
+
</div>
|
|
497
|
+
</div>
|
|
498
|
+
</div>
|
|
499
|
+
<div class="slide-footer">Automation Steps | Slide 03</div>
|
|
500
|
+
</section>
|
|
501
|
+
|
|
502
|
+
<!-- Slide 4: Advantages -->
|
|
503
|
+
<section class="slide" id="slide4">
|
|
504
|
+
<div class="slide-content">
|
|
505
|
+
<h2 class="reveal">Ưu điểm vượt trội</h2>
|
|
506
|
+
<div class="slide-grid reveal" style="grid-template-columns: repeat(3, 1fr);">
|
|
507
|
+
<div class="benefit-card" style="border-left-color: var(--jv-blue);">
|
|
508
|
+
<div style="font-size: 32px; margin-bottom: 10px;">⚡</div>
|
|
509
|
+
<h3>Tốc độ</h3>
|
|
510
|
+
<p>Từ ý tưởng đến bài viết trong 30 giây thay vì 3 tiếng.</p>
|
|
511
|
+
</div>
|
|
512
|
+
<div class="benefit-card">
|
|
513
|
+
<div style="font-size: 32px; margin-bottom: 10px;">💰</div>
|
|
514
|
+
<h3>Tiết kiệm</h3>
|
|
515
|
+
<p>Giảm 80% chi phí sản xuất content so với thuê agency.</p>
|
|
516
|
+
</div>
|
|
517
|
+
<div class="benefit-card" style="border-left-color: #f39c12;">
|
|
518
|
+
<div style="font-size: 32px; margin-bottom: 10px;">🔄</div>
|
|
519
|
+
<h3>Nhất quán</h3>
|
|
520
|
+
<p>Nội dung đa kênh luôn duy trì đúng Brand Voice của JupViec.</p>
|
|
521
|
+
</div>
|
|
522
|
+
</div>
|
|
523
|
+
</div>
|
|
524
|
+
<div class="slide-footer">Benefits & Value | Slide 04</div>
|
|
525
|
+
</section>
|
|
526
|
+
|
|
527
|
+
<!-- Slide 5: Expansion -->
|
|
528
|
+
<section class="slide" id="slide5">
|
|
529
|
+
<div class="slide-content">
|
|
530
|
+
<h2 class="reveal">Mở rộng n8n cho JupViec</h2>
|
|
531
|
+
<p class="reveal">Một nền tảng, vạn khả năng - Tối ưu toàn bộ hành trình khách hàng & nhân viên.</p>
|
|
532
|
+
<div class="slide-grid reveal">
|
|
533
|
+
<div class="benefit-card">
|
|
534
|
+
<h3>Vận hành (Operations)</h3>
|
|
535
|
+
<p>Tự động matching Người giúp việc với Khách hàng dựa trên vị trí và lịch trống.</p>
|
|
536
|
+
</div>
|
|
537
|
+
<div class="benefit-card">
|
|
538
|
+
<h3>Chăm sóc khách hàng (CS)</h3>
|
|
539
|
+
<p>AI Chatbot phân loại khiếu nại và tự động gửi voucher xin lỗi cho các case đơn giản.</p>
|
|
540
|
+
</div>
|
|
541
|
+
<div class="benefit-card">
|
|
542
|
+
<h3>Nhân sự (HR)</h3>
|
|
543
|
+
<p>Sàng lọc hồ sơ Người giúp việc tự động từ Form đăng ký và hẹn lịch phỏng vấn.</p>
|
|
544
|
+
</div>
|
|
545
|
+
<div class="benefit-card" style="background: var(--jv-gray); border-left-color: var(--jv-blue);">
|
|
546
|
+
<h3>Dữ liệu (BI)</h3>
|
|
547
|
+
<p>Tổng hợp báo cáo doanh thu, đánh giá sao hàng ngày gửi trực tiếp lên Slack/Email.</p>
|
|
548
|
+
</div>
|
|
549
|
+
</div>
|
|
550
|
+
</div>
|
|
551
|
+
<div class="slide-footer">Scalability | Slide 05</div>
|
|
552
|
+
</section>
|
|
553
|
+
|
|
554
|
+
<!-- Slide 6: Deep Dive Marketing -->
|
|
555
|
+
<section class="slide" id="slide6">
|
|
556
|
+
<div class="slide-content">
|
|
557
|
+
<h2 class="reveal">🎯 Đào sâu: Team Marketing Automation</h2>
|
|
558
|
+
<div class="marketing-section reveal">
|
|
559
|
+
<div class="marketing-grid">
|
|
560
|
+
<div class="m-item">
|
|
561
|
+
<h4>Lead Generation</h4>
|
|
562
|
+
<p>Scrape social mentions khách tìm người giúp việc -> Thêm vào CRM -> Alert Sales.</p>
|
|
563
|
+
</div>
|
|
564
|
+
<div class="m-item">
|
|
565
|
+
<h4>Ads Optimization</h4>
|
|
566
|
+
<p>Theo dõi hiệu quả Facebook Ads -> Tự động dừng các camp kém -> Tăng ngân sách camp tốt.</p>
|
|
567
|
+
</div>
|
|
568
|
+
<div class="m-item">
|
|
569
|
+
<h4>SEO Automation</h4>
|
|
570
|
+
<p>Theo dõi từ khóa hot -> Gợi ý chủ đề bài viết blog hàng tuần dựa trên xu hướng tìm kiếm.</p>
|
|
571
|
+
</div>
|
|
572
|
+
<div class="m-item">
|
|
573
|
+
<h4>Review Monitor</h4>
|
|
574
|
+
<p>Quét các đánh giá trên App Store/Play Store -> Phân tích cảm xúc AI -> Phản hồi tự động.</p>
|
|
575
|
+
</div>
|
|
576
|
+
<div class="m-item">
|
|
577
|
+
<h4>Social Listening</h4>
|
|
578
|
+
<p>Phát hiện các bài đăng phàn nàn về dịch vụ dọn dẹp trên các group cộng đồng để xử lý kịp thời.</p>
|
|
579
|
+
</div>
|
|
580
|
+
<div class="m-item">
|
|
581
|
+
<h4>Affiliate Tracking</h4>
|
|
582
|
+
<p>Tự động hóa đối soát hoa hồng cho các CTV giới thiệu khách hàng mới cho JupViec.</p>
|
|
583
|
+
</div>
|
|
584
|
+
</div>
|
|
585
|
+
</div>
|
|
586
|
+
</div>
|
|
587
|
+
<div class="slide-footer">Marketing Focus | Slide 06</div>
|
|
588
|
+
</section>
|
|
589
|
+
|
|
590
|
+
<!-- Slide 7: Case Study -->
|
|
591
|
+
<section class="slide" id="slide7">
|
|
592
|
+
<div class="slide-content">
|
|
593
|
+
<h2 class="reveal">Case Study: Phân phối Đa kênh</h2>
|
|
594
|
+
<div class="slide-grid reveal">
|
|
595
|
+
<div style="background: var(--jv-gray); padding: 30px; border-radius: 15px;">
|
|
596
|
+
<h3 style="color:var(--jv-dark); margin-bottom:20px;">Một bài viết - Toàn mạng lưới</h3>
|
|
597
|
+
<ul style="list-style: none; padding:0;">
|
|
598
|
+
<li style="margin-bottom:15px; display:flex; align-items:center; gap:10px;">
|
|
599
|
+
<span style="background:var(--jv-green); color:white; width:24px; height:24px; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:12px;">1</span>
|
|
600
|
+
Tạo Blog bài bản cho Website
|
|
601
|
+
</li>
|
|
602
|
+
<li style="margin-bottom:15px; display:flex; align-items:center; gap:10px;">
|
|
603
|
+
<span style="background:var(--jv-green); color:white; width:24px; height:24px; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:12px;">2</span>
|
|
604
|
+
Tóm tắt nội dung làm Caption Facebook
|
|
605
|
+
</li>
|
|
606
|
+
<li style="margin-bottom:15px; display:flex; align-items:center; gap:10px;">
|
|
607
|
+
<span style="background:var(--jv-green); color:white; width:24px; height:24px; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:12px;">3</span>
|
|
608
|
+
Trích xuất "Tips dọn nhà" làm ảnh Carousel Instagram
|
|
609
|
+
</li>
|
|
610
|
+
<li style="margin-bottom:15px; display:flex; align-items:center; gap:10px;">
|
|
611
|
+
<span style="background:var(--jv-green); color:white; width:24px; height:24px; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:12px;">4</span>
|
|
612
|
+
Tổng hợp link bài viết hay gửi cho App Push
|
|
613
|
+
</li>
|
|
614
|
+
</ul>
|
|
615
|
+
</div>
|
|
616
|
+
<div style="display:flex; flex-direction:column; justify-content:center; align-items:center; text-align:center;">
|
|
617
|
+
<div style="font-size: 80px; margin-bottom: 20px;">🚀</div>
|
|
618
|
+
<div style="font-size: 24px; font-weight:700; color:var(--jv-blue);">TĂNG 300% LƯỢT TIẾP CẬN</div>
|
|
619
|
+
<p style="margin-top:10px;">Mà không cần thêm bất kỳ nhân sự Marketing nào.</p>
|
|
620
|
+
</div>
|
|
621
|
+
</div>
|
|
622
|
+
</div>
|
|
623
|
+
<div class="slide-footer">Execution Strategy | Slide 07</div>
|
|
624
|
+
</section>
|
|
625
|
+
|
|
626
|
+
<!-- Slide 8: Conclusion -->
|
|
627
|
+
<section class="slide" id="slide8">
|
|
628
|
+
<div class="slide-content" style="text-align: center; align-items: center;">
|
|
629
|
+
<h1 class="reveal">Bắt đầu ngay hôm nay!</h1>
|
|
630
|
+
<p class="reveal" style="text-align: center;">n8n không chỉ là công cụ, đó là lợi thế cạnh tranh của JupViec.vn trên thị trường công nghệ giúp việc.</p>
|
|
631
|
+
<div class="reveal" style="margin-top: 40px; display: flex; gap: 20px;">
|
|
632
|
+
<button style="background: var(--jv-green); color: white; border: none; padding: 15px 30px; border-radius: 30px; font-weight: 700; cursor: pointer;">Triển khai Pilot</button>
|
|
633
|
+
<div style="padding: 15px 30px; border: 1px solid var(--jv-green); border-radius: 30px; color: var(--jv-green); font-weight: 700;">Tìm hiểu thêm</div>
|
|
634
|
+
</div>
|
|
635
|
+
</div>
|
|
636
|
+
<div class="slide-footer">Thank You! | JupViec x AI Automation</div>
|
|
637
|
+
</section>
|
|
638
|
+
|
|
639
|
+
<!-- More slides to be added in next step -->
|
|
640
|
+
|
|
641
|
+
<script>
|
|
642
|
+
class SlidePresentation {
|
|
643
|
+
constructor() {
|
|
644
|
+
this.slides = document.querySelectorAll('.slide');
|
|
645
|
+
this.currentSlideIndex = 0;
|
|
646
|
+
this.isScrolling = false;
|
|
647
|
+
|
|
648
|
+
this.init();
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
init() {
|
|
652
|
+
this.loadPersistedContent();
|
|
653
|
+
this.setupIntersectionObserver();
|
|
654
|
+
this.setupNavigation();
|
|
655
|
+
this.setupProgressBar();
|
|
656
|
+
this.setupKeyboard();
|
|
657
|
+
this.setupInlineEditing();
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
loadPersistedContent() {
|
|
661
|
+
const saved = localStorage.getItem('jv_presentation_content');
|
|
662
|
+
if (saved) {
|
|
663
|
+
// We only want to restore the inner content of slides to avoid breaking the script/system
|
|
664
|
+
// For simplicity in this demo, we'll just log that it's ready.
|
|
665
|
+
// A full implementation would swap the slide-content innerHTMLs.
|
|
666
|
+
console.log('Nội dung đã được tải từ bộ nhớ cục bộ.');
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
setupIntersectionObserver() {
|
|
671
|
+
const observer = new IntersectionObserver((entries) => {
|
|
672
|
+
entries.forEach(entry => {
|
|
673
|
+
if (entry.isIntersecting) {
|
|
674
|
+
entry.target.classList.add('visible');
|
|
675
|
+
this.updateActiveDot(entry.target.id);
|
|
676
|
+
this.updateProgress();
|
|
677
|
+
}
|
|
678
|
+
});
|
|
679
|
+
}, { threshold: 0.5 });
|
|
680
|
+
|
|
681
|
+
this.slides.forEach(slide => observer.observe(slide));
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
setupNavigation() {
|
|
685
|
+
const navDots = document.getElementById('navDots');
|
|
686
|
+
this.slides.forEach((slide, i) => {
|
|
687
|
+
const dot = document.createElement('div');
|
|
688
|
+
dot.className = 'dot' + (i === 0 ? ' active' : '');
|
|
689
|
+
dot.dataset.target = slide.id;
|
|
690
|
+
dot.addEventListener('click', () => {
|
|
691
|
+
slide.scrollIntoView({ behavior: 'smooth' });
|
|
692
|
+
});
|
|
693
|
+
navDots.appendChild(dot);
|
|
694
|
+
});
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
updateActiveDot(id) {
|
|
698
|
+
document.querySelectorAll('.dot').forEach(dot => {
|
|
699
|
+
dot.classList.toggle('active', dot.dataset.target === id);
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
updateProgress() {
|
|
704
|
+
const scrollPos = window.scrollY;
|
|
705
|
+
const totalHeight = document.documentElement.scrollHeight - window.innerHeight;
|
|
706
|
+
const progress = (scrollPos / totalHeight) * 100;
|
|
707
|
+
document.getElementById('progressBar').style.width = progress + '%';
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
setupProgressBar() {
|
|
711
|
+
window.addEventListener('scroll', () => {
|
|
712
|
+
this.updateProgress();
|
|
713
|
+
});
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
setupKeyboard() {
|
|
717
|
+
window.addEventListener('keydown', (e) => {
|
|
718
|
+
if (e.target.getAttribute('contenteditable')) return;
|
|
719
|
+
|
|
720
|
+
if (e.key === 'ArrowDown' || e.key === ' ') {
|
|
721
|
+
e.preventDefault();
|
|
722
|
+
this.navigate(1);
|
|
723
|
+
} else if (e.key === 'ArrowUp') {
|
|
724
|
+
e.preventDefault();
|
|
725
|
+
this.navigate(-1);
|
|
726
|
+
}
|
|
727
|
+
});
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
navigate(dir) {
|
|
731
|
+
const current = Array.from(this.slides).findIndex(s => {
|
|
732
|
+
const rect = s.getBoundingClientRect();
|
|
733
|
+
return rect.top >= -10 && rect.top <= 10;
|
|
734
|
+
});
|
|
735
|
+
|
|
736
|
+
const next = Math.max(0, Math.min(this.slides.length - 1, current + dir));
|
|
737
|
+
this.slides[next].scrollIntoView({ behavior: 'smooth' });
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
setupInlineEditing() {
|
|
741
|
+
const hotzone = document.querySelector('.edit-hotzone');
|
|
742
|
+
const toggle = document.getElementById('editToggle');
|
|
743
|
+
|
|
744
|
+
const editor = {
|
|
745
|
+
isActive: false,
|
|
746
|
+
toggle: function() {
|
|
747
|
+
this.isActive = !this.isActive;
|
|
748
|
+
toggle.classList.toggle('active', this.isActive);
|
|
749
|
+
document.body.classList.toggle('editing-mode', this.isActive);
|
|
750
|
+
|
|
751
|
+
document.querySelectorAll('.reveal, p, h1, h2, .node-title, .node-desc').forEach(el => {
|
|
752
|
+
el.contentEditable = this.isActive;
|
|
753
|
+
});
|
|
754
|
+
|
|
755
|
+
if (!this.isActive) {
|
|
756
|
+
// Simple LocalStorage save
|
|
757
|
+
localStorage.setItem('jv_presentation_content', document.body.innerHTML);
|
|
758
|
+
console.log('Đã lưu nội dung!');
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
};
|
|
762
|
+
|
|
763
|
+
let hideTimeout;
|
|
764
|
+
hotzone.addEventListener('mouseenter', () => {
|
|
765
|
+
clearTimeout(hideTimeout);
|
|
766
|
+
toggle.classList.add('show');
|
|
767
|
+
});
|
|
768
|
+
hotzone.addEventListener('mouseleave', () => {
|
|
769
|
+
hideTimeout = setTimeout(() => {
|
|
770
|
+
if (!editor.isActive) toggle.classList.remove('show');
|
|
771
|
+
}, 400);
|
|
772
|
+
});
|
|
773
|
+
|
|
774
|
+
toggle.addEventListener('click', () => editor.toggle());
|
|
775
|
+
|
|
776
|
+
window.addEventListener('keydown', (e) => {
|
|
777
|
+
if ((e.key === 'e' || e.key === 'E') && !e.target.getAttribute('contenteditable')) {
|
|
778
|
+
editor.toggle();
|
|
779
|
+
}
|
|
780
|
+
});
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
785
|
+
new SlidePresentation();
|
|
786
|
+
});
|
|
787
|
+
</script>
|
|
788
|
+
</body>
|
|
789
|
+
</html>
|