@dxos/react-ui-attention 0.8.4-main.bc674ce → 0.8.4-main.c351d160a8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/lib/browser/{chunk-HJRZWOEX.mjs → chunk-Q5SLNQ4B.mjs} +114 -102
  2. package/dist/lib/browser/chunk-Q5SLNQ4B.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +12 -8
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +16 -6
  7. package/dist/lib/browser/testing/index.mjs.map +3 -3
  8. package/dist/lib/node-esm/{chunk-7TQWDE4M.mjs → chunk-LSWTWT3W.mjs} +114 -102
  9. package/dist/lib/node-esm/chunk-LSWTWT3W.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +12 -8
  11. package/dist/lib/node-esm/index.mjs.map +3 -3
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/testing/index.mjs +16 -6
  14. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  15. package/dist/types/src/attention.d.ts +29 -10
  16. package/dist/types/src/attention.d.ts.map +1 -1
  17. package/dist/types/src/components/AttentionGlyph.d.ts.map +1 -1
  18. package/dist/types/src/components/AttentionProvider.d.ts +9 -11
  19. package/dist/types/src/components/AttentionProvider.d.ts.map +1 -1
  20. package/dist/types/src/components/SelectionProvider.d.ts.map +1 -1
  21. package/dist/types/src/testing/decorators/withAttention.d.ts +5 -1
  22. package/dist/types/src/testing/decorators/withAttention.d.ts.map +1 -1
  23. package/dist/types/tsconfig.tsbuildinfo +1 -1
  24. package/package.json +16 -16
  25. package/src/attention.test.ts +151 -22
  26. package/src/attention.ts +108 -53
  27. package/src/components/AttentionGlyph.stories.tsx +3 -3
  28. package/src/components/AttentionGlyph.tsx +12 -5
  29. package/src/components/AttentionProvider.stories.tsx +2 -2
  30. package/src/components/AttentionProvider.tsx +21 -48
  31. package/src/components/SelectionProvider.tsx +6 -4
  32. package/src/testing/decorators/withAttention.ts +18 -7
  33. package/dist/lib/browser/chunk-HJRZWOEX.mjs.map +0 -7
  34. package/dist/lib/node-esm/chunk-7TQWDE4M.mjs.map +0 -7
