@poveste/app 0.13.1 → 0.15.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 (132) hide show
  1. package/dist/bundled/App.vue_vue_type_script_setup_true_lang.js +1 -1
  2. package/dist/bundled/app.css +31 -31
  3. package/dist/bundled/components/HomeView.vue_vue_type_script_setup_true_lang.js +1 -1
  4. package/dist/bundled/components/app/AppLogo.vue_vue_type_script_setup_true_lang.js +2 -2
  5. package/dist/bundled/components/app/Breadcrumb.js +1 -1
  6. package/dist/bundled/components/app/Breadcrumb.vue_vue_type_script_setup_true_lang.js +2 -2
  7. package/dist/bundled/components/app/TopBar.vue_vue_type_script_setup_true_lang.js +4 -3
  8. package/dist/bundled/components/app/TopBarChipItem.js +1 -1
  9. package/dist/bundled/components/base/BaseCheckbox.vue_vue_type_script_setup_true_lang.js +1 -1
  10. package/dist/bundled/components/base/BaseEmpty.js +2 -2
  11. package/dist/bundled/components/base/BaseOverflowMenu.vue_vue_type_script_setup_true_lang.js +18 -15
  12. package/dist/bundled/components/base/BaseSelect.vue_vue_type_script_setup_true_lang.js +158 -26
  13. package/dist/bundled/components/base/BaseSplitPane.js +1 -1
  14. package/dist/bundled/components/base/BaseSplitPane.vue_vue_type_script_setup_true_lang.js +6 -4
  15. package/dist/bundled/components/command/CommandPrompts.vue_vue_type_script_setup_true_lang.js +1 -1
  16. package/dist/bundled/components/command/CommandPromptsModal.vue_vue_type_script_setup_true_lang.js +4 -3
  17. package/dist/bundled/components/command/PromptSelect.vue_vue_type_script_setup_true_lang.js +2 -2
  18. package/dist/bundled/components/command/PromptText.vue_vue_type_script_setup_true_lang.js +1 -1
  19. package/dist/bundled/components/panel/ControlsComponentPropItem.vue_vue_type_script_setup_true_lang.js +20 -14
  20. package/dist/bundled/components/panel/PaneTabs.vue_vue_type_script_setup_true_lang.js +6 -6
  21. package/dist/bundled/components/panel/StatePresets.vue_vue_type_script_setup_true_lang.js +94 -55
  22. package/dist/bundled/components/panel/StoryControls.vue_vue_type_script_setup_true_lang.js +1 -1
  23. package/dist/bundled/components/panel/StoryDocs.vue_vue_type_script_setup_true_lang.js +3 -1
  24. package/dist/bundled/components/panel/StoryEvent.vue_vue_type_script_setup_true_lang.js +5 -1
  25. package/dist/bundled/components/panel/StoryEvents.vue_vue_type_script_setup_true_lang.js +2 -1
  26. package/dist/bundled/components/panel/StorySidePanel.vue_vue_type_script_setup_true_lang.js +8 -6
  27. package/dist/bundled/components/panel/StorySourceCode.js +1 -1
  28. package/dist/bundled/components/panel/StorySourceCode.vue_vue_type_script_setup_true_lang.js +8 -6
  29. package/dist/bundled/components/search/SearchItemContent.vue_vue_type_script_setup_true_lang.js +2 -1
  30. package/dist/bundled/components/search/SearchPane.vue_vue_type_script_setup_true_lang.js +16 -9
  31. package/dist/bundled/components/story/GenericMountStory.vue_vue_type_script_setup_true_lang.js +2 -1
  32. package/dist/bundled/components/story/GenericRenderStory.vue_vue_type_script_setup_true_lang.js +2 -1
  33. package/dist/bundled/components/story/StoryResponsivePreview.js +1 -1
  34. package/dist/bundled/components/story/StoryResponsivePreview.vue_vue_type_script_setup_true_lang.js +23 -8
  35. package/dist/bundled/components/story/StoryVariantGrid.js +1 -1
  36. package/dist/bundled/components/story/StoryVariantGrid.vue_vue_type_script_setup_true_lang.js +15 -10
  37. package/dist/bundled/components/story/StoryVariantGridItem.js +1 -1
  38. package/dist/bundled/components/story/StoryVariantGridItem.vue_vue_type_script_setup_true_lang.js +3 -3
  39. package/dist/bundled/components/story/StoryVariantSinglePreviewRemote.vue_vue_type_script_setup_true_lang.js +9 -6
  40. package/dist/bundled/components/story/StoryView.vue_vue_type_script_setup_true_lang.js +7 -3
  41. package/dist/bundled/components/story/StoryViewer.js +1 -1
  42. package/dist/bundled/components/story/StoryViewer.vue_vue_type_script_setup_true_lang.js +3 -3
  43. package/dist/bundled/components/toolbar/ToolbarBackground.vue_vue_type_script_setup_true_lang.js +1 -1
  44. package/dist/bundled/components/toolbar/ToolbarResponsiveSize.vue_vue_type_script_setup_true_lang.js +17 -16
  45. package/dist/bundled/components/toolbar/ToolbarTitle.js +1 -1
  46. package/dist/bundled/components/toolbar/ToolbarTitle.vue_vue_type_script_setup_true_lang.js +1 -1
  47. package/dist/bundled/components/tree/StoryGroup.vue_vue_type_script_setup_true_lang.js +2 -2
  48. package/dist/bundled/components/tree/StoryList.vue_vue_type_script_setup_true_lang.js +3 -3
  49. package/dist/bundled/components/tree/StoryListFolder.js +1 -1
  50. package/dist/bundled/components/tree/StoryListFolder.vue_vue_type_script_setup_true_lang.js +3 -3
  51. package/dist/bundled/components/tree/StoryListItem.js +1 -1
  52. package/dist/bundled/components/tree/StoryListItem.vue_vue_type_script_setup_true_lang.js +3 -3
  53. package/dist/bundled/plugin.js +4 -3
  54. package/dist/bundled/sandbox.js +5 -4
  55. package/dist/bundled/stores/folder.js +1 -1
  56. package/dist/bundled/stores/story.js +2 -2
  57. package/dist/bundled/util/commands.js +21 -10
  58. package/dist/bundled/util/dark.js +1 -1
  59. package/dist/bundled/util/docs.js +2 -1
  60. package/dist/bundled/util/events.js +1 -1
  61. package/dist/bundled/util/grid-slots.js +2 -2
  62. package/dist/bundled/util/icons.generated.js +0 -1
  63. package/dist/bundled/util/keyboard.js +9 -14
  64. package/dist/bundled/util/mapping.js +3 -3
  65. package/dist/bundled/util/preview-settings.js +1 -1
  66. package/dist/bundled/util/render-tracker.js +33 -0
  67. package/dist/bundled/util/variant.js +12 -2
  68. package/dist/style.css +23 -1
  69. package/package.json +14 -18
  70. package/src/__tests__/render-tracker.spec.ts +38 -0
  71. package/src/app/App.vue +7 -4
  72. package/src/app/components/HomeView.vue +1 -1
  73. package/src/app/components/app/AppLogo.vue +6 -2
  74. package/src/app/components/app/Breadcrumb.vue +2 -1
  75. package/src/app/components/app/TopBar.vue +7 -2
  76. package/src/app/components/app/TopBarChipItem.vue +1 -1
  77. package/src/app/components/base/BaseCheckbox.vue +1 -1
  78. package/src/app/components/base/BaseEmpty.vue +1 -1
  79. package/src/app/components/base/BaseListItemLink.vue +4 -2
  80. package/src/app/components/base/BaseOverflowMenu.vue +25 -18
  81. package/src/app/components/base/BaseSelect.vue +171 -15
  82. package/src/app/components/base/BaseSplitPane.vue +11 -6
  83. package/src/app/components/command/CommandPrompts.vue +1 -1
  84. package/src/app/components/command/CommandPromptsModal.vue +1 -0
  85. package/src/app/components/command/PromptSelect.vue +3 -2
  86. package/src/app/components/command/PromptText.vue +7 -3
  87. package/src/app/components/panel/ControlsComponentPropItem.vue +26 -15
  88. package/src/app/components/panel/PaneTabs.vue +6 -6
  89. package/src/app/components/panel/StatePresets.vue +125 -68
  90. package/src/app/components/panel/StoryControls.vue +1 -1
  91. package/src/app/components/panel/StoryDocs.vue +3 -1
  92. package/src/app/components/panel/StoryEvent.vue +7 -2
  93. package/src/app/components/panel/StoryEvents.vue +4 -1
  94. package/src/app/components/panel/StorySidePanel.vue +3 -1
  95. package/src/app/components/panel/StorySourceCode.vue +12 -8
  96. package/src/app/components/search/SearchItemContent.vue +2 -1
  97. package/src/app/components/search/SearchPane.vue +16 -8
  98. package/src/app/components/story/GenericMountStory.vue +2 -1
  99. package/src/app/components/story/GenericRenderStory.vue +2 -1
  100. package/src/app/components/story/StoryResponsivePreview.vue +36 -7
  101. package/src/app/components/story/StoryVariantGrid.vue +33 -16
  102. package/src/app/components/story/StoryVariantGridItem.vue +1 -1
  103. package/src/app/components/story/StoryVariantSinglePreviewRemote.vue +14 -8
  104. package/src/app/components/story/StoryView.vue +10 -4
  105. package/src/app/components/story/StoryViewer.vue +3 -3
  106. package/src/app/components/toolbar/ToolbarBackground.vue +1 -1
  107. package/src/app/components/toolbar/ToolbarResponsiveSize.vue +23 -3
  108. package/src/app/components/toolbar/ToolbarTitle.vue +2 -2
  109. package/src/app/components/tree/StoryGroup.vue +2 -2
  110. package/src/app/components/tree/StoryList.vue +2 -2
  111. package/src/app/components/tree/StoryListFolder.vue +2 -2
  112. package/src/app/components/tree/StoryListItem.vue +1 -1
  113. package/src/app/plugin.ts +7 -3
  114. package/src/app/sandbox.ts +9 -3
  115. package/src/app/stores/folder.ts +1 -1
  116. package/src/app/stores/story.ts +2 -2
  117. package/src/app/types.ts +6 -6
  118. package/src/app/util/commands.ts +27 -17
  119. package/src/app/util/dark.ts +1 -1
  120. package/src/app/util/docs.ts +2 -1
  121. package/src/app/util/env.ts +0 -1
  122. package/src/app/util/events.ts +6 -5
  123. package/src/app/util/grid-slots.ts +2 -2
  124. package/src/app/util/icons.generated.ts +1 -1
  125. package/src/app/util/keyboard.ts +10 -11
  126. package/src/app/util/mapping.ts +3 -3
  127. package/src/app/util/preview-settings.ts +1 -1
  128. package/src/app/util/render-tracker.ts +31 -0
  129. package/src/app/util/scroll.ts +5 -1
  130. package/src/app/util/state.ts +4 -4
  131. package/src/app/util/variant.ts +16 -3
  132. package/src/app/components/base/BaseCopyIcon.vue +0 -34
