highsoft-ui 1.0.152 → 1.0.154

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CLAUDE.md +60 -6
  2. package/dist/{Button-BGsqFCRW.js → Button-DSGsV45k.js} +1 -1
  3. package/dist/{ButtonGroup-DKfaXOeS.js → ButtonGroup-DNTpDU-E.js} +1 -1
  4. package/dist/{Checkbox-CniRhVkQ.js → Checkbox-imALf2_N.js} +1 -1
  5. package/dist/{CodeBlock-BKiZQpA5.js → CodeBlock-7BTXXf30.js} +4 -4
  6. package/dist/{CookiePolicyModal-k89sCBEJ.js → CookiePolicyModal-DulwuSp4.js} +2 -2
  7. package/dist/{CopyCode-_yeXCeeq.js → CopyCode-PbZbRLn-.js} +2 -2
  8. package/dist/{Dropdown-B_Ib6i1c.js → Dropdown-c_EhnzqC.js} +1 -1
  9. package/dist/{Footer-ZdzuxuhY.js → Footer-C6a3PeJq.js} +8 -8
  10. package/dist/{FooterBottom-CqpN8Wky.js → FooterBottom-DADUJdzz.js} +1 -1
  11. package/dist/{FooterHelp-Cb5sraAE.js → FooterHelp-DN7Mdy40.js} +1 -1
  12. package/dist/{FooterLinks-HGxMx6Xz.js → FooterLinks-rrtsCIdv.js} +2 -2
  13. package/dist/{Header-CVKH_INR.js → Header-BokKjfF7.js} +38 -38
  14. package/dist/{InputGrouped-CHGCMmsK.js → InputGrouped-BJEodhml.js} +11 -11
  15. package/dist/{Label-CgiWi1v6.js → Label-BhFeSC8Z.js} +1 -1
  16. package/dist/{NewsletterSignup-DrcPfdrg.js → NewsletterSignup-mPKBEpYq.js} +2 -2
  17. package/dist/{Notification-B3skQvZE.js → Notification-JovL5anc.js} +3 -3
  18. package/dist/{PrefPanel-BGw72I_D.js → PrefPanel-DxSIkYDF.js} +8 -8
  19. package/dist/{RoadmapDetails-XS0OylnP.js → RoadmapDetails-ZnyXG2j7.js} +6 -6
  20. package/dist/{Search-UPVxQliM.js → Search-Cc9ZJgGx.js} +13 -13
  21. package/dist/{SearchDropdown-L_rQz1vn.js → SearchDropdown-B5CFwNib.js} +1 -1
  22. package/dist/{VideoCover-DqMDvzvA.js → VideoCover-BkbLsmQ_.js} +1 -1
  23. package/dist/{VideoPlayer-Cq_garSg.js → VideoPlayer-CY63501h.js} +7 -7
  24. package/dist/{VideoPlayerModal-D1v1O2kW.js → VideoPlayerModal-DIHMoFgS.js} +2 -2
  25. package/dist/{YoutubeModal-BBYdQil8.js → YoutubeModal-DqBis8Cm.js} +2 -2
  26. package/dist/components/Button/index.js +1 -1
  27. package/dist/components/ButtonGroup/index.js +1 -1
  28. package/dist/components/Checkbox/index.js +1 -1
  29. package/dist/components/CodeBlock/index.js +1 -1
  30. package/dist/components/CopyCode/index.js +1 -1
  31. package/dist/components/Dropdown/index.js +1 -1
  32. package/dist/components/Footer/CookiePolicyModal.js +1 -1
  33. package/dist/components/Footer/FooterBottom.js +1 -1
  34. package/dist/components/Footer/FooterHelp.js +1 -1
  35. package/dist/components/Footer/FooterLinks.js +1 -1
  36. package/dist/components/Footer/YoutubeModal.js +1 -1
  37. package/dist/components/Footer/index.js +1 -1
  38. package/dist/components/Header/index.js +1 -1
  39. package/dist/components/InputGrouped/index.js +1 -1
  40. package/dist/components/Label/index.js +1 -1
  41. package/dist/components/Modal/ModalContactFooter.js +4 -3
  42. package/dist/components/Modal/index.js +2 -2
  43. package/dist/components/NewsletterSignup/index.js +1 -1
  44. package/dist/components/Notification/index.js +1 -1
  45. package/dist/components/PrefPanel/index.js +1 -1
  46. package/dist/components/RoadmapDetails/index.js +1 -1
  47. package/dist/components/Search/index.js +1 -1
  48. package/dist/components/SearchDropdown/index.js +1 -1
  49. package/dist/components/Sidebar/NavDisclosure.js +26 -31
  50. package/dist/components/Sidebar/NavGroup.js +69 -56
  51. package/dist/components/Sidebar/NavItem.js +23 -16
  52. package/dist/components/Sidebar/Sidebar.js +115 -82
  53. package/dist/components/Sidebar/SidebarLayout.js +109 -69
  54. package/dist/components/Sidebar/SidebarResizer.js +1 -1
  55. package/dist/components/Sidebar/navPath.js +12 -0
  56. package/dist/components/VideoCover/index.js +1 -1
  57. package/dist/components/VideoPlayer/VideoPlayerModal.js +1 -1
  58. package/dist/components/VideoPlayer/index.js +1 -1
  59. package/dist/{create-element-CDnUGrhg.js → create-element-C3ORyDVw.js} +1 -1
  60. package/dist/{esm-BnxclXHW.js → esm-C4Ybr9s4.js} +85 -43
  61. package/dist/highsoft-ui.css +1 -1
  62. package/dist/lib/components/Modal/ModalContactFooter.d.ts +3 -2
  63. package/dist/lib/components/Sidebar/Sidebar.d.ts +10 -5
  64. package/dist/lib/components/Sidebar/SidebarLayout.d.ts +37 -5
  65. package/dist/lib/components/Sidebar/context.d.ts +30 -2
  66. package/dist/lib/components/Sidebar/navPath.d.ts +17 -0
  67. package/dist/main.js +18 -18
  68. package/dist/{prism-light-COlcVrfu.js → prism-light-BLaY8zo6.js} +1 -1
  69. package/dist/{styles.module-Bd4HbnpA.js → styles.module-DGKft2EO.js} +12 -1
  70. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { ReactNode } from 'react';
