boilercraft 1.0.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 (146) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +171 -0
  3. package/bin/boilercraft.js +110 -0
  4. package/cli/app.js +596 -0
  5. package/cli/ui.js +356 -0
  6. package/docs/STACK_ENGINE.md +93 -0
  7. package/docs/assets/cli-create.svg +52 -0
  8. package/docs/assets/cli-menu.svg +47 -0
  9. package/docs/stacks/dotnet-core.md +69 -0
  10. package/docs/stacks/laravel-vue.md +46 -0
  11. package/docs/stacks/nextjs.md +58 -0
  12. package/docs/stacks/node-express.md +58 -0
  13. package/docs/stacks/raw-php.md +130 -0
  14. package/main.js +82 -0
  15. package/package.json +86 -0
  16. package/public/index.html +721 -0
  17. package/public/logo.png +17 -0
  18. package/public/logo.svg +17 -0
  19. package/server.js +84 -0
  20. package/services/componentGenerator.js +195 -0
  21. package/services/engine/scaffoldEngine.js +517 -0
  22. package/services/engine/toolInstaller.js +232 -0
  23. package/services/engine/versionCatalog.js +115 -0
  24. package/services/generate.js +46 -0
  25. package/services/projectGenerator.js +686 -0
  26. package/services/readmeGenerator.js +221 -0
  27. package/services/themeGenerator.js +150 -0
  28. package/services/versionResolver.js +176 -0
  29. package/stacks/dotnet-core/overlays/api/Controllers/ProductsController.cs +33 -0
  30. package/stacks/dotnet-core/overlays/api/Program.cs +33 -0
  31. package/stacks/dotnet-core/overlays/api/wwwroot/index.html +38 -0
  32. package/stacks/dotnet-core/overlays/api-auth/Controllers/AuthController.cs +87 -0
  33. package/stacks/dotnet-core/overlays/common/Data/ApplicationDbContext.cs +25 -0
  34. package/stacks/dotnet-core/overlays/common/Models/Product.cs +19 -0
  35. package/stacks/dotnet-core/overlays/mvc/Controllers/ProductsController.cs +84 -0
  36. package/stacks/dotnet-core/overlays/mvc/Views/Home/Index.cshtml +23 -0
  37. package/stacks/dotnet-core/overlays/mvc/Views/Products/Create.cshtml +16 -0
  38. package/stacks/dotnet-core/overlays/mvc/Views/Products/Delete.cshtml +16 -0
  39. package/stacks/dotnet-core/overlays/mvc/Views/Products/Edit.cshtml +17 -0
  40. package/stacks/dotnet-core/overlays/mvc/Views/Products/Index.cshtml +46 -0
  41. package/stacks/dotnet-core/overlays/mvc/Views/Products/_Form.cshtml +19 -0
  42. package/stacks/dotnet-core/overlays/mvc-auth/Controllers/AccountController.cs +98 -0
  43. package/stacks/dotnet-core/overlays/mvc-auth/Models/AppUser.cs +48 -0
  44. package/stacks/dotnet-core/overlays/mvc-auth/Views/Account/Login.cshtml +35 -0
  45. package/stacks/dotnet-core/overlays/mvc-auth/Views/Account/Register.cshtml +41 -0
  46. package/stacks/dotnet-core/overlays/mvc-auth/Views/Shared/_AuthNav.cshtml +22 -0
  47. package/stacks/dotnet-core/snippets/packages-auth.xml +4 -0
  48. package/stacks/dotnet-core/snippets/packages-common.xml +5 -0
  49. package/stacks/dotnet-core/snippets/packages-ef.xml +4 -0
  50. package/stacks/dotnet-core/snippets/packages-mssql.xml +4 -0
  51. package/stacks/dotnet-core/snippets/packages-mysql.xml +4 -0
  52. package/stacks/dotnet-core/snippets/packages-swagger.xml +4 -0
  53. package/stacks/dotnet-core/stack.json +426 -0
  54. package/stacks/laravel/overlays/auth/app/Http/Controllers/Api/AuthController.php +67 -0
  55. package/stacks/laravel/overlays/common/app/Http/Controllers/BoilerCraftController.php +14 -0
  56. package/stacks/laravel/overlays/common/resources/views/boilercraft.blade.php +36 -0
  57. package/stacks/laravel/overlays/inertia-common/resources/views/app.blade.php +15 -0
  58. package/stacks/laravel/overlays/inertia-react/resources/js/Pages/Welcome.jsx +18 -0
  59. package/stacks/laravel/overlays/inertia-react/resources/js/app.jsx +13 -0
  60. package/stacks/laravel/overlays/inertia-vue/resources/js/Pages/Welcome.vue +23 -0
  61. package/stacks/laravel/overlays/inertia-vue/resources/js/app.js +13 -0
  62. package/stacks/laravel/snippets/api-routes.php +9 -0
  63. package/stacks/laravel/snippets/web-routes-inertia.php +7 -0
  64. package/stacks/laravel/snippets/web-routes.php +4 -0
  65. package/stacks/laravel/stack.json +477 -0
  66. package/stacks/nextjs/overlays/auth/src/lib/auth.js +36 -0
  67. package/stacks/nextjs/overlays/auth-app/src/app/api/auth/login/route.js +11 -0
  68. package/stacks/nextjs/overlays/auth-app/src/app/api/auth/register/route.js +14 -0
  69. package/stacks/nextjs/overlays/auth-pages/src/pages/api/auth/login.js +14 -0
  70. package/stacks/nextjs/overlays/auth-pages/src/pages/api/auth/register.js +17 -0
  71. package/stacks/nextjs/overlays/common/.env.example +3 -0
  72. package/stacks/nextjs/overlays/common/.env.local +3 -0
  73. package/stacks/nextjs/overlays/db/mongodb/src/lib/db.js +12 -0
  74. package/stacks/nextjs/overlays/db/mssql/src/lib/db.js +17 -0
  75. package/stacks/nextjs/overlays/db/mysql/src/lib/db.js +13 -0
  76. package/stacks/nextjs/overlays/router-app/src/app/api/health/route.js +10 -0
  77. package/stacks/nextjs/overlays/router-app/src/app/layout.js +16 -0
  78. package/stacks/nextjs/overlays/router-app/src/app/page.js +19 -0
  79. package/stacks/nextjs/overlays/router-pages/src/pages/_app.js +7 -0
  80. package/stacks/nextjs/overlays/router-pages/src/pages/_document.js +13 -0
  81. package/stacks/nextjs/overlays/router-pages/src/pages/api/health.js +8 -0
  82. package/stacks/nextjs/overlays/router-pages/src/pages/index.js +27 -0
  83. package/stacks/nextjs/stack.json +257 -0
  84. package/stacks/node-express/overlays/auth/src/controllers/authController.js +53 -0
  85. package/stacks/node-express/overlays/auth/src/middlewares/auth.js +36 -0
  86. package/stacks/node-express/overlays/auth/src/routes/authRoutes.js +16 -0
  87. package/stacks/node-express/overlays/common/.env.example +5 -0
  88. package/stacks/node-express/overlays/common/public/index.html +31 -0
  89. package/stacks/node-express/overlays/common/src/server.js +32 -0
  90. package/stacks/node-express/overlays/db/mongodb/src/db.js +13 -0
  91. package/stacks/node-express/overlays/db/mssql/src/db.js +22 -0
  92. package/stacks/node-express/overlays/db/mysql/src/db.js +22 -0
  93. package/stacks/node-express/stack.json +165 -0
  94. package/templates/dotnet-bootstrap-mssql/Controllers/AuthController.cs +74 -0
  95. package/templates/dotnet-bootstrap-mssql/Controllers/ProductsController.cs +33 -0
  96. package/templates/dotnet-bootstrap-mssql/Data/ApplicationDbContext.cs +24 -0
  97. package/templates/dotnet-bootstrap-mssql/Models/Product.cs +10 -0
  98. package/templates/dotnet-core/Controllers/AuthController.cs +74 -0
  99. package/templates/laravel-full/app/Http/Controllers/AuthController.php +79 -0
  100. package/templates/laravel-full/app/Http/Controllers/HomeController.php +22 -0
  101. package/templates/laravel-full/app/Models/User.php +49 -0
  102. package/templates/laravel-full/artisan +22 -0
  103. package/templates/laravel-full/bootstrap/app.php +21 -0
  104. package/templates/laravel-full/config/database.php +54 -0
  105. package/templates/laravel-full/database/migrations/2024_01_01_000001_create_users_table.php +27 -0
  106. package/templates/laravel-full/public/index.php +17 -0
  107. package/templates/laravel-full/resources/css/app.css +3 -0
  108. package/templates/laravel-full/resources/js/Pages/Home.vue +76 -0
  109. package/templates/laravel-full/resources/js/app.js +21 -0
  110. package/templates/laravel-full/resources/js/bootstrap.js +3 -0
  111. package/templates/laravel-full/resources/views/app.blade.php +15 -0
  112. package/templates/laravel-full/routes/api.php +8 -0
  113. package/templates/laravel-full/routes/console.php +7 -0
  114. package/templates/laravel-full/routes/web.php +24 -0
  115. package/templates/laravel-full/tailwind.config.js +12 -0
  116. package/templates/laravel-full/vite.config.js +20 -0
  117. package/templates/laravel-vue/app/Http/Controllers/Auth/AuthenticatedSessionController.php +43 -0
  118. package/templates/laravel-vue-mysql/app/Http/Controllers/HomeController.php +25 -0
  119. package/templates/laravel-vue-mysql/resources/js/Pages/Home.vue +70 -0
  120. package/templates/nextjs/src/app/api/auth/login/route.js +28 -0
  121. package/templates/nextjs-mongodb/src/app/api/health/route.js +17 -0
  122. package/templates/nextjs-mongodb/src/lib/mongodb.js +18 -0
  123. package/templates/nextjs-mssql/src/app/api/health/route.js +24 -0
  124. package/templates/nextjs-mssql/src/lib/mssql.js +38 -0
  125. package/templates/node-express/src/controllers/authController.js +53 -0
  126. package/templates/node-express/src/middlewares/auth.js +36 -0
  127. package/templates/node-express/src/routes/authRoutes.js +16 -0
  128. package/templates/node-mongodb/src/controllers/userController.js +30 -0
  129. package/templates/node-mongodb/src/middlewares/errorHandler.js +8 -0
  130. package/templates/node-mongodb/src/models/User.js +23 -0
  131. package/templates/node-mongodb/src/routes/api.js +9 -0
  132. package/templates/raw-php-mysql/app/Controllers/AuthController.php +73 -0
  133. package/templates/raw-php-mysql/app/Controllers/HomeController.php +65 -0
  134. package/templates/raw-php-mysql/app/Models/User.php +60 -0
  135. package/templates/raw-php-mysql/app/Views/404.php +15 -0
  136. package/templates/raw-php-mysql/app/Views/auth/login.php +66 -0
  137. package/templates/raw-php-mysql/app/Views/auth/register.php +71 -0
  138. package/templates/raw-php-mysql/app/Views/dashboard.php +50 -0
  139. package/templates/raw-php-mysql/app/Views/home.php +83 -0
  140. package/templates/raw-php-mysql/config/Auth.php +62 -0
  141. package/templates/raw-php-mysql/config/Database.php +100 -0
  142. package/templates/raw-php-mysql/config/Env.php +30 -0
  143. package/templates/raw-php-mysql/config/Middleware.php +53 -0
  144. package/templates/raw-php-mysql/config/QueryBuilder.php +109 -0
  145. package/templates/raw-php-mysql/config/Router.php +33 -0
  146. package/templates/raw-php-mysql/public/index.php +57 -0
