@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 +114 -0
- package/dist/{chunk-XW6Z6VO4.js → chunk-2GDYZAKR.js} +3 -3
- package/dist/{chunk-ABBHGIFI.js → chunk-ALCWXFUC.js} +42 -42
- package/dist/{chunk-HIUBSBAP.js → chunk-CDHBLANU.js} +3 -3
- package/dist/{chunk-XFYL5IZU.js → chunk-LUESSJAF.js} +636 -172
- package/dist/{chunk-P6F6UWV2.js → chunk-TMORRNEB.js} +1 -1
- package/dist/{chunk-OKB2WTX7.js → chunk-XNLCVHBC.js} +3 -2
- package/dist/{chunk-ZFYUONPY.js → chunk-Z4776NRY.js} +33 -7
- package/dist/common/index.js +6 -6
- package/dist/components/index.d.ts +159 -43
- package/dist/components/index.js +4 -4
- package/dist/core/index.js +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7 -7
- package/dist/layouts/index.js +4 -4
- package/package.json +1 -1
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-
|
|
2
|
-
import { useSidebar, SidebarTrigger, DropdownMenuItem, SidebarProvider, Sidebar2, SidebarInset, parseTextMarkup, isPathPrefixOf, isSidebarGroup } from './chunk-
|
|
3
|
-
import { Button, Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator } from './chunk-
|
|
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-
|
|
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-
|
|
2
|
-
import { Card, CardContent } from './chunk-
|
|
3
|
-
import { Tooltip2 } from './chunk-
|
|
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({
|