1
+ import { ElementType, ReactNode } from 'react';
2
2
  import { ButtonVariant, ButtonSize } from '../Button';
3
3
  export interface ModalContactFooterProps {
4
4
  /** Image URLs shown as a stacked row of round avatars on the left */
@@ -17,5 +17,6 @@ export interface ModalContactFooterProps {
17
17
  buttonVariant?: ButtonVariant;
18
18
  /** CTA button size */
19
19
  buttonSize?: ButtonSize;
20
+ link?: ElementType;
20
21
  }
21
- export declare function ModalContactFooter({ avatars, text, buttonLabel, buttonIcon, buttonHref, onButtonClick, buttonVariant, buttonSize }: ModalContactFooterProps): import("react").JSX.Element;
22
+ export declare function ModalContactFooter({ avatars, text, buttonLabel, buttonIcon, buttonHref, onButtonClick, buttonVariant, buttonSize, link: Link }: ModalContactFooterProps): import("react").JSX.Element;
@@ -1,17 +1,22 @@
1
1
  import { ReactNode } from 'react';
2
2
  export interface SidebarProps {
3
3
  children: ReactNode;
4
- /** Accessible label for the navigation landmark. */
4
+ /** Accessible label for the navigation landmark / sheet dialog. */
5
5
  'aria-label'?: string;
6
- /** Label on the mobile drawer's close button. Default "Close navigation". */
6
+ /** Label on the mobile sheet's close button. Default "Close navigation". */
7
7
  closeLabel?: string;
8
8
  className?: string;
9
9
  }
10
10
  /**
11
11
  * The sidebar column. On desktop it's a fixed-position-free flex column filling
12
- * the layout's first grid track; on narrow screens it becomes an off-canvas
13
- * drawer driven by the layout's mobile state. Auto-renders the resize handle
14
- * (when the layout is resizable) and the mobile close button.
12
+ * the layout's first grid track; on narrow screens it becomes a bottom sheet
13
+ * driven by the layout's mobile state. Auto-renders the resize handle (when the
14
+ * layout is resizable), the sheet's grab handle and its close button.
15
+ *
16
+ * While the sheet is open it's a modal dialog: focus is trapped inside it,
17
+ * Escape and the backdrop dismiss it, and dragging the grab handle down does
18
+ * too. While it's closed on a narrow screen it's `inert`, so the few hundred
19
+ * links it holds stay out of the tab order and the accessibility tree.
15
20
  */
16
21
  export declare function Sidebar({ children, 'aria-label': ariaLabel, closeLabel, className }: SidebarProps): import("react").JSX.Element;
17
22
  /** Fixed top region of the sidebar (switchers, search, logo). Does not scroll. */
@@ -14,8 +14,37 @@ export interface SidebarLayoutProps {
14
14
  * the width only for the current session (no persistence).
15
15
  */
16
16
  storageKey?: string;
17
- /** Label on the mobile "open navigation" trigger bar. Default "Menu". */
17
+ /**
18
+ * Names what this navigation contains — "Changelog", "API reference". Shown
19
+ * on the mobile bar, as an overline above `mobileTriggerValue` when that is
20
+ * given. Default "Navigation".
21
+ */
18
22
  mobileTriggerLabel?: ReactNode;
23
+ /**
24
+ * Where the reader currently is inside the tree — "Highcharts / v12.5.0".
25
+ * Becomes the mobile trigger's headline, so a deep link tells you what the
26
+ * control opens and where you stand before you open it.
27
+ *
28
+ * Leave it unset and the layout reads this off the active <NavItem> itself,
29
+ * as "<parent group> / <item>" — the sidebar already knows, so restating it
30
+ * here is only worth it when you want different wording. Pass `false` to
31
+ * show no position line at all.
32
+ */
33
+ mobileTriggerValue?: ReactNode;
34
+ /** Leading glyph on the mobile trigger (20×20) — a product mark, typically. */
35
+ mobileTriggerIcon?: ReactNode;
36
+ /**
37
+ * Control slotted beside the mobile trigger, kept outside the sheet. Put
38
+ * search here: on a phone it's usually what the reader actually wants, and
39
+ * shutting it inside the sheet costs an extra tap to reach.
40
+ */
41
+ mobileTriggerAction?: ReactNode;
42
+ /**
43
+ * Render the built-in mobile bar. Default true. Set false to drive the sheet
44
+ * from your own control via `useSidebarLayout().openMobile()` — you then own
45
+ * `aria-expanded`, `aria-controls="hs-sidebar-drawer"` and returning focus.
46
+ */
47
+ mobileBar?: boolean;
19
48
  /**
20
49
  * Grow to fill a flex/grid parent (sets `flex: 1 1 auto; min-height: 0`) so
21
50
  * the shell takes the available height and the content column scrolls on its
@@ -27,13 +56,16 @@ export interface SidebarLayoutProps {
27
56
  }
28
57
  /**
29
58
  * The resizable two-column shell: a sidebar column (`--hs-sidebar-w` wide) and a
30
- * fluid content column. Owns the resize width and the mobile drawer state, which
59
+ * fluid content column. Owns the resize width and the mobile sheet state, which
31
60
  * <Sidebar>, <SidebarMain> and <NavItem> read from context.
32
61
  *
33
- * On narrow screens (<=760px) the grid collapses to a single column, the sidebar
34
- * becomes an off-canvas drawer, and a sticky trigger bar appears at the top.
62
+ * On narrow screens (<=760px) the grid collapses to a single column and the
63
+ * sidebar becomes a bottom sheet, opened from a bar fixed to the bottom of the
64
+ * viewport. The bar sits in thumb reach rather than at the top of a long
65
+ * scrolling page, and names its own contents ("Changelog / Highcharts v12.5.0")
66
+ * instead of repeating the site header's hamburger.
35
67
  */
36
- export declare function SidebarLayout({ children, defaultWidth, minWidth, maxWidth, resizable, storageKey, mobileTriggerLabel, fill, className, style }: SidebarLayoutProps): import("react").JSX.Element;
68
+ export declare function SidebarLayout({ children, defaultWidth, minWidth, maxWidth, resizable, storageKey, mobileTriggerLabel, mobileTriggerValue, mobileTriggerIcon, mobileTriggerAction, mobileBar, fill, className, style }: SidebarLayoutProps): import("react").JSX.Element;
37
69
  /** The fluid content column that sits beside the sidebar. */
38
70
  export declare function SidebarMain({ children, className, ...rest }: {
39
71
  children: ReactNode;
@@ -7,10 +7,38 @@ export interface SidebarLayoutContextValue {
7
7
  setWidth: (w: number) => void;
8
8
  minWidth: number;
9
9
  maxWidth: number;
10
- /** Whether the mobile off-canvas drawer is open. */
10
+ /**
11
+ * Whether the layout is currently in its narrow (<=760px) form — the sidebar
12
+ * is a bottom sheet rather than a grid column. `false` on the server and on
13
+ * the first client render, then settles after mount.
14
+ */
15
+ isMobile: boolean;
16
+ /** Whether the mobile bottom sheet is open. */
11
17
  mobileOpen: boolean;
12
- openMobile: () => void;
18
+ /**
19
+ * Open the sheet. `focus: 'search'` lands on the first field in
20
+ * <SidebarHeader> instead of on the sheet — for a search control in the
21
+ * mobile bar, where tapping it means "let me type", so the keyboard coming
22
+ * up is the point rather than an intrusion.
23
+ */
24
+ openMobile: (options?: {
25
+ focus?: 'sheet' | 'search';
26
+ }) => void;
13
27
  closeMobile: () => void;
28
+ /** Where the pending open wants focus. Read by <Sidebar>. */
29
+ openFocus: 'sheet' | 'search';
30
+ /**
31
+ * Where the active <NavItem> sits, as "<parent group> / <item>" — what the
32
+ * mobile bar names when the consumer hasn't passed `mobileTriggerValue`.
33
+ * Empty when nothing is active or the labels aren't reducible to text.
34
+ */
35
+ activePage: string;
36
+ /**
37
+ * Reported by each <NavItem> as it becomes (or stops being) the active one.
38
+ * Pass `null` to give up the slot; the last item to claim it wins, and
39
+ * releasing only clears when the caller is still the holder.
40
+ */
41
+ reportActivePage: (id: string, page: string | null) => void;
14
42
  }
15
43
  export declare const SidebarLayoutContext: import('react').Context<SidebarLayoutContextValue | null>;
16
44
  /** Throws when used outside <SidebarLayout> — for components that require it. */
@@ -0,0 +1,17 @@
1
+ import { ReactNode } from 'react';
2
+ /**
3
+ * Labels of the <NavGroup>s enclosing the current subtree, outermost first.
4
+ * Every group appends one entry, so `.length` is also the nesting depth (which
5
+ * drives the sticky-offset stacking). An entry is `''` when the group's label
6
+ * isn't reducible to text — the slot is still taken, so depth stays right.
7
+ */
8
+ export declare const NavPathContext: import('react').Context<string[]>;
9
+ export declare function useNavPath(): string[];
10
+ /**
11
+ * Best-effort plain text for a label, so the mobile bar can name the current
12
+ * page without the consumer restating it. Handles the shapes labels actually
13
+ * take — a string, `v{version}` (an array of strings), a wrapped span — and
14
+ * gives up on anything else rather than guessing. Giving up is safe: the bar
15
+ * falls back to its label, and `mobileTriggerValue` overrides regardless.
16
+ */
17
+ export declare function textOf(node: ReactNode): string;
package/dist/main.js CHANGED
@@ -1,37 +1,37 @@
1
1
  import { c as e, d as t, r as n, s as r, u as i } from "./utils-K9S_6_Eq.js";
2
2
  import { t as a } from "./Box-BZgeSeCV.js";
3
- import { t as o } from "./Button-BGsqFCRW.js";
4
- import { t as s } from "./CopyCode-_yeXCeeq.js";
3
+ import { t as o } from "./Button-DSGsV45k.js";
4
+ import { t as s } from "./CopyCode-PbZbRLn-.js";
5
5
  import { t as c } from "./FrameworkIcon-D7N3PjYr.js";
6
- import { t as l } from "./CodeBlock-BKiZQpA5.js";
6
+ import { t as l } from "./CodeBlock-7BTXXf30.js";
7
7
  import { t as u } from "./Icon-VeXJMj8Q.js";
8
8
  import { t as d } from "./Link-CYR92_U0.js";
9
9
  import { t as f } from "./ProductIcon-DFLAYWbu.js";
10
- import { t as p } from "./ButtonGroup-DKfaXOeS.js";
10
+ import { t as p } from "./ButtonGroup-DNTpDU-E.js";
11
11
  import { t as m } from "./InputSolo-DUdKtZjX.js";
12
- import { t as h } from "./SearchDropdown-L_rQz1vn.js";
13
- import { i as g, n as _, r as v, t as y } from "./InputGrouped-CHGCMmsK.js";
12
+ import { t as h } from "./SearchDropdown-B5CFwNib.js";
13
+ import { i as g, n as _, r as v, t as y } from "./InputGrouped-BJEodhml.js";
14
14
  import { t as b } from "./Container-BDssaLig.js";
15
15
  import { t as x } from "./DiscordInvite-CLYxexdH.js";
16
16
  import { t as S } from "./Heading-DNDHqYWO.js";
17
17
  import { t as C } from "./Typography-AvvBRu-u.js";
18
18
  import { t as w } from "./Logo-Bz0G2G-k.js";
19
- import { t as T } from "./NewsletterSignup-DrcPfdrg.js";
20
- import { n as E, r as D, t as O } from "./Dropdown-B_Ib6i1c.js";
21
- import { t as k } from "./PrefPanel-BGw72I_D.js";
22
- import { n as A, t as j } from "./Label-CgiWi1v6.js";
23
- import { t as M } from "./VideoCover-DqMDvzvA.js";
24
- import { t as N } from "./VideoPlayer-Cq_garSg.js";
25
- import { t as P } from "./VideoPlayerModal-D1v1O2kW.js";
26
- import { t as F } from "./Footer-ZdzuxuhY.js";
19
+ import { t as T } from "./NewsletterSignup-mPKBEpYq.js";
20
+ import { n as E, r as D, t as O } from "./Dropdown-c_EhnzqC.js";
21
+ import { t as k } from "./PrefPanel-DxSIkYDF.js";
22
+ import { n as A, t as j } from "./Label-BhFeSC8Z.js";
23
+ import { t as M } from "./VideoCover-BkbLsmQ_.js";
24
+ import { t as N } from "./VideoPlayer-CY63501h.js";
25
+ import { t as P } from "./VideoPlayerModal-DIHMoFgS.js";
26
+ import { t as F } from "./Footer-C6a3PeJq.js";
27
27
  import { n as I } from "./GPTInput-C0YG1990.js";
28
- import { t as L } from "./Notification-B3skQvZE.js";
29
- import { n as R, t as z } from "./Header-CVKH_INR.js";
28
+ import { t as L } from "./Notification-JovL5anc.js";
29
+ import { n as R, t as z } from "./Header-BokKjfF7.js";
30
30
  import { t as B } from "./Tabs-BuDaPqdN.js";
31
31
  import { n as V, t as H } from "./RadioBox-o1Ssyj0s.js";
32
- import { n as U, t as W } from "./Checkbox-CniRhVkQ.js";
32
+ import { n as U, t as W } from "./Checkbox-imALf2_N.js";
33
33
  import { Modal as G } from "./components/Modal/index.js";
34
- import { t as K } from "./RoadmapDetails-XS0OylnP.js";
34
+ import { t as K } from "./RoadmapDetails-ZnyXG2j7.js";
35
35
  import { ModalContactFooter as q } from "./components/Modal/ModalContactFooter.js";
36
36
  import { useOptionalSidebarLayout as J, useSidebarLayout as Y } from "./components/Sidebar/context.js";
37
37
  import { SidebarLayout as X, SidebarMain as Z } from "./components/Sidebar/SidebarLayout.js";
@@ -1,5 +1,5 @@
1
1
  import { r as e } from "./chunk-jwUa06l-.js";
2
- import { r as t, t as n } from "./create-element-CDnUGrhg.js";
2
+ import { r as t, t as n } from "./create-element-C3ORyDVw.js";
3
3
  import r from "react";
4
4
  //#region node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js
5
5
  function i(e, t) {
@@ -8,14 +8,18 @@ var e = {
8
8
  disclosureChevron: "UvvIVG_disclosureChevron",
9
9
  disclosureToggle: "UvvIVG_disclosureToggle",
10
10
  fill: "UvvIVG_fill",
11
+ grabber: "UvvIVG_grabber",
12
+ grabberPill: "UvvIVG_grabberPill",
11
13
  groupActive: "UvvIVG_groupActive",
12
14
  groupChevron: "UvvIVG_groupChevron",
13
15
  groupChildren: "UvvIVG_groupChildren",
14
16
  groupChildrenInner: "UvvIVG_groupChildrenInner",
17
+ groupExpanding: "UvvIVG_groupExpanding",
15
18
  groupLabel: "UvvIVG_groupLabel",
16
19
  groupOpen: "UvvIVG_groupOpen",
17
20
  groupToggle: "UvvIVG_groupToggle",
18
21
  handle: "UvvIVG_handle",
22
+ hasMobileBar: "UvvIVG_hasMobileBar",
19
23
  hasStickyHead: "UvvIVG_hasStickyHead",
20
24
  hatchClip: "UvvIVG_hatchClip",
21
25
  hatchDrag: "UvvIVG_hatchDrag",
@@ -30,13 +34,20 @@ var e = {
30
34
  main: "UvvIVG_main",
31
35
  minimizeBtn: "UvvIVG_minimizeBtn",
32
36
  mobileBar: "UvvIVG_mobileBar",
37
+ mobileBarAction: "UvvIVG_mobileBarAction",
33
38
  overlay: "UvvIVG_overlay",
34
39
  section: "UvvIVG_section",
35
40
  sectionHead: "UvvIVG_sectionHead",
36
41
  sectionLabel: "UvvIVG_sectionLabel",
42
+ sheetDragging: "UvvIVG_sheetDragging",
37
43
  sidebar: "UvvIVG_sidebar",
38
44
  sidebarOpen: "UvvIVG_sidebarOpen",
39
- trigger: "UvvIVG_trigger"
45
+ trigger: "UvvIVG_trigger",
46
+ triggerChevron: "UvvIVG_triggerChevron",
47
+ triggerIcon: "UvvIVG_triggerIcon",
48
+ triggerLine: "UvvIVG_triggerLine",
49
+ triggerOverline: "UvvIVG_triggerOverline",
50
+ triggerText: "UvvIVG_triggerText"
40
51
  };
41
52
  //#endregion
42
53
  export { e as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "highsoft-ui",
3
- "version": "1.0.152",
3
+ "version": "1.0.154",
4
4
  "description": "Highsoft UI",
5
5
  "type": "module",
6
6
  "repository": {