@@ -0,0 +1,17 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
2
+ <!-- Solid Pure Dark Navy Square -->
3
+ <rect width="512" height="512" rx="96" fill="#0f172a" />
4
+
5
+ <!-- Outer Flat Hexagon Frame -->
6
+ <polygon points="256,64 430,164 430,364 256,464 82,364 82,164"
7
+ fill="none" stroke="#0284c7" stroke-width="26" stroke-linejoin="round" />
8
+
9
+ <!-- Inner Flat Architecture Lines -->
10
+ <line x1="256" y1="64" x2="256" y2="180" stroke="#0284c7" stroke-width="20" stroke-linecap="round" />
11
+ <line x1="430" y1="364" x2="330" y2="306" stroke="#0284c7" stroke-width="20" stroke-linecap="round" />
12
+ <line x1="82" y1="364" x2="182" y2="306" stroke="#0284c7" stroke-width="20" stroke-linecap="round" />
13
+
14
+ <!-- Solid Flat Lightning Monogram (Pure Solid Cyan, No Gradient, No Shadow) -->
15
+ <polygon points="280,110 160,280 244,280 220,410 352,240 268,240"
16
+ fill="#00d8ff" />
17
+ </svg>
@@ -0,0 +1,17 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
2
+ <!-- Solid Pure Dark Navy Square -->
3
+ <rect width="512" height="512" rx="96" fill="#0f172a" />
4
+
5
+ <!-- Outer Flat Hexagon Frame -->
6
+ <polygon points="256,64 430,164 430,364 256,464 82,364 82,164"
7
+ fill="none" stroke="#0284c7" stroke-width="26" stroke-linejoin="round" />
8
+
9
+ <!-- Inner Flat Architecture Lines -->
10
+ <line x1="256" y1="64" x2="256" y2="180" stroke="#0284c7" stroke-width="20" stroke-linecap="round" />
11
+ <line x1="430" y1="364" x2="330" y2="306" stroke="#0284c7" stroke-width="20" stroke-linecap="round" />
12
+ <line x1="82" y1="364" x2="182" y2="306" stroke="#0284c7" stroke-width="20" stroke-linecap="round" />
13
+
14
+ <!-- Solid Flat Lightning Monogram (Pure Solid Cyan, No Gradient, No Shadow) -->
15
+ <polygon points="280,110 160,280 244,280 220,410 352,240 268,240"
16
+ fill="#00d8ff" />
17
+ </svg>
package/server.js ADDED
@@ -0,0 +1,84 @@
1
+ const express = require('express');
2
+ const cors = require('cors');
3
+ const path = require('path');
4
+ const { generateProject } = require('./services/projectGenerator');
5
+ const { getLatestNpmVersion, getLatestPackagistVersion } = require('./services/versionResolver');
6
+ const { describeStacks, RequirementError } = require('./services/engine/scaffoldEngine');
7
+ // generate() (engine + legacy fallback) lives in services/generate.js, shared with the CLI.
8
+ const { generate } = require('./services/generate');
9
+
10
+ const app = express();
11
+ const PORT = process.env.PORT || 4800;
12
+
13
+ app.use(cors());
14
+ app.use(express.json());
15
+ app.use(express.static(path.join(__dirname, 'public')));
16
+
17
+ // Available stacks with live version lists and toolchain status.
18
+ app.get('/api/stacks', async (req, res) => {
19
+ try {
20
+ res.json({ stacks: await describeStacks() });
21
+ } catch (err) {
22
+ res.status(500).json({ error: err.message });
23
+ }
24
+ });
25
+
26
+ // Generation API Endpoint. With ?stream=1 the response is NDJSON:
27
+ // {"type":"log","message":...} lines followed by one {"type":"result",...}.
28
+ app.post('/api/generate', async (req, res) => {
29
+ const config = req.body;
30
+ const stream = req.query.stream === '1';
31
+ console.log(`[BoilerCraft] Generating project: ${config.projectName} at: ${config.outputDir || 'default'}`);
32
+
33
+ if (stream) res.setHeader('Content-Type', 'application/x-ndjson');
34
+ const send = obj => res.write(JSON.stringify(obj) + '\n');
35
+ const onLog = stream ? message => send({ type: 'log', message }) : () => {};
36
+
37
+ try {
38
+ const result = await generate(config, onLog);
39
+ if (stream) {
40
+ send({ type: 'result', ...result });
41
+ res.end();
42
+ } else {
43
+ res.json(result);
44
+ }
45
+ } catch (err) {
46
+ console.error('[BoilerCraft] Generation Error:', err);
47
+ const body = { success: false, error: err.message, missing: err.missing };
48
+ if (stream) {
49
+ send({ type: 'result', ...body });
50
+ res.end();
51
+ } else {
52
+ res.status(err instanceof RequirementError ? 400 : 500).json(body);
53
+ }
54
+ }
55
+ });
56
+
57
+ // Real-time package version check endpoint
58
+ app.get('/api/version-check', async (req, res) => {
59
+ const { pkg, type } = req.query;
60
+ try {
61
+ let ver = 'latest';
62
+ if (type === 'packagist') {
63
+ ver = await getLatestPackagistVersion(pkg);
64
+ } else {
65
+ ver = await getLatestNpmVersion(pkg);
66
+ }
67
+ res.json({ package: pkg, version: ver });
68
+ } catch (err) {
69
+ res.status(500).json({ error: err.message });
70
+ }
71
+ });
72
+
73
+ function startServer(cb) {
74
+ return app.listen(PORT, () => {
75
+ console.log(`🔥 BoilerCraft Studio active at http://localhost:${PORT}`);
76
+ if (cb) cb(PORT);
77
+ });
78
+ }
79
+
80
+ if (require.main === module) {
81
+ startServer();
82
+ }
83
+
84
+ module.exports = { app, startServer, PORT };
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Generates ready-to-use modern UI component snippets:
3
+ * - Skeleton Loader
4
+ * - Spinner Loader
5
+ * - Action Modal
6
+ * - Offcanvas Drawer
7
+ * - SweetAlert2 (swalfire) Alert Popups
8
+ * - Toastr / Sonner Notifications
9
+ */
10
+
11
+ function getSkeletonComponent(framework = 'tailwind') {
12
+ if (framework === 'bootstrap') {
13
+ return `
14
+ <!-- Skeleton Loader Component (Bootstrap 5) -->
15
+ <div class="card placeholder-glow p-3 border-0 shadow-sm" style="background: var(--color-surface); border-radius: var(--radius-base);">
16
+ <div class="d-flex align-items-center mb-3">
17
+ <div class="placeholder rounded-circle" style="width: 48px; height: 48px; background: var(--color-surface-hover);"></div>
18
+ <div class="ms-3 w-75">
19
+ <div class="placeholder col-7 rounded mb-1" style="height: 16px;"></div>
20
+ <div class="placeholder col-4 rounded" style="height: 12px;"></div>
21
+ </div>
22
+ </div>
23
+ <div class="placeholder col-12 rounded mb-2" style="height: 14px;"></div>
24
+ <div class="placeholder col-10 rounded mb-2" style="height: 14px;"></div>
25
+ <div class="placeholder col-6 rounded" style="height: 14px;"></div>
26
+ </div>
27
+ `;
28
+ }
29
+ return `
30
+ <!-- Skeleton Loader Component (Tailwind CSS) -->
31
+ <div class="p-6 rounded-2xl bg-[var(--color-surface)] border border-[var(--color-border)] shadow-sm animate-pulse space-y-4">
32
+ <div class="flex items-center space-x-4">
33
+ <div class="w-12 h-12 rounded-full bg-[var(--color-surface-hover)]"></div>
34
+ <div class="space-y-2 flex-1">
35
+ <div class="h-4 bg-[var(--color-surface-hover)] rounded w-1/3"></div>
36
+ <div class="h-3 bg-[var(--color-surface-hover)] rounded w-1/4"></div>
37
+ </div>
38
+ </div>
39
+ <div class="space-y-2">
40
+ <div class="h-3 bg-[var(--color-surface-hover)] rounded"></div>
41
+ <div class="h-3 bg-[var(--color-surface-hover)] rounded w-5/6"></div>
42
+ <div class="h-3 bg-[var(--color-surface-hover)] rounded w-2/3"></div>
43
+ </div>
44
+ </div>
45
+ `;
46
+ }
47
+
48
+ function getSpinnerComponent(framework = 'tailwind') {
49
+ if (framework === 'bootstrap') {
50
+ return `
51
+ <!-- Spinner Loader Component (Bootstrap 5) -->
52
+ <div class="d-flex align-items-center justify-content-center p-4">
53
+ <div class="spinner-border text-primary" role="status" style="width: 3rem; height: 3rem; color: var(--color-primary) !important;">
54
+ <span class="visually-hidden">Loading...</span>
55
+ </div>
56
+ </div>
57
+ `;
58
+ }
59
+ return `
60
+ <!-- Spinner Loader Component (Tailwind CSS) -->
61
+ <div class="flex items-center justify-center p-6">
62
+ <div class="relative w-12 h-12">
63
+ <div class="w-12 h-12 rounded-full border-4 border-t-transparent border-[var(--color-primary)] animate-spin"></div>
64
+ <div class="absolute inset-0 rounded-full border-4 border-[var(--color-border)] opacity-20"></div>
65
+ </div>
66
+ </div>
67
+ `;
68
+ }
69
+
70
+ function getModalComponent(framework = 'tailwind') {
71
+ if (framework === 'bootstrap') {
72
+ return `
73
+ <!-- Modal Dialog Component (Bootstrap 5) -->
74
+ <div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
75
+ <div class="modal-dialog modal-dialog-centered">
76
+ <div class="modal-content border-0 shadow-lg" style="background: var(--color-surface); color: var(--color-text); border-radius: 1rem;">
77
+ <div class="modal-header border-bottom-0 pb-0">
78
+ <h5 class="modal-title font-weight-bold" id="exampleModalLabel">Action Dialog</h5>
79
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
80
+ </div>
81
+ <div class="modal-body py-4">
82
+ <p class="text-muted">Accessible modal configured with backdrop blur.</p>
83
+ </div>
84
+ <div class="modal-footer border-top-0 pt-0">
85
+ <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Cancel</button>
86
+ <button type="button" class="btn btn-primary" style="background: var(--color-primary); border-color: var(--color-primary);">Confirm</button>
87
+ </div>
88
+ </div>
89
+ </div>
90
+ </div>
91
+ `;
92
+ }
93
+ return `
94
+ <!-- Modal Dialog Component (Tailwind CSS) -->
95
+ <div id="appModal" class="fixed inset-0 z-50 hidden flex items-center justify-center bg-black/60 backdrop-blur-sm transition-all duration-300">
96
+ <div class="bg-[var(--color-surface)] border border-[var(--color-border)] text-[var(--color-text)] rounded-2xl w-full max-w-lg p-6 shadow-2xl transform scale-95 transition-transform duration-300">
97
+ <div class="flex justify-between items-center pb-4 border-b border-[var(--color-border)]">
98
+ <h3 class="text-lg font-bold">Action Dialog</h3>
99
+ <button onclick="document.getElementById('appModal').classList.add('hidden')" class="text-[var(--color-text-muted)] hover:text-[var(--color-text)]">&times;</button>
100
+ </div>
101
+ <div class="py-4">
102
+ <p class="text-sm text-[var(--color-text-muted)]">This modern modal has blur backdrop, ESC key listener, and seamless theming.</p>
103
+ </div>
104
+ <div class="flex justify-end space-x-3 pt-4 border-t border-[var(--color-border)]">
105
+ <button onclick="document.getElementById('appModal').classList.add('hidden')" class="px-4 py-2 rounded-xl text-sm font-medium border border-[var(--color-border)] hover:bg-[var(--color-surface-hover)]">Cancel</button>
106
+ <button class="px-4 py-2 rounded-xl text-sm font-medium bg-[var(--color-primary)] text-white hover:opacity-90">Confirm</button>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ `;
111
+ }
112
+
113
+ function getOffcanvasComponent(framework = 'tailwind') {
114
+ if (framework === 'bootstrap') {
115
+ return `
116
+ <!-- Offcanvas Drawer (Bootstrap 5) -->
117
+ <div class="offcanvas offcanvas-start" tabindex="-1" id="appOffcanvas" aria-labelledby="appOffcanvasLabel" style="background: var(--color-surface); color: var(--color-text);">
118
+ <div class="offcanvas-header border-bottom" style="border-color: var(--color-border) !important;">
119
+ <h5 class="offcanvas-title" id="appOffcanvasLabel">Navigation Drawer</h5>
120
+ <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
121
+ </div>
122
+ <div class="offcanvas-body">
123
+ <p class="text-muted">Offcanvas sliding menu with dynamic themes and active links.</p>
124
+ </div>
125
+ </div>
126
+ `;
127
+ }
128
+ return `
129
+ <!-- Offcanvas Drawer (Tailwind CSS) -->
130
+ <div id="appDrawerBackdrop" class="fixed inset-0 z-40 bg-black/50 backdrop-blur-xs hidden" onclick="toggleDrawer()"></div>
131
+ <div id="appDrawer" class="fixed top-0 left-0 bottom-0 z-50 w-72 bg-[var(--color-surface)] border-r border-[var(--color-border)] transform -translate-x-full transition-transform duration-300 ease-in-out p-6 shadow-2xl">
132
+ <div class="flex items-center justify-between pb-4 border-b border-[var(--color-border)]">
133
+ <h4 class="font-bold text-base">Navigation Drawer</h4>
134
+ <button onclick="toggleDrawer()" class="text-xl leading-none">&times;</button>
135
+ </div>
136
+ <div class="py-6 space-y-3">
137
+ <a href="#" class="block px-3 py-2 rounded-lg text-sm hover:bg-[var(--color-surface-hover)]">Dashboard</a>
138
+ <a href="#" class="block px-3 py-2 rounded-lg text-sm hover:bg-[var(--color-surface-hover)]">Analytics</a>
139
+ <a href="#" class="block px-3 py-2 rounded-lg text-sm hover:bg-[var(--color-surface-hover)]">Settings</a>
140
+ </div>
141
+ </div>
142
+ `;
143
+ }
144
+
145
+ /**
146
+ * SweetAlert2 (Swal.fire) Integration Component Snippet
147
+ */
148
+ function getSwalFireComponent() {
149
+ return `
150
+ <!-- SweetAlert2 (Swal.fire) Trigger Demo -->
151
+ <div class="p-4 rounded-xl border border-[var(--color-border)] bg-[var(--color-surface)] flex flex-wrap items-center justify-between gap-3">
152
+ <div>
153
+ <div class="font-bold text-sm">🔥 SweetAlert2 (Swal.fire)</div>
154
+ <div class="text-xs text-[var(--color-text-muted)]">Interactive animated confirmation dialogs & modals</div>
155
+ </div>
156
+ <div class="flex gap-2">
157
+ <button type="button" onclick="Swal.fire({ title: 'Success!', text: 'Action completed successfully.', icon: 'success', confirmButtonColor: 'var(--color-primary)' })" class="px-3 py-1.5 rounded-lg text-xs font-bold bg-emerald-500 text-white hover:opacity-90">
158
+ Test Success Alert
159
+ </button>
160
+ <button type="button" onclick="Swal.fire({ title: 'Are you sure?', text: 'You can revert this anytime!', icon: 'warning', showCancelButton: true, confirmButtonColor: '#ef4444', cancelButtonColor: '#64748b', confirmButtonText: 'Yes, delete it!' })" class="px-3 py-1.5 rounded-lg text-xs font-bold bg-rose-500 text-white hover:opacity-90">
161
+ Test Confirm Modal
162
+ </button>
163
+ </div>
164
+ </div>
165
+ `;
166
+ }
167
+
168
+ /**
169
+ * Toastr & Sonner Style Modern Notifications Component Snippet
170
+ */
171
+ function getToastrSonnerComponent() {
172
+ return `
173
+ <!-- Toastr / Sonner Modern Notification Demo -->
174
+ <div class="p-4 rounded-xl border border-[var(--color-border)] bg-[var(--color-surface)] flex flex-wrap items-center justify-between gap-3">
175
+ <div>
176
+ <div class="font-bold text-sm">🔔 Toastr / Sonner Notifications</div>
177
+ <div class="text-xs text-[var(--color-text-muted)]">Smooth non-blocking toast alerts with sound & progress</div>
178
+ </div>
179
+ <div class="flex gap-2">
180
+ <button type="button" onclick="showToast('Operation successful! Event logged.', 'success')" class="px-3 py-1.5 rounded-lg text-xs font-bold bg-sky-500 text-white hover:opacity-90">
181
+ Show Toast
182
+ </button>
183
+ </div>
184
+ </div>
185
+ `;
186
+ }
187
+
188
+ module.exports = {
189
+ getSkeletonComponent,
190
+ getSpinnerComponent,
191
+ getModalComponent,
192
+ getOffcanvasComponent,
193
+ getSwalFireComponent,
194
+ getToastrSonnerComponent
195
+ };