vibespot 1.2.0 → 1.3.1

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 (49) hide show
  1. package/README.md +54 -5
  2. package/assets/blog-rules.md +251 -0
  3. package/assets/email-rules.md +390 -0
  4. package/assets/humanify-guide.md +300 -101
  5. package/assets/plan-templates/blog-content-hub.md +18 -9
  6. package/assets/plan-templates/email-announcement.md +41 -0
  7. package/assets/plan-templates/email-event-invite.md +43 -0
  8. package/assets/plan-templates/email-newsletter.md +41 -0
  9. package/assets/plan-templates/email-re-engagement.md +42 -0
  10. package/assets/plan-templates/email-welcome.md +41 -0
  11. package/dist/index.js +1460 -387
  12. package/dist/index.js.map +1 -1
  13. package/package.json +5 -5
  14. package/starters/06-blog-content-hub.json +75 -0
  15. package/starters/06-email-welcome.json +60 -0
  16. package/starters/07-email-announcement.json +60 -0
  17. package/starters/08-email-newsletter.json +52 -0
  18. package/ui/chat.js +777 -63
  19. package/ui/code-editor.js +49 -7
  20. package/ui/dashboard.js +379 -93
  21. package/ui/docs/docs.css +29 -0
  22. package/ui/docs/index.html +416 -119
  23. package/ui/docs/screenshots/asset-type-cards.png +0 -0
  24. package/ui/docs/screenshots/brand-kit-preview.png +0 -0
  25. package/ui/docs/screenshots/content-type-dropdown.png +0 -0
  26. package/ui/docs/screenshots/deploy-progress.png +0 -0
  27. package/ui/docs/screenshots/editor-full-layout.png +0 -0
  28. package/ui/docs/screenshots/email-client-preview.png +0 -0
  29. package/ui/docs/screenshots/inline-wysiwyg-editing.png +0 -0
  30. package/ui/docs/screenshots/module-overview-slideout.png +0 -0
  31. package/ui/docs/screenshots/multi-page-tree.png +0 -0
  32. package/ui/docs/screenshots/onboarding-walkthrough.png +0 -0
  33. package/ui/docs/screenshots/pipeline-progress.png +0 -0
  34. package/ui/docs/screenshots/project-overview-table.png +0 -0
  35. package/ui/docs/screenshots/split-pane-view.png +0 -0
  36. package/ui/docs/screenshots/visual-controls-toolbar.png +0 -0
  37. package/ui/docs/screenshots/workspace-tabs.png +0 -0
  38. package/ui/email-preview.js +109 -0
  39. package/ui/field-editor.js +72 -1
  40. package/ui/icons.js +120 -0
  41. package/ui/index.html +877 -629
  42. package/ui/inline-edit.js +710 -0
  43. package/ui/plan.js +0 -0
  44. package/ui/preview.js +101 -198
  45. package/ui/section-controls.js +628 -0
  46. package/ui/settings.js +58 -16
  47. package/ui/setup.js +750 -140
  48. package/ui/styles.css +3430 -952
  49. package/ui/upload-panel.js +47 -20
package/ui/code-editor.js CHANGED
@@ -77,7 +77,18 @@ function renderCodeFileList(files) {
77
77
  const itemEl = document.createElement("div");
78
78
  itemEl.className = "code-view__file-item";
79
79
  itemEl.dataset.fileId = f.id;
80
- itemEl.innerHTML = (FILE_ICONS[f.lang] || "") + '<span class="code-view__file-name">' + f.label + "</span>";
80
+ // HubSpot-familiar trust signals: HubL on the templated module HTML,
81
+ // HubSpot fields schema on fields.json. These tell HubSpot devs "this
82
+ // is real CMS output, not generic web code".
83
+ let badge = "";
84
+ if (f.fileType === "html") {
85
+ badge = ' <span class="code-view__file-tag code-view__file-tag--hubl" title="Renders HubL — HubSpot CMS templating language">HubL</span>';
86
+ } else if (f.fileType === "fields") {
87
+ badge = ' <span class="code-view__file-tag code-view__file-tag--fields" title="HubSpot module field schema">HubSpot fields</span>';
88
+ }
89
+ itemEl.innerHTML = (FILE_ICONS[f.lang] || "")
90
+ + '<span class="code-view__file-name">' + f.label + "</span>"
91
+ + badge;
81
92
  itemEl.addEventListener("click", () => openCodeFile(f));
82
93
  groupEl.appendChild(itemEl);
83
94
  }
@@ -348,24 +359,55 @@ async function loadCodeFiles() {
348
359
  }
349
360
  }
350
361
 
362
+ // ---------------------------------------------------------------------------
363
+ // Split view — preview + code side by side via CSS grid
364
+ // ---------------------------------------------------------------------------
365
+
366
+ function enterSplitView() {
367
+ const panelRight = document.getElementById("panel-right");
368
+ const previewEl = document.getElementById("preview-container");
369
+ const codeEl = document.getElementById("code-view");
370
+
371
+ document.querySelector(".right-split").classList.remove("hidden");
372
+ panelRight.classList.add("split-active");
373
+ previewEl.classList.remove("hidden");
374
+ codeEl.classList.remove("hidden");
375
+ loadCodeFiles();
376
+ }
377
+
378
+ function exitSplitView() {
379
+ const panelRight = document.getElementById("panel-right");
380
+ panelRight.classList.remove("split-active");
381
+ }
382
+
351
383
  document.querySelectorAll(".view-toggle__btn").forEach((btn) => {
352
384
  btn.addEventListener("click", () => {
353
385
  const view = btn.dataset.view;
354
- document.querySelectorAll(".view-toggle__btn").forEach((b) => b.classList.remove("active"));
355
- btn.classList.add("active");
386
+ document.querySelectorAll(".view-toggle__btn").forEach((b) => {
387
+ const isActive = b === btn;
388
+ b.classList.toggle("active", isActive);
389
+ // Only the role="tab" buttons (Preview / Split / Code) carry
390
+ // aria-selected — the plan sidebar toggle uses aria-pressed instead.
391
+ if (b.getAttribute("role") === "tab") {
392
+ b.setAttribute("aria-selected", isActive ? "true" : "false");
393
+ }
394
+ });
356
395
 
357
396
  const previewEl = document.getElementById("preview-container");
358
397
  const codeEl = document.getElementById("code-view");
359
- const chromeBar = document.getElementById("browser-chrome");
360
398
 
361
- if (view === "code") {
362
- previewEl.classList.add("hidden");
399
+ exitSplitView();
400
+
401
+ if (view === "split") {
402
+ enterSplitView();
403
+ } else if (view === "code") {
404
+ document.querySelector(".right-split").classList.add("hidden");
363
405
  codeEl.classList.remove("hidden");
364
406
  loadCodeFiles();
365
407
  } else {
408
+ document.querySelector(".right-split").classList.remove("hidden");
366
409
  codeEl.classList.add("hidden");
367
410
  previewEl.classList.remove("hidden");
368
- // Refresh preview if code was saved while in code view
369
411
  if (codeSavedSinceSwitch && typeof refreshPreview === "function") {
370
412
  refreshPreview();
371
413
  }