@agentskillmania/skill-ui-shared 0.1.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/LICENSE +21 -0
- package/README.md +51 -0
- package/dist/components/CollapsibleCard.d.ts +22 -0
- package/dist/components/CollapsibleCard.d.ts.map +1 -0
- package/dist/components/CollapsibleCard.js +30 -0
- package/dist/components/CollapsibleCard.js.map +1 -0
- package/dist/components/CollapsibleCard.stories.d.ts +16 -0
- package/dist/components/CollapsibleCard.stories.d.ts.map +1 -0
- package/dist/components/CollapsibleCard.stories.js +57 -0
- package/dist/components/CollapsibleCard.stories.js.map +1 -0
- package/dist/components/CopyValue.d.ts +12 -0
- package/dist/components/CopyValue.d.ts.map +1 -0
- package/dist/components/CopyValue.js +39 -0
- package/dist/components/CopyValue.js.map +1 -0
- package/dist/components/EmptyState.d.ts +16 -0
- package/dist/components/EmptyState.d.ts.map +1 -0
- package/dist/components/EmptyState.js +31 -0
- package/dist/components/EmptyState.js.map +1 -0
- package/dist/components/EmptyState.stories.d.ts +15 -0
- package/dist/components/EmptyState.stories.d.ts.map +1 -0
- package/dist/components/EmptyState.stories.js +45 -0
- package/dist/components/EmptyState.stories.js.map +1 -0
- package/dist/components/ExpandableItem.d.ts +29 -0
- package/dist/components/ExpandableItem.d.ts.map +1 -0
- package/dist/components/ExpandableItem.js +28 -0
- package/dist/components/ExpandableItem.js.map +1 -0
- package/dist/components/ExpandableItem.stories.d.ts +14 -0
- package/dist/components/ExpandableItem.stories.d.ts.map +1 -0
- package/dist/components/ExpandableItem.stories.js +178 -0
- package/dist/components/ExpandableItem.stories.js.map +1 -0
- package/dist/components/ExpandableRow.d.ts +35 -0
- package/dist/components/ExpandableRow.d.ts.map +1 -0
- package/dist/components/ExpandableRow.js +69 -0
- package/dist/components/ExpandableRow.js.map +1 -0
- package/dist/components/InfoRow.d.ts +15 -0
- package/dist/components/InfoRow.d.ts.map +1 -0
- package/dist/components/InfoRow.js +27 -0
- package/dist/components/InfoRow.js.map +1 -0
- package/dist/components/MetricTile.d.ts +15 -0
- package/dist/components/MetricTile.d.ts.map +1 -0
- package/dist/components/MetricTile.js +32 -0
- package/dist/components/MetricTile.js.map +1 -0
- package/dist/components/PaginationBar.d.ts +17 -0
- package/dist/components/PaginationBar.d.ts.map +1 -0
- package/dist/components/PaginationBar.js +19 -0
- package/dist/components/PaginationBar.js.map +1 -0
- package/dist/components/SectionHeader.d.ts +15 -0
- package/dist/components/SectionHeader.d.ts.map +1 -0
- package/dist/components/SectionHeader.js +34 -0
- package/dist/components/SectionHeader.js.map +1 -0
- package/dist/components/SectionHeader.stories.d.ts +13 -0
- package/dist/components/SectionHeader.stories.d.ts.map +1 -0
- package/dist/components/SectionHeader.stories.js +32 -0
- package/dist/components/SectionHeader.stories.js.map +1 -0
- package/dist/components/SectionLabel.d.ts +10 -0
- package/dist/components/SectionLabel.d.ts.map +1 -0
- package/dist/components/SectionLabel.js +22 -0
- package/dist/components/SectionLabel.js.map +1 -0
- package/dist/components/SplitDivider.d.ts +13 -0
- package/dist/components/SplitDivider.d.ts.map +1 -0
- package/dist/components/SplitDivider.js +70 -0
- package/dist/components/SplitDivider.js.map +1 -0
- package/dist/components/SplitDivider.stories.d.ts +12 -0
- package/dist/components/SplitDivider.stories.d.ts.map +1 -0
- package/dist/components/SplitDivider.stories.js +62 -0
- package/dist/components/SplitDivider.stories.js.map +1 -0
- package/dist/components/StatusDot.d.ts +11 -0
- package/dist/components/StatusDot.d.ts.map +1 -0
- package/dist/components/StatusDot.js +21 -0
- package/dist/components/StatusDot.js.map +1 -0
- package/dist/components/index.d.ts +27 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +14 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/sidebar/Sidebar.d.ts +21 -0
- package/dist/components/sidebar/Sidebar.d.ts.map +1 -0
- package/dist/components/sidebar/Sidebar.js +41 -0
- package/dist/components/sidebar/Sidebar.js.map +1 -0
- package/dist/components/sidebar/Sidebar.stories.d.ts +14 -0
- package/dist/components/sidebar/Sidebar.stories.d.ts.map +1 -0
- package/dist/components/sidebar/Sidebar.stories.js +92 -0
- package/dist/components/sidebar/Sidebar.stories.js.map +1 -0
- package/dist/components/sidebar/SidebarIcons.d.ts +25 -0
- package/dist/components/sidebar/SidebarIcons.d.ts.map +1 -0
- package/dist/components/sidebar/SidebarIcons.js +65 -0
- package/dist/components/sidebar/SidebarIcons.js.map +1 -0
- package/dist/components/sidebar/SidebarPanel.d.ts +13 -0
- package/dist/components/sidebar/SidebarPanel.d.ts.map +1 -0
- package/dist/components/sidebar/SidebarPanel.js +32 -0
- package/dist/components/sidebar/SidebarPanel.js.map +1 -0
- package/dist/components/sidebar/index.d.ts +7 -0
- package/dist/components/sidebar/index.d.ts.map +1 -0
- package/dist/components/sidebar/index.js +4 -0
- package/dist/components/sidebar/index.js.map +1 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +3 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useResize.d.ts +28 -0
- package/dist/hooks/useResize.d.ts.map +1 -0
- package/dist/hooks/useResize.js +39 -0
- package/dist/hooks/useResize.js.map +1 -0
- package/dist/hooks/useToggle.d.ts +17 -0
- package/dist/hooks/useToggle.d.ts.map +1 -0
- package/dist/hooks/useToggle.js +14 -0
- package/dist/hooks/useToggle.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/locales/en-US.d.ts +11 -0
- package/dist/locales/en-US.d.ts.map +1 -0
- package/dist/locales/en-US.js +11 -0
- package/dist/locales/en-US.js.map +1 -0
- package/dist/locales/index.d.ts +28 -0
- package/dist/locales/index.d.ts.map +1 -0
- package/dist/locales/index.js +10 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/locales/zh-CN.d.ts +11 -0
- package/dist/locales/zh-CN.d.ts.map +1 -0
- package/dist/locales/zh-CN.js +11 -0
- package/dist/locales/zh-CN.js.map +1 -0
- package/dist/styles/card.d.ts +12 -0
- package/dist/styles/card.d.ts.map +1 -0
- package/dist/styles/card.js +39 -0
- package/dist/styles/card.js.map +1 -0
- package/dist/styles/empty-text.d.ts +7 -0
- package/dist/styles/empty-text.d.ts.map +1 -0
- package/dist/styles/empty-text.js +13 -0
- package/dist/styles/empty-text.js.map +1 -0
- package/dist/styles/expandable.d.ts +12 -0
- package/dist/styles/expandable.d.ts.map +1 -0
- package/dist/styles/expandable.js +34 -0
- package/dist/styles/expandable.js.map +1 -0
- package/dist/styles/index.d.ts +5 -0
- package/dist/styles/index.d.ts.map +1 -0
- package/dist/styles/index.js +5 -0
- package/dist/styles/index.js.map +1 -0
- package/dist/styles/metric.d.ts +12 -0
- package/dist/styles/metric.d.ts.map +1 -0
- package/dist/styles/metric.js +26 -0
- package/dist/styles/metric.js.map +1 -0
- package/dist/utils/avatar-color.d.ts +32 -0
- package/dist/utils/avatar-color.d.ts.map +1 -0
- package/dist/utils/avatar-color.js +31 -0
- package/dist/utils/avatar-color.js.map +1 -0
- package/dist/utils/fonts.d.ts +6 -0
- package/dist/utils/fonts.d.ts.map +1 -0
- package/dist/utils/fonts.js +6 -0
- package/dist/utils/fonts.js.map +1 -0
- package/dist/utils/format.d.ts +32 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +75 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/pagination.d.ts +6 -0
- package/dist/utils/pagination.d.ts.map +1 -0
- package/dist/utils/pagination.js +6 -0
- package/dist/utils/pagination.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
|
2
|
+
import { css, useTheme } from '@emotion/react';
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { ChevronDown, ChevronRight } from 'lucide-react';
|
|
5
|
+
import { ExpandableItem } from './ExpandableItem.js';
|
|
6
|
+
const meta = {
|
|
7
|
+
title: 'Shared/ExpandableItem',
|
|
8
|
+
component: ExpandableItem,
|
|
9
|
+
tags: ['autodocs'],
|
|
10
|
+
argTypes: {
|
|
11
|
+
renderSummary: { control: false },
|
|
12
|
+
renderDetail: { control: false },
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
export default meta;
|
|
16
|
+
/** Colored type tag for event log entries. */
|
|
17
|
+
function EventTypeTag({ type }) {
|
|
18
|
+
const theme = useTheme();
|
|
19
|
+
const colorMap = {
|
|
20
|
+
agent: { bg: 'rgba(34,197,94,0.1)', text: theme.color.success },
|
|
21
|
+
tool: { bg: 'rgba(67,97,238,0.1)', text: theme.color.primary },
|
|
22
|
+
context: { bg: 'rgba(234,179,8,0.1)', text: theme.color.warning },
|
|
23
|
+
error: { bg: 'rgba(239,68,68,0.1)', text: theme.color.error },
|
|
24
|
+
info: { bg: theme.color.fillSecondary, text: theme.color.textSecondary },
|
|
25
|
+
};
|
|
26
|
+
const colors = colorMap[type] || colorMap.info;
|
|
27
|
+
return (_jsx("span", { css: css `
|
|
28
|
+
font-size: ${theme.font.size.xs};
|
|
29
|
+
padding: 1px 8px;
|
|
30
|
+
border-radius: ${theme.radius.sm};
|
|
31
|
+
background: ${colors.bg};
|
|
32
|
+
color: ${colors.text};
|
|
33
|
+
font-weight: ${theme.font.weight.medium};
|
|
34
|
+
flex-shrink: 0;
|
|
35
|
+
`, children: type.charAt(0).toUpperCase() + type.slice(1) }));
|
|
36
|
+
}
|
|
37
|
+
/** Event log row with type tag, content, and timestamp. */
|
|
38
|
+
function EventLogRow({ type, label, time, ctx, }) {
|
|
39
|
+
const theme = useTheme();
|
|
40
|
+
return (_jsxs("div", { css: css `
|
|
41
|
+
display: flex;
|
|
42
|
+
align-items: center;
|
|
43
|
+
gap: ${theme.spacing[2]};
|
|
44
|
+
padding: ${theme.spacing[2]} ${theme.spacing[3]};
|
|
45
|
+
cursor: pointer;
|
|
46
|
+
transition: background ${theme.motion.duration.fast};
|
|
47
|
+
&:hover {
|
|
48
|
+
background: ${theme.color.fillTertiary};
|
|
49
|
+
}
|
|
50
|
+
`, onClick: ctx.toggle, children: [_jsx("span", { css: css `
|
|
51
|
+
font-size: 10px;
|
|
52
|
+
color: ${theme.color.textTertiary};
|
|
53
|
+
width: 16px;
|
|
54
|
+
text-align: center;
|
|
55
|
+
transition: transform 150ms ${theme.motion.easing.out};
|
|
56
|
+
transform: rotate(${ctx.expanded ? 90 : 0}deg);
|
|
57
|
+
flex-shrink: 0;
|
|
58
|
+
`, children: "\u25B6" }), _jsx(EventTypeTag, { type: type }), _jsx("span", { css: css `
|
|
59
|
+
font-size: ${theme.font.size.sm};
|
|
60
|
+
color: ${theme.color.text};
|
|
61
|
+
flex: 1;
|
|
62
|
+
min-width: 0;
|
|
63
|
+
overflow: hidden;
|
|
64
|
+
text-overflow: ellipsis;
|
|
65
|
+
white-space: nowrap;
|
|
66
|
+
`, children: label }), _jsx("span", { css: css `
|
|
67
|
+
font-size: ${theme.font.size.xs};
|
|
68
|
+
color: ${theme.color.textTertiary};
|
|
69
|
+
flex-shrink: 0;
|
|
70
|
+
`, children: time })] }));
|
|
71
|
+
}
|
|
72
|
+
/** JSON detail block with monospace formatting. */
|
|
73
|
+
function JsonDetail({ data }) {
|
|
74
|
+
const theme = useTheme();
|
|
75
|
+
return (_jsx("pre", { css: css `
|
|
76
|
+
margin: 0;
|
|
77
|
+
padding: ${theme.spacing[2]} ${theme.spacing[4]} ${theme.spacing[2]} 44px;
|
|
78
|
+
font-size: ${theme.font.size.xs};
|
|
79
|
+
background: ${theme.color.fillSecondary};
|
|
80
|
+
color: ${theme.color.textSecondary};
|
|
81
|
+
line-height: 1.5;
|
|
82
|
+
overflow-x: auto;
|
|
83
|
+
border-top: 1px solid ${theme.color.borderSecondary};
|
|
84
|
+
`, children: JSON.stringify(data, null, 2) }));
|
|
85
|
+
}
|
|
86
|
+
/** A list of expandable event log rows with colored type tags and JSON details. */
|
|
87
|
+
export const EventLogItems = {
|
|
88
|
+
render: () => (_jsxs("div", { style: {
|
|
89
|
+
width: '100%',
|
|
90
|
+
border: '1px solid #e5e7eb',
|
|
91
|
+
borderRadius: '6px',
|
|
92
|
+
overflow: 'hidden',
|
|
93
|
+
}, children: [_jsx(ExpandableItem, { renderSummary: (ctx) => (_jsx(EventLogRow, { type: "agent", label: "Agent started", time: "10:01:23", ctx: ctx })), renderDetail: () => (_jsx(JsonDetail, { data: { pid: 8492, runtime: 'colts', version: '0.3.0' } })) }), _jsx(ExpandableItem, { renderSummary: (ctx) => (_jsx(EventLogRow, { type: "tool", label: "readFile('src/runner.ts')", time: "10:01:25", ctx: ctx })), renderDetail: () => (_jsx(JsonDetail, { data: { tool: 'readFile', args: { path: 'src/runner.ts' }, result: '142 lines' } })) }), _jsx(ExpandableItem, { renderSummary: (ctx) => (_jsx(EventLogRow, { type: "context", label: "Context compressed 12.4k \u2192 3.2k", time: "10:01:30", ctx: ctx })), renderDetail: () => (_jsx(JsonDetail, { data: {
|
|
94
|
+
anchor: 'user-request-refactor',
|
|
95
|
+
removed: 9200,
|
|
96
|
+
summary: 'User requested JWT refactoring...',
|
|
97
|
+
} })) }), _jsx(ExpandableItem, { renderSummary: (ctx) => (_jsx(EventLogRow, { type: "error", label: "Tool execution failed", time: "10:01:35", ctx: ctx })), renderDetail: () => (_jsx(JsonDetail, { data: { tool: 'runCommand', exitCode: 1, stderr: 'Permission denied' } })) }), _jsx(ExpandableItem, { renderSummary: (ctx) => (_jsx(EventLogRow, { type: "info", label: "Session completed", time: "10:02:01", ctx: ctx })) })] })),
|
|
98
|
+
};
|
|
99
|
+
/** Test case rows — passed items not expandable, failed ones show error details. */
|
|
100
|
+
export const TestCaseItems = {
|
|
101
|
+
render: () => {
|
|
102
|
+
const theme = useTheme();
|
|
103
|
+
const tests = [
|
|
104
|
+
{ name: 'should render header', passed: true },
|
|
105
|
+
{ name: 'should apply theme colors', passed: true },
|
|
106
|
+
{ name: 'should handle empty input', passed: false },
|
|
107
|
+
{ name: 'should debounce onChange', passed: true },
|
|
108
|
+
];
|
|
109
|
+
return (_jsx("div", { style: {
|
|
110
|
+
width: '100%',
|
|
111
|
+
border: '1px solid #e5e7eb',
|
|
112
|
+
borderRadius: '6px',
|
|
113
|
+
overflow: 'hidden',
|
|
114
|
+
}, children: tests.map((test, i) => (_jsx(ExpandableItem, { expandable: !test.passed, renderSummary: (ctx) => (_jsxs("div", { css: css `
|
|
115
|
+
display: flex;
|
|
116
|
+
align-items: center;
|
|
117
|
+
gap: ${theme.spacing[2]};
|
|
118
|
+
padding: ${theme.spacing[2]} ${theme.spacing[3]};
|
|
119
|
+
font-size: ${theme.font.size.sm};
|
|
120
|
+
color: ${test.passed ? theme.color.text : theme.color.error};
|
|
121
|
+
cursor: ${test.passed ? 'default' : 'pointer'};
|
|
122
|
+
&:hover {
|
|
123
|
+
background: ${test.passed ? 'transparent' : theme.color.fillTertiary};
|
|
124
|
+
}
|
|
125
|
+
`, children: [_jsx("span", { css: css `
|
|
126
|
+
width: 20px;
|
|
127
|
+
text-align: center;
|
|
128
|
+
color: ${test.passed ? theme.color.success : theme.color.error};
|
|
129
|
+
font-weight: ${theme.font.weight.bold};
|
|
130
|
+
`, children: test.passed ? '✓' : '✗' }), _jsx("span", { css: css `flex: 1; color: ${test.passed ? theme.color.text : theme.color.error};`, children: test.name })] })), renderDetail: test.passed
|
|
131
|
+
? undefined
|
|
132
|
+
: () => (_jsxs("div", { css: css `
|
|
133
|
+
padding: ${theme.spacing[2]} ${theme.spacing[4]};
|
|
134
|
+
font-size: ${theme.font.size.xs};
|
|
135
|
+
color: ${theme.color.error};
|
|
136
|
+
background: rgba(239, 68, 68, 0.04);
|
|
137
|
+
border-top: 1px solid rgba(239, 68, 68, 0.1);
|
|
138
|
+
font-family: ${theme.font.familyMono};
|
|
139
|
+
`, children: ["AssertionError: expected \"\" to equal \"undefined\"", _jsx("br", {}), "at Context.<anonymous> (test/unit/input.test.ts:42:18)"] })) }, i))) }));
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
/** Single expandable item with controlled state via React.useState. */
|
|
143
|
+
export const SingleItem = {
|
|
144
|
+
render: () => {
|
|
145
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
146
|
+
const [expanded, setExpanded] = useState(false);
|
|
147
|
+
const theme = useTheme();
|
|
148
|
+
return (_jsx("div", { css: css `
|
|
149
|
+
border: 1px solid ${theme.color.border};
|
|
150
|
+
border-radius: ${theme.radius.md};
|
|
151
|
+
overflow: hidden;
|
|
152
|
+
width: 100%;
|
|
153
|
+
`, children: _jsx(ExpandableItem, { expanded: expanded, onToggle: (next) => setExpanded(next), renderSummary: (ctx) => (_jsxs("div", { css: css `
|
|
154
|
+
display: flex;
|
|
155
|
+
align-items: center;
|
|
156
|
+
justify-content: space-between;
|
|
157
|
+
padding: ${theme.spacing[2]} ${theme.spacing[3]};
|
|
158
|
+
cursor: pointer;
|
|
159
|
+
transition: background ${theme.motion.duration.fast};
|
|
160
|
+
&:hover {
|
|
161
|
+
background: ${theme.color.fillTertiary};
|
|
162
|
+
}
|
|
163
|
+
`, onClick: ctx.toggle, children: [_jsxs("div", { css: css `display: flex; align-items: center; gap: ${theme.spacing[2]};`, children: [ctx.expanded ? (_jsx(ChevronDown, { size: 14, css: css `color: ${theme.color.textTertiary};` })) : (_jsx(ChevronRight, { size: 14, css: css `color: ${theme.color.textTertiary};` })), _jsxs("span", { css: css `font-size: ${theme.font.size.sm}; color: ${theme.color.text};`, children: ["Click to ", ctx.expanded ? 'collapse' : 'expand'] })] }), _jsx("span", { css: css `
|
|
164
|
+
font-size: ${theme.font.size.xs};
|
|
165
|
+
color: ${theme.color.textTertiary};
|
|
166
|
+
background: ${theme.color.fillSecondary};
|
|
167
|
+
padding: 2px 8px;
|
|
168
|
+
border-radius: ${theme.radius.sm};
|
|
169
|
+
`, children: expanded ? 'OPEN' : 'CLOSED' })] })), renderDetail: () => (_jsxs("div", { css: css `
|
|
170
|
+
padding: ${theme.spacing[3]};
|
|
171
|
+
background: ${theme.color.fillSecondary};
|
|
172
|
+
font-size: ${theme.font.size.sm};
|
|
173
|
+
color: ${theme.color.textSecondary};
|
|
174
|
+
border-top: 1px solid ${theme.color.borderSecondary};
|
|
175
|
+
`, children: ["This content is controlled via React.useState. The expanded state is:", ' ', _jsx("strong", { children: expanded ? 'true' : 'false' }), "."] })) }) }));
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
//# sourceMappingURL=ExpandableItem.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpandableItem.stories.js","sourceRoot":"","sources":["../../src/components/ExpandableItem.stories.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/** Detail area style variant. */
|
|
3
|
+
export type DetailVariant = 'default' | 'code';
|
|
4
|
+
export interface ExpandableRowProps {
|
|
5
|
+
/** Whether this item can expand. Default: true */
|
|
6
|
+
expandable?: boolean;
|
|
7
|
+
/** Uncontrolled initial state. Default: false */
|
|
8
|
+
defaultExpanded?: boolean;
|
|
9
|
+
/** Controlled expand state. */
|
|
10
|
+
expanded?: boolean;
|
|
11
|
+
/** Expand state change callback. */
|
|
12
|
+
onToggle?: (expanded: boolean) => void;
|
|
13
|
+
/** Summary content — always visible. */
|
|
14
|
+
renderSummary: (ctx: {
|
|
15
|
+
expanded: boolean;
|
|
16
|
+
toggle: () => void;
|
|
17
|
+
}) => ReactNode;
|
|
18
|
+
/** Detail content — shown when expanded. */
|
|
19
|
+
renderDetail?: () => ReactNode;
|
|
20
|
+
/** Show chevron indicator. Default: false */
|
|
21
|
+
showChevron?: boolean;
|
|
22
|
+
/** Detail area style variant. Default: 'default' */
|
|
23
|
+
detailVariant?: DetailVariant;
|
|
24
|
+
/** Animation duration in ms. Default: 150 */
|
|
25
|
+
animationDuration?: number;
|
|
26
|
+
/** Additional className. */
|
|
27
|
+
className?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* ExpandableRow — visual shell for expandable list items.
|
|
31
|
+
* Wraps ExpandableItem (headless behavior) with container-highlight styling:
|
|
32
|
+
* left border + fillSubtle background when expanded, border-bottom separator, hover effect.
|
|
33
|
+
*/
|
|
34
|
+
export declare function ExpandableRow({ expandable, defaultExpanded, expanded: controlledExpanded, onToggle, renderSummary, renderDetail, showChevron, detailVariant, animationDuration, className, }: ExpandableRowProps): import("@emotion/react/jsx-runtime").JSX.Element;
|
|
35
|
+
//# sourceMappingURL=ExpandableRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpandableRow.d.ts","sourceRoot":"","sources":["../../src/components/ExpandableRow.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,iCAAiC;AACjC,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,CAAC;AAE/C,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAEvC,wCAAwC;IACxC,aAAa,EAAE,CAAC,GAAG,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,SAAS,CAAC;IAC7E,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,SAAS,CAAC;IAE/B,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oDAAoD;IACpD,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgDD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC5B,UAAiB,EACjB,eAAuB,EACvB,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,WAAmB,EACnB,aAAyB,EACzB,iBAAuB,EACvB,SAAS,GACV,EAAE,kBAAkB,oDA2DpB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
|
2
|
+
/** @jsxImportSource @emotion/react */
|
|
3
|
+
import { useTheme } from '@agentskillmania/skill-ui-theme';
|
|
4
|
+
import { css } from '@emotion/react';
|
|
5
|
+
import { ChevronDown, ChevronRight } from 'lucide-react';
|
|
6
|
+
import { ExpandableItem } from './ExpandableItem.js';
|
|
7
|
+
/** Container style — wraps both summary and detail. */
|
|
8
|
+
const containerStyle = (theme, isExpanded) => css `
|
|
9
|
+
border-left: 2px solid ${isExpanded ? theme.color.primary : 'transparent'};
|
|
10
|
+
background: ${isExpanded ? theme.color.fillSubtle : 'transparent'};
|
|
11
|
+
border-bottom: 1px solid ${theme.color.borderSecondary};
|
|
12
|
+
transition:
|
|
13
|
+
border-color ${theme.motion.duration.normal} ${theme.motion.easing.out},
|
|
14
|
+
background ${theme.motion.duration.normal} ${theme.motion.easing.out};
|
|
15
|
+
`;
|
|
16
|
+
/** Summary row style — clickable with hover. */
|
|
17
|
+
const summaryStyle = (theme, isExpanded) => css `
|
|
18
|
+
display: flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
padding: ${theme.spacing[1]} ${theme.spacing[2]};
|
|
21
|
+
cursor: pointer;
|
|
22
|
+
transition: background ${theme.motion.duration.normal} ${theme.motion.easing.out};
|
|
23
|
+
|
|
24
|
+
&:hover {
|
|
25
|
+
background: ${isExpanded ? 'transparent' : theme.color.fillSecondary};
|
|
26
|
+
}
|
|
27
|
+
`;
|
|
28
|
+
/** Detail area for default variant. */
|
|
29
|
+
const detailDefaultStyle = (theme) => css `
|
|
30
|
+
padding: ${theme.spacing['0.5']} ${theme.spacing[2]} ${theme.spacing[2]} ${theme.spacing[2]};
|
|
31
|
+
font-size: ${theme.font.size.xs};
|
|
32
|
+
color: ${theme.color.textSecondary};
|
|
33
|
+
line-height: 1.5;
|
|
34
|
+
`;
|
|
35
|
+
/** Detail area for code variant. */
|
|
36
|
+
const detailCodeStyle = (theme) => css `
|
|
37
|
+
margin: 0 ${theme.spacing[1]} ${theme.spacing[1]} ${theme.spacing[1]};
|
|
38
|
+
padding: ${theme.spacing[2]};
|
|
39
|
+
background: ${theme.color.fillSecondary};
|
|
40
|
+
border-radius: ${theme.radius.xs};
|
|
41
|
+
font-size: ${theme.font.size.xs};
|
|
42
|
+
font-family: ${theme.font.familyMono};
|
|
43
|
+
color: ${theme.color.textSecondary};
|
|
44
|
+
white-space: pre-wrap;
|
|
45
|
+
word-break: break-all;
|
|
46
|
+
max-height: 200px;
|
|
47
|
+
overflow: auto;
|
|
48
|
+
`;
|
|
49
|
+
/**
|
|
50
|
+
* ExpandableRow — visual shell for expandable list items.
|
|
51
|
+
* Wraps ExpandableItem (headless behavior) with container-highlight styling:
|
|
52
|
+
* left border + fillSubtle background when expanded, border-bottom separator, hover effect.
|
|
53
|
+
*/
|
|
54
|
+
export function ExpandableRow({ expandable = true, defaultExpanded = false, expanded: controlledExpanded, onToggle, renderSummary, renderDetail, showChevron = false, detailVariant = 'default', animationDuration = 150, className, }) {
|
|
55
|
+
const theme = useTheme();
|
|
56
|
+
return (_jsx(ExpandableItem, { expandable: expandable, defaultExpanded: defaultExpanded, expanded: controlledExpanded, onToggle: onToggle, renderSummary: ({ expanded, toggle }) => (_jsx("div", { css: containerStyle(theme, expanded), children: _jsxs("div", { css: summaryStyle(theme, expanded), onClick: toggle, "data-testid": "expandable-summary", children: [showChevron && (_jsx("span", { css: css `
|
|
57
|
+
flex-shrink: 0;
|
|
58
|
+
margin-right: ${theme.spacing['0.5']};
|
|
59
|
+
color: ${theme.color.textTertiary};
|
|
60
|
+
display: flex;
|
|
61
|
+
align-items: center;
|
|
62
|
+
`, children: expanded ? _jsx(ChevronDown, { size: 12 }) : _jsx(ChevronRight, { size: 12 }) })), _jsx("div", { css: css `
|
|
63
|
+
flex: 1;
|
|
64
|
+
min-width: 0;
|
|
65
|
+
`, children: renderSummary({ expanded, toggle }) })] }) })), renderDetail: renderDetail
|
|
66
|
+
? () => (_jsx("div", { "data-testid": "expandable-detail", children: _jsx("div", { css: detailVariant === 'code' ? detailCodeStyle(theme) : detailDefaultStyle(theme), children: renderDetail() }) }))
|
|
67
|
+
: undefined, animationDuration: animationDuration, className: className }));
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=ExpandableRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpandableRow.js","sourceRoot":"","sources":["../../src/components/ExpandableRow.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Props for the InfoRow component. */
|
|
2
|
+
export interface InfoRowProps {
|
|
3
|
+
/** Label displayed on the left. */
|
|
4
|
+
label: string;
|
|
5
|
+
/** Text value passed to CopyValue for clipboard copy. */
|
|
6
|
+
text: string;
|
|
7
|
+
/** Value content rendered on the right (typically formatted value). */
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* InfoRow — key-value display row with click-to-copy on the value.
|
|
12
|
+
* Label on left, CopyValue on right.
|
|
13
|
+
*/
|
|
14
|
+
export declare function InfoRow({ label, text, children }: InfoRowProps): import("@emotion/react/jsx-runtime").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=InfoRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InfoRow.d.ts","sourceRoot":"","sources":["../../src/components/InfoRow.tsx"],"names":[],"mappings":"AAMA,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAiBD;;;GAGG;AACH,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,YAAY,oDAQ9D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
|
2
|
+
/** @jsxImportSource @emotion/react */
|
|
3
|
+
import { useTheme } from '@agentskillmania/skill-ui-theme';
|
|
4
|
+
import { css } from '@emotion/react';
|
|
5
|
+
import { CopyValue } from './CopyValue.js';
|
|
6
|
+
/** Key-value row style. */
|
|
7
|
+
const rowStyle = (theme) => css `
|
|
8
|
+
display: flex;
|
|
9
|
+
justify-content: space-between;
|
|
10
|
+
align-items: center;
|
|
11
|
+
gap: ${theme.spacing['2']};
|
|
12
|
+
padding: 2px 0;
|
|
13
|
+
font-size: ${theme.font.size.sm};
|
|
14
|
+
`;
|
|
15
|
+
const labelStyle = (theme) => css `
|
|
16
|
+
color: ${theme.color.textSecondary};
|
|
17
|
+
flex-shrink: 0;
|
|
18
|
+
`;
|
|
19
|
+
/**
|
|
20
|
+
* InfoRow — key-value display row with click-to-copy on the value.
|
|
21
|
+
* Label on left, CopyValue on right.
|
|
22
|
+
*/
|
|
23
|
+
export function InfoRow({ label, text, children }) {
|
|
24
|
+
const theme = useTheme();
|
|
25
|
+
return (_jsxs("div", { css: rowStyle(theme), children: [_jsx("span", { css: labelStyle(theme), children: label }), _jsx(CopyValue, { text: text, children: children })] }));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=InfoRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InfoRow.js","sourceRoot":"","sources":["../../src/components/InfoRow.tsx"],"names":[],"mappings":";AAAA,sCAAsC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAY3C,2BAA2B;AAC3B,MAAM,QAAQ,GAAG,CAAC,KAAkC,EAAE,EAAE,CAAC,GAAG,CAAA;;;;SAInD,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;;eAEZ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;CAChC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAkC,EAAE,EAAE,CAAC,GAAG,CAAA;WACnD,KAAK,CAAC,KAAK,CAAC,aAAa;;CAEnC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAgB;IAC7D,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,OAAO,CACL,eAAK,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,aACvB,eAAM,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,YAAG,KAAK,GAAQ,EAC5C,KAAC,SAAS,IAAC,IAAI,EAAE,IAAI,YAAG,QAAQ,GAAa,IACzC,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Props for the MetricTile component. */
|
|
2
|
+
export interface MetricTileProps {
|
|
3
|
+
/** Statistic title label. */
|
|
4
|
+
title: string;
|
|
5
|
+
/** Statistic value — string for formatted values, number for raw counts. */
|
|
6
|
+
value: string | number;
|
|
7
|
+
/** Optional style override for the Statistic value (e.g. color: error). */
|
|
8
|
+
valueStyle?: React.CSSProperties;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* MetricTile — small card wrapping antd Statistic with consistent styling.
|
|
12
|
+
* Used for displaying metric values (step count, token count, etc.).
|
|
13
|
+
*/
|
|
14
|
+
export declare function MetricTile({ title, value, valueStyle }: MetricTileProps): import("@emotion/react/jsx-runtime").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=MetricTile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetricTile.d.ts","sourceRoot":"","sources":["../../src/components/MetricTile.tsx"],"names":[],"mappings":"AAMA,0CAA0C;AAC1C,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAClC;AAsBD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,eAAe,oDAOvE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx } from "@emotion/react/jsx-runtime";
|
|
2
|
+
import { useTheme } from '@agentskillmania/skill-ui-theme';
|
|
3
|
+
import { css } from '@emotion/react';
|
|
4
|
+
import { Statistic } from 'antd';
|
|
5
|
+
/** Tile style — background card for a single antd Statistic. */
|
|
6
|
+
const tileStyle = (theme) => css `
|
|
7
|
+
background: ${theme.color.fillSecondary};
|
|
8
|
+
border-radius: ${theme.radius.base};
|
|
9
|
+
padding: ${theme.spacing['2']};
|
|
10
|
+
text-align: center;
|
|
11
|
+
|
|
12
|
+
.ant-statistic-title {
|
|
13
|
+
font-size: 10px;
|
|
14
|
+
color: ${theme.color.textSecondary};
|
|
15
|
+
margin-bottom: 2px;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.ant-statistic-content {
|
|
19
|
+
font-size: ${theme.font.size.base};
|
|
20
|
+
font-weight: ${theme.font.weight.bold};
|
|
21
|
+
color: ${theme.color.text};
|
|
22
|
+
}
|
|
23
|
+
`;
|
|
24
|
+
/**
|
|
25
|
+
* MetricTile — small card wrapping antd Statistic with consistent styling.
|
|
26
|
+
* Used for displaying metric values (step count, token count, etc.).
|
|
27
|
+
*/
|
|
28
|
+
export function MetricTile({ title, value, valueStyle }) {
|
|
29
|
+
const theme = useTheme();
|
|
30
|
+
return (_jsx("div", { css: tileStyle(theme), children: _jsx(Statistic, { title: title, value: value, styles: { content: valueStyle } }) }));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=MetricTile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetricTile.js","sourceRoot":"","sources":["../../src/components/MetricTile.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAYjC,gEAAgE;AAChE,MAAM,SAAS,GAAG,CAAC,KAAY,EAAE,EAAE,CAAC,GAAG,CAAA;gBACvB,KAAK,CAAC,KAAK,CAAC,aAAa;mBACtB,KAAK,CAAC,MAAM,CAAC,IAAI;aACvB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;;;;;aAKlB,KAAK,CAAC,KAAK,CAAC,aAAa;;;;;iBAKrB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;mBAClB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;aAC5B,KAAK,CAAC,KAAK,CAAC,IAAI;;CAE5B,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAmB;IACtE,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,OAAO,CACL,cAAK,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,YACxB,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,GAAI,GACtE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Props for the PaginationBar component. */
|
|
2
|
+
export interface PaginationBarProps {
|
|
3
|
+
/** 1-indexed current page. */
|
|
4
|
+
current: number;
|
|
5
|
+
/** Number of items per page. */
|
|
6
|
+
pageSize: number;
|
|
7
|
+
/** Total item count. */
|
|
8
|
+
total: number;
|
|
9
|
+
/** Callback fired when the page changes. */
|
|
10
|
+
onChange: (page: number) => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* PaginationBar — antd Pagination hidden when total fits within a single page,
|
|
14
|
+
* wrapped in a right-aligned container with consistent top spacing.
|
|
15
|
+
*/
|
|
16
|
+
export declare function PaginationBar({ current, pageSize, total, onChange }: PaginationBarProps): import("@emotion/react/jsx-runtime").JSX.Element | null;
|
|
17
|
+
//# sourceMappingURL=PaginationBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaginationBar.d.ts","sourceRoot":"","sources":["../../src/components/PaginationBar.tsx"],"names":[],"mappings":"AAIA,6CAA6C;AAC7C,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAQD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,2DAOvF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx } from "@emotion/react/jsx-runtime";
|
|
2
|
+
/** @jsxImportSource @emotion/react */
|
|
3
|
+
import { css } from '@emotion/react';
|
|
4
|
+
import { Pagination } from 'antd';
|
|
5
|
+
const barStyle = css `
|
|
6
|
+
margin-top: 24px;
|
|
7
|
+
display: flex;
|
|
8
|
+
justify-content: flex-end;
|
|
9
|
+
`;
|
|
10
|
+
/**
|
|
11
|
+
* PaginationBar — antd Pagination hidden when total fits within a single page,
|
|
12
|
+
* wrapped in a right-aligned container with consistent top spacing.
|
|
13
|
+
*/
|
|
14
|
+
export function PaginationBar({ current, pageSize, total, onChange }) {
|
|
15
|
+
if (total <= pageSize)
|
|
16
|
+
return null;
|
|
17
|
+
return (_jsx("div", { css: barStyle, children: _jsx(Pagination, { current: current, pageSize: pageSize, total: total, onChange: onChange }) }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=PaginationBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaginationBar.js","sourceRoot":"","sources":["../../src/components/PaginationBar.tsx"],"names":[],"mappings":";AAAA,sCAAsC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAclC,MAAM,QAAQ,GAAG,GAAG,CAAA;;;;CAInB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAsB;IACtF,IAAI,KAAK,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,CACL,cAAK,GAAG,EAAE,QAAQ,YAChB,KAAC,UAAU,IAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI,GAClF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { LucideIcon } from 'lucide-react';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
export interface SectionHeaderProps {
|
|
4
|
+
/** Section icon (rendered at 14px). */
|
|
5
|
+
icon: LucideIcon;
|
|
6
|
+
/** Section label (rendered uppercase via CSS). */
|
|
7
|
+
title: string;
|
|
8
|
+
/** Right-aligned extra content. */
|
|
9
|
+
extra?: ReactNode;
|
|
10
|
+
/** Optional explicit icon color. Defaults to inheriting from container (textSecondary). */
|
|
11
|
+
iconColor?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Renders a section header with icon, uppercase title, and optional extra content. */
|
|
14
|
+
export declare function SectionHeader({ icon: Icon, title, extra, iconColor }: SectionHeaderProps): import("@emotion/react/jsx-runtime").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=SectionHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionHeader.d.ts","sourceRoot":"","sources":["../../src/components/SectionHeader.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,kBAAkB;IACjC,uCAAuC;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,kBAAkB,oDAoDxF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
|
2
|
+
import { useTheme } from '@agentskillmania/skill-ui-theme';
|
|
3
|
+
import { css } from '@emotion/react';
|
|
4
|
+
/** Renders a section header with icon, uppercase title, and optional extra content. */
|
|
5
|
+
export function SectionHeader({ icon: Icon, title, extra, iconColor }) {
|
|
6
|
+
const theme = useTheme();
|
|
7
|
+
return (_jsxs("div", { css: css `
|
|
8
|
+
display: flex;
|
|
9
|
+
align-items: center;
|
|
10
|
+
gap: ${theme.spacing[1]};
|
|
11
|
+
padding: ${theme.spacing[1]} 0;
|
|
12
|
+
font-size: ${theme.font.size.xs};
|
|
13
|
+
font-weight: ${theme.font.weight.bold};
|
|
14
|
+
text-transform: uppercase;
|
|
15
|
+
letter-spacing: 0.5px;
|
|
16
|
+
color: ${theme.color.textSecondary};
|
|
17
|
+
`, children: [_jsx(Icon, { size: 14, css: iconColor
|
|
18
|
+
? css `
|
|
19
|
+
color: ${iconColor};
|
|
20
|
+
flex-shrink: 0;
|
|
21
|
+
`
|
|
22
|
+
: css `
|
|
23
|
+
flex-shrink: 0;
|
|
24
|
+
` }), title, _jsx("div", { css: css `
|
|
25
|
+
flex: 1;
|
|
26
|
+
height: 1px;
|
|
27
|
+
background: ${theme.color.borderSecondary};
|
|
28
|
+
` }), extra && (_jsx("span", { "data-testid": "section-extra", css: css `
|
|
29
|
+
margin-left: auto;
|
|
30
|
+
font-size: ${theme.font.size.xs};
|
|
31
|
+
color: ${theme.color.textTertiary};
|
|
32
|
+
`, children: extra }))] }));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=SectionHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionHeader.js","sourceRoot":"","sources":["../../src/components/SectionHeader.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAerC,uFAAuF;AACvF,MAAM,UAAU,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAsB;IACvF,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,OAAO,CACL,eACE,GAAG,EAAE,GAAG,CAAA;;;eAGC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;mBACZ,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;qBACd,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;uBAChB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;;;iBAG5B,KAAK,CAAC,KAAK,CAAC,aAAa;OACnC,aAED,KAAC,IAAI,IACH,IAAI,EAAE,EAAE,EACR,GAAG,EACD,SAAS;oBACP,CAAC,CAAC,GAAG,CAAA;yBACQ,SAAS;;eAEnB;oBACH,CAAC,CAAC,GAAG,CAAA;;eAEF,GAEP,EACD,KAAK,EACN,cACE,GAAG,EAAE,GAAG,CAAA;;;wBAGQ,KAAK,CAAC,KAAK,CAAC,eAAe;SAC1C,GACD,EACD,KAAK,IAAI,CACR,8BACc,eAAe,EAC3B,GAAG,EAAE,GAAG,CAAA;;yBAEO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACtB,KAAK,CAAC,KAAK,CAAC,YAAY;WAClC,YAEA,KAAK,GACD,CACR,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { SectionHeader } from './SectionHeader.js';
|
|
3
|
+
import type { SectionHeaderProps } from './SectionHeader.js';
|
|
4
|
+
declare const meta: Meta<typeof SectionHeader>;
|
|
5
|
+
export default meta;
|
|
6
|
+
type Story = StoryObj<SectionHeaderProps>;
|
|
7
|
+
/** Default section header with icon and title. */
|
|
8
|
+
export declare const Default: Story;
|
|
9
|
+
/** Section header with extra content aligned to the right. */
|
|
10
|
+
export declare const WithExtra: Story;
|
|
11
|
+
/** Multiple headers stacked to demonstrate the divider pattern. */
|
|
12
|
+
export declare const MultipleHeaders: Story;
|
|
13
|
+
//# sourceMappingURL=SectionHeader.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionHeader.stories.d.ts","sourceRoot":"","sources":["../../src/components/SectionHeader.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAOpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAE1C,kDAAkD;AAClD,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,eAAe,EAAE,KAQ7B,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
|
2
|
+
import { Cpu, Wrench, Settings } from 'lucide-react';
|
|
3
|
+
import { SectionHeader } from './SectionHeader.js';
|
|
4
|
+
const meta = {
|
|
5
|
+
title: 'Shared/SectionHeader',
|
|
6
|
+
component: SectionHeader,
|
|
7
|
+
tags: ['autodocs'],
|
|
8
|
+
argTypes: {
|
|
9
|
+
icon: { control: false },
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
export default meta;
|
|
13
|
+
/** Default section header with icon and title. */
|
|
14
|
+
export const Default = {
|
|
15
|
+
args: {
|
|
16
|
+
icon: Cpu,
|
|
17
|
+
title: 'Agent State',
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
/** Section header with extra content aligned to the right. */
|
|
21
|
+
export const WithExtra = {
|
|
22
|
+
args: {
|
|
23
|
+
icon: Wrench,
|
|
24
|
+
title: 'Skills',
|
|
25
|
+
extra: _jsx("span", { children: "3 active" }),
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
/** Multiple headers stacked to demonstrate the divider pattern. */
|
|
29
|
+
export const MultipleHeaders = {
|
|
30
|
+
render: () => (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '16px' }, children: [_jsx(SectionHeader, { icon: Cpu, title: "Agent State" }), _jsx(SectionHeader, { icon: Wrench, title: "Skills", extra: _jsx("span", { children: "3 active" }) }), _jsx(SectionHeader, { icon: Settings, title: "Configuration" })] })),
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=SectionHeader.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionHeader.stories.js","sourceRoot":"","sources":["../../src/components/SectionHeader.stories.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,MAAM,IAAI,GAA+B;IACvC,KAAK,EAAE,sBAAsB;IAC7B,SAAS,EAAE,aAAa;IACxB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,QAAQ,EAAE;QACR,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;KACzB;CACF,CAAC;AAEF,eAAe,IAAI,CAAC;AAGpB,kDAAkD;AAClD,MAAM,CAAC,MAAM,OAAO,GAAU;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,aAAa;KACrB;CACF,CAAC;AAEF,8DAA8D;AAC9D,MAAM,CAAC,MAAM,SAAS,GAAU;IAC9B,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,sCAAqB;KAC7B;CACF,CAAC;AAEF,mEAAmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAU;IACpC,MAAM,EAAE,GAAG,EAAE,CAAC,CACZ,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,aACnE,KAAC,aAAa,IAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAC,aAAa,GAAG,EAChD,KAAC,aAAa,IAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAC,QAAQ,EAAC,KAAK,EAAE,sCAAqB,GAAI,EAC5E,KAAC,aAAa,IAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAC,eAAe,GAAG,IACnD,CACP;CACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Props for the SectionLabel component. */
|
|
2
|
+
export interface SectionLabelProps {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* SectionLabel — muted uppercase label above a content block.
|
|
7
|
+
* Canonical style: xs, semibold, textSecondary, uppercase, 0.3px letter-spacing.
|
|
8
|
+
*/
|
|
9
|
+
export declare function SectionLabel({ children }: SectionLabelProps): import("@emotion/react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=SectionLabel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionLabel.d.ts","sourceRoot":"","sources":["../../src/components/SectionLabel.tsx"],"names":[],"mappings":"AAIA,4CAA4C;AAC5C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAYD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,oDAG3D"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsx as _jsx } from "@emotion/react/jsx-runtime";
|
|
2
|
+
/** @jsxImportSource @emotion/react */
|
|
3
|
+
import { useTheme } from '@agentskillmania/skill-ui-theme';
|
|
4
|
+
import { css } from '@emotion/react';
|
|
5
|
+
/** Canonical section label style — uppercase muted label. */
|
|
6
|
+
const labelStyle = (theme) => css `
|
|
7
|
+
font-size: ${theme.font.size.xs};
|
|
8
|
+
font-weight: ${theme.font.weight.semibold};
|
|
9
|
+
color: ${theme.color.textSecondary};
|
|
10
|
+
text-transform: uppercase;
|
|
11
|
+
letter-spacing: 0.3px;
|
|
12
|
+
margin-bottom: ${theme.spacing[1]};
|
|
13
|
+
`;
|
|
14
|
+
/**
|
|
15
|
+
* SectionLabel — muted uppercase label above a content block.
|
|
16
|
+
* Canonical style: xs, semibold, textSecondary, uppercase, 0.3px letter-spacing.
|
|
17
|
+
*/
|
|
18
|
+
export function SectionLabel({ children }) {
|
|
19
|
+
const theme = useTheme();
|
|
20
|
+
return _jsx("div", { css: labelStyle(theme), children: children });
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=SectionLabel.js.map
|