@declarion/react 0.1.67 → 0.1.69

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.
Files changed (55) hide show
  1. package/dist-lib/api/auth.d.ts +1 -0
  2. package/dist-lib/api/client.d.ts +17 -0
  3. package/dist-lib/api/data.d.ts +12 -0
  4. package/dist-lib/api/params.d.ts +9 -3
  5. package/dist-lib/components/fields/EmailField.d.ts +1 -1
  6. package/dist-lib/components/fields/PhoneField.d.ts +2 -0
  7. package/dist-lib/components/fields/UrlField.d.ts +1 -1
  8. package/dist-lib/components/fields/cells/factories/badge.d.ts +2 -0
  9. package/dist-lib/components/fields/cells/factories/boolPill.d.ts +2 -0
  10. package/dist-lib/components/fields/cells/factories/code.d.ts +2 -0
  11. package/dist-lib/components/fields/cells/factories/email.d.ts +2 -0
  12. package/dist-lib/components/fields/cells/factories/host-icons.d.ts +9 -0
  13. package/dist-lib/components/fields/cells/factories/link.d.ts +2 -0
  14. package/dist-lib/components/fields/cells/factories/markdown.d.ts +2 -0
  15. package/dist-lib/components/fields/cells/factories/money.d.ts +2 -0
  16. package/dist-lib/components/fields/cells/factories/multilangInline.d.ts +2 -0
  17. package/dist-lib/components/fields/cells/factories/nextRun.d.ts +2 -0
  18. package/dist-lib/components/fields/cells/factories/number.d.ts +2 -0
  19. package/dist-lib/components/fields/cells/factories/passwordMask.d.ts +2 -0
  20. package/dist-lib/components/fields/cells/factories/phone.d.ts +2 -0
  21. package/dist-lib/components/fields/cells/factories/refLink.d.ts +2 -0
  22. package/dist-lib/components/fields/cells/factories/richTextPreview.d.ts +2 -0
  23. package/dist-lib/components/fields/cells/factories/statusPill.d.ts +2 -0
  24. package/dist-lib/components/fields/cells/factories/tagList.d.ts +2 -0
  25. package/dist-lib/components/fields/cells/factories/text.d.ts +2 -0
  26. package/dist-lib/components/fields/cells/factories/timestamp.d.ts +3 -0
  27. package/dist-lib/components/fields/cells/factories/url-helpers.d.ts +12 -0
  28. package/dist-lib/components/fields/cells/factories/url.d.ts +2 -0
  29. package/dist-lib/components/fields/cells/registry.d.ts +18 -0
  30. package/dist-lib/components/fields/index.d.ts +8 -3
  31. package/dist-lib/components/file-widgets/host.d.ts +5 -1
  32. package/dist-lib/components/pages/ExportMenu.d.ts +32 -0
  33. package/dist-lib/components/pages/auth/AuthShell.d.ts +17 -2
  34. package/dist-lib/components/pages/auth/Reset.d.ts +1 -0
  35. package/dist-lib/components/pages/exportRequest.d.ts +71 -0
  36. package/dist-lib/components/primitives/BrandGlyph.d.ts +8 -0
  37. package/dist-lib/components/primitives/BrandLogo.d.ts +1 -5
  38. package/dist-lib/components/primitives/index.d.ts +2 -0
  39. package/dist-lib/components/shared/EmptyState.d.ts +1 -1
  40. package/dist-lib/declarion-glyph.svg +17 -0
  41. package/dist-lib/declarion-react.css +1 -1
  42. package/dist-lib/hooks/useParams.d.ts +42 -1
  43. package/dist-lib/hooks/useUserLocale.d.ts +1 -0
  44. package/dist-lib/index.d.ts +2 -1
  45. package/dist-lib/index.js +5934 -4310
  46. package/dist-lib/index.js.map +1 -1
  47. package/dist-lib/lib/safe-url.d.ts +1 -0
  48. package/dist-lib/lib/timestamp.d.ts +17 -0
  49. package/dist-lib/stores/appearance.d.ts +3 -0
  50. package/dist-lib/stores/auth.d.ts +1 -0
  51. package/dist-lib/types/api.d.ts +45 -0
  52. package/dist-lib/types/fieldType.d.ts +2 -0
  53. package/dist-lib/types/schema.d.ts +53 -0
  54. package/dist-lib/vite/declarion-glyph.svg +17 -0
  55. package/package.json +2 -2
