@hanzo/ui 8.0.118 → 8.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat/Code.cjs +1 -1
- package/dist/chat/Code.d.ts.map +1 -1
- package/dist/chat/Code.js +2 -2
- package/dist/chat/Code.js.map +1 -1
- package/dist/chat/Message.cjs +38 -2
- package/dist/chat/Message.d.ts +17 -1
- package/dist/chat/Message.d.ts.map +1 -1
- package/dist/chat/Message.js +38 -3
- package/dist/chat/Message.js.map +1 -1
- package/dist/chat/index.cjs +2 -1
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.d.ts.map +1 -1
- package/dist/chat/index.js +1 -1
- package/dist/chat/index.js.map +1 -1
- package/dist/gallery.cjs +12 -1
- package/dist/gallery.d.ts.map +1 -1
- package/dist/gallery.js +12 -1
- package/dist/gallery.js.map +1 -1
- package/dist/product/DialogTemplate.cjs +23 -0
- package/dist/product/DialogTemplate.d.ts +55 -0
- package/dist/product/DialogTemplate.d.ts.map +1 -0
- package/dist/product/DialogTemplate.js +21 -0
- package/dist/product/DialogTemplate.js.map +1 -0
- package/dist/product/Skeleton.cjs +33 -0
- package/dist/product/Skeleton.d.ts +34 -0
- package/dist/product/Skeleton.d.ts.map +1 -0
- package/dist/product/Skeleton.js +31 -0
- package/dist/product/Skeleton.js.map +1 -0
- package/dist/product/Toast.cjs +23 -5
- package/dist/product/Toast.d.ts +23 -3
- package/dist/product/Toast.d.ts.map +1 -1
- package/dist/product/Toast.js +25 -7
- package/dist/product/Toast.js.map +1 -1
- package/dist/product/TooltipAnchor.cjs +37 -0
- package/dist/product/TooltipAnchor.d.ts +42 -0
- package/dist/product/TooltipAnchor.d.ts.map +1 -0
- package/dist/product/TooltipAnchor.js +35 -0
- package/dist/product/TooltipAnchor.js.map +1 -0
- package/dist/product/index.cjs +8 -0
- package/dist/product/index.d.ts +3 -0
- package/dist/product/index.d.ts.map +1 -1
- package/dist/product/index.js +8 -0
- package/dist/product/index.js.map +1 -1
- package/dist/styles/motion.css +7 -4
- package/dist/styles.css +53 -4
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Skeleton.d.ts","sourceRoot":"","sources":["../../src/product/Skeleton.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,IAAI,EAAU,MAAM,YAAY,CAAA;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAE3C,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,IAAI,CAAC,CAAA;AAEvD,iBAAS,KAAK,CAAC,EAAE,MAAa,EAAE,OAAc,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,2CAYxE;AAED,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG;IAC9C,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED;;;GAGG;AACH,iBAAS,YAAY,CAAC,EAAE,KAAS,EAAE,GAAU,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,2CAQ3E;AAED,eAAO,MAAM,QAAQ;;CAA+C,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Skeleton — the honest "loading", never fabricated content.
|
|
5
|
+
*
|
|
6
|
+
* The shimmer itself has shipped in `styles/motion.css` as `.hz-skeleton` since
|
|
7
|
+
* the living-overview work; what was missing was a component to reach it, so
|
|
8
|
+
* every surface hand-rolled a grey `<div>` and picked its own radius. This is
|
|
9
|
+
* that div, once, sized in the same `$` space as the rest of the package.
|
|
10
|
+
*
|
|
11
|
+
* It renders a BLOCK, not a spinner: a placeholder the size and shape of the
|
|
12
|
+
* thing that is coming keeps the layout from jumping when the data lands. Give
|
|
13
|
+
* it the dimensions of the real content — that is the whole discipline.
|
|
14
|
+
*
|
|
15
|
+
* <Skeleton height="$2" width={180} /> // a line of text
|
|
16
|
+
* <Skeleton height={120} rounded="$4" /> // a card
|
|
17
|
+
* <Skeleton.Text lines={3} /> // a paragraph
|
|
18
|
+
*/
|
|
19
|
+
import { View, YStack } from '@hanzo/gui';
|
|
20
|
+
function Block({ height = '$1', rounded = '$2', ...props }) {
|
|
21
|
+
return (_jsx(View, { className: "hz-skeleton", height: height, rounded: rounded, "aria-hidden": true, ...props }));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A paragraph's worth of lines. The last one is short, because a real paragraph
|
|
25
|
+
* ends mid-line and a stack of equal bars reads as a table.
|
|
26
|
+
*/
|
|
27
|
+
function SkeletonText({ lines = 3, gap = '$2', ...props }) {
|
|
28
|
+
return (_jsx(YStack, { gap: gap, width: "100%", children: Array.from({ length: Math.max(1, lines) }, (_, i) => (_jsx(Block, { width: i === lines - 1 ? '60%' : '100%', ...props }, i))) }));
|
|
29
|
+
}
|
|
30
|
+
export const Skeleton = Object.assign(Block, { Text: SkeletonText });
|
|
31
|
+
//# sourceMappingURL=Skeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Skeleton.js","sourceRoot":"","sources":["../../src/product/Skeleton.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAKzC,SAAS,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,KAAK,EAAiB;IACvE,OAAO,CACL,KAAC,IAAI,IACH,SAAS,EAAC,aAAa,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,0BAIZ,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAOD;;;GAGG;AACH,SAAS,YAAY,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,KAAK,EAAqB;IAC1E,OAAO,CACL,KAAC,MAAM,IAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAC,MAAM,YAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACpD,KAAC,KAAK,IAAS,KAAK,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAM,KAAK,IAArD,CAAC,CAAwD,CACtE,CAAC,GACK,CACV,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAA"}
|
package/dist/product/Toast.cjs
CHANGED
|
@@ -25,17 +25,26 @@ const ToastContext = (0, react_1.createContext)(null);
|
|
|
25
25
|
const ACCENT = {
|
|
26
26
|
success: '$green10',
|
|
27
27
|
error: '$red10',
|
|
28
|
+
warning: '$yellow10',
|
|
28
29
|
info: '$color11',
|
|
29
30
|
};
|
|
30
31
|
const ICON = {
|
|
31
32
|
success: lucide_icons_2_1.CircleCheck,
|
|
32
33
|
error: lucide_icons_2_1.CircleX,
|
|
34
|
+
warning: lucide_icons_2_1.TriangleAlert,
|
|
33
35
|
info: lucide_icons_2_1.Info,
|
|
34
36
|
};
|
|
37
|
+
/** How long each kind stays. Anything that went wrong is worth re-reading. */
|
|
38
|
+
const DURATION = {
|
|
39
|
+
success: 3500,
|
|
40
|
+
error: 6000,
|
|
41
|
+
warning: 6000,
|
|
42
|
+
info: 3500,
|
|
43
|
+
};
|
|
35
44
|
function ToastCard({ t, onClose }) {
|
|
36
45
|
const Icon = ICON[t.kind];
|
|
37
46
|
const accent = ACCENT[t.kind];
|
|
38
|
-
return ((0, jsx_runtime_1.jsx)(gui_1.Card, { width: 360, maxWidth: "90%", p: "$3", gap: "$2", bg: "$color2", borderWidth: 1, borderColor: "$borderColor", borderLeftWidth: 3, borderLeftColor: accent, rounded: "$4", elevation: "$2", children: (0, jsx_runtime_1.jsxs)(gui_1.XStack, { gap: "$2.5", items: "flex-start", children: [(0, jsx_runtime_1.jsx)(gui_1.YStack, { pt: 1, children: (0, jsx_runtime_1.jsx)(Icon, { size: 18, color: accent }) }), (0, jsx_runtime_1.jsxs)(gui_1.YStack, { flex: 1, gap: "$1", children: [(0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$3", fontWeight: "700", color: "$color12", children: t.title }), t.description ? ((0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", color: "$color11", children: t.description })) : null] }), (0, jsx_runtime_1.jsx)(gui_1.Button, { size: "$1", chromeless: true, icon: (0, jsx_runtime_1.jsx)(lucide_icons_2_1.X, { size: 14 }), onPress: onClose, "aria-label": "Dismiss" })] }) }));
|
|
47
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.Card, { width: 360, maxWidth: "90%", p: "$3", gap: "$2", bg: "$color2", borderWidth: 1, borderColor: "$borderColor", borderLeftWidth: 3, borderLeftColor: accent, rounded: "$4", elevation: "$2", children: (0, jsx_runtime_1.jsxs)(gui_1.XStack, { gap: "$2.5", items: "flex-start", children: [t.showIcon ? ((0, jsx_runtime_1.jsx)(gui_1.YStack, { pt: 1, children: (0, jsx_runtime_1.jsx)(Icon, { size: 18, color: accent }) })) : null, (0, jsx_runtime_1.jsxs)(gui_1.YStack, { flex: 1, gap: "$1", children: [(0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$3", fontWeight: "700", color: "$color12", children: t.title }), t.description ? ((0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", color: "$color11", children: t.description })) : null] }), (0, jsx_runtime_1.jsx)(gui_1.Button, { size: "$1", chromeless: true, icon: (0, jsx_runtime_1.jsx)(lucide_icons_2_1.X, { size: 14 }), onPress: onClose, "aria-label": "Dismiss" })] }) }));
|
|
39
48
|
}
|
|
40
49
|
/** Portalled, fixed top-right stack. Rendered only after mount (SSR-safe). */
|
|
41
50
|
function ToastViewport({ toasts, dismiss }) {
|
|
@@ -61,9 +70,13 @@ function ToastProvider({ children }) {
|
|
|
61
70
|
const toast = (0, react_1.useCallback)((input) => {
|
|
62
71
|
const id = ++seq.current;
|
|
63
72
|
const kind = input.kind ?? 'info';
|
|
64
|
-
const durationMs = input.durationMs ??
|
|
73
|
+
const durationMs = input.durationMs ?? DURATION[kind];
|
|
74
|
+
const showIcon = input.showIcon ?? true;
|
|
65
75
|
track({ component: 'Toast', action: kind === 'error' ? 'error' : 'view', id: input.title, value: kind });
|
|
66
|
-
setToasts((ts) => [
|
|
76
|
+
setToasts((ts) => [
|
|
77
|
+
...ts,
|
|
78
|
+
{ id, kind, title: input.title, description: input.description, durationMs, showIcon },
|
|
79
|
+
]);
|
|
67
80
|
if (durationMs > 0) {
|
|
68
81
|
timers.current.set(id, setTimeout(() => dismiss(id), durationMs));
|
|
69
82
|
}
|
|
@@ -73,13 +86,18 @@ function ToastProvider({ children }) {
|
|
|
73
86
|
const map = timers.current;
|
|
74
87
|
return () => map.forEach((t) => clearTimeout(t));
|
|
75
88
|
}, []);
|
|
76
|
-
|
|
89
|
+
// Memoized because the api is what a consumer holds. Rebuilt every render it
|
|
90
|
+
// is a new identity every render, so any `useCallback`/`useEffect` keyed on it
|
|
91
|
+
// re-runs on each parent render — which is exactly what an adapter wrapping
|
|
92
|
+
// this hook does. `toast` and `dismiss` are already stable.
|
|
93
|
+
const api = (0, react_1.useMemo)(() => ({
|
|
77
94
|
toast,
|
|
78
95
|
success: (title, description) => toast({ title, description, kind: 'success' }),
|
|
79
96
|
error: (title, description) => toast({ title, description, kind: 'error' }),
|
|
97
|
+
warning: (title, description) => toast({ title, description, kind: 'warning' }),
|
|
80
98
|
info: (title, description) => toast({ title, description, kind: 'info' }),
|
|
81
99
|
dismiss,
|
|
82
|
-
};
|
|
100
|
+
}), [toast, dismiss]);
|
|
83
101
|
return ((0, jsx_runtime_1.jsxs)(ToastContext.Provider, { value: api, children: [children, (0, jsx_runtime_1.jsx)(ToastViewport, { toasts: toasts, dismiss: dismiss })] }));
|
|
84
102
|
}
|
|
85
103
|
function useToast() {
|
package/dist/product/Toast.d.ts
CHANGED
|
@@ -10,18 +10,39 @@
|
|
|
10
10
|
* toast.error(err instanceof ApiError ? err.message : 'Failed to create')
|
|
11
11
|
*/
|
|
12
12
|
import { type ReactNode } from 'react';
|
|
13
|
-
|
|
13
|
+
/**
|
|
14
|
+
* The four things a mutation can report. `warning` is here because surfaces
|
|
15
|
+
* genuinely raise it — "saved, but the version did not change", "3 of 5 files
|
|
16
|
+
* downloaded" — and without it those land as `error` (alarming, and wrong) or
|
|
17
|
+
* `info` (invisible). Measured on one surface alone: 14 call sites.
|
|
18
|
+
*/
|
|
19
|
+
export type ToastKind = 'success' | 'error' | 'warning' | 'info';
|
|
14
20
|
export type ToastInput = {
|
|
15
21
|
title: string;
|
|
16
22
|
description?: string;
|
|
17
23
|
kind?: ToastKind;
|
|
18
24
|
/** Auto-dismiss after this many ms; 0 keeps it until dismissed. */
|
|
19
25
|
durationMs?: number;
|
|
26
|
+
/** Drop the leading icon. Defaults to showing it. */
|
|
27
|
+
showIcon?: boolean;
|
|
28
|
+
};
|
|
29
|
+
/** A toast on screen: an input with its defaults resolved, and an id. */
|
|
30
|
+
export type Toast = ToastInput & {
|
|
31
|
+
id: number;
|
|
32
|
+
kind: ToastKind;
|
|
33
|
+
durationMs: number;
|
|
34
|
+
showIcon: boolean;
|
|
20
35
|
};
|
|
21
|
-
|
|
36
|
+
/**
|
|
37
|
+
* What `useToast()` answers. Exported because a consumer that passes the api
|
|
38
|
+
* down, or stores it, has to be able to name its type — it could not before,
|
|
39
|
+
* which made the hook awkward to build on.
|
|
40
|
+
*/
|
|
41
|
+
export type ToastApi = {
|
|
22
42
|
toast: (t: ToastInput) => void;
|
|
23
43
|
success: (title: string, description?: string) => void;
|
|
24
44
|
error: (title: string, description?: string) => void;
|
|
45
|
+
warning: (title: string, description?: string) => void;
|
|
25
46
|
info: (title: string, description?: string) => void;
|
|
26
47
|
dismiss: (id: number) => void;
|
|
27
48
|
};
|
|
@@ -29,5 +50,4 @@ export declare function ToastProvider({ children }: {
|
|
|
29
50
|
children: ReactNode;
|
|
30
51
|
}): import("react/jsx-runtime").JSX.Element;
|
|
31
52
|
export declare function useToast(): ToastApi;
|
|
32
|
-
export {};
|
|
33
53
|
//# sourceMappingURL=Toast.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../src/product/Toast.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../src/product/Toast.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,OAAO,EAAgF,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAOpH;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;AAEhE,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,yEAAyE;AACzE,MAAM,MAAM,KAAK,GAAG,UAAU,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAA;AAEvG;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;IAC9B,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACtD,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACpD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACtD,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACnD,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9B,CAAA;AAqFD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAgElE;AAED,wBAAgB,QAAQ,IAAI,QAAQ,CAInC"}
|
package/dist/product/Toast.js
CHANGED
|
@@ -11,27 +11,36 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
11
11
|
* toast.success('Created my-db')
|
|
12
12
|
* toast.error(err instanceof ApiError ? err.message : 'Failed to create')
|
|
13
13
|
*/
|
|
14
|
-
import { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react';
|
|
14
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
|
|
15
15
|
import { createPortal } from 'react-dom';
|
|
16
16
|
import { Button, Card, Text, XStack, YStack } from '@hanzo/gui';
|
|
17
|
-
import { CircleCheck, CircleX, Info, X } from '@hanzogui/lucide-icons-2';
|
|
17
|
+
import { CircleCheck, CircleX, Info, TriangleAlert, X } from '@hanzogui/lucide-icons-2';
|
|
18
18
|
import { useEmit } from './instrument.js';
|
|
19
19
|
const ToastContext = createContext(null);
|
|
20
20
|
/** Theme-aware accent per kind (adapts to light/dark). */
|
|
21
21
|
const ACCENT = {
|
|
22
22
|
success: '$green10',
|
|
23
23
|
error: '$red10',
|
|
24
|
+
warning: '$yellow10',
|
|
24
25
|
info: '$color11',
|
|
25
26
|
};
|
|
26
27
|
const ICON = {
|
|
27
28
|
success: CircleCheck,
|
|
28
29
|
error: CircleX,
|
|
30
|
+
warning: TriangleAlert,
|
|
29
31
|
info: Info,
|
|
30
32
|
};
|
|
33
|
+
/** How long each kind stays. Anything that went wrong is worth re-reading. */
|
|
34
|
+
const DURATION = {
|
|
35
|
+
success: 3500,
|
|
36
|
+
error: 6000,
|
|
37
|
+
warning: 6000,
|
|
38
|
+
info: 3500,
|
|
39
|
+
};
|
|
31
40
|
function ToastCard({ t, onClose }) {
|
|
32
41
|
const Icon = ICON[t.kind];
|
|
33
42
|
const accent = ACCENT[t.kind];
|
|
34
|
-
return (_jsx(Card, { width: 360, maxWidth: "90%", p: "$3", gap: "$2", bg: "$color2", borderWidth: 1, borderColor: "$borderColor", borderLeftWidth: 3, borderLeftColor: accent, rounded: "$4", elevation: "$2", children: _jsxs(XStack, { gap: "$2.5", items: "flex-start", children: [_jsx(YStack, { pt: 1, children: _jsx(Icon, { size: 18, color: accent }) }), _jsxs(YStack, { flex: 1, gap: "$1", children: [_jsx(Text, { fontSize: "$3", fontWeight: "700", color: "$color12", children: t.title }), t.description ? (_jsx(Text, { fontSize: "$2", color: "$color11", children: t.description })) : null] }), _jsx(Button, { size: "$1", chromeless: true, icon: _jsx(X, { size: 14 }), onPress: onClose, "aria-label": "Dismiss" })] }) }));
|
|
43
|
+
return (_jsx(Card, { width: 360, maxWidth: "90%", p: "$3", gap: "$2", bg: "$color2", borderWidth: 1, borderColor: "$borderColor", borderLeftWidth: 3, borderLeftColor: accent, rounded: "$4", elevation: "$2", children: _jsxs(XStack, { gap: "$2.5", items: "flex-start", children: [t.showIcon ? (_jsx(YStack, { pt: 1, children: _jsx(Icon, { size: 18, color: accent }) })) : null, _jsxs(YStack, { flex: 1, gap: "$1", children: [_jsx(Text, { fontSize: "$3", fontWeight: "700", color: "$color12", children: t.title }), t.description ? (_jsx(Text, { fontSize: "$2", color: "$color11", children: t.description })) : null] }), _jsx(Button, { size: "$1", chromeless: true, icon: _jsx(X, { size: 14 }), onPress: onClose, "aria-label": "Dismiss" })] }) }));
|
|
35
44
|
}
|
|
36
45
|
/** Portalled, fixed top-right stack. Rendered only after mount (SSR-safe). */
|
|
37
46
|
function ToastViewport({ toasts, dismiss }) {
|
|
@@ -57,9 +66,13 @@ export function ToastProvider({ children }) {
|
|
|
57
66
|
const toast = useCallback((input) => {
|
|
58
67
|
const id = ++seq.current;
|
|
59
68
|
const kind = input.kind ?? 'info';
|
|
60
|
-
const durationMs = input.durationMs ??
|
|
69
|
+
const durationMs = input.durationMs ?? DURATION[kind];
|
|
70
|
+
const showIcon = input.showIcon ?? true;
|
|
61
71
|
track({ component: 'Toast', action: kind === 'error' ? 'error' : 'view', id: input.title, value: kind });
|
|
62
|
-
setToasts((ts) => [
|
|
72
|
+
setToasts((ts) => [
|
|
73
|
+
...ts,
|
|
74
|
+
{ id, kind, title: input.title, description: input.description, durationMs, showIcon },
|
|
75
|
+
]);
|
|
63
76
|
if (durationMs > 0) {
|
|
64
77
|
timers.current.set(id, setTimeout(() => dismiss(id), durationMs));
|
|
65
78
|
}
|
|
@@ -69,13 +82,18 @@ export function ToastProvider({ children }) {
|
|
|
69
82
|
const map = timers.current;
|
|
70
83
|
return () => map.forEach((t) => clearTimeout(t));
|
|
71
84
|
}, []);
|
|
72
|
-
|
|
85
|
+
// Memoized because the api is what a consumer holds. Rebuilt every render it
|
|
86
|
+
// is a new identity every render, so any `useCallback`/`useEffect` keyed on it
|
|
87
|
+
// re-runs on each parent render — which is exactly what an adapter wrapping
|
|
88
|
+
// this hook does. `toast` and `dismiss` are already stable.
|
|
89
|
+
const api = useMemo(() => ({
|
|
73
90
|
toast,
|
|
74
91
|
success: (title, description) => toast({ title, description, kind: 'success' }),
|
|
75
92
|
error: (title, description) => toast({ title, description, kind: 'error' }),
|
|
93
|
+
warning: (title, description) => toast({ title, description, kind: 'warning' }),
|
|
76
94
|
info: (title, description) => toast({ title, description, kind: 'info' }),
|
|
77
95
|
dismiss,
|
|
78
|
-
};
|
|
96
|
+
}), [toast, dismiss]);
|
|
79
97
|
return (_jsxs(ToastContext.Provider, { value: api, children: [children, _jsx(ToastViewport, { toasts: toasts, dismiss: dismiss })] }));
|
|
80
98
|
}
|
|
81
99
|
export function useToast() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../src/product/Toast.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;;;;;GAUG;AACH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../src/product/Toast.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use client';"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.TooltipAnchor = TooltipAnchor;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
/**
|
|
7
|
+
* TooltipAnchor — a hint on one element, in one prop.
|
|
8
|
+
*
|
|
9
|
+
* The Tooltip primitive is a triple: root, trigger, content. That shape is
|
|
10
|
+
* right when the hint is rich, and it is three levels of nesting when the hint
|
|
11
|
+
* is a sentence — which is nearly always. Measured on a real surface, 48 call
|
|
12
|
+
* sites wanted the same thing: wrap this control, say this string on hover.
|
|
13
|
+
* So say it in one prop.
|
|
14
|
+
*
|
|
15
|
+
* <TooltipAnchor description="Delete this agent">
|
|
16
|
+
* <Button icon={<Trash />} />
|
|
17
|
+
* </TooltipAnchor>
|
|
18
|
+
*
|
|
19
|
+
* `description` is a STRING, deliberately. A tooltip is an accessible name for
|
|
20
|
+
* a control that has none, so it is also spelled onto the child as
|
|
21
|
+
* `aria-label` — which markup cannot be. A hint that needs layout is not a
|
|
22
|
+
* tooltip; reach for the triple, or a HoverCard.
|
|
23
|
+
*
|
|
24
|
+
* An empty or absent `description` renders the child alone, with no wrapper and
|
|
25
|
+
* no listeners: a disabled hint costs nothing and needs no branch at the call
|
|
26
|
+
* site.
|
|
27
|
+
*/
|
|
28
|
+
const react_1 = require("react");
|
|
29
|
+
const tooltip_1 = require("../backends/gui/tooltip.cjs");
|
|
30
|
+
function TooltipAnchor({ description, children, side = 'top', delayMs, label = true, }) {
|
|
31
|
+
if (!description)
|
|
32
|
+
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children });
|
|
33
|
+
const child = label && (0, react_1.isValidElement)(children) && !children.props['aria-label']
|
|
34
|
+
? (0, react_1.cloneElement)(children, { 'aria-label': description })
|
|
35
|
+
: children;
|
|
36
|
+
return ((0, jsx_runtime_1.jsxs)(tooltip_1.Tooltip, { placement: side, ...(delayMs === undefined ? {} : { delay: delayMs }), children: [(0, jsx_runtime_1.jsx)(tooltip_1.TooltipTrigger, { asChild: true, children: child }), (0, jsx_runtime_1.jsx)(tooltip_1.TooltipContent, { children: description })] }));
|
|
37
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TooltipAnchor — a hint on one element, in one prop.
|
|
3
|
+
*
|
|
4
|
+
* The Tooltip primitive is a triple: root, trigger, content. That shape is
|
|
5
|
+
* right when the hint is rich, and it is three levels of nesting when the hint
|
|
6
|
+
* is a sentence — which is nearly always. Measured on a real surface, 48 call
|
|
7
|
+
* sites wanted the same thing: wrap this control, say this string on hover.
|
|
8
|
+
* So say it in one prop.
|
|
9
|
+
*
|
|
10
|
+
* <TooltipAnchor description="Delete this agent">
|
|
11
|
+
* <Button icon={<Trash />} />
|
|
12
|
+
* </TooltipAnchor>
|
|
13
|
+
*
|
|
14
|
+
* `description` is a STRING, deliberately. A tooltip is an accessible name for
|
|
15
|
+
* a control that has none, so it is also spelled onto the child as
|
|
16
|
+
* `aria-label` — which markup cannot be. A hint that needs layout is not a
|
|
17
|
+
* tooltip; reach for the triple, or a HoverCard.
|
|
18
|
+
*
|
|
19
|
+
* An empty or absent `description` renders the child alone, with no wrapper and
|
|
20
|
+
* no listeners: a disabled hint costs nothing and needs no branch at the call
|
|
21
|
+
* site.
|
|
22
|
+
*/
|
|
23
|
+
import { type ReactNode } from 'react';
|
|
24
|
+
export type TooltipSide = 'top' | 'right' | 'bottom' | 'left';
|
|
25
|
+
export type TooltipAnchorProps = {
|
|
26
|
+
/** The hint. Empty or absent renders the child untouched. */
|
|
27
|
+
description?: string;
|
|
28
|
+
children: ReactNode;
|
|
29
|
+
/** Which edge the hint sits on. Defaults to `top`. */
|
|
30
|
+
side?: TooltipSide;
|
|
31
|
+
/** Delay before it opens, in ms. */
|
|
32
|
+
delayMs?: number;
|
|
33
|
+
/**
|
|
34
|
+
* By default the hint also becomes the child's `aria-label`, because the
|
|
35
|
+
* control it labels usually has no text of its own. Turn this off when the
|
|
36
|
+
* child already names itself and the hint only elaborates — two names on one
|
|
37
|
+
* control is worse than none.
|
|
38
|
+
*/
|
|
39
|
+
label?: boolean;
|
|
40
|
+
};
|
|
41
|
+
export declare function TooltipAnchor({ description, children, side, delayMs, label, }: TooltipAnchorProps): import("react/jsx-runtime").JSX.Element;
|
|
42
|
+
//# sourceMappingURL=TooltipAnchor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TooltipAnchor.d.ts","sourceRoot":"","sources":["../../src/product/TooltipAnchor.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAmD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAIvF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAA;AAE7D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,SAAS,CAAA;IACnB,sDAAsD;IACtD,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,wBAAgB,aAAa,CAAC,EAC5B,WAAW,EACX,QAAQ,EACR,IAAY,EACZ,OAAO,EACP,KAAY,GACb,EAAE,kBAAkB,2CAcpB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* TooltipAnchor — a hint on one element, in one prop.
|
|
5
|
+
*
|
|
6
|
+
* The Tooltip primitive is a triple: root, trigger, content. That shape is
|
|
7
|
+
* right when the hint is rich, and it is three levels of nesting when the hint
|
|
8
|
+
* is a sentence — which is nearly always. Measured on a real surface, 48 call
|
|
9
|
+
* sites wanted the same thing: wrap this control, say this string on hover.
|
|
10
|
+
* So say it in one prop.
|
|
11
|
+
*
|
|
12
|
+
* <TooltipAnchor description="Delete this agent">
|
|
13
|
+
* <Button icon={<Trash />} />
|
|
14
|
+
* </TooltipAnchor>
|
|
15
|
+
*
|
|
16
|
+
* `description` is a STRING, deliberately. A tooltip is an accessible name for
|
|
17
|
+
* a control that has none, so it is also spelled onto the child as
|
|
18
|
+
* `aria-label` — which markup cannot be. A hint that needs layout is not a
|
|
19
|
+
* tooltip; reach for the triple, or a HoverCard.
|
|
20
|
+
*
|
|
21
|
+
* An empty or absent `description` renders the child alone, with no wrapper and
|
|
22
|
+
* no listeners: a disabled hint costs nothing and needs no branch at the call
|
|
23
|
+
* site.
|
|
24
|
+
*/
|
|
25
|
+
import { cloneElement, isValidElement } from 'react';
|
|
26
|
+
import { Tooltip, TooltipContent, TooltipTrigger } from '../backends/gui/tooltip.js';
|
|
27
|
+
export function TooltipAnchor({ description, children, side = 'top', delayMs, label = true, }) {
|
|
28
|
+
if (!description)
|
|
29
|
+
return _jsx(_Fragment, { children: children });
|
|
30
|
+
const child = label && isValidElement(children) && !children.props['aria-label']
|
|
31
|
+
? cloneElement(children, { 'aria-label': description })
|
|
32
|
+
: children;
|
|
33
|
+
return (_jsxs(Tooltip, { placement: side, ...(delayMs === undefined ? {} : { delay: delayMs }), children: [_jsx(TooltipTrigger, { asChild: true, children: child }), _jsx(TooltipContent, { children: description })] }));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=TooltipAnchor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TooltipAnchor.js","sourceRoot":"","sources":["../../src/product/TooltipAnchor.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAqC,MAAM,OAAO,CAAA;AAEvF,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAqBjF,MAAM,UAAU,aAAa,CAAC,EAC5B,WAAW,EACX,QAAQ,EACR,IAAI,GAAG,KAAK,EACZ,OAAO,EACP,KAAK,GAAG,IAAI,GACO;IACnB,IAAI,CAAC,WAAW;QAAE,OAAO,4BAAG,QAAQ,GAAI,CAAA;IAExC,MAAM,KAAK,GACT,KAAK,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAE,QAAQ,CAAC,KAAmC,CAAC,YAAY,CAAC;QAC/F,CAAC,CAAC,YAAY,CAAC,QAAmD,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;QAClG,CAAC,CAAC,QAAQ,CAAA;IAEd,OAAO,CACL,MAAC,OAAO,IAAC,SAAS,EAAE,IAAI,KAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,aAC7E,KAAC,cAAc,IAAC,OAAO,kBAAE,KAAK,GAAkB,EAChD,KAAC,cAAc,cAAE,WAAW,GAAkB,IACtC,CACX,CAAA;AACH,CAAC"}
|
package/dist/product/index.cjs
CHANGED
|
@@ -125,10 +125,18 @@ __exportStar(require("./ProductIcon.cjs"), exports);
|
|
|
125
125
|
__exportStar(require("./ProviderLogo.cjs"), exports);
|
|
126
126
|
__exportStar(require("./Reorder.cjs"), exports);
|
|
127
127
|
__exportStar(require("./SelectMenu.cjs"), exports);
|
|
128
|
+
__exportStar(require("./Skeleton.cjs"), exports);
|
|
128
129
|
__exportStar(require("./SlideOver.cjs"), exports);
|
|
129
130
|
__exportStar(require("./StatusTag.cjs"), exports);
|
|
130
131
|
__exportStar(require("./tone.cjs"), exports);
|
|
131
132
|
__exportStar(require("./ThemeToggle.cjs"), exports);
|
|
133
|
+
// `DialogTemplate` and `TooltipAnchor` are the two arrangements every surface
|
|
134
|
+
// was already writing by hand over the Dialog and Tooltip primitives — a
|
|
135
|
+
// titled dialog with a cancel/confirm footer, and a one-string hint on a
|
|
136
|
+
// control. The primitives stay exported for the cases that genuinely are not
|
|
137
|
+
// those shapes; reaching for them is the signal you have left the common case.
|
|
138
|
+
__exportStar(require("./DialogTemplate.cjs"), exports);
|
|
139
|
+
__exportStar(require("./TooltipAnchor.cjs"), exports);
|
|
132
140
|
// `ThemeToggleNext` is NOT re-exported here, and that is the whole reason this
|
|
133
141
|
// comment exists. It is the @hanzogui/next-theme binding, and next-theme's
|
|
134
142
|
// provider imports `next/script` — so a static edge from this barrel put Next in
|
package/dist/product/index.d.ts
CHANGED
|
@@ -41,10 +41,13 @@ export * from './ProductIcon.js';
|
|
|
41
41
|
export * from './ProviderLogo.js';
|
|
42
42
|
export * from './Reorder.js';
|
|
43
43
|
export * from './SelectMenu.js';
|
|
44
|
+
export * from './Skeleton.js';
|
|
44
45
|
export * from './SlideOver.js';
|
|
45
46
|
export * from './StatusTag.js';
|
|
46
47
|
export * from './tone.js';
|
|
47
48
|
export * from './ThemeToggle.js';
|
|
49
|
+
export * from './DialogTemplate.js';
|
|
50
|
+
export * from './TooltipAnchor.js';
|
|
48
51
|
export * from './Toast.js';
|
|
49
52
|
export * from './accent.js';
|
|
50
53
|
export * from './color.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/product/index.ts"],"names":[],"mappings":"AAaA,cAAc,UAAU,CAAA;AAKxB,OAAO,EACL,MAAM,EACN,aAAa,EACb,SAAS,EACT,SAAS,IAAI,eAAe,EAC5B,QAAQ,EACR,OAAO,EACP,SAAS,EACT,UAAU,EACV,UAAU,EACV,KAAK,GACN,MAAM,UAAU,CAAA;AAGjB,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAA;AAK/D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,cAAc,mBAAmB,CAAA;AASjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AAKvB,cAAc,QAAQ,CAAA;AAKtB,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAK5B,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,WAAW,CAAA;AAOzB,cAAc,cAAc,CAAA;AAK5B,cAAc,YAAY,CAAA;AAO1B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAI7B,cAAc,cAAc,CAAA;AAG5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAM5B,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/product/index.ts"],"names":[],"mappings":"AAaA,cAAc,UAAU,CAAA;AAKxB,OAAO,EACL,MAAM,EACN,aAAa,EACb,SAAS,EACT,SAAS,IAAI,eAAe,EAC5B,QAAQ,EACR,OAAO,EACP,SAAS,EACT,UAAU,EACV,UAAU,EACV,KAAK,GACN,MAAM,UAAU,CAAA;AAGjB,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAA;AAK/D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,cAAc,mBAAmB,CAAA;AASjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AAKvB,cAAc,QAAQ,CAAA;AAKtB,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAK5B,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,WAAW,CAAA;AAOzB,cAAc,cAAc,CAAA;AAK5B,cAAc,YAAY,CAAA;AAO1B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAI7B,cAAc,cAAc,CAAA;AAG5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAM5B,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAM7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAc/B,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AASvB,cAAc,UAAU,CAAA;AAKxB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAA"}
|
package/dist/product/index.js
CHANGED
|
@@ -96,10 +96,18 @@ export * from './ProductIcon.js';
|
|
|
96
96
|
export * from './ProviderLogo.js';
|
|
97
97
|
export * from './Reorder.js';
|
|
98
98
|
export * from './SelectMenu.js';
|
|
99
|
+
export * from './Skeleton.js';
|
|
99
100
|
export * from './SlideOver.js';
|
|
100
101
|
export * from './StatusTag.js';
|
|
101
102
|
export * from './tone.js';
|
|
102
103
|
export * from './ThemeToggle.js';
|
|
104
|
+
// `DialogTemplate` and `TooltipAnchor` are the two arrangements every surface
|
|
105
|
+
// was already writing by hand over the Dialog and Tooltip primitives — a
|
|
106
|
+
// titled dialog with a cancel/confirm footer, and a one-string hint on a
|
|
107
|
+
// control. The primitives stay exported for the cases that genuinely are not
|
|
108
|
+
// those shapes; reaching for them is the signal you have left the common case.
|
|
109
|
+
export * from './DialogTemplate.js';
|
|
110
|
+
export * from './TooltipAnchor.js';
|
|
103
111
|
// `ThemeToggleNext` is NOT re-exported here, and that is the whole reason this
|
|
104
112
|
// comment exists. It is the @hanzogui/next-theme binding, and next-theme's
|
|
105
113
|
// provider imports `next/script` — so a static edge from this barrel put Next in
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/product/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,EAAE;AACF,2EAA2E;AAC3E,gFAAgF;AAChF,iFAAiF;AACjF,gFAAgF;AAChF,wEAAwE;AACxE,EAAE;AACF,kFAAkF;AAClF,6EAA6E;AAE7E,kFAAkF;AAClF,gEAAgE;AAChE,cAAc,UAAU,CAAA;AAExB,2EAA2E;AAC3E,+EAA+E;AAC/E,4CAA4C;AAC5C,OAAO,EACL,MAAM,EACN,aAAa,EACb,SAAS,EACT,SAAS,IAAI,eAAe,EAC5B,QAAQ,EACR,OAAO,EACP,SAAS,EACT,UAAU,EACV,UAAU,EACV,KAAK,GACN,MAAM,UAAU,CAAA;AAEjB,6EAA6E;AAC7E,OAAO,EAAE,KAAK,IAAI,SAAS,EAAqB,MAAM,SAAS,CAAA;AAE/D,+EAA+E;AAC/E,8EAA8E;AAC9E,qCAAqC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,cAAc,mBAAmB,CAAA;AAEjC,gFAAgF;AAChF,6EAA6E;AAC7E,mFAAmF;AACnF,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,8DAA8D;AAC9D,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AAEvB,mFAAmF;AACnF,qFAAqF;AACrF,qFAAqF;AACrF,cAAc,QAAQ,CAAA;AAEtB,iFAAiF;AACjF,2EAA2E;AAC3E,8EAA8E;AAC9E,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAE5B,6EAA6E;AAC7E,yEAAyE;AACzE,qFAAqF;AACrF,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,WAAW,CAAA;AAEzB,8EAA8E;AAC9E,8EAA8E;AAC9E,+EAA+E;AAC/E,6EAA6E;AAC7E,mDAAmD;AACnD,cAAc,cAAc,CAAA;AAE5B,gFAAgF;AAChF,iFAAiF;AACjF,2EAA2E;AAC3E,cAAc,YAAY,CAAA;AAE1B,kFAAkF;AAClF,mFAAmF;AACnF,gFAAgF;AAChF,kFAAkF;AAClF,oBAAoB;AACpB,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAE7B,8EAA8E;AAC9E,sBAAsB;AACtB,cAAc,cAAc,CAAA;AAE5B,mEAAmE;AACnE,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAE5B,gFAAgF;AAChF,iFAAiF;AACjF,6EAA6E;AAC7E,8EAA8E;AAC9E,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/product/index.ts"],"names":[],"mappings":"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"}
|
package/dist/styles/motion.css
CHANGED
|
@@ -14,10 +14,13 @@
|
|
|
14
14
|
a stylesheet it never opened. A library's utility classes are its namespace,
|
|
15
15
|
so they carry its name.
|
|
16
16
|
|
|
17
|
-
The unprefixed selectors are kept as aliases on the SAME rule
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
`className="skeleton"` against the old sheet.
|
|
17
|
+
The unprefixed selectors are kept as aliases on the SAME rule so nothing
|
|
18
|
+
breaks mid-flight, and are REMOVED IN 8.2.0. Nothing in this package emits
|
|
19
|
+
them any more — they exist only for a consumer who typed
|
|
20
|
+
`className="skeleton"` against the old sheet. (The target was 8.1.0, and
|
|
21
|
+
8.1.0 went out carrying additions instead. Moving the date is the honest
|
|
22
|
+
edit: shipping the version a comment says removed something, without
|
|
23
|
+
removing it, is how a deprecation note stops being read.) Keyframe names are prefixed too
|
|
21
24
|
and have no alias: nothing outside this file ever referenced them. */
|
|
22
25
|
|
|
23
26
|
/* Fade-up entrance — <FadeIn> applies the class + a per-item stagger delay.
|