@vendure-platform/create 0.1.0 → 0.2.1-nightly.202605190703

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 (97) hide show
  1. package/README.md +37 -27
  2. package/dist/assets/storefront/.env.example +14 -14
  3. package/dist/assets/storefront/messages/de.json +2 -3
  4. package/dist/assets/storefront/messages/en.json +2 -3
  5. package/dist/assets/storefront/next.config.ts +22 -21
  6. package/dist/assets/storefront/package.json +75 -75
  7. package/dist/assets/storefront/public/scenarios/customer/logo.svg +4 -0
  8. package/dist/assets/storefront/src/app/[locale]/layout.tsx +0 -4
  9. package/dist/assets/storefront/src/app/[locale]/sign-in/login-form.tsx +70 -102
  10. package/dist/assets/storefront/src/app/[locale]/sign-in/page.tsx +2 -3
  11. package/dist/assets/storefront/src/config/scenario-meta.ts +3 -7
  12. package/dist/assets/storefront/src/config/scenario.ts +14 -30
  13. package/dist/assets/storefront/src/graphql-env.d.ts +456 -0
  14. package/dist/assets/storefront/src/scenarios/customer/branding.ts +142 -0
  15. package/dist/assets/storefront/src/scenarios/customer/hero.tsx +76 -0
  16. package/dist/assets/storefront/src/scenarios/{default → customer}/index.ts +3 -3
  17. package/dist/assets/storefront/src/scenarios/{default → customer}/meta.ts +1 -1
  18. package/dist/assets/storefront/src/schema.graphql +5852 -0
  19. package/dist/assets/storefront/tsconfig.json +17 -8
  20. package/dist/assets/templates/README.md.hbs +1 -1
  21. package/dist/assets/templates/docker-compose.yml.hbs +0 -4
  22. package/dist/assets/templates/env.hbs +13 -7
  23. package/dist/assets/templates/environment.d.ts.hbs +1 -5
  24. package/dist/assets/templates/npmrc.hbs +1 -1
  25. package/dist/assets/templates/populate.ts.hbs +17 -0
  26. package/dist/assets/templates/server-package.json.hbs +3 -2
  27. package/dist/bin/run.js +17 -3
  28. package/dist/bin/run.js.map +1 -1
  29. package/dist/cli.d.ts +6 -1
  30. package/dist/cli.js +147 -25
  31. package/dist/cli.js.map +1 -1
  32. package/dist/index.d.ts +5 -3
  33. package/dist/index.js +9 -3
  34. package/dist/index.js.map +1 -1
  35. package/dist/plugin-registry.d.ts +43 -6
  36. package/dist/plugin-registry.js +139 -421
  37. package/dist/plugin-registry.js.map +1 -1
  38. package/dist/registry.d.ts +18 -0
  39. package/dist/registry.js +29 -0
  40. package/dist/registry.js.map +1 -0
  41. package/dist/scaffold-shared.d.ts +19 -0
  42. package/dist/scaffold-shared.js +114 -0
  43. package/dist/scaffold-shared.js.map +1 -0
  44. package/dist/scaffold-storefront-only.d.ts +6 -0
  45. package/dist/scaffold-storefront-only.js +101 -0
  46. package/dist/scaffold-storefront-only.js.map +1 -0
  47. package/dist/scaffolder.js +22 -42
  48. package/dist/scaffolder.js.map +1 -1
  49. package/dist/storefront-copier.d.ts +26 -3
  50. package/dist/storefront-copier.js +63 -12
  51. package/dist/storefront-copier.js.map +1 -1
  52. package/dist/template-renderer.d.ts +24 -7
  53. package/dist/template-renderer.js +32 -64
  54. package/dist/template-renderer.js.map +1 -1
  55. package/dist/types.d.ts +46 -27
  56. package/package.json +3 -1
  57. package/dist/assets/storefront/.env.local +0 -1
  58. package/dist/assets/storefront/public/scenarios/b2b-wholesale/hero/hero-bg.webp +0 -0
  59. package/dist/assets/storefront/public/scenarios/b2b-wholesale/logo.svg +0 -4
  60. package/dist/assets/storefront/public/scenarios/default/logo.svg +0 -4
  61. package/dist/assets/storefront/public/scenarios/kaminpro/hero/hero-bg.webp +0 -0
  62. package/dist/assets/storefront/public/scenarios/kaminpro/logo.svg +0 -7
  63. package/dist/assets/storefront/src/components/shared/scenario-paused.tsx +0 -80
  64. package/dist/assets/storefront/src/scenarios/b2b-wholesale/branding.ts +0 -180
  65. package/dist/assets/storefront/src/scenarios/b2b-wholesale/hero.tsx +0 -122
  66. package/dist/assets/storefront/src/scenarios/b2b-wholesale/index.ts +0 -21
  67. package/dist/assets/storefront/src/scenarios/b2b-wholesale/meta.ts +0 -3
  68. package/dist/assets/storefront/src/scenarios/default/branding.ts +0 -148
  69. package/dist/assets/storefront/src/scenarios/default/hero.tsx +0 -107
  70. package/dist/assets/storefront/src/scenarios/kaminpro/auth-gate.tsx +0 -36
  71. package/dist/assets/storefront/src/scenarios/kaminpro/branding.ts +0 -238
  72. package/dist/assets/storefront/src/scenarios/kaminpro/cart-items.tsx +0 -359
  73. package/dist/assets/storefront/src/scenarios/kaminpro/hero.tsx +0 -123
  74. package/dist/assets/storefront/src/scenarios/kaminpro/index.ts +0 -50
  75. package/dist/assets/storefront/src/scenarios/kaminpro/meta.ts +0 -9
  76. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/banners.tsx +0 -21
  77. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/bom-basket.tsx +0 -221
  78. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/btn.tsx +0 -38
  79. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/chip.tsx +0 -35
  80. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/config-header.tsx +0 -72
  81. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/field-row.tsx +0 -126
  82. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/info-dot.tsx +0 -38
  83. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/login-notice.tsx +0 -81
  84. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/module-panel.tsx +0 -144
  85. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/quote-dialog.tsx +0 -110
  86. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/schematic.tsx +0 -674
  87. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/why-panel.tsx +0 -66
  88. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/configurator-pdp.tsx +0 -43
  89. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/configurator-shell.tsx +0 -320
  90. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/lib/data.ts +0 -150
  91. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/lib/types.ts +0 -30
  92. package/dist/assets/storefront/src/scenarios/kaminpro/pdp/styles.css +0 -104
  93. package/dist/assets/storefront/src/scenarios/kaminpro/shop-by-system.tsx +0 -97
  94. package/dist/assets/storefront/src/scenarios/kaminpro/system-finder/decision-tree.ts +0 -261
  95. package/dist/assets/storefront/src/scenarios/kaminpro/system-finder/page.tsx +0 -21
  96. package/dist/assets/storefront/src/scenarios/kaminpro/system-finder/wizard.tsx +0 -600
  97. package/dist/assets/storefront/src/schema.graphql.placeholder +0 -5
