@streamoid/ui 0.6.29 → 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.
@@ -1,6 +1,6 @@
1
1
  # @streamoid/ui — component router (for AI agents)
2
2
 
3
- 125 components. Full docs for each live beside this file as `<ScName>.md`;
3
+ 126 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
@@ -104,6 +104,8 @@ theme-aware (dark on `:root`, light override) — never hardcode a colour.
104
104
 
105
105
  - **`ScHDivider`** — use when you need a horizontal rule between stacked sections, rows, or card regions.
106
106
  - **`ScHeader`** — use when you are building a bespoke table header row and want the column captions to match every other table in the product.
107
+ - **`ScPanelResizeHandle`** — Drag-to-resize edge for a side panel — a continuous width, remembered.
108
+ - also documented here: `useStreamoidPanelWidth`, `clampPanelWidth`, `resolvePanelResize`, `resolvePanelResizeKey`, `PANEL_RESIZE_STEP_PX`
107
109
  - **`ScSettingsNav`** _(legacy)_ — use when you need a static visual placeholder of the settings nav (a design mock, a screenshot, a Figma-parity check).
108
110
  - **`ScSettingsTabComp`** — use when you need a settings-style tab strip — Profile / Workspace, or a modal's section tabs — where the active tab is marked by an underline.
109
111
  - **`ScTabComp`** — use when you need one segment of a compact 2–5 way view toggle — theme switcher, grid/list, Active/Pending, Fast/Pro.
@@ -164,7 +166,7 @@ theme-aware (dark on `:root`, light override) — never hardcode a colour.
164
166
 
165
167
  - **`CreditWarningBanner`** — use when you need the "you're nearly out of credits" nudge in a sidebar rail, in either expanded or collapsed form.
166
168
  - **`ScAppSwitchPanel`** — use when you need the "go to another Streamoid product" list — in `StreamoidSidebar`'s `switchPanel`, or in your own portalled flyout.
