@camunda/design-system 0.36.0 → 0.38.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 (138) hide show
  1. package/dist/carbon-compat/modal.d.ts +9 -1
  2. package/dist/carbon-compat/modal.d.ts.map +1 -1
  3. package/dist/carbon-compat/modal.js.map +1 -1
  4. package/dist/src/components/ui/app-header.d.ts +23 -3
  5. package/dist/src/components/ui/app-header.d.ts.map +1 -1
  6. package/dist/src/components/ui/app-header.js +12 -3
  7. package/dist/src/components/ui/app-header.js.map +1 -1
  8. package/dist/src/components/ui/app-sidebar.d.ts +44 -12
  9. package/dist/src/components/ui/app-sidebar.d.ts.map +1 -1
  10. package/dist/src/components/ui/app-sidebar.js +42 -15
  11. package/dist/src/components/ui/app-sidebar.js.map +1 -1
  12. package/dist/src/components/ui/avatar.d.ts +7 -0
  13. package/dist/src/components/ui/avatar.d.ts.map +1 -1
  14. package/dist/src/components/ui/avatar.js +1 -1
  15. package/dist/src/components/ui/avatar.js.map +1 -1
  16. package/dist/src/components/ui/bar-chart.d.ts.map +1 -1
  17. package/dist/src/components/ui/bar-chart.js +29 -4
  18. package/dist/src/components/ui/bar-chart.js.map +1 -1
  19. package/dist/src/components/ui/chart.d.ts +14 -3
  20. package/dist/src/components/ui/chart.d.ts.map +1 -1
  21. package/dist/src/components/ui/chart.js +35 -8
  22. package/dist/src/components/ui/chart.js.map +1 -1
  23. package/dist/src/components/ui/data-table.d.ts +6 -0
  24. package/dist/src/components/ui/data-table.d.ts.map +1 -1
  25. package/dist/src/components/ui/data-table.js +6 -5
  26. package/dist/src/components/ui/data-table.js.map +1 -1
  27. package/dist/src/components/ui/line-chart.d.ts.map +1 -1
  28. package/dist/src/components/ui/line-chart.js +12 -2
  29. package/dist/src/components/ui/line-chart.js.map +1 -1
  30. package/dist/src/components/ui/nav-breadcrumb.d.ts +120 -2
  31. package/dist/src/components/ui/nav-breadcrumb.d.ts.map +1 -1
  32. package/dist/src/components/ui/nav-breadcrumb.js +54 -7
  33. package/dist/src/components/ui/nav-breadcrumb.js.map +1 -1
  34. package/dist/src/components/ui/nav-data.d.ts +46 -0
  35. package/dist/src/components/ui/nav-data.d.ts.map +1 -0
  36. package/dist/src/components/ui/nav-data.js +66 -0
  37. package/dist/src/components/ui/nav-data.js.map +1 -0
  38. package/dist/src/components/ui/nav-icon.assignability.d.ts +30 -0
  39. package/dist/src/components/ui/nav-icon.assignability.d.ts.map +1 -0
  40. package/dist/src/components/ui/nav-icon.assignability.js +28 -0
  41. package/dist/src/components/ui/nav-icon.assignability.js.map +1 -0
  42. package/dist/src/components/ui/nav-icon.d.ts +33 -0
  43. package/dist/src/components/ui/nav-icon.d.ts.map +1 -0
  44. package/dist/src/components/ui/nav-icon.js +20 -0
  45. package/dist/src/components/ui/nav-icon.js.map +1 -0
  46. package/dist/src/components/ui/nav-tools.assignability.d.ts +10 -0
  47. package/dist/src/components/ui/nav-tools.assignability.d.ts.map +1 -0
  48. package/dist/src/components/ui/nav-tools.assignability.js +35 -0
  49. package/dist/src/components/ui/nav-tools.assignability.js.map +1 -0
  50. package/dist/src/components/ui/nav-tools.d.ts +95 -0
  51. package/dist/src/components/ui/nav-tools.d.ts.map +1 -0
  52. package/dist/src/components/ui/nav-tools.js +130 -0
  53. package/dist/src/components/ui/nav-tools.js.map +1 -0
  54. package/dist/src/components/ui/notifications.d.ts +72 -0
  55. package/dist/src/components/ui/notifications.d.ts.map +1 -0
  56. package/dist/src/components/ui/notifications.js +53 -0
  57. package/dist/src/components/ui/notifications.js.map +1 -0
  58. package/dist/src/components/ui/pie-chart.d.ts +24 -0
  59. package/dist/src/components/ui/pie-chart.d.ts.map +1 -0
  60. package/dist/src/components/ui/pie-chart.js +69 -0
  61. package/dist/src/components/ui/pie-chart.js.map +1 -0
  62. package/dist/src/components/ui/scorecard.d.ts.map +1 -1
  63. package/dist/src/components/ui/scorecard.js +9 -3
  64. package/dist/src/components/ui/scorecard.js.map +1 -1
  65. package/dist/src/components/ui/sheet.d.ts +1 -1
  66. package/dist/src/components/ui/sparkline.d.ts.map +1 -1
  67. package/dist/src/components/ui/sparkline.js +11 -1
  68. package/dist/src/components/ui/sparkline.js.map +1 -1
  69. package/dist/src/examples/agent-control-plane-processes/DashboardPage.d.ts +3 -0
  70. package/dist/src/examples/agent-control-plane-processes/DashboardPage.d.ts.map +1 -0
  71. package/dist/src/examples/agent-control-plane-processes/DashboardPage.js +114 -0
  72. package/dist/src/examples/agent-control-plane-processes/DashboardPage.js.map +1 -0
  73. package/dist/src/examples/agent-control-plane-processes/derive.d.ts +65 -0
  74. package/dist/src/examples/agent-control-plane-processes/derive.d.ts.map +1 -0
  75. package/dist/src/examples/agent-control-plane-processes/derive.js +234 -0
  76. package/dist/src/examples/agent-control-plane-processes/derive.js.map +1 -0
  77. package/dist/src/examples/agent-control-plane-processes/mock-data.d.ts +37 -0
  78. package/dist/src/examples/agent-control-plane-processes/mock-data.d.ts.map +1 -0
  79. package/dist/src/examples/agent-control-plane-processes/mock-data.js +206 -0
  80. package/dist/src/examples/agent-control-plane-processes/mock-data.js.map +1 -0
  81. package/dist/src/examples/agent-control-plane-processes/summary-mock-data.d.ts +37 -0
  82. package/dist/src/examples/agent-control-plane-processes/summary-mock-data.d.ts.map +1 -0
  83. package/dist/src/examples/agent-control-plane-processes/summary-mock-data.js +53 -0
  84. package/dist/src/examples/agent-control-plane-processes/summary-mock-data.js.map +1 -0
  85. package/dist/src/examples/shared/DashboardSection.d.ts +9 -0
  86. package/dist/src/examples/shared/DashboardSection.d.ts.map +1 -0
  87. package/dist/src/examples/shared/DashboardSection.js +5 -0
  88. package/dist/src/examples/shared/DashboardSection.js.map +1 -0
  89. package/dist/src/examples/shared/DateRangePopover.d.ts +3 -0
  90. package/dist/src/examples/shared/DateRangePopover.d.ts.map +1 -0
  91. package/dist/src/examples/shared/DateRangePopover.js +35 -0
  92. package/dist/src/examples/shared/DateRangePopover.js.map +1 -0
  93. package/dist/src/examples/shared/agent-control-plane-nav.d.ts +4 -0
  94. package/dist/src/examples/shared/agent-control-plane-nav.d.ts.map +1 -0
  95. package/dist/src/examples/shared/agent-control-plane-nav.js +25 -0
  96. package/dist/src/examples/shared/agent-control-plane-nav.js.map +1 -0
  97. package/dist/src/examples/shared/date-range-utils.d.ts +10 -0
  98. package/dist/src/examples/shared/date-range-utils.d.ts.map +1 -0
  99. package/dist/src/examples/shared/date-range-utils.js +75 -0
  100. package/dist/src/examples/shared/date-range-utils.js.map +1 -0
  101. package/dist/src/icons/camunda-app-icons.d.ts +19 -0
  102. package/dist/src/icons/camunda-app-icons.d.ts.map +1 -0
  103. package/dist/src/icons/camunda-app-icons.js +26 -0
  104. package/dist/src/icons/camunda-app-icons.js.map +1 -0
  105. package/dist/src/icons/index.d.ts +1 -0
  106. package/dist/src/icons/index.d.ts.map +1 -1
  107. package/dist/src/icons/index.js +1 -0
  108. package/dist/src/icons/index.js.map +1 -1
  109. package/dist/src/index.d.ts +8 -3
  110. package/dist/src/index.d.ts.map +1 -1
  111. package/dist/src/index.js +5 -2
  112. package/dist/src/index.js.map +1 -1
  113. package/dist/styles.css +70 -5
  114. package/package.json +1 -1
  115. package/dist/src/examples/cost-dashboard/CostBreakdownChart.d.ts +0 -2
  116. package/dist/src/examples/cost-dashboard/CostBreakdownChart.d.ts.map +0 -1
  117. package/dist/src/examples/cost-dashboard/CostBreakdownChart.js +0 -21
  118. package/dist/src/examples/cost-dashboard/CostBreakdownChart.js.map +0 -1
  119. package/dist/src/examples/cost-dashboard/CostDashboardPage.d.ts +0 -2
  120. package/dist/src/examples/cost-dashboard/CostDashboardPage.d.ts.map +0 -1
  121. package/dist/src/examples/cost-dashboard/CostDashboardPage.js +0 -56
  122. package/dist/src/examples/cost-dashboard/CostDashboardPage.js.map +0 -1
  123. package/dist/src/examples/cost-dashboard/TrendChart.d.ts +0 -2
  124. package/dist/src/examples/cost-dashboard/TrendChart.d.ts.map +0 -1
  125. package/dist/src/examples/cost-dashboard/TrendChart.js +0 -19
  126. package/dist/src/examples/cost-dashboard/TrendChart.js.map +0 -1
  127. package/dist/src/examples/cost-dashboard/mock-data.d.ts +0 -34
  128. package/dist/src/examples/cost-dashboard/mock-data.d.ts.map +0 -1
  129. package/dist/src/examples/cost-dashboard/mock-data.js +0 -120
  130. package/dist/src/examples/cost-dashboard/mock-data.js.map +0 -1
  131. package/dist/src/examples/projects-list/ProjectsListPage.d.ts +0 -4
  132. package/dist/src/examples/projects-list/ProjectsListPage.d.ts.map +0 -1
  133. package/dist/src/examples/projects-list/ProjectsListPage.js +0 -58
  134. package/dist/src/examples/projects-list/ProjectsListPage.js.map +0 -1
  135. package/dist/src/examples/projects-list/mock-data.d.ts +0 -10
  136. package/dist/src/examples/projects-list/mock-data.d.ts.map +0 -1
  137. package/dist/src/examples/projects-list/mock-data.js +0 -83
  138. package/dist/src/examples/projects-list/mock-data.js.map +0 -1
@@ -1,10 +1,11 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { ChevronDown } from "lucide-react";
4
+ import { Check, ChevronDown, MoreVertical } from "lucide-react";
5
5
  import { cn } from "../../lib/utils.js";
6
6
  import { Button } from "./button.js";
7
- import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger, } from "./dropdown.js";
7
+ import { linkDestination, resolveActive, resolveLinkProps, } from "./nav-data.js";
8
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "./dropdown.js";
8
9
  /**
9
10
  * Top-nav context switcher — chain of split-button segments separated by `/`.
10
11
  *
@@ -32,7 +33,7 @@ function NavBreadcrumb({ className, children, "aria-label": ariaLabel = "Context
32
33
  className: "select-none text-xs text-neutral-foreground-subtle/40", children: "/" })) : null, child] }, childKey));
33
34
  }) }) }));
34
35
  }
35
- function NavBreadcrumbItem({ icon, label, onClick, switchLabel = "Switch context", children, active = false, className, }) {
36
+ function NavBreadcrumbItem({ icon, label, onClick, switchLabel = "Switch context", linkProps, linkComponent, children, actions, actionsLabel, trailingElement, menuElement, active = false, className, }) {
36
37
  // Clone the user's icon so it carries the `data-icon` attribute the
37
38
  // Button uses to drive its inline padding rules.
38
39
  const iconWithData = icon && React.isValidElement(icon)
@@ -42,20 +43,66 @@ function NavBreadcrumbItem({ icon, label, onClick, switchLabel = "Switch context
42
43
  // padding; with one, we tighten the right side so the chevron reads as
43
44
  // paired (otherwise the inline-start `pl-2` makes the segment look
44
45
  // heavier on the right).
45
- const hasSwitcher = children !== undefined && children !== null;
46
- return (_jsxs("li", { "data-slot": "nav-breadcrumb-item", className: cn("inline-flex items-center", className), children: [_jsxs(Button, { variant: "ghost", size: "sm", onClick: onClick,
46
+ //
47
+ // Filtering matters: `children={[]}` and `children={cond && <Item/>}` both arrive here as
48
+ // something non-null, and a bare presence test would give them a chevron that opens nothing.
49
+ const hasSwitcher = React.Children.toArray(children).filter(Boolean).length > 0;
50
+ const visibleActions = actions?.filter(Boolean) ?? [];
51
+ const hasActions = visibleActions.length > 0;
52
+ const resolvedActionsLabel = actionsLabel ??
53
+ (typeof label === "string" ? `${label} actions` : "More actions");
54
+ const destination = linkDestination(linkProps);
55
+ const isLink = destination !== undefined;
56
+ const LinkEl = linkComponent ?? "a";
57
+ const labelContent = (_jsxs(_Fragment, { children: [iconWithData, label, trailingElement] }));
58
+ return (_jsxs("li", { "data-slot": "nav-breadcrumb-item", className: cn("inline-flex items-center", className), children: [_jsx(Button, { variant: "ghost", size: "sm",
59
+ // A link segment renders through Button's Slot so it keeps the ghost styling while
60
+ // being a real anchor — hoverable href, Cmd-click, "open in new tab", and announced
61
+ // as a link rather than a button.
62
+ asChild: isLink, onClick: onClick,
47
63
  // Padding rules:
48
64
  // • icon present → Button's `has-data-[icon=inline-start]:pl-2`
49
65
  // already tightens the left; tighten the right when there's a
50
66
  // switcher so the segment reads as paired.
51
67
  // • no icon → force `px-2` so left and right match the same
52
68
  // 8px the icon variant uses.
53
- className: cn(!icon ? "px-2" : hasSwitcher && "pr-2", active && "font-medium"), children: [iconWithData, label] }), hasSwitcher ? (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-xs", "aria-label": switchLabel,
69
+ className: cn(!icon ? "px-2" : (hasSwitcher || hasActions) && "pr-2", active && "font-medium"), children: isLink ? (_jsx(LinkEl, { ...resolveLinkProps(linkProps, linkComponent !== undefined), children: labelContent })) : (labelContent) }), menuElement, hasActions ? (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-xs", "aria-label": resolvedActionsLabel, className: "-ml-0.5 text-neutral-foreground-subtle", children: _jsx(MoreVertical, {}) }) }), _jsx(DropdownMenuContent, { align: "start", children: visibleActions.map((action) => (_jsxs(React.Fragment, { children: [action.hasDivider ? _jsx(DropdownMenuSeparator, {}) : null, _jsx(DropdownMenuItem, { variant: action.isDanger ? "destructive" : "default", disabled: action.disabled, onClick: action.onClick, children: action.label })] }, action.key))) })] })) : null, hasSwitcher ? (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-xs", "aria-label": switchLabel,
54
70
  // Tighten the gap so the chevron reads as paired with the
55
71
  // label, not a sibling segment. `text-neutral-foreground-subtle`
56
72
  // matches the `/` separator — secondary affordance,
57
73
  // but readable.
58
74
  className: "-ml-0.5 text-neutral-foreground-subtle", children: _jsx(ChevronDown, {}) }) }), _jsx(DropdownMenuContent, { align: "start", children: children })] })) : null] }));
59
75
  }
76
+ /**
77
+ * `NavBreadcrumb` built from data instead of composition.
78
+ *
79
+ * `NavBreadcrumb` itself stays composition-based: it takes children and gains no `activeItemKey`.
80
+ * This helper is the data-fed entry point, and it owns the two resolutions a descriptor implies —
81
+ * label functions and dropdown selection — so consumers stop hand-rolling them.
82
+ */
83
+ export function NavBreadcrumbSwitcher({ items, activeItemKey, linkComponent, "aria-label": ariaLabel, className, }) {
84
+ return (_jsx(NavBreadcrumb, { "aria-label": ariaLabel, className: className, children: items.map((item) => {
85
+ const label = typeof item.label === "function"
86
+ ? item.label(activeItemKey ?? "")
87
+ : item.label;
88
+ const Icon = item.icon;
89
+ const rows = item.dropdownItems ?? [];
90
+ return (_jsx(NavBreadcrumbItem, { icon: Icon ? _jsx(Icon, {}) : undefined, label: label, onClick: item.onClick, linkProps: item.linkProps, linkComponent: linkComponent, actions: item.actions, actionsLabel: item.actionsLabel, trailingElement: item.trailingElement, menuElement: item.menuElement, switchLabel: item.dropdownAriaLabel, children: rows.length > 0 ? (_jsxs(_Fragment, { children: [item.dropdownTitle ? (_jsx(DropdownMenuLabel, { children: item.dropdownTitle })) : null, rows.map((row) => (_jsx(SwitcherRow, { row: row, activeItemKey: activeItemKey, linkComponent: linkComponent }, row.key)))] })) : null }, item.key));
91
+ }) }));
92
+ }
93
+ function SwitcherRow({ row, activeItemKey, linkComponent, }) {
94
+ // No key fallback here — see `isSelected` on NavBreadcrumbDropdownItem for why.
95
+ const selected = row.isSelected === undefined
96
+ ? false
97
+ : resolveActive(row.isSelected, row.key, activeItemKey);
98
+ const destination = linkDestination(row.linkProps);
99
+ const RowIcon = row.icon;
100
+ const LinkEl = linkComponent ?? "a";
101
+ const content = (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": true, className: "flex w-4 shrink-0 justify-center", children: selected ? _jsx(Check, { className: "size-4" }) : null }), RowIcon ? _jsx(RowIcon, { "aria-hidden": true, className: "size-4 shrink-0" }) : null, _jsx("span", { className: "flex-1 truncate", children: row.label }), row.trailingElement] }));
102
+ return (_jsx(DropdownMenuItem
103
+ // `aria-current` rather than `aria-selected`: the row is a menuitem, and menuitem does
104
+ // not support aria-selected. Screen readers announce the page relationship instead.
105
+ , { "aria-current": selected ? "page" : undefined, onClick: row.onClick, asChild: destination !== undefined, children: destination !== undefined ? (_jsx(LinkEl, { ...resolveLinkProps(row.linkProps, linkComponent !== undefined), children: content })) : (content) }));
106
+ }
60
107
  export { NavBreadcrumb, NavBreadcrumbItem };
61
108
  //# sourceMappingURL=nav-breadcrumb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nav-breadcrumb.js","sourceRoot":"","sources":["../../../../src/components/ui/nav-breadcrumb.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nav-breadcrumb.js","sourceRoot":"","sources":["../../../../src/components/ui/nav-breadcrumb.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Vocabulary shared by the data-driven navigation surfaces: how a node describes where it goes,
3
+ * and how it says whether it is the current one. `AppSidebar` and `NavBreadcrumb` both read
4
+ * these — the rules must not diverge, or the same `linkProps` would resolve differently
5
+ * depending on which surface renders it.
6
+ */
7
+ export interface NavLinkProps {
8
+ href?: string;
9
+ /**
10
+ * React Router's destination, declared alongside `href` because `to` is the router convention
11
+ * and most consumers building navigation data already emit it.
12
+ *
13
+ * Narrowed to `string` on purpose. React Router's own `to` is
14
+ * `LocationDescriptor | ((location) => LocationDescriptor)`, and a non-string value reaching
15
+ * the default anchor renders `href="[object Object]"` — a link that looks real and navigates
16
+ * nowhere. Object and function destinations are still supported, but only through an injected
17
+ * `linkComponent`, which knows how to read them.
18
+ */
19
+ to?: string;
20
+ [key: string]: unknown;
21
+ }
22
+ /**
23
+ * Whether a node is the current one.
24
+ *
25
+ * - `undefined` — fall back to comparing the node's `key` against `activeItemKey`
26
+ * - `boolean` — as given
27
+ * - `string` — active when it equals `activeItemKey`
28
+ * - function — called with `activeItemKey`
29
+ *
30
+ * The function form is why this is a union rather than a boolean: a matcher passed to a boolean
31
+ * prop is always truthy, so every row using one renders permanently active.
32
+ */
33
+ export type ActiveMatcher = boolean | string | ((activeItemKey: string) => boolean);
34
+ /** The destination a node points at, or `undefined` when it is not a link. */
35
+ export declare function linkDestination(linkProps: NavLinkProps | undefined): string | undefined;
36
+ /**
37
+ * Props for the rendered link element. An injected `linkComponent` gets everything; the default
38
+ * anchor gets the router keys stripped and an `href` resolved from `href ?? to`.
39
+ */
40
+ export declare function resolveLinkProps(linkProps: NavLinkProps | undefined, hasLinkComponent: boolean): Record<string, unknown>;
41
+ /**
42
+ * Resolves a node's active state. A per-node matcher of any form always wins; `activeItemKey`
43
+ * is only the fallback comparand, compared against the node's own key.
44
+ */
45
+ export declare function resolveActive(isActive: ActiveMatcher | undefined, key: string, activeItemKey: string | undefined): boolean;
46
+ //# sourceMappingURL=nav-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-data.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/nav-data.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;;;OASG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,aAAa,GACvB,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;AAuB1D,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,SAAS,EAAE,YAAY,GAAG,SAAS,sBAIlE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,YAAY,GAAG,SAAS,EACnC,gBAAgB,EAAE,OAAO,GACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,OAAO,CAOT"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Vocabulary shared by the data-driven navigation surfaces: how a node describes where it goes,
3
+ * and how it says whether it is the current one. `AppSidebar` and `NavBreadcrumb` both read
4
+ * these — the rules must not diverge, or the same `linkProps` would resolve differently
5
+ * depending on which surface renders it.
6
+ */
7
+ /**
8
+ * React Router keys that must not reach a plain `<a>`. When a `linkComponent` is injected every
9
+ * key passes through verbatim — it needs these. When the design system renders its own anchor
10
+ * they are unknown DOM attributes, and React warns about each one.
11
+ *
12
+ * Targets react-router v5 and v6. A consumer on another router should inject a `linkComponent`
13
+ * rather than expect this list to know its prop names.
14
+ */
15
+ const ROUTER_ONLY_LINK_KEYS = new Set([
16
+ "to",
17
+ "replace",
18
+ "state",
19
+ "innerRef",
20
+ "component",
21
+ "exact",
22
+ "strict",
23
+ "isActive",
24
+ "activeClassName",
25
+ "activeStyle",
26
+ ]);
27
+ /** The destination a node points at, or `undefined` when it is not a link. */
28
+ export function linkDestination(linkProps) {
29
+ if (!linkProps)
30
+ return undefined;
31
+ if (linkProps.href !== undefined)
32
+ return linkProps.href;
33
+ return typeof linkProps.to === "string" ? linkProps.to : undefined;
34
+ }
35
+ /**
36
+ * Props for the rendered link element. An injected `linkComponent` gets everything; the default
37
+ * anchor gets the router keys stripped and an `href` resolved from `href ?? to`.
38
+ */
39
+ export function resolveLinkProps(linkProps, hasLinkComponent) {
40
+ if (!linkProps)
41
+ return {};
42
+ if (hasLinkComponent)
43
+ return linkProps;
44
+ const rest = {};
45
+ for (const [key, value] of Object.entries(linkProps)) {
46
+ if (!ROUTER_ONLY_LINK_KEYS.has(key))
47
+ rest[key] = value;
48
+ }
49
+ rest.href = linkDestination(linkProps);
50
+ return rest;
51
+ }
52
+ /**
53
+ * Resolves a node's active state. A per-node matcher of any form always wins; `activeItemKey`
54
+ * is only the fallback comparand, compared against the node's own key.
55
+ */
56
+ export function resolveActive(isActive, key, activeItemKey) {
57
+ if (isActive === undefined) {
58
+ return activeItemKey !== undefined && key === activeItemKey;
59
+ }
60
+ if (typeof isActive === "boolean")
61
+ return isActive;
62
+ if (typeof isActive === "string")
63
+ return isActive === activeItemKey;
64
+ return activeItemKey !== undefined ? isActive(activeItemKey) : false;
65
+ }
66
+ //# sourceMappingURL=nav-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-data.js","sourceRoot":"","sources":["../../../../src/components/ui/nav-data.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgCH;;;;;;;GAOG;AACH,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,IAAI;IACJ,SAAS;IACT,OAAO;IACP,UAAU;IACV,WAAW;IACX,OAAO;IACP,QAAQ;IACR,UAAU;IACV,iBAAiB;IACjB,aAAa;CACd,CAAC,CAAC;AAEH,8EAA8E;AAC9E,MAAM,UAAU,eAAe,CAAC,SAAmC;IACjE,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC;IACxD,OAAO,OAAO,SAAS,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAmC,EACnC,gBAAyB;IAEzB,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC1B,IAAI,gBAAgB;QAAE,OAAO,SAAS,CAAC;IAEvC,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACzD,CAAC;IACD,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAmC,EACnC,GAAW,EACX,aAAiC;IAEjC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,aAAa,KAAK,SAAS,IAAI,GAAG,KAAK,aAAa,CAAC;IAC9D,CAAC;IACD,IAAI,OAAO,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACnD,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,KAAK,aAAa,CAAC;IACpE,OAAO,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACvE,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Compile-time fixture for the `NavIcon` contract. Nothing imports this file — it exists to be
3
+ * type-checked, and `npm run typecheck` is what runs it.
4
+ *
5
+ * `NavIcon` is deliberately structural. Narrowing it back to lucide's `LucideIcon` (a
6
+ * `React.ForwardRefExoticComponent`, which structurally requires `$$typeof`) would silently
7
+ * reject three of the four sources below — including this package's own registry icons — and
8
+ * every consumer would discover it at their call sites rather than here.
9
+ */
10
+ import type * as React from "react";
11
+ import type { NavIcon } from "./nav-icon.js";
12
+ import type { SidebarItem } from "./app-sidebar.js";
13
+ import type { GlobalActionButton } from "./app-header.js";
14
+ /** A Carbon icon's shape, which is what C3's `IconComponent` resolves to. */
15
+ interface CarbonIconProps extends React.SVGProps<SVGSVGElement> {
16
+ size?: number | string;
17
+ }
18
+ declare const fromLucide: NavIcon;
19
+ declare const fromRegistryNamed: NavIcon;
20
+ declare const fromRegistryMap: NavIcon;
21
+ declare const fromAppMap: NavIcon;
22
+ declare const fromCarbonClass: NavIcon;
23
+ declare const fromCarbonFunction: NavIcon;
24
+ /** Both consuming surfaces accept the same four sources. */
25
+ declare const sidebarItem: SidebarItem;
26
+ declare const sidebarItemWithoutIcon: SidebarItem;
27
+ declare const globalAction: GlobalActionButton;
28
+ export type { CarbonIconProps as _CarbonIconProps };
29
+ export { fromLucide, fromRegistryNamed, fromRegistryMap, fromAppMap, fromCarbonClass, fromCarbonFunction, sidebarItem, sidebarItemWithoutIcon, globalAction, };
30
+ //# sourceMappingURL=nav-icon.assignability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-icon.assignability.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/nav-icon.assignability.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAMpC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,6EAA6E;AAC7E,UAAU,eAAgB,SAAQ,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;IAC7D,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAID,QAAA,MAAM,UAAU,EAAE,OAAmC,CAAC;AACtD,QAAA,MAAM,iBAAiB,EAAE,OAAqB,CAAC;AAC/C,QAAA,MAAM,eAAe,EAAE,OAA8B,CAAC;AACtD,QAAA,MAAM,UAAU,EAAE,OAAiC,CAAC;AACpD,QAAA,MAAM,eAAe,EAAE,OAAyB,CAAC;AACjD,QAAA,MAAM,kBAAkB,EAAE,OAA4B,CAAC;AAEvD,4DAA4D;AAC5D,QAAA,MAAM,WAAW,EAAE,WAKlB,CAAC;AACF,QAAA,MAAM,sBAAsB,EAAE,WAI7B,CAAC;AACF,QAAA,MAAM,YAAY,EAAE,kBAInB,CAAC;AAEF,YAAY,EAAE,eAAe,IAAI,gBAAgB,EAAE,CAAC;AACpD,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,sBAAsB,EACtB,YAAY,GACb,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { Home } from "lucide-react";
2
+ import { camundaIcons, ProjectIcon } from "../../icons/index.js";
3
+ import { camundaAppIcons } from "../../icons/camunda-app-icons.js";
4
+ const fromLucide = Home;
5
+ const fromRegistryNamed = ProjectIcon;
6
+ const fromRegistryMap = camundaIcons.project;
7
+ const fromAppMap = camundaAppIcons.operate;
8
+ const fromCarbonClass = CarbonClassIcon;
9
+ const fromCarbonFunction = CarbonFunctionIcon;
10
+ /** Both consuming surfaces accept the same four sources. */
11
+ const sidebarItem = {
12
+ type: "item",
13
+ key: "k",
14
+ label: "Label",
15
+ icon: CarbonFunctionIcon,
16
+ };
17
+ const sidebarItemWithoutIcon = {
18
+ type: "item",
19
+ key: "k",
20
+ label: "Label",
21
+ };
22
+ const globalAction = {
23
+ key: "k",
24
+ label: "Label",
25
+ icon: ProjectIcon,
26
+ };
27
+ export { fromLucide, fromRegistryNamed, fromRegistryMap, fromAppMap, fromCarbonClass, fromCarbonFunction, sidebarItem, sidebarItemWithoutIcon, globalAction, };
28
+ //# sourceMappingURL=nav-icon.assignability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-icon.assignability.js","sourceRoot":"","sources":["../../../../src/components/ui/nav-icon.assignability.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAYhE,MAAM,UAAU,GAAY,IAAyB,CAAC;AACtD,MAAM,iBAAiB,GAAY,WAAW,CAAC;AAC/C,MAAM,eAAe,GAAY,YAAY,CAAC,OAAO,CAAC;AACtD,MAAM,UAAU,GAAY,eAAe,CAAC,OAAO,CAAC;AACpD,MAAM,eAAe,GAAY,eAAe,CAAC;AACjD,MAAM,kBAAkB,GAAY,kBAAkB,CAAC;AAEvD,4DAA4D;AAC5D,MAAM,WAAW,GAAgB;IAC/B,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,GAAG;IACR,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,kBAAkB;CACzB,CAAC;AACF,MAAM,sBAAsB,GAAgB;IAC1C,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,GAAG;IACR,KAAK,EAAE,OAAO;CACf,CAAC;AACF,MAAM,YAAY,GAAuB;IACvC,GAAG,EAAE,GAAG;IACR,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,WAAW;CAClB,CAAC;AAGF,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,sBAAsB,EACtB,YAAY,GACb,CAAC"}
@@ -0,0 +1,33 @@
1
+ import * as React from "react";
2
+ /**
3
+ * The accepted type of every data-driven icon slot in the navigation API.
4
+ *
5
+ * Deliberately structural rather than lucide's nominal `LucideIcon`: that type is a
6
+ * `React.ForwardRefExoticComponent`, so it structurally requires `$$typeof` and rejects any
7
+ * plain function component — including the design system's own registry icons. All four sources
8
+ * a consumer can hold assign to this one: lucide icons, the registry's icons, `camundaIcons[key]`
9
+ * and Carbon-shaped icon components.
10
+ *
11
+ * `size` is intentionally absent, and both plausible spellings were measured to fail under
12
+ * `strict`: `size?: number | string` rejects Carbon-shaped icons (whose `size` is `number`,
13
+ * through `getDerivedStateFromProps` contravariance) and `size?: number` rejects lucide
14
+ * (`propTypes` invariance). Size icons with the `size-*` utility, optionally reinforced with
15
+ * numeric `width`/`height` — both are members of `SVGProps<SVGSVGElement>`. A class overrides an
16
+ * SVG `width`/`height` attribute but not an inline `style`, so an icon that hardcodes its
17
+ * dimensions inline is out of contract.
18
+ */
19
+ export type NavIcon = React.ComponentType<React.SVGProps<SVGSVGElement>>;
20
+ /**
21
+ * Renders a navigation row's icon, falling back to the label's initials.
22
+ *
23
+ * The collapsed rail renders the icon as the row's only visual, with the label moved into
24
+ * `sr-only`. An icon-less node would collapse to a row that is invisible yet still focusable and
25
+ * still carries a tooltip — so something has to occupy the box. Initials keep rows
26
+ * distinguishable, and the rail's existing tooltip names them.
27
+ */
28
+ export declare function NavRowIcon({ icon: Icon, label, className, }: {
29
+ icon?: NavIcon;
30
+ label: string;
31
+ className?: string;
32
+ }): React.JSX.Element;
33
+ //# sourceMappingURL=nav-icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-icon.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/nav-icon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;AAEzE;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,EACzB,IAAI,EAAE,IAAI,EACV,KAAK,EACL,SAAS,GACV,EAAE;IACD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,qBAmBA"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../../lib/utils.js";
4
+ import { deriveInitials } from "./avatar.js";
5
+ /**
6
+ * Renders a navigation row's icon, falling back to the label's initials.
7
+ *
8
+ * The collapsed rail renders the icon as the row's only visual, with the label moved into
9
+ * `sr-only`. An icon-less node would collapse to a row that is invisible yet still focusable and
10
+ * still carries a tooltip — so something has to occupy the box. Initials keep rows
11
+ * distinguishable, and the rail's existing tooltip names them.
12
+ */
13
+ export function NavRowIcon({ icon: Icon, label, className, }) {
14
+ if (Icon) {
15
+ return _jsx(Icon, { "aria-hidden": true, className: cn("size-5 shrink-0", className) });
16
+ }
17
+ const initials = deriveInitials(label);
18
+ return (_jsx("span", { "aria-hidden": true, "data-slot": "nav-row-icon-fallback", className: cn("flex size-5 shrink-0 items-center justify-center rounded-sm border border-current/30 text-[0.625rem] font-medium leading-none", className), children: initials }));
19
+ }
20
+ //# sourceMappingURL=nav-icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-icon.js","sourceRoot":"","sources":["../../../../src/components/ui/nav-icon.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAqB1C;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,IAAI,EAAE,IAAI,EACV,KAAK,EACL,SAAS,GAKV;IACC,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,KAAC,IAAI,yBAAa,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,GAAI,CAAC;IAC3E,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAEvC,OAAO,CACL,iDAEY,uBAAuB,EACjC,SAAS,EAAE,EAAE,CACX,+HAA+H,EAC/H,SAAS,CACV,YAEA,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ToolDescriptor } from "./nav-tools.js";
2
+ import type { AppHeaderProps } from "./app-header.js";
3
+ export declare const asDsTools: ToolDescriptor[];
4
+ export declare const asHeaderProp: AppHeaderProps["tools"];
5
+ export declare const widenedRenderButton: ToolDescriptor["renderButton"];
6
+ export declare const noArgRenderButton: ToolDescriptor["renderButton"];
7
+ export declare const dsShapedTool: ToolDescriptor;
8
+ export declare const actionOnlyTool: ToolDescriptor;
9
+ export declare const nodePanelTool: ToolDescriptor;
10
+ //# sourceMappingURL=nav-tools.assignability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-tools.assignability.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/nav-tools.assignability.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAgBnD,eAAO,MAAM,SAAS,EAAE,cAAc,EAAY,CAAC;AAGnD,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,OAAO,CAAW,CAAC;AAS7D,eAAO,MAAM,mBAAmB,EAAE,cAAc,CAAC,cAAc,CAC/C,CAAC;AAGjB,eAAO,MAAM,iBAAiB,EAAE,cAAc,CAAC,cAAc,CAAc,CAAC;AAG5E,eAAO,MAAM,YAAY,EAAE,cAQ1B,CAAC;AAGF,eAAO,MAAM,cAAc,EAAE,cAI5B,CAAC;AAIF,eAAO,MAAM,aAAa,EAAE,cAK3B,CAAC"}
@@ -0,0 +1,35 @@
1
+ // 1. The whole array assigns, which is the migration promise.
2
+ export const asDsTools = c3Tools;
3
+ // 2. And it assigns at the call site, not merely to the exported type.
4
+ export const asHeaderProp = c3Tools;
5
+ export const widenedRenderButton = c3RenderButton;
6
+ // 4. A trigger that ignores the payload entirely is still valid.
7
+ export const noArgRenderButton = () => null;
8
+ // 5. The design-system shape: reading `buttonProps` and using the function form of `panel`.
9
+ export const dsShapedTool = {
10
+ key: "notifications",
11
+ label: "Notifications",
12
+ renderButton: ({ onClick, isActive, buttonProps }) =>
13
+ // Reads every member, so the payload's shape is exercised and not merely named.
14
+ `${String(onClick)}${isActive}${buttonProps.id}${buttonProps["aria-expanded"]}${buttonProps["aria-controls"] ?? ""}`,
15
+ panel: ({ close }) => String(close),
16
+ panelWidth: "24rem",
17
+ };
18
+ // 6. A panel-less tool — hub's help-centre button is exactly this shape.
19
+ export const actionOnlyTool = {
20
+ key: "help",
21
+ label: "Help",
22
+ renderButton: () => null,
23
+ };
24
+ export const nodePanelTool = {
25
+ key: "info",
26
+ label: "Info",
27
+ renderButton: () => null,
28
+ panel: someNode,
29
+ };
30
+ /*
31
+ * Deliberately NOT asserted: that a DS `ToolDescriptor` assigns back to `C3ToolDescriptor`.
32
+ * It does not, and should not — `panel` accepts a function form C3 cannot render. The contract
33
+ * is one-way, and only that direction is a migration path.
34
+ */
35
+ //# sourceMappingURL=nav-tools.assignability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-tools.assignability.js","sourceRoot":"","sources":["../../../../src/components/ui/nav-tools.assignability.ts"],"names":[],"mappings":"AA+BA,8DAA8D;AAC9D,MAAM,CAAC,MAAM,SAAS,GAAqB,OAAO,CAAC;AAEnD,uEAAuE;AACvE,MAAM,CAAC,MAAM,YAAY,GAA4B,OAAO,CAAC;AAS7D,MAAM,CAAC,MAAM,mBAAmB,GAC9B,cAAc,CAAC;AAEjB,iEAAiE;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAmC,GAAG,EAAE,CAAC,IAAI,CAAC;AAE5E,4FAA4F;AAC5F,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,GAAG,EAAE,eAAe;IACpB,KAAK,EAAE,eAAe;IACtB,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAmB,EAAE,EAAE;IACpE,gFAAgF;IAChF,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,GAAG,WAAW,CAAC,EAAE,GAAG,WAAW,CAAC,eAAe,CAAC,GAAG,WAAW,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE;IACtH,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;IACnC,UAAU,EAAE,OAAO;CACpB,CAAC;AAEF,yEAAyE;AACzE,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,MAAM;IACb,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI;CACzB,CAAC;AAIF,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,MAAM;IACb,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI;IACxB,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF;;;;GAIG"}
@@ -0,0 +1,95 @@
1
+ import * as React from "react";
2
+ /**
3
+ * Header tool panels — the button-plus-panel system that carries app chrome (notifications,
4
+ * info, help, user).
5
+ *
6
+ * The panel is a **disclosure**, not a dialog: opening it leaves focus on the trigger and moving
7
+ * focus away does not close it. Escape and an outside pointer-down do close it, which a plain
8
+ * disclosure would not do, but neither is focus-based so neither contradicts the role.
9
+ */
10
+ /** What the header hands a tool's trigger component. */
11
+ export interface ToolButtonProps {
12
+ onClick: () => void;
13
+ isActive: boolean;
14
+ /**
15
+ * Spread onto the rendered button. The consumer owns that element, so the design system
16
+ * cannot put the disclosure wiring on it from outside — cloning the returned node instead
17
+ * silently no-ops whenever `renderButton` returns a Fragment or a wrapper.
18
+ *
19
+ * `aria-controls` appears only while this tool's panel is open, because it must reference an
20
+ * element that exists.
21
+ */
22
+ buttonProps: {
23
+ id: string;
24
+ "aria-expanded": boolean;
25
+ "aria-controls"?: string;
26
+ };
27
+ }
28
+ /**
29
+ * A panel, or a function receiving `close`.
30
+ *
31
+ * The function form exists because the panel gets no chrome from the design system: C3 ships
32
+ * none either (`panel-primitives` exports a header and a title, no close button), and its
33
+ * notifications panel deliberately stays open over the destination the user just navigated to.
34
+ * A panel that does want a close affordance would otherwise have no way to dismiss itself.
35
+ */
36
+ export type ToolPanelContent = React.ReactNode | ((props: {
37
+ close: () => void;
38
+ }) => React.ReactNode);
39
+ export interface ToolDescriptor {
40
+ key: string;
41
+ label: string;
42
+ /**
43
+ * Rendered as a component (`<tool.renderButton … />`), never called as a function, so it may
44
+ * use hooks — C3's notifications tool reads a context inside it to drive its unread badge.
45
+ *
46
+ * Its identity is therefore a component identity: build the `tools` array outside render or
47
+ * memoize it, or every button unmounts and remounts on each render, dropping focus, hover and
48
+ * any open tooltip.
49
+ */
50
+ renderButton: (props: ToolButtonProps) => React.ReactNode;
51
+ /** Omit for a tool that only acts — its click is inert and the action lives in `renderButton`. */
52
+ panel?: ToolPanelContent;
53
+ /** Width of this tool's panel on `sm` and up. Default `"20rem"` (C3's 320px). */
54
+ panelWidth?: string;
55
+ }
56
+ export interface UseHeaderToolsOptions {
57
+ tools?: ToolDescriptor[];
58
+ activeToolKey?: string | null;
59
+ onActiveToolChange?: (key: string | null) => void;
60
+ /** Namespaces the generated trigger and panel ids. */
61
+ idPrefix: string;
62
+ }
63
+ /**
64
+ * Owns which tool is open.
65
+ *
66
+ * `activeToolKey` has three states, not two: `undefined` is uncontrolled, `null` is controlled
67
+ * with nothing open, and a string is controlled with that tool open. A consumer passing `null`
68
+ * to mean "you decide" enters controlled mode permanently, so that distinction has to survive.
69
+ */
70
+ export declare function useHeaderTools({ tools, activeToolKey, onActiveToolChange, idPrefix, }: UseHeaderToolsOptions): {
71
+ activeTool: ToolDescriptor | null;
72
+ activeKey: string | null;
73
+ toggleTool: (tool: ToolDescriptor) => void;
74
+ setActiveKey: (key: string | null) => void;
75
+ panelId: string;
76
+ triggerId: (key: string) => string;
77
+ };
78
+ export interface HeaderToolsProps {
79
+ tools: ToolDescriptor[];
80
+ activeTool: ToolDescriptor | null;
81
+ activeKey: string | null;
82
+ toggleTool: (tool: ToolDescriptor) => void;
83
+ setActiveKey: (key: string | null) => void;
84
+ panelId: string;
85
+ triggerId: (key: string) => string;
86
+ }
87
+ /**
88
+ * The trigger row plus, when a tool is open, its portaled panel.
89
+ *
90
+ * Tab from an expanded trigger moves focus into the panel. Without it a disclosure whose panel
91
+ * is portaled to the end of `<body>` is reachable only by tabbing the whole page — the panel
92
+ * sits beside its trigger visually but nowhere near it in the tab sequence.
93
+ */
94
+ export declare function HeaderTools({ tools, activeTool, activeKey, toggleTool, setActiveKey, panelId, triggerId, }: HeaderToolsProps): React.JSX.Element;
95
+ //# sourceMappingURL=nav-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-tools.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/nav-tools.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B;;;;;;;GAOG;AAEH,wDAAwD;AACxD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB;;;;;;;OAOG;IACH,WAAW,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,eAAe,EAAE,OAAO,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAC1B,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;AAExE,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,YAAY,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,KAAK,CAAC,SAAS,CAAC;IAC1D,kGAAkG;IAClG,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAaD,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,aAAa,EACb,kBAAkB,EAClB,QAAQ,GACT,EAAE,qBAAqB;;;uBAoCb,cAAc;wBAVf,MAAM,GAAG,IAAI;;qBAqBb,MAAM;EAYf;AAUD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,UAAU,EACV,SAAS,EACT,UAAU,EACV,YAAY,EACZ,OAAO,EACP,SAAS,GACV,EAAE,gBAAgB,qBAuDlB"}