@streamoid/ui 0.6.30 → 0.6.31

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.
@@ -166,7 +166,7 @@ theme-aware (dark on `:root`, light override) — never hardcode a colour.
166
166
 
167
167
  - **`CreditWarningBanner`** — use when you need the "you're nearly out of credits" nudge in a sidebar rail, in either expanded or collapsed form.
168
168
  - **`ScAppSwitchPanel`** — use when you need the "go to another Streamoid product" list — in `StreamoidSidebar`'s `switchPanel`, or in your own portalled flyout.
169
- - also documented here: `ScAppSwitchRow`, `createStreamoidAppSwitchUtilities`, `streamoidAppSwitchTagline`, `streamoidChangelogUrl`, `STREAMOID_CHANGELOG_URLS`, `STREAMOID_CHANGELOG_URL`, `STREAMOID_STATUS_PAGE_URL`
169
+ - also documented here: `ScAppSwitchRow`, `scAppSwitchOrder`, `createStreamoidAppSwitchUtilities`, `streamoidAppSwitchTagline`, `streamoidChangelogUrl`, `STREAMOID_CHANGELOG_URLS`, `STREAMOID_CHANGELOG_URL`, `STREAMOID_STATUS_PAGE_URL`
170
170
  - **`ScArtifaxSidebar`** — use when you are working on the Artifax (or Tactix) shell, or you need a sidebar whose sections the user can collapse.
171
171
  - **`ScAskAgentButton`** — use when you need the assistant-panel CTA **outside** a DS sidebar. Inside one, use the sidebar's `assistantCta` prop instead.
172
172
  - also documented here: `ScAskAgentSlot`, `AssistantCta`
@@ -180,8 +180,8 @@ theme-aware (dark on `:root`, light override) — never hardcode a colour.
180
180
  - **`ScSidebarProfile`** _(legacy)_ — use when never. There is no way to pass a real user through it.
181
181
  - **`ScSidebarSwitchMenu`** — use when you're building a "switch to another product" list inside a sidebar and each entry needs a name **and** a subtitle.
182
182
  - **`ScVersion`** _(legacy)_ — use when never. `StreamoidSidebar` renders its own version footer inline from `versionText`.
183
- - **`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 the upper-right workspace menu and lower-right app switcher instead of hard-coded host coordinates.
184
- - also documented here: `ScSidebarWorkspaceTrigger`, `ScSidebarSearchTrigger`, `ScSidebarAppIdentity`, `useStreamoidThemePreference`, `useStreamoidSidebarPreference`, `useStreamoidSidebarPopoverPosition`
183
+ - **`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.
184
+ - also documented here: `ScSidebarWorkspaceTrigger`, `ScSidebarSearchTrigger`, `ScSidebarAppIdentity`, `useStreamoidThemePreference`, `useStreamoidSidebarPreference`, `useStreamoidSidebarPopoverPosition`, `useStreamoidAnchoredPopoverPosition`, `resolveAnchoredPopoverPosition`
185
185
  - **`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.
186
186
  - also documented here: `ScSidebarResizeHandle`, `advanceSidebarResizeGesture`, `SIDEBAR_RESIZE_THRESHOLD_PX`
187
187
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  component: ScAppSwitchPanel
3
- also_exports: [ScAppSwitchRow, createStreamoidAppSwitchUtilities, streamoidAppSwitchTagline, streamoidChangelogUrl, STREAMOID_CHANGELOG_URLS, STREAMOID_CHANGELOG_URL, STREAMOID_STATUS_PAGE_URL]
3
+ also_exports: [ScAppSwitchRow, scAppSwitchOrder, createStreamoidAppSwitchUtilities, streamoidAppSwitchTagline, streamoidChangelogUrl, STREAMOID_CHANGELOG_URLS, STREAMOID_CHANGELOG_URL, STREAMOID_STATUS_PAGE_URL]
4
4
  package: "@streamoid/ui"
5
5
  category: sidebar
6
6
  status: stable
@@ -36,7 +36,9 @@ card, no border and no background: the surrounding sidebar or flyout supplies th
36
36
  3. Matching is a **substring** test over `` `${key} ${name}`.toLowerCase() ``. A key
37
37
  containing `"cxo"` or `"streamoid"` gets the **CXO** wordmark — but the four
38
38
  product names are matched first, so `"Streamoid Catalogix"` is Catalogix.
39
- 4. It does **not** exclude the current app. That's the host's job.
39
+ 4. **Pass every product, including the one you are in**, marked `current`.
40
+ Omitting it (which hosts used to do) changes the list's length per surface,
41
+ so rows move between apps and the hub has no row in its own switcher.
40
42
 
41
43
  ---
42
44
 
@@ -59,8 +61,13 @@ import "@streamoid/ui/dist/index.css"; // once, at your app root
59
61
  ```tsx
