@elevasis/ui 2.69.0 → 2.71.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.
Files changed (78) hide show
  1. package/dist/app/index.d.ts +26 -0
  2. package/dist/app/index.js +7 -7
  3. package/dist/auth/index.css +149 -149
  4. package/dist/auth/index.js +3 -3
  5. package/dist/charts/index.css +208 -208
  6. package/dist/charts/index.js +3 -3
  7. package/dist/{chunk-6PZFOHJK.js → chunk-3BLYJT5L.js} +2 -2
  8. package/dist/{chunk-IT7GTJCB.js → chunk-AIOV5NM7.js} +1 -1
  9. package/dist/{chunk-MRVGQLWN.js → chunk-BM2WKRAQ.js} +1 -1
  10. package/dist/{chunk-XAZR3T6Y.js → chunk-CPBT6Z2G.js} +3 -3
  11. package/dist/{chunk-XQ3ILKYN.js → chunk-DCMFNSJ6.js} +1 -1
  12. package/dist/{chunk-NU3NBXHP.js → chunk-DH2MO5DX.js} +1 -1
  13. package/dist/{chunk-ZD6LM53O.js → chunk-H3SDGC5F.js} +2 -2
  14. package/dist/{chunk-YGCMMOY4.js → chunk-JTSNU6KA.js} +695 -73
  15. package/dist/{chunk-7WJEPTE7.js → chunk-LL5H7J4N.js} +1 -1
  16. package/dist/{chunk-FLECOYUS.js → chunk-R6NMRXNO.js} +1 -1
  17. package/dist/{chunk-MFLM7BVC.js → chunk-TB2PM2OU.js} +1 -1
  18. package/dist/{chunk-IRV6KJPV.js → chunk-TCQZ4AJI.js} +1 -1
  19. package/dist/{chunk-YNRYIXUT.js → chunk-TVFSVTRG.js} +6 -6
  20. package/dist/{chunk-WXHAHKKI.js → chunk-UZ7MSORW.js} +16291 -16029
  21. package/dist/{chunk-RW64UJWT.js → chunk-VHPHWTX7.js} +2 -2
  22. package/dist/{chunk-YCRINA2D.js → chunk-VRRIHA3S.js} +1 -1
  23. package/dist/{chunk-4JHLS234.js → chunk-ZFISGKYW.js} +1 -1
  24. package/dist/components/index.css +208 -208
  25. package/dist/components/index.d.ts +59 -3
  26. package/dist/components/index.js +24 -25
  27. package/dist/components/navigation/index.css +149 -149
  28. package/dist/components/navigation/index.js +4 -4
  29. package/dist/features/auth/index.css +149 -149
  30. package/dist/features/auth/index.d.ts +26 -0
  31. package/dist/features/auth/index.js +5 -5
  32. package/dist/features/clients/index.css +208 -208
  33. package/dist/features/clients/index.js +4 -4
  34. package/dist/features/content/index.d.ts +258 -51
  35. package/dist/features/content/index.js +595 -421
  36. package/dist/features/crm/index.d.ts +26 -0
  37. package/dist/features/crm/index.js +5 -5
  38. package/dist/features/dashboard/index.js +6 -7
  39. package/dist/features/delivery/index.css +149 -149
  40. package/dist/features/delivery/index.d.ts +26 -0
  41. package/dist/features/delivery/index.js +4 -4
  42. package/dist/features/knowledge/index.css +149 -149
  43. package/dist/features/knowledge/index.js +3 -3
  44. package/dist/features/lead-gen/index.js +5 -5
  45. package/dist/features/monitoring/index.css +149 -149
  46. package/dist/features/monitoring/index.d.ts +33 -3
  47. package/dist/features/monitoring/index.js +6 -6
  48. package/dist/features/monitoring/requests/index.js +4 -4
  49. package/dist/features/operations/index.js +9 -10
  50. package/dist/features/settings/index.d.ts +26 -0
  51. package/dist/features/settings/index.js +6 -6
  52. package/dist/hooks/access/index.css +149 -149
  53. package/dist/hooks/access/index.js +3 -3
  54. package/dist/hooks/delivery/index.d.ts +26 -0
  55. package/dist/hooks/index.css +149 -149
  56. package/dist/hooks/index.d.ts +296 -65
  57. package/dist/hooks/index.js +3 -3
  58. package/dist/hooks/published.css +149 -149
  59. package/dist/hooks/published.d.ts +296 -65
  60. package/dist/hooks/published.js +3 -3
  61. package/dist/initialization/index.d.ts +26 -0
  62. package/dist/knowledge/index.css +149 -149
  63. package/dist/knowledge/index.js +7 -7
  64. package/dist/layout/index.css +149 -149
  65. package/dist/layout/index.js +6 -6
  66. package/dist/profile/index.d.ts +26 -0
  67. package/dist/provider/index.d.ts +26 -0
  68. package/dist/provider/index.js +3 -3
  69. package/dist/provider/published.css +149 -149
  70. package/dist/provider/published.d.ts +26 -0
  71. package/dist/provider/published.js +3 -3
  72. package/dist/supabase/index.d.ts +50 -0
  73. package/dist/theme/index.js +3 -3
  74. package/dist/theme/presets/index.js +1 -1
  75. package/dist/types/index.d.ts +59 -3
  76. package/package.json +5 -5
  77. package/dist/chunk-ZPTEGGKU.js +0 -631
  78. /package/dist/{chunk-XQBURFKM.js → chunk-RBGVNPA6.js} +0 -0
