cistack 6.0.0 → 6.2.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.
Files changed (61) hide show
  1. package/.github/dependabot.yml +42 -0
  2. package/.github/workflows/ci.yml +2 -1
  3. package/.github/workflows/pipeline.yml +250 -0
  4. package/README.md +4 -0
  5. package/package.json +7 -2
  6. package/product-site/.github/dependabot.yml +27 -0
  7. package/product-site/.github/workflows/pipeline.yml +215 -0
  8. package/product-site/.lighthouserc.json +22 -0
  9. package/product-site/README.md +1 -0
  10. package/product-site/app/[lang]/layout.tsx +95 -0
  11. package/product-site/app/[lang]/page.tsx +19 -0
  12. package/product-site/app/favicon.ico +0 -0
  13. package/product-site/app/globals.css +228 -0
  14. package/product-site/app/manifest.ts +20 -0
  15. package/product-site/app/robots.ts +12 -0
  16. package/product-site/app/sitemap.ts +12 -0
  17. package/product-site/components/CanvasText.tsx +219 -0
  18. package/product-site/components/CopyButton.tsx +101 -0
  19. package/product-site/components/HomeClient.tsx +664 -0
  20. package/product-site/components/InstallToggle.tsx +123 -0
  21. package/product-site/components/MotionRevealClient.tsx +53 -0
  22. package/product-site/components/TerminalCard.tsx +65 -0
  23. package/product-site/components/TerminalCardMotion.tsx +324 -0
  24. package/product-site/components/site-motion.tsx +229 -0
  25. package/product-site/components/ui/accordion.tsx +74 -0
  26. package/product-site/components/ui/badge.tsx +52 -0
  27. package/product-site/components/ui/button.tsx +60 -0
  28. package/product-site/components/ui/card.tsx +103 -0
  29. package/product-site/components/ui/checkbox.tsx +29 -0
  30. package/product-site/components/ui/separator.tsx +25 -0
  31. package/product-site/components/ui/table.tsx +116 -0
  32. package/product-site/components/ui/tabs.tsx +82 -0
  33. package/product-site/components.json +25 -0
  34. package/product-site/dictionaries/br.json +276 -0
  35. package/product-site/dictionaries/cn.json +276 -0
  36. package/product-site/dictionaries/de.json +276 -0
  37. package/product-site/dictionaries/en.json +274 -0
  38. package/product-site/dictionaries/es.json +276 -0
  39. package/product-site/dictionaries/fr.json +276 -0
  40. package/product-site/dictionaries/pt.json +276 -0
  41. package/product-site/eslint.config.mjs +18 -0
  42. package/product-site/lib/dictionaries.ts +18 -0
  43. package/product-site/lib/dictionary-types.ts +3 -0
  44. package/product-site/lib/utils.ts +6 -0
  45. package/product-site/middleware.ts +39 -0
  46. package/product-site/next.config.mjs +14 -0
  47. package/product-site/package-lock.json +14201 -0
  48. package/product-site/package.json +42 -0
  49. package/product-site/postcss.config.mjs +7 -0
  50. package/product-site/public/file.svg +1 -0
  51. package/product-site/public/globe.svg +1 -0
  52. package/product-site/public/next.svg +1 -0
  53. package/product-site/public/og-image.png +0 -0
  54. package/product-site/public/vercel.svg +1 -0
  55. package/product-site/public/window.svg +1 -0
  56. package/product-site/scripts/sync-i18n.mjs +58 -0
  57. package/product-site/scripts/validate-i18n.mjs +45 -0
  58. package/product-site/tsconfig.json +34 -0
  59. package/product-site/types/negotiator.d.ts +14 -0
  60. package/product-site/vercel.json +5 -0
  61. package/src/index.js +12 -13
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "cistack-docs",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "next dev",
7
+ "build": "next build",
8
+ "start": "next start",
9
+ "lint": "eslint",
10
+ "sync-i18n": "node scripts/sync-i18n.mjs",
11
+ "validate:i18n": "node scripts/validate-i18n.mjs",
12
+ "typecheck": "tsc --noEmit --incremental false",
13
+ "build:ci": "next build"
14
+ },
15
+ "dependencies": {
16
+ "@base-ui/react": "^1.3.0",
17
+ "@formatjs/intl-localematcher": "^0.8.2",
18
+ "@tailwindcss/postcss": "^4",
19
+ "class-variance-authority": "^0.7.1",
20
+ "clsx": "^2.1.1",
21
+ "framer-motion": "^12.38.0",
22
+ "lucide-react": "^1.7.0",
23
+ "negotiator": "^1.0.0",
24
+ "next": "16.2.2",
25
+ "react": "19.2.5",
26
+ "react-dom": "19.2.5",
27
+ "shadcn": "^4.2.0",
28
+ "tailwind-merge": "^3.5.0",
29
+ "tailwindcss": "^4",
30
+ "tw-animate-css": "^1.4.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/negotiator": "^0.6.4",
34
+ "@types/node": "^25",
35
+ "@types/react": "^19",
36
+ "@types/react-dom": "^19",
37
+ "eslint": "^9",
38
+ "eslint-config-next": "16.2.2",
39
+ "typescript": "^6",
40
+ "vercel": "^50.42.0"
41
+ }
42
+ }
@@ -0,0 +1,7 @@
1
+ const config = {
2
+ plugins: {
3
+ "@tailwindcss/postcss": {},
4
+ },
5
+ };
6
+
7
+ export default config;
@@ -0,0 +1 @@
1
+ <svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
Binary file
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>
@@ -0,0 +1,58 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ const DICTIONARY_DIR = path.join(__dirname, "../dictionaries");
8
+ const SOURCE_LOCALE = "en.json";
9
+
10
+ const sourceData = JSON.parse(fs.readFileSync(path.join(DICTIONARY_DIR, SOURCE_LOCALE), "utf8"));
11
+
12
+ function syncKeys(source, target) {
13
+ const result = { ...target };
14
+ let updated = false;
15
+
16
+ for (const key in source) {
17
+ if (typeof source[key] === "object" && source[key] !== null) {
18
+ if (!result[key] || typeof result[key] !== "object") {
19
+ result[key] = {};
20
+ updated = true;
21
+ }
22
+ const [childResult, childUpdated] = syncKeys(source[key], result[key]);
23
+ result[key] = childResult;
24
+ if (childUpdated) updated = true;
25
+ } else if (!(key in result)) {
26
+ result[key] = `[TODO] ${source[key]}`;
27
+ updated = true;
28
+ }
29
+ }
30
+
31
+ for (const key in result) {
32
+ if (!(key in source)) {
33
+ delete result[key];
34
+ updated = true;
35
+ }
36
+ }
37
+
38
+ return [result, updated];
39
+ }
40
+
41
+ const files = fs.readdirSync(DICTIONARY_DIR);
42
+
43
+ for (const file of files) {
44
+ if (file === SOURCE_LOCALE || !file.endsWith(".json")) continue;
45
+
46
+ const filePath = path.join(DICTIONARY_DIR, file);
47
+ const targetData = JSON.parse(fs.readFileSync(filePath, "utf8"));
48
+ const [syncedData, isUpdated] = syncKeys(sourceData, targetData);
49
+
50
+ if (isUpdated) {
51
+ fs.writeFileSync(filePath, `${JSON.stringify(syncedData, null, 2)}\n`, "utf8");
52
+ console.log(`✅ Synced ${file} with ${SOURCE_LOCALE}`);
53
+ } else {
54
+ console.log(`- ${file} is already in sync`);
55
+ }
56
+ }
57
+
58
+ console.log("Done!");
@@ -0,0 +1,45 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
+ const DICTIONARY_DIR = path.join(__dirname, "../dictionaries");
7
+ const SOURCE = "en.json";
8
+
9
+ function keyPaths(value, prefix = "") {
10
+ if (value === null || typeof value !== "object") {
11
+ return [prefix || "(root)"];
12
+ }
13
+ if (Array.isArray(value)) {
14
+ if (value.length === 0) return [prefix + "[]"];
15
+ return value.flatMap((item, i) => keyPaths(item, `${prefix}[${i}]`));
16
+ }
17
+ const keys = Object.keys(value).sort();
18
+ if (keys.length === 0) return [prefix || "(empty)"];
19
+ return keys.flatMap((k) => keyPaths(value[k], prefix ? `${prefix}.${k}` : k));
20
+ }
21
+
22
+ const sourceRaw = fs.readFileSync(path.join(DICTIONARY_DIR, SOURCE), "utf8");
23
+ const en = JSON.parse(sourceRaw);
24
+ const enPaths = new Set(keyPaths(en).sort());
25
+
26
+ let failed = false;
27
+ for (const file of fs.readdirSync(DICTIONARY_DIR)) {
28
+ if (!file.endsWith(".json") || file === SOURCE) continue;
29
+ const data = JSON.parse(fs.readFileSync(path.join(DICTIONARY_DIR, file), "utf8"));
30
+ const paths = new Set(keyPaths(data).sort());
31
+ const missing = [...enPaths].filter((p) => !paths.has(p));
32
+ const extra = [...paths].filter((p) => !enPaths.has(p));
33
+ if (missing.length || extra.length) {
34
+ console.error(`\n${file}:`);
35
+ if (missing.length) console.error(" missing:", missing.slice(0, 8).join(", "), missing.length > 8 ? `… +${missing.length - 8}` : "");
36
+ if (extra.length) console.error(" extra:", extra.slice(0, 8).join(", "), extra.length > 8 ? `… +${extra.length - 8}` : "");
37
+ failed = true;
38
+ }
39
+ }
40
+
41
+ if (failed) {
42
+ console.error("\nvalidate-i18n: locale key paths must match en.json\n");
43
+ process.exit(1);
44
+ }
45
+ console.log("validate-i18n: all locales match en.json key paths");
@@ -0,0 +1,34 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2017",
4
+ "lib": ["dom", "dom.iterable", "esnext"],
5
+ "allowJs": true,
6
+ "skipLibCheck": true,
7
+ "strict": true,
8
+ "noEmit": true,
9
+ "esModuleInterop": true,
10
+ "module": "esnext",
11
+ "moduleResolution": "bundler",
12
+ "resolveJsonModule": true,
13
+ "isolatedModules": true,
14
+ "jsx": "react-jsx",
15
+ "incremental": true,
16
+ "plugins": [
17
+ {
18
+ "name": "next"
19
+ }
20
+ ],
21
+ "paths": {
22
+ "@/*": ["./*"]
23
+ }
24
+ },
25
+ "include": [
26
+ "next-env.d.ts",
27
+ "**/*.ts",
28
+ "**/*.tsx",
29
+ ".next/types/**/*.ts",
30
+ ".next/dev/types/**/*.ts",
31
+ "**/*.mts"
32
+ ],
33
+ "exclude": ["node_modules"]
34
+ }
@@ -0,0 +1,14 @@
1
+ declare module "negotiator" {
2
+ interface NegotiatorHeaders {
3
+ [header: string]: string | string[] | undefined;
4
+ }
5
+
6
+ interface NegotiatorOptions {
7
+ headers?: NegotiatorHeaders;
8
+ }
9
+
10
+ export default class Negotiator {
11
+ constructor(options?: NegotiatorOptions);
12
+ languages(availableLanguages?: readonly string[]): string[];
13
+ }
14
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "buildCommand": "npm run build",
3
+ "outputDirectory": ".next",
4
+ "framework": "nextjs"
5
+ }
package/src/index.js CHANGED
@@ -230,34 +230,33 @@ class CIFlow {
230
230
  _printSummary(config, releaseInfo, envVars, monorepoPackages) {
231
231
  const { hosting, frameworks, languages, testing } = config;
232
232
  const line = (label, value, reasons = []) => {
233
- console.log(` ${chalk.dim(label.padEnd(20))} ${chalk.cyan(value || chalk.italic('none detected'))}`);
233
+ console.log(` ${chalk.dim(label.padEnd(20))} ${chalk.cyan(value || chalk.italic('None'))}`);
234
234
  if (this.explain && reasons && reasons.length > 0) {
235
235
  for (const reason of reasons) {
236
- console.log(` ${chalk.dim('')} ${chalk.italic.gray(reason)}`);
236
+ console.log(` ${chalk.dim('-')} ${chalk.gray(reason)}`);
237
237
  }
238
238
  }
239
239
  };
240
240
 
241
- console.log('\n' + chalk.bold(' 📊 Detected Stack'));
242
- console.log(chalk.dim(' ' + '─'.repeat(48)));
243
-
244
- line('Languages:', languages.map((l) => l.name).join(', '), languages[0] && languages[0].reasons);
245
- line('Frameworks:', frameworks.map((f) => f.name).join(', '), frameworks[0] && frameworks[0].reasons);
246
- line('Hosting:', hosting.map((h) => h.name).join(', ') || 'none', hosting[0] && hosting[0].reasons);
247
- line('Testing:', testing.map((t) => t.name).join(', ') || 'none', testing[0] && testing[0].reasons);
248
- line('Release tool:', releaseInfo ? releaseInfo.tool : 'none', releaseInfo && releaseInfo.reasons);
241
+ console.log('\n' + chalk.bold(' Stack detection summary'));
242
+
243
+ line('Languages:', languages.map((l) => l.name).join(', '), languages[0] && languages[0].reasons);
244
+ line('Frameworks:', frameworks.map((f) => f.name).join(', '), frameworks[0] && frameworks[0].reasons);
245
+ line('Hosting:', hosting.map((h) => h.name).join(', ') || 'None', hosting[0] && hosting[0].reasons);
246
+ line('Testing:', testing.map((t) => t.name).join(', ') || 'None', testing[0] && testing[0].reasons);
247
+ line('Release tool:', releaseInfo ? releaseInfo.tool : 'None', releaseInfo && releaseInfo.reasons);
249
248
 
250
249
  if (monorepoPackages.length > 0) {
251
- line('Monorepo pkgs:', monorepoPackages.map((p) => p.name).join(', '));
250
+ line('Monorepo packages:', monorepoPackages.map((p) => p.name).join(', '));
252
251
  }
253
252
 
254
253
  if (envVars.sourceFile) {
255
- line('Env file:', envVars.sourceFile);
254
+ line('Environment file:', envVars.sourceFile);
256
255
  if (envVars.secrets.length > 0) {
257
256
  line(' Secrets:', envVars.secrets.join(', '));
258
257
  }
259
258
  if (envVars.public.length > 0) {
260
- line(' Public vars:', envVars.public.join(', '));
259
+ line(' Public variables:', envVars.public.join(', '));
261
260
  }
262
261
  }
263
262