@poveste/app 0.14.0 → 0.16.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 (126) hide show
  1. package/dist/app/style/main.pcss +18 -44
  2. package/dist/bundled/App.vue_vue_type_script_setup_true_lang.js +9 -7
  3. package/dist/bundled/app.css +91 -28
  4. package/dist/bundled/components/app/AppActions.vue_vue_type_script_setup_true_lang.js +44 -27
  5. package/dist/bundled/components/app/ShortcutTooltip.js +5 -0
  6. package/dist/bundled/components/app/ShortcutTooltip.vue_vue_type_script_setup_true_lang.js +27 -0
  7. package/dist/bundled/components/app/TopBarChipItem.js +1 -1
  8. package/dist/bundled/components/base/BaseDropdown.js +6 -0
  9. package/dist/bundled/components/base/BaseDropdown.vue_vue_type_script_setup_true_lang.js +68 -0
  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 +19 -19
  12. package/dist/bundled/components/base/BaseSelect.js +1 -0
  13. package/dist/bundled/components/base/BaseSelect.vue_vue_type_script_setup_true_lang.js +194 -33
  14. package/dist/bundled/components/base/BaseSplitPane.js +1 -1
  15. package/dist/bundled/components/base/BaseSplitPane.vue_vue_type_script_setup_true_lang.js +65 -4
  16. package/dist/bundled/components/command/PromptSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  17. package/dist/bundled/components/panel/ControlsComponentPropItem.vue_vue_type_script_setup_true_lang.js +24 -16
  18. package/dist/bundled/components/panel/ControlsComponentProps.vue_vue_type_script_setup_true_lang.js +9 -6
  19. package/dist/bundled/components/panel/ControlsComponentState.vue_vue_type_script_setup_true_lang.js +9 -6
  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 +96 -52
  22. package/dist/bundled/components/panel/StoryEvent.vue_vue_type_script_setup_true_lang.js +5 -5
  23. package/dist/bundled/components/panel/StorySidePanel.vue_vue_type_script_setup_true_lang.js +2 -1
  24. package/dist/bundled/components/panel/StorySourceCode.js +1 -1
  25. package/dist/bundled/components/panel/StorySourceCode.vue_vue_type_script_setup_true_lang.js +24 -18
  26. package/dist/bundled/components/search/SearchItemContent.vue_vue_type_script_setup_true_lang.js +2 -1
  27. package/dist/bundled/components/search/SearchPane.vue_vue_type_script_setup_true_lang.js +1 -2
  28. package/dist/bundled/components/story/StoryResponsivePreview.js +1 -1
  29. package/dist/bundled/components/story/StoryResponsivePreview.vue_vue_type_script_setup_true_lang.js +52 -45
  30. package/dist/bundled/components/story/StoryVariantGridItem.js +1 -1
  31. package/dist/bundled/components/story/StoryVariantGridItem.vue_vue_type_script_setup_true_lang.js +22 -20
  32. package/dist/bundled/components/story/StoryVariantSingle.js +1 -1
  33. package/dist/bundled/components/story/StoryVariantSingle.vue_vue_type_script_setup_true_lang.js +2 -1
  34. package/dist/bundled/components/story/StoryVariantSinglePreviewRemote.vue_vue_type_script_setup_true_lang.js +9 -6
  35. package/dist/bundled/components/story/StoryView.vue_vue_type_script_setup_true_lang.js +5 -1
  36. package/dist/bundled/components/toolbar/DevOnlyToolbarOpenInEditor.vue_vue_type_script_setup_true_lang.js +15 -12
  37. package/dist/bundled/components/toolbar/ToolbarBackground.vue_vue_type_script_setup_true_lang.js +20 -16
  38. package/dist/bundled/components/toolbar/ToolbarNewTab.vue_vue_type_script_setup_true_lang.js +16 -13
  39. package/dist/bundled/components/toolbar/ToolbarResponsiveSize.vue_vue_type_script_setup_true_lang.js +35 -24
  40. package/dist/bundled/components/toolbar/ToolbarTextDirection.vue_vue_type_script_setup_true_lang.js +15 -12
  41. package/dist/bundled/components/toolbar/ToolbarTitle.js +1 -1
  42. package/dist/bundled/components/toolbar/ToolbarTitle.vue_vue_type_script_setup_true_lang.js +1 -1
  43. package/dist/bundled/components/tree/StoryGroup.vue_vue_type_script_setup_true_lang.js +2 -2
  44. package/dist/bundled/components/tree/StoryList.vue_vue_type_script_setup_true_lang.js +3 -3
  45. package/dist/bundled/components/tree/StoryListFolder.js +1 -1
  46. package/dist/bundled/components/tree/StoryListFolder.vue_vue_type_script_setup_true_lang.js +3 -3
  47. package/dist/bundled/components/tree/StoryListItem.js +1 -1
  48. package/dist/bundled/components/tree/StoryListItem.vue_vue_type_script_setup_true_lang.js +3 -3
  49. package/dist/bundled/index.js +0 -13
  50. package/dist/bundled/sandbox.js +5 -3
  51. package/dist/bundled/stores/story.js +2 -2
  52. package/dist/bundled/util/commands.js +1 -1
  53. package/dist/bundled/util/dark.js +1 -1
  54. package/dist/bundled/util/events.js +1 -1
  55. package/dist/bundled/util/grid-slots.js +1 -1
  56. package/dist/bundled/util/icons.generated.js +4 -2
  57. package/dist/bundled/util/keyboard.js +8 -14
  58. package/dist/bundled/util/mapping.js +2 -2
  59. package/dist/bundled/util/render-tracker.js +33 -0
  60. package/dist/bundled/util/scroll.js +26 -5
  61. package/dist/bundled/util/state.js +105 -5
  62. package/dist/bundled/util/variant.js +12 -2
  63. package/dist/style.css +753 -357
  64. package/package.json +28 -28
  65. package/src/__tests__/base-select.spec.ts +25 -0
  66. package/src/__tests__/render-tracker.spec.ts +38 -0
  67. package/src/__tests__/reset.spec.ts +53 -0
  68. package/src/__tests__/state-clone.spec.ts +55 -1
  69. package/src/__tests__/state-types.spec.ts +175 -0
  70. package/src/app/App.vue +44 -35
  71. package/src/app/components/app/AppActions.vue +42 -30
  72. package/src/app/components/app/ShortcutTooltip.vue +29 -0
  73. package/src/app/components/app/TopBarChipItem.vue +1 -1
  74. package/src/app/components/base/BaseDropdown.vue +142 -0
  75. package/src/app/components/base/BaseEmpty.vue +1 -1
  76. package/src/app/components/base/BaseListItemLink.vue +4 -2
  77. package/src/app/components/base/BaseOverflowMenu.vue +27 -21
  78. package/src/app/components/base/BaseSelect.vue +270 -41
  79. package/src/app/components/base/BaseSplitPane.vue +75 -4
  80. package/src/app/components/command/PromptSelect.vue +1 -1
  81. package/src/app/components/panel/ControlsComponentPropItem.vue +29 -17
  82. package/src/app/components/panel/ControlsComponentProps.vue +7 -5
  83. package/src/app/components/panel/ControlsComponentState.vue +7 -5
  84. package/src/app/components/panel/PaneTabs.vue +6 -6
  85. package/src/app/components/panel/StatePresets.vue +116 -74
  86. package/src/app/components/panel/StoryEvent.vue +10 -9
  87. package/src/app/components/panel/StorySidePanel.vue +2 -1
  88. package/src/app/components/panel/StorySourceCode.vue +51 -44
  89. package/src/app/components/search/SearchItemContent.vue +2 -1
  90. package/src/app/components/search/SearchPane.vue +2 -3
  91. package/src/app/components/story/StoryResponsivePreview.vue +61 -29
  92. package/src/app/components/story/StoryVariantGridItem.vue +20 -19
  93. package/src/app/components/story/StoryVariantSingle.vue +1 -0
  94. package/src/app/components/story/StoryVariantSinglePreviewRemote.vue +14 -8
  95. package/src/app/components/story/StoryView.vue +4 -1
  96. package/src/app/components/toolbar/DevOnlyToolbarOpenInEditor.vue +14 -12
  97. package/src/app/components/toolbar/ToolbarBackground.vue +22 -23
  98. package/src/app/components/toolbar/ToolbarNewTab.vue +14 -12
  99. package/src/app/components/toolbar/ToolbarResponsiveSize.vue +31 -25
  100. package/src/app/components/toolbar/ToolbarTextDirection.vue +14 -10
  101. package/src/app/components/toolbar/ToolbarTitle.vue +2 -2
  102. package/src/app/components/tree/StoryGroup.vue +2 -2
  103. package/src/app/components/tree/StoryList.vue +2 -2
  104. package/src/app/components/tree/StoryListFolder.vue +2 -2
  105. package/src/app/components/tree/StoryListItem.vue +1 -1
  106. package/src/app/index.ts +0 -17
  107. package/src/app/sandbox.ts +16 -3
  108. package/src/app/stores/story.ts +2 -2
  109. package/src/app/style/main.pcss +18 -44
  110. package/src/app/types.ts +4 -4
  111. package/src/app/util/commands.ts +1 -1
  112. package/src/app/util/dark.ts +1 -1
  113. package/src/app/util/env.ts +0 -1
  114. package/src/app/util/events.ts +6 -5
  115. package/src/app/util/grid-slots.ts +1 -1
  116. package/src/app/util/icons.generated.ts +2 -2
  117. package/src/app/util/keyboard.ts +7 -11
  118. package/src/app/util/mapping.ts +2 -2
  119. package/src/app/util/render-tracker.ts +31 -0
  120. package/src/app/util/scroll.ts +47 -9
  121. package/src/app/util/state.ts +141 -8
  122. package/src/app/util/variant.ts +12 -2
  123. package/dist/app/style/floating.pcss +0 -40
  124. package/dist/bundled/util/tooltip.js +0 -14
  125. package/src/app/style/floating.pcss +0 -40
  126. package/src/app/util/tooltip.ts +0 -13
