@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,15 @@
|
|
|
1
|
+
export interface FileDropProps {
|
|
2
|
+
/** Receives the dropped/picked File[] */
|
|
3
|
+
onFiles?: (files: File[]) => void;
|
|
4
|
+
/** input accept string, e.g. "image/*,.pdf" */
|
|
5
|
+
accept?: string;
|
|
6
|
+
/** @default true */
|
|
7
|
+
multiple?: boolean;
|
|
8
|
+
/** Replaces "Drop files here or browse" */
|
|
9
|
+
title?: React.ReactNode;
|
|
10
|
+
/** Muted line, e.g. "PNG, MP4, PDF — up to 2 GB" */
|
|
11
|
+
hint?: React.ReactNode;
|
|
12
|
+
style?: React.CSSProperties;
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function FileDrop(props: FileDropProps): React.JSX.Element;
|
|
@@ -0,0 +1,75 @@
|
|
|
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-filedrop{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;padding:32px 24px;border:1px dashed var(--sand-300);border-radius:var(--radius-md);background:var(--surface-card);cursor:pointer;text-align:center;transition:border-color var(--dur-fast) var(--ease-out),background var(--dur-fast) var(--ease-out)}
|
|
7
|
+
.ef-filedrop:hover,.ef-filedrop--over{border-color:var(--accent);background:var(--surface-subtle)}
|
|
8
|
+
.ef-filedrop:focus-visible{outline:none;box-shadow:var(--focus-ring)}
|
|
9
|
+
.ef-filedrop__icon{color:var(--sand-400)}
|
|
10
|
+
.ef-filedrop--over .ef-filedrop__icon,.ef-filedrop:hover .ef-filedrop__icon{color:var(--text-primary)}
|
|
11
|
+
.ef-filedrop__title{font-size:var(--text-md);font-weight:var(--weight-semibold);color:var(--text-primary)}
|
|
12
|
+
.ef-filedrop__title u{text-decoration-color:var(--caramel-500);text-underline-offset:3px}
|
|
13
|
+
.ef-filedrop__hint{font-size:var(--text-xs);color:var(--text-muted)}
|
|
14
|
+
`;
|
|
15
|
+
export function FileDrop({
|
|
16
|
+
onFiles,
|
|
17
|
+
accept,
|
|
18
|
+
multiple = true,
|
|
19
|
+
title,
|
|
20
|
+
hint,
|
|
21
|
+
style,
|
|
22
|
+
className,
|
|
23
|
+
...rest
|
|
24
|
+
}) {
|
|
25
|
+
injectEfCss('ef-css-filedrop', CSS);
|
|
26
|
+
const [over, setOver] = React.useState(false);
|
|
27
|
+
const inputRef = React.useRef(null);
|
|
28
|
+
const handle = files => {
|
|
29
|
+
if (onFiles && files && files.length) onFiles([...files]);
|
|
30
|
+
};
|
|
31
|
+
return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
|
|
32
|
+
role: "button",
|
|
33
|
+
tabIndex: 0,
|
|
34
|
+
className: `ef-filedrop${over ? ' ef-filedrop--over' : ''}${className ? ' ' + className : ''}`,
|
|
35
|
+
style: style,
|
|
36
|
+
onClick: () => inputRef.current && inputRef.current.click(),
|
|
37
|
+
onKeyDown: e => {
|
|
38
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
inputRef.current.click();
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
onDragOver: e => {
|
|
44
|
+
e.preventDefault();
|
|
45
|
+
setOver(true);
|
|
46
|
+
},
|
|
47
|
+
onDragLeave: () => setOver(false),
|
|
48
|
+
onDrop: e => {
|
|
49
|
+
e.preventDefault();
|
|
50
|
+
setOver(false);
|
|
51
|
+
handle(e.dataTransfer.files);
|
|
52
|
+
}
|
|
53
|
+
}), /*#__PURE__*/React.createElement("span", {
|
|
54
|
+
className: "ef-filedrop__icon"
|
|
55
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
56
|
+
name: "upload",
|
|
57
|
+
size: 22
|
|
58
|
+
})), /*#__PURE__*/React.createElement("span", {
|
|
59
|
+
className: "ef-filedrop__title"
|
|
60
|
+
}, title || /*#__PURE__*/React.createElement("span", null, "Drop files here or ", /*#__PURE__*/React.createElement("u", null, "browse"))), hint ? /*#__PURE__*/React.createElement("span", {
|
|
61
|
+
className: "ef-filedrop__hint"
|
|
62
|
+
}, hint) : null, /*#__PURE__*/React.createElement("input", {
|
|
63
|
+
ref: inputRef,
|
|
64
|
+
type: "file",
|
|
65
|
+
accept: accept,
|
|
66
|
+
multiple: multiple,
|
|
67
|
+
style: {
|
|
68
|
+
display: 'none'
|
|
69
|
+
},
|
|
70
|
+
onChange: e => {
|
|
71
|
+
handle(e.target.files);
|
|
72
|
+
e.target.value = '';
|
|
73
|
+
}
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface FileTileProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
2
|
+
name: string;
|
|
3
|
+
/** e.g. "4.2 MB" */
|
|
4
|
+
size?: string;
|
|
5
|
+
/** Icon family; inferred from extension when omitted */
|
|
6
|
+
kind?: 'image' | 'video' | 'audio' | 'code' | 'archive' | 'doc';
|
|
7
|
+
/** Meta text after size, e.g. "Converted" */
|
|
8
|
+
status?: string;
|
|
9
|
+
/** 0–100 shows an upload bar instead of meta */
|
|
10
|
+
progress?: number;
|
|
11
|
+
/** Red meta line */
|
|
12
|
+
error?: string;
|
|
13
|
+
onRemove?: () => void;
|
|
14
|
+
/** Extra right-side controls */
|
|
15
|
+
actions?: React.ReactNode;
|
|
16
|
+
style?: React.CSSProperties;
|
|
17
|
+
className?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function FileTile(props: FileTileProps): React.JSX.Element;
|
|
@@ -0,0 +1,96 @@
|
|
|
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 { IconButton } from "../forms/IconButton.js";
|
|
5
|
+
import { Progress } from "../feedback/Progress.js";
|
|
6
|
+
import { injectEfCss } from "../forms/Button.js";
|
|
7
|
+
const CSS = `
|
|
8
|
+
.ef-filetile{display:flex;align-items:center;gap:12px;padding:10px 12px;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-card)}
|
|
9
|
+
.ef-filetile__icon{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;flex:none;border-radius:var(--radius-sm);background:var(--surface-sunken);color:var(--sand-700)}
|
|
10
|
+
.ef-filetile__name{font-size:var(--text-sm);font-weight:var(--weight-semibold);color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
11
|
+
.ef-filetile__meta{font-size:var(--text-xs);color:var(--text-muted);margin-top:1px}
|
|
12
|
+
.ef-filetile__meta--err{color:var(--danger-600)}
|
|
13
|
+
`;
|
|
14
|
+
const KIND_ICON = {
|
|
15
|
+
image: 'image',
|
|
16
|
+
video: 'video',
|
|
17
|
+
audio: 'music',
|
|
18
|
+
code: 'code',
|
|
19
|
+
archive: 'package',
|
|
20
|
+
doc: 'file-text'
|
|
21
|
+
};
|
|
22
|
+
const EXT_KIND = {
|
|
23
|
+
png: 'image',
|
|
24
|
+
jpg: 'image',
|
|
25
|
+
jpeg: 'image',
|
|
26
|
+
gif: 'image',
|
|
27
|
+
svg: 'image',
|
|
28
|
+
webp: 'image',
|
|
29
|
+
mp4: 'video',
|
|
30
|
+
mov: 'video',
|
|
31
|
+
webm: 'video',
|
|
32
|
+
mp3: 'audio',
|
|
33
|
+
wav: 'audio',
|
|
34
|
+
flac: 'audio',
|
|
35
|
+
js: 'code',
|
|
36
|
+
ts: 'code',
|
|
37
|
+
py: 'code',
|
|
38
|
+
json: 'code',
|
|
39
|
+
zip: 'archive',
|
|
40
|
+
tar: 'archive',
|
|
41
|
+
gz: 'archive',
|
|
42
|
+
pdf: 'doc',
|
|
43
|
+
doc: 'doc',
|
|
44
|
+
docx: 'doc',
|
|
45
|
+
md: 'doc',
|
|
46
|
+
txt: 'doc',
|
|
47
|
+
csv: 'doc'
|
|
48
|
+
};
|
|
49
|
+
export function FileTile({
|
|
50
|
+
name,
|
|
51
|
+
size,
|
|
52
|
+
kind,
|
|
53
|
+
status,
|
|
54
|
+
progress,
|
|
55
|
+
error,
|
|
56
|
+
onRemove,
|
|
57
|
+
actions,
|
|
58
|
+
style,
|
|
59
|
+
className,
|
|
60
|
+
...rest
|
|
61
|
+
}) {
|
|
62
|
+
injectEfCss('ef-css-filetile', CSS);
|
|
63
|
+
const ext = (name || '').split('.').pop().toLowerCase();
|
|
64
|
+
const icon = KIND_ICON[kind || EXT_KIND[ext]] || 'file';
|
|
65
|
+
return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
|
|
66
|
+
className: `ef-filetile${className ? ' ' + className : ''}`,
|
|
67
|
+
style: style
|
|
68
|
+
}), /*#__PURE__*/React.createElement("span", {
|
|
69
|
+
className: "ef-filetile__icon"
|
|
70
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
71
|
+
name: icon,
|
|
72
|
+
size: 17
|
|
73
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
74
|
+
style: {
|
|
75
|
+
flex: 1,
|
|
76
|
+
minWidth: 0
|
|
77
|
+
}
|
|
78
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
79
|
+
className: "ef-filetile__name"
|
|
80
|
+
}, name), error ? /*#__PURE__*/React.createElement("div", {
|
|
81
|
+
className: "ef-filetile__meta ef-filetile__meta--err"
|
|
82
|
+
}, error) : progress != null ? /*#__PURE__*/React.createElement(Progress, {
|
|
83
|
+
value: progress,
|
|
84
|
+
style: {
|
|
85
|
+
marginTop: 5,
|
|
86
|
+
maxWidth: 220
|
|
87
|
+
}
|
|
88
|
+
}) : /*#__PURE__*/React.createElement("div", {
|
|
89
|
+
className: "ef-filetile__meta"
|
|
90
|
+
}, [size, status].filter(Boolean).join(' · '))), actions, onRemove ? /*#__PURE__*/React.createElement(IconButton, {
|
|
91
|
+
icon: "x",
|
|
92
|
+
label: "Remove",
|
|
93
|
+
size: "sm",
|
|
94
|
+
onClick: onRemove
|
|
95
|
+
}) : null);
|
|
96
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface FileTypeIconProps {
|
|
2
|
+
/** Extension: pdf, csv, png, mp4, zip, json… @default 'txt' */
|
|
3
|
+
ext?: string;
|
|
4
|
+
/** Px @default 40 */
|
|
5
|
+
size?: number;
|
|
6
|
+
/** Colored extension chip @default true */
|
|
7
|
+
showExt?: boolean;
|
|
8
|
+
style?: React.CSSProperties;
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function FileTypeIcon(props: FileTypeIconProps): React.JSX.Element;
|
|
@@ -0,0 +1,121 @@
|
|
|
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-filetype{position:relative;display:inline-flex;align-items:center;justify-content:center;flex:none;background:var(--surface-card);border:1px solid var(--border-strong);border-radius:6px;color:var(--text-secondary)}
|
|
7
|
+
.ef-filetype__ext{position:absolute;bottom:-5px;left:50%;transform:translateX(-50%);font-family:var(--font-mono);font-size:8px;font-weight:700;letter-spacing:.04em;padding:1px 4px;border-radius:3px;color:#fff;text-transform:uppercase;line-height:1.3}
|
|
8
|
+
`;
|
|
9
|
+
const KIND = {
|
|
10
|
+
pdf: {
|
|
11
|
+
icon: 'file-text',
|
|
12
|
+
color: 'var(--danger-600)'
|
|
13
|
+
},
|
|
14
|
+
doc: {
|
|
15
|
+
icon: 'file-text',
|
|
16
|
+
color: 'var(--brand-700)'
|
|
17
|
+
},
|
|
18
|
+
docx: {
|
|
19
|
+
icon: 'file-text',
|
|
20
|
+
color: 'var(--brand-700)'
|
|
21
|
+
},
|
|
22
|
+
txt: {
|
|
23
|
+
icon: 'file-text',
|
|
24
|
+
color: 'var(--sand-600)'
|
|
25
|
+
},
|
|
26
|
+
md: {
|
|
27
|
+
icon: 'file-text',
|
|
28
|
+
color: 'var(--sand-600)'
|
|
29
|
+
},
|
|
30
|
+
csv: {
|
|
31
|
+
icon: 'table',
|
|
32
|
+
color: 'var(--success-600)'
|
|
33
|
+
},
|
|
34
|
+
xls: {
|
|
35
|
+
icon: 'table',
|
|
36
|
+
color: 'var(--success-600)'
|
|
37
|
+
},
|
|
38
|
+
xlsx: {
|
|
39
|
+
icon: 'table',
|
|
40
|
+
color: 'var(--success-600)'
|
|
41
|
+
},
|
|
42
|
+
png: {
|
|
43
|
+
icon: 'image',
|
|
44
|
+
color: 'var(--brand-500)'
|
|
45
|
+
},
|
|
46
|
+
jpg: {
|
|
47
|
+
icon: 'image',
|
|
48
|
+
color: 'var(--brand-500)'
|
|
49
|
+
},
|
|
50
|
+
svg: {
|
|
51
|
+
icon: 'image',
|
|
52
|
+
color: 'var(--brand-500)'
|
|
53
|
+
},
|
|
54
|
+
gif: {
|
|
55
|
+
icon: 'image',
|
|
56
|
+
color: 'var(--brand-500)'
|
|
57
|
+
},
|
|
58
|
+
mp4: {
|
|
59
|
+
icon: 'video',
|
|
60
|
+
color: 'var(--warning-600)'
|
|
61
|
+
},
|
|
62
|
+
mov: {
|
|
63
|
+
icon: 'video',
|
|
64
|
+
color: 'var(--warning-600)'
|
|
65
|
+
},
|
|
66
|
+
mp3: {
|
|
67
|
+
icon: 'mic',
|
|
68
|
+
color: 'var(--warning-600)'
|
|
69
|
+
},
|
|
70
|
+
wav: {
|
|
71
|
+
icon: 'mic',
|
|
72
|
+
color: 'var(--warning-600)'
|
|
73
|
+
},
|
|
74
|
+
zip: {
|
|
75
|
+
icon: 'archive',
|
|
76
|
+
color: 'var(--sand-600)'
|
|
77
|
+
},
|
|
78
|
+
json: {
|
|
79
|
+
icon: 'code',
|
|
80
|
+
color: 'var(--sand-800)'
|
|
81
|
+
},
|
|
82
|
+
js: {
|
|
83
|
+
icon: 'code',
|
|
84
|
+
color: 'var(--warning-600)'
|
|
85
|
+
},
|
|
86
|
+
ts: {
|
|
87
|
+
icon: 'code',
|
|
88
|
+
color: 'var(--brand-700)'
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
export function FileTypeIcon({
|
|
92
|
+
ext = 'txt',
|
|
93
|
+
size = 40,
|
|
94
|
+
showExt = true,
|
|
95
|
+
style,
|
|
96
|
+
className,
|
|
97
|
+
...rest
|
|
98
|
+
}) {
|
|
99
|
+
injectEfCss('ef-css-filetype', CSS);
|
|
100
|
+
const k = KIND[ext.toLowerCase()] || {
|
|
101
|
+
icon: 'file',
|
|
102
|
+
color: 'var(--sand-500)'
|
|
103
|
+
};
|
|
104
|
+
return /*#__PURE__*/React.createElement("span", _extends({}, rest, {
|
|
105
|
+
className: `ef-filetype${className ? ' ' + className : ''}`,
|
|
106
|
+
style: {
|
|
107
|
+
width: size,
|
|
108
|
+
height: size,
|
|
109
|
+
...style
|
|
110
|
+
},
|
|
111
|
+
title: '.' + ext
|
|
112
|
+
}), /*#__PURE__*/React.createElement(Icon, {
|
|
113
|
+
name: k.icon,
|
|
114
|
+
size: Math.round(size * 0.45)
|
|
115
|
+
}), showExt ? /*#__PURE__*/React.createElement("span", {
|
|
116
|
+
className: "ef-filetype__ext",
|
|
117
|
+
style: {
|
|
118
|
+
background: k.color
|
|
119
|
+
}
|
|
120
|
+
}, ext) : null);
|
|
121
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface PaymentCardProps {
|
|
2
|
+
/** @default 'ADA OBI' */
|
|
3
|
+
name?: string;
|
|
4
|
+
/** Masked number @default '•••• •••• •••• 4242' */
|
|
5
|
+
number?: string;
|
|
6
|
+
/** @default '09/29' */
|
|
7
|
+
expiry?: string;
|
|
8
|
+
/** Top-left brand text @default 'Efolusi' */
|
|
9
|
+
network?: string;
|
|
10
|
+
/** @default 'espresso' */
|
|
11
|
+
variant?: 'espresso' | 'caramel' | 'paper';
|
|
12
|
+
/** Grayscale frozen state */
|
|
13
|
+
frozen?: boolean;
|
|
14
|
+
style?: React.CSSProperties;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function PaymentCard(props: PaymentCardProps): React.JSX.Element;
|
|
@@ -0,0 +1,109 @@
|
|
|
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-paycard{position:relative;width:320px;aspect-ratio:1.586;border-radius:14px;padding:20px;display:flex;flex-direction:column;color:var(--brand-50);background:var(--brand-950);overflow:hidden;font-family:var(--font-sans)}
|
|
6
|
+
.ef-paycard--caramel{background:var(--brand-700)}
|
|
7
|
+
.ef-paycard--paper{background:var(--surface-card);color:var(--text-primary);border:1px solid var(--border-strong)}
|
|
8
|
+
.ef-paycard__ring{position:absolute;border-radius:999px;border:1px solid currentColor;opacity:.1;pointer-events:none}
|
|
9
|
+
.ef-paycard__num{font-family:var(--font-mono);font-size:16px;letter-spacing:.12em;margin-top:auto}
|
|
10
|
+
.ef-paycard__row{display:flex;align-items:flex-end;gap:18px;margin-top:12px}
|
|
11
|
+
.ef-paycard__lbl{font-size:8.5px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;opacity:.55}
|
|
12
|
+
.ef-paycard__val{font-size:12.5px;font-weight:600;margin-top:2px}
|
|
13
|
+
.ef-paycard__chip{width:34px;height:25px;border-radius:5px;background:linear-gradient(135deg,var(--brand-200),var(--brand-500));opacity:.9}
|
|
14
|
+
`;
|
|
15
|
+
export function PaymentCard({
|
|
16
|
+
name = 'ADA OBI',
|
|
17
|
+
number = '•••• •••• •••• 4242',
|
|
18
|
+
expiry = '09/29',
|
|
19
|
+
network = 'Efolusi',
|
|
20
|
+
variant = 'espresso',
|
|
21
|
+
frozen,
|
|
22
|
+
style,
|
|
23
|
+
className,
|
|
24
|
+
...rest
|
|
25
|
+
}) {
|
|
26
|
+
injectEfCss('ef-css-paycard', CSS);
|
|
27
|
+
return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
|
|
28
|
+
className: `ef-paycard${variant === 'caramel' ? ' ef-paycard--caramel' : variant === 'paper' ? ' ef-paycard--paper' : ''}${className ? ' ' + className : ''}`,
|
|
29
|
+
style: {
|
|
30
|
+
filter: frozen ? 'grayscale(.7) opacity(.75)' : undefined,
|
|
31
|
+
...style
|
|
32
|
+
}
|
|
33
|
+
}), /*#__PURE__*/React.createElement("span", {
|
|
34
|
+
className: "ef-paycard__ring",
|
|
35
|
+
style: {
|
|
36
|
+
width: 220,
|
|
37
|
+
height: 220,
|
|
38
|
+
right: -70,
|
|
39
|
+
top: -70
|
|
40
|
+
}
|
|
41
|
+
}), /*#__PURE__*/React.createElement("span", {
|
|
42
|
+
className: "ef-paycard__ring",
|
|
43
|
+
style: {
|
|
44
|
+
width: 220,
|
|
45
|
+
height: 220,
|
|
46
|
+
right: -40,
|
|
47
|
+
top: -110
|
|
48
|
+
}
|
|
49
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
50
|
+
style: {
|
|
51
|
+
display: 'flex',
|
|
52
|
+
alignItems: 'center'
|
|
53
|
+
}
|
|
54
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
55
|
+
style: {
|
|
56
|
+
fontFamily: 'var(--font-display)',
|
|
57
|
+
fontWeight: 680,
|
|
58
|
+
letterSpacing: '-0.02em',
|
|
59
|
+
fontSize: 16
|
|
60
|
+
}
|
|
61
|
+
}, network), frozen ? /*#__PURE__*/React.createElement("span", {
|
|
62
|
+
style: {
|
|
63
|
+
marginLeft: 'auto',
|
|
64
|
+
fontSize: 10,
|
|
65
|
+
fontWeight: 600,
|
|
66
|
+
letterSpacing: '.08em',
|
|
67
|
+
textTransform: 'uppercase',
|
|
68
|
+
opacity: .7
|
|
69
|
+
}
|
|
70
|
+
}, "Frozen") : null), /*#__PURE__*/React.createElement("div", {
|
|
71
|
+
style: {
|
|
72
|
+
marginTop: 14
|
|
73
|
+
}
|
|
74
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
75
|
+
className: "ef-paycard__chip",
|
|
76
|
+
style: {
|
|
77
|
+
display: 'block'
|
|
78
|
+
}
|
|
79
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
80
|
+
className: "ef-paycard__num"
|
|
81
|
+
}, number), /*#__PURE__*/React.createElement("div", {
|
|
82
|
+
className: "ef-paycard__row"
|
|
83
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
84
|
+
style: {
|
|
85
|
+
flex: 1,
|
|
86
|
+
minWidth: 0
|
|
87
|
+
}
|
|
88
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
89
|
+
className: "ef-paycard__lbl",
|
|
90
|
+
style: {
|
|
91
|
+
display: 'block'
|
|
92
|
+
}
|
|
93
|
+
}, "Card holder"), /*#__PURE__*/React.createElement("span", {
|
|
94
|
+
className: "ef-paycard__val",
|
|
95
|
+
style: {
|
|
96
|
+
display: 'block'
|
|
97
|
+
}
|
|
98
|
+
}, name)), /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement("span", {
|
|
99
|
+
className: "ef-paycard__lbl",
|
|
100
|
+
style: {
|
|
101
|
+
display: 'block'
|
|
102
|
+
}
|
|
103
|
+
}, "Expires"), /*#__PURE__*/React.createElement("span", {
|
|
104
|
+
className: "ef-paycard__val",
|
|
105
|
+
style: {
|
|
106
|
+
display: 'block'
|
|
107
|
+
}
|
|
108
|
+
}, expiry))));
|
|
109
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
2
|
+
/** @default 'primary' */
|
|
3
|
+
variant?: 'primary' | 'secondary' | 'ghost' | 'danger' | 'brand';
|
|
4
|
+
/** @default 'md' */
|
|
5
|
+
size?: 'sm' | 'md' | 'lg';
|
|
6
|
+
/** Lucide icon name rendered before the label */
|
|
7
|
+
iconLeft?: string;
|
|
8
|
+
/** Lucide icon name rendered after the label */
|
|
9
|
+
iconRight?: string;
|
|
10
|
+
fullWidth?: boolean;
|
|
11
|
+
/** Shows a spinner and disables the button */
|
|
12
|
+
loading?: boolean;
|
|
13
|
+
children?: React.ReactNode;
|
|
14
|
+
}
|
|
15
|
+
export declare function Button(props: ButtonProps): React.JSX.Element;
|
package/forms/Button.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
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
|
+
const CSS = `
|
|
5
|
+
.ef-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;border:1px solid transparent;border-radius:var(--radius-sm);font-family:var(--font-sans);font-weight:var(--weight-semibold);cursor:pointer;white-space:nowrap;user-select:none;transition:background var(--dur-fast) var(--ease-out),border-color var(--dur-fast) var(--ease-out),color var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out),transform var(--dur-med) var(--ease-spring)}
|
|
6
|
+
.ef-btn:focus-visible{outline:none;box-shadow:var(--focus-ring)}
|
|
7
|
+
.ef-btn:active:not(:disabled){transform:scale(.985)}
|
|
8
|
+
.ef-btn:disabled{opacity:.45;cursor:not-allowed}
|
|
9
|
+
.ef-btn--sm{height:var(--control-h-sm);padding:0 10px;font-size:var(--text-sm)}
|
|
10
|
+
.ef-btn--md{height:var(--control-h-md);padding:0 14px;font-size:var(--text-md)}
|
|
11
|
+
.ef-btn--lg{height:var(--control-h-lg);padding:0 20px;font-size:var(--text-lg)}
|
|
12
|
+
.ef-btn--primary{background:var(--accent);color:var(--accent-contrast)}
|
|
13
|
+
.ef-btn--primary:hover:not(:disabled){background:var(--accent-hover)}
|
|
14
|
+
.ef-btn--primary:active:not(:disabled){background:var(--accent-active)}
|
|
15
|
+
.ef-btn--secondary{background:transparent;color:var(--text-primary);border-color:var(--border-strong)}
|
|
16
|
+
.ef-btn--secondary:hover:not(:disabled){background:var(--surface-sunken)}
|
|
17
|
+
.ef-btn--ghost{background:transparent;color:var(--text-secondary)}
|
|
18
|
+
.ef-btn--ghost:hover:not(:disabled){background:var(--surface-sunken);color:var(--text-primary)}
|
|
19
|
+
.ef-btn--danger{background:var(--danger-600);color:var(--danger-contrast)}
|
|
20
|
+
.ef-btn--danger:hover:not(:disabled){background:var(--danger-700)}
|
|
21
|
+
.ef-btn--brand{background:var(--brand-700);color:#fff}
|
|
22
|
+
.ef-btn--brand:hover:not(:disabled){background:var(--brand-800)}
|
|
23
|
+
@keyframes ef-spin{to{transform:rotate(360deg)}}
|
|
24
|
+
.ef-btn__spin{display:inline-flex;animation:ef-spin .7s linear infinite}
|
|
25
|
+
`;
|
|
26
|
+
export function injectEfCss(id, text) {
|
|
27
|
+
if (typeof document === 'undefined' || document.getElementById(id)) return;
|
|
28
|
+
const s = document.createElement('style');
|
|
29
|
+
s.id = id;
|
|
30
|
+
s.textContent = text;
|
|
31
|
+
document.head.appendChild(s);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Point several refs at one node.
|
|
35
|
+
*
|
|
36
|
+
* A component that forwards a ref usually needs the same node itself — to
|
|
37
|
+
* anchor an overlay, trap focus, or measure. Lowercase, so it stays an internal
|
|
38
|
+
* helper rather than part of the public namespace.
|
|
39
|
+
*/
|
|
40
|
+
export function mergeRefs(...refs) {
|
|
41
|
+
return node => {
|
|
42
|
+
for (const r of refs) {
|
|
43
|
+
if (!r) continue;
|
|
44
|
+
if (typeof r === 'function') r(node);else r.current = node;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function Button({
|
|
49
|
+
variant = 'primary',
|
|
50
|
+
size = 'md',
|
|
51
|
+
iconLeft,
|
|
52
|
+
iconRight,
|
|
53
|
+
fullWidth,
|
|
54
|
+
loading,
|
|
55
|
+
disabled,
|
|
56
|
+
children,
|
|
57
|
+
style,
|
|
58
|
+
className,
|
|
59
|
+
...rest
|
|
60
|
+
}) {
|
|
61
|
+
injectEfCss('ef-css-btn', CSS);
|
|
62
|
+
const isz = size === 'sm' ? 14 : size === 'lg' ? 18 : 16;
|
|
63
|
+
return /*#__PURE__*/React.createElement("button", _extends({
|
|
64
|
+
className: `ef-btn ef-btn--${variant} ef-btn--${size}${className ? ' ' + className : ''}`,
|
|
65
|
+
disabled: disabled || loading,
|
|
66
|
+
style: {
|
|
67
|
+
width: fullWidth ? '100%' : undefined,
|
|
68
|
+
...style
|
|
69
|
+
}
|
|
70
|
+
}, rest), loading ? /*#__PURE__*/React.createElement("span", {
|
|
71
|
+
className: "ef-btn__spin"
|
|
72
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
73
|
+
name: "loader-circle",
|
|
74
|
+
size: isz
|
|
75
|
+
})) : iconLeft ? /*#__PURE__*/React.createElement(Icon, {
|
|
76
|
+
name: iconLeft,
|
|
77
|
+
size: isz
|
|
78
|
+
}) : null, children, iconRight ? /*#__PURE__*/React.createElement(Icon, {
|
|
79
|
+
name: iconRight,
|
|
80
|
+
size: isz
|
|
81
|
+
}) : null);
|
|
82
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
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 "./Button.js";
|
|
4
|
+
const CSS = `
|
|
5
|
+
.ef-btn-group{display:inline-flex;align-items:stretch;isolation:isolate}
|
|
6
|
+
.ef-btn-group>*:not(:first-child){border-top-left-radius:0!important;border-bottom-left-radius:0!important;margin-left:-1px}
|
|
7
|
+
.ef-btn-group>*:not(:last-child){border-top-right-radius:0!important;border-bottom-right-radius:0!important}
|
|
8
|
+
.ef-btn-group>*:hover,.ef-btn-group>*:focus-visible{z-index:1}
|
|
9
|
+
`;
|
|
10
|
+
export function ButtonGroup({
|
|
11
|
+
children,
|
|
12
|
+
style,
|
|
13
|
+
className,
|
|
14
|
+
...rest
|
|
15
|
+
}) {
|
|
16
|
+
injectEfCss('ef-css-btn-group', CSS);
|
|
17
|
+
return /*#__PURE__*/React.createElement("div", _extends({
|
|
18
|
+
role: "group",
|
|
19
|
+
className: `ef-btn-group${className ? ' ' + className : ''}`,
|
|
20
|
+
style: style
|
|
21
|
+
}, rest), children);
|
|
22
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ButtonTileProps {
|
|
2
|
+
/** Lucide icon */
|
|
3
|
+
icon?: string;
|
|
4
|
+
title: React.ReactNode;
|
|
5
|
+
description?: React.ReactNode;
|
|
6
|
+
selected?: boolean;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
onClick?: (e: React.MouseEvent) => void;
|
|
9
|
+
style?: React.CSSProperties;
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function ButtonTile(props: ButtonTileProps): React.JSX.Element;
|
|
13
|
+
|
|
14
|
+
export interface ButtonTileGroupProps {
|
|
15
|
+
/** @default 3 */
|
|
16
|
+
columns?: number;
|
|
17
|
+
children?: React.ReactNode;
|
|
18
|
+
style?: React.CSSProperties;
|
|
19
|
+
className?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function ButtonTileGroup(props: ButtonTileGroupProps): React.JSX.Element;
|