@ciridae/ui 1.0.2 → 1.0.3

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 (140) hide show
  1. package/dist/app/auth.d.ts +10 -0
  2. package/dist/app/auth.js +60 -0
  3. package/dist/app/error-boundary.d.ts +18 -0
  4. package/dist/app/error-boundary.js +45 -0
  5. package/dist/app/feedback.d.ts +12 -0
  6. package/dist/app/feedback.js +128 -0
  7. package/dist/app/index.d.ts +8 -0
  8. package/dist/app/index.js +8 -0
  9. package/dist/app/request-errors.d.ts +63 -0
  10. package/dist/app/request-errors.js +172 -0
  11. package/dist/app/sentry.d.ts +18 -0
  12. package/dist/app/sentry.js +52 -0
  13. package/dist/app/telemetry.d.ts +7 -0
  14. package/dist/app/telemetry.js +28 -0
  15. package/dist/app/trail.d.ts +9 -0
  16. package/dist/app/trail.js +18 -0
  17. package/dist/chat/chat-query-keys.d.ts +3 -3
  18. package/dist/chat/contract.d.ts +15 -15
  19. package/dist/chat/conversation-items-query-options.d.ts +114 -114
  20. package/dist/chat/conversation-source.d.ts +75 -0
  21. package/dist/chat/conversation-source.js +1 -0
  22. package/dist/chat/message-text.d.ts +1 -1
  23. package/dist/chat/message-text.js +114 -46
  24. package/dist/chat/use-conversation-list.d.ts +6 -6
  25. package/dist/components/activity-feed.d.ts +2 -2
  26. package/dist/components/agent-work.d.ts +3 -3
  27. package/dist/components/app-frame.d.ts +79 -0
  28. package/dist/components/app-frame.js +92 -0
  29. package/dist/components/app-navigation.d.ts +3 -3
  30. package/dist/components/badge.d.ts +1 -1
  31. package/dist/components/brand-icons.d.ts +3 -3
  32. package/dist/components/bulk-action-bar.d.ts +1 -1
  33. package/dist/components/button.d.ts +4 -4
  34. package/dist/components/calendar.d.ts +1 -1
  35. package/dist/components/centered-page.d.ts +1 -1
  36. package/dist/components/chart.d.ts +22 -2
  37. package/dist/components/chart.js +239 -44
  38. package/dist/components/chat-client-source.d.ts +16 -0
  39. package/dist/components/chat-client-source.js +256 -0
  40. package/dist/components/chat-page.d.ts +9 -8
  41. package/dist/components/chat-page.js +7 -11
  42. package/dist/components/chat-sheet-controller.d.ts +10 -14
  43. package/dist/components/chat-sheet-controller.js +2 -3
  44. package/dist/components/chat-sheet.d.ts +10 -11
  45. package/dist/components/chat-sheet.js +135 -273
  46. package/dist/components/chat.d.ts +22 -8
  47. package/dist/components/chat.js +128 -33
  48. package/dist/components/checkbox-item.d.ts +1 -1
  49. package/dist/components/checkbox-list.d.ts +1 -1
  50. package/dist/components/chip.d.ts +1 -1
  51. package/dist/components/collapsible.d.ts +1 -1
  52. package/dist/components/color-theme.d.ts +1 -1
  53. package/dist/components/column-settings.d.ts +1 -1
  54. package/dist/components/command-menu.d.ts +1 -1
  55. package/dist/components/command-palette.d.ts +3 -3
  56. package/dist/components/command-palette.js +1 -2
  57. package/dist/components/copyable-id.d.ts +22 -5
  58. package/dist/components/copyable-id.js +46 -6
  59. package/dist/components/data-display.d.ts +4 -4
  60. package/dist/components/data-grid.d.ts +10 -10
  61. package/dist/components/date-range-picker.d.ts +1 -1
  62. package/dist/components/date-time.d.ts +1 -1
  63. package/dist/components/dialog-height-context.d.ts +1 -1
  64. package/dist/components/document-viewer.d.ts +2 -2
  65. package/dist/components/drawer.d.ts +6 -6
  66. package/dist/components/dropzone.d.ts +4 -4
  67. package/dist/components/editable-field.d.ts +2 -2
  68. package/dist/components/email-input.d.ts +1 -1
  69. package/dist/components/environment-frame.d.ts +1 -1
  70. package/dist/components/expandable-text.d.ts +1 -1
  71. package/dist/components/feedback-screenshot.d.ts +1 -1
  72. package/dist/components/feedback-sheet.d.ts +18 -3
  73. package/dist/components/feedback-sheet.js +216 -55
  74. package/dist/components/field-context.d.ts +1 -1
  75. package/dist/components/filter-bar.d.ts +3 -3
  76. package/dist/components/filter-bar.js +4 -1
  77. package/dist/components/form-controls.d.ts +3 -3
  78. package/dist/components/form-layout.d.ts +7 -7
  79. package/dist/components/hotkeys.d.ts +2 -2
  80. package/dist/components/icon.d.ts +1 -1
  81. package/dist/components/input.d.ts +4 -4
  82. package/dist/components/input.js +3 -2
  83. package/dist/components/keyboard-shortcuts.d.ts +2 -2
  84. package/dist/components/keycap.d.ts +2 -2
  85. package/dist/components/layout.d.ts +13 -13
  86. package/dist/components/lightbox.d.ts +9 -3
  87. package/dist/components/lightbox.js +11 -8
  88. package/dist/components/link.d.ts +1 -1
  89. package/dist/components/locale.d.ts +32 -2
  90. package/dist/components/locale.js +25 -1
  91. package/dist/components/log-list.d.ts +3 -3
  92. package/dist/components/mention-input.d.ts +2 -2
  93. package/dist/components/menu.d.ts +2 -2
  94. package/dist/components/meter.d.ts +1 -1
  95. package/dist/components/navigation.d.ts +2 -2
  96. package/dist/components/notification-tray.d.ts +1 -1
  97. package/dist/components/overlays.d.ts +4 -4
  98. package/dist/components/page-frame.d.ts +4 -4
  99. package/dist/components/panel.d.ts +3 -3
  100. package/dist/components/profile-header.d.ts +1 -1
  101. package/dist/components/progress.d.ts +1 -1
  102. package/dist/components/project-avatar.d.ts +1 -1
  103. package/dist/components/radio-card.d.ts +2 -2
  104. package/dist/components/record.d.ts +4 -4
  105. package/dist/components/resolved-file-url.d.ts +19 -0
  106. package/dist/components/resolved-file-url.js +49 -0
  107. package/dist/components/scroll-area.d.ts +1 -1
  108. package/dist/components/secret-dialog.d.ts +1 -1
  109. package/dist/components/segmented-bar.d.ts +1 -1
  110. package/dist/components/select.d.ts +4 -4
  111. package/dist/components/settings.d.ts +4 -4
  112. package/dist/components/shell-skeleton.d.ts +1 -1
  113. package/dist/components/shell.d.ts +19 -19
  114. package/dist/components/shell.js +3 -1
  115. package/dist/components/side-panel.d.ts +3 -3
  116. package/dist/components/sidebar.d.ts +6 -6
  117. package/dist/components/site-banner.d.ts +1 -1
  118. package/dist/components/skeleton.d.ts +1 -1
  119. package/dist/components/skeletons.d.ts +5 -5
  120. package/dist/components/stages.d.ts +5 -5
  121. package/dist/components/stat-card.d.ts +3 -3
  122. package/dist/components/status-banner.d.ts +1 -1
  123. package/dist/components/status.d.ts +2 -2
  124. package/dist/components/steps.d.ts +1 -1
  125. package/dist/components/switch.d.ts +1 -1
  126. package/dist/components/tabs.d.ts +8 -8
  127. package/dist/components/theme-customizer.d.ts +2 -2
  128. package/dist/components/toast.d.ts +1 -1
  129. package/dist/components/use-new-version-available.d.ts +6 -0
  130. package/dist/components/use-new-version-available.js +29 -0
  131. package/dist/components/user-chip.d.ts +3 -3
  132. package/dist/components/wizard.d.ts +2 -2
  133. package/dist/feedback/contract.d.ts +136 -136
  134. package/dist/feedback/feedback-controller.d.ts +6 -6
  135. package/dist/feedback/generated/zod.gen.d.ts +28 -28
  136. package/dist/feedback/operator-contract.d.ts +11 -11
  137. package/dist/feedback/operator-controller.d.ts +32 -13
  138. package/dist/feedback/operator-controller.js +44 -11
  139. package/dist/styled-system/styles.css +203 -59
  140. package/package.json +32 -3
