@twentyfirstmedia/ui-core 0.1.1 → 0.2.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.
- package/dist/Icon.d.ts +1 -1
- package/dist/components/admin.d.ts.map +1 -1
- package/dist/components/admin.js +2 -2
- package/dist/components/admin.js.map +1 -1
- package/dist/components/charts.js +4 -4
- package/dist/components/charts.js.map +1 -1
- package/dist/components/data-display.d.ts +2 -0
- package/dist/components/data-display.d.ts.map +1 -1
- package/dist/components/data-display.js +32 -8
- package/dist/components/data-display.js.map +1 -1
- package/dist/components/developer.d.ts.map +1 -1
- package/dist/components/developer.js +4 -2
- package/dist/components/developer.js.map +1 -1
- package/dist/components/feedback.d.ts +1 -1
- package/dist/components/feedback.d.ts.map +1 -1
- package/dist/components/feedback.js +9 -5
- package/dist/components/feedback.js.map +1 -1
- package/dist/components/forms.d.ts.map +1 -1
- package/dist/components/forms.js +3 -1
- package/dist/components/forms.js.map +1 -1
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/overlays.d.ts.map +1 -1
- package/dist/components/overlays.js +5 -4
- package/dist/components/overlays.js.map +1 -1
- package/dist/components/primitives.d.ts.map +1 -1
- package/dist/components/primitives.js +3 -1
- package/dist/components/primitives.js.map +1 -1
- package/dist/components/shell.d.ts +11 -1
- package/dist/components/shell.d.ts.map +1 -1
- package/dist/components/shell.js +41 -4
- package/dist/components/shell.js.map +1 -1
- package/dist/components/types.d.ts +54 -2
- package/dist/components/types.d.ts.map +1 -1
- package/dist/components/workspace.d.ts +2 -2
- package/dist/components/workspace.d.ts.map +1 -1
- package/dist/components/workspace.js +9 -3
- package/dist/components/workspace.js.map +1 -1
- package/dist/cx.d.ts +7 -2
- package/dist/cx.d.ts.map +1 -1
- package/dist/cx.js +25 -3
- package/dist/cx.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/motion.d.ts +13 -0
- package/dist/motion.d.ts.map +1 -0
- package/dist/motion.js +44 -0
- package/dist/motion.js.map +1 -0
- package/dist/presence.d.ts +18 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +49 -0
- package/dist/presence.js.map +1 -0
- package/dist/provider.d.ts +22 -0
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +18 -4
- package/dist/provider.js.map +1 -1
- package/dist/themes.css +1821 -102
- package/dist/toast-store.d.ts +2 -0
- package/dist/toast-store.d.ts.map +1 -1
- package/dist/toast-store.js +28 -1
- package/dist/toast-store.js.map +1 -1
- package/package.json +1 -1
- package/src/components/admin.tsx +7 -3
- package/src/components/charts.tsx +4 -4
- package/src/components/data-display.tsx +48 -8
- package/src/components/developer.tsx +4 -2
- package/src/components/feedback.tsx +9 -4
- package/src/components/forms.tsx +4 -1
- package/src/components/index.ts +1 -1
- package/src/components/overlays.tsx +15 -5
- package/src/components/primitives.tsx +4 -1
- package/src/components/shell.tsx +103 -4
- package/src/components/types.ts +54 -2
- package/src/components/workspace.tsx +8 -1
- package/src/cx.ts +22 -5
- package/src/index.ts +3 -0
- package/src/motion.ts +48 -0
- package/src/presence.ts +58 -0
- package/src/provider.tsx +44 -5
- package/src/toast-store.ts +28 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export { cx, durationToken, initials, reduced } from "./cx.js";
|
|
2
2
|
export { formatNumber, formatPercent, formatMoney, formatDate, LOCALE, CURRENCY, WEEK_START, } from "./format.js";
|
|
3
|
-
export { UIProvider, useUI, type UIProviderProps, type UIContextValue, type Kit, type Theme, type Density, } from "./provider.js";
|
|
3
|
+
export { UIProvider, useUI, type UIProviderProps, type UIContextValue, type Kit, type Theme, type Density, type Motion, } from "./provider.js";
|
|
4
4
|
export { Portal } from "./portal.js";
|
|
5
|
+
export { startViewTransition, useMotion } from "./motion.js";
|
|
6
|
+
export { usePresence, leaving, type Presence } from "./presence.js";
|
|
5
7
|
export { THEME_VARS, THEME_PRESETS, themeCss, themeStyle, parseThemeCss, brandTheme, foregroundFor, type ThemeVar, type ThemeValues, type ThemeInput, type ThemeCssOptions, } from "./theme.js";
|
|
6
8
|
export { FOCUSABLE, useControlled, useId, useKeepInView, useScrollFocus, useMounted, useOutside, useTrap, useWidth, } from "./hooks.js";
|
|
7
9
|
export { toast, subscribeToasts, getToasts, getServerToasts, type ToastOptions, type ToastData, type ToastTone, } from "./toast-store.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EACL,YAAY,EACZ,aAAa,EACb,WAAW,EACX,UAAU,EACV,MAAM,EACN,QAAQ,EACR,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,UAAU,EACV,KAAK,EACL,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,GAAG,EACR,KAAK,KAAK,EACV,KAAK,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EACL,YAAY,EACZ,aAAa,EACb,WAAW,EACX,UAAU,EACV,MAAM,EACN,QAAQ,EACR,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,UAAU,EACV,KAAK,EACL,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,GAAG,EACR,KAAK,KAAK,EACV,KAAK,OAAO,EACZ,KAAK,MAAM,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EACL,UAAU,EACV,aAAa,EACb,QAAQ,EACR,UAAU,EACV,aAAa,EACb,UAAU,EACV,aAAa,EACb,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,eAAe,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,SAAS,EACT,aAAa,EACb,KAAK,EACL,aAAa,EACb,cAAc,EACd,UAAU,EACV,UAAU,EACV,OAAO,EACP,QAAQ,GACT,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,KAAK,EACL,eAAe,EACf,SAAS,EACT,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,SAAS,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACjD,cAAc,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,8 @@ export { cx, durationToken, initials, reduced } from "./cx.js";
|
|
|
2
2
|
export { formatNumber, formatPercent, formatMoney, formatDate, LOCALE, CURRENCY, WEEK_START, } from "./format.js";
|
|
3
3
|
export { UIProvider, useUI, } from "./provider.js";
|
|
4
4
|
export { Portal } from "./portal.js";
|
|
5
|
+
export { startViewTransition, useMotion } from "./motion.js";
|
|
6
|
+
export { usePresence, leaving } from "./presence.js";
|
|
5
7
|
export { THEME_VARS, THEME_PRESETS, themeCss, themeStyle, parseThemeCss, brandTheme, foregroundFor, } from "./theme.js";
|
|
6
8
|
export { FOCUSABLE, useControlled, useId, useKeepInView, useScrollFocus, useMounted, useOutside, useTrap, useWidth, } from "./hooks.js";
|
|
7
9
|
export { toast, subscribeToasts, getToasts, getServerToasts, } from "./toast-store.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EACL,YAAY,EACZ,aAAa,EACb,WAAW,EACX,UAAU,EACV,MAAM,EACN,QAAQ,EACR,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,UAAU,EACV,KAAK,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EACL,YAAY,EACZ,aAAa,EACb,WAAW,EACX,UAAU,EACV,MAAM,EACN,QAAQ,EACR,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,UAAU,EACV,KAAK,GAON,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAiB,MAAM,eAAe,CAAC;AACpE,OAAO,EACL,UAAU,EACV,aAAa,EACb,QAAQ,EACR,UAAU,EACV,aAAa,EACb,UAAU,EACV,aAAa,GAKd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,SAAS,EACT,aAAa,EACb,KAAK,EACL,aAAa,EACb,cAAc,EACd,UAAU,EACV,UAAU,EACV,OAAO,EACP,QAAQ,GACT,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,KAAK,EACL,eAAe,EACf,SAAS,EACT,eAAe,GAIhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAiB,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,IAAI,EAAkB,MAAM,WAAW,CAAC;AACjD,cAAc,uBAAuB,CAAC"}
|
package/dist/motion.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Motion } from "./provider.js";
|
|
2
|
+
/**
|
|
3
|
+
* Runs `update` (a route change, a tab switch, new data) as a view transition: the old page fades
|
|
4
|
+
* out and the new one rises in, in the kit's motion. Falls back to a plain update where the
|
|
5
|
+
* browser has no view transitions or motion is off.
|
|
6
|
+
*/
|
|
7
|
+
export declare function startViewTransition(update: () => void | Promise<void>): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* The motion level in effect: "off" while the reader asks for reduced motion or the nearest
|
|
10
|
+
* provider turns motion off, otherwise the provider's level ("standard" by default).
|
|
11
|
+
*/
|
|
12
|
+
export declare function useMotion(): Motion;
|
|
13
|
+
//# sourceMappingURL=motion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion.d.ts","sourceRoot":"","sources":["../src/motion.ts"],"names":[],"mappings":"AAGA,OAAO,EAAS,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB3F;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAalC"}
|
package/dist/motion.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { reduced } from "./cx.js";
|
|
4
|
+
import { useUI } from "./provider.js";
|
|
5
|
+
/**
|
|
6
|
+
* Runs `update` (a route change, a tab switch, new data) as a view transition: the old page fades
|
|
7
|
+
* out and the new one rises in, in the kit's motion. Falls back to a plain update where the
|
|
8
|
+
* browser has no view transitions or motion is off.
|
|
9
|
+
*/
|
|
10
|
+
export async function startViewTransition(update) {
|
|
11
|
+
const doc = typeof document === "undefined" ? undefined : document;
|
|
12
|
+
const start = doc?.startViewTransition;
|
|
13
|
+
if (!doc || !start || reduced()) {
|
|
14
|
+
await update();
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
await start.call(doc, update).finished;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// an interrupted transition still ran the update
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The motion level in effect: "off" while the reader asks for reduced motion or the nearest
|
|
26
|
+
* provider turns motion off, otherwise the provider's level ("standard" by default).
|
|
27
|
+
*/
|
|
28
|
+
export function useMotion() {
|
|
29
|
+
const { motion } = useUI();
|
|
30
|
+
const [off, setOff] = useState(false);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (typeof window === "undefined" || !window.matchMedia)
|
|
33
|
+
return;
|
|
34
|
+
const mq = window.matchMedia("(prefers-reduced-motion: reduce)");
|
|
35
|
+
const on = () => setOff(mq.matches);
|
|
36
|
+
on();
|
|
37
|
+
mq.addEventListener("change", on);
|
|
38
|
+
return () => mq.removeEventListener("change", on);
|
|
39
|
+
}, []);
|
|
40
|
+
if (off)
|
|
41
|
+
return "off";
|
|
42
|
+
return motion ?? "standard";
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=motion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion.js","sourceRoot":"","sources":["../src/motion.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAe,MAAM,eAAe,CAAC;AAEnD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAkC;IAC1E,MAAM,GAAG,GAAG,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnE,MAAM,KAAK,GACT,GAKD,EAAE,mBAAmB,CAAC;IACvB,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,EAAE,EAAE,CAAC;QAChC,MAAM,MAAM,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAC3B,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO;QAChE,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC;QACjE,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QACpC,EAAE,EAAE,CAAC;QACL,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC;IACtB,OAAO,MAAM,IAAI,UAAU,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface Presence {
|
|
2
|
+
/** Render the layer: while open and while it plays its exit. */
|
|
3
|
+
mounted: boolean;
|
|
4
|
+
/** The layer is leaving: it carries `data-closing` (exit animation) and is inert. */
|
|
5
|
+
closing: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Keeps a layer (menu, popover, dialog, drawer, toast) in the page for `--dur-exit` after it
|
|
9
|
+
* closes, so it can animate out. With motion off, reduced motion or no exit duration it leaves at
|
|
10
|
+
* once, as before.
|
|
11
|
+
*/
|
|
12
|
+
export declare function usePresence(open: boolean): Presence;
|
|
13
|
+
/** Props for the layer's root while it leaves. */
|
|
14
|
+
export declare function leaving(closing: boolean): {
|
|
15
|
+
"data-closing"?: "";
|
|
16
|
+
inert?: boolean;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=presence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,QAAQ;IACvB,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAC;IACjB,qFAAqF;IACrF,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAoCnD;AAED,kDAAkD;AAClD,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,cAAc,CAAC,EAAE,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAElF"}
|
package/dist/presence.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { durationToken, reduced } from "./cx.js";
|
|
4
|
+
/**
|
|
5
|
+
* Keeps a layer (menu, popover, dialog, drawer, toast) in the page for `--dur-exit` after it
|
|
6
|
+
* closes, so it can animate out. With motion off, reduced motion or no exit duration it leaves at
|
|
7
|
+
* once, as before.
|
|
8
|
+
*/
|
|
9
|
+
export function usePresence(open) {
|
|
10
|
+
const [mounted, setMounted] = useState(open);
|
|
11
|
+
const [closing, setClosing] = useState(false);
|
|
12
|
+
const timer = useRef(null);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
if (timer.current) {
|
|
15
|
+
clearTimeout(timer.current);
|
|
16
|
+
timer.current = null;
|
|
17
|
+
}
|
|
18
|
+
if (open) {
|
|
19
|
+
setMounted(true);
|
|
20
|
+
setClosing(false);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (!mounted)
|
|
24
|
+
return;
|
|
25
|
+
const ms = reduced() ? 0 : durationToken("--dur-exit", 0);
|
|
26
|
+
if (ms <= 0) {
|
|
27
|
+
setMounted(false);
|
|
28
|
+
setClosing(false);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
setClosing(true);
|
|
32
|
+
timer.current = setTimeout(() => {
|
|
33
|
+
timer.current = null;
|
|
34
|
+
setMounted(false);
|
|
35
|
+
setClosing(false);
|
|
36
|
+
}, ms);
|
|
37
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- only the open state drives this
|
|
38
|
+
}, [open]);
|
|
39
|
+
useEffect(() => () => {
|
|
40
|
+
if (timer.current)
|
|
41
|
+
clearTimeout(timer.current);
|
|
42
|
+
}, []);
|
|
43
|
+
return { mounted: mounted || open, closing: closing && !open };
|
|
44
|
+
}
|
|
45
|
+
/** Props for the layer's root while it leaves. */
|
|
46
|
+
export function leaving(closing) {
|
|
47
|
+
return closing ? { "data-closing": "", inert: true } : {};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=presence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.js","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AASjD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAa;IACvC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAuC,IAAI,CAAC,CAAC;IACjE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;YACT,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAC1D,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACZ,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;YACrB,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,0FAA0F;IAC5F,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACX,SAAS,CACP,GAAG,EAAE,CAAC,GAAG,EAAE;QACT,IAAI,KAAK,CAAC,OAAO;YAAE,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC,EACD,EAAE,CACH,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACjE,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,OAAO,CAAC,OAAgB;IACtC,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5D,CAAC"}
|
package/dist/provider.d.ts
CHANGED
|
@@ -3,6 +3,13 @@ import { type ThemeInput, type ThemeValues } from "./theme.js";
|
|
|
3
3
|
export type Kit = "halo" | "pro";
|
|
4
4
|
export type Theme = "light" | "dark" | "system";
|
|
5
5
|
export type Density = "compact" | "comfortable";
|
|
6
|
+
/** How surfaces paint: solid (the default) or glass, translucent over what is behind them. */
|
|
7
|
+
export type Surface = "solid" | "glass";
|
|
8
|
+
/**
|
|
9
|
+
* How much things move: "standard" (the kit's own motion), "expressive" (longer, staggered page
|
|
10
|
+
* entrances, more travel; Pro stays crisp) or "off". A reduced-motion setting always means "off".
|
|
11
|
+
*/
|
|
12
|
+
export type Motion = "off" | "standard" | "expressive";
|
|
6
13
|
export interface UIProviderProps {
|
|
7
14
|
/** Which kit's CSS applies (sets `data-kit`). Only matters when both kits are loaded (`themes.css`). */
|
|
8
15
|
kit?: Kit;
|
|
@@ -22,6 +29,19 @@ export interface UIProviderProps {
|
|
|
22
29
|
* per mode. For a fixed theme, CSS is simpler (see `themeCss`); this is for runtime brands.
|
|
23
30
|
*/
|
|
24
31
|
tokens?: ThemeValues | ThemeInput;
|
|
32
|
+
/**
|
|
33
|
+
* `"glass"` turns every top-level surface (Panel, Card, Dock, map legend and controls) and every
|
|
34
|
+
* floating layer (menus, popovers, dialogs, drawers) inside into translucent glass, for UI that
|
|
35
|
+
* floats over a map, a 3D scene, video or photos (sets `data-surface`). Single surfaces take
|
|
36
|
+
* `surface="glass"` themselves; `surface="solid"` on one opts it out.
|
|
37
|
+
*/
|
|
38
|
+
surface?: Surface;
|
|
39
|
+
/**
|
|
40
|
+
* Motion level for everything inside (sets `data-motion`): `"standard"` (default), `"expressive"`
|
|
41
|
+
* for orchestrated page entrances, or `"off"`, e.g. for a setting in your app. The reader's
|
|
42
|
+
* reduced-motion setting always turns motion off.
|
|
43
|
+
*/
|
|
44
|
+
motion?: Motion;
|
|
25
45
|
className?: string;
|
|
26
46
|
style?: CSSProperties;
|
|
27
47
|
children?: ReactNode;
|
|
@@ -30,6 +50,8 @@ export interface UIContextValue {
|
|
|
30
50
|
kit: Kit | undefined;
|
|
31
51
|
theme: Theme | undefined;
|
|
32
52
|
density: Density | undefined;
|
|
53
|
+
surface: Surface | undefined;
|
|
54
|
+
motion: Motion | undefined;
|
|
33
55
|
/** Element portals render into (null: document.body). */
|
|
34
56
|
portalRoot: HTMLElement | null;
|
|
35
57
|
}
|
package/dist/provider.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAc,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAC3E,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,KAAK,CAAC;AACjC,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAChD,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAc,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAC3E,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,KAAK,CAAC;AACjC,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAChD,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,aAAa,CAAC;AAChD,8FAA8F;AAC9F,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AACxC;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,YAAY,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,wGAAwG;IACxG,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,wEAAwE;IACxE,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,qGAAqG;IACrG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;IAClC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,GAAG,GAAG,SAAS,CAAC;IACrB,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,yDAAyD;IACzD,UAAU,EAAE,WAAW,GAAG,IAAI,CAAC;CAChC;AAWD,qDAAqD;AACrD,wBAAgB,KAAK,IAAI,cAAc,CAEtC;AA0BD,wBAAgB,UAAU,CAAC,CAAC,EAAE,eAAe,+BA4E5C"}
|
package/dist/provider.js
CHANGED
|
@@ -6,6 +6,8 @@ const UIContext = createContext({
|
|
|
6
6
|
kit: undefined,
|
|
7
7
|
theme: undefined,
|
|
8
8
|
density: undefined,
|
|
9
|
+
surface: undefined,
|
|
10
|
+
motion: undefined,
|
|
9
11
|
portalRoot: null,
|
|
10
12
|
});
|
|
11
13
|
/** Current kit, theme, density and portal target. */
|
|
@@ -38,9 +40,16 @@ function useDarkMode(theme, kit, enabled) {
|
|
|
38
40
|
}
|
|
39
41
|
const isThemeInput = (t) => "light" in t || "dark" in t || "radius" in t;
|
|
40
42
|
export function UIProvider(p) {
|
|
43
|
+
const parent = useUI();
|
|
41
44
|
const scope = p.scope ?? "document";
|
|
45
|
+
// a nested provider keeps what it does not set itself
|
|
46
|
+
const kit = p.kit ?? parent.kit;
|
|
47
|
+
const theme = p.theme ?? parent.theme;
|
|
48
|
+
const density = p.density ?? parent.density;
|
|
49
|
+
const surface = p.surface ?? parent.surface;
|
|
50
|
+
const motion = p.motion ?? parent.motion;
|
|
42
51
|
const perMode = !!p.tokens && isThemeInput(p.tokens);
|
|
43
|
-
const dark = useDarkMode(
|
|
52
|
+
const dark = useDarkMode(theme, kit, perMode);
|
|
44
53
|
const vars = useMemo(() => {
|
|
45
54
|
if (!p.tokens)
|
|
46
55
|
return undefined;
|
|
@@ -80,12 +89,17 @@ export function UIProvider(p) {
|
|
|
80
89
|
set("data-kit", p.kit);
|
|
81
90
|
set("data-theme", p.theme);
|
|
82
91
|
set("data-density", p.density);
|
|
83
|
-
|
|
92
|
+
set("data-surface", p.surface);
|
|
93
|
+
set("data-motion", p.motion);
|
|
94
|
+
}, [scope, p.kit, p.theme, p.density, p.surface, p.motion]);
|
|
84
95
|
const [portalRoot, setPortalRoot] = useState(null);
|
|
85
|
-
const ctx = useMemo(() => ({ kit
|
|
96
|
+
const ctx = useMemo(() => ({ kit, theme, density, surface, motion, portalRoot }), [kit, theme, density, surface, motion, portalRoot]);
|
|
97
|
+
// Derived colours (glass, hover shades, Pro's scale) are worked out where data-theme sits. A
|
|
98
|
+
// subtree with its own tokens needs data-theme too, or they would keep the outer values.
|
|
99
|
+
const subtreeTheme = p.theme ?? (vars ? (theme ?? (kit === "pro" ? "dark" : "system")) : undefined);
|
|
86
100
|
const content = p.children;
|
|
87
101
|
if (scope === "subtree") {
|
|
88
|
-
return (_jsx(UIContext.Provider, { value: ctx, children: _jsxs("div", { className: p.className, style: vars ? { ...vars, ...p.style } : p.style, "data-kit": p.kit, "data-theme":
|
|
102
|
+
return (_jsx(UIContext.Provider, { value: ctx, children: _jsxs("div", { className: p.className, style: vars ? { ...vars, ...p.style } : p.style, "data-kit": p.kit, "data-theme": subtreeTheme, "data-density": p.density, "data-surface": p.surface, "data-motion": p.motion, children: [content, _jsx("div", { ref: setPortalRoot, "data-tf-portal": "" })] }) }));
|
|
89
103
|
}
|
|
90
104
|
return _jsx(UIContext.Provider, { value: ctx, children: content });
|
|
91
105
|
}
|
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AACb,OAAO,EACL,aAAa,EACb,UAAU,EACV,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GAGT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,UAAU,EAAqC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
|