@mario_hahn/jumpy-ui 0.11.0 → 0.12.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/README.md CHANGED
@@ -211,7 +211,7 @@ Jumpy Components als ein gemeinsames UI-Paket.
211
211
  Starting with 0.5.0, Jumpy UI uses the public npmjs registry. No package token is required to install:
212
212
 
213
213
  ```bash
214
- npm install @mario_hahn/jumpy-ui@^0.11.0
214
+ npm install @mario_hahn/jumpy-ui@^0.12.0
215
215
  ```
216
216
 
217
217
  The public npm package uses the `@mario_hahn` scope. Older GitHub Packages releases
@@ -328,6 +328,11 @@ import { JumpAppShell, JumpSideMenu, JumpSideMenuItem, JumpTabBar, JumpTabBarIte
328
328
  mobile the bar stays empty and blends into the page until that heading scrolls under
329
329
  it, then shows a compact centered title. Set `--jumpy-app-shell-gutter` to match your
330
330
  content padding. Do not render a second page heading yourself.
331
+ - `topBar.actions` (0.12.0+): `[{ label, icon, onClick | href, variant }]`. Mobile shows
332
+ icon-only buttons (`label` becomes the accessible name); with three or more, the first
333
+ stays visible and the rest go into a "More actions" menu. Desktop shows labelled
334
+ buttons beside the large title, otherwise in the top bar. Prefer it over `trailing`
335
+ for ordinary actions; keep `trailing` for custom content such as an avatar.
331
336
  - `JumpTopBar` and `JumpTabBar` also work standalone. Both are sticky and include
332
337
  safe-area insets. `JumpTabBarItem` accepts `as` (e.g. Next `Link`), `href`, `icon`,
333
338
  numeric or custom `badge` and `selected` (`aria-current="page"`).
@@ -11853,6 +11853,27 @@ var providerStyles = `
11853
11853
  flex: 0 0 auto;
11854
11854
  }
11855
11855
 
11856
+ /* Centered title (iOS navigation bar): equal side columns keep the title centered however many buttons sit left or right.
11857
+ Explicit columns so a hidden menu button does not shift the title. */
11858
+ [data-jumpy-theme='true'] [data-jumpy-component='top-bar'][data-title-align='center'] {
11859
+ display: grid;
11860
+ grid-template-columns: minmax(0, 1fr) minmax(0, max-content) minmax(0, 1fr);
11861
+ }
11862
+
11863
+ [data-jumpy-theme='true'] [data-jumpy-component='top-bar'][data-title-align='center'] > [data-jumpy-slot='top-bar-leading'] {
11864
+ grid-column: 1;
11865
+ justify-self: start;
11866
+ }
11867
+
11868
+ [data-jumpy-theme='true'] [data-jumpy-component='top-bar'][data-title-align='center'] > [data-jumpy-slot='top-bar-title'] {
11869
+ grid-column: 2;
11870
+ }
11871
+
11872
+ [data-jumpy-theme='true'] [data-jumpy-component='top-bar'][data-title-align='center'] > [data-jumpy-slot='top-bar-trailing'] {
11873
+ grid-column: 3;
11874
+ justify-self: end;
11875
+ }
11876
+
11856
11877
  [data-jumpy-theme='true'] [data-jumpy-component='tab-bar'] [data-jumpy-slot='tab-bar-surface'] {
11857
11878
  background-color: var(--jumpy-color-surface-card);
11858
11879
  }
package/dist/index.js CHANGED
@@ -28,7 +28,7 @@ import {
28
28
  textStyleValue,
29
29
  themeToCSSVariables,
30
30
  useJumpyTheme
31
- } from "./chunk-V3XYXQPA.js";
31
+ } from "./chunk-3PHOJLCH.js";
32
32
  import {
33
33
  cn
34
34
  } from "./chunk-3DBKYKP2.js";
@@ -1642,7 +1642,7 @@ function JumpPopover({ open, defaultOpen = false, onOpenChange, trigger, childre
1642
1642
  visible ? /* @__PURE__ */ jsx2("div", { role: "dialog", "data-jumpy-component": "popover", style: { position: "absolute", top: `calc(100% + ${spacingValue(theme, JumpySpacing.smallXS)}px)`, left: 0, zIndex: 30, minWidth: 220, borderRadius: radiusValue(theme, JumpyRadius.large), border: `${borderWidthValue(theme, JumpyBorderWidth.small)}px solid ${theme.color.borderSubtle}`, backgroundColor: theme.color.surfaceCard, color: theme.color.textPrimary, boxShadow: theme.shadow.positiveMedium, padding: spacingValue(theme, JumpySpacing.large) }, children }) : null
1643
1643
  ] });
1644
1644
  }
1645
- function JumpMenu({ trigger, open, defaultOpen = false, onOpenChange, header, footer, children, className = "", placement = "bottom-start", closeOnSelect = true, ...props }) {
1645
+ function JumpMenu({ trigger, triggerProps = {}, open, defaultOpen = false, onOpenChange, header, footer, children, className = "", placement = "bottom-start", closeOnSelect = true, ...props }) {
1646
1646
  const theme = useJumpyTheme();
1647
1647
  const [internalOpen, setInternalOpen] = useState2(defaultOpen);
1648
1648
  const isOpen = open ?? internalOpen;
@@ -1748,7 +1748,7 @@ function JumpMenu({ trigger, open, defaultOpen = false, onOpenChange, header, fo
1748
1748
  refs.domReference.current?.focus?.();
1749
1749
  }
1750
1750
  return /* @__PURE__ */ jsxs2("span", { "data-jumpy-component": "menu-root", className: cn(className), onPointerDown: markInteractionInside, onFocus: markInteractionInside, style: { display: "inline-flex", ...props.style || {} }, children: [
1751
- /* @__PURE__ */ jsx2("span", { ref: refs.setReference, "aria-haspopup": "menu", "aria-expanded": isOpen, tabIndex: 0, onClick: () => setOpen(!isOpen), onKeyDown: handleTriggerKeyDown, children: trigger }),
1751
+ /* @__PURE__ */ jsx2("span", { ...triggerProps, ref: refs.setReference, "aria-haspopup": "menu", "aria-expanded": isOpen, tabIndex: 0, onClick: () => setOpen(!isOpen), onKeyDown: handleTriggerKeyDown, children: trigger }),
1752
1752
  isOpen ? /* @__PURE__ */ jsx2(JumpyPortal, { children: /* @__PURE__ */ jsxs2(
1753
1753
  "div",
1754
1754
  {
@@ -2412,9 +2412,10 @@ function JumpyNavigationIcon({ type }) {
2412
2412
  const paths = {
2413
2413
  menu: "M4 6h16M4 12h16M4 18h16",
2414
2414
  close: "M6 6l12 12M18 6 6 18",
2415
- back: "M15 18l-6-6 6-6"
2415
+ back: "M15 18l-6-6 6-6",
2416
+ more: "M5 12h.01M12 12h.01M19 12h.01"
2416
2417
  };
2417
- return /* @__PURE__ */ jsx2("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", focusable: "false", "data-jumpy-stroke-icon": "true", style: { display: "block" }, children: /* @__PURE__ */ jsx2("path", { d: paths[type] }) });
2418
+ return /* @__PURE__ */ jsx2("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: type === "more" ? 3 : 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", focusable: "false", "data-jumpy-stroke-icon": "true", style: { display: "block" }, children: /* @__PURE__ */ jsx2("path", { d: paths[type] }) });
2418
2419
  }
2419
2420
  function JumpTopBar({ leading, onMenu, onBack, menuOpen = false, title, subtitle, trailing, sticky = true, titleAlign = "start", titleHidden = false, ariaLabels = {}, className = "", ...props }) {
2420
2421
  const theme = useJumpyTheme();
@@ -2456,18 +2457,11 @@ function JumpTopBar({ leading, onMenu, onBack, menuOpen = false, title, subtitle
2456
2457
  children: [
2457
2458
  leadingNode ? /* @__PURE__ */ jsx2("span", { "data-jumpy-slot": "top-bar-leading", "data-leading": leadingType, style: { marginLeft: -spacingValue(theme, JumpySpacing.smallXS) }, children: leadingNode }) : null,
2458
2459
  /* @__PURE__ */ jsxs2("span", { "data-jumpy-slot": "top-bar-title", "aria-hidden": titleHidden || void 0, style: titleAlign === "center" ? {
2459
- position: "absolute",
2460
- left: `calc(${sizeValue(theme, JumpySize.largeXL) + spacingValue(theme, JumpySpacing.large)}px + env(safe-area-inset-left, 0px))`,
2461
- right: `calc(${sizeValue(theme, JumpySize.largeXL) + spacingValue(theme, JumpySpacing.large)}px + env(safe-area-inset-right, 0px))`,
2462
- top: "env(safe-area-inset-top, 0px)",
2463
- bottom: 0,
2464
2460
  display: "flex",
2465
2461
  flexDirection: "column",
2466
2462
  alignItems: "center",
2467
- justifyContent: "center",
2468
2463
  textAlign: "center",
2469
2464
  minWidth: 0,
2470
- pointerEvents: "none",
2471
2465
  opacity: titleHidden ? 0 : 1
2472
2466
  } : { display: "flex", flexDirection: "column", flex: "1 1 auto", minWidth: 0, opacity: titleHidden ? 0 : 1 }, children: [
2473
2467
  title ? /* @__PURE__ */ jsx2("span", { style: { maxWidth: "100%", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", fontSize: titleStyle.fontSize, lineHeight: titleStyle.lineHeight, fontWeight: titleStyle.fontWeight }, children: title }) : null,
@@ -2564,6 +2558,28 @@ function JumpTabBarItem({ as, icon, badge, selected = false, children, className
2564
2558
  }
2565
2559
  );
2566
2560
  }
2561
+ function JumpyAppShellActions({ actions, variant, ariaLabels }) {
2562
+ const theme = useJumpyTheme();
2563
+ if (!actions.length) return null;
2564
+ const gap = spacingValue(theme, JumpySpacing.smallXS);
2565
+ if (variant === "full") {
2566
+ return /* @__PURE__ */ jsx2("span", { "data-jumpy-slot": "app-shell-actions", "data-variant": "full", style: { alignItems: "center", gap, flexWrap: "wrap", justifyContent: "flex-end" }, children: actions.map((action, index) => /* @__PURE__ */ jsx2(JumpButton, { as: action.href ? "a" : void 0, href: action.href, variant: action.variant || "secondary", leadingIcon: action.icon, disabled: action.disabled, onClick: action.onClick, children: action.label }, action.id ?? index)) });
2567
+ }
2568
+ const visible = actions.length > 2 ? actions.slice(0, 1) : actions;
2569
+ const overflow = actions.length > 2 ? actions.slice(1) : [];
2570
+ return /* @__PURE__ */ jsxs2("span", { "data-jumpy-slot": "app-shell-actions", "data-variant": "compact", style: { alignItems: "center", gap }, children: [
2571
+ visible.map((action, index) => /* @__PURE__ */ jsx2(JumpIconButton, { as: action.href ? "a" : void 0, href: action.href, variant: action.variant === "primary" ? "primary" : "borderless", "aria-label": action.label, disabled: action.disabled, onClick: action.onClick, children: action.icon }, action.id ?? index)),
2572
+ overflow.length ? /* @__PURE__ */ jsx2(
2573
+ JumpMenu,
2574
+ {
2575
+ placement: "bottom-end",
2576
+ triggerProps: { role: "button", "aria-label": ariaLabels.moreActions || "More actions", "data-jumpy-slot": "app-shell-actions-more" },
2577
+ trigger: /* @__PURE__ */ jsx2(JumpIconButton, { as: "span", variant: "borderless", tabIndex: -1, "aria-hidden": "true", children: /* @__PURE__ */ jsx2(JumpyNavigationIcon, { type: "more" }) }),
2578
+ children: overflow.map((action, index) => /* @__PURE__ */ jsx2(JumpMenuItem, { as: action.href ? "a" : void 0, href: action.href, leading: action.icon, disabled: action.disabled, onClick: action.onClick, children: action.label }, action.id ?? index))
2579
+ }
2580
+ ) : null
2581
+ ] });
2582
+ }
2567
2583
  function JumpAppShell({ brand, navigation, sidebarFooter, topBar, tabBar, hideTabBar = false, breakpoint = 1024, sidebarWidth = 256, navigationOpen, defaultNavigationOpen = false, onNavigationOpenChange, ariaLabels = {}, children, className = "", ...props }) {
2568
2584
  const theme = useJumpyTheme();
2569
2585
  const shellId = useId();
@@ -2575,8 +2591,9 @@ function JumpAppShell({ brand, navigation, sidebarFooter, topBar, tabBar, hideTa
2575
2591
  const showDrawer = isOpen || drawerMounted;
2576
2592
  const closing = drawerMounted && !isOpen;
2577
2593
  const wasShown = useRef2(showDrawer);
2578
- const { desktop: topBarOnDesktop = false, leading, largeTitle = false, ...topBarProps } = topBar || {};
2594
+ const { desktop: topBarDesktop = false, leading, largeTitle = false, actions = [], ...topBarProps } = topBar || {};
2579
2595
  const showLargeTitle = largeTitle && Boolean(topBarProps.title);
2596
+ const topBarOnDesktop = topBarDesktop || actions.length > 0 && !showLargeTitle;
2580
2597
  const largeTitleRef = useRef2(null);
2581
2598
  const [largeTitleCovered, setLargeTitleCovered] = useState2(false);
2582
2599
  const resolvedLeading = leading ?? (navigation ? "menu" : void 0);
@@ -2636,9 +2653,13 @@ function JumpAppShell({ brand, navigation, sidebarFooter, topBar, tabBar, hideTa
2636
2653
  const shellStyles = `
2637
2654
  ${shell} { grid-template-columns: minmax(0, 1fr); }
2638
2655
  ${shell} > [data-jumpy-slot='app-shell-sidebar'] { display: none; }
2656
+ ${shell} [data-jumpy-slot='app-shell-actions'][data-variant='compact'] { display: inline-flex; }
2657
+ ${shell} [data-jumpy-slot='app-shell-actions'][data-variant='full'] { display: none; }
2639
2658
  @media (min-width: ${breakpoint}px) {
2640
2659
  ${shell} { grid-template-columns: ${width} minmax(0, 1fr); }
2641
2660
  ${shell} > [data-jumpy-slot='app-shell-sidebar'] { display: flex; }
2661
+ ${shell} [data-jumpy-slot='app-shell-actions'][data-variant='compact'] { display: none; }
2662
+ ${shell} [data-jumpy-slot='app-shell-actions'][data-variant='full'] { display: inline-flex; }
2642
2663
  ${shell} > [data-jumpy-slot='app-shell-body'] > [data-jumpy-component='tab-bar'] { display: none; }
2643
2664
  ${shell} > [data-jumpy-slot='app-shell-body'] > [data-jumpy-component='top-bar'][data-mobile-only='true'] { display: none; }
2644
2665
  ${shell} > [data-jumpy-slot='app-shell-body'] > [data-jumpy-component='top-bar'] > [data-leading='menu'] { display: none; }
@@ -2656,6 +2677,11 @@ ${shell} > [data-jumpy-slot='app-shell-sidebar'] { display: none; }
2656
2677
  titleAlign: showLargeTitle ? "center" : topBarProps.titleAlign,
2657
2678
  titleHidden: showLargeTitle ? !largeTitleCovered : topBarProps.titleHidden,
2658
2679
  "data-large-title": showLargeTitle ? "true" : void 0,
2680
+ trailing: actions.length || topBarProps.trailing ? /* @__PURE__ */ jsxs2(Fragment, { children: [
2681
+ /* @__PURE__ */ jsx2(JumpyAppShellActions, { actions, variant: "compact", ariaLabels }),
2682
+ showLargeTitle ? null : /* @__PURE__ */ jsx2(JumpyAppShellActions, { actions, variant: "full", ariaLabels }),
2683
+ topBarProps.trailing
2684
+ ] }) : void 0,
2659
2685
  ariaLabels: { menu: ariaLabels.openNavigation, back: ariaLabels.back, ...topBarProps.ariaLabels || {} }
2660
2686
  }
2661
2687
  );
