@cupcodev/ui 1.2.3 → 1.2.6

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.
package/README.md CHANGED
@@ -70,6 +70,10 @@ setCupcodeRuntimeEnv({
70
70
  });
71
71
  ```
72
72
 
73
+ Observação:
74
+ - Ao instalar/atualizar `@cupcodev/ui`, o pacote exibe esse lembrete no `postinstall`.
75
+ - Se o projeto usa `npm install --ignore-scripts`, esse aviso não aparece; nesse caso, aplique a configuração manualmente.
76
+
73
77
  ### Uso básico
74
78
 
75
79
  ```tsx
package/dist/index.cjs CHANGED
@@ -374,6 +374,7 @@ __export(src_exports, {
374
374
  parseAssetId: () => parseAssetId,
375
375
  reducer: () => reducer,
376
376
  resolveOidcEndpoints: () => resolveOidcEndpoints,
377
+ resolveTelescupImageURL: () => resolveTelescupImageURL,
377
378
  responsiveSizeClasses: () => responsiveSizeClasses,
378
379
  setCupcodeRuntimeEnv: () => setCupcodeRuntimeEnv,
379
380
  sonnerToast: () => import_sonner.toast,
@@ -1253,6 +1254,31 @@ var isRuntimeDev = () => {
1253
1254
  return mode === "development";
1254
1255
  };
1255
1256
 
1257
+ // src/utils/parseAssetId.ts
1258
+ var UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
1259
+ var UUID_IN_TEXT_REGEX = /[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i;
1260
+ var isUuid = (value) => {
1261
+ if (typeof value !== "string") return false;
1262
+ return UUID_REGEX.test(value.trim());
1263
+ };
1264
+ function parseAssetId(input) {
1265
+ var _a65, _b5, _c, _d;
1266
+ const raw = input == null ? void 0 : input.trim();
1267
+ if (!raw) return void 0;
1268
+ if (UUID_REGEX.test(raw)) return raw;
1269
+ const matchFromRaw = (_a65 = raw.match(UUID_IN_TEXT_REGEX)) == null ? void 0 : _a65[0];
1270
+ if (isUuid(matchFromRaw)) return matchFromRaw;
1271
+ try {
1272
+ const url = new URL(raw);
1273
+ const queryParamId = (_c = (_b5 = url.searchParams.get("id")) != null ? _b5 : url.searchParams.get("asset_id")) != null ? _c : url.searchParams.get("assetId");
1274
+ if (isUuid(queryParamId)) return queryParamId;
1275
+ const matchFromPath = (_d = url.pathname.match(UUID_IN_TEXT_REGEX)) == null ? void 0 : _d[0];
1276
+ if (isUuid(matchFromPath)) return matchFromPath;
1277
+ } catch (e) {
1278
+ }
1279
+ return void 0;
1280
+ }
1281
+
1256
1282
  // src/hooks/useTelescupAsset.ts
1257
1283
  var getApiBase = () => getRuntimeEnvOr("VITE_TELESCUP_API_BASE", "https://cdn.cupcode.com.br").replace(/\/+$/, "");
1258
1284
  function buildTelescupImageURL(options) {
@@ -1265,6 +1291,25 @@ function buildTelescupImageURL(options) {
1265
1291
  params.set("q", quality.toString());
1266
1292
  return `${getApiBase()}/i?${params.toString()}`;
1267
1293
  }
1294
+ function resolveTelescupImageURL(value, options) {
1295
+ const raw = value == null ? void 0 : value.trim();
1296
+ if (!raw) return void 0;
1297
+ const parsedId = parseAssetId(raw);
1298
+ if (parsedId) {
1299
+ return buildTelescupImageURL({
1300
+ id: parsedId,
1301
+ width: options == null ? void 0 : options.width,
1302
+ height: options == null ? void 0 : options.height,
1303
+ fit: options == null ? void 0 : options.fit,
1304
+ format: options == null ? void 0 : options.format,
1305
+ quality: options == null ? void 0 : options.quality
1306
+ });
1307
+ }
1308
+ if (raw.startsWith("http://") || raw.startsWith("https://") || raw.startsWith("data:") || raw.startsWith("blob:")) {
1309
+ return raw;
1310
+ }
1311
+ return void 0;
1312
+ }
1268
1313
  function buildTelescupVideoURL(id) {
1269
1314
  return `${getApiBase()}/i/v?id=${id}`;
1270
1315
  }
@@ -1299,31 +1344,6 @@ function useTelescupImage(options, lang) {
1299
1344
  return { url, meta, loading };
1300
1345
  }
1301
1346
 
1302
- // src/utils/parseAssetId.ts
1303
- var UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
1304
- var UUID_IN_TEXT_REGEX = /[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i;
1305
- var isUuid = (value) => {
1306
- if (typeof value !== "string") return false;
1307
- return UUID_REGEX.test(value.trim());
1308
- };
1309
- function parseAssetId(input) {
1310
- var _a65, _b5, _c, _d;
1311
- const raw = input == null ? void 0 : input.trim();
1312
- if (!raw) return void 0;
1313
- if (UUID_REGEX.test(raw)) return raw;
1314
- const matchFromRaw = (_a65 = raw.match(UUID_IN_TEXT_REGEX)) == null ? void 0 : _a65[0];
1315
- if (isUuid(matchFromRaw)) return matchFromRaw;
1316
- try {
1317
- const url = new URL(raw);
1318
- const queryParamId = (_c = (_b5 = url.searchParams.get("id")) != null ? _b5 : url.searchParams.get("asset_id")) != null ? _c : url.searchParams.get("assetId");
1319
- if (isUuid(queryParamId)) return queryParamId;
1320
- const matchFromPath = (_d = url.pathname.match(UUID_IN_TEXT_REGEX)) == null ? void 0 : _d[0];
1321
- if (isUuid(matchFromPath)) return matchFromPath;
1322
- } catch (e) {
1323
- }
1324
- return void 0;
1325
- }
1326
-
1327
1347
  // src/components/cupcode/DockWrapper.tsx
1328
1348
  var import_jsx_runtime10 = require("react/jsx-runtime");
1329
1349
  var getImageUrl = (rawId, width = 60, height = 60, format = "avif", quality = 60) => {
@@ -2675,9 +2695,54 @@ var NavbarCupcode = ({
2675
2695
  className
2676
2696
  }) => {
2677
2697
  const [isOpen, setIsOpen] = React10.useState(false);
2698
+ const navRef = React10.useRef(null);
2699
+ const mobileMenuId = React10.useId();
2700
+ React10.useEffect(() => {
2701
+ if (!isOpen) return;
2702
+ const handlePointerDown = (event) => {
2703
+ var _a65;
2704
+ const target = event.target;
2705
+ if (!(target instanceof Node)) return;
2706
+ if (!((_a65 = navRef.current) == null ? void 0 : _a65.contains(target))) {
2707
+ setIsOpen(false);
2708
+ }
2709
+ };
2710
+ const handleEscape = (event) => {
2711
+ if (event.key === "Escape") {
2712
+ setIsOpen(false);
2713
+ }
2714
+ };
2715
+ document.addEventListener("pointerdown", handlePointerDown);
2716
+ document.addEventListener("keydown", handleEscape);
2717
+ return () => {
2718
+ document.removeEventListener("pointerdown", handlePointerDown);
2719
+ document.removeEventListener("keydown", handleEscape);
2720
+ };
2721
+ }, [isOpen]);
2722
+ React10.useEffect(() => {
2723
+ if (!isOpen) return;
2724
+ const { style } = document.body;
2725
+ const previousOverflow = style.overflow;
2726
+ style.overflow = "hidden";
2727
+ return () => {
2728
+ style.overflow = previousOverflow;
2729
+ };
2730
+ }, [isOpen]);
2731
+ React10.useEffect(() => {
2732
+ const handleResize = () => {
2733
+ if (window.innerWidth >= 768) {
2734
+ setIsOpen(false);
2735
+ }
2736
+ };
2737
+ window.addEventListener("resize", handleResize);
2738
+ return () => {
2739
+ window.removeEventListener("resize", handleResize);
2740
+ };
2741
+ }, []);
2678
2742
  return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2679
2743
  "nav",
2680
2744
  {
2745
+ ref: navRef,
2681
2746
  className: cn(
2682
2747
  "fixed top-0 left-0 right-0 z-[200] pointer-events-auto",
2683
2748
  "glass border-b border-border",
@@ -2736,38 +2801,49 @@ var NavbarCupcode = ({
2736
2801
  /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2737
2802
  "button",
2738
2803
  {
2804
+ type: "button",
2739
2805
  onClick: () => setIsOpen(!isOpen),
2740
- className: "md:hidden p-2 rounded-lg hover:bg-primary/10 transition-colors",
2741
- children: isOpen ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react5.X, { className: "h-6 w-6 text-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react5.Menu, { className: "h-6 w-6 text-foreground" })
2806
+ "aria-controls": mobileMenuId,
2807
+ "aria-expanded": isOpen,
2808
+ "aria-label": isOpen ? "Fechar menu de navega\xE7\xE3o" : "Abrir menu de navega\xE7\xE3o",
2809
+ className: "md:hidden inline-flex h-10 w-10 items-center justify-center rounded-lg transition-colors hover:bg-primary/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40",
2810
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react5.Menu, { className: cn("h-6 w-6 text-foreground", isOpen && "text-primary") })
2742
2811
  }
2743
2812
  )
2744
2813
  ] }),
2745
- isOpen && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "md:hidden py-4 space-y-3 animate-slide-up", children: [
2746
- items.map((item, index) => {
2747
- const key = `${item.label}-${index}`;
2748
- const isActive = item.isActive;
2749
- const classes = cn(
2750
- "flex items-center gap-2 px-4 py-2 text-sm font-semibold text-foreground hover:bg-primary/10 rounded-lg transition-colors",
2751
- isActive && "text-primary"
2752
- );
2753
- const handleClick = (event) => {
2754
- var _a65;
2755
- (_a65 = item.onClick) == null ? void 0 : _a65.call(item, event);
2756
- setIsOpen(false);
2757
- };
2758
- if (item.href.startsWith("#")) {
2759
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("a", { href: item.href, className: classes, onClick: handleClick, children: [
2760
- item.icon && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { children: item.icon }),
2761
- item.label
2762
- ] }, key);
2763
- }
2764
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("a", { href: item.href, className: classes, onClick: handleClick, children: [
2765
- item.icon && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { children: item.icon }),
2766
- item.label
2767
- ] }, key);
2768
- }),
2769
- actions && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "px-4 pt-2", children: actions })
2770
- ] })
2814
+ isOpen && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
2815
+ "div",
2816
+ {
2817
+ id: mobileMenuId,
2818
+ className: "md:hidden max-h-[calc(100dvh-4rem)] space-y-3 overflow-y-auto border-t border-border/60 py-4 animate-slide-up",
2819
+ children: [
2820
+ items.map((item, index) => {
2821
+ const key = `${item.label}-${index}`;
2822
+ const isActive = item.isActive;
2823
+ const classes = cn(
2824
+ "flex min-h-11 items-center gap-2 rounded-lg px-4 py-2.5 text-sm font-semibold text-foreground transition-colors hover:bg-primary/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40",
2825
+ isActive && "text-primary"
2826
+ );
2827
+ const handleClick = (event) => {
2828
+ var _a65;
2829
+ (_a65 = item.onClick) == null ? void 0 : _a65.call(item, event);
2830
+ setIsOpen(false);
2831
+ };
2832
+ if (item.href.startsWith("#")) {
2833
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("a", { href: item.href, className: classes, onClick: handleClick, children: [
2834
+ item.icon && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { children: item.icon }),
2835
+ item.label
2836
+ ] }, key);
2837
+ }
2838
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("a", { href: item.href, className: classes, onClick: handleClick, children: [
2839
+ item.icon && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { children: item.icon }),
2840
+ item.label
2841
+ ] }, key);
2842
+ }),
2843
+ actions && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "px-4 pb-[max(env(safe-area-inset-bottom),0.5rem)] pt-2", children: actions })
2844
+ ]
2845
+ }
2846
+ )
2771
2847
  ] })