@@ -3,25 +3,42 @@ import { PluginDefinition } from './types';
3
3
  export interface TemplateContext {
4
4
  projectName: string;
5
5
  companyName: string;
6
+ /**
7
+ * The full set of plugin keys whose imports, env vars, etc. should appear
8
+ * in the generated project. Includes all always-active (core) plugins plus
9
+ * the user's selected optional/requires-config plugins.
10
+ */
6
11
  resolvedPluginKeys: string[];
12
+ /**
13
+ * Same plugins as `resolvedPluginKeys`, materialised as `PluginDefinition`
14
+ * objects. Used by templates that iterate via `{{#each resolvedPlugins}}`
15
+ * to render `displayName` / `packageName` (see `README.md.hbs`,
16
+ * `CLAUDE.md.hbs`).
17
+ */
7
18
  resolvedPlugins: PluginDefinition[];
19
+ /**
20
+ * Optional plugins the user explicitly deselected. For each one, we emit
21
+ * `platformKey: false` inside `VendurePlatform.init({...})` to override
22
+ * its default-on behaviour.
23
+ */
24
+ disabledPluginKeys: string[];
8
25
  includeStorefront: boolean;
26
+ /**
27
+ * Private registry URL baked into the project's `.npmrc` scope mapping.
28
+ * Resolved from `VENDURE_REGISTRY_URL` if set, otherwise the production
29
+ * default. See `registry.ts`.
30
+ */
31
+ registryUrl: string;
9
32
  }
10
33
  export interface TemplateContextResult {
11
34
  context: TemplateContext;
12
35
  hbs: typeof Handlebars;
13
36
  }
14
- export declare function buildTemplateContext(projectName: string, companyName: string, resolvedPluginKeys: string[], includeStorefront: boolean): TemplateContextResult;
37
+ export declare function buildTemplateContext(projectName: string, companyName: string, selectedPluginKeys: ReadonlyArray<string>, includeStorefront: boolean): TemplateContextResult;
15
38
  /**
16
39
  * Render a Handlebars template file with the given context.
17
40
  */