@@ -2703,10 +2729,13 @@ ${shell} > [data-jumpy-slot='app-shell-sidebar'] { display: none; }
2703
2729
  /* @__PURE__ */ jsxs2("div", { "data-jumpy-slot": "app-shell-body", style: { display: "flex", flexDirection: "column", minWidth: 0, minHeight: "100dvh" }, children: [
2704
2730
  topBar !== null ? topBarNode : null,
2705
2731
  /* @__PURE__ */ jsxs2("main", { "data-jumpy-slot": "app-shell-content", style: { flex: 1, minWidth: 0 }, children: [
2706
- showLargeTitle ? /* @__PURE__ */ jsxs2("div", { "data-jumpy-slot": "app-shell-large-title", style: { padding: `${spacingValue(theme, JumpySpacing.smallXS)}px calc(var(--jumpy-app-shell-gutter, ${spacingValue(theme, JumpySpacing.large)}px) + env(safe-area-inset-right, 0px)) 0 calc(var(--jumpy-app-shell-gutter, ${spacingValue(theme, JumpySpacing.large)}px) + env(safe-area-inset-left, 0px))` }, children: [
2707
- /* @__PURE__ */ jsx2("h1", { ref: largeTitleRef, style: { margin: 0, ...textStyleValue(theme, JumpyTextStyle.displaySmallEmphasized), overflowWrap: "anywhere" }, children: topBarProps.title }),
2708
- topBarProps.subtitle ? /* @__PURE__ */ jsx2("p", { style: { margin: `${spacingValue(theme, JumpySpacing.small4XS)}px 0 0`, color: "var(--jumpy-color-text-secondary)", ...textStyleValue(theme, JumpyTextStyle.bodyMedium) }, children: topBarProps.subtitle }) : null
2709
- ] }) : null,
2732
+ showLargeTitle ? /* @__PURE__ */ jsx2("div", { "data-jumpy-slot": "app-shell-large-title", style: { padding: `${spacingValue(theme, JumpySpacing.smallXS)}px calc(var(--jumpy-app-shell-gutter, ${spacingValue(theme, JumpySpacing.large)}px) + env(safe-area-inset-right, 0px)) 0 calc(var(--jumpy-app-shell-gutter, ${spacingValue(theme, JumpySpacing.large)}px) + env(safe-area-inset-left, 0px))` }, children: /* @__PURE__ */ jsxs2("div", { style: { display: "flex", alignItems: "flex-end", justifyContent: "space-between", gap: spacingValue(theme, JumpySpacing.large), flexWrap: "wrap" }, children: [
2733
+ /* @__PURE__ */ jsxs2("div", { style: { minWidth: 0 }, children: [
2734
+ /* @__PURE__ */ jsx2("h1", { ref: largeTitleRef, style: { margin: 0, ...textStyleValue(theme, JumpyTextStyle.displaySmallEmphasized), overflowWrap: "anywhere" }, children: topBarProps.title }),
2735
+ topBarProps.subtitle ? /* @__PURE__ */ jsx2("p", { style: { margin: `${spacingValue(theme, JumpySpacing.small4XS)}px 0 0`, color: "var(--jumpy-color-text-secondary)", ...textStyleValue(theme, JumpyTextStyle.bodyMedium) }, children: topBarProps.subtitle }) : null
2736
+ ] }),
2737
+ /* @__PURE__ */ jsx2(JumpyAppShellActions, { actions, variant: "full", ariaLabels })
2738
+ ] }) }) : null,
2710
2739
  children
2711
2740
  ] }),
2712
2741
  tabBar && !hideTabBar ? tabBar : null
package/dist/theme.js CHANGED
@@ -28,7 +28,7 @@ import {
28
28
  textStyleValue,
29
29
  themeToCSSVariables,
30
30
  useJumpyTheme
31
- } from "./chunk-V3XYXQPA.js";
31
+ } from "./chunk-3PHOJLCH.js";
32
32
  export {
33
33
  JumpyAnimation,
34
34
  JumpyAnimationDelay,
package/index.d.ts CHANGED
@@ -71,7 +71,7 @@ export declare function JumpSkeletonLoader(props: HTMLAttributes<HTMLElement> &
71
71
  export declare const JumpSearchField: import('react').ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> & { label?: string } & import('react').RefAttributes<HTMLInputElement>>
72
72
  export declare function JumpTooltip(props: HTMLAttributes<HTMLSpanElement> & { content: ReactNode; children: ReactNode }): ReactNode
73
73
  export declare function JumpPopover(props: HTMLAttributes<HTMLSpanElement> & { open?: boolean; defaultOpen?: boolean; onOpenChange?: (open: boolean) => void; trigger: ReactNode; children: ReactNode }): ReactNode
74
- export declare function JumpMenu(props: HTMLAttributes<HTMLDivElement> & { trigger: ReactNode; open?: boolean; defaultOpen?: boolean; onOpenChange?: (open: boolean) => void; closeOnSelect?: boolean; header?: ReactNode; footer?: ReactNode; placement?: 'top' | 'top-start' | 'top-end' | 'right' | 'right-start' | 'right-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end'; children: ReactNode }): ReactNode
74
+ export declare function JumpMenu(props: HTMLAttributes<HTMLDivElement> & { trigger: ReactNode; triggerProps?: HTMLAttributes<HTMLSpanElement> & Record<string, unknown>; open?: boolean; defaultOpen?: boolean; onOpenChange?: (open: boolean) => void; closeOnSelect?: boolean; header?: ReactNode; footer?: ReactNode; placement?: 'top' | 'top-start' | 'top-end' | 'right' | 'right-start' | 'right-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end'; children: ReactNode }): ReactNode
75
75
  export declare function JumpMenuItem(props: HTMLAttributes<HTMLElement> & { as?: ElementTag; children: ReactNode; selected?: boolean; disabled?: boolean; readOnly?: boolean; focusedView?: boolean; leading?: ReactNode; trailing?: ReactNode; metadata?: ReactNode; description?: ReactNode; slots?: JumpListItemSlots; nestedMenu?: ReactNode }): ReactNode
76
76
  export type JumpToggleButtonValue = string | number
77
77
  export declare function JumpToggleButton(props: Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> & { as?: ElementTag; selected?: boolean; value?: JumpToggleButtonValue; onChange?: (selected: boolean) => void; leading?: ReactNode | ((state: { selected: boolean }) => ReactNode); children?: ReactNode }): ReactNode
@@ -116,8 +116,9 @@ export declare function JumpTopBar(props: JumpTopBarProps): ReactNode
116
116
  export declare function JumpTabBar(props: HTMLAttributes<HTMLElement> & { children: ReactNode }): ReactNode
117
117
  export type JumpTabBarItemProps = { as?: ElementType; href?: string; icon?: ReactNode; badge?: ReactNode | number; selected?: boolean; children: ReactNode; className?: string; style?: CSSProperties } & Record<string, unknown>
118
118
  export declare function JumpTabBarItem(props: JumpTabBarItemProps): ReactNode
119
- export type JumpAppShellTopBar = Omit<JumpTopBarProps, 'onMenu' | 'menuOpen'> & { desktop?: boolean; largeTitle?: boolean }
120
- export declare function JumpAppShell(props: HTMLAttributes<HTMLDivElement> & { brand?: ReactNode; navigation?: ReactNode; sidebarFooter?: ReactNode; topBar?: JumpAppShellTopBar | null; tabBar?: ReactNode; hideTabBar?: boolean; breakpoint?: number; sidebarWidth?: number | string; navigationOpen?: boolean; defaultNavigationOpen?: boolean; onNavigationOpenChange?: (open: boolean) => void; ariaLabels?: { navigation?: string; openNavigation?: string; closeNavigation?: string; back?: string }; children?: ReactNode }): ReactNode
119
+ export type JumpAppShellAction = { id?: string; label: string; icon: ReactNode; onClick?: (event: import('react').MouseEvent<HTMLElement>) => void; href?: string; variant?: 'primary' | 'secondary' | 'tertiary' | 'borderless'; disabled?: boolean }
120
+ export type JumpAppShellTopBar = Omit<JumpTopBarProps, 'onMenu' | 'menuOpen'> & { desktop?: boolean; largeTitle?: boolean; actions?: JumpAppShellAction[] }
121
+ export declare function JumpAppShell(props: HTMLAttributes<HTMLDivElement> & { brand?: ReactNode; navigation?: ReactNode; sidebarFooter?: ReactNode; topBar?: JumpAppShellTopBar | null; tabBar?: ReactNode; hideTabBar?: boolean; breakpoint?: number; sidebarWidth?: number | string; navigationOpen?: boolean; defaultNavigationOpen?: boolean; onNavigationOpenChange?: (open: boolean) => void; ariaLabels?: { navigation?: string; openNavigation?: string; closeNavigation?: string; back?: string; moreActions?: string }; children?: ReactNode }): ReactNode
121
122
  export declare function JumpSectionHeader(props: HTMLAttributes<HTMLElement> & { as?: ElementTag; variant?: 'regular' | 'prominent'; description?: ReactNode; children: ReactNode }): ReactNode
122
123
  export declare function JumpSectionFooter(props: HTMLAttributes<HTMLElement> & { as?: ElementTag; children: ReactNode }): ReactNode
123
124
  export declare function JumpTag(props: HTMLAttributes<HTMLSpanElement> & { size?: 'small' | 'medium'; status?: 'regular' | 'positive' | 'warning' | 'alarm'; disabled?: boolean; children: ReactNode }): ReactNode
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mario_hahn/jumpy-ui",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {