@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.
Files changed (231) hide show
  1. package/README.md +12 -0
  2. package/ai/AgentRun.d.ts +20 -0
  3. package/ai/AgentRun.js +100 -0
  4. package/ai/ChatMessage.d.ts +19 -0
  5. package/ai/ChatMessage.js +81 -0
  6. package/ai/Citation.d.ts +23 -0
  7. package/ai/Citation.js +146 -0
  8. package/ai/Confirmation.d.ts +26 -0
  9. package/ai/Confirmation.js +84 -0
  10. package/ai/Conversation.d.ts +15 -0
  11. package/ai/Conversation.js +81 -0
  12. package/ai/DocumentCard.d.ts +17 -0
  13. package/ai/DocumentCard.js +101 -0
  14. package/ai/FeedbackBar.d.ts +14 -0
  15. package/ai/FeedbackBar.js +84 -0
  16. package/ai/GeneratedImage.d.ts +22 -0
  17. package/ai/GeneratedImage.js +100 -0
  18. package/ai/ModelSelector.d.ts +21 -0
  19. package/ai/ModelSelector.js +112 -0
  20. package/ai/Player.d.ts +18 -0
  21. package/ai/Player.js +201 -0
  22. package/ai/PromptComposer.d.ts +28 -0
  23. package/ai/PromptComposer.js +111 -0
  24. package/ai/PromptSteps.d.ts +18 -0
  25. package/ai/PromptSteps.js +167 -0
  26. package/ai/Reasoning.d.ts +17 -0
  27. package/ai/Reasoning.js +57 -0
  28. package/ai/RichComposer.d.ts +25 -0
  29. package/ai/RichComposer.js +247 -0
  30. package/ai/Sandbox.d.ts +20 -0
  31. package/ai/Sandbox.js +96 -0
  32. package/ai/SelectionQuote.d.ts +15 -0
  33. package/ai/SelectionQuote.js +123 -0
  34. package/ai/SourceCard.d.ts +17 -0
  35. package/ai/SourceCard.js +57 -0
  36. package/ai/Suggestions.d.ts +10 -0
  37. package/ai/Suggestions.js +38 -0
  38. package/ai/Task.d.ts +15 -0
  39. package/ai/Task.js +49 -0
  40. package/ai/Todo.d.ts +13 -0
  41. package/ai/Todo.js +87 -0
  42. package/ai/ToolCall.d.ts +30 -0
  43. package/ai/ToolCall.js +147 -0
  44. package/ai/Transcript.d.ts +27 -0
  45. package/ai/Transcript.js +96 -0
  46. package/ai/UsageMeter.d.ts +21 -0
  47. package/ai/UsageMeter.js +81 -0
  48. package/ai/WebPreview.d.ts +19 -0
  49. package/ai/WebPreview.js +179 -0
  50. package/assets/fonts/BricolageGrotesque-Variable.ttf +0 -0
  51. package/assets/fonts/Figtree-Italic-Variable.ttf +0 -0
  52. package/assets/fonts/Figtree-Variable.ttf +0 -0
  53. package/assets/fonts/JetBrainsMono-Italic-Variable.ttf +0 -0
  54. package/assets/fonts/JetBrainsMono-Variable.ttf +0 -0
  55. package/assets/fonts/OFL-BricolageGrotesque.txt +93 -0
  56. package/assets/fonts/OFL-Figtree.txt +93 -0
  57. package/assets/fonts/OFL-JetBrainsMono.txt +93 -0
  58. package/code/CodeBlock.d.ts +17 -0
  59. package/code/CodeBlock.js +99 -0
  60. package/code/Console.d.ts +19 -0
  61. package/code/Console.js +124 -0
  62. package/code/CopyField.d.ts +10 -0
  63. package/code/CopyField.js +54 -0
  64. package/code/Diff.d.ts +26 -0
  65. package/code/Diff.js +358 -0
  66. package/code/EnvList.d.ts +14 -0
  67. package/code/EnvList.js +89 -0
  68. package/code/Exception.d.ts +25 -0
  69. package/code/Exception.js +90 -0
  70. package/code/Terminal.d.ts +20 -0
  71. package/code/Terminal.js +58 -0
  72. package/data/BarChart.d.ts +14 -0
  73. package/data/BarChart.js +44 -0
  74. package/data/DonutChart.d.ts +17 -0
  75. package/data/DonutChart.js +114 -0
  76. package/data/EmptyState.d.ts +13 -0
  77. package/data/EmptyState.js +39 -0
  78. package/data/KeyValueList.d.ts +14 -0
  79. package/data/KeyValueList.js +34 -0
  80. package/data/LineChart.d.ts +15 -0
  81. package/data/LineChart.js +85 -0
  82. package/data/Skeleton.d.ts +11 -0
  83. package/data/Skeleton.js +49 -0
  84. package/data/Sparkline.d.ts +14 -0
  85. package/data/Sparkline.js +42 -0
  86. package/data/Stat.d.ts +14 -0
  87. package/data/Stat.js +40 -0
  88. package/data/StatusDot.d.ts +10 -0
  89. package/data/StatusDot.js +34 -0
  90. package/data/Table.d.ts +53 -0
  91. package/data/Table.js +174 -0
  92. package/dates/Calendar.d.ts +8 -0
  93. package/dates/Calendar.js +143 -0
  94. package/dates/DatePicker.d.ts +12 -0
  95. package/dates/DatePicker.js +118 -0
  96. package/display/Accordion.d.ts +15 -0
  97. package/display/Accordion.js +52 -0
  98. package/display/AspectRatio.d.ts +8 -0
  99. package/display/AspectRatio.js +24 -0
  100. package/display/Avatar.d.ts +17 -0
  101. package/display/Avatar.js +52 -0
  102. package/display/Badge.d.ts +10 -0
  103. package/display/Badge.js +34 -0
  104. package/display/Card.d.ts +17 -0
  105. package/display/Card.js +51 -0
  106. package/display/Carousel.d.ts +16 -0
  107. package/display/Carousel.js +97 -0
  108. package/display/Collapsible.d.ts +12 -0
  109. package/display/Collapsible.js +46 -0
  110. package/display/Divider.d.ts +9 -0
  111. package/display/Divider.js +33 -0
  112. package/display/Kbd.d.ts +7 -0
  113. package/display/Kbd.js +18 -0
  114. package/display/Link.d.ts +12 -0
  115. package/display/Link.js +41 -0
  116. package/display/ListItem.d.ts +19 -0
  117. package/display/ListItem.js +61 -0
  118. package/display/Resizable.d.ts +16 -0
  119. package/display/Resizable.js +90 -0
  120. package/display/ScrollArea.d.ts +8 -0
  121. package/display/ScrollArea.js +28 -0
  122. package/display/Tag.d.ts +9 -0
  123. package/display/Tag.js +41 -0
  124. package/display/Toolbar.d.ts +22 -0
  125. package/display/Toolbar.js +55 -0
  126. package/display/TreeList.d.ts +20 -0
  127. package/display/TreeList.js +101 -0
  128. package/feedback/Alert.d.ts +14 -0
  129. package/feedback/Alert.js +56 -0
  130. package/feedback/Banner.d.ts +15 -0
  131. package/feedback/Banner.js +49 -0
  132. package/feedback/ConfirmDialog.d.ts +18 -0
  133. package/feedback/ConfirmDialog.js +49 -0
  134. package/feedback/Dialog.d.ts +13 -0
  135. package/feedback/Dialog.js +107 -0
  136. package/feedback/Loader.d.ts +12 -0
  137. package/feedback/Loader.js +41 -0
  138. package/feedback/Progress.d.ts +15 -0
  139. package/feedback/Progress.js +48 -0
  140. package/feedback/Spinner.d.ts +9 -0
  141. package/feedback/Spinner.js +38 -0
  142. package/feedback/Toast.d.ts +70 -0
  143. package/feedback/Toast.js +216 -0
  144. package/feedback/Tooltip.d.ts +12 -0
  145. package/feedback/Tooltip.js +86 -0
  146. package/files/FileDrop.d.ts +15 -0
  147. package/files/FileDrop.js +75 -0
  148. package/files/FileTile.d.ts +19 -0
  149. package/files/FileTile.js +96 -0
  150. package/files/FileTypeIcon.d.ts +11 -0
  151. package/files/FileTypeIcon.js +121 -0
  152. package/finance/PaymentCard.d.ts +17 -0
  153. package/finance/PaymentCard.js +109 -0
  154. package/forms/Button.d.ts +15 -0
  155. package/forms/Button.js +82 -0
  156. package/forms/ButtonGroup.d.ts +5 -0
  157. package/forms/ButtonGroup.js +22 -0
  158. package/forms/ButtonTile.d.ts +21 -0
  159. package/forms/ButtonTile.js +69 -0
  160. package/forms/Checkbox.d.ts +6 -0
  161. package/forms/Checkbox.js +52 -0
  162. package/forms/Combobox.d.ts +17 -0
  163. package/forms/Combobox.js +162 -0
  164. package/forms/DigitEntry.d.ts +15 -0
  165. package/forms/DigitEntry.js +88 -0
  166. package/forms/FormField.d.ts +39 -0
  167. package/forms/FormField.js +127 -0
  168. package/forms/IconButton.d.ts +11 -0
  169. package/forms/IconButton.js +41 -0
  170. package/forms/Input.d.ts +14 -0
  171. package/forms/Input.js +75 -0
  172. package/forms/InputGroup.d.ts +15 -0
  173. package/forms/InputGroup.js +59 -0
  174. package/forms/Label.d.ts +11 -0
  175. package/forms/Label.js +29 -0
  176. package/forms/Radio.d.ts +6 -0
  177. package/forms/Radio.js +46 -0
  178. package/forms/Select.d.ts +10 -0
  179. package/forms/Select.js +68 -0
  180. package/forms/Slider.d.ts +18 -0
  181. package/forms/Slider.js +75 -0
  182. package/forms/Switch.d.ts +6 -0
  183. package/forms/Switch.js +46 -0
  184. package/forms/Textarea.d.ts +8 -0
  185. package/forms/Textarea.js +58 -0
  186. package/forms/Toggle.d.ts +26 -0
  187. package/forms/Toggle.js +85 -0
  188. package/icons/Icon.d.ts +13 -0
  189. package/icons/Icon.js +54 -0
  190. package/index.d.ts +106 -0
  191. package/index.js +106 -0
  192. package/navigation/Breadcrumbs.d.ts +12 -0
  193. package/navigation/Breadcrumbs.js +41 -0
  194. package/navigation/Menubar.d.ts +10 -0
  195. package/navigation/Menubar.js +173 -0
  196. package/navigation/PageControl.d.ts +11 -0
  197. package/navigation/PageControl.js +36 -0
  198. package/navigation/Pagination.d.ts +9 -0
  199. package/navigation/Pagination.js +68 -0
  200. package/navigation/SegmentedControl.d.ts +17 -0
  201. package/navigation/SegmentedControl.js +42 -0
  202. package/navigation/SideNav.d.ts +18 -0
  203. package/navigation/SideNav.js +87 -0
  204. package/navigation/Steps.d.ts +15 -0
  205. package/navigation/Steps.js +61 -0
  206. package/navigation/Tabs.d.ts +17 -0
  207. package/navigation/Tabs.js +76 -0
  208. package/navigation/TopNav.d.ts +10 -0
  209. package/navigation/TopNav.js +26 -0
  210. package/overlay/CommandPalette.d.ts +21 -0
  211. package/overlay/CommandPalette.js +164 -0
  212. package/overlay/ContextMenu.d.ts +11 -0
  213. package/overlay/ContextMenu.js +140 -0
  214. package/overlay/Drawer.d.ts +14 -0
  215. package/overlay/Drawer.js +99 -0
  216. package/overlay/HoverCard.d.ts +17 -0
  217. package/overlay/HoverCard.js +74 -0
  218. package/overlay/Menu.d.ts +24 -0
  219. package/overlay/Menu.js +153 -0
  220. package/overlay/Popover.d.ts +16 -0
  221. package/overlay/Popover.js +96 -0
  222. package/overlay/Portal.d.ts +10 -0
  223. package/overlay/Portal.js +127 -0
  224. package/package.json +41 -0
  225. package/styles.css +6 -0
  226. package/tokens/base.css +10 -0
  227. package/tokens/colors.css +38 -0
  228. package/tokens/effects.css +22 -0
  229. package/tokens/fonts.css +5 -0
  230. package/tokens/spacing.css +12 -0
  231. 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;
@@ -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,5 @@
1
+ export interface ButtonGroupProps extends React.HTMLAttributes<HTMLDivElement> {
2
+ /** Buttons / IconButtons rendered as one attached segment */
3
+ children: React.ReactNode;
4
+ }
5
+ export declare function ButtonGroup(props: ButtonGroupProps): React.JSX.Element;
@@ -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;