@luxfi/ui 7.4.9 → 7.4.11

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 (82) hide show
  1. package/dist/accordion.cjs +107 -166
  2. package/dist/accordion.d.cts +18 -51
  3. package/dist/accordion.d.ts +18 -51
  4. package/dist/accordion.js +109 -166
  5. package/dist/chrome.cjs +193 -379
  6. package/dist/chrome.js +195 -379
  7. package/dist/collapsible.cjs +35 -26
  8. package/dist/collapsible.d.cts +2 -1
  9. package/dist/collapsible.d.ts +2 -1
  10. package/dist/collapsible.js +34 -24
  11. package/dist/dialog.d.cts +1 -1
  12. package/dist/dialog.d.ts +1 -1
  13. package/dist/drawer.cjs +92 -115
  14. package/dist/drawer.d.cts +43 -10
  15. package/dist/drawer.d.ts +43 -10
  16. package/dist/drawer.js +94 -115
  17. package/dist/field.cjs +60 -109
  18. package/dist/field.d.cts +0 -1
  19. package/dist/field.d.ts +0 -1
  20. package/dist/field.js +61 -109
  21. package/dist/heading.cjs +10 -17
  22. package/dist/heading.d.cts +0 -2
  23. package/dist/heading.d.ts +0 -2
  24. package/dist/heading.js +10 -17
  25. package/dist/icon-button.cjs +82 -82
  26. package/dist/icon-button.d.cts +16 -12
  27. package/dist/icon-button.d.ts +16 -12
  28. package/dist/icon-button.js +82 -82
  29. package/dist/index.cjs +1073 -1419
  30. package/dist/index.d.cts +1 -5
  31. package/dist/index.d.ts +1 -5
  32. package/dist/index.js +1075 -1414
  33. package/dist/input-group.cjs +11 -12
  34. package/dist/input-group.js +11 -12
  35. package/dist/input.cjs +27 -27
  36. package/dist/input.d.cts +21 -1
  37. package/dist/input.d.ts +21 -1
  38. package/dist/input.js +25 -28
  39. package/dist/menu.cjs +160 -271
  40. package/dist/menu.d.cts +41 -57
  41. package/dist/menu.d.ts +41 -57
  42. package/dist/menu.js +161 -251
  43. package/dist/next.cjs +6 -10
  44. package/dist/next.js +5 -9
  45. package/dist/popover.cjs +1 -1
  46. package/dist/popover.js +1 -1
  47. package/dist/select.cjs +40 -39
  48. package/dist/select.d.cts +35 -4
  49. package/dist/select.d.ts +35 -4
  50. package/dist/select.js +40 -38
  51. package/dist/separator.cjs +8 -33
  52. package/dist/separator.js +8 -33
  53. package/dist/tabs.cjs +108 -197
  54. package/dist/tabs.d.cts +16 -60
  55. package/dist/tabs.d.ts +16 -60
  56. package/dist/tabs.js +109 -196
  57. package/dist/textarea.cjs +56 -27
  58. package/dist/textarea.js +57 -28
  59. package/dist/toaster.cjs +97 -79
  60. package/dist/toaster.d.cts +7 -8
  61. package/dist/toaster.d.ts +7 -8
  62. package/dist/toaster.js +78 -80
  63. package/package.json +2 -16
  64. package/src/accordion.tsx +173 -227
  65. package/src/collapsible.tsx +55 -52
  66. package/src/drawer.tsx +123 -115
  67. package/src/engine.ts +0 -25
  68. package/src/field.tsx +68 -124
  69. package/src/heading.tsx +22 -26
  70. package/src/icon-button.tsx +134 -141
  71. package/src/ink.tsx +37 -0
  72. package/src/input-group.tsx +21 -12
  73. package/src/input.tsx +41 -32
  74. package/src/menu.tsx +224 -397
  75. package/src/next.ts +32 -1
  76. package/src/popover.tsx +1 -1
  77. package/src/select.tsx +80 -59
  78. package/src/separator.tsx +13 -34
  79. package/src/tabs.tsx +166 -296
  80. package/src/textarea.tsx +19 -29
  81. package/src/toaster.tsx +118 -86
  82. package/tokens.css +61 -0
package/dist/toaster.cjs CHANGED
@@ -1,98 +1,116 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var sonner = require('sonner');
4
+ var gui = require('@hanzo/gui');
5
+ var React = require('react');
5
6
  var jsxRuntime = require('react/jsx-runtime');
6
7
 
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
27
+
7
28
  var SECOND = 1e3;
8
29
  var DURATION = 10 * SECOND;
