highsoft-ui 1.0.153 → 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 (69) 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 +2 -2
  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/Sidebar/Sidebar.d.ts +10 -5
  63. package/dist/lib/components/Sidebar/SidebarLayout.d.ts +37 -5
  64. package/dist/lib/components/Sidebar/context.d.ts +30 -2
  65. package/dist/lib/components/Sidebar/navPath.d.ts +17 -0
  66. package/dist/main.js +18 -18
  67. package/dist/{prism-light-COlcVrfu.js → prism-light-BLaY8zo6.js} +1 -1
  68. package/dist/{styles.module-Bd4HbnpA.js → styles.module-DGKft2EO.js} +12 -1
  69. package/package.json +1 -1
package/CLAUDE.md CHANGED
@@ -205,9 +205,17 @@ The foundational layout component. Use it instead of raw `<div>` with inline sty
205
205
  - Polymorphic: `<Link as={RouterLink} to="/page">` for SPA navigation
206
206
 
207
207
  ### Icon
208
+ Wraps an `@untitled-ui/icons-react` icon so it picks up the design system's size
209
+ and stroke-width scale. `name` takes the **component**, not a string — you still
210
+ import the icon itself.
208
211
  ```tsx
209
- <Icon name="chevron-right" size={200} />
212
+ import { ChevronRight } from '@untitled-ui/icons-react'
213
+
214
+ <Icon name={ChevronRight} size={16} />
210
215
  ```
216
+ - **`name`:** the icon component from `@untitled-ui/icons-react`
217
+ - **`size`:** `12` | `16` | `20` | `24` (default) | `32` | `40` | `52` | `64` | `72` — each maps to a stroke width (16 → 1.33, 20 → 1.67, 24 → 2), which is what keeps icons visually consistent at different sizes
218
+ - Icons passed to `Button`/`Label` via `iconLeft`/`iconRight` don't need this — those components size raw SVG children themselves.
211
219
 
212
220
  ### FrameworkIcon
213
221
  Language, framework and platform brand icons in two themes.
@@ -242,6 +250,7 @@ Standalone, self-bordered text field with a floating label, help text, and error
242
250
  - **`variant`:** `"default"`, `"white"`
243
251
  - **`iconLeft`:** icon rendered inside the field (not next to the label — that's `InputGrouped`'s `labelIcon`)
244
252
  - **`hasError` / `success`:** state styling; pair with `helpText`
253
+ - **Touch devices get a 16px field** regardless of `size`. iOS Safari zooms the whole viewport when you focus a field whose text is under 16px, and doesn't zoom back out — so sizes `100` and `200` are floored under `@media (pointer: coarse)`. **Don't "fix" this at the page level** with a `maximum-scale=1` / `user-scalable=no` viewport meta: that buys it by disabling pinch-zoom for everyone, which fails WCAG 1.4.4 (Resize Text).
245
254
 
246
255
  ### SearchDropdown
247
256
  Combobox / autocomplete: a search field (built on `InputSolo`) with a filtered, keyboard-navigable results popover and match highlighting.