@@ -23,7 +23,7 @@ var StoryResponsivePreview_vue_vue_type_script_setup_true_lang_default = /*@__PU
23
23
  }
24
24
  },
25
25
  setup(__props) {
26
- useCssVars((_ctx) => ({ "v0cb511a0": unref(settings).backgroundColor }));
26
+ useCssVars((_ctx) => ({ "v538c65b8": unref(settings).backgroundColor }));
27
27
  const props = __props;
28
28
  const settings = usePreviewSettingsStore().currentSettings;
29
29
  const resizing = ref(false);
@@ -42,18 +42,29 @@ var StoryResponsivePreview_vue_vue_type_script_setup_true_lang_default = /*@__PU
42
42
  }
43
43
  const previewWrapper = ref();
44
44
  function useDragger(el, value, min, max, axis) {
45
+ function wrapperSize() {
46
+ const wrapper = previewWrapper.value;
47
+ if (!wrapper) return null;
48
+ return axis === "x" ? wrapper.clientWidth : wrapper.clientHeight;
49
+ }
50
+ function startFrom() {
51
+ if (value.value !== null) return value.value;
52
+ const size = wrapperSize();
53
+ if (size === null) return min;
54
+ return size - (axis === "x" ? 67 : 70);
55
+ }
45
56
  function onMouseDown(event) {
46
57
  event.preventDefault();
47
58
  event.stopPropagation();
48
59
  const start = axis === "x" ? event.clientX : event.clientY;
49
- const startValue = value.value ?? (axis === "x" ? previewWrapper.value.clientWidth - 67 : previewWrapper.value.clientHeight - 70);
60
+ const startValue = startFrom();
50
61
  resizing.value = true;
51
62
  const removeListeners = [addWindowListener("mousemove", onMouseMove), addWindowListener("mouseup", onMouseUp)];
52
63
  function onMouseMove(event) {
53
- const snapTarget = axis === "x" ? previewWrapper.value.clientWidth : previewWrapper.value.clientHeight;
64
+ const snapTarget = wrapperSize();
54
65
  const delta = (axis === "x" ? event.clientX : event.clientY) - start;
55
66
  value.value = Math.max(min, Math.min(max, startValue + delta));
56
- if (Math.abs(value.value - (snapTarget - 67)) < 16) value.value = null;
67
+ if (snapTarget !== null && Math.abs(value.value - (snapTarget - 67)) < 16) value.value = null;
57
68
  }
58
69
  function onMouseUp() {
59
70
  removeListeners.forEach((fn) => fn());
@@ -64,8 +75,10 @@ var StoryResponsivePreview_vue_vue_type_script_setup_true_lang_default = /*@__PU
64
75
  function onTouchStart(event) {
65
76
  event.preventDefault();
66
77
  event.stopPropagation();
67
- const start = axis === "x" ? event.touches[0].clientX : event.touches[0].clientY;
68
- const startValue = value.value;
78
+ const [touch] = event.touches;
79
+ if (!touch) return;
80
+ const start = axis === "x" ? touch.clientX : touch.clientY;
81
+ const startValue = startFrom();
69
82
  resizing.value = true;
70
83
  const removeListeners = [
71
84
  addWindowListener("touchmove", onTouchMove),
@@ -73,7 +86,9 @@ var StoryResponsivePreview_vue_vue_type_script_setup_true_lang_default = /*@__PU
73
86
  addWindowListener("touchcancel", onTouchEnd)
74
87
  ];
75
88
  function onTouchMove(event) {
76
- const delta = (axis === "x" ? event.touches[0].clientX : event.touches[0].clientY) - start;
89
+ const [touch] = event.touches;
90
+ if (!touch) return;
91
+ const delta = (axis === "x" ? touch.clientX : touch.clientY) - start;
77
92
  value.value = Math.max(min, Math.min(max, startValue + delta));
78
93
  }
79
94
  function onTouchEnd() {
@@ -130,7 +145,7 @@ var StoryResponsivePreview_vue_vue_type_script_setup_true_lang_default = /*@__PU
130
145
  finalWidth: finalWidth.value,
131
146
  finalHeight: finalHeight.value,
132
147
  resizing: resizing.value
133
- }, void 0, true)]), isResponsiveEnabled.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [_cache[1] || (_cache[1] = createStaticVNode("<div class=\"absolute top-5 left-8 h-2 w-px bg-gray-400/25\" data-v-380b627d></div><div class=\"absolute top-5 right-8 h-2 w-px bg-gray-400/25\" data-v-380b627d></div><div class=\"absolute bottom-5 left-8 h-2 w-px bg-gray-400/25\" data-v-380b627d></div><div class=\"absolute bottom-5 right-8 h-2 w-px bg-gray-400/25\" data-v-380b627d></div><div class=\"absolute left-5 top-8 w-2 h-px bg-gray-400/25\" data-v-380b627d></div><div class=\"absolute left-5 bottom-8 w-2 h-px bg-gray-400/25\" data-v-380b627d></div><div class=\"absolute right-5 top-8 w-2 h-px bg-gray-400/25\" data-v-380b627d></div><div class=\"absolute right-5 bottom-8 w-2 h-px bg-gray-400/25\" data-v-380b627d></div>", 8))], 64)) : createCommentVNode("", true)], 2)], 10, _hoisted_3), isResponsiveEnabled.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
148
+ }, void 0, true)]), isResponsiveEnabled.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [_cache[1] || (_cache[1] = createStaticVNode("<div class=\"absolute top-5 left-8 h-2 w-px bg-gray-400/25\" data-v-13932615></div><div class=\"absolute top-5 right-8 h-2 w-px bg-gray-400/25\" data-v-13932615></div><div class=\"absolute bottom-5 left-8 h-2 w-px bg-gray-400/25\" data-v-13932615></div><div class=\"absolute bottom-5 right-8 h-2 w-px bg-gray-400/25\" data-v-13932615></div><div class=\"absolute left-5 top-8 w-2 h-px bg-gray-400/25\" data-v-13932615></div><div class=\"absolute left-5 bottom-8 w-2 h-px bg-gray-400/25\" data-v-13932615></div><div class=\"absolute right-5 top-8 w-2 h-px bg-gray-400/25\" data-v-13932615></div><div class=\"absolute right-5 bottom-8 w-2 h-px bg-gray-400/25\" data-v-13932615></div>", 8))], 64)) : createCommentVNode("", true)], 2)], 10, _hoisted_3), isResponsiveEnabled.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
134
149
  withDirectives((openBlock(), createElementBlock("div", {
135
150
  ref_key: "horizontalDragger",
136
151
  ref: horizontalDragger,
@@ -2,6 +2,6 @@ import _plugin_vue_export_helper_default from "../../_virtual/_plugin-vue_export
2
2
  import StoryVariantGrid_vue_vue_type_script_setup_true_lang_default from "./StoryVariantGrid.vue_vue_type_script_setup_true_lang.js";
3
3
  /* empty css */
