@liveblocks/react-ui 3.18.0-rc1 → 3.18.0

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 (55) hide show
  1. package/dist/_private/index.cjs +3 -2
  2. package/dist/_private/index.cjs.map +1 -1
  3. package/dist/_private/index.d.cts +24 -18
  4. package/dist/_private/index.d.ts +24 -18
  5. package/dist/_private/index.js +1 -1
  6. package/dist/components/Avatar.cjs +142 -0
  7. package/dist/components/Avatar.cjs.map +1 -0
  8. package/dist/components/Avatar.js +138 -0
  9. package/dist/components/Avatar.js.map +1 -0
  10. package/dist/components/AvatarStack.cjs +58 -44
  11. package/dist/components/AvatarStack.cjs.map +1 -1
  12. package/dist/components/AvatarStack.js +58 -44
  13. package/dist/components/AvatarStack.js.map +1 -1
  14. package/dist/components/Comment.cjs +3 -3
  15. package/dist/components/Comment.cjs.map +1 -1
  16. package/dist/components/Comment.js +3 -3
  17. package/dist/components/Comment.js.map +1 -1
  18. package/dist/components/CommentPin.cjs +2 -2
  19. package/dist/components/CommentPin.cjs.map +1 -1
  20. package/dist/components/CommentPin.js +2 -2
  21. package/dist/components/CommentPin.js.map +1 -1
  22. package/dist/components/Composer.cjs +3 -3
  23. package/dist/components/Composer.cjs.map +1 -1
  24. package/dist/components/Composer.js +3 -3
  25. package/dist/components/Composer.js.map +1 -1
  26. package/dist/components/InboxNotification.cjs +2 -2
  27. package/dist/components/InboxNotification.cjs.map +1 -1
  28. package/dist/components/InboxNotification.js +2 -2
  29. package/dist/components/InboxNotification.js.map +1 -1
  30. package/dist/components/internal/User.cjs +24 -10
  31. package/dist/components/internal/User.cjs.map +1 -1
  32. package/dist/components/internal/User.js +25 -11
  33. package/dist/components/internal/User.js.map +1 -1
  34. package/dist/index.cjs +2 -0
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.cts +33 -1
  37. package/dist/index.d.ts +33 -1
  38. package/dist/index.js +1 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/version.cjs +1 -1
  41. package/dist/version.cjs.map +1 -1
  42. package/dist/version.js +1 -1
  43. package/dist/version.js.map +1 -1
  44. package/package.json +4 -4
  45. package/src/styles/index.css +21 -0
  46. package/styles.css +1 -1
  47. package/styles.css.map +1 -1
  48. package/dist/components/internal/Avatar.cjs +0 -63
  49. package/dist/components/internal/Avatar.cjs.map +0 -1
  50. package/dist/components/internal/Avatar.js +0 -61
  51. package/dist/components/internal/Avatar.js.map +0 -1
  52. package/dist/utils/use-user-or-group-info.cjs +0 -49
  53. package/dist/utils/use-user-or-group-info.cjs.map +0 -1
  54. package/dist/utils/use-user-or-group-info.js +0 -46
  55. package/dist/utils/use-user-or-group-info.js.map +0 -1
