@streamoid/ui 0.6.28 → 0.6.30

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
@@ -40,7 +40,7 @@ theme-aware (dark on `:root`, light override) — never hardcode a colour.
40
40
 
41
41
  - **`ScAppcardLogos`** — use when you need a product's *name as artwork* — inside a card, chip or pill where a hover/theme colour change should recolour the mark for free.
42
42
  - **`ScStreamoidWordmark`** — use when you need the *Streamoid* wordmark or mascot, or the *CXO Copilot* logo, as a bare mark you position yourself — typically as the `wordmark` node you hand to `ScSideBarLogoUnit`.
43
- - also documented here: `ScStreamoidMascot`, `ScCxoCopilotLogo`
43
+ - also documented here: `ScCxoWordmark`, `ScStreamoidMascot`, `ScCxoCopilotLogo`
44
44
  - **`ScStrLogo`** _(legacy)_ — use when you specifically need the **combined** wordmark + mascot lockup at large size (a splash / auth / print-ish surface), and you are willing to size it yourself. That combination exists nowhere else in the library.
45
45
 
46
46
  ## cards
@@ -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.
@@ -210,7 +212,7 @@ theme-aware (dark on `:root`, light override) — never hardcode a colour.
210
212
  | `ScBillingLogsTableHeader` | `ScBillingHistoryHeader`, `ScHeader`, `ScTableHeader` |
211
213
  | `ScBillingLogsTableList` | `ScBillingHistoryTableList`, `ScTableList`, `ScBillingLogsTableHeader` |
212
214
  | `ScBillingHistoryTableList` | `ScBillingLogsTableList`, `ScTableList`, `InvoiceHistoryMobile` |
213
- | `ScStreamoidWordmark` | `ScStrLogo`, `ScLogoUnit`, `ScAppcardLogos`, `ProductWordmark`, `ScSideBarLogoUnit`, `ScCxoCopilotLogo` |
215
+ | `ScStreamoidWordmark` | `ScStrLogo`, `ScLogoUnit`, `ScAppcardLogos`, `ProductWordmark`, `ScSideBarLogoUnit`, `ScCxoCopilotLogo`, `ScCxoWordmark` |
214
216
  | `ScBriefCard` | `ScQuickPrompt`, `ScAppCardV3`, `ScDefaultCard`, `ScAppCardForCopilot` |
215
217
  | `ScButton` | `ScFieldButton`, `ScOnlyIcon`, `ScPopUpMenu` |
216
218
  | `ScCalendar` | `ScCalendarDateComps`, `ScCounter`, `ScPagination` |
@@ -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` |
@@ -5,7 +5,7 @@ package: "@streamoid/ui"
5
5
  category: sidebar
6
6
  status: stable
7
7
  renders: div
8
- tags: [app-switcher, switch-app, product-switcher, cross-product, tactix, artifax, photogenix, catalogix, streamoid, wordmark]
8
+ tags: [app-switcher, switch-app, product-switcher, cross-product, cxo, tactix, artifax, photogenix, catalogix, streamoid, wordmark]
9
9
  related: [ScSideBarLogoUnit, StreamoidSidebar, ScSidebarSwitchMenu, ScWorkspaceSwitchCard]
10
10
  do_not_confuse_with: [ScSidebarSwitchMenu, StreamoidWorkspaceSwitcher, ScWorkspaceSwitchCard, ScAppListingCard, ScAppCard]
11
11
  used_by: [cxo, photogenix, catalogix, artifax]
@@ -34,7 +34,8 @@ card, no border and no background: the surrounding sidebar or flyout supplies th
34
34
  planners"), not `description` and not the product `name`. Do not copy that
35
35
  map into a host.
36
36
  3. Matching is a **substring** test over `` `${key} ${name}`.toLowerCase() ``. A key
37
- containing `"cxo"` or `"streamoid"` gets the Streamoid wordmark.
37
+ containing `"cxo"` or `"streamoid"` gets the **CXO** wordmark — but the four
38
+ product names are matched first, so `"Streamoid Catalogix"` is Catalogix.
38
39
  4. It does **not** exclude the current app. That's the host's job.
39
40
 
40
41
  ---
@@ -98,13 +99,19 @@ import "@streamoid/ui/dist/index.css"; // once, at your app root
98
99
 
99
100
  | Order | Matches (substring, case-insensitive, on `key + " " + name`) | Renders |
100
101
  |---|---|---|
101
- | 1 | `tactix` | Tactix wordmark + "for buyers and planners" |
102
- | 2 | `artifax`, `design studio` | Artifax wordmark + "for design and development" |
103
- | 3 | `photogenix`, `photo studio` | Photogenix wordmark + "for studio and content" |
104
- | 4 | `catalogix`, `catalog studio` | Catalogix wordmark + "for catalog and ecommerce" |
105
- | 5 | `streamoid`, `cxo` | Streamoid wordmark + "for CXOs" |
102
+ | 1 | `cxo`, `streamoid` | CXO wordmark + "for CXOs" |
103
+ | 2 | `tactix` | Tactix wordmark + "for buyers and planners" |
104
+ | 3 | `artifax`, `design studio` | Artifax wordmark + "for design and development" |
105
+ | 4 | `photogenix`, `photo studio` | Photogenix wordmark + "for studio and content" |
106
+ | 5 | `catalogix`, `catalog studio` | Catalogix wordmark + "for catalog and ecommerce" |
106
107
  | last | anything else | `name` (16px semibold) + host `description` (14px tertiary) |
107
108
 
109
+ **CXO leads the display order but trails the match order.** It is the hub every
110
+ other app hands back to, so it renders first; it also answers to the company name
111
+ `"streamoid"`, the one loose token in the table, so the four product names get
112
+ first refusal (`MATCH_PRECEDENCE` in the source). Do not collapse the two orders
113
+ back into one array.
114
+
108
115
  ### Recipes
109
116
 
110
117
  ```tsx
