@liveblocks/react-ui 2.25.0-aiprivatebeta7 → 2.25.0-aiprivatebeta9

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 (135) hide show
  1. package/dist/_private/index.cjs +14 -10
  2. package/dist/_private/index.cjs.map +1 -1
  3. package/dist/_private/index.d.cts +200 -105
  4. package/dist/_private/index.d.ts +200 -105
  5. package/dist/_private/index.js +10 -5
  6. package/dist/_private/index.js.map +1 -1
  7. package/dist/components/AiChat.cjs +85 -120
  8. package/dist/components/AiChat.cjs.map +1 -1
  9. package/dist/components/AiChat.js +87 -122
  10. package/dist/components/AiChat.js.map +1 -1
  11. package/dist/components/AiTool.cjs +164 -0
  12. package/dist/components/AiTool.cjs.map +1 -0
  13. package/dist/components/AiTool.js +162 -0
  14. package/dist/components/AiTool.js.map +1 -0
  15. package/dist/components/Comment.cjs +5 -3
  16. package/dist/components/Comment.cjs.map +1 -1
  17. package/dist/components/Comment.js +6 -4
  18. package/dist/components/Comment.js.map +1 -1
  19. package/dist/components/InboxNotificationList.cjs +11 -3
  20. package/dist/components/InboxNotificationList.cjs.map +1 -1
  21. package/dist/components/InboxNotificationList.js +12 -4
  22. package/dist/components/InboxNotificationList.js.map +1 -1
  23. package/dist/components/Thread.cjs +3 -3
  24. package/dist/components/Thread.cjs.map +1 -1
  25. package/dist/components/Thread.js +3 -3
  26. package/dist/components/Thread.js.map +1 -1
  27. package/dist/components/internal/AiChatAssistantMessage.cjs +53 -229
  28. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  29. package/dist/components/internal/AiChatAssistantMessage.js +55 -231
  30. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  31. package/dist/components/internal/AiChatComposer.cjs +29 -17
  32. package/dist/components/internal/AiChatComposer.cjs.map +1 -1
  33. package/dist/components/internal/AiChatComposer.js +29 -17
  34. package/dist/components/internal/AiChatComposer.js.map +1 -1
  35. package/dist/components/internal/AiChatUserMessage.cjs +17 -10
  36. package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
  37. package/dist/components/internal/AiChatUserMessage.js +17 -10
  38. package/dist/components/internal/AiChatUserMessage.js.map +1 -1
  39. package/dist/components/internal/Button.cjs.map +1 -1
  40. package/dist/components/internal/Button.js.map +1 -1
  41. package/dist/components/internal/CodeBlock.cjs +72 -0
  42. package/dist/components/internal/CodeBlock.cjs.map +1 -0
  43. package/dist/components/internal/CodeBlock.js +70 -0
  44. package/dist/components/internal/CodeBlock.js.map +1 -0
  45. package/dist/components/internal/Emoji.cjs +12 -4
  46. package/dist/components/internal/Emoji.cjs.map +1 -1
  47. package/dist/components/internal/Emoji.js +12 -4
  48. package/dist/components/internal/Emoji.js.map +1 -1
  49. package/dist/components/internal/Prose.cjs +37 -0
  50. package/dist/components/internal/Prose.cjs.map +1 -0
  51. package/dist/components/internal/Prose.js +35 -0
  52. package/dist/components/internal/Prose.js.map +1 -0
  53. package/dist/icon.cjs +2 -0
  54. package/dist/icon.cjs.map +1 -1
  55. package/dist/icon.js +1 -0
  56. package/dist/icon.js.map +1 -1
  57. package/dist/icons/{Resolve.cjs → CheckCircle.cjs} +3 -3
  58. package/dist/icons/CheckCircle.cjs.map +1 -0
  59. package/dist/icons/{Resolve.js → CheckCircle.js} +3 -3
  60. package/dist/icons/CheckCircle.js.map +1 -0
  61. package/dist/icons/{Resolved.cjs → CheckCircleFill.cjs} +3 -3
  62. package/dist/icons/CheckCircleFill.cjs.map +1 -0
  63. package/dist/icons/{Resolved.js → CheckCircleFill.js} +3 -3
  64. package/dist/icons/CheckCircleFill.js.map +1 -0
  65. package/dist/icons/index.cjs +4 -4
  66. package/dist/icons/index.js +2 -2
  67. package/dist/index.cjs +2 -0
  68. package/dist/index.cjs.map +1 -1
  69. package/dist/index.d.cts +68 -14
  70. package/dist/index.d.ts +68 -14
  71. package/dist/index.js +1 -0
  72. package/dist/index.js.map +1 -1
  73. package/dist/overrides.cjs +2 -8
  74. package/dist/overrides.cjs.map +1 -1
  75. package/dist/overrides.js +2 -8
  76. package/dist/overrides.js.map +1 -1
  77. package/dist/primitives/AiChatComposer/index.cjs +1 -2
  78. package/dist/primitives/AiChatComposer/index.cjs.map +1 -1
  79. package/dist/primitives/AiChatComposer/index.js +1 -2
  80. package/dist/primitives/AiChatComposer/index.js.map +1 -1
  81. package/dist/primitives/AiMessage/contexts.cjs +18 -0
  82. package/dist/primitives/AiMessage/contexts.cjs.map +1 -0
  83. package/dist/primitives/AiMessage/contexts.js +15 -0
  84. package/dist/primitives/AiMessage/contexts.js.map +1 -0
  85. package/dist/primitives/AiMessage/index.cjs +133 -0
  86. package/dist/primitives/AiMessage/index.cjs.map +1 -0
  87. package/dist/primitives/AiMessage/index.js +131 -0
  88. package/dist/primitives/AiMessage/index.js.map +1 -0
  89. package/dist/primitives/{internal/Collapsible → Collapsible}/index.cjs +39 -17
  90. package/dist/primitives/Collapsible/index.cjs.map +1 -0
  91. package/dist/primitives/{internal/Collapsible → Collapsible}/index.js +37 -15
  92. package/dist/primitives/Collapsible/index.js.map +1 -0
  93. package/dist/primitives/{internal/Markdown.cjs → Markdown.cjs} +150 -83
  94. package/dist/primitives/Markdown.cjs.map +1 -0
  95. package/dist/primitives/{internal/Markdown.js → Markdown.js} +151 -83
  96. package/dist/primitives/Markdown.js.map +1 -0
  97. package/dist/primitives/index.cjs +4 -6
  98. package/dist/primitives/index.cjs.map +1 -1
  99. package/dist/primitives/index.d.cts +2 -79
  100. package/dist/primitives/index.d.ts +2 -79
  101. package/dist/primitives/index.js +4 -6
  102. package/dist/primitives/index.js.map +1 -1
  103. package/dist/utils/ErrorBoundary.cjs +48 -0
  104. package/dist/utils/ErrorBoundary.cjs.map +1 -0
  105. package/dist/utils/ErrorBoundary.js +45 -0
  106. package/dist/utils/ErrorBoundary.js.map +1 -0
  107. package/dist/utils/use-visible.cjs +63 -45
  108. package/dist/utils/use-visible.cjs.map +1 -1
  109. package/dist/utils/use-visible.js +64 -46
  110. package/dist/utils/use-visible.js.map +1 -1
  111. package/dist/version.cjs +1 -1
  112. package/dist/version.js +1 -1
  113. package/package.json +5 -5
  114. package/src/styles/constants.css +1 -1
  115. package/src/styles/dark/index.css +7 -3
  116. package/src/styles/index.css +584 -238
  117. package/src/styles/utils.css +1 -1
  118. package/styles/dark/attributes.css +1 -1
  119. package/styles/dark/attributes.css.map +1 -1
  120. package/styles/dark/media-query.css +1 -1
  121. package/styles/dark/media-query.css.map +1 -1
  122. package/styles.css +1 -1
  123. package/styles.css.map +1 -1
  124. package/dist/icons/Resolve.cjs.map +0 -1
  125. package/dist/icons/Resolve.js.map +0 -1
  126. package/dist/icons/Resolved.cjs.map +0 -1
  127. package/dist/icons/Resolved.js.map +0 -1
  128. package/dist/primitives/internal/Collapsible/index.cjs.map +0 -1
  129. package/dist/primitives/internal/Collapsible/index.js.map +0 -1
  130. package/dist/primitives/internal/Emoji.cjs +0 -32
  131. package/dist/primitives/internal/Emoji.cjs.map +0 -1
  132. package/dist/primitives/internal/Emoji.js +0 -30
  133. package/dist/primitives/internal/Emoji.js.map +0 -1
  134. package/dist/primitives/internal/Markdown.cjs.map +0 -1
  135. package/dist/primitives/internal/Markdown.js.map +0 -1