@@ -1,9 +1,10 @@
1
+ import BaseDropdown_default from "./BaseDropdown.js";
1
2
  import { useResizeObserver } from "@poveste/vendors/vue-use";
2
- import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, h, onBeforeUnmount, openBlock, reactive, ref, renderSlot, resolveComponent, unref, withCtx } from "@poveste/vendors/vue";
3
+ import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, h, onBeforeUnmount, openBlock, reactive, ref, renderSlot, unref, withCtx } from "@poveste/vendors/vue";
3
4
  import { Icon } from "@poveste/vendors/iconify";
4
5
  //#region src/app/components/base/BaseOverflowMenu.vue?vue&type=script&setup=true&lang.ts
5
6
  var _hoisted_1 = {
6
- role: "button",
7
+ "aria-label": "More",
7
8
  class: "cursor-pointer hover:bg-primary-50 dark:hover:bg-primary-900 w-8 h-full flex items-center justify-center absolute top-0 right-0"
8
9
  };
9
10
  var _hoisted_2 = { class: "flex flex-col items-stretch" };
@@ -13,16 +14,16 @@ var BaseOverflowMenu_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
13
14
  setup(__props) {
14
15
  const el = ref();
15
16
  const availableWidth = ref(0);
16
- useResizeObserver(el, (entries) => {
17
- const containerWidth = entries[0].contentRect.width;
18
- availableWidth.value = containerWidth - overflowButtonWidth;
17
+ useResizeObserver(el, ([entry]) => {
18
+ if (!entry) return;
19
+ availableWidth.value = entry.contentRect.width - overflowButtonWidth;
19
20
  });
20
21
  const children = ref(/* @__PURE__ */ new Map());
21
22
  const visibleChildrenCount = computed(() => {
22
23
  let width = 0;
23
24
  const c = [...children.value.values()].sort((a, b) => a.index - b.index);
24
- for (let i = 0; i < c.length; i++) {
25
- width += c[i].width;
25
+ for (const [i, child] of c.entries()) {
26
+ width += child.width;
26
27
  if (width > availableWidth.value) return i;
27
28
  }
28
29
  return c.length;
@@ -39,10 +40,10 @@ var BaseOverflowMenu_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
39
40
  width: 0,
40
41
  index: props.index
41
42
  });
42
- useResizeObserver(el, (entries) => {
43
+ useResizeObserver(el, ([entry]) => {
43
44
  const element = el.value;
44
- if (!element) return;
45
- const width = entries[0].contentRect.width;
45
+ if (!element || !entry) return;
46
+ const width = entry.contentRect.width;
46
47
  if (!children.value.has(element)) children.value.set(element, state);
47
48
  state.width = width;
48
49
  });
@@ -54,25 +55,24 @@ var BaseOverflowMenu_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
54
55
  return () => h("div", {
55
56
  ref: el,
56
57
  style: { visibility: visible.value ? "visible" : "hidden" }
57
- }, slots.default());
58
+ }, slots["default"]?.());
58
59
  }
59
60
  };
60
61
  /**
61
62
  * Wraps each child with a <ChildWrapper>
62
63
  */
63
- function ChildrenRender(props, { slots }) {
64
- const [fragment] = slots.default();
65
- return fragment.children.map((vnode, index) => h(ChildWrapper, { index }, () => [vnode]));
64
+ function ChildrenRender(_props, { slots }) {
65
+ const children = slots["default"]?.()[0]?.children;
66
+ return Array.isArray(children) ? children.map((vnode, index) => h(ChildWrapper, { index }, () => [vnode])) : [];
66
67
  }
67
68
  /**
68
69
  * Only renders a part of a children list
69
70
  */
70
71
  function ChildrenSlice(props, { slots }) {
71
- const [fragment] = slots.default();
72
- return fragment.children.slice(props.start, props.end);
72
+ const children = slots["default"]?.()[0]?.children;
73
+ return Array.isArray(children) ? children.slice(props.start, props.end) : [];
73
74
  }
74
75
  return (_ctx, _cache) => {
75
- const _component_VDropdown = resolveComponent("VDropdown");
76
76
  return openBlock(), createElementBlock("div", {
77
77
  ref_key: "el",
78
78
  ref: el,
@@ -80,12 +80,12 @@ var BaseOverflowMenu_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
80
80
  }, [createVNode(ChildrenRender, null, {
81
81
  default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
82
82
  _: 3
83
- }), visibleChildrenCount.value < children.value.size ? (openBlock(), createBlock(_component_VDropdown, { key: 0 }, {
83
+ }), visibleChildrenCount.value < children.value.size ? (openBlock(), createBlock(BaseDropdown_default, { key: 0 }, {
84
84
  popper: withCtx(() => [createElementVNode("div", _hoisted_2, [createVNode(ChildrenSlice, { start: visibleChildrenCount.value }, {
85
85
  default: withCtx(() => [renderSlot(_ctx.$slots, "overflow")]),
86
86
  _: 3
87
87
  }, 8, ["start"])])]),
88
- default: withCtx(() => [createElementVNode("div", _hoisted_1, [createVNode(unref(Icon), {
88
+ default: withCtx(() => [createElementVNode("button", _hoisted_1, [createVNode(unref(Icon), {
89
89
  icon: "carbon:caret-down",
90
90
  class: "w-4 h-4 opacity-50 group-hover:opacity-100"
91
91
  })])]),
@@ -1,4 +1,5 @@
1
1
  import BaseSelect_vue_vue_type_script_setup_true_lang_default from "./BaseSelect.vue_vue_type_script_setup_true_lang.js";
2
+ /* empty css */
2
3
  //#region src/app/components/base/BaseSelect.vue
3
4
  var BaseSelect_default = BaseSelect_vue_vue_type_script_setup_true_lang_default;
4
5
  //#endregion
@@ -1,57 +1,218 @@
1
- import { Fragment, computed, createBlock, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, mergeProps, openBlock, renderList, renderSlot, toDisplayString, unref, withCtx } from "@poveste/vendors/vue";
1
+ import { refAutoReset } from "@poveste/vendors/vue-use";
2
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, normalizeClass, onMounted, openBlock, ref, renderList, renderSlot, shallowRef, toDisplayString, unref, useId, watch, withCtx, withModifiers } from "@poveste/vendors/vue";
2
3
  import { Icon } from "@poveste/vendors/iconify";
3
- import { Dropdown } from "@poveste/vendors/floating-vue";
4
+ import { PopoverAnchor, PopoverContent, PopoverPortal, PopoverRoot, portalTarget } from "@poveste/controls";
4
5
  //#region src/app/components/base/BaseSelect.vue?vue&type=script&setup=true&lang.ts
5
- var _hoisted_1 = { class: "cursor-pointer w-full outline-none px-2 h-[27px] -my-1 border border-solid border-black/25 dark:border-white/25 hover:border-primary-500 dark:hover:border-primary-500 rounded-sm flex gap-2 items-center leading-normal" };
6
+ var _hoisted_1 = [
7
+ "aria-label",
8
+ "aria-expanded",
9
+ "aria-controls",
10
+ "aria-activedescendant"
11
+ ];
6
12
  var _hoisted_2 = { class: "flex-1 truncate" };
7
- var _hoisted_3 = { class: "flex flex-col bg-gray-50 dark:bg-gray-700" };
8
- var _hoisted_4 = ["onClick"];
13
+ var _hoisted_3 = ["aria-label"];
14
+ var _hoisted_4 = [
15
+ "id",
16
+ "aria-selected",
17
+ "onMousemove",
18
+ "onClick"
19
+ ];
9
20
  var BaseSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
10
21
  __name: "BaseSelect",
11
22
  props: {
12
23
  modelValue: {},
13
- options: {}
24
+ options: {},
25
+ label: {}
14
26
  },
15
27
  emits: ["update:modelValue", "select"],
16
- setup(__props, { emit: __emit }) {
28
+ setup(__props, { expose: __expose, emit: __emit }) {
17
29
  const props = __props;
18
30
  const emit = __emit;
19
31
  const formattedOptions = computed(() => {
20
32
  if (Array.isArray(props.options)) return Object.fromEntries(props.options.map((value) => [value, value]));
21
33
  return props.options;
22
34
  });
35
+ const entries = computed(() => Object.entries(formattedOptions.value));
23
36
  const selectedLabel = computed(() => formattedOptions.value[props.modelValue]);
24
- function selectValue(value, hide) {
25
- emit("update:modelValue", value);
26
- emit("select", value);
27
- hide();
37
+ const id = useId();
38
+ const listboxId = `${id}-listbox`;
39
+ function optionId(index) {
40
+ return `${id}-option-${index}`;
28
41
  }
42
+ const combobox = ref();
43
+ const open = ref(false);
44
+ const activeIndex = ref(-1);
45
+ function openList(index) {
46
+ const selected = entries.value.findIndex(([value]) => value === props.modelValue);
47
+ activeIndex.value = index ?? Math.max(selected, 0);
48
+ open.value = true;
49
+ }
50
+ const typed = refAutoReset("", 500);
51
+ function isTypeaheadKey(event) {
52
+ if (event.ctrlKey || event.metaKey || event.altKey || event.key.length !== 1) return false;
53
+ return event.key !== " " || typed.value !== "";
54
+ }
55
+ function typeahead(char) {
56
+ const previous = typed.value;
57
+ typed.value = previous + char.toLowerCase();
58
+ const repeated = [...typed.value].every((c) => c === typed.value[0]);
59
+ const search = repeated ? typed.value.charAt(0) : typed.value;
60
+ const start = repeated ? activeIndex.value + 1 : Math.max(activeIndex.value, 0);
61
+ const count = entries.value.length;
62
+ for (let offset = 0; offset < count; offset++) {
63
+ const index = (start + offset) % count;
64
+ if (entries.value[index]?.[1].toLowerCase().startsWith(search)) {
65
+ activeIndex.value = index;
66
+ return;
67
+ }
68
+ }
69
+ }
70
+ function close() {
71
+ open.value = false;
72
+ }
73
+ function choose(index) {
74
+ const entry = entries.value[index];
75
+ if (entry) {
76
+ emit("update:modelValue", entry[0]);
77
+ emit("select", entry[0]);
78
+ }
79
+ close();
80
+ combobox.value?.focus();
81
+ }
82
+ function onKeydown(event) {
83
+ const last = entries.value.length - 1;
84
+ if (isTypeaheadKey(event)) {
85
+ event.preventDefault();
86
+ if (!open.value) openList();
87
+ typeahead(event.key);
88
+ return;
89
+ }
90
+ if (!open.value) {
91
+ if ([
92
+ "ArrowDown",
93
+ "ArrowUp",
94
+ "Enter",
95
+ " ",
96
+ "Home",
97
+ "End"
98
+ ].includes(event.key)) {
99
+ event.preventDefault();
100
+ openList(event.key === "Home" ? 0 : event.key === "End" ? last : void 0);
101
+ }
102
+ return;
103
+ }
104
+ switch (event.key) {
105
+ case "ArrowDown":
106
+ event.preventDefault();
107
+ activeIndex.value = Math.min(activeIndex.value + 1, last);
108
+ break;
109
+ case "ArrowUp":
110
+ event.preventDefault();
111
+ if (event.altKey) choose(activeIndex.value);
112
+ else activeIndex.value = Math.max(activeIndex.value - 1, 0);
113
+ break;
114
+ case "Home":
115
+ event.preventDefault();
116
+ activeIndex.value = 0;
117
+ break;
118
+ case "End":
119
+ event.preventDefault();
120
+ activeIndex.value = last;
121
+ break;
122
+ case "Enter":
123
+ case " ":
124
+ event.preventDefault();
125
+ choose(activeIndex.value);
126
+ break;
127
+ case "Escape":
128
+ event.preventDefault();
129
+ close();
130
+ break;
131
+ case "Tab": choose(activeIndex.value);
132
+ }
133
+ }
134
+ const target = shallowRef();
135
+ onMounted(() => {
136
+ target.value = portalTarget();
137
+ });
138
+ function keepOpenOnTheTrigger(event) {
139
+ if (combobox.value?.contains(event.target)) event.preventDefault();
140
+ }
141
+ watch([open, activeIndex], async ([isOpen, index]) => {
142
+ if (!isOpen || index < 0) return;
143
+ await nextTick();
144
+ target.value?.ownerDocument.getElementById(optionId(index))?.scrollIntoView({ block: "nearest" });
145
+ });
146
+ __expose({ focus: () => combobox.value?.focus() });
29
147
  return (_ctx, _cache) => {
30
- return openBlock(), createBlock(unref(Dropdown), {
31
- class: "poveste-base-select",
32
- "auto-size": "",
33
- "auto-boundary-max-size": ""
148
+ return openBlock(), createBlock(unref(PopoverRoot), {
149
+ open: open.value,
150
+ "onUpdate:open": _cache[4] || (_cache[4] = ($event) => open.value = $event)
34
151
  }, {
35
- popper: withCtx(({ hide }) => [createElementVNode("div", _hoisted_3, [(openBlock(true), createElementBlock(Fragment, null, renderList(formattedOptions.value, (label, value) => {
36
- return openBlock(), createElementBlock("div", mergeProps({ ref_for: true }, {
37
- ..._ctx.$attrs,
38
- class: null,
39
- style: null
152
+ default: withCtx(() => [createVNode(unref(PopoverAnchor), {
153
+ "as-child": "",
154
+ class: "poveste-base-select"
155
+ }, {
156
+ default: withCtx(() => [createElementVNode("div", {
157
+ ref_key: "combobox",
158
+ ref: combobox,
159
+ role: "combobox",
160
+ tabindex: "0",
161
+ "aria-label": __props.label,
162
+ "aria-haspopup": "listbox",
163
+ "aria-expanded": open.value,
164
+ "aria-controls": open.value ? listboxId : void 0,
165
+ "aria-activedescendant": open.value && activeIndex.value >= 0 ? optionId(activeIndex.value) : void 0,
166
+ class: "cursor-pointer w-full outline-none focus-visible:border-primary-500 px-2 h-[27px] -my-1 border border-solid border-black/25 dark:border-white/25 hover:border-primary-500 dark:hover:border-primary-500 rounded-sm flex gap-2 items-center leading-normal",
167
+ onClick: _cache[0] || (_cache[0] = ($event) => open.value ? close() : openList()),
168
+ onKeydown
169
+ }, [createElementVNode("div", _hoisted_2, [renderSlot(_ctx.$slots, "default", { label: selectedLabel.value }, () => [createTextVNode(toDisplayString(selectedLabel.value), 1)])]), createVNode(unref(Icon), {
170
+ icon: "carbon:chevron-sort",
171
+ class: "w-4 h-4 flex-none ml-auto"
172
+ })], 40, _hoisted_1)]),
173
+ _: 3
174
+ }), target.value ? (openBlock(), createBlock(unref(PopoverPortal), {
175
+ key: 0,
176
+ to: target.value
177
+ }, {
178
+ default: withCtx(() => [createVNode(unref(PopoverContent), {
179
+ class: "poveste-base-select-popper",
180
+ align: "start",
181
+ "side-offset": 6,
182
+ "collision-padding": 8,
183
+ onOpenAutoFocus: _cache[2] || (_cache[2] = withModifiers(() => {}, ["prevent"])),
184
+ onCloseAutoFocus: _cache[3] || (_cache[3] = withModifiers(() => {}, ["prevent"])),
185
+ onInteractOutside: keepOpenOnTheTrigger
40
186
  }, {
41
- key: label,
42
- class: ["px-2 py-1 cursor-pointer hover:bg-primary-100 dark:hover:bg-primary-700", { "bg-primary-200 dark:bg-primary-800": props.modelValue === value }],
43
- onClick: ($event) => selectValue(value, hide)
44
- }), [renderSlot(_ctx.$slots, "option", {
45
- label,
46
- value
47
- }, () => [createTextVNode(toDisplayString(label), 1)])], 16, _hoisted_4);
48
- }), 128))])]),
49
- default: withCtx(() => [createElementVNode("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [renderSlot(_ctx.$slots, "default", { label: selectedLabel.value }, () => [createTextVNode(toDisplayString(selectedLabel.value), 1)])]), createVNode(unref(Icon), {
50
- icon: "carbon:chevron-sort",
51
- class: "w-4 h-4 flex-none ml-auto"
52
- })])]),
187
+ default: withCtx(() => [createElementVNode("div", {
188
+ id: listboxId,
189
+ role: "listbox",
190
+ "aria-label": __props.label,
191
+ class: "poveste-base-select-options flex flex-col bg-gray-50 dark:bg-gray-700 text-gray-900 dark:text-gray-100"
192
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(entries.value, ([value, optionLabel], index) => {
193
+ return openBlock(), createElementBlock("div", {
194
+ id: optionId(index),
195
+ key: value,
196
+ role: "option",
197
+ "aria-selected": value === __props.modelValue,
198
+ class: normalizeClass(["px-2 py-1 cursor-pointer hover:bg-primary-100 dark:hover:bg-primary-700", {
199
+ "bg-primary-200 dark:bg-primary-800": value === __props.modelValue,
200
+ "outline outline-2 -outline-offset-2 outline-primary-500": index === activeIndex.value
201
+ }]),
202
+ onMousedown: _cache[1] || (_cache[1] = withModifiers(() => {}, ["prevent"])),
203
+ onMousemove: ($event) => activeIndex.value = index,
204
+ onClick: ($event) => choose(index)
205
+ }, [renderSlot(_ctx.$slots, "option", {
206
+ label: optionLabel,
207
+ value
208
+ }, () => [createTextVNode(toDisplayString(optionLabel), 1)])], 42, _hoisted_4);
209
+ }), 128))], 8, _hoisted_3)]),
210
+ _: 3
211
+ })]),
212
+ _: 3
213
+ }, 8, ["to"])) : createCommentVNode("", true)]),
53
214
  _: 3
54
- });
215
+ }, 8, ["open"]);
55
216
  };
56
217
  }
57
218
  });
@@ -2,6 +2,6 @@ import _plugin_vue_export_helper_default from "../../_virtual/_plugin-vue_export
2
2
  import BaseSplitPane_vue_vue_type_script_setup_true_lang_default from "./BaseSplitPane.vue_vue_type_script_setup_true_lang.js";
3
3
  /* empty css */
4
4
  //#region src/app/components/base/BaseSplitPane.vue
5
- var BaseSplitPane_default = /*#__PURE__*/ _plugin_vue_export_helper_default(BaseSplitPane_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-1e09b1b3"]]);
5
+ var BaseSplitPane_default = /*#__PURE__*/ _plugin_vue_export_helper_default(BaseSplitPane_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-c01bd041"]]);
6
6
  //#endregion
7
7
  export { BaseSplitPane_default as default };
@@ -1,6 +1,17 @@
1
- import { computed, createCommentVNode, createElementBlock, defineComponent, normalizeClass, normalizeStyle, onUnmounted, openBlock, ref, renderSlot, watch, withModifiers } from "@poveste/vendors/vue";
1
+ import { computed, createCommentVNode, createElementBlock, defineComponent, normalizeClass, normalizeStyle, onUnmounted, openBlock, ref, renderSlot, unref, useId, watch, withModifiers } from "@poveste/vendors/vue";
2
2
  //#region src/app/components/base/BaseSplitPane.vue?vue&type=script&setup=true&lang.ts
3
+ var _hoisted_1 = ["id"];
4
+ var _hoisted_2 = [
5
+ "aria-label",
6
+ "aria-orientation",
7
+ "aria-controls",
8
+ "aria-valuenow",
9
+ "aria-valuemin",
10
+ "aria-valuemax"
11
+ ];
3
12
  var SAVE_PREFIX = "__poveste";
13
+ var STEP = 1;
14
+ var PAGE_STEP = 10;
4
15
  var BaseSplitPane_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
5
16
  __name: "BaseSplitPane",
6
17
  props: {
@@ -47,6 +58,16 @@ var BaseSplitPane_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
47
58
  default: true
48
59
  },
49
60
  /**
61
+ * What the divider is called to a screen reader.
62
+ *
63
+ * Four are on screen at once and they resize different things, so a shared
64
+ * default would announce four identical separators.
65
+ */
66
+ label: {
67
+ type: String,
68
+ default: "Resize panels"
69
+ },
70
+ /**
50
71
  * Whether the first pane exists at all.
51
72
  *
52
73
  * Dropping it here rather than at the call site keeps the other slot at one
@@ -149,6 +170,36 @@ var BaseSplitPane_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
149
170
  watch(hasBothPanes, (both) => {
150
171
  if (!both && dragging.value) dragEnd();
151
172
  });
173
+ function moveBy(amount) {
174
+ currentSplit.value = Math.min(props.max, Math.max(props.min, boundSplit.value + amount));
175
+ }
176
+ function onKeydown(event) {
177
+ const back = props.orientation === "landscape" ? "ArrowLeft" : "ArrowUp";
178
+ const forward = props.orientation === "landscape" ? "ArrowRight" : "ArrowDown";
179
+ switch (event.key) {
180
+ case back:
181
+ moveBy(-STEP);
182
+ break;
183
+ case forward:
184
+ moveBy(STEP);
185
+ break;
186
+ case "PageUp":
187
+ moveBy(-PAGE_STEP);
188
+ break;
189
+ case "PageDown":
190
+ moveBy(PAGE_STEP);
191
+ break;
192
+ case "Home":
193
+ currentSplit.value = props.min;
194
+ break;
195
+ case "End":
196
+ currentSplit.value = props.max;
197
+ break;
198
+ default: return;
199
+ }
200
+ event.preventDefault();
201
+ }
202
+ const firstPaneId = useId();
152
203
  function removeDragListeners() {
153
204
  window.removeEventListener("mousemove", dragMove);
154
205
  window.removeEventListener("mouseup", dragEnd);
@@ -168,6 +219,7 @@ var BaseSplitPane_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
168
219
  }])
169
220
  }, [__props.showFirst ? (openBlock(), createElementBlock("div", {
170
221
  key: 0,
222
+ id: unref(firstPaneId),
171
223
  class: normalizeClass(["relative top-0 left-0 z-20", {
172
224
  "pointer-events-none": dragging.value,
173
225
  "border-r border-gray-300/30 dark:border-gray-800": __props.orientation === "landscape" && __props.showDivider && hasBothPanes.value,
@@ -176,14 +228,23 @@ var BaseSplitPane_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
176
228
  style: normalizeStyle(leftStyle.value)
177
229
  }, [renderSlot(_ctx.$slots, "first", {}, void 0, true), hasBothPanes.value ? (openBlock(), createElementBlock("div", {
178
230
  key: 0,
179
- class: normalizeClass(["dragger absolute z-100 hover:bg-primary-500/50 transition-colors duration-150 delay-150", {
231
+ role: "separator",
232
+ tabindex: "0",
233
+ "aria-label": __props.label,
234
+ "aria-orientation": __props.orientation === "landscape" ? "vertical" : "horizontal",
235
+ "aria-controls": unref(firstPaneId),
236
+ "aria-valuenow": Math.round(boundSplit.value),
237
+ "aria-valuemin": __props.min,
238
+ "aria-valuemax": __props.max,
239
+ class: normalizeClass(["dragger absolute z-100 hover:bg-primary-500/50 focus-visible:bg-primary-500/50 focus-visible:outline-2 focus-visible:outline-primary-500 transition-colors duration-150 delay-150", {
180
240
  "top-0 bottom-0 cursor-ew-resize": __props.orientation === "landscape",
181
241
  "left-0 right-0 cursor-ns-resize": __props.orientation === "portrait",
182
242
  [`dragger-offset-${__props.draggerOffset}`]: true,
183
243
  "bg-primary-500/25": dragging.value
184
244
  }]),
185
- onMousedown: withModifiers(dragStart, ["prevent"])
186
- }, null, 34)) : createCommentVNode("", true)], 6)) : createCommentVNode("", true), __props.showLast ? (openBlock(), createElementBlock("div", {
245
+ onMousedown: withModifiers(dragStart, ["prevent"]),
246
+ onKeydown
247
+ }, null, 42, _hoisted_2)) : createCommentVNode("", true)], 14, _hoisted_1)) : createCommentVNode("", true), __props.showLast ? (openBlock(), createElementBlock("div", {
187
248
  key: 1,
188
249
  class: normalizeClass(["relative bottom-0 right-0", {
189
250
  "pointer-events-none": dragging.value,
@@ -60,7 +60,7 @@ var PromptSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
60
60
  });
61
61
  const { selectedIndex, selectNext, selectPrevious } = useSelection(formattedOptions);
62
62
  function selectIndex(index) {
63
- const result = formattedOptions.value[index].value;
63
+ const result = formattedOptions.value[index]?.value;
64
64
  if (result) model.value = result;
65
65
  }
66
66
  return (_ctx, _cache) => {
@@ -1,7 +1,12 @@
1
- import { computed, createBlock, createCommentVNode, createVNode, defineComponent, normalizeClass, openBlock, resolveDirective, resolveDynamicComponent, unref, withCtx, withDirectives, withModifiers } from "@poveste/vendors/vue";
1
+ import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, openBlock, resolveDynamicComponent, unref, withCtx } from "@poveste/vendors/vue";
2
2
  import { Icon } from "@poveste/vendors/iconify";
3
- import { HstCheckbox, HstJson, HstNumber, HstText } from "@poveste/controls";
3
+ import { HstCheckbox, HstJson, HstNumber, HstText, HstTooltip } from "@poveste/controls";
4
4
  //#region src/app/components/panel/ControlsComponentPropItem.vue?vue&type=script&setup=true&lang.ts
5
+ var _hoisted_1 = {
6
+ key: 0,
7
+ class: "flex items-end hover:bg-primary-100 dark:hover:bg-primary-800"
8
+ };
9
+ var _hoisted_2 = ["aria-label", "disabled"];
5
10
  var ControlsComponentPropItem_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
6
11
  __name: "ControlsComponentPropItem",
7
12
  props: {
@@ -33,26 +38,29 @@ var ControlsComponentPropItem_vue_vue_type_script_setup_true_lang_default = /*@_
33
38
  }
34
39
  const canReset = computed(() => props.variant.state?._hPropState?.[props.component.index] && props.definition.name in props.variant.state._hPropState[props.component.index]);
35
40
  return (_ctx, _cache) => {
36
- const _directive_tooltip = resolveDirective("tooltip");
37
- return comp.value ? (openBlock(), createBlock(resolveDynamicComponent(comp.value), {
38
- key: 0,
41
+ return comp.value ? (openBlock(), createElementBlock("div", _hoisted_1, [(openBlock(), createBlock(resolveDynamicComponent(comp.value), {
39
42
  modelValue: model.value,
40
- "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => model.value = $event),
43
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => model.value = $event),
41
44
  placeholder: model.value === void 0 ? __props.definition?.default : null,
42
- class: "poveste-controls-component-prop-item",
45
+ class: "poveste-controls-component-prop-item grow min-w-0",
43
46
  title: `${__props.definition.name}${canReset.value ? " *" : ""}`
44
- }, {
45
- actions: withCtx(() => [withDirectives(createVNode(unref(Icon), {
46
- icon: "carbon:erase",
47
- class: normalizeClass(["cursor-pointer w-4 h-4 hover:text-primary-500 dark:hover:text-primary-400 text-gray-900 dark:text-gray-100", [canReset.value ? "opacity-50 hover:opacity-100" : "opacity-25 pointer-events-none"]]),
48
- onClick: _cache[0] || (_cache[0] = withModifiers(($event) => reset(), ["stop"]))
49
- }, null, 8, ["class"]), [[_directive_tooltip, "Remove override"]])]),
50
- _: 1
51
- }, 8, [
47
+ }, null, 8, [
52
48
  "modelValue",
53
49
  "placeholder",
54
50
  "title"
55
- ])) : createCommentVNode("", true);
51
+ ])), createVNode(unref(HstTooltip), { content: "Remove override" }, {
52
+ default: withCtx(() => [createElementVNode("button", {
53
+ type: "button",
54
+ "aria-label": `Remove override of ${__props.definition.name}`,
55
+ disabled: !canReset.value,
56
+ class: normalizeClass(["flex-none flex mr-2 mb-[10px] p-0 bg-transparent border-0 cursor-pointer text-gray-900 dark:text-gray-100 hover:text-primary-500 dark:hover:text-primary-400", [canReset.value ? "opacity-50 hover:opacity-100 focus-visible:opacity-100" : "opacity-25 pointer-events-none"]]),
57
+ onClick: _cache[1] || (_cache[1] = ($event) => reset())
58
+ }, [createVNode(unref(Icon), {
59
+ icon: "carbon:erase",
60
+ class: "w-4 h-4"
61
+ })], 10, _hoisted_2)]),
62
+ _: 1
63
+ })])) : createCommentVNode("", true);
56
64
  };
57
65
  }
58
66
  });
@@ -1,6 +1,7 @@
1
1
  import ControlsComponentPropItem_default from "./ControlsComponentPropItem.js";
2
- import { Fragment, createBlock, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, renderList, resolveDirective, toDisplayString, unref, withDirectives } from "@poveste/vendors/vue";
2
+ import { Fragment, createBlock, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, renderList, toDisplayString, unref, withCtx } from "@poveste/vendors/vue";
3
3
  import { Icon } from "@poveste/vendors/iconify";
4
+ import { HstTooltip } from "@poveste/controls";
4
5
  //#region src/app/components/panel/ControlsComponentProps.vue?vue&type=script&setup=true&lang.ts
5
6
  var _hoisted_1 = { class: "poveste-controls-component-props" };
6
7
  var _hoisted_2 = { class: "font-mono p-2 flex items-center gap-1" };
@@ -12,11 +13,13 @@ var ControlsComponentProps_vue_vue_type_script_setup_true_lang_default = /*@__PU
12
13
  },
13
14
  setup(__props) {
14
15
  return (_ctx, _cache) => {
15
- const _directive_tooltip = resolveDirective("tooltip");
16
- return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [withDirectives(createVNode(unref(Icon), {
17
- icon: "carbon:flash",
18
- class: "w-4 h-4 text-primary-500 flex-none"
19
- }, null, 512), [[_directive_tooltip, "Auto-detected props"]]), createElementVNode("div", null, [
16
+ return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [createVNode(unref(HstTooltip), { content: "Auto-detected props" }, {
17
+ default: withCtx(() => [createVNode(unref(Icon), {
18
+ icon: "carbon:flash",
19
+ class: "w-4 h-4 text-primary-500 flex-none"
20
+ })]),
21
+ _: 1
22
+ }), createElementVNode("div", null, [
20
23
  _cache[0] || (_cache[0] = createElementVNode("span", { class: "opacity-30" }, "<", -1)),
21
24
  createTextVNode(toDisplayString(__props.definition.name), 1),
22
25
  _cache[1] || (_cache[1] = createElementVNode("span", { class: "opacity-30" }, ">", -1))
@@ -1,6 +1,7 @@
1
1
  import ControlsComponentStateItem_default from "./ControlsComponentStateItem.js";
2
- import { Fragment, computed, createBlock, createElementBlock, createElementVNode, createVNode, defineComponent, openBlock, renderList, resolveDirective, unref, withDirectives } from "@poveste/vendors/vue";
2
+ import { Fragment, computed, createBlock, createElementBlock, createElementVNode, createVNode, defineComponent, openBlock, renderList, unref, withCtx } from "@poveste/vendors/vue";
3
3
  import { Icon } from "@poveste/vendors/iconify";
4
+ import { HstTooltip } from "@poveste/controls";
4
5
  //#region src/app/components/panel/ControlsComponentState.vue?vue&type=script&setup=true&lang.ts
5
6
  var _hoisted_1 = { class: "poveste-controls-component-init-state" };
6
7
  var _hoisted_2 = { class: "p-2 flex items-center gap-1" };
@@ -11,11 +12,13 @@ var ControlsComponentState_vue_vue_type_script_setup_true_lang_default = /*@__PU
11
12
  const props = __props;
12
13
  const stateKeys = computed(() => Object.keys(props.variant.state || {}).filter((key) => !key.startsWith("_h")));
13
14
  return (_ctx, _cache) => {
14
- const _directive_tooltip = resolveDirective("tooltip");
15
- return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [withDirectives(createVNode(unref(Icon), {
16
- icon: "carbon:data-vis-1",
17
- class: "w-4 h-4 text-primary-500 flex-none"
18
- }, null, 512), [[_directive_tooltip, "Auto-detected state"]]), _cache[0] || (_cache[0] = createElementVNode("div", null, " State ", -1))]), (openBlock(true), createElementBlock(Fragment, null, renderList(stateKeys.value, (key) => {
15
+ return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [createVNode(unref(HstTooltip), { content: "Auto-detected state" }, {
16
+ default: withCtx(() => [createVNode(unref(Icon), {
17
+ icon: "carbon:data-vis-1",
18
+ class: "w-4 h-4 text-primary-500 flex-none"
19
+ })]),
20
+ _: 1
21
+ }), _cache[0] || (_cache[0] = createElementVNode("div", null, " State ", -1))]), (openBlock(true), createElementBlock(Fragment, null, renderList(stateKeys.value, (key) => {
19
22
  return openBlock(), createBlock(ControlsComponentStateItem_default, {
20
23
  key,
21
24
  item: key,
@@ -29,7 +29,7 @@ var PaneTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
29
29
  tab: ""
30
30
  }
31
31
  },
32
- matched: !_ctx.$route.query.tab
32
+ matched: !_ctx.$route.query["tab"]
33
33
  }, {
34
34
  default: withCtx(() => [..._cache[3] || (_cache[3] = [createTextVNode(" Controls ", -1)])]),
35
35
  _: 1
@@ -42,7 +42,7 @@ var PaneTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
42
42
  tab: "docs"
43
43
  }
44
44
  },
45
- matched: _ctx.$route.query.tab === "docs",
45
+ matched: _ctx.$route.query["tab"] === "docs",
46
46
  class: normalizeClass({ "opacity-70": !unref(renderedDoc) })
47
47
  }, {
48
48
  default: withCtx(() => [..._cache[4] || (_cache[4] = [createTextVNode(" Docs ", -1)])]),
@@ -60,7 +60,7 @@ var PaneTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
60
60
  tab: "events"
61
61
  }
62
62
  },
63
- matched: _ctx.$route.query.tab === "events",
63
+ matched: _ctx.$route.query["tab"] === "events",
64
64
  class: normalizeClass({ "opacity-70": !hasEvents.value })
65
65
  }, {
66
66
  default: withCtx(() => [_cache[5] || (_cache[5] = createTextVNode(" Events ", -1)), unref(eventsStore).unseen ? (openBlock(), createBlock(BaseTag_default, { key: 0 }, {
@@ -83,7 +83,7 @@ var PaneTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
83
83
  tab: ""
84
84
  }
85
85
  },
86
- matched: !_ctx.$route.query.tab
86
+ matched: !_ctx.$route.query["tab"]
87
87
  }, {
88
88
  default: withCtx(() => [..._cache[0] || (_cache[0] = [createTextVNode(" Controls ", -1)])]),
89
89
  _: 1
@@ -96,7 +96,7 @@ var PaneTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
96
96
  tab: "docs"
97
97
  }
98
98
  },
99
- matched: _ctx.$route.query.tab === "docs",
99
+ matched: _ctx.$route.query["tab"] === "docs",
100
100
  class: normalizeClass({ "opacity-70": !unref(renderedDoc) })
101
101
  }, {
102
102
  default: withCtx(() => [..._cache[1] || (_cache[1] = [createTextVNode(" Docs ", -1)])]),
@@ -114,7 +114,7 @@ var PaneTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
114
114
  tab: "events"
115
115
  }
116
116
  },
117
- matched: _ctx.$route.query.tab === "events",
117
+ matched: _ctx.$route.query["tab"] === "events",
118
118
  class: normalizeClass({ "opacity-70": !hasEvents.value })
119
119
  }, {
120
120
  default: withCtx(() => [_cache[2] || (_cache[2] = createTextVNode(" Events ", -1)), unref(eventsStore).unseen ? (openBlock(), createBlock(BaseTag_default, { key: 0 }, {