4
4
  //#region src/app/components/story/StoryVariantGrid.vue
5
- var StoryVariantGrid_default = /*#__PURE__*/ _plugin_vue_export_helper_default(StoryVariantGrid_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-5f7bc1e1"]]);
5
+ var StoryVariantGrid_default = /*#__PURE__*/ _plugin_vue_export_helper_default(StoryVariantGrid_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-a753c25f"]]);
6
6
  //#endregion
7
7
  export { StoryVariantGrid_default as default };
@@ -2,7 +2,7 @@ import { useStoryStore } from "../../stores/story.js";
2
2
  import { assignSlots, trimSlots } from "../../util/grid-slots.js";
3
3
  import StoryVariantGridItem_default from "./StoryVariantGridItem.js";
4
4
  import { useDebounceFn, useResizeObserver } from "@poveste/vendors/vue-use";
5
- import { Fragment, computed, createBlock, createElementBlock, createElementVNode, defineComponent, normalizeStyle, onBeforeUnmount, onMounted, openBlock, ref, renderList, unref, watch } from "@poveste/vendors/vue";
5
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, normalizeStyle, onBeforeUnmount, onMounted, openBlock, ref, renderList, unref, watch } from "@poveste/vendors/vue";
6
6
  //#region src/app/components/story/StoryVariantGrid.vue?vue&type=script&setup=true&lang.ts
7
7
  var _hoisted_1 = { class: "poveste-story-variant-grid flex flex-col items-stretch h-full __poveste-pane-shadow-from-right" };
8
8
  var _hoisted_2 = { class: "flex w-0 flex-1 mx-4" };
@@ -17,17 +17,18 @@ var StoryVariantGrid_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
17
17
  setup(__props) {
18
18
  const storyStore = useStoryStore();
19
19
  const gridTemplateWidth = computed(() => {
20
- if (storyStore.currentStory.layout.type !== "grid") return;
21
- const layoutWidth = storyStore.currentStory.layout.width;
20
+ const layout = storyStore.currentStory?.layout;
21
+ if (layout?.type !== "grid") return;
22
+ const layoutWidth = layout.width;
22
23
  if (!layoutWidth) return "200px";
23
24
  if (typeof layoutWidth === "number") return `${layoutWidth}px`;
24
25
  return layoutWidth;
25
26
  });
26
27
  const maxItemHeight = ref(0);
27
- const el = ref(null);
28
+ const el = ref();
28
29
  const scrollTop = ref(0);
29
30
  const viewportHeight = ref(0);
30
- const variants = computed(() => storyStore.currentStory.variants);
31
+ const variants = computed(() => storyStore.currentStory?.variants ?? []);
31
32
  useResizeObserver(el, () => {
32
33
  updateWindow();
33
34
  updateSize();
@@ -60,14 +61,16 @@ var StoryVariantGrid_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
60
61
  updateWindow();
61
62
  }
62
63
  }
63
- const gridEl = ref(null);
64
+ const gridEl = ref();
64
65
  const gridColumnWidth = ref(1);
65
66
  const viewWidth = ref(1);
66
67
  function updateSize() {
67
68
  if (!el.value) return;
68
69
  viewWidth.value = el.value.clientWidth;
69
70
  if (!gridEl.value) return;
70
- if (gridTemplateWidth.value.endsWith("%")) gridColumnWidth.value = viewWidth.value * Number.parseInt(gridTemplateWidth.value) / 100 - gap;
71
+ const templateWidth = gridTemplateWidth.value;
72
+ if (!templateWidth) return;
73
+ if (templateWidth.endsWith("%")) gridColumnWidth.value = viewWidth.value * Number.parseInt(templateWidth) / 100 - gap;
71
74
  else gridColumnWidth.value = Number.parseInt(gridTemplateWidth.value);
72
75
  }
73
76
  onMounted(() => {
@@ -105,7 +108,9 @@ var StoryVariantGrid_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
105
108
  }, TRIM_DELAY);
106
109
  }
107
110
  watch(visibleVariants, (visible) => {
108
- slots.value = assignSlots(slots.value, storyStore.currentStory.id, visible);
111
+ const story = storyStore.currentStory;
112
+ if (!story) return;
113
+ slots.value = assignSlots(slots.value, story.id, visible);
109
114
  scheduleTrim();
110
115
  }, { immediate: true });
111
116
  onBeforeUnmount(() => {
@@ -143,7 +148,7 @@ var StoryVariantGrid_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
143
148
  gridTemplateColumns: `repeat(${columnCount.value}, ${gridColumnWidth.value}px)`,
144
149
  transform: offsetY.value ? `translateY(${offsetY.value}px)` : void 0
145
150
  })
146
- }, [(openBlock(true), createElementBlock(Fragment, null, renderList(slots.value, (slot, index) => {
151
+ }, [unref(storyStore).currentStory ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(slots.value, (slot, index) => {
147
152
  return openBlock(), createBlock(StoryVariantGridItem_default, {
148
153
  key: index,
149
154
  variant: slot.variant,
@@ -158,7 +163,7 @@ var StoryVariantGrid_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
158
163
  "story",
159
164
  "style"
160
165
  ]);
161
- }), 128))], 4)], 4)])], 544)]);
166
+ }), 128)) : createCommentVNode("", true)], 4)], 4)])], 544)]);
162
167
  };