@@ -9,7 +9,7 @@ export type RadioCardGroupProps = Omit<ComponentProps<typeof BaseRadioGroup>, "d
9
9
  value?: string;
10
10
  onValueChange?: (value: string) => void;
11
11
  };
12
- export declare function RadioCardGroup({ name, label, defaultValue, value, onValueChange, className, ...props }: RadioCardGroupProps): import("@types/react").JSX.Element;
12
+ export declare function RadioCardGroup({ name, label, defaultValue, value, onValueChange, className, ...props }: RadioCardGroupProps): import("react").JSX.Element;
13
13
  export type RadioCardProps = Omit<ComponentProps<typeof BaseRadio.Root>, "children" | "className"> & {
14
14
  value: string;
15
15
  title: ReactNode;
@@ -19,4 +19,4 @@ export type RadioCardProps = Omit<ComponentProps<typeof BaseRadio.Root>, "childr
19
19
  className?: string;
20
20
  };
21
21
  /** One option of a `RadioCardGroup`. */
22
- export declare function RadioCard({ title, detail, source: sourceContent, className, ...props }: RadioCardProps): import("@types/react").JSX.Element;
22
+ export declare function RadioCard({ title, detail, source: sourceContent, className, ...props }: RadioCardProps): import("react").JSX.Element;
@@ -20,7 +20,7 @@ export type DetailLayoutProps = Omit<ComponentProps<"div">, "children"> & {
20
20
  aside: ReactNode;
21
21
  };
22
22
  };
23
- export declare function DetailLayout({ header, main, aside, stackBelow, stickyAside, stacking, tabLabels, className, ...props }: DetailLayoutProps): import("@types/react").JSX.Element;
23
+ export declare function DetailLayout({ header, main, aside, stackBelow, stickyAside, stacking, tabLabels, className, ...props }: DetailLayoutProps): import("react").JSX.Element;
24
24
  /** The record's title row is the page's: `PageHeading`, with `leading`, `badge` and menu `actions`. */
25
25
  export { PageHeading, type PageHeadingProps } from "./page-frame.js";
26
26
  export type RelatedTab = {
@@ -39,7 +39,7 @@ export type RelatedTabsProps = Omit<ComponentProps<typeof TabsRoot>, "children"
39
39
  defaultValue?: string;
40
40
  onValueChange?: (value: string) => void;
41
41
  };
42
- export declare function RelatedTabs({ tabs, value, defaultValue, onValueChange, className, ...props }: RelatedTabsProps): import("@types/react").JSX.Element | null;
42
+ export declare function RelatedTabs({ tabs, value, defaultValue, onValueChange, className, ...props }: RelatedTabsProps): import("react").JSX.Element | null;
43
43
  export type ItemCardField = {
44
44
  label: ReactNode;
45
45
  value: ReactNode;
@@ -63,7 +63,7 @@ export type ItemCardProps = Omit<useRender.ComponentProps<"button">, "children"
63
63
  onSelect?: () => void;
64
64
  href?: string;
65
65
  };