@@ -1,61 +0,0 @@
1
- "use client";
2
- import { jsx } from 'react/jsx-runtime';
3
- import { useMemo } from 'react';
4
- import { cn } from '../../utils/cn.js';
5
- import { getInitials } from '../../utils/get-initials.js';
6
- import { useUserOrGroupInfo } from '../../utils/use-user-or-group-info.js';
7
-
8
-
9
- function AvatarLayout({
10
- src,
11
- name,
12
- fallback,
13
- isLoading,
14
- className,
15
- ...props
16
- }) {
17
- const nameInitials = useMemo(
18
- () => name ? getInitials(name) : void 0,
19
- [name]
20
- );
21
- const fallbackInitials = useMemo(
22
- () => !isLoading && fallback && !name ? getInitials(fallback) : void 0,
23
- [isLoading, fallback, name]
24
- );
25
- return /* @__PURE__ */ jsx(
26
- "div",
27
- {
28
- className: cn("lb-avatar", className),
29
- "data-loading": isLoading ? "" : void 0,
30
- ...props,
31
- children: src ? /* @__PURE__ */ jsx("img", { className: "lb-avatar-image", src, alt: name }) : nameInitials ? /* @__PURE__ */ jsx("span", { className: "lb-avatar-fallback", "aria-hidden": true, children: nameInitials }) : fallbackInitials ? /* @__PURE__ */ jsx(
32
- "span",
33
- {
34
- className: "lb-avatar-fallback",
35
- "aria-label": fallback,
36
- title: fallback,
37
- children: fallbackInitials
38
- }
39
- ) : null
40
- }
41
- );
42
- }
43
- function Avatar({ userId, groupId, icon, ...props }) {
44
- const { info, isLoading } = useUserOrGroupInfo(
45
- userId ? "user" : "group",
46
- userId ?? groupId
47
- );
48
- return icon && (isLoading || !info?.avatar) ? /* @__PURE__ */ jsx("div", { ...props, children: icon }) : /* @__PURE__ */ jsx(
49
- AvatarLayout,
50
- {
51
- src: info?.avatar,
52
- name: info?.name,
53
- fallback: userId ?? groupId,
54
- isLoading,
55
- ...props
56
- }
57
- );
58
- }
59
-
60
- export { Avatar };
61
- //# sourceMappingURL=Avatar.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Avatar.js","sources":["../../../src/components/internal/Avatar.tsx"],"sourcesContent":["\"use client\";\n\nimport type { Relax } from \"@liveblocks/core\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { getInitials } from \"../../utils/get-initials\";\nimport { useUserOrGroupInfo } from \"../../utils/use-user-or-group-info\";\n\ninterface AvatarLayoutProps extends ComponentProps<\"div\"> {\n src?: string;\n name?: string;\n fallback?: string;\n isLoading: boolean;\n}\n\nexport type AvatarProps = ComponentProps<\"div\"> & {\n icon?: ReactNode;\n} & Relax<\n | {\n /**\n * The user ID to display the avatar for.\n */\n userId: string;\n }\n | {\n /**\n * The group ID to display the avatar for.\n */\n groupId: string;\n }\n >;\n\nfunction AvatarLayout({\n src,\n name,\n fallback,\n isLoading,\n className,\n ...props\n}: AvatarLayoutProps) {\n const nameInitials = useMemo(\n () => (name ? getInitials(name) : undefined),\n [name]\n );\n const fallbackInitials = useMemo(\n () => (!isLoading && fallback && !name ? getInitials(fallback) : undefined),\n [isLoading, fallback, name]\n );\n\n return (\n <div\n className={cn(\"lb-avatar\", className)}\n data-loading={isLoading ? \"\" : undefined}\n {...props}\n >\n {src ? (\n <img className=\"lb-avatar-image\" src={src} alt={name} />\n ) : nameInitials ? (\n <span className=\"lb-avatar-fallback\" aria-hidden>\n {nameInitials}\n </span>\n ) : fallbackInitials ? (\n <span\n className=\"lb-avatar-fallback\"\n aria-label={fallback}\n title={fallback}\n >\n {fallbackInitials}\n </span>\n ) : null}\n </div>\n );\n}\n\nexport function Avatar({ userId, groupId, icon, ...props }: AvatarProps) {\n const { info, isLoading } = useUserOrGroupInfo(\n userId ? \"user\" : \"group\",\n userId ?? groupId\n );\n\n return icon && (isLoading || !info?.avatar) ? (\n <div {...props}>{icon}</div>\n ) : (\n <AvatarLayout\n src={info?.avatar}\n name={info?.name}\n fallback={userId ?? groupId}\n isLoading={isLoading}\n {...props}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAkCA;AAAsB;AACpB;AACA;AACA;AACA;AACA;AAEF;AACE;AAAqB;AACe;AAC7B;AAEP;AAAyB;AAC0C;AACvC;AAG5B;AACE;AAAC;AAAA;AACqC;AACL;AAC3B;AASF;AAAC;AAAA;AACW;AACE;AACL;AAEN;AAAA;AAED;AAAA;AAGV;AAEO;AACL;AAA4B;AACR;AACR;AAGZ;AAGE;AAAC;AAAA;AACY;AACC;AACQ;AACpB;AACI;AAAA;AAGV;;"}
@@ -1,49 +0,0 @@
1
- 'use strict';
2
-
3
- var core = require('@liveblocks/core');
4
- var react = require('@liveblocks/react');
5
- var suspense = require('@liveblocks/react/suspense');
6
- var useInitial = require('./use-initial.cjs');
7
-
8
- function useUserOrGroupInfo(kind, id) {
9
- const frozenKind = useInitial.useInitial(kind);
10
- if (frozenKind === "user") {
11
- const { user, isLoading, error } = react.useUser(id);
12
- return {
13
- info: user,
14
- isLoading,
15
- error
16
- };
17
- } else if (frozenKind === "group") {
18
- const { info, isLoading, error } = react.useGroupInfo(id);
19
- return {
20
- info,
21
- isLoading,
22
- error
23
- };
24
- }
25
- return core.assertNever(frozenKind, "Invalid kind");
26
- }
27
- function useUserOrGroupInfoSuspense(kind, id) {
28
- const frozenKind = useInitial.useInitial(kind);
29
- if (frozenKind === "user") {
30
- const { user, isLoading, error } = suspense.useUser(id);
31
- return {
32
- info: user,
33
- isLoading,
34
- error
35
- };
36
- } else if (frozenKind === "group") {
37
- const { info, isLoading, error } = suspense.useGroupInfo(id);
38
- return {
39
- info,
40
- isLoading,
41
- error
42
- };
43
- }
44
- return core.assertNever(frozenKind, "Invalid kind");
45
- }
46
-
47
- exports.useUserOrGroupInfo = useUserOrGroupInfo;
48
- exports.useUserOrGroupInfoSuspense = useUserOrGroupInfoSuspense;
49
- //# sourceMappingURL=use-user-or-group-info.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-user-or-group-info.cjs","sources":["../../src/utils/use-user-or-group-info.ts"],"sourcesContent":["import {\n assertNever,\n type AsyncResult,\n type AsyncSuccess,\n type BaseGroupInfo,\n type BaseUserMeta,\n} from \"@liveblocks/core\";\nimport { useGroupInfo, useUser } from \"@liveblocks/react\";\nimport {\n useGroupInfo as useGroupInfoSuspense,\n useUser as useUserSuspense,\n} from \"@liveblocks/react/suspense\";\n\nimport { useInitial } from \"./use-initial\";\n\ntype UserOrGroupInfoResult = AsyncResult<\n BaseUserMeta[\"info\"] | BaseGroupInfo,\n \"info\"\n>;\n\ntype UserOrGroupInfoSuccess = AsyncSuccess<\n BaseUserMeta[\"info\"] | BaseGroupInfo,\n \"info\"\n>;\n\nexport function useUserOrGroupInfo(\n kind: \"user\" | \"group\",\n id: string\n): UserOrGroupInfoResult {\n // Switching between user IDs and group IDs is not supported\n // to support the Rules of Hooks.\n const frozenKind = useInitial(kind);\n\n if (frozenKind === \"user\") {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const { user, isLoading, error } = useUser(id);\n\n return {\n info: user,\n isLoading,\n error,\n } as UserOrGroupInfoResult;\n } else if (frozenKind === \"group\") {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const { info, isLoading, error } = useGroupInfo(id);\n\n return {\n info,\n isLoading,\n error,\n } as UserOrGroupInfoResult;\n }\n\n return assertNever(frozenKind, \"Invalid kind\");\n}\n\nexport function useUserOrGroupInfoSuspense(\n kind: \"user\" | \"group\",\n id: string\n): UserOrGroupInfoSuccess {\n // Switching between user IDs and group IDs is not supported\n // to support the Rules of Hooks.\n const frozenKind = useInitial(kind);\n\n if (frozenKind === \"user\") {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const { user, isLoading, error } = useUserSuspense(id);\n\n return {\n info: user,\n isLoading,\n error,\n };\n } else if (frozenKind === \"group\") {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const { info, isLoading, error } = useGroupInfoSuspense(id);\n\n return {\n info,\n isLoading,\n error,\n };\n }\n\n return assertNever(frozenKind, \"Invalid kind\");\n}\n"],"names":["useInitial","useUser","useGroupInfo","assertNever","useUserSuspense","useGroupInfoSuspense"],"mappings":";;;;;;;AAyBgB,SAAA,kBAAA,CACd,MACA,EACuB,EAAA;AAGvB,EAAM,MAAA,UAAA,GAAaA,sBAAW,IAAI,CAAA,CAAA;AAElC,EAAA,IAAI,eAAe,MAAQ,EAAA;AAEzB,IAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,KAAM,EAAA,GAAIC,cAAQ,EAAE,CAAA,CAAA;AAE7C,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,IAAA;AAAA,MACN,SAAA;AAAA,MACA,KAAA;AAAA,KACF,CAAA;AAAA,GACF,MAAA,IAAW,eAAe,OAAS,EAAA;AAEjC,IAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,KAAM,EAAA,GAAIC,mBAAa,EAAE,CAAA,CAAA;AAElD,IAAO,OAAA;AAAA,MACL,IAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAO,OAAAC,gBAAA,CAAY,YAAY,cAAc,CAAA,CAAA;AAC/C,CAAA;AAEgB,SAAA,0BAAA,CACd,MACA,EACwB,EAAA;AAGxB,EAAM,MAAA,UAAA,GAAaH,sBAAW,IAAI,CAAA,CAAA;AAElC,EAAA,IAAI,eAAe,MAAQ,EAAA;AAEzB,IAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,KAAM,EAAA,GAAII,iBAAgB,EAAE,CAAA,CAAA;AAErD,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,IAAA;AAAA,MACN,SAAA;AAAA,MACA,KAAA;AAAA,KACF,CAAA;AAAA,GACF,MAAA,IAAW,eAAe,OAAS,EAAA;AAEjC,IAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,KAAM,EAAA,GAAIC,sBAAqB,EAAE,CAAA,CAAA;AAE1D,IAAO,OAAA;AAAA,MACL,IAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAO,OAAAF,gBAAA,CAAY,YAAY,cAAc,CAAA,CAAA;AAC/C;;;;;"}
@@ -1,46 +0,0 @@
1
- import { assertNever } from '@liveblocks/core';
2
- import { useUser, useGroupInfo } from '@liveblocks/react';
3
- import { useUser as useUser$1, useGroupInfo as useGroupInfo$1 } from '@liveblocks/react/suspense';
4
- import { useInitial } from './use-initial.js';
5
-
6
- function useUserOrGroupInfo(kind, id) {
7
- const frozenKind = useInitial(kind);
8
- if (frozenKind === "user") {
9
- const { user, isLoading, error } = useUser(id);
10
- return {
11
- info: user,
12
- isLoading,
13
- error
14
- };
15
- } else if (frozenKind === "group") {
16
- const { info, isLoading, error } = useGroupInfo(id);
17
- return {
18
- info,
19
- isLoading,
20
- error
21
- };
22
- }
23
- return assertNever(frozenKind, "Invalid kind");
24
- }
25
- function useUserOrGroupInfoSuspense(kind, id) {
26
- const frozenKind = useInitial(kind);
27
- if (frozenKind === "user") {
28
- const { user, isLoading, error } = useUser$1(id);
29
- return {
30
- info: user,
31
- isLoading,
32
- error
33
- };
34
- } else if (frozenKind === "group") {
35
- const { info, isLoading, error } = useGroupInfo$1(id);
36
- return {
37
- info,
38
- isLoading,
39
- error
40
- };
41
- }
42
- return assertNever(frozenKind, "Invalid kind");
43
- }
44
-
45
- export { useUserOrGroupInfo, useUserOrGroupInfoSuspense };
46
- //# sourceMappingURL=use-user-or-group-info.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-user-or-group-info.js","sources":["../../src/utils/use-user-or-group-info.ts"],"sourcesContent":["import {\n assertNever,\n type AsyncResult,\n type AsyncSuccess,\n type BaseGroupInfo,\n type BaseUserMeta,\n} from \"@liveblocks/core\";\nimport { useGroupInfo, useUser } from \"@liveblocks/react\";\nimport {\n useGroupInfo as useGroupInfoSuspense,\n useUser as useUserSuspense,\n} from \"@liveblocks/react/suspense\";\n\nimport { useInitial } from \"./use-initial\";\n\ntype UserOrGroupInfoResult = AsyncResult<\n BaseUserMeta[\"info\"] | BaseGroupInfo,\n \"info\"\n>;\n\ntype UserOrGroupInfoSuccess = AsyncSuccess<\n BaseUserMeta[\"info\"] | BaseGroupInfo,\n \"info\"\n>;\n\nexport function useUserOrGroupInfo(\n kind: \"user\" | \"group\",\n id: string\n): UserOrGroupInfoResult {\n // Switching between user IDs and group IDs is not supported\n // to support the Rules of Hooks.\n const frozenKind = useInitial(kind);\n\n if (frozenKind === \"user\") {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const { user, isLoading, error } = useUser(id);\n\n return {\n info: user,\n isLoading,\n error,\n } as UserOrGroupInfoResult;\n } else if (frozenKind === \"group\") {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const { info, isLoading, error } = useGroupInfo(id);\n\n return {\n info,\n isLoading,\n error,\n } as UserOrGroupInfoResult;\n }\n\n return assertNever(frozenKind, \"Invalid kind\");\n}\n\nexport function useUserOrGroupInfoSuspense(\n kind: \"user\" | \"group\",\n id: string\n): UserOrGroupInfoSuccess {\n // Switching between user IDs and group IDs is not supported\n // to support the Rules of Hooks.\n const frozenKind = useInitial(kind);\n\n if (frozenKind === \"user\") {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const { user, isLoading, error } = useUserSuspense(id);\n\n return {\n info: user,\n isLoading,\n error,\n };\n } else if (frozenKind === \"group\") {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const { info, isLoading, error } = useGroupInfoSuspense(id);\n\n return {\n info,\n isLoading,\n error,\n };\n }\n\n return assertNever(frozenKind, \"Invalid kind\");\n}\n"],"names":["useUserSuspense","useGroupInfoSuspense"],"mappings":";;;;;AAyBgB,SAAA,kBAAA,CACd,MACA,EACuB,EAAA;AAGvB,EAAM,MAAA,UAAA,GAAa,WAAW,IAAI,CAAA,CAAA;AAElC,EAAA,IAAI,eAAe,MAAQ,EAAA;AAEzB,IAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,KAAM,EAAA,GAAI,QAAQ,EAAE,CAAA,CAAA;AAE7C,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,IAAA;AAAA,MACN,SAAA;AAAA,MACA,KAAA;AAAA,KACF,CAAA;AAAA,GACF,MAAA,IAAW,eAAe,OAAS,EAAA;AAEjC,IAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,KAAM,EAAA,GAAI,aAAa,EAAE,CAAA,CAAA;AAElD,IAAO,OAAA;AAAA,MACL,IAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAO,OAAA,WAAA,CAAY,YAAY,cAAc,CAAA,CAAA;AAC/C,CAAA;AAEgB,SAAA,0BAAA,CACd,MACA,EACwB,EAAA;AAGxB,EAAM,MAAA,UAAA,GAAa,WAAW,IAAI,CAAA,CAAA;AAElC,EAAA,IAAI,eAAe,MAAQ,EAAA;AAEzB,IAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,KAAM,EAAA,GAAIA,UAAgB,EAAE,CAAA,CAAA;AAErD,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,IAAA;AAAA,MACN,SAAA;AAAA,MACA,KAAA;AAAA,KACF,CAAA;AAAA,GACF,MAAA,IAAW,eAAe,OAAS,EAAA;AAEjC,IAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,KAAM,EAAA,GAAIC,eAAqB,EAAE,CAAA,CAAA;AAE1D,IAAO,OAAA;AAAA,MACL,IAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAO,OAAA,WAAA,CAAY,YAAY,cAAc,CAAA,CAAA;AAC/C;;;;"}