@wix/web50-cli 0.1.2 → 0.1.3
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/dist/cjs/auth/deviceFlow.js +10 -4
- package/dist/cjs/auth/deviceFlow.js.map +1 -1
- package/dist/cjs/commands/conversationWizard.js +33 -11
- package/dist/cjs/commands/conversationWizard.js.map +1 -1
- package/dist/cjs/commands/embed.js +41 -52
- package/dist/cjs/commands/embed.js.map +1 -1
- package/dist/cjs/commands/init.js +1 -1
- package/dist/cjs/commands/init.js.map +1 -1
- package/dist/cjs/templates/embedDocs.js +488 -0
- package/dist/cjs/templates/embedDocs.js.map +1 -0
- package/dist/cjs/utils/project.js.map +1 -1
- package/dist/esm/auth/deviceFlow.js +10 -4
- package/dist/esm/auth/deviceFlow.js.map +1 -1
- package/dist/esm/commands/conversationWizard.js +33 -11
- package/dist/esm/commands/conversationWizard.js.map +1 -1
- package/dist/esm/commands/embed.js +42 -52
- package/dist/esm/commands/embed.js.map +1 -1
- package/dist/esm/commands/init.js +1 -1
- package/dist/esm/commands/init.js.map +1 -1
- package/dist/esm/templates/embedDocs.js +484 -0
- package/dist/esm/templates/embedDocs.js.map +1 -0
- package/dist/esm/utils/project.js.map +1 -1
- package/dist/types/auth/deviceFlow.d.ts.map +1 -1
- package/dist/types/commands/conversationWizard.d.ts.map +1 -1
- package/dist/types/commands/embed.d.ts.map +1 -1
- package/dist/types/templates/embedDocs.d.ts +2 -0
- package/dist/types/templates/embedDocs.d.ts.map +1 -0
- package/dist/types/utils/project.d.ts +1 -0
- package/dist/types/utils/project.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Command","inquirer","path","fs","readFile","cp","chalk","success","error","info","warn","atomicWrite","ensureDir","isAuthenticated","getToken","promptSiteSelection","DEFAULTS_DIR","join","__dirname","printBanner","logo","console","log","line","cyan","dim","copyDefault","srcRelative","destAbsolute","substitutions","srcPath","content","token","value","Object","entries","replaceAll","copyDefaultTree","filter","recursive","findExistingConfig","startDir","current","parent","dirname","candidate","existsSync","resolveString","flag","isTTY","question","opts","defaultValue","undefined","exitMsg","process","exit","answers","prompt","initCommand","description","option","action","authed","existing","cwd","Boolean","stdin","mode","name","type","message","validate","v","trim","length","stem","split","pop","displayName","replace","dir","msid","platformType","choices","outDir","resolve","readdirSync","subs","NAME","DISPLAY_NAME","MSID","PLATFORM_TYPE","skill","folder","componentDir","err_","Error","String"],"sources":["../../../src/commands/init.ts"],"sourcesContent":["import { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { readFile, cp } from 'fs/promises';\nimport chalk from 'chalk';\nimport { success, error, info, warn } from '../utils/print';\nimport { atomicWrite, ensureDir } from '../utils/fs';\nimport { isAuthenticated, getToken } from '../auth';\nimport { promptSiteSelection } from '../auth/deviceFlow';\n\nconst DEFAULTS_DIR = path.join(__dirname, '../../../defaults');\n\nfunction printBanner(): void {\n const logo = [\n '██╗ ██╗ ███████╗ ██████╗ ███████╗',\n '██║ ██║ ██╔════╝ ██╔══██╗ ██╔════╝',\n '██║ █╗ ██║ █████╗ ██████╔╝ ███████╗',\n '██║███╗██║ ██╔══╝ ██╔══██╗ ╚════██║',\n '╚███╔███╔╝ ███████╗ ██████╔╝ ███████║',\n ' ╚══╝╚══╝ ╚══════╝ ╚═════╝ ╚══════╝',\n ];\n console.log('');\n for (const line of logo) {\n console.log(chalk.cyan(line));\n }\n console.log('');\n console.log(\n chalk.dim(' Build AI-powered client components for the Wix platform.'),\n );\n console.log(chalk.dim(' Define sections, actions, and AI instructions —'));\n console.log(\n chalk.dim(\n ' the platform interprets user intent and delivers personalized experiences.',\n ),\n );\n console.log('');\n}\n\ntype Mode = 'defaults' | 'scratch';\n\ninterface InitOptions {\n mode?: Mode;\n name?: string;\n displayName?: string;\n dir?: string;\n msid?: string;\n}\n\nasync function copyDefault(\n srcRelative: string,\n destAbsolute: string,\n substitutions: Record<string, string> = {},\n): Promise<void> {\n const srcPath = path.join(DEFAULTS_DIR, srcRelative);\n let content = await readFile(srcPath, 'utf8');\n for (const [token, value] of Object.entries(substitutions)) {\n content = content.replaceAll(`{{${token}}}`, value);\n }\n await atomicWrite(destAbsolute, content);\n}\n\nasync function copyDefaultTree(\n srcRelative: string,\n destAbsolute: string,\n filter?: (src: string, dest: string) => boolean,\n): Promise<void> {\n const srcPath = path.join(DEFAULTS_DIR, srcRelative);\n await cp(srcPath, destAbsolute, { recursive: true, filter });\n}\n\nfunction findExistingConfig(startDir: string): string | null {\n let current = startDir;\n let parent = path.dirname(current);\n while (current !== parent) {\n const candidate = path.join(current, 'web5.config.json');\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n current = parent;\n parent = path.dirname(current);\n }\n const candidate = path.join(current, 'web5.config.json');\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n return null;\n}\n\nasync function resolveString(\n flag: string | undefined,\n isTTY: boolean,\n question: Parameters<typeof inquirer.prompt>[0],\n opts: { defaultValue?: string; exitMsg?: string } = {},\n): Promise<string> {\n if (flag) {\n return flag;\n }\n if (!isTTY) {\n if (opts.defaultValue !== undefined) {\n return opts.defaultValue;\n }\n if (opts.exitMsg) {\n error(opts.exitMsg);\n }\n process.exit(1);\n }\n const answers = await inquirer.prompt<{ value: string }>(question);\n return answers.value ?? opts.defaultValue ?? '';\n}\n\nexport const initCommand = new Command('init')\n .description('Scaffold a new Web5 client component library')\n .option('--mode <mode>', 'scaffold mode: defaults or scratch', 'defaults')\n .option('--name <name>', 'npm package name (e.g. @wix/my-components)')\n .option('--display-name <displayName>', 'human-readable display name')\n .option(\n '--dir <dir>',\n 'output directory (default: derived from package name)',\n )\n .option('--msid <msid>', 'Wix site ID to bind this project to')\n .action(async (opts: InitOptions) => {\n try {\n const authed = await isAuthenticated();\n if (!authed) {\n error('You must be logged in. Run `web5 login` first.');\n process.exit(1);\n }\n\n printBanner();\n\n const existing = findExistingConfig(process.cwd());\n if (existing) {\n warn(`web5.config.json already exists at ${existing}`);\n warn('Proceeding will create a nested project.');\n }\n\n const isTTY = Boolean(process.stdin.isTTY);\n const mode: Mode = opts.mode ?? 'defaults';\n\n // ── Collect: package name ─────────────────────────────────────────────\n const name = await resolveString(\n opts.name,\n isTTY,\n [\n {\n type: 'input',\n name: 'value',\n message: 'Package name (e.g. @wix/my-components):',\n validate: (v: string) =>\n v.trim().length > 0 ? true : 'Package name is required',\n },\n ],\n { exitMsg: '--name is required in non-interactive mode' },\n );\n\n // ── Derive: display name and output directory from package name ───────\n const stem = name.split('/').pop()!;\n const displayName = opts.displayName ?? stem.replace(/-/g, ' ');\n const dir = opts.dir ?? stem;\n\n let msid: string;\n if (opts.msid) {\n msid = opts.msid;\n } else if (isTTY) {\n const token = await getToken();\n msid = await promptSiteSelection(token!);\n } else {\n error('--msid is required in non-interactive mode');\n process.exit(1);\n }\n\n let platformType: string;\n if (isTTY) {\n const answers = await inquirer.prompt<{ value: string }>([\n {\n type: 'list',\n name: 'value',\n message: 'Platform type:',\n choices: ['Content', 'Ecommerce'],\n },\n ]);\n platformType = answers.value;\n } else {\n platformType = 'Content';\n }\n\n const outDir = path.resolve(process.cwd(), dir);\n\n if (fs.existsSync(outDir) && fs.readdirSync(outDir).length > 0) {\n warn(`Directory ${outDir} already exists and is not empty`);\n }\n\n info(`Scaffolding ${name} \\u2192 ${outDir}`);\n void mode;\n\n const subs = {\n NAME: name,\n DISPLAY_NAME: displayName,\n MSID: msid,\n PLATFORM_TYPE: platformType,\n };\n\n // ── Root config files ─────────────────────────────────────────────────\n await copyDefault(\n '.web5.config.json',\n path.join(outDir, 'web5.config.json'),\n subs,\n );\n await copyDefault(\n 'package.template.json',\n path.join(outDir, 'package.json'),\n subs,\n );\n await copyDefault('tsconfig.json', path.join(outDir, 'tsconfig.json'));\n\n // ── src/ ──────────────────────────────────────────────────────────────\n await copyDefault(\n 'src/index.ts',\n path.join(outDir, 'src', 'index.ts'),\n subs,\n );\n await copyDefault(\n 'src/createRegistry.ts',\n path.join(outDir, 'src', 'createRegistry.ts'),\n );\n await copyDefaultTree(\n 'src/components',\n path.join(outDir, 'src', 'components'),\n );\n await copyDefaultTree('.storybook', path.join(outDir, '.storybook'));\n await copyDefault(\n 'src/vite.cdn.config.ts',\n path.join(outDir, 'src', 'vite.cdn.config.ts'),\n );\n // ── src/configuration/ ────────────────────────────────────────────────\n await copyDefault(\n 'src/client.config.ts',\n path.join(outDir, 'src', 'client.config.ts'),\n );\n await copyDefault(\n 'src/configuration/ai/prompt-instructions.yaml',\n path.join(\n outDir,\n 'src',\n 'configuration',\n 'ai',\n 'prompt-instructions.yaml',\n ),\n );\n await copyDefault(\n 'src/configuration/cms/cms-mapping.yaml',\n path.join(outDir, 'src', 'configuration', 'cms', 'cms-mapping.yaml'),\n );\n await copyDefault(\n 'src/configuration/cms/cms-schema.yaml',\n path.join(outDir, 'src', 'configuration', 'cms', 'cms-schema.yaml'),\n );\n\n // ── src/actions/ ──────────────────────────────────────────────────────\n await copyDefault(\n 'src/actions/index.ts',\n path.join(outDir, 'src', 'actions', 'index.ts'),\n );\n await copyDefault(\n 'src/actions/bookDemoAction.ts',\n path.join(outDir, 'src', 'actions', 'bookDemoAction.ts'),\n );\n await copyDefault(\n 'src/actions/book-demo.yaml',\n path.join(outDir, 'src', 'actions', 'book-demo.yaml'),\n );\n await copyDefault(\n 'src/actions/contactAction.ts',\n path.join(outDir, 'src', 'actions', 'contactAction.ts'),\n );\n await copyDefault(\n 'src/actions/contact-action.yaml',\n path.join(outDir, 'src', 'actions', 'contact-action.yaml'),\n );\n\n // ── AGENTS.md ─────────────────────────────────────────────────────────\n await copyDefault('AGENTS.md', path.join(outDir, 'AGENTS.md'), subs);\n\n // ── docs/ ─────────────────────────────────────────────────────────────\n await copyDefault(\n 'docs/architecture.md',\n path.join(outDir, 'docs', 'architecture.md'),\n subs,\n );\n await copyDefault(\n 'docs/api-reference.md',\n path.join(outDir, 'docs', 'api-reference.md'),\n subs,\n );\n\n // ── skills/ ───────────────────────────────────────────────────────────\n for (const skill of [\n 'action-add',\n 'action-remove',\n 'action-update',\n 'section-add',\n 'section-remove',\n 'section-update',\n 'slot-add',\n ]) {\n await copyDefault(\n `skills/${skill}.md`,\n path.join(outDir, 'skills', `${skill}.md`),\n );\n }\n\n // ── Component subdirectories ──────────────────────────────────────────\n for (const folder of ['base', 'slots', 'sections']) {\n const componentDir = path.join(outDir, 'src', 'components', folder);\n await ensureDir(componentDir);\n await atomicWrite(path.join(componentDir, '.gitkeep'), '');\n }\n\n // ── Done ──────────────────────────────────────────────────────────────\n success(`Created ${name}`);\n console.log('');\n info('Next steps:');\n info(` cd ${dir}`);\n info(' npm install');\n } catch (err_) {\n error(err_ instanceof Error ? err_.message : String(err_));\n process.exit(1);\n }\n });\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["Command","inquirer","path","fs","readFile","cp","chalk","success","error","info","warn","atomicWrite","ensureDir","isAuthenticated","getToken","promptSiteSelection","DEFAULTS_DIR","join","__dirname","printBanner","logo","console","log","line","cyan","dim","copyDefault","srcRelative","destAbsolute","substitutions","srcPath","content","token","value","Object","entries","replaceAll","copyDefaultTree","filter","recursive","findExistingConfig","startDir","current","parent","dirname","candidate","existsSync","resolveString","flag","isTTY","question","opts","defaultValue","undefined","exitMsg","process","exit","answers","prompt","initCommand","description","option","action","authed","existing","cwd","Boolean","stdin","mode","name","type","message","validate","v","trim","length","stem","split","pop","displayName","replace","dir","msid","platformType","choices","outDir","resolve","readdirSync","subs","NAME","DISPLAY_NAME","MSID","PLATFORM_TYPE","skill","folder","componentDir","err_","Error","String"],"sources":["../../../src/commands/init.ts"],"sourcesContent":["import { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { readFile, cp } from 'fs/promises';\nimport chalk from 'chalk';\nimport { success, error, info, warn } from '../utils/print';\nimport { atomicWrite, ensureDir } from '../utils/fs';\nimport { isAuthenticated, getToken } from '../auth';\nimport { promptSiteSelection } from '../auth/deviceFlow';\n\nconst DEFAULTS_DIR = path.join(__dirname, '../../../defaults');\n\nfunction printBanner(): void {\n const logo = [\n '██╗ ██╗ ███████╗ ██████╗ ███████╗',\n '██║ ██║ ██╔════╝ ██╔══██╗ ██╔════╝',\n '██║ █╗ ██║ █████╗ ██████╔╝ ███████╗',\n '██║███╗██║ ██╔══╝ ██╔══██╗ ╚════██║',\n '╚███╔███╔╝ ███████╗ ██████╔╝ ███████║',\n ' ╚══╝╚══╝ ╚══════╝ ╚═════╝ ╚══════╝',\n ];\n console.log('');\n for (const line of logo) {\n console.log(chalk.cyan(line));\n }\n console.log('');\n console.log(\n chalk.dim(' Build AI-powered client components for the Wix platform.'),\n );\n console.log(chalk.dim(' Define sections, actions, and AI instructions —'));\n console.log(\n chalk.dim(\n ' the platform interprets user intent and delivers personalized experiences.',\n ),\n );\n console.log('');\n}\n\ntype Mode = 'defaults' | 'scratch';\n\ninterface InitOptions {\n mode?: Mode;\n name?: string;\n displayName?: string;\n dir?: string;\n msid?: string;\n}\n\nasync function copyDefault(\n srcRelative: string,\n destAbsolute: string,\n substitutions: Record<string, string> = {},\n): Promise<void> {\n const srcPath = path.join(DEFAULTS_DIR, srcRelative);\n let content = await readFile(srcPath, 'utf8');\n for (const [token, value] of Object.entries(substitutions)) {\n content = content.replaceAll(`{{${token}}}`, value);\n }\n await atomicWrite(destAbsolute, content);\n}\n\nasync function copyDefaultTree(\n srcRelative: string,\n destAbsolute: string,\n filter?: (src: string, dest: string) => boolean,\n): Promise<void> {\n const srcPath = path.join(DEFAULTS_DIR, srcRelative);\n await cp(srcPath, destAbsolute, { recursive: true, filter });\n}\n\nfunction findExistingConfig(startDir: string): string | null {\n let current = startDir;\n let parent = path.dirname(current);\n while (current !== parent) {\n const candidate = path.join(current, 'web5.config.json');\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n current = parent;\n parent = path.dirname(current);\n }\n const candidate = path.join(current, 'web5.config.json');\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n return null;\n}\n\nasync function resolveString(\n flag: string | undefined,\n isTTY: boolean,\n question: Parameters<typeof inquirer.prompt>[0],\n opts: { defaultValue?: string; exitMsg?: string } = {},\n): Promise<string> {\n if (flag) {\n return flag;\n }\n if (!isTTY) {\n if (opts.defaultValue !== undefined) {\n return opts.defaultValue;\n }\n if (opts.exitMsg) {\n error(opts.exitMsg);\n }\n process.exit(1);\n }\n const answers = await inquirer.prompt<{ value: string }>(question);\n return answers.value ?? opts.defaultValue ?? '';\n}\n\nexport const initCommand = new Command('init')\n .description('Scaffold a new Web5 client component library')\n .option('--mode <mode>', 'scaffold mode: defaults or scratch', 'defaults')\n .option('--name <name>', 'npm package name (e.g. @wix/my-components)')\n .option('--display-name <displayName>', 'human-readable display name')\n .option(\n '--dir <dir>',\n 'output directory (default: derived from package name)',\n )\n .option('--msid <msid>', 'Wix site ID to bind this project to')\n .action(async (opts: InitOptions) => {\n try {\n const authed = await isAuthenticated();\n if (!authed) {\n error('You must be logged in. Run `web5 login` first.');\n process.exit(1);\n }\n\n printBanner();\n\n const existing = findExistingConfig(process.cwd());\n if (existing) {\n warn(`web5.config.json already exists at ${existing}`);\n warn('Proceeding will create a nested project.');\n }\n\n const isTTY = Boolean(process.stdin.isTTY);\n const mode: Mode = opts.mode ?? 'defaults';\n\n // ── Collect: package name ─────────────────────────────────────────────\n const name = await resolveString(\n opts.name,\n isTTY,\n [\n {\n type: 'input',\n name: 'value',\n message: 'Package name (e.g. @wix/my-components):',\n validate: (v: string) =>\n v.trim().length > 0 ? true : 'Package name is required',\n },\n ],\n { exitMsg: '--name is required in non-interactive mode' },\n );\n\n // ── Derive: display name and output directory from package name ───────\n const stem = name.split('/').pop()!;\n const displayName = opts.displayName ?? stem.replace(/-/g, ' ');\n const dir = opts.dir ?? stem;\n\n let msid: string;\n if (opts.msid) {\n msid = opts.msid;\n } else if (isTTY) {\n const token = await getToken();\n msid = await promptSiteSelection(token!);\n } else {\n error('--msid is required in non-interactive mode');\n process.exit(1);\n }\n\n let platformType: string;\n if (isTTY) {\n const answers = await inquirer.prompt<{ value: string }>([\n {\n type: 'list',\n name: 'value',\n message: 'Platform type:',\n choices: ['Content', 'Ecommerce'],\n },\n ]);\n platformType = answers.value;\n } else {\n platformType = 'Content';\n }\n\n const outDir = path.resolve(process.cwd(), dir);\n\n if (fs.existsSync(outDir) && fs.readdirSync(outDir).length > 0) {\n warn(`Directory ${outDir} already exists and is not empty`);\n }\n\n info(`Scaffolding ${name} \\u2192 ${outDir}`);\n void mode;\n\n const subs = {\n NAME: name,\n DISPLAY_NAME: displayName,\n MSID: msid,\n PLATFORM_TYPE: platformType,\n };\n\n // ── Root config files ─────────────────────────────────────────────────\n await copyDefault(\n 'web5.config.template.json',\n path.join(outDir, 'web5.config.json'),\n subs,\n );\n await copyDefault(\n 'package.template.json',\n path.join(outDir, 'package.json'),\n subs,\n );\n await copyDefault('tsconfig.json', path.join(outDir, 'tsconfig.json'));\n\n // ── src/ ──────────────────────────────────────────────────────────────\n await copyDefault(\n 'src/index.ts',\n path.join(outDir, 'src', 'index.ts'),\n subs,\n );\n await copyDefault(\n 'src/createRegistry.ts',\n path.join(outDir, 'src', 'createRegistry.ts'),\n );\n await copyDefaultTree(\n 'src/components',\n path.join(outDir, 'src', 'components'),\n );\n await copyDefaultTree('.storybook', path.join(outDir, '.storybook'));\n await copyDefault(\n 'src/vite.cdn.config.ts',\n path.join(outDir, 'src', 'vite.cdn.config.ts'),\n );\n // ── src/configuration/ ────────────────────────────────────────────────\n await copyDefault(\n 'src/client.config.ts',\n path.join(outDir, 'src', 'client.config.ts'),\n );\n await copyDefault(\n 'src/configuration/ai/prompt-instructions.yaml',\n path.join(\n outDir,\n 'src',\n 'configuration',\n 'ai',\n 'prompt-instructions.yaml',\n ),\n );\n await copyDefault(\n 'src/configuration/cms/cms-mapping.yaml',\n path.join(outDir, 'src', 'configuration', 'cms', 'cms-mapping.yaml'),\n );\n await copyDefault(\n 'src/configuration/cms/cms-schema.yaml',\n path.join(outDir, 'src', 'configuration', 'cms', 'cms-schema.yaml'),\n );\n\n // ── src/actions/ ──────────────────────────────────────────────────────\n await copyDefault(\n 'src/actions/index.ts',\n path.join(outDir, 'src', 'actions', 'index.ts'),\n );\n await copyDefault(\n 'src/actions/bookDemoAction.ts',\n path.join(outDir, 'src', 'actions', 'bookDemoAction.ts'),\n );\n await copyDefault(\n 'src/actions/book-demo.yaml',\n path.join(outDir, 'src', 'actions', 'book-demo.yaml'),\n );\n await copyDefault(\n 'src/actions/contactAction.ts',\n path.join(outDir, 'src', 'actions', 'contactAction.ts'),\n );\n await copyDefault(\n 'src/actions/contact-action.yaml',\n path.join(outDir, 'src', 'actions', 'contact-action.yaml'),\n );\n\n // ── AGENTS.md ─────────────────────────────────────────────────────────\n await copyDefault('AGENTS.md', path.join(outDir, 'AGENTS.md'), subs);\n\n // ── docs/ ─────────────────────────────────────────────────────────────\n await copyDefault(\n 'docs/architecture.md',\n path.join(outDir, 'docs', 'architecture.md'),\n subs,\n );\n await copyDefault(\n 'docs/api-reference.md',\n path.join(outDir, 'docs', 'api-reference.md'),\n subs,\n );\n\n // ── skills/ ───────────────────────────────────────────────────────────\n for (const skill of [\n 'action-add',\n 'action-remove',\n 'action-update',\n 'section-add',\n 'section-remove',\n 'section-update',\n 'slot-add',\n ]) {\n await copyDefault(\n `skills/${skill}.md`,\n path.join(outDir, 'skills', `${skill}.md`),\n );\n }\n\n // ── Component subdirectories ──────────────────────────────────────────\n for (const folder of ['base', 'slots', 'sections']) {\n const componentDir = path.join(outDir, 'src', 'components', folder);\n await ensureDir(componentDir);\n await atomicWrite(path.join(componentDir, '.gitkeep'), '');\n }\n\n // ── Done ──────────────────────────────────────────────────────────────\n success(`Created ${name}`);\n console.log('');\n info('Next steps:');\n info(` cd ${dir}`);\n info(' npm install');\n } catch (err_) {\n error(err_ instanceof Error ? err_.message : String(err_));\n process.exit(1);\n }\n });\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
function escapeHtml(s) {
|
|
2
|
+
return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
3
|
+
}
|
|
4
|
+
function codeBlock(code) {
|
|
5
|
+
return `<div class="code-block"><pre>${escapeHtml(code)}</pre><button class="copy-btn" onclick="copyCode(this)">Copy</button></div>`;
|
|
6
|
+
}
|
|
7
|
+
function section(title, description, code) {
|
|
8
|
+
return `
|
|
9
|
+
<div class="card">
|
|
10
|
+
<h2>${title}</h2>
|
|
11
|
+
${description ? `<p>${description}</p>` : ''}
|
|
12
|
+
${codeBlock(code)}
|
|
13
|
+
</div>`;
|
|
14
|
+
}
|
|
15
|
+
function attrRow(attr, type, required, description, defaultVal) {
|
|
16
|
+
const badge = required ? `<span class="badge required">required</span>` : `<span class="badge optional">optional</span>`;
|
|
17
|
+
const def = defaultVal ? `<br><span class="default">Default: <code>${defaultVal}</code></span>` : '';
|
|
18
|
+
return `<tr>
|
|
19
|
+
<td><code>${attr}</code> ${badge}</td>
|
|
20
|
+
<td>${type}</td>
|
|
21
|
+
<td>${description}${def}</td>
|
|
22
|
+
</tr>`;
|
|
23
|
+
}
|
|
24
|
+
export function generateEmbedDocs(clientId) {
|
|
25
|
+
// ── Web5 App snippets ──────────────────────────────────────────────────────
|
|
26
|
+
|
|
27
|
+
const web5AppLoader = `<script
|
|
28
|
+
src="https://www.wix.com/embed/v1/component.js"
|
|
29
|
+
data-client-id="${clientId}">
|
|
30
|
+
</script>`;
|
|
31
|
+
const web5AppAutoInit = `<!-- 1. Add a container -->
|
|
32
|
+
<div id="web5-app" style="width:100%; height:100vh;"></div>
|
|
33
|
+
|
|
34
|
+
<!-- 2. Add prerequisites (React 18 + FedOps) -->
|
|
35
|
+
<script src="https://static.parastorage.com/unpkg/react@18.2.0/umd/react.production.min.js"></script>
|
|
36
|
+
<script src="https://static.parastorage.com/unpkg/react-dom@18.2.0/umd/react-dom.production.min.js"></script>
|
|
37
|
+
<script src="https://static.parastorage.com/unpkg-semver/fedops-logger@5/fedops-logger.bundle.min.js"></script>
|
|
38
|
+
|
|
39
|
+
<!-- 3. Load the embed script -->
|
|
40
|
+
<script
|
|
41
|
+
src="https://static.parastorage.com/services/embed-web50/1.0.0/embed-web50.iife.js"
|
|
42
|
+
data-target="#web5-app"
|
|
43
|
+
data-client-id="${clientId}">
|
|
44
|
+
</script>`;
|
|
45
|
+
const web5AppManual = `<div id="web5-app" style="width:100%; height:100vh;"></div>
|
|
46
|
+
|
|
47
|
+
<script src="https://static.parastorage.com/unpkg/react@18.2.0/umd/react.production.min.js"></script>
|
|
48
|
+
<script src="https://static.parastorage.com/unpkg/react-dom@18.2.0/umd/react-dom.production.min.js"></script>
|
|
49
|
+
<script src="https://static.parastorage.com/unpkg-semver/fedops-logger@5/fedops-logger.bundle.min.js"></script>
|
|
50
|
+
|
|
51
|
+
<!-- Load with data-manual to suppress auto-init -->
|
|
52
|
+
<script
|
|
53
|
+
src="https://static.parastorage.com/services/embed-web50/1.0.0/embed-web50.iife.js"
|
|
54
|
+
data-manual>
|
|
55
|
+
</script>
|
|
56
|
+
|
|
57
|
+
<script>
|
|
58
|
+
Web5App.init({
|
|
59
|
+
target: '#web5-app',
|
|
60
|
+
clientId: '${clientId}',
|
|
61
|
+
mode: 'markdown_v2',
|
|
62
|
+
});
|
|
63
|
+
</script>`;
|
|
64
|
+
const web5AppQuestion = `<div id="web5-app" style="width:100%; height:100vh;"></div>
|
|
65
|
+
|
|
66
|
+
<script src="https://static.parastorage.com/unpkg-semver/fedops-logger@5/fedops-logger.bundle.min.js"></script>
|
|
67
|
+
<script
|
|
68
|
+
src="https://static.parastorage.com/services/embed-web50/1.0.0/embed-web50.iife.js"
|
|
69
|
+
data-target="#web5-app"
|
|
70
|
+
data-client-id="${clientId}"
|
|
71
|
+
data-initial-question="How can I improve my SEO?">
|
|
72
|
+
</script>`;
|
|
73
|
+
const web5AppBootstrap = `<div id="web5-app" style="width:100%; height:100vh;"></div>
|
|
74
|
+
|
|
75
|
+
<script src="https://static.parastorage.com/unpkg-semver/fedops-logger@5/fedops-logger.bundle.min.js"></script>
|
|
76
|
+
<!-- Bootstrap loader — resolves the latest bundle automatically -->
|
|
77
|
+
<script
|
|
78
|
+
src="https://static.parastorage.com/services/embed-web50/1.0.0/bootstrap.js"
|
|
79
|
+
data-target="#web5-app"
|
|
80
|
+
data-client-id="${clientId}">
|
|
81
|
+
</script>`;
|
|
82
|
+
const web5AppApiRef = `Web5App.init({
|
|
83
|
+
target: string, // CSS selector for container (required)
|
|
84
|
+
clientId: string, // Your OAuth client ID (required)
|
|
85
|
+
mode?: string, // 'markdown_v2' (default)
|
|
86
|
+
initialQuestion?: string, // Pre-fill first message
|
|
87
|
+
version?: string, // Pin a specific bundle version
|
|
88
|
+
});`;
|
|
89
|
+
|
|
90
|
+
// ── Input Widget snippets ─────────────────────────────────────────────────
|
|
91
|
+
|
|
92
|
+
const inputLoader = `<script
|
|
93
|
+
src="https://www.wix.com/embed/v1/component.js"
|
|
94
|
+
data-client-id="${clientId}">
|
|
95
|
+
</script>`;
|
|
96
|
+
const inputAutoInit = `<!-- The script reads data-* attributes and renders automatically -->
|
|
97
|
+
<script
|
|
98
|
+
src="https://static.parastorage.com/services/embed-input/1.0.0/embed-input.iife.js"
|
|
99
|
+
data-client-id="${clientId}"
|
|
100
|
+
data-placeholder="Ask me anything...">
|
|
101
|
+
</script>`;
|
|
102
|
+
const inputManual = `<!-- Load with data-manual to suppress auto-init -->
|
|
103
|
+
<script
|
|
104
|
+
src="https://static.parastorage.com/services/embed-input/1.0.0/embed-input.iife.js"
|
|
105
|
+
data-manual>
|
|
106
|
+
</script>
|
|
107
|
+
|
|
108
|
+
<script>
|
|
109
|
+
Web5Input.init({
|
|
110
|
+
clientId: '${clientId}',
|
|
111
|
+
placeholder: 'Ask me anything...',
|
|
112
|
+
});
|
|
113
|
+
</script>`;
|
|
114
|
+
const inputCustomChips = `<script
|
|
115
|
+
src="https://static.parastorage.com/services/embed-input/1.0.0/embed-input.iife.js"
|
|
116
|
+
data-manual>
|
|
117
|
+
</script>
|
|
118
|
+
|
|
119
|
+
<script>
|
|
120
|
+
Web5Input.init({
|
|
121
|
+
clientId: '${clientId}',
|
|
122
|
+
placeholder: 'How can I help?',
|
|
123
|
+
suggestions: ['Manage billing', 'SEO tips', 'Connect domain'],
|
|
124
|
+
});
|
|
125
|
+
</script>`;
|
|
126
|
+
const inputRequireParam = `<!-- Widget only renders when ?my-gate appears in the URL -->
|
|
127
|
+
<script
|
|
128
|
+
src="https://static.parastorage.com/services/embed-input/1.0.0/embed-input.iife.js"
|
|
129
|
+
data-client-id="${clientId}"
|
|
130
|
+
data-require-param="my-gate"
|
|
131
|
+
data-placeholder="Ask me anything...">
|
|
132
|
+
</script>`;
|
|
133
|
+
const inputExcludePaths = `<!-- Widget is hidden on /web5 and /admin -->
|
|
134
|
+
<script
|
|
135
|
+
src="https://static.parastorage.com/services/embed-input/1.0.0/embed-input.iife.js"
|
|
136
|
+
data-client-id="${clientId}"
|
|
137
|
+
data-exclude-paths="/web5,/admin"
|
|
138
|
+
data-placeholder="Ask me anything...">
|
|
139
|
+
</script>`;
|
|
140
|
+
const inputApiRef = `Web5Input.init({
|
|
141
|
+
clientId: string, // Your OAuth client ID (required)
|
|
142
|
+
placeholder?: string, // Input placeholder text
|
|
143
|
+
suggestions?: string[], // Custom chip suggestions shown above the input
|
|
144
|
+
requireParam?: string, // URL query param that must be present to render
|
|
145
|
+
excludePaths?: string[], // Pathname prefixes where the widget is hidden
|
|
146
|
+
});`;
|
|
147
|
+
|
|
148
|
+
// ── Assemble page ─────────────────────────────────────────────────────────
|
|
149
|
+
|
|
150
|
+
return `<!DOCTYPE html>
|
|
151
|
+
<html lang="en">
|
|
152
|
+
<head>
|
|
153
|
+
<meta charset="UTF-8" />
|
|
154
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
155
|
+
<title>Web5 Embed Documentation</title>
|
|
156
|
+
<style>
|
|
157
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
158
|
+
|
|
159
|
+
body {
|
|
160
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
161
|
+
background: #f0f2f5;
|
|
162
|
+
color: #1f2937;
|
|
163
|
+
min-height: 100vh;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/* ── Header ── */
|
|
167
|
+
.header {
|
|
168
|
+
background: #fff;
|
|
169
|
+
border-bottom: 1px solid #e5e7eb;
|
|
170
|
+
padding: 16px 32px;
|
|
171
|
+
display: flex;
|
|
172
|
+
align-items: baseline;
|
|
173
|
+
gap: 16px;
|
|
174
|
+
}
|
|
175
|
+
.header h1 {
|
|
176
|
+
font-size: 1.2rem;
|
|
177
|
+
font-weight: 700;
|
|
178
|
+
color: #111827;
|
|
179
|
+
}
|
|
180
|
+
.client-id-badge {
|
|
181
|
+
font-family: 'SFMono-Regular', Consolas, monospace;
|
|
182
|
+
font-size: 0.78rem;
|
|
183
|
+
color: #6b7280;
|
|
184
|
+
background: #f3f4f6;
|
|
185
|
+
border: 1px solid #e5e7eb;
|
|
186
|
+
border-radius: 4px;
|
|
187
|
+
padding: 2px 8px;
|
|
188
|
+
}
|
|
189
|
+
.client-id-badge span {
|
|
190
|
+
color: #0060e6;
|
|
191
|
+
font-weight: 600;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* ── Tab bar ── */
|
|
195
|
+
.tabs {
|
|
196
|
+
background: #fff;
|
|
197
|
+
border-bottom: 2px solid #e5e7eb;
|
|
198
|
+
padding: 0 32px;
|
|
199
|
+
display: flex;
|
|
200
|
+
gap: 0;
|
|
201
|
+
}
|
|
202
|
+
.tab-btn {
|
|
203
|
+
padding: 14px 24px;
|
|
204
|
+
border: none;
|
|
205
|
+
background: none;
|
|
206
|
+
font-size: 0.9rem;
|
|
207
|
+
color: #6b7280;
|
|
208
|
+
cursor: pointer;
|
|
209
|
+
border-bottom: 3px solid transparent;
|
|
210
|
+
margin-bottom: -2px;
|
|
211
|
+
transition: color 0.15s, border-color 0.15s;
|
|
212
|
+
font-weight: 500;
|
|
213
|
+
}
|
|
214
|
+
.tab-btn:hover:not(.active) { color: #374151; background: #f9fafb; }
|
|
215
|
+
.tab-btn.active { color: #0060e6; border-bottom-color: #0060e6; }
|
|
216
|
+
|
|
217
|
+
/* ── Tab panels ── */
|
|
218
|
+
.tab-panel { display: none; padding: 32px; max-width: 860px; margin: 0 auto; }
|
|
219
|
+
.tab-panel.active { display: block; }
|
|
220
|
+
|
|
221
|
+
/* ── Section cards ── */
|
|
222
|
+
.card {
|
|
223
|
+
background: #fff;
|
|
224
|
+
border: 1px solid #e5e7eb;
|
|
225
|
+
border-radius: 10px;
|
|
226
|
+
padding: 24px;
|
|
227
|
+
margin-bottom: 20px;
|
|
228
|
+
}
|
|
229
|
+
.card h2 {
|
|
230
|
+
font-size: 1rem;
|
|
231
|
+
font-weight: 600;
|
|
232
|
+
color: #111827;
|
|
233
|
+
margin-bottom: 8px;
|
|
234
|
+
}
|
|
235
|
+
.card > p {
|
|
236
|
+
font-size: 0.875rem;
|
|
237
|
+
color: #6b7280;
|
|
238
|
+
line-height: 1.65;
|
|
239
|
+
margin-bottom: 14px;
|
|
240
|
+
}
|
|
241
|
+
.card > p code {
|
|
242
|
+
background: #f3f4f6;
|
|
243
|
+
border: 1px solid #e5e7eb;
|
|
244
|
+
border-radius: 3px;
|
|
245
|
+
padding: 1px 5px;
|
|
246
|
+
font-size: 0.82rem;
|
|
247
|
+
font-family: 'SFMono-Regular', Consolas, monospace;
|
|
248
|
+
color: #374151;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/* ── Code blocks ── */
|
|
252
|
+
.code-block {
|
|
253
|
+
position: relative;
|
|
254
|
+
background: #1a1d23;
|
|
255
|
+
border-radius: 8px;
|
|
256
|
+
overflow: hidden;
|
|
257
|
+
}
|
|
258
|
+
.code-block pre {
|
|
259
|
+
padding: 16px 20px;
|
|
260
|
+
padding-right: 70px;
|
|
261
|
+
font-family: 'SFMono-Regular', Consolas, 'Courier New', monospace;
|
|
262
|
+
font-size: 0.8rem;
|
|
263
|
+
line-height: 1.65;
|
|
264
|
+
color: #abb2bf;
|
|
265
|
+
overflow-x: auto;
|
|
266
|
+
white-space: pre;
|
|
267
|
+
}
|
|
268
|
+
.copy-btn {
|
|
269
|
+
position: absolute;
|
|
270
|
+
top: 10px;
|
|
271
|
+
right: 10px;
|
|
272
|
+
background: #2d3139;
|
|
273
|
+
color: #9ca3af;
|
|
274
|
+
border: 1px solid #3d4451;
|
|
275
|
+
border-radius: 5px;
|
|
276
|
+
padding: 5px 12px;
|
|
277
|
+
font-size: 0.75rem;
|
|
278
|
+
cursor: pointer;
|
|
279
|
+
transition: background 0.15s, color 0.15s, border-color 0.15s;
|
|
280
|
+
white-space: nowrap;
|
|
281
|
+
}
|
|
282
|
+
.copy-btn:hover { background: #383d47; color: #e5e7eb; }
|
|
283
|
+
.copy-btn.copied {
|
|
284
|
+
background: #14532d;
|
|
285
|
+
color: #86efac;
|
|
286
|
+
border-color: #16a34a;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/* ── Attribute reference tables ── */
|
|
290
|
+
.attr-table {
|
|
291
|
+
width: 100%;
|
|
292
|
+
border-collapse: collapse;
|
|
293
|
+
font-size: 0.83rem;
|
|
294
|
+
margin-top: 4px;
|
|
295
|
+
}
|
|
296
|
+
.attr-table th {
|
|
297
|
+
text-align: left;
|
|
298
|
+
padding: 9px 12px;
|
|
299
|
+
background: #f9fafb;
|
|
300
|
+
border: 1px solid #e5e7eb;
|
|
301
|
+
font-weight: 600;
|
|
302
|
+
color: #374151;
|
|
303
|
+
}
|
|
304
|
+
.attr-table td {
|
|
305
|
+
padding: 9px 12px;
|
|
306
|
+
border: 1px solid #e5e7eb;
|
|
307
|
+
vertical-align: top;
|
|
308
|
+
color: #4b5563;
|
|
309
|
+
line-height: 1.5;
|
|
310
|
+
}
|
|
311
|
+
.attr-table td:first-child {
|
|
312
|
+
font-family: 'SFMono-Regular', Consolas, monospace;
|
|
313
|
+
font-size: 0.8rem;
|
|
314
|
+
white-space: nowrap;
|
|
315
|
+
}
|
|
316
|
+
.attr-table td:first-child code {
|
|
317
|
+
color: #0060e6;
|
|
318
|
+
}
|
|
319
|
+
.attr-table td .default { font-size: 0.8rem; color: #9ca3af; }
|
|
320
|
+
.attr-table td .default code {
|
|
321
|
+
background: #f3f4f6;
|
|
322
|
+
border: 1px solid #e5e7eb;
|
|
323
|
+
border-radius: 3px;
|
|
324
|
+
padding: 0 4px;
|
|
325
|
+
font-size: 0.78rem;
|
|
326
|
+
font-family: 'SFMono-Regular', Consolas, monospace;
|
|
327
|
+
}
|
|
328
|
+
.badge {
|
|
329
|
+
display: inline-block;
|
|
330
|
+
font-size: 0.68rem;
|
|
331
|
+
font-weight: 600;
|
|
332
|
+
padding: 1px 6px;
|
|
333
|
+
border-radius: 3px;
|
|
334
|
+
vertical-align: middle;
|
|
335
|
+
margin-left: 5px;
|
|
336
|
+
letter-spacing: 0.02em;
|
|
337
|
+
}
|
|
338
|
+
.badge.required { background: #fef2f2; color: #b91c1c; border: 1px solid #fecaca; }
|
|
339
|
+
.badge.optional { background: #f0fdf4; color: #15803d; border: 1px solid #bbf7d0; }
|
|
340
|
+
|
|
341
|
+
/* ── Section divider label ── */
|
|
342
|
+
.section-label {
|
|
343
|
+
font-size: 0.72rem;
|
|
344
|
+
font-weight: 700;
|
|
345
|
+
text-transform: uppercase;
|
|
346
|
+
letter-spacing: 0.08em;
|
|
347
|
+
color: #9ca3af;
|
|
348
|
+
margin: 28px 0 12px;
|
|
349
|
+
}
|
|
350
|
+
</style>
|
|
351
|
+
</head>
|
|
352
|
+
<body>
|
|
353
|
+
|
|
354
|
+
<div class="header">
|
|
355
|
+
<h1>Web5 Embed Documentation</h1>
|
|
356
|
+
<div class="client-id-badge">client-id: <span>${escapeHtml(clientId)}</span></div>
|
|
357
|
+
</div>
|
|
358
|
+
|
|
359
|
+
<div class="tabs">
|
|
360
|
+
<button class="tab-btn active" data-tab="tab-web5app" onclick="showTab('tab-web5app')">Web5 App</button>
|
|
361
|
+
<button class="tab-btn" data-tab="tab-input" onclick="showTab('tab-input')">Input Widget</button>
|
|
362
|
+
</div>
|
|
363
|
+
|
|
364
|
+
<!-- ════════════════════════════ Tab 1: Web5 App ════════════════════════════ -->
|
|
365
|
+
<div class="tab-panel active" id="tab-web5app">
|
|
366
|
+
|
|
367
|
+
<p class="section-label">Quick start</p>
|
|
368
|
+
|
|
369
|
+
${section('Loader Script', 'Add this to your <code><head></code> or before <code></body></code>. Your <code>data-client-id</code> is pre-filled.', web5AppLoader)}
|
|
370
|
+
|
|
371
|
+
<p class="section-label">Initialization methods</p>
|
|
372
|
+
|
|
373
|
+
${section('Auto-init via script tag', 'The script reads <code>data-*</code> attributes and mounts automatically into the target element.', web5AppAutoInit)}
|
|
374
|
+
|
|
375
|
+
${section('Manual programmatic init', 'Load the script with <code>data-manual</code> to suppress auto-init, then call <code>Web5App.init()</code> when ready.', web5AppManual)}
|
|
376
|
+
|
|
377
|
+
${section('With initial question', 'Pre-fill the first conversation message on load using <code>data-initial-question</code>.', web5AppQuestion)}
|
|
378
|
+
|
|
379
|
+
${section('Bootstrap loader (auto-resolves version)', 'Use the bootstrap script to always load the latest stable bundle without pinning a version.', web5AppBootstrap)}
|
|
380
|
+
|
|
381
|
+
<p class="section-label">Reference</p>
|
|
382
|
+
|
|
383
|
+
<div class="card">
|
|
384
|
+
<h2>Config API</h2>
|
|
385
|
+
<p>Options for <code>Web5App.init()</code> and their <code>data-*</code> attribute equivalents.</p>
|
|
386
|
+
${codeBlock(web5AppApiRef)}
|
|
387
|
+
<br>
|
|
388
|
+
<table class="attr-table">
|
|
389
|
+
<thead>
|
|
390
|
+
<tr><th>Attribute / Option</th><th>Type</th><th>Description</th></tr>
|
|
391
|
+
</thead>
|
|
392
|
+
<tbody>
|
|
393
|
+
${attrRow('data-client-id / clientId', 'string', true, 'Your OAuth app client ID')}
|
|
394
|
+
${attrRow('data-target / target', 'string', true, 'CSS selector for the container element')}
|
|
395
|
+
${attrRow('data-initial-question / initialQuestion', 'string', false, 'Pre-fills the first conversation message')}
|
|
396
|
+
${attrRow('data-mode / mode', 'string', false, 'Rendering mode', 'markdown_v2')}
|
|
397
|
+
${attrRow('version', 'string', false, 'Pin a specific bundle version (emergency override)')}
|
|
398
|
+
</tbody>
|
|
399
|
+
</table>
|
|
400
|
+
</div>
|
|
401
|
+
|
|
402
|
+
</div>
|
|
403
|
+
|
|
404
|
+
<!-- ════════════════════════════ Tab 2: Input Widget ════════════════════════════ -->
|
|
405
|
+
<div class="tab-panel" id="tab-input">
|
|
406
|
+
|
|
407
|
+
<p class="section-label">Quick start</p>
|
|
408
|
+
|
|
409
|
+
${section('Loader Script', 'Add this to your <code><head></code> or before <code></body></code>. Your <code>data-client-id</code> is pre-filled.', inputLoader)}
|
|
410
|
+
|
|
411
|
+
<p class="section-label">Initialization methods</p>
|
|
412
|
+
|
|
413
|
+
${section('Auto-init via script tag', 'The widget reads <code>data-*</code> attributes and renders automatically as a fixed bar at the bottom of the viewport.', inputAutoInit)}
|
|
414
|
+
|
|
415
|
+
${section('Manual programmatic init', 'Load with <code>data-manual</code>, then call <code>Web5Input.init()</code> at the right moment in your app lifecycle.', inputManual)}
|
|
416
|
+
|
|
417
|
+
${section('Custom chip suggestions', 'Pass your own <code>suggestions</code> array. These replace the default fetched chips entirely.', inputCustomChips)}
|
|
418
|
+
|
|
419
|
+
<p class="section-label">Guards & visibility</p>
|
|
420
|
+
|
|
421
|
+
${section('Conditional init with <code>data-require-param</code>', 'The widget only renders when the specified URL query parameter is present in the page URL. Useful for A/B tests or feature gates.', inputRequireParam)}
|
|
422
|
+
|
|
423
|
+
${section('Hide on specific paths with <code>data-exclude-paths</code>', 'Provide a comma-separated list of pathname prefixes. The widget will not render on any matching path.', inputExcludePaths)}
|
|
424
|
+
|
|
425
|
+
<p class="section-label">Reference</p>
|
|
426
|
+
|
|
427
|
+
<div class="card">
|
|
428
|
+
<h2>Config API</h2>
|
|
429
|
+
<p>Options for <code>Web5Input.init()</code> and their <code>data-*</code> attribute equivalents.</p>
|
|
430
|
+
${codeBlock(inputApiRef)}
|
|
431
|
+
<br>
|
|
432
|
+
<table class="attr-table">
|
|
433
|
+
<thead>
|
|
434
|
+
<tr><th>Attribute / Option</th><th>Type</th><th>Description</th></tr>
|
|
435
|
+
</thead>
|
|
436
|
+
<tbody>
|
|
437
|
+
${attrRow('data-client-id / clientId', 'string', true, 'Your OAuth app client ID')}
|
|
438
|
+
${attrRow('data-placeholder / placeholder', 'string', false, 'Input placeholder text', '"Ask me anything..."')}
|
|
439
|
+
${attrRow('data-suggestions / suggestions', 'string | string[]', false, 'Comma-separated string or array of chip labels shown above the input')}
|
|
440
|
+
${attrRow('data-require-param / requireParam', 'string', false, 'URL query param that must be present for the widget to render')}
|
|
441
|
+
${attrRow('data-exclude-paths / excludePaths', 'string | string[]', false, 'Pathname prefixes where the widget is hidden', '"/web5"')}
|
|
442
|
+
</tbody>
|
|
443
|
+
</table>
|
|
444
|
+
</div>
|
|
445
|
+
|
|
446
|
+
</div>
|
|
447
|
+
|
|
448
|
+
<script>
|
|
449
|
+
function showTab(id) {
|
|
450
|
+
document.querySelectorAll('.tab-btn').forEach(function(b) {
|
|
451
|
+
b.classList.toggle('active', b.dataset.tab === id);
|
|
452
|
+
});
|
|
453
|
+
document.querySelectorAll('.tab-panel').forEach(function(p) {
|
|
454
|
+
p.classList.toggle('active', p.id === id);
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
async function copyCode(btn) {
|
|
459
|
+
var code = btn.closest('.code-block').querySelector('pre').textContent;
|
|
460
|
+
try {
|
|
461
|
+
await navigator.clipboard.writeText(code);
|
|
462
|
+
} catch (_) {
|
|
463
|
+
var ta = document.createElement('textarea');
|
|
464
|
+
ta.value = code;
|
|
465
|
+
ta.style.cssText = 'position:fixed;opacity:0;top:0;left:0';
|
|
466
|
+
document.body.appendChild(ta);
|
|
467
|
+
ta.select();
|
|
468
|
+
document.execCommand('copy');
|
|
469
|
+
document.body.removeChild(ta);
|
|
470
|
+
}
|
|
471
|
+
var orig = btn.textContent;
|
|
472
|
+
btn.textContent = 'Copied!';
|
|
473
|
+
btn.classList.add('copied');
|
|
474
|
+
setTimeout(function() {
|
|
475
|
+
btn.textContent = orig;
|
|
476
|
+
btn.classList.remove('copied');
|
|
477
|
+
}, 1800);
|
|
478
|
+
}
|
|
479
|
+
</script>
|
|
480
|
+
|
|
481
|
+
</body>
|
|
482
|
+
</html>`;
|
|
483
|
+
}
|
|
484
|
+
//# sourceMappingURL=embedDocs.js.map
|