@espressif/dashboard-ui-components 1.9.1 → 1.10.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/CHANGELOG.md CHANGED
@@ -4,6 +4,120 @@ All notable changes to this project are documented here. The format is based on
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres
5
5
  to [Semantic Versioning](https://semver.org/).
6
6
 
7
+ ## [1.10.0] - 2026-10-11
8
+
9
+ ### Changed
10
+ - **`TabsList`** — below 768px the list takes the full width, so tabs that
11
+ fit share the row evenly instead of sitting at its start. Tabs that don't
12
+ fit still scroll sideways as before. From 768px up the list stays as wide as
13
+ its tabs. `fullWidth={false}` keeps the old behaviour on small screens.
14
+ - **`ListDetails`** — below 768px the items are now picked from a menu
15
+ button showing the selected title, between previous/next arrows, instead of
16
+ the sideways-scrolling strip. The menu lists every item with the `footer` at
17
+ its bottom, so footer actions such as "Load more" are reachable on phones
18
+ (the strip hid the footer); it stays open while the footer adds items.
19
+ `mobileNavigation="strip"` restores the strip. From 768px up the layout is
20
+ unchanged.
21
+ - **`SearchBox`, `AdvancedSearchBox`** — the search text is 16px below 768px
22
+ (was 12px for `size="sm"`, 14px otherwise), matching `Input`. iOS Safari
23
+ zooms the page into a focused field with smaller text. From 768px up the
24
+ sizes are unchanged.
25
+ - **`PageContainer`** — below the `md` breakpoint (768px), the header region
26
+ (back link, `heading`, `actions`) is no longer always pinned. It scrolls
27
+ away with the content, so phones get the full screen height for the page,
28
+ and slides back in, pinned at the top, when the user scrolls up by 24px
29
+ (see `revealHeadingOnScrollUp`). From 768px up it stays pinned as before.
30
+ `elevateHeading` adds its shadow only where the header is pinned.
31
+ - **`PageContainer`, `ContentContainer`** — padding is `p-3` below 768px and
32
+ `p-6` from 768px up (was `p-6` everywhere), so phones keep more of their
33
+ width for content. A `className` padding override still wins.
34
+ - **`PageContainer`** — the heading row wraps: `actions` that don't fit beside
35
+ the heading move onto their own line, end-aligned, instead of squeezing the
36
+ heading.
37
+ - **`Sheet`** — left and right sheets are capped to the viewport width
38
+ (`max-w-full`); they stay 350px wide where that fits.
39
+ - **`Toast`** — minimum and maximum widths are capped to the viewport width
40
+ minus 2rem, so a toast no longer runs off a 320–360px screen.
41
+ - **`TransferList`** — below 768px the two lists stack, and the move buttons
42
+ sit in a row between them with their arrows pointing down and up.
43
+ - **`DataTable`** — every row now has the named group `group/data-table-row`
44
+ (clickable rows keep their unnamed `group` too).
45
+
46
+ ### Added
47
+ - **`TabsList`** — `fullWidth` (default `true`): stretch the list across the
48
+ row below 768px.
49
+ - **`IconTextActionCard`, `Alert`** — `actionsPlacement="below"` puts the
50
+ `actions` on their own line below the text, end-aligned, at every width.
51
+ The default `"auto"` keeps them beside the text when they fit and wraps them
52
+ below otherwise. On a dismissible `Alert` the close button shares the
53
+ actions' line.
54
+ - **`ListDetails`** — `mobileNavigation` (`"dropdown"` default, or
55
+ `"strip"`) and `labels` (`previousItem`, `nextItem`, `chooseItem`) for the
56
+ small-screen picker's accessible names.
57
+ - **`PageContainer`** — `stickyHeadingOnMobile` keeps the header pinned below
58
+ 768px too, restoring the previous behaviour for a page that needs it.
59
+ - **`PageContainer`** — `revealHeadingOnScrollUp` (default `true`) slides the
60
+ header back in, pinned at the top, when the user scrolls up by 24px on a
61
+ phone, and slides it away again on the next scroll down. Moving keyboard
62
+ focus into the header also reveals it, and it stays while a menu or popover
63
+ inside it is open. Animation follows `prefers-reduced-motion`. Set it to
64
+ `false` to let the header scroll away for good. Ignored when
65
+ `stickyHeadingOnMobile` is set.
66
+ - **`Button`** — `iconOnlyBelow="sm" | "md"` shows only the icons below that
67
+ viewport breakpoint. The label stays in the DOM as screen-reader text, so it
68
+ is still the button's accessible name. Without an `endIcon` the button turns
69
+ square (36px, 40px for `size="lg"`); with one (a menu chevron) only the
70
+ padding tightens.
71
+ - **`FiltersBar`** — lays out a list page's `search`, `actions` and `filters`.
72
+ When the bar is narrower than 768px, search and actions share the first row
73
+ and the filters sit in a second row that scrolls sideways; from 768px up
74
+ everything shares one wrapping row. Without `filters` it is a single row.
75
+ `searchClassName` replaces the default search width.
76
+ - **`CopiableText`** — `hideActionsOnTouch` hides the copy button (and any
77
+ `actions`) on touch screens. Use it in table rows that open a details page
78
+ offering the same copy action, so a tap on the text opens the row.
79
+ - **`DataTableRowActions`** — wrap a row's action cell in it. The actions hide
80
+ until the row is hovered, but only on devices that can hover, so touch
81
+ screens always show them; keyboard focus and an open menu or dialog keep
82
+ them visible. Its clicks and key presses don't reach `onRowClick`, so Enter
83
+ on an action no longer also opens the row. `alwaysVisible` and
84
+ `alwaysVisibleBelow="md"` turn the hiding off everywhere or on narrow
85
+ viewports.
86
+
87
+ ### Fixed
88
+ - **`ComposedChart`** — a series without `yAxisId` no longer crashes the chart
89
+ ("Invariant failed"); it is plotted against the left axis, the documented
90
+ default.
91
+ - **`Dialog`, `FullscreenDialog`** — the close button stacks above the
92
+ dialog's content, so a sticky header inside the content (e.g. a wizard's
93
+ step band with `z-index`) can no longer cover it.
94
+ - **`IconTextActionCard`** (`showActionsOnlyOnHover`), **`CopiableText`**,
95
+ **`KeyValueManager`** table — actions that appeared only on hover were
96
+ invisible on touch screens. They are now hidden only on devices that can
97
+ hover, and `IconTextActionCard` also shows them while focus is inside.
98
+ - **`CopiableText`** — on touch screens the copy button now sits beside the
99
+ text, which truncates before it, instead of covering the end of the text.
100
+ On devices that can hover it still appears over the text on hover.
101
+ - **`SectionCard`** — header `actions` that don't fit beside the title now
102
+ wrap onto their own line instead of squeezing the title down to one
103
+ character per line. The title block keeps at least 12rem (icon included)
104
+ before the actions wrap, and a wrapped actions line isn't padded twice.
105
+ Headers whose actions fit are laid out exactly as before.
106
+ - **Charts** — the legend wraps onto more lines when it's wider than the
107
+ chart, instead of overflowing with its first and last items clipped. Give a
108
+ fixed-height chart room for the extra lines on narrow screens.
109
+ - **`DateRangePicker`** — when the custom-range calendar fits beside the
110
+ preset menu on neither side (phones, narrow windows), or would run past the
111
+ bottom of the screen (phones in landscape), it now opens inside the menu in
112
+ place of the presets, one month wide, capped to the screen height and
113
+ scrollable, instead of off screen.
114
+ Tapping Custom again goes back to the presets. On touch screens a tap on
115
+ Custom now opens the calendar; hover-to-open is limited to a mouse, since
116
+ a tap's emulated hover opened it and the tap itself closed it again.
117
+ - **`IconTextActionCard`, `SimpleClickableCard`** — `truncateTitle` and
118
+ `truncateDescription` now end the text in an ellipsis; the text was clipped
119
+ without one.
120
+
7
121
  ## [1.9.1] - 2026-10-09
