@poveste/app 0.20.0 → 0.21.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 (39) hide show
  1. package/dist/bundled/app.css +55 -27
  2. package/dist/bundled/components/layout/LayoutModal.vue_vue_type_script_setup_true_lang.js +44 -5
  3. package/dist/bundled/components/panel/ComponentDocs.js +1 -1
  4. package/dist/bundled/components/panel/ComponentDocs.vue_vue_type_script_setup_true_lang.js +72 -40
  5. package/dist/bundled/components/panel/StoryDocs.vue_vue_type_script_setup_true_lang.js +34 -10
  6. package/dist/bundled/components/panel/StorySourceCode.js +1 -1
  7. package/dist/bundled/components/panel/StorySourceCode.vue_vue_type_script_setup_true_lang.js +2 -2
  8. package/dist/bundled/components/story/StoryResponsivePreview.js +1 -1
  9. package/dist/bundled/components/story/StoryResponsivePreview.vue_vue_type_script_setup_true_lang.js +5 -3
  10. package/dist/bundled/components/story/StoryVariantGridItem.js +1 -1
  11. package/dist/bundled/components/story/StoryVariantGridItem.vue_vue_type_script_setup_true_lang.js +5 -3
  12. package/dist/bundled/components/story/StoryVariantSinglePreviewRemote.vue_vue_type_script_setup_true_lang.js +3 -2
  13. package/dist/bundled/index.js +5 -1
  14. package/dist/bundled/sandbox.js +2 -0
  15. package/dist/bundled/util/component-docs-data.js +5 -1
  16. package/dist/bundled/util/component-docs.js +90 -14
  17. package/dist/bundled/util/dark.js +3 -1
  18. package/dist/bundled/util/docs.js +12 -2
  19. package/dist/bundled/util/highlighter.js +1 -1
  20. package/dist/bundled/util/icons.generated.js +1 -0
  21. package/dist/bundled/util/keyboard.js +5 -4
  22. package/dist/style.css +317 -150
  23. package/package.json +7 -7
  24. package/src/app/components/layout/LayoutModal.vue +55 -2
  25. package/src/app/components/panel/ComponentDocs.vue +83 -17
  26. package/src/app/components/panel/StoryDocs.vue +30 -3
  27. package/src/app/components/panel/StorySourceCode.vue +2 -2
  28. package/src/app/components/story/StoryResponsivePreview.vue +4 -1
  29. package/src/app/components/story/StoryVariantGridItem.vue +4 -1
  30. package/src/app/components/story/StoryVariantSinglePreviewRemote.vue +6 -4
  31. package/src/app/index.ts +12 -3
  32. package/src/app/sandbox.ts +5 -0
  33. package/src/app/util/component-docs-data.ts +6 -3
  34. package/src/app/util/component-docs.ts +102 -11
  35. package/src/app/util/dark.ts +6 -0
  36. package/src/app/util/docs.ts +18 -2
  37. package/src/app/util/highlighter.ts +2 -1
  38. package/src/app/util/icons.generated.ts +1 -1
  39. package/src/app/util/keyboard.ts +8 -4
@@ -215,93 +215,121 @@ from {
215
215
  }