18
41
  export declare function renderTemplate(templatePath: string, context: TemplateContext, hbs: typeof Handlebars): string;
19
- /**
20
- * Get the path to a bundled asset file.
21
- * At runtime these live in dist/assets/.
22
- * During development they live in assets/.
23
- */
24
- export declare function getAssetPath(assetName: string): string;
25
42
  /**
26
43
  * Get the path to a bundled template file.
27
44
  * At runtime these live in dist/assets/templates/.
@@ -38,13 +38,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.buildTemplateContext = buildTemplateContext;
40
40
  exports.renderTemplate = renderTemplate;
41
- exports.getAssetPath = getAssetPath;
42
41
  exports.getTemplatePath = getTemplatePath;
43
42
  const handlebars_1 = __importDefault(require("handlebars"));
44
43
  const fs = __importStar(require("fs"));
45
44
  const path = __importStar(require("path"));
46
45
  const plugin_registry_1 = require("./plugin-registry");
47
- function createHandlebarsInstance(resolvedPluginKeys) {
46
+ const registry_1 = require("./registry");
47
+ function createHandlebarsInstance(resolvedPluginKeys, disabledPluginKeys) {
48
48
  const hbs = handlebars_1.default.create();
49
49
  const resolvedSet = new Set(resolvedPluginKeys);
50
50
  hbs.registerHelper('ifPlugin', function (pluginKey, options) {
@@ -53,37 +53,8 @@ function createHandlebarsInstance(resolvedPluginKeys) {
53
53
  }
54
54
  return options.inverse(this);
55
55
  });
56
- hbs.registerHelper('pluginImports', function () {
57
- const lines = [];
58
- for (const key of resolvedPluginKeys) {
59
- const plugin = (0, plugin_registry_1.getPlugin)(key);
60
- if (!plugin || plugin.imports.length === 0)
61
- continue;
62
- const names = plugin.imports.join(', ');
63
- lines.push(`import { ${names} } from '${plugin.packageName}';`);
64
- }
65
- return new hbs.SafeString(lines.join('\n'));
66
- });
67
- hbs.registerHelper('pluginConfigBlocks', function () {
68
- const blocks = [];
69
- for (const key of resolvedPluginKeys) {
70
- const plugin = (0, plugin_registry_1.getPlugin)(key);
71
- if (!plugin)
72
- continue;
73
- // Compile configBlock through Handlebars so it can use {{#ifPlugin}} guards
74
- const compiled = hbs.compile(plugin.configBlock, { noEscape: true });
75
- blocks.push(` ${compiled({})},`);
76
- }
77
- return new hbs.SafeString(blocks.join('\n'));
78
- });
79
56
  hbs.registerHelper('pluginDependencies', function () {
80
- const lines = [];
81
- for (const key of resolvedPluginKeys) {
82
- const plugin = (0, plugin_registry_1.getPlugin)(key);
83
- if (!plugin || plugin.internal)
84
- continue;
85
- lines.push(` "${plugin.packageName}": "nightly"`);
86
- }
57
+ const lines = resolvedPluginKeys.map((key) => ` "${(0, plugin_registry_1.getPlugin)(key).packageName}": "nightly"`);
87
58
  if (lines.length === 0) {
88
59
  return new hbs.SafeString('');
89
60
  }
@@ -92,38 +63,54 @@ function createHandlebarsInstance(resolvedPluginKeys) {
92
63
  hbs.registerHelper('platformPluginImports', function () {
93
64
  const lines = [`import { VendurePlatform } from '@vendure-platform/platform';`];
94
65
  for (const key of resolvedPluginKeys) {
95
- const plugin = (0, plugin_registry_1.getPlugin)(key);
96
- if (!(plugin === null || plugin === void 0 ? void 0 : plugin.platformImports))
97
- continue;
98
- lines.push(...plugin.platformImports);
66
+ const imports = (0, plugin_registry_1.getPlugin)(key).platformImports;
67
+ if (imports)
68
+ lines.push(...imports);
99
69
  }
100
70
  return new hbs.SafeString(lines.join('\n'));
101
71
  });
72
+ /**
73
+ * Emit the options body for `VendurePlatform.init({...})`. Two kinds of
74
+ * entries appear here:
75
+ *
76
+ * 1. Options blocks for active plugins that ship a non-empty
77
+ * `platformOptionsBlock` (e.g. core plugins with required config,
78
+ * or `requires-config` plugins the user selected).
79
+ * 2. `platformKey: false` lines for any `optional` plugin the user
80
+ * deselected — because `VendurePlatform` enables them by default.
81
+ */
102
82
  hbs.registerHelper('platformPluginOptions', function () {
103
83
  const blocks = [];
104
84
  for (const key of resolvedPluginKeys) {
105
- const plugin = (0, plugin_registry_1.getPlugin)(key);
106
- if (!plugin || !plugin.platformOptionsBlock)
107
- continue;
108
- blocks.push(` ${plugin.platformOptionsBlock},`);
85
+ const block = (0, plugin_registry_1.getPlugin)(key).platformOptionsBlock;
86
+ if (block)
87
+ blocks.push(` ${block},`);
88
+ }
89
+ for (const key of disabledPluginKeys) {
90
+ blocks.push(` ${(0, plugin_registry_1.getPlugin)(key).platformKey}: false,`);
109
91
  }
110
92
  return new hbs.SafeString(blocks.join('\n'));
111
93
  });