@@ -1,9 +1,7 @@
1
- import * as index from './AiChatComposer/index.js';
2
- export { index as AiChatComposer };
3
- import * as index$1 from './Comment/index.js';
4
- export { index$1 as Comment };
5
- import * as index$2 from './Composer/index.js';
6
- export { index$2 as Composer };
1
+ import * as index from './Comment/index.js';
2
+ export { index as Comment };
3
+ import * as index$1 from './Composer/index.js';
4
+ export { index$1 as Composer };
7
5
  export { useComposer } from './Composer/contexts.js';
8
6
  export { AttachmentTooLargeError } from './Composer/utils.js';
9
7
  export { FileSize } from './FileSize.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
@@ -0,0 +1,48 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('react');
5
+
6
+ const ErrorBoundaryContext = react.createContext(null);
7
+ class ErrorBoundary extends react.Component {
8
+ constructor(props) {
9
+ super(props);
10
+ this.state = { error: null };
11
+ }
12
+ static getDerivedStateFromError(error) {
13
+ return { error };
14
+ }
15
+ componentDidCatch(error, errorInfo) {
16
+ console.error(error, errorInfo);
17
+ }
18
+ reset() {
19
+ this.setState({ error: null });
20
+ }
21
+ render() {
22
+ if (this.state.error === null)
23
+ return this.props.children;
24
+ const error = this.state.error;
25
+ const reset = this.reset.bind(this);
26
+ const fallback = this.props.fallback;
27
+ const Fallback = typeof fallback === "function" ? fallback : () => fallback ?? null;
28
+ return /* @__PURE__ */ jsxRuntime.jsx(ErrorBoundaryContext.Provider, {
29
+ value: { error, reset },
30
+ children: /* @__PURE__ */ jsxRuntime.jsx(Fallback, {
31
+ error: this.state.error
32
+ })
33
+ });
34
+ }
35
+ }
36
+ function useErrorBoundary() {
37
+ const context = react.useContext(ErrorBoundaryContext);
38
+ if (context === null) {
39
+ throw new Error(
40
+ "useErrorBoundary must be used within an ErrorBoundary component"
41
+ );
42
+ }
43
+ return context;
44
+ }
45
+
46
+ exports.ErrorBoundary = ErrorBoundary;
47
+ exports.useErrorBoundary = useErrorBoundary;
48
+ //# sourceMappingURL=ErrorBoundary.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorBoundary.cjs","sources":["../../src/utils/ErrorBoundary.tsx"],"sourcesContent":["import type { ComponentType, ErrorInfo, ReactNode } from \"react\";\nimport { Component, createContext, useContext } from \"react\";\n\nconst ErrorBoundaryContext = createContext<{\n error: Error;\n reset: () => void;\n} | null>(null);\n\nexport interface ErrorBoundaryProps {\n children?: ReactNode;\n fallback?: ReactNode | ComponentType<{ error: Error }>;\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error(error, errorInfo);\n }\n\n reset() {\n this.setState({ error: null });\n }\n\n render(): React.ReactNode {\n if (this.state.error === null) return this.props.children;\n\n const error = this.state.error;\n const reset = this.reset.bind(this);\n const fallback = this.props.fallback;\n const Fallback =\n typeof fallback === \"function\" ? fallback : () => fallback ?? null;\n return (\n <ErrorBoundaryContext.Provider value={{ error, reset }}>\n <Fallback error={this.state.error} />\n </ErrorBoundaryContext.Provider>\n );\n }\n}\n\nexport function useErrorBoundary(): {\n error: Error;\n reset: () => void;\n} {\n const context = useContext(ErrorBoundaryContext);\n\n if (context === null) {\n throw new Error(\n \"useErrorBoundary must be used within an ErrorBoundary component\"\n );\n }\n\n return context;\n}\n"],"names":["createContext","Component","jsx","useContext"],"mappings":";;;;;AAGA,MAAM,oBAAA,GAAuBA,oBAGnB,IAAI,CAAA,CAAA;AAWP,MAAM,sBAAsBC,eAGjC,CAAA;AAAA,EACA,YAAY,KAA2B,EAAA;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACX,IAAK,IAAA,CAAA,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAK,EAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,OAAO,yBAAyB,KAAc,EAAA;AAC5C,IAAA,OAAO,EAAE,KAAM,EAAA,CAAA;AAAA,GACjB;AAAA,EAEA,iBAAA,CAAkB,OAAc,SAA4B,EAAA;AAC1D,IAAQ,OAAA,CAAA,KAAA,CAAM,OAAO,SAAS,CAAA,CAAA;AAAA,GAChC;AAAA,EAEA,KAAQ,GAAA;AACN,IAAA,IAAA,CAAK,QAAS,CAAA,EAAE,KAAO,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,GAC/B;AAAA,EAEA,MAA0B,GAAA;AACxB,IAAI,IAAA,IAAA,CAAK,MAAM,KAAU,KAAA,IAAA;AAAM,MAAA,OAAO,KAAK,KAAM,CAAA,QAAA,CAAA;AAEjD,IAAM,MAAA,KAAA,GAAQ,KAAK,KAAM,CAAA,KAAA,CAAA;AACzB,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAClC,IAAM,MAAA,QAAA,GAAW,KAAK,KAAM,CAAA,QAAA,CAAA;AAC5B,IAAA,MAAM,WACJ,OAAO,QAAA,KAAa,UAAa,GAAA,QAAA,GAAW,MAAM,QAAY,IAAA,IAAA,CAAA;AAChE,IACE,uBAAAC,cAAA,CAAC,qBAAqB,QAArB,EAAA;AAAA,MAA8B,KAAA,EAAO,EAAE,KAAA,EAAO,KAAM,EAAA;AAAA,MACnD,QAAC,kBAAAA,cAAA,CAAA,QAAA,EAAA;AAAA,QAAS,KAAA,EAAO,KAAK,KAAM,CAAA,KAAA;AAAA,OAAO,CAAA;AAAA,KACrC,CAAA,CAAA;AAAA,GAEJ;AACF,CAAA;AAEO,SAAS,gBAGd,GAAA;AACA,EAAM,MAAA,OAAA,GAAUC,iBAAW,oBAAoB,CAAA,CAAA;AAE/C,EAAA,IAAI,YAAY,IAAM,EAAA;AACpB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,iEAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAO,OAAA,OAAA,CAAA;AACT;;;;;"}
@@ -0,0 +1,45 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { createContext, Component, useContext } from 'react';
3
+
4
+ const ErrorBoundaryContext = createContext(null);
5
+ class ErrorBoundary extends Component {
6
+ constructor(props) {
7
+ super(props);
8
+ this.state = { error: null };
9
+ }
10
+ static getDerivedStateFromError(error) {
11
+ return { error };
12
+ }
13
+ componentDidCatch(error, errorInfo) {
14
+ console.error(error, errorInfo);
15
+ }
16
+ reset() {
17
+ this.setState({ error: null });
18
+ }
19
+ render() {
20
+ if (this.state.error === null)
21
+ return this.props.children;
22
+ const error = this.state.error;
23
+ const reset = this.reset.bind(this);
24
+ const fallback = this.props.fallback;
25
+ const Fallback = typeof fallback === "function" ? fallback : () => fallback ?? null;
26
+ return /* @__PURE__ */ jsx(ErrorBoundaryContext.Provider, {
27
+ value: { error, reset },
28
+ children: /* @__PURE__ */ jsx(Fallback, {
29
+ error: this.state.error
30
+ })
31
+ });
32
+ }
33
+ }
34
+ function useErrorBoundary() {
35
+ const context = useContext(ErrorBoundaryContext);
36
+ if (context === null) {
37
+ throw new Error(
38
+ "useErrorBoundary must be used within an ErrorBoundary component"
39
+ );
40
+ }
41
+ return context;
42
+ }
43
+
44
+ export { ErrorBoundary, useErrorBoundary };
45
+ //# sourceMappingURL=ErrorBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorBoundary.js","sources":["../../src/utils/ErrorBoundary.tsx"],"sourcesContent":["import type { ComponentType, ErrorInfo, ReactNode } from \"react\";\nimport { Component, createContext, useContext } from \"react\";\n\nconst ErrorBoundaryContext = createContext<{\n error: Error;\n reset: () => void;\n} | null>(null);\n\nexport interface ErrorBoundaryProps {\n children?: ReactNode;\n fallback?: ReactNode | ComponentType<{ error: Error }>;\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error(error, errorInfo);\n }\n\n reset() {\n this.setState({ error: null });\n }\n\n render(): React.ReactNode {\n if (this.state.error === null) return this.props.children;\n\n const error = this.state.error;\n const reset = this.reset.bind(this);\n const fallback = this.props.fallback;\n const Fallback =\n typeof fallback === \"function\" ? fallback : () => fallback ?? null;\n return (\n <ErrorBoundaryContext.Provider value={{ error, reset }}>\n <Fallback error={this.state.error} />\n </ErrorBoundaryContext.Provider>\n );\n }\n}\n\nexport function useErrorBoundary(): {\n error: Error;\n reset: () => void;\n} {\n const context = useContext(ErrorBoundaryContext);\n\n if (context === null) {\n throw new Error(\n \"useErrorBoundary must be used within an ErrorBoundary component\"\n );\n }\n\n return context;\n}\n"],"names":[],"mappings":";;;AAGA,MAAM,oBAAA,GAAuB,cAGnB,IAAI,CAAA,CAAA;AAWP,MAAM,sBAAsB,SAGjC,CAAA;AAAA,EACA,YAAY,KAA2B,EAAA;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACX,IAAK,IAAA,CAAA,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAK,EAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,OAAO,yBAAyB,KAAc,EAAA;AAC5C,IAAA,OAAO,EAAE,KAAM,EAAA,CAAA;AAAA,GACjB;AAAA,EAEA,iBAAA,CAAkB,OAAc,SAA4B,EAAA;AAC1D,IAAQ,OAAA,CAAA,KAAA,CAAM,OAAO,SAAS,CAAA,CAAA;AAAA,GAChC;AAAA,EAEA,KAAQ,GAAA;AACN,IAAA,IAAA,CAAK,QAAS,CAAA,EAAE,KAAO,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,GAC/B;AAAA,EAEA,MAA0B,GAAA;AACxB,IAAI,IAAA,IAAA,CAAK,MAAM,KAAU,KAAA,IAAA;AAAM,MAAA,OAAO,KAAK,KAAM,CAAA,QAAA,CAAA;AAEjD,IAAM,MAAA,KAAA,GAAQ,KAAK,KAAM,CAAA,KAAA,CAAA;AACzB,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAClC,IAAM,MAAA,QAAA,GAAW,KAAK,KAAM,CAAA,QAAA,CAAA;AAC5B,IAAA,MAAM,WACJ,OAAO,QAAA,KAAa,UAAa,GAAA,QAAA,GAAW,MAAM,QAAY,IAAA,IAAA,CAAA;AAChE,IACE,uBAAA,GAAA,CAAC,qBAAqB,QAArB,EAAA;AAAA,MAA8B,KAAA,EAAO,EAAE,KAAA,EAAO,KAAM,EAAA;AAAA,MACnD,QAAC,kBAAA,GAAA,CAAA,QAAA,EAAA;AAAA,QAAS,KAAA,EAAO,KAAK,KAAM,CAAA,KAAA;AAAA,OAAO,CAAA;AAAA,KACrC,CAAA,CAAA;AAAA,GAEJ;AACF,CAAA;AAEO,SAAS,gBAGd,GAAA;AACA,EAAM,MAAA,OAAA,GAAU,WAAW,oBAAoB,CAAA,CAAA;AAE/C,EAAA,IAAI,YAAY,IAAM,EAAA;AACpB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,iEAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAO,OAAA,OAAA,CAAA;AACT;;;;"}
@@ -3,68 +3,86 @@
3
3
  var react = require('react');
