@streamoid/ui 0.6.54 → 0.6.56

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.
@@ -1,6 +1,6 @@
1
1
  # @streamoid/ui — component router (for AI agents)
2
2
 
3
- 127 components. Full docs for each live beside this file as `<ScName>.md`;
3
+ 128 components. Full docs for each live beside this file as `<ScName>.md`;
4
4
  the same metadata is machine-readable in `components.json`.
5
5
 
6
6
  **How to use this file:** scan for the job you need below, then open only that
@@ -141,6 +141,8 @@ theme-aware (dark on `:root`, light override) — never hardcode a colour.
141
141
  - **`ScInfoPopup`** — use when a label or a table header needs a short explanation, and you want the standard ⓘ affordance next to it.
142
142
  - **`ScMenuOptions`** — use when you need a row in a profile flyout, an account/settings menu, or a kebab/overflow menu.
143
143
  - **`ScModal`** — use when you need a centered dialog that blocks the page — confirm, create/edit form, image preview, invite flow.
144
+ - **`ScNewVersionNotice`** — use when the app is a long-lived SPA tab and a deploy should not wait for the user to happen to reload.
145
+ - also documented here: `useNewVersionAvailable`, `parseVersionManifest`, `shouldPromptForNewVersion`
144
146
  - **`ScPagination`** — use when you have a server-paged table or list and you already hold `page` + `offset` state and a refetch function.
145
147
  - **`ScPopUpMenu`** _(legacy)_ — use when never, in new code.
146
148
  - **`ScProgressBar`** — use when you have a known-percentage operation to show — an upload, a batch render, credits consumed.
@@ -181,8 +183,8 @@ theme-aware (dark on `:root`, light override) — never hardcode a colour.
181
183
  - **`ScSidebarProfile`** _(legacy)_ — use when never. There is no way to pass a real user through it.
182
184
  - **`ScSidebarSwitchMenu`** — use when you're building a "switch to another product" list inside a sidebar and each entry needs a name **and** a subtitle.
183
185
  - **`ScVersion`** _(legacy)_ — use when never. `StreamoidSidebar` renders its own version footer inline from `versionText`.
184
- - **`ScWorkspaceAccountMenu`** — use when building the standard workspace menu opened from the top-left of a Streamoid application sidebar. - Use `ScSidebarWorkspaceTrigger`, `ScSidebarSearchTrigger`, and `ScSidebarAppIdentity` for the matching constant rail controls. - Use the two preference hooks so theme and expanded/collapsed state survive an app switch across Streamoid subdomains. - Use `useStreamoidSidebarPopoverPosition` for a panel that belongs to the whole rail (the upper-right workspace menu) instead of hard-coded host coordinates. - Use `useStreamoidAnchoredPopoverPosition` for a panel that belongs to a BUTTON — the app switcher's grid trigger, a row's overflow menu. Pinning one of those to the sidebar card's edge leaves it floating mid-canvas with nothing connecting it to what was clicked; in Artifax it landed over the chat composer and its Send button.
185
- - also documented here: `ScSidebarWorkspaceTrigger`, `ScSidebarSearchTrigger`, `ScSidebarAppIdentity`, `ScPopoverArrow`, `useStreamoidThemePreference`, `useStreamoidSidebarPreference`, `useStreamoidSidebarPopoverPosition`, `useStreamoidAnchoredPopover`, `useStreamoidAnchoredPopoverPosition`, `resolveAnchoredPopoverArrow`, `resolveAnchoredPopoverPosition`
186
+ - **`ScWorkspaceAccountMenu`** — use when building the standard workspace menu opened from the top-left of a Streamoid application sidebar. - Use `ScSidebarWorkspaceTrigger`, `ScSidebarSearchTrigger`, and `ScSidebarAppIdentity` for the matching constant rail controls. - Wire `ScSidebarSearchTrigger`'s `onPrefetch` AND `useStreamoidSearchShortcut` whenever the trigger opens a lazily-loaded dialog — which is every product. Without them the `⌘ K` the trigger draws does nothing, and the first click sits on a blank screen while the chunk downloads. - Use the two preference hooks so theme and expanded/collapsed state survive an app switch across Streamoid subdomains. - Use `useStreamoidSidebarPopoverPosition` for a panel that belongs to the whole rail (the upper-right workspace menu) instead of hard-coded host coordinates. - Use `useStreamoidAnchoredPopoverPosition` for a panel that belongs to a BUTTON — the app switcher's grid trigger, a row's overflow menu. Pinning one of those to the sidebar card's edge leaves it floating mid-canvas with nothing connecting it to what was clicked; in Artifax it landed over the chat composer and its Send button.
187
+ - also documented here: `ScSidebarWorkspaceTrigger`, `ScSidebarSearchTrigger`, `ScSidebarAppIdentity`, `ScPopoverArrow`, `useStreamoidThemePreference`, `useStreamoidSidebarPreference`, `useStreamoidSidebarPopoverPosition`, `useStreamoidAnchoredPopover`, `useStreamoidAnchoredPopoverPosition`, `useStreamoidSearchShortcut`, `matchesStreamoidSearchShortcut`, `resolveAnchoredPopoverArrow`, `resolveAnchoredPopoverPosition`
186
188
  - **`StreamoidSidebar`** — use when you are building (or fixing) a desktop app's primary left navigation and you want the same chrome CXO, Photogenix and Catalogix use.
187
189
  - also documented here: `ScSidebarResizeHandle`, `advanceSidebarResizeGesture`, `SIDEBAR_RESIZE_THRESHOLD_PX`
188
190
 
@@ -245,6 +247,7 @@ theme-aware (dark on `:root`, light override) — never hardcode a colour.
245
247
  | `ScMobileBottomAction` | `ScButton`, `ScMobileTopNav`, `ScFieldButton`, `ScOnlyIcon` |
246
248
  | `ScMobileTopNav` | `ScHeader`, `ScTableHeader`, `ScSideBarLogoUnit`, `ScMobileBottomAction`, `ScTabSwitcher` |
247
249
  | `ScModal` | `ScDrawer`, `ScInfoPopup`, `ScProfilePopup` |
250
+ | `ScNewVersionNotice` | `ScBadges`, `CreditWarningBanner` |
248
251
  | `ScOnlyIcon` | `ScOnlyField`, `ScButton`, `ScFieldButton`, `ScSidebarIcons` |
249
252
  | `ScPagination` | `ScCounter`, `ScTabs`, `ScOnlyField` |
250
253
  | `ScPairtext` | `ScCheckField`, `ScCheckbox`, `ScRadio`, `ScSelection`, `ScSelectionPill`, `ScMenuOptions` |
@@ -0,0 +1,189 @@
1
+ ---
2
+ component: ScNewVersionNotice
3
+ package: "@streamoid/ui"
4
+ category: overlays
5
+ status: stable
6
+ renders: div
7
+ tags: [deploy, version, reload, notice, portal, toast]
8
+ related: [ScSidebarPopover, ScErrorBoundary]
9
+ do_not_confuse_with: [ScBadges, CreditWarningBanner]
10
+ used_by: [artifax, photogenix, tactix, cxo]
11
+ required_props: [buildId]
12
+ also_exports: [useNewVersionAvailable, parseVersionManifest, shouldPromptForNewVersion]
13
+ ---
14
+
15
+ # New-version notice
16
+
17
+ Tells the user a newer build is deployed and lets them take it. Renders nothing
18
+ until there is something to say, and portals to `<body>` so no host layout has
19
+ to make room for it.
20
+
21
+ ## TL;DR for agents
22
+
23
+ - **Reach for it when:** the app is a long-lived SPA tab and a deploy should not
24
+ wait for the user to happen to reload.
25
+ - **You must pass `buildId`.** It comes from a compile-time define, and every app
26
+ spells it differently (`__BUILD_ID__` in Artifax and Tactix,
27
+ `__PHOTOGENIX_BUILD_ID__` in Photogenix). A library cannot read another
28
+ bundle's define, so there is nothing to infer.
29
+ - Pass `enabled={!import.meta.env.DEV}`. In dev there is nothing to compare
30
+ against: the manifest is emitted by a build-only plugin and the dev server
31
+ rebuilds in place.
32
+ - Want the boolean without the UI? `useNewVersionAvailable({ buildId })`.
33
+
34
+ ```tsx
35
+ <ScNewVersionNotice
36
+ buildId={typeof __BUILD_ID__ === 'string' ? __BUILD_ID__ : ''}
37
+ enabled={!import.meta.env.DEV}
38
+ />
39
+ ```
40
+
41
+ ## 1. How to use it
42
+
43
+ ```tsx
44
+ import { ScNewVersionNotice } from "@streamoid/ui"
45
+
46
+ <ScNewVersionNotice
47
+ buildId={typeof __BUILD_ID__ === 'string' ? __BUILD_ID__ : ''}
48
+ enabled={!import.meta.env.DEV}
49
+ />
50
+ ```
51
+
52
+ | Prop | Default | Notes |
53
+ | --- | --- | --- |
54
+ | `buildId` | — | The id baked into the bundle that is RUNNING. Required in practice: without it the check is disabled. |
55
+ | `manifestUrl` | `/version.json` | Where the DEPLOYED id is published. |
56
+ | `pollIntervalMs` | `300000` | Backstop only; the focus check is the one that matters. |
57
+ | `enabled` | `true` | Pass `!import.meta.env.DEV`. |
58
+ | `title` | `A new version is available` | |
59
+ | `description` | `Refresh to get the latest updates.` | |
60
+ | `refreshLabel` / `dismissLabel` | `Refresh` / `Later` | |
61
+ | `onRefresh` | `window.location.reload()` | Override only to save work first — then still reload. |
62
+ | `testId` | `new-version-notice` | |
63
+
64
+ Want the boolean without the UI: `useNewVersionAvailable({ buildId })`.
65
+
66
+ ## 2. Where to use it
67
+
68
+ Mount it once, high in the tree — beside the router, not inside a route — so it
69
+ survives navigation. It portals to `<body>` and renders `null` until there is
70
+ something to say, so it costs a host nothing to mount early and needs no room
71
+ made for it in any layout.
72
+
73
+ ## 3. When to use it
74
+
75
+ When the app is a long-lived SPA tab and a deploy should not wait for the user
76
+ to happen to reload. Skip it for short-lived surfaces, embedded widgets, and
77
+ anything already inside a host that prompts for it.
78
+
79
+ ## What the host still owns
80
+
81
+
82
+ Two pieces of build plumbing, because they are the host's build:
83
+
84
+ 1. **Emit the manifest.** A Vite plugin writes `version.json` next to the build
85
+ and bakes the same id in as a define:
86
+
87
+ ```ts
88
+ function buildVersionManifest(buildId: string): Plugin {
89
+ return {
90
+ name: 'build-version-manifest',
91
+ apply: 'build',
92
+ generateBundle() {
93
+ this.emitFile({
94
+ type: 'asset',
95
+ fileName: 'version.json',
96
+ source: JSON.stringify({ buildId }, null, 2) + '\n',
97
+ })
98
+ },
99
+ }
100
+ }
101
+ const buildId = process.env.VITE_BUILD_ID?.trim() || String(Date.now())
102
+ ```
103
+
104
+ 2. **Serve it uncached.** This is not a tuning detail — a cached manifest
105
+ reports the version the tab already has, forever, which is exactly what the
106
+ check exists to detect:
107
+
108
+ ```nginx
109
+ location = /version.json {
110
+ add_header Cache-Control "no-store" always;
111
+ try_files $uri =404; # not the SPA fallback: index.html is not JSON
112
+ }
113
+ ```
114
+
115
+ ## Design decisions worth not relitigating
116
+
117
+
118
+ **It asks; it does not reload.** Reloading under someone mid-sentence in a chat,
119
+ mid-upload or mid-form loses their work.
120
+
121
+ **It is persistent, and dismissible.** A notice that disappears after five
122
+ seconds is a notice nobody reads. Dismissing costs nothing, because the next
123
+ full page load picks the new build up anyway.
124
+
125
+ **Not knowing is never grounds to prompt.** Offline, mid-redeploy, a dev bundle
126
+ with no define, `/version.json` answered by the SPA catch-all with `index.html`
127
+ — all normal, none evidence of a newer build. `shouldPromptForNewVersion`
128
+ requires two known ids that differ. Getting this wrong shows the notice to
129
+ everyone, forever, which is worse than never showing it.
130
+
131
+ **It latches.** A build cannot become un-new, and flickering the prompt because
132
+ one poll failed is worse than not showing it.
133
+
134
+ **Polling is deliberately slow (5 min).** The check that matters is the one on
135
+ focus — someone returning to a tab they left open. The interval is a backstop.
136
+
137
+ **The refresh button does not use `--alias-text---icons-onfill`.** That token
138
+ looks right for a label on a filled button and is not: it resolves to the same
139
+ ramp step as the fill, so the label matches the background in *both* themes. It
140
+ cost Artifax a white label on a white card. Use
141
+ `--alias-text---icons-inverse`, which is `--alias-fill-base-base`'s actual
142
+ inverse. A test guards this.
143
+
144
+ ## 4. Why to use it
145
+
146
+ Because this was three copies and a gap. Artifax and Photogenix each shipped a
147
+ `NewVersionNotice` plus a `useNewVersionAvailable`; CXO raises the same message
148
+ on a toast. The three were the same component down to the copy, and differed in
149
+ exactly the ways duplication gets expensive: quote style, the name of the
150
+ build-id global, and whether a `204` was handled — only one of them did. Tactix
151
+ had none at all, so a deployed Tactix tab stayed on its old bundle until someone
152
+ reloaded by chance. Fixing the `onfill` token bug in one app fixed it in one app.
153
+
154
+ ## Gotchas
155
+
156
+ - **`buildId` is not optional in practice.** Omit it and the hook disables
157
+ itself — deliberately, because not knowing which build you are is not evidence
158
+ that a newer one exists. A notice that never appears looks identical to a
159
+ working one, so check the define reaches the bundle.
160
+ - **`/version.json` must not be cached, and must not fall through to the SPA
161
+ catch-all.** A cached manifest reports the version the tab already has,
162
+ forever. `index.html` is not JSON, and the parse failure is swallowed — so
163
+ both mistakes look like "the notice never shows".
164
+ - **Do not reach for `--alias-text---icons-onfill`** on the refresh button. It
165
+ resolves to the same ramp step as the fill, so the label matches the
166
+ background in both themes. Use `--alias-text---icons-inverse`. A test guards
167
+ this.
168
+ - **It latches.** Once true it stays true for the life of the tab.
169
+
170
+ ## In the wild
171
+
172
+ The two local copies this component generalises, both mounted once beside the
173
+ router:
174
+
175
+ ```tsx
176
+ // artifax apps/artifax/src/App.tsx:32
177
+ <NewVersionNotice />
178
+ // photogenix dashboard/client/src/App.tsx:129
179
+ <NewVersionNotice />
180
+ ```
181
+
182
+ Photogenix's copy (`dashboard/client/src/lib/useNewVersionAvailable.ts`) is the
183
+ only one of the three that handled a `204`; that behaviour is kept here.
184
+
185
+ ## Related
186
+
187
+ - `ScSidebarPopover` — the other portaled surface in this package; it owns its
188
+ own card chrome for the same reason this owns its own.
189
+ - `ScErrorBoundary` — the other app-level thing mounted once beside the router.
@@ -9,7 +9,7 @@ related: [StreamoidSidebar, ScArtifaxSidebar, ScAppSwitchPanel, ScProfilePopup]
9
9
  do_not_confuse_with: [ScProfilePopup, ScWorkspaceSwitcher, ScAppSwitchPanel]
