@espressif/dashboard-ui-components 1.2.1 → 1.3.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.
Files changed (34) hide show
  1. package/CHANGELOG.md +154 -0
  2. package/README.md +15 -6
  3. package/dist/{app-logo.props-TKCDuodn.d.ts → app-logo.props-Ct7QBdTd.d.ts} +1 -1
  4. package/dist/{chunk-F5P6S7K2.js → chunk-7BO76CNB.js} +75 -14
  5. package/dist/{chunk-JPMN2UMF.js → chunk-KCMVLNM5.js} +12 -12
  6. package/dist/{chunk-KEMHD3KP.js → chunk-O5BFYRPY.js} +1578 -360
  7. package/dist/{chunk-W2L5GRI2.js → chunk-RCRU3JW2.js} +42 -29
  8. package/dist/{chunk-NHTMHKOR.js → chunk-RKAFXJRD.js} +3 -3
  9. package/dist/{chunk-SYEKNRS5.js → chunk-TSNA6BHK.js} +30 -8
  10. package/dist/{chunk-34PXJOCS.js → chunk-UHRNPXO5.js} +423 -230
  11. package/dist/common/index.d.ts +4 -4
  12. package/dist/common/index.js +6 -6
  13. package/dist/components/index.d.ts +206 -13
  14. package/dist/components/index.js +4 -4
  15. package/dist/core/index.d.ts +2 -2
  16. package/dist/core/index.js +2 -2
  17. package/dist/{index-Cv9vHALn.d.ts → index-BQANnKs9.d.ts} +1 -1
  18. package/dist/index.d.ts +6 -6
  19. package/dist/index.js +7 -7
  20. package/dist/layouts/index.d.ts +27 -7
  21. package/dist/layouts/index.js +4 -4
  22. package/dist/{list.props-DBDJt4C1.d.ts → list.props-x1j3CbcF.d.ts} +1 -1
  23. package/dist/{popover-CRznb4Q7.d.ts → popover-ByLD3-Qv.d.ts} +21 -3
  24. package/dist/{types-B_tam56l.d.ts → types-DtUxK-Am.d.ts} +13 -2
  25. package/dist/utils/index.d.ts +1 -1
  26. package/package.json +4 -1
  27. package/src/assets/logos/launchpad/launchpad-no-text-dm.svg +1 -0
  28. package/src/assets/logos/launchpad/launchpad-no-text.svg +1 -1
  29. package/src/assets/logos/launchpad/launchpad-with-text-dm.svg +1 -1
  30. package/src/assets/logos/launchpad/launchpad-with-text.svg +46 -1
  31. package/src/assets/logos/zerocode-ai/zerocode-ai-no-text.svg +1 -0
  32. package/src/assets/logos/zerocode-ai/zerocode-ai-with-text-dm.svg +186 -0
  33. package/src/assets/logos/zerocode-ai/zerocode-ai-with-text.svg +246 -0
  34. package/src/styles/globals.css +93 -15