66
- export declare function ItemCard({ title, progress, fields, status, footer, selected, onSelect, href, render, className, style, ...props }: ItemCardProps): import("@types/react").ReactElement<unknown, string | import("@types/react").JSXElementConstructor<any>>;
66
+ export declare function ItemCard({ title, progress, fields, status, footer, selected, onSelect, href, render, className, style, ...props }: ItemCardProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
67
67
  export type RelatedListItem = {
68
68
  id: string;
69
69
  title: ReactNode;
@@ -92,4 +92,4 @@ export type RelatedListProps = Omit<ComponentProps<"div">, "children"> & {
92
92
  /** After the groups, such as a button that links another record. */
93
93
  footer?: ReactNode;
94
94
  };
95
- export declare function RelatedList({ groups, footer, className, ...props }: RelatedListProps): import("@types/react").JSX.Element;
95
+ export declare function RelatedList({ groups, footer, className, ...props }: RelatedListProps): import("react").JSX.Element;
@@ -0,0 +1,19 @@
1
+ /** A file whose bytes load from `url`, or from what the resolver hands back when it has none. */
2
+ export type ResolvableFile = {
3
+ id: string;
4
+ url?: string | null;
5
+ };
6
+ /**
7
+ * Hands back a browser-loadable link for a file without one, such as one served behind a bearer
8
+ * token, which the app downloads and serves from an object URL. Keep the function stable: its
9
+ * links are cached per function and file id, so a redraw does not load the file again.
10
+ */
11
+ export type ResolveFileUrl<File extends ResolvableFile = ResolvableFile> = (file: File) => Promise<string>;
12
+ /**
13
+ * The file's link: its own `url`, else the resolver's once it settles. `state` is `failed` when the
14
+ * resolver rejected, and `pending` while it runs or while `enabled` is false.
15
+ */
16
+ export declare function useResolvedFileUrl<File extends ResolvableFile>(file: File | undefined, resolve: ResolveFileUrl<File> | undefined, enabled?: boolean): {
17
+ url: string | null;
18
+ state: "ready" | "pending" | "failed" | "none";
19
+ };
@@ -0,0 +1,49 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+ const resolvedUrls = new WeakMap();
3
+ function resolveOnce(resolve, file) {
4
+ let cache = resolvedUrls.get(resolve);
5
+ if (!cache) {
6
+ cache = new Map();
7
+ resolvedUrls.set(resolve, cache);
8
+ }
9
+ const cached = cache.get(file.id);
10
+ if (cached)
11
+ return cached;
12
+ const pending = resolve(file);
13
+ cache.set(file.id, pending);
14
+ // A failed load is not kept, so the next look at the file tries again.
15
+ pending.catch(() => cache.delete(file.id));
16
+ return pending;
17
+ }
18
+ /**
19
+ * The file's link: its own `url`, else the resolver's once it settles. `state` is `failed` when the
20
+ * resolver rejected, and `pending` while it runs or while `enabled` is false.
21
+ */
22
+ export function useResolvedFileUrl(file, resolve, enabled = true) {
23
+ const direct = file?.url ?? null;
24
+ const [resolved, setResolved] = useState(null);
25
+ const fileId = file?.id;
26
+ // The file's id names it: a new object for the same file is not a new file to load.
27
+ const fileRef = useRef(file);
28
+ useEffect(() => {
29
+ fileRef.current = file;
30
+ });
31
+ useEffect(() => {
32
+ const file = fileRef.current;
33
+ if (!file || direct || !resolve || !enabled)
34
+ return;
35
+ let current = true;
36
+ resolveOnce(resolve, file).then((url) => current && setResolved({ id: file.id, url, failed: false }), () => current && setResolved({ id: file.id, url: null, failed: true }));
37
+ return () => {
38
+ current = false;
39
+ };
40
+ }, [fileId, direct, resolve, enabled]);
41
+ if (direct)
42
+ return { url: direct, state: "ready" };
43
+ if (!file || !resolve)
44
+ return { url: null, state: "none" };
45
+ const settled = resolved?.id === file.id ? resolved : null;
46
+ if (settled?.url)
47
+ return { url: settled.url, state: "ready" };
48
+ return { url: null, state: settled?.failed ? "failed" : "pending" };
49
+ }
@@ -13,4 +13,4 @@ export declare function ScrollArea({ className, viewportClassName, scrollDirecti
13
13
  scrollDirections?: "vertical" | "vertical-and-horizontal";
14
14
  children: ReactNode;
15
15
  "aria-label"?: string;
16
- }): import("@types/react").JSX.Element;
16
+ }): import("react").JSX.Element;
@@ -7,4 +7,4 @@ export type IssuedSecret = {
7
7
  export declare function OneTimeSecretDialog({ issued, onClose, }: {
8
8
  issued: IssuedSecret | null;
9
9
  onClose: () => void;
10
- }): import("@types/react").JSX.Element;
10
+ }): import("react").JSX.Element;
@@ -20,4 +20,4 @@ export type SegmentedBarProps = Omit<ComponentProps<"div">, "children"> & {
20
20
  /** How a value reads in the legend and a segment's name; the locale's number by default. */
21
21
  formatValue?: (value: number) => string;
22
22
  };
23
- export declare function SegmentedBar({ segments, legend, renderDetail, onSegmentSelect, formatValue, className, ...props }: SegmentedBarProps): import("@types/react").JSX.Element;
23
+ export declare function SegmentedBar({ segments, legend, renderDetail, onSegmentSelect, formatValue, className, ...props }: SegmentedBarProps): import("react").JSX.Element;
@@ -26,12 +26,12 @@ export type SelectProps = {
26
26
  required?: boolean;
27
27
  disabled?: boolean;
28
28
  };
29
- export declare function Select({ options, value, onValueChange, placeholder, label, size: controlSize, variant, name, required, disabled, }: SelectProps): import("@types/react").JSX.Element;
29
+ export declare function Select({ options, value, onValueChange, placeholder, label, size: controlSize, variant, name, required, disabled, }: SelectProps): import("react").JSX.Element;
30
30
  export type SlicerProps = Omit<SelectProps, "size" | "variant" | "placeholder"> & {
31
31
  /** What the slicer filters by, shown muted before the chosen value. */
32
32
  label: string;
33
33
  };
34
- export declare function Slicer({ options, value, onValueChange, label, name, required, disabled, }: SlicerProps): import("@types/react").JSX.Element;
34
+ export declare function Slicer({ options, value, onValueChange, label, name, required, disabled, }: SlicerProps): import("react").JSX.Element;
35
35
  export type ComboboxProps<Option extends SelectOption> = {
36
36
  options: readonly Option[];
37
37
  value?: string;
@@ -69,7 +69,7 @@ export type ComboboxProps<Option extends SelectOption> = {
69
69
  * itself. With `onSearch`, the caller owns the options: typing reports the query once it pauses,
70
70
  * and the list shows whatever `options` the caller passes back, with `loading` while it fetches.
71
71
  */
72
- export declare function Combobox<Option extends SelectOption>({ options, value, onValueChange, placeholder: ownPlaceholder, label: ownLabel, size: controlSize, renderOption, emptyMessage, name, required, disabled, onSearch, loading, defaultOpen, onOpenChange, autoFocus, }: ComboboxProps<Option>): import("@types/react").JSX.Element;
72
+ export declare function Combobox<Option extends SelectOption>({ options, value, onValueChange, placeholder: ownPlaceholder, label: ownLabel, size: controlSize, renderOption, emptyMessage, name, required, disabled, onSearch, loading, defaultOpen, onOpenChange, autoFocus, }: ComboboxProps<Option>): import("react").JSX.Element;
73
73
  export declare function FilterPopover({ label, count, open, onOpenChange, onClear, children, }: {
74
74
  /** The locale's "Filters" by default. */
75
75
  label?: ReactNode;
@@ -81,4 +81,4 @@ export declare function FilterPopover({ label, count, open, onOpenChange, onClea
81
81
  onClear?: () => void;
82
82
  /** The filters, such as compact `Combobox` and `Slicer` pills. */
83
83
  children: ReactNode;
84
- }): import("@types/react").JSX.Element;
84
+ }): import("react").JSX.Element;
@@ -20,15 +20,15 @@ export type SettingsLayoutProps<Value extends string> = Omit<ComponentProps<"div
20
20
  navigation: string;
21
21
  }>;
22
22
  };