163
168
  }
164
169
  });
@@ -2,6 +2,6 @@ import _plugin_vue_export_helper_default from "../../_virtual/_plugin-vue_export
2
2
  import StoryVariantGridItem_vue_vue_type_script_setup_true_lang_default from "./StoryVariantGridItem.vue_vue_type_script_setup_true_lang.js";
3
3
  /* empty css */
4
4
  //#region src/app/components/story/StoryVariantGridItem.vue
5
- var StoryVariantGridItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(StoryVariantGridItem_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-a394f172"]]);
5
+ var StoryVariantGridItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(StoryVariantGridItem_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-ae85762b"]]);
6
6
  //#endregion
7
7
  export { StoryVariantGridItem_default as default };
@@ -18,7 +18,7 @@ import { HstCopyIcon } from "@poveste/controls";
18
18
  //#region src/app/components/story/StoryVariantGridItem.vue?vue&type=script&setup=true&lang.ts
19
19
  var _hoisted_1 = { class: "flex-none flex items-center" };
20
20
  var _hoisted_2 = { class: "truncate flex-1" };
21
- var _hoisted_3 = { class: "flex-none ml-auto hidden group-hover:flex items-center" };
21
+ var _hoisted_3 = { class: "flex-none ml-auto hidden group-hover:flex group-focus-within:flex items-center" };
22
22
  var StoryVariantGridItem_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
23
23
  __name: "StoryVariantGridItem",
24
24
  props: {
@@ -34,8 +34,8 @@ var StoryVariantGridItem_vue_vue_type_script_setup_true_lang_default = /*@__PURE
34
34
  emits: { resize: (_width, _height) => true },
35
35
  setup(__props, { emit: __emit }) {
36
36
  useCssVars((_ctx) => ({
37
- "v68878cb8": unref(variant).iconColor,
38
- "v5a063a9a": unref(settings).backgroundColor
37
+ "v2b77a04a": unref(variant).iconColor,
38
+ "v8dc7fba0": unref(settings).backgroundColor
39
39
  }));
40
40
  const props = __props;
41
41
  const emit = __emit;
@@ -8,6 +8,7 @@ import { createStateBridge } from "../../util/state-bridge.js";
8
8
  import { toRawDeep } from "../../util/state.js";
9
9
  import { useEventsStore } from "../../stores/events.js";
10
10
  import { firstReportedHeight } from "../../util/grid-cell-height.js";
11
+ import { createRenderTracker } from "../../util/render-tracker.js";
11
12
  import StoryResponsivePreview_default from "./StoryResponsivePreview.js";
12
13
  import { useEventListener } from "@poveste/vendors/vue-use";
13
14
  import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, onBeforeUnmount, openBlock, ref, toDisplayString, toRaw, unref, watch, withCtx } from "@poveste/vendors/vue";
@@ -49,9 +50,7 @@ var StoryVariantSinglePreviewRemote_vue_vue_type_script_setup_true_lang_default
49
50
  const settings = usePreviewSettingsStore().currentSettings;
50
51
  const errorStore = useStoryErrorStore();
51
52
  const storyError = computed(() => errorStore.forVariant(props.story.id, props.variant.id));
52
- watch(() => [props.story.id, props.variant.id], () => {
53
- errorStore.clear(props.story.id, props.variant.id);
54
- });
53
+ const render = createRenderTracker();
55
54
  const iframe = ref();
56
55
  function postState(changes) {
57
56
  iframe.value?.contentWindow?.postMessage({
@@ -88,10 +87,12 @@ var StoryVariantSinglePreviewRemote_vue_vue_type_script_setup_true_lang_default
88
87
  break;
89
88
  case SANDBOX_READY:
90
89
  if (!fromCurrentOccupant(event.data)) break;
90
+ if (render.wasClean()) errorStore.clear(props.story.id, props.variant.id);
91
91
  setPreviewReady();
92
92
  break;
93
93
  case SANDBOX_ERROR:
94
94
  if (!fromCurrentOccupant(event.data)) break;
95
+ render.threw();
95
96
  errorStore.report({
96
97
  message: event.data.message,
97
98
  stack: event.data.stack,
@@ -139,6 +140,7 @@ var StoryVariantSinglePreviewRemote_vue_vue_type_script_setup_true_lang_default
139
140
  let stopTrackKeyboard;
140
141
  let unmounted = false;
141
142
  function reload(url) {
143
+ render.begin();
142
144
  retargets = 0;
143
145
  retargeting.value = false;
144
146
  clearTimeout(retargetTimer);
@@ -151,6 +153,7 @@ var StoryVariantSinglePreviewRemote_vue_vue_type_script_setup_true_lang_default
151
153
  iframeSrc.value = url;
152
154
  }
153
155
  watch(sandboxUrl, (url) => {
156
+ render.begin();
154
157
  bridge = createStateBridge(postState);
155
158
  if (servedVariant && servedVariant !== props.variant) storyStore.setPreviewReady(servedVariant, false);
156
159
  servedVariant = props.variant;
@@ -195,10 +198,10 @@ var StoryVariantSinglePreviewRemote_vue_vue_type_script_setup_true_lang_default
195
198
  function previewStyle(isResponsiveEnabled, finalWidth, finalHeight) {
196
199
  const style = {};
197
200
  if (isResponsiveEnabled) {
198
- if (finalWidth) style.width = `${finalWidth}px`;
199
- if (finalHeight) style.height = `${finalHeight}px`;
201
+ if (finalWidth) style["width"] = `${finalWidth}px`;
202
+ if (finalHeight) style["height"] = `${finalHeight}px`;
200
203
  }
201
- if (props.autoHeight) style.height = `${Math.min(reportedHeight.value ?? placeholderHeight.value, MAX_AUTO_HEIGHT)}px`;
204
+ if (props.autoHeight) style["height"] = `${Math.min(reportedHeight.value ?? placeholderHeight.value, MAX_AUTO_HEIGHT)}px`;
202
205
  return style;
203
206
  }
204
207
  function onIframeLoad() {
@@ -27,10 +27,14 @@ var StoryView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
27
27
  const router = useRouter();
28
28
  const route = useRoute();
29
29
  watch(() => storyStore.currentVariant, (value) => {
30
- if (value) storyStore.currentStory.lastSelectedVariant = value;
30
+ const story = storyStore.currentStory;
31
+ if (value && story) story.lastSelectedVariant = value;
31
32
  }, { immediate: true });
32
33
  watch(() => [storyStore.currentStory, storyStore.currentVariant], () => {
33
- if (!storyStore.currentVariant && autoSelectsVariant(storyStore.currentStory)) setVariant((storyStore.currentStory.lastSelectedVariant ?? storyStore.currentStory.variants[0]).id);
34
+ if (!storyStore.currentVariant && autoSelectsVariant(storyStore.currentStory)) {
35
+ const variant = storyStore.currentStory.lastSelectedVariant ?? storyStore.currentStory.variants[0];
36
+ if (variant) setVariant(variant.id);
37
+ }
34
38
  }, { immediate: true });
35
39
  function setVariant(variantId) {
36
40
  router.replace({
@@ -41,7 +45,7 @@ var StoryView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
41
45
  }
42
46
  });
43
47
  }
44
- const docsOnlyScroller = ref(null);
48
+ const docsOnlyScroller = ref();
45
49
  function scrollDocsToTop() {
46
50
  docsOnlyScroller.value?.scrollTo(0, 0);
47
51
  }
@@ -2,6 +2,6 @@ import _plugin_vue_export_helper_default from "../../_virtual/_plugin-vue_export
2
2
  import StoryViewer_vue_vue_type_script_setup_true_lang_default from "./StoryViewer.vue_vue_type_script_setup_true_lang.js";
3
3
  /* empty css */
4
4
  //#region src/app/components/story/StoryViewer.vue
5
- var StoryViewer_default = /*#__PURE__*/ _plugin_vue_export_helper_default(StoryViewer_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-d5a7fe4c"]]);
5
+ var StoryViewer_default = /*#__PURE__*/ _plugin_vue_export_helper_default(StoryViewer_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-5e1183de"]]);
6
6
  //#endregion
7
7
  export { StoryViewer_default as default };
@@ -9,7 +9,7 @@ var _hoisted_1 = { class: "poveste-story-viewer bg-gray-50 h-full dark:bg-gray-7
9
9
  var StoryViewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
10
10
  __name: "StoryViewer",
11
11
  setup(__props) {
12
- useCssVars((_ctx) => ({ "v4fc4017e": variant.value?.iconColor }));
12
+ useCssVars((_ctx) => ({ "v96d17610": variant.value?.iconColor }));
13
13
  const storyStore = useStoryStore();
14
14
  const variant = computed(() => storyStore.currentVariant);
15
15
  const isMenuOpened = ref(false);
@@ -20,7 +20,7 @@ var StoryViewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
20
20
  isMenuOpened.value = false;
21
21
  });
22
22
  return (_ctx, _cache) => {
23
- return openBlock(), createElementBlock(Fragment, null, [createElementVNode("div", _hoisted_1, [unref(storyStore).currentStory.layout.type === "grid" ? (openBlock(), createBlock(StoryVariantGrid_default, { key: 0 })) : unref(storyStore).currentStory.layout.type === "single" ? (openBlock(), createBlock(StoryVariantSingle_default, {
23
+ return openBlock(), createElementBlock(Fragment, null, [createElementVNode("div", _hoisted_1, [unref(storyStore).currentStory?.layout?.type === "grid" ? (openBlock(), createBlock(StoryVariantGrid_default, { key: 0 })) : unref(storyStore).currentStory?.layout?.type === "single" ? (openBlock(), createBlock(StoryVariantSingle_default, {
24
24
  key: 1,
25
25
  onOpenVariantMenu: _cache[0] || (_cache[0] = ($event) => isMenuOpened.value = true)
26
26
  })) : createCommentVNode("", true)]), createVNode(MobileOverlay_default, {
@@ -28,7 +28,7 @@ var StoryViewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
28
28
  opened: isMenuOpened.value,
29
29
  onClose: closeMenu
30
30
  }, {
31
- default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(storyStore).currentStory.variants, (v, index) => {
31
+ default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(storyStore).currentStory?.variants ?? [], (v, index) => {
32
32
  return openBlock(), createBlock(StoryVariantListItem_default, {
33
33
  key: index,
34
34
  variant: v
@@ -42,7 +42,7 @@ var ToolbarBackground_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
42
42
  }
43
43
  ];
44
44
  const showColorScheme = !povesteConfig.theme.hideColorSchemeSwitch;
45
- const showDropdown = showColorScheme || !!povesteConfig.backgroundPresets.length;
45
+ const showDropdown = showColorScheme || !!povesteConfig.backgroundPresets?.length;
46
46
  return (_ctx, _cache) => {
47
47
  const _component_VDropdown = resolveComponent("VDropdown");
48
48
  const _directive_tooltip = resolveDirective("tooltip");
@@ -1,7 +1,7 @@
1
1
  import { povesteConfig } from "../../util/config.js";
2
2
  import { usePreviewSettingsStore } from "../../stores/preview-settings.js";
3
3
  import BaseCheckbox_default from "../base/BaseCheckbox.js";
4
- import { Fragment, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, renderList, resolveComponent, resolveDirective, toDisplayString, unref, vModelText, withCtx, withDirectives } from "@poveste/vendors/vue";
4
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, isRef, normalizeClass, openBlock, renderList, resolveComponent, resolveDirective, toDisplayString, unref, vModelText, withCtx, withDirectives } from "@poveste/vendors/vue";
5
5
  import { Icon } from "@poveste/vendors/iconify";
6
6
  //#region src/app/components/toolbar/ToolbarResponsiveSize.vue?vue&type=script&setup=true&lang.ts
7
7
  var _hoisted_1 = { class: "flex flex-col items-stretch" };
@@ -17,6 +17,17 @@ var ToolbarResponsiveSize_vue_vue_type_script_setup_true_lang_default = /*@__PUR
17
17
  __name: "ToolbarResponsiveSize",
18
18
  setup(__props) {
19
19
  const settings = usePreviewSettingsStore().currentSettings;
20
+ function autoWhenEmpty(key) {
21
+ return computed({
22
+ get: () => settings[key],
23
+ set: (value) => {
24
+ const parsed = typeof value === "number" ? value : Number.parseFloat(value ?? "");
25
+ settings[key] = Number.isFinite(parsed) ? parsed : null;
26
+ }
27
+ });
28
+ }
29
+ const responsiveWidth = autoWhenEmpty("responsiveWidth");
30
+ const responsiveHeight = autoWhenEmpty("responsiveHeight");
20
31
  return (_ctx, _cache) => {
21
32
  const _component_VDropdown = resolveComponent("VDropdown");
22
33
  const _directive_tooltip = resolveDirective("tooltip");
@@ -36,30 +47,20 @@ var ToolbarResponsiveSize_vue_vue_type_script_setup_true_lang_default = /*@__PUR
36
47
  }, 8, ["modelValue"]),
37
48
  createElementVNode("div", _hoisted_2, [
38
49
  withDirectives(createElementVNode("input", {
39
- "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => unref(settings).responsiveWidth = $event),
50
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => isRef(responsiveWidth) ? responsiveWidth.value = $event : null),
40
51
  type: "number",
41
52
  class: "bg-transparent border border-gray-200 dark:border-gray-850 rounded w-20 opacity-50 focus:opacity-100 flex-1 min-w-0",
42
53
  step: "16",
43
54
  placeholder: "Auto"
44
- }, null, 512), [[
45
- vModelText,
46
- unref(settings).responsiveWidth,
47
- void 0,
48
- { number: true }
49
- ], [_directive_tooltip, "Responsive width (px)"]]),
55
+ }, null, 512), [[vModelText, unref(responsiveWidth)], [_directive_tooltip, "Responsive width (px)"]]),
50
56
  _cache[4] || (_cache[4] = createElementVNode("span", { class: "opacity-50" }, "×", -1)),
51
57
  withDirectives(createElementVNode("input", {
52
- "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => unref(settings).responsiveHeight = $event),
58
+ "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => isRef(responsiveHeight) ? responsiveHeight.value = $event : null),
53
59
  type: "number",
54
60
  class: "bg-transparent border border-gray-200 dark:border-gray-850 rounded w-20 opacity-50 focus:opacity-100 flex-1 min-w-0",
55
61
  step: "16",
56
62
  placeholder: "Auto"
57
- }, null, 512), [[
58
- vModelText,
59
- unref(settings).responsiveHeight,
60
- void 0,
61
- { number: true }
62
- ], [_directive_tooltip, "Responsive height (px)"]])
63
+ }, null, 512), [[vModelText, unref(responsiveHeight)], [_directive_tooltip, "Responsive height (px)"]])
63
64
  ]),
64
65
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(povesteConfig).responsivePresets, (preset, index) => {
65
66
  return openBlock(), createElementBlock("button", {
@@ -67,7 +68,7 @@ var ToolbarResponsiveSize_vue_vue_type_script_setup_true_lang_default = /*@__PUR
67
68
  class: normalizeClass(["px-4 py-3 cursor-pointer text-left flex gap-4", [unref(settings).responsiveWidth === preset.width && unref(settings).responsiveHeight === preset.height ? "bg-primary-500 hover:bg-primary-600 text-white dark:text-black" : "bg-transparent hover:bg-primary-100 dark:hover:bg-primary-700"]]),
68
69
  onClick: ($event) => {
69
70
  unref(settings).responsiveWidth = preset.width;
70
- unref(settings).responsiveHeight = preset.height;
71
+ unref(settings).responsiveHeight = preset.height ?? null;
71
72
  hide();
72
73
  }
73
74
  }, [createTextVNode(toDisplayString(preset.label) + " ", 1), createElementVNode("span", _hoisted_4, [
@@ -2,6 +2,6 @@ import _plugin_vue_export_helper_default from "../../_virtual/_plugin-vue_export
2
2
  import ToolbarTitle_vue_vue_type_script_setup_true_lang_default from "./ToolbarTitle.vue_vue_type_script_setup_true_lang.js";
3
3
  /* empty css */
4
4
  //#region src/app/components/toolbar/ToolbarTitle.vue
5
- var ToolbarTitle_default = /*#__PURE__*/ _plugin_vue_export_helper_default(ToolbarTitle_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-14aa93ef"]]);
5
+ var ToolbarTitle_default = /*#__PURE__*/ _plugin_vue_export_helper_default(ToolbarTitle_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-30c06406"]]);
6
6
  //#endregion
7
7
  export { ToolbarTitle_default as default };
@@ -15,7 +15,7 @@ var ToolbarTitle_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
15
15
  story: {}
16
16
  },
17
17
  setup(__props) {
18
- useCssVars((_ctx) => ({ "b5fb8c94": iconColor.value }));
18
+ useCssVars((_ctx) => ({ "v5947d534": iconColor.value }));
19
19
  const props = __props;
20
20
  const icon = computed(() => props.variant?.icon ?? props.story?.icon ?? "carbon:cube");
21
21
  const iconColor = computed(() => props.variant?.iconColor ?? props.story?.iconColor);
@@ -46,11 +46,11 @@ var StoryGroup_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
46
46
  "path",
47
47
  "folder",
48
48
  "stories"
49
- ])) : (openBlock(), createBlock(StoryListItem_default, {
49
+ ])) : __props.stories[element.index] ? (openBlock(), createBlock(StoryListItem_default, {
50
50
  key: 1,
51
51
  story: __props.stories[element.index],
52
52
  depth: 0
53
- }, null, 8, ["story"]))], 64);
53
+ }, null, 8, ["story"])) : createCommentVNode("", true)], 64);
54
54
  }), 128))])) : createCommentVNode("", true)]);
55
55
  };
56
56
  }