package/CHANGELOG.md CHANGED
@@ -4,6 +4,160 @@ 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.3.0] - 2026-09-10
8
+
9
+ A minor release that adds three new components (`NavBar`, `FileInput`,
10
+ `FlashButton`), extends `Separator`, `Link`, `EntryLayout` and `InvertButton`,
11
+ and **renames the `LinkComponent` prop to `linkComponent`** on `Sidebar`,
12
+ `WorkspaceLayout` and `PageContainer` (and `Icon` to `icon` on `StatusBadge`).
13
+ The renames are source-incompatible — see *Changed* for the migration.
14
+
15
+ ### Added
16
+ - **`NavBar`** — new component. A horizontal top navigation bar for
17
+ marketing-style and single-shell apps, as the counterpart to `Sidebar`.
18
+ Items are supplied as `items` (`NavBarMenuItem[]`: `id`, `label`, optional
19
+ `href` / `onClick` / `icon` / `disabled`, and optional `details`); an item
20
+ with `href` renders as a link through `linkComponent` (or a plain `<a>`),
21
+ otherwise as a `<button>`. `logo` and `rightContent` fill the left and right
22
+ slots. Active state is controlled (`activeId` + `onActiveChange`) or
23
+ uncontrolled (`defaultActiveId`). An item with `details` opens a full-width
24
+ dropdown panel below the bar — controlled via `openDetailsId` /
25
+ `onDetailsPanelChange`, closed on Escape or click-outside. Items that do not
26
+ fit are measured and collapsed into a "More" dropdown (`moreLabel`, default
27
+ `"More"`); below the `lg` breakpoint the whole menu moves into a `Sheet`
28
+ (`mobileMenuTitle`, `mobileMenuTrigger`). `position` selects `sticky`
29
+ (default) / `fixed` / `static`, and `height` defaults to the new
30
+ `--espd-navbar-height` token. `morphOnScroll` animates the bar from
31
+ full-width into a floating rounded pill past `morphScrollThreshold` px
32
+ (default `50`), reading `window.scrollY` or the element in
33
+ `morphScrollContainer`; it is disabled on mobile. `color` accents the active
34
+ item and panel highlights (preset token or arbitrary CSS color, default
35
+ `"primary"`), with `className` / `itemsClassName` as style hooks. Rows are
36
+ marked up as a `menubar` with `menuitem` children. Exports: `NavBar`,
37
+ `NavBarProps`, `NavBarMenuItem`, `NavBarPosition`. No new dependencies.
38
+ - **`FileInput`** — new component. A compact, single-line file picker: a
39
+ read-only display area showing the selected file name (plus an "and N more"
40
+ suffix for multi-select) with a browse/change button and a clear button —
41
+ for forms where the large drop target of `FileUpload` is too heavy. Wraps a
42
+ hidden `<input type="file">`, so `accept`, `multiple` and `name` behave
43
+ natively and native form submission still works. Controlled via `files` +
44
+ `onFilesChange`, or uncontrolled; `onChange` also fires with a synthetic
45
+ event whose `target.files` reflects the current list, so
46
+ `react-hook-form`'s `register()` works unchanged. Composes with the standard
47
+ input shell (`label`, `required`, `size`, `rounded`, `color`, `startIcon`,
48
+ `disabled`, `readOnly`, `startHelperContent` / `endHelperContent`,
49
+ `hintContent`, `error` / `errorContent`). Every string is overridable for
50
+ i18n: `browseLabel`, `changeLabel`, `clearLabel`, `placeholder` and
51
+ `andMoreLabel(remaining)`. Exports: `FileInput`, `FileInputProps`. No new
52
+ dependencies.
53
+ - **`FlashButton`** — new component, alongside `InvertButton`. A pill button
54
+ whose fill inverts to `bg-background` on hover while the original color
55
+ blinks back over it at randomised opacity and interval, so no two hovers
56
+ look alike. `label` and an optional `icon` (default `ZapIcon`), with
57
+ `iconPosition` (`"start"` / `"end"`, default `"end"`) and `hideIcon` for a
58
+ label-only chip; `size` and `color` (any `PresetColor`, default `"primary"`)
59
+ match the rest of the button family. Exports: `FlashButton`,
60
+ `FlashButtonProps`. Uses the already-bundled `motion` dependency.
61
+ - `Separator`: `label` renders text between two rules instead of a single
62
+ line — the "OR" divider every auth form hand-rolls. `stackLabel` stacks the
63
+ characters upright for vertical separators, and `labelClassName` overrides
64
+ the label typography. Without `label` the component is byte-for-byte the
65
+ previous single-line Radix separator. The labelled form is a `div` with
66
+ `role="separator"` (Radix `Separator.Root` cannot host children).
67
+ `SeparatorProps` is now exported.
68
+ - `Link`: `variant` — `"ghost"` strips the padding, fixed height and hover
69
+ background that `color` applies, leaving a bare inline anchor that still
70
+ picks up the color token. Default `"default"` keeps the existing pill
71
+ styling. `LinkVariant` is now exported.
72
+ - `EntryLayout`: five new props for entry pages that are not the default
73
+ split-screen — `customRightPanel` (arbitrary content in the right panel,
74
+ overriding `heading` and layered over the background image),
75
+ `disableBackgroundImage` (drops the shipped default background; ignored when
76
+ `backgroundImageUrl` is passed), `hideLogo`, `hideFooter`, and
77
+ `hideRightPanel` (the left panel keeps its 40 % width and centres on
78
+ screen).
79
+ - `InvertButton`: `color` (any `PresetColor`, default `"primary"`) now drives
80
+ the resting fill, the icon's resting/hover colors and the dark-mode hover
81
+ border, and `size` is threaded through to the icon disc. Previously the
82
+ effect was hard-coded to `primary`.
83
+ - `AppLogo`: new `zerocode-ai` preset (light/dark × full/minimal), also
84
+ selectable as `WorkspaceLayout` / `EntryLayout` `appName`.
85
+ - New `--espd-navbar-height` layout token (`4rem`), the default `NavBar`
86
+ height. Override it in `:root` like the other `--espd-*` dimensions.
87
+
88
+ ### Changed
89
+ - **BREAKING:** the router-adapter prop is now `linkComponent` (lower-case
90
+ first letter) everywhere, matching the casing already used by `List`,
91
+ `MarkdownContent` and `NavBar`. Renamed on `Sidebar` (`linkComponent`),
92
+ `WorkspaceLayout` (`sidebarConfig.linkComponent`) and `PageContainer`
93
+ (`goBackLinkData.linkComponent`). The old `LinkComponent` spelling is gone
94
+ rather than deprecated: since it is a required prop on `Sidebar` /
95
+ `sidebarConfig`, TypeScript flags every call site. Migration is a rename —
96
+ `sidebarConfig={{ …, LinkComponent: Link }}` becomes
97
+ `sidebarConfig={{ …, linkComponent: Link }}`.
98
+ - **BREAKING:** `StatusBadge`'s `Icon` prop is renamed to `icon`, for the same
99
+ reason. It stays a `LucideIcon` (a component reference, not an element), so
100
+ `<StatusBadge Icon={CheckIcon} …>` becomes
101
+ `<StatusBadge icon={CheckIcon} …>`.
102
+ - `StatusBadge`: a chip with no icon and no `isLoading` is now padded
103
+ symmetrically. The asymmetric padding (a tight leading edge sized for the
104
+ icon disc) previously applied even when there was no icon, leaving
105
+ label-only chips visually off-centre.
106
+ - `solid` variants no longer set `border-none`; they carry a transparent
107
+ 1px border instead. Every variant of a given component now reserves the
108
+ same border box, so a solid item sitting next to an outline one lines up
109
+ instead of being 2px smaller. Affects every consumer of the shared variant
110
+ table (`Alert`, `Badge`, the card components, …). Visually identical on its
111
+ own; the outer box grows by 1px per side, which can shift a tightly
112
+ hand-tuned layout.
113
+ - `AppLogo`: the `launchpad` preset ships redrawn artwork with corrected
114
+ intrinsic dimensions, and gains a dedicated dark-mode minimal asset
115
+ (previously the light minimal mark was reused in dark mode).
116
+ - Browser autofill styling: autofilled `input` / `textarea` fields now match
117
+ the surrounding theme in both modes instead of Chrome's yellow (or, in dark
118
+ mode, an unreadable dark-on-dark). Implemented with
119
+ `-webkit-box-shadow` / `-webkit-text-fill-color` overrides in the library's
120
+ global stylesheet.
121
+
122
+ ### Internal
123
+ Nothing in this section affects the published package.
124
+
125
+ - ESLint added as a dev dependency (`eslint` 10.10.0, `typescript-eslint`
126
+ 8.70.0) with an `npm run lint` script; the one stale
127
+ `react-hooks/exhaustive-deps` suppression in `Carousel` is now unnecessary
128
+ and was removed.
129
+ - Demo: new pages for `NavBar`, `FileInput` and `FlashButton`; the `Link`,
130
+ `Separator`, `InvertButton`, `AppLogo`, `PageContainer`, `StatusBadge` and
131
+ layout pages were extended for the props above.
132
+
133
+ ## [1.2.2] - 2026-09-02
134
+
135
+ A patch release with layout and component refinements. No breaking changes.
136
+
137
+ ### Added
138
+ - `Sidebar`: `focusActiveGroup` prop — when enabled, only the group containing
139
+ the current route is expanded; other groups collapse automatically whenever
140
+ the active group changes. Users can still expand other groups manually, and
141
+ those manual expansions persist until the active group changes. Useful for
142
+ sidebars with many groups where a fully-expanded tree is noisy. Default
143
+ `false`. Also exposed on `WorkspaceLayout` via
144
+ `sidebarConfig.focusActiveGroup`.
145
+ - `InputOTP`: `expand` prop — when `true`, slots stretch to fill the parent
146
+ width, dividing space equally across groups (each group's `flex-grow` is
147
+ weighted by its slot count so all slots end up the same width). When `false`
148
+ (default), slots use the existing fixed size based on `size`.
149
+
150
+ ### Changed
151
+ - `PageContainer`: the sticky heading strip now uses a translucent background
152
+ with a backdrop blur (`bg-background/75 backdrop-blur-xs`) instead of a solid
153
+ `bg-background`, so content scrolling underneath is subtly visible.
154
+ - `EntryLayout`: reworked scroll behaviour — the outer container is now
155
+ `h-screen overflow-hidden` and the left panel scrolls internally, so the
156
+ background image stays viewport-locked on long forms. The logo is sticky at
157
+ the top of the scroll area with the same translucent backdrop-blur treatment
158
+ as `PageContainer`, and the footer sits at the bottom of the scrollable
159
+ content instead of being pinned to the viewport edge.
160
+
7
161
  ## [1.2.1] - 2026-08-27