23
- export declare function SettingsLayout<Value extends string>({ sections, value, onValueChange, children, labels: ownLabels, className, ...props }: SettingsLayoutProps<Value>): import("@types/react").JSX.Element;
23
+ export declare function SettingsLayout<Value extends string>({ sections, value, onValueChange, children, labels: ownLabels, className, ...props }: SettingsLayoutProps<Value>): import("react").JSX.Element;
24
24
  /** A settings section's single column of panels; the shell header carries the page's title. */
25
- export declare function SettingsColumn({ className, ...props }: ComponentProps<"div">): import("@types/react").JSX.Element;
25
+ export declare function SettingsColumn({ className, ...props }: ComponentProps<"div">): import("react").JSX.Element;
26
26
  /** One group of settings, under an optional heading with an optional action beside it. */
27
27
  export declare function SettingsPanel({ title, action, children, ...props }: Omit<PanelProps, "title" | "padding" | "tone"> & {
28
28
  title?: ReactNode;
29
29
  action?: ReactNode;
30
- }): import("@types/react").JSX.Element;
30
+ }): import("react").JSX.Element;
31
31
  /** A label and its value or control on one line inside a settings panel. */
32
32
  export declare function SettingsRow({ label, children, className, ...props }: ComponentProps<"div"> & {
33
33
  label: ReactNode;
34
- }): import("@types/react").JSX.Element;
34
+ }): import("react").JSX.Element;
@@ -4,4 +4,4 @@ export type ShellSkeletonProps = ComponentProps<"div"> & {
4
4
  children?: ReactNode;
5
5
  };
6
6
  /** Names itself for assistive tech with the locale's "Loading" unless given an `aria-label`. */
7
- export declare function ShellSkeleton({ children, ...props }: ShellSkeletonProps): import("@types/react").JSX.Element;
7
+ export declare function ShellSkeleton({ children, ...props }: ShellSkeletonProps): import("react").JSX.Element;
@@ -1,45 +1,45 @@
1
1
  import { useRender } from "@base-ui/react/use-render";
2
2
  import type { ComponentProps, ReactNode } from "react";
3
- export declare function AppShell({ className, children, ...props }: ComponentProps<"div">): import("@types/react").JSX.Element;
3
+ export declare function AppShell({ className, children, ...props }: ComponentProps<"div">): import("react").JSX.Element;
4
4
  export declare function AppSidebar({ className, collapsed, onClickCapture, ...props }: ComponentProps<"aside"> & {
5
5
  collapsed?: boolean;
6
- }): import("@types/react").JSX.Element;
7
- export declare function AppMain({ className, ...props }: ComponentProps<"main">): import("@types/react").JSX.Element;
6
+ }): import("react").JSX.Element;
7
+ export declare function AppMain({ className, ...props }: ComponentProps<"main">): import("react").JSX.Element;
8
8
  export declare function AppHeader({ className, children, actions, ...props }: ComponentProps<"header"> & {
9
9
  actions?: ReactNode;
10
- }): import("@types/react").JSX.Element;
11
- export declare function AppContent({ className, ...props }: ComponentProps<"div">): import("@types/react").JSX.Element;
10
+ }): import("react").JSX.Element;
11
+ export declare function AppContent({ className, ...props }: ComponentProps<"div">): import("react").JSX.Element;
12
12
  /** Content of the expanded sidebar, such as search and its buttons; hidden while it is a rail. */
13
- export declare function AppSidebarGroup({ className, ...props }: ComponentProps<"div">): import("@types/react").JSX.Element;
13
+ export declare function AppSidebarGroup({ className, ...props }: ComponentProps<"div">): import("react").JSX.Element;
14
14
  /**
15
15
  * The icon column shown in place of the expanded content while the sidebar is a rail. Its icon
16
16
  * buttons are large unless they set their own size.
17
17
  */
18
- export declare function AppSidebarRail({ className, children, ...props }: ComponentProps<"div">): import("@types/react").JSX.Element;
18
+ export declare function AppSidebarRail({ className, children, ...props }: ComponentProps<"div">): import("react").JSX.Element;
19
19
  /** The sidebar's navigation, which scrolls on its own between the top and the footer. */
20
- export declare function AppSidebarNav({ className, ...props }: ComponentProps<"div">): import("@types/react").JSX.Element;
20
+ export declare function AppSidebarNav({ className, ...props }: ComponentProps<"div">): import("react").JSX.Element;
21
21
  /** Pinned to the sidebar's bottom; holds both expanded and rail content. */
22
- export declare function AppSidebarFooter({ className, ...props }: ComponentProps<"div">): import("@types/react").JSX.Element;
23
- export declare function AppSidebarFootnote({ className, ...props }: ComponentProps<"div">): import("@types/react").JSX.Element;
22
+ export declare function AppSidebarFooter({ className, ...props }: ComponentProps<"div">): import("react").JSX.Element;
23
+ export declare function AppSidebarFootnote({ className, ...props }: ComponentProps<"div">): import("react").JSX.Element;
24
24
  /** Shows its content only in the expanded sidebar, or with `rail` only while it is a rail. */
25
25
  export declare function AppSidebarOnly({ rail, children, }: {
26
26
  rail?: boolean;
27
27
  children: ReactNode;
28
- }): import("@types/react").JSX.Element;
28
+ }): import("react").JSX.Element;
29
29
  /** Keep parent links on larger screens and a caller-owned compact ancestor menu on phones. */
