@dxos/plugin-search 0.8.1-staging.5be625a → 0.8.1-staging.97aedb1

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 (89) hide show
  1. package/dist/lib/browser/app-graph-builder-RHZORTY2.mjs +76 -0
  2. package/dist/lib/browser/app-graph-builder-RHZORTY2.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-2QDXE2SP.mjs → chunk-J6YWSQTW.mjs} +2 -2
  4. package/dist/lib/browser/{chunk-RJRPR6BG.mjs → chunk-LXHJVTYG.mjs} +3 -3
  5. package/dist/lib/browser/{chunk-RJRPR6BG.mjs.map → chunk-LXHJVTYG.mjs.map} +2 -2
  6. package/dist/lib/browser/{chunk-2G5TBIJT.mjs → chunk-NFZSXZMP.mjs} +55 -4
  7. package/dist/lib/browser/chunk-NFZSXZMP.mjs.map +7 -0
  8. package/dist/lib/browser/index.mjs +29 -18
  9. package/dist/lib/browser/index.mjs.map +3 -3
  10. package/dist/lib/browser/{intent-resolver-M3EJMBGZ.mjs → intent-resolver-G76A35DX.mjs} +4 -4
  11. package/dist/lib/browser/meta.json +1 -1
  12. package/dist/lib/browser/react-surface-QBBLEI2Q.mjs +609 -0
  13. package/dist/lib/browser/react-surface-QBBLEI2Q.mjs.map +7 -0
  14. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  15. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  16. package/dist/types/src/components/SearchMain.d.ts +3 -2
  17. package/dist/types/src/components/SearchMain.d.ts.map +1 -1
  18. package/dist/types/src/components/SearchResults/SearchResults.d.ts +1 -1
  19. package/dist/types/src/components/SearchResults/SearchResults.d.ts.map +1 -1
  20. package/dist/types/src/components/Searchbar/Searchbar.d.ts +2 -1
  21. package/dist/types/src/components/Searchbar/Searchbar.d.ts.map +1 -1
  22. package/dist/types/src/components/Searchbar/Searchbar.stories.d.ts +1 -1
  23. package/dist/types/src/components/Searchbar/Searchbar.stories.d.ts.map +1 -1
  24. package/dist/types/src/hooks/index.d.ts +4 -0
  25. package/dist/types/src/hooks/index.d.ts.map +1 -0
  26. package/dist/types/src/{search-sync.d.ts → hooks/sync.d.ts} +3 -9
  27. package/dist/types/src/hooks/sync.d.ts.map +1 -0
  28. package/dist/types/src/hooks/sync.test.d.ts +2 -0
  29. package/dist/types/src/hooks/sync.test.d.ts.map +1 -0
  30. package/dist/types/src/{context.d.ts → hooks/useGlobalSearch.d.ts} +2 -2
  31. package/dist/types/src/hooks/useGlobalSearch.d.ts.map +1 -0
  32. package/dist/types/src/{search.d.ts → hooks/useSearchResults.d.ts} +1 -1
  33. package/dist/types/src/hooks/useSearchResults.d.ts.map +1 -0
  34. package/dist/types/src/hooks/useWebSearch.d.ts +10 -0
  35. package/dist/types/src/hooks/useWebSearch.d.ts.map +1 -0
  36. package/dist/types/src/index.d.ts +2 -2
  37. package/dist/types/src/index.d.ts.map +1 -1
  38. package/dist/types/src/search/exa.d.ts +19 -0
  39. package/dist/types/src/search/exa.d.ts.map +1 -0
  40. package/dist/types/src/search/exa.test.d.ts +2 -0
  41. package/dist/types/src/search/exa.test.d.ts.map +1 -0
  42. package/dist/types/src/search/index.d.ts +2 -0
  43. package/dist/types/src/search/index.d.ts.map +1 -0
  44. package/dist/types/src/translations.d.ts +1 -0
  45. package/dist/types/src/translations.d.ts.map +1 -1
  46. package/dist/types/src/{types.d.ts → types/action.d.ts} +1 -1
  47. package/dist/types/src/types/action.d.ts.map +1 -0
  48. package/dist/types/src/types/index.d.ts +3 -0
  49. package/dist/types/src/types/index.d.ts.map +1 -0
  50. package/dist/types/src/types/search.d.ts +21 -0
  51. package/dist/types/src/types/search.d.ts.map +1 -0
  52. package/package.json +29 -18
  53. package/src/SearchPlugin.tsx +7 -7
  54. package/src/capabilities/app-graph-builder.ts +28 -3
  55. package/src/capabilities/react-surface.tsx +26 -3
  56. package/src/components/Search.stories.tsx +1 -1
  57. package/src/components/SearchDialog.tsx +1 -1
  58. package/src/components/SearchMain.tsx +30 -11
  59. package/src/components/SearchResults/SearchResults.stories.tsx +1 -1
  60. package/src/components/SearchResults/SearchResults.tsx +16 -30
  61. package/src/components/Searchbar/Searchbar.stories.tsx +5 -2
  62. package/src/components/Searchbar/Searchbar.tsx +15 -3
  63. package/src/hooks/index.ts +7 -0
  64. package/src/{search.test.ts → hooks/sync.test.ts} +1 -1
  65. package/src/{search-sync.ts → hooks/sync.ts} +3 -10
  66. package/src/{context.tsx → hooks/useGlobalSearch.tsx} +2 -1
  67. package/src/{search.ts → hooks/useSearchResults.ts} +1 -1
  68. package/src/hooks/useWebSearch.ts +60 -0
  69. package/src/index.ts +2 -2
  70. package/src/search/exa.test.ts +237 -0
  71. package/src/search/exa.ts +250 -0
  72. package/src/search/index.ts +5 -0
  73. package/src/translations.ts +1 -0
  74. package/src/{types.tsx → types/action.tsx} +1 -1
  75. package/src/types/index.ts +6 -0
  76. package/src/types/search.ts +29 -0
  77. package/dist/lib/browser/app-graph-builder-SKWILENV.mjs +0 -41
  78. package/dist/lib/browser/app-graph-builder-SKWILENV.mjs.map +0 -7
  79. package/dist/lib/browser/chunk-2G5TBIJT.mjs.map +0 -7
  80. package/dist/lib/browser/react-surface-NAYLAW2V.mjs +0 -343
  81. package/dist/lib/browser/react-surface-NAYLAW2V.mjs.map +0 -7
  82. package/dist/types/src/context.d.ts.map +0 -1
  83. package/dist/types/src/search-sync.d.ts.map +0 -1
  84. package/dist/types/src/search.d.ts.map +0 -1
  85. package/dist/types/src/search.test.d.ts +0 -2
  86. package/dist/types/src/search.test.d.ts.map +0 -1
  87. package/dist/types/src/types.d.ts.map +0 -1
  88. /package/dist/lib/browser/{chunk-2QDXE2SP.mjs.map → chunk-J6YWSQTW.mjs.map} +0 -0
  89. /package/dist/lib/browser/{intent-resolver-M3EJMBGZ.mjs.map → intent-resolver-G76A35DX.mjs.map} +0 -0