@@ -1251,6 +1251,124 @@ declare const OrganizationModelSchema: z.ZodObject<{
1251
1251
  type OrganizationModel = z.infer<typeof OrganizationModelSchema>;
1252
1252
  type OrganizationModelResourceKind = z.infer<typeof ResourceKindSchema>;
1253
1253
 
1254
+ declare const ContentItemResponseSchema: z.ZodObject<{
1255
+ id: z.ZodString;
1256
+ organizationId: z.ZodString;
1257
+ title: z.ZodString;
1258
+ body: z.ZodNullable<z.ZodString>;
1259
+ payload: z.ZodUnknown;
1260
+ status: z.ZodString;
1261
+ pillar: z.ZodNullable<z.ZodString>;
1262
+ pipelineId: z.ZodNullable<z.ZodString>;
1263
+ clientId: z.ZodNullable<z.ZodString>;
1264
+ sourceAssetId: z.ZodNullable<z.ZodString>;
1265
+ processingState: z.ZodRecord<z.ZodString, z.ZodObject<{
1266
+ status: z.ZodEnum<{
1267
+ error: "error";
1268
+ success: "success";
1269
+ running: "running";
1270
+ no_result: "no_result";
1271
+ skipped: "skipped";
1272
+ }>;
1273
+ attemptId: z.ZodString;
1274
+ executionId: z.ZodNullable<z.ZodString>;
1275
+ attemptedAt: z.ZodString;
1276
+ data: z.ZodOptional<z.ZodUnknown>;
1277
+ }, z.core.$loose>>;
1278
+ reviewedAt: z.ZodNullable<z.ZodString>;
1279
+ reviewedBy: z.ZodNullable<z.ZodString>;
1280
+ reviewerFeedback: z.ZodNullable<z.ZodString>;
1281
+ rejectReason: z.ZodNullable<z.ZodString>;
1282
+ createdBy: z.ZodNullable<z.ZodString>;
1283
+ updatedBy: z.ZodNullable<z.ZodString>;
1284
+ createdAt: z.ZodString;
1285
+ updatedAt: z.ZodString;
1286
+ }, z.core.$strip>;
1287
+ type ContentItemResponse = z.infer<typeof ContentItemResponseSchema>;
1288
+
1289
+ /**
1290
+ * `deriveContentBoard` -- a pure function of `(items, pipeline, now)`. No React, no
1291
+ * hooks, no fetching. `content_items` has NO `step_key` column (only
1292
+ * `content_item_attempts` does), so an item's current step is derived from
1293
+ * `processingState`, whose declared shape is
1294
+ * `Record<stepKey, { status: 'running' | 'success' | 'no_result' | 'skipped' | 'error';
1295
+ * attemptId: string; executionId: string | null; attemptedAt: string; data?: unknown }>`.
1296
+ * `'running'` (added 2026-08-14, the step-state model) is the only in-flight value;
1297
+ * every other member is terminal.
1298
+ *
1299
+ * Placement rule (implemented exactly as follows):
1300
+ *
1301
+ * 1. Sort the pipeline's steps ascending by `order`. Ties break by `key` so the result
1302
+ * is deterministic.
1303
+ * 2. An item's current step is the first step in that order whose `processingState`
1304
+ * entry is missing, or present with a status other than `'success'`. Rationale:
1305
+ * `processingState` records what has run; a step recorded `'success'` is behind the
1306
+ * item -- `'running'` falls out of this rule unchanged: a step mid-flight is not
1307
+ * `'success'`, so it holds the item at that column exactly like `'error'` or
1308
+ * `'skipped'` already do.
1309
+ * 3. If every declared step has a `'success'` entry, `stepKey` is `null` and the card
1310
+ * goes in `done`.
1311
+ * 4. If `processingState` is empty (`{}`), the item sits at the first step -- nothing
1312
+ * has run yet.
1313
+ * 5. A card goes in `unplaced` only when `processingState` is non-empty AND none of its
1314
+ * keys appear in the catalog. This is the honest bucket for an item produced against
1315
+ * a step catalog that has since changed; unplaced items are never silently dropped
1316
+ * into column 1.
1317
+ */
1318
+ interface ContentBoardCard {
1319
+ item: ContentItemResponse;
1320
+ /** Step key this item currently sits at. `null` when every declared step has succeeded. */
1321
+ stepKey: string | null;
1322
+ /** Milliseconds since `item.updatedAt`, measured against the `now` argument. */
1323
+ ageMs: number;
1324
+ /** True when this card is waiting on a person: its step's reviewMode is not 'none' and `reviewedAt` is null. */
1325
+ awaitingReview: boolean;
1326
+ }
1327
+ interface ContentBoardGate {
1328
+ /** The review mode of the step this gate follows. Never 'none' -- a 'none' step has no gate. */
1329
+ reviewMode: Exclude<ContentPipelineStepReviewMode, 'none'>;
1330
+ /** How many cards in the preceding column are awaiting review. */
1331
+ waitingCount: number;
1332
+ }
1333
+ interface ContentBoardColumn {
1334
+ step: ContentPipelineStepEntry;
1335
+ cards: ContentBoardCard[];
1336
+ /** Present when this step's reviewMode is 'live' or 'queued'. Absent on a 'none' step. */
1337
+ gate?: ContentBoardGate;
1338
+ }
1339
+ interface ContentBoard {
1340
+ columns: ContentBoardColumn[];
1341
+ /** Cards whose every declared step succeeded. */
1342
+ done: ContentBoardCard[];
1343
+ /** Cards whose processingState names only step keys the catalog does not declare. */
1344
+ unplaced: ContentBoardCard[];
1345
+ /** True when the pipeline declares 0 or 1 steps -- the consumer renders pick-then-review, not columns. */
1346
+ isCollapsed: boolean;
1347
+ }
1348
+ declare function deriveContentBoard(items: ContentItemResponse[], pipeline: ContentPipelineTemplate, now: number): ContentBoard;
1349
+
1350
+ /**
1351
+ * `getContentItemIdentity` -- a pure function that names a content item for display when
1352
+ * `title` cannot be trusted to do it. The tenant `nirvana-marketing`'s drafts have no
1353
+ * titles at all, so a title-first surface renders an empty or meaningless column. A
1354
+ * post's identity is its opening line.
1355
+ *
1356
+ * Resolution order, first non-empty wins:
1357
+ * 1. First non-blank line of `item.body`.
1358
+ * 2. The first string-valued field of `item.payload`, taken in `payloadFields`
1359
+ * declaration order when that argument is supplied, otherwise `Object.keys` order.
1360
+ * Only a non-blank string value counts.
1361
+ * 3. `item.title`, when non-blank.
1362
+ * 4. The literal `'Untitled'`.
1363
+ *
1364
+ * The resolved candidate is then normalized: runs of whitespace collapse to one space,
1365
+ * the result is trimmed, and anything longer than `maxLength` is truncated at the last
1366
+ * word boundary at or before `maxLength` with a trailing `'…'` -- never mid-word.
1367
+ * The source complaint this fixes is titles clipped mid-word
1368
+ * (`MOCK Pipeline Walk S…`).
1369
+ */
1370
+ declare function getContentItemIdentity(item: Pick<ContentItemResponse, 'title' | 'body' | 'payload'>, payloadFields?: ContentPayloadFieldDeclaration[], maxLength?: number): string;
1371
+
1254
1372
  type SystemSidebarComponent = ComponentType;
1255
1373
  type SystemIconComponent = ComponentType<{
1256
1374
  size?: number;
@@ -1293,6 +1411,12 @@ interface ContentItemsPageSlots {
1293
1411
  /** Optional content rendered after the page title. Default: nothing rendered. */
1294
1412
  headerActions?: ReactNode;
1295
1413
  }
1414
+ /**
1415
+ * Flat, cross-pipeline items report -- kept as a reachable filtered view rather than
1416
+ * primary navigation (usability review Proposal, Decision 3; finding 1). The sidebar's
1417
+ * review-queue nav entry links here with `?review=pending`; `MyReviewQueuePanel`'s
1418
+ * "See all" does the same.
1419
+ */
1296
1420
  declare function ContentItemsPage({ headerActions }?: ContentItemsPageSlots): react_jsx_runtime.JSX.Element;
1297
1421
 
1298
1422
  interface ContentItemReviewPageSlots {
@@ -1314,44 +1438,18 @@ interface ContentPipelinesPageSlots {
1314
1438
  */
1315
1439
  declare function ContentPipelinesPage({ headerActions }?: ContentPipelinesPageSlots): react_jsx_runtime.JSX.Element;
1316
1440
 
1317
- interface ContentProduceSlotProps {
1318
- pipeline: ContentPipelineTemplate;
1319
- }
1320
-
1321
1441
  interface ContentPipelineWorkspacePageSlots {
1322
1442
  /** Optional content rendered after the page title. Default: nothing rendered. */
1323
1443
  headerActions?: ReactNode;
1324
- /** Overrides the `produce` tab's default content. See `ProduceTabProps.render`. */
1325
- renderProduce?: (props: ContentProduceSlotProps) => ReactNode;
1326
1444
  }
1327
1445
  /**
1328
1446
  * Pipeline workspace -- tabbed via `?tab=`, matching how `LeadGenListDetailPage`
1329
- * (`../../../lead-gen/pages/list-detail/ListDetailPage.tsx`) already does it: `overview`
1330
- * / `sources` / `produce` / `runs`.
1447
+ * (`../../../lead-gen/pages/list-detail/ListDetailPage.tsx`) already does it.
1331
1448
  */
1332
- declare function ContentPipelineWorkspacePage({ pipelineId, headerActions, renderProduce }: {
1449
+ declare function ContentPipelineWorkspacePage({ pipelineId, headerActions }: {
1333
1450
  pipelineId: string;
1334
1451
  } & ContentPipelineWorkspacePageSlots): react_jsx_runtime.JSX.Element;
1335
1452
 
1336
- interface ContentSettingsPageSlots {
1337
- /** Optional content rendered after the page title. Default: nothing rendered. */
1338
- headerActions?: ReactNode;
1339
- }
1340
- /**
1341
- * Rules and artifacts -- browses `content:`-prefixed artifacts for a pipeline: version
1342
- * history and activation state, read-only. Mirrors `CrmSettingsPage`, but actually
1343
- * mounted (`CrmSettingsPage` exists in the package with no Command Center route).
1344
- *
1345
- * Only `GET /acquisition/artifacts` and `POST /acquisition/artifacts` exist -- there is
1346
- * no route to update, deactivate, or re-version an artifact. `isActive` and `version`
1347
- * render as read-only state; this page does not add an activate/deactivate control
1348
- * wired to nothing (binding constraint c). It also does not add a create form: the API
1349
- * supports create, but nothing in this wave's scope specifies what a rules document's
1350
- * `content` shape should be per artifact kind, so authoring stays out of this page for
1351
- * now rather than guessing a schema.
1352
- */
1353
- declare function ContentSettingsPage({ headerActions }?: ContentSettingsPageSlots): react_jsx_runtime.JSX.Element;
1354
-
1355
1453
  interface ContentDistributionsPageSlots {
1356
1454
  /** Optional content rendered after the page title. Default: nothing rendered. */
1357
1455
  headerActions?: ReactNode;
@@ -1403,10 +1501,8 @@ interface ContentPageOverrides {
1403
1501
  itemReview?: ContentItemReviewPageSlots;
1404
1502
  /** Slot props injected into `ContentPipelinesPage`. */
1405
1503
  pipelines?: ContentPipelinesPageSlots;
1406
- /** Slot props (including the `produce` tab's `renderProduce` render prop) injected into `ContentPipelineWorkspacePage`. */
1504
+ /** Slot props injected into `ContentPipelineWorkspacePage`. */
1407
1505
  pipelineWorkspace?: ContentPipelineWorkspacePageSlots;
1408
- /** Slot props injected into `ContentSettingsPage`. */
1409
- settings?: ContentSettingsPageSlots;
1410
1506
  }
1411
1507
  /**
1412
1508
  * Extended `SystemModule` for the content feature that carries optional page overrides
@@ -1424,11 +1520,11 @@ interface ContentSystemModule extends SystemModule {
1424
1520
  * plain string matching the System path rather than an import from `@repo/core/content`
1425
1521
  * or the OM System declaration -- this package stays data-free by design (D6).
1426
1522
  *
1427
- * `sidebar` wires in `ContentSidebar` (nav items + `MyReviewQueue`). Page overrides and
1428
- * OM-derived config are consumed by the caller via `useContentConfig` and the individual
1429
- * page components, matching the `LeadGenSystemModule` pattern. `pages` is left unset
1430
- * here -- every page above renders its byte-identical default until a consumer supplies
1431
- * an override, most notably `pipelineWorkspace.renderProduce` for the `produce` tab slot.
1523
+ * `sidebar` wires in `ContentSidebar` (the two-entry nav). Page overrides and OM-derived
1524
+ * config are consumed by the caller via `useContentConfig` and the individual page
1525
+ * components, matching the `LeadGenSystemModule` pattern. `pages` is left unset here --
1526
+ * every page above renders its byte-identical default until a consumer supplies an
1527
+ * override.
1432
1528
  */
1433
1529
  declare const contentManifest: ContentSystemModule;
1434
1530
 
@@ -1560,6 +1656,27 @@ interface ContentReviewAction {
1560
1656
  feedbackPlaceholder?: string;
1561
1657
  /** Feedback below one non-whitespace character disables the modal's submit button. */
1562
1658
  feedbackRequired?: boolean;
1659
+ /**
1660
+ * Grades this action by consequence (proposal "grade actions by consequence" /
1661
+ * finding 10): publishing is irreversible and outward-facing -- the video pipeline's
1662
+ * Gate C says "never automate this one away" -- while approving a draft costs nothing
1663
+ * to undo. Defaults to `'standard'`, which reproduces today's rendering exactly
1664
+ * (`variant="light"`, no forced confirmation). `'irreversible'` renders the button
1665
+ * filled in `var(--color-warning)` (or `var(--color-error)` when `tone: 'danger'` is
1666
+ * also set) instead of light, and always gates behind a confirmation or feedback modal
1667
+ * carrying a standing warning line, even if the action itself set neither
1668
+ * `requiresConfirmation` nor `requiresFeedback` -- so a caller cannot accidentally ship
1669
+ * a one-click irreversible action.
1670
+ */
1671
+ consequence?: 'standard' | 'irreversible';
1672
+ /**
1673
+ * Disables this action's button -- e.g. the item has no open review gate to clear.
1674
+ * Renders inert rather than firing a call that the server rejects. Pair with
1675
+ * `disabledReason` so the reviewer sees why, not just a greyed-out button.
1676
+ */
1677
+ disabled?: boolean;
1678
+ /** Shown in a Tooltip over the button while `disabled` is true. */
1679
+ disabledReason?: string;
1563
1680
  }
1564
1681
  interface ReviewActionBarProps {
1565
1682
  /**
@@ -1595,8 +1712,12 @@ interface ContentFidelityCheck {
1595
1712
  note?: string;
1596
1713
  }
1597
1714
  interface ContentReviewCardProps {
1598
- /** Display handle -- `content_items.title` in the eventual schema. */
1599
- title: string;
1715
+ /**
1716
+ * Display handle -- `content_items.title` in the eventual schema. Omit it where the
1717
+ * surrounding page already carries the same identity as its heading; repeating it
1718
+ * inside the card puts the same sentence on screen twice.
1719
+ */
1720
+ title?: string;
1600
1721
  /** Presentational only; the caller decides what to render for each mode. */
1601
1722
  reviewMode: ReviewMode;
1602
1723
  /** The human's canonical, editable text. */
@@ -1646,6 +1767,36 @@ interface ContentReviewCardProps {
1646
1767
  */
1647
1768
  declare function ContentReviewCard({ title, body, onBodyChange, originalBody, onReset, payload, payloadFields, fidelity, checkFirst, hookOptions, closeOptions, onMoreHooks, onMoreCloses, alternatesRunning, alternatesElapsed, processingSteps, actions, onAction, actionsPending }: ContentReviewCardProps): react_jsx_runtime.JSX.Element;
1648
1769
 
1770
+ /** A single tenant-facing noun with singular and plural forms, e.g. `{ singular: 'Post', plural: 'Posts' }`. */
1771
+ interface ContentNoun {
1772
+ singular: string;
1773
+ plural: string;
1774
+ }
1775
+ /**
1776
+ * The shell's vocabulary for the content feature: what a tenant calls its content
1777
+ * items, where they get distributed, and the fixed labels around the pipeline and
1778
+ * board chrome. Every field defaults to the generic table-name-shaped label so a
1779
+ * tenant that has not declared a `vocabulary` block still gets a coherent shell.
1780
+ */
1781
+ interface ContentVocabulary {
1782
+ item: ContentNoun;
1783
+ distribution: ContentNoun;
1784
+ pipeline: ContentNoun;
1785
+ board: string;
1786
+ reviewQueue: string;
1787
+ }
1788
+ declare const DEFAULT_CONTENT_VOCABULARY: ContentVocabulary;
1789
+ /**
1790
+ * Reads the content System's declared vocabulary off `system.config.vocabulary` --
1791
+ * the same optional, tenant-authored slice of `config` that `getDefaultPipelineId`
1792
+ * already reads for `defaultPipelineId` in `useContentConfig.ts` (no schema change:
1793
+ * `config` is `Record<string, JsonValue>` and this is a second key on it). Merges over
1794
+ * `DEFAULT_CONTENT_VOCABULARY` field by field, so a partial declaration only overrides
1795
+ * what it actually names. `undefined` model, a missing `vocabulary` block, or any
1796
+ * wrongly-shaped value all resolve to the defaults -- this never throws.
1797
+ */
1798
+ declare function resolveContentVocabulary(model: OrganizationModel | undefined): ContentVocabulary;
1799
+
1649
1800
  interface ContentStepResourceBinding {
1650
1801
  /** The OM Resource id that runs this step. */
1651
1802
  resourceId: string;
@@ -1704,6 +1855,13 @@ interface ContentConfig {
1704
1855
  * configured" rather than throwing.
1705
1856
  */
1706
1857
  resolveStepResource: (step: Pick<ContentPipelineStepEntry, 'actionId'>) => ContentStepResourceBinding | undefined;
1858
+ /**
1859
+ * The tenant's declared vocabulary for the content shell -- item / distribution /
1860
+ * pipeline nouns and the fixed board labels. See {@link resolveContentVocabulary}.
1861
+ * Defaults to {@link DEFAULT_CONTENT_VOCABULARY} when the model or its `vocabulary`
1862
+ * declaration is absent, so consuming shell chrome never renders a blank label.
1863
+ */
1864
+ vocabulary: ContentVocabulary;
1707
1865
  }
1708
1866
  /**
1709
1867
  * `useContentConfig` is `useLeadGenConfig`'s twin for the content System: a pure
@@ -1722,14 +1880,6 @@ interface ContentConfig {
1722
1880
  */
1723
1881
  declare function useContentConfig(): ContentConfig;
1724
1882
 
1725
- interface ContentSidebarProps {
1726
- /** Replace the default `ContentSidebarMiddle` with custom middle content. Leave unset for the default layout. */
1727
- children?: ReactNode;
1728
- }
1729
- declare const ContentSidebar: ({ children }?: ContentSidebarProps) => react_jsx_runtime.JSX.Element;
1730
-
1731
- declare const ContentSidebarTop: () => react_jsx_runtime.JSX.Element;
1732
-
1733
1883
  /**
1734
1884
  * Shared nav-item shape used by feature sidebar middle components.
1735
1885
  *
@@ -1762,12 +1912,63 @@ interface NavItem {
1762
1912
  exact: boolean;
1763
1913
  }
1764
1914
 
1915
+ interface ContentSidebarProps {
1916
+ /**
1917
+ * Tenant-authored authoring surfaces for the `Create` section, forwarded to
1918
+ * `ContentSidebarMiddle`. Ignored when `children` is supplied, since that replaces the
1919
+ * middle outright. This is the one-line path for a tenant adding its own creator:
1920
+ *
1921
+ * ```tsx
1922
+ * const sidebar = () => <ContentSidebar createItems={[{ label: 'Draft a Post', to: '/content/write', icon: IconPencil, exact: false }]} />
1923
+ * ```
1924
+ */
1925
+ createItems?: NavItem[];
1926
+ /** Replace the default `ContentSidebarMiddle` with custom middle content. Leave unset for the default layout. */
1927
+ children?: ReactNode;
1928
+ }
1929
+ declare const ContentSidebar: ({ createItems, children }?: ContentSidebarProps) => react_jsx_runtime.JSX.Element;
1930
+
1931
+ /**
1932
+ * Static two-entry default, built from {@link DEFAULT_CONTENT_VOCABULARY}. Exists for
1933
+ * consumers that spread it at module load time (see `extend-content.md`), where a
1934
+ * tenant's declared vocabulary isn't available. `ContentSidebarMiddle` itself renders
1935
+ * the live, vocabulary-aware version instead of this constant.
1936
+ */
1765
1937
  declare const CONTENT_ITEMS: NavItem[];
1766
1938
  interface ContentSidebarMiddleProps {
1767
- /** Override the default nav items. Defaults to {@link CONTENT_ITEMS}. */
1939
+ /**
1940
+ * Tenant-authored authoring surfaces, rendered under the `Create` section above the
1941
+ * pipeline nav. Empty or omitted -> the section renders its "nothing declared" hint
1942
+ * instead of nav entries; the section header itself is always present.
1943
+ *
1944
+ * This is the seam for a tenant's own content creator -- a LinkedIn drafting screen,
1945
+ * a brief builder, whatever the tenant authors -- without it having to restate the
1946
+ * pipeline entries. Prefer this over {@link ContentSidebarMiddleProps.items}, which
1947
+ * replaces the pipeline list wholesale and stops tracking the tenant's vocabulary.
1948
+ */
1949
+ createItems?: NavItem[];
1950
+ /** Override the pipeline nav items. Defaults to the two-entry nav built from the tenant's declared vocabulary. */
1768
1951
  items?: NavItem[];
1769
1952
  }
1770
- declare const ContentSidebarMiddle: ({ items }?: ContentSidebarMiddleProps) => react_jsx_runtime.JSX.Element;
1953
+ /**
1954
+ * The content subshell nav, in two labeled sections.
1955
+ *
1956
+ * `Create` sits on top and is where content gets made; the pipeline section below is
1957
+ * where it gets reviewed and tracked. The split exists because authoring is
1958
+ * tenant-specific by nature (every tenant writes a different kind of thing, through a
1959
+ * different screen) while the pipeline underneath is the same shared system for all of
1960
+ * them.
1961
+ *
1962
+ * **Both section labels are fixed platform vocabulary, not tenant-declared.** The nav
1963
+ * entries inside them still are — a tenant that renames its pipelines to "Campaigns"
1964
+ * gets `Content Pipeline > Campaigns`. The sections name the two halves of the System
1965
+ * itself, which every tenant has; only what they contain varies.
1966
+ *
1967
+ * There is deliberately no section header above `Create`: the subshell is already
1968
+ * reached through the `Content` nav entry, so a third `Content` header only repeated
1969
+ * what the breadcrumb and the left rail both already say.
1970
+ */
1971
+ declare const ContentSidebarMiddle: ({ createItems, items }?: ContentSidebarMiddleProps) => react_jsx_runtime.JSX.Element;
1771
1972
 
1772
1973
  interface MyReviewQueuePanelProps {
1773
1974
  onItemClick: (itemId: string) => void;
@@ -1775,14 +1976,20 @@ interface MyReviewQueuePanelProps {
1775
1976
  showSectionLabel?: boolean;
1776
1977
  }
1777
1978
  /**
1778
- * `MyReviewQueue` -- mirrors `MyTasksPanel` for the content System's sidebar workbench.
1979
+ * `MyReviewQueue` -- mirrors `MyTasksPanel` for the content System's sidebar workbench,
1980
+ * and is the review queue's second way in (usability review Proposal, Decision 3): a
1981
+ * cross-pipeline "what needs review" view rather than a panel beside a table browser.
1779
1982
  *
1780
1983
  * The `/content/items` route accepts no "pending review" filter (only `reviewedBy`, not
1781
1984
  * a reviewed/unreviewed flag), so this fetches a page of items and filters to
1782
1985
  * `reviewedAt === null` client-side. A future backend addition could push this
1783
1986
  * server-side; documenting the gap here rather than silently over-claiming precision.
1987
+ *
1988
+ * Rows are ordered oldest-first by `updatedAt` -- finding 6 is that nothing on the
1989
+ * screen ages, and the operational question is always what has been sitting the
1990
+ * longest.
1784
1991
  */
1785
1992
  declare function MyReviewQueuePanel({ onItemClick, onSeeAll, showSectionLabel }: MyReviewQueuePanelProps): react_jsx_runtime.JSX.Element;
1786
1993
 
1787
- export { AlternatesPanel, CONTENT_ITEMS, ContentDistributionDetailPage, ContentDistributionsPage, ContentItemReviewPage, ContentItemsPage, ContentOverviewPage, ContentPipelineWorkspacePage, ContentPipelinesPage, ContentReviewCard, ContentSettingsPage, ContentSidebar, ContentSidebarMiddle, ContentSidebarTop, MyReviewQueuePanel, PayloadBody, ProcessingStateStrip, ReviewActionBar, contentManifest, firstLine, formatElapsed, lastLine, resolveContentStepResource, swapFirstLine, swapLastLine, useContentConfig };
1788
- export type { AlternatesPanelProps, ContentAlternateOption, ContentConfig, ContentDistributionDetailPageSlots, ContentDistributionsPageSlots, ContentFidelityCheck, ContentItemReviewPageSlots, ContentItemsPageSlots, ContentOverviewPageSlots, ContentPayloadField, ContentPipelineWorkspacePageSlots, ContentPipelinesPageSlots, ContentProcessingStatus, ContentProcessingStep, ContentProduceSlotProps, ContentReviewAction, ContentReviewCardProps, ContentSettingsPageSlots, ContentSidebarMiddleProps, ContentSidebarProps, ContentStepResourceBinding, MyReviewQueuePanelProps, PayloadBodyProps, ProcessingStateStripProps, ReviewActionBarProps, ReviewMode };
1994
+ export { AlternatesPanel, CONTENT_ITEMS, ContentDistributionDetailPage, ContentDistributionsPage, ContentItemReviewPage, ContentItemsPage, ContentOverviewPage, ContentPipelineWorkspacePage, ContentPipelinesPage, ContentReviewCard, ContentSidebar, ContentSidebarMiddle, DEFAULT_CONTENT_VOCABULARY, MyReviewQueuePanel, PayloadBody, ProcessingStateStrip, ReviewActionBar, contentManifest, deriveContentBoard, firstLine, formatElapsed, getContentItemIdentity, lastLine, resolveContentStepResource, resolveContentVocabulary, swapFirstLine, swapLastLine, useContentConfig };
1995
+ export type { AlternatesPanelProps, ContentAlternateOption, ContentBoard, ContentBoardCard, ContentBoardColumn, ContentBoardGate, ContentConfig, ContentDistributionDetailPageSlots, ContentDistributionsPageSlots, ContentFidelityCheck, ContentItemReviewPageSlots, ContentItemsPageSlots, ContentNoun, ContentOverviewPageSlots, ContentPayloadField, ContentPipelineWorkspacePageSlots, ContentPipelinesPageSlots, ContentProcessingStatus, ContentProcessingStep, ContentReviewAction, ContentReviewCardProps, ContentSidebarMiddleProps, ContentSidebarProps, ContentStepResourceBinding, ContentVocabulary, MyReviewQueuePanelProps, PayloadBodyProps, ProcessingStateStripProps, ReviewActionBarProps, ReviewMode };