2772
2848
  }
2773
2849
  );
@@ -6680,21 +6756,13 @@ var extractSharedFilesFromMessages = (messages) => {
6680
6756
  };
6681
6757
  var resolveTelescupImageUrl = (value, options) => {
6682
6758
  var _a65, _b5, _c;
6683
- const width = (_a65 = options == null ? void 0 : options.width) != null ? _a65 : 96;
6684
- const height = (_b5 = options == null ? void 0 : options.height) != null ? _b5 : 96;
6685
- const quality = (_c = options == null ? void 0 : options.quality) != null ? _c : 72;
6686
- const raw = value == null ? void 0 : value.trim();
6687
- if (!raw) return void 0;
6688
- if (raw.startsWith("http://") || raw.startsWith("https://") || raw.startsWith("data:") || raw.startsWith("blob:")) {
6689
- const parsedId2 = parseAssetId(raw);
6690
- if (parsedId2) {
6691
- return buildTelescupImageURL({ id: parsedId2, width, height, fit: "cover", format: "avif", quality });
6692
- }
6693
- return raw;
6694
- }
6695
- const parsedId = parseAssetId(raw);
6696
- if (!parsedId) return void 0;
6697
- return buildTelescupImageURL({ id: parsedId, width, height, fit: "cover", format: "avif", quality });
6759
+ return resolveTelescupImageURL(value, {
6760
+ width: (_a65 = options == null ? void 0 : options.width) != null ? _a65 : 96,
6761
+ height: (_b5 = options == null ? void 0 : options.height) != null ? _b5 : 96,
6762
+ fit: "cover",
6763
+ format: "avif",
6764
+ quality: (_c = options == null ? void 0 : options.quality) != null ? _c : 72
6765
+ });
6698
6766
  };