@@ -23,3 +23,4 @@ export interface ImpersonationStartResponse extends LoginResponse {
23
23
  export declare function impersonationStart(targetUserId: string, reason: string, durationMinutes?: number): Promise<ImpersonationStartResponse>;
24
24
  export declare function impersonationStop(): Promise<LoginResponse>;
25
25
  export declare function impersonationRevoke(sessionId: string): Promise<void>;
26
+ export declare function changePassword(currentPassword: string, newPassword: string): Promise<void>;
@@ -17,6 +17,23 @@ export declare function setPersistentAuthFailureHandler(h: PersistentAuthFailure
17
17
  * reads this lazily so a setPersistentAuthFailureHandler() call from a test
18
18
  * is observed by the SSE retry loop without re-importing the module. */
19
19
  export declare function getPersistentAuthFailureHandler(): PersistentAuthFailureHandler;
20
+ export type ApiErrorReport = {
21
+ status: number;
22
+ code: string;
23
+ message: string;
24
+ };
25
+ type ApiErrorReporter = (report: ApiErrorReport) => void;
26
+ /** Replace the reporter invoked for every non-2xx response. Returns the
27
+ * previous reporter so callers can restore it. Tests should install a
28
+ * spy or no-op via this hook instead of stubbing `console.error`. */
29
+ export declare function setApiErrorReporter(r: ApiErrorReporter): ApiErrorReporter;
20
30
  export declare function apiFetch<T>(path: string, options?: RequestInit): Promise<T>;
31
+ export interface BlobResponse {
32
+ blob: Blob;
33
+ filename: string;
34
+ headers: Headers;
35
+ }
36
+ export declare function apiFetchBlob(path: string, options?: RequestInit): Promise<BlobResponse>;
37
+ export declare function parseContentDispositionFilename(headers: Headers): string;
21
38
  export declare function callHandler<R = unknown>(code: string, args?: unknown): Promise<R>;
22
39
  export {};
@@ -1,11 +1,23 @@
1
1
  import type { ListParams, ListResponse, DataResponse } from "../types/api";
2
2
  import type { PkValues } from "../types/schema";
3
+ import type { ExportRequest } from "../components/pages/exportRequest";
3
4
  export declare function listEntities(entity: string, params?: ListParams): Promise<ListResponse>;
4
5
  export declare function getEntity(entity: string, pkValues: PkValues | string): Promise<DataResponse>;
5
6
  export declare function createEntity(entity: string, data: Record<string, unknown>): Promise<DataResponse>;
6
7
  export declare function updateEntity(entity: string, pkValues: PkValues | string, data: Record<string, unknown>): Promise<DataResponse>;
7
8
  export declare function deleteEntity(entity: string, pkValues: PkValues | string): Promise<void>;
8
9
  export declare function restoreEntity(entity: string, pkValues: PkValues | string): Promise<void>;
10
+ /** Result of POST /api/data/{entity}/export. The server streams a CSV
11
+ * blob; the client gets the bytes plus the server-resolved filename
12
+ * (parsed from Content-Disposition by apiFetchBlob, with RFC 5987
13
+ * filename* preferred). Triggering the actual download (anchor click)
14
+ * is the caller's job — separation lets ExportMenu show the bytes in a
15
+ * toast when the browser blocks the download. */
16
+ export interface ExportResponse {
17
+ blob: Blob;
18
+ filename: string;
19
+ }
20
+ export declare function exportEntities(entity: string, body: ExportRequest): Promise<ExportResponse>;
9
21
  /**
10
22
  * Action request body is flat: top-level keys are handler params. The only
11
23
  * reserved control key is `_ids` (array of object IDs for single/batch
@@ -1,11 +1,17 @@
1
- import type { PublicParamsResponse, ResolvedParam } from "../types/api";
1
+ import type { ParamLookup, PublicParamsResponse } from "../types/api";
2
2
  /**
3
3
  * Fetches the full pre-login envelope from /api/params/public:
4
- * {parameters, accents, branding}. Used by AuthShell to theme
4
+ * {parameters, accents, branding, meta}. Used by AuthShell to theme
5
5
  * unauthenticated screens before any user context exists.
6
6
  */
7
7
  export declare function fetchPublicParams(): Promise<PublicParamsResponse>;
8
- export declare function fetchParam(code: string): Promise<ResolvedParam>;
8
+ /**
9
+ * Looks up a single parameter from the platform. Always returns a
10
+ * `ParamLookup`; `found:false` signals "no value, use your default".
11
+ * Network/auth failures still throw - "missing" is normal, "broken"
12
+ * is an error.
13
+ */
14
+ export declare function fetchParam(code: string): Promise<ParamLookup>;
9
15
  /**
10
16
  * Persist a parameter override at user scope. Writes via the existing
11
17
  * subresource $params channel on the user entity (PATCH /api/data/user).
@@ -1,2 +1,2 @@
1
1
  import type { FieldRendererProps } from "./index";
2
- export declare function EmailField({ value, mode, onChange }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function EmailField({ value, onChange }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { FieldRendererProps } from "./index";
2
+ export declare function PhoneField({ value, onChange }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import type { FieldRendererProps } from "./index";
2
- export declare function UrlField({ field, value, mode, onChange }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function UrlField({ value, onChange }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const badgeFactory: CellFactory;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const boolPillFactory: CellFactory;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const codeFactory: CellFactory;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const emailFactory: CellFactory;
@@ -0,0 +1,9 @@
1
+ import { type FC, type SVGProps } from "react";
2
+ type IconFC = FC<SVGProps<SVGSVGElement>>;
3
+ export interface HostIconProps {
4
+ /** Canonical (after-www) hostname; pass null/empty to render the globe. */
5
+ domain: string | null | undefined;
6
+ }
7
+ export declare function HostIcon({ domain }: HostIconProps): React.ReactElement;
8
+ export declare const GENERIC_GLOBE: IconFC;
9
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const linkFactory: CellFactory;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const markdownFactory: CellFactory;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const moneyFactory: CellFactory;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const multilangInlineFactory: CellFactory;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const nextRunFactory: CellFactory;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const numberFactory: CellFactory;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const passwordMaskFactory: CellFactory;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const phoneFactory: CellFactory;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const refLinkFactory: CellFactory;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const richTextPreviewFactory: CellFactory;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const statusPillFactory: CellFactory;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const tagListFactory: CellFactory;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const textFactory: CellFactory;
@@ -0,0 +1,3 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const timeAgoFactory: CellFactory;
3
+ export declare const timestampFullFactory: CellFactory;
@@ -0,0 +1,12 @@
1
+ export declare const LONG_TLD: RegExp;
2
+ export declare function looksLikeHostname(candidate: string): boolean;
3
+ export declare function normalizeUrl(raw: string): string | null;
4
+ export declare function parseDomain(href: string): string | null;
5
+ /**
6
+ * LinkedIn is the only host we special-case. Recognized path prefixes
7
+ * `/in/<slug>`, `/company/<slug>`, `/school/<slug>` render as `<prefix>/<slug>`.
8
+ * Any other linkedin.com URL (feed, jobs, posts, bare host) falls through to
9
+ * the default hostname rendering.
10
+ */
11
+ export declare function linkedinLabel(href: string, domain: string): string | null;
12
+ export declare function isValidUrl(href: string): boolean;
@@ -0,0 +1,2 @@
1
+ import type { CellFactory } from "../registry";
2
+ export declare const urlFactory: CellFactory;
@@ -0,0 +1,18 @@
1
+ import type { ReactNode } from "react";
2
+ import type { EntityField, Entity, Screen } from "../../../types/schema";
3
+ export type RowRecord = Record<string, unknown>;
4
+ export type CellRenderer = (value: unknown, record: RowRecord) => ReactNode;
5
+ export type RefsMap = Record<string, Record<string, Record<string, unknown>>>;
6
+ export interface CellResolveCtx {
7
+ field: EntityField;
8
+ fieldName: string;
9
+ entity?: Entity;
10
+ entities?: Record<string, Entity>;
11
+ screens?: Record<string, Screen>;
12
+ refs?: RefsMap | (() => RefsMap | undefined);
13
+ locale: string;
14
+ navigate?: (href: string) => void;
15
+ }
16
+ export type CellFactory = (ctx: CellResolveCtx) => CellRenderer;
17
+ export declare const REGISTRY_WIDGETS: readonly string[];
18
+ export declare function resolveCellRenderer(ctx: CellResolveCtx): CellRenderer;
@@ -1,4 +1,5 @@
1
- import type { EntityField } from "../../types/schema";
1
+ import type { EntityField, Entity, Screen } from "../../types/schema";
2
+ import { type FieldType } from "../../types/fieldType";
2
3
  export type RefsMap = Record<string, Record<string, Record<string, unknown>>>;
3
4
  export interface FieldRendererProps {
4
5
  field: EntityField;
@@ -11,9 +12,13 @@ export interface FieldRendererProps {
11
12
  refs?: RefsMap;
12
13
  fill?: boolean;
13
14
  compact?: boolean;
15
+ entity?: Entity;
16
+ entities?: Record<string, Entity>;
17
+ screens?: Record<string, Screen>;
18
+ navigate?: (href: string) => void;
19
+ locale: string;
14
20
  }
15
21
  type FieldRenderer = React.ComponentType<FieldRendererProps>;
22
+ export declare const editRegistry: Record<FieldType, FieldRenderer>;
16
23
  export declare function renderField(props: FieldRendererProps): React.ReactNode;
17
- export declare function getFieldRenderer(type: string): FieldRenderer;
18
- export declare function hasFieldRenderer(key: string): boolean;
19
24
  export {};
@@ -1,5 +1,5 @@
1
1
  import type { ReactNode } from "react";
2
- import type { Entity } from "../../types/schema";
2
+ import type { Entity, Screen } from "../../types/schema";
3
3
  import type { FileFieldDef, FileFieldValue } from "../../types/files";
4
4
  import type { RefsMap } from "../../components/fields";
5
5
  export declare function getEntityFileField(entity: Pick<Entity, "files">, fieldName: string): FileFieldDef | undefined;
@@ -16,4 +16,8 @@ export declare function renderSchemaField(props: {
16
16
  onChange?: (value: unknown) => void;
17
17
  refs?: RefsMap;
18
18
  disabled?: boolean;
19
+ entities?: Record<string, Entity>;
20
+ screens?: Record<string, Screen>;
21
+ navigate?: (href: string) => void;
22
+ locale: string;
19
23
  }): ReactNode;
@@ -0,0 +1,32 @@
1
+ import type { Entity, Screen } from "../../types/schema";
2
+ import { type ListViewState } from "./exportRequest";
3
+ export interface ExportMenuProps {
4
+ entityCode: string;
5
+ entity: Entity;
6
+ screen?: Screen | undefined;
7
+ /** Live list-view state (filters/search/sort/page/per_page/etc). */
8
+ viewState: ListViewState;
9
+ /** Visible columns in display order. _select / _actions stripped by buildExportRequest. */
10
+ visibleColumns: string[];
11
+ /** Currently-selected row PKs. Empty array = nothing selected; the
12
+ * Selected scope item is hidden. Caller is responsible for translating
13
+ * whatever row-selection state shape into PK objects. */
14
+ selectedRowPKs: Array<Record<string, string>>;
15
+ /** Total row count for the current view, when known (from list meta.total).
16
+ * When undefined, the menu shows "all matching rows" instead of a number. */
17
+ totalRows?: number;
18
+ /** Per-page size of the current view (for the Current page label). */
19
+ pageSize?: number;
20
+ /** Caller's UI locale (e.g. "en"). Server falls back to ui_language when omitted. */
21
+ locale?: string;
22
+ /** Optional placement override for the popover. */
23
+ align?: "start" | "end";
24
+ /** When true, render only as a single MenuItem suitable for embedding inside
25
+ * the existing selection menu (replaces the placeholder at :2007-2015).
26
+ * Defaults to a full Btn + Dropdown toolbar item. */
27
+ variant?: "toolbar" | "selection-menu-item";
28
+ /** Optional click-handler ran before scope dispatch — e.g. to close a
29
+ * parent menu so the export popover doesn't stack underneath. */
30
+ onBeforeOpen?: () => void;
31
+ }
32
+ export declare function ExportMenu(props: ExportMenuProps): import("react/jsx-runtime").JSX.Element | null;
@@ -2,7 +2,22 @@ import { type ReactNode } from "react";
2
2
  import { Icon } from "../../../components/primitives/Icons";
3
3
  export type AuthShellProps = {
4
4
  children: ReactNode;
5
- workspaceHost?: string;
5
+ /**
6
+ * Tenant slug used to compose the workspace pill. The pill renders
7
+ * `<tenantSlug>.<branding.workspace_domain>` only when both pieces
8
+ * are set; otherwise it is hidden. Callers are not required to
9
+ * provide a slug — the auth shell fails closed (no pill) rather
10
+ * than display a placeholder host.
11
+ *
12
+ * Currently unwired in v1: no SDK caller passes this prop because
13
+ * frontend tenant-from-host resolution does not exist yet (see
14
+ * `docs/gotchas.md` "Tenant Resolution" — the deferred multi-tenant-
15
+ * via-host work). When that lands, callers will source the slug from
16
+ * `window.location.hostname` (or an equivalent middleware-supplied
17
+ * context) and thread it through. Until then the pill stays hidden;
18
+ * the prop is kept so the contract is in place for the follow-up.
19
+ */
20
+ tenantSlug?: string;
6
21
  tagline?: string;
7
22
  subTagline?: string;
8
23
  version?: string;
@@ -10,4 +25,4 @@ export type AuthShellProps = {
10
25
  /** Optional override for the wordmark / app name shown in topbar + brand panel. */
11
26
  brandName?: string;
12
27
  };
13
- export declare function AuthShell({ children, workspaceHost, tagline, subTagline, version, badges, brandName, }: AuthShellProps): import("react/jsx-runtime").JSX.Element;
28
+ export declare function AuthShell({ children, tenantSlug, tagline, subTagline, version, badges, brandName, }: AuthShellProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export declare function Reset(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,71 @@
1
+ import type { FilterNodeParam } from "../../types/api";
2
+ /** ExportQuery mirrors the Go ExportQuery struct (server/handlers/data_export.go).
3
+ * Field order matches; semantics match parseListParams 1:1. */
4
+ export interface ExportQuery {
5
+ screen?: string;
6
+ filters?: FilterNodeParam[];
7
+ search?: string;
8
+ sort?: string;
9
+ include_deleted?: boolean;
10
+ page?: number;
11
+ per_page?: number;
12
+ }
13
+ /** ExportScope values accepted by the server. v1 supports `current_view`,
14
+ * `selected_rows`, and `current_page`; `template` is reserved for v2. */
15
+ export type ExportScope = "current_view" | "selected_rows" | "current_page";
16
+ /** ExportRequest mirrors the Go ExportRequest struct. */
17
+ export interface ExportRequest {
18
+ format: "csv";
19
+ scope: ExportScope;
20
+ query: ExportQuery;
21
+ columns: string[];
22
+ selection?: Array<Record<string, string>>;
23
+ locale?: string;
24
+ /** v1 wire defaults: `header_style="label"`, `ref_mode="display"`. v2 will
25
+ * add `code` / `stable_key`. Omitted = server defaults. */
26
+ header_style?: "label";
27
+ ref_mode?: "display";
28
+ filename?: string;
29
+ }
30
+ /** ListViewState captures the SmartListPage hook state needed to describe
31
+ * the current view. Field names mirror useEntityData state so the call
32
+ * site can spread it as-is. */
33
+ export interface ListViewState {
34
+ /** Active screen code, when the list is rendered through a screen. */
35
+ screenCode?: string;
36
+ /** JSON filter tree (the same shape sent in the `filters` URL param). */
37
+ jsonFilters?: FilterNodeParam[];
38
+ /** Debounced search value from the toolbar. */
39
+ search?: string;
40
+ /** "field:asc" / "field:desc" sort spec. */
41
+ sort?: string;
42
+ /** Show soft-deleted rows. */
43
+ includeDeleted?: boolean;
44
+ /** Current page (1-based). Used only for `current_page` scope. */
45
+ page?: number;
46
+ perPage?: number;
47
+ }
48
+ /** Locale resolver hook input — typically a string from the SDK ctx
49
+ * (e.g. `useLocale()`); empty/undefined defers to the server default. */
50
+ export interface ExportIntent {
51
+ scope: ExportScope;
52
+ /** All visible columns in display order. _select / _actions are stripped
53
+ * by buildExportRequest. */
54
+ visibleColumns: string[];
55
+ /** PK objects of the currently-selected rows. Non-empty only for
56
+ * `selected_rows` scope. */
57
+ selectedRowPKs?: Array<Record<string, string>>;
58
+ locale?: string;
59
+ filename?: string;
60
+ }
61
+ /** buildListQuery returns the canonical list-query JSON shape from the
62
+ * hook state the table renders against. Output is plain-object so it
63
+ * serializes deterministically through JSON.stringify (key order is
64
+ * controlled by spread order below). */
65
+ export declare function buildListQuery(state: ListViewState): ExportQuery;
66
+ /** buildExportRequest assembles the POST body for the export endpoint.
67
+ * The query block is always present (even for selected_rows; the server
68
+ * ignores filters/search/sort under that scope but keeps screen for
69
+ * per-screen export gating). Reserved column keys (_select, _actions)
70
+ * are stripped here, never on the server. */
71
+ export declare function buildExportRequest(state: ListViewState, intent: ExportIntent): ExportRequest;
@@ -0,0 +1,8 @@
1
+ export interface BrandGlyphProps {
2
+ /** Pixel edge of the rendered SVG. Defaults to 24. */
3
+ size?: number;
4
+ className?: string;
5
+ /** ARIA label; omit for purely decorative usages. */
6
+ title?: string;
7
+ }
8
+ export declare function BrandGlyph({ size, className, title }: BrandGlyphProps): import("react/jsx-runtime").JSX.Element;
@@ -6,11 +6,7 @@ export interface BrandLogoProps {
6
6
  size: number;
7
7
  /** Border radius for the image frame. Defaults to 8 at size>=30 else 6. */
8
8
  radius?: number;
9
- /**
10
- * Rendered when appLogo is missing or not a valid URL. Surfaces like
11
- * the pre-login AuthShell want a visible platform-default tile;
12
- * surfaces like the Sidebar prefer nothing (text app_name fills in).
13
- */
9
+ /** Rendered when appLogo is missing or not a valid URL. */
14
10
  fallback?: ReactNode;
15
11
  }
16
12
  export declare function BrandLogo({ appLogo, size, radius, fallback }: BrandLogoProps): import("react/jsx-runtime").JSX.Element | null;
@@ -10,6 +10,8 @@ export type { PillProps, PillTone, PillSize } from "./Pill";
10
10
  export { Kbd } from "./Kbd";
11
11
  export { Avatar } from "./Avatar";
12
12
  export type { AvatarProps } from "./Avatar";
13
+ export { BrandGlyph } from "./BrandGlyph";
14
+ export type { BrandGlyphProps } from "./BrandGlyph";
13
15
  export { Dropdown } from "./Dropdown";
14
16
  export type { DropdownProps } from "./Dropdown";
15
17
  export { Chip } from "./Chip";
@@ -2,7 +2,7 @@ import type { ReactNode } from "react";
2
2
  interface EmptyStateProps {
3
3
  icon?: string;
4
4
  title: string;
5
- description?: string;
5
+ description?: ReactNode;
6
6
  action?: ReactNode;
7
7
  }
8
8
  export declare function EmptyState({ icon, title, description, action }: EmptyStateProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,17 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
2
+ <!--
3
+ Declarion mark: angular letter "D" with an embedded "=" in the negative
4
+ space of the counter. Encodes the product thesis ("this declaration
5
+ equals this runtime behavior") in the letterform itself. Solid accent
6
+ purple #5B5BD6 — visible on both light surfaces and the dark brand
7
+ panel without prefers-color-scheme tricks. Trademark distinctive,
8
+ scales crisp from favicon (16px) through hero (96px+).
9
+ -->
10
+ <path
11
+ fill-rule="evenodd"
12
+ fill="#5B5BD6"
13
+ d="M 6 6 H 42 L 58 22 V 42 L 42 58 H 6 Z M 18 18 V 46 H 38 L 46 38 V 26 L 38 18 Z"
14
+ />
15
+ <rect x="22" y="28" width="20" height="3" fill="#5B5BD6"/>
16
+ <rect x="22" y="33" width="20" height="3" fill="#5B5BD6"/>
17
+ </svg>