@@ -157,8 +164,8 @@ createPortal(
157
164
 
158
165
  ### Use it when
159
166
 
160
- - The user is moving between **Streamoid products** (Tactix / Artifax / Photogenix /
161
- Catalogix / Streamoid CXO).
167
+ - The user is moving between **Streamoid products** (CXO / Tactix / Artifax /
168
+ Photogenix / Catalogix).
162
169
  - You want the canonical order and the embedded brand wordmarks for free.
163
170
  - The list lives inside chrome you already own (a sidebar card, a flyout, a popover).
164
171
 
@@ -223,9 +230,9 @@ the canonical tagline. CMS copy like "Design generation" is discarded. Pass
223
230
  ```
224
231
 
225
232
  **3. Matching is a loose substring test on `key + " " + name`.** `"cxo"` and
226
- `"streamoid"` both map to the Streamoid wordmark, `"design studio"` maps to Artifax,
233
+ `"streamoid"` both map to the CXO wordmark, `"design studio"` maps to Artifax,
227
234
  `"photo studio"` to Photogenix, `"catalog studio"` to Catalogix. An internal key like
228
- `"cxo-insights"` will render the **Streamoid** wordmark, not a text row.
235
+ `"cxo-insights"` will render the **CXO** wordmark, not a text row.
229
236
 
230
237
  **4. The current app is not excluded.** The source comment is explicit — "The current
231
238
  app is expected to be excluded by the host." Forget the filter and the sidebar offers
@@ -4,7 +4,7 @@ package: "@streamoid/ui"
4
4
  category: brand
5
5
  status: stable
6
6
  renders: span[role="img"]
7
- tags: [wordmark, logo, brand, product, tactix, artifax, photogenix, catalogix, svg, currentColor]
7
+ tags: [wordmark, logo, brand, product, cxo, tactix, artifax, photogenix, catalogix, svg, currentColor]
8
8
  related: [ScAppCardForCopilot, ProductWordmark, ProductCollapsedMark, ScStreamoidWordmark, ScStrLogo]
9
9
  do_not_confuse_with: [ProductWordmark, ScStreamoidWordmark, ScStreamoidMascot, ScCxoCopilotLogo, ScAppCard]
10
10
  used_by: [agent]
@@ -13,23 +13,25 @@ required_props: [product]
13
13
 
14
14
  # ScAppcardLogos
15
15
 
16
- **One single-colour product wordmark, 14px tall.** Inline SVG for Tactix, Artifax,
17
- Photogenix or Catalogix, filled with `currentColor` so the parent's text colour
18
- paints it. Ships the type `AppcardProduct` used by `ScAppCardForCopilot`.
16
+ **One single-colour product wordmark, 14px tall.** Inline SVG for CXO, Tactix,
17
+ Artifax, Photogenix or Catalogix, filled with `currentColor` so the parent's text
18
+ colour paints it. Ships the type `AppcardProduct` used by `ScAppCardForCopilot`.
19
19
 
20
20
  ## TL;DR for agents
21
21
 
22
22
  - **Reach for it when:** you need a product's *name as artwork* — inside a card,
23
23
  chip or pill where a hover/theme colour change should recolour the mark for free.
24
24
  - **Don't reach for it when:** you want the sidebar-header wordmark
25
- (→ `ProductWordmark` / `ProductCollapsedMark`), the Streamoid brand
25
+ (→ `ProductWordmark` / `ProductCollapsedMark`), the *company* brand
26
26
  (→ `ScStreamoidWordmark` / `ScStreamoidMascot`), the CXO copilot mark
27
27
  (→ `ScCxoCopilotLogo`), or an app icon plus a typed name (→ `ScAppCard`).
28
28
  - **Four things that will bite you:**
29
- 1. `product` is **required** and the set is exactly four keys — `tactix`,
30
- `artifax`, `photogenix`, `catalogix`. **There is no Streamoid or CXO wordmark.**
31
- 2. Widths differ per product (56 / 54 / 88 / 72 px at a fixed 14px height), so a
32
- row of them is **not** visually uniform.
29
+ 1. `product` is **required** and the set is exactly five keys — `cxo`,
30
+ `tactix`, `artifax`, `photogenix`, `catalogix`. **There is no Streamoid
31
+ wordmark here** that is the company mark, `ScStreamoidWordmark` in SC-Brand.
32
+ 2. Widths differ per product (35 / 56 / 54 / 88 / 72 px at a fixed 14px height),
33
+ so a row of them is **not** visually uniform. `cxo` is a three-letter mark and
34
+ by far the narrowest.
33
35
  3. It sets `role="img"` with **`aria-label={product}` — the raw lowercase key**
34
36
  ("photogenix"), not a display name.
35
37
  4. The SVG is injected with `dangerouslySetInnerHTML`. Safe here (the markup is a
@@ -137,7 +139,7 @@ Generated from Figma `AppcardLogos` (node `6383:9997`); the SVG strings live in
137
139
  | You may actually want | Not this |
138
140
  |---|---|
139
141
  | `ProductWordmark` — the sidebar wordmark set, sized for the shell header | `ScAppcardLogos` is the 14px *appcard* set; different sizes, different Figma source |
140
- | `ScStreamoidWordmark` — the company mark | This set has **no** Streamoid entry |
142
+ | `ScStreamoidWordmark` — the *company* mark | This set has no Streamoid entry. `cxo` here is the *product* mark — the two are different artwork and are not interchangeable |
141
143
  | `ScAppCard` — icon + name + subtitle row | This is only the name, as vector art |
142
144
 
143
145
  ---
@@ -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.
@@ -1,24 +1,31 @@
1
1
  ---
2
2
  component: ScStreamoidWordmark
3
- also_exports: [ScStreamoidMascot, ScCxoCopilotLogo]
3
+ also_exports: [ScCxoWordmark, ScStreamoidMascot, ScCxoCopilotLogo]
4
4
  package: "@streamoid/ui"
5
5
  category: brand
6
6
  status: stable
7
7
  renders: span[aria-hidden] (wordmark) · svg[role="img"] (mascot, CXO logo)
8
8
  tags: [brand, logo, wordmark, mascot, streamoid, cxo, copilot, mask, svg, gradient, sidebar-header]
9
9
  related: [ScSideBarLogoUnit, StreamoidSidebar, ScAppcardLogos, ScAppSwitchPanel, ScStrLogo]
10
- do_not_confuse_with: [ScStrLogo, ScLogoUnit, ScAppcardLogos, ProductWordmark, ScSideBarLogoUnit, ScCxoCopilotLogo]
10
+ do_not_confuse_with: [ScStrLogo, ScLogoUnit, ScAppcardLogos, ProductWordmark, ScSideBarLogoUnit, ScCxoCopilotLogo, ScCxoWordmark]
11
11
  used_by: [cxo]
12
12
  ---
13
13
 
14
- # ScStreamoidWordmark · ScStreamoidMascot · ScCxoCopilotLogo
14
+ # ScStreamoidWordmark · ScCxoWordmark · ScStreamoidMascot · ScCxoCopilotLogo
15
15
 
16
- **The company's own brand marks, so no host app ships a brand SVG.** Three leaf
16
+ **The company's own brand marks, so no host app ships a brand SVG.** Four leaf
17
17
  components in one folder: the plain "streamoid" wordmark (110×16, painted as a CSS
18
- mask so a token colours it), the colourful mascot glyph used in the collapsed
19
- sidebar (teal→purple gradient, 48×48 viewBox), and the CXO Copilot lockup
18
+ mask so a token colours it), the **CXO product wordmark** (50×16, same mask
19
+ treatment), the colourful mascot glyph used in the collapsed sidebar
20
+ (teal→purple gradient, 48×48 viewBox), and the CXO Copilot lockup
20
21
  (98×32, red→orange gradient).
21
22
 
23
+ **`ScStreamoidWordmark` is the company, `ScCxoWordmark` is the product.** A CXO
24
+ surface — its sidebar header, its row in the app switcher — wants
25
+ `ScCxoWordmark`. Reach for `ScStreamoidWordmark` only where you mean Streamoid
26
+ *the company* (a corporate footer, a legal line). They are different artwork, not
27
+ two sizes of one mark.
28
+
22
29
  ## TL;DR for agents
23
30
 
24
31
  - **Reach for it when:** you need the *Streamoid* wordmark or mascot, or the *CXO
@@ -59,7 +66,8 @@ import "@streamoid/ui/dist/index.css"; // once, at your app root
59
66
  ### Minimal usage
60
67
 
61
68
  ```tsx
62
- <ScStreamoidWordmark /> {/* 110×16, primary-text colour */}
69
+ <ScStreamoidWordmark /> {/* 110×16, primary-text colour — the COMPANY */}
70
+ <ScCxoWordmark /> {/* 50×16, primary-text colour — the PRODUCT */}
63
71
  <ScStreamoidMascot /> {/* 40×40 box */}
64
72
  <ScCxoCopilotLogo /> {/* 98×32 */}
65
73
  ```
@@ -74,11 +82,22 @@ import "@streamoid/ui/dist/index.css"; // once, at your app root
74
82
  | `className` | `string` | – | Set on the `<span>`. |
75
83
  | `style` | `CSSProperties` | – | Spread **last**, so it overrides the inline width/height/mask. |
76
84
 
85
+ ### Props — `ScCxoWordmark`
86
+
87
+ | Prop | Type | Default | Notes |
88
+ |---|---|---|---|
89
+ | `width` | `number` | `50` | Box width in **px**. Native width at `height` 16. |
90
+ | `height` | `number` | `16` | The mask is `contain` + `left center`, so keep the 50:16 ratio or it letterboxes rather than stretches. |
91
+ | `color` | `string` | `"var(--alias-text---icons-primary, #f5f5f5)"` | Becomes `background-color` behind the mask. Solid colours only — the official lockup's red→orange gradient **cannot** be reproduced here (Gotcha 3), which is deliberate: a gradient would not survive light mode. |
92
+ | `className` | `string` | – | Set on the `<span>`. |
93
+ | `style` | `CSSProperties` | – | Spread **last**, so it overrides the inline width/height/mask. |
94
+
77
95
  ### Props — `ScStreamoidMascot`
78
96
 
79
97
  | Prop | Type | Default | Notes |
80
98
  |---|---|---|---|
81
99
  | `size` | `number` | `40` | Square box in px (`viewBox="0 0 48 48"`). ⚠️ The art occupies ~40×15 of those 48 units — see Gotcha 2. |
100
+ | `ariaLabel` | `string` | `"Streamoid"` | The mark's accessible name. Pass the **product** name where the mascot stands in for an app's own logo — CXO's collapsed sidebar passes `"CXO"`, so a screen reader does not announce the company there. |
82
101
  | `className` | `string` | – | Set on the `<svg>`. |
83
102
  | `style` | `CSSProperties` | – | Set on the `<svg>`. Does not override `width`/`height` attributes. |
84
103
 
@@ -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",
@@ -130,6 +130,7 @@
130
130
  "switch-app",
131
131
  "product-switcher",
132
132
  "cross-product",
133
+ "cxo",
133
134
  "tactix",
134
135
  "artifax",
135
136
  "photogenix",
@@ -183,6 +184,7 @@
183
184
  "logo",
184
185
  "brand",
185
186
  "product",
187
+ "cxo",
186
188
  "tactix",
187
189
  "artifax",
188
190
  "photogenix",
@@ -513,13 +515,15 @@
513
515
  "ScAppcardLogos",
514
516
  "ProductWordmark",
515
517
  "ScSideBarLogoUnit",
516
- "ScCxoCopilotLogo"
518
+ "ScCxoCopilotLogo",
519
+ "ScCxoWordmark"
517
520
  ],
518
521
  "requiredProps": [],
519
522
  "usedBy": [
520
523
  "cxo"
521
524
  ],
522
525
  "alsoExports": [
526
+ "ScCxoWordmark",
523
527
  "ScStreamoidMascot",
524
528
  "ScCxoCopilotLogo"
525
529
  ],
@@ -1769,6 +1773,48 @@
1769
1773
  "alsoExports": [],
1770
1774
  "exported": true
1771
1775
  },
1776
+ "ScPanelResizeHandle": {
1777
+ "doc": "ScPanelResizeHandle.md",
1778
+ "source": "src/SC-PanelResize",
1779
+ "category": "layout",
1780
+ "status": "stable",
1781
+ "renders": "div[role=\"separator\"]",
1782
+ "summary": "Drag-to-resize edge for a side panel — a continuous width, remembered.",
1783
+ "reachForWhen": "",
1784
+ "tags": [
1785
+ "resize",
1786
+ "panel",
1787
+ "drag",
1788
+ "width",
1789
+ "splitter",
1790
+ "separator",
1791
+ "sidebar",
1792
+ "chat"
1793
+ ],
1794
+ "related": [
1795
+ "ScSidebarResizeHandle",
1796
+ "StreamoidSidebar"
1797
+ ],
1798
+ "doNotConfuseWith": [
1799
+ "ScSidebarResizeHandle",
1800
+ "ScVDivider"
1801
+ ],
1802
+ "requiredProps": [
1803
+ "width",
1804
+ "onWidthChange",
1805
+ "min",
1806
+ "max"
1807
+ ],
1808
+ "usedBy": [],
1809
+ "alsoExports": [
1810
+ "useStreamoidPanelWidth",
1811
+ "clampPanelWidth",
1812
+ "resolvePanelResize",
1813
+ "resolvePanelResizeKey",
1814
+ "PANEL_RESIZE_STEP_PX"
1815
+ ],
1816
+ "exported": true
1817
+ },
1772
1818
  "ScPlanCard": {
1773
1819
  "doc": "ScPlanCard.md",
1774
1820
  "source": "src/SC-Plan card",
@@ -4898,6 +4944,10 @@
4898
4944
  "documentedIn": "ScAskAgentButton",
4899
4945
  "doc": "ScAskAgentButton.md"
4900
4946
  },
4947
+ "ScCxoWordmark": {
4948
+ "documentedIn": "ScStreamoidWordmark",
4949
+ "doc": "ScStreamoidWordmark.md"
4950
+ },
4901
4951
  "ScStreamoidMascot": {
4902
4952
  "documentedIn": "ScStreamoidWordmark",
4903
4953
  "doc": "ScStreamoidWordmark.md"
@@ -4906,6 +4956,26 @@
4906
4956
  "documentedIn": "ScStreamoidWordmark",
4907
4957
  "doc": "ScStreamoidWordmark.md"
4908
4958
  },
4959
+ "useStreamoidPanelWidth": {
4960
+ "documentedIn": "ScPanelResizeHandle",
4961
+ "doc": "ScPanelResizeHandle.md"
4962
+ },
4963
+ "clampPanelWidth": {
4964
+ "documentedIn": "ScPanelResizeHandle",
4965
+ "doc": "ScPanelResizeHandle.md"
4966
+ },
4967
+ "resolvePanelResize": {
4968
+ "documentedIn": "ScPanelResizeHandle",
4969
+ "doc": "ScPanelResizeHandle.md"
4970
+ },
4971
+ "resolvePanelResizeKey": {
4972
+ "documentedIn": "ScPanelResizeHandle",
4973
+ "doc": "ScPanelResizeHandle.md"
4974
+ },
4975
+ "PANEL_RESIZE_STEP_PX": {
4976
+ "documentedIn": "ScPanelResizeHandle",
4977
+ "doc": "ScPanelResizeHandle.md"
4978
+ },
4909
4979
  "ProductWordmark": {
4910
4980
  "documentedIn": "ScSideBarLogoUnit",
4911
4981
  "doc": "ScSideBarLogoUnit.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 * {