elbe-ui 0.4.23 → 0.4.25

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.
@@ -1,6 +1,6 @@
1
1
  import { Context } from "preact";
2
2
  import { BitParams, BitUseInterface } from "..";
3
3
  import { _BitCtrlMaker, _BitProvider } from "./_bit_utils";
4
- export declare function _makeBitProvider<D, P, I>(context: Context<BitUseInterface<D, I>>, bitP: BitParams<D, P, I> & {
4
+ export declare function _makeBitProvider<D, P, I>(context: Context<BitUseInterface<D, P, I>>, bitP: BitParams<D, P, I> & {
5
5
  control: _BitCtrlMaker<D, P, I>;
6
6
  }): _BitProvider<P>;
@@ -104,7 +104,7 @@ export function _makeBitProvider(context, bitP) {
104
104
  map,
105
105
  mapUI });
106
106
  const userCtrl = bitP.control(Object.assign(Object.assign({}, baseCtrl), { parameters: p, reload: _reload }));
107
- return Object.assign(Object.assign(Object.assign({}, baseCtrl), userCtrl), { reload: _reload });
107
+ return Object.assign(Object.assign(Object.assign({}, baseCtrl), userCtrl), { reload: _reload, parameters: p });
108
108
  }
109
109
  const ctrl = useMemo(() => _make(), [state]);
110
110
  useEffect(() => ctrl.reload(true), []);
@@ -102,6 +102,6 @@ export type _BitProvider<P> = (p: {
102
102
  } & P) => JSX.Element;
103
103
  export interface _BitInterface<D, P, I> {
104
104
  Provider: _BitProvider<P>;
105
- use: () => BitUseInterface<D, I>;
105
+ use: () => BitUseInterface<D, P, I>;
106
106
  }
107
107
  export declare function _isFn<T>(f: any): f is (d: T) => any;
package/dist/bit/bit.d.ts CHANGED
@@ -8,7 +8,9 @@ export type BitTriMap<T, D> = {
8
8
  onError?: (e: any) => D;
9
9
  onData?: (value: T) => D;
10
10
  };
