@dxos/plugin-search 0.7.4 → 0.7.5-main.9cb18ac

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.
@@ -6,7 +6,7 @@ import {
6
6
 
7
7
  // packages/plugins/experimental/plugin-search/src/SearchPlugin.tsx
8
8
  import React6 from "react";
9
- import { resolvePlugin, parseIntentPlugin, parseGraphPlugin as parseGraphPlugin2, parseNavigationPlugin as parseNavigationPlugin2, LayoutAction as LayoutAction2, firstIdInPart } from "@dxos/app-framework";
9
+ import { resolvePlugin, parseIntentPlugin, parseGraphPlugin as parseGraphPlugin2, parseNavigationPlugin as parseNavigationPlugin2, LayoutAction as LayoutAction2, firstIdInPart, createSurface, createResolver, createIntent as createIntent2 } from "@dxos/app-framework";
10
10
  import { createExtension } from "@dxos/plugin-graph";
11
11
  import { getActiveSpace } from "@dxos/plugin-space";
12
12
 
@@ -296,7 +296,7 @@ var SearchMain = ({ space }) => {
296
296
 
297
297
  // packages/plugins/experimental/plugin-search/src/components/SearchDialog.tsx
298
298
  import React5, { forwardRef as forwardRef2, useCallback, useState as useState5 } from "react";
299
- import { useResolvePlugin, parseNavigationPlugin, parseGraphPlugin, NavigationAction, LayoutAction, isLayoutParts, useIntentDispatcher } from "@dxos/app-framework";
299
+ import { useResolvePlugin, parseNavigationPlugin, parseGraphPlugin, NavigationAction, LayoutAction, isLayoutParts, useIntentDispatcher, createIntent } from "@dxos/app-framework";
300
300
  import { useClient as useClient2 } from "@dxos/react-client";
301
301
  import { Filter as Filter2, fullyQualifiedId, useQuery as useQuery2 } from "@dxos/react-client/echo";
302
302
  import { Button, Dialog, Icon, toLocalizedString, useTranslation as useTranslation2 } from "@dxos/react-ui";
@@ -352,6 +352,7 @@ var useSearchResults = (queryString, objects, delay = 400) => {
352
352
  };
353
353
 
354
354
  // packages/plugins/experimental/plugin-search/src/components/SearchDialog.tsx
355
+ var SEARCH_DIALOG = `${SEARCH_PLUGIN}/SearchDialog`;
355
356
  var SearchListResult = /* @__PURE__ */ forwardRef2(({ node, onSelect }, forwardedRef) => {
356
357
  const { t } = useTranslation2(SEARCH_PLUGIN);
357
358
  const label = toLocalizedString(node?.properties.label ?? "never", t);
@@ -368,7 +369,7 @@ var SearchListResult = /* @__PURE__ */ forwardRef2(({ node, onSelect }, forwarde
368
369
  className: "is-0 grow truncate"
369
370
  }, label));
370
371
  });
371
- var SearchDialog = ({ subject }) => {
372
+ var SearchDialog = ({ layoutCoordinate }) => {
372
373
  const { t } = useTranslation2(SEARCH_PLUGIN);
373
374
  const graphPlugin = useResolvePlugin(parseGraphPlugin);
374
375
  const graph = graphPlugin?.provides.graph;
@@ -383,54 +384,36 @@ var SearchDialog = ({ subject }) => {
383
384
  const dangerouslyLoadAllObjects = useQuery2(client.spaces, Filter2.all());
384
385
  const [pending, results] = useSearchResults(queryString, dangerouslyLoadAllObjects);
385
386
  const resultObjects = Array.from(results.keys());
386
- const dispatch = useIntentDispatcher();
387
- const handleSelect = useCallback((nodeId) => {
387
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
388
+ const handleSelect = useCallback(async (nodeId) => {
388
389
  if (active && isLayoutParts(active)) {
389
390
  const index = active?.main?.findIndex((entry) => entry.id === nodeId);
390
391
  if (index !== -1) {
391
- return dispatch([
392
- {
393
- action: LayoutAction.SET_LAYOUT,
394
- data: {
395
- element: "dialog",
396
- state: false
397
- }
398
- },
399
- {
400
- action: LayoutAction.SCROLL_INTO_VIEW,
401
- data: {
402
- id: nodeId
403
- }
404
- }
405
- ]);
392
+ await dispatch(createIntent(LayoutAction.SetLayout, {
393
+ element: "dialog",
394
+ state: false
395
+ }));
396
+ await dispatch(createIntent(LayoutAction.ScrollIntoView, {
397
+ id: nodeId
398
+ }));
399
+ return;
406
400
  }
407
- return dispatch([
408
- {
409
- action: NavigationAction.ADD_TO_ACTIVE,
410
- data: {
411
- part: subject.layoutCoordinate.part,
412
- id: nodeId,
413
- pivotId: subject.layoutCoordinate.entryId,
414
- positioning: "end"
415
- }
416
- },
417
- {
418
- action: LayoutAction.SET_LAYOUT,
419
- data: {
420
- element: "dialog",
421
- state: false
422
- }
423
- },
424
- {
425
- action: LayoutAction.SCROLL_INTO_VIEW,
426
- data: {
427
- id: nodeId
428
- }
429
- }
430
- ]);
401
+ await dispatch(createIntent(NavigationAction.AddToActive, {
402
+ part: layoutCoordinate.part,
403
+ id: nodeId,
404
+ pivotId: layoutCoordinate.entryId,
405
+ positioning: "end"
406
+ }));
407
+ await dispatch(createIntent(LayoutAction.SetLayout, {
408
+ element: "dialog",
409
+ state: false
410
+ }));
411
+ await dispatch(createIntent(LayoutAction.ScrollIntoView, {
412
+ id: nodeId
413
+ }));
431
414
  }
432
415
  }, [
433
- subject,
416
+ layoutCoordinate,
434
417
  dispatch,
435
418
  active
436
419
  ]);
@@ -490,22 +473,22 @@ var translations_default = [
490
473
  ];
491
474
 
492
475
  // packages/plugins/experimental/plugin-search/src/types.tsx
493
- var SEARCH_ACTION = `${SEARCH_PLUGIN}/action`;
476
+ import { S } from "@dxos/echo-schema";
494
477
  var SearchAction;
495
478
  (function(SearchAction2) {
496
- SearchAction2[SearchAction2["SEARCH"] = `${SEARCH_ACTION}/search`] = "SEARCH";
479
+ const SEARCH_ACTION = `${SEARCH_PLUGIN}/action`;
480
+ class OpenSearch extends S.TaggedClass()(`${SEARCH_ACTION}/open-search`, {
481
+ input: S.Void,
482
+ output: S.Void
483
+ }) {
484
+ }
485
+ SearchAction2.OpenSearch = OpenSearch;
497
486
  })(SearchAction || (SearchAction = {}));
498
487
 
499
488
  // packages/plugins/experimental/plugin-search/src/SearchPlugin.tsx
500
489
  var SearchPlugin = () => {
501
- let navigationPlugin;
502
- let graphPlugin;
503
490
  return {
504
491
  meta: meta_default,
505
- ready: async (plugins) => {
506
- navigationPlugin = resolvePlugin(plugins, parseNavigationPlugin2);
507
- graphPlugin = resolvePlugin(plugins, parseGraphPlugin2);
508
- },
509
492
  provides: {
510
493
  translations: translations_default,
511
494
  metadata: {
@@ -530,18 +513,15 @@ var SearchPlugin = () => {
530
513
  },
531
514
  graph: {
532
515
  builder: (plugins) => {
533
- const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);
516
+ const dispatch = resolvePlugin(plugins, parseIntentPlugin)?.provides.intent.dispatchPromise;
534
517
  return createExtension({
535
518
  id: SEARCH_PLUGIN,
536
519
  filter: (node) => node.id === "root",
537
520
  actions: () => [
538
521
  {
539
- id: SearchAction.SEARCH,
522
+ id: SearchAction.OpenSearch._tag,
540
523
  data: async () => {
541
- await intentPlugin?.provides.intent.dispatch({
542
- plugin: SEARCH_PLUGIN,
543
- action: SearchAction.SEARCH
544
- });
524
+ await dispatch?.(createIntent2(SearchAction.OpenSearch));
545
525
  },
546
526
  properties: {
547
527
  label: [
@@ -564,38 +544,38 @@ var SearchPlugin = () => {
564
544
  },
565
545
  context: ({ children }) => /* @__PURE__ */ React6.createElement(SearchContextProvider, null, children),
566
546
  surface: {
567
- component: ({ data, role }) => {
568
- const location = navigationPlugin?.provides.location;
569
- const graph = graphPlugin?.provides.graph;
570
- const space = graph && location ? getActiveSpace(graph, firstIdInPart(location.active, "main")) : void 0;
571
- switch (role) {
572
- case "dialog":
573
- return data.component === `${SEARCH_PLUGIN}/Dialog` ? /* @__PURE__ */ React6.createElement(SearchDialog, {
574
- subject: data.subject
575
- }) : null;
576
- case "search-input":
577
- return space ? /* @__PURE__ */ React6.createElement(SearchMain, {
578
- space
579
- }) : null;
580
- }
581
- return null;
547
+ definitions: ({ plugins }) => {
548
+ const location = resolvePlugin(plugins, parseNavigationPlugin2)?.provides.location;
549
+ const graph = resolvePlugin(plugins, parseGraphPlugin2)?.provides.graph;
550
+ return [
551
+ createSurface({
552
+ id: SEARCH_DIALOG,
553
+ role: "dialog",
554
+ filter: (data) => data.component === SEARCH_DIALOG,
555
+ component: ({ data }) => /* @__PURE__ */ React6.createElement(SearchDialog, data.subject)
556
+ }),
557
+ createSurface({
558
+ id: "search-input",
559
+ role: "search-input",
560
+ component: () => {
561
+ const space = graph && location ? getActiveSpace(graph, firstIdInPart(location.active, "main")) : void 0;
562
+ return space ? /* @__PURE__ */ React6.createElement(SearchMain, {
563
+ space
564
+ }) : null;
565
+ }
566
+ })
567
+ ];
582
568
  }
583
569
  },
584
570
  intent: {
585
- resolver: (intent, plugins) => {
586
- switch (intent.action) {
587
- case SearchAction.SEARCH: {
588
- const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);
589
- return intentPlugin?.provides.intent.dispatch({
590
- action: LayoutAction2.SET_LAYOUT,
591
- data: {
592
- element: "complementary",
593
- state: true
594
- }
595
- });
596
- }
597
- }
598
- }
571
+ resolvers: () => createResolver(SearchAction.OpenSearch, () => ({
572
+ intents: [
573
+ createIntent2(LayoutAction2.SetLayout, {
574
+ element: "complementary",
575
+ state: true
576
+ })
577
+ ]
578
+ }))
599
579
  }
600
580
  }
601
581
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/SearchPlugin.tsx", "../../../src/components/Searchbar/Searchbar.tsx", "../../../src/components/SearchMain.tsx", "../../../src/components/SearchResults/SearchResults.tsx", "../../../src/context.tsx", "../../../src/search-sync.ts", "../../../src/components/SearchDialog.tsx", "../../../src/search.ts", "../../../src/translations.ts", "../../../src/types.tsx", "../../../src/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport {\n type PluginDefinition,\n type LocationProvides,\n type GraphProvides,\n type Plugin,\n resolvePlugin,\n parseIntentPlugin,\n parseGraphPlugin,\n parseNavigationPlugin,\n LayoutAction,\n firstIdInPart,\n} from '@dxos/app-framework';\nimport { createExtension, type Node } from '@dxos/plugin-graph';\nimport { getActiveSpace } from '@dxos/plugin-space';\n\nimport { SearchDialog, SearchMain } from './components';\nimport { SearchContextProvider } from './context';\nimport meta, { SEARCH_PLUGIN, SEARCH_RESULT } from './meta';\nimport type { SearchResult } from './search-sync';\nimport translations from './translations';\nimport { SearchAction, type SearchPluginProvides } from './types';\n\nexport const SearchPlugin = (): PluginDefinition<SearchPluginProvides> => {\n let navigationPlugin: Plugin<LocationProvides> | undefined;\n let graphPlugin: Plugin<GraphProvides> | undefined;\n\n return {\n meta,\n ready: async (plugins) => {\n navigationPlugin = resolvePlugin(plugins, parseNavigationPlugin);\n graphPlugin = resolvePlugin(plugins, parseGraphPlugin);\n },\n provides: {\n translations,\n metadata: {\n records: {\n [SEARCH_RESULT]: {\n parse: (item: SearchResult, type: string) => {\n switch (type) {\n case 'node':\n return { id: item.id, label: item.label, data: item.object };\n case 'object':\n return item.object;\n case 'view-object':\n return item;\n }\n },\n },\n },\n },\n graph: {\n builder: (plugins) => {\n const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);\n return createExtension({\n id: SEARCH_PLUGIN,\n filter: (node): node is Node<null> => node.id === 'root',\n actions: () => [\n {\n id: SearchAction.SEARCH,\n data: async () => {\n await intentPlugin?.provides.intent.dispatch({\n plugin: SEARCH_PLUGIN,\n action: SearchAction.SEARCH,\n });\n },\n properties: {\n label: ['search action label', { ns: SEARCH_PLUGIN }],\n icon: 'ph--magnifying-glass--regular',\n keyBinding: {\n macos: 'shift+meta+f',\n windows: 'shift+alt+f',\n },\n testId: 'searchPlugin.search',\n },\n },\n ],\n });\n },\n },\n context: ({ children }) => <SearchContextProvider>{children}</SearchContextProvider>,\n surface: {\n component: ({ data, role }) => {\n const location = navigationPlugin?.provides.location;\n const graph = graphPlugin?.provides.graph;\n const space = graph && location ? getActiveSpace(graph, firstIdInPart(location.active, 'main')) : undefined;\n\n switch (role) {\n case 'dialog':\n return data.component === `${SEARCH_PLUGIN}/Dialog` ? (\n <SearchDialog subject={data.subject as any} />\n ) : null;\n case 'search-input':\n return space ? <SearchMain space={space} /> : null;\n }\n\n return null;\n },\n },\n intent: {\n resolver: (intent, plugins) => {\n switch (intent.action) {\n case SearchAction.SEARCH: {\n const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);\n return intentPlugin?.provides.intent.dispatch({\n action: LayoutAction.SET_LAYOUT,\n data: { element: 'complementary', state: true },\n });\n }\n }\n },\n },\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 { type MosaicTileComponent, Mosaic } from '@dxos/react-ui-mosaic';\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: MosaicTileComponent<SearchItemProps> = forwardRef(\n ({ draggableStyle, draggableProps, item, debug = false }, 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 style={draggableStyle}\n classNames={mx('mx-2 mt-2 cursor-pointer', ghostHover, selected && styles.selected)}\n onClick={() => onSelect?.(id)}\n >\n <Card.Header>\n <Card.DragHandle {...draggableProps} />\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 {debug && (\n <Card.Body gutter>\n <pre className='text-xs whitespace-pre-line'>{JSON.stringify(item)}</pre>\n </Card.Body>\n )}\n </Card.Root>\n );\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 const path = 'search';\n return (\n <ScrollArea.Root classNames='grow'>\n <ScrollArea.Viewport>\n <Mosaic.Container id={path} Component={SearchItem}>\n {items.map((item) => (\n <Mosaic.DraggableTile\n key={item.id}\n path={path}\n type={SEARCH_RESULT}\n item={{ ...item, selected: selected === item.id, onSelect }}\n Component={SearchItem}\n />\n ))}\n </Mosaic.Container>\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 2023 DXOS.org\n//\n\nimport React, { createContext, type PropsWithChildren, useContext, useMemo, useState } from 'react';\n\nimport { raise } from '@dxos/debug';\n\nimport { filterObjectsSync, queryStringToMatch, type SearchResult } from './search-sync';\n\ntype SearchContextType = {\n match?: RegExp;\n setMatch?: (text?: string) => void;\n};\n\nconst SearchContext = createContext<SearchContextType>({});\n\nexport const SearchContextProvider = ({ children }: PropsWithChildren) => {\n const [match, setMatch] = useState<RegExp>();\n const handleMatch = (text?: string) => setMatch(queryStringToMatch(text));\n return <SearchContext.Provider value={{ match, setMatch: handleMatch }}>{children}</SearchContext.Provider>;\n};\n\nexport const useGlobalSearch = () => {\n return useContext(SearchContext) ?? raise(new Error('Missing SearchContext.'));\n};\n\nexport const useGlobalSearchResults = <T extends Record<string, any>>(objects?: T[]): SearchResult[] => {\n const { match } = useGlobalSearch();\n return objects && match ? filterObjectsSync(objects, match) : [];\n};\n\nexport const useGlobalFilteredObjects = <T extends Record<string, any>>(objects?: T[]): T[] => {\n const { match } = useGlobalSearch();\n if (!match || !objects) {\n return objects ?? [];\n }\n\n return useMemo(() => filterObjectsSync(objects, match).map((result) => result.object), [objects, match]);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { AST, type S } from '@dxos/echo-schema';\nimport { getSchema } from '@dxos/live-object';\nimport { TextType } from '@dxos/plugin-markdown/types';\n\nexport const queryStringToMatch = (queryString?: string): RegExp | undefined => {\n const trimmed = queryString?.trim();\n return trimmed ? new RegExp(trimmed, 'i') : undefined;\n};\n\n// TODO(burdon): Type name registry linked to schema?\nconst getIcon = (schema: S.Schema<any> | undefined): string | undefined => {\n if (!(schema && AST.isTypeLiteral(schema.ast))) {\n return undefined;\n }\n const keys = schema.ast.propertySignatures.map((p) => p.name);\n if (keys.indexOf('email') !== -1) {\n return 'user';\n }\n if (keys.indexOf('website') !== -1) {\n return 'organization';\n }\n if (keys.indexOf('repo') !== -1) {\n return 'project';\n }\n\n return undefined;\n};\n\n// Plain text fields.\n// TODO(burdon): Reconcile with agent index.\nexport type TextFields = Record<string, string>;\n\nexport type SearchResult = {\n id: string;\n type?: string;\n label?: string;\n match?: RegExp;\n snippet?: string;\n object?: any;\n};\n\n// TODO(thure): This returns `SearchResult[]` which is not just a narrower set of objects as the name implies.\nexport const filterObjectsSync = <T extends Record<string, any>>(objects: T[], match?: RegExp): SearchResult[] => {\n if (!match) {\n return [];\n }\n\n return objects.reduce<SearchResult[]>((results, object) => {\n // TODO(burdon): Hack to ignore Text objects.\n if (object instanceof TextType) {\n return results;\n }\n\n const fields = mapObjectToTextFields(object);\n Object.entries(fields).some(([, value]) => {\n const result = value.match(match);\n if (result) {\n // TODO(burdon): Use schema.\n const label = getStringProperty(object, ['label', 'name', 'title']);\n\n results.push({\n id: object.id,\n type: getIcon(getSchema(object)),\n label,\n match,\n // TODO(burdon): Truncate.\n // TODO(burdon): Issue with sketch documents.\n snippet: value !== label ? value : fields.content ?? fields.description ?? undefined,\n object,\n });\n\n return true;\n }\n\n return false;\n });\n\n return results;\n }, []);\n};\n\n// TODO(burdon): Use schema?\nconst getStringProperty = (object: Record<string, unknown>, keys: string[]): string | undefined => {\n let label;\n keys.some((key) => {\n const value = object[key];\n if (typeof value === 'string') {\n label = value;\n return true;\n }\n\n return false;\n });\n\n return label;\n};\n\n// TODO(burdon): Filter system fields.\nconst getKeys = (object: Record<string, unknown>): string[] => {\n try {\n const obj = JSON.parse(JSON.stringify(object));\n return Object.keys(obj).filter(\n (key) => key !== 'id' && key !== 'identityKey' && key[0] !== '_' && key[0] !== '@',\n ) as string[];\n } catch (err) {\n // TODO(burdon): Error with TLDraw sketch.\n // Uncaught Error: Type with the name content has already been defined with a different constructor\n return [];\n }\n};\n\n// TODO(burdon): Use ECHO schema.\nexport const mapObjectToTextFields = <T extends Record<string, unknown>>(object: T): TextFields => {\n return getKeys(object).reduce<TextFields>((fields, key) => {\n const value = object[key] as any;\n if (typeof value === 'string' || value instanceof TextType) {\n try {\n fields[key] = String(value);\n } catch (err) {\n // TODO(burdon): Exception when parsing sketch document.\n }\n }\n\n return fields;\n }, {});\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { forwardRef, useCallback, useState } from 'react';\n\nimport {\n useResolvePlugin,\n parseNavigationPlugin,\n parseGraphPlugin,\n NavigationAction,\n LayoutAction,\n type LayoutCoordinate,\n isLayoutParts,\n useIntentDispatcher,\n} 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\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 const SearchDialog = ({\n subject,\n}: {\n subject: { action: NavigationAction; layoutCoordinate: LayoutCoordinate; position: 'add-after' | 'add-before' };\n}) => {\n const { t } = useTranslation(SEARCH_PLUGIN);\n const graphPlugin = useResolvePlugin(parseGraphPlugin);\n const graph = graphPlugin?.provides.graph;\n const navigationPlugin = useResolvePlugin(parseNavigationPlugin);\n const providedClosed = navigationPlugin?.provides.location.closed ?? [];\n const closed = (Array.isArray(providedClosed) ? providedClosed : [providedClosed])\n .map((id) => graph?.findNode(id))\n .filter(Boolean);\n const active = navigationPlugin?.provides.location.active;\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 dispatch = useIntentDispatcher();\n\n const handleSelect = useCallback(\n (nodeId: string) => {\n if (active && isLayoutParts(active)) {\n // If node is already present in the active parts, scroll to it and close the dialog.\n const index = active?.main?.findIndex((entry) => entry.id === nodeId);\n if (index !== -1) {\n return dispatch([\n { action: LayoutAction.SET_LAYOUT, data: { element: 'dialog', state: false } },\n { action: LayoutAction.SCROLL_INTO_VIEW, data: { id: nodeId } },\n ]);\n }\n\n return dispatch([\n {\n action: NavigationAction.ADD_TO_ACTIVE,\n data: {\n part: subject.layoutCoordinate.part,\n id: nodeId,\n pivotId: subject.layoutCoordinate.entryId,\n positioning: 'end',\n },\n },\n { action: LayoutAction.SET_LAYOUT, data: { element: 'dialog', state: false } },\n { action: LayoutAction.SCROLL_INTO_VIEW, data: { id: nodeId } },\n ]);\n }\n },\n [subject, dispatch, active],\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/plugin-markdown/types';\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", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SEARCH_PLUGIN } from './meta';\n\nexport default [\n {\n 'en-US': {\n [SEARCH_PLUGIN]: {\n 'plugin name': 'Search',\n 'search action label': 'Search spaces',\n 'search placeholder': 'Search…',\n 'search dialog title': 'Open',\n 'recently closed heading': 'Recently closed',\n 'pending results message': 'Searching…',\n 'empty results message': 'No matching items in your spaces',\n },\n },\n },\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type {\n GraphBuilderProvides,\n IntentResolverProvides,\n MetadataRecordsProvides,\n SurfaceProvides,\n TranslationsProvides,\n} from '@dxos/app-framework';\n\nimport { SEARCH_PLUGIN } from './meta';\n\nconst SEARCH_ACTION = `${SEARCH_PLUGIN}/action`;\n\nexport enum SearchAction {\n SEARCH = `${SEARCH_ACTION}/search`,\n}\n\nexport type SearchPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n GraphBuilderProvides &\n MetadataRecordsProvides &\n TranslationsProvides;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SearchPlugin } from './SearchPlugin';\n\nexport default SearchPlugin;\n\nexport * from './context';\nexport * from './search-sync';\n\nexport * from './SearchPlugin';\n"],
5
- "mappings": "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",
6
- "names": ["React", "resolvePlugin", "parseIntentPlugin", "parseGraphPlugin", "parseNavigationPlugin", "LayoutAction", "firstIdInPart", "createExtension", "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", "Mosaic", "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", "draggableStyle", "draggableProps", "item", "debug", "id", "label", "snippet", "onSelect", "Icon", "Card", "Root", "ref", "style", "classNames", "mx", "ghostHover", "onClick", "Header", "DragHandle", "Title", "title", "Endcap", "Body", "gutter", "pre", "JSON", "stringify", "SearchResults", "items", "path", "ScrollArea", "Viewport", "Mosaic", "Container", "Component", "map", "DraggableTile", "key", "SEARCH_RESULT", "Scrollbar", "orientation", "Thumb", "Corner", "React", "createContext", "useContext", "useMemo", "useState", "raise", "AST", "getSchema", "TextType", "queryStringToMatch", "queryString", "trimmed", "trim", "RegExp", "undefined", "getIcon", "schema", "AST", "isTypeLiteral", "ast", "keys", "propertySignatures", "map", "p", "name", "indexOf", "filterObjectsSync", "objects", "match", "reduce", "results", "object", "TextType", "fields", "mapObjectToTextFields", "Object", "entries", "some", "value", "result", "label", "getStringProperty", "push", "id", "type", "getSchema", "snippet", "content", "description", "key", "getKeys", "obj", "JSON", "parse", "stringify", "filter", "err", "String", "SearchContext", "createContext", "SearchContextProvider", "children", "match", "setMatch", "useState", "handleMatch", "text", "queryStringToMatch", "React", "Provider", "value", "useGlobalSearch", "useContext", "raise", "Error", "useGlobalSearchResults", "objects", "filterObjectsSync", "useGlobalFilteredObjects", "useMemo", "map", "result", "object", "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", "useResolvePlugin", "parseNavigationPlugin", "parseGraphPlugin", "NavigationAction", "LayoutAction", "isLayoutParts", "useIntentDispatcher", "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", "SearchListResult", "forwardRef", "node", "onSelect", "forwardedRef", "t", "useTranslation", "SEARCH_PLUGIN", "label", "toLocalizedString", "properties", "React", "SearchList", "Item", "value", "key", "id", "classNames", "ref", "Icon", "size", "icon", "span", "className", "SearchDialog", "subject", "graphPlugin", "useResolvePlugin", "parseGraphPlugin", "graph", "provides", "navigationPlugin", "parseNavigationPlugin", "providedClosed", "location", "closed", "Array", "isArray", "map", "findNode", "filter", "Boolean", "active", "queryString", "setQueryString", "useState", "client", "useClient", "dangerouslyLoadAllObjects", "useQuery", "spaces", "Filter", "all", "pending", "results", "useSearchResults", "resultObjects", "from", "keys", "dispatch", "useIntentDispatcher", "handleSelect", "useCallback", "nodeId", "isLayoutParts", "index", "main", "findIndex", "entry", "action", "LayoutAction", "SET_LAYOUT", "data", "element", "state", "SCROLL_INTO_VIEW", "NavigationAction", "ADD_TO_ACTIVE", "part", "layoutCoordinate", "pivotId", "entryId", "positioning", "Dialog", "Content", "Title", "Root", "Input", "onValueChange", "nextValue", "placeholder", "length", "object", "fullyQualifiedId", "p", "h2", "mx", "descriptionText", "Close", "asChild", "Button", "variant", "ns", "SEARCH_PLUGIN", "SEARCH_ACTION", "SEARCH_PLUGIN", "SearchAction", "SearchPlugin", "navigationPlugin", "graphPlugin", "meta", "ready", "plugins", "resolvePlugin", "parseNavigationPlugin", "parseGraphPlugin", "provides", "translations", "metadata", "records", "SEARCH_RESULT", "parse", "item", "type", "id", "label", "data", "object", "graph", "builder", "intentPlugin", "parseIntentPlugin", "createExtension", "SEARCH_PLUGIN", "filter", "node", "actions", "SearchAction", "SEARCH", "intent", "dispatch", "plugin", "action", "properties", "ns", "icon", "keyBinding", "macos", "windows", "testId", "context", "children", "React", "SearchContextProvider", "surface", "component", "role", "location", "space", "getActiveSpace", "firstIdInPart", "active", "undefined", "SearchDialog", "subject", "SearchMain", "resolver", "LayoutAction", "SET_LAYOUT", "element", "state", "SearchPlugin"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport {\n type PluginDefinition,\n resolvePlugin,\n parseIntentPlugin,\n parseGraphPlugin,\n parseNavigationPlugin,\n LayoutAction,\n firstIdInPart,\n createSurface,\n createResolver,\n createIntent,\n} from '@dxos/app-framework';\nimport { createExtension, type Node } from '@dxos/plugin-graph';\nimport { getActiveSpace } from '@dxos/plugin-space';\n\nimport { SEARCH_DIALOG, SearchDialog, type SearchDialogProps, SearchMain } from './components';\nimport { SearchContextProvider } from './context';\nimport meta, { SEARCH_PLUGIN, SEARCH_RESULT } from './meta';\nimport type { SearchResult } from './search-sync';\nimport translations from './translations';\nimport { SearchAction, type SearchPluginProvides } from './types';\n\nexport const SearchPlugin = (): PluginDefinition<SearchPluginProvides> => {\n return {\n meta,\n provides: {\n translations,\n metadata: {\n records: {\n [SEARCH_RESULT]: {\n parse: (item: SearchResult, type: string) => {\n switch (type) {\n case 'node':\n return { id: item.id, label: item.label, data: item.object };\n case 'object':\n return item.object;\n case 'view-object':\n return item;\n }\n },\n },\n },\n },\n graph: {\n builder: (plugins) => {\n const dispatch = resolvePlugin(plugins, parseIntentPlugin)?.provides.intent.dispatchPromise;\n\n return createExtension({\n id: SEARCH_PLUGIN,\n filter: (node): node is Node<null> => node.id === 'root',\n actions: () => [\n {\n id: SearchAction.OpenSearch._tag,\n data: async () => {\n await dispatch?.(createIntent(SearchAction.OpenSearch));\n },\n properties: {\n label: ['search action label', { ns: SEARCH_PLUGIN }],\n icon: 'ph--magnifying-glass--regular',\n keyBinding: {\n macos: 'shift+meta+f',\n windows: 'shift+alt+f',\n },\n testId: 'searchPlugin.search',\n },\n },\n ],\n });\n },\n },\n context: ({ children }) => <SearchContextProvider>{children}</SearchContextProvider>,\n surface: {\n definitions: ({ plugins }) => {\n const location = resolvePlugin(plugins, parseNavigationPlugin)?.provides.location;\n const graph = resolvePlugin(plugins, parseGraphPlugin)?.provides.graph;\n\n return [\n createSurface({\n id: SEARCH_DIALOG,\n role: 'dialog',\n filter: (data): data is { subject: SearchDialogProps } => data.component === SEARCH_DIALOG,\n component: ({ data }) => <SearchDialog {...data.subject} />,\n }),\n createSurface({\n id: 'search-input',\n role: 'search-input',\n component: () => {\n const space =\n graph && location ? getActiveSpace(graph, firstIdInPart(location.active, 'main')) : undefined;\n return space ? <SearchMain space={space} /> : null;\n },\n }),\n ];\n },\n },\n intent: {\n resolvers: () =>\n createResolver(SearchAction.OpenSearch, () => ({\n intents: [createIntent(LayoutAction.SetLayout, { element: 'complementary', state: true })],\n })),\n },\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 { type MosaicTileComponent, Mosaic } from '@dxos/react-ui-mosaic';\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: MosaicTileComponent<SearchItemProps> = forwardRef(\n ({ draggableStyle, draggableProps, item, debug = false }, 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 style={draggableStyle}\n classNames={mx('mx-2 mt-2 cursor-pointer', ghostHover, selected && styles.selected)}\n onClick={() => onSelect?.(id)}\n >\n <Card.Header>\n <Card.DragHandle {...draggableProps} />\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 {debug && (\n <Card.Body gutter>\n <pre className='text-xs whitespace-pre-line'>{JSON.stringify(item)}</pre>\n </Card.Body>\n )}\n </Card.Root>\n );\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 const path = 'search';\n return (\n <ScrollArea.Root classNames='grow'>\n <ScrollArea.Viewport>\n <Mosaic.Container id={path} Component={SearchItem}>\n {items.map((item) => (\n <Mosaic.DraggableTile\n key={item.id}\n path={path}\n type={SEARCH_RESULT}\n item={{ ...item, selected: selected === item.id, onSelect }}\n Component={SearchItem}\n />\n ))}\n </Mosaic.Container>\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 2023 DXOS.org\n//\n\nimport React, { createContext, type PropsWithChildren, useContext, useMemo, useState } from 'react';\n\nimport { raise } from '@dxos/debug';\n\nimport { filterObjectsSync, queryStringToMatch, type SearchResult } from './search-sync';\n\ntype SearchContextType = {\n match?: RegExp;\n setMatch?: (text?: string) => void;\n};\n\nconst SearchContext = createContext<SearchContextType>({});\n\nexport const SearchContextProvider = ({ children }: PropsWithChildren) => {\n const [match, setMatch] = useState<RegExp>();\n const handleMatch = (text?: string) => setMatch(queryStringToMatch(text));\n return <SearchContext.Provider value={{ match, setMatch: handleMatch }}>{children}</SearchContext.Provider>;\n};\n\nexport const useGlobalSearch = () => {\n return useContext(SearchContext) ?? raise(new Error('Missing SearchContext.'));\n};\n\nexport const useGlobalSearchResults = <T extends Record<string, any>>(objects?: T[]): SearchResult[] => {\n const { match } = useGlobalSearch();\n return objects && match ? filterObjectsSync(objects, match) : [];\n};\n\nexport const useGlobalFilteredObjects = <T extends Record<string, any>>(objects?: T[]): T[] => {\n const { match } = useGlobalSearch();\n if (!match || !objects) {\n return objects ?? [];\n }\n\n return useMemo(() => filterObjectsSync(objects, match).map((result) => result.object), [objects, match]);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { AST, type S } from '@dxos/echo-schema';\nimport { getSchema } from '@dxos/live-object';\nimport { TextType } from '@dxos/plugin-markdown/types';\n\nexport const queryStringToMatch = (queryString?: string): RegExp | undefined => {\n const trimmed = queryString?.trim();\n return trimmed ? new RegExp(trimmed, 'i') : undefined;\n};\n\n// TODO(burdon): Type name registry linked to schema?\nconst getIcon = (schema: S.Schema<any> | undefined): string | undefined => {\n if (!(schema && AST.isTypeLiteral(schema.ast))) {\n return undefined;\n }\n const keys = schema.ast.propertySignatures.map((p) => p.name);\n if (keys.indexOf('email') !== -1) {\n return 'user';\n }\n if (keys.indexOf('website') !== -1) {\n return 'organization';\n }\n if (keys.indexOf('repo') !== -1) {\n return 'project';\n }\n\n return undefined;\n};\n\n// Plain text fields.\n// TODO(burdon): Reconcile with agent index.\nexport type TextFields = Record<string, string>;\n\nexport type SearchResult = {\n id: string;\n type?: string;\n label?: string;\n match?: RegExp;\n snippet?: string;\n object?: any;\n};\n\n// TODO(thure): This returns `SearchResult[]` which is not just a narrower set of objects as the name implies.\nexport const filterObjectsSync = <T extends Record<string, any>>(objects: T[], match?: RegExp): SearchResult[] => {\n if (!match) {\n return [];\n }\n\n return objects.reduce<SearchResult[]>((results, object) => {\n // TODO(burdon): Hack to ignore Text objects.\n if (object instanceof TextType) {\n return results;\n }\n\n const fields = mapObjectToTextFields(object);\n Object.entries(fields).some(([, value]) => {\n const result = value.match(match);\n if (result) {\n // TODO(burdon): Use schema.\n const label = getStringProperty(object, ['label', 'name', 'title']);\n\n results.push({\n id: object.id,\n type: getIcon(getSchema(object)),\n label,\n match,\n // TODO(burdon): Truncate.\n // TODO(burdon): Issue with sketch documents.\n snippet: value !== label ? value : fields.content ?? fields.description ?? undefined,\n object,\n });\n\n return true;\n }\n\n return false;\n });\n\n return results;\n }, []);\n};\n\n// TODO(burdon): Use schema?\nconst getStringProperty = (object: Record<string, unknown>, keys: string[]): string | undefined => {\n let label;\n keys.some((key) => {\n const value = object[key];\n if (typeof value === 'string') {\n label = value;\n return true;\n }\n\n return false;\n });\n\n return label;\n};\n\n// TODO(burdon): Filter system fields.\nconst getKeys = (object: Record<string, unknown>): string[] => {\n try {\n const obj = JSON.parse(JSON.stringify(object));\n return Object.keys(obj).filter(\n (key) => key !== 'id' && key !== 'identityKey' && key[0] !== '_' && key[0] !== '@',\n ) as string[];\n } catch (err) {\n // TODO(burdon): Error with TLDraw sketch.\n // Uncaught Error: Type with the name content has already been defined with a different constructor\n return [];\n }\n};\n\n// TODO(burdon): Use ECHO schema.\nexport const mapObjectToTextFields = <T extends Record<string, unknown>>(object: T): TextFields => {\n return getKeys(object).reduce<TextFields>((fields, key) => {\n const value = object[key] as any;\n if (typeof value === 'string' || value instanceof TextType) {\n try {\n fields[key] = String(value);\n } catch (err) {\n // TODO(burdon): Exception when parsing sketch document.\n }\n }\n\n return fields;\n }, {});\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { forwardRef, useCallback, useState } from 'react';\n\nimport {\n useResolvePlugin,\n parseNavigationPlugin,\n parseGraphPlugin,\n NavigationAction,\n LayoutAction,\n type LayoutCoordinate,\n isLayoutParts,\n useIntentDispatcher,\n createIntent,\n} 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 layoutCoordinate: LayoutCoordinate;\n};\n\nexport const SearchDialog = ({ layoutCoordinate }: SearchDialogProps) => {\n const { t } = useTranslation(SEARCH_PLUGIN);\n const graphPlugin = useResolvePlugin(parseGraphPlugin);\n const graph = graphPlugin?.provides.graph;\n const navigationPlugin = useResolvePlugin(parseNavigationPlugin);\n const providedClosed = navigationPlugin?.provides.location.closed ?? [];\n const closed = (Array.isArray(providedClosed) ? providedClosed : [providedClosed])\n .map((id) => graph?.findNode(id))\n .filter(Boolean);\n const active = navigationPlugin?.provides.location.active;\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 if (active && isLayoutParts(active)) {\n // If node is already present in the active parts, scroll to it and close the dialog.\n const index = active?.main?.findIndex((entry) => entry.id === nodeId);\n if (index !== -1) {\n await dispatch(createIntent(LayoutAction.SetLayout, { element: 'dialog', state: false }));\n await dispatch(createIntent(LayoutAction.ScrollIntoView, { id: nodeId }));\n return;\n }\n\n await dispatch(\n createIntent(NavigationAction.AddToActive, {\n part: layoutCoordinate.part,\n id: nodeId,\n pivotId: layoutCoordinate.entryId,\n positioning: 'end',\n }),\n );\n await dispatch(createIntent(LayoutAction.SetLayout, { element: 'dialog', state: false }));\n await dispatch(createIntent(LayoutAction.ScrollIntoView, { id: nodeId }));\n }\n },\n [layoutCoordinate, dispatch, active],\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/plugin-markdown/types';\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", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SEARCH_PLUGIN } from './meta';\n\nexport default [\n {\n 'en-US': {\n [SEARCH_PLUGIN]: {\n 'plugin name': 'Search',\n 'search action label': 'Search spaces',\n 'search placeholder': 'Search…',\n 'search dialog title': 'Open',\n 'recently closed heading': 'Recently closed',\n 'pending results message': 'Searching…',\n 'empty results message': 'No matching items in your spaces',\n },\n },\n },\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type {\n GraphBuilderProvides,\n IntentResolverProvides,\n MetadataRecordsProvides,\n SurfaceProvides,\n TranslationsProvides,\n} from '@dxos/app-framework';\nimport { S } from '@dxos/echo-schema';\n\nimport { SEARCH_PLUGIN } from './meta';\n\nexport namespace SearchAction {\n const SEARCH_ACTION = `${SEARCH_PLUGIN}/action`;\n\n export class OpenSearch extends S.TaggedClass<OpenSearch>()(`${SEARCH_ACTION}/open-search`, {\n input: S.Void,\n output: S.Void,\n }) {}\n}\n\nexport type SearchPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n GraphBuilderProvides &\n MetadataRecordsProvides &\n TranslationsProvides;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { SearchPlugin } from './SearchPlugin';\n\nexport default SearchPlugin;\n\nexport * from './context';\nexport * from './search-sync';\n\nexport * from './SearchPlugin';\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "resolvePlugin", "parseIntentPlugin", "parseGraphPlugin", "parseNavigationPlugin", "LayoutAction", "firstIdInPart", "createSurface", "createResolver", "createIntent", "createExtension", "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", "Mosaic", "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", "draggableStyle", "draggableProps", "item", "debug", "id", "label", "snippet", "onSelect", "Icon", "Card", "Root", "ref", "style", "classNames", "mx", "ghostHover", "onClick", "Header", "DragHandle", "Title", "title", "Endcap", "Body", "gutter", "pre", "JSON", "stringify", "SearchResults", "items", "path", "ScrollArea", "Viewport", "Mosaic", "Container", "Component", "map", "DraggableTile", "key", "SEARCH_RESULT", "Scrollbar", "orientation", "Thumb", "Corner", "React", "createContext", "useContext", "useMemo", "useState", "raise", "AST", "getSchema", "TextType", "queryStringToMatch", "queryString", "trimmed", "trim", "RegExp", "undefined", "getIcon", "schema", "AST", "isTypeLiteral", "ast", "keys", "propertySignatures", "map", "p", "name", "indexOf", "filterObjectsSync", "objects", "match", "reduce", "results", "object", "TextType", "fields", "mapObjectToTextFields", "Object", "entries", "some", "value", "result", "label", "getStringProperty", "push", "id", "type", "getSchema", "snippet", "content", "description", "key", "getKeys", "obj", "JSON", "parse", "stringify", "filter", "err", "String", "SearchContext", "createContext", "SearchContextProvider", "children", "match", "setMatch", "useState", "handleMatch", "text", "queryStringToMatch", "React", "Provider", "value", "useGlobalSearch", "useContext", "raise", "Error", "useGlobalSearchResults", "objects", "filterObjectsSync", "useGlobalFilteredObjects", "useMemo", "map", "result", "object", "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", "useResolvePlugin", "parseNavigationPlugin", "parseGraphPlugin", "NavigationAction", "LayoutAction", "isLayoutParts", "useIntentDispatcher", "createIntent", "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", "layoutCoordinate", "graphPlugin", "useResolvePlugin", "parseGraphPlugin", "graph", "provides", "navigationPlugin", "parseNavigationPlugin", "providedClosed", "location", "closed", "Array", "isArray", "map", "findNode", "filter", "Boolean", "active", "queryString", "setQueryString", "useState", "client", "useClient", "dangerouslyLoadAllObjects", "useQuery", "spaces", "Filter", "all", "pending", "results", "useSearchResults", "resultObjects", "from", "keys", "dispatchPromise", "dispatch", "useIntentDispatcher", "handleSelect", "useCallback", "nodeId", "isLayoutParts", "index", "main", "findIndex", "entry", "createIntent", "LayoutAction", "SetLayout", "element", "state", "ScrollIntoView", "NavigationAction", "AddToActive", "part", "pivotId", "entryId", "positioning", "Dialog", "Content", "Title", "Root", "Input", "onValueChange", "nextValue", "placeholder", "length", "object", "fullyQualifiedId", "p", "h2", "mx", "descriptionText", "Close", "asChild", "Button", "variant", "ns", "SEARCH_PLUGIN", "S", "SearchAction", "SEARCH_ACTION", "SEARCH_PLUGIN", "OpenSearch", "S", "TaggedClass", "input", "Void", "output", "SearchPlugin", "meta", "provides", "translations", "metadata", "records", "SEARCH_RESULT", "parse", "item", "type", "id", "label", "data", "object", "graph", "builder", "plugins", "dispatch", "resolvePlugin", "parseIntentPlugin", "intent", "dispatchPromise", "createExtension", "SEARCH_PLUGIN", "filter", "node", "actions", "SearchAction", "OpenSearch", "_tag", "createIntent", "properties", "ns", "icon", "keyBinding", "macos", "windows", "testId", "context", "children", "React", "SearchContextProvider", "surface", "definitions", "location", "parseNavigationPlugin", "parseGraphPlugin", "createSurface", "SEARCH_DIALOG", "role", "component", "SearchDialog", "subject", "space", "getActiveSpace", "firstIdInPart", "active", "undefined", "SearchMain", "resolvers", "createResolver", "intents", "LayoutAction", "SetLayout", "element", "state", "SearchPlugin"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/plugins/experimental/plugin-search/src/components/Searchbar/Searchbar.tsx":{"bytes":5649,"imports":[{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/components/Searchbar/index.ts":{"bytes":537,"imports":[{"path":"packages/plugins/experimental/plugin-search/src/components/Searchbar/Searchbar.tsx","kind":"import-statement","original":"./Searchbar"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/meta.ts":{"bytes":1834,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-search/src/components/SearchResults/SearchResults.tsx":{"bytes":13354,"imports":[{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-card","kind":"import-statement","external":true},{"path":"@dxos/react-ui-mosaic","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-search/src/meta.ts","kind":"import-statement","original":"../../meta"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/components/SearchResults/index.ts":{"bytes":553,"imports":[{"path":"packages/plugins/experimental/plugin-search/src/components/SearchResults/SearchResults.tsx","kind":"import-statement","original":"./SearchResults"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/search-sync.ts":{"bytes":12194,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/plugin-markdown/types","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/context.tsx":{"bytes":4983,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-search/src/search-sync.ts","kind":"import-statement","original":"./search-sync"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/components/SearchMain.tsx":{"bytes":6406,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-client","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-search/src/components/SearchResults/index.ts","kind":"import-statement","original":"./SearchResults"},{"path":"packages/plugins/experimental/plugin-search/src/components/Searchbar/index.ts","kind":"import-statement","original":"./Searchbar"},{"path":"packages/plugins/experimental/plugin-search/src/context.tsx","kind":"import-statement","original":"../context"},{"path":"packages/plugins/experimental/plugin-search/src/meta.ts","kind":"import-statement","original":"../meta"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/search.ts":{"bytes":6795,"imports":[{"path":"main-thread-scheduling","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/plugin-markdown/types","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-search/src/search-sync.ts","kind":"import-statement","original":"./search-sync"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/components/SearchDialog.tsx":{"bytes":19000,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/react-client","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-searchlist","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-search/src/meta.ts","kind":"import-statement","original":"../meta"},{"path":"packages/plugins/experimental/plugin-search/src/search.ts","kind":"import-statement","original":"../search"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/components/index.ts":{"bytes":725,"imports":[{"path":"packages/plugins/experimental/plugin-search/src/components/Searchbar/index.ts","kind":"import-statement","original":"./Searchbar"},{"path":"packages/plugins/experimental/plugin-search/src/components/SearchMain.tsx","kind":"import-statement","original":"./SearchMain"},{"path":"packages/plugins/experimental/plugin-search/src/components/SearchDialog.tsx","kind":"import-statement","original":"./SearchDialog"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/translations.ts":{"bytes":1920,"imports":[{"path":"packages/plugins/experimental/plugin-search/src/meta.ts","kind":"import-statement","original":"./meta"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/types.tsx":{"bytes":1598,"imports":[{"path":"packages/plugins/experimental/plugin-search/src/meta.ts","kind":"import-statement","original":"./meta"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/SearchPlugin.tsx":{"bytes":14689,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/plugin-graph","kind":"import-statement","external":true},{"path":"@dxos/plugin-space","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-search/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/plugins/experimental/plugin-search/src/context.tsx","kind":"import-statement","original":"./context"},{"path":"packages/plugins/experimental/plugin-search/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/experimental/plugin-search/src/translations.ts","kind":"import-statement","original":"./translations"},{"path":"packages/plugins/experimental/plugin-search/src/types.tsx","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/index.ts":{"bytes":985,"imports":[{"path":"packages/plugins/experimental/plugin-search/src/SearchPlugin.tsx","kind":"import-statement","original":"./SearchPlugin"},{"path":"packages/plugins/experimental/plugin-search/src/context.tsx","kind":"import-statement","original":"./context"},{"path":"packages/plugins/experimental/plugin-search/src/search-sync.ts","kind":"import-statement","original":"./search-sync"},{"path":"packages/plugins/experimental/plugin-search/src/SearchPlugin.tsx","kind":"import-statement","original":"./SearchPlugin"}],"format":"esm"}},"outputs":{"packages/plugins/experimental/plugin-search/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":44275},"packages/plugins/experimental/plugin-search/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/plugins/experimental/plugin-search/dist/lib/browser/chunk-4L4PWJYC.mjs","kind":"import-statement"},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/plugin-graph","kind":"import-statement","external":true},{"path":"@dxos/plugin-space","kind":"import-statement","external":true},{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-client","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-card","kind":"import-statement","external":true},{"path":"@dxos/react-ui-mosaic","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/plugin-markdown/types","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/react-client","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-searchlist","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"main-thread-scheduling","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/plugin-markdown/types","kind":"import-statement","external":true}],"exports":["SearchContextProvider","SearchPlugin","default","filterObjectsSync","mapObjectToTextFields","queryStringToMatch","useGlobalFilteredObjects","useGlobalSearch","useGlobalSearchResults"],"entryPoint":"packages/plugins/experimental/plugin-search/src/index.ts","inputs":{"packages/plugins/experimental/plugin-search/src/SearchPlugin.tsx":{"bytesInOutput":3648},"packages/plugins/experimental/plugin-search/src/components/Searchbar/Searchbar.tsx":{"bytesInOutput":1299},"packages/plugins/experimental/plugin-search/src/components/Searchbar/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-search/src/components/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-search/src/components/SearchMain.tsx":{"bytesInOutput":1342},"packages/plugins/experimental/plugin-search/src/components/SearchResults/SearchResults.tsx":{"bytesInOutput":3342},"packages/plugins/experimental/plugin-search/src/components/SearchResults/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-search/src/context.tsx":{"bytesInOutput":1026},"packages/plugins/experimental/plugin-search/src/search-sync.ts":{"bytesInOutput":2363},"packages/plugins/experimental/plugin-search/src/components/SearchDialog.tsx":{"bytesInOutput":5035},"packages/plugins/experimental/plugin-search/src/search.ts":{"bytesInOutput":1487},"packages/plugins/experimental/plugin-search/src/translations.ts":{"bytesInOutput":436},"packages/plugins/experimental/plugin-search/src/types.tsx":{"bytesInOutput":214},"packages/plugins/experimental/plugin-search/src/index.ts":{"bytesInOutput":32}},"bytes":21651},"packages/plugins/experimental/plugin-search/dist/lib/browser/meta.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/plugins/experimental/plugin-search/dist/lib/browser/meta.mjs":{"imports":[{"path":"packages/plugins/experimental/plugin-search/dist/lib/browser/chunk-4L4PWJYC.mjs","kind":"import-statement"}],"exports":["SEARCH_PLUGIN","SEARCH_RESULT","default"],"entryPoint":"packages/plugins/experimental/plugin-search/src/meta.ts","inputs":{},"bytes":195},"packages/plugins/experimental/plugin-search/dist/lib/browser/chunk-4L4PWJYC.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":860},"packages/plugins/experimental/plugin-search/dist/lib/browser/chunk-4L4PWJYC.mjs":{"imports":[],"exports":["SEARCH_PLUGIN","SEARCH_RESULT","meta_default"],"inputs":{"packages/plugins/experimental/plugin-search/src/meta.ts":{"bytesInOutput":376}},"bytes":541}}}
1
+ {"inputs":{"packages/plugins/experimental/plugin-search/src/components/Searchbar/Searchbar.tsx":{"bytes":5649,"imports":[{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/components/Searchbar/index.ts":{"bytes":537,"imports":[{"path":"packages/plugins/experimental/plugin-search/src/components/Searchbar/Searchbar.tsx","kind":"import-statement","original":"./Searchbar"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/meta.ts":{"bytes":1834,"imports":[],"format":"esm"},"packages/plugins/experimental/plugin-search/src/components/SearchResults/SearchResults.tsx":{"bytes":13354,"imports":[{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-card","kind":"import-statement","external":true},{"path":"@dxos/react-ui-mosaic","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-search/src/meta.ts","kind":"import-statement","original":"../../meta"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/components/SearchResults/index.ts":{"bytes":553,"imports":[{"path":"packages/plugins/experimental/plugin-search/src/components/SearchResults/SearchResults.tsx","kind":"import-statement","original":"./SearchResults"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/search-sync.ts":{"bytes":12194,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/plugin-markdown/types","kind":"import-statement","external":true}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/context.tsx":{"bytes":4983,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-search/src/search-sync.ts","kind":"import-statement","original":"./search-sync"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/components/SearchMain.tsx":{"bytes":6406,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-client","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-search/src/components/SearchResults/index.ts","kind":"import-statement","original":"./SearchResults"},{"path":"packages/plugins/experimental/plugin-search/src/components/Searchbar/index.ts","kind":"import-statement","original":"./Searchbar"},{"path":"packages/plugins/experimental/plugin-search/src/context.tsx","kind":"import-statement","original":"../context"},{"path":"packages/plugins/experimental/plugin-search/src/meta.ts","kind":"import-statement","original":"../meta"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/search.ts":{"bytes":6795,"imports":[{"path":"main-thread-scheduling","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/plugin-markdown/types","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-search/src/search-sync.ts","kind":"import-statement","original":"./search-sync"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/components/SearchDialog.tsx":{"bytes":18671,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/react-client","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-searchlist","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-search/src/meta.ts","kind":"import-statement","original":"../meta"},{"path":"packages/plugins/experimental/plugin-search/src/search.ts","kind":"import-statement","original":"../search"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/components/index.ts":{"bytes":725,"imports":[{"path":"packages/plugins/experimental/plugin-search/src/components/Searchbar/index.ts","kind":"import-statement","original":"./Searchbar"},{"path":"packages/plugins/experimental/plugin-search/src/components/SearchMain.tsx","kind":"import-statement","original":"./SearchMain"},{"path":"packages/plugins/experimental/plugin-search/src/components/SearchDialog.tsx","kind":"import-statement","original":"./SearchDialog"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/translations.ts":{"bytes":1920,"imports":[{"path":"packages/plugins/experimental/plugin-search/src/meta.ts","kind":"import-statement","original":"./meta"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/types.tsx":{"bytes":2214,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-search/src/meta.ts","kind":"import-statement","original":"./meta"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/SearchPlugin.tsx":{"bytes":13959,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/plugin-graph","kind":"import-statement","external":true},{"path":"@dxos/plugin-space","kind":"import-statement","external":true},{"path":"packages/plugins/experimental/plugin-search/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/plugins/experimental/plugin-search/src/context.tsx","kind":"import-statement","original":"./context"},{"path":"packages/plugins/experimental/plugin-search/src/meta.ts","kind":"import-statement","original":"./meta"},{"path":"packages/plugins/experimental/plugin-search/src/translations.ts","kind":"import-statement","original":"./translations"},{"path":"packages/plugins/experimental/plugin-search/src/types.tsx","kind":"import-statement","original":"./types"}],"format":"esm"},"packages/plugins/experimental/plugin-search/src/index.ts":{"bytes":985,"imports":[{"path":"packages/plugins/experimental/plugin-search/src/SearchPlugin.tsx","kind":"import-statement","original":"./SearchPlugin"},{"path":"packages/plugins/experimental/plugin-search/src/context.tsx","kind":"import-statement","original":"./context"},{"path":"packages/plugins/experimental/plugin-search/src/search-sync.ts","kind":"import-statement","original":"./search-sync"},{"path":"packages/plugins/experimental/plugin-search/src/SearchPlugin.tsx","kind":"import-statement","original":"./SearchPlugin"}],"format":"esm"}},"outputs":{"packages/plugins/experimental/plugin-search/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":44436},"packages/plugins/experimental/plugin-search/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/plugins/experimental/plugin-search/dist/lib/browser/chunk-4L4PWJYC.mjs","kind":"import-statement"},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/plugin-graph","kind":"import-statement","external":true},{"path":"@dxos/plugin-space","kind":"import-statement","external":true},{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-client","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-card","kind":"import-statement","external":true},{"path":"@dxos/react-ui-mosaic","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/plugin-markdown/types","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/app-framework","kind":"import-statement","external":true},{"path":"@dxos/react-client","kind":"import-statement","external":true},{"path":"@dxos/react-client/echo","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-searchlist","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"main-thread-scheduling","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/plugin-markdown/types","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"exports":["SearchContextProvider","SearchPlugin","default","filterObjectsSync","mapObjectToTextFields","queryStringToMatch","useGlobalFilteredObjects","useGlobalSearch","useGlobalSearchResults"],"entryPoint":"packages/plugins/experimental/plugin-search/src/index.ts","inputs":{"packages/plugins/experimental/plugin-search/src/SearchPlugin.tsx":{"bytesInOutput":3442},"packages/plugins/experimental/plugin-search/src/components/Searchbar/Searchbar.tsx":{"bytesInOutput":1299},"packages/plugins/experimental/plugin-search/src/components/Searchbar/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-search/src/components/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-search/src/components/SearchMain.tsx":{"bytesInOutput":1342},"packages/plugins/experimental/plugin-search/src/components/SearchResults/SearchResults.tsx":{"bytesInOutput":3342},"packages/plugins/experimental/plugin-search/src/components/SearchResults/index.ts":{"bytesInOutput":0},"packages/plugins/experimental/plugin-search/src/context.tsx":{"bytesInOutput":1026},"packages/plugins/experimental/plugin-search/src/search-sync.ts":{"bytesInOutput":2363},"packages/plugins/experimental/plugin-search/src/components/SearchDialog.tsx":{"bytesInOutput":4907},"packages/plugins/experimental/plugin-search/src/search.ts":{"bytesInOutput":1487},"packages/plugins/experimental/plugin-search/src/translations.ts":{"bytesInOutput":436},"packages/plugins/experimental/plugin-search/src/types.tsx":{"bytesInOutput":343},"packages/plugins/experimental/plugin-search/src/index.ts":{"bytesInOutput":32}},"bytes":21446},"packages/plugins/experimental/plugin-search/dist/lib/browser/meta.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"packages/plugins/experimental/plugin-search/dist/lib/browser/meta.mjs":{"imports":[{"path":"packages/plugins/experimental/plugin-search/dist/lib/browser/chunk-4L4PWJYC.mjs","kind":"import-statement"}],"exports":["SEARCH_PLUGIN","SEARCH_RESULT","default"],"entryPoint":"packages/plugins/experimental/plugin-search/src/meta.ts","inputs":{},"bytes":195},"packages/plugins/experimental/plugin-search/dist/lib/browser/chunk-4L4PWJYC.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":860},"packages/plugins/experimental/plugin-search/dist/lib/browser/chunk-4L4PWJYC.mjs":{"imports":[],"exports":["SEARCH_PLUGIN","SEARCH_RESULT","meta_default"],"inputs":{"packages/plugins/experimental/plugin-search/src/meta.ts":{"bytesInOutput":376}},"bytes":541}}}
@@ -1 +1 @@
1
- {"version":3,"file":"SearchPlugin.d.ts","sourceRoot":"","sources":["../../../src/SearchPlugin.tsx"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,gBAAgB,EAUtB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAgB,KAAK,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAElE,eAAO,MAAM,YAAY,QAAO,gBAAgB,CAAC,oBAAoB,CA2FpE,CAAC"}
1
+ {"version":3,"file":"SearchPlugin.d.ts","sourceRoot":"","sources":["../../../src/SearchPlugin.tsx"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,gBAAgB,EAUtB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAgB,KAAK,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAElE,eAAO,MAAM,YAAY,QAAO,gBAAgB,CAAC,oBAAoB,CAiFpE,CAAC"}
@@ -1,10 +1,8 @@
1
1
  import React from 'react';
2
- import { NavigationAction, type LayoutCoordinate } from '@dxos/app-framework';
3
- export declare const SearchDialog: ({ subject, }: {
4
- subject: {
5
- action: NavigationAction;
6
- layoutCoordinate: LayoutCoordinate;
7
- position: "add-after" | "add-before";
8
- };
9
- }) => React.JSX.Element;
2
+ import { type LayoutCoordinate } from '@dxos/app-framework';
3
+ export declare const SEARCH_DIALOG = "dxos.org/plugin/search/SearchDialog";
4
+ export type SearchDialogProps = {
5
+ layoutCoordinate: LayoutCoordinate;
6
+ };
7
+ export declare const SearchDialog: ({ layoutCoordinate }: SearchDialogProps) => React.JSX.Element;
10
8
  //# sourceMappingURL=SearchDialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SearchDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/SearchDialog.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA4C,MAAM,OAAO,CAAC;AAEjE,OAAO,EAIL,gBAAgB,EAEhB,KAAK,gBAAgB,EAGtB,MAAM,qBAAqB,CAAC;AAgC7B,eAAO,MAAM,YAAY,iBAEtB;IACD,OAAO,EAAE;QAAE,MAAM,EAAE,gBAAgB,CAAC;QAAC,gBAAgB,EAAE,gBAAgB,CAAC;QAAC,QAAQ,EAAE,WAAW,GAAG,YAAY,CAAA;KAAE,CAAC;CACjH,sBAuFA,CAAC"}
1
+ {"version":3,"file":"SearchDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/SearchDialog.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA4C,MAAM,OAAO,CAAC;AAEjE,OAAO,EAML,KAAK,gBAAgB,EAItB,MAAM,qBAAqB,CAAC;AAW7B,eAAO,MAAM,aAAa,wCAAkC,CAAC;AAuB7D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,YAAY,yBAA0B,iBAAiB,sBAmFnE,CAAC"}
@@ -1,6 +1,15 @@
1
1
  import type { GraphBuilderProvides, IntentResolverProvides, MetadataRecordsProvides, SurfaceProvides, TranslationsProvides } from '@dxos/app-framework';
2
- export declare enum SearchAction {
3
- SEARCH = "dxos.org/plugin/search/action/search"
2
+ import { S } from '@dxos/echo-schema';
3
+ export declare namespace SearchAction {
4
+ const OpenSearch_base: S.TaggedClass<OpenSearch, "dxos.org/plugin/search/action/open-search", {
5
+ readonly _tag: S.tag<"dxos.org/plugin/search/action/open-search">;
6
+ } & {
7
+ input: typeof S.Void;
8
+ output: typeof S.Void;
9
+ }>;
10
+ export class OpenSearch extends OpenSearch_base {
11
+ }
12
+ export {};
4
13
  }
5
14
  export type SearchPluginProvides = SurfaceProvides & IntentResolverProvides & GraphBuilderProvides & MetadataRecordsProvides & TranslationsProvides;
6
15
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,EACf,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAM7B,oBAAY,YAAY;IACtB,MAAM,yCAA4B;CACnC;AAED,MAAM,MAAM,oBAAoB,GAAG,eAAe,GAChD,sBAAsB,GACtB,oBAAoB,GACpB,uBAAuB,GACvB,oBAAoB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,EACf,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAItC,yBAAiB,YAAY,CAAC;;;;;;;IAG5B,MAAM,OAAO,UAAW,SAAQ,eAG9B;KAAG;;CACN;AAED,MAAM,MAAM,oBAAoB,GAAG,eAAe,GAChD,sBAAsB,GACtB,oBAAoB,GACpB,uBAAuB,GACvB,oBAAoB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":"5.7.2"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-search",
3
- "version": "0.7.4",
3
+ "version": "0.7.5-main.9cb18ac",
4
4
  "description": "Braneframe sketch plugin",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -32,17 +32,17 @@
32
32
  "dependencies": {
33
33
  "@effect/schema": "^0.75.5",
34
34
  "main-thread-scheduling": "^14.1.1",
35
- "@dxos/app-framework": "0.7.4",
36
- "@dxos/debug": "0.7.4",
37
- "@dxos/live-object": "0.7.4",
38
- "@dxos/echo-schema": "0.7.4",
39
- "@dxos/plugin-graph": "0.7.4",
40
- "@dxos/plugin-space": "0.7.4",
41
- "@dxos/react-client": "0.7.4",
42
- "@dxos/plugin-markdown": "0.7.4",
43
- "@dxos/react-ui-card": "0.7.4",
44
- "@dxos/react-ui-mosaic": "0.7.4",
45
- "@dxos/react-ui-searchlist": "0.7.4"
35
+ "@dxos/app-framework": "0.7.5-main.9cb18ac",
36
+ "@dxos/echo-schema": "0.7.5-main.9cb18ac",
37
+ "@dxos/live-object": "0.7.5-main.9cb18ac",
38
+ "@dxos/debug": "0.7.5-main.9cb18ac",
39
+ "@dxos/plugin-graph": "0.7.5-main.9cb18ac",
40
+ "@dxos/plugin-markdown": "0.7.5-main.9cb18ac",
41
+ "@dxos/react-client": "0.7.5-main.9cb18ac",
42
+ "@dxos/react-ui-card": "0.7.5-main.9cb18ac",
43
+ "@dxos/react-ui-mosaic": "0.7.5-main.9cb18ac",
44
+ "@dxos/plugin-space": "0.7.5-main.9cb18ac",
45
+ "@dxos/react-ui-searchlist": "0.7.5-main.9cb18ac"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@phosphor-icons/react": "^2.1.5",
@@ -51,17 +51,17 @@
51
51
  "react": "~18.2.0",
52
52
  "react-dom": "~18.2.0",
53
53
  "vite": "5.4.7",
54
- "@dxos/random": "0.7.4",
55
- "@dxos/react-ui": "0.7.4",
56
- "@dxos/react-ui-theme": "0.7.4",
57
- "@dxos/storybook-utils": "0.7.4"
54
+ "@dxos/random": "0.7.5-main.9cb18ac",
55
+ "@dxos/react-ui": "0.7.5-main.9cb18ac",
56
+ "@dxos/react-ui-theme": "0.7.5-main.9cb18ac",
57
+ "@dxos/storybook-utils": "0.7.5-main.9cb18ac"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "@phosphor-icons/react": "^2.1.5",
61
61
  "react": "~18.2.0",
62
62
  "react-dom": "~18.2.0",
63
- "@dxos/react-ui": "0.7.4",
64
- "@dxos/react-ui-theme": "0.7.4"
63
+ "@dxos/react-ui": "0.7.5-main.9cb18ac",
64
+ "@dxos/react-ui-theme": "0.7.5-main.9cb18ac"
65
65
  },
66
66
  "publishConfig": {
67
67
  "access": "public"
@@ -6,20 +6,20 @@ import React from 'react';
6
6
 
7
7
  import {
8
8
  type PluginDefinition,
9
- type LocationProvides,
10
- type GraphProvides,
11
- type Plugin,
12
9
  resolvePlugin,
13
10
  parseIntentPlugin,
14
11
  parseGraphPlugin,
15
12
  parseNavigationPlugin,
16
13
  LayoutAction,
17
14
  firstIdInPart,
15
+ createSurface,
16
+ createResolver,
17
+ createIntent,
18
18
  } from '@dxos/app-framework';
19
19
  import { createExtension, type Node } from '@dxos/plugin-graph';
20
20
  import { getActiveSpace } from '@dxos/plugin-space';
21
21
 
22
- import { SearchDialog, SearchMain } from './components';
22
+ import { SEARCH_DIALOG, SearchDialog, type SearchDialogProps, SearchMain } from './components';
23
23
  import { SearchContextProvider } from './context';
24
24
  import meta, { SEARCH_PLUGIN, SEARCH_RESULT } from './meta';
25
25
  import type { SearchResult } from './search-sync';
@@ -27,15 +27,8 @@ import translations from './translations';
27
27
  import { SearchAction, type SearchPluginProvides } from './types';
28
28
 
29
29
  export const SearchPlugin = (): PluginDefinition<SearchPluginProvides> => {
30
- let navigationPlugin: Plugin<LocationProvides> | undefined;
31
- let graphPlugin: Plugin<GraphProvides> | undefined;
32
-
33
30
  return {
34
31
  meta,
35
- ready: async (plugins) => {
36
- navigationPlugin = resolvePlugin(plugins, parseNavigationPlugin);
37
- graphPlugin = resolvePlugin(plugins, parseGraphPlugin);
38
- },
39
32
  provides: {
40
33
  translations,
41
34
  metadata: {
@@ -56,18 +49,16 @@ export const SearchPlugin = (): PluginDefinition<SearchPluginProvides> => {
56
49
  },
57
50
  graph: {
58
51
  builder: (plugins) => {
59
- const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);
52
+ const dispatch = resolvePlugin(plugins, parseIntentPlugin)?.provides.intent.dispatchPromise;
53
+
60
54
  return createExtension({
61
55
  id: SEARCH_PLUGIN,
62
56
  filter: (node): node is Node<null> => node.id === 'root',
63
57
  actions: () => [
64
58
  {
65
- id: SearchAction.SEARCH,
59
+ id: SearchAction.OpenSearch._tag,
66
60
  data: async () => {
67
- await intentPlugin?.provides.intent.dispatch({
68
- plugin: SEARCH_PLUGIN,
69
- action: SearchAction.SEARCH,
70
- });
61
+ await dispatch?.(createIntent(SearchAction.OpenSearch));
71
62
  },
72
63
  properties: {
73
64
  label: ['search action label', { ns: SEARCH_PLUGIN }],
@@ -85,35 +76,34 @@ export const SearchPlugin = (): PluginDefinition<SearchPluginProvides> => {
85
76
  },
86
77
  context: ({ children }) => <SearchContextProvider>{children}</SearchContextProvider>,
87
78
  surface: {
88
- component: ({ data, role }) => {
89
- const location = navigationPlugin?.provides.location;
90
- const graph = graphPlugin?.provides.graph;
91
- const space = graph && location ? getActiveSpace(graph, firstIdInPart(location.active, 'main')) : undefined;
79
+ definitions: ({ plugins }) => {
80
+ const location = resolvePlugin(plugins, parseNavigationPlugin)?.provides.location;
81
+ const graph = resolvePlugin(plugins, parseGraphPlugin)?.provides.graph;
92
82
 
93
- switch (role) {
94
- case 'dialog':
95
- return data.component === `${SEARCH_PLUGIN}/Dialog` ? (
96
- <SearchDialog subject={data.subject as any} />
97
- ) : null;
98
- case 'search-input':
99
- return space ? <SearchMain space={space} /> : null;
100
- }
101
-
102
- return null;
83
+ return [
84
+ createSurface({
85
+ id: SEARCH_DIALOG,
86
+ role: 'dialog',
87
+ filter: (data): data is { subject: SearchDialogProps } => data.component === SEARCH_DIALOG,
88
+ component: ({ data }) => <SearchDialog {...data.subject} />,
89
+ }),
90
+ createSurface({
91
+ id: 'search-input',
92
+ role: 'search-input',
93
+ component: () => {
94
+ const space =
95
+ graph && location ? getActiveSpace(graph, firstIdInPart(location.active, 'main')) : undefined;
96
+ return space ? <SearchMain space={space} /> : null;
97
+ },
98
+ }),
99
+ ];
103
100
  },
104
101
  },
105
102
  intent: {
106
- resolver: (intent, plugins) => {
107
- switch (intent.action) {
108
- case SearchAction.SEARCH: {
109
- const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);
110
- return intentPlugin?.provides.intent.dispatch({
111
- action: LayoutAction.SET_LAYOUT,
112
- data: { element: 'complementary', state: true },
113
- });
114
- }
115
- }
116
- },
103
+ resolvers: () =>
104
+ createResolver(SearchAction.OpenSearch, () => ({
105
+ intents: [createIntent(LayoutAction.SetLayout, { element: 'complementary', state: true })],
106
+ })),
117
107
  },
118
108
  },
119
109
  };
@@ -13,6 +13,7 @@ import {
13
13
  type LayoutCoordinate,
14
14
  isLayoutParts,
15
15
  useIntentDispatcher,
16
+ createIntent,
16
17
  } from '@dxos/app-framework';
17
18
  import { type Node } from '@dxos/plugin-graph';
18
19
  import { useClient } from '@dxos/react-client';
@@ -24,6 +25,8 @@ import { descriptionText, mx } from '@dxos/react-ui-theme';
24
25
  import { SEARCH_PLUGIN } from '../meta';
25
26
  import { useSearchResults } from '../search';
26
27
 
28
+ export const SEARCH_DIALOG = `${SEARCH_PLUGIN}/SearchDialog`;
29
+
27
30
  type SearchListResultProps = {
28
31
  node: Node;
29
32
  } & Pick<SearchListItemProps, 'onSelect'>;
@@ -45,11 +48,11 @@ const SearchListResult = forwardRef<HTMLDivElement, SearchListResultProps>(({ no
45
48
  );
46
49
  });
47
50
 
48
- export const SearchDialog = ({
49
- subject,
50
- }: {
51
- subject: { action: NavigationAction; layoutCoordinate: LayoutCoordinate; position: 'add-after' | 'add-before' };
52
- }) => {
51
+ export type SearchDialogProps = {
52
+ layoutCoordinate: LayoutCoordinate;
53
+ };
54
+
55
+ export const SearchDialog = ({ layoutCoordinate }: SearchDialogProps) => {
53
56
  const { t } = useTranslation(SEARCH_PLUGIN);
54
57
  const graphPlugin = useResolvePlugin(parseGraphPlugin);
55
58
  const graph = graphPlugin?.provides.graph;
@@ -64,36 +67,32 @@ export const SearchDialog = ({
64
67
  const dangerouslyLoadAllObjects = useQuery(client.spaces, Filter.all());
65
68
  const [pending, results] = useSearchResults(queryString, dangerouslyLoadAllObjects);
66
69
  const resultObjects = Array.from(results.keys());
67
- const dispatch = useIntentDispatcher();
70
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
68
71
 
69
72
  const handleSelect = useCallback(
70
- (nodeId: string) => {
73
+ async (nodeId: string) => {
71
74
  if (active && isLayoutParts(active)) {
72
75
  // If node is already present in the active parts, scroll to it and close the dialog.
73
76
  const index = active?.main?.findIndex((entry) => entry.id === nodeId);
74
77
  if (index !== -1) {
75
- return dispatch([
76
- { action: LayoutAction.SET_LAYOUT, data: { element: 'dialog', state: false } },
77
- { action: LayoutAction.SCROLL_INTO_VIEW, data: { id: nodeId } },
78
- ]);
78
+ await dispatch(createIntent(LayoutAction.SetLayout, { element: 'dialog', state: false }));
79
+ await dispatch(createIntent(LayoutAction.ScrollIntoView, { id: nodeId }));
80
+ return;
79
81
  }
80
82
 
81
- return dispatch([
82
- {
83
- action: NavigationAction.ADD_TO_ACTIVE,
84
- data: {
85
- part: subject.layoutCoordinate.part,
86
- id: nodeId,
87
- pivotId: subject.layoutCoordinate.entryId,
88
- positioning: 'end',
89
- },
90
- },
91
- { action: LayoutAction.SET_LAYOUT, data: { element: 'dialog', state: false } },
92
- { action: LayoutAction.SCROLL_INTO_VIEW, data: { id: nodeId } },
93
- ]);
83
+ await dispatch(
84
+ createIntent(NavigationAction.AddToActive, {
85
+ part: layoutCoordinate.part,
86
+ id: nodeId,
87
+ pivotId: layoutCoordinate.entryId,
88
+ positioning: 'end',
89
+ }),
90
+ );
91
+ await dispatch(createIntent(LayoutAction.SetLayout, { element: 'dialog', state: false }));
92
+ await dispatch(createIntent(LayoutAction.ScrollIntoView, { id: nodeId }));
94
93
  }
95
94
  },
96
- [subject, dispatch, active],
95
+ [layoutCoordinate, dispatch, active],
97
96
  );
98
97
 
99
98
  return (
package/src/types.tsx CHANGED
@@ -9,13 +9,17 @@ import type {
9
9
  SurfaceProvides,
10
10
  TranslationsProvides,
11
11
  } from '@dxos/app-framework';
12
+ import { S } from '@dxos/echo-schema';
12
13
 
13
14
  import { SEARCH_PLUGIN } from './meta';
14
15
 
15
- const SEARCH_ACTION = `${SEARCH_PLUGIN}/action`;
16
+ export namespace SearchAction {
17
+ const SEARCH_ACTION = `${SEARCH_PLUGIN}/action`;
16
18
 
17
- export enum SearchAction {
18
- SEARCH = `${SEARCH_ACTION}/search`,
19
+ export class OpenSearch extends S.TaggedClass<OpenSearch>()(`${SEARCH_ACTION}/open-search`, {
20
+ input: S.Void,
21
+ output: S.Void,
22
+ }) {}
19
23
  }
20
24
 
21
25
  export type SearchPluginProvides = SurfaceProvides &