@box/user-selector 1.21.23

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 (106) hide show
  1. package/LICENSE +379 -0
  2. package/README.md +47 -0
  3. package/dist/chunks/user-selector-headless.module.js +16 -0
  4. package/dist/esm/index.js +6 -0
  5. package/dist/esm/lib/messages.js +46 -0
  6. package/dist/esm/lib/shared.js +9 -0
  7. package/dist/esm/lib/user-selector-container.js +43 -0
  8. package/dist/esm/lib/user-selector-headless/components/user-avatar.js +32 -0
  9. package/dist/esm/lib/user-selector-headless/components/user-selector-content.js +51 -0
  10. package/dist/esm/lib/user-selector-headless/components/user-selector-default-empty.js +43 -0
  11. package/dist/esm/lib/user-selector-headless/components/user-selector-default-error.js +20 -0
  12. package/dist/esm/lib/user-selector-headless/components/user-selector-skeleton.js +27 -0
  13. package/dist/esm/lib/user-selector-headless/hooks/use-avatars.js +22 -0
  14. package/dist/esm/lib/user-selector-headless/hooks/use-keyboard-navigation.js +27 -0
  15. package/dist/esm/lib/user-selector-headless/hooks/use-select-options.js +28 -0
  16. package/dist/esm/lib/user-selector-headless/user-selector-context.js +11 -0
  17. package/dist/esm/lib/user-selector-headless/user-selector-headless.js +168 -0
  18. package/dist/esm/lib/user-selector-list-item.js +114 -0
  19. package/dist/esm/lib/user-selector.js +77 -0
  20. package/dist/esm/lib/utils/VariantsAggregator.js +46 -0
  21. package/dist/esm/lib/utils/defaultRenderCustomOption.js +12 -0
  22. package/dist/esm/lib/utils/getInitials.js +7 -0
  23. package/dist/esm/lib/utils/isUserContactType.js +6 -0
  24. package/dist/i18n/bn-IN.js +12 -0
  25. package/dist/i18n/bn-IN.properties +20 -0
  26. package/dist/i18n/da-DK.js +12 -0
  27. package/dist/i18n/da-DK.properties +20 -0
  28. package/dist/i18n/de-DE.js +12 -0
  29. package/dist/i18n/de-DE.properties +20 -0
  30. package/dist/i18n/en-AU.js +12 -0
  31. package/dist/i18n/en-AU.properties +20 -0
  32. package/dist/i18n/en-CA.js +12 -0
  33. package/dist/i18n/en-CA.properties +20 -0
  34. package/dist/i18n/en-GB.js +12 -0
  35. package/dist/i18n/en-GB.properties +20 -0
  36. package/dist/i18n/en-US.js +12 -0
  37. package/dist/i18n/en-US.properties +20 -0
  38. package/dist/i18n/en-x-pseudo.js +12 -0
  39. package/dist/i18n/en-x-pseudo.properties +20 -0
  40. package/dist/i18n/es-419.js +12 -0
  41. package/dist/i18n/es-419.properties +20 -0
  42. package/dist/i18n/es-ES.js +12 -0
  43. package/dist/i18n/es-ES.properties +20 -0
  44. package/dist/i18n/fi-FI.js +12 -0
  45. package/dist/i18n/fi-FI.properties +20 -0
  46. package/dist/i18n/fr-CA.js +12 -0
  47. package/dist/i18n/fr-CA.properties +20 -0
  48. package/dist/i18n/fr-FR.js +12 -0
  49. package/dist/i18n/fr-FR.properties +20 -0
  50. package/dist/i18n/hi-IN.js +12 -0
  51. package/dist/i18n/hi-IN.properties +20 -0
  52. package/dist/i18n/it-IT.js +12 -0
  53. package/dist/i18n/it-IT.properties +20 -0
  54. package/dist/i18n/ja-JP.js +12 -0
  55. package/dist/i18n/ja-JP.properties +20 -0
  56. package/dist/i18n/json/src/lib/messages.json +1 -0
  57. package/dist/i18n/ko-KR.js +12 -0
  58. package/dist/i18n/ko-KR.properties +20 -0
  59. package/dist/i18n/nb-NO.js +12 -0
  60. package/dist/i18n/nb-NO.properties +20 -0
  61. package/dist/i18n/nl-NL.js +12 -0
  62. package/dist/i18n/nl-NL.properties +20 -0
  63. package/dist/i18n/pl-PL.js +12 -0
  64. package/dist/i18n/pl-PL.properties +20 -0
  65. package/dist/i18n/pt-BR.js +12 -0
  66. package/dist/i18n/pt-BR.properties +20 -0
  67. package/dist/i18n/ru-RU.js +12 -0
  68. package/dist/i18n/ru-RU.properties +20 -0
  69. package/dist/i18n/sv-SE.js +12 -0
  70. package/dist/i18n/sv-SE.properties +20 -0
  71. package/dist/i18n/tr-TR.js +12 -0
  72. package/dist/i18n/tr-TR.properties +20 -0
  73. package/dist/i18n/zh-CN.js +12 -0
  74. package/dist/i18n/zh-CN.properties +20 -0
  75. package/dist/i18n/zh-TW.js +12 -0
  76. package/dist/i18n/zh-TW.properties +20 -0
  77. package/dist/styles/user-selector-headless.css +1 -0
  78. package/dist/styles/user-selector-list-item.css +1 -0
  79. package/dist/styles/user-selector.css +1 -0
  80. package/dist/types/index.d.ts +3 -0
  81. package/dist/types/lib/messages.d.ts +53 -0
  82. package/dist/types/lib/shared.d.ts +2 -0
  83. package/dist/types/lib/stories/shared-headless.d.ts +4 -0
  84. package/dist/types/lib/stories/shared.d.ts +18 -0
  85. package/dist/types/lib/stories/utils/getCaretCoordinates.d.ts +5 -0
  86. package/dist/types/lib/stories/utils/testUsers.d.ts +13 -0
  87. package/dist/types/lib/types.d.ts +33 -0
  88. package/dist/types/lib/user-selector-container.d.ts +13 -0
  89. package/dist/types/lib/user-selector-headless/components/user-avatar.d.ts +6 -0
  90. package/dist/types/lib/user-selector-headless/components/user-selector-content.d.ts +15 -0
  91. package/dist/types/lib/user-selector-headless/components/user-selector-default-empty.d.ts +4 -0
  92. package/dist/types/lib/user-selector-headless/components/user-selector-default-error.d.ts +1 -0
  93. package/dist/types/lib/user-selector-headless/components/user-selector-skeleton.d.ts +5 -0
  94. package/dist/types/lib/user-selector-headless/hooks/use-avatars.d.ts +7 -0
  95. package/dist/types/lib/user-selector-headless/hooks/use-keyboard-navigation.d.ts +11 -0
  96. package/dist/types/lib/user-selector-headless/hooks/use-select-options.d.ts +14 -0
  97. package/dist/types/lib/user-selector-headless/types.d.ts +0 -0
  98. package/dist/types/lib/user-selector-headless/user-selector-context.d.ts +15 -0
  99. package/dist/types/lib/user-selector-headless/user-selector-headless.d.ts +28 -0
  100. package/dist/types/lib/user-selector-list-item.d.ts +56 -0
  101. package/dist/types/lib/user-selector.d.ts +37 -0
  102. package/dist/types/lib/utils/VariantsAggregator.d.ts +15 -0
  103. package/dist/types/lib/utils/defaultRenderCustomOption.d.ts +4 -0
  104. package/dist/types/lib/utils/getInitials.d.ts +1 -0
  105. package/dist/types/lib/utils/isUserContactType.d.ts +2 -0
  106. package/package.json +52 -0