@@ -1,343 +0,0 @@
1
- import {
2
- SearchContextProvider,
3
- mapObjectToTextFields,
4
- queryStringToMatch,
5
- useGlobalSearch,
6
- useGlobalSearchResults
7
- } from "./chunk-2G5TBIJT.mjs";
8
- import {
9
- SEARCH_PLUGIN,
10
- SEARCH_RESULT
11
- } from "./chunk-2QDXE2SP.mjs";
12
-
13
- // packages/plugins/experimental/plugin-search/src/capabilities/react-surface.tsx
14
- import React5 from "react";
15
- import { Capabilities, contributes, createSurface, useLayout as useLayout2, useAppGraph as useAppGraph2 } from "@dxos/app-framework";
16
- import { getActiveSpace } from "@dxos/plugin-space";
17
-
18
- // packages/plugins/experimental/plugin-search/src/components/Searchbar/Searchbar.tsx
19
- import { MagnifyingGlass } from "@phosphor-icons/react";
20
- import React, { useEffect, useRef, useState } from "react";
21
- import { Input } from "@dxos/react-ui";
22
- import { getSize, mx } from "@dxos/react-ui-theme";
23
- var Searchbar = ({ classes, variant, placeholder, value, onChange }) => {
24
- const inputRef = useRef(null);
25
- const [text, setText] = useState(value);
26
- useEffect(() => {
27
- setText(value);
28
- }, [
29
- value
30
- ]);
31
- const handleChange = (text2) => {
32
- setText(text2);
33
- onChange?.(text2);
34
- };
35
- const handleReset = () => {
36
- handleChange(void 0);
37
- inputRef.current?.focus();
38
- };
39
- return /* @__PURE__ */ React.createElement("div", {
40
- className: "flex w-full items-center pli-1 pbs-1"
41
- }, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.TextInput, {
42
- ref: inputRef,
43
- placeholder,
44
- variant,
45
- value: text ?? "",
46
- classNames: mx("pl-3 pr-10", classes?.input),
47
- onChange: ({ target }) => handleChange(target.value),
48
- onKeyDown: ({ key }) => key === "Escape" && handleReset()
49
- }), /* @__PURE__ */ React.createElement("div", {
50
- role: "button",
51
- className: "-ml-7 p-0 cursor-pointer",
52
- onClick: handleReset
53
- }, /* @__PURE__ */ React.createElement(MagnifyingGlass, {
54
- className: getSize(5)
55
- }))));
56
- };
57
-
58
- // packages/plugins/experimental/plugin-search/src/components/SearchMain.tsx
59
- import React3, { useState as useState2 } from "react";
60
- import { useClient } from "@dxos/react-client";
61
- import { Filter, useQuery } from "@dxos/react-client/echo";
62
- import { useTranslation } from "@dxos/react-ui";
63
- import { groupSurface, mx as mx3 } from "@dxos/react-ui-theme";
64
-
65
- // packages/plugins/experimental/plugin-search/src/components/SearchResults/SearchResults.tsx
66
- import { Buildings, Folders, User } from "@phosphor-icons/react";
67
- import React2, { forwardRef } from "react";
68
- import { ScrollArea } from "@dxos/react-ui";
69
- import { Card } from "@dxos/react-ui-card";
70
- import { ghostHover, mx as mx2 } from "@dxos/react-ui-theme";
71
- var styles = {
72
- selected: "!bg-primary-100 !dark:bg-primary-900"
73
- };
74
- var getIcon = (type) => {
75
- const iconMap = {
76
- user: User,
77
- organization: Buildings,
78
- project: Folders
79
- };
80
- return iconMap[type];
81
- };
82
- var Snippet = ({ text, match }) => {
83
- let content = /* @__PURE__ */ React2.createElement(React2.Fragment, null, text);
84
- if (match) {
85
- const result = text.match(match);
86
- if (result?.index !== void 0) {
87
- const maxOffset = 16;
88
- let before = text.slice(0, result.index);
89
- if (before.length > maxOffset) {
90
- const idx = before.indexOf(" ", result.index - maxOffset);
91
- before = "\u2026 " + before.slice(idx);
92
- }
93
- const after = text.slice(result.index + result[0].length);
94
- content = /* @__PURE__ */ React2.createElement(React2.Fragment, null, before, /* @__PURE__ */ React2.createElement("span", {
95
- className: "text-blue-500"
96
- }, result[0]), after);
97
- }
98
- }
99
- return /* @__PURE__ */ React2.createElement("span", {
100
- className: "text-xs mb-1 line-clamp-3 text-neutral-300"
101
- }, content);
102
- };
103
- var SearchItem = /* @__PURE__ */ forwardRef((item, forwardRef3) => {
104
- const { id, type, label, snippet, match, selected, onSelect } = item;
105
- const Icon2 = type ? getIcon(type) : void 0;
106
- return /* @__PURE__ */ React2.createElement(Card.Root, {
107
- ref: forwardRef3,
108
- classNames: mx2("mx-2 mt-2 cursor-pointer", ghostHover, selected && styles.selected),
109
- onClick: () => onSelect?.(id)
110
- }, /* @__PURE__ */ React2.createElement(Card.Header, null, /* @__PURE__ */ React2.createElement(Card.Title, {
111
- title: label ?? "Untitled"
112
- }), Icon2 && /* @__PURE__ */ React2.createElement(Card.Endcap, {
113
- Icon: Icon2
114
- })), snippet && /* @__PURE__ */ React2.createElement(Card.Body, {
115
- gutter: true
116
- }, /* @__PURE__ */ React2.createElement(Snippet, {
117
- text: snippet,
118
- match
119
- })));
120
- });
121
- var SearchResults = ({ items, selected, onSelect }) => {
122
- return /* @__PURE__ */ React2.createElement(ScrollArea.Root, {
123
- classNames: "grow"
124
- }, /* @__PURE__ */ React2.createElement(ScrollArea.Viewport, null, items.map((item) => /* @__PURE__ */ React2.createElement(SearchItem, {
125
- key: item.id,
126
- type: SEARCH_RESULT,
127
- ...item,
128
- onSelect,
129
- selected: selected === item.id
130
- }))), /* @__PURE__ */ React2.createElement(ScrollArea.Scrollbar, {
131
- orientation: "vertical"
132
- }, /* @__PURE__ */ React2.createElement(ScrollArea.Thumb, null)), /* @__PURE__ */ React2.createElement(ScrollArea.Corner, null));
133
- };
134
-
135
- // packages/plugins/experimental/plugin-search/src/components/SearchMain.tsx
136
- var SearchMain = ({ space }) => {
137
- const { t } = useTranslation(SEARCH_PLUGIN);
138
- const client = useClient();
139
- const { setMatch } = useGlobalSearch();
140
- const allSpaces = false;
141
- const objects = useQuery(allSpaces ? client.spaces : space, Filter.all());
142
- const results = useGlobalSearchResults(objects);
143
- const [selected, setSelected] = useState2();
144
- const handleSelect = (id) => {
145
- setSelected((selected2) => selected2 === id ? void 0 : id);
146
- };
147
- return /* @__PURE__ */ React3.createElement("div", {
148
- className: "flex flex-col grow h-full"
149
- }, /* @__PURE__ */ React3.createElement(Searchbar, {
150
- placeholder: t("search placeholder"),
151
- onChange: setMatch
152
- }), results.length > 0 && /* @__PURE__ */ React3.createElement("div", {
153
- className: "absolute top-[--topbar-size] bottom-0 z-[1]"
154
- }, /* @__PURE__ */ React3.createElement("div", {
155
- className: mx3("flex flex-col h-full overflow-hidden", groupSurface)
156
- }, /* @__PURE__ */ React3.createElement(SearchResults, {
157
- items: results,
158
- selected,
159
- onSelect: handleSelect
160
- }))));
161
- };
162
-
163
- // packages/plugins/experimental/plugin-search/src/components/SearchDialog.tsx
164
- import React4, { forwardRef as forwardRef2, useCallback, useState as useState4 } from "react";
165
- import { LayoutAction, createIntent, useAppGraph, useIntentDispatcher, useLayout } from "@dxos/app-framework";
166
- import { useClient as useClient2 } from "@dxos/react-client";
167
- import { Filter as Filter2, fullyQualifiedId, useQuery as useQuery2 } from "@dxos/react-client/echo";
168
- import { Button, Dialog, Icon, toLocalizedString, useTranslation as useTranslation2 } from "@dxos/react-ui";
169
- import { SearchList } from "@dxos/react-ui-searchlist";
170
- import { descriptionText, mx as mx4 } from "@dxos/react-ui-theme";
171
-
172
- // packages/plugins/experimental/plugin-search/src/search.ts
173
- import { yieldOrContinue } from "main-thread-scheduling";
174
- import { useEffect as useEffect2, useState as useState3 } from "react";
175
- import { TextType } from "@dxos/schema";
176
- var filterObjects = async (objects, match) => {
177
- const result = /* @__PURE__ */ new Map();
178
- if (!match) {
179
- return result;
180
- }
181
- await Promise.all(objects.filter((object) => !(object instanceof TextType)).map(async (object) => {
182
- await yieldOrContinue("interactive");
183
- const fields = mapObjectToTextFields(object);
184
- Object.entries(fields).filter(([_, value]) => value.match(match)).forEach(([key, value]) => {
185
- if (!result.has(object)) {
186
- result.set(object, []);
187
- }
188
- result.set(object, [
189
- ...result.get(object),
190
- [
191
- key,
192
- value
193
- ]
194
- ]);
195
- });
196
- }));
197
- return result;
198
- };
199
- var useSearchResults = (queryString, objects, delay = 400) => {
200
- const [results, setResults] = useState3(/* @__PURE__ */ new Map());
201
- const [pending, setPending] = useState3(false);
202
- useEffect2(() => {
203
- setPending(!!(objects && queryString));
204
- const timeoutId = setTimeout(async () => {
205
- const nextResults = objects && queryString ? await filterObjects(objects, queryStringToMatch(queryString)) : /* @__PURE__ */ new Map();
206
- setResults(nextResults);
207
- setPending(false);
208
- }, delay);
209
- return () => clearTimeout(timeoutId);
210
- }, [
211
- queryString,
212
- objects
213
- ]);
214
- return [
215
- pending,
216
- results
217
- ];
218
- };
219
-
220
- // packages/plugins/experimental/plugin-search/src/components/SearchDialog.tsx
221
- var SEARCH_DIALOG = `${SEARCH_PLUGIN}/SearchDialog`;
222
- var SearchListResult = /* @__PURE__ */ forwardRef2(({ node, onSelect }, forwardedRef) => {
223
- const { t } = useTranslation2(SEARCH_PLUGIN);
224
- const label = toLocalizedString(node?.properties.label ?? "never", t);
225
- return /* @__PURE__ */ React4.createElement(SearchList.Item, {
226
- value: label,
227
- key: node.id,
228
- classNames: "flex gap-2 items-center pli-2",
229
- onSelect: () => onSelect?.(node.id),
230
- ref: forwardedRef
231
- }, /* @__PURE__ */ React4.createElement(Icon, {
232
- size: 5,
233
- icon: node?.properties.icon
234
- }), /* @__PURE__ */ React4.createElement("span", {
235
- className: "is-0 grow truncate"
236
- }, label));
237
- });
238
- var SearchDialog = ({ pivotId }) => {
239
- const { t } = useTranslation2(SEARCH_PLUGIN);
240
- const { graph } = useAppGraph();
241
- const layout = useLayout();
242
- const closed = (Array.isArray(layout.inactive) ? layout.inactive : [
243
- layout.inactive
244
- ]).map((id) => graph?.findNode(id)).filter(Boolean);
245
- const [queryString, setQueryString] = useState4("");
246
- const client = useClient2();
247
- const dangerouslyLoadAllObjects = useQuery2(client.spaces, Filter2.all());
248
- const [pending, results] = useSearchResults(queryString, dangerouslyLoadAllObjects);
249
- const resultObjects = Array.from(results.keys());
250
- const { dispatchPromise: dispatch } = useIntentDispatcher();
251
- const handleSelect = useCallback(async (nodeId) => {
252
- await dispatch(createIntent(LayoutAction.UpdateDialog, {
253
- part: "dialog",
254
- options: {
255
- state: false
256
- }
257
- }));
258
- const index = layout.active.findIndex((id) => id === nodeId);
259
- if (index !== -1) {
260
- await dispatch(createIntent(LayoutAction.ScrollIntoView, {
261
- part: "current",
262
- subject: nodeId
263
- }));
264
- } else {
265
- await dispatch(createIntent(LayoutAction.Open, {
266
- part: "main",
267
- subject: [
268
- nodeId
269
- ],
270
- options: {
271
- pivotId,
272
- positioning: "end"
273
- }
274
- }));
275
- }
276
- }, [
277
- pivotId,
278
- dispatch,
279
- layout
280
- ]);
281
- return /* @__PURE__ */ React4.createElement(Dialog.Content, {
282
- classNames: [
283
- "md:max-is-[24rem] overflow-hidden mbs-12"
284
- ]
285
- }, /* @__PURE__ */ React4.createElement(Dialog.Title, null, t("search dialog title")), /* @__PURE__ */ React4.createElement(SearchList.Root, {
286
- label: t("search placeholder"),
287
- classNames: "flex flex-col grow overflow-hidden my-2"
288
- }, /* @__PURE__ */ React4.createElement(SearchList.Input, {
289
- value: queryString,
290
- onValueChange: (nextValue) => {
291
- setQueryString(nextValue);
292
- },
293
- placeholder: t("search placeholder"),
294
- classNames: "px-1 my-2"
295
- }), /* @__PURE__ */ React4.createElement(SearchList.Content, {
296
- classNames: "max-bs-[24rem] overflow-auto"
297
- }, queryString.length > 0 ? resultObjects.length > 0 ? resultObjects.map((object) => graph?.findNode(fullyQualifiedId(object))).filter(Boolean).map((node) => /* @__PURE__ */ React4.createElement(SearchListResult, {
298
- key: node.id,
299
- node,
300
- onSelect: handleSelect
301
- })) : /* @__PURE__ */ React4.createElement("p", {
302
- className: "pli-1"
303
- }, t(pending ? "pending results message" : "empty results message")) : /* @__PURE__ */ React4.createElement(React4.Fragment, null, closed.length > 0 && /* @__PURE__ */ React4.createElement("h2", {
304
- className: mx4("mlb-1", descriptionText)
305
- }, t("recently closed heading")), closed.map((node) => /* @__PURE__ */ React4.createElement(SearchListResult, {
306
- key: node.id,
307
- node,
308
- onSelect: handleSelect
309
- }))))), /* @__PURE__ */ React4.createElement(Dialog.Close, {
310
- asChild: true
311
- }, /* @__PURE__ */ React4.createElement(Button, {
312
- variant: "primary",
313
- classNames: "mbs-2"
314
- }, t("close label", {
315
- ns: "os"
316
- }))));
317
- };
318
-
319
- // packages/plugins/experimental/plugin-search/src/capabilities/react-surface.tsx
320
- var react_surface_default = () => contributes(Capabilities.ReactSurface, [
321
- createSurface({
322
- id: SEARCH_DIALOG,
323
- role: "dialog",
324
- filter: (data) => data.component === SEARCH_DIALOG,
325
- component: ({ data }) => /* @__PURE__ */ React5.createElement(SearchContextProvider, null, /* @__PURE__ */ React5.createElement(SearchDialog, data.props))
326
- }),
327
- createSurface({
328
- id: "search-input",
329
- role: "search-input",
330
- component: () => {
331
- const layout = useLayout2();
332
- const { graph } = useAppGraph2();
333
- const space = graph ? getActiveSpace(graph, layout.active[0]) : void 0;
334
- return space ? /* @__PURE__ */ React5.createElement(SearchContextProvider, null, /* @__PURE__ */ React5.createElement(SearchMain, {
335
- space
336
- })) : null;
337
- }
338
- })
339
- ]);
340
- export {
341
- react_surface_default as default
342
- };
343
- //# sourceMappingURL=react-surface-NAYLAW2V.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/react-surface.tsx", "../../../src/components/Searchbar/Searchbar.tsx", "../../../src/components/SearchMain.tsx", "../../../src/components/SearchResults/SearchResults.tsx", "../../../src/components/SearchDialog.tsx", "../../../src/search.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Capabilities, contributes, createSurface, useLayout, useAppGraph } from '@dxos/app-framework';\nimport { getActiveSpace } from '@dxos/plugin-space';\n\nimport { SEARCH_DIALOG, SearchDialog, type SearchDialogProps, SearchMain } from '../components';\nimport { SearchContextProvider } from '../context';\n\nexport default () =>\n contributes(Capabilities.ReactSurface, [\n createSurface({\n id: SEARCH_DIALOG,\n role: 'dialog',\n filter: (data): data is { props: SearchDialogProps } => data.component === SEARCH_DIALOG,\n component: ({ data }) => (\n <SearchContextProvider>\n <SearchDialog {...data.props} />\n </SearchContextProvider>\n ),\n }),\n createSurface({\n id: 'search-input',\n role: 'search-input',\n component: () => {\n const layout = useLayout();\n const { graph } = useAppGraph();\n const space = graph ? getActiveSpace(graph, layout.active[0]) : undefined;\n return space ? (\n <SearchContextProvider>\n <SearchMain space={space} />\n </SearchContextProvider>\n ) : null;\n },\n }),\n ]);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { MagnifyingGlass } from '@phosphor-icons/react';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { Input, type TextInputProps } from '@dxos/react-ui';\nimport { getSize, mx } from '@dxos/react-ui-theme';\n\nexport type SearchbarProps = Pick<TextInputProps, 'variant' | 'placeholder'> & {\n classes?: {\n root?: string;\n input?: string;\n };\n value?: string;\n onChange?: (text?: string) => void;\n delay?: number;\n};\n\nexport const Searchbar = ({ classes, variant, placeholder, value, onChange }: SearchbarProps) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [text, setText] = useState(value);\n useEffect(() => {\n setText(value);\n }, [value]);\n const handleChange = (text?: string) => {\n setText(text);\n onChange?.(text);\n };\n\n const handleReset = () => {\n handleChange(undefined);\n inputRef.current?.focus();\n };\n\n return (\n <div className='flex w-full items-center pli-1 pbs-1'>\n <Input.Root>\n <Input.TextInput\n ref={inputRef}\n placeholder={placeholder}\n variant={variant}\n value={text ?? ''}\n classNames={mx('pl-3 pr-10', classes?.input)}\n onChange={({ target }) => handleChange(target.value)}\n onKeyDown={({ key }) => key === 'Escape' && handleReset()}\n />\n\n {/* TODO(burdon): Margin should be density specific. */}\n <div role='button' className='-ml-7 p-0 cursor-pointer' onClick={handleReset}>\n <MagnifyingGlass className={getSize(5)} />\n </div>\n </Input.Root>\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type FC, useState } from 'react';\n\nimport { useClient } from '@dxos/react-client';\nimport { Filter, useQuery, type Space } from '@dxos/react-client/echo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { groupSurface, mx } from '@dxos/react-ui-theme';\n\nimport { SearchResults } from './SearchResults';\nimport { Searchbar } from './Searchbar';\nimport { useGlobalSearch, useGlobalSearchResults } from '../context';\nimport { SEARCH_PLUGIN } from '../meta';\n\nexport const SearchMain: FC<{ space: Space }> = ({ space }) => {\n const { t } = useTranslation(SEARCH_PLUGIN);\n const client = useClient();\n const { setMatch } = useGlobalSearch();\n // TODO(burdon): UX to select all spaces.\n const allSpaces = false;\n\n // TODO(burdon): Returns ALL objects (e.g., incl. Text objects that are fields of parent objects).\n const objects = useQuery(allSpaces ? client.spaces : space, Filter.all());\n const results = useGlobalSearchResults(objects);\n\n const [selected, setSelected] = useState<string>();\n\n // TODO(burdon): Activate and/or filter current main (set context).\n const handleSelect = (id: string) => {\n setSelected((selected) => (selected === id ? undefined : id));\n };\n\n return (\n <div className='flex flex-col grow h-full'>\n <Searchbar placeholder={t('search placeholder')} onChange={setMatch} />\n {results.length > 0 && (\n <div className='absolute top-[--topbar-size] bottom-0 z-[1]'>\n {/* TODO(burdon): Change to Portal? */}\n <div className={mx('flex flex-col h-full overflow-hidden', groupSurface)}>\n <SearchResults items={results} selected={selected} onSelect={handleSelect} />\n </div>\n </div>\n )}\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Icon, Buildings, Folders, User } from '@phosphor-icons/react';\nimport React, { type FC, forwardRef } from 'react';\n\nimport { ScrollArea } from '@dxos/react-ui';\nimport { Card } from '@dxos/react-ui-card';\nimport { ghostHover, mx } from '@dxos/react-ui-theme';\n\nimport { SEARCH_RESULT } from '../../meta';\nimport type { SearchResult } from '../../search-sync';\n\n// TODO(burdon): Factor out.\nconst styles = {\n selected: '!bg-primary-100 !dark:bg-primary-900',\n};\n\n// TODO(burdon): Registry defined by plugins?\nconst getIcon = (type: string): Icon | undefined => {\n const iconMap: Record<string, Icon> = {\n user: User,\n organization: Buildings,\n project: Folders,\n };\n\n return iconMap[type];\n};\n\nexport const Snippet: FC<{ text: string; match?: RegExp }> = ({ text, match }) => {\n let content = <>{text}</>;\n if (match) {\n const result = text.match(match);\n if (result?.index !== undefined) {\n // Break near to match.\n const maxOffset = 16;\n let before = text.slice(0, result.index);\n if (before.length > maxOffset) {\n const idx = before.indexOf(' ', result.index - maxOffset);\n before = '… ' + before.slice(idx);\n }\n\n const after = text.slice(result.index + result[0].length);\n content = (\n <>\n {before}\n <span className='text-blue-500'>{result[0]}</span>\n {after}\n </>\n );\n }\n }\n\n return <span className='text-xs mb-1 line-clamp-3 text-neutral-300'>{content}</span>;\n};\n\nexport type SearchItemProps = SearchResult & { selected: boolean } & Pick<SearchResultsProps, 'onSelect'>;\n\nexport const SearchItem = forwardRef<HTMLDivElement, SearchItemProps>((item, forwardRef) => {\n const { id, type, label, snippet, match, selected, onSelect } = item;\n const Icon = type ? getIcon(type) : undefined;\n\n return (\n <Card.Root\n ref={forwardRef}\n classNames={mx('mx-2 mt-2 cursor-pointer', ghostHover, selected && styles.selected)}\n onClick={() => onSelect?.(id)}\n >\n <Card.Header>\n <Card.Title title={label ?? 'Untitled'} />\n {Icon && <Card.Endcap Icon={Icon} />}\n </Card.Header>\n {snippet && (\n <Card.Body gutter>\n <Snippet text={snippet} match={match} />\n </Card.Body>\n )}\n </Card.Root>\n );\n});\n\nexport type SearchResultsProps = {\n match?: RegExp;\n items: SearchResult[];\n selected?: string;\n onSelect?: (id: string) => void;\n};\n\n// TODO(burdon): Key cursor up/down.\nexport const SearchResults = ({ items, selected, onSelect }: SearchResultsProps) => {\n return (\n <ScrollArea.Root classNames='grow'>\n <ScrollArea.Viewport>\n {items.map((item) => (\n <SearchItem\n key={item.id}\n type={SEARCH_RESULT}\n {...item}\n onSelect={onSelect}\n selected={selected === item.id}\n />\n ))}\n </ScrollArea.Viewport>\n <ScrollArea.Scrollbar orientation='vertical'>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n <ScrollArea.Corner />\n </ScrollArea.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { forwardRef, useCallback, useState } from 'react';\n\nimport { LayoutAction, createIntent, useAppGraph, useIntentDispatcher, useLayout } from '@dxos/app-framework';\nimport { type Node } from '@dxos/plugin-graph';\nimport { useClient } from '@dxos/react-client';\nimport { Filter, fullyQualifiedId, useQuery } from '@dxos/react-client/echo';\nimport { Button, Dialog, Icon, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { SearchList, type SearchListItemProps } from '@dxos/react-ui-searchlist';\nimport { descriptionText, mx } from '@dxos/react-ui-theme';\n\nimport { SEARCH_PLUGIN } from '../meta';\nimport { useSearchResults } from '../search';\n\nexport const SEARCH_DIALOG = `${SEARCH_PLUGIN}/SearchDialog`;\n\ntype SearchListResultProps = {\n node: Node;\n} & Pick<SearchListItemProps, 'onSelect'>;\n\nconst SearchListResult = forwardRef<HTMLDivElement, SearchListResultProps>(({ node, onSelect }, forwardedRef) => {\n const { t } = useTranslation(SEARCH_PLUGIN);\n const label = toLocalizedString(node?.properties.label ?? 'never', t);\n return (\n <SearchList.Item\n value={label}\n key={node!.id}\n classNames='flex gap-2 items-center pli-2'\n onSelect={() => onSelect?.(node!.id)}\n ref={forwardedRef}\n >\n <Icon size={5} icon={node?.properties.icon} />\n <span className='is-0 grow truncate'>{label}</span>\n </SearchList.Item>\n );\n});\n\nexport type SearchDialogProps = {\n pivotId: string;\n};\n\nexport const SearchDialog = ({ pivotId }: SearchDialogProps) => {\n const { t } = useTranslation(SEARCH_PLUGIN);\n const { graph } = useAppGraph();\n const layout = useLayout();\n const closed = (Array.isArray(layout.inactive) ? layout.inactive : [layout.inactive])\n .map((id) => graph?.findNode(id))\n .filter(Boolean);\n const [queryString, setQueryString] = useState('');\n const client = useClient();\n const dangerouslyLoadAllObjects = useQuery(client.spaces, Filter.all());\n const [pending, results] = useSearchResults(queryString, dangerouslyLoadAllObjects);\n const resultObjects = Array.from(results.keys());\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n\n const handleSelect = useCallback(\n async (nodeId: string) => {\n await dispatch(createIntent(LayoutAction.UpdateDialog, { part: 'dialog', options: { state: false } }));\n\n // If node is already present in the active parts, scroll to it and close the dialog.\n const index = layout.active.findIndex((id) => id === nodeId);\n if (index !== -1) {\n await dispatch(createIntent(LayoutAction.ScrollIntoView, { part: 'current', subject: nodeId }));\n } else {\n await dispatch(\n createIntent(LayoutAction.Open, {\n part: 'main',\n subject: [nodeId],\n options: {\n pivotId,\n positioning: 'end',\n },\n }),\n );\n }\n },\n [pivotId, dispatch, layout],\n );\n\n return (\n <Dialog.Content classNames={['md:max-is-[24rem] overflow-hidden mbs-12']}>\n <Dialog.Title>{t('search dialog title')}</Dialog.Title>\n <SearchList.Root label={t('search placeholder')} classNames='flex flex-col grow overflow-hidden my-2'>\n <SearchList.Input\n value={queryString}\n onValueChange={(nextValue) => {\n setQueryString(nextValue);\n }}\n placeholder={t('search placeholder')}\n classNames='px-1 my-2'\n />\n <SearchList.Content classNames='max-bs-[24rem] overflow-auto'>\n {queryString.length > 0 ? (\n resultObjects.length > 0 ? (\n resultObjects\n .map((object) => graph?.findNode(fullyQualifiedId(object)))\n .filter(Boolean)\n .map((node) => <SearchListResult key={node!.id} node={node!} onSelect={handleSelect} />)\n ) : (\n <p className='pli-1'>{t(pending ? 'pending results message' : 'empty results message')}</p>\n )\n ) : (\n <>\n {closed.length > 0 && <h2 className={mx('mlb-1', descriptionText)}>{t('recently closed heading')}</h2>}\n {closed.map((node) => (\n <SearchListResult key={node!.id} node={node!} onSelect={handleSelect} />\n ))}\n </>\n )}\n </SearchList.Content>\n </SearchList.Root>\n\n <Dialog.Close asChild>\n <Button variant='primary' classNames='mbs-2'>\n {t('close label', { ns: 'os' })}\n </Button>\n </Dialog.Close>\n </Dialog.Content>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { yieldOrContinue } from 'main-thread-scheduling';\nimport { useEffect, useState } from 'react';\n\nimport { TextType } from '@dxos/schema';\n\n// TODO(thure): Deprecate search-sync, move still-relevant utilities elsewhere (here, probably).\nimport { mapObjectToTextFields, queryStringToMatch } from './search-sync';\n\nexport const filterObjects = async <T extends Record<string, any>>(\n objects: T[],\n match?: RegExp,\n): Promise<Map<T, string[][]>> => {\n const result = new Map<T, string[][]>();\n if (!match) {\n return result;\n }\n await Promise.all(\n objects\n .filter((object) => !(object instanceof TextType))\n .map(async (object) => {\n await yieldOrContinue('interactive');\n const fields = mapObjectToTextFields<T>(object);\n Object.entries(fields)\n .filter(([_, value]) => value.match(match))\n .forEach(([key, value]) => {\n if (!result.has(object)) {\n result.set(object, []);\n }\n result.set(object, [...result.get(object)!, [key, value]]);\n });\n }),\n );\n return result;\n};\n\nexport const useSearchResults = <T extends Record<string, any>>(\n queryString?: string,\n objects?: T[],\n delay: number = 400,\n): [boolean, Map<T, string[][]>] => {\n const [results, setResults] = useState<Map<T, string[][]>>(new Map());\n const [pending, setPending] = useState(false);\n\n useEffect(() => {\n setPending(!!(objects && queryString));\n const timeoutId = setTimeout(async () => {\n const nextResults =\n objects && queryString ? await filterObjects(objects, queryStringToMatch(queryString)) : new Map();\n setResults(nextResults);\n setPending(false);\n }, delay);\n\n return () => clearTimeout(timeoutId);\n }, [queryString, objects]);\n\n return [pending, results];\n};\n"],
5
- "mappings": "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",
6
- "names": ["React", "Capabilities", "contributes", "createSurface", "useLayout", "useAppGraph", "getActiveSpace", "MagnifyingGlass", "React", "useEffect", "useRef", "useState", "Input", "getSize", "mx", "Searchbar", "classes", "variant", "placeholder", "value", "onChange", "inputRef", "useRef", "text", "setText", "useState", "useEffect", "handleChange", "handleReset", "undefined", "current", "focus", "div", "className", "Input", "Root", "TextInput", "ref", "classNames", "mx", "input", "target", "onKeyDown", "key", "role", "onClick", "MagnifyingGlass", "getSize", "React", "useState", "useClient", "Filter", "useQuery", "useTranslation", "groupSurface", "mx", "Buildings", "Folders", "User", "React", "forwardRef", "ScrollArea", "Card", "ghostHover", "mx", "styles", "selected", "getIcon", "type", "iconMap", "user", "User", "organization", "Buildings", "project", "Folders", "Snippet", "text", "match", "content", "React", "result", "index", "undefined", "maxOffset", "before", "slice", "length", "idx", "indexOf", "after", "span", "className", "SearchItem", "forwardRef", "item", "id", "label", "snippet", "onSelect", "Icon", "Card", "Root", "ref", "classNames", "mx", "ghostHover", "onClick", "Header", "Title", "title", "Endcap", "Body", "gutter", "SearchResults", "items", "ScrollArea", "Viewport", "map", "key", "SEARCH_RESULT", "Scrollbar", "orientation", "Thumb", "Corner", "SearchMain", "space", "t", "useTranslation", "SEARCH_PLUGIN", "client", "useClient", "setMatch", "useGlobalSearch", "allSpaces", "objects", "useQuery", "spaces", "Filter", "all", "results", "useGlobalSearchResults", "selected", "setSelected", "useState", "handleSelect", "id", "undefined", "React", "div", "className", "Searchbar", "placeholder", "onChange", "length", "mx", "groupSurface", "SearchResults", "items", "onSelect", "React", "forwardRef", "useCallback", "useState", "LayoutAction", "createIntent", "useAppGraph", "useIntentDispatcher", "useLayout", "useClient", "Filter", "fullyQualifiedId", "useQuery", "Button", "Dialog", "Icon", "toLocalizedString", "useTranslation", "SearchList", "descriptionText", "mx", "yieldOrContinue", "useEffect", "useState", "TextType", "filterObjects", "objects", "match", "result", "Map", "Promise", "all", "filter", "object", "TextType", "map", "yieldOrContinue", "fields", "mapObjectToTextFields", "Object", "entries", "_", "value", "forEach", "key", "has", "set", "get", "useSearchResults", "queryString", "delay", "results", "setResults", "useState", "pending", "setPending", "useEffect", "timeoutId", "setTimeout", "nextResults", "queryStringToMatch", "clearTimeout", "SEARCH_DIALOG", "SEARCH_PLUGIN", "SearchListResult", "forwardRef", "node", "onSelect", "forwardedRef", "t", "useTranslation", "label", "toLocalizedString", "properties", "React", "SearchList", "Item", "value", "key", "id", "classNames", "ref", "Icon", "size", "icon", "span", "className", "SearchDialog", "pivotId", "graph", "useAppGraph", "layout", "useLayout", "closed", "Array", "isArray", "inactive", "map", "findNode", "filter", "Boolean", "queryString", "setQueryString", "useState", "client", "useClient", "dangerouslyLoadAllObjects", "useQuery", "spaces", "Filter", "all", "pending", "results", "useSearchResults", "resultObjects", "from", "keys", "dispatchPromise", "dispatch", "useIntentDispatcher", "handleSelect", "useCallback", "nodeId", "createIntent", "LayoutAction", "UpdateDialog", "part", "options", "state", "index", "active", "findIndex", "ScrollIntoView", "subject", "Open", "positioning", "Dialog", "Content", "Title", "Root", "Input", "onValueChange", "nextValue", "placeholder", "length", "object", "fullyQualifiedId", "p", "h2", "mx", "descriptionText", "Close", "asChild", "Button", "variant", "ns", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "SEARCH_DIALOG", "role", "filter", "data", "component", "React", "SearchContextProvider", "SearchDialog", "props", "layout", "useLayout", "graph", "useAppGraph", "space", "getActiveSpace", "active", "undefined", "SearchMain"]
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/context.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAAiB,KAAK,iBAAiB,EAAiC,MAAM,OAAO,CAAC;AAIpG,OAAO,EAAyC,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAEzF,KAAK,iBAAiB,GAAG;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC,CAAC;AAIF,eAAO,MAAM,qBAAqB,iBAAkB,iBAAiB,sBAIpE,CAAC;AAEF,eAAO,MAAM,eAAe,yBAE3B,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,EAAE,KAAG,YAAY,EAGjG,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,EAAE,KAAG,CAAC,EAOxF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"search-sync.d.ts","sourceRoot":"","sources":["../../../src/search-sync.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,kBAAkB,iBAAkB,MAAM,KAAG,MAAM,GAAG,SAGlE,CAAC;AAuBF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,GAAG,CAAC;CACd,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,UAAU,MAAM,KAAG,YAAY,EAqC3G,CAAC;AAiCF,eAAO,MAAM,qBAAqB,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,KAAG,UAapF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/search.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,aAAa,GAAU,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,WACtD,CAAC,EAAE,UACJ,MAAM,KACb,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAsB5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gBAC9C,MAAM,YACV,CAAC,EAAE,UACN,MAAM,KACZ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAiB9B,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=search.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.test.d.ts","sourceRoot":"","sources":["../../../src/search.test.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAItC,yBAAiB,YAAY,CAAC;;;;;;;IAG5B,MAAM,OAAO,UAAW,SAAQ,eAG9B;KAAG;;CACN"}