10
10
  used_by: [cxo, artifax, catalogix, photogenix]
11
11
  required_props: [workspaceName, accountName]
12
- also_exports: [ScSidebarWorkspaceTrigger, ScSidebarSearchTrigger, ScSidebarAppIdentity, ScPopoverArrow, useStreamoidThemePreference, useStreamoidSidebarPreference, useStreamoidSidebarPopoverPosition, useStreamoidAnchoredPopover, useStreamoidAnchoredPopoverPosition, resolveAnchoredPopoverArrow, resolveAnchoredPopoverPosition]
12
+ also_exports: [ScSidebarWorkspaceTrigger, ScSidebarSearchTrigger, ScSidebarAppIdentity, ScPopoverArrow, useStreamoidThemePreference, useStreamoidSidebarPreference, useStreamoidSidebarPopoverPosition, useStreamoidAnchoredPopover, useStreamoidAnchoredPopoverPosition, useStreamoidSearchShortcut, matchesStreamoidSearchShortcut, resolveAnchoredPopoverArrow, resolveAnchoredPopoverPosition]
13
13
  ---
14
14
 
15
15
  # Shared Streamoid sidebar shell
@@ -25,6 +25,10 @@ shared popover-position hook keeps the desktop anchors consistent.
25
25
  top-left of a Streamoid application sidebar.
26
26
  - Use `ScSidebarWorkspaceTrigger`, `ScSidebarSearchTrigger`, and
27
27
  `ScSidebarAppIdentity` for the matching constant rail controls.
28
+ - Wire `ScSidebarSearchTrigger`'s `onPrefetch` AND `useStreamoidSearchShortcut`
29
+ whenever the trigger opens a lazily-loaded dialog — which is every product.
30
+ Without them the `⌘ K` the trigger draws does nothing, and the first click
31
+ sits on a blank screen while the chunk downloads.
28
32
  - Use the two preference hooks so theme and expanded/collapsed state survive an
29
33
  app switch across Streamoid subdomains.
30
34
  - Use `useStreamoidSidebarPopoverPosition` for a panel that belongs to the
@@ -67,6 +71,40 @@ const appSwitcherPosition = useStreamoidAnchoredPopoverPosition(
67
71
  );