8
162
 
9
163
  A patch release that adds one new component (`StatusBadge`). No breaking
package/README.md CHANGED
@@ -185,7 +185,7 @@ All tokens live in the library's [`src/styles/colors.css`](./src/styles/colors.c
185
185
  **Charts** — `--color-chart-1` through `--color-chart-10`, plus `--color-chart-success`, `-error`, `-warning`, `-disabled`, `-gray`, `-primary`, `-secondary`
186
186
 
187
187
  **Layout dimensions** (light and dark share the same value; override in `:root`):
188
- `--espd-sidebar-width`, `--espd-sidebar-width-collapsed`, `--espd-sidebar-width-mobile`, `--espd-header-height`, `--espd-banner-height`, `--espd-footer-height`, `--espd-hidden-footer-height`, `--espd-sidebar-item-font-size`, `--espd-sidebar-flyout-group-label-font-size`
188
+ `--espd-sidebar-width`, `--espd-sidebar-width-collapsed`, `--espd-sidebar-width-mobile`, `--espd-header-height`, `--espd-navbar-height`, `--espd-banner-height`, `--espd-footer-height`, `--espd-hidden-footer-height`, `--espd-sidebar-item-font-size`, `--espd-sidebar-flyout-group-label-font-size`
189
189
 
190
190
  **Typography and radius** — `--font-sans` (whole font stack; override in `@theme` to replace), `--radius-lg` (drives `-md` and `-sm`)