@@ -1 +1 @@
1
- {"inputs":{"src/types.ts":{"bytes":1000,"imports":[],"format":"esm"},"src/attention.ts":{"bytes":18649,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"src/components/AttentionGlyph.tsx":{"bytes":10517,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true}],"format":"esm"},"src/components/AttentionProvider.tsx":{"bytes":20805,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@radix-ui/react-primitive","kind":"import-statement","external":true},{"path":"@radix-ui/react-slot","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/react-hooks","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"src/attention.ts","kind":"import-statement","original":"../attention"},{"path":"src/types.ts","kind":"import-statement","original":"../types"}],"format":"esm"},"src/selection.ts":{"bytes":28228,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"effect/Match","kind":"import-statement","external":true},{"path":"effect/Schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/components/SelectionProvider.tsx":{"bytes":15416,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"effect/Match","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-hooks","kind":"import-statement","external":true},{"path":"src/selection.ts","kind":"import-statement","original":"../selection"}],"format":"esm"},"src/components/index.ts":{"bytes":708,"imports":[{"path":"src/components/AttentionGlyph.tsx","kind":"import-statement","original":"./AttentionGlyph"},{"path":"src/components/AttentionProvider.tsx","kind":"import-statement","original":"./AttentionProvider"},{"path":"src/components/SelectionProvider.tsx","kind":"import-statement","original":"./SelectionProvider"}],"format":"esm"},"src/index.ts":{"bytes":726,"imports":[{"path":"src/attention.ts","kind":"import-statement","original":"./attention"},{"path":"src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"src/selection.ts","kind":"import-statement","original":"./selection"},{"path":"src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"src/testing/decorators/withAttention.ts":{"bytes":2287,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"src/components/index.ts","kind":"import-statement","original":"../../components"}],"format":"esm"},"src/testing/decorators/index.ts":{"bytes":493,"imports":[{"path":"src/testing/decorators/withAttention.ts","kind":"import-statement","original":"./withAttention"}],"format":"esm"},"src/testing/index.ts":{"bytes":471,"imports":[{"path":"src/testing/decorators/index.ts","kind":"import-statement","original":"./decorators"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5370},"dist/lib/browser/index.mjs":{"imports":[{"path":"dist/lib/browser/chunk-HJRZWOEX.mjs","kind":"import-statement"},{"path":"dist/lib/browser/chunk-PAZBZOO2.mjs","kind":"import-statement"},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true}],"exports":["ATTENDABLE_ATTRIBUTE","ATTENDABLE_PATH_SEPARATOR","ATTENTION_NAME","ATTENTION_SOURCE_ATTRIBUTE","AttendableContainer","AttentionGlyph","AttentionManager","AttentionProvider","RootAttentionProvider","SelectionManager","SelectionProvider","SelectionSchema","Syncing","defaultSelection","getAttendables","getSelectionSet","useAttended","useAttention","useAttentionAttributes","useAttentionContext","useAttentionPath","useSelected","useSelectionActions","useSelectionManager"],"entryPoint":"src/index.ts","inputs":{"src/index.ts":{"bytesInOutput":0},"src/components/AttentionGlyph.tsx":{"bytesInOutput":3223}},"bytes":4350},"dist/lib/browser/types.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"dist/lib/browser/types.mjs":{"imports":[{"path":"dist/lib/browser/chunk-PAZBZOO2.mjs","kind":"import-statement"}],"exports":["ATTENDABLE_PATH_SEPARATOR"],"entryPoint":"src/types.ts","inputs":{},"bytes":143},"dist/lib/browser/testing/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1257},"dist/lib/browser/testing/index.mjs":{"imports":[{"path":"dist/lib/browser/chunk-HJRZWOEX.mjs","kind":"import-statement"},{"path":"dist/lib/browser/chunk-PAZBZOO2.mjs","kind":"import-statement"},{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"exports":["withAttention"],"entryPoint":"src/testing/index.ts","inputs":{"src/testing/decorators/withAttention.ts":{"bytesInOutput":387},"src/testing/index.ts":{"bytesInOutput":0}},"bytes":612},"dist/lib/browser/chunk-HJRZWOEX.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":41564},"dist/lib/browser/chunk-HJRZWOEX.mjs":{"imports":[{"path":"dist/lib/browser/chunk-PAZBZOO2.mjs","kind":"import-statement"},{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@radix-ui/react-primitive","kind":"import-statement","external":true},{"path":"@radix-ui/react-slot","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/react-hooks","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"effect/Match","kind":"import-statement","external":true},{"path":"effect/Schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"effect/Match","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-hooks","kind":"import-statement","external":true}],"exports":["ATTENDABLE_ATTRIBUTE","ATTENTION_NAME","ATTENTION_SOURCE_ATTRIBUTE","AttendableContainer","AttentionManager","AttentionProvider","RootAttentionProvider","SelectionManager","SelectionProvider","SelectionSchema","defaultSelection","getAttendables","getSelectionSet","useAttended","useAttention","useAttentionAttributes","useAttentionContext","useAttentionPath","useSelected","useSelectionActions","useSelectionManager"],"inputs":{"src/attention.ts":{"bytesInOutput":4196},"src/components/AttentionProvider.tsx":{"bytesInOutput":4350},"src/selection.ts":{"bytesInOutput":7192},"src/components/SelectionProvider.tsx":{"bytesInOutput":3445}},"bytes":19870},"dist/lib/browser/chunk-PAZBZOO2.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":503},"dist/lib/browser/chunk-PAZBZOO2.mjs":{"imports":[],"exports":["ATTENDABLE_PATH_SEPARATOR"],"inputs":{"src/types.ts":{"bytesInOutput":37}},"bytes":138}}}
1
+ {"inputs":{"src/types.ts":{"bytes":1000,"imports":[],"format":"esm"},"src/attention.ts":{"bytes":23381,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"src/components/AttentionGlyph.tsx":{"bytes":10090,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true}],"format":"esm"},"src/components/AttentionProvider.tsx":{"bytes":18018,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@radix-ui/react-primitive","kind":"import-statement","external":true},{"path":"@radix-ui/react-slot","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/react-hooks","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"src/attention.ts","kind":"import-statement","original":"../attention"}],"format":"esm"},"src/selection.ts":{"bytes":28228,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"effect/Match","kind":"import-statement","external":true},{"path":"effect/Schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/components/SelectionProvider.tsx":{"bytes":15632,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"effect/Match","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-hooks","kind":"import-statement","external":true},{"path":"src/selection.ts","kind":"import-statement","original":"../selection"}],"format":"esm"},"src/components/index.ts":{"bytes":708,"imports":[{"path":"src/components/AttentionGlyph.tsx","kind":"import-statement","original":"./AttentionGlyph"},{"path":"src/components/AttentionProvider.tsx","kind":"import-statement","original":"./AttentionProvider"},{"path":"src/components/SelectionProvider.tsx","kind":"import-statement","original":"./SelectionProvider"}],"format":"esm"},"src/index.ts":{"bytes":726,"imports":[{"path":"src/attention.ts","kind":"import-statement","original":"./attention"},{"path":"src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"src/selection.ts","kind":"import-statement","original":"./selection"},{"path":"src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"},"src/testing/decorators/withAttention.ts":{"bytes":3609,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"src/attention.ts","kind":"import-statement","original":"../../attention"},{"path":"src/components/index.ts","kind":"import-statement","original":"../../components"}],"format":"esm"},"src/testing/decorators/index.ts":{"bytes":493,"imports":[{"path":"src/testing/decorators/withAttention.ts","kind":"import-statement","original":"./withAttention"}],"format":"esm"},"src/testing/index.ts":{"bytes":471,"imports":[{"path":"src/testing/decorators/index.ts","kind":"import-statement","original":"./decorators"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5234},"dist/lib/browser/index.mjs":{"imports":[{"path":"dist/lib/browser/chunk-Q5SLNQ4B.mjs","kind":"import-statement"},{"path":"dist/lib/browser/chunk-PAZBZOO2.mjs","kind":"import-statement"},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true}],"exports":["ATTENDABLE_ATTRIBUTE","ATTENDABLE_PATH_SEPARATOR","ATTENTION_NAME","ATTENTION_SOURCE_ATTRIBUTE","AttendableContainer","AttentionGlyph","AttentionManager","RootAttentionProvider","SelectionManager","SelectionProvider","SelectionSchema","Syncing","defaultSelection","expandAttendableId","getAttendables","getParentId","getSegmentId","getSelectionSet","isSeparatorPrefixed","useAttended","useAttention","useAttentionAttributes","useAttentionContext","useSelected","useSelectionActions","useSelectionManager"],"entryPoint":"src/index.ts","inputs":{"src/index.ts":{"bytesInOutput":0},"src/components/AttentionGlyph.tsx":{"bytesInOutput":2992}},"bytes":4189},"dist/lib/browser/types.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":93},"dist/lib/browser/types.mjs":{"imports":[{"path":"dist/lib/browser/chunk-PAZBZOO2.mjs","kind":"import-statement"}],"exports":["ATTENDABLE_PATH_SEPARATOR"],"entryPoint":"src/types.ts","inputs":{},"bytes":143},"dist/lib/browser/testing/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":1872},"dist/lib/browser/testing/index.mjs":{"imports":[{"path":"dist/lib/browser/chunk-Q5SLNQ4B.mjs","kind":"import-statement"},{"path":"dist/lib/browser/chunk-PAZBZOO2.mjs","kind":"import-statement"},{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true}],"exports":["withAttention"],"entryPoint":"src/testing/index.ts","inputs":{"src/testing/decorators/withAttention.ts":{"bytesInOutput":610},"src/testing/index.ts":{"bytesInOutput":0}},"bytes":855},"dist/lib/browser/chunk-Q5SLNQ4B.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":42438},"dist/lib/browser/chunk-Q5SLNQ4B.mjs":{"imports":[{"path":"dist/lib/browser/chunk-PAZBZOO2.mjs","kind":"import-statement"},{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@radix-ui/react-primitive","kind":"import-statement","external":true},{"path":"@radix-ui/react-slot","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/react-hooks","kind":"import-statement","external":true},{"path":"@dxos/ui-theme","kind":"import-statement","external":true},{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"effect/Match","kind":"import-statement","external":true},{"path":"effect/Schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"effect/Match","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-hooks","kind":"import-statement","external":true}],"exports":["ATTENDABLE_ATTRIBUTE","ATTENTION_NAME","ATTENTION_SOURCE_ATTRIBUTE","AttendableContainer","AttentionManager","RootAttentionProvider","SelectionManager","SelectionProvider","SelectionSchema","defaultSelection","expandAttendableId","getAttendables","getParentId","getSegmentId","getSelectionSet","isSeparatorPrefixed","useAttended","useAttention","useAttentionAttributes","useAttentionContext","useSelected","useSelectionActions","useSelectionManager"],"inputs":{"src/attention.ts":{"bytesInOutput":5182},"src/components/AttentionProvider.tsx":{"bytesInOutput":3752},"src/selection.ts":{"bytesInOutput":7192},"src/components/SelectionProvider.tsx":{"bytesInOutput":3533}},"bytes":20381},"dist/lib/browser/chunk-PAZBZOO2.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":503},"dist/lib/browser/chunk-PAZBZOO2.mjs":{"imports":[],"exports":["ATTENDABLE_PATH_SEPARATOR"],"inputs":{"src/types.ts":{"bytesInOutput":37}},"bytes":138}}}
@@ -1,17 +1,27 @@
1
1
  import {
2
+ AttentionManager,
2
3
  RootAttentionProvider,
3
4
  SelectionProvider
4
- } from "../chunk-HJRZWOEX.mjs";
5
+ } from "../chunk-Q5SLNQ4B.mjs";
5
6
  import "../chunk-PAZBZOO2.mjs";
6
7
 
7
8
  // src/testing/decorators/withAttention.ts
8
9
  import { Registry, RegistryContext } from "@effect-atom/atom-react";
9
10
  import { createElement, useMemo } from "react";
10
- var withAttention = (Story) => {
11
- const registry = useMemo(() => Registry.make(), []);
12
- return createElement(RegistryContext.Provider, {
13
- value: registry
14
- }, createElement(RootAttentionProvider, {}, createElement(SelectionProvider, {}, createElement(Story))));
11
+ var withAttention = (initialAttendedId) => {
12
+ return (Story) => {
13
+ const registry = useMemo(() => Registry.make(), []);
14
+ const attention = useMemo(() => initialAttendedId ? new AttentionManager(registry, [
15
+ initialAttendedId
16
+ ]) : void 0, [
17
+ registry
18
+ ]);
19
+ return createElement(RegistryContext.Provider, {
20
+ value: registry
21
+ }, createElement(RootAttentionProvider, {
22
+ attention
23
+ }, createElement(SelectionProvider, {}, createElement(Story))));
24
+ };
15
25
  };
16
26
  export {
17
27
  withAttention
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/testing/decorators/withAttention.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Registry, RegistryContext } from '@effect-atom/atom-react';\nimport { type Decorator } from '@storybook/react';\nimport { createElement, useMemo } from 'react';\n\nimport { RootAttentionProvider, SelectionProvider } from '../../components';\n\nexport const withAttention: Decorator = (Story) => {\n const registry = useMemo(() => Registry.make(), []);\n return createElement(\n RegistryContext.Provider,\n { value: registry },\n createElement(RootAttentionProvider, {}, createElement(SelectionProvider, {}, createElement(Story))),\n );\n};\n"],
5
- "mappings": ";;;;;;;AAIA,SAASA,UAAUC,uBAAuB;AAE1C,SAASC,eAAeC,eAAe;AAIhC,IAAMC,gBAA2B,CAACC,UAAAA;AACvC,QAAMC,WAAWC,QAAQ,MAAMC,SAASC,KAAI,GAAI,CAAA,CAAE;AAClD,SAAOC,cACLC,gBAAgBC,UAChB;IAAEC,OAAOP;EAAS,GAClBI,cAAcI,uBAAuB,CAAC,GAAGJ,cAAcK,mBAAmB,CAAC,GAAGL,cAAcL,KAAAA,CAAAA,CAAAA,CAAAA;AAEhG;",
6
- "names": ["Registry", "RegistryContext", "createElement", "useMemo", "withAttention", "Story", "registry", "useMemo", "Registry", "make", "createElement", "RegistryContext", "Provider", "value", "RootAttentionProvider", "SelectionProvider"]
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Registry, RegistryContext } from '@effect-atom/atom-react';\nimport { type Decorator } from '@storybook/react';\nimport { createElement, useMemo } from 'react';\n\nimport { AttentionManager } from '../../attention';\nimport { RootAttentionProvider, SelectionProvider } from '../../components';\n\n/**\n * Storybook decorator that provides attention context.\n * @param initialAttendedId Optional ID to set as initially attended.\n */\nexport const withAttention = (initialAttendedId?: string): Decorator => {\n return (Story) => {\n const registry = useMemo(() => Registry.make(), []);\n const attention = useMemo(\n () => (initialAttendedId ? new AttentionManager(registry, [initialAttendedId]) : undefined),\n [registry],\n );\n return createElement(\n RegistryContext.Provider,\n { value: registry },\n createElement(RootAttentionProvider, { attention }, createElement(SelectionProvider, {}, createElement(Story))),\n );\n };\n};\n"],
5
+ "mappings": ";;;;;;;;AAIA,SAASA,UAAUC,uBAAuB;AAE1C,SAASC,eAAeC,eAAe;AAShC,IAAMC,gBAAgB,CAACC,sBAAAA;AAC5B,SAAO,CAACC,UAAAA;AACN,UAAMC,WAAWC,QAAQ,MAAMC,SAASC,KAAI,GAAI,CAAA,CAAE;AAClD,UAAMC,YAAYH,QAChB,MAAOH,oBAAoB,IAAIO,iBAAiBL,UAAU;MAACF;KAAkB,IAAIQ,QACjF;MAACN;KAAS;AAEZ,WAAOO,cACLC,gBAAgBC,UAChB;MAAEC,OAAOV;IAAS,GAClBO,cAAcI,uBAAuB;MAAEP;IAAU,GAAGG,cAAcK,mBAAmB,CAAC,GAAGL,cAAcR,KAAAA,CAAAA,CAAAA,CAAAA;EAE3G;AACF;",
6
+ "names": ["Registry", "RegistryContext", "createElement", "useMemo", "withAttention", "initialAttendedId", "Story", "registry", "useMemo", "Registry", "make", "attention", "AttentionManager", "undefined", "createElement", "RegistryContext", "Provider", "value", "RootAttentionProvider", "SelectionProvider"]
7
7
  }
@@ -5,35 +5,31 @@ import {
5
5
 
6
6
  // src/attention.ts
7
7
  import { Atom } from "@effect-atom/atom-react";
8
- import { ComplexMap } from "@dxos/util";
9
- var stringKey = (key) => key.join(",");
10
8
  var AttentionManager = class {
11
9
  _registry;
12
- // Each attention path is associated with an attention atom.
13
- // The lookup is not a reactive object to ensure that attention for each path is subscribable independently.
14
- _map = new ComplexMap(stringKey);
10
+ _map = /* @__PURE__ */ new Map();
15
11
  _currentAtom;
16
12
  constructor(_registry, initial = []) {
17
13
  this._registry = _registry;
18
- this._currentAtom = Atom.make([]);
14
+ this._currentAtom = Atom.make([]).pipe(Atom.keepAlive);
19
15
  if (initial.length > 0) {
20
16
  this.update(initial);
21
17
  }
22
18
  }
23
19
  /**
24
- * Atom for the currently attended element path.
20
+ * Atom for the currently attended element IDs.
25
21
  */
26
22
  get current() {
27
23
  return this._currentAtom;
28
24
  }
29
25
  /**
30
- * Gets the currently attended element path.
26
+ * Gets the currently attended element IDs.
31
27
  */
32
28
  getCurrent() {
33
29
  return this._registry.get(this._currentAtom);
34
30
  }
35
31
  /**
36
- * Subscribe to changes in the current attention path.
32
+ * Subscribe to changes in the current attention IDs.
37
33
  */
38
34
  subscribeCurrent(cb) {
39
35
  this._registry.get(this._currentAtom);
@@ -42,30 +38,30 @@ var AttentionManager = class {
42
38
  });
43
39
  }
44
40
  /**
45
- * All attention paths.
41
+ * All tracked qualified IDs.
46
42
  */
47
43
  keys() {
48
44
  return Array.from(this._map.keys());
49
45
  }
50
46
  /**
51
- * Get the attention state for a given path.
47
+ * Get the attention state for a given qualified ID.
52
48
  */
53
- get(key) {
54
- const atom = this._getAtom(key);
49
+ get(id) {
50
+ const atom = this._getAtom(id);
55
51
  return this._registry.get(atom);
56
52
  }
57
53
  /**
58
- * Subscribe to changes in the attention state for a given path.
54
+ * Subscribe to changes in the attention state for a given qualified ID.
59
55
  */
60
- subscribe(key, cb) {
61
- const atom = this._getAtom(key);
56
+ subscribe(id, cb) {
57
+ const atom = this._getAtom(id);
62
58
  this._registry.get(atom);
63
59
  return this._registry.subscribe(atom, () => {
64
60
  cb(this._registry.get(atom));
65
61
  });
66
62
  }
67
- _getAtom(key) {
68
- const existing = this._map.get(key);
63
+ _getAtom(id) {
64
+ const existing = this._map.get(id);
69
65
  if (existing) {
70
66
  return existing;
71
67
  }
@@ -73,43 +69,70 @@ var AttentionManager = class {
73
69
  hasAttention: false,
74
70
  isAncestor: false,
75
71
  isRelated: false
76
- });
77
- this._map.set(key, newAtom);
72
+ }).pipe(Atom.keepAlive);
73
+ this._map.set(id, newAtom);
78
74
  return newAtom;
79
75
  }
80
76
  /**
81
77
  * Update the currently attended element.
78
+ * Takes the array of qualified IDs collected from the DOM; the first element is the primary attended item.
79
+ * Ancestry is derived from the progressive prefixes of the primary ID.
80
+ * Relatedness is derived from the segment ID: any tracked key whose last `/` segment matches the
81
+ * attended ID's segment ID is marked `isRelated`. Additionally, if the primary ID has a
82
+ * separator-prefixed last segment (starts with `~`), its immediate parent gets `isRelated` alongside `isAncestor`.
82
83
  *
83
84
  * @internal
84
85
  */
85
- update(nextKey) {
86
- const currentKey = this.getCurrent();
87
- const currentRelatedTo = currentKey[0];
88
- const nextRelatedTo = nextKey[0];
89
- this._getAtom([
90
- nextRelatedTo
91
- ]);
92
- const currentRelatedKeys = this.keys().filter((key) => key[0] === currentRelatedTo);
93
- const nextRelatedKeys = this.keys().filter((key) => key[0] === nextRelatedTo && stringKey(key) !== stringKey(nextKey));
94
- const prevRelatedKeys = currentRelatedKeys.filter((curr) => !nextRelatedKeys.find((next) => stringKey(curr) === stringKey(next)));
95
- const currentAncestorKeys = currentKey.slice(1).map((_, i) => currentKey.slice(i + 1, currentKey.length));
96
- const nextAncestorKeys = nextKey.slice(1).map((_, i) => nextKey.slice(i + 1, nextKey.length));
97
- const prevAncestorKeys = currentAncestorKeys.filter((curr) => !nextAncestorKeys.find((next) => stringKey(curr) === stringKey(next)));
98
- this._registry.set(this._currentAtom, nextKey);
99
- prevRelatedKeys.forEach((key) => this._set(key, {}));
100
- prevAncestorKeys.forEach((key) => this._set(key, {}));
101
- nextRelatedKeys.forEach((key) => this._set(key, {
102
- isRelated: true
103
- }));
104
- nextAncestorKeys.forEach((key) => this._set(key, {
105
- isAncestor: true
106
- }));
107
- this._set(nextKey, {
108
- hasAttention: true
109
- });
86
+ update(nextIds) {
87
+ const primaryId = nextIds[0];
88
+ if (!primaryId) {
89
+ return;
90
+ }
91
+ const currentIds = this.getCurrent();
92
+ const prevPrimaryId = currentIds[0];
93
+ if (prevPrimaryId) {
94
+ const prevPrefixes = expandAttendableId(prevPrimaryId);
95
+ for (const prefix of prevPrefixes) {
96
+ this._set(prefix, {});
97
+ }
98
+ const prevSegmentId = getSegmentId(prevPrimaryId);
99
+ for (const key of this.keys()) {
100
+ if (getSegmentId(key) === prevSegmentId) {
101
+ this._set(key, {});
102
+ }
103
+ }
104
+ }
105
+ this._registry.set(this._currentAtom, nextIds);
106
+ const prefixes = expandAttendableId(primaryId);
107
+ const prefixSet = new Set(prefixes);
108
+ const separatedParent = isSeparatorPrefixed(primaryId) ? getParentId(primaryId) : void 0;
109
+ for (const prefix of prefixes) {
110
+ if (prefix === primaryId) {
111
+ this._set(prefix, {
112
+ hasAttention: true
113
+ });
114
+ } else if (prefix === separatedParent) {
115
+ this._set(prefix, {
116
+ isAncestor: true,
117
+ isRelated: true
118
+ });
119
+ } else {
120
+ this._set(prefix, {
121
+ isAncestor: true
122
+ });
123
+ }
124
+ }
125
+ const segmentId = getSegmentId(primaryId);
126
+ for (const key of this.keys()) {
127
+ if (!prefixSet.has(key) && getSegmentId(key) === segmentId) {
128
+ this._set(key, {
129
+ isRelated: true
130
+ });
131
+ }
132
+ }
110
133
  }
111
- _set(key, attention) {
112
- const atom = this._getAtom(key);
134
+ _set(id, attention) {
135
+ const atom = this._getAtom(id);
113
136
  this._registry.set(atom, {
114
137
  hasAttention: attention.hasAttention ?? false,
115
138
  isAncestor: attention.isAncestor ?? false,
@@ -129,7 +152,7 @@ var getAttendables = (selector, cursor, acc = []) => {
129
152
  return getAttendables(selector, trigger, acc);
130
153
  }
131
154
  } else {
132
- acc.push(...attendableId.split(ATTENDABLE_PATH_SEPARATOR));
155
+ acc.push(attendableId);
133
156
  return !closestAttendable.parentElement ? acc : getAttendables(selector, closestAttendable.parentElement, acc);
134
157
  }
135
158
  }
@@ -137,6 +160,24 @@ var getAttendables = (selector, cursor, acc = []) => {
137
160
  ...new Set(acc)
138
161
  ];
139
162
  };
163
+ var expandAttendableId = (qualifiedId) => {
164
+ const segments = qualifiedId.split("/");
165
+ return segments.map((_, index) => segments.slice(0, index + 1).join("/"));
166
+ };
167
+ var isSeparatorPrefixed = (qualifiedId) => {
168
+ const lastSegment = qualifiedId.split("/").pop() ?? "";
169
+ return lastSegment.startsWith(ATTENDABLE_PATH_SEPARATOR);
170
+ };
171
+ var getParentId = (qualifiedId) => {
172
+ if (!qualifiedId) {
173
+ return void 0;
174
+ }
175
+ const lastSlash = qualifiedId.lastIndexOf("/");
176
+ return lastSlash > 0 ? qualifiedId.slice(0, lastSlash) : void 0;
177
+ };
178
+ var getSegmentId = (qualifiedId) => {
179
+ return qualifiedId.split("/").pop() ?? qualifiedId;
180
+ };
140
181
 
141
182
  // src/components/AttentionProvider.tsx
142
183
  import { RegistryContext } from "@effect-atom/atom-react";
@@ -150,10 +191,9 @@ import { mx } from "@dxos/ui-theme";
150
191
  var __dxlog_file = "/__w/dxos/dxos/packages/ui/react-ui-attention/src/components/AttentionProvider.tsx";
151
192
  var ATTENTION_NAME = "Attention";
152
193
  var ATTENDABLE_ATTRIBUTE = "data-attendable-id";
153
- var ATTENTION_SOURCE_ATTRIBUTE = "data-is-attention-source";
194
+ var ATTENTION_SOURCE_ATTRIBUTE = "data-w-attention-source";
154
195
  var [AttentionContextProvider, useAttentionContext] = createContext(ATTENTION_NAME, {
155
- attention: void 0,
156
- path: []
196
+ attention: void 0
157
197
  });
158
198
  var UNKNOWN_ATTENDABLE = {
159
199
  hasAttention: false,
@@ -161,32 +201,21 @@ var UNKNOWN_ATTENDABLE = {
161
201
  isRelated: false
162
202
  };
163
203
  var useAttention = (attendableId) => {
164
- const { attention, path } = useAttentionContext(ATTENTION_NAME);
204
+ const { attention } = useAttentionContext(ATTENTION_NAME);
165
205
  const [state, setState] = useState(UNKNOWN_ATTENDABLE);
166
- const key = useMemo(() => {
167
- if (!attendableId) {
168
- return void 0;
169
- }
170
- return [
171
- ...attendableId.split(ATTENDABLE_PATH_SEPARATOR),
172
- ...path
173
- ];
174
- }, [
175
- attendableId,
176
- path
177
- ]);
178
206
  useEffect(() => {
179
- if (!key || !attention) {
207
+ if (!attendableId || !attention) {
180
208
  setState(UNKNOWN_ATTENDABLE);
181
209
  return;
182
210
  }
183
- setState(attention.get(key));
184
- return attention.subscribe(key, (newState) => {
211
+ const currentState = attention.get(attendableId);
212
+ setState(currentState);
213
+ return attention.subscribe(attendableId, (newState) => {
185
214
  setState(newState);
186
215
  });
187
216
  }, [
188
217
  attention,
189
- key
218
+ attendableId
190
219
  ]);
191
220
  return state;
192
221
  };
@@ -221,10 +250,6 @@ var useAttentionAttributes = (attendableId) => {
221
250
  hasAttention
222
251
  ]);
223
252
  };
224
- var useAttentionPath = () => {
225
- const { path } = useAttentionContext(ATTENTION_NAME);
226
- return path;
227
- };
228
253
  var RootAttentionProvider = ({ children, attention: propsAttention, onChange }) => {
229
254
  const registry = useContext(RegistryContext);
230
255
  const attention = useDefaultValue(propsAttention, () => new AttentionManager(registry));
@@ -234,7 +259,7 @@ var RootAttentionProvider = ({ children, attention: propsAttention, onChange })
234
259
  target: event.target
235
260
  }, {
236
261
  F: __dxlog_file,
237
- L: 130,
262
+ L: 115,
238
263
  S: void 0,
239
264
  C: (f, a) => f(...a)
240
265
  });
@@ -250,36 +275,21 @@ var RootAttentionProvider = ({ children, attention: propsAttention, onChange })
250
275
  }
251
276
  };
252
277
  return /* @__PURE__ */ React.createElement(AttentionContextProvider, {
253
- attention,
254
- path: []
278
+ attention
255
279
  }, /* @__PURE__ */ React.createElement("div", {
256
280
  role: "none",
257
281
  className: "contents",
258
282
  onFocusCapture: handleFocus
259
283
  }, children));
260
284
  };
261
- var AttentionProvider = ({ id, children }) => {
262
- const { attention, path } = useAttentionContext(ATTENTION_NAME);
263
- const nextPath = useMemo(() => [
264
- id,
265
- ...path
266
- ], [
267
- id,
268
- path
269
- ]);
270
- return /* @__PURE__ */ React.createElement(AttentionContextProvider, {
271
- attention,
272
- path: nextPath
273
- }, children);
274
- };
275
285
  var AttendableContainer = /* @__PURE__ */ forwardRef(({ id, classNames, children, asChild, ...props }, forwardedRef) => {
276
286
  const attentionAttrs = useAttentionAttributes(id);
277
- const Root = asChild ? Slot : Primitive.div;
278
- return /* @__PURE__ */ React.createElement(Root, {
287
+ const Comp = asChild ? Slot : Primitive.div;
288
+ return /* @__PURE__ */ React.createElement(Comp, {
279
289
  role: "none",
280
- ...attentionAttrs,
281
290
  ...props,
282
- className: mx("attention-surface", props.tabIndex === 0 && "dx-focus-ring-inset-over-all", classNames),
291
+ ...attentionAttrs,
292
+ className: mx("dx-attention-surface", props.tabIndex === 0 && "dx-focus-ring-inset-over-all", classNames),
283
293
  ref: forwardedRef
284
294
  }, children);
285
295
  });
@@ -581,16 +591,16 @@ var useSelectionManager = () => {
581
591
  var getDefaultResult = (mode) => {
582
592
  return Match2.type().pipe(Match2.when({
583
593
  mode: "single"
584
- }, (s) => s.id), Match2.when({
594
+ }, (selection) => selection.id), Match2.when({
585
595
  mode: "multi"
586
- }, (s) => s.ids), Match2.when({
596
+ }, (selection) => selection.ids), Match2.when({
587
597
  mode: "range"
588
- }, (s) => s.from && s.to ? {
589
- from: s.from,
590
- to: s.to
598
+ }, (selection) => selection.from && selection.to ? {
599
+ from: selection.from,
600
+ to: selection.to
591
601
  } : void 0), Match2.when({
592
602
  mode: "multi-range"
593
- }, (s) => s.ranges), Match2.exhaustive)(defaultSelection(mode));
603
+ }, (selection) => selection.ranges), Match2.exhaustive)(defaultSelection(mode));
594
604
  };
595
605
  var useSelected = (contextId, mode = "multi") => {
596
606
  const { selection } = useSelectionContext(SELECTION_NAME);
@@ -683,6 +693,10 @@ var useSelectionActions = (contextIds, mode = "multi") => {
683
693
  export {
684
694
  AttentionManager,
685
695
  getAttendables,
696
+ expandAttendableId,
697
+ isSeparatorPrefixed,
698
+ getParentId,
699
+ getSegmentId,
686
700
  ATTENTION_NAME,
687
701
  ATTENDABLE_ATTRIBUTE,
688
702
  ATTENTION_SOURCE_ATTRIBUTE,
@@ -690,9 +704,7 @@ export {
690
704
  useAttention,
691
705
  useAttended,
692
706
  useAttentionAttributes,
693
- useAttentionPath,
694
707
  RootAttentionProvider,
695
- AttentionProvider,
696
708
  AttendableContainer,
697
709
  SelectionSchema,
698
710
  defaultSelection,
@@ -703,4 +715,4 @@ export {
703
715
  useSelected,
704
716
  useSelectionActions
705
717
  };
706
- //# sourceMappingURL=chunk-7TQWDE4M.mjs.map
718
+ //# sourceMappingURL=chunk-LSWTWT3W.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/attention.ts", "../../../src/components/AttentionProvider.tsx", "../../../src/selection.ts", "../../../src/components/SelectionProvider.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\n\nimport { ATTENDABLE_PATH_SEPARATOR, type Attention } from './types';\n\n/**\n * Manages attention state for an application.\n * Attention keys are slash-qualified graph IDs; ancestry is derived from progressive prefixes.\n */\nexport class AttentionManager {\n private readonly _map = new Map<string, Atom.Writable<Attention>>();\n private readonly _currentAtom: Atom.Writable<string[]>;\n\n constructor(\n private readonly _registry: Registry.Registry,\n initial: string[] = [],\n ) {\n this._currentAtom = Atom.make<string[]>([]).pipe(Atom.keepAlive);\n if (initial.length > 0) {\n this.update(initial);\n }\n }\n\n /**\n * Atom for the currently attended element IDs.\n */\n get current(): Atom.Atom<string[]> {\n return this._currentAtom;\n }\n\n /**\n * Gets the currently attended element IDs.\n */\n getCurrent(): readonly string[] {\n return this._registry.get(this._currentAtom);\n }\n\n /**\n * Subscribe to changes in the current attention IDs.\n */\n subscribeCurrent(cb: (current: readonly string[]) => void): () => void {\n this._registry.get(this._currentAtom);\n return this._registry.subscribe(this._currentAtom, () => {\n cb(this._registry.get(this._currentAtom));\n });\n }\n\n /**\n * All tracked qualified IDs.\n */\n keys(): string[] {\n return Array.from(this._map.keys());\n }\n\n /**\n * Get the attention state for a given qualified ID.\n */\n get(id: string): Attention {\n const atom = this._getAtom(id);\n return this._registry.get(atom);\n }\n\n /**\n * Subscribe to changes in the attention state for a given qualified ID.\n */\n subscribe(id: string, cb: (attention: Attention) => void): () => void {\n const atom = this._getAtom(id);\n this._registry.get(atom);\n return this._registry.subscribe(atom, () => {\n cb(this._registry.get(atom));\n });\n }\n\n private _getAtom(id: string): Atom.Writable<Attention> {\n const existing = this._map.get(id);\n if (existing) {\n return existing;\n }\n\n const newAtom = Atom.make<Attention>({ hasAttention: false, isAncestor: false, isRelated: false }).pipe(\n Atom.keepAlive,\n );\n this._map.set(id, newAtom);\n return newAtom;\n }\n\n /**\n * Update the currently attended element.\n * Takes the array of qualified IDs collected from the DOM; the first element is the primary attended item.\n * Ancestry is derived from the progressive prefixes of the primary ID.\n * Relatedness is derived from the segment ID: any tracked key whose last `/` segment matches the\n * attended ID's segment ID is marked `isRelated`. Additionally, if the primary ID has a\n * separator-prefixed last segment (starts with `~`), its immediate parent gets `isRelated` alongside `isAncestor`.\n *\n * @internal\n */\n update(nextIds: string[]): void {\n const primaryId = nextIds[0];\n if (!primaryId) {\n return;\n }\n\n const currentIds = this.getCurrent();\n const prevPrimaryId = currentIds[0];\n // Clear previous attention state: ancestors, primary, and related keys.\n if (prevPrimaryId) {\n const prevPrefixes = expandAttendableId(prevPrimaryId);\n for (const prefix of prevPrefixes) {\n this._set(prefix, {});\n }\n const prevSegmentId = getSegmentId(prevPrimaryId);\n for (const key of this.keys()) {\n if (getSegmentId(key) === prevSegmentId) {\n this._set(key, {});\n }\n }\n }\n\n this._registry.set(this._currentAtom, nextIds);\n\n // Set ancestors and primary.\n const prefixes = expandAttendableId(primaryId);\n const prefixSet = new Set(prefixes);\n const separatedParent = isSeparatorPrefixed(primaryId) ? getParentId(primaryId) : undefined;\n\n for (const prefix of prefixes) {\n if (prefix === primaryId) {\n this._set(prefix, { hasAttention: true });\n } else if (prefix === separatedParent) {\n this._set(prefix, { isAncestor: true, isRelated: true });\n } else {\n this._set(prefix, { isAncestor: true });\n }\n }\n\n // Set related keys: any tracked key sharing the same segment ID.\n const segmentId = getSegmentId(primaryId);\n for (const key of this.keys()) {\n if (!prefixSet.has(key) && getSegmentId(key) === segmentId) {\n this._set(key, { isRelated: true });\n }\n }\n }\n\n private _set(id: string, attention: Partial<Attention>): void {\n const atom = this._getAtom(id);\n this._registry.set(atom, {\n hasAttention: attention.hasAttention ?? false,\n isAncestor: attention.isAncestor ?? false,\n isRelated: attention.isRelated ?? false,\n });\n }\n}\n\n/**\n * Accumulates all attendable IDs between the element provided and the root, inclusive.\n * Each `data-attendable-id` value is treated as a single qualified ID (no splitting).\n */\nexport const getAttendables = (selector: string, cursor: Element, acc: string[] = []): string[] => {\n // Find the closest element with `data-attendable-id`, if any; start from cursor and move up the DOM tree.\n const closestAttendable = cursor.closest(selector);\n if (closestAttendable) {\n const attendableId = closestAttendable.getAttribute('data-attendable-id');\n if (!attendableId) {\n // This has an id of an aria-controls elsewhere on the page, move cursor to that trigger.\n const trigger = document.querySelector(`[aria-controls=\"${closestAttendable.getAttribute('id')}\"]`);\n if (!trigger) {\n return acc;\n } else {\n return getAttendables(selector, trigger, acc);\n }\n } else {\n acc.push(attendableId);\n return !closestAttendable.parentElement ? acc : getAttendables(selector, closestAttendable.parentElement, acc);\n }\n }\n\n return [...new Set(acc)];\n};\n\nexport type AttendableId = { attendableId?: string };\n\nexport type Related = { related?: boolean };\n\n/**\n * Decompose a qualified graph ID into progressive prefixes for ancestry tracking.\n * e.g. `root/a/b/c` yields `['root', 'root/a', 'root/a/b', 'root/a/b/c']`.\n */\nexport const expandAttendableId = (qualifiedId: string): string[] => {\n const segments = qualifiedId.split('/');\n return segments.map((_, index) => segments.slice(0, index + 1).join('/'));\n};\n\n/**\n * Whether the last segment of a qualified ID starts with the attendable path separator.\n */\nexport const isSeparatorPrefixed = (qualifiedId: string): boolean => {\n const lastSegment = qualifiedId.split('/').pop() ?? '';\n return lastSegment.startsWith(ATTENDABLE_PATH_SEPARATOR);\n};\n\n/**\n * Get the parent qualified ID (everything before the last `/` segment).\n */\nexport const getParentId = (qualifiedId: string | undefined): string | undefined => {\n if (!qualifiedId) {\n return undefined;\n }\n\n const lastSlash = qualifiedId.lastIndexOf('/');\n return lastSlash > 0 ? qualifiedId.slice(0, lastSlash) : undefined;\n};\n\n/**\n * Extract the segment ID (last segment) of a qualified ID.\n */\nexport const getSegmentId = (qualifiedId: string): string => {\n return qualifiedId.split('/').pop() ?? qualifiedId;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Slot } from '@radix-ui/react-slot';\nimport React, {\n type ComponentPropsWithRef,\n type FocusEvent,\n type PropsWithChildren,\n forwardRef,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\n\nimport { log } from '@dxos/log';\nimport { useDefaultValue } from '@dxos/react-hooks';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nimport { AttentionManager, getAttendables } from '../attention';\nimport { type Attention } from '../types';\n\nconst ATTENTION_NAME = 'Attention';\nconst ATTENDABLE_ATTRIBUTE = 'data-attendable-id';\nconst ATTENTION_SOURCE_ATTRIBUTE = 'data-w-attention-source';\n\ntype AttentionContextValue = {\n attention: AttentionManager;\n};\n\nconst [AttentionContextProvider, useAttentionContext] = createContext<AttentionContextValue>(ATTENTION_NAME, {\n attention: undefined as unknown as AttentionManager,\n});\n\nconst UNKNOWN_ATTENDABLE = { hasAttention: false, isAncestor: false, isRelated: false } as Attention;\n\n/**\n * Subscribe to the attention state for a qualified graph ID.\n */\nconst useAttention = (attendableId?: string): Attention => {\n const { attention } = useAttentionContext(ATTENTION_NAME);\n const [state, setState] = useState<Attention>(UNKNOWN_ATTENDABLE);\n\n useEffect(() => {\n if (!attendableId || !attention) {\n setState(UNKNOWN_ATTENDABLE);\n return;\n }\n\n const currentState = attention.get(attendableId);\n setState(currentState);\n\n return attention.subscribe(attendableId, (newState) => {\n setState(newState);\n });\n }, [attention, attendableId]);\n\n return state;\n};\n\nconst useAttended = () => {\n const { attention } = useAttentionContext(ATTENTION_NAME);\n const [current, setCurrent] = useState<readonly string[]>([]);\n\n useEffect(() => {\n if (!attention) {\n return;\n }\n\n setCurrent(attention.getCurrent());\n\n return attention.subscribeCurrent((newCurrent) => {\n setCurrent(newCurrent);\n });\n }, [attention]);\n\n return current;\n};\n\n/**\n * Computes HTML element attributes to apply so the attention system can detect changes.\n */\nconst useAttentionAttributes = (attendableId?: string) => {\n const { hasAttention } = useAttention(attendableId);\n return useMemo(() => {\n const attributes: Record<string, string | undefined> = { [ATTENDABLE_ATTRIBUTE]: attendableId };\n if (hasAttention) {\n attributes[ATTENTION_SOURCE_ATTRIBUTE] = 'true';\n }\n\n return attributes;\n }, [attendableId, hasAttention]);\n};\n\nconst RootAttentionProvider = ({\n children,\n attention: propsAttention,\n onChange,\n}: PropsWithChildren<\n Partial<{\n attention: AttentionManager;\n onChange: (nextAttended: string[]) => void;\n }>\n>) => {\n const registry = useContext(RegistryContext);\n const attention = useDefaultValue(propsAttention, () => new AttentionManager(registry));\n\n const handleFocus = (event: FocusEvent) => {\n // NOTE(thure): Use the following to debug focus movement across the app:\n log('focus', { related: event.relatedTarget, target: event.target });\n\n const selector = [\n '[data-attendable-id]',\n ...Array.from(document.querySelectorAll('[aria-controls]')).map(\n (el) => `[id=\"${el.getAttribute('aria-controls')}\"]`,\n ),\n ].join(',');\n const prev = attention.getCurrent();\n const next = getAttendables(selector, event.target);\n // TODO(wittjosiah): Not allowing empty state means that the attended item is not strictly guaranteed to be in the DOM.\n // Currently this depends on the deck in order to ensure that when the attended item is removed something else is attended.\n // Only update state if the result is different and not empty.\n if (next.length > 0 && (prev.length !== next.length || !!prev.find((id, index) => next[index] !== id))) {\n attention.update(next);\n onChange?.(next);\n }\n };\n\n return (\n <AttentionContextProvider attention={attention}>\n <div role='none' className='contents' onFocusCapture={handleFocus}>\n {children}\n </div>\n </AttentionContextProvider>\n );\n};\n\nexport type AttendableContainerProps = ThemedClassName<\n ComponentPropsWithRef<'div'> & { id: string; asChild?: boolean }\n>;\n\n/**\n * Note that DeckPlugin and StackPlugin both handle attention on their own,\n * and when rendering content in those cases it is not necessary to also render an `AttendableContainer`.\n * This component is primarily for Storybook stories and other testing scenarios,\n * or the rare cases where an attendable entity is rendered outside of either of those plugins.\n */\nconst AttendableContainer = forwardRef<HTMLDivElement, AttendableContainerProps>(\n ({ id, classNames, children, asChild, ...props }, forwardedRef) => {\n const attentionAttrs = useAttentionAttributes(id);\n const Comp = asChild ? Slot : Primitive.div;\n return (\n <Comp\n role='none'\n {...props}\n {...attentionAttrs}\n className={mx('dx-attention-surface', props.tabIndex === 0 && 'dx-focus-ring-inset-over-all', classNames)}\n ref={forwardedRef}\n >\n {children}\n </Comp>\n );\n },\n);\n\nexport {\n RootAttentionProvider,\n AttendableContainer,\n useAttentionContext,\n useAttention,\n useAttended,\n useAttentionAttributes,\n ATTENTION_NAME,\n ATTENDABLE_ATTRIBUTE,\n ATTENTION_SOURCE_ATTRIBUTE,\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\nimport * as Match from 'effect/Match';\nimport * as Schema from 'effect/Schema';\n\nimport { invariant } from '@dxos/invariant';\n\n// TODO(burdon): Reconcile with @dxos/graph.\n\nexport type SelectionMode = 'single' | 'multi' | 'range' | 'multi-range';\n\nexport const SelectionSchema = Schema.Union(\n Schema.Struct({ mode: Schema.Literal('single'), id: Schema.optional(Schema.String) }).pipe(Schema.mutable),\n Schema.Struct({ mode: Schema.Literal('multi'), ids: Schema.Array(Schema.String).pipe(Schema.mutable) }).pipe(\n Schema.mutable,\n ),\n Schema.Struct({\n mode: Schema.Literal('range'),\n from: Schema.optional(Schema.String),\n to: Schema.optional(Schema.String),\n }).pipe(Schema.mutable),\n Schema.Struct({\n mode: Schema.Literal('multi-range'),\n ranges: Schema.Array(Schema.Struct({ from: Schema.String, to: Schema.String })).pipe(Schema.mutable),\n }).pipe(Schema.mutable),\n).pipe(Schema.mutable);\n\nexport type Selection = Schema.Schema.Type<typeof SelectionSchema>;\n\nexport const defaultSelection = Match.type<SelectionMode>().pipe(\n Match.withReturnType<Selection>(),\n Match.when('single', () => ({ mode: 'single' })),\n Match.when('multi', () => ({ mode: 'multi', ids: [] })),\n Match.when('range', () => ({ mode: 'range' })),\n Match.when('multi-range', () => ({ mode: 'multi-range', ranges: [] })),\n Match.exhaustive,\n);\n\nexport type SelectionResult<T extends SelectionMode> = T extends 'single'\n ? string | undefined\n : T extends 'multi'\n ? string[]\n : T extends 'range'\n ? { from: string; to: string } | undefined\n : T extends 'multi-range'\n ? { from: string; to: string }[]\n : never;\n\n// TODO(burdon): Refactor.\nexport const getSelectionSet = (selectionManager: SelectionManager, contextId?: string) => {\n const ids = new Set<string>(contextId ? [contextId] : []);\n for (const context of selectionManager.getSelectionContexts()) {\n const selection = selectionManager.getSelection(context);\n if (selection?.mode === 'multi') {\n for (const id of selection.ids) {\n ids.add(id);\n }\n }\n }\n\n return ids;\n};\n\n/**\n * Manages selection state for different contexts.\n * Each context maintains its own selection mode and state.\n */\nexport class SelectionManager {\n private readonly _state: Atom.Writable<{ selections: Record<string, Selection> }>;\n\n constructor(\n private readonly _registry: Registry.Registry,\n initial: Record<string, Selection> = {},\n ) {\n this._state = Atom.make<{ selections: Record<string, Selection> }>({\n selections: { ...initial },\n });\n }\n\n /**\n * Get the state atom for reactive access in the graph system.\n */\n get state(): Atom.Atom<{ selections: Record<string, Selection> }> {\n return this._state;\n }\n\n /**\n * Gets the current state.\n */\n getState(): { selections: Record<string, Selection> } {\n return this._registry.get(this._state);\n }\n\n /**\n * Subscribe to changes in the selection state.\n */\n subscribe(cb: (state: { selections: Record<string, Selection> }) => void): () => void {\n this._registry.get(this._state);\n return this._registry.subscribe(this._state, () => {\n cb(this._registry.get(this._state));\n });\n }\n\n getSelectionContexts(): string[] {\n return Object.keys(this._registry.get(this._state).selections);\n }\n\n getSelection(contextId: string): Selection | undefined;\n getSelection<T extends SelectionMode>(contextId: string, mode: T): Selection;\n getSelection<T extends SelectionMode | undefined>(\n contextId: string,\n mode: T = undefined as T,\n ): Selection | undefined {\n const state = this._registry.get(this._state);\n const selection = state.selections[contextId];\n if (!mode || selection) {\n return selection;\n }\n\n // Create new selection for the context.\n const newSelection = defaultSelection(mode);\n this._registry.update(this._state, (state) => ({\n selections: { ...state.selections, [contextId]: newSelection },\n }));\n return newSelection;\n }\n\n // TODO(burdon): Disambiguate with getSelection?\n getSelected<T extends SelectionMode>(contextId: string, mode: T = 'multi' as T): SelectionResult<T> {\n const selection = this.getSelection(contextId, mode);\n invariant(selection?.mode === mode, 'Selection mode mismatch');\n // Cast required because TypeScript can't infer the relationship between T and the matched result.\n return Match.type<Selection>().pipe(\n Match.when({ mode: 'single' }, (s) => s.id),\n Match.when({ mode: 'multi' }, (s) => s.ids),\n Match.when({ mode: 'range' }, (s) => (s.from && s.to ? { from: s.from, to: s.to } : undefined)),\n Match.when({ mode: 'multi-range' }, (s) => s.ranges),\n Match.exhaustive,\n )(selection) as SelectionResult<T>;\n }\n\n updateSingle(contextId: string, id: string): void {\n const selection = this.getSelection(contextId, 'single');\n invariant(selection?.mode === 'single', 'Selection mode is not single');\n this._registry.update(this._state, (state) => ({\n selections: {\n ...state.selections,\n [contextId]: { ...selection, id },\n },\n }));\n }\n\n updateMulti(contextId: string, ids: string[]) {\n const selection = this.getSelection(contextId, 'multi');\n invariant(selection?.mode === 'multi', 'Selection mode is not multi');\n this._registry.update(this._state, (state) => ({\n selections: {\n ...state.selections,\n [contextId]: { ...selection, ids: [...ids] },\n },\n }));\n }\n\n updateRange(contextId: string, from: string, to: string) {\n const selection = this.getSelection(contextId, 'range');\n invariant(selection?.mode === 'range', 'Selection mode is not range');\n this._registry.update(this._state, (state) => ({\n selections: {\n ...state.selections,\n [contextId]: { ...selection, from, to },\n },\n }));\n }\n\n updateMultiRange(contextId: string, ranges: { from: string; to: string }[]) {\n const selection = this.getSelection(contextId, 'multi-range');\n invariant(selection?.mode === 'multi-range', 'Selection mode is not multi-range');\n this._registry.update(this._state, (state) => ({\n selections: {\n ...state.selections,\n [contextId]: { ...selection, ranges: [...ranges] },\n },\n }));\n }\n\n clearSelection(contextId: string): void {\n const selection = this.getSelection(contextId);\n if (!selection) {\n return;\n }\n\n const clearedSelection = Match.type<Selection>().pipe(\n Match.when({ mode: 'single' }, (s) => ({ ...s, id: undefined })),\n Match.when({ mode: 'multi' }, (s) => ({ ...s, ids: [] })),\n Match.when({ mode: 'range' }, (s) => ({ ...s, from: undefined, to: undefined })),\n Match.when({ mode: 'multi-range' }, (s) => ({ ...s, ranges: [] })),\n Match.exhaustive,\n )(selection);\n\n this._registry.update(this._state, (state) => ({\n selections: {\n ...state.selections,\n [contextId]: clearedSelection,\n },\n }));\n }\n\n toggleSelection(contextId: string, id: string): void {\n const selection = this.getSelection(contextId, 'multi');\n invariant(selection?.mode === 'multi', 'Selection mode is not multi');\n\n const newIds = selection.ids.includes(id)\n ? selection.ids.filter((existingId) => existingId !== id)\n : [...selection.ids, id];\n\n this._registry.update(this._state, (state) => ({\n selections: {\n ...state.selections,\n [contextId]: { ...selection, ids: newIds },\n },\n }));\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport * as Match from 'effect/Match';\nimport React, { type PropsWithChildren, useCallback, useContext, useEffect, useMemo, useState } from 'react';\n\nimport { useDefaultValue } from '@dxos/react-hooks';\n\nimport {\n type Selection,\n SelectionManager,\n type SelectionMode,\n type SelectionResult,\n defaultSelection,\n} from '../selection';\n\nconst SELECTION_NAME = 'Selection';\n\ntype SelectionContextValue = {\n selection: SelectionManager;\n};\n\nconst [SelectionContextProvider, useSelectionContext] = createContext<SelectionContextValue>(SELECTION_NAME, {\n selection: undefined as unknown as SelectionManager,\n});\n\n/**\n * Manages selection state across the app for multiple contexts.\n */\n// TODO(burdon): When is the selection removed?\nexport const SelectionProvider = ({\n children,\n selection: propsSelection,\n}: PropsWithChildren<{ selection?: SelectionManager }>) => {\n const registry = useContext(RegistryContext);\n const selection = useDefaultValue(propsSelection, () => new SelectionManager(registry));\n return <SelectionContextProvider selection={selection}>{children}</SelectionContextProvider>;\n};\n\n/**\n * Get the selection contexts.\n */\nexport const useSelectionManager = () => {\n const { selection } = useSelectionContext(SELECTION_NAME);\n return selection;\n};\n\nconst getDefaultResult = <T extends SelectionMode>(mode: T): SelectionResult<T> => {\n return Match.type<Selection>().pipe(\n Match.when({ mode: 'single' }, (selection) => selection.id),\n Match.when({ mode: 'multi' }, (selection) => selection.ids),\n Match.when({ mode: 'range' }, (selection) =>\n selection.from && selection.to ? { from: selection.from, to: selection.to } : undefined,\n ),\n Match.when({ mode: 'multi-range' }, (selection) => selection.ranges),\n Match.exhaustive,\n )(defaultSelection(mode)) as SelectionResult<T>;\n};\n\n/**\n * Get the selected objects for a given context.\n */\nexport const useSelected = <T extends SelectionMode>(\n contextId?: string,\n mode: T = 'multi' as T,\n): SelectionResult<T> => {\n const { selection } = useSelectionContext(SELECTION_NAME);\n const [state, setState] = useState<SelectionResult<T>>(() =>\n contextId && selection ? selection.getSelected(contextId, mode) : getDefaultResult(mode),\n );\n\n useEffect(() => {\n if (!contextId || !selection) {\n setState(getDefaultResult(mode));\n return;\n }\n\n // Set initial state.\n setState(selection.getSelected(contextId, mode));\n\n // Subscribe to changes.\n return selection.subscribe(() => {\n setState(selection.getSelected(contextId, mode));\n });\n }, [selection, contextId, mode]);\n\n return state;\n};\n\nexport type UseSelectionActions = {\n singleSelect: (id: string) => void;\n multiSelect: (ids: string[]) => void;\n rangeSelect: (from: string, to: string) => void;\n toggle: (id: string) => void;\n clear: () => void;\n};\n\n/**\n * Provides functions to manage the selection state for multiple contexts.\n */\n// TODO(burdon): Mode not used.\nexport const useSelectionActions = (contextIds: string[], mode: SelectionMode = 'multi'): UseSelectionActions => {\n const stableContextIds = useMemo(() => contextIds, [JSON.stringify(contextIds)]); // TODO(burdon): Avoid stringify.\n const { selection } = useSelectionContext(SELECTION_NAME);\n\n const singleSelect = useCallback(\n (id: string) => {\n if (!selection) {\n return;\n }\n for (const contextId of stableContextIds) {\n selection.updateSingle(contextId, id);\n }\n },\n [selection, stableContextIds],\n );\n\n const multiSelect = useCallback(\n (ids: string[]) => {\n if (!selection) {\n return;\n }\n for (const contextId of stableContextIds) {\n selection.updateMulti(contextId, ids);\n }\n },\n [selection, stableContextIds],\n );\n\n const rangeSelect = useCallback(\n (from: string, to: string) => {\n if (!selection) {\n return;\n }\n for (const contextId of stableContextIds) {\n selection.updateRange(contextId, from, to);\n }\n },\n [selection, stableContextIds],\n );\n\n const toggle = useCallback(\n (id: string) => {\n if (!selection) {\n return;\n }\n for (const contextId of stableContextIds) {\n selection.toggleSelection(contextId, id);\n }\n },\n [selection, stableContextIds],\n );\n\n const clear = useCallback(() => {\n if (!selection) {\n return;\n }\n for (const contextId of stableContextIds) {\n selection.clearSelection(contextId);\n }\n }, [selection, stableContextIds]);\n\n return { singleSelect, multiSelect, rangeSelect, toggle, clear };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["Atom", "AttentionManager", "_map", "Map", "_currentAtom", "_registry", "initial", "Atom", "make", "pipe", "keepAlive", "length", "update", "current", "getCurrent", "get", "subscribeCurrent", "cb", "subscribe", "keys", "Array", "from", "id", "atom", "_getAtom", "existing", "newAtom", "hasAttention", "isAncestor", "isRelated", "set", "nextIds", "primaryId", "currentIds", "prevPrimaryId", "prevPrefixes", "expandAttendableId", "prefix", "_set", "prevSegmentId", "getSegmentId", "key", "prefixes", "prefixSet", "Set", "separatedParent", "isSeparatorPrefixed", "getParentId", "undefined", "segmentId", "has", "attention", "getAttendables", "selector", "cursor", "acc", "closestAttendable", "closest", "attendableId", "getAttribute", "trigger", "document", "querySelector", "push", "parentElement", "qualifiedId", "segments", "split", "map", "_", "index", "slice", "join", "lastSegment", "pop", "startsWith", "ATTENDABLE_PATH_SEPARATOR", "lastSlash", "lastIndexOf", "RegistryContext", "createContext", "Primitive", "Slot", "React", "forwardRef", "useContext", "useEffect", "useMemo", "useState", "log", "useDefaultValue", "mx", "ATTENTION_NAME", "ATTENDABLE_ATTRIBUTE", "ATTENTION_SOURCE_ATTRIBUTE", "AttentionContextProvider", "useAttentionContext", "createContext", "attention", "undefined", "UNKNOWN_ATTENDABLE", "hasAttention", "isAncestor", "isRelated", "useAttention", "attendableId", "state", "setState", "useState", "useEffect", "currentState", "get", "subscribe", "newState", "useAttended", "current", "setCurrent", "getCurrent", "subscribeCurrent", "newCurrent", "useAttentionAttributes", "useMemo", "attributes", "RootAttentionProvider", "children", "propsAttention", "onChange", "registry", "useContext", "RegistryContext", "useDefaultValue", "AttentionManager", "handleFocus", "event", "log", "related", "relatedTarget", "target", "selector", "Array", "from", "document", "querySelectorAll", "map", "el", "getAttribute", "join", "prev", "next", "getAttendables", "length", "find", "id", "index", "update", "div", "role", "className", "onFocusCapture", "AttendableContainer", "forwardRef", "classNames", "asChild", "props", "forwardedRef", "attentionAttrs", "Comp", "Slot", "Primitive", "mx", "tabIndex", "ref", "Atom", "Match", "Schema", "invariant", "SelectionSchema", "Union", "Struct", "mode", "Literal", "id", "optional", "String", "pipe", "mutable", "ids", "Array", "from", "to", "ranges", "defaultSelection", "type", "withReturnType", "when", "exhaustive", "getSelectionSet", "selectionManager", "contextId", "Set", "context", "getSelectionContexts", "selection", "getSelection", "add", "SelectionManager", "_state", "_registry", "initial", "make", "selections", "state", "getState", "get", "subscribe", "cb", "Object", "keys", "undefined", "newSelection", "update", "getSelected", "s", "updateSingle", "updateMulti", "updateRange", "updateMultiRange", "clearSelection", "clearedSelection", "toggleSelection", "newIds", "includes", "filter", "existingId", "RegistryContext", "createContext", "Match", "React", "useCallback", "useContext", "useEffect", "useMemo", "useState", "useDefaultValue", "SELECTION_NAME", "SelectionContextProvider", "useSelectionContext", "createContext", "selection", "undefined", "SelectionProvider", "children", "propsSelection", "registry", "useContext", "RegistryContext", "useDefaultValue", "SelectionManager", "React", "useSelectionManager", "getDefaultResult", "mode", "type", "pipe", "when", "id", "ids", "from", "to", "ranges", "exhaustive", "defaultSelection", "useSelected", "contextId", "state", "setState", "useState", "getSelected", "useEffect", "subscribe", "useSelectionActions", "contextIds", "stableContextIds", "useMemo", "JSON", "stringify", "singleSelect", "useCallback", "updateSingle", "multiSelect", "updateMulti", "rangeSelect", "updateRange", "toggle", "toggleSelection", "clear", "clearSelection"]
7
+ }