@@ -1,7 +1,7 @@
1
1
  import StoryListItem_default from "./StoryListItem.js";
2
2
  import StoryListFolder_default from "./StoryListFolder.js";
3
3
  import StoryGroup_default from "./StoryGroup.js";
4
- import { Fragment, createBlock, createElementBlock, defineComponent, openBlock, renderList } from "@poveste/vendors/vue";
4
+ import { Fragment, createBlock, createCommentVNode, createElementBlock, defineComponent, openBlock, renderList } from "@poveste/vendors/vue";
5
5
  //#region src/app/components/tree/StoryList.vue?vue&type=script&setup=true&lang.ts
6
6
  var _hoisted_1 = { class: "poveste-story-list overflow-y-auto" };
7
7
  var StoryList_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
@@ -21,10 +21,10 @@ var StoryList_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
21
21
  key: 1,
22
22
  folder: element,
23
23
  stories: __props.stories
24
- }, null, 8, ["folder", "stories"])) : (openBlock(), createBlock(StoryListItem_default, {
24
+ }, null, 8, ["folder", "stories"])) : __props.stories[element.index] ? (openBlock(), createBlock(StoryListItem_default, {
25
25
  key: 2,
26
26
  story: __props.stories[element.index]
27
- }, null, 8, ["story"]))], 64);
27
+ }, null, 8, ["story"])) : createCommentVNode("", true)], 64);
28
28
  }), 128))]);
