@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,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;
@@ -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;
@@ -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;
@@ -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
+ }