@openviking/react 0.1.0 → 0.1.2

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 (193) hide show
  1. package/README.md +57 -34
  2. package/dist/3~0.js +2117 -0
  3. package/dist/ark-message-list-view~0.js +310 -0
  4. package/dist/a~0.js +21 -0
  5. package/dist/c7~0.js +24 -0
  6. package/dist/client/client.d.ts +12 -0
  7. package/dist/client/errors.d.ts +30 -0
  8. package/dist/client/index.d.ts +4 -0
  9. package/dist/client/options.d.ts +101 -0
  10. package/dist/client/provider.d.ts +52 -0
  11. package/dist/client/types.d.ts +160 -0
  12. package/dist/client.js +239 -0
  13. package/dist/components/agent-connect/agent-connect-copy.d.ts +34 -0
  14. package/dist/components/agent-connect/agent-connect-design.d.ts +1781 -0
  15. package/dist/components/agent-connect/agent-connect-detail.d.ts +13 -0
  16. package/dist/components/agent-connect/agent-connect-installer.d.ts +3 -0
  17. package/dist/components/agent-connect/agent-connect-instructions-view.d.ts +14 -0
  18. package/dist/components/agent-connect/agent-connect-instructions.d.ts +145 -0
  19. package/dist/components/agent-connect/agent-connect-markdown.d.ts +3 -0
  20. package/dist/components/agent-connect/agent-connect.d.ts +4 -1
  21. package/dist/components/agent-connect/content-en.d.ts +137 -0
  22. package/dist/components/agent-connect/content-zh.d.ts +137 -0
  23. package/dist/components/agent-connect/index.d.ts +1 -0
  24. package/dist/components/agent-connect/style.css +503 -0
  25. package/dist/components/agent-connect/types.d.ts +29 -0
  26. package/dist/components/agent-connect.js +1 -0
  27. package/dist/components/file-preview/file-preview-adapters.d.ts +33 -0
  28. package/dist/components/file-preview/file-preview-body.d.ts +27 -0
  29. package/dist/components/file-preview/file-preview-breadcrumb-menu.d.ts +16 -0
  30. package/dist/components/file-preview/file-preview-breadcrumb.d.ts +21 -0
  31. package/dist/components/file-preview/file-preview-copy-path.d.ts +12 -0
  32. package/dist/components/file-preview/file-preview-editor.d.ts +22 -0
  33. package/dist/components/file-preview/file-preview-handle-adapters.d.ts +26 -0
  34. package/dist/components/file-preview/file-preview-header.d.ts +25 -0
  35. package/dist/components/file-preview/file-preview-labels.d.ts +16 -0
  36. package/dist/components/file-preview/file-preview-lazy-viewer.d.ts +3 -0
  37. package/dist/components/file-preview/file-preview-path.d.ts +30 -0
  38. package/dist/components/file-preview/file-preview-source.d.ts +24 -0
  39. package/dist/components/file-preview/file-preview-state.d.ts +28 -0
  40. package/dist/components/file-preview/file-preview-tab-row.d.ts +16 -0
  41. package/dist/components/file-preview/file-preview-viewer.d.ts +31 -0
  42. package/dist/components/file-preview/file-preview.d.ts +14 -1
  43. package/dist/components/file-preview/index.d.ts +1 -0
  44. package/dist/components/file-preview/style.css +4139 -0
  45. package/dist/components/file-preview/types.d.ts +516 -0
  46. package/dist/components/file-preview/use-file-preview-actions-context.d.ts +23 -0
  47. package/dist/components/file-preview/use-file-preview-actions.d.ts +19 -0
  48. package/dist/components/file-preview/use-file-preview-editing.d.ts +32 -0
  49. package/dist/components/file-preview/use-file-preview-ids.d.ts +24 -0
  50. package/dist/components/file-preview.js +1 -0
  51. package/dist/components/file-tree/file-tree-body.d.ts +18 -0
  52. package/dist/components/file-tree/file-tree-entry-row.d.ts +12 -0
  53. package/dist/components/file-tree/file-tree-icons.d.ts +15 -0
  54. package/dist/components/file-tree/file-tree-info-labels.d.ts +21 -0
  55. package/dist/components/file-tree/file-tree-info-tooltip.d.ts +43 -0
  56. package/dist/components/file-tree/file-tree-info.d.ts +29 -0
  57. package/dist/components/file-tree/file-tree-keyboard.d.ts +14 -0
  58. package/dist/components/file-tree/file-tree-row-context.d.ts +46 -0
  59. package/dist/components/file-tree/file-tree-row-shared.d.ts +11 -0
  60. package/dist/components/file-tree/file-tree-spinner.d.ts +10 -0
  61. package/dist/components/file-tree/file-tree-state-row.d.ts +7 -0
  62. package/dist/components/file-tree/file-tree-tooltip-surface.d.ts +22 -0
  63. package/dist/components/file-tree/file-tree-tooltip.d.ts +17 -0
  64. package/dist/components/file-tree/file-tree.d.ts +15 -1
  65. package/dist/components/file-tree/index.d.ts +1 -0
  66. package/dist/components/file-tree/style.css +410 -0
  67. package/dist/components/file-tree/types.d.ts +589 -0
  68. package/dist/components/file-tree/use-file-tree-actions.d.ts +17 -0
  69. package/dist/components/file-tree.js +1 -0
  70. package/dist/components/scope-switcher/index.d.ts +1 -0
  71. package/dist/components/scope-switcher/scope-keyboard.d.ts +2 -0
  72. package/dist/components/scope-switcher/scope-panel.d.ts +11 -0
  73. package/dist/components/scope-switcher/scope-selector.d.ts +2 -0
  74. package/dist/components/scope-switcher/scope-switcher.d.ts +6 -1
  75. package/dist/components/scope-switcher/style.css +452 -0
  76. package/dist/components/scope-switcher/types.d.ts +489 -0
  77. package/dist/components/scope-switcher.js +3 -0
  78. package/dist/components/style.css +14249 -18
  79. package/dist/components/tui/command-catalog.d.ts +58 -0
  80. package/dist/components/tui/command-completion.d.ts +19 -0
  81. package/dist/components/tui/command-definitions.d.ts +10 -0
  82. package/dist/components/tui/command-input.d.ts +16 -0
  83. package/dist/components/tui/index.d.ts +1 -0
  84. package/dist/components/tui/style.css +1552 -0
  85. package/dist/components/tui/tui-assist.d.ts +15 -0
  86. package/dist/components/tui/tui-code-block.d.ts +8 -0
  87. package/dist/components/tui/tui-command-help.d.ts +9 -0
  88. package/dist/components/tui/tui-command-text.d.ts +6 -0
  89. package/dist/components/tui/tui-composer.d.ts +24 -0
  90. package/dist/components/tui/tui-copy-button.d.ts +9 -0
  91. package/dist/components/tui/tui-input-mirror.d.ts +14 -0
  92. package/dist/components/tui/tui-labels-zh.d.ts +2 -0
  93. package/dist/components/tui/tui-labels.d.ts +5 -0
  94. package/dist/components/tui/tui-markdown-renderers.d.ts +10 -0
  95. package/dist/components/tui/tui-markdown.d.ts +6 -0
  96. package/dist/components/tui/tui-param-hint.d.ts +7 -0
  97. package/dist/components/tui/tui-record-time.d.ts +11 -0
  98. package/dist/components/tui/tui-record.d.ts +13 -0
  99. package/dist/components/tui/tui-resource-preview.d.ts +10 -0
  100. package/dist/components/tui/tui-resource-tree.d.ts +10 -0
  101. package/dist/components/tui/tui-result-header.d.ts +7 -0
  102. package/dist/components/tui/tui-result-text.d.ts +5 -0
  103. package/dist/components/tui/tui-search-list.d.ts +8 -0
  104. package/dist/components/tui/tui-skeleton.d.ts +6 -0
  105. package/dist/components/tui/tui-status-card.d.ts +7 -0
  106. package/dist/components/tui/tui-text.d.ts +10 -0
  107. package/dist/components/tui/tui-uri-text.d.ts +19 -0
  108. package/dist/components/tui/tui-write-result.d.ts +7 -0
  109. package/dist/components/tui/tui.d.ts +11 -1
  110. package/dist/components/tui/types.d.ts +527 -0
  111. package/dist/components/tui/use-tui-assist-position.d.ts +3 -0
  112. package/dist/components/tui/use-tui-completion.d.ts +14 -0
  113. package/dist/components/tui/use-tui-composer-keyboard.d.ts +25 -0
  114. package/dist/components/tui.js +1 -0
  115. package/dist/components/viking-bot/ark-adapter.d.ts +45 -0
  116. package/dist/components/viking-bot/ark-message-body.d.ts +16 -0
  117. package/dist/components/viking-bot/ark-message-list-view.d.ts +7 -0
  118. package/dist/components/viking-bot/ark-message-row.d.ts +19 -0
  119. package/dist/components/viking-bot/index.d.ts +10 -0
  120. package/dist/components/viking-bot/interaction/ask-human-fields.d.ts +10 -0
  121. package/dist/components/viking-bot/interaction/index.d.ts +4 -0
  122. package/dist/components/viking-bot/interaction/labels.d.ts +7 -0
  123. package/dist/components/viking-bot/interaction/lazy-interaction.d.ts +3 -0
  124. package/dist/components/viking-bot/interaction/schedule-input.d.ts +13 -0
  125. package/dist/components/viking-bot/interaction/style.css +189 -0
  126. package/dist/components/viking-bot/interaction/types.d.ts +188 -0
  127. package/dist/components/viking-bot/interaction/viking-bot-interaction.d.ts +9 -0
  128. package/dist/components/viking-bot/interaction.js +2 -0
  129. package/dist/components/viking-bot/labels.d.ts +2 -0
  130. package/dist/components/viking-bot/lazy-composer.d.ts +3 -0
  131. package/dist/components/viking-bot/message-groups.d.ts +12 -0
  132. package/dist/components/viking-bot/model.d.ts +252 -0
  133. package/dist/components/viking-bot/render-part.d.ts +12 -0
  134. package/dist/components/viking-bot/style.css +7133 -0
  135. package/dist/components/viking-bot/types.d.ts +140 -0
  136. package/dist/components/viking-bot/viking-bot-composer.d.ts +6 -0
  137. package/dist/components/viking-bot/viking-bot-message-list.d.ts +3 -0
  138. package/dist/components/viking-bot/viking-bot.d.ts +16 -1
  139. package/dist/components/viking-bot.js +4 -0
  140. package/dist/c~0.js +201 -0
  141. package/dist/file-preview-viewer~0.js +191 -0
  142. package/dist/f~0.js +356 -0
  143. package/dist/g~0.js +1207 -0
  144. package/dist/h~0.js +58 -0
  145. package/dist/icons/file-type-icon.d.ts +31 -0
  146. package/dist/icons/index.d.ts +33 -23
  147. package/dist/icons/nextjs-icon.d.ts +19 -0
  148. package/dist/icons.js +1 -25
  149. package/dist/index.d.ts +16 -2
  150. package/dist/index.js +8 -1
  151. package/dist/k~0.js +1440 -0
  152. package/dist/lk~0.js +233 -0
  153. package/dist/l~0.js +44 -0
  154. package/dist/modules/console/console.d.ts +4 -0
  155. package/dist/modules/console/index.d.ts +1 -0
  156. package/dist/modules/console/style.css +111 -0
  157. package/dist/modules/console/types.d.ts +101 -0
  158. package/dist/modules/console.js +1 -0
  159. package/dist/modules/file-browser/file-browser-toolbar-button.d.ts +10 -0
  160. package/dist/modules/file-browser/file-browser.d.ts +6 -0
  161. package/dist/modules/file-browser/index.d.ts +1 -0
  162. package/dist/modules/file-browser/style.css +158 -0
  163. package/dist/modules/file-browser/types.d.ts +101 -0
  164. package/dist/modules/file-browser.js +1 -0
  165. package/dist/modules/scope-cascade/controller.d.ts +6 -0
  166. package/dist/modules/scope-cascade/index.d.ts +3 -0
  167. package/dist/modules/scope-cascade/scope-cascade.d.ts +3 -0
  168. package/dist/modules/scope-cascade/style.css +456 -0
  169. package/dist/modules/scope-cascade/style.js +0 -0
  170. package/dist/modules/scope-cascade/types.d.ts +39 -0
  171. package/dist/modules/scope-cascade/use-scope-cascade.d.ts +5 -0
  172. package/dist/modules/scope-cascade.js +1 -0
  173. package/dist/modules/style.css +808 -0
  174. package/dist/modules/style.js +0 -0
  175. package/dist/n~0.js +727 -0
  176. package/dist/shared/components/tooltip/index.d.ts +1 -0
  177. package/dist/shared/components/tooltip/tooltip.d.ts +25 -0
  178. package/dist/shared/components/tooltip/types.d.ts +42 -0
  179. package/dist/shared/components/tooltip/use-tooltip-position.d.ts +38 -0
  180. package/dist/style.css +15138 -18
  181. package/dist/u~0.js +1601 -0
  182. package/dist/viking-bot-composer~0.js +164 -0
  183. package/dist/viking-bot-interaction~0.js +284 -0
  184. package/dist/w~0.js +19 -0
  185. package/package.json +46 -22
  186. package/dist/components/resource-import/resource-import.d.ts +0 -1
  187. package/dist/components/resource-import/style.css +0 -2
  188. package/dist/components/status-badge/status-badge.d.ts +0 -8
  189. package/dist/components/status-badge/style.css +0 -37
  190. package/dist/components/status-badge.js +0 -30
  191. /package/dist/components/{resource-import → viking-bot/interaction}/style.js +0 -0
  192. /package/dist/{components/status-badge → modules/console}/style.js +0 -0
  193. /package/dist/{components/resource-import.js → modules/file-browser/style.js} +0 -0
