nodality 1.0.162 → 1.0.164

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 (102) hide show
  1. package/bin/nodality.js +99 -0
  2. package/dist/bundle.umd.js +1 -1
  3. package/dist/designer.cjs.js +1 -1
  4. package/dist/designer.esm.js +1 -1
  5. package/dist/finalresult.esm.js +1 -1
  6. package/dist/index.cjs.js +1 -1
  7. package/dist/index.esm.js +1 -1
  8. package/layout/animator.js +1 -1
  9. package/layout/audio.js +1 -1
  10. package/layout/audionew.js +1 -1
  11. package/layout/base-2.js +1 -1
  12. package/layout/base.js +1 -1
  13. package/layout/beta-desktop-bar.js +1 -1
  14. package/layout/beta-mobile-bar.js +1 -1
  15. package/layout/box.js +1 -1
  16. package/layout/button.js +1 -1
  17. package/layout/cards.js +1 -1
  18. package/layout/center.js +1 -1
  19. package/layout/checkbox.js +1 -1
  20. package/layout/circle.js +1 -1
  21. package/layout/clean-row.js +1 -1
  22. package/layout/code.js +1 -1
  23. package/layout/container.js +1 -1
  24. package/layout/custom.js +1 -1
  25. package/layout/div-image.js +1 -1
  26. package/layout/dropdown-2025.js +1 -1
  27. package/layout/dropdown.js +1 -1
  28. package/layout/empty-element.js +1 -1
  29. package/layout/external-stylesheet.js +1 -1
  30. package/layout/flex-card.js +1 -1
  31. package/layout/flex-grid.js +1 -1
  32. package/layout/flex-row.js +1 -1
  33. package/layout/footer.js +1 -1
  34. package/layout/form-components/custom.js +1 -1
  35. package/layout/form-components/data-list.js +1 -1
  36. package/layout/form-components/floating-input.js +1 -1
  37. package/layout/form-components/form-all.js +1 -1
  38. package/layout/form-components/form.js +1 -1
  39. package/layout/form-components/image-picker.js +1 -1
  40. package/layout/form-components/picker.js +1 -1
  41. package/layout/form-components/radio.js +1 -1
  42. package/layout/form-components/radiogroup.js +1 -1
  43. package/layout/form-components/range.js +1 -1
  44. package/layout/free.js +1 -1
  45. package/layout/grid-new.js +1 -1
  46. package/layout/grid-switcher.js +1 -1
  47. package/layout/grid.js +1 -1
  48. package/layout/group.js +1 -1
  49. package/layout/header.js +1 -1
  50. package/layout/horizontal-scroller.js +1 -1
  51. package/layout/image-old.js +1 -1
  52. package/layout/image.js +1 -1
  53. package/layout/index.js +1 -1
  54. package/layout/label.js +1 -1
  55. package/layout/link.js +1 -1
  56. package/layout/list-OLD.js +1 -1
  57. package/layout/list.js +1 -1
  58. package/layout/meta-adder.js +1 -1
  59. package/layout/modal-2025.js +1 -1
  60. package/layout/modernwrap.js +1 -1
  61. package/layout/multiswitcher.js +1 -1
  62. package/layout/multiswitcherBeta.js +1 -1
  63. package/layout/nav-bar.js +1 -1
  64. package/layout/nav-factor/custom-div.js +1 -1
  65. package/layout/navBar-OLD.js +1 -1
  66. package/layout/new-flat-adder.js +1 -1
  67. package/layout/new-nav-bar.js +1 -1
  68. package/layout/offset-container.js +1 -1
  69. package/layout/polygon.js +1 -1
  70. package/layout/prerender-site.js +1 -1
  71. package/layout/prerender.js +1 -1
  72. package/layout/progress.js +1 -1
  73. package/layout/row.js +1 -1
  74. package/layout/saved-new-nav-bar.js +1 -1
  75. package/layout/scroll-video.js +1 -1
  76. package/layout/side-bar.js +1 -1
  77. package/layout/side-nav-bar.js +1 -1
  78. package/layout/simple-bar.js +1 -1
  79. package/layout/slider-2025.js +1 -1
  80. package/layout/spacer.js +1 -1
  81. package/layout/stack.js +1 -1
  82. package/layout/styler.js +1 -1
  83. package/layout/svg.js +1 -1
  84. package/layout/switcher.js +1 -1
  85. package/layout/table.js +1 -1
  86. package/layout/text-field.js +1 -1
  87. package/layout/text.js +1 -1
  88. package/layout/ulist.js +1 -1
  89. package/layout/video.js +1 -1
  90. package/layout/without-new.js +1 -1
  91. package/layout/wrap.js +1 -1
  92. package/layout/zoom-card.js +1 -1
  93. package/lib/card-getter.js +1 -1
  94. package/lib/designer.js +10 -1
  95. package/lib/element-mapper.js +1 -1
  96. package/lib/keyframe-animation.js +1 -1
  97. package/lib/link-getter.js +1 -1
  98. package/lib/scroll-video.js +1 -1
  99. package/lib/stacker.js +1 -1
  100. package/lib/theme.js +1 -1
  101. package/lib/transform-anim.js +1 -1
  102. package/package.json +1 -1