8
122
 
9
123
  ### Added
@@ -1,6 +1,6 @@
1
- import { FooterCard, MyAccountMenu, ProfileCard, AppLogo } from './chunk-P6F6UWV2.js';
2
- import { useSidebar, SidebarTrigger, DropdownMenuItem, SidebarProvider, Sidebar2, SidebarInset, parseTextMarkup, isPathPrefixOf, isSidebarGroup } from './chunk-ZFYUONPY.js';
3
- import { Button, Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator } from './chunk-OKB2WTX7.js';
1
+ import { FooterCard, MyAccountMenu, ProfileCard, AppLogo } from './chunk-TMORRNEB.js';
2
+ import { useSidebar, SidebarTrigger, DropdownMenuItem, SidebarProvider, Sidebar2, SidebarInset, parseTextMarkup, isPathPrefixOf, isSidebarGroup } from './chunk-Z4776NRY.js';
3
+ import { Button, Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator } from './chunk-XNLCVHBC.js';
4
4
  import { cn } from './chunk-VU4CZ76T.js';
5
5
  import { Menu, Palette, Check, Globe, LogOut } from 'lucide-react';
6
6
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -1,10 +1,10 @@
1
- import { Separator } from './chunk-OKB2WTX7.js';
1
+ import { Separator } from './chunk-XNLCVHBC.js';
2
2
  import { cn, isPresetColor, resolveColor } from './chunk-VU4CZ76T.js';
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import * as React from 'react';
5
+ import * as PopoverPrimitive from '@radix-ui/react-popover';
5
6
  import * as LabelPrimitive from '@radix-ui/react-label';
