@luxfi/ui 7.4.11 → 7.4.12

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 (70) hide show
  1. package/dist/alert.cjs +68 -46
  2. package/dist/alert.js +69 -46
  3. package/dist/avatar.cjs +49 -46
  4. package/dist/avatar.js +52 -48
  5. package/dist/badge.cjs +82 -49
  6. package/dist/badge.js +83 -50
  7. package/dist/checkbox.cjs +42 -75
  8. package/dist/checkbox.js +43 -76
  9. package/dist/chrome.cjs +3 -7
  10. package/dist/chrome.js +3 -7
  11. package/dist/close-button.cjs +3 -7
  12. package/dist/close-button.js +3 -7
  13. package/dist/dialog.cjs +3 -7
  14. package/dist/dialog.js +3 -7
  15. package/dist/drawer.cjs +3 -7
  16. package/dist/drawer.js +3 -7
  17. package/dist/empty-state.cjs +13 -13
  18. package/dist/empty-state.js +13 -13
  19. package/dist/expiration-selector.cjs +58 -63
  20. package/dist/expiration-selector.js +58 -63
  21. package/dist/greeks-display.cjs +48 -39
  22. package/dist/greeks-display.js +48 -39
  23. package/dist/index.cjs +756 -703
  24. package/dist/index.js +757 -704
  25. package/dist/option-chain.cjs +89 -67
  26. package/dist/option-chain.js +89 -67
  27. package/dist/option-position.cjs +88 -85
  28. package/dist/option-position.js +88 -85
  29. package/dist/pnl-diagram.cjs +20 -20
  30. package/dist/pnl-diagram.js +20 -20
  31. package/dist/popover.cjs +3 -7
  32. package/dist/popover.js +3 -7
  33. package/dist/progress.cjs +15 -22
  34. package/dist/progress.d.cts +6 -6
  35. package/dist/progress.d.ts +6 -6
  36. package/dist/progress.js +15 -22
  37. package/dist/radio.cjs +35 -67
  38. package/dist/radio.d.cts +18 -18
  39. package/dist/radio.d.ts +18 -18
  40. package/dist/radio.js +36 -68
  41. package/dist/slider.cjs +33 -49
  42. package/dist/slider.js +34 -50
  43. package/dist/switch.cjs +48 -55
  44. package/dist/switch.js +49 -56
  45. package/dist/tag.cjs +112 -69
  46. package/dist/tag.js +113 -69
  47. package/dist/tooltip.cjs +28 -17
  48. package/dist/tooltip.js +30 -18
  49. package/package.json +1 -1
  50. package/src/alert.tsx +78 -45
  51. package/src/avatar.tsx +54 -37
  52. package/src/badge.tsx +65 -44
  53. package/src/checkbox.tsx +70 -89
  54. package/src/close-button.tsx +3 -8
  55. package/src/empty-state.tsx +21 -17
  56. package/src/expiration-selector.tsx +84 -66
  57. package/src/greeks-display.tsx +59 -51
  58. package/src/input-group.tsx +38 -24
  59. package/src/option-chain.tsx +154 -104
  60. package/src/option-position.tsx +136 -114
  61. package/src/pin-input.tsx +37 -29
  62. package/src/pnl-diagram.tsx +36 -28
  63. package/src/progress.tsx +17 -21
  64. package/src/radio.tsx +56 -75
  65. package/src/slider.tsx +43 -44
  66. package/src/strategy-builder.tsx +245 -156
  67. package/src/switch.tsx +63 -64
  68. package/src/tag.tsx +89 -51
  69. package/src/tooltip.tsx +21 -13
  70. package/tokens.css +18 -0
package/dist/switch.js CHANGED
@@ -1,33 +1,20 @@
1
1
  "use client";
2
- import { Switch } from '@hanzo/gui';
2
+ import { Label, Switch, Text, VisuallyHidden } from '@hanzo/gui';
3
3
  import * as React from 'react';
4
- import { clsx } from 'clsx';
5
- import { twMerge } from 'tailwind-merge';
6
4
  import { jsxs, jsx } from 'react/jsx-runtime';
7
5
 
8
6
  // src/switch.tsx
9
- function cn(...inputs) {
10
- return twMerge(clsx(inputs));
11
- }
12
7
  var NOOP = () => {
13
8
  };
