@camunda/design-system 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/components/ui/app-header.d.ts +6 -2
- package/dist/src/components/ui/app-header.d.ts.map +1 -1
- package/dist/src/components/ui/app-header.js +1 -1
- package/dist/src/components/ui/app-header.js.map +1 -1
- package/dist/src/components/ui/app-sidebar.d.ts +44 -12
- package/dist/src/components/ui/app-sidebar.d.ts.map +1 -1
- package/dist/src/components/ui/app-sidebar.js +42 -15
- package/dist/src/components/ui/app-sidebar.js.map +1 -1
- package/dist/src/components/ui/avatar.d.ts +7 -0
- package/dist/src/components/ui/avatar.d.ts.map +1 -1
- package/dist/src/components/ui/avatar.js +1 -1
- package/dist/src/components/ui/avatar.js.map +1 -1
- package/dist/src/components/ui/bar-chart.d.ts.map +1 -1
- package/dist/src/components/ui/bar-chart.js +45 -7
- package/dist/src/components/ui/bar-chart.js.map +1 -1
- package/dist/src/components/ui/chart.d.ts +9 -2
- package/dist/src/components/ui/chart.d.ts.map +1 -1
- package/dist/src/components/ui/chart.js +13 -4
- package/dist/src/components/ui/chart.js.map +1 -1
- package/dist/src/components/ui/data-table.d.ts +6 -0
- package/dist/src/components/ui/data-table.d.ts.map +1 -1
- package/dist/src/components/ui/data-table.js +6 -5
- package/dist/src/components/ui/data-table.js.map +1 -1
- package/dist/src/components/ui/definition-tooltip.d.ts.map +1 -1
- package/dist/src/components/ui/definition-tooltip.js +37 -9
- package/dist/src/components/ui/definition-tooltip.js.map +1 -1
- package/dist/src/components/ui/line-chart.d.ts.map +1 -1
- package/dist/src/components/ui/line-chart.js +12 -2
- package/dist/src/components/ui/line-chart.js.map +1 -1
- package/dist/src/components/ui/meter.d.ts.map +1 -1
- package/dist/src/components/ui/meter.js +1 -10
- package/dist/src/components/ui/meter.js.map +1 -1
- package/dist/src/components/ui/nav-breadcrumb.d.ts +120 -2
- package/dist/src/components/ui/nav-breadcrumb.d.ts.map +1 -1
- package/dist/src/components/ui/nav-breadcrumb.js +54 -7
- package/dist/src/components/ui/nav-breadcrumb.js.map +1 -1
- package/dist/src/components/ui/nav-data.d.ts +46 -0
- package/dist/src/components/ui/nav-data.d.ts.map +1 -0
- package/dist/src/components/ui/nav-data.js +66 -0
- package/dist/src/components/ui/nav-data.js.map +1 -0
- package/dist/src/components/ui/nav-icon.assignability.d.ts +30 -0
- package/dist/src/components/ui/nav-icon.assignability.d.ts.map +1 -0
- package/dist/src/components/ui/nav-icon.assignability.js +28 -0
- package/dist/src/components/ui/nav-icon.assignability.js.map +1 -0
- package/dist/src/components/ui/nav-icon.d.ts +33 -0
- package/dist/src/components/ui/nav-icon.d.ts.map +1 -0
- package/dist/src/components/ui/nav-icon.js +20 -0
- package/dist/src/components/ui/nav-icon.js.map +1 -0
- package/dist/src/components/ui/notifications.d.ts +72 -0
- package/dist/src/components/ui/notifications.d.ts.map +1 -0
- package/dist/src/components/ui/notifications.js +53 -0
- package/dist/src/components/ui/notifications.js.map +1 -0
- package/dist/src/components/ui/scorecard.d.ts +1 -1
- package/dist/src/components/ui/scorecard.d.ts.map +1 -1
- package/dist/src/components/ui/scorecard.js +13 -8
- package/dist/src/components/ui/scorecard.js.map +1 -1
- package/dist/src/components/ui/sheet.d.ts +1 -1
- package/dist/src/components/ui/sparkline.d.ts.map +1 -1
- package/dist/src/components/ui/sparkline.js +11 -1
- package/dist/src/components/ui/sparkline.js.map +1 -1
- package/dist/src/examples/agent-control-plane-processes/DashboardPage.d.ts +3 -0
- package/dist/src/examples/agent-control-plane-processes/DashboardPage.d.ts.map +1 -0
- package/dist/src/examples/agent-control-plane-processes/DashboardPage.js +114 -0
- package/dist/src/examples/agent-control-plane-processes/DashboardPage.js.map +1 -0
- package/dist/src/examples/agent-control-plane-processes/derive.d.ts +65 -0
- package/dist/src/examples/agent-control-plane-processes/derive.d.ts.map +1 -0
- package/dist/src/examples/agent-control-plane-processes/derive.js +234 -0
- package/dist/src/examples/agent-control-plane-processes/derive.js.map +1 -0
- package/dist/src/examples/agent-control-plane-processes/mock-data.d.ts +37 -0
- package/dist/src/examples/agent-control-plane-processes/mock-data.d.ts.map +1 -0
- package/dist/src/examples/agent-control-plane-processes/mock-data.js +206 -0
- package/dist/src/examples/agent-control-plane-processes/mock-data.js.map +1 -0
- package/dist/src/examples/agent-control-plane-processes/summary-mock-data.d.ts +37 -0
- package/dist/src/examples/agent-control-plane-processes/summary-mock-data.d.ts.map +1 -0
- package/dist/src/examples/agent-control-plane-processes/summary-mock-data.js +53 -0
- package/dist/src/examples/agent-control-plane-processes/summary-mock-data.js.map +1 -0
- package/dist/src/examples/shared/DashboardSection.d.ts +9 -0
- package/dist/src/examples/shared/DashboardSection.d.ts.map +1 -0
- package/dist/src/examples/shared/DashboardSection.js +5 -0
- package/dist/src/examples/shared/DashboardSection.js.map +1 -0
- package/dist/src/examples/shared/DateRangePopover.d.ts +3 -0
- package/dist/src/examples/shared/DateRangePopover.d.ts.map +1 -0
- package/dist/src/examples/shared/DateRangePopover.js +35 -0
- package/dist/src/examples/shared/DateRangePopover.js.map +1 -0
- package/dist/src/examples/shared/agent-control-plane-nav.d.ts +4 -0
- package/dist/src/examples/shared/agent-control-plane-nav.d.ts.map +1 -0
- package/dist/src/examples/shared/agent-control-plane-nav.js +25 -0
- package/dist/src/examples/shared/agent-control-plane-nav.js.map +1 -0
- package/dist/src/examples/shared/date-range-utils.d.ts +10 -0
- package/dist/src/examples/shared/date-range-utils.d.ts.map +1 -0
- package/dist/src/examples/shared/date-range-utils.js +75 -0
- package/dist/src/examples/shared/date-range-utils.js.map +1 -0
- package/dist/src/icons/camunda-app-icons.d.ts +19 -0
- package/dist/src/icons/camunda-app-icons.d.ts.map +1 -0
- package/dist/src/icons/camunda-app-icons.js +26 -0
- package/dist/src/icons/camunda-app-icons.js.map +1 -0
- package/dist/src/icons/index.d.ts +1 -0
- package/dist/src/icons/index.d.ts.map +1 -1
- package/dist/src/icons/index.js +1 -0
- package/dist/src/icons/index.js.map +1 -1
- package/dist/src/index.d.ts +6 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -2
- package/dist/src/index.js.map +1 -1
- package/dist/styles.css +77 -25
- package/package.json +1 -1
- package/dist/src/examples/cost-dashboard/CostBreakdownChart.d.ts +0 -2
- package/dist/src/examples/cost-dashboard/CostBreakdownChart.d.ts.map +0 -1
- package/dist/src/examples/cost-dashboard/CostBreakdownChart.js +0 -21
- package/dist/src/examples/cost-dashboard/CostBreakdownChart.js.map +0 -1
- package/dist/src/examples/cost-dashboard/CostDashboardPage.d.ts +0 -2
- package/dist/src/examples/cost-dashboard/CostDashboardPage.d.ts.map +0 -1
- package/dist/src/examples/cost-dashboard/CostDashboardPage.js +0 -56
- package/dist/src/examples/cost-dashboard/CostDashboardPage.js.map +0 -1
- package/dist/src/examples/cost-dashboard/TrendChart.d.ts +0 -2
- package/dist/src/examples/cost-dashboard/TrendChart.d.ts.map +0 -1
- package/dist/src/examples/cost-dashboard/TrendChart.js +0 -19
- package/dist/src/examples/cost-dashboard/TrendChart.js.map +0 -1
- package/dist/src/examples/cost-dashboard/mock-data.d.ts +0 -34
- package/dist/src/examples/cost-dashboard/mock-data.d.ts.map +0 -1
- package/dist/src/examples/cost-dashboard/mock-data.js +0 -120
- package/dist/src/examples/cost-dashboard/mock-data.js.map +0 -1
- package/dist/src/examples/projects-list/ProjectsListPage.d.ts +0 -4
- package/dist/src/examples/projects-list/ProjectsListPage.d.ts.map +0 -1
- package/dist/src/examples/projects-list/ProjectsListPage.js +0 -58
- package/dist/src/examples/projects-list/ProjectsListPage.js.map +0 -1
- package/dist/src/examples/projects-list/mock-data.d.ts +0 -10
- package/dist/src/examples/projects-list/mock-data.d.ts.map +0 -1
- package/dist/src/examples/projects-list/mock-data.js +0 -83
- 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 {
|
|
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
|
-
|
|
46
|
-
|
|
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: [
|
|
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":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
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,72 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* One notification, as the consumer already has it.
|
|
4
|
+
*
|
|
5
|
+
* Presentational only: `timestamp` is a pre-formatted string, not a Date, because relative
|
|
6
|
+
* formatting is locale and library work that belongs with the consumer — the design system has
|
|
7
|
+
* no opinion on whether "2h ago" or "14:32" is right for a product.
|
|
8
|
+
*/
|
|
9
|
+
export interface NavNotification {
|
|
10
|
+
key: string;
|
|
11
|
+
title: string;
|
|
12
|
+
description?: React.ReactNode;
|
|
13
|
+
/** Pre-formatted by the consumer. */
|
|
14
|
+
timestamp?: string;
|
|
15
|
+
/** Unread notifications carry a marker and count toward the bell's badge. */
|
|
16
|
+
isRead?: boolean;
|
|
17
|
+
href?: string;
|
|
18
|
+
onClick?: () => void;
|
|
19
|
+
}
|
|
20
|
+
export interface NotificationBellProps {
|
|
21
|
+
/**
|
|
22
|
+
* Unread notifications. Rendered as a badge; counts above `maxCount` show as `9+`. The bell
|
|
23
|
+
* owns no state — pass the count you already hold.
|
|
24
|
+
*/
|
|
25
|
+
unreadCount?: number;
|
|
26
|
+
/** Highest number rendered literally. Default 9. */
|
|
27
|
+
maxCount?: number;
|
|
28
|
+
/** Accessible name for the trigger. Default "Notifications". */
|
|
29
|
+
label?: string;
|
|
30
|
+
/** Reflected as `aria-expanded`, for when the bell toggles a panel. */
|
|
31
|
+
isActive?: boolean;
|
|
32
|
+
onClick?: () => void;
|
|
33
|
+
className?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Notification bell, for `AppHeader.globalActions` (as an `element`) or anywhere a trigger fits.
|
|
37
|
+
*
|
|
38
|
+
* Split from the panel on purpose: the trigger belongs in the header's action row while the
|
|
39
|
+
* panel is an overlay, and a consumer may already own one of the two.
|
|
40
|
+
*/
|
|
41
|
+
export declare function NotificationBell({ unreadCount, maxCount, label, isActive, onClick, className, }: NotificationBellProps): React.JSX.Element;
|
|
42
|
+
export interface NotificationsPanelProps {
|
|
43
|
+
notifications: NavNotification[];
|
|
44
|
+
open: boolean;
|
|
45
|
+
onOpenChange: (open: boolean) => void;
|
|
46
|
+
/** Omit to render notifications without a per-item dismiss control. */
|
|
47
|
+
onDismiss?: (key: string) => void;
|
|
48
|
+
/** Panel heading. Default "Notifications". */
|
|
49
|
+
title?: string;
|
|
50
|
+
/** Shown when there is nothing to list. */
|
|
51
|
+
emptyMessage?: React.ReactNode;
|
|
52
|
+
/** Rendered in the panel header — e.g. a "Mark all as read" button. */
|
|
53
|
+
headerAction?: React.ReactNode;
|
|
54
|
+
/** Component used for notifications carrying an `href`. Default: a plain anchor. */
|
|
55
|
+
linkComponent?: React.ElementType;
|
|
56
|
+
className?: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Notification panel — a right-hand overlay listing what the consumer passes.
|
|
60
|
+
*
|
|
61
|
+
* Fetches nothing and stores nothing: `open` is controlled, because the trigger usually lives in
|
|
62
|
+
* the header and the panel does not, so one of the two has to own the state and it cannot be
|
|
63
|
+
* this one.
|
|
64
|
+
*
|
|
65
|
+
* **Mark notifications read from `onOpenChange(true)`.** The panel does not fire that write —
|
|
66
|
+
* it is a persisted mutation and the transport differs per product — but it is the agreed
|
|
67
|
+
* moment. Console's notification runtime deliberately leaves the timing here, and the same feed
|
|
68
|
+
* appears in several products: if one marks on open, another on click and a third only on an
|
|
69
|
+
* explicit action, the unread count means something different in each app.
|
|
70
|
+
*/
|
|
71
|
+
export declare function NotificationsPanel({ notifications, open, onOpenChange, onDismiss, title, emptyMessage, headerAction, linkComponent, className, }: NotificationsPanelProps): React.JSX.Element;
|
|
72
|
+
//# sourceMappingURL=notifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/notifications.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,WAAe,EACf,QAAY,EACZ,KAAuB,EACvB,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE,qBAAqB,qBA0CvB;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,uEAAuE;IACvE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,uEAAuE;IACvE,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,oFAAoF;IACpF,aAAa,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,aAAa,EACb,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,KAAuB,EACvB,YAA2C,EAC3C,YAAY,EACZ,aAAa,EACb,SAAS,GACV,EAAE,uBAAuB,qBAqCzB"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Bell, X } from "lucide-react";
|
|
5
|
+
import { cn } from "../../lib/utils.js";
|
|
6
|
+
import { Button } from "./button.js";
|
|
7
|
+
import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, } from "./sheet.js";
|
|
8
|
+
/**
|
|
9
|
+
* Notification bell, for `AppHeader.globalActions` (as an `element`) or anywhere a trigger fits.
|
|
10
|
+
*
|
|
11
|
+
* Split from the panel on purpose: the trigger belongs in the header's action row while the
|
|
12
|
+
* panel is an overlay, and a consumer may already own one of the two.
|
|
13
|
+
*/
|
|
14
|
+
export function NotificationBell({ unreadCount = 0, maxCount = 9, label = "Notifications", isActive, onClick, className, }) {
|
|
15
|
+
const hasUnread = unreadCount > 0;
|
|
16
|
+
const badgeText = unreadCount > maxCount ? `${maxCount}+` : `${unreadCount}`;
|
|
17
|
+
return (
|
|
18
|
+
// inline-flex, not block: the badge is positioned against this box, so it has to
|
|
19
|
+
// shrink-wrap the button or it anchors to the container's right edge instead.
|
|
20
|
+
_jsxs("div", { className: cn("relative inline-flex", className), children: [_jsx(Button, { variant: "ghost", size: "icon", "aria-label": hasUnread
|
|
21
|
+
? `${label}, ${unreadCount} unread`
|
|
22
|
+
: `${label}, none unread`, "aria-expanded": isActive, onClick: onClick, "data-slot": "notification-bell", children: _jsx(Bell, { "aria-hidden": true, className: "size-4" }) }), hasUnread ? (_jsx("span", { "aria-hidden": true, "data-slot": "notification-bell-badge", className: "pointer-events-none absolute -right-0.5 -top-0.5 flex size-4 items-center justify-center rounded-full bg-primary-action-default text-[0.625rem] leading-none text-primary-action-foreground", children: badgeText })) : null, _jsx("span", { "aria-live": "polite", className: "sr-only", children: hasUnread ? `${unreadCount} unread notifications` : "" })] }));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Notification panel — a right-hand overlay listing what the consumer passes.
|
|
26
|
+
*
|
|
27
|
+
* Fetches nothing and stores nothing: `open` is controlled, because the trigger usually lives in
|
|
28
|
+
* the header and the panel does not, so one of the two has to own the state and it cannot be
|
|
29
|
+
* this one.
|
|
30
|
+
*
|
|
31
|
+
* **Mark notifications read from `onOpenChange(true)`.** The panel does not fire that write —
|
|
32
|
+
* it is a persisted mutation and the transport differs per product — but it is the agreed
|
|
33
|
+
* moment. Console's notification runtime deliberately leaves the timing here, and the same feed
|
|
34
|
+
* appears in several products: if one marks on open, another on click and a third only on an
|
|
35
|
+
* explicit action, the unread count means something different in each app.
|
|
36
|
+
*/
|
|
37
|
+
export function NotificationsPanel({ notifications, open, onOpenChange, onDismiss, title = "Notifications", emptyMessage = "You have no notifications.", headerAction, linkComponent, className, }) {
|
|
38
|
+
const isEmpty = notifications.length === 0;
|
|
39
|
+
return (_jsx(Sheet, { open: open, onOpenChange: onOpenChange, children: _jsxs(SheetContent, { side: "right", "data-slot": "notifications-panel", className: cn("w-full sm:max-w-sm", className), children: [_jsxs(SheetHeader, { children: [_jsx(SheetTitle, { children: title }), isEmpty ? (_jsx(SheetDescription, { children: emptyMessage })) : (_jsx(SheetDescription, { className: "sr-only", children: `${notifications.length} notifications` })), headerAction] }), isEmpty ? null : (_jsx("ul", { className: "m-0 flex list-none flex-col gap-1 overflow-y-auto p-4 pt-0", children: notifications.map((notification) => (_jsx(NotificationRow, { notification: notification, onDismiss: onDismiss, linkComponent: linkComponent }, notification.key))) }))] }) }));
|
|
40
|
+
}
|
|
41
|
+
function NotificationRow({ notification, onDismiss, linkComponent, }) {
|
|
42
|
+
const { key, title, description, timestamp, isRead, href, onClick } = notification;
|
|
43
|
+
const isInteractive = href !== undefined || onClick !== undefined;
|
|
44
|
+
const LinkEl = linkComponent ?? "a";
|
|
45
|
+
const Body = href
|
|
46
|
+
? LinkEl
|
|
47
|
+
: isInteractive
|
|
48
|
+
? "button"
|
|
49
|
+
: "div";
|
|
50
|
+
return (_jsxs("li", { "data-slot": "notification-item", "data-read": isRead ? "true" : "false", className: "flex items-start gap-2 rounded-md p-2 hover:bg-neutral-background-medium", children: [_jsx("span", { "aria-hidden": true, className: cn("mt-1.5 size-2 shrink-0 rounded-full", isRead ? "bg-transparent" : "bg-primary-action-default") }), _jsxs(Body, { ...(href ? { href } : isInteractive ? { type: "button" } : {}), onClick: onClick, className: cn("min-w-0 flex-1 text-left", isInteractive &&
|
|
51
|
+
"rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: [_jsxs("span", { className: "block text-sm text-neutral-foreground-strong", children: [isRead ? null : _jsx("span", { className: "sr-only", children: "Unread. " }), title] }), description ? (_jsx("span", { className: "block text-sm text-neutral-foreground-subtle", children: description })) : null, timestamp ? (_jsx("span", { className: "block text-xs text-neutral-foreground-subtle", children: timestamp })) : null] }), onDismiss ? (_jsx(Button, { variant: "ghost", size: "icon-xs", "aria-label": `Dismiss ${title}`, onClick: () => onDismiss(key), className: "shrink-0 text-neutral-foreground-subtle", children: _jsx(X, {}) })) : null] }));
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../../../src/components/ui/notifications.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scorecard.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/scorecard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"scorecard.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/scorecard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IACnC,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC5C;AAED,UAAU,sBAAsB;IAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAiFD,iBAAS,SAAS,CAAC,EACjB,KAAK,EACL,OAAO,EACP,KAAK,EACL,KAAK,EACL,SAAS,EACT,MAAa,EACb,IAAgB,EAChB,OAAe,EACf,KAAa,EACb,YAAwB,EACxB,SAAS,GACV,EAAE,cAAc,qBAwDhB;AAED,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -6,22 +6,27 @@ import { Badge } from "./badge.js";
|
|
|
6
6
|
import { Card, CardHeader, CardTitle } from "./card.js";
|
|
7
7
|
import { Skeleton } from "./skeleton.js";
|
|
8
8
|
import { Sparkline } from "./sparkline.js";
|
|
9
|
-
function ScorecardBody({ label, tooltip, value, delta, sparkline, size, loading, empty, emptyMessage, }) {
|
|
9
|
+
function ScorecardBody({ label, tooltip, value, delta, sparkline, size, loading, empty, emptyMessage, asCard, }) {
|
|
10
10
|
if (loading) {
|
|
11
11
|
return (_jsxs(_Fragment, { children: [_jsx(Skeleton, { className: "h-4 w-24" }), _jsx(Skeleton, { className: cn("h-7 w-20", size === "sm" && "h-6 w-16") })] }));
|
|
12
12
|
}
|
|
13
|
-
const
|
|
14
|
-
? (delta.variant ?? (delta.direction === "up" ? "success" : "danger"))
|
|
15
|
-
: undefined;
|
|
16
|
-
const DeltaIcon = delta?.direction === "up" ? ArrowUpRight : ArrowDownRight;
|
|
13
|
+
const DeltaIcon = delta?.direction === "increase" ? ArrowUpRight : ArrowDownRight;
|
|
17
14
|
// `loading` is always false here — the branch above already returned
|
|
18
15
|
// before this point, so Sparkline never renders its own skeleton; the
|
|
19
16
|
// fixed two-block skeleton above is what represents loading for the tile.
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
// Bled flush to the Card's own edges via negative margins that cancel
|
|
18
|
+
// CardHeader's `px-4`/`px-3` and Card's own `py-4`/`py-3` — only correct
|
|
19
|
+
// when `asCard` actually wraps this content in that padding; the bare
|
|
20
|
+
// `<div>` (`asCard={false}`) has no padding of its own to cancel.
|
|
21
|
+
const sparklineElement = sparkline ? (_jsx(Sparkline, { data: sparkline.data, dataKey: sparkline.dataKey, loading: false, className: asCard
|
|
22
|
+
? "w-auto -mx-4 -mb-4 group-data-[size=sm]/card:-mx-3 group-data-[size=sm]/card:-mb-3"
|
|
23
|
+
: undefined })) : null;
|
|
24
|
+
return (_jsxs(_Fragment, { children: [_jsx(CardTitle, { tooltip: tooltip, className: "text-sm font-normal", children: label }), _jsx("div", { className: "flex min-w-0 items-center", children: _jsxs("span", { className: "inline-flex min-w-0 max-w-full items-center gap-2", children: [_jsx("span", { className: cn("min-w-0 truncate text-2xl font-semibold text-neutral-foreground-strong", size === "sm" && "text-xl"), children: empty ? emptyMessage : value }), !empty && delta && (_jsxs(Badge, { variant: delta.variant, className: "shrink-0", children: [_jsx(DeltaIcon, { "data-icon": "inline-start", "aria-hidden": "true" }), _jsx("span", { className: "sr-only", children: delta.direction === "increase"
|
|
25
|
+
? "Increased by "
|
|
26
|
+
: "Decreased by " }), delta.value] }))] }) }), !empty && sparklineElement] }));
|
|
22
27
|
}
|
|
23
28
|
function Scorecard({ label, tooltip, value, delta, sparkline, asCard = true, size = "default", loading = false, empty = false, emptyMessage = "No data", className, }) {
|
|
24
|
-
const content = (_jsx(ScorecardBody, { label: label, tooltip: tooltip, value: value, delta: delta, sparkline: sparkline, size: size, loading: loading, empty: empty, emptyMessage: emptyMessage }));
|
|
29
|
+
const content = (_jsx(ScorecardBody, { label: label, tooltip: tooltip, value: value, delta: delta, sparkline: sparkline, size: size, loading: loading, empty: empty, emptyMessage: emptyMessage, asCard: asCard }));
|
|
25
30
|
// Loading removes the title from the accessible tree (it becomes a
|
|
26
31
|
// Skeleton), so `aria-busy` alone would leave the busy region unnamed.
|
|
27
32
|
// `aria-label` alone isn't enough either: the root is a plain `<div>`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scorecard.js","sourceRoot":"","sources":["../../../../src/components/ui/scorecard.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5D,OAAO,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA2BxC,SAAS,aAAa,CAAC,EACrB,KAAK,EACL,OAAO,EACP,KAAK,EACL,KAAK,EACL,SAAS,EACT,IAAI,EACJ,OAAO,EACP,KAAK,EACL,YAAY,
|
|
1
|
+
{"version":3,"file":"scorecard.js","sourceRoot":"","sources":["../../../../src/components/ui/scorecard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ declare function SheetClose({ ...props }: React.ComponentProps<typeof SheetPrimi
|
|
|
7
7
|
declare function SheetPortal({ ...props }: React.ComponentProps<typeof SheetPrimitive.Portal>): React.JSX.Element;
|
|
8
8
|
declare function SheetOverlay({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Overlay>): React.JSX.Element;
|
|
9
9
|
declare const sheetVariants: (props?: ({
|
|
10
|
-
side?: "
|
|
10
|
+
side?: "bottom" | "left" | "right" | "top" | null | undefined;
|
|
11
11
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
12
12
|
declare function SheetContent({ className, children, side, showCloseButton, onOpenAutoFocus, onCloseAutoFocus, restoreFocusRef, ...props }: React.ComponentProps<typeof SheetPrimitive.Content> & VariantProps<typeof sheetVariants> & {
|
|
13
13
|
showCloseButton?: boolean;
|