68
72
  ```
69
73
 
74
+ ### `ScSidebarSearchTrigger` — the two props nobody wired
75
+
76
+ The trigger renders a `⌘ K` hint and opens a dialog the host owns. Both halves
77
+ of that promise need wiring, and for a long time neither was:
78
+
79
+ ```tsx
80
+ import {
81
+ ScSidebarSearchTrigger,
82
+ useStreamoidSearchShortcut,
83
+ } from "@streamoid/ui";
84
+
85
+ const [searchOpen, setSearchOpen] = useState(false);
86
+
87
+ // The chord the trigger advertises. A TOGGLE, not an open — every other
88
+ // command palette closes on the same keys that opened it.
89
+ useStreamoidSearchShortcut({ onTrigger: () => setSearchOpen((o) => !o) });
90
+
91
+ <ScSidebarSearchTrigger
92
+ expanded={expanded}
93
+ onClick={() => setSearchOpen(true)}
94
+ // Hover and focus, before the click. In CXO and Artifax this dialog lives in
95
+ // `@streamoid/agent` — 5.3MB behind a `Suspense` fallback of `null` — so the
96
+ // FIRST click looked like it did nothing at all. On intent rather than on
97
+ // idle: most sessions never open it and should not download it.
98
+ onPrefetch={() => void import("@streamoid/agent")}
99
+ />;
100
+ ```
101
+
102
+ `ScArtifaxSidebar` forwards the same thing as `header.onSearchPrefetch`.
103
+
104
+ `matchesStreamoidSearchShortcut(event, letter?)` is the hook's chord test,
105
+ exported separately so a host with its own key handling can ask the same
106
+ question rather than re-deriving the modifier rules.
107
+
70
108
  ### `useStreamoidAnchoredPopoverPosition(anchorRef, panelRef, options)`
71
109
 
72
110
  | Option | Type | Default | Purpose |
@@ -146,6 +184,16 @@ copies of the same shell.
146
184
  - Legacy sidebar keys describe the collapsed state, while the hook exposes the
147
185
  positive `expanded` state. Both hooks continue mirroring supplied legacy keys
148
186
  so older code in the same host stays synchronized during migration.
187
+ - `useStreamoidSearchShortcut` calls `preventDefault`. It has to: Chrome and
188
+ Firefox both send Ctrl+K to the address bar, so without it the rail's own
189
+ search loses to the browser. It also fires while a text field has focus,
190
+ which is deliberate — the chord is how you leave the field.
191
+ - `onPrefetch` fires on EVERY hover, so it must be cheap and idempotent. A bare
192
+ `() => void import("…")` is the intended shape; dynamic imports are cached,
193
+ so the second hover costs nothing. Do not put a fetch behind it.
194
+ - The shortcut matches on `event.key`, not `event.code`. `code` is physical, so
195
+ on AZERTY or Dvorak the key labelled K is not `KeyK` and the shortcut would
196
+ land somewhere other than the `⌘ K` the rail is showing.
149
197
 
150
198
  ## In the wild
151
199
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@streamoid/ui",
3
- "count": 127,
3
+ "count": 128,
4
4
  "components": {
5
5
  "ScAccess": {
6
6
  "doc": "ScAccess.md",
@@ -1688,6 +1688,46 @@
1688
1688
  "alsoExports": [],
1689
1689
  "exported": true
1690
1690
  },
1691
+ "ScNewVersionNotice": {
1692
+ "doc": "ScNewVersionNotice.md",
1693
+ "source": "src/SC-NewVersionNotice",
1694
+ "category": "overlays",
1695
+ "status": "stable",
1696
+ "renders": "div",
1697
+ "summary": "Reach for it when:",
1698
+ "reachForWhen": "the app is a long-lived SPA tab and a deploy should not wait for the user to happen to reload.",
1699
+ "tags": [
1700
+ "deploy",
1701
+ "version",
1702
+ "reload",
1703
+ "notice",
1704
+ "portal",
1705
+ "toast"
1706
+ ],
1707
+ "related": [
1708
+ "ScSidebarPopover",
1709
+ "ScErrorBoundary"
1710
+ ],
1711
+ "doNotConfuseWith": [
1712
+ "ScBadges",
1713
+ "CreditWarningBanner"
1714
+ ],
1715
+ "requiredProps": [
1716
+ "buildId"
1717
+ ],
1718
+ "usedBy": [
1719
+ "artifax",
1720
+ "photogenix",
1721
+ "tactix",
1722
+ "cxo"
1723
+ ],
1724
+ "alsoExports": [
1725
+ "useNewVersionAvailable",
1726
+ "parseVersionManifest",
1727
+ "shouldPromptForNewVersion"
1728
+ ],
1729
+ "exported": true
1730
+ },
1691
1731
  "ScOnlyIcon": {
1692
1732
  "doc": "ScOnlyIcon.md",
1693
1733
  "source": "src/SC-OnlyIcon",
@@ -2789,7 +2829,7 @@
2789
2829
  "status": "stable",
2790
2830
  "renders": "div",
2791
2831
  "summary": "Reach for it when:",
2792
- "reachForWhen": "building the standard workspace menu opened from the top-left of a Streamoid application sidebar. - Use `ScSidebarWorkspaceTrigger`, `ScSidebarSearchTrigger`, and `ScSidebarAppIdentity` for the matching constant rail controls. - Use the two preference hooks so theme and expanded/collapsed state survive an app switch across Streamoid subdomains. - Use `useStreamoidSidebarPopoverPosition` for a panel that belongs to the whole rail (the upper-right workspace menu) instead of hard-coded host coordinates. - Use `useStreamoidAnchoredPopoverPosition` for a panel that belongs to a BUTTON — the app switcher's grid trigger, a row's overflow menu. Pinning one of those to the sidebar card's edge leaves it floating mid-canvas with nothing connecting it to what was clicked; in Artifax it landed over the chat composer and its Send button.",
2832
+ "reachForWhen": "building the standard workspace menu opened from the top-left of a Streamoid application sidebar. - Use `ScSidebarWorkspaceTrigger`, `ScSidebarSearchTrigger`, and `ScSidebarAppIdentity` for the matching constant rail controls. - Wire `ScSidebarSearchTrigger`'s `onPrefetch` AND `useStreamoidSearchShortcut` whenever the trigger opens a lazily-loaded dialog — which is every product. Without them the `⌘ K` the trigger draws does nothing, and the first click sits on a blank screen while the chunk downloads. - Use the two preference hooks so theme and expanded/collapsed state survive an app switch across Streamoid subdomains. - Use `useStreamoidSidebarPopoverPosition` for a panel that belongs to the whole rail (the upper-right workspace menu) instead of hard-coded host coordinates. - Use `useStreamoidAnchoredPopoverPosition` for a panel that belongs to a BUTTON — the app switcher's grid trigger, a row's overflow menu. Pinning one of those to the sidebar card's edge leaves it floating mid-canvas with nothing connecting it to what was clicked; in Artifax it landed over the chat composer and its Send button.",
2793
2833
  "tags": [
2794
2834
  "sidebar",
2795
2835
  "workspace",
@@ -2829,6 +2869,8 @@
2829
2869
  "useStreamoidSidebarPopoverPosition",
2830
2870
  "useStreamoidAnchoredPopover",
2831
2871
  "useStreamoidAnchoredPopoverPosition",
2872
+ "useStreamoidSearchShortcut",
2873
+ "matchesStreamoidSearchShortcut",
2832
2874
  "resolveAnchoredPopoverArrow",
2833
2875
  "resolveAnchoredPopoverPosition"
2834
2876
  ],
@@ -5001,6 +5043,18 @@
5001
5043
  "documentedIn": "ScStreamoidWordmark",
5002
5044
  "doc": "ScStreamoidWordmark.md"
5003
5045
  },
5046
+ "useNewVersionAvailable": {
5047
+ "documentedIn": "ScNewVersionNotice",
5048
+ "doc": "ScNewVersionNotice.md"
5049
+ },
5050
+ "parseVersionManifest": {
5051
+ "documentedIn": "ScNewVersionNotice",
5052
+ "doc": "ScNewVersionNotice.md"
5053
+ },
5054
+ "shouldPromptForNewVersion": {
5055
+ "documentedIn": "ScNewVersionNotice",
5056
+ "doc": "ScNewVersionNotice.md"
5057
+ },
5004
5058
  "useStreamoidPanelWidth": {
5005
5059
  "documentedIn": "ScPanelResizeHandle",
5006
5060
  "doc": "ScPanelResizeHandle.md"
@@ -5081,6 +5135,14 @@
5081
5135
  "documentedIn": "ScWorkspaceAccountMenu",
5082
5136
  "doc": "ScWorkspaceAccountMenu.md"
5083
5137
  },
5138
+ "useStreamoidSearchShortcut": {
5139
+ "documentedIn": "ScWorkspaceAccountMenu",
5140
+ "doc": "ScWorkspaceAccountMenu.md"
5141
+ },
5142
+ "matchesStreamoidSearchShortcut": {
5143
+ "documentedIn": "ScWorkspaceAccountMenu",
5144
+ "doc": "ScWorkspaceAccountMenu.md"
5145
+ },
5084
5146
  "resolveAnchoredPopoverArrow": {
5085
5147
  "documentedIn": "ScWorkspaceAccountMenu",
5086
5148
  "doc": "ScWorkspaceAccountMenu.md"
package/dist/index.d.mts CHANGED
@@ -597,6 +597,80 @@ interface IScMenuOptionsProps extends React.HTMLAttributes<HTMLDivElement> {
597
597
  }
598
598
  declare const ScMenuOptions: ({ icon, version, hover, variant, className, text, ...props }: IScMenuOptionsProps) => React.JSX.Element;
599
599
 
600
+ interface IUseNewVersionAvailableOptions {
601
+ /** The build id baked into the bundle that is RUNNING.
602
+ *
603
+ * The host has to pass this: it comes from a compile-time define, and every
604
+ * app spells it differently (`__BUILD_ID__` in Artifax and Tactix,
605
+ * `__PHOTOGENIX_BUILD_ID__` in Photogenix). A library cannot read another
606
+ * bundle's define, so there is nothing to guess here.
607
+ *
608
+ * Empty or undefined disables the check rather than prompting: not knowing
609
+ * which build you are is not evidence that a newer one exists. */
610
+ buildId?: string;
611
+ /** Where the DEPLOYED build id is published. Defaults to `/version.json`,
612
+ * which is what every Streamoid app's build emits. */
613
+ manifestUrl?: string;
614
+ pollIntervalMs?: number;
615
+ /** Pass `false` in dev. There is nothing to compare against: the manifest is
616
+ * emitted by a build-only plugin, and the dev server rebuilds in place. */
617
+ enabled?: boolean;
618
+ }
619
+ /** The deployed build id out of a `/version.json` body, or `null`.
620
+ *
621
+ * Exported because it is where the surprises live, and a hook is awkward to
622
+ * test: the SPA catch-all can answer this route with `index.html`, a partial
623
+ * deploy can serve `{}`, and a hand-edited manifest can put a number there.
624
+ * None of those are a newer build. */
625
+ declare function parseVersionManifest(body: unknown): string | null;
626
+ /** Whether `deployed` is grounds to prompt someone to reload.
627
+ *
628
+ * Only a KNOWN id that DIFFERS counts. Not knowing which build is deployed,
629
+ * and not knowing which build you are running, are both the normal state —
630
+ * offline, mid-redeploy, a dev server — and neither is evidence of a newer
631
+ * build. Prompting on either would show the notice to everyone, forever. */
632
+ declare function shouldPromptForNewVersion(current: string | null | undefined, deployed: string | null | undefined): boolean;
633
+ /**
634
+ * Whether the server is serving a newer build than this tab is running.
635
+ *
636
+ * Latches once true: a build cannot become un-new, and flickering the prompt
637
+ * because one poll failed would be worse than not showing it.
638
+ *
639
+ * This was three near-identical copies — Artifax's and Photogenix's hooks of
640
+ * this name and CXO's toast — differing only in quote style, the name of the
641
+ * build-id global, and whether they handled a 204. They handle it here.
642
+ */
643
+ declare function useNewVersionAvailable(options?: IUseNewVersionAvailableOptions): boolean;
644
+
645
+ interface IScNewVersionNoticeProps extends IUseNewVersionAvailableOptions {
646
+ title?: ReactNode;
647
+ description?: ReactNode;
648
+ refreshLabel?: ReactNode;
649
+ dismissLabel?: ReactNode;
650
+ /** Defaults to a plain `window.location.reload()`. Override only to save
651
+ * work first — and then still reload. */
652
+ onRefresh?: () => void;
653
+ testId?: string;
654
+ className?: string;
655
+ style?: CSSProperties;
656
+ }
657
+ /**
658
+ * Tell the user a newer build is deployed, and let them take it.
659
+ *
660
+ * DELIBERATELY NOT AUTOMATIC. Reloading under someone mid-sentence in a chat,
661
+ * mid-upload, or mid-form loses their work; every app that does this well asks
662
+ * rather than acts. It is persistent for the same reason — a notice about an
663
+ * update that disappears after five seconds is a notice nobody reads — and
664
+ * dismissible, because the next full page load picks the new version up
665
+ * regardless, so nothing is lost by ignoring it.
666
+ *
667
+ * TOP-RIGHT, because CXO raises this on a `Toaster` pinned there and the rest
668
+ * of the family follows it. Bottom-right puts the same message in a different
669
+ * corner of the same product family, and tends to land on a composer or a
670
+ * grid's controls — which is where someone is working.
671
+ */
672
+ declare function ScNewVersionNotice({ title, description, refreshLabel, dismissLabel, onRefresh, testId, className, style, ...availability }: IScNewVersionNoticeProps): React$1.ReactPortal | null;
673
+
600
674
  interface IScOnlyIconProps extends React.HTMLAttributes<HTMLDivElement> {
601
675
  className?: string;
602
676
  variant?: "default";
@@ -924,9 +998,26 @@ interface ScSidebarSearchTriggerProps {
924
998
  label?: string;
925
999
  shortcut?: string;
926
1000
  onClick?: () => void;
1001
+ /**
1002
+ * Hover or keyboard-focus, BEFORE the click — the host's cue to start
1003
+ * fetching whatever the search dialog needs.
1004
+ *
1005
+ * Every product opens this trigger onto a lazily-loaded dialog, and in CXO
1006
+ * and Artifax that dialog lives in `@streamoid/agent`: 5.3MB, behind a
1007
+ * `Suspense` fallback of `null`. So the FIRST click looked like it did
1008
+ * nothing at all while the chunk downloaded. Hovering is a strong enough
1009
+ * signal to pay for the same bytes the click needs a moment later, and it is
1010
+ * the reason this is on hover rather than on idle — most sessions never open
1011
+ * the dialog and should not download it.
1012
+ *
1013
+ * Must be cheap and idempotent: it fires on EVERY hover. A bare
1014
+ * `() => void import('@streamoid/agent')` is the intended shape — dynamic
1015
+ * imports are cached, so the second call costs nothing.
1016
+ */
1017
+ onPrefetch?: () => void;
927
1018
  className?: string;
928
1019
  }
929
- declare function ScSidebarSearchTrigger({ expanded, label, shortcut, onClick, className, }: ScSidebarSearchTriggerProps): JSX.Element;
1020
+ declare function ScSidebarSearchTrigger({ expanded, label, shortcut, onClick, onPrefetch, className, }: ScSidebarSearchTriggerProps): JSX.Element;
930
1021
  interface ScSidebarAppIdentityProps {
931
1022
  expanded: boolean;
932
1023
  product?: AppcardProduct | "streamoid";
@@ -969,6 +1060,58 @@ interface ScWorkspaceAccountMenuProps extends Omit<React.HTMLAttributes<HTMLDivE
969
1060
  /** Shared workspace/account menu used by every Streamoid application sidebar. */
970
1061
  declare function ScWorkspaceAccountMenu({ workspaceName, workspaceRole, workspaceImage, credits, onSwitchWorkspace, onInviteMembers, onBilling, organizationName, organizationRole, onOrganizationClick, accountName, accountEmail, accountImage, onAccountClick, themeMode, onThemeModeChange, className, ...props }: ScWorkspaceAccountMenuProps): JSX.Element;
971
1062
 
1063
+ /** The shape `matchesStreamoidSearchShortcut` needs — a subset of
1064
+ * `KeyboardEvent`, so the predicate is testable without a DOM. */
1065
+ interface StreamoidSearchShortcutEvent {
1066
+ key: string;
1067
+ metaKey: boolean;
1068
+ ctrlKey: boolean;
1069
+ altKey: boolean;
1070
+ }
1071
+ /**
1072
+ * Is this keydown the search chord?
1073
+ *
1074
+ * Pure and exported so the decision can be tested without a DOM, the same way
1075
+ * `resolvePanelResize` is split out of the resize handle.
1076
+ *
1077
+ * - `metaKey` OR `ctrlKey`, so one binding serves macOS and everything else.
1078
+ * - `altKey` is excluded, so ⌥⌘K and Ctrl+Alt+K stay with the browser.
1079
+ * - `event.key` and not `event.code`: `key` carries the CHARACTER, already
1080
+ * resolved through the keyboard layout. `code` is physical, so on AZERTY or
1081
+ * Dvorak the key labelled K is not `KeyK` and the shortcut would land under
1082
+ * a different letter than the `⌘ K` hint promises.
1083
+ */
1084
+ declare function matchesStreamoidSearchShortcut(event: StreamoidSearchShortcutEvent, letter?: string): boolean;
1085
+ interface StreamoidSearchShortcutOptions {
1086
+ /** Fired on ⌘K / Ctrl+K. Its identity does not matter — it is read through a
1087
+ * ref, so an inline arrow will not rebind the listener each render. */
1088
+ onTrigger: () => void;
1089
+ /** Bind the key. `false` unbinds — e.g. while a modal owns the keyboard. */
1090
+ enabled?: boolean;
1091
+ /** The letter pressed with the modifier. Case-insensitive. */
1092
+ letter?: string;
1093
+ }
1094
+ /**
1095
+ * ⌘K / Ctrl+K, for the dialog `ScSidebarSearchTrigger` advertises.
1096
+ *
1097
+ * The trigger has drawn a `⌘ K` hint since it shipped and NO APP EVER BOUND THE
1098
+ * KEY — the one affordance telling people the rail has a command bar did
1099
+ * nothing when used. This lives here so the component that makes the promise
1100
+ * and the hook that keeps it ship together, rather than each product
1101
+ * rediscovering the same eight lines and getting the modifier handling
1102
+ * slightly different.
1103
+ *
1104
+ * The host still owns the dialog's open state, so this reports the chord and
1105
+ * decides nothing. Wire it to a TOGGLE rather than an open: every other command
1106
+ * palette closes on the same chord that opened it.
1107
+ *
1108
+ * It calls `preventDefault`, because Ctrl+K is taken — Chrome and Firefox both
1109
+ * send it to the address bar, and without this the rail's own search loses to
1110
+ * the browser. And it fires even while a text field has focus, which is
1111
+ * deliberate: the chord is how you leave the field.
1112
+ */
1113
+ declare function useStreamoidSearchShortcut({ onTrigger, enabled, letter, }: StreamoidSearchShortcutOptions): void;
1114
+
972
1115
  interface StreamoidThemePreferenceOptions {
973
1116
  defaultMode?: ScShellThemeMode;
974
1117
  legacyStorageKeys?: string[];
@@ -1248,6 +1391,11 @@ interface AppSidebarHeader {
1248
1391
  searchLabel?: string;
1249
1392
  searchShortcut?: string;
1250
1393
  onSearchClick?: () => void;
1394
+ /** Hover/focus on the search trigger, so the host can start loading the
1395
+ * dialog before it is clicked. See `ScSidebarSearchTriggerProps.onPrefetch`
1396
+ * — the dialog is a 5.3MB lazy chunk in CXO and Artifax, and without this
1397
+ * the first click looks inert while it downloads. */
1398
+ onSearchPrefetch?: () => void;
1251
1399
  /** Omit the search field entirely — a product that has no search yet. */
1252
1400
  hideSearch?: boolean;
1253
1401
  }
@@ -2617,4 +2765,4 @@ interface IScProfilePopupProps extends React.HTMLAttributes<HTMLDivElement> {
2617
2765
  */
2618
2766
  declare const ScProfilePopup: React$1.ForwardRefExoticComponent<IScProfilePopupProps & React$1.RefAttributes<HTMLDivElement>>;
2619
2767
 
2620
- export { type AppSidebarAppIdentity, type AppSidebarAssistantCta, type AppSidebarCreditWarning, type AppSidebarHeader, type AppSidebarIconContext, type AppSidebarIconMap, type AppSidebarIconRenderer, type AppSidebarMenuItem, type AppSidebarProfile, type AppSidebarSection, type AppcardProduct, type ArtifaxMenuItem, type ArtifaxSection, type ArtifaxSidebarAppIdentity, type ArtifaxSidebarAssistantCta, type ArtifaxSidebarCreditWarning, type ArtifaxSidebarIconContext, type ArtifaxSidebarIconMap, type ArtifaxSidebarIconRenderer, type ArtifaxSidebarProfile, type AssistantCta, type CatalogixNavItem, type CatalogixSidebarCreditWarning, type CatalogixSidebarIconContext, type CatalogixSidebarIconMap, type CatalogixSidebarIconRenderer, type CatalogixSidebarProfile, type CatalogixSwitchApp, CreditWarningBanner, type CreditWarningBannerProps, type DescriptionVisibility, type IInvoiceHistoryMobileProps, type IScAccessProps, type IScAnnotatedError, type IScAppCardForCopilotProps, type IScAppCardProps, type IScAppCardV3Props, type IScAppFieldProps, type IScAppListingCardProps, type IScAppSidebarProps, type IScAppSwitchPanelProps, type IScAppcardLogosProps, type IScArtifaxInviteProps, type IScArtifaxSidebarProps, type IScAskAgentButtonProps, type IScBadgesProps, type IScBeaconProps, type IScBillingHistoryHeaderProps, type IScBillingHistoryTableListProps, type IScBillingLogsTableHeaderProps, type IScBillingLogsTableListProps, type IScBriefCardProps, type IScButtonProps, type IScCalendarDateCompsProps, type IScCalendarProps, type IScCatalogixInviteProps, type IScCatalogixSidebarProps, type IScCatalogixStoreHeaderProps, type IScCatalogixStoreTableListProps, type IScCheckFieldProps, type IScCheckboxProps, type IScCounterProps, type IScCreditsUsageCardMobileProps, type IScCreditsUsageCardProps, type IScCxoCopilotLogoProps, type IScCxoWordmarkProps, type IScDefaultCardProps, type IScDrawerProps, type IScErrorBoundaryProps, type IScErrorReport, type IScErrorReporterClient, type IScFieldButtonProps, type IScFileFieldProps, type IScGoogleSignInProps, type IScGuideProps, type IScHDividerProps, type IScHeaderProps, type IScImageFieldProps, type IScInChatListProps, type IScInChatMessageProps, type IScInfoPopupProps, type IScIntialProfileCoverProps, type IScLogoUnitProps, type IScMappingCardProps, type IScMediaApprovalProps, type IScMediaSelectProps, type IScMenuOptionsProps, type IScMobileBottomActionProps, type IScMobileTopNavProps, type IScModalProps, type IScOnlyFieldProps, type IScOnlyIconProps, type IScPaginationProps, type IScPairtextProps, type IScPanelResizeHandleProps, type IScPendingActionProps, type IScPhtogenixInviteProps, type IScPlanCardProps, type IScPlanComparisonProps, type IScPlanDetailsCardMobileProps, type IScPlanDetailsCardProps, type IScPopUpMenuProps, type IScPopoverArrowProps, type IScProfileImageUpdateProps, type IScProfileOptionsProps, type IScProfilePopupProps, type IScProfileProps, type IScProfileSettingsCompProps, type IScProfileV2MobileProps, type IScProgressBarProps, type IScQuickPromptProps, type IScRadioProps, type IScReferralCardMobileProps, type IScReferralTableHeaderProps, type IScReferralTableListProps, type IScRoleMobileProps, type IScRoleProps, type IScSelectOption, type IScSelectProps, type IScSelectionListProps, type IScSelectionPillGroupProps, type IScSelectionPillOption, type IScSelectionPillProps, type IScSelectionProps, type IScSettingsNavProps, type IScSettingsTabCompProps, type IScSideBarLogoUnitProps, type IScSidebarIconsProps, type IScSidebarMenuProps, type IScSidebarPopoverProps, type IScSidebarProfileProps, type IScSidebarProps, type IScSidebarSwitchMenuProps, type IScSliderProps, type IScStoreCardProps, type IScStrLogoProps, type IScStreamoidMascotProps, type IScStreamoidWordmarkProps, type IScSubAgentProps, type IScTabCompProps, type IScTabFieldProps, type IScTabSwitcherProps, type IScTableHeaderProps, type IScTableListMobileProps, type IScTableListProps, type IScTabsProps, type IScTaxonomyPillProps, type IScTextAreaProps, type IScTextFieldProps, type IScThinkingStepIconProps, type IScTodoItem, type IScTodoListProps, type IScToggleSwitchProps, type IScVDividerProps, type IScValueMappingL1Props, type IScVersionProps, type IScWorkspaceCardProps, type IScWorkspaceSettingsMobileProps, type IScWorkspaceSwitchMobileProps, type IScWorkspaceSwitchMobileV2Props, type IUsageHistoryMobileProps, type IcListIconState, InvoiceHistoryMobile, NscWorkspaceSwitch, PANEL_RESIZE_STEP_PX, type PanelResizeEdge, type PanelResizeGesture, type PanelWidthBounds, type PlanComparisonRow, type PlanComparisonSection, type PlanFeatureSection, ProductCollapsedMark, ProductWordmark, SC_APP_SWITCH_PANEL_WIDTH, SC_WORKSPACE_MENU_WIDTH, SIDEBAR_RESIZE_THRESHOLD_PX, STREAMOID_CHANGELOG_URL, STREAMOID_CHANGELOG_URLS, STREAMOID_STATUS_PAGE_URL, ScAccess, ScAppCard, ScAppCardForCopilot, ScAppCardV3, ScAppField, ScAppListingCard, ScAppSidebar, type ScAppSwitchItem, ScAppSwitchPanel, ScAppSwitchRow, type ScAppSwitchSystemItem, type ScAppSwitchUtilities, ScAppcardLogos, ScArtifaxInvite, ScArtifaxSidebar, ScAskAgentButton, ScAskAgentSlot, ScBadges, ScBeacon, type ScBeaconTone, ScBillingHistoryHeader, ScBillingHistoryTableList, ScBillingLogsTableHeader, ScBillingLogsTableList, ScBriefCard, ScButton, ScCalendar, ScCalendarDateComps, ScCatalogixInvite, ScCatalogixSidebar, ScCatalogixStoreHeader, ScCatalogixStoreTableList, ScCheckField, ScCheckbox, ScCounter, ScCreditsUsageCard, ScCreditsUsageCardMobile, ScCxoCopilotLogo, ScCxoWordmark, ScDefaultCard, ScDp, type ScDpProps, ScDrawer, ScErrorBoundary, type ScErrorReporter, ScFieldButton, ScFileField, ScGoogleSignIn, ScGuide, ScHDivider, ScHeader, ScImageField, ScInChatList, ScInChatMessage, ScInfoPopup, ScIntialProfileCover, ScLogoUnit, ScMappingCard, ScMediaApproval, ScMediaSelect, ScMenuOptions, ScMobileBottomAction, ScMobileTopNav, ScModal, ScOnlyField, ScOnlyIcon, ScPagination, ScPairtext, ScPanelResizeHandle, ScPendingAction, ScPhtogenixInvite, ScPlanCard, ScPlanComparison, ScPlanDetailsCard, ScPlanDetailsCardMobile, ScPopUpMenu, ScPopoverArrow, ScProfile, ScProfileImageUpdate, ScProfileOptions, ScProfilePopup, type ScProfilePopupThemeMode, ScProfileSettingsComp, ScProfileV2Mobile, ScProgressBar, ScQuickPrompt, ScRadio, ScReferralCardMobile, ScReferralTableHeader, ScReferralTableList, ScRole, ScRoleMobile, ScSelect, ScSelection, ScSelectionList, ScSelectionPill, ScSelectionPillGroup, ScSettingsNav, ScSettingsTabComp, type ScShellThemeMode, ScSideBarLogoUnit, ScSidebar, ScSidebarAppIdentity, type ScSidebarAppIdentityProps, ScSidebarIcons, ScSidebarMenu, ScSidebarPopover, ScSidebarProfile, ScSidebarResizeHandle, type ScSidebarResizeHandleProps, ScSidebarSearchTrigger, type ScSidebarSearchTriggerProps, ScSidebarSwitchMenu, ScSidebarWorkspaceTrigger, type ScSidebarWorkspaceTriggerProps, ScSlider, ScStoreCard, ScStrLogo, ScStreamoidMascot, ScStreamoidWordmark, ScSubAgent, type ScTab, ScTabComp, ScTabField, ScTabSwitcher, ScTableHeader, ScTableList, ScTableListMobile, ScTabs, ScTaxonomyPill, ScTextArea, ScTextField, ScThinkingStepIcon, ScTodoList, ScToggleSwitch, ScVDivider, ScValueMappingL1, ScVersion, ScWorkspaceAccountMenu, type ScWorkspaceAccountMenuProps, ScWorkspaceCard, ScWorkspaceSettingsMobile, ScWorkspaceSwitchCard, type ScWorkspaceSwitchCardProps, ScWorkspaceSwitchMobile, ScWorkspaceSwitchMobileV2, type SelectionListState, type SidebarAppIdentityConfig, type SidebarConfig, type SidebarIconContext, type SidebarIconMap, type SidebarIconRenderer, type SidebarMenuItemConfig, type SidebarProduct, type SidebarProfileConfig, type SidebarResizeGestureResult, type SidebarResizeGestureState, type SidebarSectionConfig, type StreamoidAnchorRect, type StreamoidAnchoredPopover, type StreamoidAnchoredPopoverArrow, type StreamoidAnchoredPopoverGeometry, type StreamoidAnchoredPopoverPosition, type StreamoidAnchoredPopoverPositionOptions, type StreamoidAppSwitchGroup, type StreamoidAppSwitchOptions, type StreamoidAppSwitchProduct, type StreamoidPanelWidthOptions, type StreamoidPanelWidthState, StreamoidSidebar, type StreamoidSidebarPopoverPlacement, type StreamoidSidebarPopoverPosition, type StreamoidSidebarPopoverPositionOptions, type StreamoidSidebarPreferenceOptions, type StreamoidSidebarPreferenceState, type StreamoidSidebarProps, type StreamoidThemePreferenceOptions, type StreamoidThemePreferenceState, StreamoidWorkspaceSwitcher, type StreamoidWorkspaceSwitcherProps, UsageHistoryMobile, type WorkspaceSwitcherConfig, type WorkspaceSwitcherItem, advanceSidebarResizeGesture, clampPanelWidth, createStreamoidAppSwitchUtilities, formatStreamoidAppVersion, formatSubAgentLabel, hasCollapsedMark, resolveAnchoredPopoverArrow, resolveAnchoredPopoverPosition, resolvePanelResize, resolvePanelResizeKey, scAppSwitchOrder, scCreatePostHogReporter, scGetErrorRef, streamoidAppSwitchGroups, streamoidAppSwitchTagline, streamoidChangelogUrl, useStreamoidAnchoredPopover, useStreamoidAnchoredPopoverPosition, useStreamoidPanelWidth, useStreamoidSidebarPopoverPosition, useStreamoidSidebarPreference, useStreamoidThemePreference };
2768
+ export { type AppSidebarAppIdentity, type AppSidebarAssistantCta, type AppSidebarCreditWarning, type AppSidebarHeader, type AppSidebarIconContext, type AppSidebarIconMap, type AppSidebarIconRenderer, type AppSidebarMenuItem, type AppSidebarProfile, type AppSidebarSection, type AppcardProduct, type ArtifaxMenuItem, type ArtifaxSection, type ArtifaxSidebarAppIdentity, type ArtifaxSidebarAssistantCta, type ArtifaxSidebarCreditWarning, type ArtifaxSidebarIconContext, type ArtifaxSidebarIconMap, type ArtifaxSidebarIconRenderer, type ArtifaxSidebarProfile, type AssistantCta, type CatalogixNavItem, type CatalogixSidebarCreditWarning, type CatalogixSidebarIconContext, type CatalogixSidebarIconMap, type CatalogixSidebarIconRenderer, type CatalogixSidebarProfile, type CatalogixSwitchApp, CreditWarningBanner, type CreditWarningBannerProps, type DescriptionVisibility, type IInvoiceHistoryMobileProps, type IScAccessProps, type IScAnnotatedError, type IScAppCardForCopilotProps, type IScAppCardProps, type IScAppCardV3Props, type IScAppFieldProps, type IScAppListingCardProps, type IScAppSidebarProps, type IScAppSwitchPanelProps, type IScAppcardLogosProps, type IScArtifaxInviteProps, type IScArtifaxSidebarProps, type IScAskAgentButtonProps, type IScBadgesProps, type IScBeaconProps, type IScBillingHistoryHeaderProps, type IScBillingHistoryTableListProps, type IScBillingLogsTableHeaderProps, type IScBillingLogsTableListProps, type IScBriefCardProps, type IScButtonProps, type IScCalendarDateCompsProps, type IScCalendarProps, type IScCatalogixInviteProps, type IScCatalogixSidebarProps, type IScCatalogixStoreHeaderProps, type IScCatalogixStoreTableListProps, type IScCheckFieldProps, type IScCheckboxProps, type IScCounterProps, type IScCreditsUsageCardMobileProps, type IScCreditsUsageCardProps, type IScCxoCopilotLogoProps, type IScCxoWordmarkProps, type IScDefaultCardProps, type IScDrawerProps, type IScErrorBoundaryProps, type IScErrorReport, type IScErrorReporterClient, type IScFieldButtonProps, type IScFileFieldProps, type IScGoogleSignInProps, type IScGuideProps, type IScHDividerProps, type IScHeaderProps, type IScImageFieldProps, type IScInChatListProps, type IScInChatMessageProps, type IScInfoPopupProps, type IScIntialProfileCoverProps, type IScLogoUnitProps, type IScMappingCardProps, type IScMediaApprovalProps, type IScMediaSelectProps, type IScMenuOptionsProps, type IScMobileBottomActionProps, type IScMobileTopNavProps, type IScModalProps, type IScNewVersionNoticeProps, type IScOnlyFieldProps, type IScOnlyIconProps, type IScPaginationProps, type IScPairtextProps, type IScPanelResizeHandleProps, type IScPendingActionProps, type IScPhtogenixInviteProps, type IScPlanCardProps, type IScPlanComparisonProps, type IScPlanDetailsCardMobileProps, type IScPlanDetailsCardProps, type IScPopUpMenuProps, type IScPopoverArrowProps, type IScProfileImageUpdateProps, type IScProfileOptionsProps, type IScProfilePopupProps, type IScProfileProps, type IScProfileSettingsCompProps, type IScProfileV2MobileProps, type IScProgressBarProps, type IScQuickPromptProps, type IScRadioProps, type IScReferralCardMobileProps, type IScReferralTableHeaderProps, type IScReferralTableListProps, type IScRoleMobileProps, type IScRoleProps, type IScSelectOption, type IScSelectProps, type IScSelectionListProps, type IScSelectionPillGroupProps, type IScSelectionPillOption, type IScSelectionPillProps, type IScSelectionProps, type IScSettingsNavProps, type IScSettingsTabCompProps, type IScSideBarLogoUnitProps, type IScSidebarIconsProps, type IScSidebarMenuProps, type IScSidebarPopoverProps, type IScSidebarProfileProps, type IScSidebarProps, type IScSidebarSwitchMenuProps, type IScSliderProps, type IScStoreCardProps, type IScStrLogoProps, type IScStreamoidMascotProps, type IScStreamoidWordmarkProps, type IScSubAgentProps, type IScTabCompProps, type IScTabFieldProps, type IScTabSwitcherProps, type IScTableHeaderProps, type IScTableListMobileProps, type IScTableListProps, type IScTabsProps, type IScTaxonomyPillProps, type IScTextAreaProps, type IScTextFieldProps, type IScThinkingStepIconProps, type IScTodoItem, type IScTodoListProps, type IScToggleSwitchProps, type IScVDividerProps, type IScValueMappingL1Props, type IScVersionProps, type IScWorkspaceCardProps, type IScWorkspaceSettingsMobileProps, type IScWorkspaceSwitchMobileProps, type IScWorkspaceSwitchMobileV2Props, type IUsageHistoryMobileProps, type IUseNewVersionAvailableOptions, type IcListIconState, InvoiceHistoryMobile, NscWorkspaceSwitch, PANEL_RESIZE_STEP_PX, type PanelResizeEdge, type PanelResizeGesture, type PanelWidthBounds, type PlanComparisonRow, type PlanComparisonSection, type PlanFeatureSection, ProductCollapsedMark, ProductWordmark, SC_APP_SWITCH_PANEL_WIDTH, SC_WORKSPACE_MENU_WIDTH, SIDEBAR_RESIZE_THRESHOLD_PX, STREAMOID_CHANGELOG_URL, STREAMOID_CHANGELOG_URLS, STREAMOID_STATUS_PAGE_URL, ScAccess, ScAppCard, ScAppCardForCopilot, ScAppCardV3, ScAppField, ScAppListingCard, ScAppSidebar, type ScAppSwitchItem, ScAppSwitchPanel, ScAppSwitchRow, type ScAppSwitchSystemItem, type ScAppSwitchUtilities, ScAppcardLogos, ScArtifaxInvite, ScArtifaxSidebar, ScAskAgentButton, ScAskAgentSlot, ScBadges, ScBeacon, type ScBeaconTone, ScBillingHistoryHeader, ScBillingHistoryTableList, ScBillingLogsTableHeader, ScBillingLogsTableList, ScBriefCard, ScButton, ScCalendar, ScCalendarDateComps, ScCatalogixInvite, ScCatalogixSidebar, ScCatalogixStoreHeader, ScCatalogixStoreTableList, ScCheckField, ScCheckbox, ScCounter, ScCreditsUsageCard, ScCreditsUsageCardMobile, ScCxoCopilotLogo, ScCxoWordmark, ScDefaultCard, ScDp, type ScDpProps, ScDrawer, ScErrorBoundary, type ScErrorReporter, ScFieldButton, ScFileField, ScGoogleSignIn, ScGuide, ScHDivider, ScHeader, ScImageField, ScInChatList, ScInChatMessage, ScInfoPopup, ScIntialProfileCover, ScLogoUnit, ScMappingCard, ScMediaApproval, ScMediaSelect, ScMenuOptions, ScMobileBottomAction, ScMobileTopNav, ScModal, ScNewVersionNotice, ScOnlyField, ScOnlyIcon, ScPagination, ScPairtext, ScPanelResizeHandle, ScPendingAction, ScPhtogenixInvite, ScPlanCard, ScPlanComparison, ScPlanDetailsCard, ScPlanDetailsCardMobile, ScPopUpMenu, ScPopoverArrow, ScProfile, ScProfileImageUpdate, ScProfileOptions, ScProfilePopup, type ScProfilePopupThemeMode, ScProfileSettingsComp, ScProfileV2Mobile, ScProgressBar, ScQuickPrompt, ScRadio, ScReferralCardMobile, ScReferralTableHeader, ScReferralTableList, ScRole, ScRoleMobile, ScSelect, ScSelection, ScSelectionList, ScSelectionPill, ScSelectionPillGroup, ScSettingsNav, ScSettingsTabComp, type ScShellThemeMode, ScSideBarLogoUnit, ScSidebar, ScSidebarAppIdentity, type ScSidebarAppIdentityProps, ScSidebarIcons, ScSidebarMenu, ScSidebarPopover, ScSidebarProfile, ScSidebarResizeHandle, type ScSidebarResizeHandleProps, ScSidebarSearchTrigger, type ScSidebarSearchTriggerProps, ScSidebarSwitchMenu, ScSidebarWorkspaceTrigger, type ScSidebarWorkspaceTriggerProps, ScSlider, ScStoreCard, ScStrLogo, ScStreamoidMascot, ScStreamoidWordmark, ScSubAgent, type ScTab, ScTabComp, ScTabField, ScTabSwitcher, ScTableHeader, ScTableList, ScTableListMobile, ScTabs, ScTaxonomyPill, ScTextArea, ScTextField, ScThinkingStepIcon, ScTodoList, ScToggleSwitch, ScVDivider, ScValueMappingL1, ScVersion, ScWorkspaceAccountMenu, type ScWorkspaceAccountMenuProps, ScWorkspaceCard, ScWorkspaceSettingsMobile, ScWorkspaceSwitchCard, type ScWorkspaceSwitchCardProps, ScWorkspaceSwitchMobile, ScWorkspaceSwitchMobileV2, type SelectionListState, type SidebarAppIdentityConfig, type SidebarConfig, type SidebarIconContext, type SidebarIconMap, type SidebarIconRenderer, type SidebarMenuItemConfig, type SidebarProduct, type SidebarProfileConfig, type SidebarResizeGestureResult, type SidebarResizeGestureState, type SidebarSectionConfig, type StreamoidAnchorRect, type StreamoidAnchoredPopover, type StreamoidAnchoredPopoverArrow, type StreamoidAnchoredPopoverGeometry, type StreamoidAnchoredPopoverPosition, type StreamoidAnchoredPopoverPositionOptions, type StreamoidAppSwitchGroup, type StreamoidAppSwitchOptions, type StreamoidAppSwitchProduct, type StreamoidPanelWidthOptions, type StreamoidPanelWidthState, type StreamoidSearchShortcutEvent, type StreamoidSearchShortcutOptions, StreamoidSidebar, type StreamoidSidebarPopoverPlacement, type StreamoidSidebarPopoverPosition, type StreamoidSidebarPopoverPositionOptions, type StreamoidSidebarPreferenceOptions, type StreamoidSidebarPreferenceState, type StreamoidSidebarProps, type StreamoidThemePreferenceOptions, type StreamoidThemePreferenceState, StreamoidWorkspaceSwitcher, type StreamoidWorkspaceSwitcherProps, UsageHistoryMobile, type WorkspaceSwitcherConfig, type WorkspaceSwitcherItem, advanceSidebarResizeGesture, clampPanelWidth, createStreamoidAppSwitchUtilities, formatStreamoidAppVersion, formatSubAgentLabel, hasCollapsedMark, matchesStreamoidSearchShortcut, parseVersionManifest, resolveAnchoredPopoverArrow, resolveAnchoredPopoverPosition, resolvePanelResize, resolvePanelResizeKey, scAppSwitchOrder, scCreatePostHogReporter, scGetErrorRef, shouldPromptForNewVersion, streamoidAppSwitchGroups, streamoidAppSwitchTagline, streamoidChangelogUrl, useNewVersionAvailable, useStreamoidAnchoredPopover, useStreamoidAnchoredPopoverPosition, useStreamoidPanelWidth, useStreamoidSearchShortcut, useStreamoidSidebarPopoverPosition, useStreamoidSidebarPreference, useStreamoidThemePreference };