6699
6767
  var resolveGroupAvatarFromTelescup = (asset, fallbackId) => {
6700
6768
  var _a65, _b5;
@@ -10118,7 +10186,7 @@ var UserMenuCupcode = ({
10118
10186
  type: "button",
10119
10187
  onClick: () => openChatPanel(),
10120
10188
  className: cn(
10121
- "relative z-0 inline-flex h-9 min-w-[2.55rem] origin-right items-center justify-center rounded-[12px] border border-border/70 bg-background/80 px-2.5 text-foreground shadow-[0_10px_22px_-18px_rgba(0,0,0,0.75)] transition-[transform,opacity] duration-[260ms] will-change-transform",
10189
+ "relative z-0 inline-flex h-9 min-w-[2.55rem] origin-right items-center justify-center rounded-[12px] border border-border/70 bg-background/80 px-2.5 text-foreground shadow-[0_10px_22px_-18px_rgba(0,0,0,0.75)] transition-[transform,opacity] [transition-duration:260ms] will-change-transform",
10122
10190
  prefersReducedMotion ? isChatIndicatorVisible ? "opacity-100" : "opacity-0" : isChatIndicatorVisible ? "translate-x-0 opacity-100" : "translate-x-[10px] opacity-0"
10123
10191
  ),
10124
10192
  style: {
@@ -10131,7 +10199,7 @@ var UserMenuCupcode = ({
10131
10199
  "span",
10132
10200
  {
10133
10201
  className: cn(
10134
- "relative inline-flex transition-[transform,opacity] duration-[220ms]",
10202
+ "relative inline-flex transition-[transform,opacity] [transition-duration:220ms]",
10135
10203
  prefersReducedMotion ? isChatIndicatorVisible ? "scale-100 opacity-100" : "scale-100 opacity-0" : isChatIndicatorVisible ? isChatIndicatorIntroAnimating ? "scale-[1.08] opacity-100" : "scale-100 opacity-100" : "scale-[0.84] opacity-0"
10136
10204
  ),
10137
10205
  style: {
@@ -10144,7 +10212,7 @@ var UserMenuCupcode = ({
10144
10212
  "span",
10145
10213
  {
10146
10214
  className: cn(
10147
- "absolute -right-1 -top-1 inline-flex h-4 min-w-[1rem] items-center justify-center rounded-full border border-background bg-destructive px-1 text-[9px] font-bold text-destructive-foreground transition-[transform,opacity] duration-[180ms]",
10215
+ "absolute -right-1 -top-1 inline-flex h-4 min-w-[1rem] items-center justify-center rounded-full border border-background bg-destructive px-1 text-[9px] font-bold text-destructive-foreground transition-[transform,opacity] [transition-duration:180ms]",
10148
10216
  prefersReducedMotion ? isChatIndicatorVisible ? "scale-100 opacity-100" : "scale-100 opacity-0" : isChatIndicatorVisible ? isChatBadgePulsing ? "scale-[1.14] opacity-100" : "scale-100 opacity-100" : "scale-[0.72] opacity-0"
10149
10217
  ),
10150
10218
  style: {
@@ -22507,8 +22575,22 @@ var buildHandle2 = (value, email, fallbackId) => {
22507
22575
  var resolveCurrentUserId = (user) => {
22508
22576
  const sub = toStringOrUndefined(user == null ? void 0 : user.sub);
22509
22577
  if (sub) return sub;
22578
+ const id = toStringOrUndefined(user == null ? void 0 : user.id);
22579
+ if (id) return id;
22580
+ const userId = toStringOrUndefined(user == null ? void 0 : user.userId);
22581
+ if (userId) return userId;
22510
22582
  return null;
22511
22583
  };
22584
+ var resolveUserIdFromClaims = (claims) => {
22585
+ var _a65, _b5, _c, _d, _e;
22586
+ return (_e = (_d = (_c = (_b5 = (_a65 = toStringOrUndefined(claims.sub)) != null ? _a65 : toStringOrUndefined(claims.user_id)) != null ? _b5 : toStringOrUndefined(claims.userId)) != null ? _c : toStringOrUndefined(claims.uid)) != null ? _d : toStringOrUndefined(claims.id)) != null ? _e : toStringOrUndefined(claims["https://cupcode.com/user_id"]);
22587
+ };
22588
+ var resolveEmailFromClaims = (claims) => {
22589
+ var _a65, _b5;
22590
+ const candidate = (_b5 = (_a65 = toStringOrUndefined(claims.email)) != null ? _a65 : toStringOrUndefined(claims["https://cupcode.com/email"])) != null ? _b5 : toStringOrUndefined(claims.preferred_username);
22591
+ if (!candidate || !candidate.includes("@")) return void 0;
22592
+ return candidate.toLowerCase();
22593
+ };
22512
22594
  var formatMessageTime = (rawTimestamp) => {
22513
22595
  if (!rawTimestamp) return "";
22514
22596
  const parsed = new Date(rawTimestamp);
@@ -22516,18 +22598,7 @@ var formatMessageTime = (rawTimestamp) => {
22516
22598
  return parsed.toLocaleTimeString("pt-BR", { hour: "2-digit", minute: "2-digit" });
22517
22599
  };
22518
22600
  var resolveChatAvatarUrl = (value) => {
22519
- const raw = toStringOrUndefined(value);
22520
- if (!raw) return void 0;
22521
- if (raw.startsWith("http://") || raw.startsWith("https://") || raw.startsWith("data:") || raw.startsWith("blob:")) {
22522
- const parsedId2 = parseAssetId(raw);
22523
- if (parsedId2) {
22524
- return buildTelescupImageURL({ id: parsedId2, width: 72, height: 72, fit: "cover", format: "avif", quality: 70 });
22525
- }
22526
- return raw;
22527
- }
22528
- const parsedId = parseAssetId(raw);
22529
- if (!parsedId) return void 0;
22530
- return buildTelescupImageURL({ id: parsedId, width: 72, height: 72, fit: "cover", format: "avif", quality: 70 });
22601
+ return resolveTelescupImageURL(value, { width: 72, height: 72, fit: "cover", format: "avif", quality: 70 });
22531
22602
  };
22532
22603
  var isGenericRecord = (value) => typeof value === "object" && value !== null;
22533
22604
  var buildExternalUrl = (baseUrl, target) => {
@@ -22773,7 +22844,7 @@ var MainNavbar = ({
22773
22844
  ctaHref = "/login",
22774
22845
  pathname,
22775
22846
  onNavigate,
22776
- authStatus = "unauthenticated",
22847
+ authStatus,
22777
22848
  authUser,
22778
22849
  presenceStatus,
22779
22850
  onPresenceStatusChange,
@@ -22790,6 +22861,8 @@ var MainNavbar = ({
22790
22861
  const [isChatSending, setIsChatSending] = (0, import_react19.useState)(false);
22791
22862
  const [chatError, setChatError] = (0, import_react19.useState)(null);
22792
22863
  const [resolvedSenderId, setResolvedSenderId] = (0, import_react19.useState)(null);
22864
+ const [tokenDerivedUserId, setTokenDerivedUserId] = (0, import_react19.useState)(null);
22865
+ const [tokenDerivedEmail, setTokenDerivedEmail] = (0, import_react19.useState)(void 0);
22793
22866
  const [persistedProfileAvatarValue, setPersistedProfileAvatarValue] = (0, import_react19.useState)(void 0);
22794
22867
  const [accountsLanguage, setAccountsLanguage] = (0, import_react19.useState)("pt-BR");
22795
22868
  const [accountsRecentActivity, setAccountsRecentActivity] = (0, import_react19.useState)([]);
@@ -22809,8 +22882,17 @@ var MainNavbar = ({
22809
22882
  if (typeof window !== "undefined") return window.location.pathname || "/";
22810
22883
  return "/";
22811
22884
  }, [pathname]);
22812
- const currentUserId = (0, import_react19.useMemo)(() => resolveCurrentUserId(authUser), [authUser]);
22813
- const authEmail = (0, import_react19.useMemo)(() => toStringOrUndefined(authUser == null ? void 0 : authUser.email), [authUser == null ? void 0 : authUser.email]);
22885
+ const currentUserId = (0, import_react19.useMemo)(() => {
22886
+ var _a66;
22887
+ return (_a66 = resolveCurrentUserId(authUser)) != null ? _a66 : tokenDerivedUserId;
22888
+ }, [authUser, tokenDerivedUserId]);
22889
+ const authEmail = (0, import_react19.useMemo)(
22890
+ () => {
22891
+ var _a66, _b6;
22892
+ return (_b6 = (_a66 = toStringOrUndefined(authUser == null ? void 0 : authUser.email)) == null ? void 0 : _a66.toLowerCase()) != null ? _b6 : tokenDerivedEmail;
22893
+ },
22894
+ [authUser == null ? void 0 : authUser.email, tokenDerivedEmail]
22895
+ );
22814
22896
  const isChatSuperAdmin = (0, import_react19.useMemo)(() => {
22815
22897
  var _a66, _b6;
22816
22898
  const roleTokens = `${(_a66 = authUser == null ? void 0 : authUser.role) != null ? _a66 : ""} ${(_b6 = authUser == null ? void 0 : authUser.jobTitle) != null ? _b6 : ""}`.toLowerCase();
@@ -22824,7 +22906,77 @@ var MainNavbar = ({
22824
22906
  }, []);
22825
22907
  const resolvedProfileAvatarUrl = (_b5 = (_a65 = resolveChatAvatarUrl(persistedProfileAvatarValue)) != null ? _a65 : authUser == null ? void 0 : authUser.picture) != null ? _b5 : void 0;
22826
22908
  const effectiveCurrentUserId = resolvedSenderId != null ? resolvedSenderId : currentUserId;
22827
- const isAuthenticated = authStatus === "authenticated";
22909
+ const hasStoredAccessToken = (() => {
22910
+ if (typeof window === "undefined") return false;
22911
+ try {
22912
+ return Boolean(sessionStorage.getItem(ACCESS_TOKEN_STORAGE_KEY));
22913
+ } catch (e) {
22914
+ return false;
22915
+ }
22916
+ })();
22917
+ const resolvedAuthStatus = (0, import_react19.useMemo)(() => {
22918
+ if (authStatus) return authStatus;
22919
+ if ((authUser == null ? void 0 : authUser.sub) || (authUser == null ? void 0 : authUser.id) || (authUser == null ? void 0 : authUser.userId) || (authUser == null ? void 0 : authUser.email)) {
22920
+ return "authenticated";
22921
+ }
22922
+ if (tokenDerivedUserId || tokenDerivedEmail || hasStoredAccessToken) {
22923
+ return "authenticated";
22924
+ }
22925
+ return "unauthenticated";
22926
+ }, [
22927
+ authStatus,
22928
+ authUser == null ? void 0 : authUser.email,
22929
+ authUser == null ? void 0 : authUser.id,
22930
+ authUser == null ? void 0 : authUser.sub,
22931
+ authUser == null ? void 0 : authUser.userId,
22932
+ hasStoredAccessToken,
22933
+ tokenDerivedEmail,
22934
+ tokenDerivedUserId
22935
+ ]);
22936
+ const isAuthenticated = resolvedAuthStatus === "authenticated";
22937
+ (0, import_react19.useEffect)(() => {
22938
+ if (authStatus === "unauthenticated") {
22939
+ setTokenDerivedUserId(null);
22940
+ setTokenDerivedEmail(void 0);
22941
+ return;
22942
+ }
22943
+ let canceled = false;
22944
+ const resolveIdentityFromToken = async () => {
22945
+ var _a66, _b6;
22946
+ try {
22947
+ let token = null;
22948
+ if (typeof window !== "undefined") {
22949
+ try {
22950
+ token = sessionStorage.getItem(ACCESS_TOKEN_STORAGE_KEY);
22951
+ } catch (e) {
22952
+ token = null;
22953
+ }
22954
+ }
22955
+ if (!token && getAccessToken) {
22956
+ token = await getAccessToken();
22957
+ }
22958
+ if (!token) {
22959
+ if (!canceled) {
22960
+ setTokenDerivedUserId(null);
22961
+ setTokenDerivedEmail(void 0);
22962
+ }
22963
+ return;
22964
+ }
22965
+ const claims = (_a66 = decodeJwt(token)) != null ? _a66 : {};
22966
+ if (canceled) return;
22967
+ setTokenDerivedUserId((_b6 = resolveUserIdFromClaims(claims)) != null ? _b6 : null);
22968
+ setTokenDerivedEmail(resolveEmailFromClaims(claims));
22969
+ } catch (error) {
22970
+ if (isRuntimeDev()) {
22971
+ console.warn("[chat] Falha ao resolver identidade via access token:", error.message);
22972
+ }
22973
+ }
22974
+ };
22975
+ void resolveIdentityFromToken();
22976
+ return () => {
22977
+ canceled = true;
22978
+ };
22979
+ }, [authStatus, getAccessToken]);
22828
22980
  (0, import_react19.useEffect)(() => {
22829
22981
  if (!isAuthenticated) {
22830
22982
  setResolvedSenderId(null);
@@ -24185,8 +24337,8 @@ var MainNavbar = ({
24185
24337
  actions: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
24186
24338
  UserMenuCupcode,
24187
24339
  {
24188
- isAuthenticated: authStatus === "authenticated",
24189
- isLoading: authStatus === "loading",
24340
+ isAuthenticated: resolvedAuthStatus === "authenticated",
24341
+ isLoading: resolvedAuthStatus === "loading",
24190
24342
  loginLabel: ctaLabel,
24191
24343
  displayName: authUser == null ? void 0 : authUser.name,
24192
24344
  username: (_c = authUser == null ? void 0 : authUser.preferredUsername) != null ? _c : authUser == null ? void 0 : authUser.nickname,
@@ -26363,14 +26515,31 @@ var sheetVariants = (0, import_class_variance_authority6.cva)(
26363
26515
  }
26364
26516
  );
26365
26517
  var SheetContent = React56.forwardRef(
26366
- ({ side = "right", className, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(SheetPortal, { children: [
26518
+ ({
26519
+ side = "right",
26520
+ className,
26521
+ children,
26522
+ showCloseButton = false,
26523
+ closeButtonClassName,
26524
+ closeButtonLabel = "Close",
26525
+ ...props
26526
+ }, ref) => /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(SheetPortal, { children: [
26367
26527
  /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(SheetOverlay, {}),
26368
26528
  /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(SheetPrimitive.Content, { ref, className: cn(sheetVariants({ side }), className), ...props, children: [
26369
26529
  children,
26370
- /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(SheetPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-secondary hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none", children: [
26371
- /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(import_lucide_react28.X, { className: "h-4 w-4" }),
26372
- /* @__PURE__ */ (0, import_jsx_runtime79.jsx)("span", { className: "sr-only", children: "Close" })
26373
- ] })
26530
+ showCloseButton ? /* @__PURE__ */ (0, import_jsx_runtime79.jsxs)(
26531
+ SheetPrimitive.Close,
26532
+ {
26533
+ className: cn(
26534
+ "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-secondary hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none",
26535
+ closeButtonClassName
26536
+ ),
26537
+ children: [
26538
+ /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(import_lucide_react28.X, { className: "h-4 w-4" }),
26539
+ /* @__PURE__ */ (0, import_jsx_runtime79.jsx)("span", { className: "sr-only", children: closeButtonLabel })
26540
+ ]
26541
+ }
26542
+ ) : null
26374
26543
  ] })
26375
26544
  ] })
26376
26545
  );
@@ -26501,7 +26670,7 @@ var Sidebar = React58.forwardRef(({ side = "left", variant = "sidebar", collapsi
26501
26670
  {
26502
26671
  "data-sidebar": "sidebar",
26503
26672
  "data-mobile": "true",
26504
- className: "w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden",
26673
+ className: "w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground",
26505
26674
  style: {
26506
26675
  "--sidebar-width": SIDEBAR_WIDTH_MOBILE
26507
26676
  },
@@ -27968,6 +28137,7 @@ var useAuth = () => {
27968
28137
  parseAssetId,
27969
28138
  reducer,
27970
28139
  resolveOidcEndpoints,
28140
+ resolveTelescupImageURL,
27971
28141
  responsiveSizeClasses,
27972
28142
  setCupcodeRuntimeEnv,
27973
28143
  sonnerToast,
package/dist/index.d.cts CHANGED
@@ -442,6 +442,8 @@ declare const UserMenuCupcode: React.FC<UserMenuCupcodeProps>;
442
442
  type MainNavbarAuthStatus = "loading" | "authenticated" | "unauthenticated";
443
443
  type MainNavbarAuthUser = {
444
444
  sub?: string;
445
+ id?: string;
446
+ userId?: string;
445
447
  name?: string;
446
448
  email?: string;
447
449
  picture?: string;
@@ -1308,6 +1310,9 @@ declare const sheetVariants: (props?: ({
1308
1310
  side?: "top" | "right" | "bottom" | "left" | null | undefined;
1309
1311
  } & class_variance_authority_types.ClassProp) | undefined) => string;
1310
1312
  interface SheetContentProps extends React$1.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>, VariantProps<typeof sheetVariants> {
1313
+ showCloseButton?: boolean;
1314
+ closeButtonClassName?: string;
1315
+ closeButtonLabel?: string;
1311
1316
  }
1312
1317
  declare const SheetContent: React$1.ForwardRefExoticComponent<SheetContentProps & React$1.RefAttributes<HTMLDivElement>>;
1313
1318
  declare const SheetHeader: {
@@ -1598,7 +1603,9 @@ interface TelescupMeta {
1598
1603
  title?: string;
1599
1604
  description?: string;
1600
1605
  }
1606
+ type ResolveTelescupImageOptions = Omit<TelescupImageOptions, "id">;
1601
1607
  declare function buildTelescupImageURL(options: TelescupImageOptions): string;
1608
+ declare function resolveTelescupImageURL(value?: string, options?: ResolveTelescupImageOptions): string | undefined;
1602
1609
  declare function buildTelescupVideoURL(id: string): string;
1603
1610
  declare function useTelescupMeta(id: string, lang?: string): {
1604
1611
  meta: TelescupMeta;
@@ -1696,4 +1703,4 @@ declare const getRuntimeEnv: (key: string) => string | undefined;
1696
1703
  declare const getRuntimeEnvOr: (key: string, fallback: string) => string;
1697
1704
  declare const isRuntimeDev: () => boolean;
1698
1705
 
1699
- export { Accordion, AccordionContent, AccordionCupcode, AccordionItem, AccordionTrigger, type AccountsAuthConfig, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, type AuthContextValue, AuthProvider, type AuthStatus, type AuthUser, type UserPresenceStatus as AuthUserPresenceStatus, Avatar, AvatarFallback, AvatarImage, AvatarWithStatus, BackgroundRainbow, BackgroundStars, Badge, type BadgeProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, ButtonProps, Calendar, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardGlass, CardHeader, CardTitle, Checkbox, ChipTag, type ChipTagProps, type ChipVariant, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, AccordionContent$1 as CupcodeAccordionContent, AccordionItem$1 as CupcodeAccordionItem, AccordionTrigger$1 as CupcodeAccordionTrigger, Avatar$1 as CupcodeAvatar, AvatarFallback$1 as CupcodeAvatarFallback, AvatarImage$1 as CupcodeAvatarImage, type StatusType as CupcodeAvatarStatus, Badge$1 as CupcodeBadge, type CupcodeRuntimeEnv, type CupcodeRuntimeEnvValue, Select$1 as CupcodeSelect, SelectContent$1 as CupcodeSelectContent, SelectGroup$1 as CupcodeSelectGroup, SelectItem$1 as CupcodeSelectItem, SelectTrigger$1 as CupcodeSelectTrigger, SelectValue$1 as CupcodeSelectValue, Skeleton$1 as CupcodeSkeleton, type SkeletonProps as CupcodeSkeletonProps, SkeletonText as CupcodeSkeletonText, Switch$1 as CupcodeSwitch, Tabs$1 as CupcodeTabs, TabsContent$1 as CupcodeTabsContent, TabsList$1 as CupcodeTabsList, TabsTrigger$1 as CupcodeTabsTrigger, TooltipContent$1 as CupcodeTooltipContent, TooltipProvider$1 as CupcodeTooltipProvider, TooltipTrigger$1 as CupcodeTooltipTrigger, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Dock, type DockButton, type DockCard, type DockCategory, type DockItem, type DockProps, DockWrapper, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, type EnqueueResult, ErrorBoundary, Eyebrow, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HeroTitle, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputField, type InputFieldProps, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, JellyButton, JellyButtonOriginal, type JellyButtonOriginalProps, Label, LoadingScreen, LoadingSpinner, type LoadingSpinnerProps, MainNavbar, type MainNavbarAuthUser, type MainNavbarProps, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Modal, ModalClose, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle, ModalTrigger, type NavItem, NavbarCupcode, type NavbarCupcodeProps, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, ParticleSystem, Popover, PopoverContent, PopoverTrigger, PricingCard, Progress, ProgressCupcode, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, type ResponsiveSize, ScrollArea, ScrollBar, ScrollbarArea, type ScrollbarAreaProps, type ScrollbarColor, type ScrollbarThemeMode, ScrollbarThemeProvider, type ScrollbarThemeProviderProps, Select, SelectContent, SelectField, type SelectFieldProps, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Toaster$1 as SonnerToaster, type StatusType, Switch, SwitchField, type SwitchFieldProps, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagGroup, type TagGroupProps, type TelescupAsset, TelescupAssetPicker, type TelescupAssetPickerProps, type TelescupClient, type TelescupClientConfig, TelescupClientError, type TelescupFilters, TelescupImage, type TelescupLanguage, type TelescupMeta$1 as TelescupMeta, TelescupUpload, type TelescupUploadLabels, type TelescupUploadProps, TelescupUploader, type TelescupUploaderProps, TelescupVideo, Textarea, TextareaField, type TextareaFieldProps, type TextareaProps, ThemeToggle, Timeline, Toast$1 as Toast, ToastAction, type ToastActionElement, ToastClose, ToastCupcode, type ToastCupcodeProps, ToastDescription, type ToastProps, ToastProvider, ToastTitle, type ToastVariant, ToastViewport, Toaster, Toggle, ToggleGroup, ToggleGroupItem, type TokenResponse, Tooltip, TooltipContent, TooltipCupcode, TooltipProvider, TooltipTrigger, type UploadConflictPolicy, type UploadPolicy, type UploadQueueItem, type UploadQueueStatus, type UseTelescupAssetsOptions, type UseTelescupUploadQueueOptions, type UserMenuChatMessage, type UserMenuChatMessageLog, type UserMenuChatOpenRequest, type UserMenuChatReaction, type UserMenuChatUser, UserMenuCupcode, type UserMenuCupcodeProps, type UserMenuLanguage, type UserMenuNotification, type UserMenuNotificationKind, type UserMenuRecentActivity, type UserMenuTabId, type UserPresenceStatus$1 as UserPresenceStatus, badgeVariants, buildAuthorizeUrl, buildLogoutUrl, buildTelescupImageURL, buildTelescupVideoURL, cn, createTelescupClient, decodeJwt, exchangeCodeForToken, generateCodeChallenge, generateCodeVerifier, generateNonce, generateState, getAccountsConfig, getMainNavItems, getRuntimeEnv, getRuntimeEnvOr, getSupabase, getSupabasePublic, isRuntimeDev, navigationMenuTriggerStyle, parseAssetId, reducer, resolveOidcEndpoints, responsiveSizeClasses, setCupcodeRuntimeEnv, toast, toggleVariants, useActiveSection, useAuth, useBreakpoint, useFormField, useIsMobile, useSidebar, useTelescupAssets, useTelescupImage, useTelescupMeta, useTelescupUploadQueue, useToast };
1706
+ export { Accordion, AccordionContent, AccordionCupcode, AccordionItem, AccordionTrigger, type AccountsAuthConfig, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AspectRatio, type AuthContextValue, AuthProvider, type AuthStatus, type AuthUser, type UserPresenceStatus as AuthUserPresenceStatus, Avatar, AvatarFallback, AvatarImage, AvatarWithStatus, BackgroundRainbow, BackgroundStars, Badge, type BadgeProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, ButtonProps, Calendar, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardGlass, CardHeader, CardTitle, Checkbox, ChipTag, type ChipTagProps, type ChipVariant, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, AccordionContent$1 as CupcodeAccordionContent, AccordionItem$1 as CupcodeAccordionItem, AccordionTrigger$1 as CupcodeAccordionTrigger, Avatar$1 as CupcodeAvatar, AvatarFallback$1 as CupcodeAvatarFallback, AvatarImage$1 as CupcodeAvatarImage, type StatusType as CupcodeAvatarStatus, Badge$1 as CupcodeBadge, type CupcodeRuntimeEnv, type CupcodeRuntimeEnvValue, Select$1 as CupcodeSelect, SelectContent$1 as CupcodeSelectContent, SelectGroup$1 as CupcodeSelectGroup, SelectItem$1 as CupcodeSelectItem, SelectTrigger$1 as CupcodeSelectTrigger, SelectValue$1 as CupcodeSelectValue, Skeleton$1 as CupcodeSkeleton, type SkeletonProps as CupcodeSkeletonProps, SkeletonText as CupcodeSkeletonText, Switch$1 as CupcodeSwitch, Tabs$1 as CupcodeTabs, TabsContent$1 as CupcodeTabsContent, TabsList$1 as CupcodeTabsList, TabsTrigger$1 as CupcodeTabsTrigger, TooltipContent$1 as CupcodeTooltipContent, TooltipProvider$1 as CupcodeTooltipProvider, TooltipTrigger$1 as CupcodeTooltipTrigger, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Dock, type DockButton, type DockCard, type DockCategory, type DockItem, type DockProps, DockWrapper, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, type EnqueueResult, ErrorBoundary, Eyebrow, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HeroTitle, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputField, type InputFieldProps, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, JellyButton, JellyButtonOriginal, type JellyButtonOriginalProps, Label, LoadingScreen, LoadingSpinner, type LoadingSpinnerProps, MainNavbar, type MainNavbarAuthUser, type MainNavbarProps, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, Modal, ModalClose, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle, ModalTrigger, type NavItem, NavbarCupcode, type NavbarCupcodeProps, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, ParticleSystem, Popover, PopoverContent, PopoverTrigger, PricingCard, Progress, ProgressCupcode, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, type ResolveTelescupImageOptions, type ResponsiveSize, ScrollArea, ScrollBar, ScrollbarArea, type ScrollbarAreaProps, type ScrollbarColor, type ScrollbarThemeMode, ScrollbarThemeProvider, type ScrollbarThemeProviderProps, Select, SelectContent, SelectField, type SelectFieldProps, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Toaster$1 as SonnerToaster, type StatusType, Switch, SwitchField, type SwitchFieldProps, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagGroup, type TagGroupProps, type TelescupAsset, TelescupAssetPicker, type TelescupAssetPickerProps, type TelescupClient, type TelescupClientConfig, TelescupClientError, type TelescupFilters, TelescupImage, type TelescupLanguage, type TelescupMeta$1 as TelescupMeta, TelescupUpload, type TelescupUploadLabels, type TelescupUploadProps, TelescupUploader, type TelescupUploaderProps, TelescupVideo, Textarea, TextareaField, type TextareaFieldProps, type TextareaProps, ThemeToggle, Timeline, Toast$1 as Toast, ToastAction, type ToastActionElement, ToastClose, ToastCupcode, type ToastCupcodeProps, ToastDescription, type ToastProps, ToastProvider, ToastTitle, type ToastVariant, ToastViewport, Toaster, Toggle, ToggleGroup, ToggleGroupItem, type TokenResponse, Tooltip, TooltipContent, TooltipCupcode, TooltipProvider, TooltipTrigger, type UploadConflictPolicy, type UploadPolicy, type UploadQueueItem, type UploadQueueStatus, type UseTelescupAssetsOptions, type UseTelescupUploadQueueOptions, type UserMenuChatMessage, type UserMenuChatMessageLog, type UserMenuChatOpenRequest, type UserMenuChatReaction, type UserMenuChatUser, UserMenuCupcode, type UserMenuCupcodeProps, type UserMenuLanguage, type UserMenuNotification, type UserMenuNotificationKind, type UserMenuRecentActivity, type UserMenuTabId, type UserPresenceStatus$1 as UserPresenceStatus, badgeVariants, buildAuthorizeUrl, buildLogoutUrl, buildTelescupImageURL, buildTelescupVideoURL, cn, createTelescupClient, decodeJwt, exchangeCodeForToken, generateCodeChallenge, generateCodeVerifier, generateNonce, generateState, getAccountsConfig, getMainNavItems, getRuntimeEnv, getRuntimeEnvOr, getSupabase, getSupabasePublic, isRuntimeDev, navigationMenuTriggerStyle, parseAssetId, reducer, resolveOidcEndpoints, resolveTelescupImageURL, responsiveSizeClasses, setCupcodeRuntimeEnv, toast, toggleVariants, useActiveSection, useAuth, useBreakpoint, useFormField, useIsMobile, useSidebar, useTelescupAssets, useTelescupImage, useTelescupMeta, useTelescupUploadQueue, useToast };