29
29
  };
30
30
  }
@@ -2,6 +2,6 @@ import _plugin_vue_export_helper_default from "../../_virtual/_plugin-vue_export
2
2
  import StoryListFolder_vue_vue_type_script_setup_true_lang_default from "./StoryListFolder.vue_vue_type_script_setup_true_lang.js";
3
3
  /* empty css */
4
4
  //#region src/app/components/tree/StoryListFolder.vue
5
- var StoryListFolder_default = /*#__PURE__*/ _plugin_vue_export_helper_default(StoryListFolder_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-11f8c91e"]]);
5
+ var StoryListFolder_default = /*#__PURE__*/ _plugin_vue_export_helper_default(StoryListFolder_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-9702f44e"]]);
6
6
  //#endregion
7
7
  export { StoryListFolder_default as default };
@@ -20,7 +20,7 @@ var StoryListFolder_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
20
20
  depth: { default: 0 }
21
21
  },
22
22
  setup(__props) {
23
- useCssVars((_ctx) => ({ "v047dbc51": folderPadding.value }));
23
+ useCssVars((_ctx) => ({ "v716b068e": folderPadding.value }));
24
24
  const props = __props;
25
25
  const folderStore = useFolderStore();
26
26
  const folderPath = computed(() => [...props.path, props.folder.title]);
@@ -54,11 +54,11 @@ var StoryListFolder_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
54
54
  "folder",
55
55
  "stories",
56
56
  "depth"
57
- ])) : (openBlock(), createBlock(StoryListItem_default, {
57
+ ])) : __props.stories[element.index] ? (openBlock(), createBlock(StoryListItem_default, {
58
58
  key: 1,
59
59
  story: __props.stories[element.index],
60
60
  depth: __props.depth + 1
61
- }, null, 8, ["story", "depth"]))], 64);
61
+ }, null, 8, ["story", "depth"])) : createCommentVNode("", true)], 64);
62
62
  }), 128))])) : createCommentVNode("", true)]);
