@panguard-ai/panguard-web 0.1.0

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.
@@ -0,0 +1,43 @@
1
+ /**
2
+ * HTML Template Engine for static site generation
3
+ * 靜態網站產生的 HTML 範本引擎
4
+ *
5
+ * Generates complete HTML pages for the Panguard AI website.
6
+ * 為 Panguard AI 官網產生完整的 HTML 頁面。
7
+ *
8
+ * @module @panguard-ai/panguard-web/templates
9
+ */
10
+ import type { WebLanguage, WebConfig, PageMeta } from '../types.js';
11
+ import type { ProductFeature } from '../pages/index.js';
12
+ import type { PricingPlanDetails } from '../types.js';
13
+ /**
14
+ * Generate HTML head section
15
+ * 產生 HTML 頭部區段
16
+ */
17
+ export declare function generateHead(page: PageMeta, language: WebLanguage, config?: WebConfig): string;
18
+ /**
19
+ * Generate navigation bar HTML
20
+ * 產生導覽列 HTML
21
+ */
22
+ export declare function generateNav(pages: PageMeta[], language: WebLanguage, config?: WebConfig): string;
23
+ /**
24
+ * Generate hero section for homepage
25
+ * 產生首頁英雄區段
26
+ */
27
+ export declare function generateHero(language: WebLanguage, config?: WebConfig): string;
28
+ /**
29
+ * Generate a product feature card
30
+ * 產生產品功能卡片
31
+ */
32
+ export declare function generateFeatureCard(feature: ProductFeature, language: WebLanguage): string;
33
+ /**
34
+ * Generate a pricing plan card
35
+ * 產生定價方案卡片
36
+ */
37
+ export declare function generatePricingCard(plan: PricingPlanDetails, language: WebLanguage): string;
38
+ /**
39
+ * Generate footer HTML
40
+ * 產生頁尾 HTML
41
+ */
42
+ export declare function generateFooter(language: WebLanguage, config?: WebConfig): string;
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAQtD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,WAAW,EACrB,MAAM,GAAE,SAA8B,GACrC,MAAM,CAqBR;AAOD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,QAAQ,EAAE,EACjB,QAAQ,EAAE,WAAW,EACrB,MAAM,GAAE,SAA8B,GACrC,MAAM,CAiBR;AAOD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,WAAW,EACrB,MAAM,GAAE,SAA8B,GACrC,MAAM,CAkBR;AAOD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,GAAG,MAAM,CAkB1F;AAOD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,GAAG,MAAM,CAwB3F;AAOD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,WAAW,EACrB,MAAM,GAAE,SAA8B,GACrC,MAAM,CAWR"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * HTML Template Engine for static site generation
3
+ * 靜態網站產生的 HTML 範本引擎
4
+ *
5
+ * Generates complete HTML pages for the Panguard AI website.
6
+ * 為 Panguard AI 官網產生完整的 HTML 頁面。
7
+ *
8
+ * @module @panguard-ai/panguard-web/templates
9
+ */
10
+ import { DEFAULT_WEB_CONFIG } from '../types.js';
11
+ // ---------------------------------------------------------------------------
12
+ // HTML head template
13
+ // HTML 頭部範本
14
+ // ---------------------------------------------------------------------------
15
+ /**
16
+ * Generate HTML head section
17
+ * 產生 HTML 頭部區段
18
+ */
19
+ export function generateHead(page, language, config = DEFAULT_WEB_CONFIG) {
20
+ const title = language === 'zh-TW' ? page.titleZh : page.titleEn;
21
+ const description = language === 'zh-TW' ? page.descriptionZh : page.descriptionEn;
22
+ const lang = language === 'zh-TW' ? 'zh-Hant-TW' : 'en';
23
+ return `<!DOCTYPE html>
24
+ <html lang="${lang}">
25
+ <head>
26
+ <meta charset="UTF-8">
27
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
28
+ <title>${title}</title>
29
+ <meta name="description" content="${description}">
30
+ <meta property="og:title" content="${title}">
31
+ <meta property="og:description" content="${description}">
32
+ <meta property="og:type" content="website">
33
+ <meta property="og:url" content="${config.baseUrl}${page.path}">
34
+ <meta name="twitter:card" content="summary_large_image">
35
+ <meta name="twitter:title" content="${title}">
36
+ <meta name="twitter:description" content="${description}">
37
+ <link rel="canonical" href="${config.baseUrl}${page.path}">
38
+ </head>`;
39
+ }
40
+ // ---------------------------------------------------------------------------
41
+ // Navigation template
42
+ // 導覽範本
43
+ // ---------------------------------------------------------------------------
44
+ /**
45
+ * Generate navigation bar HTML
46
+ * 產生導覽列 HTML
47
+ */
48
+ export function generateNav(pages, language, config = DEFAULT_WEB_CONFIG) {
49
+ const items = pages
50
+ .map((p) => {
51
+ const label = language === 'zh-TW'
52
+ ? (p.titleZh.split(' - ')[0] ?? p.titleZh)
53
+ : (p.titleEn.split(' - ')[0] ?? p.titleEn);
54
+ return ` <a href="${p.path}">${label}</a>`;
55
+ })
56
+ .join('\n');
57
+ return `<nav>
58
+ <div class="nav-brand">${config.brandName}</div>
59
+ <div class="nav-links">
60
+ ${items}
61
+ </div>
62
+ </nav>`;
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // Hero section template
66
+ // 首頁英雄區段範本
67
+ // ---------------------------------------------------------------------------
68
+ /**
69
+ * Generate hero section for homepage
70
+ * 產生首頁英雄區段
71
+ */
72
+ export function generateHero(language, config = DEFAULT_WEB_CONFIG) {
73
+ const isZh = language === 'zh-TW';
74
+ const headline = isZh ? config.taglineZh : config.taglineEn;
75
+ const subheadline = isZh
76
+ ? '一行指令安裝,AI 全自動保護你的機器。有事它會告訴你,沒事你什麼都不用做。'
77
+ : 'One command to install. AI protects your machines automatically. It tells you when something happens. You do nothing when all is well.';
78
+ const ctaText = isZh ? '免費掃描你的系統' : 'Scan Your System Free';
79
+ const installCmd = 'curl -fsSL https://get.panguard.ai | bash';
80
+ return `<section class="hero">
81
+ <h1>${headline}</h1>
82
+ <p class="hero-sub">${subheadline}</p>
83
+ <div class="hero-install">
84
+ <code>${installCmd}</code>
85
+ </div>
86
+ <a href="/guide" class="cta-button">${ctaText}</a>
87
+ </section>`;
88
+ }
89
+ // ---------------------------------------------------------------------------
90
+ // Feature card template
91
+ // 功能卡片範本
92
+ // ---------------------------------------------------------------------------
93
+ /**
94
+ * Generate a product feature card
95
+ * 產生產品功能卡片
96
+ */
97
+ export function generateFeatureCard(feature, language) {
98
+ const isZh = language === 'zh-TW';
99
+ const tag = isZh ? feature.tagZh : feature.tagEn;
100
+ const headline = isZh ? feature.headlineZh : feature.headlineEn;
101
+ const description = isZh ? feature.descriptionZh : feature.descriptionEn;
102
+ const highlights = isZh ? feature.highlightsZh : feature.highlightsEn;
103
+ const highlightItems = highlights.map((h) => ` <li>${h}</li>`).join('\n');
104
+ return `<div class="feature-card">
105
+ <span class="feature-tag">${tag}</span>
106
+ <h3>${feature.product}</h3>
107
+ <h4>${headline}</h4>
108
+ <p>${description}</p>
109
+ <ul class="feature-highlights">
110
+ ${highlightItems}
111
+ </ul>
112
+ </div>`;
113
+ }
114
+ // ---------------------------------------------------------------------------
115
+ // Pricing card template
116
+ // 定價卡片範本
117
+ // ---------------------------------------------------------------------------
118
+ /**
119
+ * Generate a pricing plan card
120
+ * 產生定價方案卡片
121
+ */
122
+ export function generatePricingCard(plan, language) {
123
+ const isZh = language === 'zh-TW';
124
+ const name = isZh ? plan.nameZh : plan.nameEn;
125
+ const tagline = isZh ? plan.taglineZh : plan.taglineEn;
126
+ const price = isZh ? plan.priceDisplayZh : plan.priceDisplayEn;
127
+ const highlightClass = plan.highlighted ? ' pricing-highlighted' : '';
128
+ const featureList = plan.features
129
+ .map((f) => {
130
+ const label = isZh ? f.nameZh : f.nameEn;
131
+ const icon = f.included ? 'V' : '-';
132
+ const limit = f.limit ? ` (${f.limit})` : '';
133
+ return ` <li class="${f.included ? 'included' : 'not-included'}">${icon} ${label}${limit}</li>`;
134
+ })
135
+ .join('\n');
136
+ return `<div class="pricing-card${highlightClass}">
137
+ <h3>${name}</h3>
138
+ <p class="pricing-tagline">${tagline}</p>
139
+ <div class="pricing-price">${price}</div>
140
+ <ul class="pricing-features">
141
+ ${featureList}
142
+ </ul>
143
+ </div>`;
144
+ }
145
+ // ---------------------------------------------------------------------------
146
+ // Footer template
147
+ // 頁尾範本
148
+ // ---------------------------------------------------------------------------
149
+ /**
150
+ * Generate footer HTML
151
+ * 產生頁尾 HTML
152
+ */
153
+ export function generateFooter(language, config = DEFAULT_WEB_CONFIG) {
154
+ const isZh = language === 'zh-TW';
155
+ const copyright = isZh
156
+ ? `${config.brandName} - ${config.taglineZh}`
157
+ : `${config.brandName} - ${config.taglineEn}`;
158
+ const builtWith = isZh ? '由 Panguard AI 團隊打造' : 'Built by the Panguard AI team';
159
+ return `<footer>
160
+ <p>${copyright}</p>
161
+ <p>${builtWith}</p>
162
+ </footer>`;
163
+ }
164
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Panguard Web type definitions
3
+ * Panguard Web 型別定義
4
+ * @module @panguard-ai/panguard-web/types
5
+ */
6
+ /** Supported website languages / 支援的網站語言 */
7
+ export type WebLanguage = 'zh-TW' | 'en';
8
+ /** User persona types matching README TA / 用戶角色(符合 README TA 定義) */
9
+ export type PersonaType = 'developer' | 'small_business' | 'mid_enterprise';
10
+ /** Persona profile for scenario-based content / 場景化內容的用戶 profile */
11
+ export interface PersonaProfile {
12
+ /** Persona type / 角色類型 */
13
+ type: PersonaType;
14
+ /** Display name / 顯示名稱 */
15
+ nameEn: string;
16
+ /** Display name in Chinese / 中文顯示名稱 */
17
+ nameZh: string;
18
+ /** Short description / 簡短描述 */
19
+ descriptionEn: string;
20
+ /** Short description in Chinese / 中文簡短描述 */
21
+ descriptionZh: string;
22
+ /** Pain points / 痛點 */
23
+ painPointsEn: string[];
24
+ /** Pain points in Chinese / 中文痛點 */
25
+ painPointsZh: string[];
26
+ /** Recommended plan / 推薦方案 */
27
+ recommendedPlan: PricingPlan;
28
+ /** Scenario stories / 場景故事 */
29
+ scenarios: ScenarioStory[];
30
+ }
31
+ /** A scenario-based story for the website / 場景化故事 */
32
+ export interface ScenarioStory {
33
+ /** Scenario ID / 場景 ID */
34
+ id: string;
35
+ /** Threat type / 威脅類型 */
36
+ threatType: string;
37
+ /** Before: What the user sees (without Panguard) / 使用前:用戶看到什麼 */
38
+ beforeEn: string;
39
+ beforeZh: string;
40
+ /** After: What Panguard does (human language) / 使用後:Panguard 做了什麼 */
41
+ afterEn: string;
42
+ afterZh: string;
43
+ /** Notification the user would receive / 用戶會收到的通知 */
44
+ notificationEn: string;
45
+ notificationZh: string;
46
+ }
47
+ /** Pricing plan names / 方案名稱 */
48
+ export type PricingPlan = 'community' | 'solo' | 'pro' | 'business';
49
+ /** Report add-on product / 報告加購產品 */
50
+ export interface ReportAddon {
51
+ /** Report type ID / 報告類型 ID */
52
+ id: string;
53
+ /** Display name / 顯示名稱 */
54
+ nameEn: string;
55
+ nameZh: string;
56
+ /** Description / 描述 */
57
+ descriptionEn: string;
58
+ descriptionZh: string;
59
+ /** Pricing model / 計費模式 */
60
+ pricingModel: 'per_report' | 'subscription';
61
+ /** Price in USD / 美元價格 */
62
+ priceUsd: number;
63
+ /** Price display / 價格顯示 */
64
+ priceDisplayEn: string;
65
+ priceDisplayZh: string;
66
+ /** Annual price (for subscription model) / 年費(訂閱模式用) */
67
+ annualPriceUsd?: number;
68
+ annualPriceDisplayEn?: string;
69
+ annualPriceDisplayZh?: string;
70
+ /** Compliance framework ID / 合規框架 ID */
71
+ framework: string;
72
+ }
73
+ /** Feature entry in a pricing plan / 方案中的功能項 */
74
+ export interface PlanFeature {
75
+ /** Feature name / 功能名稱 */
76
+ nameEn: string;
77
+ nameZh: string;
78
+ /** Included in this plan / 此方案是否包含 */
79
+ included: boolean;
80
+ /** Limit (if any) / 限制(如有) */
81
+ limit?: string;
82
+ }
83
+ /** Pricing plan details / 方案詳情 */
84
+ export interface PricingPlanDetails {
85
+ /** Plan type / 方案類型 */
86
+ plan: PricingPlan;
87
+ /** Display name / 顯示名稱 */
88
+ nameEn: string;
89
+ nameZh: string;
90
+ /** Tagline / 標語 */
91
+ taglineEn: string;
92
+ taglineZh: string;
93
+ /** Monthly price (USD) / 月費 (USD) */
94
+ priceUsd: number;
95
+ /** Price display text / 價格顯示文字 */
96
+ priceDisplayEn: string;
97
+ priceDisplayZh: string;
98
+ /** Features / 功能列表 */
99
+ features: PlanFeature[];
100
+ /** Target audience / 目標用戶 */
101
+ targetPersona: PersonaType;
102
+ /** Is highlighted / 是否突出顯示 */
103
+ highlighted: boolean;
104
+ }
105
+ /** Page identifier / 頁面識別碼 */
106
+ export type PageId = 'home' | 'features' | 'pricing' | 'docs' | 'guide' | 'about';
107
+ /** Page metadata / 頁面元資料 */
108
+ export interface PageMeta {
109
+ id: PageId;
110
+ titleEn: string;
111
+ titleZh: string;
112
+ descriptionEn: string;
113
+ descriptionZh: string;
114
+ path: string;
115
+ }
116
+ /** Guidance step type / 引導步驟類型 */
117
+ export type GuidanceStepType = 'welcome' | 'persona_select' | 'threat_assessment' | 'product_recommendation' | 'installation' | 'notification_setup' | 'complete';
118
+ /** A single guidance step / 單一引導步驟 */
119
+ export interface GuidanceStep {
120
+ /** Step type / 步驟類型 */
121
+ type: GuidanceStepType;
122
+ /** Step number / 步驟編號 */
123
+ stepNumber: number;
124
+ /** Title / 標題 */
125
+ titleEn: string;
126
+ titleZh: string;
127
+ /** Description / 描述 */
128
+ descriptionEn: string;
129
+ descriptionZh: string;
130
+ /** Options (if selection step) / 選項(如果是選擇步驟) */
131
+ options?: GuidanceOption[];
132
+ }
133
+ /** An option within a guidance step / 引導步驟中的選項 */
134
+ export interface GuidanceOption {
135
+ /** Option ID / 選項 ID */
136
+ id: string;
137
+ /** Label / 標籤 */
138
+ labelEn: string;
139
+ labelZh: string;
140
+ /** Description / 描述 */
141
+ descriptionEn: string;
142
+ descriptionZh: string;
143
+ }
144
+ /** User's guidance answers / 用戶的引導回答 */
145
+ export interface GuidanceAnswers {
146
+ persona?: PersonaType;
147
+ hasServer?: boolean;
148
+ hasWebApp?: boolean;
149
+ hasDatabase?: boolean;
150
+ notificationChannel?: 'line' | 'telegram' | 'slack' | 'email';
151
+ language?: WebLanguage;
152
+ }
153
+ /** Guidance result / 引導結果 */
154
+ export interface GuidanceResult {
155
+ /** Recommended plan / 推薦方案 */
156
+ recommendedPlan: PricingPlan;
157
+ /** Recommended products / 推薦產品 */
158
+ recommendedProducts: string[];
159
+ /** Installation command / 安裝指令 */
160
+ installCommand: string;
161
+ /** Configuration steps / 配置步驟 */
162
+ configSteps: string[];
163
+ /** Estimated setup time / 預估設定時間 */
164
+ estimatedSetupTime: string;
165
+ }
166
+ /** Website config / 網站配置 */
167
+ export interface WebConfig {
168
+ /** Default language / 預設語言 */
169
+ language: WebLanguage;
170
+ /** Base URL / 基礎 URL */
171
+ baseUrl: string;
172
+ /** Brand name / 品牌名稱 */
173
+ brandName: string;
174
+ /** Brand tagline / 品牌標語 */
175
+ taglineEn: string;
176
+ taglineZh: string;
177
+ }
178
+ /** Default website config / 預設網站配置 */
179
+ export declare const DEFAULT_WEB_CONFIG: WebConfig;
180
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Panguard Web type definitions
3
+ * Panguard Web 型別定義
4
+ * @module @panguard-ai/panguard-web/types
5
+ */
6
+ /** Default website config / 預設網站配置 */
7
+ export const DEFAULT_WEB_CONFIG = {
8
+ language: 'zh-TW',
9
+ baseUrl: 'https://panguard.ai',
10
+ brandName: 'Panguard AI',
11
+ taglineEn: 'AI-Driven Adaptive Endpoint Protection',
12
+ taglineZh: 'AI 驅動的自適應端點防護平台',
13
+ };
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsOH,sCAAsC;AACtC,MAAM,CAAC,MAAM,kBAAkB,GAAc;IAC3C,QAAQ,EAAE,OAAO;IACjB,OAAO,EAAE,qBAAqB;IAC9B,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,wCAAwC;IACnD,SAAS,EAAE,iBAAiB;CAC7B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@panguard-ai/panguard-web",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Panguard AI official website engine - scenario-based copy + online guidance / Panguard AI 官網引擎 - 場景化文案 + 線上引導",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "package.json",
14
+ "README.md"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc --build",
18
+ "clean": "rm -rf dist tsconfig.tsbuildinfo",
19
+ "typecheck": "tsc --noEmit",
20
+ "test": "vitest run",
21
+ "dev": "tsc --build --watch",
22
+ "prepublishOnly": "pnpm run build"
23
+ },
24
+ "dependencies": {
25
+ "@panguard-ai/core": "workspace:*"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^22.14.0",
29
+ "typescript": "~5.7.3"
30
+ }
31
+ }