112
94
  return hbs;
113
95
  }
114
- function buildTemplateContext(projectName, companyName, resolvedPluginKeys, includeStorefront) {
115
- const resolvedPlugins = resolvedPluginKeys
116
- .map((key) => (0, plugin_registry_1.getPlugin)(key))
117
- .filter((p) => p != null);
96
+ function buildTemplateContext(projectName, companyName, selectedPluginKeys, includeStorefront) {
97
+ const resolvedPluginKeys = (0, plugin_registry_1.resolveActivePluginKeys)(selectedPluginKeys);
98
+ const resolvedPlugins = resolvedPluginKeys.map((key) => (0, plugin_registry_1.getPlugin)(key));
99
+ const resolvedSet = new Set(resolvedPluginKeys);
100
+ const disabledPluginKeys = plugin_registry_1.pluginRegistry
101
+ .filter((p) => p.tier === 'optional' && !resolvedSet.has(p.key))
102
+ .map((p) => p.key);
118
103
  return {
119
104
  context: {
120
105
  projectName,
121
106
  companyName,
122
107
  resolvedPluginKeys,
123
108
  resolvedPlugins,
109
+ disabledPluginKeys,
124
110
  includeStorefront,
111
+ registryUrl: (0, registry_1.getRegistryUrl)(),
125
112
  },
126
- hbs: createHandlebarsInstance(resolvedPluginKeys),
113
+ hbs: createHandlebarsInstance(resolvedPluginKeys, disabledPluginKeys),
127
114
  };
128
115
  }
129
116
  /**
@@ -134,25 +121,6 @@ function renderTemplate(templatePath, context, hbs) {
134
121
  const template = hbs.compile(source, { noEscape: true });
135
122
  return template(context);
136
123
  }
137
- /**
138
- * Get the path to a bundled asset file.
139
- * At runtime these live in dist/assets/.
140
- * During development they live in assets/.
141
- */
142
- function getAssetPath(assetName) {
143
- const candidates = [
144
- path.join(__dirname, 'assets', assetName),
145
- path.join(__dirname, '..', 'assets', assetName),
146
- ];
147
- for (const candidate of candidates) {
148
- if (fs.existsSync(candidate)) {
149
- return candidate;
150
- }
151
- }
152
- throw new Error(`Asset not found: ${assetName}\n` +
153
- ` __dirname: ${__dirname}\n` +
154
- ` Searched:\n${candidates.map((c) => ` - ${c} (exists: ${fs.existsSync(path.dirname(c))})`).join('\n')}`);
155
- }
156
124
  /**
157
125
  * Get the path to a bundled template file.
158
126
  * At runtime these live in dist/assets/templates/.
@@ -1 +1 @@
1
- {"version":3,"file":"template-renderer.js","sourceRoot":"","sources":["../src/template-renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template-renderer.js","sourceRoot":"","sources":["../src/template-renderer.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { PluginMeta } from '@vendure-platform/plugin-meta';
1
2
  export interface ScaffoldOptions {
2
3
  projectName: string;
3
4
  companyName: string;
@@ -5,6 +6,23 @@ export interface ScaffoldOptions {
5
6
  includeStorefront: boolean;
6
7
  createGithubRepo: boolean;
7
8
  githubOrg?: string;
9
+ /**
10
+ * Package manager used for the install step. Defaults to `bun` to match
11
+ * the recommended invocation `bunx @vendure-platform/create`.
12
+ */
13
+ packageManager?: PackageManager;
14
+ skipInstall?: boolean;
15
+ skipGit?: boolean;
16
+ dryRun?: boolean;
17
+ }
18
+ export type PackageManager = 'bun' | 'npm' | 'pnpm';
19
+ export interface StorefrontOnlyOptions {
20
+ projectName: string;
21
+ /** Vendure Shop API URL written to `.env.local`. */
22
+ apiUrl?: string;
23
+ /** Scenario baked into `NEXT_PUBLIC_SCENARIO`. Default: `customer`. */
24
+ scenario: string;
25
+ packageManager: PackageManager;
8
26
  skipInstall?: boolean;
9
27
  skipGit?: boolean;
10
28
  dryRun?: boolean;
@@ -18,43 +36,44 @@ export interface CliFlags {
18
36
  install?: boolean;
19
37
  git?: boolean;
20
38
  dryRun?: boolean;
39
+ storefrontOnly?: boolean;
40
+ apiUrl?: string;
41
+ scenario?: string;
42
+ pm?: PackageManager;
21
43
  }
22
- export interface PluginDefinition {
23
- /** Unique key matching the lib folder name */
24
- key: string;
25
- /** npm package name */
26
- packageName: string;
27
- /** Human-readable name */
28
- displayName: string;
29
- /** Grouping for the multi-select prompt */
30
- category: 'b2b' | 'commerce' | 'platform' | 'search';
31
- /** Other plugin keys this plugin depends on */
32
- requires: string[];
33
- /** Named imports from the package for vendure-config.ts (legacy, individual plugin mode) */
34
- imports: string[];
35
- /** Environment variables this plugin needs */
44
+ /**
45
+ * Scaffolder-specific data for a plugin — env vars, options-block template
46
+ * snippets, additional imports. Keyed by the same `key` (kebab-case) used in
47
+ * `@vendure-platform/plugin-meta` so the two halves can be joined at runtime.
48
+ *
49
+ * The shared `PluginMeta` defines what every consumer agrees on (key, tier,
50
+ * dependencies, etc.); this interface holds the bits only the scaffolder
51
+ * needs and which would be dead weight in `@vendure-platform/platform` or
52
+ * any other consumer.
53
+ */
54
+ export interface ScaffolderPluginExtras {
55
+ /** Environment variables to add to the generated `.env` file. */
36
56
  envVars: EnvVar[];
37
- /** The .init({...}) or plugin expression code for vendure-config.ts (legacy, individual plugin mode) */
38
- configBlock: string;
39
57
  /**
40
- * The options fragment emitted under this plugin's key in `VendurePlatform.init({...})`.
41
- * Compiled through Handlebars so it can use `{{#ifPlugin}}` guards.
58
+ * Options fragment emitted under this plugin's key in
59
+ * `VendurePlatform.init({...})`. Compiled through Handlebars so it can
60
+ * use `{{#ifPlugin}}` guards. Empty string means the plugin activates
61
+ * with just defaults — no entry will be emitted.
42
62
  */
43
63
  platformOptionsBlock: string;
44
64
  /**
45
- * Additional imports needed when this plugin is selected in VendurePlatform mode.
46
- * These are imports beyond `VendurePlatform` itself (e.g. strategy classes the user
47
- * references in their options).
65
+ * Extra named imports the options block needs (e.g. strategy classes
66
+ * referenced inside `platformOptionsBlock`).
48
67
  */
49
68
  platformImports?: string[];
50
- /**
51
- * If true, this plugin is not shown in the interactive plugin selection prompt.
52
- * Used for internal/infrastructure plugins like `platform`.
53
- */
54
- internal?: boolean;
69
+ }
70
+ /**
71
+ * The joined view used by the scaffolder: shared metadata + scaffolder extras.
72
+ * Each `pluginRegistry` entry has this shape — see `plugin-registry.ts`.
73
+ */
74
+ export interface PluginDefinition extends PluginMeta, ScaffolderPluginExtras {
55
75
  }
56
76
  export interface EnvVar {
57
77
  name: string;
58
78
  defaultValue: string;
59
- comment?: string;
60
79
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vendure-platform/create",
3
- "version": "0.1.0",
3
+ "version": "0.2.1-nightly.202605190703",
4
4
  "description": "CLI tool to scaffold a Vendure demo project with Vendure Platform plugins",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
@@ -22,6 +22,7 @@
22
22
  }
23
23
  },
24
24
  "files": [
25
+ "CHANGELOG.md",
25
26
  "dist/**/*",
26
27
  "!**/*.tsbuildinfo",
27
28
  "!**/*.spec.*",
@@ -36,6 +37,7 @@
36
37
  },
37
38
  "dependencies": {
38
39
  "@clack/prompts": "^0.10.0",
40
+ "@vendure-platform/plugin-meta": "0.2.0",
39
41
  "commander": "^13.1.0",
40
42
  "fs-extra": "^11.3.0",
41
43
  "handlebars": "^4.7.8",
@@ -1 +0,0 @@
1
- # NEXT_PUBLIC_SCENARIO=b2b-wholesale
@@ -1,4 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none">
2
- <rect x="2" y="2" width="28" height="28" rx="5" fill="#e07a00"/>
3
- <text x="16" y="22.5" font-family="Arial Black, Impact, sans-serif" font-size="14" font-weight="900" fill="white" text-anchor="middle" letter-spacing="-0.5">BD</text>
4
- </svg>
@@ -1,4 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 40 27">
2
- <path fill="#17C1FF" d="M10.746 12.008v9.263c0 .166.093.323.237.404l8.407 4.763c.302.17.671.17.973 0l8.407-4.762a.466.466 0 0 0 .237-.405v-9.263a.476.476 0 0 0-.714-.405l-7.93 4.491a.996.996 0 0 1-.973 0l-7.93-4.49a.476.476 0 0 0-.714.404Z"/>
3
- <path fill="#17C1FF" d="M8.893.072.486 4.832A.948.948 0 0 0 0 5.657v9.522c0 .166.092.323.237.405l8.176 4.633a.476.476 0 0 0 .714-.405V10.83c0-.341.185-.655.487-.824l7.93-4.491a.463.463 0 0 0 0-.81L9.366.072a.48.48 0 0 0-.477 0h.003ZM30.86.063l8.407 4.76c.301.17.486.486.486.825v9.522a.469.469 0 0 1-.237.405l-8.176 4.633a.476.476 0 0 1-.714-.405v-8.982a.945.945 0 0 0-.486-.824l-7.93-4.491a.463.463 0 0 1 0-.81L30.386.063a.48.48 0 0 1 .477 0h-.003Z"/>
4
- </svg>
@@ -1,7 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none">
2
- <rect x="2" y="2" width="28" height="28" rx="5" fill="#1c1917"/>
3
- <path d="M16 6c-.5 2.8-3.2 4.3-3.2 7.8 0 2 1.4 3.6 3.2 3.6s3.2-1.6 3.2-3.6c0-1.2-.4-2-1.1-3 .3 1.4-.4 2.4-1.1 2.4-.7 0-1.1-.6-1.1-1.5C15.9 10 16.9 8.6 16 6z" fill="#dc2626"/>
4
- <rect x="12" y="18" width="8" height="1.6" fill="#a8a29e"/>
5
- <rect x="12" y="20.8" width="8" height="1.6" fill="#a8a29e"/>
6
- <rect x="12" y="23.6" width="8" height="1.6" fill="#a8a29e"/>
7
- </svg>
@@ -1,80 +0,0 @@
1
- import Image from 'next/image';
2
- import {getTranslations} from 'next-intl/server';
3
- import {Button} from '@/components/ui/button';
4
- import {getBranding} from '@/config/branding';
5
- import {isBackendReachable} from '@/lib/backend-health';
6
-
7
- const CONTACT_URL = 'https://vendure.io/contact/';
8
-
9
- /**
10
- * Suspense-wrappable server component that renders nothing when the Vendure
11
- * backend is reachable, or a full-screen "Demo Paused" overlay when it isn't.
12
- *
13
- * Must be used inside a <Suspense> boundary — it awaits isBackendReachable(),
14
- * which would otherwise block layout prerender under cacheComponents.
15
- */
16
- export async function BackendHealthGate({locale}: {locale: string}) {
17
- const reachable = await isBackendReachable();
18
- if (reachable) return null;
19
- return <ScenarioPausedOverlay locale={locale} />;
20
- }
21
-
22
- async function ScenarioPausedOverlay({locale}: {locale: string}) {
23
- const t = await getTranslations({locale, namespace: 'ScenarioPaused'});
24
- const {logo, logoInverted, siteName} = getBranding();
25
- const displayLogo = logoInverted ?? logo;
26
-
27
- return (
28
- <div className="fixed inset-0 z-[9999] flex flex-col items-center justify-center px-4 py-12 bg-background overflow-auto">
29
- <div className="max-w-lg w-full text-center space-y-8">
30
- <div className="flex justify-center">
31
- <Image
32
- src={displayLogo.src}
33
- alt={displayLogo.alt}
34
- width={displayLogo.width}
35
- height={displayLogo.height}
36
- className="h-16 w-auto"
37
- priority
38
- />
39
- </div>
40
-
41
- <div className="inline-flex items-center gap-2 rounded-full border border-border bg-muted/60 px-4 py-1.5 text-xs font-medium text-muted-foreground">
42
- <span className="relative flex h-2 w-2">
43
- <span className="absolute inline-flex h-full w-full rounded-full bg-primary/40 animate-ping" />
44
- <span className="relative inline-flex h-2 w-2 rounded-full bg-primary" />
45
- </span>
46
- {t('badge')}
47
- </div>
48
-
49
- <div className="space-y-4">
50
- <h1 className="text-3xl sm:text-4xl font-bold tracking-tight text-foreground">
51
- {t('title', {siteName})}
52
- </h1>
53
- <p className="text-base text-muted-foreground leading-relaxed">
54
- {t('description')}
55
- </p>
56
- </div>
57
-
58
- <div className="flex flex-col sm:flex-row gap-3 justify-center pt-2">
59
- <Button asChild size="lg">
60
- <a href={CONTACT_URL} target="_blank" rel="noopener noreferrer">
61
- {t('contactCta')}
62
- </a>
63
- </Button>
64
- <Button asChild size="lg" variant="outline">
65
- <a href="https://vendure.io" target="_blank" rel="noopener noreferrer">
66
- {t('learnMore')}
67
- </a>
68
- </Button>
69
- </div>
70
-
71
- <p className="text-xs text-muted-foreground pt-4">
72
- {t('poweredBy')}{' '}
73
- <a href="https://vendure.io" target="_blank" rel="noopener noreferrer" className="underline hover:text-foreground transition-colors">
74
- Vendure
75
- </a>
76
- </p>
77
- </div>
78
- </div>
79
- );
80
- }
@@ -1,180 +0,0 @@
1
- import type { StorefrontBranding } from '@/config/branding';
2
-
3
- /* =============================================================
4
- Color palettes — Construction Orange + Warm Stone
5
- ============================================================= */
6
-
7
- const baseVars: Record<string, string> = {
8
- '--radius': '0.375rem',
9
- };
10
-
11
- const heroColors: Record<string, string> = {
12
- '--hero-gradient-from': '#1c1917',
13
- '--hero-gradient-via': '#292524',
14
- '--hero-gradient-to': '#1c1917',
15
- '--hero-accent': '#fb923c',
16
- '--hero-accent-bg': '#e07a00',
17
- '--hero-accent-bg-hover': '#c96e00',
18
- '--hero-accent-foreground': '#ffffff',
19
- '--hero-text': '#f5f5f4',
20
- '--hero-text-muted': '#d6d3d1',
21
- '--hero-border': 'rgba(214, 211, 209, 0.25)',
22
- '--hero-badge-bg': 'rgba(224, 122, 0, 0.18)',
23
- '--hero-badge-border': 'rgba(251, 146, 60, 0.4)',
24
- '--hero-bg-image': 'url(/scenarios/b2b-wholesale/hero/hero-bg.webp)',
25
- };
26
-
27
- const darkColors: Record<string, string> = {
28
- ...baseVars,
29
-
30
- '--background': '#1c1917',
31
- '--foreground': '#f5f5f4',
32
-
33
- '--card': '#292524',
34
- '--card-foreground': '#f5f5f4',
35
- '--popover': '#292524',
36
- '--popover-foreground': '#f5f5f4',
37
-
38
- '--primary': '#e07a00',
39
- '--primary-foreground': '#ffffff',
40
-
41
- '--secondary': '#292524',
42
- '--secondary-foreground': '#f5f5f4',
43
-
44
- '--muted': '#292524',
45
- '--muted-foreground': '#a8a29e',
46
-
47
- '--accent': '#292524',
48
- '--accent-foreground': '#f5f5f4',
49
-
50
- '--destructive': '#dc2626',
51
-
52
- '--border': '#44403c',
53
- '--input': '#292524',
54
- '--ring': '#e07a00',
55
-
56
- '--chart-1': '#e07a00',
57
- '--chart-2': '#22c55e',
58
- '--chart-3': '#eab308',
59
- '--chart-4': '#f97316',
60
- '--chart-5': '#dc2626',
61
-
62
- '--sidebar': '#1c1917',
63
- '--sidebar-foreground': '#f5f5f4',
64
- '--sidebar-primary': '#e07a00',
65
- '--sidebar-primary-foreground': '#ffffff',
66
- '--sidebar-accent': '#292524',
67
- '--sidebar-accent-foreground': '#f5f5f4',
68
- '--sidebar-border': '#44403c',
69
- '--sidebar-ring': '#e07a00',
70
-
71
- ...heroColors,
72
- };
73
-
74
- const lightColors: Record<string, string> = {
75
- ...baseVars,
76
-
77
- '--background': '#ffffff',
78
- '--foreground': '#1c1917',
79
-
80
- '--card': '#fafaf9',
81
- '--card-foreground': '#1c1917',
82
- '--popover': '#ffffff',
83
- '--popover-foreground': '#1c1917',
84
-
85
- '--primary': '#d97706',
86
- '--primary-foreground': '#ffffff',
87
-
88
- '--secondary': '#f5f5f4',
89
- '--secondary-foreground': '#1c1917',
90
-
91
- '--muted': '#f5f5f4',
92
- '--muted-foreground': '#78716c',
93
-
94
- '--accent': '#f5f5f4',
95
- '--accent-foreground': '#1c1917',
96
-
97
- '--destructive': '#dc2626',
98
-
99
- '--border': '#e7e5e4',
100
- '--input': '#e7e5e4',
101
- '--ring': '#d97706',
102
-
103
- '--chart-1': '#d97706',
104
- '--chart-2': '#16a34a',
105
- '--chart-3': '#ca8a04',
106
- '--chart-4': '#ea580c',
107
- '--chart-5': '#dc2626',
108
-
109
- '--sidebar': '#fafaf9',
110
- '--sidebar-foreground': '#1c1917',
111
- '--sidebar-primary': '#d97706',
112
- '--sidebar-primary-foreground': '#ffffff',
113
- '--sidebar-accent': '#f5f5f4',
114
- '--sidebar-accent-foreground': '#1c1917',
115
- '--sidebar-border': '#e7e5e4',
116
- '--sidebar-ring': '#d97706',
117
-
118
- ...heroColors,
119
- };
120
-
121
- export const branding: StorefrontBranding = {
122
- siteName: 'BauDirekt',
123
- siteDescription: 'Baustoffe. Direkt. Der Baustoffgroßhandel für DACH-Profis.',
124
-
125
- logo: { src: '/scenarios/b2b-wholesale/logo.svg', alt: 'BauDirekt', width: 32, height: 32 },
126
-
127
- colors: {
128
- dark: darkColors,
129
- light: lightColors,
130
- },
131
-
132
- demoAccounts: [
133
- {
134
- email: 'buyer@berger-bau.demo',
135
- label: 'Einkäufer',
136
- description: 'Berger Bau GmbH · Bestellt Baumaterial (Freigabe >€500)',
137
- },
138
- {
139
- email: 'approver@berger-bau.demo',
140
- label: 'Freigeber',
141
- description: 'Berger Bau GmbH · Genehmigt Bestellungen',
142
- },
143
- {
144
- email: 'admin@berger-bau.demo',
145
- label: 'Firmenadmin',
146
- description: 'Berger Bau GmbH · Verwaltet Nutzer & Adressen',
147
- },
148
- {
149
- email: 'admin@klein-handwerk.demo',
150
- label: 'Inhaber',
151
- description: 'Klein Handwerk · Einzelunternehmer, kein Workflow',
152
- },
153
- {
154
- email: 'buyer@huber-baustoffe.demo',
155
- label: 'Einkaufsleitung',
156
- description: 'Huber Baustoffe GmbH · Großabnehmer (DE)',
157
- },
158
- {
159
- email: 'admin@huber-baustoffe.demo',
160
- label: 'Firmenadmin',
161
- description: 'Huber Baustoffe GmbH · Unternehmensverwaltung',
162
- },
163
- ],
164
-
165
- footer: {
166
- copyright: 'BauDirekt GmbH',
167
- poweredByLinks: [
168
- { label: 'Vendure Commerce', href: 'https://vendure.io' },
169
- ],
170
- },
171
-
172
- metadata: {
173
- themeColor: '#1c1917',
174
- defaultDescription:
175
- 'Baustoffe, Werkzeuge & Arbeitsschutz zum Großhandelspreis. Für Baufirmen, Handwerker und Fachhändler im DACH-Raum.',
176
- homepageTitle: 'Baustoffgroßhandel für DACH-Profis',
177
- homepageDescription:
178
- 'Dämmstoffe, Befestigungstechnik, Werkzeuge & PSA zum Fachhandelspreis. Zuverlässig. Direkt. BauDirekt.',
179
- },
180
- };