216
216
  @scope (:root) to (.__poveste-render-story:not(.__poveste-render-custom-controls)) {
217
217
  .poveste-component-docs {
218
- &[data-v-aa8468d5] {
218
+ &[data-v-3b01b847] {
219
219
  padding: 1rem;
220
220
  font-size: .875rem;
221
221
  color: var(--color-gray-800);
222
222
 
223
223
  /* On the subject, not `.ptw-dark &`: `.ptw-dark` sits above the `@scope` root (#101). */
224
224
  }
225
- &[data-v-aa8468d5]:where(.ptw-dark, .ptw-dark *) {
225
+ &[data-v-3b01b847]:where(.ptw-dark, .ptw-dark *) {
226
226
  color: var(--color-gray-200);
227
227
  }
228
228
  }
229
- section + section[data-v-aa8468d5] {
229
+ details + details[data-v-3b01b847] {
230
230
  margin-top: 1.5rem;
231
231
  }
232
- h3[data-v-aa8468d5] {
232
+ summary[data-v-3b01b847] {
233
+ cursor: pointer;
234
+ margin-bottom: .5rem;
235
+ }
236
+ h3[data-v-3b01b847] {
237
+ display: inline;
233
238
  font-weight: 600;
234
239
  font-size: 1rem;
235
- margin-bottom: .5rem;
236
240
  }
237
- table[data-v-aa8468d5] {
241
+ table[data-v-3b01b847] {
238
242
  width: 100%;
239
243
  border-collapse: collapse;
240
244
  margin-bottom: 1rem;
241
245
  }
242
- th[data-v-aa8468d5] {
246
+ th[data-v-3b01b847] {
243
247
  text-align: start;
244
248
  font-weight: 500;
245
249
  color: var(--color-gray-500);
246
250
  }
247
251
  th,
248
252
  td {
249
- &[data-v-aa8468d5] {
253
+ &[data-v-3b01b847] {
250
254
  padding: .375rem .5rem;
251
255
  border-bottom: 1px solid var(--color-gray-200);
252
256
  vertical-align: top;
253
257
  }
254
- &[data-v-aa8468d5]:where(.ptw-dark, .ptw-dark *) {
258
+ &[data-v-3b01b847]:where(.ptw-dark, .ptw-dark *) {
255
259
  border-color: var(--color-gray-750);
256
260
  }
257
261
  }
258
262
  code {
259
- &[data-v-aa8468d5] {
263
+ &[data-v-3b01b847] {
260
264
  font-size: .8125rem;
261
265
  background-color: var(--color-gray-100);
262
266
  border-radius: .25rem;
263
267
  padding: 0 .25rem;
264
268
  }
265
- &[data-v-aa8468d5]:where(.ptw-dark, .ptw-dark *) {
269
+ &[data-v-3b01b847]:where(.ptw-dark, .ptw-dark *) {
266
270
  background-color: var(--color-gray-750);
267
271
  }
268
272
  }
269
- pre code[data-v-aa8468d5] {
273
+ pre code[data-v-3b01b847] {
270
274
  display: block;
271
275
  padding: .5rem;
272
276
  margin-top: .25rem;
273
277
  white-space: pre-wrap;
274
278
  }
275
- .deprecated[data-v-aa8468d5] {
279
+ .deprecated[data-v-3b01b847] {
276
280
  text-decoration: line-through;
277
281
  }
278
- [data-slot='required'][data-v-aa8468d5] {
282
+ /* Its own line: a constraint wrapped beside the name broke mid-phrase in the narrow panel. */
283
+ /* A prop a slot passes its content, under the slot it belongs to. */
284
+ [data-slot-prop] td[data-v-3b01b847]:first-child {
285
+ padding-inline-start: 1rem;
286
+ }
287
+ [data-slot='generic'][data-v-3b01b847] {
288
+ display: block;
289
+ width: fit-content;
290
+ margin-top: .25rem;
291
+ font-size: .75rem;
292
+ font-weight: 400;
293
+ cursor: help;
294
+ }
295
+ [data-slot='required'][data-v-3b01b847] {
279
296
  color: var(--color-red-500);
280
297
  margin-inline-start: .125rem;
281
298
  }
299
+ [data-slot='model'] {
300
+ &[data-v-3b01b847] {
301
+ display: inline-block;
302
+ margin-inline-start: .375rem;
303
+ color: var(--color-primary-600);
304
+ cursor: help;
305
+ }
306
+ &[data-v-3b01b847]:where(.ptw-dark, .ptw-dark *) {
307
+ color: var(--color-primary-400);
308
+ }
309
+ }
282
310
  [data-slot='deprecated'],
283
311
  [data-slot='default-conflict'] {
284
- &[data-v-aa8468d5] {
312
+ &[data-v-3b01b847] {
285
313
  color: var(--color-amber-600);
286
314
  font-weight: 500;
287
315
  }
288
- &[data-v-aa8468d5]:where(.ptw-dark, .ptw-dark *) {
316
+ &[data-v-3b01b847]:where(.ptw-dark, .ptw-dark *) {
289
317
  color: var(--color-amber-400);
290
318
  }
291
319
  }
292
- [data-slot='default-conflict'][data-v-aa8468d5] {
320
+ [data-slot='default-conflict'][data-v-3b01b847] {
293
321
  margin-inline-start: .25rem;
294
322
  cursor: help;
295
323
  }
296
- [data-slot='see'][data-v-aa8468d5] {
324
+ [data-slot='see'][data-v-3b01b847] {
297
325
  display: block;
298
326
  margin-top: .25rem;
299
327
  }
300
- a[data-slot='see'][data-v-aa8468d5] {
328
+ a[data-slot='see'][data-v-3b01b847] {
301
329
  color: var(--color-primary-500);
302
330
  text-decoration: underline;
303
331
  }
304
- [data-slot='error'][data-v-aa8468d5] {
332
+ [data-slot='error'][data-v-3b01b847] {
305
333
  color: var(--color-gray-500);
306
334
  }
307
335
  }
@@ -323,7 +351,7 @@ a[data-slot='see'][data-v-aa8468d5] {
323
351
  }
324
352
  }
325
353
  @scope (:root) to (.__poveste-render-story:not(.__poveste-render-custom-controls)) {
326
- .__poveste-code-placeholder[data-v-4b28d655] {
354
+ .__poveste-code-placeholder[data-v-cecbc93b] {
327
355
  color: inherit;
328
356
  font-size: inherit;
329
357
  }
@@ -338,16 +366,16 @@ a[data-slot='see'][data-v-aa8468d5] {
338
366
  }
339
367
  }
340
368
  @scope (:root) to (.__poveste-render-story:not(.__poveste-render-custom-controls)) {
341
- .bind-preview-bg[data-v-a99edb14] {
342
- background-color: var(--v4ce71e65);
369
+ .bind-preview-bg[data-v-bbd56e9f] {
370
+ background-color: var(--v59fa22e6);
343
371
  }
344
372
  }
345
373
  @scope (:root) to (.__poveste-render-story:not(.__poveste-render-custom-controls)) {
346
- .bind-icon-color[data-v-e0e9a8e1] {
347
- color: var(--v2ce2d009);
374
+ .bind-icon-color[data-v-9a717688] {
375
+ color: var(--ff0ecc2c);
348
376
  }
349
- .bind-preview-bg[data-v-e0e9a8e1] {
350
- background-color: var(--v4f3f7242);
377
+ .bind-preview-bg[data-v-9a717688] {
378
+ background-color: var(--v59a40d7e);
351
379
  }
352
380
  }
353
381
  @scope (:root) to (.__poveste-render-story:not(.__poveste-render-custom-controls)) {
@@ -1,14 +1,14 @@
1
1
  import { onKeyboardShortcut } from "../../util/keyboard.js";
2
2
  import LayoutPane_default from "./LayoutPane.js";
3
- import { createElementBlock, createElementVNode, createVNode, defineComponent, openBlock, unref, vShow, withDirectives } from "@poveste/vendors/vue";
3
+ import { createElementBlock, createElementVNode, createVNode, defineComponent, nextTick, openBlock, ref, unref, vShow, watch, withDirectives, withKeys } from "@poveste/vendors/vue";
4
4
  import { Icon } from "@poveste/vendors/iconify";
5
5
  //#region src/app/components/layout/LayoutModal.vue?vue&type=script&setup=true&lang.ts
6
6
  var _hoisted_1 = {
7
7
  class: "poveste-layout-modal fixed inset-0 bg-white/80 dark:bg-gray-900/80 z-20",
8
8
  "data-testid": "layout-modal"
9
9
  };
10
- var _hoisted_2 = { class: "bg-white dark:bg-gray-900 md:mt-16 md:mx-auto w-screen max-w-[512px] shadow-xl border border-gray-200 dark:border-gray-750 rounded-lg relative divide-y divide-gray-200 dark:divide-gray-850" };
11
- var _hoisted_3 = { class: "flex items-center px-6 py-3 text-gray-900 dark:text-gray-100" };
10
+ var _hoisted_2 = { class: "flex items-center px-6 py-3 text-gray-900 dark:text-gray-100" };
11
+ var FOCUSABLE = "button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])";
12
12
  var LayoutModal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
13
13
  __name: "LayoutModal",
14
14
  props: { shown: {
@@ -25,11 +25,50 @@ var LayoutModal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
25
25
  onKeyboardShortcut(["escape"], () => {
26
26
  if (props.shown) close();
27
27
  });
28
+ const panel = ref();
29
+ let opener = null;
30
+ function focusables() {
31
+ return [...panel.value?.querySelectorAll(FOCUSABLE) ?? []].filter((element) => !element.hasAttribute("disabled") && element.getClientRects().length > 0);
32
+ }
33
+ watch(() => props.shown, async (shown) => {
34
+ if (shown) {
35
+ opener = document.activeElement instanceof HTMLElement ? document.activeElement : null;
36
+ await nextTick();
37
+ focusables()[0]?.focus();
38
+ } else if (opener?.isConnected) {
39
+ opener.focus();
40
+ opener = null;
41
+ }
42
+ });
43
+ function keepFocusInside(event) {
44
+ const elements = focusables();
45
+ const first = elements[0];
46
+ const last = elements.at(-1);
47
+ if (!first || !last) return;
48
+ if (event.shiftKey && document.activeElement === first) {
49
+ event.preventDefault();
50
+ last.focus();
51
+ } else if (!event.shiftKey && document.activeElement === last) {
52
+ event.preventDefault();
53
+ first.focus();
54
+ }
55
+ }
28
56
  return (_ctx, _cache) => {
29
57
  return withDirectives((openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", {
30
58
  class: "absolute inset-0",
31
59
  onClick: _cache[0] || (_cache[0] = ($event) => close())
32
- }), createElementVNode("div", _hoisted_2, [createElementVNode("div", _hoisted_3, [_cache[2] || (_cache[2] = createElementVNode("h2", { class: "flex-1 text-sm font-medium m-0" }, " Customize Layout ", -1)), createElementVNode("button", {
60
+ }), createElementVNode("div", {
61
+ ref_key: "panel",
62
+ ref: panel,
63
+ role: "dialog",
64
+ "aria-modal": "true",
65
+ "aria-labelledby": "poveste-layout-modal-title",
66
+ class: "bg-white dark:bg-gray-900 md:mt-16 md:mx-auto w-screen max-w-[512px] shadow-xl border border-gray-200 dark:border-gray-750 rounded-lg relative divide-y divide-gray-200 dark:divide-gray-850",
67
+ onKeydown: withKeys(keepFocusInside, ["tab"])
68
+ }, [createElementVNode("div", _hoisted_2, [_cache[2] || (_cache[2] = createElementVNode("h2", {
69
+ id: "poveste-layout-modal-title",
70
+ class: "flex-1 text-sm font-medium m-0"
71
+ }, " Customize Layout ", -1)), createElementVNode("button", {
33
72
  type: "button",
34
73
  class: "flex items-center justify-center p-1 bg-transparent border-0 text-gray-500 dark:text-gray-400 hover:text-primary-500 dark:hover:text-primary-400 cursor-pointer",
35
74
  "aria-label": "Close layout customization",
@@ -39,7 +78,7 @@ var LayoutModal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
39
78
  icon: "carbon:close",
40
79
  class: "w-5 h-5",
41
80
  "aria-hidden": "true"
42
- })])]), createVNode(LayoutPane_default)])], 512)), [[vShow, __props.shown]]);
81
+ })])]), createVNode(LayoutPane_default)], 544)], 512)), [[vShow, __props.shown]]);
43
82
  };
44
83
  }
45
84
  });
@@ -2,6 +2,6 @@ import _plugin_vue_export_helper_default from "../../_virtual/_plugin-vue_export
2
2
  import ComponentDocs_vue_vue_type_script_setup_true_lang_default from "./ComponentDocs.vue_vue_type_script_setup_true_lang.js";
3
3
  /* empty css */
4
4
  //#region src/app/components/panel/ComponentDocs.vue
5
- var ComponentDocs_default = /*#__PURE__*/ _plugin_vue_export_helper_default(ComponentDocs_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-aa8468d5"]]);
5
+ var ComponentDocs_default = /*#__PURE__*/ _plugin_vue_export_helper_default(ComponentDocs_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-3b01b847"]]);
6
6
  //#endregion
7
7
  export { ComponentDocs_default as default };
@@ -1,68 +1,82 @@
1
- import { tagHref, tagText } from "../../util/component-docs.js";
2
- import { Fragment, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, normalizeClass, openBlock, renderList, toDisplayString, unref } from "@poveste/vendors/vue";
1
+ import { modelLabel, rootFirst, tagHref, tagText } from "../../util/component-docs.js";
2
+ import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, normalizeClass, openBlock, renderList, toDisplayString, unref } from "@poveste/vendors/vue";
3
3
  //#region src/app/components/panel/ComponentDocs.vue?vue&type=script&setup=true&lang.ts
4
4
  var _hoisted_1 = {
5
5
  class: "poveste-component-docs",
6
6
  "data-testid": "component-docs"
7
7
  };
8
- var _hoisted_2 = ["data-component"];
8
+ var _hoisted_2 = ["open", "data-component"];
9
9
  var _hoisted_3 = { "data-slot": "component-name" };
10
10
  var _hoisted_4 = {
11
11
  key: 0,
12
- "data-slot": "error"
12
+ title: "The component's type parameters, as its script declares them",
13
+ "data-slot": "generic"
13
14
  };
14
15
  var _hoisted_5 = {
16
+ key: 0,
17
+ "data-slot": "error"
18
+ };
19
+ var _hoisted_6 = {
15
20
  key: 0,
16
21
  "data-slot": "props"
17
22
  };
18
- var _hoisted_6 = ["data-prop"];
19
- var _hoisted_7 = {
23
+ var _hoisted_7 = ["data-prop"];
24
+ var _hoisted_8 = {
20
25
  key: 0,
21
26
  title: "Required",
22
27
  "data-slot": "required"
23
28
  };
24
- var _hoisted_8 = { key: 0 };
25
29
  var _hoisted_9 = ["title"];
26
- var _hoisted_10 = {
30
+ var _hoisted_10 = { key: 0 };
31
+ var _hoisted_11 = ["title"];
32
+ var _hoisted_12 = {
27
33
  key: 0,
28
34
  "data-slot": "deprecated"
29
35
  };
30
- var _hoisted_11 = ["href"];
31
- var _hoisted_12 = {
36
+ var _hoisted_13 = ["href"];
37
+ var _hoisted_14 = {
32
38
  key: 1,
33
39
  "data-slot": "see"
34
40
  };
35
- var _hoisted_13 = {
41
+ var _hoisted_15 = {
36
42
  key: 1,
37
43
  "data-slot": "example"
38
44
  };
39
- var _hoisted_14 = {
45
+ var _hoisted_16 = {
40
46
  key: 1,
41
47
  "data-slot": "slots"
42
48
  };
43
- var _hoisted_15 = ["data-slot-name"];
44
- var _hoisted_16 = { key: 0 };
45
- var _hoisted_17 = {
49
+ var _hoisted_17 = ["data-slot-name"];
50
+ var _hoisted_18 = { key: 0 };
51
+ var _hoisted_19 = ["data-slot-prop"];
52
+ var _hoisted_20 = {
46
53
  key: 2,
47
54
  "data-slot": "events"
48
55
  };
49
- var _hoisted_18 = ["data-event"];
50
- var _hoisted_19 = { key: 0 };
56
+ var _hoisted_21 = ["data-event"];
57
+ var _hoisted_22 = ["title"];
58
+ var _hoisted_23 = { key: 0 };
51
59
  var ComponentDocs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
52
60
  __name: "ComponentDocs",
53
- props: { components: {} },
61
+ props: {
62
+ components: {},
63
+ storyFile: {}
64
+ },
54
65
  setup(__props) {
66
+ const props = __props;
67
+ const ordered = computed(() => rootFirst(props.components, props.storyFile));
55
68
  function shownDefault(prop) {
56
69
  return prop.default ?? prop.defaultTag;
57
70
  }
58
71
  return (_ctx, _cache) => {
59
- return openBlock(), createElementBlock("div", _hoisted_1, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.components, (component) => {
60
- return openBlock(), createElementBlock("section", {
72
+ return openBlock(), createElementBlock("div", _hoisted_1, [(openBlock(true), createElementBlock(Fragment, null, renderList(ordered.value, (component, index) => {
73
+ return openBlock(), createElementBlock("details", {
61
74
  key: component.file,
75
+ open: ordered.value.length <= unref(3) || index === 0,
62
76
  "data-slot": "component",
63
77
  "data-component": component.name
64
- }, [createElementVNode("h3", _hoisted_3, toDisplayString(component.name), 1), component.error ? (openBlock(), createElementBlock("p", _hoisted_4, " Could not read this component's types: " + toDisplayString(component.error), 1)) : component.doc ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
65
- component.doc.props.length ? (openBlock(), createElementBlock("table", _hoisted_5, [_cache[1] || (_cache[1] = createElementVNode("thead", null, [createElementVNode("tr", null, [
78
+ }, [createElementVNode("summary", null, [createElementVNode("h3", _hoisted_3, [createTextVNode(toDisplayString(component.name), 1), component.doc?.generic ? (openBlock(), createElementBlock("code", _hoisted_4, "<" + toDisplayString(component.doc.generic) + ">", 1)) : createCommentVNode("", true)])]), component.error ? (openBlock(), createElementBlock("p", _hoisted_5, " Could not read this component's types: " + toDisplayString(component.error), 1)) : component.doc ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
79
+ component.doc.props.length ? (openBlock(), createElementBlock("table", _hoisted_6, [_cache[1] || (_cache[1] = createElementVNode("thead", null, [createElementVNode("tr", null, [
66
80
  createElementVNode("th", null, "Prop"),
67
81
  createElementVNode("th", null, "Type"),
68
82
  createElementVNode("th", null, "Default"),
@@ -72,15 +86,23 @@ var ComponentDocs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
72
86
  key: prop.name,
73
87
  "data-prop": prop.name
74
88
  }, [
75
- createElementVNode("td", null, [createElementVNode("code", { class: normalizeClass({ deprecated: unref(tagText)(prop.tags, "deprecated") !== void 0 }) }, toDisplayString(prop.name), 3), prop.required ? (openBlock(), createElementBlock("span", _hoisted_7, "*")) : createCommentVNode("", true)]),
89
+ createElementVNode("td", null, [
90
+ createElementVNode("code", { class: normalizeClass({ deprecated: unref(tagText)(prop.tags, "deprecated") !== void 0 }) }, toDisplayString(prop.name), 3),
91
+ prop.required ? (openBlock(), createElementBlock("span", _hoisted_8, "*")) : createCommentVNode("", true),
92
+ unref(modelLabel)(component.doc, prop.name) ? (openBlock(), createElementBlock("code", {
93
+ key: 1,
94
+ title: `Bound two ways with ${unref(modelLabel)(component.doc, prop.name)}, through the update:${prop.name} event`,
95
+ "data-slot": "model"
96
+ }, toDisplayString(unref(modelLabel)(component.doc, prop.name)), 9, _hoisted_9)) : createCommentVNode("", true)
97
+ ]),
76
98
  createElementVNode("td", null, [createElementVNode("code", null, toDisplayString(prop.type), 1)]),
77
- createElementVNode("td", null, [shownDefault(prop) !== void 0 ? (openBlock(), createElementBlock("code", _hoisted_8, toDisplayString(shownDefault(prop)), 1)) : createCommentVNode("", true), _ctx.__POVESTE_DEV__ && prop.defaultConflict ? (openBlock(), createElementBlock("span", {
99
+ createElementVNode("td", null, [shownDefault(prop) !== void 0 ? (openBlock(), createElementBlock("code", _hoisted_10, toDisplayString(shownDefault(prop)), 1)) : createCommentVNode("", true), _ctx.__POVESTE_DEV__ && prop.defaultConflict ? (openBlock(), createElementBlock("span", {
78
100
  key: 1,
79
101
  title: `The code's default is shown; the @default tag says ${prop.defaultTag}`,
80
102
  "data-slot": "default-conflict"
81
- }, "≠", 8, _hoisted_9)) : createCommentVNode("", true)]),
103
+ }, "≠", 8, _hoisted_11)) : createCommentVNode("", true)]),
82
104
  createElementVNode("td", null, [
83
- unref(tagText)(prop.tags, "deprecated") !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_10, [_cache[0] || (_cache[0] = createTextVNode("Deprecated", -1)), unref(tagText)(prop.tags, "deprecated") ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createTextVNode(": " + toDisplayString(unref(tagText)(prop.tags, "deprecated")), 1)], 64)) : createCommentVNode("", true)])) : createCommentVNode("", true),
105
+ unref(tagText)(prop.tags, "deprecated") !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_12, [_cache[0] || (_cache[0] = createTextVNode("Deprecated", -1)), unref(tagText)(prop.tags, "deprecated") ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createTextVNode(": " + toDisplayString(unref(tagText)(prop.tags, "deprecated")), 1)], 64)) : createCommentVNode("", true)])) : createCommentVNode("", true),
84
106
  createTextVNode(" " + toDisplayString(prop.description) + " ", 1),
85
107
  (openBlock(true), createElementBlock(Fragment, null, renderList(prop.tags.filter((tag) => tag.name === "see" || tag.name === "link"), (tag) => {
86
108
  return openBlock(), createElementBlock(Fragment, { key: tag.text }, [unref(tagHref)(tag.text ?? "") ? (openBlock(), createElementBlock("a", {
@@ -89,27 +111,33 @@ var ComponentDocs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
89
111
  target: "_blank",
90
112
  rel: "noopener",
91
113
  "data-slot": "see"
92
- }, toDisplayString(tag.text), 9, _hoisted_11)) : (openBlock(), createElementBlock("span", _hoisted_12, toDisplayString(tag.text), 1))], 64);
114
+ }, toDisplayString(tag.text), 9, _hoisted_13)) : (openBlock(), createElementBlock("span", _hoisted_14, toDisplayString(tag.text), 1))], 64);
93
115
  }), 128)),
94
- unref(tagText)(prop.tags, "example") ? (openBlock(), createElementBlock("pre", _hoisted_13, [createElementVNode("code", null, toDisplayString(unref(tagText)(prop.tags, "example")), 1)])) : createCommentVNode("", true)
116
+ unref(tagText)(prop.tags, "example") ? (openBlock(), createElementBlock("pre", _hoisted_15, [createElementVNode("code", null, toDisplayString(unref(tagText)(prop.tags, "example")), 1)])) : createCommentVNode("", true)
95
117
  ])
96
- ], 8, _hoisted_6);
118
+ ], 8, _hoisted_7);
97
119
  }), 128))])])) : createCommentVNode("", true),
98
- component.doc.slots.length ? (openBlock(), createElementBlock("table", _hoisted_14, [_cache[2] || (_cache[2] = createElementVNode("thead", null, [createElementVNode("tr", null, [
120
+ component.doc.slots.length ? (openBlock(), createElementBlock("table", _hoisted_16, [_cache[2] || (_cache[2] = createElementVNode("thead", null, [createElementVNode("tr", null, [
99
121
  createElementVNode("th", null, "Slot"),
100
122
  createElementVNode("th", null, "Type"),
101
123
  createElementVNode("th", null, "Description")
102
124
  ])], -1)), createElementVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(component.doc.slots, (slot) => {
103
- return openBlock(), createElementBlock("tr", {
104
- key: slot.name,
105
- "data-slot-name": slot.name
106
- }, [
125
+ return openBlock(), createElementBlock(Fragment, { key: slot.name }, [createElementVNode("tr", { "data-slot-name": slot.name }, [
107
126
  createElementVNode("td", null, [createElementVNode("code", null, toDisplayString(slot.name), 1)]),
108
- createElementVNode("td", null, [slot.type ? (openBlock(), createElementBlock("code", _hoisted_16, toDisplayString(slot.type), 1)) : createCommentVNode("", true)]),
127
+ createElementVNode("td", null, [slot.type && !slot.props?.length ? (openBlock(), createElementBlock("code", _hoisted_18, toDisplayString(slot.type), 1)) : createCommentVNode("", true)]),
109
128
  createElementVNode("td", null, toDisplayString(slot.description), 1)
110
- ], 8, _hoisted_15);
129
+ ], 8, _hoisted_17), (openBlock(true), createElementBlock(Fragment, null, renderList(slot.props ?? [], (slotProp) => {
130
+ return openBlock(), createElementBlock("tr", {
131
+ key: `${slot.name}.${slotProp.name}`,
132
+ "data-slot-prop": slotProp.name
133
+ }, [
134
+ createElementVNode("td", null, [createElementVNode("code", null, toDisplayString(slotProp.name), 1)]),
135
+ createElementVNode("td", null, [createElementVNode("code", null, toDisplayString(slotProp.type), 1)]),
136
+ createElementVNode("td", null, toDisplayString(slotProp.description), 1)
137
+ ], 8, _hoisted_19);
138
+ }), 128))], 64);
111
139
  }), 128))])])) : createCommentVNode("", true),
112
- component.doc.events.length ? (openBlock(), createElementBlock("table", _hoisted_17, [_cache[3] || (_cache[3] = createElementVNode("thead", null, [createElementVNode("tr", null, [
140
+ component.doc.events.length ? (openBlock(), createElementBlock("table", _hoisted_20, [_cache[3] || (_cache[3] = createElementVNode("thead", null, [createElementVNode("tr", null, [
113
141
  createElementVNode("th", null, "Event"),
114
142
  createElementVNode("th", null, "Payload"),
115
143
  createElementVNode("th", null, "Description")
@@ -118,10 +146,14 @@ var ComponentDocs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
118
146
  key: event.name,
119
147
  "data-event": event.name
120
148
  }, [
121
- createElementVNode("td", null, [createElementVNode("code", null, toDisplayString(event.name), 1)]),
122
- createElementVNode("td", null, [event.type ? (openBlock(), createElementBlock("code", _hoisted_19, toDisplayString(event.type), 1)) : createCommentVNode("", true)]),
149
+ createElementVNode("td", null, [createElementVNode("code", null, toDisplayString(event.name), 1), unref(modelLabel)(component.doc, event.name) ? (openBlock(), createElementBlock("code", {
150
+ key: 0,
151
+ title: `Bound two ways with ${unref(modelLabel)(component.doc, event.name)}, with the ${event.name.slice(7)} prop`,
152
+ "data-slot": "model"
153
+ }, toDisplayString(unref(modelLabel)(component.doc, event.name)), 9, _hoisted_22)) : createCommentVNode("", true)]),
154
+ createElementVNode("td", null, [event.type ? (openBlock(), createElementBlock("code", _hoisted_23, toDisplayString(event.type), 1)) : createCommentVNode("", true)]),
123
155
  createElementVNode("td", null, toDisplayString(event.description), 1)
124
- ], 8, _hoisted_18);
156
+ ], 8, _hoisted_21);
125
157
  }), 128))])])) : createCommentVNode("", true)
126
158
  ], 64)) : createCommentVNode("", true)], 8, _hoisted_2);
127
159
  }), 128))]);
@@ -1,9 +1,9 @@
1
1
  import { povesteConfig } from "../../util/config.js";
2
2
  import DevOnlyToolbarOpenInEditor_default from "../toolbar/DevOnlyToolbarOpenInEditor.js";
3
3
  import BaseEmpty_default from "../base/BaseEmpty.js";
4
- import { useComponentDocs } from "../../util/component-docs.js";
4
+ import { onlySections, useComponentDocs } from "../../util/component-docs.js";
5
5
  import ComponentDocs_default from "./ComponentDocs.js";
6
- import { computed, createBlock, createCommentVNode, createElementBlock, createTextVNode, createVNode, defineComponent, nextTick, normalizeClass, openBlock, ref, toRefs, unref, watch, watchEffect, withCtx } from "@poveste/vendors/vue";
6
+ import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, normalizeClass, openBlock, ref, toDisplayString, toRefs, unref, watch, watchEffect, withCtx } from "@poveste/vendors/vue";
7
7
  import { Icon } from "@poveste/vendors/iconify";
8
8
  import { useRoute, useRouter } from "@poveste/vendors/vue-router";
9
9
  import { markdownFiles } from "virtual:$poveste-markdown-files";
@@ -51,7 +51,8 @@ var StoryDocs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
51
51
  const emit = __emit;
52
52
  const { story } = toRefs(props);
53
53
  const { renderedDoc } = useStoryDoc(story);
54
- const { components } = useComponentDocs(computed(() => story.value?.id));
54
+ const { components: allComponents, pending, off } = useComponentDocs(computed(() => story.value?.id));
55
+ const components = computed(() => allComponents.value && onlySections(allComponents.value, story.value?.autoDocs));
55
56
  const router = useRouter();
56
57
  const fakeHost = `http://a.com`;
57
58
  function onClick(e) {
@@ -116,25 +117,48 @@ var StoryDocs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
116
117
  file: filePath.value,
117
118
  tooltip: "Edit docs in editor"
118
119
  }, null, 8, ["file"])) : createCommentVNode("", true)], 2)) : createCommentVNode("", true),
119
- !unref(renderedDoc) && !unref(components)?.length ? (openBlock(), createBlock(BaseEmpty_default, { key: 1 }, {
120
+ _ctx.__POVESTE_DEV__ && !unref(renderedDoc) && !components.value?.length && unref(pending) ? (openBlock(), createBlock(BaseEmpty_default, {
121
+ key: 1,
122
+ "data-testid": "docs-pending"
123
+ }, {
124
+ default: withCtx(() => [
125
+ createVNode(unref(Icon), {
126
+ icon: "carbon:circle-dash",
127
+ class: "w-8 h-8 opacity-50 mb-6 animate-spin"
128
+ }),
129
+ _cache[0] || (_cache[0] = createTextVNode(" Reading component types… ", -1)),
130
+ _cache[1] || (_cache[1] = createElementVNode("span", { class: "text-sm opacity-70 mt-2" }, "The first time can take a while.", -1))
131
+ ]),
132
+ _: 1
133
+ })) : !unref(pending) && !unref(renderedDoc) && !components.value?.length && unref(off) ? (openBlock(), createBlock(BaseEmpty_default, {
134
+ key: 2,
135
+ "data-testid": "docs-off"
136
+ }, {
120
137
  default: withCtx(() => [createVNode(unref(Icon), {
121
138
  icon: "carbon:document-unknown",
122
139
  class: "w-8 h-8 opacity-50 mb-6"
123
- }), _cache[0] || (_cache[0] = createTextVNode(" No documentation available ", -1))]),
140
+ }), createTextVNode(" " + toDisplayString(unref(off)), 1)]),
141
+ _: 1
142
+ })) : !unref(pending) && !unref(renderedDoc) && !components.value?.length ? (openBlock(), createBlock(BaseEmpty_default, { key: 3 }, {
143
+ default: withCtx(() => [createVNode(unref(Icon), {
144
+ icon: "carbon:document-unknown",
145
+ class: "w-8 h-8 opacity-50 mb-6"
146
+ }), _cache[2] || (_cache[2] = createTextVNode(" No documentation available ", -1))]),
124
147
  _: 1
125
148
  })) : createCommentVNode("", true),
126
149
  unref(renderedDoc) ? (openBlock(), createElementBlock("div", {
127
- key: 2,
150
+ key: 4,
128
151
  ref_key: "renderedEl",
129
152
  ref: renderedEl,
130
153
  class: "prose dark:prose-invert p-4 max-w-none",
131
154
  "data-testid": "story-docs",
132
155
  innerHTML: unref(renderedDoc)
133
156
  }, null, 8, _hoisted_1)) : createCommentVNode("", true),
134
- unref(components)?.length ? (openBlock(), createBlock(ComponentDocs_default, {
135
- key: 3,
136
- components: unref(components)
137
- }, null, 8, ["components"])) : createCommentVNode("", true)
157
+ components.value?.length ? (openBlock(), createBlock(ComponentDocs_default, {
158
+ key: 5,
159
+ components: components.value,
160
+ "story-file": unref(story).file?.filePath
161
+ }, null, 8, ["components", "story-file"])) : createCommentVNode("", true)
138
162
  ], 32);
139
163
  };
140
164
  }
@@ -2,6 +2,6 @@ import _plugin_vue_export_helper_default from "../../_virtual/_plugin-vue_export
2
2
  import StorySourceCode_vue_vue_type_script_setup_true_lang_default from "./StorySourceCode.vue_vue_type_script_setup_true_lang.js";
3
3
  /* empty css */
4
4
  //#region src/app/components/panel/StorySourceCode.vue
5
- var StorySourceCode_default = /*#__PURE__*/ _plugin_vue_export_helper_default(StorySourceCode_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-4b28d655"]]);
5
+ var StorySourceCode_default = /*#__PURE__*/ _plugin_vue_export_helper_default(StorySourceCode_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-cecbc93b"]]);
6
6
  //#endregion
7
7
  export { StorySourceCode_default as default };
@@ -1,6 +1,6 @@
1
1
  import { isDark } from "../../util/dark.js";
2
2
  import BaseEmpty_default from "../base/BaseEmpty.js";
3
- import { getDynamicSourceCode, getStaticSourceCode, loadGenerateSourceCode } from "../../util/docs.js";
3
+ import { getDynamicSourceCode, getStaticSourceCode, loadGenerateSourceCode, sourceLang } from "../../util/docs.js";
4
4
  import { getHighlighter } from "../../util/highlighter.js";
5
5
  import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, markRaw, nextTick, normalizeClass, onMounted, openBlock, ref, shallowRef, toDisplayString, unref, watch, watchEffect, withCtx } from "@poveste/vendors/vue";
6
6
  import { Icon } from "@poveste/vendors/iconify";
@@ -82,7 +82,7 @@ var StorySourceCode_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
82
82
  }
83
83
  });