167
- - 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`
168
170
  - **`ScArtifaxSidebar`** — use when you are working on the Artifax (or Tactix) shell, or you need a sidebar whose sections the user can collapse.
169
171
  - **`ScAskAgentButton`** — use when you need the assistant-panel CTA **outside** a DS sidebar. Inside one, use the sidebar's `assistantCta` prop instead.
170
172
  - also documented here: `ScAskAgentSlot`, `AssistantCta`
@@ -178,8 +180,8 @@ theme-aware (dark on `:root`, light override) — never hardcode a colour.
178
180
  - **`ScSidebarProfile`** _(legacy)_ — use when never. There is no way to pass a real user through it.
179
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.
180
182
  - **`ScVersion`** _(legacy)_ — use when never. `StreamoidSidebar` renders its own version footer inline from `versionText`.
181
- - **`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.
182
- - 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`
183
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.
184
186
  - also documented here: `ScSidebarResizeHandle`, `advanceSidebarResizeGesture`, `SIDEBAR_RESIZE_THRESHOLD_PX`
185
187
 
@@ -244,6 +246,7 @@ theme-aware (dark on `:root`, light override) — never hardcode a colour.
244
246
  | `ScOnlyIcon` | `ScOnlyField`, `ScButton`, `ScFieldButton`, `ScSidebarIcons` |
245
247
  | `ScPagination` | `ScCounter`, `ScTabs`, `ScOnlyField` |
246
248
  | `ScPairtext` | `ScCheckField`, `ScCheckbox`, `ScRadio`, `ScSelection`, `ScSelectionPill`, `ScMenuOptions` |
249
+ | `ScPanelResizeHandle` | `ScSidebarResizeHandle`, `ScVDivider` |
247
250
  | `ScPlanCard` | `ScPlanDetailsCard`, `ScPlanDetailsCardMobile`, `ScPlanComparison`, `ScAppCard` |
248
251
  | `ScPlanDetailsCard` | `ScPlanCard`, `ScPlanDetailsCardMobile`, `ScCreditsUsageCard`, `ScPlanComparison` |
249
252
  | `ScPlanDetailsCardMobile` | `ScPlanDetailsCard`, `ScPlanCard`, `ScPlanComparison`, `ScCreditsUsageCardMobile` |
@@ -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
 
@@ -0,0 +1,80 @@
1
+ ---
2
+ component: ScPanelResizeHandle
3
+ also_exports: [useStreamoidPanelWidth, clampPanelWidth, resolvePanelResize, resolvePanelResizeKey, PANEL_RESIZE_STEP_PX]
4
+ package: "@streamoid/ui"
5
+ category: layout
6
+ status: stable
7
+ renders: div[role="separator"]
8
+ tags: [resize, panel, drag, width, splitter, separator, sidebar, chat]
9
+ related: [ScSidebarResizeHandle, StreamoidSidebar]
10
+ do_not_confuse_with: [ScSidebarResizeHandle, ScVDivider]
11
+ required_props: [width, onWidthChange, min, max]
12
+ ---
13
+
14
+ # ScPanelResizeHandle · useStreamoidPanelWidth
15
+
16
+ **Drag-to-resize edge for a side panel — a continuous width, remembered.** Built
17
+ for the Ask CXO panel, which was a hardcoded `clamp(400px, 32vw, 560px)` that no
18
+ one could widen.
19
+
20
+ ## Don't confuse with `ScSidebarResizeHandle`
21
+
22
+ | you want | use |
23
+ |---|---|
24
+ | any width between a min and max | **`ScPanelResizeHandle`** |
25
+ | snap between expanded and collapsed past a drag threshold | `ScSidebarResizeHandle` |
26
+
27
+ They look identical in use and do different things. The sidebar one takes
28
+ `expanded: boolean`; this one takes `width: number`.
29
+
30
+ ## Use it
31
+
32
+ ```tsx
33
+ const { width, setWidth, commitWidth } = useStreamoidPanelWidth({
34
+ storageKey: "artifax.assistant.width",
35
+ defaultWidth: 480, min: 360, max: 900,
36
+ });
37
+
38
+ <div style={{ position: "relative", width }}> {/* MUST be positioned */}
39
+ {children}
40
+ <ScPanelResizeHandle
41
+ width={width} onWidthChange={setWidth} onWidthCommit={commitWidth}
42
+ min={360} max={900} edge="right" ariaLabel="Resize Ask CXO"
43
+ />
44
+ </div>
45
+ ```
46
+
47
+ ## Four things that will bite you
48
+
49
+ 1. **The parent must be `position: relative`.** The handle is absolutely
50
+ positioned against it, and sits half outside the edge (`-6px`) so the 12px
51
+ hit area straddles the border. A static parent puts it somewhere unrelated.
52
+ 2. **`setWidth` during the drag, `commitWidth` at the end.** `commitWidth`
53
+ writes to `localStorage`; pointermove fires dozens of times a second and each
54
+ write is synchronous. `onWidthCommit` already fires once per gesture.
55
+ 3. **`edge` inverts the gesture AND the keys.** On `edge="left"` the panel grows
56
+ as the pointer moves left, and ArrowLeft grows it. Get this wrong and the
57
+ panel shrinks when dragged open.
58
+ 4. **Width is absolute from the gesture start, not accumulated deltas.** Drag
59
+ past `max` and back and the edge returns to the cursor rather than sitting
60
+ offset by the overshoot. If you reimplement the maths, keep that property —
61
+ there is a test for it.
62
+
63
+ ## Accessibility
64
+
65
+ `role="separator"` with `aria-valuenow/min/max`, focusable, and operable with
66
+ ArrowLeft/ArrowRight plus Home/End (`PANEL_RESIZE_STEP_PX`, 24px). Double-click
67
+ resets to `min`. A pointer-only resize is unusable for anyone who cannot drag,
68
+ which is why the keyboard path is part of the component rather than the host's
69
+ problem.
70
+
71
+ ## Storage
72
+
73
+ `useStreamoidPanelWidth` wraps every `localStorage` access in try/catch —
74
+ it throws outright in a private window, with site data blocked, or in a
75
+ thumbnailer, and a resize handle is not worth taking the app down for. A failed
76
+ read yields `defaultWidth`; a failed write means the width applies for the
77
+ session but does not persist.
78
+
79
+ The stored value is re-clamped on read, so lowering `max` in a later release
80
+ cannot leave someone stuck with a panel wider than the app now allows.
@@ -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. |
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@streamoid/ui",
3
- "count": 125,
3
+ "count": 126,
4
4
  "components": {
5
5
  "ScAccess": {
6
6
  "doc": "ScAccess.md",
@@ -162,6 +162,7 @@
162
162
  ],
163
163
  "alsoExports": [
164
164
  "ScAppSwitchRow",
165
+ "scAppSwitchOrder",
165
166
  "createStreamoidAppSwitchUtilities",
166
167
  "streamoidAppSwitchTagline",
167
168
  "streamoidChangelogUrl",
@@ -1773,6 +1774,48 @@
1773
1774
  "alsoExports": [],
1774
1775
  "exported": true
1775
1776
  },
1777
+ "ScPanelResizeHandle": {
1778
+ "doc": "ScPanelResizeHandle.md",
1779
+ "source": "src/SC-PanelResize",
1780
+ "category": "layout",
1781
+ "status": "stable",
1782
+ "renders": "div[role=\"separator\"]",
1783
+ "summary": "Drag-to-resize edge for a side panel — a continuous width, remembered.",
1784
+ "reachForWhen": "",
1785
+ "tags": [
1786
+ "resize",
1787
+ "panel",
1788
+ "drag",
1789
+ "width",
1790
+ "splitter",
1791
+ "separator",
1792
+ "sidebar",
1793
+ "chat"
1794
+ ],
1795
+ "related": [
1796
+ "ScSidebarResizeHandle",
1797
+ "StreamoidSidebar"
1798
+ ],
1799
+ "doNotConfuseWith": [
1800
+ "ScSidebarResizeHandle",
1801
+ "ScVDivider"
1802
+ ],
1803
+ "requiredProps": [
1804
+ "width",
1805
+ "onWidthChange",
1806
+ "min",
1807
+ "max"
1808
+ ],
1809
+ "usedBy": [],
1810
+ "alsoExports": [
1811
+ "useStreamoidPanelWidth",
1812
+ "clampPanelWidth",
1813
+ "resolvePanelResize",
1814
+ "resolvePanelResizeKey",
1815
+ "PANEL_RESIZE_STEP_PX"
1816
+ ],
1817
+ "exported": true
1818
+ },
1776
1819
  "ScPlanCard": {
1777
1820
  "doc": "ScPlanCard.md",
1778
1821
  "source": "src/SC-Plan card",
@@ -2715,7 +2758,7 @@
2715
2758
  "status": "stable",
2716
2759
  "renders": "div",
2717
2760
  "summary": "Reach for it when:",
2718
- "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.",
2719
2762
  "tags": [
2720
2763
  "sidebar",
2721
2764
  "workspace",
@@ -2751,7 +2794,9 @@
2751
2794
  "ScSidebarAppIdentity",
2752
2795
  "useStreamoidThemePreference",
2753
2796
  "useStreamoidSidebarPreference",
2754
- "useStreamoidSidebarPopoverPosition"
2797
+ "useStreamoidSidebarPopoverPosition",
2798
+ "useStreamoidAnchoredPopoverPosition",
2799
+ "resolveAnchoredPopoverPosition"
2755
2800
  ],
2756
2801
  "exported": true
2757
2802
  },
@@ -4870,6 +4915,10 @@
4870
4915
  "documentedIn": "ScAppSwitchPanel",
4871
4916
  "doc": "ScAppSwitchPanel.md"
4872
4917
  },
4918
+ "scAppSwitchOrder": {
4919
+ "documentedIn": "ScAppSwitchPanel",
4920
+ "doc": "ScAppSwitchPanel.md"
4921
+ },
4873
4922
  "createStreamoidAppSwitchUtilities": {
4874
4923
  "documentedIn": "ScAppSwitchPanel",
4875
4924
  "doc": "ScAppSwitchPanel.md"
@@ -4914,6 +4963,26 @@
4914
4963
  "documentedIn": "ScStreamoidWordmark",
4915
4964
  "doc": "ScStreamoidWordmark.md"
4916
4965
  },
4966
+ "useStreamoidPanelWidth": {
4967
+ "documentedIn": "ScPanelResizeHandle",
4968
+ "doc": "ScPanelResizeHandle.md"
4969
+ },
4970
+ "clampPanelWidth": {
4971
+ "documentedIn": "ScPanelResizeHandle",
4972
+ "doc": "ScPanelResizeHandle.md"
4973
+ },
4974
+ "resolvePanelResize": {
4975
+ "documentedIn": "ScPanelResizeHandle",
4976
+ "doc": "ScPanelResizeHandle.md"
4977
+ },
4978
+ "resolvePanelResizeKey": {
4979
+ "documentedIn": "ScPanelResizeHandle",
4980
+ "doc": "ScPanelResizeHandle.md"
4981
+ },
4982
+ "PANEL_RESIZE_STEP_PX": {
4983
+ "documentedIn": "ScPanelResizeHandle",
4984
+ "doc": "ScPanelResizeHandle.md"
4985
+ },
4917
4986
  "ProductWordmark": {
4918
4987
  "documentedIn": "ScSideBarLogoUnit",
4919
4988
  "doc": "ScSideBarLogoUnit.md"
@@ -4962,6 +5031,14 @@
4962
5031
  "documentedIn": "ScWorkspaceAccountMenu",
4963
5032
  "doc": "ScWorkspaceAccountMenu.md"
4964
5033
  },
5034
+ "useStreamoidAnchoredPopoverPosition": {
5035
+ "documentedIn": "ScWorkspaceAccountMenu",
5036
+ "doc": "ScWorkspaceAccountMenu.md"
5037
+ },
5038
+ "resolveAnchoredPopoverPosition": {
5039
+ "documentedIn": "ScWorkspaceAccountMenu",
5040
+ "doc": "ScWorkspaceAccountMenu.md"
5041
+ },
4965
5042
  "formatSubAgentLabel": {
4966
5043
  "documentedIn": "ScSubAgent",
4967
5044
  "doc": "ScSubAgent.md"
package/dist/index.css CHANGED
@@ -914,6 +914,44 @@
914
914
  color: #9e9e9e;
915
915
  }
916
916
 
917
+ /* src/SC-PanelResize/ScPanelResizeHandle.module.css */
918
+ .ScPanelResizeHandle_handle {
919
+ position: absolute;
920
+ top: 0;
921
+ bottom: 0;
922
+ width: 12px;
923
+ display: flex;
924
+ align-items: stretch;
925
+ justify-content: center;
926
+ padding: 0;
927
+ border: none;
928
+ background: transparent;
929
+ cursor: col-resize;
930
+ touch-action: none;
931
+ z-index: 5;
932
+ }
933
+ .ScPanelResizeHandle_left {
934
+ left: -6px;
935
+ }
936
+ .ScPanelResizeHandle_right {
937
+ right: -6px;
938
+ }
939
+ .ScPanelResizeHandle_handle:focus-visible {
940
+ outline: 2px solid var(--alias-border-focus, #7850de);
941
+ outline-offset: -2px;
942
+ }
943
+ .ScPanelResizeHandle_line {
944
+ width: 2px;
945
+ align-self: stretch;
946
+ background: transparent;
947
+ transition: background-color 120ms ease;
948
+ }
949
+ .ScPanelResizeHandle_handle:hover .ScPanelResizeHandle_line,
950
+ .ScPanelResizeHandle_handle:focus-visible .ScPanelResizeHandle_line,
951
+ .ScPanelResizeHandle_handle[data-active=true] .ScPanelResizeHandle_line {
952
+ background: var(--alias-border-focus, #7850de);
953
+ }
954
+
917
955
  /* src/SC-Badges/ScBadges.module.css */
918
956
  .ScBadges_scBadges,
919
957
  .ScBadges_scBadges * {