63
63
  };
64
64
  }
@@ -2,6 +2,6 @@ import _plugin_vue_export_helper_default from "../../_virtual/_plugin-vue_export
2
2
  import StoryListItem_vue_vue_type_script_setup_true_lang_default from "./StoryListItem.vue_vue_type_script_setup_true_lang.js";
3
3
  /* empty css */
4
4
  //#region src/app/components/tree/StoryListItem.vue
5
- var StoryListItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(StoryListItem_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-184d6cf3"]]);
5
+ var StoryListItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(StoryListItem_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-83161585"]]);
6
6
  //#endregion
7
7
  export { StoryListItem_default as default };
@@ -16,8 +16,8 @@ var StoryListItem_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
16
16
  },
17
17
  setup(__props) {
18
18
  useCssVars((_ctx) => ({
19
- "v516f2a64": filePadding.value,
20
- "v2fa7200a": _ctx.story.iconColor
19
+ "v0299061e": filePadding.value,
20
+ "v80ccd94c": _ctx.story.iconColor
21
21
  }));
22
22
  const props = __props;
23
23
  const errorStore = useStoryErrorStore();
@@ -26,7 +26,7 @@ var StoryListItem_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
26
26
  return `${props.depth * 12}px`;
27
27
  });
28
28
  const route = useRoute();