30
30
  export declare function AppBreadcrumbParents({ children, compact, }: {
31
31
  children: ReactNode;
32
32
  compact: ReactNode;
33
- }): import("@types/react").JSX.Element;
34
- export declare function AppHeaderActions({ className, ...props }: ComponentProps<"div">): import("@types/react").JSX.Element;
33
+ }): import("react").JSX.Element;
34
+ export declare function AppHeaderActions({ className, ...props }: ComponentProps<"div">): import("react").JSX.Element;
35
35
  /** Header controls that stand in for the sidebar once the window is too narrow to show it. */
36
- export declare function AppHeaderCompact({ className, ...props }: ComponentProps<"div">): import("@types/react").JSX.Element;
36
+ export declare function AppHeaderCompact({ className, ...props }: ComponentProps<"div">): import("react").JSX.Element;
37
37
  /** The header's trail of where the page sits; the last crumb truncates first. */
38
- export declare function AppBreadcrumbs({ className, ...props }: ComponentProps<"nav">): import("@types/react").JSX.Element;
38
+ export declare function AppBreadcrumbs({ className, ...props }: ComponentProps<"nav">): import("react").JSX.Element;
39
39
  /** The slash between two crumbs. */
40
- export declare function AppBreadcrumbSeparator(): import("@types/react").JSX.Element;
40
+ export declare function AppBreadcrumbSeparator(): import("react").JSX.Element;
41
41
  /** The crumb for the page itself, which ends the trail and is the page's heading. */
42
- export declare function AppBreadcrumbCurrent({ className, ...props }: ComponentProps<"h1">): import("@types/react").JSX.Element;
42
+ export declare function AppBreadcrumbCurrent({ className, ...props }: ComponentProps<"h1">): import("react").JSX.Element;
43
43
  export type AppBreadcrumbButtonProps = useRender.ComponentProps<"button"> & {
44
44
  /** Makes the crumb a link to this address; `render` takes a router's link instead. */
45
45
  href?: string;
@@ -48,7 +48,7 @@ export type AppBreadcrumbButtonProps = useRender.ComponentProps<"button"> & {
48
48
  * A crumb that opens something: a button, such as a switcher menu's trigger; a link with `href`;
49
49
  * or the element `render` gives, such as a router's `<Link to="...">`.
50
50
  */
51
- export declare function AppBreadcrumbButton({ className, render, href, ...props }: AppBreadcrumbButtonProps): import("@types/react").ReactElement<unknown, string | import("@types/react").JSXElementConstructor<any>>;
51
+ export declare function AppBreadcrumbButton({ className, render, href, ...props }: AppBreadcrumbButtonProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
52
52
  /**
53
53
  * The signed-in account as a menu trigger: avatar, name, and a detail line, or with `compact` the
54
54
  * avatar alone.
@@ -59,4 +59,4 @@ export declare function AppAccountButton({ avatar, name, detail, trailing, compa
59
59
  detail?: ReactNode;
60
60
  trailing?: ReactNode;
61
61
  compact?: boolean;
62
- }): import("@types/react").JSX.Element;
62
+ }): import("react").JSX.Element;
@@ -27,8 +27,10 @@ const sidebar = css({
27
27
  paddingBlock: "panel.sidebarBlock",
28
28
  // The first row, a control's height such as the workspace switcher, centres on the header's
29
29
  // line beside it: half the difference, plus the main panel's 1px edge.
30
+ // The last row, the account, mirrors it at the foot: as far inside the main panel's bottom edge
31
+ // as the first row sits inside its top.
30
32
  _notPhone: {
31
- paddingTop: "calc((token(sizes.shell.header) - token(sizes.control.default)) / 2 + 1px)",
33
+ paddingBlock: "calc((token(sizes.shell.header) - token(sizes.control.default)) / 2 + 1px)",
32
34
  },
33
35
  paddingInline: "sidebar.inline",
34
36
  width: "shell.sidebar",
@@ -27,10 +27,10 @@ export type SidePanelProps = Omit<ComponentProps<"aside">, "title"> & {
27
27
  * optional previous / next stepper, actions and close, a scrolling body and a footer. Put it beside
28
28
  * the list in a `SidePanelLayout`.
29
29
  */
30
- export declare function SidePanel({ title, eyebrow, subtitle, titleAccessory, actions, headerContent, footer, onClose, stepper, onPrevious, onNext, flushBody, bodyClassName, className, children, ...props }: SidePanelProps): import("@types/react").JSX.Element;
30
+ export declare function SidePanel({ title, eyebrow, subtitle, titleAccessory, actions, headerContent, footer, onClose, stepper, onPrevious, onNext, flushBody, bodyClassName, className, children, ...props }: SidePanelProps): import("react").JSX.Element;
31
31
  /** A list and its `SidePanel` side by side; the list takes the room the panel leaves. */
32
- export declare function SidePanelLayout({ className, ...props }: ComponentProps<"div">): import("@types/react").JSX.Element;
32
+ export declare function SidePanelLayout({ className, ...props }: ComponentProps<"div">): import("react").JSX.Element;
33
33
  /** A labelled block of a side panel's body. */
34
34
  export declare function SidePanelSection({ label, className, children, ...props }: Omit<ComponentProps<"section">, "title"> & {
35
35
  label: ReactNode;
36
- }): import("@types/react").JSX.Element;
36
+ }): import("react").JSX.Element;
@@ -1,17 +1,17 @@
1
1
  import { useRender } from "@base-ui/react/use-render";
2
2
  import type { ComponentProps, ReactNode } from "react";
3
- export declare function SidebarNavigation({ className, ...props }: ComponentProps<"nav">): import("@types/react").JSX.Element;
4
- export declare function SidebarDivider({ className, ...props }: ComponentProps<"hr">): import("@types/react").JSX.Element;
5
- export declare function SidebarPanel({ className, ...props }: ComponentProps<"div">): import("@types/react").JSX.Element;
3
+ export declare function SidebarNavigation({ className, ...props }: ComponentProps<"nav">): import("react").JSX.Element;
4
+ export declare function SidebarDivider({ className, ...props }: ComponentProps<"hr">): import("react").JSX.Element;
5
+ export declare function SidebarPanel({ className, ...props }: ComponentProps<"div">): import("react").JSX.Element;
6
6
  export declare function SidebarSection({ label, action, iconTone, className, children, ...props }: ComponentProps<"div"> & {
7
7
  label?: ReactNode;
8
8
  action?: ReactNode;
9
9
  iconTone?: "bronze";
10
- }): import("@types/react").JSX.Element;
10
+ }): import("react").JSX.Element;
11
11
  /** The subject a sidebar is scoped to, such as the open project. */