9
- function mapOptions(opts) {
10
- const external = {
11
- id: opts.id,
12
- description: opts.description,
13
- duration: opts.duration
30
+ var entries = [];
31
+ var listeners = /* @__PURE__ */ new Set();
32
+ var counter = 0;
33
+ var emit = () => listeners.forEach((l) => l());
34
+ var subscribe = (l) => {
35
+ listeners.add(l);
36
+ return () => {
37
+ listeners.delete(l);
14
38
  };
15
- if (opts.action) {
16
- external.action = {
17
- label: opts.action.label,
18
- onClick: opts.action.onClick
19
- };
20
- }
21
- if (opts.onStatusChange) {
22
- const cb = opts.onStatusChange;
23
- external.onDismiss = () => cb({ status: "unmounted" });
24
- external.onAutoClose = () => cb({ status: "unmounted" });
25
- }
26
- return external;
27
- }
28
- function create(opts) {
29
- const external = mapOptions(opts);
30
- const title = opts.title ?? "";
31
- switch (opts.type) {
32
- case "success":
33
- return sonner.toast.success(title, external);
34
- case "error":
35
- return sonner.toast.error(title, external);
36
- case "warning":
37
- return sonner.toast.warning(title, external);
38
- case "loading":
39
- return sonner.toast.loading(title, external);
40
- case "info":
41
- default:
42
- return sonner.toast.info(title, external);
43
- }
44
- }
45
- function update(id, opts) {
46
- const title = opts.title ?? "";
47
- const external = mapOptions({ ...opts, id });
48
- switch (opts.type) {
49
- case "success":
50
- sonner.toast.success(title, external);
51
- break;
52
- case "error":
53
- sonner.toast.error(title, external);
54
- break;
55
- case "warning":
56
- sonner.toast.warning(title, external);
57
- break;
58
- case "loading":
59
- sonner.toast.loading(title, external);
60
- break;
61
- case "info":
62
- default:
63
- sonner.toast.info(title, external);
64
- break;
65
- }
66
- }
39
+ };
40
+ var snapshot = () => entries;
41
+ var remove = (id) => {
42
+ const found = entries.find((e) => e.id === id);
43
+ entries = entries.filter((e) => e.id !== id);
44
+ emit();
45
+ found?.onStatusChange?.({ status: "unmounted" });
46
+ };
47
+ var create = (opts) => {
48
+ const id = opts.id ?? `toast-${++counter}`;
49
+ const entry = { ...opts, id };
50
+ entries = [...entries.filter((e) => e.id !== id), entry];
51
+ emit();
52
+ return id;
53
+ };
54
+ var update = (id, opts) => {
55
+ entries = entries.map((e) => e.id === id ? { ...e, ...opts, id } : e);
56
+ emit();
57
+ };
67
58
  var toaster = {
68
59
  create,
69
60
  success: (opts) => create({ ...opts, type: "success" }),
70
61
  error: (opts) => create({ ...opts, type: "error" }),
71
62
  loading: (opts) => create({ ...opts, type: "loading" }),
72
63
  update,
73
- remove: (id) => sonner.toast.dismiss(id)
64
+ remove
74
65
  };
75
- var Toaster = () => {
76
- return /* @__PURE__ */ jsxRuntime.jsx(
77
- sonner.Toaster,
78
- {
79
- position: "top-right",
80
- richColors: true,
81
- closeButton: true,
82
- duration: DURATION,
83
- offset: { top: 12, right: 12, bottom: 12, left: 12 },
84
- mobileOffset: { top: 16, right: 16, bottom: 16, left: 16 },
85
- toastOptions: {
86
- className: "font-sans",
87
- style: {
88
- fontFamily: 'var(--font-sans, "Geist", sans-serif)',
89
- color: "var(--color-text-primary)",
90
- backgroundColor: "var(--color-bg-primary)",
91
- borderColor: "var(--color-border-divider)"
66
+ var EDGE = {
67
+ success: "var(--color-status-good)",
68
+ error: "var(--color-status-bad)",
69
+ warning: "var(--color-status-warn)",
70
+ loading: "var(--color-border-divider)",
71
+ info: "var(--color-border-divider)"
72
+ };
73
+ var One = ({ entry }) => /* @__PURE__ */ jsxRuntime.jsxs(
74
+ gui.Toast,
75
+ {
76
+ duration: entry.duration ?? DURATION,
77
+ onOpenChange: (open) => {
78
+ if (!open) remove(entry.id);
79
+ },
80
+ unstyled: true,
81
+ flexDirection: "column",
82
+ gap: 4,
83
+ padding: 12,
84
+ borderRadius: 8,
85
+ borderWidth: 1,
86
+ borderColor: EDGE[entry.type ?? "info"],
87
+ backgroundColor: "var(--color-popover-bg)",
88
+ transition: "quick",
89
+ enterStyle: { opacity: 0, y: -8 },
90
+ exitStyle: { opacity: 0, y: -8 },
91
+ children: [
92
+ entry.title ? /* @__PURE__ */ jsxRuntime.jsx(gui.Toast.Title, { unstyled: true, fontSize: 14, fontWeight: "600", color: "var(--color-text-primary)", children: entry.title }) : null,
93
+ entry.description ? /* @__PURE__ */ jsxRuntime.jsx(gui.Toast.Description, { unstyled: true, fontSize: 13, color: "var(--color-text-secondary)", children: entry.description }) : null,
94
+ entry.action ? /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { marginTop: 4, children: /* @__PURE__ */ jsxRuntime.jsx(gui.Toast.Action, { altText: entry.action.label, onPress: entry.action.onClick, children: /* @__PURE__ */ jsxRuntime.jsx(
95
+ gui.Text,
96
+ {
97
+ cursor: "pointer",
98
+ fontSize: 13,
99
+ fontWeight: "500",
100
+ color: "var(--color-link-primary)",
101
+ children: entry.action.label
92
102
  }
93
- }
94
- }
95
- );
103
+ ) }) }) : null
104
+ ]
105
+ },
106
+ entry.id
107
+ );
108
+ var Toaster = () => {
109
+ const list = React__namespace.useSyncExternalStore(subscribe, snapshot, snapshot);
110
+ return /* @__PURE__ */ jsxRuntime.jsxs(gui.ToastProvider, { children: [
111
+ /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { children: list.map((entry) => /* @__PURE__ */ jsxRuntime.jsx(One, { entry }, entry.id)) }),
112
+ /* @__PURE__ */ jsxRuntime.jsx(gui.ToastViewport, { position: "absolute", top: 12, right: 12 })
113
+ ] });
96
114
  };
97
115
 
98
116
  exports.Toaster = Toaster;
@@ -1,10 +1,11 @@
1
- import React__default from 'react';
1
+ import * as React from 'react';
2
2
 
3
+ type ToastType = 'info' | 'warning' | 'success' | 'error' | 'loading';
3
4
  interface ToastOptions {
4
5
  readonly id?: string | number;
5
6
  readonly title?: string;
6
7
  readonly description?: string;
7
- readonly type?: 'info' | 'warning' | 'success' | 'error' | 'loading';
8
+ readonly type?: ToastType;
8
9
  readonly duration?: number;
9
10
  readonly action?: {
10
11
  readonly label: string;
@@ -14,16 +15,14 @@ interface ToastOptions {
14
15
  readonly status: string;
15
16
  }) => void;
16
17
  }
17
- declare function create(opts: ToastOptions): string | number;
18
- declare function update(id: string | number, opts: ToastOptions): void;
19
18
  declare const toaster: {
20
- readonly create: typeof create;
19
+ readonly create: (opts: ToastOptions) => string | number;
21
20
  readonly success: (opts: ToastOptions) => string | number;
22
21
  readonly error: (opts: ToastOptions) => string | number;
23
22
  readonly loading: (opts: ToastOptions) => string | number;
24
- readonly update: typeof update;
25
- readonly remove: (id: string | number) => string | number;
23
+ readonly update: (id: string | number, opts: ToastOptions) => void;
24
+ readonly remove: (id: string | number) => void;
26
25
  };
27
- declare const Toaster: React__default.FC;
26
+ declare const Toaster: React.FC;
28
27
 
29
28
  export { Toaster, toaster };
package/dist/toaster.d.ts CHANGED
@@ -1,10 +1,11 @@
1
- import React__default from 'react';
1
+ import * as React from 'react';
2
2
 
3
+ type ToastType = 'info' | 'warning' | 'success' | 'error' | 'loading';
3
4
  interface ToastOptions {
4
5
  readonly id?: string | number;
5
6
  readonly title?: string;
6
7
  readonly description?: string;
7
- readonly type?: 'info' | 'warning' | 'success' | 'error' | 'loading';
8
+ readonly type?: ToastType;
8
9
  readonly duration?: number;
9
10
  readonly action?: {
10
11
  readonly label: string;
@@ -14,16 +15,14 @@ interface ToastOptions {
14
15
  readonly status: string;
15
16
  }) => void;
16
17
  }
17
- declare function create(opts: ToastOptions): string | number;
18
- declare function update(id: string | number, opts: ToastOptions): void;
19
18
  declare const toaster: {
20
- readonly create: typeof create;
19
+ readonly create: (opts: ToastOptions) => string | number;
21
20
  readonly success: (opts: ToastOptions) => string | number;
22
21
  readonly error: (opts: ToastOptions) => string | number;
23
22
  readonly loading: (opts: ToastOptions) => string | number;
24
- readonly update: typeof update;
25
- readonly remove: (id: string | number) => string | number;
23
+ readonly update: (id: string | number, opts: ToastOptions) => void;
24
+ readonly remove: (id: string | number) => void;
26
25
  };
27
- declare const Toaster: React__default.FC;
26
+ declare const Toaster: React.FC;
28
27
 
29
28
  export { Toaster, toaster };
package/dist/toaster.js CHANGED
@@ -1,96 +1,94 @@
1
1
  "use client";
2
- import { toast, Toaster as Toaster$1 } from 'sonner';
3
- import { jsx } from 'react/jsx-runtime';
2
+ import { ToastProvider, YStack, ToastViewport, Toast, XStack, Text } from '@hanzo/gui';
3
+ import * as React from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
5
 
5
6
  var SECOND = 1e3;
6
7
  var DURATION = 10 * SECOND;
7
- function mapOptions(opts) {
8
- const external = {
9
- id: opts.id,
10
- description: opts.description,
11
- duration: opts.duration
8
+ var entries = [];
9
+ var listeners = /* @__PURE__ */ new Set();
10
+ var counter = 0;
11
+ var emit = () => listeners.forEach((l) => l());
12
+ var subscribe = (l) => {
13
+ listeners.add(l);
14
+ return () => {
15
+ listeners.delete(l);
12
16
  };
13
- if (opts.action) {
14
- external.action = {
15
- label: opts.action.label,
16
- onClick: opts.action.onClick
17
- };
18
- }
19
- if (opts.onStatusChange) {
20
- const cb = opts.onStatusChange;
21
- external.onDismiss = () => cb({ status: "unmounted" });
22
- external.onAutoClose = () => cb({ status: "unmounted" });
23
- }
24
- return external;
25
- }
26
- function create(opts) {
27
- const external = mapOptions(opts);
28
- const title = opts.title ?? "";
29
- switch (opts.type) {
30
- case "success":
31
- return toast.success(title, external);
32
- case "error":
33
- return toast.error(title, external);
34
- case "warning":
35
- return toast.warning(title, external);
36
- case "loading":
37
- return toast.loading(title, external);
38
- case "info":
39
- default:
40
- return toast.info(title, external);
41
- }
42
- }
43
- function update(id, opts) {
44
- const title = opts.title ?? "";
45
- const external = mapOptions({ ...opts, id });
46
- switch (opts.type) {
47
- case "success":
48
- toast.success(title, external);
49
- break;
50
- case "error":
51
- toast.error(title, external);
52
- break;
53
- case "warning":
54
- toast.warning(title, external);
55
- break;
56
- case "loading":
57
- toast.loading(title, external);
58
- break;
59
- case "info":
60
- default:
61
- toast.info(title, external);
62
- break;
63
- }
64
- }
17
+ };
18
+ var snapshot = () => entries;
19
+ var remove = (id) => {
20
+ const found = entries.find((e) => e.id === id);
21
+ entries = entries.filter((e) => e.id !== id);
22
+ emit();
23
+ found?.onStatusChange?.({ status: "unmounted" });
24
+ };
25
+ var create = (opts) => {
26
+ const id = opts.id ?? `toast-${++counter}`;
27
+ const entry = { ...opts, id };
28
+ entries = [...entries.filter((e) => e.id !== id), entry];
29
+ emit();
30
+ return id;
31
+ };
32
+ var update = (id, opts) => {
33
+ entries = entries.map((e) => e.id === id ? { ...e, ...opts, id } : e);
34
+ emit();
35
+ };
65
36
  var toaster = {
66
37
  create,
67
38
  success: (opts) => create({ ...opts, type: "success" }),
68
39
  error: (opts) => create({ ...opts, type: "error" }),
69
40
  loading: (opts) => create({ ...opts, type: "loading" }),
70
41
  update,
71
- remove: (id) => toast.dismiss(id)
42
+ remove
72
43
  };
73
- var Toaster = () => {
74
- return /* @__PURE__ */ jsx(
75
- Toaster$1,
76
- {
77
- position: "top-right",
78
- richColors: true,
79
- closeButton: true,
80
- duration: DURATION,
81
- offset: { top: 12, right: 12, bottom: 12, left: 12 },
82
- mobileOffset: { top: 16, right: 16, bottom: 16, left: 16 },
83
- toastOptions: {
84
- className: "font-sans",
85
- style: {
86
- fontFamily: 'var(--font-sans, "Geist", sans-serif)',
87
- color: "var(--color-text-primary)",
88
- backgroundColor: "var(--color-bg-primary)",
89
- borderColor: "var(--color-border-divider)"
44
+ var EDGE = {
45
+ success: "var(--color-status-good)",
46
+ error: "var(--color-status-bad)",
47
+ warning: "var(--color-status-warn)",
48
+ loading: "var(--color-border-divider)",
49
+ info: "var(--color-border-divider)"
50
+ };
51
+ var One = ({ entry }) => /* @__PURE__ */ jsxs(
52
+ Toast,
53
+ {
54
+ duration: entry.duration ?? DURATION,
55
+ onOpenChange: (open) => {
56
+ if (!open) remove(entry.id);
57
+ },
58
+ unstyled: true,
59
+ flexDirection: "column",
60
+ gap: 4,
61
+ padding: 12,
62
+ borderRadius: 8,
63
+ borderWidth: 1,
64
+ borderColor: EDGE[entry.type ?? "info"],
65
+ backgroundColor: "var(--color-popover-bg)",
66
+ transition: "quick",
67
+ enterStyle: { opacity: 0, y: -8 },
68
+ exitStyle: { opacity: 0, y: -8 },
69
+ children: [
70
+ entry.title ? /* @__PURE__ */ jsx(Toast.Title, { unstyled: true, fontSize: 14, fontWeight: "600", color: "var(--color-text-primary)", children: entry.title }) : null,
71
+ entry.description ? /* @__PURE__ */ jsx(Toast.Description, { unstyled: true, fontSize: 13, color: "var(--color-text-secondary)", children: entry.description }) : null,
72
+ entry.action ? /* @__PURE__ */ jsx(XStack, { marginTop: 4, children: /* @__PURE__ */ jsx(Toast.Action, { altText: entry.action.label, onPress: entry.action.onClick, children: /* @__PURE__ */ jsx(
73
+ Text,
74
+ {
75
+ cursor: "pointer",
76
+ fontSize: 13,
77
+ fontWeight: "500",
78
+ color: "var(--color-link-primary)",
79
+ children: entry.action.label
90
80
  }
91
- }
92
- }
93
- );
81
+ ) }) }) : null
82
+ ]
83
+ },
84
+ entry.id
85
+ );
86
+ var Toaster = () => {
87
+ const list = React.useSyncExternalStore(subscribe, snapshot, snapshot);
88
+ return /* @__PURE__ */ jsxs(ToastProvider, { children: [
89
+ /* @__PURE__ */ jsx(YStack, { children: list.map((entry) => /* @__PURE__ */ jsx(One, { entry }, entry.id)) }),
90
+ /* @__PURE__ */ jsx(ToastViewport, { position: "absolute", top: 12, right: 12 })
91
+ ] });
94
92
  };
95
93
 
96
94
  export { Toaster, toaster };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@luxfi/ui",
3
- "version": "7.4.9",
4
- "description": "Cross-platform DeFi UI components built on @hanzo/gui (Tamagui). Native mobile + web.",
3
+ "version": "7.4.11",
4
+ "description": "Cross-platform UI components on @hanzo/gui. Native mobile + web.",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": {
@@ -305,24 +305,10 @@
305
305
  "test": "playwright test"
306
306
  },
307
307
  "dependencies": {
308
- "@radix-ui/react-accordion": "^1.2.12",
309
- "@radix-ui/react-avatar": "^1.1.10",
310
- "@radix-ui/react-checkbox": "^1.3.3",
311
- "@radix-ui/react-collapsible": "^1.1.12",
312
- "@radix-ui/react-dialog": "^1.1.15",
313
- "@radix-ui/react-dropdown-menu": "^2.1.16",
314
- "@radix-ui/react-label": "^2.1.7",
315
- "@radix-ui/react-progress": "^1.1.7",
316
- "@radix-ui/react-radio-group": "^1.3.8",
317
- "@radix-ui/react-select": "^2.2.6",
318
- "@radix-ui/react-slider": "^1.3.6",
319
- "@radix-ui/react-switch": "^1.2.6",
320
- "@radix-ui/react-tabs": "^1.1.13",
321
308
  "@uidotdev/usehooks": "^2.4.1",
322
309
  "clsx": "^2.1.1",
323
310
  "es-toolkit": "^1.31.0",
324
311
  "lucide-react": "^1.27.0",
325
- "sonner": "^2.0.0",
326
312
  "tailwind-merge": "^3.0.0"
327
313
  },
328
314
  "peerDependencies": {