29
- const isActive = computed(() => route.params.storyId === props.story.id);
29
+ const isActive = computed(() => route.params["storyId"] === props.story.id);
30
30
  const el = ref();
31
31
  useScrollOnActive(isActive, el);
32
32
  return (_ctx, _cache) => {
@@ -1,9 +1,10 @@
1
1
  import { router } from "./router.js";
2
2
  //#region src/app/plugin.ts
3
3
  function setupPluginApi() {
4
- if (!import.meta.hot) return;
4
+ const hot = import.meta.hot;
5
+ if (!hot) return;
5
6
  const listeners = {};
6
- import.meta.hot.on("poveste:dev-event-result", ({ event, result }) => {
7
+ hot.on("poveste:dev-event-result", ({ event, result }) => {
7
8
  const set = listeners[event];
8
9
  if (set) for (const listener of set) listener(result);
9
10
  });
@@ -21,7 +22,7 @@ function setupPluginApi() {
21
22
  window.__HST_PLUGIN_API__ = {
22
23
  sendEvent: (event, payload) => {
23
24
  return new Promise((resolve) => {
24
- import.meta.hot.send(`poveste:dev-event`, {
25
+ hot.send(`poveste:dev-event`, {
25
26
  event,
26
27
  payload
27
28
  });
@@ -17,8 +17,8 @@ import { parseQuery } from "@poveste/vendors/vue-router";
17
17
  import { reportStoryError } from "@poveste/shared";
18
18
  //#region src/app/sandbox.ts
19
19
  var query = parseQuery(window.location.search);
20
- var storyId = ref(typeof query.storyId === "string" ? query.storyId : null);
21
- var variantId = ref(typeof query.variantId === "string" ? query.variantId : null);
20
+ var storyId = ref(typeof query["storyId"] === "string" ? query["storyId"] : null);
21
+ var variantId = ref(typeof query["variantId"] === "string" ? query["variantId"] : null);
22
22
  watchEffect(() => {
23
23
  occupant.storyId = storyId.value;
24
24
  occupant.variantId = variantId.value;
@@ -38,8 +38,8 @@ if (storedSettings) applyPreviewSettings(storedSettings);
38
38
  if (window.parent && window.parent !== window) window.parent.postMessage({ type: PREVIEW_SETTINGS_REQUEST }, window.location.origin);
39
39
  function reportUncaught(error) {
40
40
  reportStoryError(error, {
41
- storyId: storyId.value,
42
- variantId: variantId.value
41
+ storyId: storyId.value ?? void 0,
42
+ variantId: variantId.value ?? void 0
43
43
  });
44
44
  }
45
45
  window.addEventListener("error", (event) => {
@@ -73,6 +73,7 @@ var app = createApp({
73
73
  let bridge = createStateBridge(postState);
74
74
  let mounted = false;
75
75
  window.addEventListener("message", (event) => {
76
+ if (event.origin !== window.location.origin) return;
76
77
  if (event.data?.type === "__poveste:state-sync") {
77
78
  if (!mounted || !variant.value) return;
78
79
  bridge.receive(variant.value.state, event.data.state);
@@ -29,7 +29,7 @@ var useFolderStore = defineStore("folder", () => {
29
29
  }
30
30
  const storyStore = useStoryStore();
31
31
  watch(() => storyStore.currentStory, (story) => {
32
- if (story) openFileFolders(story.file.path);
32
+ if (story?.file) openFileFolders(story.file.path);
33
33
  });
34
34
  return {
35
35
  isFolderOpened,
@@ -7,8 +7,8 @@ var useStoryStore = defineStore("story", () => {
7
7
  function setStories(value) {
8
8
  stories.value = value;
9
9
  }
10
- const currentStory = computed(() => stories.value.find((s) => s.id === router.currentRoute.value.params.storyId));
11
- const currentVariant = computed(() => currentStory.value?.variants.find((v) => v.id === router.currentRoute.value.query.variantId));
10
+ const currentStory = computed(() => stories.value.find((s) => s.id === router.currentRoute.value.params["storyId"]));
11
+ const currentVariant = computed(() => currentStory.value?.variants.find((v) => v.id === router.currentRoute.value.query["variantId"]));
12
12
  const maps = computed(() => {
13
13
  const storyMap = /* @__PURE__ */ new Map();
14
14
  const variantMap = /* @__PURE__ */ new Map();