11
- export type BitUseInterface<D, I> = _BitGetInterface<D> & I;
11
+ export type BitUseInterface<D, P, I> = _BitGetInterface<D> & I & {
12
+ parameters: P;
13
+ };
12
14
  export type BitParams<D, P, I> = {
13
15
  control?: _BitCtrlMaker<D, P, I>;
14
16
  debugLabel?: Maybe<string>;
@@ -7,7 +7,7 @@ export function Footer({ left, right, copyright, version, legal, marginTop, }) {
7
7
  borderLeft: "none",
8
8
  borderRight: "none",
9
9
  borderBottom: "none",
10
- borderTopLeftRadius: layoutMode === "wide" ? "var(--g-radius)" : null,
10
+ borderTopLeftRadius: layoutMode.isWide ? "var(--g-radius)" : null,
11
11
  color: "color-mix(in srgb, var(--c-context-front) 60%, transparent)",
12
12
  marginTop: `${marginTop !== null && marginTop !== void 0 ? marginTop : 0}rem`,
13
13
  }, children: _jsxs(Column, { gap: 0.5, children: [(left || right) && (_jsxs(Row, { main: "space-between", cross: "start", children: [left && (_jsx(Column, { gap: 0.5, flex: 1, cross: "start", children: left.map((item) => item.label ? _jsx(_Link, Object.assign({}, item)) : item) })), right && (_jsx(Column, { gap: 0.5, flex: 1, cross: "end", children: right.map((item) => item.label ? _jsx(_Link, Object.assign({}, item)) : item) }))] })), (left || right) && (copyright || version || legal) && (_jsx("hr", { style: { opacity: 0.7 } })), (copyright || version || legal) && (_jsxs(Row, { children: [copyright &&
@@ -13,6 +13,13 @@ export type HeaderProps = HeaderLogos & {
13
13
  scheme?: ElbeColorSchemes;
14
14
  };
15
15
  export declare function Header(p: HeaderProps): import("preact").JSX.Element;
16
+ export declare function _Logo(p: {
17
+ flex?: boolean;
18
+ logo: string | ElbeChild;
19
+ logoDark?: string | ElbeChild | null;
20
+ lMargin?: number;
21
+ rMargin?: number;
22
+ }): import("preact").JSX.Element | null;
16
23
  export declare function BackButton(p: {
17
24
  onTap: () => void;
18
25
  }): import("preact").JSX.Element;
@@ -31,14 +31,15 @@ export function Header(p) {
31
31
  }, children: [p.leading && p.leading !== "back" && p.leading !== "close"
32
32
  ? p.leading
33
33
  : appBase &&
34
- layoutMode != "wide" && (_jsx(IconButton.plain, { ariaLabel: "open/close menu", onTap: () => appBase.setMenuOpen(!appBase.menuOpen), icon: MenuIcon })), p.leading === "back" && _backBtn, p.leading === "close" && _closeBtn, layoutMode !== "mobile" && (_jsx(_Logo, { logo: (_b = p.logo) !== null && _b !== void 0 ? _b : appBase === null || appBase === void 0 ? void 0 : appBase.icons.logo, logoDark: (_c = p.logoDark) !== null && _c !== void 0 ? _c : appBase === null || appBase === void 0 ? void 0 : appBase.icons.logoDark, lMargin: 0.5 })), (!appBase || layoutMode === "wide") && (_jsx("div", { style: { margin: "-1rem", width: "1.5rem" } })), _jsx(_HeaderTitle, { title: p.title, center: (_d = p.centerTitle) !== null && _d !== void 0 ? _d : false }), _jsx(_Toolbar, { actions: [...((_e = p.actions) !== null && _e !== void 0 ? _e : []), ...((_f = appBase === null || appBase === void 0 ? void 0 : appBase.globalActions) !== null && _f !== void 0 ? _f : [])] }), layoutMode === "wide" && (_jsx(_Logo, { logo: (_g = p.endLogo) !== null && _g !== void 0 ? _g : appBase === null || appBase === void 0 ? void 0 : appBase.icons.endLogo, logoDark: (_h = p.endLogoDark) !== null && _h !== void 0 ? _h : appBase === null || appBase === void 0 ? void 0 : appBase.icons.endLogoDark, rMargin: 0.5 }))] }));
34
+ !layoutMode.isWide && (_jsx(IconButton.plain, { ariaLabel: "open/close menu", onTap: () => appBase.setMenuOpen(!appBase.menuOpen), icon: MenuIcon })), p.leading === "back" && _backBtn, p.leading === "close" && _closeBtn, !layoutMode.isMobile && (_jsx(_Logo, { logo: (_b = p.logo) !== null && _b !== void 0 ? _b : appBase === null || appBase === void 0 ? void 0 : appBase.icons.logo, logoDark: (_c = p.logoDark) !== null && _c !== void 0 ? _c : appBase === null || appBase === void 0 ? void 0 : appBase.icons.logoDark, lMargin: 0.5 })), (!appBase || layoutMode.isWide) && (_jsx("div", { style: { margin: "-1rem", width: "1.5rem" } })), _jsx(_HeaderTitle, { title: p.title, center: (_d = p.centerTitle) !== null && _d !== void 0 ? _d : false }), _jsx(_Toolbar, { actions: [...((_e = p.actions) !== null && _e !== void 0 ? _e : []), ...((_f = appBase === null || appBase === void 0 ? void 0 : appBase.globalActions) !== null && _f !== void 0 ? _f : [])] }), layoutMode.isWide && (_jsx(_Logo, { logo: (_g = p.endLogo) !== null && _g !== void 0 ? _g : appBase === null || appBase === void 0 ? void 0 : appBase.icons.endLogo, logoDark: (_h = p.endLogoDark) !== null && _h !== void 0 ? _h : appBase === null || appBase === void 0 ? void 0 : appBase.icons.endLogoDark, rMargin: 0.5 }))] }));
35
35
  }