12
12
  export declare function SidebarHeading({ icon, className, children, ...props }: ComponentProps<"button"> & {
13
13
  icon?: ReactNode;
14
- }): import("@types/react").JSX.Element;
14
+ }): import("react").JSX.Element;
15
15
  /**
16
16
  * A sidebar row. Without children it renders icon-only, for the rail; give it an `aria-label`
17
17
  * then, since the label is what names it.
@@ -32,4 +32,4 @@ export type SidebarItemProps = useRender.ComponentProps<"button"> & {
32
32
  /** `compact` is a secondary list's row, such as recently opened records. */
33
33
  size?: "regular" | "compact";
34
34
  };
35
- export declare function SidebarItem({ icon, trailing, action, active, iconTone, size, href, render, className, children, ...props }: SidebarItemProps): import("@types/react").JSX.Element;
35
+ export declare function SidebarItem({ icon, trailing, action, active, iconTone, size, href, render, className, children, ...props }: SidebarItemProps): import("react").JSX.Element;
@@ -21,5 +21,5 @@ declare const banner: import("../styled-system/types/index.js").RecipeRuntimeFn<
21
21
  }>;
22
22
  export type SiteBannerProps = ComponentProps<"div"> & RecipeVariantProps<typeof banner>;
23
23
  /** A quiet, full-width site notice, separate from page-level status banners. */
24
- export declare function SiteBanner({ tone, className, ...props }: SiteBannerProps): import("@types/react").JSX.Element;
24
+ export declare function SiteBanner({ tone, className, ...props }: SiteBannerProps): import("react").JSX.Element;
25
25
  export {};
@@ -12,4 +12,4 @@ export declare function Skeleton({ shape, width, height, className, style, ...pr
12
12
  /** A token width, for a value of roughly known length, or a share of the box such as `"60%"`. */
13
13
  width?: SkeletonWidth;
14
14
  height?: SkeletonHeight;
15
- }): import("@types/react").JSX.Element;
15
+ }): import("react").JSX.Element;
@@ -3,18 +3,18 @@ import type { ReactNode } from "react";
3
3
  /** Stands in for a labelled group of sidebar rows: a section label, then icon-and-name rows. */
4
4
  export declare function SidebarRowsSkeleton({ rows }: {
5
5
  rows?: number;
6
- }): import("@types/react").JSX.Element;
6
+ }): import("react").JSX.Element;
7
7
  /** Stands in for a page header: optional avatar, title, meta line, and action buttons. */
8
8
  export declare function PageHeaderSkeleton({ avatar, actions, }: {
9
9
  avatar?: boolean;
10
10
  actions?: number;
11
- }): import("@types/react").JSX.Element;
11
+ }): import("react").JSX.Element;
12
12
  /** Stands in for a panel of label-value rows. */
13
13
  export declare function PanelSkeleton({ rows }: {
14
14
  rows?: number;
15
- }): import("@types/react").JSX.Element;
15
+ }): import("react").JSX.Element;
16
16
  /** Placeholder for a row's compact edit and delete icon buttons. */
17
- export declare function RowActionsSkeleton(): import("@types/react").JSX.Element;
17
+ export declare function RowActionsSkeleton(): import("react").JSX.Element;
18
18
  /**
19
19
  * A section's toolbar note and add button above its table header with placeholder rows, for
20
20
  * tables whose real columns need loaded data.
@@ -25,4 +25,4 @@ export declare function TableSectionSkeleton({ note, columns, }: {
25
25
  header: string;
26
26
  meta?: TableColumnMeta;
27
27
  }[];
28
- }): import("@types/react").JSX.Element;
28
+ }): import("react").JSX.Element;
@@ -14,7 +14,7 @@ export type StepDotProps = Omit<ComponentProps<"span">, "children"> & {
14
14
  children?: ReactNode;
15
15
  };
16
16
  /** A step's status as a dot; decorative, so the text beside it says the status. */
17
- export declare function StepDot({ status, size, className, children, ...props }: StepDotProps): import("@types/react").JSX.Element;
17
+ export declare function StepDot({ status, size, className, children, ...props }: StepDotProps): import("react").JSX.Element;
18
18
  export type Stage = {
19
19
  id: string;
20
20
  label: string;
@@ -33,7 +33,7 @@ export type StageStripProps = Omit<ComponentProps<"ol">, "children" | "defaultVa
33
33
  /** Past this many stages the strip windows itself around the current one. Defaults to 7. */
34
34
  maxVisible?: number;
35
35
  };
36
- export declare function StageStrip({ stages, value, defaultValue, onValueChange, maxVisible, className, ...props }: StageStripProps): import("@types/react").JSX.Element;
36
+ export declare function StageStrip({ stages, value, defaultValue, onValueChange, maxVisible, className, ...props }: StageStripProps): import("react").JSX.Element;
37
37
  /** A step's button: it runs `onClick`, or with `popover` opens that popover anchored to it. */