6
7
  import { cva } from 'class-variance-authority';
7
- import * as PopoverPrimitive from '@radix-ui/react-popover';
8
8
  import { Slot } from '@radix-ui/react-slot';
9
9
  import { useInView } from 'motion/react';
10
10
 
@@ -503,6 +503,46 @@ var CardFooter = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__
503
503
  }
504
504
  ));
505
505
  CardFooter.displayName = "CardFooter";
506
+ var Popover = PopoverPrimitive.Root;
507
+ var PopoverTrigger = PopoverPrimitive.Trigger;
508
+ var PopoverAnchor = PopoverPrimitive.Anchor;
509
+ var PopoverContent = React.forwardRef(
510
+ ({
511
+ className,
512
+ align = "center",
513
+ sideOffset = 4,
514
+ portal = true,
515
+ onWheel,
516
+ onTouchMove,
517
+ ...props
518
+ }, ref) => {
519
+ const handleWheel = (event) => {
520
+ onWheel?.(event);
521
+ event.stopPropagation();
522
+ };
523
+ const handleTouchMove = (event) => {
524
+ onTouchMove?.(event);
525
+ event.stopPropagation();
526
+ };
527
+ const content = /* @__PURE__ */ jsx(
528
+ PopoverPrimitive.Content,
529
+ {
530
+ ref,
531
+ align,
532
+ sideOffset,
533
+ onWheel: handleWheel,
534
+ onTouchMove: handleTouchMove,
535
+ className: cn(
536
+ "z-50 w-72 rounded-2xl border bg-popover p-4 text-popover-foreground shadow-lg outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]",
537
+ className
538
+ ),
539
+ ...props
540
+ }
541
+ );
542
+ return portal ? /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: content }) : content;
543
+ }
544
+ );
545
+ PopoverContent.displayName = PopoverPrimitive.Content.displayName;
506
546
  var labelVariants = cva(
507
547
  "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
508
548
  );
@@ -613,46 +653,6 @@ function Badge({
613
653
  }
614
654
  );
615
655
  }
616
- var Popover = PopoverPrimitive.Root;
617
- var PopoverTrigger = PopoverPrimitive.Trigger;
618
- var PopoverAnchor = PopoverPrimitive.Anchor;
619
- var PopoverContent = React.forwardRef(
620
- ({
621
- className,
622
- align = "center",
623
- sideOffset = 4,
624
- portal = true,
625
- onWheel,
626
- onTouchMove,
627
- ...props
628
- }, ref) => {
629
- const handleWheel = (event) => {
630
- onWheel?.(event);
631
- event.stopPropagation();
632
- };
633
- const handleTouchMove = (event) => {
634
- onTouchMove?.(event);
635
- event.stopPropagation();
636
- };
637
- const content = /* @__PURE__ */ jsx(
638
- PopoverPrimitive.Content,
639
- {
640
- ref,
641
- align,
642
- sideOffset,
643
- onWheel: handleWheel,
644
- onTouchMove: handleTouchMove,
645
- className: cn(
646
- "z-50 w-72 rounded-2xl border bg-popover p-4 text-popover-foreground shadow-lg outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]",
647
- className
648
- ),
649
- ...props
650
- }
651
- );
652
- return portal ? /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: content }) : content;
653
- }
654
- );
655
- PopoverContent.displayName = PopoverPrimitive.Content.displayName;
656
656
  var buttonGroupVariants = cva(
657
657
  "flex w-fit items-stretch has-[>[data-slot=button-group]]:gap-2 [&>*]:focus-visible:relative [&>*]:focus-visible:z-10 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1",
658
658
  {
@@ -1,6 +1,6 @@
1
- import { ProgressBar } from './chunk-XFYL5IZU.js';
2
- import { Card, CardContent } from './chunk-ABBHGIFI.js';
3
- import { Tooltip2 } from './chunk-ZFYUONPY.js';
1
+ import { ProgressBar } from './chunk-LUESSJAF.js';
2
+ import { Card, CardContent } from './chunk-ALCWXFUC.js';
3
+ import { Tooltip2 } from './chunk-Z4776NRY.js';
4
4
  import { jsx, jsxs } from 'react/jsx-runtime';
5
5
 
6
6
  function CopyrightCard({