84
84
  const sourceHtml = computed(() => displayedSourceCode.value ? highlighter.value?.codeToHtml(displayedSourceCode.value, {
85
- lang: "html",
85
+ lang: sourceLang(props.story),
86
86
  theme: isDark.value ? "github-dark" : "github-light-high-contrast"
87
87
  }) : "");
88
88
  let lastScroll = 0;
@@ -2,6 +2,6 @@ import _plugin_vue_export_helper_default from "../../_virtual/_plugin-vue_export
2
2
  import StoryResponsivePreview_vue_vue_type_script_setup_true_lang_default from "./StoryResponsivePreview.vue_vue_type_script_setup_true_lang.js";
3
3
  /* empty css */
4
4
  //#region src/app/components/story/StoryResponsivePreview.vue
5
- var StoryResponsivePreview_default = /*#__PURE__*/ _plugin_vue_export_helper_default(StoryResponsivePreview_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-a99edb14"]]);
5
+ var StoryResponsivePreview_default = /*#__PURE__*/ _plugin_vue_export_helper_default(StoryResponsivePreview_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-bbd56e9f"]]);
6
6
  //#endregion
7
7
  export { StoryResponsivePreview_default as default };
@@ -1,3 +1,4 @@
1
+ import { usePreviewDark } from "../../util/color-scheme.js";
1
2
  import { usePreviewSettingsStore } from "../../stores/preview-settings.js";
2
3
  import CheckerboardPattern_default from "../misc/CheckerboardPattern.js";
3
4
  import HatchedPattern_default from "../misc/HatchedPattern.js";
@@ -23,9 +24,10 @@ var StoryResponsivePreview_vue_vue_type_script_setup_true_lang_default = /*@__PU
23
24
  }
24
25
  },
25
26
  setup(__props) {
26
- useCssVars((_ctx) => ({ "v4ce71e65": unref(settings).backgroundColor }));
27
+ useCssVars((_ctx) => ({ "v59fa22e6": unref(settings).backgroundColor }));
27
28
  const props = __props;
28
29
  const settings = usePreviewSettingsStore().currentSettings;
30
+ const previewDark = usePreviewDark(settings);
29
31
  const resizing = ref(false);
30
32
  const onUnmountedCleanupFns = [];
31
33
  onUnmounted(() => {
@@ -127,7 +129,7 @@ var StoryResponsivePreview_vue_vue_type_script_setup_true_lang_default = /*@__PU
127
129
  ref: previewWrapper,
128
130
  class: "h-full overflow-auto relative"
129
131
  }, [createElementVNode("div", { class: normalizeClass(["rounded-lg relative", [
130
- __props.responsive ? "bg-white dark:bg-gray-700" : "",
132
+ __props.responsive ? unref(previewDark) ? "bg-gray-700" : "bg-white" : "",
131
133
  isResponsiveEnabled.value ? {
132
134
  "w-fit": !!finalWidth.value,
133
135
  "h-fit": !!finalHeight.value,
@@ -145,7 +147,7 @@ var StoryResponsivePreview_vue_vue_type_script_setup_true_lang_default = /*@__PU
145
147
  finalWidth: finalWidth.value,
146
148
  finalHeight: finalHeight.value,
147
149
  resizing: resizing.value
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-a99edb14></div><div class=\"absolute top-5 right-8 h-2 w-px bg-gray-400/25\" data-v-a99edb14></div><div class=\"absolute bottom-5 left-8 h-2 w-px bg-gray-400/25\" data-v-a99edb14></div><div class=\"absolute bottom-5 right-8 h-2 w-px bg-gray-400/25\" data-v-a99edb14></div><div class=\"absolute left-5 top-8 w-2 h-px bg-gray-400/25\" data-v-a99edb14></div><div class=\"absolute left-5 bottom-8 w-2 h-px bg-gray-400/25\" data-v-a99edb14></div><div class=\"absolute right-5 top-8 w-2 h-px bg-gray-400/25\" data-v-a99edb14></div><div class=\"absolute right-5 bottom-8 w-2 h-px bg-gray-400/25\" data-v-a99edb14></div>", 8))], 64)) : createCommentVNode("", true)], 2)], 10, _hoisted_3), isResponsiveEnabled.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
150
+ }, 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-bbd56e9f></div><div class=\"absolute top-5 right-8 h-2 w-px bg-gray-400/25\" data-v-bbd56e9f></div><div class=\"absolute bottom-5 left-8 h-2 w-px bg-gray-400/25\" data-v-bbd56e9f></div><div class=\"absolute bottom-5 right-8 h-2 w-px bg-gray-400/25\" data-v-bbd56e9f></div><div class=\"absolute left-5 top-8 w-2 h-px bg-gray-400/25\" data-v-bbd56e9f></div><div class=\"absolute left-5 bottom-8 w-2 h-px bg-gray-400/25\" data-v-bbd56e9f></div><div class=\"absolute right-5 top-8 w-2 h-px bg-gray-400/25\" data-v-bbd56e9f></div><div class=\"absolute right-5 bottom-8 w-2 h-px bg-gray-400/25\" data-v-bbd56e9f></div>", 8))], 64)) : createCommentVNode("", true)], 2)], 10, _hoisted_3), isResponsiveEnabled.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
149
151
  createVNode(unref(HstTooltip), {
150
152
  content: sizeTooltip.value,
151
153
  side: "right"
@@ -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-e0e9a8e1"]]);
5
+ var StoryVariantGridItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(StoryVariantGridItem_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-9a717688"]]);
6
6
  //#endregion
7
7
  export { StoryVariantGridItem_default as default };