@@ -403,7 +412,7 @@ Lightbox wrapping `VideoPlayer` in a Radix dialog. The player mounts on open (au
403
412
  ### Sidebar (SidebarLayout, Sidebar, NavItem, NavGroup, …)
404
413
  A composable, resizable sidebar-navigation shell for docs/app layouts. The
405
414
  `<SidebarLayout>` is a two-column grid that owns the resize width and the mobile
406
- off-canvas drawer; compose the rest inside it.
415
+ bottom sheet; compose the rest inside it.
407
416
 
408
417
  ```tsx
409
418
  import {
@@ -433,15 +442,60 @@ import { BarChart01 } from '@untitled-ui/icons-react'
433
442
  </SidebarLayout>
434
443
  ```
435
444
 
436
- - **`SidebarLayout`** — the grid shell. `defaultWidth`/`minWidth`/`maxWidth` (drag-to-resize), `storageKey` (persist width), `resizable` (default `true`), `fill` (default `true` — grows to fill a flex/grid parent), `mobileTriggerLabel` (default `"Menu"`). Owns the mobile drawer (sticky trigger, backdrop, Escape).
445
+ - **`SidebarLayout`** — the grid shell. `defaultWidth`/`minWidth`/`maxWidth` (drag-to-resize), `storageKey` (persist width), `resizable` (default `true`), `fill` (default `true` — grows to fill a flex/grid parent). Owns the mobile bar and sheet (see below).
437
446
  - **`SidebarMain`** — the fluid content column beside the sidebar.
438
- - **`Sidebar`** — the `<aside>`; becomes the off-canvas drawer on mobile and auto-renders the resize handle + close button.
447
+ - **`Sidebar`** — the `<aside>`; becomes the bottom sheet on mobile and auto-renders the resize handle, the grab handle and the close button.
439
448
  - **`SidebarHeader` / `SidebarBody`** — fixed top region / scrollable body.
440
449
  - **`SidebarSection`** — labelled group. `collapsible` surfaces a "Minimize" control that collapses its open `NavGroup`s; `action` slots a custom control instead.
441
- - **`NavItem`** — polymorphic nav link (`as`, default `<a>`); `active`, `icon`. Closes the mobile drawer on click. Open parents pin to the top while their list scrolls.
450
+ - **`NavItem`** — polymorphic nav link (`as`, default `<a>`); `active`, `icon`. Closes the mobile sheet on click, after a ~350ms beat so the row visibly takes its selected state under the finger rather than the sheet vanishing out from under the tap. **Touch only** (`pointer: coarse`) — the same breakpoint fires on a narrow desktop window, where hover has already shown which row is which and the pause would just read as lag. Open parents pin to the top while their list scrolls.
442
451
  - **`NavGroup`** — expandable tree node (`defaultOpen`, controlled `open`/`onOpenChange`, `active` to tint the guide-line on the active path).
443
452
  - **`NavDisclosure`** — collapses behind a tap-toggle on narrow screens, inert on desktop.
444
- - The sidebar imposes **no background** of its own — set `--hs-sidebar-bg` (the mobile drawer keeps an opaque fallback). Colours use `--HS-*` tokens, so dark mode is automatic.
453
+ - The sidebar imposes **no background** of its own — set `--hs-sidebar-bg` (the mobile sheet keeps an opaque fallback). Colours use `--HS-*` tokens, so dark mode is automatic.
454
+
455
+ #### Mobile (≤760px): the bar and the sheet
456
+
457
+ A page that has a site `<Header>` already spends the top of a phone screen on the site menu. A second hamburger 40px below it reads as one navigation split in half, whatever the second one is called — so the section nav takes the **opposite end of the screen**: a bar fixed in thumb reach that **names its own contents and where you currently are**, and a sheet that rises from it. Different place, different shape, different words, so the two are legible as different controls at a glance.
458
+
459
+ **The position line comes for free.** The bar names the page you're on by reading the active `<NavItem>` — `"<enclosing group> / <item>"`, e.g. `"Highcharts Core / v12.5.0"`. The sidebar already knows which item is current, so nothing needs passing:
460
+
461
+ ```tsx
462
+ <SidebarLayout
463
+ storageKey="changelog.sidebarWidth"
464
+ mobileTriggerLabel="Changelog" // what this nav is
465
+ mobileTriggerIcon={<ProductMark slug={product} />}
466
+ mobileTriggerAction={<SearchButton />} // stays outside the sheet
467
+ >
468
+ ```
469
+
470
+ - **`mobileTriggerLabel`** (default `"Navigation"`) — names the nav. Rendered as a small overline above the position line; with no position line it becomes the headline instead.
471
+ - **`mobileTriggerValue`** — override the derived position. Only worth passing when you want different wording; pass `false` to show no position line at all. Derivation needs labels that reduce to text (a string, `v{version}`, a wrapped span); a label built from arbitrary JSX yields nothing, and then this prop is how you say it. Deep trees keep the **last two** segments, so the most specific part survives at 320px.
472
+ - **`mobileTriggerIcon`** — 20×20 leading glyph.
473
+ - **`mobileTriggerAction`** — a control slotted beside the trigger, outside the sheet, divided off so a thumb aimed at it can't open the tree. **Put search here** — on a phone it's usually what the reader came for, and shutting it inside the sheet costs an extra tap. Wire it to `openMobile({ focus: 'search' })`, which opens the sheet and puts the caret in the first field of `<SidebarHeader>`: tapping search means "let me type", so the keyboard coming up is the point rather than an intrusion. (Opening any other way focuses the sheet, precisely so the keyboard *doesn't* come up and cover it.)
474
+
475
+ ```tsx
476
+ function MobileSearchButton() {
477
+ const { openMobile } = useSidebarLayout()
478
+ return (
479
+ <Button variant="transparent" size={300} aria-label="Search"
480
+ onClick={() => openMobile({ focus: 'search' })}>
481
+ <SearchMd />
482
+ </Button>
483
+ )
484
+ }
485
+ ```
486
+ - **`mobileBar`** (default `true`) — set `false` to drive the sheet from your own control via `useSidebarLayout().openMobile()`; you then own `aria-expanded`, `aria-controls="hs-sidebar-drawer"` and returning focus.
487
+ - **`--hs-sidebar-mobile-bar-h`** — the space the fixed bar occupies (`0px` above the breakpoint). Read it to keep anything outside the layout clear of the bar: `footer { padding-bottom: var(--hs-sidebar-mobile-bar-h); }`. It tracks the breakpoint, not the presence of a `<SidebarLayout>`, so only read it on pages that render one.
488
+ - `useSidebarLayout()` also exposes **`isMobile`** — whether the layout is currently in its narrow form.
489
+
490
+ **Accessibility:**
491
+ - The trigger keeps `aria-expanded` + `aria-controls="hs-sidebar-drawer"`. The open sheet is a `role="dialog"` `aria-modal` **with focus trapped inside it**; Escape, the backdrop, the close button and dragging the grab handle down all dismiss it, and focus returns to the trigger every time. Selecting a `NavItem` closes it too.
492
+ - **Opening moves focus to the sheet itself** (`tabindex="-1"`), not to the close button. A screen reader then announces what opened — "Changelog navigation, dialog" — rather than the one control that dismisses it, and a keyboard open doesn't park a focus ring on the X. The first Tab still reaches the close button; Shift+Tab from the sheet wraps to the last item instead of stepping out. The sheet has no focus indicator of its own, which is fine because it isn't keyboard operable — you can't tab to it.
493
+ - While closed on a narrow screen the sidebar is **`inert`**, so its (often several hundred) links stay out of the tab order and the AT tree. The bar's own controls stay reachable.
494
+ - The trigger fills a **44px** target and the sheet's controls are large enough to hit without aiming; nothing depends on hover. `:focus-visible` shows the brand focus ring, so a narrow *desktop* window — the same breakpoint, but with a cursor and keyboard — behaves as expected.
495
+ - Opening the sheet **locks page scroll** (compensating for the scrollbar so a narrow desktop window doesn't jolt sideways) and restores it on close.
496
+ - The sheet **stays inside the visual viewport when a software keyboard opens**. iOS doesn't shrink the layout viewport for the keyboard — it shrinks the *visual* viewport and scrolls the layout one underneath, which would leave a bottom-anchored `position: fixed` sheet half behind the keyboard with its head pushed off the top, hiding the search field that focusing it was meant to expose. `<Sidebar>` tracks `visualViewport` and lifts/caps the sheet to match. Only for a keyboard-sized bite (≥120px), so a moving address bar doesn't resize it, and it hands the geometry back to CSS when the keyboard goes.
497
+ - The grab handle is `aria-hidden` — it's the touch affordance, and the labelled close button is the control. Under `prefers-reduced-motion: reduce` the sheet arrives and leaves instantly; dragging it still tracks the finger, since that's direct manipulation rather than authored motion.
498
+ - Widening past 760px retires the sheet without moving focus — a resize isn't a dismissal.
445
499
 
446
500
  ## Hooks
447
501
 
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./clsx-BWCAbrjV.js";
2
- import { M as t } from "./esm-BnxclXHW.js";
2
+ import { N as t } from "./esm-C4Ybr9s4.js";
3
3
  import { forwardRef as n } from "react";
4
4
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
5
  var a = {
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./clsx-BWCAbrjV.js";
2
- import { t } from "./Button-BGsqFCRW.js";
2
+ import { t } from "./Button-DSGsV45k.js";
3
3
  import { useEffect as n, useState as r } from "react";
4
4
  import { jsx as i } from "react/jsx-runtime";
5
5
  var a = {
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./clsx-BWCAbrjV.js";
2
- import { j as t } from "./esm-BnxclXHW.js";
2
+ import { M as t } from "./esm-C4Ybr9s4.js";
3
3
  import { createContext as n, useCallback as r, useContext as i, useEffect as a, useId as o, useRef as s, useState as c } from "react";
4
4
  import { jsx as l, jsxs as u } from "react/jsx-runtime";
5
5
  var d = {
@@ -1,7 +1,7 @@
1
1
  import { r as e, s as t } from "./utils-K9S_6_Eq.js";
2
2
  import { t as n } from "./clsx-BWCAbrjV.js";
3
- import { H as r, K as i } from "./esm-BnxclXHW.js";
4
- import { t as a } from "./Button-BGsqFCRW.js";
3
+ import { U as r, Y as i } from "./esm-C4Ybr9s4.js";
4
+ import { t as a } from "./Button-DSGsV45k.js";
5
5
  import { t as o } from "./FrameworkIcon-D7N3PjYr.js";
6
6
  import { Fragment as s, forwardRef as c, useCallback as l, useEffect as u, useMemo as d, useState as f } from "react";
7
7
  import { jsx as p, jsxs as m } from "react/jsx-runtime";
@@ -22,8 +22,8 @@ var h = {
22
22
  }, g = null;
23
23
  function _() {
24
24
  return g ||= Promise.all([
25
- import("./prism-light-COlcVrfu.js"),
26
- import("./create-element-CDnUGrhg.js").then((e) => e.n),
25
+ import("./prism-light-BLaY8zo6.js"),
26
+ import("./create-element-C3ORyDVw.js").then((e) => e.n),
27
27
  import("./jsx-B57trbk8.js"),
28
28
  import("./tsx-CJFgwLf7.js"),
29
29
  import("./json-Bfzk2Msc.js"),
@@ -1,5 +1,5 @@
1
- import { t as e } from "./esm-BnxclXHW.js";
2
- import { t } from "./Button-BGsqFCRW.js";
1
+ import { t as e } from "./esm-C4Ybr9s4.js";
2
+ import { t } from "./Button-DSGsV45k.js";
3
3
  import { a as n, i as r, n as i, o as a, r as o, s, t as c } from "./dist-f0z6DapB.js";
4
4
  import { useEffect as l, useRef as u, useState as d } from "react";
5
5
  import { jsx as f, jsxs as p } from "react/jsx-runtime";
@@ -1,7 +1,7 @@
1
1
  import { r as e, s as t } from "./utils-K9S_6_Eq.js";
2
2
  import { t as n } from "./clsx-BWCAbrjV.js";
3
- import { H as r, K as i } from "./esm-BnxclXHW.js";
4
- import { t as a } from "./Button-BGsqFCRW.js";
3
+ import { U as r, Y as i } from "./esm-C4Ybr9s4.js";
4
+ import { t as a } from "./Button-DSGsV45k.js";
5
5
  import { forwardRef as o, useCallback as s } from "react";
6
6
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
7
7
  var u = {
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./clsx-BWCAbrjV.js";
2
- import { K as t } from "./esm-BnxclXHW.js";
2
+ import { Y as t } from "./esm-C4Ybr9s4.js";
3
3
  import { t as n } from "./Icon-VeXJMj8Q.js";
4
4
  import { _ as r, a as i, c as a, d as o, g as s, h as c, i as l, l as u, m as d, n as f, o as p, p as m, r as h, t as g, u as _, v, y } from "./es2015-DWa0ZZ7A.js";
5
5
  import { a as ee, i as b, n as te, r as x, t as S } from "./dist-CE9LFbij.js";
@@ -1,14 +1,14 @@
1
1
  import { r as e } from "./utils-K9S_6_Eq.js";
2
- import { K as t, U as n } from "./esm-BnxclXHW.js";
3
- import { t as r } from "./Button-BGsqFCRW.js";
2
+ import { W as t, Y as n } from "./esm-C4Ybr9s4.js";
3
+ import { t as r } from "./Button-DSGsV45k.js";
4
4
  import { t as i } from "./Container-BDssaLig.js";
5
5
  import { t as a } from "./DiscordInvite-CLYxexdH.js";
6
6
  import { t as o } from "./Logo-Bz0G2G-k.js";
7
- import { t as s } from "./NewsletterSignup-DrcPfdrg.js";
8
- import { t as c } from "./FooterBottom-CqpN8Wky.js";
9
- import { t as l } from "./FooterHelp-Cb5sraAE.js";
10
- import { t as u } from "./FooterLinks-HGxMx6Xz.js";
11
- import { t as d } from "./YoutubeModal-BBYdQil8.js";
7
+ import { t as s } from "./NewsletterSignup-mPKBEpYq.js";
8
+ import { t as c } from "./FooterBottom-DADUJdzz.js";
9
+ import { t as l } from "./FooterHelp-DN7Mdy40.js";
10
+ import { t as u } from "./FooterLinks-rrtsCIdv.js";
11
+ import { t as d } from "./YoutubeModal-DqBis8Cm.js";
12
12
  import { jsx as f, jsxs as p } from "react/jsx-runtime";
13
13
  var m = {
14
14
  discordCard: "_4W4F3q_discordCard",
@@ -29,7 +29,7 @@ function g() {
29
29
  return /* @__PURE__ */ p(r, {
30
30
  variant: "neutral",
31
31
  onClick: () => i(o),
32
- children: [o, f(a ? t : n, {})]
32
+ children: [o, f(a ? n : t, {})]
33
33
  });
34
34
  }
35
35
  function _({ link: e = "a", host: t = "https://www.highcharts.com" }) {
@@ -1,7 +1,7 @@
1
1
  import { a as e, t } from "./utils-K9S_6_Eq.js";
2
2
  import { a as n, c as r, i, n as a, o, r as s, s as c, t as l } from "./fa-B95RwBpz.js";
3
3
  import { t as u } from "./Typography-AvvBRu-u.js";
4
- import { t as d } from "./CookiePolicyModal-k89sCBEJ.js";
4
+ import { t as d } from "./CookiePolicyModal-DulwuSp4.js";
5
5
  import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
6
6
  //#region node_modules/react-icons/fa6/index.mjs
7
7
  function h(e) {
@@ -1,5 +1,5 @@
1
1
  import { a as e, t } from "./utils-K9S_6_Eq.js";
2
- import { d as n, g as r } from "./esm-BnxclXHW.js";
2
+ import { d as n, g as r } from "./esm-C4Ybr9s4.js";
3
3
  import { t as i } from "./Icon-VeXJMj8Q.js";
4
4
  import { o as a, r as o } from "./fa-B95RwBpz.js";
5
5
  import { t as s } from "./Typography-AvvBRu-u.js";
@@ -1,8 +1,8 @@
1
1
  import { t as e } from "./clsx-BWCAbrjV.js";
2
- import { N as t } from "./esm-BnxclXHW.js";
2
+ import { P as t } from "./esm-C4Ybr9s4.js";
3
3
  import { t as n } from "./Icon-VeXJMj8Q.js";
4
4
  import { t as r } from "./Typography-AvvBRu-u.js";
5
- import { t as i } from "./Label-CgiWi1v6.js";
5
+ import { t as i } from "./Label-BhFeSC8Z.js";
6
6
  import a from "./components/icons/MadeInNorway.js";
7
7
  import { jsx as o, jsxs as s } from "react/jsx-runtime";
8
8
  var c = {
@@ -1,13 +1,13 @@
1
1
  import { a as e, d as t, i as n, o as r, u as i } from "./utils-K9S_6_Eq.js";
2
2
  import { t as a } from "./clsx-BWCAbrjV.js";
3
- import { D as o, L as s, O as c, Q as l, Y as u, b as d, f, p, q as m, s as h, t as g } from "./esm-BnxclXHW.js";
4
- import { t as _ } from "./Button-BGsqFCRW.js";
3
+ import { O as o, Q as s, R as c, X as l, b as u, f as d, k as f, p, s as m, t as h, tt as g } from "./esm-C4Ybr9s4.js";
4
+ import { t as _ } from "./Button-DSGsV45k.js";
5
5
  import { t as v } from "./Container-BDssaLig.js";
6
6
  import { t as y } from "./Logo-Bz0G2G-k.js";
7
- import { t as b } from "./PrefPanel-BGw72I_D.js";
8
- import { t as x } from "./Search-UPVxQliM.js";
9
- import { t as S } from "./Label-CgiWi1v6.js";
10
- import { t as C } from "./Notification-B3skQvZE.js";
7
+ import { t as b } from "./PrefPanel-DxSIkYDF.js";
8
+ import { t as x } from "./Search-Cc9ZJgGx.js";
9
+ import { t as S } from "./Label-BhFeSC8Z.js";
10
+ import { t as C } from "./Notification-JovL5anc.js";
11
11
  import { useEffect as w, useRef as T, useState as E } from "react";
12
12
  import { Fragment as D, jsx as O, jsxs as k } from "react/jsx-runtime";
13
13
  var A = {
@@ -75,12 +75,12 @@ var A = {
75
75
  {
76
76
  title: "Products",
77
77
  url: "https://www.highcharts.com/products/",
78
- icon: /* @__PURE__ */ O(m, {})
78
+ icon: /* @__PURE__ */ O(l, {})
79
79
  },
80
80
  {
81
81
  title: "Demos",
82
82
  url: "https://www.highcharts.com/demo",
83
- icon: /* @__PURE__ */ O(d, {})
83
+ icon: /* @__PURE__ */ O(u, {})
84
84
  },
85
85
  {
86
86
  title: "Support",
@@ -90,17 +90,17 @@ var A = {
90
90
  {
91
91
  title: "Resources",
92
92
  url: "https://www.highcharts.com/resources/",
93
- icon: /* @__PURE__ */ O(s, {})
93
+ icon: /* @__PURE__ */ O(c, {})
94
94
  },
95
95
  {
96
96
  title: "Pricing",
97
97
  url: "https://shop.highcharts.com/",
98
- icon: /* @__PURE__ */ O(u, {})
98
+ icon: /* @__PURE__ */ O(s, {})
99
99
  },
100
100
  {
101
101
  title: "Blog",
102
102
  url: "https://www.highcharts.com/blog/home/",
103
- icon: /* @__PURE__ */ O(l, {})
103
+ icon: /* @__PURE__ */ O(g, {})
104
104
  }
105
105
  ];
106
106
  function B(e, t) {
@@ -193,37 +193,37 @@ function Y() {
193
193
  e && R(M, e);
194
194
  }, [e]), null;
195
195
  }
196
- function X({ subItems: t, children: r, notifications: o = J, link: s = "a", host: l = "https://www.highcharts.com", pathname: u, cssVariable: d, position: m = "sticky" }) {
196
+ function X({ subItems: t, children: r, notifications: o = J, link: s = "a", host: c = "https://www.highcharts.com", pathname: l, cssVariable: u, position: g = "sticky" }) {
197
197
  let S = e("(max-width: 374px)"), w = e("(max-width: 849px)"), M = e("(max-width: 1300px)"), N = G(t), P = T(null), [F, L] = E(!1), [V, H] = E([]);
198
198
  n(() => {
199
199
  let e = P.current;
200
200
  if (!e) return;
201
201
  let n = t?.length ? N ? U : W : 0, r = 82 + V.length * 48 + n, i = -(82 + V.length * 48);
202
- if (m === "static") return e.style.transform = "", d && document.documentElement.style.setProperty("--header-bottom", `${r}px`), () => {
203
- e.style.transform = "", d && document.documentElement.style.removeProperty("--header-bottom");
202
+ if (g === "static") return e.style.transform = "", u && document.documentElement.style.setProperty("--header-bottom", `${r}px`), () => {
203
+ e.style.transform = "", u && document.documentElement.style.removeProperty("--header-bottom");
204
204
  };
205
205
  let a = window.scrollY, o = 0, s = null, c = null, l = () => {
206
- c = null, !(!e || s === o) && (e.style.transform = `translate3d(0, ${o}px, 0)`, d && document.documentElement.style.setProperty("--header-bottom", `${r + o}px`), s = o);
206
+ c = null, !(!e || s === o) && (e.style.transform = `translate3d(0, ${o}px, 0)`, u && document.documentElement.style.setProperty("--header-bottom", `${r + o}px`), s = o);
207
207
  };
208
208
  l();
209
- let u = () => {
209
+ let d = () => {
210
210
  let e = window.scrollY, t = e - a;
211
211
  a = e, o = Math.min(0, Math.max(i, o - t)), c === null && (c = window.requestAnimationFrame(l));
212
212
  };
213
- return window.addEventListener("scroll", u, { passive: !0 }), () => {
214
- window.removeEventListener("scroll", u), c !== null && cancelAnimationFrame(c), e.style.transform = "", d && document.documentElement.style.removeProperty("--header-bottom");
213
+ return window.addEventListener("scroll", d, { passive: !0 }), () => {
214
+ window.removeEventListener("scroll", d), c !== null && cancelAnimationFrame(c), e.style.transform = "", u && document.documentElement.style.removeProperty("--header-bottom");
215
215
  };
216
216
  }, [
217
- d,
217
+ u,
218
218
  N,
219
219
  V.length,
220
- m,
220
+ g,
221
221
  t?.length
222
222
  ]), n(() => {
223
223
  if (!o.length) return;
224
224
  let e = I();
225
225
  H(e ? o.filter((t) => !t.id || !e.closed.includes(t.id)) : o);
226
- }, [l, o]);
226
+ }, [c, o]);
227
227
  let q = (e) => {
228
228
  if (e.preventDefault(), !(e.nativeEvent instanceof KeyboardEvent) || e.nativeEvent.code === "Enter" || e.nativeEvent.code === "Space") {
229
229
  let e = document.querySelector("main");
@@ -266,7 +266,7 @@ function X({ subItems: t, children: r, notifications: o = J, link: s = "a", host
266
266
  }),
267
267
  /* @__PURE__ */ O(s, {
268
268
  className: A.logo,
269
- href: B("https://www.highcharts.com/", l),
269
+ href: B("https://www.highcharts.com/", c),
270
270
  children: /* @__PURE__ */ O(y, { showText: !M || w && !S })
271
271
  }),
272
272
  /* @__PURE__ */ O("ul", {
@@ -275,7 +275,7 @@ function X({ subItems: t, children: r, notifications: o = J, link: s = "a", host
275
275
  variant: "plain",
276
276
  size: 300,
277
277
  as: s,
278
- href: B(t, l),
278
+ href: B(t, c),
279
279
  children: e
280
280
  }) }, n))
281
281
  }),
@@ -285,11 +285,11 @@ function X({ subItems: t, children: r, notifications: o = J, link: s = "a", host
285
285
  /* @__PURE__ */ O("li", { children: /* @__PURE__ */ k(_, {
286
286
  variant: "transparent",
287
287
  as: s,
288
- href: B("https://www.highcharts.com/chat/gpt/", l),
288
+ href: B("https://www.highcharts.com/chat/gpt/", c),
289
289
  children: [/* @__PURE__ */ O("span", {
290
290
  className: A.gpt,
291
291
  children: "Highcharts Assist"
292
- }), /* @__PURE__ */ O(f, {})]
292
+ }), /* @__PURE__ */ O(d, {})]
293
293
  }) }),
294
294
  /* @__PURE__ */ O("li", { children: /* @__PURE__ */ O(x, {}) }),
295
295
  /* @__PURE__ */ O("li", { children: /* @__PURE__ */ O(b, {}) }),
@@ -297,7 +297,7 @@ function X({ subItems: t, children: r, notifications: o = J, link: s = "a", host
297
297
  className: A.cta,
298
298
  variant: "success",
299
299
  as: s,
300
- href: B("https://shop.highcharts.com/", l),
300
+ href: B("https://shop.highcharts.com/", c),
301
301
  "aria-label": "Buy Now",
302
302
  children: [/* @__PURE__ */ O(p, {}), "Buy Now"]
303
303
  }) }),
@@ -305,14 +305,14 @@ function X({ subItems: t, children: r, notifications: o = J, link: s = "a", host
305
305
  className: A.cta,
306
306
  variant: "brand",
307
307
  as: s,
308
- href: B("https://www.highcharts.com/download/", l),
309
- children: [/* @__PURE__ */ O(h, {}), "Try for Free"]
308
+ href: B("https://www.highcharts.com/download/", c),
309
+ children: [/* @__PURE__ */ O(m, {}), "Try for Free"]
310
310
  }) }),
311
311
  /* @__PURE__ */ O("li", { children: /* @__PURE__ */ k(_, {
312
312
  variant: F ? "soft" : "transparent",
313
313
  className: A.menu,
314
314
  onClick: X,
315
- children: [F ? "Close" : "Menu", O(F ? g : c, {})]
315
+ children: [F ? "Close" : "Menu", O(F ? h : f, {})]
316
316
  }) })
317
317
  ]
318
318
  })
@@ -322,8 +322,8 @@ function X({ subItems: t, children: r, notifications: o = J, link: s = "a", host
322
322
  !!t?.length && /* @__PURE__ */ O(K, {
323
323
  items: t,
324
324
  link: s,
325
- host: l,
326
- pathname: u
325
+ host: c,
326
+ pathname: l
327
327
  }),
328
328
  r
329
329
  ]
@@ -337,7 +337,7 @@ function X({ subItems: t, children: r, notifications: o = J, link: s = "a", host
337
337
  className: A.container,
338
338
  children: [/* @__PURE__ */ O(s, {
339
339
  className: A.logo,
340
- href: B("https://www.highcharts.com/", l),
340
+ href: B("https://www.highcharts.com/", c),
341
341
  children: /* @__PURE__ */ O(y, { showText: !S })
342
342
  }), /* @__PURE__ */ k("ul", {
343
343
  className: A.buttons,
@@ -345,11 +345,11 @@ function X({ subItems: t, children: r, notifications: o = J, link: s = "a", host
345
345
  /* @__PURE__ */ O("li", { children: /* @__PURE__ */ k(_, {
346
346
  variant: "transparent",
347
347
  as: s,
348
- href: B("https://www.highcharts.com/chat/gpt/", l),
348
+ href: B("https://www.highcharts.com/chat/gpt/", c),
349
349
  children: [/* @__PURE__ */ O("span", {
350
350
  className: A.gpt,
351
351
  children: "Highcharts Assist"
352
- }), /* @__PURE__ */ O(f, {})]
352
+ }), /* @__PURE__ */ O(d, {})]
353
353
  }) }),
354
354
  /* @__PURE__ */ O("li", { children: /* @__PURE__ */ O(x, {}) }),
355
355
  /* @__PURE__ */ O("li", { children: /* @__PURE__ */ O(b, {}) })
@@ -362,14 +362,14 @@ function X({ subItems: t, children: r, notifications: o = J, link: s = "a", host
362
362
  variant: "brand",
363
363
  fullWidth: !0,
364
364
  as: s,
365
- href: B("https://shop.highcharts.com/", l),
365
+ href: B("https://shop.highcharts.com/", c),
366
366
  children: [/* @__PURE__ */ O(p, {}), "Buy Now"]
367
367
  }) }), /* @__PURE__ */ O("li", { children: /* @__PURE__ */ k(_, {
368
368
  variant: "success",
369
369
  fullWidth: !0,
370
370
  as: s,
371
- href: B("https://www.highcharts.com/download/", l),
372
- children: [/* @__PURE__ */ O(h, {}), "Try for Free"]
371
+ href: B("https://www.highcharts.com/download/", c),
372
+ children: [/* @__PURE__ */ O(m, {}), "Try for Free"]
373
373
  }) })]
374
374
  }),
375
375
  /* @__PURE__ */ O("ul", {
@@ -379,7 +379,7 @@ function X({ subItems: t, children: r, notifications: o = J, link: s = "a", host
379
379
  size: 500,
380
380
  fullWidth: !0,
381
381
  as: s,
382
- href: B(t, l),
382
+ href: B(t, c),
383
383
  children: [n, e]
384
384
  }) }, r))
385
385
  })
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./clsx-BWCAbrjV.js";
2
- import { B as t, W as n, z as r } from "./esm-BnxclXHW.js";
3
- import { t as i } from "./Button-BGsqFCRW.js";
2
+ import { B as t, V as n, q as r } from "./esm-C4Ybr9s4.js";
3
+ import { t as i } from "./Button-DSGsV45k.js";
4
4
  import { forwardRef as a, useCallback as o, useEffect as s, useRef as c, useState as l } from "react";
5
5
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
6
6
  var f = {
@@ -41,7 +41,7 @@ function m({ children: t, className: n }) {
41
41
  children: t
42
42
  });
43
43
  }
44
- var h = a(({ label: n, required: a = !1, helpText: p, showHelpText: m = !1, labelIcon: h, iconRight: g, button: _, hasError: v = !1, success: y = !1, disabled: b = !1, className: x, wrapperClassName: S, type: C, onFocus: w, onBlur: T, onChange: E, value: D, defaultValue: O, ...k }, A) => {
44
+ var h = a(({ label: r, required: a = !1, helpText: p, showHelpText: m = !1, labelIcon: h, iconRight: g, button: _, hasError: v = !1, success: y = !1, disabled: b = !1, className: x, wrapperClassName: S, type: C, onFocus: w, onBlur: T, onChange: E, value: D, defaultValue: O, ...k }, A) => {
45
45
  let j = c(null), M = A || j, [N, P] = l(!1), [F, I] = l(!1), [L, R] = l(!1), z = C === "password", [B, V] = l(O === void 0 ? "" : String(O)), H = D !== void 0, U = H ? String(D).length > 0 : B.length > 0, W = o((e) => {
46
46
  P(!0), w?.(e);
47
47
  }, [w]), G = o((e) => {
@@ -81,14 +81,14 @@ var h = a(({ label: n, required: a = !1, helpText: p, showHelpText: m = !1, labe
81
81
  children: [/* @__PURE__ */ d("div", {
82
82
  className: f.leftContent,
83
83
  children: [
84
- n && /* @__PURE__ */ d("div", {
84
+ r && /* @__PURE__ */ d("div", {
85
85
  className: f.labelRow,
86
86
  children: [h && /* @__PURE__ */ u("span", {
87
87
  className: f.labelIcon,
88
88
  children: h
89
89
  }), /* @__PURE__ */ d("span", {
90
90
  className: f.label,
91
- children: [n, a && /* @__PURE__ */ u("span", {
91
+ children: [r, a && /* @__PURE__ */ u("span", {
92
92
  className: f.required,
93
93
  children: " *"
94
94
  })]
@@ -99,7 +99,7 @@ var h = a(({ label: n, required: a = !1, helpText: p, showHelpText: m = !1, labe
99
99
  type: Y,
100
100
  className: e(f.inputElement, x),
101
101
  disabled: b,
102
- "aria-label": n,
102
+ "aria-label": r,
103
103
  "aria-required": a,
104
104
  "aria-invalid": v,
105
105
  value: D,
@@ -130,7 +130,7 @@ var h = a(({ label: n, required: a = !1, helpText: p, showHelpText: m = !1, labe
130
130
  e.stopPropagation(), R((e) => !e);
131
131
  },
132
132
  "aria-label": L ? "Hide password" : "Show password",
133
- children: u(L ? r : t, {})
133
+ children: u(L ? t : n, {})
134
134
  }),
135
135
  _
136
136
  ]
@@ -139,7 +139,7 @@ var h = a(({ label: n, required: a = !1, helpText: p, showHelpText: m = !1, labe
139
139
  });
140
140
  });
141
141
  h.displayName = "InputGrouped";
142
- var g = a(({ label: t, required: r = !1, helpText: i, showHelpText: a = !1, labelIcon: s, hasError: p = !1, success: m = !1, disabled: h = !1, className: g, wrapperClassName: _, placeholder: v, children: y, onFocus: b, onBlur: x, onChange: S, value: C, defaultValue: w, ...T }, E) => {
142
+ var g = a(({ label: t, required: n = !1, helpText: i, showHelpText: a = !1, labelIcon: s, hasError: p = !1, success: m = !1, disabled: h = !1, className: g, wrapperClassName: _, placeholder: v, children: y, onFocus: b, onBlur: x, onChange: S, value: C, defaultValue: w, ...T }, E) => {
143
143
  let D = c(null), O = E || D, [k, A] = l(!1), [j, M] = l(!1), [N, P] = l(w === void 0 ? "" : String(w)), F = C !== void 0, I = F ? String(C).length > 0 : N.length > 0, L = o((e) => {
144
144
  A(!0), b?.(e);
145
145
  }, [b]), R = o((e) => {
@@ -179,7 +179,7 @@ var g = a(({ label: t, required: r = !1, helpText: i, showHelpText: a = !1, labe
179
179
  children: s
180
180
  }), /* @__PURE__ */ d("span", {
181
181
  className: f.label,
182
- children: [t, r && /* @__PURE__ */ u("span", {
182
+ children: [t, n && /* @__PURE__ */ u("span", {
183
183
  className: f.required,
184
184
  children: " *"
185
185
  })]
@@ -190,7 +190,7 @@ var g = a(({ label: t, required: r = !1, helpText: i, showHelpText: a = !1, labe
190
190
  className: e(f.inputElement, f.selectElement, g),
191
191
  disabled: h,
192
192
  "aria-label": t,
193
- "aria-required": r,
193
+ "aria-required": n,
194
194
  "aria-invalid": p,
195
195
  value: C,
196
196
  defaultValue: w,
@@ -214,7 +214,7 @@ var g = a(({ label: t, required: r = !1, helpText: i, showHelpText: a = !1, labe
214
214
  className: f.rightContent,
215
215
  children: /* @__PURE__ */ u("span", {
216
216
  className: e(f.iconRight, f.chevron),
217
- children: /* @__PURE__ */ u(n, {})
217
+ children: /* @__PURE__ */ u(r, {})
218
218
  })
219
219
  })]
220
220
  })
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./clsx-BWCAbrjV.js";
2
- import { u as t } from "./esm-BnxclXHW.js";
2
+ import { u as t } from "./esm-C4Ybr9s4.js";
3
3
  import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
4
  var i = {
5
5
  attention: "UwHMOW_attention",
@@ -1,7 +1,7 @@
1
1
  import { l as e } from "./utils-K9S_6_Eq.js";
2
2
  import { t } from "./clsx-BWCAbrjV.js";
3
- import { G as n, I as r, Q as i } from "./esm-BnxclXHW.js";
4
- import { t as a } from "./Button-BGsqFCRW.js";
3
+ import { J as n, L as r, tt as i } from "./esm-C4Ybr9s4.js";
4
+ import { t as a } from "./Button-DSGsV45k.js";
5
5
  import { t as o } from "./Icon-VeXJMj8Q.js";
6
6
  import { t as s } from "./Link-CYR92_U0.js";
7
7
  import { t as c } from "./InputSolo-DUdKtZjX.js";
@@ -1,8 +1,8 @@
1
1
  import { t as e } from "./clsx-BWCAbrjV.js";
2
- import { t } from "./esm-BnxclXHW.js";
3
- import { t as n } from "./Button-BGsqFCRW.js";
2
+ import { t } from "./esm-C4Ybr9s4.js";
3
+ import { t as n } from "./Button-DSGsV45k.js";
4
4
  import { t as r } from "./Container-BDssaLig.js";
5
- import { t as i } from "./Label-CgiWi1v6.js";
5
+ import { t as i } from "./Label-BhFeSC8Z.js";
6
6
  import { useEffect as a, useState as o } from "react";
7
7
  import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
8
8
  var u = {
@@ -1,7 +1,7 @@
1
1
  import { d as e, o as t } from "./utils-K9S_6_Eq.js";
2
2
  import { t as n } from "./clsx-BWCAbrjV.js";
3
- import { K as r, T as i, h as a, l as o, w as s } from "./esm-BnxclXHW.js";
4
- import { t as c } from "./Button-BGsqFCRW.js";
3
+ import { T as r, Y as i, h as a, l as o, w as s } from "./esm-C4Ybr9s4.js";
4
+ import { t as c } from "./Button-DSGsV45k.js";
5
5
  import { _ as l, a as u, d, h as f, i as p, l as m, m as h, n as ee, o as g, p as _, r as v, t as y, u as b, y as x } from "./es2015-DWa0ZZ7A.js";
6
6
  import { a as S, i as te, n as C, r as w, t as T } from "./dist-B04QoImH.js";
7
7
  import * as E from "react";
@@ -194,20 +194,20 @@ var oe = P, se = I, ce = R, le = H, ue = W, Q = {
194
194
  };
195
195
  //#endregion
196
196
  //#region lib/components/PrefPanel/index.tsx
197
- function $({ children: e, id: t, ...i }) {
197
+ function $({ children: e, id: t, ...r }) {
198
198
  return /* @__PURE__ */ k(D, { children: [/* @__PURE__ */ O("input", {
199
199
  type: "radio",
200
200
  id: t,
201
201
  className: n(Q.radioInput, "sr-only"),
202
- ...i
202
+ ...r
203
203
  }), /* @__PURE__ */ k("label", {
204
204
  htmlFor: t,
205
205
  className: Q.radio,
206
- children: [e, /* @__PURE__ */ O(r, { className: Q.check })]
206
+ children: [e, /* @__PURE__ */ O(i, { className: Q.check })]
207
207
  })] });
208
208
  }
209
209
  function de() {
210
- let { theme: n, systemTheme: r, setTheme: l } = e(), u = t();
210
+ let { theme: n, systemTheme: i, setTheme: l } = e(), u = t();
211
211
  return /* @__PURE__ */ k(oe, { children: [/* @__PURE__ */ O(ce, {
212
212
  asChild: !0,
213
213
  children: /* @__PURE__ */ k(c, {
@@ -227,9 +227,9 @@ function de() {
227
227
  checked: n === "system",
228
228
  onChange: () => l("system"),
229
229
  children: [
230
- /* @__PURE__ */ O(i, {}),
230
+ /* @__PURE__ */ O(r, {}),
231
231
  "Auto (",
232
- r,
232
+ i,
233
233
  ")"
234
234
  ]
235
235
  }),