@efolusi/meridian 1.5.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/README.md +12 -0
- package/ai/AgentRun.d.ts +20 -0
- package/ai/AgentRun.js +100 -0
- package/ai/ChatMessage.d.ts +19 -0
- package/ai/ChatMessage.js +81 -0
- package/ai/Citation.d.ts +23 -0
- package/ai/Citation.js +146 -0
- package/ai/Confirmation.d.ts +26 -0
- package/ai/Confirmation.js +84 -0
- package/ai/Conversation.d.ts +15 -0
- package/ai/Conversation.js +81 -0
- package/ai/DocumentCard.d.ts +17 -0
- package/ai/DocumentCard.js +101 -0
- package/ai/FeedbackBar.d.ts +14 -0
- package/ai/FeedbackBar.js +84 -0
- package/ai/GeneratedImage.d.ts +22 -0
- package/ai/GeneratedImage.js +100 -0
- package/ai/ModelSelector.d.ts +21 -0
- package/ai/ModelSelector.js +112 -0
- package/ai/Player.d.ts +18 -0
- package/ai/Player.js +201 -0
- package/ai/PromptComposer.d.ts +28 -0
- package/ai/PromptComposer.js +111 -0
- package/ai/PromptSteps.d.ts +18 -0
- package/ai/PromptSteps.js +167 -0
- package/ai/Reasoning.d.ts +17 -0
- package/ai/Reasoning.js +57 -0
- package/ai/RichComposer.d.ts +25 -0
- package/ai/RichComposer.js +247 -0
- package/ai/Sandbox.d.ts +20 -0
- package/ai/Sandbox.js +96 -0
- package/ai/SelectionQuote.d.ts +15 -0
- package/ai/SelectionQuote.js +123 -0
- package/ai/SourceCard.d.ts +17 -0
- package/ai/SourceCard.js +57 -0
- package/ai/Suggestions.d.ts +10 -0
- package/ai/Suggestions.js +38 -0
- package/ai/Task.d.ts +15 -0
- package/ai/Task.js +49 -0
- package/ai/Todo.d.ts +13 -0
- package/ai/Todo.js +87 -0
- package/ai/ToolCall.d.ts +30 -0
- package/ai/ToolCall.js +147 -0
- package/ai/Transcript.d.ts +27 -0
- package/ai/Transcript.js +96 -0
- package/ai/UsageMeter.d.ts +21 -0
- package/ai/UsageMeter.js +81 -0
- package/ai/WebPreview.d.ts +19 -0
- package/ai/WebPreview.js +179 -0
- package/assets/fonts/BricolageGrotesque-Variable.ttf +0 -0
- package/assets/fonts/Figtree-Italic-Variable.ttf +0 -0
- package/assets/fonts/Figtree-Variable.ttf +0 -0
- package/assets/fonts/JetBrainsMono-Italic-Variable.ttf +0 -0
- package/assets/fonts/JetBrainsMono-Variable.ttf +0 -0
- package/assets/fonts/OFL-BricolageGrotesque.txt +93 -0
- package/assets/fonts/OFL-Figtree.txt +93 -0
- package/assets/fonts/OFL-JetBrainsMono.txt +93 -0
- package/code/CodeBlock.d.ts +17 -0
- package/code/CodeBlock.js +99 -0
- package/code/Console.d.ts +19 -0
- package/code/Console.js +124 -0
- package/code/CopyField.d.ts +10 -0
- package/code/CopyField.js +54 -0
- package/code/Diff.d.ts +26 -0
- package/code/Diff.js +358 -0
- package/code/EnvList.d.ts +14 -0
- package/code/EnvList.js +89 -0
- package/code/Exception.d.ts +25 -0
- package/code/Exception.js +90 -0
- package/code/Terminal.d.ts +20 -0
- package/code/Terminal.js +58 -0
- package/data/BarChart.d.ts +14 -0
- package/data/BarChart.js +44 -0
- package/data/DonutChart.d.ts +17 -0
- package/data/DonutChart.js +114 -0
- package/data/EmptyState.d.ts +13 -0
- package/data/EmptyState.js +39 -0
- package/data/KeyValueList.d.ts +14 -0
- package/data/KeyValueList.js +34 -0
- package/data/LineChart.d.ts +15 -0
- package/data/LineChart.js +85 -0
- package/data/Skeleton.d.ts +11 -0
- package/data/Skeleton.js +49 -0
- package/data/Sparkline.d.ts +14 -0
- package/data/Sparkline.js +42 -0
- package/data/Stat.d.ts +14 -0
- package/data/Stat.js +40 -0
- package/data/StatusDot.d.ts +10 -0
- package/data/StatusDot.js +34 -0
- package/data/Table.d.ts +53 -0
- package/data/Table.js +174 -0
- package/dates/Calendar.d.ts +8 -0
- package/dates/Calendar.js +143 -0
- package/dates/DatePicker.d.ts +12 -0
- package/dates/DatePicker.js +118 -0
- package/display/Accordion.d.ts +15 -0
- package/display/Accordion.js +52 -0
- package/display/AspectRatio.d.ts +8 -0
- package/display/AspectRatio.js +24 -0
- package/display/Avatar.d.ts +17 -0
- package/display/Avatar.js +52 -0
- package/display/Badge.d.ts +10 -0
- package/display/Badge.js +34 -0
- package/display/Card.d.ts +17 -0
- package/display/Card.js +51 -0
- package/display/Carousel.d.ts +16 -0
- package/display/Carousel.js +97 -0
- package/display/Collapsible.d.ts +12 -0
- package/display/Collapsible.js +46 -0
- package/display/Divider.d.ts +9 -0
- package/display/Divider.js +33 -0
- package/display/Kbd.d.ts +7 -0
- package/display/Kbd.js +18 -0
- package/display/Link.d.ts +12 -0
- package/display/Link.js +41 -0
- package/display/ListItem.d.ts +19 -0
- package/display/ListItem.js +61 -0
- package/display/Resizable.d.ts +16 -0
- package/display/Resizable.js +90 -0
- package/display/ScrollArea.d.ts +8 -0
- package/display/ScrollArea.js +28 -0
- package/display/Tag.d.ts +9 -0
- package/display/Tag.js +41 -0
- package/display/Toolbar.d.ts +22 -0
- package/display/Toolbar.js +55 -0
- package/display/TreeList.d.ts +20 -0
- package/display/TreeList.js +101 -0
- package/feedback/Alert.d.ts +14 -0
- package/feedback/Alert.js +56 -0
- package/feedback/Banner.d.ts +15 -0
- package/feedback/Banner.js +49 -0
- package/feedback/ConfirmDialog.d.ts +18 -0
- package/feedback/ConfirmDialog.js +49 -0
- package/feedback/Dialog.d.ts +13 -0
- package/feedback/Dialog.js +107 -0
- package/feedback/Loader.d.ts +12 -0
- package/feedback/Loader.js +41 -0
- package/feedback/Progress.d.ts +15 -0
- package/feedback/Progress.js +48 -0
- package/feedback/Spinner.d.ts +9 -0
- package/feedback/Spinner.js +38 -0
- package/feedback/Toast.d.ts +70 -0
- package/feedback/Toast.js +216 -0
- package/feedback/Tooltip.d.ts +12 -0
- package/feedback/Tooltip.js +86 -0
- package/files/FileDrop.d.ts +15 -0
- package/files/FileDrop.js +75 -0
- package/files/FileTile.d.ts +19 -0
- package/files/FileTile.js +96 -0
- package/files/FileTypeIcon.d.ts +11 -0
- package/files/FileTypeIcon.js +121 -0
- package/finance/PaymentCard.d.ts +17 -0
- package/finance/PaymentCard.js +109 -0
- package/forms/Button.d.ts +15 -0
- package/forms/Button.js +82 -0
- package/forms/ButtonGroup.d.ts +5 -0
- package/forms/ButtonGroup.js +22 -0
- package/forms/ButtonTile.d.ts +21 -0
- package/forms/ButtonTile.js +69 -0
- package/forms/Checkbox.d.ts +6 -0
- package/forms/Checkbox.js +52 -0
- package/forms/Combobox.d.ts +17 -0
- package/forms/Combobox.js +162 -0
- package/forms/DigitEntry.d.ts +15 -0
- package/forms/DigitEntry.js +88 -0
- package/forms/FormField.d.ts +39 -0
- package/forms/FormField.js +127 -0
- package/forms/IconButton.d.ts +11 -0
- package/forms/IconButton.js +41 -0
- package/forms/Input.d.ts +14 -0
- package/forms/Input.js +75 -0
- package/forms/InputGroup.d.ts +15 -0
- package/forms/InputGroup.js +59 -0
- package/forms/Label.d.ts +11 -0
- package/forms/Label.js +29 -0
- package/forms/Radio.d.ts +6 -0
- package/forms/Radio.js +46 -0
- package/forms/Select.d.ts +10 -0
- package/forms/Select.js +68 -0
- package/forms/Slider.d.ts +18 -0
- package/forms/Slider.js +75 -0
- package/forms/Switch.d.ts +6 -0
- package/forms/Switch.js +46 -0
- package/forms/Textarea.d.ts +8 -0
- package/forms/Textarea.js +58 -0
- package/forms/Toggle.d.ts +26 -0
- package/forms/Toggle.js +85 -0
- package/icons/Icon.d.ts +13 -0
- package/icons/Icon.js +54 -0
- package/index.d.ts +106 -0
- package/index.js +106 -0
- package/navigation/Breadcrumbs.d.ts +12 -0
- package/navigation/Breadcrumbs.js +41 -0
- package/navigation/Menubar.d.ts +10 -0
- package/navigation/Menubar.js +173 -0
- package/navigation/PageControl.d.ts +11 -0
- package/navigation/PageControl.js +36 -0
- package/navigation/Pagination.d.ts +9 -0
- package/navigation/Pagination.js +68 -0
- package/navigation/SegmentedControl.d.ts +17 -0
- package/navigation/SegmentedControl.js +42 -0
- package/navigation/SideNav.d.ts +18 -0
- package/navigation/SideNav.js +87 -0
- package/navigation/Steps.d.ts +15 -0
- package/navigation/Steps.js +61 -0
- package/navigation/Tabs.d.ts +17 -0
- package/navigation/Tabs.js +76 -0
- package/navigation/TopNav.d.ts +10 -0
- package/navigation/TopNav.js +26 -0
- package/overlay/CommandPalette.d.ts +21 -0
- package/overlay/CommandPalette.js +164 -0
- package/overlay/ContextMenu.d.ts +11 -0
- package/overlay/ContextMenu.js +140 -0
- package/overlay/Drawer.d.ts +14 -0
- package/overlay/Drawer.js +99 -0
- package/overlay/HoverCard.d.ts +17 -0
- package/overlay/HoverCard.js +74 -0
- package/overlay/Menu.d.ts +24 -0
- package/overlay/Menu.js +153 -0
- package/overlay/Popover.d.ts +16 -0
- package/overlay/Popover.js +96 -0
- package/overlay/Portal.d.ts +10 -0
- package/overlay/Portal.js +127 -0
- package/package.json +41 -0
- package/styles.css +6 -0
- package/tokens/base.css +10 -0
- package/tokens/colors.css +38 -0
- package/tokens/effects.css +22 -0
- package/tokens/fonts.css +5 -0
- package/tokens/spacing.css +12 -0
- package/tokens/typography.css +9 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface ExceptionFrame {
|
|
2
|
+
/** Function name */
|
|
3
|
+
fn: string;
|
|
4
|
+
/** e.g. 'api/users.ts:32:11' */
|
|
5
|
+
loc: string;
|
|
6
|
+
active?: boolean;
|
|
7
|
+
/** Dimmed framework frame */
|
|
8
|
+
internal?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ExceptionSourceLine {
|
|
11
|
+
no: number;
|
|
12
|
+
text: string;
|
|
13
|
+
active?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface ExceptionProps {
|
|
16
|
+
/** e.g. 'TypeError' */
|
|
17
|
+
type?: string;
|
|
18
|
+
message: React.ReactNode;
|
|
19
|
+
frames?: ExceptionFrame[];
|
|
20
|
+
source?: { title: string; lines: ExceptionSourceLine[] };
|
|
21
|
+
defaultOpen?: boolean;
|
|
22
|
+
style?: React.CSSProperties;
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function Exception(props: ExceptionProps): React.JSX.Element;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { injectEfCss } from "../forms/Button.js";
|
|
4
|
+
import { Icon } from "../icons/Icon.js";
|
|
5
|
+
const CSS = `
|
|
6
|
+
.ef-exception{border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-card);font-family:var(--font-sans);overflow:hidden}
|
|
7
|
+
.ef-exception__head{display:flex;align-items:flex-start;gap:10px;padding:11px 14px}
|
|
8
|
+
.ef-exception__type{flex:none;margin-top:1px;padding:2px 7px;border-radius:var(--radius-sm);background:var(--danger-100);color:var(--danger-600);font-family:var(--font-mono);font-size:11px;font-weight:var(--weight-semibold)}
|
|
9
|
+
.ef-exception__msg{flex:1;min-width:0;font-size:13.5px;line-height:1.5;color:var(--text-primary)}
|
|
10
|
+
.ef-exception__toggle{flex:none;display:inline-flex;align-items:center;gap:4px;border:none;background:none;cursor:pointer;padding:3px 7px;border-radius:var(--radius-sm);font-family:var(--font-sans);font-size:12px;color:var(--text-muted);transition:color var(--dur-fast) var(--ease-out),background var(--dur-fast) var(--ease-out)}
|
|
11
|
+
.ef-exception__toggle:hover{color:var(--text-primary);background:var(--surface-subtle)}
|
|
12
|
+
.ef-exception__toggle:focus-visible{outline:none;box-shadow:var(--focus-ring)}
|
|
13
|
+
.ef-exception__chev{display:inline-flex;transition:transform var(--dur-fast) var(--ease-out)}
|
|
14
|
+
.ef-exception--open .ef-exception__chev{transform:rotate(90deg)}
|
|
15
|
+
.ef-exception__body{display:grid;grid-template-rows:0fr;transition:grid-template-rows var(--dur-med) var(--ease-out)}
|
|
16
|
+
.ef-exception--open .ef-exception__body{grid-template-rows:1fr}
|
|
17
|
+
.ef-exception__clip{overflow:hidden;min-height:0}
|
|
18
|
+
.ef-exception__frames{margin:0 14px 12px;padding:0;list-style:none;border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--surface-subtle);overflow:hidden;font-family:var(--font-mono);font-size:11.5px;line-height:1.5}
|
|
19
|
+
.ef-exception__frame{display:flex;align-items:baseline;gap:10px;padding:5px 11px;border-left:2px solid transparent}
|
|
20
|
+
.ef-exception__frame--active{border-left-color:var(--danger-600);background:var(--danger-100)}
|
|
21
|
+
.ef-exception__frame--internal{opacity:.5}
|
|
22
|
+
.ef-exception__fn{flex:none;color:var(--text-primary)}
|
|
23
|
+
.ef-exception__loc{margin-left:auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-muted)}
|
|
24
|
+
.ef-exception__src{margin:0 14px 12px;border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--surface-subtle);overflow:hidden}
|
|
25
|
+
.ef-exception__srchead{display:flex;align-items:center;gap:8px;padding:6px 11px;border-bottom:1px solid var(--border-default);font-family:var(--font-mono);font-size:11px;color:var(--text-muted)}
|
|
26
|
+
.ef-exception__code{margin:0;padding:8px 0;font-family:var(--font-mono);font-size:12px;line-height:1.7;color:var(--text-secondary);overflow-x:auto}
|
|
27
|
+
.ef-exception__ln{display:flex;padding:0 11px;border-left:2px solid transparent;white-space:pre}
|
|
28
|
+
.ef-exception__ln--active{border-left-color:var(--danger-600);background:var(--danger-100);color:var(--danger-600)}
|
|
29
|
+
.ef-exception__no{flex:none;width:34px;color:var(--text-muted);user-select:none}
|
|
30
|
+
`;
|
|
31
|
+
export function Exception({
|
|
32
|
+
type = 'Error',
|
|
33
|
+
message,
|
|
34
|
+
frames = [],
|
|
35
|
+
source,
|
|
36
|
+
defaultOpen = false,
|
|
37
|
+
style,
|
|
38
|
+
className,
|
|
39
|
+
...rest
|
|
40
|
+
}) {
|
|
41
|
+
injectEfCss('ef-css-exception', CSS);
|
|
42
|
+
const [open, setOpen] = React.useState(!!defaultOpen);
|
|
43
|
+
return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
|
|
44
|
+
className: `ef-exception${open ? ' ef-exception--open' : ''}${className ? ' ' + className : ''}`,
|
|
45
|
+
style: style
|
|
46
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
47
|
+
className: "ef-exception__head"
|
|
48
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
49
|
+
className: "ef-exception__type"
|
|
50
|
+
}, type), /*#__PURE__*/React.createElement("span", {
|
|
51
|
+
className: "ef-exception__msg"
|
|
52
|
+
}, message), frames.length || source ? /*#__PURE__*/React.createElement("button", {
|
|
53
|
+
type: "button",
|
|
54
|
+
className: "ef-exception__toggle",
|
|
55
|
+
"aria-expanded": open,
|
|
56
|
+
onClick: () => setOpen(!open)
|
|
57
|
+
}, frames.length ? frames.length + ' frames' : 'Source', /*#__PURE__*/React.createElement("span", {
|
|
58
|
+
className: "ef-exception__chev"
|
|
59
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
60
|
+
name: "chevron-right",
|
|
61
|
+
size: 12
|
|
62
|
+
}))) : null), /*#__PURE__*/React.createElement("div", {
|
|
63
|
+
className: "ef-exception__body"
|
|
64
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
65
|
+
className: "ef-exception__clip"
|
|
66
|
+
}, frames.length ? /*#__PURE__*/React.createElement("ol", {
|
|
67
|
+
className: "ef-exception__frames"
|
|
68
|
+
}, frames.map((f, i) => /*#__PURE__*/React.createElement("li", {
|
|
69
|
+
key: i,
|
|
70
|
+
className: `ef-exception__frame${f.active ? ' ef-exception__frame--active' : ''}${f.internal ? ' ef-exception__frame--internal' : ''}`
|
|
71
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
72
|
+
className: "ef-exception__fn"
|
|
73
|
+
}, f.fn), /*#__PURE__*/React.createElement("span", {
|
|
74
|
+
className: "ef-exception__loc"
|
|
75
|
+
}, f.loc)))) : null, source ? /*#__PURE__*/React.createElement("div", {
|
|
76
|
+
className: "ef-exception__src"
|
|
77
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
78
|
+
className: "ef-exception__srchead"
|
|
79
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
80
|
+
name: "file-text",
|
|
81
|
+
size: 12
|
|
82
|
+
}), source.title), /*#__PURE__*/React.createElement("pre", {
|
|
83
|
+
className: "ef-exception__code"
|
|
84
|
+
}, (source.lines || []).map((l, i) => /*#__PURE__*/React.createElement("span", {
|
|
85
|
+
key: i,
|
|
86
|
+
className: `ef-exception__ln${l.active ? ' ef-exception__ln--active' : ''}`
|
|
87
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
88
|
+
className: "ef-exception__no"
|
|
89
|
+
}, l.no), l.text, '\n')))) : null)));
|
|
90
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface TerminalLine {
|
|
2
|
+
text: string;
|
|
3
|
+
/** cmd gets a $ prompt; ok/err/info are tinted */
|
|
4
|
+
type?: 'cmd' | 'out' | 'ok' | 'err' | 'info';
|
|
5
|
+
/** Muted timestamp prefix */
|
|
6
|
+
time?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface TerminalProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
9
|
+
/** Header label, e.g. "deploy@efolusi-prod" */
|
|
10
|
+
host?: string;
|
|
11
|
+
/** Strings or line objects */
|
|
12
|
+
lines?: Array<string | TerminalLine>;
|
|
13
|
+
/** Blinking caret after the last line */
|
|
14
|
+
live?: boolean;
|
|
15
|
+
/** @default 260 */
|
|
16
|
+
maxHeight?: number;
|
|
17
|
+
style?: React.CSSProperties;
|
|
18
|
+
className?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function Terminal(props: TerminalProps): React.JSX.Element;
|
package/code/Terminal.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { injectEfCss } from "../forms/Button.js";
|
|
4
|
+
const CSS = `
|
|
5
|
+
.ef-term{background:var(--surface-code);border:1px solid var(--border-code);border-radius:var(--radius-md);overflow:hidden}
|
|
6
|
+
.ef-term__head{display:flex;align-items:center;gap:8px;padding:8px 14px;border-bottom:1px solid rgba(250,249,246,.1)}
|
|
7
|
+
.ef-term__host{font-family:var(--font-mono);font-size:11px;color:rgba(250,249,246,.55)}
|
|
8
|
+
.ef-term__dot{width:7px;height:7px;border-radius:var(--radius-full);background:#7FD08D}
|
|
9
|
+
.ef-term__body{padding:12px 16px;font-family:var(--font-mono);font-size:12.5px;line-height:1.7;overflow-x:auto}
|
|
10
|
+
.ef-term__line{white-space:pre-wrap;color:rgba(250,249,246,.82)}
|
|
11
|
+
.ef-term__line--cmd{color:#F8F4E6}
|
|
12
|
+
.ef-term__line--cmd::before{content:'$ ';color:var(--caramel-500)}
|
|
13
|
+
.ef-term__line--ok{color:#7FD08D}
|
|
14
|
+
.ef-term__line--err{color:#F49B93}
|
|
15
|
+
.ef-term__line--info{color:rgba(250,249,246,.55)}
|
|
16
|
+
.ef-term__time{color:rgba(250,249,246,.35);margin-right:10px}
|
|
17
|
+
@keyframes ef-term-caret{0%,100%{opacity:1}50%{opacity:0}}
|
|
18
|
+
.ef-term__caret{display:inline-block;width:7px;height:13px;background:#F8F4E6;vertical-align:-2px;animation:ef-term-caret 1s steps(1) infinite}
|
|
19
|
+
`;
|
|
20
|
+
export function Terminal({
|
|
21
|
+
host,
|
|
22
|
+
lines = [],
|
|
23
|
+
live,
|
|
24
|
+
maxHeight = 260,
|
|
25
|
+
style,
|
|
26
|
+
className,
|
|
27
|
+
...rest
|
|
28
|
+
}) {
|
|
29
|
+
injectEfCss('ef-css-term', CSS);
|
|
30
|
+
return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
|
|
31
|
+
className: `ef-term${className ? ' ' + className : ''}`,
|
|
32
|
+
style: style
|
|
33
|
+
}), host ? /*#__PURE__*/React.createElement("div", {
|
|
34
|
+
className: "ef-term__head"
|
|
35
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
36
|
+
className: "ef-term__dot"
|
|
37
|
+
}), /*#__PURE__*/React.createElement("span", {
|
|
38
|
+
className: "ef-term__host"
|
|
39
|
+
}, host)) : null, /*#__PURE__*/React.createElement("div", {
|
|
40
|
+
className: "ef-term__body",
|
|
41
|
+
style: {
|
|
42
|
+
maxHeight,
|
|
43
|
+
overflowY: 'auto'
|
|
44
|
+
}
|
|
45
|
+
}, lines.map((l, i) => {
|
|
46
|
+
const item = typeof l === 'string' ? {
|
|
47
|
+
text: l
|
|
48
|
+
} : l;
|
|
49
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
50
|
+
key: i,
|
|
51
|
+
className: `ef-term__line${item.type ? ' ef-term__line--' + item.type : ''}`
|
|
52
|
+
}, item.time ? /*#__PURE__*/React.createElement("span", {
|
|
53
|
+
className: "ef-term__time"
|
|
54
|
+
}, item.time) : null, item.text);
|
|
55
|
+
}), live ? /*#__PURE__*/React.createElement("span", {
|
|
56
|
+
className: "ef-term__caret"
|
|
57
|
+
}) : null));
|
|
58
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface BarChartProps {
|
|
2
|
+
/** Numbers, or { value, label } for hover titles */
|
|
3
|
+
data: Array<number | { value: number; label?: string }>;
|
|
4
|
+
/** @default 140 */
|
|
5
|
+
height?: number;
|
|
6
|
+
/** Ink-fill the last N bars */
|
|
7
|
+
highlightLast?: number;
|
|
8
|
+
/** X-axis labels, spread edge to edge */
|
|
9
|
+
labels?: string[];
|
|
10
|
+
formatValue?: (v: number) => string;
|
|
11
|
+
style?: React.CSSProperties;
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function BarChart(props: BarChartProps): React.JSX.Element;
|
package/data/BarChart.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { injectEfCss } from "../forms/Button.js";
|
|
4
|
+
const CSS = `
|
|
5
|
+
.ef-bars{display:flex;align-items:flex-end;gap:3px;width:100%}
|
|
6
|
+
.ef-bars__bar{flex:1;min-width:3px;border-radius:2px 2px 0 0;background:var(--sand-200);transition:background var(--dur-fast) var(--ease-out)}
|
|
7
|
+
.ef-bars__bar--hi{background:var(--accent)}
|
|
8
|
+
.ef-bars__bar:hover{background:var(--brand-700)}
|
|
9
|
+
.ef-bars__labels{display:flex;justify-content:space-between;margin-top:6px;font-family:var(--font-mono);font-size:10px;color:var(--text-muted)}
|
|
10
|
+
`;
|
|
11
|
+
export function BarChart({
|
|
12
|
+
data = [],
|
|
13
|
+
height = 140,
|
|
14
|
+
highlightLast = 0,
|
|
15
|
+
labels,
|
|
16
|
+
formatValue,
|
|
17
|
+
style,
|
|
18
|
+
className,
|
|
19
|
+
...rest
|
|
20
|
+
}) {
|
|
21
|
+
injectEfCss('ef-css-bars', CSS);
|
|
22
|
+
const vals = data.map(d => typeof d === 'number' ? d : d.value);
|
|
23
|
+
const max = Math.max(...vals, 1);
|
|
24
|
+
return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
|
|
25
|
+
className: className,
|
|
26
|
+
style: style
|
|
27
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
28
|
+
className: "ef-bars",
|
|
29
|
+
style: {
|
|
30
|
+
height
|
|
31
|
+
}
|
|
32
|
+
}, vals.map((v, i) => /*#__PURE__*/React.createElement("div", {
|
|
33
|
+
key: i,
|
|
34
|
+
className: `ef-bars__bar${i >= vals.length - highlightLast ? ' ef-bars__bar--hi' : ''}`,
|
|
35
|
+
style: {
|
|
36
|
+
height: Math.max(2, v / max * 100) + '%'
|
|
37
|
+
},
|
|
38
|
+
title: (data[i] && data[i].label ? data[i].label + ' · ' : '') + (formatValue ? formatValue(v) : v.toLocaleString())
|
|
39
|
+
}))), labels && labels.length ? /*#__PURE__*/React.createElement("div", {
|
|
40
|
+
className: "ef-bars__labels"
|
|
41
|
+
}, labels.map((l, i) => /*#__PURE__*/React.createElement("span", {
|
|
42
|
+
key: i
|
|
43
|
+
}, l))) : null);
|
|
44
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface DonutSlice { label: string; value: number; /** Defaults to brand palette */ color?: string; }
|
|
2
|
+
export interface DonutChartProps {
|
|
3
|
+
data: DonutSlice[];
|
|
4
|
+
/** Px @default 140 */
|
|
5
|
+
size?: number;
|
|
6
|
+
/** Ring thickness (viewBox units) @default 16 */
|
|
7
|
+
thickness?: number;
|
|
8
|
+
/** Center caption */
|
|
9
|
+
centerLabel?: React.ReactNode;
|
|
10
|
+
/** Center figure */
|
|
11
|
+
centerValue?: React.ReactNode;
|
|
12
|
+
/** Hover value formatter */
|
|
13
|
+
format?: (value: number) => string;
|
|
14
|
+
style?: React.CSSProperties;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function DonutChart(props: DonutChartProps): React.JSX.Element;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { injectEfCss } from "../forms/Button.js";
|
|
4
|
+
const CSS = `
|
|
5
|
+
.ef-donut{display:flex;align-items:center;gap:20px}
|
|
6
|
+
.ef-donut__legend{display:flex;flex-direction:column;gap:8px}
|
|
7
|
+
.ef-donut__item{display:flex;align-items:center;gap:8px;font-size:var(--text-sm);color:var(--text-secondary);border:none;background:none;padding:0;cursor:default;font-family:var(--font-sans);text-align:left}
|
|
8
|
+
.ef-donut__swatch{width:9px;height:9px;border-radius:2px;flex:none}
|
|
9
|
+
.ef-donut__val{margin-left:auto;font-family:var(--font-mono);font-size:12px;color:var(--text-primary);padding-left:14px}
|
|
10
|
+
`;
|
|
11
|
+
const PALETTE = ['var(--brand-950)', 'var(--brand-500)', 'var(--brand-200)', 'var(--sand-400)', 'var(--sand-200)'];
|
|
12
|
+
export function DonutChart({
|
|
13
|
+
data,
|
|
14
|
+
size = 140,
|
|
15
|
+
thickness = 16,
|
|
16
|
+
centerLabel,
|
|
17
|
+
centerValue,
|
|
18
|
+
format,
|
|
19
|
+
style,
|
|
20
|
+
className,
|
|
21
|
+
...rest
|
|
22
|
+
}) {
|
|
23
|
+
injectEfCss('ef-css-donut', CSS);
|
|
24
|
+
const [hov, setHov] = React.useState(null);
|
|
25
|
+
const total = data.reduce((s, d) => s + d.value, 0) || 1;
|
|
26
|
+
const R = 50 - thickness / 100 * 50;
|
|
27
|
+
const C = 2 * Math.PI * R;
|
|
28
|
+
let acc = 0;
|
|
29
|
+
const segs = data.map((d, i) => {
|
|
30
|
+
const frac = d.value / total;
|
|
31
|
+
const seg = {
|
|
32
|
+
...d,
|
|
33
|
+
i,
|
|
34
|
+
dash: `${Math.max(frac * C - 1.5, 0.5)} ${C}`,
|
|
35
|
+
offset: -acc * C,
|
|
36
|
+
color: d.color || PALETTE[i % PALETTE.length]
|
|
37
|
+
};
|
|
38
|
+
acc += frac;
|
|
39
|
+
return seg;
|
|
40
|
+
});
|
|
41
|
+
return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
|
|
42
|
+
className: `ef-donut${className ? ' ' + className : ''}`,
|
|
43
|
+
style: style
|
|
44
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
45
|
+
style: {
|
|
46
|
+
position: 'relative',
|
|
47
|
+
width: size,
|
|
48
|
+
height: size,
|
|
49
|
+
flex: 'none'
|
|
50
|
+
}
|
|
51
|
+
}, /*#__PURE__*/React.createElement("svg", {
|
|
52
|
+
viewBox: "0 0 100 100",
|
|
53
|
+
width: size,
|
|
54
|
+
height: size,
|
|
55
|
+
style: {
|
|
56
|
+
transform: 'rotate(-90deg)'
|
|
57
|
+
}
|
|
58
|
+
}, segs.map(s => /*#__PURE__*/React.createElement("circle", {
|
|
59
|
+
key: s.i,
|
|
60
|
+
cx: "50",
|
|
61
|
+
cy: "50",
|
|
62
|
+
r: R,
|
|
63
|
+
fill: "none",
|
|
64
|
+
stroke: s.color,
|
|
65
|
+
strokeWidth: thickness * (hov === s.i ? 1.15 : 1),
|
|
66
|
+
strokeDasharray: s.dash,
|
|
67
|
+
strokeDashoffset: s.offset,
|
|
68
|
+
style: {
|
|
69
|
+
transition: 'stroke-width 120ms var(--ease-out)'
|
|
70
|
+
},
|
|
71
|
+
onMouseEnter: () => setHov(s.i),
|
|
72
|
+
onMouseLeave: () => setHov(null)
|
|
73
|
+
}))), /*#__PURE__*/React.createElement("div", {
|
|
74
|
+
style: {
|
|
75
|
+
position: 'absolute',
|
|
76
|
+
inset: 0,
|
|
77
|
+
display: 'flex',
|
|
78
|
+
flexDirection: 'column',
|
|
79
|
+
alignItems: 'center',
|
|
80
|
+
justifyContent: 'center',
|
|
81
|
+
pointerEvents: 'none'
|
|
82
|
+
}
|
|
83
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
84
|
+
style: {
|
|
85
|
+
fontFamily: 'var(--font-mono)',
|
|
86
|
+
fontSize: Math.round(size * 0.16),
|
|
87
|
+
fontWeight: 600,
|
|
88
|
+
color: 'var(--text-primary)'
|
|
89
|
+
}
|
|
90
|
+
}, hov != null ? format ? format(segs[hov].value) : segs[hov].value.toLocaleString() : centerValue), /*#__PURE__*/React.createElement("span", {
|
|
91
|
+
style: {
|
|
92
|
+
fontSize: 11,
|
|
93
|
+
color: 'var(--text-muted)'
|
|
94
|
+
}
|
|
95
|
+
}, hov != null ? segs[hov].label : centerLabel))), /*#__PURE__*/React.createElement("div", {
|
|
96
|
+
className: "ef-donut__legend"
|
|
97
|
+
}, segs.map(s => /*#__PURE__*/React.createElement("span", {
|
|
98
|
+
key: s.i,
|
|
99
|
+
className: "ef-donut__item",
|
|
100
|
+
onMouseEnter: () => setHov(s.i),
|
|
101
|
+
onMouseLeave: () => setHov(null),
|
|
102
|
+
style: {
|
|
103
|
+
opacity: hov == null || hov === s.i ? 1 : .45,
|
|
104
|
+
transition: 'opacity 120ms var(--ease-out)'
|
|
105
|
+
}
|
|
106
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
107
|
+
className: "ef-donut__swatch",
|
|
108
|
+
style: {
|
|
109
|
+
background: s.color
|
|
110
|
+
}
|
|
111
|
+
}), s.label, /*#__PURE__*/React.createElement("span", {
|
|
112
|
+
className: "ef-donut__val"
|
|
113
|
+
}, Math.round(s.value / total * 100), "%")))));
|
|
114
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface EmptyStateProps {
|
|
2
|
+
/** Lucide icon name @default 'inbox' */
|
|
3
|
+
icon?: string;
|
|
4
|
+
title: React.ReactNode;
|
|
5
|
+
description?: React.ReactNode;
|
|
6
|
+
/** Action slot, usually a primary Button */
|
|
7
|
+
action?: React.ReactNode;
|
|
8
|
+
/** Dashed hairline container */
|
|
9
|
+
bordered?: boolean;
|
|
10
|
+
style?: React.CSSProperties;
|
|
11
|
+
className?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function EmptyState(props: EmptyStateProps): React.JSX.Element;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Icon } from "../icons/Icon.js";
|
|
4
|
+
import { injectEfCss } from "../forms/Button.js";
|
|
5
|
+
const CSS = `
|
|
6
|
+
.ef-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:48px 24px;gap:4px}
|
|
7
|
+
.ef-empty--bordered{border:1px dashed var(--sand-300);border-radius:var(--radius-md)}
|
|
8
|
+
.ef-empty__icon{color:var(--sand-400);margin-bottom:10px}
|
|
9
|
+
.ef-empty__title{font-size:var(--text-lg);font-weight:var(--weight-semibold);color:var(--text-primary)}
|
|
10
|
+
.ef-empty__desc{font-size:var(--text-sm);color:var(--text-muted);max-width:340px;line-height:1.55}
|
|
11
|
+
.ef-empty__action{margin-top:14px}
|
|
12
|
+
`;
|
|
13
|
+
export function EmptyState({
|
|
14
|
+
icon = 'inbox',
|
|
15
|
+
title,
|
|
16
|
+
description,
|
|
17
|
+
action,
|
|
18
|
+
bordered,
|
|
19
|
+
style,
|
|
20
|
+
className,
|
|
21
|
+
...rest
|
|
22
|
+
}) {
|
|
23
|
+
injectEfCss('ef-css-empty', CSS);
|
|
24
|
+
return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
|
|
25
|
+
className: `ef-empty${bordered ? ' ef-empty--bordered' : ''}${className ? ' ' + className : ''}`,
|
|
26
|
+
style: style
|
|
27
|
+
}), /*#__PURE__*/React.createElement("span", {
|
|
28
|
+
className: "ef-empty__icon"
|
|
29
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
30
|
+
name: icon,
|
|
31
|
+
size: 28
|
|
32
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
33
|
+
className: "ef-empty__title"
|
|
34
|
+
}, title), description ? /*#__PURE__*/React.createElement("div", {
|
|
35
|
+
className: "ef-empty__desc"
|
|
36
|
+
}, description) : null, action ? /*#__PURE__*/React.createElement("div", {
|
|
37
|
+
className: "ef-empty__action"
|
|
38
|
+
}, action) : null);
|
|
39
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface KeyValueItem {
|
|
2
|
+
label: React.ReactNode;
|
|
3
|
+
value: React.ReactNode;
|
|
4
|
+
/** Mono value (IPs, hashes, records) */
|
|
5
|
+
mono?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface KeyValueListProps {
|
|
8
|
+
items: KeyValueItem[];
|
|
9
|
+
/** @default 160 */
|
|
10
|
+
labelWidth?: number;
|
|
11
|
+
style?: React.CSSProperties;
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function KeyValueList(props: KeyValueListProps): React.JSX.Element;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { injectEfCss } from "../forms/Button.js";
|
|
4
|
+
const CSS = `
|
|
5
|
+
.ef-kv{display:flex;flex-direction:column}
|
|
6
|
+
.ef-kv__row{display:flex;gap:16px;padding:9px 0;border-bottom:1px solid var(--border-default)}
|
|
7
|
+
.ef-kv__row:last-child{border-bottom:none}
|
|
8
|
+
.ef-kv__label{width:160px;flex:none;font-size:var(--text-sm);color:var(--text-muted)}
|
|
9
|
+
.ef-kv__value{flex:1;font-size:var(--text-sm);color:var(--text-primary);min-width:0;overflow-wrap:break-word}
|
|
10
|
+
.ef-kv__value--mono{font-family:var(--font-mono);font-size:13px}
|
|
11
|
+
`;
|
|
12
|
+
export function KeyValueList({
|
|
13
|
+
items,
|
|
14
|
+
labelWidth = 160,
|
|
15
|
+
style,
|
|
16
|
+
className,
|
|
17
|
+
...rest
|
|
18
|
+
}) {
|
|
19
|
+
injectEfCss('ef-css-kv', CSS);
|
|
20
|
+
return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
|
|
21
|
+
className: `ef-kv${className ? ' ' + className : ''}`,
|
|
22
|
+
style: style
|
|
23
|
+
}), items.map((it, i) => /*#__PURE__*/React.createElement("div", {
|
|
24
|
+
key: i,
|
|
25
|
+
className: "ef-kv__row"
|
|
26
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
27
|
+
className: "ef-kv__label",
|
|
28
|
+
style: {
|
|
29
|
+
width: labelWidth
|
|
30
|
+
}
|
|
31
|
+
}, it.label), /*#__PURE__*/React.createElement("span", {
|
|
32
|
+
className: `ef-kv__value${it.mono ? ' ef-kv__value--mono' : ''}`
|
|
33
|
+
}, it.value))));
|
|
34
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface LinePoint { label?: string; value: number; }
|
|
2
|
+
export interface LineChartProps {
|
|
3
|
+
data: LinePoint[];
|
|
4
|
+
/** Px @default 150 */
|
|
5
|
+
height?: number;
|
|
6
|
+
/** Soft fill under the line @default true */
|
|
7
|
+
showArea?: boolean;
|
|
8
|
+
/** Dot on every point @default false */
|
|
9
|
+
showDots?: boolean;
|
|
10
|
+
/** Tooltip value formatter */
|
|
11
|
+
format?: (value: number) => string;
|
|
12
|
+
style?: React.CSSProperties;
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function LineChart(props: LineChartProps): React.JSX.Element;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { injectEfCss } from "../forms/Button.js";
|
|
4
|
+
const CSS = `
|
|
5
|
+
.ef-linechart{position:relative}
|
|
6
|
+
.ef-linechart__tip{position:absolute;transform:translate(-50%,-130%);background:var(--surface-inverse);color:var(--text-inverse);font-size:11px;font-weight:500;padding:4px 8px;border-radius:6px;white-space:nowrap;pointer-events:none;z-index:5}
|
|
7
|
+
`;
|
|
8
|
+
export function LineChart({
|
|
9
|
+
data,
|
|
10
|
+
height = 150,
|
|
11
|
+
showArea = true,
|
|
12
|
+
showDots = false,
|
|
13
|
+
format,
|
|
14
|
+
style,
|
|
15
|
+
className,
|
|
16
|
+
...rest
|
|
17
|
+
}) {
|
|
18
|
+
injectEfCss('ef-css-linechart', CSS);
|
|
19
|
+
const [hov, setHov] = React.useState(null);
|
|
20
|
+
const ref = React.useRef(null);
|
|
21
|
+
const W = 600,
|
|
22
|
+
H = height,
|
|
23
|
+
PAD = 6;
|
|
24
|
+
const vals = data.map(d => d.value);
|
|
25
|
+
const max = Math.max(...vals),
|
|
26
|
+
min = Math.min(...vals);
|
|
27
|
+
const span = max - min || 1;
|
|
28
|
+
const x = i => PAD + i / (data.length - 1) * (W - PAD * 2);
|
|
29
|
+
const y = v => H - PAD - (v - min) / span * (H - PAD * 2);
|
|
30
|
+
const path = data.map((d, i) => (i ? 'L' : 'M') + x(i).toFixed(1) + ',' + y(d.value).toFixed(1)).join(' ');
|
|
31
|
+
const area = path + ` L${x(data.length - 1).toFixed(1)},${H - PAD} L${x(0).toFixed(1)},${H - PAD} Z`;
|
|
32
|
+
const move = e => {
|
|
33
|
+
const r = ref.current.getBoundingClientRect();
|
|
34
|
+
const i = Math.round((e.clientX - r.left) / r.width * (data.length - 1));
|
|
35
|
+
setHov(Math.max(0, Math.min(data.length - 1, i)));
|
|
36
|
+
};
|
|
37
|
+
return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
|
|
38
|
+
ref: ref,
|
|
39
|
+
className: `ef-linechart${className ? ' ' + className : ''}`,
|
|
40
|
+
style: style,
|
|
41
|
+
onMouseMove: move,
|
|
42
|
+
onMouseLeave: () => setHov(null)
|
|
43
|
+
}), /*#__PURE__*/React.createElement("svg", {
|
|
44
|
+
viewBox: `0 0 ${W} ${H}`,
|
|
45
|
+
width: "100%",
|
|
46
|
+
height: H,
|
|
47
|
+
preserveAspectRatio: "none",
|
|
48
|
+
style: {
|
|
49
|
+
display: 'block'
|
|
50
|
+
}
|
|
51
|
+
}, showArea && /*#__PURE__*/React.createElement("path", {
|
|
52
|
+
d: area,
|
|
53
|
+
fill: "var(--accent)",
|
|
54
|
+
opacity: ".07"
|
|
55
|
+
}), /*#__PURE__*/React.createElement("path", {
|
|
56
|
+
d: path,
|
|
57
|
+
fill: "none",
|
|
58
|
+
stroke: "var(--accent)",
|
|
59
|
+
strokeWidth: "1.5",
|
|
60
|
+
vectorEffect: "non-scaling-stroke"
|
|
61
|
+
}), (showDots ? data.map((_, i) => i) : hov != null ? [hov] : []).map(i => /*#__PURE__*/React.createElement("circle", {
|
|
62
|
+
key: i,
|
|
63
|
+
cx: x(i),
|
|
64
|
+
cy: y(data[i].value),
|
|
65
|
+
r: "3",
|
|
66
|
+
fill: "var(--surface-card)",
|
|
67
|
+
stroke: "var(--accent)",
|
|
68
|
+
strokeWidth: "1.5",
|
|
69
|
+
vectorEffect: "non-scaling-stroke"
|
|
70
|
+
})), hov != null && /*#__PURE__*/React.createElement("line", {
|
|
71
|
+
x1: x(hov),
|
|
72
|
+
x2: x(hov),
|
|
73
|
+
y1: PAD,
|
|
74
|
+
y2: H - PAD,
|
|
75
|
+
stroke: "var(--border-strong)",
|
|
76
|
+
strokeDasharray: "3 3",
|
|
77
|
+
vectorEffect: "non-scaling-stroke"
|
|
78
|
+
})), hov != null && /*#__PURE__*/React.createElement("div", {
|
|
79
|
+
className: "ef-linechart__tip",
|
|
80
|
+
style: {
|
|
81
|
+
left: x(hov) / W * 100 + '%',
|
|
82
|
+
top: y(data[hov].value) / H * 100 + '%'
|
|
83
|
+
}
|
|
84
|
+
}, data[hov].label, data[hov].label ? ' · ' : '', format ? format(data[hov].value) : data[hov].value.toLocaleString()));
|
|
85
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface SkeletonProps {
|
|
2
|
+
/** @default 'text' */
|
|
3
|
+
variant?: 'text' | 'rect' | 'circle';
|
|
4
|
+
width?: number | string;
|
|
5
|
+
height?: number | string;
|
|
6
|
+
/** Stacked text lines (last one 60% wide) @default 1 */
|
|
7
|
+
lines?: number;
|
|
8
|
+
style?: React.CSSProperties;
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function Skeleton(props: SkeletonProps): React.JSX.Element;
|
package/data/Skeleton.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { injectEfCss } from "../forms/Button.js";
|
|
4
|
+
const CSS = `
|
|
5
|
+
@keyframes ef-skel{0%,100%{opacity:1}50%{opacity:.45}}
|
|
6
|
+
.ef-skel{display:block;background:var(--border-default);border-radius:var(--radius-sm);animation:ef-skel 1.4s var(--ease-in-out) infinite}
|
|
7
|
+
.ef-skel--circle{border-radius:var(--radius-full)}
|
|
8
|
+
`;
|
|
9
|
+
export function Skeleton({
|
|
10
|
+
variant = 'text',
|
|
11
|
+
width,
|
|
12
|
+
height,
|
|
13
|
+
lines = 1,
|
|
14
|
+
style,
|
|
15
|
+
className,
|
|
16
|
+
...rest
|
|
17
|
+
}) {
|
|
18
|
+
injectEfCss('ef-css-skel', CSS);
|
|
19
|
+
const h = height != null ? height : variant === 'text' ? 12 : variant === 'circle' ? width || 32 : 64;
|
|
20
|
+
const w = width != null ? width : variant === 'circle' ? h : '100%';
|
|
21
|
+
if (variant === 'text' && lines > 1) {
|
|
22
|
+
return /*#__PURE__*/React.createElement("span", _extends({}, rest, {
|
|
23
|
+
style: {
|
|
24
|
+
display: 'flex',
|
|
25
|
+
flexDirection: 'column',
|
|
26
|
+
gap: 8,
|
|
27
|
+
...style
|
|
28
|
+
},
|
|
29
|
+
className: className
|
|
30
|
+
}), Array.from({
|
|
31
|
+
length: lines
|
|
32
|
+
}, (_, i) => /*#__PURE__*/React.createElement("span", {
|
|
33
|
+
key: i,
|
|
34
|
+
className: "ef-skel",
|
|
35
|
+
style: {
|
|
36
|
+
width: i === lines - 1 ? '60%' : w,
|
|
37
|
+
height: h
|
|
38
|
+
}
|
|
39
|
+
})));
|
|
40
|
+
}
|
|
41
|
+
return /*#__PURE__*/React.createElement("span", {
|
|
42
|
+
className: `ef-skel${variant === 'circle' ? ' ef-skel--circle' : ''}${className ? ' ' + className : ''}`,
|
|
43
|
+
style: {
|
|
44
|
+
width: w,
|
|
45
|
+
height: h,
|
|
46
|
+
...style
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|