38
38
  export type StepAction = {
39
39
  label: ReactNode;
@@ -66,7 +66,7 @@ export type CurrentStepProps = Omit<ComponentProps<"div">, "title"> & {
66
66
  onExpandedChange?: (expanded: boolean) => void;
67
67
  };
68
68
  /** The step the reader acts on: a tinted header that folds the card with its title and actions. */
69
- export declare function CurrentStep({ tone, meta, title, description, primary, secondary, help, busy, expanded: ownExpanded, defaultExpanded, onExpandedChange, className, ...props }: CurrentStepProps): import("@types/react").JSX.Element;
69
+ export declare function CurrentStep({ tone, meta, title, description, primary, secondary, help, busy, expanded: ownExpanded, defaultExpanded, onExpandedChange, className, ...props }: CurrentStepProps): import("react").JSX.Element;
70
70
  export type ConfirmationRowProps = Omit<ComponentProps<"div">, "children"> & {
71
71
  message: ReactNode;
72
72
  /** When the move landed. */
@@ -77,7 +77,7 @@ export type ConfirmationRowProps = Omit<ComponentProps<"div">, "children"> & {
77
77
  }>;
78
78
  };
79
79
  /** A move that just landed, with when and an undo. */
80
- export declare function ConfirmationRow({ message, at, onUndo, labels: ownLabels, className, ...props }: ConfirmationRowProps): import("@types/react").JSX.Element;
80
+ export declare function ConfirmationRow({ message, at, onUndo, labels: ownLabels, className, ...props }: ConfirmationRowProps): import("react").JSX.Element;
81
81
  export type ChecklistStep = {
82
82
  id?: string;
83
83
  label: ReactNode;
@@ -94,4 +94,4 @@ export type StageChecklistProps = Omit<ComponentProps<"div">, "children"> & {
94
94
  groups: readonly ChecklistGroup[];
95
95
  };
96
96
  /** Checklists side by side, each under its label with its meta or how many of its steps are done. */
97
- export declare function StageChecklist({ groups, className, ...props }: StageChecklistProps): import("@types/react").JSX.Element;
97
+ export declare function StageChecklist({ groups, className, ...props }: StageChecklistProps): import("react").JSX.Element;
@@ -7,7 +7,7 @@ export type TrendProps = {
7
7
  arrow?: boolean;
8
8
  children: ReactNode;
9
9
  };
10
- export declare function Trend({ direction, tone, arrow, children }: TrendProps): import("@types/react").JSX.Element;
10
+ export declare function Trend({ direction, tone, arrow, children }: TrendProps): import("react").JSX.Element;
11
11
  export type SparklineProps = Omit<ComponentProps<"div">, "children"> & {
12
12
  values: readonly number[];
13
13
  /** The value at the box's foot; by default far enough under the lowest that the line floats. */
@@ -18,7 +18,7 @@ export type SparklineProps = Omit<ComponentProps<"div">, "children"> & {
18
18
  endPointSize?: number;
19
19
  };
20
20
  /** A run of values as a line filling its box; decorative, as the figure beside it says what it shows. */
21
- export declare function Sparkline({ values, low: ownLow, high: ownHigh, strokeWidth, endPointSize, className, ...props }: SparklineProps): import("@types/react").JSX.Element;
21
+ export declare function Sparkline({ values, low: ownLow, high: ownHigh, strokeWidth, endPointSize, className, ...props }: SparklineProps): import("react").JSX.Element;
22
22
  export type MetricCardProps = Omit<useRender.ComponentProps<"div">, "children" | "onSelect"> & {
23
23
  label: ReactNode;
24
24
  value: ReactNode;
@@ -31,4 +31,4 @@ export type MetricCardProps = Omit<useRender.ComponentProps<"div">, "children" |
31
31
  /** Makes the card a link; a router's link as `render` routes it. */
32
32
  href?: string;
33
33
  };
34
- export declare function MetricCard({ label, value, change, sparkline, onSelect, href, render, className, ...props }: MetricCardProps): import("@types/react").ReactElement<unknown, string | import("@types/react").JSXElementConstructor<any>>;
34
+ export declare function MetricCard({ label, value, change, sparkline, onSelect, href, render, className, ...props }: MetricCardProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
@@ -14,4 +14,4 @@ export type StatusBannerProps = Omit<ComponentProps<"div">, "title"> & {
14
14
  /** The locale's "Dismiss" by default. */
15
15
  dismissLabel?: string;
16
16
  };
17
- export declare function StatusBanner({ title, description, tone, emphasis, action, onDismiss, dismissLabel, className, ...props }: StatusBannerProps): import("@types/react").JSX.Element;
17
+ export declare function StatusBanner({ title, description, tone, emphasis, action, onDismiss, dismissLabel, className, ...props }: StatusBannerProps): import("react").JSX.Element;
@@ -21,12 +21,12 @@ export type StatusProps = ComponentProps<"span"> & {
21
21
  /** Shows only the icon, with the children as its tooltip and accessible name. */
22
22
  iconOnly?: boolean;
23
23
  };
24
- export declare function Status({ variant, iconOnly, className, style, ...props }: StatusProps): import("@types/react").JSX.Element;
24
+ export declare function Status({ variant, iconOnly, className, style, ...props }: StatusProps): import("react").JSX.Element;
25
25
  export type PendingTextProps = Omit<ComponentProps<"span">, "children"> & {
26
26
  children: ReactNode;
27
27
  /** `centered` holds the place of a page or panel that is still loading. */
28
28
  placement?: "inline" | "centered";
29
29
  };
30
30
  /** Work in progress, named: the spinner and a label such as "Signing in…", announced as a status. */
31
- export declare function PendingText({ children, placement, className, ...props }: PendingTextProps): import("@types/react").JSX.Element;
31
+ export declare function PendingText({ children, placement, className, ...props }: PendingTextProps): import("react").JSX.Element;
32
32
  export {};
@@ -14,4 +14,4 @@ export type StepContent = {
14
14
  export declare function Steps({ steps, notes, }: {
15
15
  steps: readonly StepContent[];
16
16
  notes?: readonly string[];
17
- }): import("@types/react").JSX.Element;
17
+ }): import("react").JSX.Element;
@@ -3,4 +3,4 @@ import type { ComponentProps } from "react";
3
3
  export type SwitchProps = Omit<ComponentProps<typeof BaseSwitch.Root>, "className"> & {
4
4
  className?: string;
5
5
  };
6
- export declare function Switch({ className, ...props }: SwitchProps): import("@types/react").JSX.Element;
6
+ export declare function Switch({ className, ...props }: SwitchProps): import("react").JSX.Element;
@@ -2,11 +2,11 @@ import { Tabs as BaseTabs } from "@base-ui/react/tabs";
2
2
  import type { ComponentProps, ReactNode } from "react";
3
3
  export declare function TabsRoot({ className, ...props }: Omit<ComponentProps<typeof BaseTabs.Root>, "className"> & {
4
4
  className?: string;
5
- }): import("@types/react").JSX.Element;
6
- export declare const TabsPanel: import("@types/react").ForwardRefExoticComponent<Omit<import("@base-ui/react").TabsPanelProps, "ref"> & import("@types/react").RefAttributes<HTMLDivElement>>;
5
+ }): import("react").JSX.Element;
6
+ export declare const TabsPanel: import("react").ForwardRefExoticComponent<Omit<import("@base-ui/react").TabsPanelProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
7
7
  export declare function TabsGroup({ border, className, ...props }: ComponentProps<"span"> & {
8
8
  border?: "control" | "glass";
9
- }): import("@types/react").JSX.Element;
9
+ }): import("react").JSX.Element;
10
10
  export declare function TabsList({ className, variant, overflow: ownOverflow, children, ...props }: Omit<ComponentProps<typeof BaseTabs.List>, "className"> & {
11
11
  className?: string;
12
12
  /**
@@ -19,7 +19,7 @@ export declare function TabsList({ className, variant, overflow: ownOverflow, ch
19
19
  * scrolls the row. `menu` in a `TabsBar`, `scroll` elsewhere.
20
20
  */
21
21
  overflow?: "menu" | "scroll";
22
- }): import("@types/react").JSX.Element;
22
+ }): import("react").JSX.Element;
23
23
  export type TabsTabProps = Omit<ComponentProps<typeof BaseTabs.Tab>, "className"> & {
24
24
  className?: string;
25
25
  /** Tint the tab icon bronze while inactive, as the Projects hub type tabs do. */
@@ -32,17 +32,17 @@ export type TabsTabProps = Omit<ComponentProps<typeof BaseTabs.Tab>, "className"
32
32
  /** Muted after the label, such as how many rows the tab holds. */
33
33
  count?: ReactNode;
34
34
  };
