@cboxdk/cbox-ui 0.8.0 → 0.10.0
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.
- package/README.md +229 -100
- package/dist/app-switcher.d.ts +19 -0
- package/dist/app-switcher.js +7 -0
- package/dist/app-switcher.js.map +1 -0
- package/dist/catalog-BroZWvws.d.ts +100 -0
- package/dist/chunk-AJCYF7SS.js +808 -0
- package/dist/chunk-AJCYF7SS.js.map +1 -0
- package/dist/index.d.ts +461 -607
- package/dist/index.js +3729 -3576
- package/dist/index.js.map +1 -1
- package/package.json +16 -3
- package/tokens/cbox.css +3 -35
- package/tokens/shell.css +347 -0
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
import { ReactNode, ComponentType, AnchorHTMLAttributes, ComponentProps } from 'react';
|
|
4
|
+
import { C as CboxThemeMode, a as CboxKnownApp } from './catalog-BroZWvws.js';
|
|
5
|
+
export { b as CboxAppCatalogState, c as CboxCatalogApp, d as authorizeHref, p as parseAppCatalog, r as readKnownAppCatalog, e as rememberAppCatalog, s as secureIconUrl, f as signInTarget } from './catalog-BroZWvws.js';
|
|
3
6
|
import { LucideIcon } from 'lucide-react';
|
|
4
7
|
import { ClassValue } from 'clsx';
|
|
5
8
|
export { T as TimePoint, n as niceTicks, t as timeTicks } from './scale-BaaY5qJs.js';
|
|
@@ -205,176 +208,460 @@ declare function useCboxId(): CboxIdContextValue;
|
|
|
205
208
|
*/
|
|
206
209
|
declare function useCboxIdOptional(): CboxIdContextValue | null;
|
|
207
210
|
|
|
208
|
-
type
|
|
211
|
+
type CboxTranslationValues = Record<string, string | number>;
|
|
212
|
+
type CboxTranslator = (message: string, values?: CboxTranslationValues) => string;
|
|
213
|
+
declare function interpolate(message: string, values?: CboxTranslationValues): string;
|
|
214
|
+
/** Optional and additive: without a provider existing consumers retain English. */
|
|
215
|
+
declare function CboxLocalizationProvider({ locale, translate, formatDate, children }: {
|
|
216
|
+
locale: string;
|
|
217
|
+
translate: CboxTranslator;
|
|
218
|
+
formatDate?: (value: string) => string;
|
|
209
219
|
children: ReactNode;
|
|
220
|
+
}): react_jsx_runtime.JSX.Element;
|
|
221
|
+
declare function useCboxLocalization(): {
|
|
222
|
+
locale: string;
|
|
223
|
+
t: CboxTranslator;
|
|
224
|
+
formatDate: (value: string) => string;
|
|
210
225
|
};
|
|
226
|
+
|
|
211
227
|
/**
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
228
|
+
* Help's state lives outside React (§7.1): open or closed, what it shows, the search, the scroll
|
|
229
|
+
* position and the support updates survive an Inertia visit and even a remount of the shell,
|
|
230
|
+
* like a browser side panel. The conversation itself lives in the `<cbox-support>` element, which
|
|
231
|
+
* survives as long as the shell sits in the host's persistent layout.
|
|
215
232
|
*/
|
|
216
|
-
|
|
233
|
+
type HelpArticle = {
|
|
234
|
+
id: string;
|
|
235
|
+
title: string;
|
|
236
|
+
excerpt?: string;
|
|
237
|
+
body?: string;
|
|
238
|
+
url?: string;
|
|
239
|
+
source?: string;
|
|
240
|
+
};
|
|
241
|
+
type SupportUpdate = {
|
|
242
|
+
id: string;
|
|
243
|
+
kind: 'ticket' | 'chat';
|
|
244
|
+
title: string;
|
|
245
|
+
excerpt?: string;
|
|
246
|
+
at?: string;
|
|
247
|
+
unread: boolean;
|
|
248
|
+
url?: string;
|
|
249
|
+
};
|
|
250
|
+
type HelpStatus = 'idle' | 'loading' | 'ready' | 'unavailable';
|
|
251
|
+
type HelpState = {
|
|
252
|
+
open: boolean;
|
|
253
|
+
/** The article shown instead of the home view, or null. */
|
|
254
|
+
article: HelpArticle | null;
|
|
255
|
+
query: string;
|
|
256
|
+
scrollTop: number;
|
|
257
|
+
updates: SupportUpdate[];
|
|
258
|
+
updatesStatus: HelpStatus;
|
|
259
|
+
/** A question waiting for the chat to be ready ("Ask Cbox: …" from the palette). */
|
|
260
|
+
pendingQuestion: string | null;
|
|
261
|
+
/** Whether `open` was taken from the person's saved preference yet. */
|
|
262
|
+
seeded: boolean;
|
|
263
|
+
/**
|
|
264
|
+
* `open` came from the saved preference, not from the person on this page. Help left open
|
|
265
|
+
* shows docked from 1280px; below that it waits until the person opens it, so a phone or a
|
|
266
|
+
* narrow window never lands under the full-screen overlay.
|
|
267
|
+
*/
|
|
268
|
+
restored: boolean;
|
|
269
|
+
/** Which list the support updates came from (URL and organization), so a switch reloads them. */
|
|
270
|
+
updatesKey: string | null;
|
|
271
|
+
};
|
|
272
|
+
type HelpStore = {
|
|
273
|
+
get(): HelpState;
|
|
274
|
+
set(patch: Partial<HelpState> | ((state: HelpState) => Partial<HelpState>)): void;
|
|
275
|
+
subscribe(listener: () => void): () => void;
|
|
276
|
+
};
|
|
277
|
+
declare function createHelpStore(initial?: Partial<HelpState>): HelpStore;
|
|
278
|
+
|
|
279
|
+
type ShellIcon = ComponentType<{
|
|
280
|
+
size?: number;
|
|
281
|
+
strokeWidth?: number;
|
|
282
|
+
className?: string;
|
|
283
|
+
'aria-hidden'?: boolean;
|
|
284
|
+
}>;
|
|
285
|
+
/** Lucide names an app can use for areas, pages and actions without shipping its own map. */
|
|
286
|
+
declare const SHELL_ICONS: Readonly<Record<string, ShellIcon>>;
|
|
217
287
|
|
|
218
288
|
/**
|
|
219
|
-
*
|
|
220
|
-
* scrollable content column (right) side-by-side. Fits the full
|
|
221
|
-
* viewport height; only the content column scrolls.
|
|
289
|
+
* The `shell` Inertia prop: the one data contract every Cbox app shares (spec §11.1).
|
|
222
290
|
*
|
|
223
|
-
*
|
|
224
|
-
*
|
|
291
|
+
* The server (laravel-console-kit) produces it; `<CboxShell>` renders it. It carries only the
|
|
292
|
+
* current selection and URLs. Lists, the app catalog, help and search load in the browser after
|
|
293
|
+
* the page has painted, so building this prop never calls another service (local first, §11.2a).
|
|
225
294
|
*/
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
type CboxNavItem = {
|
|
295
|
+
/** The product key (URL standard §1). Unknown keys are allowed so a new app needs no release here. */
|
|
296
|
+
type AppKey = 'id' | 'billing' | 'telemetry' | 'work' | 'brain' | 'infra' | 'engage' | 'assistant' | 'sites' | 'stache' | 'status' | 'tax' | 'signals' | 'domains' | (string & {});
|
|
297
|
+
type Link = {
|
|
231
298
|
label: string;
|
|
232
|
-
|
|
233
|
-
* Absolute path the host's router can navigate to. Apps that
|
|
234
|
-
* scope nav by org slug should compose the path themselves
|
|
235
|
-
* (`/org/${slug}/endpoints`) before passing it in — cbox-ui
|
|
236
|
-
* stays unaware of routing conventions.
|
|
237
|
-
*/
|
|
238
|
-
href: string;
|
|
239
|
-
icon: ComponentType<{
|
|
240
|
-
className?: string;
|
|
241
|
-
strokeWidth?: number;
|
|
242
|
-
}>;
|
|
243
|
-
/** Highlight the row for child routes too (`/endpoints/123`
|
|
244
|
-
* matches the `Endpoints` row when this is true). */
|
|
245
|
-
matchPrefix?: boolean;
|
|
299
|
+
url: string;
|
|
246
300
|
};
|
|
247
|
-
|
|
301
|
+
/** One page inside an area. `icon` is a Lucide icon name (`"git-branch"`), resolved by the shell. */
|
|
302
|
+
type NavPage = {
|
|
303
|
+
key: string;
|
|
248
304
|
label: string;
|
|
249
|
-
|
|
305
|
+
url: string;
|
|
306
|
+
icon?: string;
|
|
250
307
|
};
|
|
251
|
-
/**
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
prefetch?: boolean;
|
|
259
|
-
children: ReactNode;
|
|
260
|
-
className?: string;
|
|
261
|
-
title?: string;
|
|
262
|
-
'aria-label'?: string;
|
|
263
|
-
/** Set on the link of the page the person is on. */
|
|
264
|
-
'aria-current'?: 'page';
|
|
265
|
-
}>;
|
|
266
|
-
type CboxAppSidebarProps = {
|
|
267
|
-
/** App key for the brand submark (and aria labels). */
|
|
268
|
-
appKey: string;
|
|
269
|
-
/** Optional override for the submark — defaults to `appKey`. */
|
|
270
|
-
brandSubmark?: string | null;
|
|
271
|
-
/** Where brand assets live. Default `/brand`. */
|
|
272
|
-
assetBase?: string;
|
|
273
|
-
/** Where the brand row links to (typically the app's home). */
|
|
274
|
-
brandHref?: string;
|
|
275
|
-
/** Nav sections — top to bottom. */
|
|
276
|
-
sections: CboxNavSection[];
|
|
277
|
-
/** Active path — used to highlight the current row. */
|
|
278
|
-
currentPath: string;
|
|
279
|
-
/** Apps inject their router's Link primitive. */
|
|
280
|
-
LinkComponent: LinkComponent;
|
|
281
|
-
/** Persisted "is the desktop sidebar collapsed?" state. */
|
|
282
|
-
collapsed?: boolean;
|
|
283
|
-
className?: string;
|
|
308
|
+
/** One area in the rail. The subnav shows its pages when it has more than one. */
|
|
309
|
+
type NavArea = {
|
|
310
|
+
key: string;
|
|
311
|
+
label: string;
|
|
312
|
+
url: string;
|
|
313
|
+
icon?: string;
|
|
314
|
+
pages?: NavPage[];
|
|
284
315
|
};
|
|
316
|
+
type ContextTone = 'production' | 'sandbox' | 'neutral';
|
|
285
317
|
/**
|
|
286
|
-
*
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
*
|
|
290
|
-
* Hidden below `lg` — apps render a separate mobile drawer that
|
|
291
|
-
* shares the same `sections` config.
|
|
292
|
-
*
|
|
293
|
-
* No app should ship its own sidebar component. The chrome is the
|
|
294
|
-
* shape; nav items are the data.
|
|
318
|
+
* One selectable item of a level: the current one in the prop, and every row a level's
|
|
319
|
+
* `listUrl` returns. Environments are app-defined (§5.1a): `tone`, `label` and `testData` are
|
|
320
|
+
* all optional and the shell never sorts the items.
|
|
295
321
|
*/
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
/**
|
|
300
|
-
|
|
301
|
-
/**
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
/**
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
sidebarCollapsed?: boolean;
|
|
317
|
-
/** Click handler for the topbar collapse toggle. Hide the
|
|
318
|
-
* toggle entirely by omitting this prop. */
|
|
319
|
-
onToggleSidebar?: () => void;
|
|
322
|
+
type ContextItem = {
|
|
323
|
+
id: string;
|
|
324
|
+
name: string;
|
|
325
|
+
/** Chip text. Defaults to the first letters of the name. */
|
|
326
|
+
initials?: string;
|
|
327
|
+
/** The coloured square: production green, sandbox amber, neutral grey. */
|
|
328
|
+
tone?: ContextTone;
|
|
329
|
+
/** Short app-defined label beside the name ("default", "test data"). */
|
|
330
|
+
label?: string;
|
|
331
|
+
/** The sandbox strip shows while the current item has test data. */
|
|
332
|
+
testData?: boolean;
|
|
333
|
+
};
|
|
334
|
+
type ContextLevel = {
|
|
335
|
+
/** `organization`, `project`, `environment`, or the app's own key (`site`, `space`). */
|
|
336
|
+
key: 'organization' | 'project' | 'environment' | (string & {});
|
|
337
|
+
/** Singular, as the app names it: "Organization", "Site", "Space", "Environment". */
|
|
338
|
+
label: string;
|
|
339
|
+
/** Plural for headings ("Organizations"). Defaults to `label` + "s". */
|
|
340
|
+
labelPlural?: string;
|
|
341
|
+
current: ContextItem;
|
|
320
342
|
/**
|
|
321
|
-
*
|
|
322
|
-
*
|
|
323
|
-
* pages) leave this off.
|
|
343
|
+
* Lazy JSON list, fetched when a menu opens: `GET listUrl?q=&parent=&cursor=&limit=` answering
|
|
344
|
+
* `{ data: ContextItem[], has_more: boolean, next_cursor: string | null }`.
|
|
324
345
|
*/
|
|
325
|
-
|
|
346
|
+
listUrl: string;
|
|
347
|
+
/** `POST createUrl { name, parent? }` answering `{ id, detailsUrl }`. Absent: no "New …". */
|
|
348
|
+
createUrl?: string;
|
|
349
|
+
/** "View all". */
|
|
350
|
+
allUrl: string;
|
|
326
351
|
/**
|
|
327
|
-
*
|
|
328
|
-
*
|
|
329
|
-
* chrome stays visually identical across all apps regardless of
|
|
330
|
-
* whether a palette has been wired up yet.
|
|
352
|
+
* Settings page of one item, as a URL template on the wire: `{id}` is replaced with the
|
|
353
|
+
* item's id (`/orgs/{id}/settings`). Absent: no gear.
|
|
331
354
|
*/
|
|
332
|
-
|
|
355
|
+
settingsUrl?: string;
|
|
356
|
+
};
|
|
357
|
+
type PaletteAction = {
|
|
358
|
+
id: string;
|
|
359
|
+
label: string;
|
|
360
|
+
url: string;
|
|
361
|
+
/** `post` for actions that change something. Default `get`. */
|
|
362
|
+
method?: 'get' | 'post';
|
|
363
|
+
icon?: string;
|
|
364
|
+
/** Extra words the palette matches on. */
|
|
365
|
+
keywords?: string[];
|
|
366
|
+
};
|
|
367
|
+
type ShellHelp = {
|
|
368
|
+
/** False: Help still renders, and says it is not available here. */
|
|
369
|
+
enabled: boolean;
|
|
370
|
+
/** The page's help topic key (§7.2.3). */
|
|
371
|
+
topic?: string;
|
|
372
|
+
/** Same-origin route the Assistant SDK's `<cbox-support>` element fetches its session from. */
|
|
373
|
+
sessionUrl?: string;
|
|
374
|
+
/** Where the SDK script is served. Default `/ai-assistant/support.js` (laravel-assistant-client). */
|
|
375
|
+
scriptUrl?: string;
|
|
376
|
+
/** The support portal. Absent or offline: the link is hidden. */
|
|
377
|
+
portalUrl?: string;
|
|
378
|
+
/** `GET` support updates; `POST {updatesUrl}/{id}/read` marks one read. */
|
|
379
|
+
updatesUrl?: string;
|
|
380
|
+
/** `GET ?q=&topic=` docs, help centre and knowledge base search. */
|
|
381
|
+
searchUrl?: string;
|
|
382
|
+
/** Articles for a topic, as a template: `{topic}` is replaced. */
|
|
383
|
+
articlesUrl?: string;
|
|
384
|
+
};
|
|
385
|
+
type ShellNotifications = {
|
|
386
|
+
enabled: false;
|
|
387
|
+
} | {
|
|
388
|
+
enabled: true;
|
|
389
|
+
unread: number;
|
|
390
|
+
url: string;
|
|
391
|
+
};
|
|
392
|
+
type ShellBanner = {
|
|
393
|
+
kind: 'sandbox' | 'impersonation' | 'notice';
|
|
394
|
+
text: string;
|
|
395
|
+
action?: Link;
|
|
396
|
+
};
|
|
397
|
+
type ShellTheme = 'system' | 'light' | 'dark';
|
|
398
|
+
type ShellPreferences = {
|
|
399
|
+
theme: ShellTheme;
|
|
400
|
+
locale: string;
|
|
401
|
+
railPinned: boolean;
|
|
402
|
+
helpOpen: boolean;
|
|
403
|
+
/** The subnav collapsed to its strip (⌘.). */
|
|
404
|
+
subnavCollapsed?: boolean;
|
|
405
|
+
/** Regional format (a BCP 47 locale for dates and numbers), from Cbox ID's preferences. */
|
|
406
|
+
regionalFormat?: string;
|
|
407
|
+
/** IANA time zone, from Cbox ID's preferences. */
|
|
408
|
+
timeZone?: string;
|
|
409
|
+
};
|
|
410
|
+
type ShellOption = {
|
|
411
|
+
code: string;
|
|
412
|
+
label: string;
|
|
413
|
+
};
|
|
414
|
+
/** What the account menu (§10) links to. */
|
|
415
|
+
type ShellAccount = {
|
|
416
|
+
/** Profile and security, in Cbox ID. */
|
|
417
|
+
profileUrl: string;
|
|
418
|
+
switchAccountUrl: string;
|
|
419
|
+
signOutUrl: string;
|
|
420
|
+
/** Default `post`. */
|
|
421
|
+
signOutMethod?: 'get' | 'post';
|
|
422
|
+
/** Languages the app is translated into. */
|
|
423
|
+
languages?: ShellOption[];
|
|
424
|
+
/** Regional formats offered. Defaults to a short list. */
|
|
425
|
+
formats?: ShellOption[];
|
|
426
|
+
/** Line under the name in the account menu. Default "Signed in with Cbox ID". */
|
|
427
|
+
signedInWith?: string;
|
|
428
|
+
};
|
|
429
|
+
type Shell = {
|
|
430
|
+
app: {
|
|
431
|
+
key: AppKey;
|
|
432
|
+
name: string;
|
|
433
|
+
homeUrl: string;
|
|
434
|
+
};
|
|
435
|
+
person: {
|
|
436
|
+
id: string;
|
|
437
|
+
name: string;
|
|
438
|
+
initials: string;
|
|
439
|
+
avatarUrl?: string;
|
|
440
|
+
email?: string;
|
|
441
|
+
};
|
|
442
|
+
/** The page title and route, for "On this page" and the chat's page intent. */
|
|
443
|
+
page?: {
|
|
444
|
+
title: string;
|
|
445
|
+
route?: string;
|
|
446
|
+
};
|
|
447
|
+
nav: {
|
|
448
|
+
areas: NavArea[];
|
|
449
|
+
activeArea: string;
|
|
450
|
+
activePage?: string;
|
|
451
|
+
};
|
|
452
|
+
context: {
|
|
453
|
+
/** 1–3, in order. The first is the organization. */
|
|
454
|
+
levels: ContextLevel[];
|
|
455
|
+
/** `POST` target; the server resolves same-page or list fallback (§5.6). */
|
|
456
|
+
switchUrl: string;
|
|
457
|
+
};
|
|
458
|
+
palette: {
|
|
459
|
+
/** `GET ?q=` → `{ data: [{ id, title, subtitle?, url }] }`, in the current context. */
|
|
460
|
+
searchUrl?: string;
|
|
461
|
+
/** `GET ?q=` → level 2/3 combinations across organizations (§6.1.4). */
|
|
462
|
+
gotoUrl?: string;
|
|
463
|
+
actions: PaletteAction[];
|
|
464
|
+
};
|
|
465
|
+
help: ShellHelp;
|
|
466
|
+
notifications: ShellNotifications;
|
|
467
|
+
apps: {
|
|
468
|
+
/** The host's catalog endpoint (laravel-id-client `CboxId::appCatalogRoutes()`). */
|
|
469
|
+
catalogUrl: string;
|
|
470
|
+
/** "All products ↗". Default https://cbox.dk. */
|
|
471
|
+
productsUrl?: string;
|
|
472
|
+
};
|
|
473
|
+
account: ShellAccount;
|
|
474
|
+
banner?: ShellBanner;
|
|
475
|
+
preferences: ShellPreferences;
|
|
476
|
+
};
|
|
477
|
+
/** How the shell moves the person. An Inertia host passes `router.visit`. */
|
|
478
|
+
type ShellNavigate = (url: string, options?: {
|
|
479
|
+
method?: 'get' | 'post';
|
|
480
|
+
data?: Record<string, unknown>;
|
|
481
|
+
newTab?: boolean;
|
|
482
|
+
}) => void;
|
|
483
|
+
/** Where the shell reports a preference the person changed, for the host to persist. */
|
|
484
|
+
type ShellPreferenceChange = <K extends keyof ShellPreferences>(key: K, value: ShellPreferences[K]) => void;
|
|
485
|
+
|
|
486
|
+
/** A client-side link (Inertia's `Link`). Receives `href`, `className`, `children` and ARIA props. */
|
|
487
|
+
type ShellLinkComponent = ComponentType<AnchorHTMLAttributes<HTMLAnchorElement> & {
|
|
488
|
+
href: string;
|
|
489
|
+
children?: ReactNode;
|
|
490
|
+
}>;
|
|
491
|
+
/** Which overlay is open. Only one at a time, so two menus never stack. */
|
|
492
|
+
type ShellOverlay = 'org' | 'context' | 'apps' | 'account' | 'palette' | 'nav-sheet' | 'context-sheet' | null;
|
|
493
|
+
type ShellApi = {
|
|
494
|
+
shell: Shell;
|
|
495
|
+
t: CboxTranslator;
|
|
496
|
+
navigate: ShellNavigate;
|
|
497
|
+
Link: ShellLinkComponent;
|
|
498
|
+
icons: Readonly<Record<string, ShellIcon>>;
|
|
499
|
+
preferences: ShellPreferences;
|
|
500
|
+
setPreference: ShellPreferenceChange;
|
|
501
|
+
overlay: ShellOverlay;
|
|
502
|
+
setOverlay: (overlay: ShellOverlay) => void;
|
|
503
|
+
help: HelpStore;
|
|
504
|
+
/** Open or close Help. */
|
|
505
|
+
toggleHelp: (open?: boolean) => void;
|
|
506
|
+
/** Open Help on an article. */
|
|
507
|
+
openArticle: (article: HelpArticle) => void;
|
|
508
|
+
/** Open Help and send a question to the chat with the page as context. */
|
|
509
|
+
ask: (question: string) => void;
|
|
510
|
+
/** Switch context: `chosen` maps level keys to ids. */
|
|
511
|
+
switchTo: (chosen: Record<string, string>) => void;
|
|
512
|
+
};
|
|
513
|
+
/** Help for a page's own `?` button, or `null` outside the shell. */
|
|
514
|
+
declare function useShellHelp(): Pick<ShellApi, 'toggleHelp' | 'openArticle' | 'ask'> | null;
|
|
515
|
+
|
|
516
|
+
type CboxShellProps = {
|
|
517
|
+
/** The shared `shell` prop. */
|
|
518
|
+
shell: Shell;
|
|
519
|
+
/** The page. */
|
|
520
|
+
children: ReactNode;
|
|
521
|
+
/** How to move the person. Inertia: `(url, o) => router.visit(url, { method: o?.method, data: o?.data })`, plus `window.open` for `newTab`. Default: page loads and form posts. */
|
|
522
|
+
navigate?: ShellNavigate;
|
|
523
|
+
/** Client-side link for nav and settings links (Inertia's `Link`). Default `<a>`. */
|
|
524
|
+
LinkComponent?: ShellLinkComponent;
|
|
525
|
+
/** Extra icons by name, on top of the built-in Lucide set. */
|
|
526
|
+
icons?: Readonly<Record<string, ShellIcon>>;
|
|
333
527
|
/**
|
|
334
|
-
*
|
|
335
|
-
*
|
|
336
|
-
*
|
|
528
|
+
* Called when the person changes a preference, for the host to persist (a cookie read before
|
|
529
|
+
* first paint, and Cbox ID's preferences for theme, language, format and time zone). Without
|
|
530
|
+
* it the shell writes a `cbox_shell_<key>` cookie.
|
|
337
531
|
*/
|
|
338
|
-
|
|
339
|
-
|
|
532
|
+
onPreferenceChange?: ShellPreferenceChange;
|
|
533
|
+
/** Help's state store. Default: one per page, so it outlives the shell's own remounts. */
|
|
534
|
+
helpStore?: HelpStore;
|
|
535
|
+
/** Where the Cbox wordmark is served. Default `/brand`. */
|
|
536
|
+
brandAssetBase?: string;
|
|
537
|
+
/** `id` of the `<main>` landmark for a skip link. Default `main-content`. */
|
|
538
|
+
mainId?: string;
|
|
340
539
|
};
|
|
341
540
|
/**
|
|
342
|
-
*
|
|
343
|
-
*
|
|
541
|
+
* Apply a theme choice to the document the way the tokens read it: `.dark` and `data-theme` on
|
|
542
|
+
* the root, with `system` following the device. The saved choice stays `system`; the device's
|
|
543
|
+
* scheme is never written back (cbox-design, shared preferences).
|
|
544
|
+
*/
|
|
545
|
+
declare function applyTheme(theme: ShellTheme): void;
|
|
546
|
+
/**
|
|
547
|
+
* The inline script a host puts in `<head>` so the theme is right before the first paint
|
|
548
|
+
* (§12.1). `theme` is the person's saved choice from the `shell` prop.
|
|
549
|
+
*/
|
|
550
|
+
declare function themeBootScript(theme: ShellTheme): string;
|
|
551
|
+
/**
|
|
552
|
+
* The one shell for every Cbox app (spec 2026-11-10 shell v1): rail with the account at the
|
|
553
|
+
* bottom, subnav, header with the context selectors, Search, Help, the bell when the app has a
|
|
554
|
+
* source, Switch app; the ⌘K palette; the Help column; and the phone layout.
|
|
344
555
|
*
|
|
345
|
-
*
|
|
346
|
-
*
|
|
347
|
-
* compose `<AppShell>`/`<AppContent>`/sidebar/topbar manually —
|
|
348
|
-
* drift is the whole reason this component exists.
|
|
556
|
+
* Render it in the host's persistent layout (Inertia `Page.layout`), so the rail, Help and the
|
|
557
|
+
* chat survive page visits; only `shell` and `children` change.
|
|
349
558
|
*/
|
|
350
|
-
declare function
|
|
559
|
+
declare function CboxShell({ shell, children, navigate, LinkComponent, icons, onPreferenceChange, helpStore, brandAssetBase, mainId }: CboxShellProps): react_jsx_runtime.JSX.Element;
|
|
351
560
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
561
|
+
/** The page intent the chat is given (§7.2.4): route, title and context. */
|
|
562
|
+
type PageIntent = {
|
|
563
|
+
route?: string;
|
|
564
|
+
title?: string;
|
|
565
|
+
context: string;
|
|
566
|
+
url?: string;
|
|
567
|
+
};
|
|
568
|
+
declare function contextTrail(shell: Shell): string;
|
|
569
|
+
declare function pageIntent(shell: Shell): PageIntent;
|
|
570
|
+
|
|
571
|
+
/** One app in the grid (§9). */
|
|
572
|
+
type ShellApp = {
|
|
573
|
+
key: string;
|
|
574
|
+
name: string;
|
|
575
|
+
/** One line: "Identity and sign-in". */
|
|
576
|
+
purpose: string | null;
|
|
577
|
+
/** Fixed per-app hue (0–360); the tile is drawn in it, in light and dark. */
|
|
578
|
+
hue: number;
|
|
579
|
+
iconUrl: string | null;
|
|
580
|
+
iconDarkUrl: string | null;
|
|
581
|
+
/** Where the tile goes: the app, or its admission page when the organization lacks it. */
|
|
582
|
+
url: string;
|
|
583
|
+
/** The organization has this app. False: "More from Cbox", dimmed. */
|
|
584
|
+
inOrganization: boolean;
|
|
585
|
+
};
|
|
586
|
+
/** Each app's fixed hue when the catalog sends none. */
|
|
587
|
+
declare const APP_HUES: Readonly<Record<string, number>>;
|
|
588
|
+
/** A stable hue for an unknown key, so its tile keeps its colour between pages. */
|
|
589
|
+
declare function hueFor(key: string, given?: unknown): number;
|
|
590
|
+
type ShellCatalogState = {
|
|
591
|
+
status: 'loading';
|
|
592
|
+
} | {
|
|
593
|
+
status: 'ready';
|
|
594
|
+
apps: ShellApp[];
|
|
595
|
+
} | {
|
|
596
|
+
status: 'signin_required';
|
|
597
|
+
href: string | null;
|
|
598
|
+
} | {
|
|
599
|
+
status: 'unavailable';
|
|
362
600
|
};
|
|
363
601
|
/**
|
|
364
|
-
*
|
|
365
|
-
*
|
|
366
|
-
* `
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
602
|
+
* The catalog answer, with the shell's additions (§9.3): `in_organization` (default true),
|
|
603
|
+
* `admission_url` for apps the organization does not have, `purpose` (falls back to
|
|
604
|
+
* `description`) and `hue`. Only http(s) links are kept.
|
|
605
|
+
*/
|
|
606
|
+
declare function parseShellCatalog(ok: boolean, body: unknown, here?: {
|
|
607
|
+
origin: string;
|
|
608
|
+
pathname: string;
|
|
609
|
+
search: string;
|
|
610
|
+
}): ShellCatalogState;
|
|
611
|
+
|
|
612
|
+
/**
|
|
613
|
+
* The shell's few network shapes and the pure rules around them: list pages, inline create,
|
|
614
|
+
* the switch payload and settings links. Everything here is same-origin and JSON.
|
|
615
|
+
*/
|
|
616
|
+
type ListPage = {
|
|
617
|
+
items: ContextItem[];
|
|
618
|
+
hasMore: boolean;
|
|
619
|
+
nextCursor: string | null;
|
|
620
|
+
};
|
|
621
|
+
/** First letters of the first two words, for a chip. */
|
|
622
|
+
declare function initialsOf(name: string): string;
|
|
623
|
+
/**
|
|
624
|
+
* A list answer. The URL standard's envelope (`{ object: 'list', data, has_more, next_cursor }`)
|
|
625
|
+
* and a bare array are both accepted; rows without an id and a name are dropped.
|
|
626
|
+
*/
|
|
627
|
+
declare function parseListPage(body: unknown): ListPage;
|
|
628
|
+
/** `url` with query parameters added; empty values are left out. Works for relative URLs. */
|
|
629
|
+
declare function withQuery(url: string, params: Record<string, string | undefined | null>): string;
|
|
630
|
+
/** The settings link of one item, from the level's URL template. Null when the level has none. */
|
|
631
|
+
declare function settingsHref(level: Pick<ContextLevel, 'settingsUrl'>, id: string): string | null;
|
|
632
|
+
/**
|
|
633
|
+
* Which environment a project click lands on (§5.4): the one with the current environment's
|
|
634
|
+
* name when the project has it, else its first. Undefined when the project has none.
|
|
635
|
+
*/
|
|
636
|
+
declare function environmentFor(environments: readonly ContextItem[], currentName: string | undefined): ContextItem | undefined;
|
|
637
|
+
/**
|
|
638
|
+
* The switch payload (§5.6): every level above the chosen one keeps its current id, the chosen
|
|
639
|
+
* levels get theirs, and levels below are left to the server (it lands on the last used one).
|
|
640
|
+
* `return_to` is where the person is, so the server can stay on the same page.
|
|
641
|
+
*/
|
|
642
|
+
declare function switchPayload(levels: readonly ContextLevel[], chosen: Record<string, string>, returnTo: string): Record<string, string>;
|
|
643
|
+
|
|
644
|
+
type Props$2 = ComponentProps<'main'> & {
|
|
645
|
+
children: ReactNode;
|
|
646
|
+
};
|
|
647
|
+
/**
|
|
648
|
+
* Scrolling main column inside an <AppShell>. Wears the soft blue-
|
|
649
|
+
* tinted gradient canvas so every Cbox app sits on the same
|
|
650
|
+
* background.
|
|
651
|
+
*/
|
|
652
|
+
declare function AppContent({ children, className, ...props }: Props$2): react_jsx_runtime.JSX.Element;
|
|
653
|
+
|
|
654
|
+
/**
|
|
655
|
+
* Top-level chrome. Hosts the desktop sidebar (left) and the
|
|
656
|
+
* scrollable content column (right) side-by-side. Fits the full
|
|
657
|
+
* viewport height; only the content column scrolls.
|
|
372
658
|
*
|
|
373
|
-
*
|
|
374
|
-
*
|
|
375
|
-
* page underneath doesn't scroll on touch.
|
|
659
|
+
* Pair with <AppContent> inside. Per-app sidebars compose alongside
|
|
660
|
+
* — cbox-ui doesn't ship one because the nav items are app-specific.
|
|
376
661
|
*/
|
|
377
|
-
declare function
|
|
662
|
+
declare function AppShell({ children }: {
|
|
663
|
+
children: ReactNode;
|
|
664
|
+
}): react_jsx_runtime.JSX.Element;
|
|
378
665
|
|
|
379
666
|
type CboxBrandProps = {
|
|
380
667
|
/**
|
|
@@ -413,119 +700,6 @@ type CboxBrandProps = {
|
|
|
413
700
|
*/
|
|
414
701
|
declare function CboxBrand({ appKey, submark, assetBase, tone, collapsed, className, }: CboxBrandProps): react_jsx_runtime.JSX.Element;
|
|
415
702
|
|
|
416
|
-
type CboxOrgContextBarProps = {
|
|
417
|
-
/**
|
|
418
|
-
* Apps inject their router's Link primitive — used for the
|
|
419
|
-
* crumb's brand-side anchor. The dropdown's onSelect calls
|
|
420
|
-
* `onNavigate(href)` so apps can either `router.visit(href)`
|
|
421
|
-
* (Inertia) or `<Link>`-style navigate.
|
|
422
|
-
*/
|
|
423
|
-
LinkComponent: LinkComponent;
|
|
424
|
-
/**
|
|
425
|
-
* Called when the user picks a different org from the dropdown.
|
|
426
|
-
* Receives an absolute path with the slug substituted in. Apps
|
|
427
|
-
* trigger their router.
|
|
428
|
-
*
|
|
429
|
-
* Path-rewrite rule (Cbox suite convention):
|
|
430
|
-
* /org/<old-slug>/foo/bar → /org/<new-slug>/foo/bar
|
|
431
|
-
* /something-else → /org/<new-slug>
|
|
432
|
-
*
|
|
433
|
-
* Apps that aren't org-scoped (notifications) typically don't
|
|
434
|
-
* render this component at all — but if they do, switching
|
|
435
|
-
* lands on the new org's `/org/<slug>` root and lets the host
|
|
436
|
-
* sort the rest out.
|
|
437
|
-
*/
|
|
438
|
-
onNavigate: (href: string) => void;
|
|
439
|
-
};
|
|
440
|
-
/**
|
|
441
|
-
* Standard Cbox topbar org switcher. One crumb, one dropdown,
|
|
442
|
-
* URL-driven (no POST, no session pin). Mirrors id's pattern 1:1
|
|
443
|
-
* so the chrome reads identically across the suite — that's the
|
|
444
|
-
* whole reason it's here, not in each app.
|
|
445
|
-
*
|
|
446
|
-
* Apps render this in the `topbarCentre` slot of `CboxAppShell`.
|
|
447
|
-
* Hides itself when there's no current org (eg pre-auth, or
|
|
448
|
-
* non-org-scoped surfaces).
|
|
449
|
-
*/
|
|
450
|
-
declare function CboxOrgContextBar({ LinkComponent, onNavigate, }: CboxOrgContextBarProps): react_jsx_runtime.JSX.Element | null;
|
|
451
|
-
|
|
452
|
-
type Props$6 = {
|
|
453
|
-
/**
|
|
454
|
-
* App branding rendered on the left — typically a small logo +
|
|
455
|
-
* the app name. Rendered inside a fixed-height bar so keep it
|
|
456
|
-
* visually compact (24-32px tall content).
|
|
457
|
-
*/
|
|
458
|
-
brand: ReactNode;
|
|
459
|
-
/** Anything between brand and the right cluster — search, breadcrumbs, etc. */
|
|
460
|
-
centre?: ReactNode;
|
|
461
|
-
/**
|
|
462
|
-
* Override slots if an app needs a different control mix in the
|
|
463
|
-
* right cluster. Default: AppLauncher → NotificationsBell → UserMenu.
|
|
464
|
-
*/
|
|
465
|
-
rightCluster?: ReactNode;
|
|
466
|
-
/**
|
|
467
|
-
* Whether to show the org switcher next to the brand. Hide on
|
|
468
|
-
* non-org-scoped surfaces (eg id account-settings).
|
|
469
|
-
*/
|
|
470
|
-
showOrgSwitcher?: boolean;
|
|
471
|
-
className?: string;
|
|
472
|
-
};
|
|
473
|
-
/**
|
|
474
|
-
* Standard Cbox top bar. Same shell across every app — keeps cross-app
|
|
475
|
-
* navigation (launcher, account, notifications) muscle-memory-stable.
|
|
476
|
-
*/
|
|
477
|
-
declare function TopBar({ brand, centre, rightCluster, showOrgSwitcher, className, }: Props$6): react_jsx_runtime.JSX.Element;
|
|
478
|
-
|
|
479
|
-
type AppLauncherProps = {
|
|
480
|
-
className?: string;
|
|
481
|
-
/**
|
|
482
|
-
* Called when the user clicks an app they're not entitled to. Use
|
|
483
|
-
* this to open an upgrade flow / Stripe checkout / Intercom message.
|
|
484
|
-
* If unset, locked tiles fall through to a static "Add to plan"
|
|
485
|
-
* affordance — the click is a no-op so we never silently ship the
|
|
486
|
-
* user to a broken paywall.
|
|
487
|
-
*/
|
|
488
|
-
onLockedAppClick?: (app: CboxAppLink) => void;
|
|
489
|
-
};
|
|
490
|
-
/**
|
|
491
|
-
* Cross-app launcher — the 9-dot button in the top bar.
|
|
492
|
-
*
|
|
493
|
-
* Renders the Cbox suite as a vertical list with status per app:
|
|
494
|
-
* - entitled apps → full-colour tile, click navigates with ?org=<slug>
|
|
495
|
-
* - locked apps → greyed out + lock badge, opens upgrade flow if the
|
|
496
|
-
* host app provides one (otherwise inert click)
|
|
497
|
-
* - coming-soon → greyed out + "soon" badge, never clickable
|
|
498
|
-
* - the current app → highlighted ring on its monogram tile
|
|
499
|
-
*
|
|
500
|
-
* Row layout (vs. the old 3-col grid) gives us room for descriptions
|
|
501
|
-
* and status badges, which makes the entitlement signal readable at a
|
|
502
|
-
* glance instead of needing a tooltip.
|
|
503
|
-
*/
|
|
504
|
-
declare function AppLauncher({ className, onLockedAppClick }: AppLauncherProps): react_jsx_runtime.JSX.Element | null;
|
|
505
|
-
|
|
506
|
-
/** One app as the host's catalog endpoint lists it. */
|
|
507
|
-
type CboxCatalogApp = {
|
|
508
|
-
key: string;
|
|
509
|
-
name: string;
|
|
510
|
-
launch_url: string;
|
|
511
|
-
/** Cbox ID's uploaded icon for light surfaces. */
|
|
512
|
-
icon_url?: string | null;
|
|
513
|
-
/** Cbox ID's uploaded icon for dark surfaces. */
|
|
514
|
-
icon_dark_url?: string | null;
|
|
515
|
-
description?: string | null;
|
|
516
|
-
};
|
|
517
|
-
type CboxAppCatalogState = {
|
|
518
|
-
status: 'idle' | 'loading';
|
|
519
|
-
} | {
|
|
520
|
-
status: 'ready';
|
|
521
|
-
apps: CboxCatalogApp[];
|
|
522
|
-
refreshAfter: number;
|
|
523
|
-
} | {
|
|
524
|
-
status: 'authorization_required';
|
|
525
|
-
authorizeUrl: string | null;
|
|
526
|
-
} | {
|
|
527
|
-
status: 'unavailable';
|
|
528
|
-
};
|
|
529
703
|
type CboxAppCatalogProps = {
|
|
530
704
|
/**
|
|
531
705
|
* Same-origin URL the host serves the person's app catalog from (a proxy of Cbox ID's
|
|
@@ -533,59 +707,31 @@ type CboxAppCatalogProps = {
|
|
|
533
707
|
* chrome keeps its shape on pages without an organization.
|
|
534
708
|
*/
|
|
535
709
|
endpoint: string | null;
|
|
536
|
-
/** The app key of this app; its tile is marked current
|
|
710
|
+
/** The app key of this app; its tile is marked current. */
|
|
537
711
|
currentAppKey: string;
|
|
712
|
+
/**
|
|
713
|
+
* How the theme is read. Default `auto`: `.dark`/`[data-theme]` on the root, else the
|
|
714
|
+
* system scheme. `class` for a host whose tokens only turn dark under `.dark`.
|
|
715
|
+
*/
|
|
716
|
+
theme?: CboxThemeMode;
|
|
538
717
|
className?: string;
|
|
539
718
|
};
|
|
540
719
|
/**
|
|
541
|
-
*
|
|
542
|
-
*
|
|
543
|
-
*
|
|
544
|
-
* -
|
|
545
|
-
* person has to (re)connect their catalog grant; `authorize_url` is where.
|
|
546
|
-
* - anything else: unavailable right now.
|
|
547
|
-
*
|
|
548
|
-
* Only `http(s)` launch URLs are kept: the tiles are links the person will click.
|
|
549
|
-
*/
|
|
550
|
-
declare function parseAppCatalog(ok: boolean, body: unknown): CboxAppCatalogState;
|
|
551
|
-
/** The authorize link with `return_to` set to where the person is, when it is on this origin. */
|
|
552
|
-
declare function authorizeHref(authorizeUrl: string | null, location: {
|
|
553
|
-
origin: string;
|
|
554
|
-
pathname: string;
|
|
555
|
-
search: string;
|
|
556
|
-
}): string | null;
|
|
557
|
-
/**
|
|
558
|
-
* The Switch-app control: a grid of the Cbox apps this person can open, read live from the
|
|
559
|
-
* host's catalog endpoint. The host owns the endpoint and the grant; this renders the answer,
|
|
560
|
-
* refreshes it when it expires while the panel is open, and offers the way back to Cbox ID
|
|
561
|
-
* when the grant is missing. Each tile shows the app's icon from the catalog (light and dark),
|
|
562
|
-
* and the answer is kept so `CboxServiceMark` paints the app's own mark from it.
|
|
720
|
+
* The Switch-app control. It renders `<cbox-app-switcher>` from `@cboxdk/cbox-ui/app-switcher`,
|
|
721
|
+
* the same element every Blade app uses, so React and Blade apps draw one identical control:
|
|
722
|
+
* the live catalog from the host's endpoint, Cbox ID's light and dark icons, a quiet retry when
|
|
723
|
+
* the catalog cannot be loaded, and straight to sign-in when the host answers `401 { signin_url }`.
|
|
563
724
|
*/
|
|
564
|
-
declare function CboxAppCatalog({ endpoint, currentAppKey, className }: CboxAppCatalogProps):
|
|
725
|
+
declare function CboxAppCatalog({ endpoint, currentAppKey, theme, className }: CboxAppCatalogProps): react.ReactElement<{
|
|
726
|
+
endpoint: string;
|
|
727
|
+
current: string;
|
|
728
|
+
labels: string;
|
|
729
|
+
theme: CboxThemeMode | undefined;
|
|
730
|
+
className: string | undefined;
|
|
731
|
+
}, string | react.JSXElementConstructor<any>>;
|
|
565
732
|
|
|
566
|
-
/**
|
|
567
|
-
* Every Cbox app's icon comes from Cbox ID's catalog: one light and one dark upload per app
|
|
568
|
-
* (`icon_url`, `icon_dark_url`). There is no local copy of the marks in this package or in an
|
|
569
|
-
* app. The last catalog the browser saw is kept here so an app's own mark and the switcher
|
|
570
|
-
* paint at once on the next page; the live answer replaces it when it arrives.
|
|
571
|
-
*/
|
|
572
|
-
type CboxKnownApp = {
|
|
573
|
-
key: string;
|
|
574
|
-
name: string;
|
|
575
|
-
icon_url: string | null;
|
|
576
|
-
icon_dark_url: string | null;
|
|
577
|
-
};
|
|
578
|
-
/** Keep the catalog the person just loaded, so every mark on this origin repaints from it. */
|
|
579
|
-
declare function rememberAppCatalog(apps: ReadonlyArray<{
|
|
580
|
-
key: string;
|
|
581
|
-
name: string;
|
|
582
|
-
icon_url?: string | null;
|
|
583
|
-
icon_dark_url?: string | null;
|
|
584
|
-
}>): void;
|
|
585
733
|
/** The last catalog this browser kept; empty on the server and before the first answer. */
|
|
586
734
|
declare function useKnownAppCatalog(): CboxKnownApp[];
|
|
587
|
-
/** Only `https:` icon URLs are rendered: the icons are hosted by Cbox ID. */
|
|
588
|
-
declare function secureIconUrl(url: unknown): string | null;
|
|
589
735
|
type CboxAppIconProps = {
|
|
590
736
|
/** The app's name; its first two letters stand in when it has no icon. */
|
|
591
737
|
name: string;
|
|
@@ -616,126 +762,6 @@ type CboxServiceMarkProps = {
|
|
|
616
762
|
/** An app's own mark (its rail or brand icon), read from the catalog this browser last kept. */
|
|
617
763
|
declare function CboxServiceMark({ appKey, className, fallback }: CboxServiceMarkProps): react_jsx_runtime.JSX.Element;
|
|
618
764
|
|
|
619
|
-
type AppSwitcherProps = {
|
|
620
|
-
className?: string;
|
|
621
|
-
/**
|
|
622
|
-
* Called when the user clicks an app they're not entitled to. Use
|
|
623
|
-
* this to open an upgrade flow / Stripe checkout / Intercom message.
|
|
624
|
-
* If unset, locked rows fall through to a static "Add to plan"
|
|
625
|
-
* affordance — the click is a no-op so we never silently ship the
|
|
626
|
-
* user to a broken paywall.
|
|
627
|
-
*/
|
|
628
|
-
onLockedAppClick?: (app: CboxAppLink) => void;
|
|
629
|
-
};
|
|
630
|
-
/**
|
|
631
|
-
* Left-cluster app picker — the dropdown button that sits beside OrgSwitcher.
|
|
632
|
-
*
|
|
633
|
-
* Shows the current app's monogram + name as the trigger so both context
|
|
634
|
-
* dimensions (which app, which org) are immediately visible in the left
|
|
635
|
-
* cluster without needing to open anything.
|
|
636
|
-
*
|
|
637
|
-
* The dropdown preserves the full AppLauncher row richness: monogram tile
|
|
638
|
-
* with per-app accent, name, description, and entitlement badges. Entitled
|
|
639
|
-
* apps are grouped first; locked / coming-soon land in an "Available" section.
|
|
640
|
-
*
|
|
641
|
-
* Includes typeahead — auto-focus on open, filters name/description/key as
|
|
642
|
-
* the user types, arrow-key navigation, Enter to activate, Escape to close.
|
|
643
|
-
*
|
|
644
|
-
* Soft-reads via useCboxIdOptional — renders null when no provider is
|
|
645
|
-
* mounted above (admin shells, pre-auth pages).
|
|
646
|
-
*/
|
|
647
|
-
declare function AppSwitcher({ className, onLockedAppClick }: AppSwitcherProps): react_jsx_runtime.JSX.Element | null;
|
|
648
|
-
|
|
649
|
-
/**
|
|
650
|
-
* Bell with unread-count badge + popover preview. Click opens a
|
|
651
|
-
* dropdown with the last 5 items inline (no navigation), each with
|
|
652
|
-
* an inline mark-read action and an optional deep-link to the page
|
|
653
|
-
* that originated the notification. "See all" at the bottom links
|
|
654
|
-
* to the central notifications service inbox — the only navigation
|
|
655
|
-
* away from the host app.
|
|
656
|
-
*
|
|
657
|
-
* Pattern matches Linear / GitHub / Stripe: glance + mark-read
|
|
658
|
-
* without leaving context; cross-app jump only when the user
|
|
659
|
-
* explicitly wants the full list.
|
|
660
|
-
*
|
|
661
|
-
* Renders nothing if the context is missing or notifications
|
|
662
|
-
* aren't configured (eg pre-auth pages).
|
|
663
|
-
*/
|
|
664
|
-
declare function NotificationsBell({ className }: {
|
|
665
|
-
className?: string;
|
|
666
|
-
}): react_jsx_runtime.JSX.Element | null;
|
|
667
|
-
|
|
668
|
-
type Props$5 = {
|
|
669
|
-
/**
|
|
670
|
-
* Optional renderer override for the trigger so apps can match
|
|
671
|
-
* their topbar style (filled button vs ghost vs icon-only).
|
|
672
|
-
*/
|
|
673
|
-
Trigger?: ComponentType<{
|
|
674
|
-
organization: CboxOrganization | null;
|
|
675
|
-
onClick: () => void;
|
|
676
|
-
open: boolean;
|
|
677
|
-
}>;
|
|
678
|
-
className?: string;
|
|
679
|
-
};
|
|
680
|
-
/**
|
|
681
|
-
* Dropdown that surfaces the user's orgs and dispatches the picked
|
|
682
|
-
* one through `onSwitchOrganization`. Reads everything else from
|
|
683
|
-
* CboxIdProvider so the same component works in id, cortex, atlas —
|
|
684
|
-
* no per-app data wiring.
|
|
685
|
-
*
|
|
686
|
-
* Includes typeahead — auto-focus on open, filters by name as the
|
|
687
|
-
* user types, arrow-key navigation, Enter to switch, Escape to close.
|
|
688
|
-
*/
|
|
689
|
-
declare function OrgSwitcher({ Trigger, className }: Props$5): react_jsx_runtime.JSX.Element;
|
|
690
|
-
|
|
691
|
-
type Props$4 = {
|
|
692
|
-
/** Click handler — typically dispatches the app's command-palette
|
|
693
|
-
* open shortcut. Apps that don't have a palette yet pass a no-op
|
|
694
|
-
* so the chrome stays visually consistent across the suite. */
|
|
695
|
-
onOpen?: () => void;
|
|
696
|
-
className?: string;
|
|
697
|
-
label?: string;
|
|
698
|
-
};
|
|
699
|
-
/**
|
|
700
|
-
* Topbar Search trigger — a visual-only command-palette button.
|
|
701
|
-
*
|
|
702
|
-
* Hosted in cbox-ui because every Cbox app's chrome must show the
|
|
703
|
-
* same search affordance in the same spot, with the same width and
|
|
704
|
-
* the same shortcut hint. Drift across apps means users see layout
|
|
705
|
-
* shifts when tabbing between id / webhooks / cortex; that's a UX
|
|
706
|
-
* tax we don't want to charge them.
|
|
707
|
-
*
|
|
708
|
-
* The actual palette stays per-app (commands differ); this primitive
|
|
709
|
-
* just renders the trigger and dispatches `onOpen`.
|
|
710
|
-
*/
|
|
711
|
-
declare function SearchTrigger({ onOpen, className, label }: Props$4): react_jsx_runtime.JSX.Element;
|
|
712
|
-
|
|
713
|
-
type Props$3 = {
|
|
714
|
-
/**
|
|
715
|
-
* App-specific menu items rendered above the standard
|
|
716
|
-
* "Manage account" / "Sign out" set. Use sparingly — the goal
|
|
717
|
-
* is consistency across apps.
|
|
718
|
-
*/
|
|
719
|
-
extras?: ReactNode;
|
|
720
|
-
placement?: 'bottom-end' | 'top-start';
|
|
721
|
-
className?: string;
|
|
722
|
-
/**
|
|
723
|
-
* The router's link for the account and organization rows, when they are pages of this
|
|
724
|
-
* app (an Inertia `Link` keeps the visit client-side). Default: a plain anchor, which is
|
|
725
|
-
* right when the rows deep-link into Cbox ID on another origin.
|
|
726
|
-
*/
|
|
727
|
-
LinkComponent?: LinkComponent;
|
|
728
|
-
};
|
|
729
|
-
/**
|
|
730
|
-
* User-menu dropdown. Always exposes:
|
|
731
|
-
* - Manage account ↗ (deep-link into id)
|
|
732
|
-
* - Team & billing ↗ (deep-link into id, current org scope)
|
|
733
|
-
* - Sign out
|
|
734
|
-
*
|
|
735
|
-
* The arrows signal cross-app navigation — id is canonical.
|
|
736
|
-
*/
|
|
737
|
-
declare function UserMenu({ extras, className, placement, LinkComponent: Link }: Props$3): react_jsx_runtime.JSX.Element;
|
|
738
|
-
|
|
739
765
|
/**
|
|
740
766
|
* Combobox — the canonical select replacement for the Cbox suite.
|
|
741
767
|
*
|
|
@@ -806,7 +832,7 @@ type ComboboxAvatar = {
|
|
|
806
832
|
accent?: string;
|
|
807
833
|
src?: string;
|
|
808
834
|
};
|
|
809
|
-
type LinkComp
|
|
835
|
+
type LinkComp = ComponentType<{
|
|
810
836
|
href: string;
|
|
811
837
|
prefetch?: boolean;
|
|
812
838
|
className?: string;
|
|
@@ -842,7 +868,7 @@ type CommonProps = {
|
|
|
842
868
|
* Framework Link adapter for navigation-mode items + footer link.
|
|
843
869
|
* If unset, navigation falls back to plain `<a>`.
|
|
844
870
|
*/
|
|
845
|
-
LinkComponent?: LinkComp
|
|
871
|
+
LinkComponent?: LinkComp;
|
|
846
872
|
/** ID for the trigger button (associate with a <Label htmlFor>). */
|
|
847
873
|
id?: string;
|
|
848
874
|
/** className for the outer wrapper. */
|
|
@@ -866,111 +892,6 @@ type NavModeProps = CommonProps & {
|
|
|
866
892
|
type ComboboxProps = ValueModeProps | NavModeProps;
|
|
867
893
|
declare function Combobox(props: ComboboxProps): react_jsx_runtime.JSX.Element;
|
|
868
894
|
|
|
869
|
-
/**
|
|
870
|
-
* ContextBar — the topbar breadcrumb-style context selector. One
|
|
871
|
-
* crumb per level of context (org / project / environment / branch /
|
|
872
|
-
* deployment). Each crumb renders as a chip (avatar + label +
|
|
873
|
-
* chevron) and opens a dropdown with the items at that level plus
|
|
874
|
-
* an optional "+ New X" footer.
|
|
875
|
-
*
|
|
876
|
-
* The pattern is the cloud-platform default — Vercel, Render, Forge,
|
|
877
|
-
* GitHub, Stripe, Cortex all use it. Topbar carries identity and
|
|
878
|
-
* context; sidebar carries navigation. The two never overlap.
|
|
879
|
-
*
|
|
880
|
-
* URL-driven by default — clicking a dropdown item navigates via the
|
|
881
|
-
* supplied `LinkComponent`. Apps that need a non-navigational select
|
|
882
|
-
* (post a form, mutate session state) pass `onSelect` instead.
|
|
883
|
-
*
|
|
884
|
-
* Separator between crumbs is a muted slash — same as Forge / Cortex.
|
|
885
|
-
*/
|
|
886
|
-
type ContextAvatar = {
|
|
887
|
-
/** 1–2 character monogram. Defaults to first letter of the label. */
|
|
888
|
-
initials?: string;
|
|
889
|
-
/**
|
|
890
|
-
* Hex / CSS colour applied as the avatar's bg. Falls back to the
|
|
891
|
-
* neutral chip when missing. Per-item override of the default.
|
|
892
|
-
*/
|
|
893
|
-
accent?: string;
|
|
894
|
-
/** Optional avatar image URL — overrides initials when set. */
|
|
895
|
-
src?: string;
|
|
896
|
-
};
|
|
897
|
-
type ContextItem = {
|
|
898
|
-
/** Stable identity for the item (slug, id). */
|
|
899
|
-
id: string;
|
|
900
|
-
/** Primary display label. */
|
|
901
|
-
label: string;
|
|
902
|
-
/** Optional secondary line — slug, role, env name. Mono-tracked. */
|
|
903
|
-
secondary?: string;
|
|
904
|
-
/** Avatar specification. Same shape as the crumb's own avatar. */
|
|
905
|
-
avatar?: ContextAvatar;
|
|
906
|
-
/** Navigation target — clicking the item navigates here. */
|
|
907
|
-
href?: string;
|
|
908
|
-
/** Mark the item as the active selection (gets a check on the right). */
|
|
909
|
-
current?: boolean;
|
|
910
|
-
/**
|
|
911
|
-
* Optional href to a settings page for this item. When set, a
|
|
912
|
-
* cogwheel button appears on the right of the row on hover/focus
|
|
913
|
-
* — clicking it navigates straight to settings without going
|
|
914
|
-
* through the item's normal selection. Cortex-style shortcut.
|
|
915
|
-
*/
|
|
916
|
-
settingsHref?: string;
|
|
917
|
-
/**
|
|
918
|
-
* Aria-label for the optional settings cogwheel. Defaults to
|
|
919
|
-
* `Settings for <label>`. Override when the label alone isn't
|
|
920
|
-
* enough context (eg multiple items with the same name).
|
|
921
|
-
*/
|
|
922
|
-
settingsAriaLabel?: string;
|
|
923
|
-
};
|
|
924
|
-
type ContextCrumb = {
|
|
925
|
-
/** Stable identity for the crumb (used as React key). */
|
|
926
|
-
id: string;
|
|
927
|
-
/** The chip's visible label — typically the active item's name. */
|
|
928
|
-
label: string;
|
|
929
|
-
/** The chip's avatar — typically the active item's avatar. */
|
|
930
|
-
avatar?: ContextAvatar;
|
|
931
|
-
/** Items shown in the dropdown. Empty array = chip with no menu. */
|
|
932
|
-
items: ContextItem[];
|
|
933
|
-
/**
|
|
934
|
-
* Optional footer link below the items — typically "+ New X" or
|
|
935
|
-
* "Manage Y". Renders with a + icon and an accent text colour.
|
|
936
|
-
*/
|
|
937
|
-
footerLink?: {
|
|
938
|
-
label: string;
|
|
939
|
-
href: string;
|
|
940
|
-
};
|
|
941
|
-
/**
|
|
942
|
-
* Override per-item navigation. When set, item clicks call this
|
|
943
|
-
* with the item's id instead of navigating to `item.href`. Useful
|
|
944
|
-
* for posting a form (eg an org switcher that POSTs to a server-side
|
|
945
|
-
* endpoint).
|
|
946
|
-
*/
|
|
947
|
-
onSelect?: (itemId: string) => void;
|
|
948
|
-
/** Optional aria-label for the chip's button (defaults to "Switch <label>"). */
|
|
949
|
-
ariaLabel?: string;
|
|
950
|
-
};
|
|
951
|
-
type LinkComp = ComponentType<{
|
|
952
|
-
href: string;
|
|
953
|
-
prefetch?: boolean;
|
|
954
|
-
className?: string;
|
|
955
|
-
children: ReactNode;
|
|
956
|
-
}>;
|
|
957
|
-
type Props$2 = {
|
|
958
|
-
crumbs: ContextCrumb[];
|
|
959
|
-
/**
|
|
960
|
-
* The framework's link component. Inertia consumers pass the
|
|
961
|
-
* Inertia Link; TanStack Router consumers pass their typed Link.
|
|
962
|
-
* Plain `<a>` is the fallback.
|
|
963
|
-
*/
|
|
964
|
-
LinkComponent?: LinkComp;
|
|
965
|
-
className?: string;
|
|
966
|
-
};
|
|
967
|
-
declare function ContextBar({ crumbs, LinkComponent, className, }: Props$2): react_jsx_runtime.JSX.Element | null;
|
|
968
|
-
declare function ContextAvatarChip({ avatar, fallbackLabel, size, }: {
|
|
969
|
-
avatar: ContextAvatar;
|
|
970
|
-
fallbackLabel: string;
|
|
971
|
-
size?: 'sm' | 'md';
|
|
972
|
-
}): react_jsx_runtime.JSX.Element;
|
|
973
|
-
|
|
974
895
|
/**
|
|
975
896
|
* Generic panel container — soft border, card surface, subtle shadow.
|
|
976
897
|
* The default building block for every section on a page.
|
|
@@ -1038,6 +959,13 @@ type Props$1 = {
|
|
|
1038
959
|
eyebrow?: ReactNode;
|
|
1039
960
|
description?: ReactNode;
|
|
1040
961
|
actions?: ReactNode;
|
|
962
|
+
/**
|
|
963
|
+
* Show the `?` beside the title that toggles the shell's Help column (spec §7.1). The page's
|
|
964
|
+
* help topic travels in `shell.help.topic`, set on the server per route (console-kit's
|
|
965
|
+
* `helpTopic`), so Help knows the topic on the first paint and for pages without a header.
|
|
966
|
+
* Ignored outside `CboxShell`.
|
|
967
|
+
*/
|
|
968
|
+
help?: boolean;
|
|
1041
969
|
className?: string;
|
|
1042
970
|
};
|
|
1043
971
|
/**
|
|
@@ -1046,7 +974,7 @@ type Props$1 = {
|
|
|
1046
974
|
* Cortex-style — no italics, no brackets — so it carries across many
|
|
1047
975
|
* sibling apps cleanly.
|
|
1048
976
|
*/
|
|
1049
|
-
declare function PageHeader({ title, eyebrow, description, actions, className, }: Props$1): react_jsx_runtime.JSX.Element;
|
|
977
|
+
declare function PageHeader({ title, eyebrow, description, actions, help, className, }: Props$1): react_jsx_runtime.JSX.Element;
|
|
1050
978
|
|
|
1051
979
|
/**
|
|
1052
980
|
* Width policy for `<PageShell>` — the single horizontal-rhythm
|
|
@@ -1272,25 +1200,17 @@ declare function StatusPill({ children, tone, className, dot, }: StatusPillProps
|
|
|
1272
1200
|
* land.
|
|
1273
1201
|
*
|
|
1274
1202
|
* The criterion for accepting a new surface: "would it be useful
|
|
1275
|
-
* in *every* Cbox app?" Inbox yes.
|
|
1203
|
+
* in *every* Cbox app?" Inbox yes. "Webhook
|
|
1276
1204
|
* delivery details" no — that's a route inside webhooks, not a
|
|
1277
1205
|
* cross-app overlay.
|
|
1278
1206
|
*/
|
|
1279
1207
|
|
|
1280
|
-
|
|
1208
|
+
/** Search and Help are the shell's palette and Help column now; `inbox` stays for apps that use it. */
|
|
1209
|
+
type SurfaceId = 'inbox';
|
|
1281
1210
|
type SurfaceArgs = {
|
|
1282
1211
|
inbox: {
|
|
1283
1212
|
focusUnread?: boolean;
|
|
1284
1213
|
};
|
|
1285
|
-
search: {
|
|
1286
|
-
initialQuery?: string;
|
|
1287
|
-
};
|
|
1288
|
-
activity: {
|
|
1289
|
-
scope?: 'user' | 'org';
|
|
1290
|
-
};
|
|
1291
|
-
help: {
|
|
1292
|
-
topic?: string;
|
|
1293
|
-
};
|
|
1294
1214
|
};
|
|
1295
1215
|
/**
|
|
1296
1216
|
* Auth + transport plumbing the host injects. cbox-ui's surface
|
|
@@ -1306,7 +1226,6 @@ type Transport = {
|
|
|
1306
1226
|
*/
|
|
1307
1227
|
urls: Partial<{
|
|
1308
1228
|
notifications: string;
|
|
1309
|
-
search: string;
|
|
1310
1229
|
audit: string;
|
|
1311
1230
|
realtime: string;
|
|
1312
1231
|
}>;
|
|
@@ -1327,10 +1246,6 @@ type Transport = {
|
|
|
1327
1246
|
csrfToken?: () => string;
|
|
1328
1247
|
};
|
|
1329
1248
|
type SurfaceConfig = Partial<{
|
|
1330
|
-
search: {
|
|
1331
|
-
placeholder?: string;
|
|
1332
|
-
scopes?: string[];
|
|
1333
|
-
};
|
|
1334
1249
|
inbox: {};
|
|
1335
1250
|
}>;
|
|
1336
1251
|
/**
|
|
@@ -1386,7 +1301,7 @@ type CboxSurfacesProps = {
|
|
|
1386
1301
|
|
|
1387
1302
|
/**
|
|
1388
1303
|
* Mount the cbox-ui surface runtime once per app, alongside the
|
|
1389
|
-
* page tree. The host's chrome (bell
|
|
1304
|
+
* page tree. The host's chrome (the bell) reads
|
|
1390
1305
|
* `useCboxSurfaces()` to open surfaces; cbox-ui renders the
|
|
1391
1306
|
* active one as a modal/drawer over the page.
|
|
1392
1307
|
*
|
|
@@ -1403,7 +1318,7 @@ declare function CboxSurfaces({ transport, surfaces, config, children, }: CboxSu
|
|
|
1403
1318
|
declare function useCboxSurfaces(): SurfaceController;
|
|
1404
1319
|
/**
|
|
1405
1320
|
* Optional variant — returns `null` when no `<CboxSurfaces>` host is
|
|
1406
|
-
* mounted. Chrome controls (bell
|
|
1321
|
+
* mounted. Chrome controls (the bell) use this to
|
|
1407
1322
|
* degrade gracefully to cross-app navigation when the host hasn't
|
|
1408
1323
|
* opted into the surface runtime yet.
|
|
1409
1324
|
*/
|
|
@@ -1509,67 +1424,6 @@ declare function parseUrlSearch<S extends UrlSchema>(search: string, schema: S):
|
|
|
1509
1424
|
*/
|
|
1510
1425
|
declare function buildUrlSearch<S extends UrlSchema>(state: InferUrlState<S>, schema: S): string;
|
|
1511
1426
|
|
|
1512
|
-
type CboxTranslationValues = Record<string, string | number>;
|
|
1513
|
-
type CboxTranslator = (message: string, values?: CboxTranslationValues) => string;
|
|
1514
|
-
declare function interpolate(message: string, values?: CboxTranslationValues): string;
|
|
1515
|
-
/** Optional and additive: without a provider existing consumers retain English. */
|
|
1516
|
-
declare function CboxLocalizationProvider({ locale, translate, formatDate, children }: {
|
|
1517
|
-
locale: string;
|
|
1518
|
-
translate: CboxTranslator;
|
|
1519
|
-
formatDate?: (value: string) => string;
|
|
1520
|
-
children: ReactNode;
|
|
1521
|
-
}): react_jsx_runtime.JSX.Element;
|
|
1522
|
-
declare function useCboxLocalization(): {
|
|
1523
|
-
locale: string;
|
|
1524
|
-
t: CboxTranslator;
|
|
1525
|
-
formatDate: (value: string) => string;
|
|
1526
|
-
};
|
|
1527
|
-
|
|
1528
|
-
type CboxNavArea = CboxNavItem & {
|
|
1529
|
-
items?: CboxNavItem[];
|
|
1530
|
-
};
|
|
1531
|
-
type CboxWorkspaceShellProps = {
|
|
1532
|
-
appKey: string;
|
|
1533
|
-
brandSubmark: string;
|
|
1534
|
-
areas: CboxNavArea[];
|
|
1535
|
-
currentPath: string;
|
|
1536
|
-
LinkComponent: LinkComponent;
|
|
1537
|
-
context: ReactNode;
|
|
1538
|
-
tools: ReactNode;
|
|
1539
|
-
account: ReactNode;
|
|
1540
|
-
children: ReactNode;
|
|
1541
|
-
/** Where the brand row links. Default `/`. */
|
|
1542
|
-
brandHref?: string;
|
|
1543
|
-
/** `id` of the `<main>` landmark, so a host's skip link can target it. Default `main-content`. */
|
|
1544
|
-
mainId?: string;
|
|
1545
|
-
/**
|
|
1546
|
-
* Rail pinned open. Pass `pinned` + `onPinnedChange` to control it (the host persists the
|
|
1547
|
-
* preference, in a cookie or Cbox ID), or `defaultPinned` to seed the shell's own state.
|
|
1548
|
-
*/
|
|
1549
|
-
pinned?: boolean;
|
|
1550
|
-
defaultPinned?: boolean;
|
|
1551
|
-
onPinnedChange?: (pinned: boolean) => void;
|
|
1552
|
-
/** Contextual subnav collapsed to its strip. Controlled and uncontrolled as `pinned`. */
|
|
1553
|
-
collapsed?: boolean;
|
|
1554
|
-
defaultCollapsed?: boolean;
|
|
1555
|
-
onCollapsedChange?: (collapsed: boolean) => void;
|
|
1556
|
-
};
|
|
1557
|
-
/**
|
|
1558
|
-
* How well `href` matches `path`: the href's length when the path is the href or beneath it,
|
|
1559
|
-
* -1 otherwise. `/` matches only itself, so a home item never claims every page.
|
|
1560
|
-
*/
|
|
1561
|
-
declare function navMatchLength(path: string, href: string): number;
|
|
1562
|
-
/** The item whose href is the most specific match for `path`, or undefined. */
|
|
1563
|
-
declare function activeNavItem<T extends CboxNavItem>(path: string, items: readonly T[]): T | undefined;
|
|
1564
|
-
/**
|
|
1565
|
-
* The area `path` is in: the one holding the most specific match among its own href and its
|
|
1566
|
-
* items' hrefs. A first-match would put every page beneath an area at `/` (an overview, a
|
|
1567
|
-
* dashboard) under that area and never show another area's subnav.
|
|
1568
|
-
*/
|
|
1569
|
-
declare function activeNavArea<T extends CboxNavArea>(path: string, areas: readonly T[]): T | undefined;
|
|
1570
|
-
/** Two-tier workspace navigation. Route ownership and preference persistence stay with the host. */
|
|
1571
|
-
declare function CboxWorkspaceShell({ appKey, brandSubmark, areas, currentPath, LinkComponent: Link, context, tools, account, children, brandHref, mainId, pinned: pinnedProp, defaultPinned, onPinnedChange, collapsed: collapsedProp, defaultCollapsed, onCollapsedChange }: CboxWorkspaceShellProps): react_jsx_runtime.JSX.Element;
|
|
1572
|
-
|
|
1573
1427
|
/** The chart tokens in order, for series that set their own colour. */
|
|
1574
1428
|
declare const CHART_PALETTE: string[];
|
|
1575
1429
|
/** A row's shape over the window, small: a line with a faint area, zero at the bottom. Decorative. */
|
|
@@ -1580,4 +1434,4 @@ declare function Sparkline({ values, color, width, height }: {
|
|
|
1580
1434
|
height?: number;
|
|
1581
1435
|
}): react_jsx_runtime.JSX.Element | null;
|
|
1582
1436
|
|
|
1583
|
-
export { AppContent,
|
|
1437
|
+
export { APP_HUES, AppContent, type AppKey, AppShell, CHART_PALETTE, CboxAppCatalog, type CboxAppCatalogProps, CboxAppIcon, type CboxAppIconProps, type CboxAppKey, type CboxAppLink, CboxBrand, type CboxBrandProps, type CboxIdContextValue, CboxIdProvider, CboxKnownApp, CboxLocalizationProvider, type CboxNotificationPreviewItem, type CboxNotificationsState, type CboxOrganization, CboxServiceMark, type CboxServiceMarkProps, CboxShell, type CboxShellProps, CboxSurfaces, type CboxSurfacesProps, type CboxTranslationValues, type CboxTranslator, type CboxUser, Combobox, type ComboboxAvatar, type ComboboxGroup, type ComboboxOption, type ComboboxProps, type ContextItem, type ContextLevel, type ContextTone, DataPanel, EmptyState, Heading, type HelpArticle, type HelpState, type HelpStore, type InboxState, type InferUrlState, KeyValue, KeyValueList, type ListPage, type NavArea, type NavPage, PageHeader, type PageIntent, PageShell, type PageTabSpec, PageTabs, type PageTabsProps, type PageWidth, type PaletteAction, PanelBody, type RealtimeState, type RealtimeStatus, RowLink, type RowLinkProps, SHELL_ICONS, SectionHeader, type Shell, type ShellAccount, type Link as ShellActionLink, type ShellApp, type ShellBanner, type ShellCatalogState, type ShellHelp, type ShellIcon, type ShellLinkComponent, type ShellNavigate, type ShellNotifications, type ShellOption, type ShellPreferenceChange, type ShellPreferences, type ShellTheme, Sparkline, StatTile, StatusPill, type SupportUpdate, type SurfaceArgs, type SurfaceConfig, type SurfaceController, type SurfaceId, type Transport, type UrlField, type UrlSchema, applyTheme, buildUrlSearch, cn, contextTrail, createHelpStore, defineUrlSchema, environmentFor, hueFor, initialsOf, interpolate, pageIntent, parseListPage, parseShellCatalog, parseUrlSearch, settingsHref, switchPayload, themeBootScript, urlBoolean, urlEnum, urlNumber, urlString, urlStringArray, useCboxId, useCboxIdOptional, useCboxLocalization, useCboxSurfaces, useCboxSurfacesOptional, useKnownAppCatalog, useShellHelp, withQuery };
|