14
- var SIZE_CLASSES = {
15
- sm: {
16
- root: "h-4 w-7",
17
- thumb: "h-3 w-3",
18
- label: "text-xs"
19
- },
20
- md: {
21
- root: "h-5 w-9",
22
- thumb: "h-4 w-4",
23
- label: "text-sm"
24
- },
25
- lg: {
26
- root: "h-6 w-11",
27
- thumb: "h-5 w-5",
28
- label: "text-base"
29
- }
9
+ var SIZE = {
10
+ sm: { width: 28, height: 16, thumb: 12, label: 12 },
11
+ md: { width: 36, height: 20, thumb: 16, label: 14 },
12
+ lg: { width: 44, height: 24, thumb: 20, label: 16 }
30
13
  };
14
+ var TRACK_ON = "var(--color-text-primary)";
15
+ var TRACK_OFF = "var(--color-switch-bg)";
16
+ var OUTLINE = "var(--color-gray-500)";
17
+ var WHITE = "var(--color-white)";
31
18
  var SwitchBase = React.forwardRef(
32
19
  function Switch$1(props, ref) {
33
20
  const {
@@ -44,7 +31,6 @@ var SwitchBase = React.forwardRef(
44
31
  disabled = false,
45
32
  size = "md",
46
33
  direction,
47
- className,
48
34
  ...rest
49
35
  } = props;
50
36
  const [internalChecked, setInternalChecked] = React.useState(defaultChecked ?? false);
@@ -59,18 +45,19 @@ var SwitchBase = React.forwardRef(
59
45
  },
60
46
  [isControlled, onCheckedChange]
61
47
  );
62
- const sizeClasses = SIZE_CLASSES[size];
48
+ const s = SIZE[size];
63
49
  const isRtl = direction === "rtl";
64
50
  return /* @__PURE__ */ jsxs(
65
- "label",
51
+ Label,
66
52
  {
67
53
  ref: rootRef,
68
- className: cn(
69
- "inline-flex items-center cursor-pointer select-none gap-2",
70
- isRtl && "flex-row-reverse",
71
- disabled && "opacity-50 cursor-not-allowed",
72
- className
73
- ),
54
+ unstyled: true,
55
+ flexDirection: isRtl ? "row-reverse" : "row",
56
+ alignItems: "center",
57
+ gap: 8,
58
+ cursor: disabled ? "not-allowed" : "pointer",
59
+ userSelect: "none",
60
+ opacity: disabled ? 0.5 : 1,
74
61
  onChange,
75
62
  "data-disabled": disabled || void 0,
76
63
  ...rest,
@@ -82,38 +69,51 @@ var SwitchBase = React.forwardRef(
82
69
  checked: checkedState,
83
70
  onCheckedChange: handleCheckedChange,
84
71
  disabled,
85
- className: cn(
86
- "relative inline-flex shrink-0 items-center rounded-full",
87
- "bg-gray-300 dark:bg-gray-600",
88
- "data-[state=checked]:bg-gray-800 dark:bg-white",
89
- "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-500",
90
- "transition-colors duration-200",
91
- sizeClasses.root
92
- ),
72
+ position: "relative",
73
+ flexShrink: 0,
74
+ alignItems: "center",
75
+ width: s.width,
76
+ height: s.height,
77
+ borderRadius: 9999,
78
+ backgroundColor: checkedState ? TRACK_ON : TRACK_OFF,
79
+ transition: "quick",
80
+ focusStyle: { outlineWidth: 2, outlineStyle: "solid", outlineColor: OUTLINE, outlineOffset: 2 },
93
81
  children: [
94
- trackLabel && /* @__PURE__ */ jsx("span", { className: "absolute inset-0 flex items-center justify-center text-[8px] font-bold text-white pointer-events-none", children: checkedState ? trackLabel.on : trackLabel.off }),
82
+ trackLabel && /* @__PURE__ */ jsx(
83
+ Text,
84
+ {
85
+ position: "absolute",
86
+ width: "100%",
87
+ textAlign: "center",
88
+ fontSize: 8,
89
+ fontWeight: "700",
90
+ color: WHITE,
91
+ pointerEvents: "none",
92
+ children: checkedState ? trackLabel.on : trackLabel.off
93
+ }
94
+ ),
95
95
  /* @__PURE__ */ jsx(
96
96
  Switch.Thumb,
97
97
  {
98
98
  unstyled: true,
99
99
  "data-thumb": true,
100
100
  transition: "quicker",
101
- className: cn(
102
- "block rounded-full bg-white shadow-sm",
103
- sizeClasses.thumb
104
- ),
105
- children: thumbLabel && /* @__PURE__ */ jsx("span", { className: "flex items-center justify-center h-full w-full text-[8px]", children: checkedState ? thumbLabel.on : thumbLabel.off })
101
+ width: s.thumb,
102
+ height: s.thumb,
103
+ borderRadius: 9999,
104
+ backgroundColor: WHITE,
105
+ boxShadow: "0 1px 2px 0 rgba(0,0,0,0.05)",
106
+ children: thumbLabel && /* @__PURE__ */ jsx(Text, { width: "100%", height: "100%", textAlign: "center", fontSize: 8, children: checkedState ? thumbLabel.on : thumbLabel.off })
106
107
  }
107
108
  )
108
109
  ]
109
110
  }
110
111
  ),
111
- /* @__PURE__ */ jsx(
112
+ /* @__PURE__ */ jsx(VisuallyHidden, { children: /* @__PURE__ */ jsx(
112
113
  "input",
113
114
  {
114
115
  ref,
115
116
  type: "checkbox",
116
- className: "sr-only",
117
117
  checked: checkedState,
118
118
  disabled,
119
119
  tabIndex: -1,
@@ -121,15 +121,8 @@ var SwitchBase = React.forwardRef(
121
121
  onChange: NOOP,
122
122
  ...inputProps
123
123
  }
124
- ),
125
- children != null && /* @__PURE__ */ jsx(
126
- "span",
127
- {
128
- ...labelProps,
129
- className: cn(sizeClasses.label, labelProps?.className),
130
- children
131
- }
132
- )
124
+ ) }),
125
+ children != null && /* @__PURE__ */ jsx(Text, { ...labelProps, fontSize: s.label, children })
133
126
  ]
134
127
  }
135
128
  );
package/dist/tag.cjs CHANGED
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
+ var gui = require('@hanzo/gui');
4
5
  var React4 = require('react');
6
+ var jsxRuntime = require('react/jsx-runtime');
5
7
  var clsx = require('clsx');
6
8
  var tailwindMerge = require('tailwind-merge');
7
- var gui = require('@hanzo/gui');
8
- var jsxRuntime = require('react/jsx-runtime');
9
9
  var usehooks = require('@uidotdev/usehooks');
10
10
 
11
11
  function _interopNamespace(e) {
@@ -29,9 +29,6 @@ function _interopNamespace(e) {
29
29
  var React4__namespace = /*#__PURE__*/_interopNamespace(React4);
30
30
 
31
31
  // src/tag.tsx
32
- function cn(...inputs) {
33
- return tailwindMerge.twMerge(clsx.clsx(inputs));
34
- }
35
32
  var CLOSE_ICON_PATH = "M9.44 8.035a.791.791 0 0 0 1.12 0l3.802-3.803a.791.791 0 0 1 1.119 0l.287.287a.79.79 0 0 1 0 1.119L11.965 9.44a.79.79 0 0 0 0 1.118l3.803 3.803a.791.791 0 0 1 0 1.119l-.287.287a.791.791 0 0 1-1.119 0l-3.803-3.803a.79.79 0 0 0-1.118 0l-3.803 3.803a.79.79 0 0 1-1.119 0l-.287-.287a.791.791 0 0 1 0-1.119l3.803-3.803a.791.791 0 0 0 0-1.118L4.232 5.638a.791.791 0 0 1 0-1.119l.287-.287a.791.791 0 0 1 1.119 0L9.44 8.035Z";
36
33
  var CloseButtonFrame = gui.styled(gui.View, {
37
34
  name: "LuxCloseButton",
@@ -62,23 +59,19 @@ var CloseButtonFrame = gui.styled(gui.View, {
62
59
  }
63
60
  }
64
61
  });
65
- var CLOSE_BUTTON_CLASSES = [
66
- "text-[var(--closeButton-fg,currentColor)]",
67
- "hover:text-[var(--hover-color,currentColor)]",
68
- "disabled:opacity-40"
69
- ].join(" ");
70
62
  var CloseButton = React4__namespace.forwardRef(function CloseButton2(props, ref) {
71
63
  const { variant: _variant, size: _size, className, children, ...rest } = props;
72
64
  return /* @__PURE__ */ jsxRuntime.jsx(
73
65
  CloseButtonFrame,
74
66
  {
75
67
  ref,
76
- className: [CLOSE_BUTTON_CLASSES, className].filter(Boolean).join(" "),
68
+ className,
77
69
  ...rest,
78
70
  children: children ?? /* @__PURE__ */ jsxRuntime.jsx(
79
71
  "svg",
80
72
  {
81
- className: "size-5",
73
+ width: 20,
74
+ height: 20,
82
75
  viewBox: "0 0 20 20",
83
76
  fill: "none",
84
77
  "aria-hidden": "true",
@@ -94,6 +87,9 @@ var CloseButton = React4__namespace.forwardRef(function CloseButton2(props, ref)
94
87
  }
95
88
  );
96
89
  });
90
+ function cn(...inputs) {
91
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
92
+ }
97
93
  var SHIM_PROPS = [
98
94
  "w",
99
95
  "h",
@@ -277,6 +273,14 @@ React4__namespace.forwardRef(
277
273
  )) });
278
274
  }
279
275
  );
276
+ var ink = (children, Wrap = gui.Text, props = {}) => {
277
+ let hasText = false;
278
+ React4.Children.forEach(children, (child) => {
279
+ if (typeof child === "string" || typeof child === "number") hasText = true;
280
+ });
281
+ if (!hasText) return children;
282
+ return React4.Children.map(children, (child) => typeof child === "string" || typeof child === "number" ? React4.createElement(Wrap, props, child) : child);
283
+ };
280
284
  var TOUCH_PX = 1024;
281
285
  function useBelow(px) {
282
286
  const [below, setBelow] = React4__namespace.useState(false);
@@ -381,14 +385,21 @@ var Tooltip = React4__namespace.forwardRef(
381
385
  {
382
386
  ref,
383
387
  unstyled: true,
384
- className: cn(
385
- "z-[9999] overflow-hidden rounded-lg px-3 py-2 text-sm",
386
- "animate-in fade-in-0 zoom-in-95",
387
- isPopover && "bg-[var(--color-popover-bg)] text-[var(--color-text-primary)]",
388
- isPopover && "shadow-[var(--shadow-popover)] border border-[var(--color-border-divider)] max-w-sm",
389
- !isPopover && "bg-[var(--color-tooltip-bg)] text-[var(--color-tooltip-fg)] max-w-xs",
390
- contentProps?.className
391
- ),
388
+ zIndex: 9999,
389
+ overflow: "hidden",
390
+ borderRadius: 8,
391
+ paddingHorizontal: 12,
392
+ paddingVertical: 8,
393
+ maxWidth: isPopover ? 384 : 320,
394
+ backgroundColor: isPopover ? "var(--color-popover-bg)" : "var(--color-tooltip-bg)",
395
+ transition: "quick",
396
+ enterStyle: { opacity: 0, scale: 0.95 },
397
+ exitStyle: { opacity: 0, scale: 0.95 },
398
+ ...isPopover ? {
399
+ borderWidth: 1,
400
+ borderColor: "var(--color-border-divider)",
401
+ shadowColor: "var(--shadow-popover)"
402
+ } : {},
392
403
  onClick: interactive ? handleContentClick : void 0,
393
404
  ...selected ? { "data-selected": true } : {},
394
405
  ...contentProps,
@@ -397,12 +408,13 @@ var Tooltip = React4__namespace.forwardRef(
397
408
  gui.Tooltip.Arrow,
398
409
  {
399
410
  unstyled: true,
400
- className: cn(
401
- isPopover ? "fill-[var(--color-popover-bg)]" : "fill-[var(--color-tooltip-bg)]"
402
- )
411
+ backgroundColor: isPopover ? "var(--color-popover-bg)" : "var(--color-tooltip-bg)"
403
412
  }
404
413
  ),
405
- content
414
+ ink(content, void 0, {
415
+ fontSize: 14,
416
+ color: isPopover ? "var(--color-text-primary)" : "var(--color-tooltip-fg)"
417
+ })
406
418
  ]
407
419
  }
408
420
  )
@@ -415,25 +427,24 @@ var nbsp = String.fromCharCode(160);
415
427
  function TruncatedTextTooltip({ label, children }) {
416
428
  return /* @__PURE__ */ jsxRuntime.jsx(Tooltip, { content: label, positioning: { placement: "top" }, children });
417
429
  }
418
- var TAG_BASE = "inline-flex items-center align-top max-w-full select-text rounded-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-500";
419
- var TAG_VARIANT_CLASSES = {
420
- subtle: "bg-[var(--color-tag-subtle-bg)] text-[var(--color-tag-subtle-fg)]",
421
- clickable: "cursor-pointer bg-[var(--color-tag-clickable-bg)] text-[var(--color-tag-clickable-fg)] hover:opacity-76",
422
- filter: "bg-[var(--color-tag-filter-bg)]",
423
- select: "cursor-pointer bg-[var(--color-tag-select-bg)] text-[var(--color-tag-select-fg)] hover:text-[var(--color-hover)] hover:opacity-76"
430
+ var TAG_VARIANT = {
431
+ subtle: { backgroundColor: "var(--color-tag-subtle-bg)" },
432
+ clickable: { backgroundColor: "var(--color-tag-clickable-bg)", cursor: "pointer", hoverStyle: { opacity: 0.76 } },
433
+ filter: { backgroundColor: "var(--color-tag-filter-bg)" },
434
+ select: { backgroundColor: "var(--color-tag-select-bg)", cursor: "pointer", hoverStyle: { opacity: 0.76 } }
435
+ };
436
+ var TAG_VARIANT_FG = {
437
+ subtle: "var(--color-tag-subtle-fg)",
438
+ clickable: "var(--color-tag-clickable-fg)",
439
+ filter: void 0,
440
+ select: "var(--color-tag-select-fg)"
424
441
  };
425
- var TAG_SIZE_CLASSES = {
426
- sm: "px-1 py-0.5 min-h-5 gap-1 text-xs",
427
- md: "px-1 py-0.5 min-h-6 gap-1 text-sm",
428
- lg: "px-1.5 py-1.5 min-h-8 min-w-8 gap-1 text-sm"
442
+ var TAG_SIZE = {
443
+ sm: { paddingHorizontal: 4, paddingVertical: 2, minHeight: 20, gap: 4 },
444
+ md: { paddingHorizontal: 4, paddingVertical: 2, minHeight: 24, gap: 4 },
445
+ lg: { paddingHorizontal: 6, paddingVertical: 6, minHeight: 32, minWidth: 32, gap: 4 }
429
446
  };
430
- var TAG_SELECTED_CLASSES = [
431
- "bg-[var(--color-tag-select-selected-bg)]",
432
- "text-[var(--color-tag-select-selected-fg)]",
433
- "hover:text-[var(--color-tag-select-selected-fg)]",
434
- "hover:opacity-76"
435
- ].join(" ");
436
- var TAG_DISABLED_CLASSES = "opacity-40 pointer-events-none cursor-not-allowed";
447
+ var TAG_SIZE_FONT = { sm: 12, md: 14, lg: 14 };
437
448
  var Tag = React4__namespace.forwardRef(
438
449
  function Tag2(props, ref) {
439
450
  const {
@@ -453,46 +464,78 @@ var Tag = React4__namespace.forwardRef(
453
464
  className,
454
465
  ...rest
455
466
  } = props;
456
- const labelElement = label ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-[var(--color-text-secondary)]", children: [
467
+ const resolvedVariant = variant ?? "subtle";
468
+ const resolvedSize = size ?? "md";
469
+ const isSelected = Boolean(selected) && !loading;
470
+ const backgroundColor = isSelected ? "var(--color-tag-select-selected-bg)" : TAG_VARIANT[resolvedVariant].backgroundColor;
471
+ const color = isSelected ? "var(--color-tag-select-selected-fg)" : TAG_VARIANT_FG[resolvedVariant];
472
+ const hoverStyle = isSelected ? { opacity: 0.76 } : TAG_VARIANT[resolvedVariant].hoverStyle;
473
+ const textHoverColor = !isSelected && resolvedVariant === "select" ? "var(--color-hover)" : void 0;
474
+ const labelElement = label ? /* @__PURE__ */ jsxRuntime.jsxs(gui.Text, { fontSize: TAG_SIZE_FONT[resolvedSize], fontWeight: "500", color: "var(--color-text-secondary)", children: [
457
475
  label,
458
476
  ":",
459
477
  nbsp
460
478
  ] }) : null;
461
- const labelSpan = /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "line-clamp-1 whitespace-nowrap text-ellipsis font-medium inline", children: [
462
- labelElement,
463
- children
464
- ] });
479
+ const labelSpan = /* @__PURE__ */ jsxRuntime.jsxs(
480
+ gui.Text,
481
+ {
482
+ overflow: "hidden",
483
+ textOverflow: "ellipsis",
484
+ whiteSpace: "nowrap",
485
+ fontWeight: "500",
486
+ fontSize: TAG_SIZE_FONT[resolvedSize],
487
+ color,
488
+ hoverStyle: textHoverColor ? { color: textHoverColor } : void 0,
489
+ children: [
490
+ labelElement,
491
+ children
492
+ ]
493
+ }
494
+ );
465
495
  const contentElement = truncated ? /* @__PURE__ */ jsxRuntime.jsx(TruncatedTextTooltip, { label: children, children: labelSpan }) : labelSpan;
466
496
  return /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { loading, asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
467
- "span",
497
+ gui.XStack,
468
498
  {
469
499
  ref,
470
- className: cn(
471
- TAG_BASE,
472
- TAG_VARIANT_CLASSES[variant ?? "subtle"],
473
- TAG_SIZE_CLASSES[size ?? "md"],
474
- selected && !loading && TAG_SELECTED_CLASSES,
475
- disabled && TAG_DISABLED_CLASSES,
476
- className
477
- ),
478
- ...selected && !loading && { "data-selected": true },
500
+ render: /* @__PURE__ */ jsxRuntime.jsx("span", {}),
501
+ display: "inline-flex",
502
+ alignItems: "center",
503
+ verticalAlign: "top",
504
+ maxWidth: "100%",
505
+ userSelect: "text",
506
+ ...TAG_SIZE[resolvedSize],
507
+ backgroundColor,
508
+ hoverStyle,
509
+ focusVisibleStyle: {
510
+ outlineWidth: 2,
511
+ outlineOffset: 2,
512
+ outlineColor: "var(--color-gray-500)",
513
+ outlineStyle: "solid"
514
+ },
515
+ cursor: disabled ? "not-allowed" : TAG_VARIANT[resolvedVariant].cursor,
516
+ ...disabled ? { opacity: 0.4, pointerEvents: "none" } : {},
517
+ ...isSelected && { "data-selected": true },
479
518
  ...disabled && { "data-disabled": true },
519
+ className,
480
520
  ...rest,
481
521
  children: [
482
- startElement && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 inline-flex items-center justify-center empty:hidden", children: startElement }),
522
+ startElement && /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { flexShrink: 0, alignItems: "center", justifyContent: "center", children: startElement }),
483
523
  contentElement,
484
- endElement && /* @__PURE__ */ jsxRuntime.jsx(
485
- "span",
486
- {
487
- ...endElementProps,
488
- className: cn(
489
- "shrink-0 inline-flex items-center justify-center",
490
- endElementProps?.className
491
- ),
492
- children: endElement
493
- }
494
- ),
495
- closable && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 inline-flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(CloseButton, { onClick: onClose }) })
524
+ endElement && (() => {
525
+ const { className: endClassName, ...endElementRest } = endElementProps ?? {};
526
+ return /* @__PURE__ */ jsxRuntime.jsx(
527
+ gui.XStack,
528
+ {
529
+ ...endElementRest,
530
+ flexShrink: 0,
531
+ alignItems: "center",
532
+ justifyContent: "center",
533
+ className: endClassName,
534
+ children: endElement
535
+ }
536
+ );
537
+ })(),
538
+ closable && /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { flexShrink: 0, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(CloseButton, { onClick: onClose }) })
496
539
  ]
497
540
  }
498
541
  ) });