35
- export declare function TabsTab({ className, iconTone, href, render, count: tabCount, children, ...props }: TabsTabProps): import("@types/react").JSX.Element;
35
+ export declare function TabsTab({ className, iconTone, href, render, count: tabCount, children, ...props }: TabsTabProps): import("react").JSX.Element;
36
36
  /**
37
37
  * Wraps a page's `TabsBar` and the section below it, so the section can place its controls on the
38
38
  * tab row with `TabsBarActions` while keeping its own state.
39
39
  */
40
40
  export declare function TabsBarProvider({ children }: {
41
41
  children: ReactNode;
42
- }): import("@types/react").JSX.Element;
42
+ }): import("react").JSX.Element;
43
43
  /** Section tabs (a `TabsRoot`) with a slot at the end of the row for the open section's controls. */
44
- export declare function TabsBar({ className, children, ...props }: ComponentProps<"div">): import("@types/react").JSX.Element;
44
+ export declare function TabsBar({ className, children, ...props }: ComponentProps<"div">): import("react").JSX.Element;
45
45
  /** Renders the open section's controls at the end of the nearest `TabsBar` row. */
46
46
  export declare function TabsBarActions({ children }: {
47
47
  children: ReactNode;
48
- }): import("@types/react").ReactPortal | null;
48
+ }): import("react").ReactPortal | null;
@@ -40,7 +40,7 @@ export type UseThemeCustomizationOptions<Value extends ThemeCustomization> = {
40
40
  */
41
41
  export declare function useThemeCustomization<Value extends ThemeCustomization>({ defaultValue, fonts, persistKey, parse, }: UseThemeCustomizationOptions<Value>): {
42
42
  value: Value;
43
- setValue: import("@types/react").Dispatch<import("@types/react").SetStateAction<Value>>;
43
+ setValue: import("react").Dispatch<import("react").SetStateAction<Value>>;
44
44
  reset: () => void;
45
45
  theme: Pick<CiridaeTheme, "fonts" | "palette">;
46
46
  };
@@ -50,4 +50,4 @@ export type ThemeCustomizerProps<Value extends ThemeCustomization> = Omit<Compon
50
50
  fonts: ThemeFontOptions;
51
51
  labels?: Partial<CiridaeLabels["themeCustomizer"]>;
52
52
  };
53
- export declare function ThemeCustomizer<Value extends ThemeCustomization>({ value, onValueChange, fonts, labels: ownLabels, className, ...props }: ThemeCustomizerProps<Value>): import("@types/react").JSX.Element;
53
+ export declare function ThemeCustomizer<Value extends ThemeCustomization>({ value, onValueChange, fonts, labels: ownLabels, className, ...props }: ThemeCustomizerProps<Value>): import("react").JSX.Element;
@@ -2,7 +2,7 @@ import { toast, type ToasterProps } from "sonner";
2
2
  import type { ComponentProps, ReactNode } from "react";
3
3
  export { toast };
4
4
  /** The toast stack, in the kit's look: mount one at the app's root. */
5
- export declare function Toaster(props: ToasterProps): import("@types/react").JSX.Element;
5
+ export declare function Toaster(props: ToasterProps): import("react").JSX.Element;
6
6
  export type ToastVariant = "success" | "progress" | "info" | "warning" | "error";
7
7
  export type ToastOptions = {
8
8
  title: ReactNode;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Whether the deployment now serves a different build than this tab is running. The build writes
3
+ * `version.json` beside the bundle (see `@ciridae/configs/vite`), so the check costs one small
4
+ * request and needs no API.
5
+ */
6
+ export declare function useNewVersionAvailable(buildSha: string | null): boolean;
@@ -0,0 +1,29 @@
1
+ import { useQuery } from "@tanstack/react-query";
2
+ /** How often a tab asks whether the deployment moved on without it. */
3
+ const versionPollIntervalMs = 5 * 60000;
4
+ /**
5
+ * Whether the deployment now serves a different build than this tab is running. The build writes
6
+ * `version.json` beside the bundle (see `@ciridae/configs/vite`), so the check costs one small
7
+ * request and needs no API.
8
+ */
9
+ export function useNewVersionAvailable(buildSha) {
10
+ const deployed = useQuery({
11
+ queryKey: ["deployed-version"],
12
+ queryFn: async ({ signal }) => {
13
+ const response = await fetch("/version.json", { cache: "no-store", signal });
14
+ if (!response.ok)
15
+ throw new Error(`Version check failed (${response.status}).`);
16
+ const body = await response.json();
17
+ return typeof body === "object" && body !== null && "buildSha" in body
18
+ ? String(body.buildSha)
19
+ : null;
20
+ },
21
+ // A build this tab cannot name has nothing to compare against.
22
+ enabled: buildSha !== null,
23
+ refetchInterval: versionPollIntervalMs,
24
+ refetchIntervalInBackground: false,
25
+ staleTime: versionPollIntervalMs,
26
+ retry: false,
27
+ });
28
+ return Boolean(deployed.data) && deployed.data !== buildSha;
29
+ }