@@ -0,0 +1,12 @@
1
+ export default {
2
+ "groupSharedFeatures.userSelector.emptyMessage": "Geen medebewerkers gevonden",
3
+ "groupSharedFeatures.userSelector.errorMessage": "We konden gebruikers niet laden",
4
+ "groupSharedFeatures.userSelector.errorMessageDescription": "Probeer het later opnieuw",
5
+ "groupSharedFeatures.userSelector.inviteCollaborators": "Medebewerkers uitnodigen",
6
+ "groupSharedFeatures.userSelector.inviteCollaboratorsTooltip": "Deze persoon heeft geen toegang en wordt niet op de hoogte gesteld, tenzij hij of zij is uitgenodigd.",
7
+ "groupSharedFeatures.userSelector.loading": "Laden",
8
+ "groupSharedFeatures.userSelector.noResults": "Geen resultaten",
9
+ "groupSharedFeatures.userSelector.tryAgain": "Probeer het opnieuw",
10
+ "groupSharedFeatures.userSelector.userAvatar": "Avatar van de gebruiker",
11
+ "groupSharedFeatures.userSelector.userName": "{name} {isCurrentUser, select, true { (ik)} other {}}"
12
+ }
@@ -0,0 +1,20 @@
1
+ # Text displayed when no results are found
2
+ groupSharedFeatures.userSelector.emptyMessage = Geen medebewerkers gevonden
3
+ # Text displayed when an error occurs
4
+ groupSharedFeatures.userSelector.errorMessage = We konden gebruikers niet laden
5
+ # Text displayed when an error occurs
6
+ groupSharedFeatures.userSelector.errorMessageDescription = Probeer het later opnieuw
7
+ # Text displayed when no results are found and the user can invite collaborators
8
+ groupSharedFeatures.userSelector.inviteCollaborators = Medebewerkers uitnodigen
9
+ # Tooltip text displayed when a user is not a collaborator
10
+ groupSharedFeatures.userSelector.inviteCollaboratorsTooltip = Deze persoon heeft geen toegang en wordt niet op de hoogte gesteld, tenzij hij of zij is uitgenodigd.
11
+ # Aria label for loading indicator
12
+ groupSharedFeatures.userSelector.loading = Laden
13
+ # Text displayed when no results are found
14
+ groupSharedFeatures.userSelector.noResults = Geen resultaten
15
+ # Text for the "Try again" button
16
+ groupSharedFeatures.userSelector.tryAgain = Probeer het opnieuw
17
+ # Alt text for user avatar image
18
+ groupSharedFeatures.userSelector.userAvatar = Avatar van de gebruiker
19
+ # User name with optional "me" marker for current user
20
+ groupSharedFeatures.userSelector.userName = {name} {isCurrentUser, select, true { (ik)} other {}}
@@ -0,0 +1,12 @@
1
+ export default {
2
+ "groupSharedFeatures.userSelector.emptyMessage": "Nie odnaleziono współpracowników",
3
+ "groupSharedFeatures.userSelector.errorMessage": "Nie można wczytać użytkowników",
4
+ "groupSharedFeatures.userSelector.errorMessageDescription": "Spróbuj ponownie później",
5
+ "groupSharedFeatures.userSelector.inviteCollaborators": "Zaproś współpracowników",
6
+ "groupSharedFeatures.userSelector.inviteCollaboratorsTooltip": "Ta osoba nie ma dostępu i nie otrzyma powiadomienia, chyba że zostanie zaproszona.",
7
+ "groupSharedFeatures.userSelector.loading": "Wczytywanie",
8
+ "groupSharedFeatures.userSelector.noResults": "Brak wyników",
9
+ "groupSharedFeatures.userSelector.tryAgain": "Spróbuj ponownie",
10
+ "groupSharedFeatures.userSelector.userAvatar": "Awatar użytkownika",
11
+ "groupSharedFeatures.userSelector.userName": "{name} {isCurrentUser, select, true { (ja)} other {}}"
12
+ }
@@ -0,0 +1,20 @@
1
+ # Text displayed when no results are found
2
+ groupSharedFeatures.userSelector.emptyMessage = Nie odnaleziono współpracowników
3
+ # Text displayed when an error occurs
4
+ groupSharedFeatures.userSelector.errorMessage = Nie można wczytać użytkowników
5
+ # Text displayed when an error occurs
6
+ groupSharedFeatures.userSelector.errorMessageDescription = Spróbuj ponownie później
7
+ # Text displayed when no results are found and the user can invite collaborators
8
+ groupSharedFeatures.userSelector.inviteCollaborators = Zaproś współpracowników
9
+ # Tooltip text displayed when a user is not a collaborator
10
+ groupSharedFeatures.userSelector.inviteCollaboratorsTooltip = Ta osoba nie ma dostępu i nie otrzyma powiadomienia, chyba że zostanie zaproszona.
11
+ # Aria label for loading indicator
12
+ groupSharedFeatures.userSelector.loading = Wczytywanie
13
+ # Text displayed when no results are found
14
+ groupSharedFeatures.userSelector.noResults = Brak wyników
15
+ # Text for the "Try again" button
16
+ groupSharedFeatures.userSelector.tryAgain = Spróbuj ponownie
17
+ # Alt text for user avatar image
18
+ groupSharedFeatures.userSelector.userAvatar = Awatar użytkownika
19
+ # User name with optional "me" marker for current user
20
+ groupSharedFeatures.userSelector.userName = {name} {isCurrentUser, select, true { (ja)} other {}}
@@ -0,0 +1,12 @@
1
+ export default {
2
+ "groupSharedFeatures.userSelector.emptyMessage": "Não foram encontradas colaborações",
3
+ "groupSharedFeatures.userSelector.errorMessage": "Não foi possível carregar usuários",
4
+ "groupSharedFeatures.userSelector.errorMessageDescription": "Tente novamente mais tarde",
5
+ "groupSharedFeatures.userSelector.inviteCollaborators": "Convidar colaboradores",
6
+ "groupSharedFeatures.userSelector.inviteCollaboratorsTooltip": "Essa pessoa não tem acesso e não será notificada, a menos que seja convidada.",
7
+ "groupSharedFeatures.userSelector.loading": "Carregando",
8
+ "groupSharedFeatures.userSelector.noResults": "Sem resultados",
9
+ "groupSharedFeatures.userSelector.tryAgain": "Tente novamente",
10
+ "groupSharedFeatures.userSelector.userAvatar": "Avatar do usuário",
11
+ "groupSharedFeatures.userSelector.userName": "{name} {isCurrentUser, select, true { (eu)} other {}}"
12
+ }
@@ -0,0 +1,20 @@
1
+ # Text displayed when no results are found
2
+ groupSharedFeatures.userSelector.emptyMessage = Não foram encontradas colaborações
3
+ # Text displayed when an error occurs
4
+ groupSharedFeatures.userSelector.errorMessage = Não foi possível carregar usuários
5
+ # Text displayed when an error occurs
6
+ groupSharedFeatures.userSelector.errorMessageDescription = Tente novamente mais tarde
7
+ # Text displayed when no results are found and the user can invite collaborators
8
+ groupSharedFeatures.userSelector.inviteCollaborators = Convidar colaboradores
9
+ # Tooltip text displayed when a user is not a collaborator
10
+ groupSharedFeatures.userSelector.inviteCollaboratorsTooltip = Essa pessoa não tem acesso e não será notificada, a menos que seja convidada.
11
+ # Aria label for loading indicator
12
+ groupSharedFeatures.userSelector.loading = Carregando
13
+ # Text displayed when no results are found
14
+ groupSharedFeatures.userSelector.noResults = Sem resultados
15
+ # Text for the "Try again" button
16
+ groupSharedFeatures.userSelector.tryAgain = Tente novamente
17
+ # Alt text for user avatar image
18
+ groupSharedFeatures.userSelector.userAvatar = Avatar do usuário
19
+ # User name with optional "me" marker for current user
20
+ groupSharedFeatures.userSelector.userName = {name} {isCurrentUser, select, true { (eu)} other {}}
@@ -0,0 +1,12 @@
1
+ export default {
2
+ "groupSharedFeatures.userSelector.emptyMessage": "Соавторы не найдены",
3
+ "groupSharedFeatures.userSelector.errorMessage": "Не удалось загрузить пользователей",
4
+ "groupSharedFeatures.userSelector.errorMessageDescription": "Повторите попытку позже",
5
+ "groupSharedFeatures.userSelector.inviteCollaborators": "Пригласить соавторов",
6
+ "groupSharedFeatures.userSelector.inviteCollaboratorsTooltip": "У этого пользователя нет доступа, и он не получит уведомление, если его не пригласить.",
7
+ "groupSharedFeatures.userSelector.loading": "Загрузка",
8
+ "groupSharedFeatures.userSelector.noResults": "Нет результатов",
9
+ "groupSharedFeatures.userSelector.tryAgain": "Повторите попытку",
10
+ "groupSharedFeatures.userSelector.userAvatar": "Аватар пользователя",
11
+ "groupSharedFeatures.userSelector.userName": "{name} {isCurrentUser, select, true { (я)} other {}}"
12
+ }
@@ -0,0 +1,20 @@
1
+ # Text displayed when no results are found
2
+ groupSharedFeatures.userSelector.emptyMessage = Соавторы не найдены
3
+ # Text displayed when an error occurs
4
+ groupSharedFeatures.userSelector.errorMessage = Не удалось загрузить пользователей
5
+ # Text displayed when an error occurs
6
+ groupSharedFeatures.userSelector.errorMessageDescription = Повторите попытку позже
7
+ # Text displayed when no results are found and the user can invite collaborators
8
+ groupSharedFeatures.userSelector.inviteCollaborators = Пригласить соавторов
9
+ # Tooltip text displayed when a user is not a collaborator
10
+ groupSharedFeatures.userSelector.inviteCollaboratorsTooltip = У этого пользователя нет доступа, и он не получит уведомление, если его не пригласить.
11
+ # Aria label for loading indicator
12
+ groupSharedFeatures.userSelector.loading = Загрузка
13
+ # Text displayed when no results are found
14
+ groupSharedFeatures.userSelector.noResults = Нет результатов
15
+ # Text for the "Try again" button
16
+ groupSharedFeatures.userSelector.tryAgain = Повторите попытку
17
+ # Alt text for user avatar image
18
+ groupSharedFeatures.userSelector.userAvatar = Аватар пользователя
19
+ # User name with optional "me" marker for current user
20
+ groupSharedFeatures.userSelector.userName = {name} {isCurrentUser, select, true { (я)} other {}}
@@ -0,0 +1,12 @@
1
+ export default {
2
+ "groupSharedFeatures.userSelector.emptyMessage": "Inga samarbeten hittades",
3
+ "groupSharedFeatures.userSelector.errorMessage": "Vi kunde inte läsa in användare.",
4
+ "groupSharedFeatures.userSelector.errorMessageDescription": "Försök igen senare",
5
+ "groupSharedFeatures.userSelector.inviteCollaborators": "Bjud in medarbetare",
6
+ "groupSharedFeatures.userSelector.inviteCollaboratorsTooltip": "Den här personen har inte åtkomst och kommer inte att meddelas om han inte är inbjuden.",
7
+ "groupSharedFeatures.userSelector.loading": "Läser in",
8
+ "groupSharedFeatures.userSelector.noResults": "Inga resultat",
9
+ "groupSharedFeatures.userSelector.tryAgain": "Försök igen",
10
+ "groupSharedFeatures.userSelector.userAvatar": "Användaravatar",
11
+ "groupSharedFeatures.userSelector.userName": "{name} {isCurrentUser, select, true { (jag)} other {}}"
12
+ }
@@ -0,0 +1,20 @@
1
+ # Text displayed when no results are found
2
+ groupSharedFeatures.userSelector.emptyMessage = Inga samarbeten hittades
3
+ # Text displayed when an error occurs
4
+ groupSharedFeatures.userSelector.errorMessage = Vi kunde inte läsa in användare.
5
+ # Text displayed when an error occurs
6
+ groupSharedFeatures.userSelector.errorMessageDescription = Försök igen senare
7
+ # Text displayed when no results are found and the user can invite collaborators
8
+ groupSharedFeatures.userSelector.inviteCollaborators = Bjud in medarbetare
9
+ # Tooltip text displayed when a user is not a collaborator
10
+ groupSharedFeatures.userSelector.inviteCollaboratorsTooltip = Den här personen har inte åtkomst och kommer inte att meddelas om han inte är inbjuden.
11
+ # Aria label for loading indicator
12
+ groupSharedFeatures.userSelector.loading = Läser in
13
+ # Text displayed when no results are found
14
+ groupSharedFeatures.userSelector.noResults = Inga resultat
15
+ # Text for the "Try again" button
16
+ groupSharedFeatures.userSelector.tryAgain = Försök igen
17
+ # Alt text for user avatar image
18
+ groupSharedFeatures.userSelector.userAvatar = Användaravatar
19
+ # User name with optional "me" marker for current user
20
+ groupSharedFeatures.userSelector.userName = {name} {isCurrentUser, select, true { (jag)} other {}}
@@ -0,0 +1,12 @@
1
+ export default {
2
+ "groupSharedFeatures.userSelector.emptyMessage": "İşbirlikçi bulunamadı",
3
+ "groupSharedFeatures.userSelector.errorMessage": "Kullanıcıları yükleyemedik",
4
+ "groupSharedFeatures.userSelector.errorMessageDescription": "Lütfen daha sonra tekrar deneyin",
5
+ "groupSharedFeatures.userSelector.inviteCollaborators": "İşbirlikçileri Davet Et",
6
+ "groupSharedFeatures.userSelector.inviteCollaboratorsTooltip": "Bu kişinin erişimi yok ve davet edilmediği sürece bildirim almayacak.",
7
+ "groupSharedFeatures.userSelector.loading": "Yükleniyor",
8
+ "groupSharedFeatures.userSelector.noResults": "Sonuç Yok",
9
+ "groupSharedFeatures.userSelector.tryAgain": "Yeniden deneyin",
10
+ "groupSharedFeatures.userSelector.userAvatar": "Kullanıcı avatarı",
11
+ "groupSharedFeatures.userSelector.userName": "{name} {isCurrentUser, select, true { (ben)} other {}}"
12
+ }
@@ -0,0 +1,20 @@
1
+ # Text displayed when no results are found
2
+ groupSharedFeatures.userSelector.emptyMessage = İşbirlikçi bulunamadı
3
+ # Text displayed when an error occurs
4
+ groupSharedFeatures.userSelector.errorMessage = Kullanıcıları yükleyemedik
5
+ # Text displayed when an error occurs
6
+ groupSharedFeatures.userSelector.errorMessageDescription = Lütfen daha sonra tekrar deneyin
7
+ # Text displayed when no results are found and the user can invite collaborators
8
+ groupSharedFeatures.userSelector.inviteCollaborators = İşbirlikçileri Davet Et
9
+ # Tooltip text displayed when a user is not a collaborator
10
+ groupSharedFeatures.userSelector.inviteCollaboratorsTooltip = Bu kişinin erişimi yok ve davet edilmediği sürece bildirim almayacak.
11
+ # Aria label for loading indicator
12
+ groupSharedFeatures.userSelector.loading = Yükleniyor
13
+ # Text displayed when no results are found
14
+ groupSharedFeatures.userSelector.noResults = Sonuç Yok
15
+ # Text for the "Try again" button
16
+ groupSharedFeatures.userSelector.tryAgain = Yeniden deneyin
17
+ # Alt text for user avatar image
18
+ groupSharedFeatures.userSelector.userAvatar = Kullanıcı avatarı
19
+ # User name with optional "me" marker for current user
20
+ groupSharedFeatures.userSelector.userName = {name} {isCurrentUser, select, true { (ben)} other {}}
@@ -0,0 +1,12 @@
1
+ export default {
2
+ "groupSharedFeatures.userSelector.emptyMessage": "未找到协作者",
3
+ "groupSharedFeatures.userSelector.errorMessage": "无法加载用户。",
4
+ "groupSharedFeatures.userSelector.errorMessageDescription": "请稍后重试",
5
+ "groupSharedFeatures.userSelector.inviteCollaborators": "邀请协作者",
6
+ "groupSharedFeatures.userSelector.inviteCollaboratorsTooltip": "此人无权访问,除非受到邀请,否则不会收到通知。",
7
+ "groupSharedFeatures.userSelector.loading": "正在加载",
8
+ "groupSharedFeatures.userSelector.noResults": "无结果",
9
+ "groupSharedFeatures.userSelector.tryAgain": "请重试",
10
+ "groupSharedFeatures.userSelector.userAvatar": "用户头像",
11
+ "groupSharedFeatures.userSelector.userName": "{name} {isCurrentUser, select, true { (我)} other {}}"
12
+ }
@@ -0,0 +1,20 @@
1
+ # Text displayed when no results are found
2
+ groupSharedFeatures.userSelector.emptyMessage = 未找到协作者
3
+ # Text displayed when an error occurs
4
+ groupSharedFeatures.userSelector.errorMessage = 无法加载用户。
5
+ # Text displayed when an error occurs
6
+ groupSharedFeatures.userSelector.errorMessageDescription = 请稍后重试
7
+ # Text displayed when no results are found and the user can invite collaborators
8
+ groupSharedFeatures.userSelector.inviteCollaborators = 邀请协作者
9
+ # Tooltip text displayed when a user is not a collaborator
10
+ groupSharedFeatures.userSelector.inviteCollaboratorsTooltip = 此人无权访问,除非受到邀请,否则不会收到通知。
11
+ # Aria label for loading indicator
12
+ groupSharedFeatures.userSelector.loading = 正在加载
13
+ # Text displayed when no results are found
14
+ groupSharedFeatures.userSelector.noResults = 无结果
15
+ # Text for the "Try again" button
16
+ groupSharedFeatures.userSelector.tryAgain = 请重试
17
+ # Alt text for user avatar image
18
+ groupSharedFeatures.userSelector.userAvatar = 用户头像
19
+ # User name with optional "me" marker for current user
20
+ groupSharedFeatures.userSelector.userName = {name} {isCurrentUser, select, true { (我)} other {}}
@@ -0,0 +1,12 @@
1
+ export default {
2
+ "groupSharedFeatures.userSelector.emptyMessage": "找不到共同作業者",
3
+ "groupSharedFeatures.userSelector.errorMessage": "我們無法載入使用者",
4
+ "groupSharedFeatures.userSelector.errorMessageDescription": "請稍後再試一次",
5
+ "groupSharedFeatures.userSelector.inviteCollaborators": "邀請共同作業者",
6
+ "groupSharedFeatures.userSelector.inviteCollaboratorsTooltip": "此人沒有存取權限,除非受邀,否則不會接到通知。",
7
+ "groupSharedFeatures.userSelector.loading": "載入中",
8
+ "groupSharedFeatures.userSelector.noResults": "無結果",
9
+ "groupSharedFeatures.userSelector.tryAgain": "再試一次",
10
+ "groupSharedFeatures.userSelector.userAvatar": "使用者頭像",
11
+ "groupSharedFeatures.userSelector.userName": "{name} {isCurrentUser, select, true { (我)} other {}}"
12
+ }
@@ -0,0 +1,20 @@
1
+ # Text displayed when no results are found
2
+ groupSharedFeatures.userSelector.emptyMessage = 找不到共同作業者
3
+ # Text displayed when an error occurs
4
+ groupSharedFeatures.userSelector.errorMessage = 我們無法載入使用者
5
+ # Text displayed when an error occurs
6
+ groupSharedFeatures.userSelector.errorMessageDescription = 請稍後再試一次
7
+ # Text displayed when no results are found and the user can invite collaborators
8
+ groupSharedFeatures.userSelector.inviteCollaborators = 邀請共同作業者
9
+ # Tooltip text displayed when a user is not a collaborator
10
+ groupSharedFeatures.userSelector.inviteCollaboratorsTooltip = 此人沒有存取權限,除非受邀,否則不會接到通知。
11
+ # Aria label for loading indicator
12
+ groupSharedFeatures.userSelector.loading = 載入中
13
+ # Text displayed when no results are found
14
+ groupSharedFeatures.userSelector.noResults = 無結果
15
+ # Text for the "Try again" button
16
+ groupSharedFeatures.userSelector.tryAgain = 再試一次
17
+ # Alt text for user avatar image
18
+ groupSharedFeatures.userSelector.userAvatar = 使用者頭像
19
+ # User name with optional "me" marker for current user
20
+ groupSharedFeatures.userSelector.userName = {name} {isCurrentUser, select, true { (我)} other {}}
@@ -0,0 +1 @@
1
+ ._userSelectorListItemBase_qevbl_1,._userSelectorInviteRow_qevbl_1{display:flex;align-items:center;border:2px solid transparent}._userSelectorListItemBase_qevbl_1:hover,._userSelectorInviteRow_qevbl_1:hover,._userSelectorListItemBase_qevbl_1:focus,._userSelectorInviteRow_qevbl_1:focus,._userSelectorListItemBase_qevbl_1[aria-selected=true],[aria-selected=true]._userSelectorInviteRow_qevbl_1{background-color:var(--surface-menu-surface-hover);border-radius:var(--radius-3);cursor:pointer}._userSelectorListItemBase_qevbl_1[aria-selected=true],[aria-selected=true]._userSelectorInviteRow_qevbl_1{border-color:var(--outline-focus-on-light)}._userSelectorListItemBase_qevbl_1:focus,._userSelectorInviteRow_qevbl_1:focus{outline-color:var(--outline-focus-on-light)}._popoverContainer_qevbl_18>div{width:294px;max-height:200px;padding:var(--space-3);overflow:auto;overflow-x:hidden}._popoverContent_qevbl_26{display:block;overflow:initial;border:1px solid transparent}._userSelectorListItem_qevbl_1{padding-block:var(--space-2);padding-inline:var(--space-2)}._listItemAvatar_qevbl_37{flex-shrink:0}._userSelectorGhostStateItem_qevbl_41{display:flex;gap:var(--space-2);align-items:center;padding:var(--space-2)}._userSelectorGhostStateItem_qevbl_41 ._titleGhost_qevbl_47{flex-shrink:0}._userSelectorEmptyText_qevbl_51{font-weight:var(--label-default-font-weight);font-size:var(--label-default-font-size);font-family:var(--label-default-font-family);line-height:var(--label-default-line-height);letter-spacing:var(--label-default-letter-spacing);text-transform:var(--label-default-text-case);text-decoration:var(--label-default-text-decoration);width:248px;padding:var(--space-2);color:var(--text-text-on-light-secondary);text-transform:uppercase}._userSelectorEmptyContainer_qevbl_65{display:flex;flex-direction:column;gap:var(--space-2);align-items:stretch}._userSelectorInviteRow_qevbl_1{gap:var(--space-3);height:var(--size-9);font:inherit;background-color:var(--surface-menu-surface);cursor:pointer}._userSelectorInviteButtonIcon_qevbl_80{display:flex;flex-shrink:0}
@@ -0,0 +1 @@
1
+ ._userSelectorListItemBase_1m2q6_1,._userSelectorListItem_1m2q6_1{display:flex;align-items:center;border:2px solid transparent}._userSelectorListItemBase_1m2q6_1:hover,._userSelectorListItem_1m2q6_1:hover,._userSelectorListItemBase_1m2q6_1:focus,._userSelectorListItem_1m2q6_1:focus,._userSelectorListItemBase_1m2q6_1[aria-selected=true],[aria-selected=true]._userSelectorListItem_1m2q6_1{background-color:var(--surface-menu-surface-hover);border-radius:var(--radius-3);cursor:pointer}._userSelectorListItemBase_1m2q6_1[aria-selected=true],[aria-selected=true]._userSelectorListItem_1m2q6_1{border-color:var(--outline-focus-on-light)}._userSelectorListItemBase_1m2q6_1:focus,._userSelectorListItem_1m2q6_1:focus{outline-color:var(--outline-focus-on-light)}._userSelectorListItem_1m2q6_1 ._listItemAvatar_1m2q6_18{flex-shrink:0}._userSelectorListItem_1m2q6_1 ._userInfo_1m2q6_21{display:flex;flex:1;flex-direction:column;margin-inline-start:var(--space-3);overflow:auto}._userSelectorListItem_1m2q6_1 ._userInfo_1m2q6_21 ._title_1m2q6_28{display:flex}._userSelectorListItem_1m2q6_1 ._userInfo_1m2q6_21 ._title_1m2q6_28 :not(:last-child){margin-inline-end:var(--space-1)}._userSelectorListItem_1m2q6_1 ._userInfo_1m2q6_21 ._userName_1m2q6_34,._userSelectorListItem_1m2q6_1 ._userInfo_1m2q6_21 ._userEmail_1m2q6_35{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}._userSelectorListItem_1m2q6_1 ._userInfo_1m2q6_21 ._userEmail_1m2q6_35{margin-block-start:var(--space-05)}._userSelectorListItem_1m2q6_1 ._userSelectorListItemInviteIcon_1m2q6_43{flex-shrink:0;margin-inline-start:auto;margin-left:var(--space-2);visibility:hidden}._userSelectorListItem_1m2q6_1:hover ._userSelectorListItemInviteIcon_1m2q6_43{visibility:visible}
@@ -0,0 +1 @@
1
+ ._textArea_shf88_1._textArea_shf88_1._textArea_shf88_1 [data-testid=combobox-container]{align-items:flex-start;box-sizing:border-box;min-height:80px;max-height:none}._textArea_shf88_1._textArea_shf88_1._textArea_shf88_1 [data-testid=combobox-container] input{padding:var(--space-1) 0}
@@ -0,0 +1,3 @@
1
+ export * from './lib/types';
2
+ export * from './lib/user-selector-container';
3
+ export * from './lib/user-selector-headless/user-selector-headless';
@@ -0,0 +1,53 @@
1
+ declare const messages: {
2
+ loading: {
3
+ defaultMessage: string;
4
+ description: string;
5
+ id: string;
6
+ };
7
+ noResults: {
8
+ defaultMessage: string;
9
+ description: string;
10
+ id: string;
11
+ };
12
+ tryAgain: {
13
+ defaultMessage: string;
14
+ description: string;
15
+ id: string;
16
+ };
17
+ userAvatar: {
18
+ defaultMessage: string;
19
+ description: string;
20
+ id: string;
21
+ };
22
+ userName: {
23
+ defaultMessage: string;
24
+ description: string;
25
+ id: string;
26
+ };
27
+ errorMessage: {
28
+ defaultMessage: string;
29
+ description: string;
30
+ id: string;
31
+ };
32
+ errorMessageDescription: {
33
+ defaultMessage: string;
34
+ description: string;
35
+ id: string;
36
+ };
37
+ emptyMessage: {
38
+ defaultMessage: string;
39
+ description: string;
40
+ id: string;
41
+ };
42
+ inviteCollaborators: {
43
+ defaultMessage: string;
44
+ description: string;
45
+ id: string;
46
+ };
47
+ inviteCollaboratorsTooltip: {
48
+ defaultMessage: string;
49
+ description: string;
50
+ id: string;
51
+ };
52
+ };
53
+ export default messages;
@@ -0,0 +1,2 @@
1
+ import { UserContactType } from './types';
2
+ export declare const placeholderUser: UserContactType;
@@ -0,0 +1,4 @@
1
+ import { HeadlessUserSelectorProps } from '../user-selector-headless/user-selector-headless';
2
+ import { ComponentRecord } from '../utils/VariantsAggregator';
3
+ export declare const ComponentTemplate: (props: HeadlessUserSelectorProps) => import("react/jsx-runtime").JSX.Element;
4
+ export declare const UserSelectorHeadlessMap: ComponentRecord<HeadlessUserSelectorProps>;
@@ -0,0 +1,18 @@
1
+ import { HTMLAttributes } from 'react';
2
+ import { UserContactType, UserSelectorOption } from '../types';
3
+ import { UserSelectorProps } from '../user-selector';
4
+ import { UserSelectorContainerProps } from '../user-selector-container';
5
+ import { ComponentRecord } from '../utils/VariantsAggregator';
6
+ export type ContainerTemplateProps<T extends UserSelectorOption = UserContactType> = Omit<UserSelectorContainerProps<T>, 'onSelectedUsersChange' | 'selectedUsers'> & {
7
+ initialSelectedUsers?: T[];
8
+ };
9
+ export declare const defaultContainerTemplateArgs: ContainerTemplateProps;
10
+ export declare function ContainerTemplate<T extends UserSelectorOption = UserContactType>(props: ContainerTemplateProps<T>): import("react/jsx-runtime").JSX.Element;
11
+ export type ComponentTemplateProps<T extends UserSelectorOption = UserContactType> = Omit<UserSelectorProps<T>, 'inputValue' | 'onInputValueChange' | 'onSelectedUsersChange' | 'selectedUsers'> & {
12
+ divStyle?: HTMLAttributes<HTMLDivElement>['style'];
13
+ initialInputValue?: string;
14
+ initialSelectedUsers?: T[];
15
+ };
16
+ export declare const defaultComponentTemplateArgs: ComponentTemplateProps;
17
+ export declare const ComponentTemplate: (props: ComponentTemplateProps) => import("react/jsx-runtime").JSX.Element;
18
+ export declare const UserSelectorMap: ComponentRecord<Partial<ComponentTemplateProps<UserSelectorOption>>>;
@@ -0,0 +1,5 @@
1
+ export declare const getCaretCoordinates: (textarea: HTMLTextAreaElement, position: number) => {
2
+ top: number;
3
+ left: number;
4
+ height: number;
5
+ };
@@ -0,0 +1,13 @@
1
+ import { CustomUserContactType, UserContactType } from '../../types';
2
+ export declare const testUser1: UserContactType;
3
+ export declare const testUser2: UserContactType;
4
+ export declare const testUser3: UserContactType;
5
+ export declare const testUser4: UserContactType;
6
+ export declare const testUser5: UserContactType;
7
+ export declare const testUser6: UserContactType;
8
+ export declare const testUser5WithIdAsValue: UserContactType;
9
+ export declare const testUser6WithIdAsValue: UserContactType;
10
+ export declare const customOption1WithImageAvatar: CustomUserContactType;
11
+ export declare const customOption2WithTextAvatar: CustomUserContactType;
12
+ export declare const customOptionWithIconAvatar: CustomUserContactType;
13
+ export declare const customOptionWithVariableChipVariant: CustomUserContactType;
@@ -0,0 +1,33 @@
1
+ import { ReactElement, SVGProps } from 'react';
2
+ export type UserContactType = {
3
+ email: string;
4
+ id: number;
5
+ isCollaborator?: boolean;
6
+ isCurrentUser?: boolean;
7
+ isExternalUser?: boolean;
8
+ name: string;
9
+ value: string;
10
+ type?: string;
11
+ };
12
+ export type CustomUserContactType = {
13
+ name: string;
14
+ subtitle: string;
15
+ value: string;
16
+ avatar: {
17
+ color: string;
18
+ text?: string;
19
+ icon?: ReactElement<SVGProps<SVGSVGElement>>;
20
+ } & ({
21
+ src: string;
22
+ alt: string;
23
+ } | {
24
+ src?: never;
25
+ alt?: never;
26
+ });
27
+ hideOnClick?: boolean;
28
+ chipVariant?: 'default' | 'error' | 'variable';
29
+ };
30
+ export type UserSelectorOption = UserContactType | CustomUserContactType;
31
+ export type FetchedAvatarUrls = {
32
+ [userId: string]: string;
33
+ };
@@ -0,0 +1,13 @@
1
+ import { FetchedAvatarUrls, UserContactType, UserSelectorOption } from './types';
2
+ import { UserSelectorProps } from './user-selector';
3
+ export type UserSelectorContainerProps<T extends UserSelectorOption = UserContactType> = Omit<UserSelectorProps<T>, 'as' | 'fetcher' | 'fetchedAvatarUrls' | 'freeInput' | 'multiselect' | 'options' | 'onValueChange' | 'renderOption' | 'value'> & {
4
+ /**
5
+ * Input validation error message
6
+ */
7
+ error?: string;
8
+ /**
9
+ Given an array of UserContactTypes, returns a Promise of a dictionary with user ids mapped to avatar URLs
10
+ */
11
+ fetchAvatarUrls: (userContacts: UserContactType[]) => Promise<FetchedAvatarUrls>;
12
+ };
13
+ export declare const UserSelectorContainer: <T extends UserSelectorOption = UserContactType>({ fetchAvatarUrls, fetchUsers, onSelectedUsersChange, selectedUsers, renderCustomOption, ...rest }: UserSelectorContainerProps<T>) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { UserContactType } from '../../types';
2
+ type UserAvatarProps = {
3
+ userContact: UserContactType;
4
+ };
5
+ export declare const UserAvatar: ({ userContact }: UserAvatarProps) => import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -0,0 +1,15 @@
1
+ import { UserContactType } from '../../types';
2
+ type UserSelectorContentProps = {
3
+ renderError?: (error?: unknown) => React.ReactElement;
4
+ renderEmpty?: (value: string) => React.ReactElement;
5
+ loadingAriaLabel: string;
6
+ optionRefs: React.MutableRefObject<Map<string, HTMLElement>>;
7
+ handleOptionClick: (userContact: UserContactType, id: string) => void;
8
+ options: UserContactType[];
9
+ isEmpty: boolean;
10
+ isLoading: boolean;
11
+ error: unknown;
12
+ handleInvite?: (value: string) => void;
13
+ };
14
+ export declare const UserSelectorContent: ({ renderError, renderEmpty, loadingAriaLabel, optionRefs, handleOptionClick, options, isEmpty, isLoading, error, handleInvite, }: UserSelectorContentProps) => import("react/jsx-runtime").JSX.Element | import("react/jsx-runtime").JSX.Element[];
15
+ export {};
@@ -0,0 +1,4 @@
1
+ export type UserSelectorDefaultEmptyProps = {
2
+ handleInvite?: (value: string) => void;
3
+ };
4
+ export declare const UserSelectorDefaultEmpty: ({ handleInvite }: UserSelectorDefaultEmptyProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export declare const UserSelectorDefaultError: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,5 @@
1
+ type UserSelectorSkeletonProps = {
2
+ loadingAriaLabel: string;
3
+ };
4
+ export declare const UserSelectorSkeleton: ({ loadingAriaLabel }: UserSelectorSkeletonProps) => import("react/jsx-runtime").JSX.Element;
5
+ export {};
@@ -0,0 +1,7 @@
1
+ import { FetchedAvatarUrls } from '../../types';
2
+ export declare const useAvatars: ({ fetchAvatarUrls, options }: {
3
+ fetchAvatarUrls: any;
4
+ options: any;
5
+ }) => {
6
+ avatars: FetchedAvatarUrls;
7
+ };
@@ -0,0 +1,11 @@
1
+ type UseKeyboardNavigationProps = {
2
+ isLoading: boolean;
3
+ error: unknown;
4
+ isEmpty: boolean;
5
+ open: boolean;
6
+ selectNext: () => void;
7
+ selectPrevious: () => void;
8
+ selectItem: () => void;
9
+ };
10
+ export declare const useKeyboardNavigation: ({ isLoading, error, isEmpty, open, selectNext, selectPrevious, selectItem, }: UseKeyboardNavigationProps) => (event: React.KeyboardEvent<HTMLDivElement>) => void;
11
+ export {};
@@ -0,0 +1,14 @@
1
+ import { UserContactType } from '../../types';
2
+ type UseOptionsProps = {
3
+ fetcher: (inputValue: string) => Promise<UserContactType[]>;
4
+ debounceTime?: number;
5
+ value: string;
6
+ allowEmptyQuery?: boolean;
7
+ };
8
+ export declare const useSelectOptions: ({ fetcher, value, debounceTime, allowEmptyQuery }: UseOptionsProps) => {
9
+ isLoading: boolean;
10
+ isEmpty: boolean;
11
+ error: any;
12
+ options: UserContactType[];
13
+ };
14
+ export {};
@@ -0,0 +1,15 @@
1
+ import { FetchedAvatarUrls, UserContactType } from '../types';
2
+ type UserSelectorContextType = {
3
+ fetchUsers: (inputValue: string) => Promise<UserContactType[]>;
4
+ fetchAvatarUrls: (userContacts: UserContactType[]) => Promise<FetchedAvatarUrls>;
5
+ onSelectedUserChange: (userContact: UserContactType) => void;
6
+ value: string;
7
+ avatars: Record<string, string>;
8
+ activeId: string | null;
9
+ setActiveId: (id: string | null) => void;
10
+ listboxId: string;
11
+ getOptionId: (option: UserContactType) => string;
12
+ };
13
+ export declare const UserSelectorContext: import('react').Context<UserSelectorContextType>;
14
+ export declare const useUserSelector: () => UserSelectorContextType;
15
+ export {};
@@ -0,0 +1,28 @@
1
+ import { PopoverContentContainerProps } from '@box/blueprint-web';
2
+ import { FetchedAvatarUrls, UserContactType } from '../types';
3
+ export type HeadlessUserSelectorHandle = {
4
+ focusFirstOption: () => void;
5
+ focusLastOption: () => void;
6
+ selectNext: () => void;
7
+ selectPrevious: () => void;
8
+ selectItem: () => void;
9
+ };
10
+ export type HeadlessUserSelectorProps = {
11
+ fetchUsers: (inputValue: string) => Promise<UserContactType[]>;
12
+ fetchAvatarUrls: (userContacts: UserContactType[]) => Promise<FetchedAvatarUrls>;
13
+ open: boolean;
14
+ value: string;
15
+ rootElement: React.ReactElement;
16
+ onSelectedUserChange: (userContact: UserContactType) => void;
17
+ focusOnOpen?: boolean;
18
+ inputElementRef: React.RefObject<HTMLElement>;
19
+ renderError?: (error?: unknown) => React.ReactElement;
20
+ renderEmpty?: (value: string) => React.ReactElement;
21
+ loadingAriaLabel: string;
22
+ ariaRoleDescription: string;
23
+ nativeFocusEnabled?: boolean;
24
+ allowEmptyQuery?: boolean;
25
+ onInvite?: (value: string) => void;
26
+ popoverContentContainerProps?: PopoverContentContainerProps;
27
+ };
28
+ export declare const UserSelectorHeadless: import('react').ForwardRefExoticComponent<HeadlessUserSelectorProps & import('react').RefAttributes<HeadlessUserSelectorHandle>>;