60
62
  <ScAppSwitchPanel
61
63
  apps={[
62
- { key: "artifax", name: "Artifax", onSelect: () => open(artifaxUrl) },
64
+ // Every product, always, in every app. `current` marks where you are; its
65
+ // `onSelect` is never called, so a no-op is fine.
66
+ { key: "cxo", name: "CXO", onSelect: () => open(cxoUrl) },
67
+ { key: "tactix", name: "Tactix", onSelect: () => open(tactixUrl) },
68
+ { key: "artifax", name: "Artifax", current: true, onSelect: () => {} },
63
69
  { key: "photogenix", name: "Photogenix", onSelect: () => open(photogenixUrl) },
70
+ { key: "catalogix", name: "Catalogix", onSelect: () => open(catalogixUrl) },
64
71
  ]}
65
72
  utilities={{
66
73
  appVersion: APP_VERSION,
@@ -86,6 +93,11 @@ import "@streamoid/ui/dist/index.css"; // once, at your app root
86
93
  |---|---|---|---|
87
94
  | `item` | `ScAppSwitchItem` | — | **Required.** The only prop — no `className`, no `style`. Rarely used directly; the panel renders one per app. |
88
95
 
96
+ ### `scAppSwitchOrder(apps)`
97
+
98
+ The canonical ordering, exported so a host (or a test) can assert the row order
99
+ without rendering. The panel applies it already — hosts do not need to sort.
100
+
89
101
  ### `ScAppSwitchItem`
90
102
 
91
103
  | Field | Type | Notes |
@@ -93,7 +105,8 @@ import "@streamoid/ui/dist/index.css"; // once, at your app root
93
105
  | `key` | `string` | React key **and** half of the wordmark-matching string. |
94
106
  | `name` | `string` | Matching input, and the fallback label. ⚠️ **Not rendered** when a wordmark matches. Always used for the row's `aria-label` (`"Switch to {name}"`). |
95
107
  | `description` | `string` | Optional. Ignored for known products (the panel uses the canonical tagline). Shown only for unknown products. |
96
- | `onSelect` | `() => void` | Row click. |
108
+ | `current` | `boolean` | Optional. This is the app you are in: the row is filled (`--alias-fill-neutral-neutralselected`), carries a **check** instead of the chevron, gets `aria-current="true"` + `aria-disabled`, and does **not** call `onSelect`. It stays focusable on purpose — it is the answer to "where am I". |
109
+ | `onSelect` | `() => void` | Row click. Never called on the `current` row. |
97
110
 
98
111
  ### Wordmark matching + canonical order
99
112
 
@@ -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, useStreamoidThemePreference, useStreamoidSidebarPreference, useStreamoidSidebarPopoverPosition]
12
+ also_exports: [ScSidebarWorkspaceTrigger, ScSidebarSearchTrigger, ScSidebarAppIdentity, useStreamoidThemePreference, useStreamoidSidebarPreference, useStreamoidSidebarPopoverPosition, useStreamoidAnchoredPopoverPosition, resolveAnchoredPopoverPosition]
13
13
  ---
14
14
 
15
15
  # Shared Streamoid sidebar shell
@@ -27,8 +27,14 @@ shared popover-position hook keeps the desktop anchors consistent.
27
27
  `ScSidebarAppIdentity` for the matching constant rail controls.
28
28
  - Use the two preference hooks so theme and expanded/collapsed state survive an
29
29
  app switch across Streamoid subdomains.
30
- - Use `useStreamoidSidebarPopoverPosition` for the upper-right workspace menu
31
- and lower-right app switcher instead of hard-coded host coordinates.
30
+ - Use `useStreamoidSidebarPopoverPosition` for a panel that belongs to the
31
+ whole rail (the upper-right workspace menu) instead of hard-coded host
32
+ coordinates.
33
+ - Use `useStreamoidAnchoredPopoverPosition` for a panel that belongs to a
34
+ BUTTON — the app switcher's grid trigger, a row's overflow menu. Pinning one
35
+ of those to the sidebar card's edge leaves it floating mid-canvas with nothing
36
+ connecting it to what was clicked; in Artifax it landed over the chat
37
+ composer and its Send button.
32
38
 
33
39
  ## 1. How to use it
34
40
 
@@ -50,12 +56,33 @@ const workspaceMenuPosition = useStreamoidSidebarPopoverPosition(sidebarRef, {
50
56
  placement: "top-right",
51
57
  width: 320,
52
58
  });
53
- const appSwitcherPosition = useStreamoidSidebarPopoverPosition(sidebarRef, {
54
- placement: "bottom-right",
55
- width: 240,
56
- });
59
+ // Tethered to the trigger, flipping only to stay on screen: beside the button
60
+ // and running down from its top edge, to the button's other side when that side
61
+ // has no room, and upward (bottom aligned to the trigger) when there is no room
62
+ // below — which is what a footer grid button gets.
63
+ const appSwitcherPosition = useStreamoidAnchoredPopoverPosition(
64
+ triggerRef,
65
+ panelRef,
66
+ { width: 240 },
67
+ );
57
68
  ```
58
69
 
70
+ ### `useStreamoidAnchoredPopoverPosition(anchorRef, panelRef, options)`
71
+
72
+ | Option | Type | Default | Purpose |
73
+ |---|---|---|---|
74
+ | `width` | `number` | — | **Required.** Panel width; narrowed to the viewport when it cannot fit. |
75
+ | `gap` | `number` | `8` | Distance between the trigger and the panel. |
76
+ | `inset` | `number` | `16` | Keep-out margin from the viewport edges. |
77
+
78
+ Pass a ref to the panel as well as the trigger: the vertical flip needs the
79
+ panel's measured height, so the first frame opens downward and settles once
80
+ measured. Re-measures on resize, on scroll (capture phase — a rail can scroll
81
+ without bubbling), and while either element changes size.
82
+
83
+ `resolveAnchoredPopoverPosition(geometry)` is the same rules as a pure
84
+ function, exported for hosts that position their own portal and for tests.
85
+
59
86
  | Prop | Type | Default | Purpose |
60
87
  |---|---|---|---|
61
88
  | `workspaceName` | `string` | required | Current workspace label. |
@@ -162,6 +162,7 @@
162
162
  ],
163
163
  "alsoExports": [
164
164
  "ScAppSwitchRow",
165
+ "scAppSwitchOrder",
165
166
  "createStreamoidAppSwitchUtilities",
166
167
  "streamoidAppSwitchTagline",
167
168
  "streamoidChangelogUrl",
@@ -2757,7 +2758,7 @@
2757
2758
  "status": "stable",
2758
2759
  "renders": "div",
2759
2760
  "summary": "Reach for it when:",
2760
- "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 the upper-right workspace menu and lower-right app switcher instead of hard-coded host coordinates.",
2761
+ "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.",
2761
2762
  "tags": [
2762
2763
  "sidebar",
2763
2764
  "workspace",
@@ -2793,7 +2794,9 @@
2793
2794
  "ScSidebarAppIdentity",
2794
2795
  "useStreamoidThemePreference",
2795
2796
  "useStreamoidSidebarPreference",
2796
- "useStreamoidSidebarPopoverPosition"
2797
+ "useStreamoidSidebarPopoverPosition",
2798
+ "useStreamoidAnchoredPopoverPosition",
2799
+ "resolveAnchoredPopoverPosition"
2797
2800
  ],
2798
2801
  "exported": true
2799
2802
  },
@@ -4912,6 +4915,10 @@
4912
4915
  "documentedIn": "ScAppSwitchPanel",
4913
4916
  "doc": "ScAppSwitchPanel.md"
4914
4917
  },
4918
+ "scAppSwitchOrder": {
4919
+ "documentedIn": "ScAppSwitchPanel",
4920
+ "doc": "ScAppSwitchPanel.md"
4921
+ },
4915
4922
  "createStreamoidAppSwitchUtilities": {
4916
4923
  "documentedIn": "ScAppSwitchPanel",
4917
4924
  "doc": "ScAppSwitchPanel.md"
@@ -5024,6 +5031,14 @@
5024
5031
  "documentedIn": "ScWorkspaceAccountMenu",
5025
5032
  "doc": "ScWorkspaceAccountMenu.md"
5026
5033
  },
5034
+ "useStreamoidAnchoredPopoverPosition": {
5035
+ "documentedIn": "ScWorkspaceAccountMenu",
5036
+ "doc": "ScWorkspaceAccountMenu.md"
5037
+ },
5038
+ "resolveAnchoredPopoverPosition": {
5039
+ "documentedIn": "ScWorkspaceAccountMenu",
5040
+ "doc": "ScWorkspaceAccountMenu.md"
5041
+ },
5027
5042
  "formatSubAgentLabel": {
5028
5043
  "documentedIn": "ScSubAgent",
5029
5044
  "doc": "ScSubAgent.md"
package/dist/index.d.mts CHANGED
@@ -51,7 +51,13 @@ interface IScAppCardForCopilotProps {
51
51
  declare function ScAppCardForCopilot({ product, subText, onClick, className, style, }: IScAppCardForCopilotProps): JSX.Element;
52
52
 
53
53
  /** One switchable product, supplied by the host app (built from its service
54
- * catalog). The current app is expected to be excluded by the host. */
54
+ * catalog).
55
+ *
56
+ * PASS EVERY PRODUCT, INCLUDING THE ONE YOU ARE IN, and mark that one
57
+ * `current`. Hosts used to omit it, which made the list a different length in
58
+ * every app: position two was Artifax in one surface and Tactix in another, so
59
+ * no muscle memory could form — and the hub had no row at all in its own
60
+ * switcher, leaving nowhere visible to "go" to. */
55
61
  interface ScAppSwitchItem {
56
62
  key: string;
57
63
  /** Product name — used to match the product wordmark (and as fallback text). */
@@ -59,6 +65,9 @@ interface ScAppSwitchItem {
59
65
  /** Subtitle under the wordmark. Known products ignore this and use the
60
66
  * canonical tagline from `PRODUCT_BRANDS`. Unknown products render it. */
61
67
  description?: string;
68
+ /** This is where you already are: the row reads as selected, carries a check
69
+ * instead of a chevron, and does not navigate. `onSelect` is never called. */
70
+ current?: boolean;
62
71
  onSelect: () => void;
63
72
  }
64
73
  /** Optional platform action shown beneath the product list. The host owns the
@@ -106,13 +115,20 @@ declare function createStreamoidAppSwitchUtilities(utilities: ScAppSwitchUtiliti
106
115
  /** Canonical switcher tagline for a known product. Hosts should not copy this
107
116
  * map — `ScAppSwitchRow` applies it. Unknown products return undefined. */
108
117
  declare function streamoidAppSwitchTagline(key: string, name: string): string | undefined;
118
+ /** The rows in canonical order — the same list, in the same places, in every
119
+ * app. Exported so hosts and tests can assert the order without rendering;
120
+ * `ScAppSwitchPanel` applies it, so hosts need not sort. */
121
+ declare function scAppSwitchOrder(apps: ScAppSwitchItem[]): ScAppSwitchItem[];
109
122
  /** One switch row: product wordmark + canonical tagline. */
110
123
  declare const ScAppSwitchRow: ({ item, }: {
111
124
  item: ScAppSwitchItem;
112
125
  }) => JSX.Element;
113
- /** Shared product-switch list — the same across every Streamoid app. The host
114
- * passes its product list (current app excluded) and its own logo lives in the
115
- * surrounding sidebar; only this content is identical everywhere. */
126
+ /** Shared product-switch list — the same across every Streamoid app.
127
+ *
128
+ * The host passes EVERY product, including the one it is, marked `current`.
129
+ * The list is therefore the same length and the same order everywhere, so a
130
+ * row never moves under the pointer between surfaces, and the app you are in
131
+ * is shown as selected rather than missing. */
116
132
  declare const ScAppSwitchPanel: ({ apps, systemItems, utilities, title, systemLabel, className, style, }: IScAppSwitchPanelProps) => JSX.Element;
117
133
 
118
134
  /** Bounds for a resizable panel, in px. */
@@ -795,6 +811,72 @@ interface StreamoidSidebarPreferenceState {
795
811
  declare function useStreamoidThemePreference(options?: StreamoidThemePreferenceOptions): StreamoidThemePreferenceState;
796
812
  declare function useStreamoidSidebarPreference(options?: StreamoidSidebarPreferenceOptions): StreamoidSidebarPreferenceState;
797
813
 
814
+ /** A rectangle, as `getBoundingClientRect` gives it. */
815
+ interface StreamoidAnchorRect {
816
+ top: number;
817
+ bottom: number;
818
+ left: number;
819
+ right: number;
820
+ }
821
+ interface StreamoidAnchoredPopoverGeometry {
822
+ anchor: StreamoidAnchorRect;
823
+ viewportWidth: number;
824
+ viewportHeight: number;
825
+ /** Panel width in pixels. */
826
+ width: number;
827
+ /** Measured panel height, when known. Drives the vertical flip. */
828
+ height?: number;
829
+ /** Gap between the trigger and the panel. */
830
+ gap: number;
831
+ /** Keep-out margin from the viewport edges. */
832
+ inset: number;
833
+ }
834
+ interface StreamoidAnchoredPopoverPositionOptions {
835
+ /** Panel width in pixels. */
836
+ width: number;
837
+ /** Gap between the trigger and the panel. Defaults to 8px. */
838
+ gap?: number;
839
+ /** Keep-out margin from the viewport edges. Defaults to 16px. */
840
+ inset?: number;
841
+ }
842
+ type StreamoidAnchoredPopoverPosition = CSSProperties & {
843
+ position: "fixed";
844
+ left: number;
845
+ top: number;
846
+ width: number;
847
+ visibility: "hidden" | "visible";
848
+ };
849
+ /**
850
+ * Where a popover sits relative to the element that opened it — pure, so the
851
+ * flip rules are testable without a DOM.
852
+ *
853
+ * TETHERED, WITH COLLISION-FLIP ONLY. The panel opens beside the trigger and
854
+ * runs downward from its top edge. It moves only when it would otherwise leave
855
+ * the viewport: to the trigger's other side when there is no room beside it,
856
+ * and upward (bottom aligned to the trigger's bottom) when there is no room
857
+ * below. Nothing else re-places it, so the panel is always visibly attached to
858
+ * the button that opened it rather than parked against a container edge.
859
+ */
860
+ declare function resolveAnchoredPopoverPosition({ anchor, viewportWidth, viewportHeight, width, height, gap, inset, }: StreamoidAnchoredPopoverGeometry): {
861
+ left: number;
862
+ top: number;
863
+ width: number;
864
+ };
865
+ /**
866
+ * Positions a popover against the element that opened it.
867
+ *
868
+ * Use this for anything triggered by a specific control — the app switcher's
869
+ * grid button, a row's overflow menu. `useStreamoidSidebarPopoverPosition` is
870
+ * the other shape: it pins a panel to the sidebar CARD's edge, which is right
871
+ * for a panel that belongs to the whole rail and wrong for one that belongs to
872
+ * a button, because the panel then floats mid-canvas with nothing connecting it
873
+ * to what was clicked.
874
+ *
875
+ * Re-measures on scroll and resize, and while the trigger or the panel changes
876
+ * size, so the tether holds.
877
+ */
878
+ declare function useStreamoidAnchoredPopoverPosition(anchorRef: RefObject<HTMLElement | null>, panelRef: RefObject<HTMLElement | null>, { width, gap, inset }: StreamoidAnchoredPopoverPositionOptions): StreamoidAnchoredPopoverPosition;
879
+
798
880
  type StreamoidSidebarPopoverPlacement = "top-right" | "bottom-right";
799
881
  interface StreamoidSidebarPopoverPositionOptions {
800
882
  /** Position the panel beside the top or bottom of the visible sidebar card. */
@@ -2164,4 +2246,4 @@ interface IScProfilePopupProps extends React.HTMLAttributes<HTMLDivElement> {
2164
2246
  */
2165
2247
  declare const ScProfilePopup: React$1.ForwardRefExoticComponent<IScProfilePopupProps & React$1.RefAttributes<HTMLDivElement>>;
2166
2248
 
2167
- export { 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 IScAppCardForCopilotProps, type IScAppCardProps, type IScAppCardV3Props, type IScAppFieldProps, type IScAppListingCardProps, 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 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 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 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, SIDEBAR_RESIZE_THRESHOLD_PX, STREAMOID_CHANGELOG_URL, STREAMOID_CHANGELOG_URLS, STREAMOID_STATUS_PAGE_URL, ScAccess, ScAppCard, ScAppCardForCopilot, ScAppCardV3, ScAppField, ScAppListingCard, 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, 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, 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, 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 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, formatSubAgentLabel, hasCollapsedMark, resolvePanelResize, resolvePanelResizeKey, streamoidAppSwitchTagline, streamoidChangelogUrl, useStreamoidPanelWidth, useStreamoidSidebarPopoverPosition, useStreamoidSidebarPreference, useStreamoidThemePreference };
2249
+ export { 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 IScAppCardForCopilotProps, type IScAppCardProps, type IScAppCardV3Props, type IScAppFieldProps, type IScAppListingCardProps, 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 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 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 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, SIDEBAR_RESIZE_THRESHOLD_PX, STREAMOID_CHANGELOG_URL, STREAMOID_CHANGELOG_URLS, STREAMOID_STATUS_PAGE_URL, ScAccess, ScAppCard, ScAppCardForCopilot, ScAppCardV3, ScAppField, ScAppListingCard, 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, 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, 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, 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 StreamoidAnchoredPopoverGeometry, type StreamoidAnchoredPopoverPosition, type StreamoidAnchoredPopoverPositionOptions, 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, formatSubAgentLabel, hasCollapsedMark, resolveAnchoredPopoverPosition, resolvePanelResize, resolvePanelResizeKey, scAppSwitchOrder, streamoidAppSwitchTagline, streamoidChangelogUrl, useStreamoidAnchoredPopoverPosition, useStreamoidPanelWidth, useStreamoidSidebarPopoverPosition, useStreamoidSidebarPreference, useStreamoidThemePreference };
package/dist/index.d.ts CHANGED
@@ -51,7 +51,13 @@ interface IScAppCardForCopilotProps {
51
51
  declare function ScAppCardForCopilot({ product, subText, onClick, className, style, }: IScAppCardForCopilotProps): JSX.Element;
52
52
 
53
53
  /** One switchable product, supplied by the host app (built from its service
54
- * catalog). The current app is expected to be excluded by the host. */
54
+ * catalog).
55
+ *
56
+ * PASS EVERY PRODUCT, INCLUDING THE ONE YOU ARE IN, and mark that one
57
+ * `current`. Hosts used to omit it, which made the list a different length in
58
+ * every app: position two was Artifax in one surface and Tactix in another, so
59
+ * no muscle memory could form — and the hub had no row at all in its own
60
+ * switcher, leaving nowhere visible to "go" to. */
55
61
  interface ScAppSwitchItem {
56
62
  key: string;
57
63
  /** Product name — used to match the product wordmark (and as fallback text). */
@@ -59,6 +65,9 @@ interface ScAppSwitchItem {
59
65
  /** Subtitle under the wordmark. Known products ignore this and use the
60
66
  * canonical tagline from `PRODUCT_BRANDS`. Unknown products render it. */
61
67
  description?: string;
68
+ /** This is where you already are: the row reads as selected, carries a check
69
+ * instead of a chevron, and does not navigate. `onSelect` is never called. */
70
+ current?: boolean;
62
71
  onSelect: () => void;
63
72
  }
64
73
  /** Optional platform action shown beneath the product list. The host owns the
@@ -106,13 +115,20 @@ declare function createStreamoidAppSwitchUtilities(utilities: ScAppSwitchUtiliti
106
115
  /** Canonical switcher tagline for a known product. Hosts should not copy this
107
116
  * map — `ScAppSwitchRow` applies it. Unknown products return undefined. */
108
117
  declare function streamoidAppSwitchTagline(key: string, name: string): string | undefined;
118
+ /** The rows in canonical order — the same list, in the same places, in every
119
+ * app. Exported so hosts and tests can assert the order without rendering;
120
+ * `ScAppSwitchPanel` applies it, so hosts need not sort. */
121
+ declare function scAppSwitchOrder(apps: ScAppSwitchItem[]): ScAppSwitchItem[];
109
122
  /** One switch row: product wordmark + canonical tagline. */
110
123
  declare const ScAppSwitchRow: ({ item, }: {
111
124
  item: ScAppSwitchItem;
112
125
  }) => JSX.Element;
113
- /** Shared product-switch list — the same across every Streamoid app. The host
114
- * passes its product list (current app excluded) and its own logo lives in the
115
- * surrounding sidebar; only this content is identical everywhere. */
126
+ /** Shared product-switch list — the same across every Streamoid app.
127
+ *
128
+ * The host passes EVERY product, including the one it is, marked `current`.
129
+ * The list is therefore the same length and the same order everywhere, so a
130
+ * row never moves under the pointer between surfaces, and the app you are in
131
+ * is shown as selected rather than missing. */
116
132
  declare const ScAppSwitchPanel: ({ apps, systemItems, utilities, title, systemLabel, className, style, }: IScAppSwitchPanelProps) => JSX.Element;
117
133
 
118
134
  /** Bounds for a resizable panel, in px. */
@@ -795,6 +811,72 @@ interface StreamoidSidebarPreferenceState {
795
811
  declare function useStreamoidThemePreference(options?: StreamoidThemePreferenceOptions): StreamoidThemePreferenceState;
796
812
  declare function useStreamoidSidebarPreference(options?: StreamoidSidebarPreferenceOptions): StreamoidSidebarPreferenceState;
797
813
 
814
+ /** A rectangle, as `getBoundingClientRect` gives it. */
815
+ interface StreamoidAnchorRect {
816
+ top: number;
817
+ bottom: number;
818
+ left: number;
819
+ right: number;
820
+ }
821
+ interface StreamoidAnchoredPopoverGeometry {
822
+ anchor: StreamoidAnchorRect;
823
+ viewportWidth: number;
824
+ viewportHeight: number;
825
+ /** Panel width in pixels. */
826
+ width: number;
827
+ /** Measured panel height, when known. Drives the vertical flip. */
828
+ height?: number;
829
+ /** Gap between the trigger and the panel. */
830
+ gap: number;
831
+ /** Keep-out margin from the viewport edges. */
832
+ inset: number;
833
+ }
834
+ interface StreamoidAnchoredPopoverPositionOptions {
835
+ /** Panel width in pixels. */
836
+ width: number;
837
+ /** Gap between the trigger and the panel. Defaults to 8px. */
838
+ gap?: number;
839
+ /** Keep-out margin from the viewport edges. Defaults to 16px. */
840
+ inset?: number;
841
+ }
842
+ type StreamoidAnchoredPopoverPosition = CSSProperties & {
843
+ position: "fixed";
844
+ left: number;
845
+ top: number;
846
+ width: number;
847
+ visibility: "hidden" | "visible";
848
+ };
849
+ /**
850
+ * Where a popover sits relative to the element that opened it — pure, so the
851
+ * flip rules are testable without a DOM.
852
+ *
853
+ * TETHERED, WITH COLLISION-FLIP ONLY. The panel opens beside the trigger and
854
+ * runs downward from its top edge. It moves only when it would otherwise leave
855
+ * the viewport: to the trigger's other side when there is no room beside it,
856
+ * and upward (bottom aligned to the trigger's bottom) when there is no room
857
+ * below. Nothing else re-places it, so the panel is always visibly attached to
858
+ * the button that opened it rather than parked against a container edge.
859
+ */
860
+ declare function resolveAnchoredPopoverPosition({ anchor, viewportWidth, viewportHeight, width, height, gap, inset, }: StreamoidAnchoredPopoverGeometry): {
861
+ left: number;
862
+ top: number;
863
+ width: number;
864
+ };
865
+ /**
866
+ * Positions a popover against the element that opened it.
867
+ *
868
+ * Use this for anything triggered by a specific control — the app switcher's
869
+ * grid button, a row's overflow menu. `useStreamoidSidebarPopoverPosition` is
870
+ * the other shape: it pins a panel to the sidebar CARD's edge, which is right
871
+ * for a panel that belongs to the whole rail and wrong for one that belongs to
872
+ * a button, because the panel then floats mid-canvas with nothing connecting it
873
+ * to what was clicked.
874
+ *
875
+ * Re-measures on scroll and resize, and while the trigger or the panel changes
876
+ * size, so the tether holds.
877
+ */
878
+ declare function useStreamoidAnchoredPopoverPosition(anchorRef: RefObject<HTMLElement | null>, panelRef: RefObject<HTMLElement | null>, { width, gap, inset }: StreamoidAnchoredPopoverPositionOptions): StreamoidAnchoredPopoverPosition;
879
+
798
880
  type StreamoidSidebarPopoverPlacement = "top-right" | "bottom-right";
799
881
  interface StreamoidSidebarPopoverPositionOptions {
800
882
  /** Position the panel beside the top or bottom of the visible sidebar card. */
@@ -2164,4 +2246,4 @@ interface IScProfilePopupProps extends React.HTMLAttributes<HTMLDivElement> {
2164
2246
  */
2165
2247
  declare const ScProfilePopup: React$1.ForwardRefExoticComponent<IScProfilePopupProps & React$1.RefAttributes<HTMLDivElement>>;
2166
2248
 
2167
- export { 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 IScAppCardForCopilotProps, type IScAppCardProps, type IScAppCardV3Props, type IScAppFieldProps, type IScAppListingCardProps, 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 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 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 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, SIDEBAR_RESIZE_THRESHOLD_PX, STREAMOID_CHANGELOG_URL, STREAMOID_CHANGELOG_URLS, STREAMOID_STATUS_PAGE_URL, ScAccess, ScAppCard, ScAppCardForCopilot, ScAppCardV3, ScAppField, ScAppListingCard, 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, 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, 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, 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 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, formatSubAgentLabel, hasCollapsedMark, resolvePanelResize, resolvePanelResizeKey, streamoidAppSwitchTagline, streamoidChangelogUrl, useStreamoidPanelWidth, useStreamoidSidebarPopoverPosition, useStreamoidSidebarPreference, useStreamoidThemePreference };
2249
+ export { 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 IScAppCardForCopilotProps, type IScAppCardProps, type IScAppCardV3Props, type IScAppFieldProps, type IScAppListingCardProps, 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 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 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 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, SIDEBAR_RESIZE_THRESHOLD_PX, STREAMOID_CHANGELOG_URL, STREAMOID_CHANGELOG_URLS, STREAMOID_STATUS_PAGE_URL, ScAccess, ScAppCard, ScAppCardForCopilot, ScAppCardV3, ScAppField, ScAppListingCard, 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, 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, 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, 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 StreamoidAnchoredPopoverGeometry, type StreamoidAnchoredPopoverPosition, type StreamoidAnchoredPopoverPositionOptions, 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, formatSubAgentLabel, hasCollapsedMark, resolveAnchoredPopoverPosition, resolvePanelResize, resolvePanelResizeKey, scAppSwitchOrder, streamoidAppSwitchTagline, streamoidChangelogUrl, useStreamoidAnchoredPopoverPosition, useStreamoidPanelWidth, useStreamoidSidebarPopoverPosition, useStreamoidSidebarPreference, useStreamoidThemePreference };