@mastra/playground-ui 63.1.0-alpha.2 → 63.1.0-alpha.3
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/components/ContentBlocks.cjs.js +6 -2
- package/dist/components/ContentBlocks.cjs.js.map +1 -1
- package/dist/components/ContentBlocks.es.js +6 -2
- package/dist/components/ContentBlocks.es.js.map +1 -1
- package/dist/components/DataList.cjs.js +17 -15
- package/dist/components/DataList.cjs.js.map +1 -1
- package/dist/components/DataList.es.js +5 -4
- package/dist/components/DataList.es.js.map +1 -1
- package/dist/components/DateTimeRangePicker.cjs.js +1 -1
- package/dist/components/DateTimeRangePicker.es.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
- package/dist/components/FilterBar.cjs.js +3 -1
- package/dist/components/FilterBar.cjs.js.map +1 -1
- package/dist/components/FilterBar.es.js +4 -2
- package/dist/components/FilterBar.es.js.map +1 -1
- package/dist/components/LogsDataList.cjs.js +2 -5
- package/dist/components/LogsDataList.cjs.js.map +1 -1
- package/dist/components/LogsDataList.es.js +2 -5
- package/dist/components/LogsDataList.es.js.map +1 -1
- package/dist/components/SavedViews.cjs.js +1 -1
- package/dist/components/SavedViews.es.js +1 -1
- package/dist/components/Sidebar.cjs.js +33 -0
- package/dist/components/Sidebar.cjs.js.map +1 -1
- package/dist/components/Sidebar.es.js +33 -1
- package/dist/components/Sidebar.es.js.map +1 -1
- package/dist/data-list-CsS-lf01.js +138 -0
- package/dist/data-list-CsS-lf01.js.map +1 -0
- package/dist/data-list-D6J5xPq9.cjs +142 -0
- package/dist/data-list-D6J5xPq9.cjs.map +1 -0
- package/dist/{data-list-skeleton-C9Zm5XMX.js → data-list-skeleton-BytOffUO.js} +2 -2
- package/dist/{data-list-skeleton-C9Zm5XMX.js.map → data-list-skeleton-BytOffUO.js.map} +1 -1
- package/dist/{data-list-skeleton-C-j6Sf0F.cjs → data-list-skeleton-HmAfNH0v.cjs} +6 -6
- package/dist/{data-list-skeleton-C-j6Sf0F.cjs.map → data-list-skeleton-HmAfNH0v.cjs.map} +1 -1
- package/dist/data-list-spacer-BFA58pwr.cjs +218 -0
- package/dist/data-list-spacer-BFA58pwr.cjs.map +1 -0
- package/dist/data-list-spacer-BO-O0H6O.js +209 -0
- package/dist/data-list-spacer-BO-O0H6O.js.map +1 -0
- package/dist/{data-list-2svaWtkq.cjs → data-list-top-DOSUdqnN.cjs} +17 -340
- package/dist/data-list-top-DOSUdqnN.cjs.map +1 -0
- package/dist/{data-list-BbOYiz4B.js → data-list-top-vN4fkFqY.js} +9 -333
- package/dist/data-list-top-vN4fkFqY.js.map +1 -0
- package/dist/{date-time-range-picker-BT9qan60.js → date-time-range-picker-B9me2TUa.js} +21 -4
- package/dist/date-time-range-picker-B9me2TUa.js.map +1 -0
- package/dist/{date-time-range-picker-DQa5XLST.cjs → date-time-range-picker-CyoaOAsi.cjs} +21 -4
- package/dist/date-time-range-picker-CyoaOAsi.cjs.map +1 -0
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +1 -2
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +1 -2
- package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
- package/dist/domains/logs/components/logs-list-view.cjs.js +2 -3
- package/dist/domains/logs/components/logs-list-view.cjs.js.map +1 -1
- package/dist/domains/logs/components/logs-list-view.es.js +2 -3
- package/dist/domains/logs/components/logs-list-view.es.js.map +1 -1
- package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
- package/dist/domains/metrics/drilldown.cjs.js +1 -1
- package/dist/domains/metrics/drilldown.es.js +1 -1
- package/dist/domains/metrics/metrics-filters.cjs.js +1 -1
- package/dist/domains/metrics/metrics-filters.es.js +1 -1
- package/dist/domains/scores/components/trace-scores-tab.cjs.js +1 -2
- package/dist/domains/scores/components/trace-scores-tab.cjs.js.map +1 -1
- package/dist/domains/scores/components/trace-scores-tab.es.js +1 -2
- package/dist/domains/scores/components/trace-scores-tab.es.js.map +1 -1
- package/dist/domains/traces/components/thread-view-by-trace.cjs.js +3 -2
- package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
- package/dist/domains/traces/components/thread-view-by-trace.es.js +3 -2
- package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.cjs.js +1 -2
- package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.es.js +1 -2
- package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
- package/dist/domains/traces/components/trace-time-range-chip.cjs.js +3 -3
- package/dist/domains/traces/components/trace-time-range-chip.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-time-range-chip.es.js +3 -3
- package/dist/domains/traces/components/trace-time-range-chip.es.js.map +1 -1
- package/dist/domains/traces/components/traces-error-content.cjs.js +1 -1
- package/dist/domains/traces/components/traces-error-content.es.js +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +5 -4
- package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.es.js +4 -3
- package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js +1 -4
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js +1 -4
- package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-filter-persistence.cjs.js +1 -1
- package/dist/domains/traces/hooks/use-trace-filter-persistence.es.js +1 -1
- package/dist/domains/traces/hooks/use-trace-url-state.cjs.js +1 -1
- package/dist/domains/traces/hooks/use-trace-url-state.es.js +1 -1
- package/dist/domains/traces/hooks/use-traces-list-source.cjs.js +15 -3
- package/dist/domains/traces/hooks/use-traces-list-source.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-traces-list-source.es.js +13 -4
- package/dist/domains/traces/hooks/use-traces-list-source.es.js.map +1 -1
- package/dist/domains/traces/trace-filters.cjs.js +1 -1
- package/dist/domains/traces/trace-filters.es.js +1 -1
- package/dist/domains/traces/trace-query-filters.cjs.js +1 -3
- package/dist/domains/traces/trace-query-filters.cjs.js.map +1 -1
- package/dist/domains/traces/trace-query-filters.es.js +1 -1
- package/dist/domains/traces.cjs.js +1 -3
- package/dist/domains/traces.cjs.js.map +1 -1
- package/dist/domains/traces.es.js +1 -1
- package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +2 -2
- package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +2 -2
- package/dist/ee/signals/components/entity-index-list.cjs.js +1 -3
- package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +1 -3
- package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +1 -3
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +1 -3
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
- package/dist/{errors-BiY55qIh.cjs → errors-7WFF-9EC.cjs} +3 -2
- package/dist/errors-7WFF-9EC.cjs.map +1 -0
- package/dist/{errors-CDTokuME.js → errors-BFVXW8Dr.js} +3 -2
- package/dist/errors-BFVXW8Dr.js.map +1 -0
- package/dist/{filter-bar-chip-BBErw_aR.cjs → filter-bar-chip-CYCOeX1B.cjs} +8 -4
- package/dist/filter-bar-chip-CYCOeX1B.cjs.map +1 -0
- package/dist/{filter-bar-chip-DvRTWRwT.js → filter-bar-chip-U55TxGOw.js} +8 -4
- package/dist/filter-bar-chip-U55TxGOw.js.map +1 -0
- package/dist/hooks/use-local-storage-store.cjs.js +71 -0
- package/dist/hooks/use-local-storage-store.cjs.js.map +1 -0
- package/dist/hooks/use-local-storage-store.d.ts +2 -0
- package/dist/hooks/use-local-storage-store.es.js +66 -0
- package/dist/hooks/use-local-storage-store.es.js.map +1 -0
- package/dist/layout/tabbed-container.cjs.js +1 -1
- package/dist/layout/tabbed-container.es.js +1 -1
- package/dist/{logs-data-list-0_z4s0Sj.js → logs-data-list-BqUgmvMm.js} +3 -2
- package/dist/{logs-data-list-0_z4s0Sj.js.map → logs-data-list-BqUgmvMm.js.map} +1 -1
- package/dist/{logs-data-list-D4sVbF23.cjs → logs-data-list-CCrhko5Z.cjs} +22 -21
- package/dist/{logs-data-list-D4sVbF23.cjs.map → logs-data-list-CCrhko5Z.cjs.map} +1 -1
- package/dist/src/domains/traces/components/trace-time-range-chip.d.ts +1 -1
- package/dist/src/domains/traces/hooks/use-traces-list-source.d.ts +6 -0
- package/dist/src/domains/traces/trace-query-filters.d.ts +0 -11
- package/dist/src/ds/components/ContentBlocks/content-blocks.d.ts +3 -2
- package/dist/src/ds/components/DataList/shared.d.ts +4 -4
- package/dist/src/ds/components/DateTimeRangePicker/custom-range-editor.d.ts +3 -1
- package/dist/src/ds/components/DateTimeRangePicker/date-time-range-picker.d.ts +3 -1
- package/dist/src/ds/components/FilterBar/filter-bar-context.d.ts +11 -1
- package/dist/src/ds/components/FilterBar/filter-bar.d.ts +6 -1
- package/dist/src/ds/components/Sidebar/index.d.ts +1 -0
- package/dist/src/ds/components/Sidebar/nav/sidebar-nav-show-more.d.ts +9 -0
- package/dist/src/ds/components/Sidebar/sidebar.d.ts +2 -0
- package/dist/src/hooks/use-local-storage-store.d.ts +15 -0
- package/dist/style.css +20 -0
- package/dist/{trace-filters-C71gmCq4.js → trace-filters-C91h9X86.js} +2 -10
- package/dist/trace-filters-C91h9X86.js.map +1 -0
- package/dist/{trace-filters-Bh4dVNPX.cjs → trace-filters-Dz4oj8yV.cjs} +1 -11
- package/dist/trace-filters-Dz4oj8yV.cjs.map +1 -0
- package/dist/{traces-data-list-C05UwTiE.js → traces-data-list-B7Dzi7oZ.js} +4 -2
- package/dist/{traces-data-list-C05UwTiE.js.map → traces-data-list-B7Dzi7oZ.js.map} +1 -1
- package/dist/{traces-data-list-DPA5T14k.cjs → traces-data-list-Caf2XZDu.cjs} +19 -17
- package/dist/{traces-data-list-DPA5T14k.cjs.map → traces-data-list-Caf2XZDu.cjs.map} +1 -1
- package/dist/utils/errors.cjs.js +1 -1
- package/dist/utils/errors.es.js +1 -1
- package/package.json +8 -8
- package/dist/data-list-2svaWtkq.cjs.map +0 -1
- package/dist/data-list-BbOYiz4B.js.map +0 -1
- package/dist/date-time-range-picker-BT9qan60.js.map +0 -1
- package/dist/date-time-range-picker-DQa5XLST.cjs.map +0 -1
- package/dist/errors-BiY55qIh.cjs.map +0 -1
- package/dist/errors-CDTokuME.js.map +0 -1
- package/dist/filter-bar-chip-BBErw_aR.cjs.map +0 -1
- package/dist/filter-bar-chip-DvRTWRwT.js.map +0 -1
- package/dist/trace-filters-Bh4dVNPX.cjs.map +0 -1
- package/dist/trace-filters-C71gmCq4.js.map +0 -1
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
const utils_cn = require('./cn-TqD01zH-.cjs');
|
|
5
|
+
const Txt = require('./Txt-DXjXpX9r.cjs');
|
|
6
|
+
const React = require('react');
|
|
7
|
+
const dataListTop = require('./data-list-top-DOSUdqnN.cjs');
|
|
8
|
+
const primitives_fluidMenu = require('./primitives/fluid-menu.cjs.js');
|
|
9
|
+
const primitives_transitions = require('./primitives/transitions.cjs.js');
|
|
10
|
+
const lucideReact = require('lucide-react');
|
|
11
|
+
const Button = require('./Button-CAVPKK09.cjs');
|
|
12
|
+
|
|
13
|
+
function DataListNextPageLoading({
|
|
14
|
+
isLoading,
|
|
15
|
+
setEndOfListElement,
|
|
16
|
+
hasMore,
|
|
17
|
+
loadingText = "Loading more data..."
|
|
18
|
+
}) {
|
|
19
|
+
if (!setEndOfListElement) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
23
|
+
"div",
|
|
24
|
+
{
|
|
25
|
+
ref: setEndOfListElement,
|
|
26
|
+
className: utils_cn.cn("col-span-full -mt-px flex justify-center text-body text-muted-foreground opacity-50", {
|
|
27
|
+
"py-4": isLoading
|
|
28
|
+
}),
|
|
29
|
+
children: isLoading && loadingText
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function DataListNoMatch({
|
|
35
|
+
message = "Nothing matches your search",
|
|
36
|
+
className,
|
|
37
|
+
...props
|
|
38
|
+
}) {
|
|
39
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
40
|
+
"div",
|
|
41
|
+
{
|
|
42
|
+
className: utils_cn.cn(
|
|
43
|
+
"col-span-full flex flex-col items-center justify-center gap-2 rounded-lg bg-background py-8 text-muted-foreground",
|
|
44
|
+
className
|
|
45
|
+
),
|
|
46
|
+
...props,
|
|
47
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(Txt.Txt, { children: message })
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const DataListRowWrapperContext = React.createContext(false);
|
|
53
|
+
function useDataListRowWrapperContext() {
|
|
54
|
+
return React.useContext(DataListRowWrapperContext);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const DataListRowButton = React.forwardRef(
|
|
58
|
+
({ children, className, type = "button", colStart, colEnd, featured, variant, style, ...rest }, ref) => {
|
|
59
|
+
const isWrapped = useDataListRowWrapperContext();
|
|
60
|
+
const fluidRef = primitives_fluidMenu.useFluidMenuItemRef(ref);
|
|
61
|
+
const hasColumnOverride = colStart !== void 0 || colEnd !== void 0;
|
|
62
|
+
const cellsClass = hasColumnOverride ? void 0 : "data-list-cells";
|
|
63
|
+
const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;
|
|
64
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
65
|
+
"button",
|
|
66
|
+
{
|
|
67
|
+
ref: isWrapped ? ref : fluidRef,
|
|
68
|
+
type,
|
|
69
|
+
className: utils_cn.cn(
|
|
70
|
+
...isWrapped ? dataListTop.dataListRowInteractiveStyles : dataListTop.dataListRowStyles,
|
|
71
|
+
cellsClass,
|
|
72
|
+
"text-left",
|
|
73
|
+
className
|
|
74
|
+
),
|
|
75
|
+
style: resolvedStyle,
|
|
76
|
+
"data-featured": featured || void 0,
|
|
77
|
+
"data-variant": variant ?? "default",
|
|
78
|
+
...rest,
|
|
79
|
+
children
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
DataListRowButton.displayName = "DataListRowButton";
|
|
85
|
+
|
|
86
|
+
const DataListRowLink = React.forwardRef(
|
|
87
|
+
({ children, to, className, style, LinkComponent: Link = "a", colStart, colEnd, featured, variant, ...rest }, ref) => {
|
|
88
|
+
const isWrapped = useDataListRowWrapperContext();
|
|
89
|
+
const fluidRef = primitives_fluidMenu.useFluidMenuItemRef(ref);
|
|
90
|
+
const hasColumnOverride = colStart !== void 0 || colEnd !== void 0;
|
|
91
|
+
const cellsClass = hasColumnOverride ? void 0 : "data-list-cells";
|
|
92
|
+
const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;
|
|
93
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
94
|
+
Link,
|
|
95
|
+
{
|
|
96
|
+
ref: isWrapped ? ref : fluidRef,
|
|
97
|
+
href: to,
|
|
98
|
+
className: utils_cn.cn(...isWrapped ? dataListTop.dataListRowInteractiveStyles : dataListTop.dataListRowStyles, cellsClass, className),
|
|
99
|
+
style: resolvedStyle,
|
|
100
|
+
"data-featured": featured || void 0,
|
|
101
|
+
"data-variant": variant ?? "default",
|
|
102
|
+
...rest,
|
|
103
|
+
children
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
DataListRowLink.displayName = "DataListRowLink";
|
|
109
|
+
|
|
110
|
+
const DataListRowWrapper = React.forwardRef(
|
|
111
|
+
({ children, className, onSelectRow, onClick, onKeyDown, tabIndex, ...rest }, ref) => {
|
|
112
|
+
const isSelectable = onSelectRow !== void 0;
|
|
113
|
+
const rowRef = primitives_fluidMenu.useFluidMenuItemRef(ref);
|
|
114
|
+
const handleClick = (event) => {
|
|
115
|
+
onClick?.(event);
|
|
116
|
+
if (!isSelectable || event.defaultPrevented) return;
|
|
117
|
+
onSelectRow();
|
|
118
|
+
};
|
|
119
|
+
const handleKeyDown = (event) => {
|
|
120
|
+
onKeyDown?.(event);
|
|
121
|
+
if (!isSelectable || event.defaultPrevented) return;
|
|
122
|
+
if (event.key === "Enter" && event.target === event.currentTarget) {
|
|
123
|
+
event.preventDefault();
|
|
124
|
+
onSelectRow();
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DataListRowWrapperContext.Provider, { value: true, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
128
|
+
"div",
|
|
129
|
+
{
|
|
130
|
+
ref: rowRef,
|
|
131
|
+
tabIndex: tabIndex ?? (isSelectable ? 0 : void 0),
|
|
132
|
+
className: utils_cn.cn(
|
|
133
|
+
"grid grid-cols-subgrid gap-0",
|
|
134
|
+
...dataListTop.dataListRowOuterStyles,
|
|
135
|
+
...dataListTop.dataListRowStateStyles,
|
|
136
|
+
isSelectable && utils_cn.cn("cursor-pointer", primitives_transitions.focusRingInset),
|
|
137
|
+
className
|
|
138
|
+
),
|
|
139
|
+
onClick: handleClick,
|
|
140
|
+
onKeyDown: handleKeyDown,
|
|
141
|
+
...rest,
|
|
142
|
+
children
|
|
143
|
+
}
|
|
144
|
+
) });
|
|
145
|
+
}
|
|
146
|
+
);
|
|
147
|
+
DataListRowWrapper.displayName = "DataListRowWrapper";
|
|
148
|
+
|
|
149
|
+
const sortIcons = {
|
|
150
|
+
asc: lucideReact.ArrowUp,
|
|
151
|
+
desc: lucideReact.ArrowDown,
|
|
152
|
+
none: lucideReact.ArrowUpDown
|
|
153
|
+
};
|
|
154
|
+
const sortLabels = {
|
|
155
|
+
asc: "ascending",
|
|
156
|
+
desc: "descending"
|
|
157
|
+
};
|
|
158
|
+
const sortAnimations = {
|
|
159
|
+
asc: "animate-sort-arrow-up",
|
|
160
|
+
desc: "animate-sort-arrow-down"
|
|
161
|
+
};
|
|
162
|
+
const sortTooltips = {
|
|
163
|
+
asc: "Asc",
|
|
164
|
+
desc: "Desc",
|
|
165
|
+
none: "Sort"
|
|
166
|
+
};
|
|
167
|
+
function DataListSortableTopCell({
|
|
168
|
+
children,
|
|
169
|
+
sortKey,
|
|
170
|
+
sort,
|
|
171
|
+
onSortChange,
|
|
172
|
+
align = "start",
|
|
173
|
+
className,
|
|
174
|
+
...props
|
|
175
|
+
}) {
|
|
176
|
+
const next = sort === "asc" ? "desc" : "asc";
|
|
177
|
+
const SortIcon = sortIcons[sort ?? "none"];
|
|
178
|
+
const label = typeof children === "string" ? children : sortKey;
|
|
179
|
+
const current = sort ? `sorted ${sortLabels[sort]}` : "not sorted";
|
|
180
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
181
|
+
dataListTop.DataListTopCell,
|
|
182
|
+
{
|
|
183
|
+
"data-sort": sort ?? "none",
|
|
184
|
+
className: utils_cn.cn("gap-1 overflow-visible", align === "end" && "flex-row-reverse", className),
|
|
185
|
+
...props,
|
|
186
|
+
children: [
|
|
187
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", children }),
|
|
188
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
189
|
+
Button.Button,
|
|
190
|
+
{
|
|
191
|
+
variant: "ghost",
|
|
192
|
+
size: "icon-sm",
|
|
193
|
+
"aria-label": `${label}, ${current}, sort ${sortLabels[next]}`,
|
|
194
|
+
tooltip: sortTooltips[sort ?? "none"],
|
|
195
|
+
onClick: () => onSortChange(next, sortKey),
|
|
196
|
+
className: utils_cn.cn("shrink-0", sort ? "text-foreground" : "text-muted-foreground"),
|
|
197
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(SortIcon, { className: sort && sortAnimations[sort] }, sort ?? "none")
|
|
198
|
+
}
|
|
199
|
+
)
|
|
200
|
+
]
|
|
201
|
+
}
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function DataListSpacer({ height }) {
|
|
206
|
+
if (height <= 0) return null;
|
|
207
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-full", style: { height } });
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
exports.DataListNextPageLoading = DataListNextPageLoading;
|
|
211
|
+
exports.DataListNoMatch = DataListNoMatch;
|
|
212
|
+
exports.DataListRowButton = DataListRowButton;
|
|
213
|
+
exports.DataListRowLink = DataListRowLink;
|
|
214
|
+
exports.DataListRowWrapper = DataListRowWrapper;
|
|
215
|
+
exports.DataListSortableTopCell = DataListSortableTopCell;
|
|
216
|
+
exports.DataListSpacer = DataListSpacer;
|
|
217
|
+
exports.useDataListRowWrapperContext = useDataListRowWrapperContext;
|
|
218
|
+
//# sourceMappingURL=data-list-spacer-BFA58pwr.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-list-spacer-BFA58pwr.cjs","sources":["../src/ds/components/DataList/data-list-next-page-loading.tsx","../src/ds/components/DataList/data-list-no-match.tsx","../src/ds/components/DataList/data-list-row-wrapper-context.ts","../src/ds/components/DataList/data-list-row-button.tsx","../src/ds/components/DataList/data-list-row-link.tsx","../src/ds/components/DataList/data-list-row-wrapper.tsx","../src/ds/components/DataList/data-list-sortable-top-cell.tsx","../src/ds/components/DataList/data-list-spacer.tsx"],"sourcesContent":["import { cn } from '@/lib/utils';\n\nexport type DataListNextPageLoadingProps = {\n isLoading?: boolean;\n hasMore?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n loadingText?: string;\n};\n\nexport function DataListNextPageLoading({\n isLoading,\n setEndOfListElement,\n hasMore,\n loadingText = 'Loading more data...',\n}: DataListNextPageLoadingProps) {\n if (!setEndOfListElement) {\n return null;\n }\n\n return (\n <div\n ref={setEndOfListElement}\n // Zero-height when idle so it adds no trailing space below the last row;\n // IntersectionObserver still fires for a zero-area target at the viewport edge.\n className={cn('col-span-full -mt-px flex justify-center text-body text-muted-foreground opacity-50', {\n 'py-4': isLoading,\n })}\n >\n {isLoading && loadingText}\n </div>\n );\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport type DataListNoMatchProps = ComponentPropsWithoutRef<'div'> & {\n message?: string;\n};\n\nexport function DataListNoMatch({\n message = 'Nothing matches your search',\n className,\n ...props\n}: DataListNoMatchProps) {\n return (\n <div\n className={cn(\n 'col-span-full flex flex-col items-center justify-center gap-2 rounded-lg bg-background py-8 text-muted-foreground',\n className,\n )}\n {...props}\n >\n <Txt>{message}</Txt>\n </div>\n );\n}\n","import { createContext, useContext } from 'react';\n\nexport const DataListRowWrapperContext = createContext(false);\n\nexport function useDataListRowWrapperContext() {\n return useContext(DataListRowWrapperContext);\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { useDataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowInteractiveStyles, dataListRowStyles } from './shared';\nimport type { DataListRowSharedProps } from './shared';\nimport { useFluidMenuItemRef } from '@/ds/primitives/fluid-menu';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowButtonProps = ComponentPropsWithoutRef<'button'> & DataListRowSharedProps;\n\n/**\n * Forwarded ref + spread props so virtualizers (`useVirtualizer.measureElement`)\n * can attach a ref and `data-index` to each rendered row.\n */\nexport const DataListRowButton = forwardRef<HTMLButtonElement, DataListRowButtonProps>(\n ({ children, className, type = 'button', colStart, colEnd, featured, variant, style, ...rest }, ref) => {\n const isWrapped = useDataListRowWrapperContext();\n // Standalone rows register with the root's fluid hover; wrapped ones let the wrapper do it.\n const fluidRef = useFluidMenuItemRef(ref);\n const hasColumnOverride = colStart !== undefined || colEnd !== undefined;\n const cellsClass = hasColumnOverride ? undefined : 'data-list-cells';\n const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;\n return (\n <button\n ref={isWrapped ? ref : fluidRef}\n type={type}\n className={cn(\n ...(isWrapped ? dataListRowInteractiveStyles : dataListRowStyles),\n cellsClass,\n 'text-left',\n className,\n )}\n style={resolvedStyle}\n data-featured={featured || undefined}\n data-variant={variant ?? 'default'}\n {...rest}\n >\n {children}\n </button>\n );\n },\n);\n\nDataListRowButton.displayName = 'DataListRowButton';\n","import { forwardRef } from 'react';\nimport type { CSSProperties, ComponentPropsWithoutRef, ReactNode } from 'react';\nimport { useDataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowInteractiveStyles, dataListRowStyles } from './shared';\nimport type { DataListRowSharedProps } from './shared';\nimport { useFluidMenuItemRef } from '@/ds/primitives/fluid-menu';\nimport type { LinkComponent } from '@/ds/types/link-component';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowLinkProps = DataListRowSharedProps & {\n children: ReactNode;\n to: string;\n className?: string;\n style?: CSSProperties;\n LinkComponent?: LinkComponent;\n} & Omit<ComponentPropsWithoutRef<'a'>, 'href' | 'children' | 'className' | 'style'>;\n\nexport const DataListRowLink = forwardRef<HTMLAnchorElement, DataListRowLinkProps>(\n (\n { children, to, className, style, LinkComponent: Link = 'a', colStart, colEnd, featured, variant, ...rest },\n ref,\n ) => {\n const isWrapped = useDataListRowWrapperContext();\n // Standalone rows register with the root's fluid hover; wrapped ones let the wrapper do it.\n const fluidRef = useFluidMenuItemRef(ref);\n const hasColumnOverride = colStart !== undefined || colEnd !== undefined;\n const cellsClass = hasColumnOverride ? undefined : 'data-list-cells';\n const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;\n return (\n <Link\n ref={isWrapped ? ref : fluidRef}\n href={to}\n className={cn(...(isWrapped ? dataListRowInteractiveStyles : dataListRowStyles), cellsClass, className)}\n style={resolvedStyle}\n data-featured={featured || undefined}\n data-variant={variant ?? 'default'}\n {...rest}\n >\n {children}\n </Link>\n );\n },\n);\n\nDataListRowLink.displayName = 'DataListRowLink';\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef, KeyboardEvent, MouseEvent } from 'react';\nimport { DataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowOuterStyles, dataListRowStateStyles } from './shared';\nimport { useFluidMenuItemRef } from '@/ds/primitives/fluid-menu';\nimport { focusRingInset } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowWrapperProps = ComponentPropsWithoutRef<'div'> & {\n /**\n * Makes the whole wrapper the row's activation target: it becomes focusable\n * (`tabIndex=0` unless overridden, e.g. by `getRowProps`), and a click or\n * Enter on the wrapper itself calls this. Descendants that must not activate\n * the row (the inner link, popover triggers, action buttons) should call\n * `event.stopPropagation()` on their click.\n */\n onSelectRow?: () => void;\n};\n\n/**\n * Grid wrapper used to host a leading or trailing cell (e.g. a selection\n * checkbox or row actions) alongside a `DataList.RowButton` / `RowLink`.\n *\n * Without `onSelectRow` it is non-interactive: hover/focus/click only apply to\n * the nested row primitive. With `onSelectRow` the wrapper itself becomes the\n * click / Enter target so the entire row (including trailing cells) activates.\n * For standalone interactive rows, use `DataList.RowButton` directly.\n *\n * Carries the `.data-list-row` marker so root-level row styling behaves the\n * same in wrapped and standalone rows.\n */\nexport const DataListRowWrapper = forwardRef<HTMLDivElement, DataListRowWrapperProps>(\n ({ children, className, onSelectRow, onClick, onKeyDown, tabIndex, ...rest }, ref) => {\n const isSelectable = onSelectRow !== undefined;\n // The wrapper is the `.data-list-row` element, so it (not the nested\n // RowButton/RowLink) registers with the root's fluid hover.\n const rowRef = useFluidMenuItemRef(ref);\n\n const handleClick = (event: MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (!isSelectable || event.defaultPrevented) return;\n onSelectRow();\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (!isSelectable || event.defaultPrevented) return;\n // Only when the wrapper itself is focused. A focused descendant (the\n // link) receiving Enter fires its own native click; handling it here too\n // would activate the row twice.\n if (event.key === 'Enter' && event.target === event.currentTarget) {\n event.preventDefault();\n onSelectRow();\n }\n };\n\n return (\n <DataListRowWrapperContext.Provider value>\n <div\n ref={rowRef}\n tabIndex={tabIndex ?? (isSelectable ? 0 : undefined)}\n className={cn(\n 'grid grid-cols-subgrid gap-0',\n ...dataListRowOuterStyles,\n ...dataListRowStateStyles,\n isSelectable && cn('cursor-pointer', focusRingInset),\n className,\n )}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {children}\n </div>\n </DataListRowWrapperContext.Provider>\n );\n },\n);\n\nDataListRowWrapper.displayName = 'DataListRowWrapper';\n","import { ArrowDown, ArrowUp, ArrowUpDown } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { DataListTopCell } from './data-list-top-cell';\nimport type { DataListTopCellProps } from './data-list-top-cell';\nimport { Button } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nexport type DataListSort = 'asc' | 'desc';\n\nconst sortIcons = {\n asc: ArrowUp,\n desc: ArrowDown,\n none: ArrowUpDown,\n};\n\nconst sortLabels = {\n asc: 'ascending',\n desc: 'descending',\n};\n\nconst sortAnimations = {\n asc: 'animate-sort-arrow-up',\n desc: 'animate-sort-arrow-down',\n};\n\nconst sortTooltips = {\n asc: 'Asc',\n desc: 'Desc',\n none: 'Sort',\n};\n\nexport type DataListSortableTopCellProps<K extends string = string> = Omit<\n DataListTopCellProps,\n 'aria-sort' | 'as' | 'children' | 'onClick'\n> & {\n children: ReactNode;\n sortKey: K;\n sort?: DataListSort;\n onSortChange: (sort: DataListSort, key: K) => void;\n align?: 'start' | 'end';\n};\n\nexport function DataListSortableTopCell<K extends string = string>({\n children,\n sortKey,\n sort,\n onSortChange,\n align = 'start',\n className,\n ...props\n}: DataListSortableTopCellProps<K>) {\n const next: DataListSort = sort === 'asc' ? 'desc' : 'asc';\n const SortIcon = sortIcons[sort ?? 'none'];\n const label = typeof children === 'string' ? children : sortKey;\n const current = sort ? `sorted ${sortLabels[sort]}` : 'not sorted';\n\n return (\n <DataListTopCell\n data-sort={sort ?? 'none'}\n className={cn('gap-1 overflow-visible', align === 'end' && 'flex-row-reverse', className)}\n {...props}\n >\n <span className=\"min-w-0 truncate\">{children}</span>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={`${label}, ${current}, sort ${sortLabels[next]}`}\n tooltip={sortTooltips[sort ?? 'none']}\n onClick={() => onSortChange(next, sortKey)}\n className={cn('shrink-0', sort ? 'text-foreground' : 'text-muted-foreground')}\n >\n <SortIcon key={sort ?? 'none'} className={sort && sortAnimations[sort]} />\n </Button>\n </DataListTopCell>\n );\n}\n","export type DataListSpacerProps = {\n /** Pixel height of the spacer. Pass 0 to render nothing. */\n height: number;\n};\n\n/**\n * Pads top/bottom of the visible window when virtualizing — preserves the\n * grid's total scroll height for the rows that aren't currently rendered.\n * Spans the full grid width so it doesn't disturb column layout.\n */\nexport function DataListSpacer({ height }: DataListSpacerProps) {\n if (height <= 0) return null;\n return <div className=\"col-span-full\" style={{ height }} />;\n}\n"],"names":["jsx","cn","Txt","createContext","useContext","forwardRef","useFluidMenuItemRef","dataListRowInteractiveStyles","dataListRowStyles","dataListRowOuterStyles","dataListRowStateStyles","focusRingInset","ArrowUp","ArrowDown","ArrowUpDown","jsxs","DataListTopCell","Button"],"mappings":"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"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { c as cn } from './cn-coERSHz5.js';
|
|
3
|
+
import { T as Txt } from './Txt-BuzYj7Vy.js';
|
|
4
|
+
import { useContext, createContext, forwardRef } from 'react';
|
|
5
|
+
import { u as dataListRowInteractiveStyles, v as dataListRowStyles, d as dataListRowOuterStyles, w as dataListRowStateStyles, b as DataListTopCell } from './data-list-top-vN4fkFqY.js';
|
|
6
|
+
import { useFluidMenuItemRef } from './primitives/fluid-menu.es.js';
|
|
7
|
+
import { focusRingInset } from './primitives/transitions.es.js';
|
|
8
|
+
import { ArrowUpDown, ArrowDown, ArrowUp } from 'lucide-react';
|
|
9
|
+
import { B as Button } from './Button-60jVnaHt.js';
|
|
10
|
+
|
|
11
|
+
function DataListNextPageLoading({
|
|
12
|
+
isLoading,
|
|
13
|
+
setEndOfListElement,
|
|
14
|
+
hasMore,
|
|
15
|
+
loadingText = "Loading more data..."
|
|
16
|
+
}) {
|
|
17
|
+
if (!setEndOfListElement) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
return /* @__PURE__ */ jsx(
|
|
21
|
+
"div",
|
|
22
|
+
{
|
|
23
|
+
ref: setEndOfListElement,
|
|
24
|
+
className: cn("col-span-full -mt-px flex justify-center text-body text-muted-foreground opacity-50", {
|
|
25
|
+
"py-4": isLoading
|
|
26
|
+
}),
|
|
27
|
+
children: isLoading && loadingText
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function DataListNoMatch({
|
|
33
|
+
message = "Nothing matches your search",
|
|
34
|
+
className,
|
|
35
|
+
...props
|
|
36
|
+
}) {
|
|
37
|
+
return /* @__PURE__ */ jsx(
|
|
38
|
+
"div",
|
|
39
|
+
{
|
|
40
|
+
className: cn(
|
|
41
|
+
"col-span-full flex flex-col items-center justify-center gap-2 rounded-lg bg-background py-8 text-muted-foreground",
|
|
42
|
+
className
|
|
43
|
+
),
|
|
44
|
+
...props,
|
|
45
|
+
children: /* @__PURE__ */ jsx(Txt, { children: message })
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const DataListRowWrapperContext = createContext(false);
|
|
51
|
+
function useDataListRowWrapperContext() {
|
|
52
|
+
return useContext(DataListRowWrapperContext);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const DataListRowButton = forwardRef(
|
|
56
|
+
({ children, className, type = "button", colStart, colEnd, featured, variant, style, ...rest }, ref) => {
|
|
57
|
+
const isWrapped = useDataListRowWrapperContext();
|
|
58
|
+
const fluidRef = useFluidMenuItemRef(ref);
|
|
59
|
+
const hasColumnOverride = colStart !== void 0 || colEnd !== void 0;
|
|
60
|
+
const cellsClass = hasColumnOverride ? void 0 : "data-list-cells";
|
|
61
|
+
const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;
|
|
62
|
+
return /* @__PURE__ */ jsx(
|
|
63
|
+
"button",
|
|
64
|
+
{
|
|
65
|
+
ref: isWrapped ? ref : fluidRef,
|
|
66
|
+
type,
|
|
67
|
+
className: cn(
|
|
68
|
+
...isWrapped ? dataListRowInteractiveStyles : dataListRowStyles,
|
|
69
|
+
cellsClass,
|
|
70
|
+
"text-left",
|
|
71
|
+
className
|
|
72
|
+
),
|
|
73
|
+
style: resolvedStyle,
|
|
74
|
+
"data-featured": featured || void 0,
|
|
75
|
+
"data-variant": variant ?? "default",
|
|
76
|
+
...rest,
|
|
77
|
+
children
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
DataListRowButton.displayName = "DataListRowButton";
|
|
83
|
+
|
|
84
|
+
const DataListRowLink = forwardRef(
|
|
85
|
+
({ children, to, className, style, LinkComponent: Link = "a", colStart, colEnd, featured, variant, ...rest }, ref) => {
|
|
86
|
+
const isWrapped = useDataListRowWrapperContext();
|
|
87
|
+
const fluidRef = useFluidMenuItemRef(ref);
|
|
88
|
+
const hasColumnOverride = colStart !== void 0 || colEnd !== void 0;
|
|
89
|
+
const cellsClass = hasColumnOverride ? void 0 : "data-list-cells";
|
|
90
|
+
const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;
|
|
91
|
+
return /* @__PURE__ */ jsx(
|
|
92
|
+
Link,
|
|
93
|
+
{
|
|
94
|
+
ref: isWrapped ? ref : fluidRef,
|
|
95
|
+
href: to,
|
|
96
|
+
className: cn(...isWrapped ? dataListRowInteractiveStyles : dataListRowStyles, cellsClass, className),
|
|
97
|
+
style: resolvedStyle,
|
|
98
|
+
"data-featured": featured || void 0,
|
|
99
|
+
"data-variant": variant ?? "default",
|
|
100
|
+
...rest,
|
|
101
|
+
children
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
DataListRowLink.displayName = "DataListRowLink";
|
|
107
|
+
|
|
108
|
+
const DataListRowWrapper = forwardRef(
|
|
109
|
+
({ children, className, onSelectRow, onClick, onKeyDown, tabIndex, ...rest }, ref) => {
|
|
110
|
+
const isSelectable = onSelectRow !== void 0;
|
|
111
|
+
const rowRef = useFluidMenuItemRef(ref);
|
|
112
|
+
const handleClick = (event) => {
|
|
113
|
+
onClick?.(event);
|
|
114
|
+
if (!isSelectable || event.defaultPrevented) return;
|
|
115
|
+
onSelectRow();
|
|
116
|
+
};
|
|
117
|
+
const handleKeyDown = (event) => {
|
|
118
|
+
onKeyDown?.(event);
|
|
119
|
+
if (!isSelectable || event.defaultPrevented) return;
|
|
120
|
+
if (event.key === "Enter" && event.target === event.currentTarget) {
|
|
121
|
+
event.preventDefault();
|
|
122
|
+
onSelectRow();
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
return /* @__PURE__ */ jsx(DataListRowWrapperContext.Provider, { value: true, children: /* @__PURE__ */ jsx(
|
|
126
|
+
"div",
|
|
127
|
+
{
|
|
128
|
+
ref: rowRef,
|
|
129
|
+
tabIndex: tabIndex ?? (isSelectable ? 0 : void 0),
|
|
130
|
+
className: cn(
|
|
131
|
+
"grid grid-cols-subgrid gap-0",
|
|
132
|
+
...dataListRowOuterStyles,
|
|
133
|
+
...dataListRowStateStyles,
|
|
134
|
+
isSelectable && cn("cursor-pointer", focusRingInset),
|
|
135
|
+
className
|
|
136
|
+
),
|
|
137
|
+
onClick: handleClick,
|
|
138
|
+
onKeyDown: handleKeyDown,
|
|
139
|
+
...rest,
|
|
140
|
+
children
|
|
141
|
+
}
|
|
142
|
+
) });
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
DataListRowWrapper.displayName = "DataListRowWrapper";
|
|
146
|
+
|
|
147
|
+
const sortIcons = {
|
|
148
|
+
asc: ArrowUp,
|
|
149
|
+
desc: ArrowDown,
|
|
150
|
+
none: ArrowUpDown
|
|
151
|
+
};
|
|
152
|
+
const sortLabels = {
|
|
153
|
+
asc: "ascending",
|
|
154
|
+
desc: "descending"
|
|
155
|
+
};
|
|
156
|
+
const sortAnimations = {
|
|
157
|
+
asc: "animate-sort-arrow-up",
|
|
158
|
+
desc: "animate-sort-arrow-down"
|
|
159
|
+
};
|
|
160
|
+
const sortTooltips = {
|
|
161
|
+
asc: "Asc",
|
|
162
|
+
desc: "Desc",
|
|
163
|
+
none: "Sort"
|
|
164
|
+
};
|
|
165
|
+
function DataListSortableTopCell({
|
|
166
|
+
children,
|
|
167
|
+
sortKey,
|
|
168
|
+
sort,
|
|
169
|
+
onSortChange,
|
|
170
|
+
align = "start",
|
|
171
|
+
className,
|
|
172
|
+
...props
|
|
173
|
+
}) {
|
|
174
|
+
const next = sort === "asc" ? "desc" : "asc";
|
|
175
|
+
const SortIcon = sortIcons[sort ?? "none"];
|
|
176
|
+
const label = typeof children === "string" ? children : sortKey;
|
|
177
|
+
const current = sort ? `sorted ${sortLabels[sort]}` : "not sorted";
|
|
178
|
+
return /* @__PURE__ */ jsxs(
|
|
179
|
+
DataListTopCell,
|
|
180
|
+
{
|
|
181
|
+
"data-sort": sort ?? "none",
|
|
182
|
+
className: cn("gap-1 overflow-visible", align === "end" && "flex-row-reverse", className),
|
|
183
|
+
...props,
|
|
184
|
+
children: [
|
|
185
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", children }),
|
|
186
|
+
/* @__PURE__ */ jsx(
|
|
187
|
+
Button,
|
|
188
|
+
{
|
|
189
|
+
variant: "ghost",
|
|
190
|
+
size: "icon-sm",
|
|
191
|
+
"aria-label": `${label}, ${current}, sort ${sortLabels[next]}`,
|
|
192
|
+
tooltip: sortTooltips[sort ?? "none"],
|
|
193
|
+
onClick: () => onSortChange(next, sortKey),
|
|
194
|
+
className: cn("shrink-0", sort ? "text-foreground" : "text-muted-foreground"),
|
|
195
|
+
children: /* @__PURE__ */ jsx(SortIcon, { className: sort && sortAnimations[sort] }, sort ?? "none")
|
|
196
|
+
}
|
|
197
|
+
)
|
|
198
|
+
]
|
|
199
|
+
}
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function DataListSpacer({ height }) {
|
|
204
|
+
if (height <= 0) return null;
|
|
205
|
+
return /* @__PURE__ */ jsx("div", { className: "col-span-full", style: { height } });
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export { DataListNextPageLoading as D, DataListNoMatch as a, DataListSpacer as b, DataListRowLink as c, DataListRowButton as d, DataListRowWrapper as e, DataListSortableTopCell as f, useDataListRowWrapperContext as u };
|
|
209
|
+
//# sourceMappingURL=data-list-spacer-BO-O0H6O.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-list-spacer-BO-O0H6O.js","sources":["../src/ds/components/DataList/data-list-next-page-loading.tsx","../src/ds/components/DataList/data-list-no-match.tsx","../src/ds/components/DataList/data-list-row-wrapper-context.ts","../src/ds/components/DataList/data-list-row-button.tsx","../src/ds/components/DataList/data-list-row-link.tsx","../src/ds/components/DataList/data-list-row-wrapper.tsx","../src/ds/components/DataList/data-list-sortable-top-cell.tsx","../src/ds/components/DataList/data-list-spacer.tsx"],"sourcesContent":["import { cn } from '@/lib/utils';\n\nexport type DataListNextPageLoadingProps = {\n isLoading?: boolean;\n hasMore?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n loadingText?: string;\n};\n\nexport function DataListNextPageLoading({\n isLoading,\n setEndOfListElement,\n hasMore,\n loadingText = 'Loading more data...',\n}: DataListNextPageLoadingProps) {\n if (!setEndOfListElement) {\n return null;\n }\n\n return (\n <div\n ref={setEndOfListElement}\n // Zero-height when idle so it adds no trailing space below the last row;\n // IntersectionObserver still fires for a zero-area target at the viewport edge.\n className={cn('col-span-full -mt-px flex justify-center text-body text-muted-foreground opacity-50', {\n 'py-4': isLoading,\n })}\n >\n {isLoading && loadingText}\n </div>\n );\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport type DataListNoMatchProps = ComponentPropsWithoutRef<'div'> & {\n message?: string;\n};\n\nexport function DataListNoMatch({\n message = 'Nothing matches your search',\n className,\n ...props\n}: DataListNoMatchProps) {\n return (\n <div\n className={cn(\n 'col-span-full flex flex-col items-center justify-center gap-2 rounded-lg bg-background py-8 text-muted-foreground',\n className,\n )}\n {...props}\n >\n <Txt>{message}</Txt>\n </div>\n );\n}\n","import { createContext, useContext } from 'react';\n\nexport const DataListRowWrapperContext = createContext(false);\n\nexport function useDataListRowWrapperContext() {\n return useContext(DataListRowWrapperContext);\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { useDataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowInteractiveStyles, dataListRowStyles } from './shared';\nimport type { DataListRowSharedProps } from './shared';\nimport { useFluidMenuItemRef } from '@/ds/primitives/fluid-menu';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowButtonProps = ComponentPropsWithoutRef<'button'> & DataListRowSharedProps;\n\n/**\n * Forwarded ref + spread props so virtualizers (`useVirtualizer.measureElement`)\n * can attach a ref and `data-index` to each rendered row.\n */\nexport const DataListRowButton = forwardRef<HTMLButtonElement, DataListRowButtonProps>(\n ({ children, className, type = 'button', colStart, colEnd, featured, variant, style, ...rest }, ref) => {\n const isWrapped = useDataListRowWrapperContext();\n // Standalone rows register with the root's fluid hover; wrapped ones let the wrapper do it.\n const fluidRef = useFluidMenuItemRef(ref);\n const hasColumnOverride = colStart !== undefined || colEnd !== undefined;\n const cellsClass = hasColumnOverride ? undefined : 'data-list-cells';\n const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;\n return (\n <button\n ref={isWrapped ? ref : fluidRef}\n type={type}\n className={cn(\n ...(isWrapped ? dataListRowInteractiveStyles : dataListRowStyles),\n cellsClass,\n 'text-left',\n className,\n )}\n style={resolvedStyle}\n data-featured={featured || undefined}\n data-variant={variant ?? 'default'}\n {...rest}\n >\n {children}\n </button>\n );\n },\n);\n\nDataListRowButton.displayName = 'DataListRowButton';\n","import { forwardRef } from 'react';\nimport type { CSSProperties, ComponentPropsWithoutRef, ReactNode } from 'react';\nimport { useDataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowInteractiveStyles, dataListRowStyles } from './shared';\nimport type { DataListRowSharedProps } from './shared';\nimport { useFluidMenuItemRef } from '@/ds/primitives/fluid-menu';\nimport type { LinkComponent } from '@/ds/types/link-component';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowLinkProps = DataListRowSharedProps & {\n children: ReactNode;\n to: string;\n className?: string;\n style?: CSSProperties;\n LinkComponent?: LinkComponent;\n} & Omit<ComponentPropsWithoutRef<'a'>, 'href' | 'children' | 'className' | 'style'>;\n\nexport const DataListRowLink = forwardRef<HTMLAnchorElement, DataListRowLinkProps>(\n (\n { children, to, className, style, LinkComponent: Link = 'a', colStart, colEnd, featured, variant, ...rest },\n ref,\n ) => {\n const isWrapped = useDataListRowWrapperContext();\n // Standalone rows register with the root's fluid hover; wrapped ones let the wrapper do it.\n const fluidRef = useFluidMenuItemRef(ref);\n const hasColumnOverride = colStart !== undefined || colEnd !== undefined;\n const cellsClass = hasColumnOverride ? undefined : 'data-list-cells';\n const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;\n return (\n <Link\n ref={isWrapped ? ref : fluidRef}\n href={to}\n className={cn(...(isWrapped ? dataListRowInteractiveStyles : dataListRowStyles), cellsClass, className)}\n style={resolvedStyle}\n data-featured={featured || undefined}\n data-variant={variant ?? 'default'}\n {...rest}\n >\n {children}\n </Link>\n );\n },\n);\n\nDataListRowLink.displayName = 'DataListRowLink';\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef, KeyboardEvent, MouseEvent } from 'react';\nimport { DataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowOuterStyles, dataListRowStateStyles } from './shared';\nimport { useFluidMenuItemRef } from '@/ds/primitives/fluid-menu';\nimport { focusRingInset } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowWrapperProps = ComponentPropsWithoutRef<'div'> & {\n /**\n * Makes the whole wrapper the row's activation target: it becomes focusable\n * (`tabIndex=0` unless overridden, e.g. by `getRowProps`), and a click or\n * Enter on the wrapper itself calls this. Descendants that must not activate\n * the row (the inner link, popover triggers, action buttons) should call\n * `event.stopPropagation()` on their click.\n */\n onSelectRow?: () => void;\n};\n\n/**\n * Grid wrapper used to host a leading or trailing cell (e.g. a selection\n * checkbox or row actions) alongside a `DataList.RowButton` / `RowLink`.\n *\n * Without `onSelectRow` it is non-interactive: hover/focus/click only apply to\n * the nested row primitive. With `onSelectRow` the wrapper itself becomes the\n * click / Enter target so the entire row (including trailing cells) activates.\n * For standalone interactive rows, use `DataList.RowButton` directly.\n *\n * Carries the `.data-list-row` marker so root-level row styling behaves the\n * same in wrapped and standalone rows.\n */\nexport const DataListRowWrapper = forwardRef<HTMLDivElement, DataListRowWrapperProps>(\n ({ children, className, onSelectRow, onClick, onKeyDown, tabIndex, ...rest }, ref) => {\n const isSelectable = onSelectRow !== undefined;\n // The wrapper is the `.data-list-row` element, so it (not the nested\n // RowButton/RowLink) registers with the root's fluid hover.\n const rowRef = useFluidMenuItemRef(ref);\n\n const handleClick = (event: MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (!isSelectable || event.defaultPrevented) return;\n onSelectRow();\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (!isSelectable || event.defaultPrevented) return;\n // Only when the wrapper itself is focused. A focused descendant (the\n // link) receiving Enter fires its own native click; handling it here too\n // would activate the row twice.\n if (event.key === 'Enter' && event.target === event.currentTarget) {\n event.preventDefault();\n onSelectRow();\n }\n };\n\n return (\n <DataListRowWrapperContext.Provider value>\n <div\n ref={rowRef}\n tabIndex={tabIndex ?? (isSelectable ? 0 : undefined)}\n className={cn(\n 'grid grid-cols-subgrid gap-0',\n ...dataListRowOuterStyles,\n ...dataListRowStateStyles,\n isSelectable && cn('cursor-pointer', focusRingInset),\n className,\n )}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {children}\n </div>\n </DataListRowWrapperContext.Provider>\n );\n },\n);\n\nDataListRowWrapper.displayName = 'DataListRowWrapper';\n","import { ArrowDown, ArrowUp, ArrowUpDown } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { DataListTopCell } from './data-list-top-cell';\nimport type { DataListTopCellProps } from './data-list-top-cell';\nimport { Button } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nexport type DataListSort = 'asc' | 'desc';\n\nconst sortIcons = {\n asc: ArrowUp,\n desc: ArrowDown,\n none: ArrowUpDown,\n};\n\nconst sortLabels = {\n asc: 'ascending',\n desc: 'descending',\n};\n\nconst sortAnimations = {\n asc: 'animate-sort-arrow-up',\n desc: 'animate-sort-arrow-down',\n};\n\nconst sortTooltips = {\n asc: 'Asc',\n desc: 'Desc',\n none: 'Sort',\n};\n\nexport type DataListSortableTopCellProps<K extends string = string> = Omit<\n DataListTopCellProps,\n 'aria-sort' | 'as' | 'children' | 'onClick'\n> & {\n children: ReactNode;\n sortKey: K;\n sort?: DataListSort;\n onSortChange: (sort: DataListSort, key: K) => void;\n align?: 'start' | 'end';\n};\n\nexport function DataListSortableTopCell<K extends string = string>({\n children,\n sortKey,\n sort,\n onSortChange,\n align = 'start',\n className,\n ...props\n}: DataListSortableTopCellProps<K>) {\n const next: DataListSort = sort === 'asc' ? 'desc' : 'asc';\n const SortIcon = sortIcons[sort ?? 'none'];\n const label = typeof children === 'string' ? children : sortKey;\n const current = sort ? `sorted ${sortLabels[sort]}` : 'not sorted';\n\n return (\n <DataListTopCell\n data-sort={sort ?? 'none'}\n className={cn('gap-1 overflow-visible', align === 'end' && 'flex-row-reverse', className)}\n {...props}\n >\n <span className=\"min-w-0 truncate\">{children}</span>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={`${label}, ${current}, sort ${sortLabels[next]}`}\n tooltip={sortTooltips[sort ?? 'none']}\n onClick={() => onSortChange(next, sortKey)}\n className={cn('shrink-0', sort ? 'text-foreground' : 'text-muted-foreground')}\n >\n <SortIcon key={sort ?? 'none'} className={sort && sortAnimations[sort]} />\n </Button>\n </DataListTopCell>\n );\n}\n","export type DataListSpacerProps = {\n /** Pixel height of the spacer. Pass 0 to render nothing. */\n height: number;\n};\n\n/**\n * Pads top/bottom of the visible window when virtualizing — preserves the\n * grid's total scroll height for the rows that aren't currently rendered.\n * Spans the full grid width so it doesn't disturb column layout.\n */\nexport function DataListSpacer({ height }: DataListSpacerProps) {\n if (height <= 0) return null;\n return <div className=\"col-span-full\" style={{ height }} />;\n}\n"],"names":[],"mappings":"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"}
|