191
191
 
@@ -417,6 +417,11 @@ Re-run after upgrading the library to pick up guidance changes. Commit the copie
417
417
 
418
418
  ## Available Components
419
419
 
420
+ The tables below are a human-readable overview, grouped by surface. They are not
421
+ exhaustive and they do not list props — the authoritative list of exports for the
422
+ version you have installed is the shipped type declarations:
423
+ `node_modules/@espressif/dashboard-ui-components/dist/<surface>/index.d.ts`.
424
+
420
425
  ### Components (`/components`)
421
426
 
422
427
  | Component | Description |
@@ -425,27 +430,30 @@ Re-run after upgrading the library to pick up guidance changes. Commit the copie
425
430
  | Avatar | User avatar with image and fallback |
426
431
  | List / ListGroup / ListItem | Structured list display; rows are buttons by default, or real links when an item sets `href` and `List` is given a `linkComponent` adapter. Styling hooks: `className` / `itemClassName` / `separatorClassName` / `ListGroup.labelClassName` / `ListItem.className`, plus the always-present classes in `LIST_CLASS_NAMES` (`.espd-list`, `.espd-list-group-label`, `.espd-list-item`, `.espd-list-custom-item`, `.espd-list-separator`) |
427
432
  | Sidebar | Collapsible sidebar navigation |