package/bin/nodality.js CHANGED
@@ -155,6 +155,95 @@ function loadConfigFile(cwd) {
155
155
  }
156
156
  }
157
157
 
158
+ // ─── SSG bootstrap ──────────────────────────────────────────────
159
+
160
+ /**
161
+ * On first run, derive the upload/ structure from the project's root
162
+ * files so a freshly scaffolded project can prerender without manual
163
+ * setup. For each `src/<name>.js` we generate `upload/pages/<name>.js`
164
+ * (verbatim copy) and an `upload/<name>.html` whose importmap points
165
+ * at `./lib.bundle.js` and whose `<script src>` points at the page
166
+ * entry. The first src file (alphabetically) is also written as
167
+ * `upload/index.html` when no explicit index entry exists, so the
168
+ * dev server has a default landing page.
169
+ *
170
+ * If the user has already populated upload/ themselves, we touch
171
+ * nothing. Bootstrap only runs when upload/ is missing OR contains
172
+ * no .html files.
173
+ */
174
+ function bootstrapUpload(cwd, uploadDir) {
175
+ const srcDir = path.join(cwd, "src");
176
+ if (!fs.existsSync(srcDir)) return false;
177
+
178
+ const srcFiles = fs.readdirSync(srcDir).filter((f) => f.endsWith(".js"));
179
+ if (srcFiles.length === 0) return false;
180
+
181
+ fs.mkdirSync(uploadDir, { recursive: true });
182
+ const pagesDir = path.join(uploadDir, "pages");
183
+ fs.mkdirSync(pagesDir, { recursive: true });
184
+
185
+ const projectName = path.basename(cwd);
186
+ let wrote = 0;
187
+ for (const srcFile of srcFiles) {
188
+ const base = path.basename(srcFile, ".js");
189
+ // Convention: src/app.js → upload/index.html + upload/pages/index.js.
190
+ // All others: src/<name>.js → upload/<name>.html + upload/pages/<name>.js.
191
+ const pageName = base === "app" ? "index" : base;
192
+
193
+ const entryPath = path.join(pagesDir, `${pageName}.js`);
194
+ if (!fs.existsSync(entryPath)) {
195
+ // `code: true` toggles Nodality's on-page <pre>/<code> dev panel,
196
+ // which is useful while writing src/ but should be off in the
197
+ // SSG output. Rewrite when cloning into upload/pages/.
198
+ const srcContent = fs.readFileSync(path.join(srcDir, srcFile), "utf8");
199
+ const ssgContent = srcContent.replace(/code:\s*true/g, "code: false");
200
+ fs.writeFileSync(entryPath, ssgContent);
201
+ wrote++;
202
+ }
203
+
204
+ const htmlPath = path.join(uploadDir, `${pageName}.html`);
205
+ if (!fs.existsSync(htmlPath)) {
206
+ fs.writeFileSync(htmlPath, renderUploadHtml(projectName, pageName));
207
+ wrote++;
208
+ }
209
+ }
210
+
211
+ if (wrote > 0) {
212
+ console.log(`[nodality] Bootstrapped upload/ from src/ (${wrote} file(s) written)`);
213
+ }
214
+
215
+ if (!fs.existsSync(path.join(uploadDir, "lib.bundle.js"))) {
216
+ console.warn(
217
+ `[nodality] ⚠ upload/lib.bundle.js missing — run \`npm run build\` first ` +
218
+ `so the prerendered HTML can load the library bundle at runtime.`,
219
+ );
220
+ }
221
+ return true;
222
+ }
223
+
224
+ function renderUploadHtml(projectName, pageName) {
225
+ return `<!DOCTYPE html>
226
+ <html lang="en">
227
+ <head>
228
+ <meta charset="UTF-8">
229
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
230
+ <title>${projectName}</title>
231
+ <script type="importmap">
232
+ {
233
+ "imports": {
234
+ "nodality": "./lib.bundle.js"
235
+ }
236
+ }
237
+ </script>
238
+ </head>
239
+ <body>
240
+ <div id="mount"></div>
241
+ <script type="module" src="./pages/${pageName}.js"></script>
242
+ </body>
243
+ </html>
244
+ `;
245
+ }
246
+
158
247
  // ─── Page auto-discovery ────────────────────────────────────────
159
248
 
160
249
  /**
@@ -251,6 +340,16 @@ async function runPrerender(rawArgs) {
251
340
  );
252
341
  }
253
342
 
343
+ // First-run bootstrap: if upload/ is missing or has no HTML pages
344
+ // yet, derive it from the project's src/ + root index.html. This is
345
+ // what create-nodality projects rely on so the scaffolder doesn't
346
+ // have to ship duplicate copies of source files. No-op if upload/
347
+ // is already populated.
348
+ const needsBootstrap =
349
+ !fs.existsSync(uploadDir) ||
350
+ fs.readdirSync(uploadDir).filter((f) => f.endsWith(".html")).length === 0;
351
+ if (needsBootstrap) bootstrapUpload(cwd, uploadDir);
352
+
254
353
  // Explicit `pages` from config wins over auto-discovery. The
255
354
  // discovery rules (pages/<base>.js, <base>.js) can't infer
256
355
  // irregular pairs like h7-nodality's `index.html → app.js`; for