36
- function _Logo(p) {
36
+ export function _Logo(p) {
37
37
  var _a, _b;
38
38
  const tConfig = useThemeConfig();
39
39
  const [logo, setLogo] = useState(p.logo);
40
40
  useEffect(() => { var _a; return setLogo(tConfig.dark ? (_a = p.logoDark) !== null && _a !== void 0 ? _a : p.logo : p.logo); }, [tConfig]);
41
41
  return !logo ? null : (_jsx("div", { style: {
42
+ flex: p.flex ? 1 : null,
42
43
  display: "flex",
43
44
  alignItems: "center",
44
45
  justifyContent: "center",
@@ -57,7 +58,7 @@ export function CloseButton(p) {
57
58
  export function _HeaderTitle(p) {
58
59
  const layoutMode = useLayoutMode();
59
60
  const globalCenter = useMemo(() => {
60
- return layoutMode !== "mobile" && p.center;
61
+ return !layoutMode.isMobile && p.center;
61
62
  }, [layoutMode]);
62
63
  return (_jsx("div", { style: {
63
64
  flex: 1,
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "preact/jsx-runtime";
2
2
  import { MenuIcon } from "lucide-react";
3
3
  import { useLocation } from "wouter";
4
- import { useLayoutMode, useTheme, useThemeConfig } from "../../..";
4
+ import { _Logo, useLayoutMode, useTheme, useThemeConfig, } from "../../..";
5
5
  import { Card, elevatedShadow } from "../base/card";
6
6
  import { Button } from "../button/button";
7
7
  import { useAppBase } from "./ctx_app_base";
@@ -18,17 +18,17 @@ export function Menu(p) {
18
18
  else
19
19
  topBot.top.push(i);
20
20
  }
21
- const wideOrOpen = () => appBase.menuOpen || layoutMode == "wide";
21
+ const wideOrOpen = () => appBase.menuOpen || layoutMode.isWide;
22
22
  const menuWidth = () => appBase.menuOpen
23
- ? layoutMode === "mobile"
23
+ ? layoutMode.isMobile
24
24
  ? "100vw"
25
25
  : `${17 + theme.geometry.borderWidth}rem`
26
- : layoutMode === "wide"
26
+ : layoutMode.isWide
27
27
  ? `${4 + theme.geometry.borderWidth}rem`
28
28
  : "0";
29
- return (_jsxs(_Fragment, { children: [layoutMode == "wide" && (_jsx("div", { style: {
29
+ return (_jsxs(_Fragment, { children: [layoutMode.isWide && (_jsx("div", { style: {
30
30
  width: menuWidth(),
31
- } })), _jsx("div", { onClick: () => appBase.setMenuOpen(false), style: Object.assign({ zIndex: 100, position: "fixed", left: 0, top: 0, width: 0, height: 0, backgroundColor: "rgba(0,0,0,0)", transition: "background-color 200ms ease-in-out" }, (layoutMode === "narrow" && appBase.menuOpen
31
+ } })), _jsx("div", { onClick: () => appBase.setMenuOpen(false), style: Object.assign({ zIndex: 100, position: "fixed", left: 0, top: 0, width: 0, height: 0, backgroundColor: "rgba(0,0,0,0)", transition: "background-color 200ms ease-in-out" }, (layoutMode.isNarrow && appBase.menuOpen
32
32
  ? {
33
33
  backdropFilter: "blur(5px)",
34
34
  backgroundColor: "rgba(0,0,0,.2)",
@@ -36,21 +36,21 @@ export function Menu(p) {
36
36
  height: "100vh",
37
37
  }
38
38
  : {})) }), _jsx(Card, { onTap: () => {
39
- if (layoutMode == "wide")
39
+ if (layoutMode.isWide)
40
40
  return;
41
41
  appBase.setMenuOpen(false);
42
- }, sharp: layoutMode == "mobile", bordered: true, scheme: "primary", padding: wideOrOpen() ? 0.5 : 0, style: Object.assign({ zIndex: 101, position: "fixed", left: 0, top: 0, height: "100vh", overflow: "hidden", width: menuWidth(), display: "flex",
42
+ }, sharp: layoutMode.isMobile, bordered: true, scheme: "primary", padding: wideOrOpen() ? 0.5 : 0, style: Object.assign({ zIndex: 101, position: "fixed", left: 0, top: 0, height: "100vh", overflow: "hidden", width: menuWidth(), display: "flex",
43
43
  //display: appBase.menuOpen || layoutMode == "wide" ? "flex" : "none",
44
44
  flexDirection: "column", justifyContent: "start", alignItems: "stretch", borderTopLeftRadius: 0, borderBottomLeftRadius: 0, borderLeft: "none", borderTop: "none", borderBottom: "none", borderColor: tConfig.highVis ? null : "transparent", gap: "1rem", transition: tConfig.reducedMotion
45
45
  ? "none"
46
- : "width 200ms ease-in-out" }, (layoutMode === "narrow" && appBase.menuOpen
46
+ : "width 200ms ease-in-out" }, (layoutMode.isNarrow && appBase.menuOpen
47
47
  ? {
48
48
  boxShadow: elevatedShadow,
49
49
  }
50
50
  : {})), children: wideOrOpen() && (_jsxs(_Fragment, { children: [_jsx(Button.plain, { contentAlign: "start", ariaLabel: "open/close menu", onTap: () => appBase.setMenuOpen(!appBase.menuOpen), icon: MenuIcon, style: {
51
51
  marginBottom: ".5rem",
52
52
  borderRadius: "3rem",
53
- } }), _jsx(Column, { flex: 1, scroll: true, noScrollbar: true, children: topBot.top.map((i) => (_jsx(_MenuItemView, { item: i }))) }), topBot.bottom.map((i) => (_jsx(_MenuItemView, { item: i })))] })) })] }));
53
+ }, children: !layoutMode.isWide && (_jsx(_Logo, { logo: appBase === null || appBase === void 0 ? void 0 : appBase.icons.logo, logoDark: appBase === null || appBase === void 0 ? void 0 : appBase.icons.logoDark, lMargin: 0.5 })) }), _jsx(Column, { flex: 1, scroll: true, noScrollbar: true, children: topBot.top.map((i) => (_jsx(_MenuItemView, { item: i }))) }), topBot.bottom.map((i) => (_jsx(_MenuItemView, { item: i })))] })) })] }));
54
54
  }
55
55
  function _MenuItemView({ item }) {
56
56
  const [location, navigate] = useLocation();
@@ -11,7 +11,7 @@ export function _Toolbar(p) {
11
11
  const appBase = maybeAppBase();
12
12
  const layoutMode = useLayoutMode();
13
13
  useEffect(() => {
14
- const cutoff = layoutMode === "wide" ? 5 : 2;
14
+ const cutoff = layoutMode.isWide ? 5 : layoutMode.screenWidth < 400 ? 1 : 2;
15
15
  const bar = [];
16
16
  const overflow = [];
17
17
  for (let i = 0; i < p.actions.length; i++) {
@@ -247,8 +247,7 @@ export class SchemeColor extends KindColor {
247
247
  return (`${this.primary.asCss()}\n` +
248
248
  `.primary { ${this.primary.asCss()}} \n` +
249
249
  `.secondary { ${this.secondary.asCss()} }\n` +
250
- `.inverse { ${this.inverse.asCss()} }\n` +
251
- `.primary-hotfix { ${this.inverse.asCss()} }`);
250
+ `.inverse { ${this.inverse.asCss()} }`);
252
251
  }
253
252
  static generate(path, seed, base) {
254
253
  const m = seed.scheme;
@@ -22,5 +22,18 @@ export declare function copyToClipboard(text: string, toastMsg?: string): void;
22
22
  export declare function scrollToId(id: string): void;
23
23
  export declare function randomAlphaNum(length: int, prefix?: string): string;
24
24
  export type LayoutModes = "mobile" | "narrow" | "wide";
25
- export declare function useLayoutMode(): LayoutModes;
25
+ export type LayoutModeInfo = {
26
+ mode: LayoutModes;
27
+ screenWidth: number;
28
+ screenHeight: number;
29
+ isMobile: boolean;
30
+ isNarrow: boolean;
31
+ isWide: boolean;
32
+ };
33
+ /**
34
+ * check the current layout mode based on the window width.
35
+ * This will return an object with the current mode and screen dimensions.
36
+ * @returns a LayoutModeInfo object
37
+ */
38
+ export declare function useLayoutMode(): LayoutModeInfo;
26
39
  export declare function useSiteScroll(): number;
@@ -53,10 +53,28 @@ function _layoutMode() {
53
53
  return "narrow";
54
54
  return "wide";
55
55
  }
56
+ function _layoutModeInfo() {
57
+ const w = window.innerWidth;
58
+ const h = window.innerHeight;
59
+ const mode = _layoutMode();
60
+ return {
61
+ mode,
62
+ screenWidth: w,
63
+ screenHeight: h,
64
+ isMobile: mode === "mobile",
65
+ isNarrow: mode === "narrow",
66
+ isWide: mode === "wide",
67
+ };
68
+ }
69
+ /**
70
+ * check the current layout mode based on the window width.
71
+ * This will return an object with the current mode and screen dimensions.
72
+ * @returns a LayoutModeInfo object
73
+ */
56
74
  export function useLayoutMode() {
57
- const [mode, setMode] = useState(_layoutMode());
75
+ const [mode, setMode] = useState(_layoutModeInfo());
58
76
  useEffect(() => {
59
- const onResize = () => setMode(_layoutMode());
77
+ const onResize = () => setMode(_layoutModeInfo());
60
78
  window.addEventListener("resize", onResize);
61
79
  return () => window.removeEventListener("resize", onResize);
62
80
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "elbe-ui",
3
- "version": "0.4.23",
3
+ "version": "0.4.25",
4
4
  "author": "Robin Naumann",
5
5
  "license": "MIT",
6
6
  "repository": {