433
+ | NavBar | Horizontal top navigation bar — overflow "More" dropdown, full-width details panels, mobile `Sheet` menu, and an optional scroll-driven morph into a floating pill |
428
434
  | Menu | Context and action menus |
429
435
  | Tooltip | Hover tooltips |
430
436
  | Sheet | Slide-out panel |
431
437
  | Dropdown Menu | Dropdown action menu |
432
438
  | ScrollArea | Custom scrollable container |
433
439
  | Form / Label / Checkbox | Form controls |
434
- | Button / ButtonGroup | Standard and grouped buttons |
440
+ | Button / ButtonGroup / InvertButton / FlashButton | Standard and grouped buttons, plus the invert-on-hover and random-flash pill variants |
435
441
  | Card | Content card container |
436
442
  | Input / InputPassword / Textarea | Text input fields |
443
+ | InputOTP | One-time-code input — grouped slots, numeric or alphanumeric, custom regex |
444
+ | FileUpload / FileInput | Drop-target uploader, and a compact single-line file picker for forms |
437
445
  | AsyncCombobox | Async searchable combobox |
438
446
  | SearchBox / AdvancedSearchBox | Search inputs |
439
447
  | Breadcrumb | Navigation breadcrumbs |
440
- | Separator | Visual divider |
448
+ | Separator | Visual divider, optionally with a centred `label` ("OR" dividers) |
441
449
  | Skeleton / TableSkeleton | Loading placeholders |
442
450
  | Table / DataTable | Data tables with sorting and pagination |
443
451
  | Tabs | Tabbed content panels |
444
452
  | Dialog / ConfirmationDialog / FullscreenDialog | Modal dialogs |
445
453
  | Pagination | Page navigation controls |
446
- | Badge | Status and label badges |
454
+ | Badge / StatusBadge | Status and label badges; `StatusBadge` is the icon-plus-label status chip, with a loading spinner state |
447
455
  | Alert | Alert banners (optionally dismissible) |
448
- | Link | Styled anchor element |
456
+ | Link | Styled anchor element — colour-tinted pill, or `variant="ghost"` for a bare inline link |
449
457
  | Code | Syntax-highlighted code blocks |
450
458
  | MarkdownContent | Renders a markdown string with library primitives (GFM, heading anchors; raw HTML is escaped, not parsed) |
451
459
  | CopiableText / CopyButton | Copy-to-clipboard utilities |
@@ -453,6 +461,7 @@ Re-run after upgrading the library to pick up guidance changes. Commit the copie
453
461
  | Collapsible / CollapsibleCard | Expandable content sections |
454
462
  | SimpleCard / BasicDetailsCard / NoDataCard | Specialized card variants |
455
463
  | PreviewCard | Content preview card |
464
+ | Carousel | Slide carousel — horizontal/vertical, dots, arrows or custom navigation, optional autoplay |
456
465
  | PageContainer | Page wrapper with header |
457
466
  | DynamicList | Dynamic item list |
458
467
  | RequirementList | Met/unmet checklist (password rules, prerequisites); check for satisfied rows, muted circle for outstanding ones, with screen-reader state labels |
@@ -466,7 +475,7 @@ Re-run after upgrading the library to pick up guidance changes. Commit the copie
466
475
  | Component | Description |
467
476
  |-----------|-------------|
468
477
  | WorkspaceLayout | Full dashboard shell with sidebar, header, and footer |
469
- | EntryLayout | Authentication and entry page layout |
478
+ | EntryLayout | Authentication and entry page layout — supports a custom right panel, and hiding the logo, footer, background image or right panel entirely |
470
479
 
471
480
  ### Common (`/common`)
472
481
 
@@ -1,4 +1,4 @@
1
- import { A as AppName } from './index-Cv9vHALn.js';
1
+ import { A as AppName } from './index-BQANnKs9.js';
2
2
 
3
3
  /** A single logo image asset. */