package/dist/f~0.js ADDED
@@ -0,0 +1,356 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useId, useRef, useState } from "react";
3
+ const SvgChevronDown = (props)=>/*#__PURE__*/ jsx("svg", {
4
+ xmlns: "http://www.w3.org/2000/svg",
5
+ width: 14,
6
+ height: 14,
7
+ fill: "none",
8
+ viewBox: "0 0 14 14",
9
+ ...props,
10
+ children: /*#__PURE__*/ jsx("path", {
11
+ fill: "currentColor",
12
+ d: "M9.607 5.232a.437.437 0 1 1 .619.619L7.309 8.768a.437.437 0 0 1-.618 0L3.774 5.85a.437.437 0 1 1 .619-.619L7 7.84z"
13
+ })
14
+ });
15
+ const chevron_downreact = SvgChevronDown;
16
+ function moveScopeFocus(event) {
17
+ if (![
18
+ 'ArrowDown',
19
+ 'ArrowUp',
20
+ 'Home',
21
+ 'End'
22
+ ].includes(event.key)) return;
23
+ const target = event.target;
24
+ const isSearch = target.matches('input.ov-scope-switcher__search');
25
+ if (event.defaultPrevented || !target.matches('[role="option"]') && !isSearch || isSearch && !event.key.startsWith('Arrow')) return;
26
+ const options = Array.from(event.currentTarget.querySelectorAll('[role="option"]:not([aria-disabled="true"])'));
27
+ if (!options.length) return;
28
+ event.preventDefault();
29
+ const current = options.indexOf(document.activeElement);
30
+ const next = 'Home' === event.key ? 0 : 'End' === event.key ? options.length - 1 : 'ArrowDown' === event.key ? (current + 1) % options.length : current < 0 ? options.length - 1 : (current - 1 + options.length) % options.length;
31
+ options[next]?.focus();
32
+ }
33
+ const SvgCheck = (props)=>/*#__PURE__*/ jsx("svg", {
34
+ xmlns: "http://www.w3.org/2000/svg",
35
+ width: 16,
36
+ height: 16,
37
+ fill: "none",
38
+ viewBox: "0 0 16 16",
39
+ ...props,
40
+ children: /*#__PURE__*/ jsx("path", {
41
+ stroke: "currentColor",
42
+ strokeLinecap: "round",
43
+ strokeLinejoin: "round",
44
+ strokeWidth: 1.2,
45
+ d: "M13.333 4 6 11.333 2.667 8"
46
+ })
47
+ });
48
+ const checkreact = SvgCheck;
49
+ const SvgSearch = (props)=>/*#__PURE__*/ jsx("svg", {
50
+ xmlns: "http://www.w3.org/2000/svg",
51
+ width: 16,
52
+ height: 16,
53
+ fill: "none",
54
+ viewBox: "0 0 16 16",
55
+ ...props,
56
+ children: /*#__PURE__*/ jsxs("g", {
57
+ stroke: "currentColor",
58
+ strokeWidth: 1.2,
59
+ children: [
60
+ /*#__PURE__*/ jsx("circle", {
61
+ cx: 7.167,
62
+ cy: 7.167,
63
+ r: 4.667
64
+ }),
65
+ /*#__PURE__*/ jsx("path", {
66
+ strokeLinecap: "round",
67
+ d: "m10.667 10.667 3 3"
68
+ })
69
+ ]
70
+ })
71
+ });
72
+ const searchreact = SvgSearch;
73
+ function Highlight({ text, keyword }) {
74
+ const needle = keyword.trim().toLocaleLowerCase();
75
+ if (!needle) return /*#__PURE__*/ jsx(Fragment, {
76
+ children: text
77
+ });
78
+ const haystack = text.toLocaleLowerCase();
79
+ const parts = [];
80
+ let cursor = 0;
81
+ let hit = haystack.indexOf(needle);
82
+ while(hit >= 0){
83
+ if (hit > cursor) parts.push(text.slice(cursor, hit));
84
+ const end = hit + needle.length;
85
+ parts.push(/*#__PURE__*/ jsx("mark", {
86
+ children: text.slice(hit, end)
87
+ }, `${hit}-${end}`));
88
+ cursor = end;
89
+ hit = haystack.indexOf(needle, cursor);
90
+ }
91
+ if (cursor < text.length) parts.push(text.slice(cursor));
92
+ return /*#__PURE__*/ jsx(Fragment, {
93
+ children: parts
94
+ });
95
+ }
96
+ function ScopePanel({ label, data, state, slots, actions, onSelect, labels }) {
97
+ const focusPanel = useCallback((node)=>{
98
+ const target = node?.querySelector('input') ?? node?.querySelector('[role="option"][aria-selected="true"]:not([aria-disabled="true"])') ?? node?.querySelector('[role="option"]:not([aria-disabled="true"])');
99
+ (target ?? node)?.focus();
100
+ }, []);
101
+ const options = data.visibleOptions ?? data.options;
102
+ const keyword = state?.searchKeyword ?? '';
103
+ const hasKeyword = keyword.trim().length > 0;
104
+ const searchVisible = actions?.onSearchKeywordChange && (hasKeyword || Math.max(options.length, data.options.length, data.total ?? 0) > 10);
105
+ const search = searchVisible ? /*#__PURE__*/ jsxs("div", {
106
+ className: "ov-scope-switcher__search-field",
107
+ children: [
108
+ /*#__PURE__*/ jsx(searchreact, {
109
+ className: "ov-scope-switcher__search-icon"
110
+ }),
111
+ /*#__PURE__*/ jsx("input", {
112
+ type: "search",
113
+ className: "ov-scope-switcher__search",
114
+ value: keyword,
115
+ "aria-label": labels?.searchPlaceholder ?? 'Search',
116
+ placeholder: labels?.searchPlaceholder ?? 'Search',
117
+ onChange: (event)=>actions?.onSearchKeywordChange?.(event.currentTarget.value)
118
+ })
119
+ ]
120
+ }) : null;
121
+ let list;
122
+ list = state?.loading ? /*#__PURE__*/ jsx("div", {
123
+ className: "ov-scope-switcher__state",
124
+ role: "status",
125
+ children: labels?.loading ?? 'Loading…'
126
+ }) : state?.error ? /*#__PURE__*/ jsx("div", {
127
+ className: "ov-scope-switcher__state",
128
+ role: "alert",
129
+ children: slots?.errorFallback ?? labels?.error ?? 'Unable to load options'
130
+ }) : options.length ? /*#__PURE__*/ jsx("div", {
131
+ className: "ov-scope-switcher__list",
132
+ role: "listbox",
133
+ "aria-label": label,
134
+ "aria-busy": state?.busy,
135
+ onScroll: (event)=>{
136
+ const { scrollTop, scrollHeight, clientHeight } = event.currentTarget;
137
+ actions?.onScroll?.({
138
+ scrollTop,
139
+ scrollHeight,
140
+ clientHeight
141
+ });
142
+ },
143
+ children: options.map((option)=>{
144
+ const selected = option.id === data.selectedId;
145
+ const content = /*#__PURE__*/ jsxs(Fragment, {
146
+ children: [
147
+ option.icon && /*#__PURE__*/ jsx("span", {
148
+ className: "ov-scope-switcher__icon",
149
+ "aria-hidden": "true",
150
+ children: option.icon
151
+ }),
152
+ /*#__PURE__*/ jsxs("span", {
153
+ className: "ov-scope-switcher__option-text",
154
+ children: [
155
+ /*#__PURE__*/ jsx("span", {
156
+ children: /*#__PURE__*/ jsx(Highlight, {
157
+ text: option.label,
158
+ keyword: keyword
159
+ })
160
+ }),
161
+ option.description && /*#__PURE__*/ jsx("small", {
162
+ children: option.description
163
+ })
164
+ ]
165
+ }),
166
+ selected && /*#__PURE__*/ jsx("span", {
167
+ className: "ov-scope-switcher__check",
168
+ "aria-hidden": "true",
169
+ children: /*#__PURE__*/ jsx(checkreact, {})
170
+ })
171
+ ]
172
+ });
173
+ return /*#__PURE__*/ jsx("div", {
174
+ tabIndex: option.disabled || state?.busy ? -1 : 0,
175
+ role: "option",
176
+ "aria-selected": selected,
177
+ className: "ov-scope-switcher__option",
178
+ title: option.label,
179
+ "aria-disabled": option.disabled || state?.busy || void 0,
180
+ onClick: (event)=>{
181
+ const target = event.target;
182
+ if (option.disabled || state?.busy || target.closest('button, a, input, select, textarea, [role="button"]')) return;
183
+ onSelect(option);
184
+ },
185
+ onKeyDown: (event)=>{
186
+ if (event.target !== event.currentTarget || option.disabled || state?.busy) return;
187
+ if ('Enter' === event.key || ' ' === event.key) {
188
+ event.preventDefault();
189
+ onSelect(option);
190
+ }
191
+ },
192
+ children: slots?.renderOption ? slots?.renderOption(content, option) : content
193
+ }, option.id);
194
+ })
195
+ }, keyword) : /*#__PURE__*/ jsx("div", {
196
+ className: "ov-scope-switcher__state",
197
+ role: "status",
198
+ children: slots?.emptyFallback ?? (hasKeyword ? labels?.noMatch ?? labels?.empty ?? 'No matches' : labels?.empty ?? 'No options')
199
+ });
200
+ return /*#__PURE__*/ jsx("div", {
201
+ role: "group",
202
+ tabIndex: -1,
203
+ ref: focusPanel,
204
+ className: "ov-scope-switcher__panel-inner",
205
+ onKeyDownCapture: moveScopeFocus,
206
+ children: slots?.renderPanel ? slots?.renderPanel({
207
+ search,
208
+ list
209
+ }) : /*#__PURE__*/ jsxs("div", {
210
+ className: "ov-scope-switcher__panel-body",
211
+ children: [
212
+ search,
213
+ list
214
+ ]
215
+ })
216
+ });
217
+ }
218
+ function ScopeSelector(props) {
219
+ const { identity, trigger: triggerContent, labels } = props;
220
+ const selectable = 'selectable' === props.kind ? props : void 0;
221
+ const data = selectable?.data;
222
+ const state = selectable?.state;
223
+ const actions = selectable?.actions;
224
+ const slots = selectable?.slots;
225
+ const [localVisible, setLocalVisible] = useState(false);
226
+ const root = useRef(null);
227
+ const trigger = useRef(null);
228
+ const restoreSelectionFocus = useRef(false);
229
+ const panelId = useId();
230
+ const open = void 0 !== selectable && (state?.visible ?? localVisible) && !state?.disabled;
231
+ const onVisibleChange = actions?.onVisibleChange;
232
+ const changeVisible = useCallback((visible)=>{
233
+ setLocalVisible(visible);
234
+ onVisibleChange?.(visible);
235
+ }, [
236
+ onVisibleChange
237
+ ]);
238
+ useEffect(()=>{
239
+ if (!open) return;
240
+ const dismiss = (event)=>{
241
+ if (event.target instanceof Node && !root.current?.contains(event.target)) changeVisible(false);
242
+ };
243
+ const escape = (event)=>{
244
+ if ('Escape' === event.key) {
245
+ event.preventDefault();
246
+ changeVisible(false);
247
+ trigger.current?.focus();
248
+ }
249
+ };
250
+ document.addEventListener('pointerdown', dismiss);
251
+ document.addEventListener('keydown', escape);
252
+ return ()=>{
253
+ document.removeEventListener('pointerdown', dismiss);
254
+ document.removeEventListener('keydown', escape);
255
+ };
256
+ }, [
257
+ open,
258
+ changeVisible
259
+ ]);
260
+ useEffect(()=>{
261
+ if (open || !restoreSelectionFocus.current) return;
262
+ restoreSelectionFocus.current = false;
263
+ if (document.activeElement === document.body || root.current?.contains(document.activeElement)) trigger.current?.focus();
264
+ }, [
265
+ open
266
+ ]);
267
+ const selected = data?.options.find((o)=>o.id === data.selectedId);
268
+ const label = triggerContent?.label ?? selected?.label ?? '';
269
+ const icon = triggerContent?.icon ?? selected?.icon;
270
+ const content = /*#__PURE__*/ jsxs(Fragment, {
271
+ children: [
272
+ icon && /*#__PURE__*/ jsx("span", {
273
+ className: "ov-scope-switcher__icon",
274
+ "aria-hidden": "true",
275
+ children: icon
276
+ }),
277
+ /*#__PURE__*/ jsx("span", {
278
+ className: "ov-scope-switcher__label",
279
+ children: label
280
+ }),
281
+ identity.tag && /*#__PURE__*/ jsx("span", {
282
+ className: "ov-scope-switcher__tag",
283
+ children: identity.tag
284
+ })
285
+ ]
286
+ });
287
+ return /*#__PURE__*/ jsxs("div", {
288
+ ref: root,
289
+ role: "group",
290
+ className: "ov-scope-switcher__level",
291
+ onBlur: (event)=>{
292
+ if (open && event.relatedTarget instanceof Node && !event.currentTarget.contains(event.relatedTarget)) changeVisible(false);
293
+ },
294
+ children: [
295
+ void 0 === selectable ? /*#__PURE__*/ jsx("span", {
296
+ className: "ov-scope-switcher__trigger",
297
+ "aria-label": identity.ariaLabel,
298
+ title: label,
299
+ children: content
300
+ }) : /*#__PURE__*/ jsxs("button", {
301
+ ref: trigger,
302
+ type: "button",
303
+ className: "ov-scope-switcher__trigger",
304
+ "aria-label": identity.ariaLabel,
305
+ title: label,
306
+ disabled: state?.disabled,
307
+ "aria-expanded": open,
308
+ "aria-haspopup": "dialog",
309
+ "aria-controls": open ? panelId : void 0,
310
+ onClick: ()=>changeVisible(!open),
311
+ onKeyDown: (event)=>{
312
+ if ('ArrowDown' === event.key || 'ArrowUp' === event.key) {
313
+ event.preventDefault();
314
+ if (open) root.current?.querySelector('[role="option"]:not([aria-disabled="true"])')?.focus();
315
+ else changeVisible(true);
316
+ }
317
+ },
318
+ children: [
319
+ content,
320
+ /*#__PURE__*/ jsx("span", {
321
+ className: "ov-scope-switcher__arrow",
322
+ "aria-hidden": "true",
323
+ children: /*#__PURE__*/ jsx(chevron_downreact, {})
324
+ })
325
+ ]
326
+ }),
327
+ open && void 0 !== selectable && void 0 !== data && /*#__PURE__*/ jsx("div", {
328
+ id: panelId,
329
+ className: slots?.renderPanel ? 'ov-scope-switcher__panel ov-scope-switcher__panel--custom' : 'ov-scope-switcher__panel',
330
+ role: "dialog",
331
+ "aria-label": identity.ariaLabel ?? label,
332
+ children: /*#__PURE__*/ jsx(ScopePanel, {
333
+ label: identity.ariaLabel ?? label,
334
+ data: data,
335
+ state: state,
336
+ slots: slots,
337
+ actions: actions,
338
+ onSelect: (option)=>{
339
+ restoreSelectionFocus.current = true;
340
+ changeVisible(false);
341
+ actions?.onSelect?.(option);
342
+ },
343
+ labels: labels
344
+ })
345
+ })
346
+ ]
347
+ });
348
+ }
349
+ function ScopeSwitcher({ children, className = '', ...props }) {
350
+ return /*#__PURE__*/ jsx("div", {
351
+ ...props,
352
+ className: `ov-scope-switcher ${className}`,
353
+ children: children
354
+ });
355
+ }
356
+ export { ScopeSelector, ScopeSwitcher };