4
4
  var useLatest = require('./use-latest.cjs');
5
5
 
6
- let intersectionObserver;
7
- const intersectionCallbacks = /* @__PURE__ */ new WeakMap();
8
- function observe(element, callback) {
9
- if (!intersectionObserver) {
10
- intersectionObserver = new IntersectionObserver((entries) => {
11
- for (const entry of entries) {
12
- const callback2 = intersectionCallbacks.get(entry.target);
13
- callback2?.(entry);
6
+ let optionlessIntersectionObserver;
7
+ const optionlessIntersectionCallbacks = /* @__PURE__ */ new WeakMap();
8
+ const individualIntersectionObservers = /* @__PURE__ */ new WeakMap();
9
+ function observe(element, callback, options) {
10
+ if (!options) {
11
+ if (!optionlessIntersectionObserver) {
12
+ optionlessIntersectionObserver = new IntersectionObserver((entries) => {
13
+ for (const entry of entries) {
14
+ const callback2 = optionlessIntersectionCallbacks.get(entry.target);
15
+ callback2?.(entry);
16
+ }
17
+ });
18
+ }
19
+ optionlessIntersectionCallbacks.set(element, callback);
20
+ optionlessIntersectionObserver.observe(element);
21
+ } else {
22
+ const observer = new IntersectionObserver(
23
+ (entries) => {
24
+ for (const entry of entries) {
25
+ callback?.(entry);
26
+ }
27
+ },
28
+ {
29
+ root: options.root?.current,
30
+ rootMargin: typeof options.rootMargin === "number" ? `${options.rootMargin}px` : options.rootMargin
14
31
  }
15
- });
32
+ );
33
+ individualIntersectionObservers.set(element, observer);
34
+ observer.observe(element);
16
35
  }
17
- intersectionCallbacks.set(element, callback);
18
- intersectionObserver.observe(element);
19
36
  }
20
- function unobserve(element) {
21
- intersectionCallbacks.delete(element);
22
- intersectionObserver?.unobserve(element);
23
- }
24
- function useVisible(ref, options) {
25
- const [isVisible, setVisible] = react.useState(false);
26
- const enabled = options?.enabled ?? true;
27
- react.useEffect(() => {
28
- const element = ref.current;
29
- if (!element) {
30
- return;
31
- }
32
- if (enabled) {
33
- observe(element, (entry) => {
34
- setVisible(entry.isIntersecting);
35
- });
36
- } else {
37
- unobserve(element);
38
- }
39
- return () => {
40
- unobserve(element);
41
- };
42
- }, [enabled]);
43
- return isVisible;
37
+ function unobserve(element, options) {
38
+ if (!options) {
39
+ optionlessIntersectionCallbacks.delete(element);
40
+ optionlessIntersectionObserver?.unobserve(element);
41
+ } else {
42
+ const observer = individualIntersectionObservers.get(element);
43
+ observer?.unobserve(element);
44
+ individualIntersectionObservers.delete(element);
45
+ }
44
46
  }
45
- function useVisibleCallback(ref, callback, options) {
47
+ function useIntersectionCallback(ref, callback, options) {
46
48
  const enabled = options?.enabled ?? true;
47
49
  const latestCallback = useLatest.useLatest(callback);
50
+ const { root, rootMargin } = options ?? {};
48
51
  react.useEffect(() => {
49
52
  const element = ref.current;
50
53
  if (!element) {
51
54
  return;
52
55
  }
56
+ const observeOptions = {
57
+ root,
58
+ rootMargin
59
+ };
53
60
  if (enabled) {
54
- observe(element, (entry) => {
55
- if (entry.isIntersecting) {
56
- latestCallback.current();
57
- }
58
- });
61
+ observe(
62
+ element,
63
+ (entry) => {
64
+ latestCallback.current(entry.isIntersecting, entry);
65
+ },
66
+ observeOptions
67
+ );
59
68
  } else {
60
- unobserve(element);
69
+ unobserve(element, observeOptions);
61
70
  }
62
71
  return () => {
63
- unobserve(element);
72
+ unobserve(element, observeOptions);
64
73
  };
65
- }, [enabled]);
74
+ }, [ref, enabled, latestCallback, root, rootMargin]);
75
+ }
76
+ function useVisible(ref, options) {
77
+ const [isVisible, setVisible] = react.useState(false);
78
+ useIntersectionCallback(
79
+ ref,
80
+ (isIntersecting) => setVisible(isIntersecting),
81
+ options
82
+ );
83
+ return isVisible;
66
84
  }
67
85
 
86
+ exports.useIntersectionCallback = useIntersectionCallback;
68
87
  exports.useVisible = useVisible;
69
- exports.useVisibleCallback = useVisibleCallback;
70
88
  //# sourceMappingURL=use-visible.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-visible.cjs","sources":["../../src/utils/use-visible.ts"],"sourcesContent":["import { type RefObject, useEffect, useState } from \"react\";\n\nimport { useLatest } from \"./use-latest\";\n\ntype Options = { enabled?: boolean };\n\ntype IntersectionObserverSingleCallback = (\n entry: IntersectionObserverEntry\n) => void;\n\nlet intersectionObserver: IntersectionObserver | undefined;\nconst intersectionCallbacks = new WeakMap<\n Element,\n IntersectionObserverSingleCallback\n>();\n\nfunction observe(\n element: Element,\n callback: IntersectionObserverSingleCallback\n) {\n if (!intersectionObserver) {\n intersectionObserver = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const callback = intersectionCallbacks.get(entry.target);\n\n callback?.(entry);\n }\n });\n }\n\n intersectionCallbacks.set(element, callback);\n intersectionObserver.observe(element);\n}\n\nfunction unobserve(element: Element) {\n intersectionCallbacks.delete(element);\n intersectionObserver?.unobserve(element);\n}\n\n/**\n * Observe whether an element is currently visible or not.\n */\nexport function useVisible(ref: RefObject<Element>, options?: Options) {\n const [isVisible, setVisible] = useState(false);\n const enabled = options?.enabled ?? true;\n\n useEffect(() => {\n const element = ref.current;\n\n if (!element) {\n return;\n }\n\n if (enabled) {\n observe(element, (entry) => {\n setVisible(entry.isIntersecting);\n });\n } else {\n unobserve(element);\n }\n\n return () => {\n unobserve(element);\n };\n }, [enabled]); // eslint-disable-line react-hooks/exhaustive-deps\n\n return isVisible;\n}\n\nexport function useVisibleCallback<T extends (...args: any[]) => void>(\n ref: RefObject<Element>,\n callback: T,\n options?: Options\n) {\n const enabled = options?.enabled ?? true;\n const latestCallback = useLatest(callback);\n\n useEffect(() => {\n const element = ref.current;\n\n if (!element) {\n return;\n }\n\n if (enabled) {\n observe(element, (entry) => {\n if (entry.isIntersecting) {\n latestCallback.current();\n }\n });\n } else {\n unobserve(element);\n }\n\n return () => {\n unobserve(element);\n };\n }, [enabled]); // eslint-disable-line react-hooks/exhaustive-deps\n}\n"],"names":["callback","useState","useEffect","useLatest"],"mappings":";;;;;AAUA,IAAI,oBAAA,CAAA;AACJ,MAAM,qBAAA,uBAA4B,OAGhC,EAAA,CAAA;AAEF,SAAS,OAAA,CACP,SACA,QACA,EAAA;AACA,EAAA,IAAI,CAAC,oBAAsB,EAAA;AACzB,IAAuB,oBAAA,GAAA,IAAI,oBAAqB,CAAA,CAAC,OAAY,KAAA;AAC3D,MAAA,KAAA,MAAW,SAAS,OAAS,EAAA;AAC3B,QAAA,MAAMA,SAAW,GAAA,qBAAA,CAAsB,GAAI,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEvD,QAAAA,YAAW,KAAK,CAAA,CAAA;AAAA,OAClB;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAEA,EAAsB,qBAAA,CAAA,GAAA,CAAI,SAAS,QAAQ,CAAA,CAAA;AAC3C,EAAA,oBAAA,CAAqB,QAAQ,OAAO,CAAA,CAAA;AACtC,CAAA;AAEA,SAAS,UAAU,OAAkB,EAAA;AACnC,EAAA,qBAAA,CAAsB,OAAO,OAAO,CAAA,CAAA;AACpC,EAAA,oBAAA,EAAsB,UAAU,OAAO,CAAA,CAAA;AACzC,CAAA;AAKgB,SAAA,UAAA,CAAW,KAAyB,OAAmB,EAAA;AACrE,EAAA,MAAM,CAAC,SAAA,EAAW,UAAU,CAAA,GAAIC,eAAS,KAAK,CAAA,CAAA;AAC9C,EAAM,MAAA,OAAA,GAAU,SAAS,OAAW,IAAA,IAAA,CAAA;AAEpC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAU,GAAI,CAAA,OAAA,CAAA;AAEpB,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAI,OAAS,EAAA;AACX,MAAQ,OAAA,CAAA,OAAA,EAAS,CAAC,KAAU,KAAA;AAC1B,QAAA,UAAA,CAAW,MAAM,cAAc,CAAA,CAAA;AAAA,OAChC,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAA,SAAA,CAAU,OAAO,CAAA,CAAA;AAAA,KACnB;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,OAAO,CAAA,CAAA;AAAA,KACnB,CAAA;AAAA,GACF,EAAG,CAAC,OAAO,CAAC,CAAA,CAAA;AAEZ,EAAO,OAAA,SAAA,CAAA;AACT,CAAA;AAEgB,SAAA,kBAAA,CACd,GACA,EAAA,QAAA,EACA,OACA,EAAA;AACA,EAAM,MAAA,OAAA,GAAU,SAAS,OAAW,IAAA,IAAA,CAAA;AACpC,EAAM,MAAA,cAAA,GAAiBC,oBAAU,QAAQ,CAAA,CAAA;AAEzC,EAAAD,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAU,GAAI,CAAA,OAAA,CAAA;AAEpB,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAI,OAAS,EAAA;AACX,MAAQ,OAAA,CAAA,OAAA,EAAS,CAAC,KAAU,KAAA;AAC1B,QAAA,IAAI,MAAM,cAAgB,EAAA;AACxB,UAAA,cAAA,CAAe,OAAQ,EAAA,CAAA;AAAA,SACzB;AAAA,OACD,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAA,SAAA,CAAU,OAAO,CAAA,CAAA;AAAA,KACnB;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,OAAO,CAAA,CAAA;AAAA,KACnB,CAAA;AAAA,GACF,EAAG,CAAC,OAAO,CAAC,CAAA,CAAA;AACd;;;;;"}
1
+ {"version":3,"file":"use-visible.cjs","sources":["../../src/utils/use-visible.ts"],"sourcesContent":["import { type RefObject, useEffect, useState } from \"react\";\n\nimport { useLatest } from \"./use-latest\";\n\ninterface ObserveOptions {\n rootMargin?: string | number;\n root?: RefObject<Element>;\n}\n\ninterface Options extends ObserveOptions {\n enabled?: boolean;\n}\n\ntype IntersectionObserverSingleCallback = (\n entry: IntersectionObserverEntry\n) => void;\n\nlet optionlessIntersectionObserver: IntersectionObserver | undefined;\nconst optionlessIntersectionCallbacks = new WeakMap<\n Element,\n IntersectionObserverSingleCallback\n>();\n\nconst individualIntersectionObservers = new WeakMap<\n Element,\n IntersectionObserver\n>();\n\nfunction observe(\n element: Element,\n callback: IntersectionObserverSingleCallback,\n options?: ObserveOptions\n) {\n // Observers without options share a common IntersectionObserver instance, ones with options have their own\n if (!options) {\n if (!optionlessIntersectionObserver) {\n optionlessIntersectionObserver = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const callback = optionlessIntersectionCallbacks.get(entry.target);\n\n callback?.(entry);\n }\n });\n }\n\n optionlessIntersectionCallbacks.set(element, callback);\n optionlessIntersectionObserver.observe(element);\n } else {\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n callback?.(entry);\n }\n },\n {\n root: options.root?.current,\n rootMargin:\n typeof options.rootMargin === \"number\"\n ? `${options.rootMargin}px`\n : options.rootMargin,\n }\n );\n\n individualIntersectionObservers.set(element, observer);\n observer.observe(element);\n }\n}\n\nfunction unobserve(element: Element, options?: ObserveOptions) {\n if (!options) {\n optionlessIntersectionCallbacks.delete(element);\n optionlessIntersectionObserver?.unobserve(element);\n } else {\n const observer = individualIntersectionObservers.get(element);\n\n observer?.unobserve(element);\n individualIntersectionObservers.delete(element);\n }\n}\n\n/**\n * Observe when an element enters or exits the viewport.\n *\n * If you only need to get a stateful visibility value, use the higher level hook `useVisible` instead.\n */\nexport function useIntersectionCallback(\n ref: RefObject<Element>,\n callback: (isIntersecting: boolean, entry: IntersectionObserverEntry) => void,\n options?: Options\n) {\n const enabled = options?.enabled ?? true;\n const latestCallback = useLatest(callback);\n const { root, rootMargin } = options ?? {};\n\n useEffect(() => {\n const element = ref.current;\n\n if (!element) {\n return;\n }\n\n const observeOptions: ObserveOptions = {\n root,\n rootMargin,\n };\n\n if (enabled) {\n observe(\n element,\n (entry) => {\n // The intersection observer entry might be useful in some cases but the main information\n // is whether the element is intersecting or not so we pass that as the first argument.\n latestCallback.current(entry.isIntersecting, entry);\n },\n observeOptions\n );\n } else {\n unobserve(element, observeOptions);\n }\n\n return () => {\n unobserve(element, observeOptions);\n };\n }, [ref, enabled, latestCallback, root, rootMargin]);\n}\n\n/**\n * Observe whether an element is currently visible or not.\n */\nexport function useVisible(ref: RefObject<Element>, options?: Options) {\n const [isVisible, setVisible] = useState(false);\n\n useIntersectionCallback(\n ref,\n (isIntersecting) => setVisible(isIntersecting),\n options\n );\n\n return isVisible;\n}\n"],"names":["callback","useLatest","useEffect","useState"],"mappings":"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"}
@@ -1,67 +1,85 @@
1
- import { useState, useEffect } from 'react';
1
+ import { useEffect, useState } from 'react';
2
2
  import { useLatest } from './use-latest.js';
3
3
 
4
- let intersectionObserver;
5
- const intersectionCallbacks = /* @__PURE__ */ new WeakMap();
6
- function observe(element, callback) {
7
- if (!intersectionObserver) {
8
- intersectionObserver = new IntersectionObserver((entries) => {
9
- for (const entry of entries) {
10
- const callback2 = intersectionCallbacks.get(entry.target);
11
- callback2?.(entry);
4
+ let optionlessIntersectionObserver;
5
+ const optionlessIntersectionCallbacks = /* @__PURE__ */ new WeakMap();
6
+ const individualIntersectionObservers = /* @__PURE__ */ new WeakMap();
7
+ function observe(element, callback, options) {
8
+ if (!options) {
9
+ if (!optionlessIntersectionObserver) {
10
+ optionlessIntersectionObserver = new IntersectionObserver((entries) => {
11
+ for (const entry of entries) {
12
+ const callback2 = optionlessIntersectionCallbacks.get(entry.target);
13
+ callback2?.(entry);
14
+ }
15
+ });
16
+ }
17
+ optionlessIntersectionCallbacks.set(element, callback);
18
+ optionlessIntersectionObserver.observe(element);
19
+ } else {
20
+ const observer = new IntersectionObserver(
21
+ (entries) => {
22
+ for (const entry of entries) {
23
+ callback?.(entry);
24
+ }
25
+ },
26
+ {
27
+ root: options.root?.current,
28
+ rootMargin: typeof options.rootMargin === "number" ? `${options.rootMargin}px` : options.rootMargin
12
29
  }
13
- });
30
+ );
31
+ individualIntersectionObservers.set(element, observer);
32
+ observer.observe(element);
14
33
  }
15
- intersectionCallbacks.set(element, callback);
16
- intersectionObserver.observe(element);
17
34
  }
18
- function unobserve(element) {
19
- intersectionCallbacks.delete(element);
20
- intersectionObserver?.unobserve(element);
21
- }
22
- function useVisible(ref, options) {
23
- const [isVisible, setVisible] = useState(false);
24
- const enabled = options?.enabled ?? true;
25
- useEffect(() => {
26
- const element = ref.current;
27
- if (!element) {
28
- return;
29
- }
30
- if (enabled) {
31
- observe(element, (entry) => {
32
- setVisible(entry.isIntersecting);
33
- });
34
- } else {
35
- unobserve(element);
36
- }
37
- return () => {
38
- unobserve(element);
39
- };
40
- }, [enabled]);
41
- return isVisible;
35
+ function unobserve(element, options) {
36
+ if (!options) {
37
+ optionlessIntersectionCallbacks.delete(element);
38
+ optionlessIntersectionObserver?.unobserve(element);
39
+ } else {
40
+ const observer = individualIntersectionObservers.get(element);
41
+ observer?.unobserve(element);
42
+ individualIntersectionObservers.delete(element);
43
+ }
42
44
  }
43
- function useVisibleCallback(ref, callback, options) {
45
+ function useIntersectionCallback(ref, callback, options) {
44
46
  const enabled = options?.enabled ?? true;
45
47
  const latestCallback = useLatest(callback);
48
+ const { root, rootMargin } = options ?? {};
46
49
  useEffect(() => {
47
50
  const element = ref.current;
48
51
  if (!element) {
49
52
  return;
50
53
  }
54
+ const observeOptions = {
55
+ root,
56
+ rootMargin
57
+ };
51
58
  if (enabled) {
52
- observe(element, (entry) => {
53
- if (entry.isIntersecting) {
54
- latestCallback.current();
55
- }
56
- });
59
+ observe(
60
+ element,
61
+ (entry) => {
62
+ latestCallback.current(entry.isIntersecting, entry);
63
+ },
64
+ observeOptions
65
+ );
57
66
  } else {
58
- unobserve(element);
67
+ unobserve(element, observeOptions);
59
68
  }
60
69
  return () => {
61
- unobserve(element);
70
+ unobserve(element, observeOptions);
62
71
  };
63
- }, [enabled]);
72
+ }, [ref, enabled, latestCallback, root, rootMargin]);
73
+ }
74
+ function useVisible(ref, options) {
75
+ const [isVisible, setVisible] = useState(false);
76
+ useIntersectionCallback(
77
+ ref,
78
+ (isIntersecting) => setVisible(isIntersecting),
79
+ options
80
+ );
81
+ return isVisible;
64
82
  }
65
83
 
66
- export { useVisible, useVisibleCallback };
84
+ export { useIntersectionCallback, useVisible };
67
85
  //# sourceMappingURL=use-visible.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-visible.js","sources":["../../src/utils/use-visible.ts"],"sourcesContent":["import { type RefObject, useEffect, useState } from \"react\";\n\nimport { useLatest } from \"./use-latest\";\n\ntype Options = { enabled?: boolean };\n\ntype IntersectionObserverSingleCallback = (\n entry: IntersectionObserverEntry\n) => void;\n\nlet intersectionObserver: IntersectionObserver | undefined;\nconst intersectionCallbacks = new WeakMap<\n Element,\n IntersectionObserverSingleCallback\n>();\n\nfunction observe(\n element: Element,\n callback: IntersectionObserverSingleCallback\n) {\n if (!intersectionObserver) {\n intersectionObserver = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const callback = intersectionCallbacks.get(entry.target);\n\n callback?.(entry);\n }\n });\n }\n\n intersectionCallbacks.set(element, callback);\n intersectionObserver.observe(element);\n}\n\nfunction unobserve(element: Element) {\n intersectionCallbacks.delete(element);\n intersectionObserver?.unobserve(element);\n}\n\n/**\n * Observe whether an element is currently visible or not.\n */\nexport function useVisible(ref: RefObject<Element>, options?: Options) {\n const [isVisible, setVisible] = useState(false);\n const enabled = options?.enabled ?? true;\n\n useEffect(() => {\n const element = ref.current;\n\n if (!element) {\n return;\n }\n\n if (enabled) {\n observe(element, (entry) => {\n setVisible(entry.isIntersecting);\n });\n } else {\n unobserve(element);\n }\n\n return () => {\n unobserve(element);\n };\n }, [enabled]); // eslint-disable-line react-hooks/exhaustive-deps\n\n return isVisible;\n}\n\nexport function useVisibleCallback<T extends (...args: any[]) => void>(\n ref: RefObject<Element>,\n callback: T,\n options?: Options\n) {\n const enabled = options?.enabled ?? true;\n const latestCallback = useLatest(callback);\n\n useEffect(() => {\n const element = ref.current;\n\n if (!element) {\n return;\n }\n\n if (enabled) {\n observe(element, (entry) => {\n if (entry.isIntersecting) {\n latestCallback.current();\n }\n });\n } else {\n unobserve(element);\n }\n\n return () => {\n unobserve(element);\n };\n }, [enabled]); // eslint-disable-line react-hooks/exhaustive-deps\n}\n"],"names":["callback"],"mappings":";;;AAUA,IAAI,oBAAA,CAAA;AACJ,MAAM,qBAAA,uBAA4B,OAGhC,EAAA,CAAA;AAEF,SAAS,OAAA,CACP,SACA,QACA,EAAA;AACA,EAAA,IAAI,CAAC,oBAAsB,EAAA;AACzB,IAAuB,oBAAA,GAAA,IAAI,oBAAqB,CAAA,CAAC,OAAY,KAAA;AAC3D,MAAA,KAAA,MAAW,SAAS,OAAS,EAAA;AAC3B,QAAA,MAAMA,SAAW,GAAA,qBAAA,CAAsB,GAAI,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEvD,QAAAA,YAAW,KAAK,CAAA,CAAA;AAAA,OAClB;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAEA,EAAsB,qBAAA,CAAA,GAAA,CAAI,SAAS,QAAQ,CAAA,CAAA;AAC3C,EAAA,oBAAA,CAAqB,QAAQ,OAAO,CAAA,CAAA;AACtC,CAAA;AAEA,SAAS,UAAU,OAAkB,EAAA;AACnC,EAAA,qBAAA,CAAsB,OAAO,OAAO,CAAA,CAAA;AACpC,EAAA,oBAAA,EAAsB,UAAU,OAAO,CAAA,CAAA;AACzC,CAAA;AAKgB,SAAA,UAAA,CAAW,KAAyB,OAAmB,EAAA;AACrE,EAAA,MAAM,CAAC,SAAA,EAAW,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAC9C,EAAM,MAAA,OAAA,GAAU,SAAS,OAAW,IAAA,IAAA,CAAA;AAEpC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAU,GAAI,CAAA,OAAA,CAAA;AAEpB,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAI,OAAS,EAAA;AACX,MAAQ,OAAA,CAAA,OAAA,EAAS,CAAC,KAAU,KAAA;AAC1B,QAAA,UAAA,CAAW,MAAM,cAAc,CAAA,CAAA;AAAA,OAChC,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAA,SAAA,CAAU,OAAO,CAAA,CAAA;AAAA,KACnB;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,OAAO,CAAA,CAAA;AAAA,KACnB,CAAA;AAAA,GACF,EAAG,CAAC,OAAO,CAAC,CAAA,CAAA;AAEZ,EAAO,OAAA,SAAA,CAAA;AACT,CAAA;AAEgB,SAAA,kBAAA,CACd,GACA,EAAA,QAAA,EACA,OACA,EAAA;AACA,EAAM,MAAA,OAAA,GAAU,SAAS,OAAW,IAAA,IAAA,CAAA;AACpC,EAAM,MAAA,cAAA,GAAiB,UAAU,QAAQ,CAAA,CAAA;AAEzC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAU,GAAI,CAAA,OAAA,CAAA;AAEpB,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAI,OAAS,EAAA;AACX,MAAQ,OAAA,CAAA,OAAA,EAAS,CAAC,KAAU,KAAA;AAC1B,QAAA,IAAI,MAAM,cAAgB,EAAA;AACxB,UAAA,cAAA,CAAe,OAAQ,EAAA,CAAA;AAAA,SACzB;AAAA,OACD,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAA,SAAA,CAAU,OAAO,CAAA,CAAA;AAAA,KACnB;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,OAAO,CAAA,CAAA;AAAA,KACnB,CAAA;AAAA,GACF,EAAG,CAAC,OAAO,CAAC,CAAA,CAAA;AACd;;;;"}
1
+ {"version":3,"file":"use-visible.js","sources":["../../src/utils/use-visible.ts"],"sourcesContent":["import { type RefObject, useEffect, useState } from \"react\";\n\nimport { useLatest } from \"./use-latest\";\n\ninterface ObserveOptions {\n rootMargin?: string | number;\n root?: RefObject<Element>;\n}\n\ninterface Options extends ObserveOptions {\n enabled?: boolean;\n}\n\ntype IntersectionObserverSingleCallback = (\n entry: IntersectionObserverEntry\n) => void;\n\nlet optionlessIntersectionObserver: IntersectionObserver | undefined;\nconst optionlessIntersectionCallbacks = new WeakMap<\n Element,\n IntersectionObserverSingleCallback\n>();\n\nconst individualIntersectionObservers = new WeakMap<\n Element,\n IntersectionObserver\n>();\n\nfunction observe(\n element: Element,\n callback: IntersectionObserverSingleCallback,\n options?: ObserveOptions\n) {\n // Observers without options share a common IntersectionObserver instance, ones with options have their own\n if (!options) {\n if (!optionlessIntersectionObserver) {\n optionlessIntersectionObserver = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const callback = optionlessIntersectionCallbacks.get(entry.target);\n\n callback?.(entry);\n }\n });\n }\n\n optionlessIntersectionCallbacks.set(element, callback);\n optionlessIntersectionObserver.observe(element);\n } else {\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n callback?.(entry);\n }\n },\n {\n root: options.root?.current,\n rootMargin:\n typeof options.rootMargin === \"number\"\n ? `${options.rootMargin}px`\n : options.rootMargin,\n }\n );\n\n individualIntersectionObservers.set(element, observer);\n observer.observe(element);\n }\n}\n\nfunction unobserve(element: Element, options?: ObserveOptions) {\n if (!options) {\n optionlessIntersectionCallbacks.delete(element);\n optionlessIntersectionObserver?.unobserve(element);\n } else {\n const observer = individualIntersectionObservers.get(element);\n\n observer?.unobserve(element);\n individualIntersectionObservers.delete(element);\n }\n}\n\n/**\n * Observe when an element enters or exits the viewport.\n *\n * If you only need to get a stateful visibility value, use the higher level hook `useVisible` instead.\n */\nexport function useIntersectionCallback(\n ref: RefObject<Element>,\n callback: (isIntersecting: boolean, entry: IntersectionObserverEntry) => void,\n options?: Options\n) {\n const enabled = options?.enabled ?? true;\n const latestCallback = useLatest(callback);\n const { root, rootMargin } = options ?? {};\n\n useEffect(() => {\n const element = ref.current;\n\n if (!element) {\n return;\n }\n\n const observeOptions: ObserveOptions = {\n root,\n rootMargin,\n };\n\n if (enabled) {\n observe(\n element,\n (entry) => {\n // The intersection observer entry might be useful in some cases but the main information\n // is whether the element is intersecting or not so we pass that as the first argument.\n latestCallback.current(entry.isIntersecting, entry);\n },\n observeOptions\n );\n } else {\n unobserve(element, observeOptions);\n }\n\n return () => {\n unobserve(element, observeOptions);\n };\n }, [ref, enabled, latestCallback, root, rootMargin]);\n}\n\n/**\n * Observe whether an element is currently visible or not.\n */\nexport function useVisible(ref: RefObject<Element>, options?: Options) {\n const [isVisible, setVisible] = useState(false);\n\n useIntersectionCallback(\n ref,\n (isIntersecting) => setVisible(isIntersecting),\n options\n );\n\n return isVisible;\n}\n"],"names":["callback"],"mappings":"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"}
package/dist/version.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const PKG_NAME = "@liveblocks/react-ui";
4
- const PKG_VERSION = typeof "2.25.0-aiprivatebeta7" === "string" && "2.25.0-aiprivatebeta7";
4
+ const PKG_VERSION = typeof "2.25.0-aiprivatebeta9" === "string" && "2.25.0-aiprivatebeta9";
5
5
  const PKG_FORMAT = typeof "cjs" === "string" && "cjs";
6
6
 
7
7
  exports.PKG_FORMAT = PKG_FORMAT;
package/dist/version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const PKG_NAME = "@liveblocks/react-ui";
2
- const PKG_VERSION = typeof "2.25.0-aiprivatebeta7" === "string" && "2.25.0-aiprivatebeta7";
2
+ const PKG_VERSION = typeof "2.25.0-aiprivatebeta9" === "string" && "2.25.0-aiprivatebeta9";
3
3
  const PKG_FORMAT = typeof "esm" === "string" && "esm";
4
4
 
5
5
  export { PKG_FORMAT, PKG_NAME, PKG_VERSION };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liveblocks/react-ui",
3
- "version": "2.25.0-aiprivatebeta7",
3
+ "version": "2.25.0-aiprivatebeta9",
4
4
  "description": "A set of React pre-built components for the Liveblocks products. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -76,15 +76,15 @@
76
76
  },
77
77
  "dependencies": {
78
78
  "@floating-ui/react-dom": "^2.1.2",
79
- "@liveblocks/client": "2.25.0-aiprivatebeta7",
80
- "@liveblocks/core": "2.25.0-aiprivatebeta7",
81
- "@liveblocks/react": "2.25.0-aiprivatebeta7",
79
+ "@liveblocks/client": "2.25.0-aiprivatebeta9",
80
+ "@liveblocks/core": "2.25.0-aiprivatebeta9",
81
+ "@liveblocks/react": "2.25.0-aiprivatebeta9",
82
82
  "@radix-ui/react-dropdown-menu": "^2.1.2",
83
83
  "@radix-ui/react-popover": "^1.1.2",
84
84
  "@radix-ui/react-slot": "^1.1.0",
85
85
  "@radix-ui/react-toggle": "^1.1.0",
86
86
  "@radix-ui/react-tooltip": "^1.1.3",
87
- "frimousse": "^0.1.0",
87
+ "frimousse": "^0.2.0",
88
88
  "marked": "^15.0.11",
89
89
  "slate": "^0.110.2",
90
90
  "slate-history": "^0.110.3",
@@ -10,7 +10,7 @@ $lb-elevation-shadow:
10
10
  0 0 0 1px rgb(0 0 0 / 4%),
11
11
  0 2px 6px rgb(0 0 0 / 8%),
12
12
  0 8px 26px rgb(0 0 0 / 12%);
13
- $lb-elevation-shadow-small:
13
+ $lb-elevation-shadow-moderate:
14
14
  0 0 0 1px rgb(0 0 0 / 4%),
15
15
  0 2px 6px rgb(0 0 0 / 6%),
16
16
  0 8px 26px rgb(0 0 0 / 8%);
@@ -18,14 +18,18 @@
18
18
  --lb-inset-shadow: inset 0 0 0 1px rgb(255 255 255 / 6%);
19
19
  --lb-highlight-shadow: inset 0 0 0 1px rgb(255 255 255 / 12%);
20
20
  --lb-elevation-shadow: $lb-elevation-shadow;
21
- --lb-elevation-shadow-small: $lb-elevation-shadow-small;
21
+ --lb-elevation-shadow-moderate: $lb-elevation-shadow-moderate;
22
22
  --lb-tooltip-shadow: $lb-tooltip-shadow;
23
23
 
24
24
  color-scheme: dark;
25
25
 
26
- &.lb-elevation,
27
- &.lb-tooltip {
26
+ &:where(.lb-elevation, .lb-tooltip) {
28
27
  --lb-background: #333;
29
28
  --lb-foreground-contrast: 10%;
30
29
  }
30
+
31
+ &:where(.lb-elevation-moderate) {
32
+ --lb-background: #2a2a2a;
33
+ --lb-foreground-contrast: 10%;
34
+ }
31
35
  }