4
4
  interface LogoAsset {
@@ -190,22 +190,83 @@ function useIsMobile() {
190
190
  return !!isMobile;
191
191
  }
192
192
  var Separator = React9.forwardRef(
193
- ({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ jsx(
194
- SeparatorPrimitive.Root,
195
- {
196
- ref,
197
- decorative,
198
- orientation,
199
- className: cn(
200
- "shrink-0 bg-border",
201
- orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
202
- className
203
- ),
204
- ...props
193
+ ({
194
+ className,
195
+ orientation = "horizontal",
196
+ decorative = true,
197
+ label,
198
+ stackLabel = false,
199
+ labelClassName,
200
+ ...props
201
+ }, ref) => {
202
+ if (!label) {
203
+ return /* @__PURE__ */ jsx(
204
+ SeparatorPrimitive.Root,
205
+ {
206
+ ref,
207
+ decorative,
208
+ orientation,
209
+ className: cn(
210
+ "shrink-0 bg-border",
211
+ orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
212
+ className
213
+ ),
214
+ ...props
215
+ }
216
+ );
205
217
  }
206
- )
218
+ const isHorizontal = orientation === "horizontal";
219
+ return /* @__PURE__ */ jsxs(
220
+ "div",
221
+ {
222
+ ref,
223
+ role: "separator",
224
+ "aria-orientation": orientation,
225
+ "data-orientation": orientation,
226
+ className: cn(
227
+ "flex items-center gap-3",
228
+ isHorizontal ? "w-full" : "flex-col h-full",
229
+ className
230
+ ),
231
+ ...props,
232
+ children: [
233
+ /* @__PURE__ */ jsx(
234
+ "div",
235
+ {
236
+ "aria-hidden": "true",
237
+ className: cn(
238
+ "shrink-0 bg-border flex-1",
239
+ isHorizontal ? "h-[1px]" : "w-[1px]"
240
+ )
241
+ }
242
+ ),
243
+ /* @__PURE__ */ jsx(
244
+ "span",
245
+ {
246
+ className: cn(
247
+ "text-xs font-medium text-muted-foreground shrink-0 select-none",
248
+ !isHorizontal && stackLabel && "[writing-mode:vertical-lr] [text-orientation:upright]",
249
+ labelClassName
250
+ ),
251
+ children: label
252
+ }
253
+ ),
254
+ /* @__PURE__ */ jsx(
255
+ "div",
256
+ {
257
+ "aria-hidden": "true",
258
+ className: cn(
259
+ "shrink-0 bg-border flex-1",
260
+ isHorizontal ? "h-[1px]" : "w-[1px]"
261
+ )
262
+ }
263
+ )
264
+ ]
265
+ }
266
+ );
267
+ }
207
268
  );
208
- Separator.displayName = SeparatorPrimitive.Root.displayName;
269
+ Separator.displayName = "Separator";
209
270
  function Skeleton({
210
271
  className,
211
272
  ...props
@@ -1,4 +1,4 @@
1
- import { Separator } from './chunk-F5P6S7K2.js';
1
+ import { Separator } from './chunk-7BO76CNB.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';
@@ -129,7 +129,7 @@ var PRESET_VARIANT_STYLES = {
129
129
  description: "text-primary/80"
130
130
  },
131
131
  solid: {
132
- container: "border-none bg-primary text-primary-foreground [&>svg]:text-primary-foreground",
132
+ container: "border border-transparent bg-primary text-primary-foreground [&>svg]:text-primary-foreground",
133
133
  foreground: "text-primary-foreground",
134
134
  description: "text-primary-foreground/80"
135
135
  },
@@ -151,7 +151,7 @@ var PRESET_VARIANT_STYLES = {
151
151
  description: "text-secondary/80"
152
152
  },
153
153
  solid: {
154
- container: "border-none bg-secondary text-secondary-foreground [&>svg]:text-secondary-foreground",
154
+ container: "border border-transparent bg-secondary text-secondary-foreground [&>svg]:text-secondary-foreground",
155
155
  foreground: "text-secondary-foreground",
156
156
  description: "text-secondary-foreground/80"
157
157
  },
@@ -173,7 +173,7 @@ var PRESET_VARIANT_STYLES = {
173
173
  description: "text-info/80"
174
174
  },
175
175
  solid: {
176
- container: "border-none bg-info text-info-foreground [&>svg]:text-info-foreground",
176
+ container: "border border-transparent bg-info text-info-foreground [&>svg]:text-info-foreground",
177
177
  foreground: "text-info-foreground",
178
178
  description: "text-info-foreground/80"
179
179
  },
@@ -195,7 +195,7 @@ var PRESET_VARIANT_STYLES = {
195
195
  description: "text-warning"
196
196
  },
197
197
  solid: {
198
- container: "border-none bg-warning text-warning-foreground [&>svg]:text-warning-foreground",
198
+ container: "border border-transparent bg-warning text-warning-foreground [&>svg]:text-warning-foreground",
199
199
  foreground: "text-warning-foreground",
200
200
  description: "text-warning-foreground/80"
201
201
  },
@@ -217,7 +217,7 @@ var PRESET_VARIANT_STYLES = {
217
217
  description: "text-error/80"
218
218
  },
219
219
  solid: {
220
- container: "border-none bg-error text-error-foreground [&>svg]:text-error-foreground",
220
+ container: "border border-transparent bg-error text-error-foreground [&>svg]:text-error-foreground",
221
221
  foreground: "text-error-foreground",
222
222
  description: "text-error-foreground/80"
223
223
  },
@@ -239,7 +239,7 @@ var PRESET_VARIANT_STYLES = {
239
239
  description: "text-success/80"
240
240
  },
241
241
  solid: {
242
- container: "border-none bg-success text-success-foreground [&>svg]:text-success-foreground",
242
+ container: "border border-transparent bg-success text-success-foreground [&>svg]:text-success-foreground",
243
243
  foreground: "text-success-foreground",
244
244
  description: "text-success-foreground/80"
245
245
  },
@@ -261,7 +261,7 @@ var PRESET_VARIANT_STYLES = {
261
261
  description: "text-disabled/80"
262
262
  },
263
263
  solid: {
264
- container: "border-none bg-disabled text-disabled-foreground [&>svg]:text-disabled-foreground",
264
+ container: "border border-transparent bg-disabled text-disabled-foreground [&>svg]:text-disabled-foreground",
265
265
  foreground: "text-disabled-foreground",
266
266
  description: "text-disabled-foreground/80"
267
267
  },
@@ -283,7 +283,7 @@ var PRESET_VARIANT_STYLES = {
283
283
  description: "text-gray/80"
284
284
  },
285
285
  solid: {
286
- container: "border-none bg-gray text-gray-foreground [&>svg]:text-gray-foreground",
286
+ container: "border border-transparent bg-gray text-gray-foreground [&>svg]:text-gray-foreground",
287
287
  foreground: "text-gray-foreground",
288
288
  description: "text-gray-foreground/80"
289
289
  },
@@ -305,7 +305,7 @@ var PRESET_VARIANT_STYLES = {
305
305
  description: "text-mist-secondary"
306
306
  },
307
307
  solid: {
308
- container: "border-none bg-mist text-mist-foreground [&>svg]:text-mist-foreground",
308
+ container: "border border-transparent bg-mist text-mist-foreground [&>svg]:text-mist-foreground",
309
309
  foreground: "text-mist-foreground",
310
310
  description: "text-mist-secondary"
311
311
  },
@@ -330,7 +330,7 @@ var SILVER_VARIANT_ROWS = {
330
330
  },
331
331
  solid: {
332
332
  /** Metallic surface gradient layered on top of `bg-gray` via `SILVER_SOLID_SURFACE_STYLE`. */
333
- container: "border-none bg-gray text-gray-foreground [&>svg]:text-gray-foreground",
333
+ container: "border border-transparent bg-gray text-gray-foreground [&>svg]:text-gray-foreground",
334
334
  foreground: "text-gray-foreground",
335
335
  description: "text-gray-foreground/80"
336
336
  },
@@ -377,7 +377,7 @@ function getArbitraryVariantStyles(variant, color) {
377
377
  }
378
378
  if (variant === "solid") {
379
379
  return {
380
- container: "border-none text-white [&>svg]:text-white",
380
+ container: "border border-transparent text-white [&>svg]:text-white",
381
381
  foreground: "text-white",
382
382
  foregroundStyle: { color: "#fff" },
383
383
  description: "text-white/80",