@espressif/dashboard-ui-components 1.0.0 → 1.1.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.
@@ -1,8 +1,8 @@
1
- import { Card, CardHeader, CardTitle, CardDescription, CardContent, Label, Badge, Popover, PopoverTrigger, PopoverContent, resolveVariantStyles, VariantGradientUnderlay, PRESET_GRADIENT_BACKDROP, PRESET_GRADIENT_FRAME, VARIANT_GRADIENT_BACKDROP_BASE, SILVER_GRADIENT_BACKDROP, VARIANT_GRADIENT_HOVER_OVERLAY_CLASS, arbitraryGradientBackgroundImage, SilverShineOverlay, SilverMetallicBorderOverlay, useIsInView } from './chunk-JPMN2UMF.js';
2
- import { Button, Input, Tooltip2, TooltipProvider, inputLabelClassName, CopyButton, Link, Tooltip, TooltipTrigger, TooltipContent, HighlightItem, Slot as Slot$1, Highlight, ScrollArea, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuCheckboxItem } from './chunk-QJVPE3FM.js';
1
+ import { Card, CardHeader, CardTitle, CardDescription, CardContent, Label, Badge, Popover, PopoverTrigger, PopoverContent, resolveVariantStyles, VariantGradientUnderlay, PRESET_GRADIENT_BACKDROP, PRESET_GRADIENT_FRAME, VARIANT_GRADIENT_BACKDROP_BASE, SILVER_GRADIENT_BACKDROP, VARIANT_GRADIENT_HOVER_OVERLAY_CLASS, arbitraryGradientBackgroundImage, SilverShineOverlay, SilverMetallicBorderOverlay, buttonGroupVariants, useIsInView } from './chunk-JPMN2UMF.js';
2
+ import { Button, Input, Tooltip2, TooltipProvider, buttonVariants as buttonVariants$1, inputLabelClassName, CopyButton, Link, Tooltip, TooltipTrigger, TooltipContent, HighlightItem, Slot as Slot$1, Highlight, ScrollArea, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuCheckboxItem } from './chunk-34PXJOCS.js';
3
3
  import { getStrictContext, buttonVariants, Separator, CollapsibleContent, Collapsible, CollapsibleTrigger, Skeleton, Avatar, AvatarFallback, useControlledState } from './chunk-F5P6S7K2.js';
4
4
  import { cn, resolveColor, isPresetColor } from './chunk-VU4CZ76T.js';
5
- import { ChevronDown, ChevronUp, Check, Upload, X, LoaderCircle, Triangle, Info, Search, ClockIcon, Crown, ShieldCheck, Tag as Tag$1, ChevronRight, CircleAlert, FileCheck, CheckCheck, TriangleAlert, CircleX, ChevronsUpDown, ChevronLeftIcon, ChevronRightIcon, ChevronDownIcon, CalendarIcon, CalendarRangeIcon, CheckIcon, ChevronLeft, Columns2, ChevronsRight, ChevronsLeft, XIcon, MoveLeft, CircleIcon, Bolt, Plus, ArrowRight, Trash2, Clock, XCircle, CheckCircle2 } from 'lucide-react';
5
+ import { ChevronDown, ChevronUp, Check, Upload, X, LoaderCircle, Triangle, Info, Search, ClockIcon, Crown, ShieldCheck, Tag as Tag$1, ChevronRight, CircleAlert, Eye, EyeOff, Circle, FileCheck, CheckCheck, TriangleAlert, CircleX, ChevronsUpDown, ChevronLeftIcon, ChevronRightIcon, ChevronDownIcon, CalendarIcon, CalendarRangeIcon, CheckIcon, ChevronLeft, Columns2, ChevronsRight, ChevronsLeft, XIcon, MoveLeft, CircleIcon, Bolt, Plus, ArrowRight, Trash2, Clock, XCircle, CheckCircle2 } from 'lucide-react';
6
6
  import * as React7 from 'react';
7
7
  import { forwardRef, useMemo, isValidElement, useRef, useState, useCallback, useLayoutEffect, useEffect, useId, Fragment as Fragment$1, Children, cloneElement, createElement } from 'react';
8
8
  import { Switch as Switch$1, ToggleGroup as ToggleGroup$1, Dialog as Dialog$1, Accordion as Accordion$1 } from 'radix-ui';
@@ -559,6 +559,7 @@ function SectionCard({
559
559
  icon,
560
560
  primaryText,
561
561
  secondaryText,
562
+ truncateSecondaryText = true,
562
563
  actions,
563
564
  allowCollapse = true,
564
565
  defaultOpen = true,
@@ -593,7 +594,7 @@ function SectionCard({
593
594
  hasIcon && /* @__PURE__ */ jsx(
594
595
  "div",
595
596
  {
596
- className: "flex shrink-0 items-center justify-center",
597
+ className: "flex shrink-0 self-center items-center justify-center",
597
598
  style: variantStyles?.foregroundStyle,
598
599
  children: iconSizedForSection(
599
600
  icon,
@@ -602,8 +603,15 @@ function SectionCard({
602
603
  }
603
604
  ),
604
605
  hasHeaderText && /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
605
- hasPrimaryText && /* @__PURE__ */ jsx("div", { className: primaryClass, style: variantStyles?.foregroundStyle, children: primaryText }),
606
- hasSecondaryText && /* @__PURE__ */ jsx(
606
+ hasPrimaryText && /* @__PURE__ */ jsx(
607
+ "div",
608
+ {
609
+ className: cn("break-words", primaryClass),
610
+ style: variantStyles?.foregroundStyle,
611
+ children: primaryText
612
+ }
613
+ ),
614
+ hasSecondaryText && (truncateSecondaryText ? /* @__PURE__ */ jsx(
607
615
  TruncatedLineWithTooltip,
608
616
  {
609
617
  className: secondaryClass,
@@ -611,7 +619,14 @@ function SectionCard({
611
619
  tooltipContent: secondaryText,
612
620
  children: secondaryText
613
621
  }
614
- )
622
+ ) : /* @__PURE__ */ jsx(
623
+ "span",
624
+ {
625
+ className: cn("block min-w-0 break-words", secondaryClass),
626
+ style: variantStyles?.descriptionStyle,
627
+ children: secondaryText
628
+ }
629
+ ))
615
630
  ] })
616
631
  ] });
617
632
  const chevronButton = /* @__PURE__ */ jsx(CollapsibleTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
@@ -31579,6 +31594,7 @@ function ScrollableSectionsRoot({
31579
31594
  defaultValue,
31580
31595
  scrollRootRef,
31581
31596
  stickyTop = DEFAULT_STICKY_TOP,
31597
+ style,
31582
31598
  ...rest
31583
31599
  }) {
31584
31600
  const { tabsEl, contentEls } = partitionChildren(children);
@@ -31589,6 +31605,7 @@ function ScrollableSectionsRoot({
31589
31605
  );
31590
31606
  const sectionsRef = React7.useRef(/* @__PURE__ */ new Map());
31591
31607
  const containerRef = React7.useRef(null);
31608
+ const mobileNavRef = React7.useRef(null);
31592
31609
  const ignoreSpyUntil = React7.useRef(0);
31593
31610
  const prefersReducedMotionRef = React7.useRef(false);
31594
31611
  const didDefaultScrollRef = React7.useRef(false);
@@ -31654,12 +31671,15 @@ function ScrollableSectionsRoot({
31654
31671
  if (orderedIds.length === 0) return;
31655
31672
  const updateActive = () => {
31656
31673
  if (Date.now() < ignoreSpyUntil.current) return;
31674
+ const bar = mobileNavRef.current;
31675
+ const barBottom = bar && bar.offsetHeight > 0 ? bar.getBoundingClientRect().bottom : 0;
31676
+ const threshold = barBottom + SPY_TOP_LEEWAY_PX;
31657
31677
  let next = orderedIds[0];
31658
31678
  for (const id of orderedIds) {
31659
31679
  const el = sectionsRef.current.get(id);
31660
31680
  if (!el) continue;
31661
31681
  const top = el.getBoundingClientRect().top;
31662
- if (top <= SPY_TOP_LEEWAY_PX) next = id;
31682
+ if (top <= threshold) next = id;
31663
31683
  }
31664
31684
  setActiveId((prev) => prev === next ? prev : next);
31665
31685
  };
@@ -31696,6 +31716,10 @@ function ScrollableSectionsRoot({
31696
31716
  "flex flex-col gap-4 md:flex-row md:items-stretch md:gap-6",
31697
31717
  className
31698
31718
  ),
31719
+ style: {
31720
+ ...style,
31721
+ "--espd-ss-sticky-top": stickyTop
31722
+ },
31699
31723
  ...rest,
31700
31724
  children: [
31701
31725
  tabsEl ? /* @__PURE__ */ jsx("div", { className: "hidden md:flex md:w-[30%] md:max-w-[30%] md:shrink-0 md:flex-col md:items-start", children: /* @__PURE__ */ jsx(
@@ -31707,17 +31731,31 @@ function ScrollableSectionsRoot({
31707
31731
  }
31708
31732
  ) }) : null,
31709
31733
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-4 md:w-[70%]", children: [
31710
- tabsItems.length > 0 && safeActiveId ? /* @__PURE__ */ jsx("div", { className: "md:hidden", children: /* @__PURE__ */ jsxs(
31711
- Select,
31712
- {
31713
- value: safeActiveId,
31714
- onValueChange: selectSection,
31715
- children: [
31716
- /* @__PURE__ */ jsx(SelectTrigger, { className: "w-full", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "Section" }) }),
31717
- /* @__PURE__ */ jsx(SelectContent, { children: tabsItems.map((item) => /* @__PURE__ */ jsx(SelectItem, { value: item.id, children: item.label }, item.id)) })
31718
- ]
31719
- }
31720
- ) }) : null,
31734
+ tabsItems.length > 0 && safeActiveId ? (
31735
+ // Sticky on mobile for the same reason the tab strip is sticky on
31736
+ // desktop: it is both the section switcher and the position indicator.
31737
+ // `bg-background` and `pb-2` keep content from showing through as it
31738
+ // scrolls underneath.
31739
+ /* @__PURE__ */ jsx(
31740
+ "div",
31741
+ {
31742
+ ref: mobileNavRef,
31743
+ className: "sticky z-10 bg-background pb-2 md:hidden",
31744
+ style: { top: stickyTop },
31745
+ children: /* @__PURE__ */ jsxs(
31746
+ Select,
31747
+ {
31748
+ value: safeActiveId,
31749
+ onValueChange: selectSection,
31750
+ children: [
31751
+ /* @__PURE__ */ jsx(SelectTrigger, { className: "w-full text-sm font-medium", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "Section" }) }),
31752
+ /* @__PURE__ */ jsx(SelectContent, { children: tabsItems.map((item) => /* @__PURE__ */ jsx(SelectItem, { value: item.id, children: item.label }, item.id)) })
31753
+ ]
31754
+ }
31755
+ )
31756
+ }
31757
+ )
31758
+ ) : null,
31721
31759
  /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-8", children: contentEls })
31722
31760
  ] })
31723
31761
  ]
@@ -31782,7 +31820,9 @@ function ScrollableSectionsTabs({
31782
31820
  value: id,
31783
31821
  type: "button",
31784
31822
  className: cn(
31785
- "h-auto min-h-9 w-full flex-none justify-start py-2",
31823
+ // `whitespace-normal` overrides the tabs base class so long labels
31824
+ // wrap inside the narrow column instead of overflowing it.
31825
+ "h-auto min-h-9 w-full min-w-0 flex-none justify-start py-2 text-left whitespace-normal",
31786
31826
  tabClassName
31787
31827
  ),
31788
31828
  children: tabChildren != null ? tabChildren : text
@@ -31818,7 +31858,12 @@ function ScrollableSectionsContent({
31818
31858
  {
31819
31859
  ref,
31820
31860
  id,
31821
- className: cn("scroll-mt-4", className),
31861
+ className: cn(
31862
+ // Below `md` the sticky select overlays the content, so sections have to
31863
+ // land below it: sticky offset + the bar's own height (h-10 + pb-2).
31864
+ "scroll-mt-[calc(var(--espd-ss-sticky-top,1rem)+3rem)] md:scroll-mt-4",
31865
+ className
31866
+ ),
31822
31867
  ...rest,
31823
31868
  children
31824
31869
  }
@@ -38325,7 +38370,10 @@ function Pagination({
38325
38370
  ] }) }) : /* @__PURE__ */ jsx("div", { className: "flex flex-1" })
38326
38371
  ] });
38327
38372
  }
38328
- function CopiableText({ text, className }) {
38373
+
38374
+ // src/components/pagination/pagination.props.ts
38375
+ var DEFAULT_PAGE_SIZE_OPTIONS = [5, 10, 15, 20, 25];
38376
+ function CopiableText({ text, actions, alwaysShowActions = false, className }) {
38329
38377
  const content2 = typeof text === "number" ? String(text) : text;
38330
38378
  return /* @__PURE__ */ jsxs(
38331
38379
  "span",
@@ -38336,22 +38384,29 @@ function CopiableText({ text, className }) {
38336
38384
  ),
38337
38385
  children: [
38338
38386
  /* @__PURE__ */ jsx("span", { className: "block min-w-0 flex-1 truncate", children: content2 }),
38339
- /* @__PURE__ */ jsx(
38387
+ /* @__PURE__ */ jsxs(
38340
38388
  "span",
38341
38389
  {
38342
- className: "absolute right-0 top-1/2 flex -translate-y-1/2 items-center opacity-0 transition-opacity group-hover/copiable-text:opacity-100 group-focus-within/copiable-text:opacity-100",
38390
+ role: actions != null ? "group" : void 0,
38391
+ className: cn(
38392
+ buttonGroupVariants(),
38393
+ alwaysShowActions ? "ml-2 shrink-0" : "absolute right-0 top-1/2 -translate-y-1/2 opacity-0 transition-opacity group-hover/copiable-text:opacity-100 group-focus-within/copiable-text:opacity-100"
38394
+ ),
38343
38395
  onClick: (e) => e.stopPropagation(),
38344
- children: /* @__PURE__ */ jsx(
38345
- CopyButton,
38346
- {
38347
- content: content2,
38348
- className: "size-6",
38349
- variant: "outline",
38350
- size: "sm",
38351
- hoverScale: 1,
38352
- tapScale: 0.9
38353
- }
38354
- )
38396
+ children: [
38397
+ actions,
38398
+ /* @__PURE__ */ jsx(
38399
+ CopyButton,
38400
+ {
38401
+ content: content2,
38402
+ className: "size-6",
38403
+ variant: "outline",
38404
+ size: "sm",
38405
+ hoverScale: 1,
38406
+ tapScale: 0.9
38407
+ }
38408
+ )
38409
+ ]
38355
38410
  }
38356
38411
  )
38357
38412
  ]
@@ -38479,7 +38534,6 @@ function DataTableBody({
38479
38534
  row.id
38480
38535
  )) });
38481
38536
  }
38482
- var PAGE_SIZE_OPTIONS = [5, 10, 15, 20, 25];
38483
38537
  function DataTable({
38484
38538
  columns,
38485
38539
  data,
@@ -38492,6 +38546,7 @@ function DataTable({
38492
38546
  onPrevPage,
38493
38547
  pageSize = 5,
38494
38548
  onPageSizeChange,
38549
+ pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,
38495
38550
  showColumnVisibilitySelector = true,
38496
38551
  columnVisibilityLabel = "Columns",
38497
38552
  noResultsHeading = "No results",
@@ -38589,6 +38644,11 @@ function DataTable({
38589
38644
  columnVisibilityCheckedState: checkedState
38590
38645
  };
38591
38646
  }, [columns, columnVisibility]);
38647
+ const canChangePageSize = Boolean(onPageSizeChange);
38648
+ const resolvedPageSizeOptions = useMemo(() => {
38649
+ if (!canChangePageSize || pageSizeOptions.length === 0) return [];
38650
+ return pageSizeOptions.includes(pageSize) ? pageSizeOptions : [...pageSizeOptions, pageSize].sort((a, b) => a - b);
38651
+ }, [canChangePageSize, pageSizeOptions, pageSize]);
38592
38652
  const showToolbar = tableActionsContent || showColumnVisibilitySelector;
38593
38653
  return /* @__PURE__ */ jsxs("div", { className: cn("space-y-3", className), children: [
38594
38654
  showToolbar && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 data-table-toolbar", children: [
@@ -38653,7 +38713,7 @@ function DataTable({
38653
38713
  hasNextPage,
38654
38714
  disabled: isFetching,
38655
38715
  currentPageSize: pageSize,
38656
- pageSizeOptions: PAGE_SIZE_OPTIONS,
38716
+ pageSizeOptions: resolvedPageSizeOptions,
38657
38717
  pageSizeOptionLabel,
38658
38718
  onPageSizeChange: (size) => onPageSizeChange?.(size)
38659
38719
  }
@@ -40682,6 +40742,11 @@ function defaultIconFromColor(color) {
40682
40742
  const t = SEMANTIC_COLOR_TO_TYPE[color];
40683
40743
  return t != null ? typeIconMap[t] : void 0;
40684
40744
  }
40745
+ var dismissButtonSizeClasses = {
40746
+ sm: "size-6 [&_svg]:size-3.5",
40747
+ default: "size-7 [&_svg]:size-4",
40748
+ lg: "size-8 [&_svg]:size-4"
40749
+ };
40685
40750
  var Alert = React7.forwardRef(
40686
40751
  ({
40687
40752
  icon,
@@ -40696,14 +40761,42 @@ var Alert = React7.forwardRef(
40696
40761
  hideIcon = false,
40697
40762
  action,
40698
40763
  actions,
40764
+ dismissible = false,
40765
+ onDismiss,
40766
+ dismissLabel = "Close alert",
40699
40767
  className
40700
40768
  }, ref) => {
40769
+ const [dismissed, setDismissed] = React7.useState(false);
40770
+ const handleDismiss = React7.useCallback(() => {
40771
+ setDismissed(true);
40772
+ onDismiss?.();
40773
+ }, [onDismiss]);
40701
40774
  const resolvedColor = color ?? (type != null ? typeColorMap[type] : void 0) ?? "primary";
40702
40775
  const resolvedDescription = description != null && children != null ? /* @__PURE__ */ jsxs(Fragment, { children: [
40703
40776
  description,
40704
40777
  children
40705
40778
  ] }) : description ?? children;
40706
40779
  const resolvedIcon = hideIcon ? void 0 : icon ?? (type != null ? typeIconMap[type] : void 0) ?? defaultIconFromColor(resolvedColor) ?? /* @__PURE__ */ jsx(CircleAlert, { className: "h-4 w-4" });
40780
+ const dismissButton = dismissible ? /* @__PURE__ */ jsx(
40781
+ "button",
40782
+ {
40783
+ type: "button",
40784
+ "aria-label": dismissLabel,
40785
+ onClick: handleDismiss,
40786
+ className: cn(
40787
+ buttonVariants({ variant: "ghost", size: "icon" }),
40788
+ dismissButtonSizeClasses[size],
40789
+ "shrink-0 text-current opacity-70 hover:bg-current/10 hover:text-current hover:opacity-100"
40790
+ ),
40791
+ children: /* @__PURE__ */ jsx(X, { "aria-hidden": true, strokeWidth: 2 })
40792
+ }
40793
+ ) : null;
40794
+ const providedActions = actions ?? action;
40795
+ const resolvedActions = dismissButton == null ? providedActions : providedActions == null ? dismissButton : /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
40796
+ providedActions,
40797
+ dismissButton
40798
+ ] });
40799
+ if (dismissed) return null;
40707
40800
  return /* @__PURE__ */ jsx(
40708
40801
  IconTextActionCard,
40709
40802
  {
@@ -40715,7 +40808,7 @@ var Alert = React7.forwardRef(
40715
40808
  iconAvatarVariant,
40716
40809
  size,
40717
40810
  variant,
40718
- actions: actions ?? action,
40811
+ actions: resolvedActions,
40719
40812
  className
40720
40813
  }
40721
40814
  );
@@ -41126,14 +41219,37 @@ function Code({
41126
41219
  );
41127
41220
  }
41128
41221
  var MonospaceContent = React7.forwardRef(
41129
- function MonospaceContent2({ title, value, color = "info", className }, ref) {
41222
+ function MonospaceContent2({ title, value, color = "info", mask = false, allowUnmask = true, className }, ref) {
41223
+ const [revealed, setRevealed] = React7.useState(false);
41224
+ const canUnmask = mask && allowUnmask;
41225
+ const masked = mask && !(canUnmask && revealed);
41226
+ const unmaskToggle = canUnmask ? /* @__PURE__ */ jsxs(
41227
+ "button",
41228
+ {
41229
+ type: "button",
41230
+ "aria-pressed": !masked,
41231
+ onClick: () => setRevealed((prev) => !prev),
41232
+ className: cn(buttonVariants$1({ variant: "outline", size: "sm" }), "size-6"),
41233
+ children: [
41234
+ masked ? /* @__PURE__ */ jsx(Eye, { "aria-hidden": true }) : /* @__PURE__ */ jsx(EyeOff, { "aria-hidden": true }),
41235
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: masked ? "Show value" : "Hide value" })
41236
+ ]
41237
+ }
41238
+ ) : void 0;
41130
41239
  return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex min-w-0 max-w-full flex-col gap-2 overflow-hidden", className), children: [
41131
41240
  title != null && (typeof title === "string" ? /* @__PURE__ */ jsx("div", { className: cn(inputLabelClassName, "title"), children: title }) : /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", as: "div", className: cn(inputLabelClassName, "title"), children: title })),
41132
41241
  /* @__PURE__ */ jsx(Alert, { variant: "soft", color, type: "info", hideIcon: true, className: cn("min-w-0 max-w-full", "content"), children: /* @__PURE__ */ jsx(
41133
41242
  CopiableText,
41134
41243
  {
41135
41244
  text: value,
41136
- className: "w-full min-w-0 max-w-full font-mono tabular-nums"
41245
+ actions: unmaskToggle,
41246
+ alwaysShowActions: mask,
41247
+ className: cn(
41248
+ "w-full min-w-0 max-w-full font-mono tabular-nums",
41249
+ // `-webkit-text-security` is inherited, so it reaches the text span while the
41250
+ // real value stays intact for the copy button.
41251
+ masked && "select-none [-webkit-text-security:disc]"
41252
+ )
41137
41253
  }
41138
41254
  ) })
41139
41255
  ] });
@@ -41718,7 +41834,7 @@ function DynamicList({
41718
41834
  const keyWidthPct = Math.min(100, Math.max(1, keyWidth));
41719
41835
  const valueWidthPct = 100 - keyWidthPct;
41720
41836
  const resolveOpts = { useIconsForBoolean };
41721
- const sizeStyles8 = DYNAMIC_LIST_SIZE_STYLES[size];
41837
+ const sizeStyles9 = DYNAMIC_LIST_SIZE_STYLES[size];
41722
41838
  if (simple) {
41723
41839
  return /* @__PURE__ */ jsx(
41724
41840
  SimpleList,
@@ -41739,7 +41855,7 @@ function DynamicList({
41739
41855
  }
41740
41856
  );
41741
41857
  }
41742
- return /* @__PURE__ */ jsx("div", { className: cn("flex flex-col", sizeStyles8.listGap, className), children: items.map(({ key, value }) => {
41858
+ return /* @__PURE__ */ jsx("div", { className: cn("flex flex-col", sizeStyles9.listGap, className), children: items.map(({ key, value }) => {
41743
41859
  const rowMeta = meta?.[key];
41744
41860
  const effectiveType = resolveEffectiveType(key, value, rowMeta);
41745
41861
  const labelText = resolveRowLabel(key, rowMeta, verbatimKeyLabels);
@@ -41757,7 +41873,7 @@ function DynamicList({
41757
41873
  value,
41758
41874
  key
41759
41875
  );
41760
- const rowIcon = resolveLegacyRowIcon(rowMeta, sizeStyles8.rowIcon);
41876
+ const rowIcon = resolveLegacyRowIcon(rowMeta, sizeStyles9.rowIcon);
41761
41877
  const hasTypedOrEffectiveMetaLayout = effectiveType != null;
41762
41878
  const rendersPlainStringBadges = !rowMeta?.valueRender && !rowMeta?.valueFormatter && isPlainStringArray(value);
41763
41879
  const usesDefaultStructuredCode = rowUsesDefaultStructuredCode(
@@ -41771,14 +41887,14 @@ function DynamicList({
41771
41887
  return /* @__PURE__ */ jsxs(
41772
41888
  "div",
41773
41889
  {
41774
- className: cn("flex w-full min-w-0 items-center", sizeStyles8.rowGap),
41890
+ className: cn("flex w-full min-w-0 items-center", sizeStyles9.rowGap),
41775
41891
  children: [
41776
- !hideIcon && /* @__PURE__ */ jsx(Avatar, { className: sizeStyles8.avatarSize, children: /* @__PURE__ */ jsx(
41892
+ !hideIcon && /* @__PURE__ */ jsx(Avatar, { className: sizeStyles9.avatarSize, children: /* @__PURE__ */ jsx(
41777
41893
  AvatarFallback,
41778
41894
  {
41779
41895
  className: cn(
41780
41896
  "flex items-center justify-center gap-1 border",
41781
- sizeStyles8.avatarFallbackTypography
41897
+ sizeStyles9.avatarFallbackTypography
41782
41898
  ),
41783
41899
  children: rowIcon
41784
41900
  }
@@ -41796,7 +41912,7 @@ function DynamicList({
41796
41912
  {
41797
41913
  className: cn(
41798
41914
  "truncate",
41799
- sizeStyles8.labelTypography,
41915
+ sizeStyles9.labelTypography,
41800
41916
  labelClassName
41801
41917
  ),
41802
41918
  style: { flex: `0 0 ${keyWidthPct}%` },
@@ -41808,7 +41924,7 @@ function DynamicList({
41808
41924
  {
41809
41925
  className: cn(
41810
41926
  "flex min-w-0 justify-end text-muted-foreground",
41811
- sizeStyles8.valueTypography,
41927
+ sizeStyles9.valueTypography,
41812
41928
  usesBadgeArrayLayout ? "flex-1 items-start pt-0.5 text-start" : "items-center"
41813
41929
  ),
41814
41930
  style: { flex: `0 0 ${valueWidthPct}%` },
@@ -41838,8 +41954,8 @@ function DynamicList({
41838
41954
  BasicDetailsCard,
41839
41955
  {
41840
41956
  icon: hideIcon ? void 0 : rowIcon,
41841
- primaryText: /* @__PURE__ */ jsx("span", { className: cn(sizeStyles8.labelTypography, labelClassName), children: labelText }),
41842
- secondaryText: /* @__PURE__ */ jsx("span", { className: cn(sizeStyles8.valueTypography, valueClassName), children: valueDisplay })
41957
+ primaryText: /* @__PURE__ */ jsx("span", { className: cn(sizeStyles9.labelTypography, labelClassName), children: labelText }),
41958
+ secondaryText: /* @__PURE__ */ jsx("span", { className: cn(sizeStyles9.valueTypography, valueClassName), children: valueDisplay })
41843
41959
  },
41844
41960
  key
41845
41961
  );
@@ -41847,26 +41963,26 @@ function DynamicList({
41847
41963
  return /* @__PURE__ */ jsxs(
41848
41964
  "div",
41849
41965
  {
41850
- className: cn("flex min-w-0 items-start", sizeStyles8.rowGap),
41966
+ className: cn("flex min-w-0 items-start", sizeStyles9.rowGap),
41851
41967
  children: [
41852
- !hideIcon && /* @__PURE__ */ jsx(Avatar, { className: sizeStyles8.avatarSize, children: /* @__PURE__ */ jsx(
41968
+ !hideIcon && /* @__PURE__ */ jsx(Avatar, { className: sizeStyles9.avatarSize, children: /* @__PURE__ */ jsx(
41853
41969
  AvatarFallback,
41854
41970
  {
41855
41971
  className: cn(
41856
41972
  "flex items-center justify-center gap-1 border",
41857
- sizeStyles8.avatarFallbackTypography
41973
+ sizeStyles9.avatarFallbackTypography
41858
41974
  ),
41859
41975
  children: rowIcon
41860
41976
  }
41861
41977
  ) }),
41862
- /* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 flex-1 flex-col", sizeStyles8.itemGap), children: [
41863
- /* @__PURE__ */ jsx("span", { className: cn(sizeStyles8.labelTypography, labelClassName), children: labelText }),
41978
+ /* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 flex-1 flex-col", sizeStyles9.itemGap), children: [
41979
+ /* @__PURE__ */ jsx("span", { className: cn(sizeStyles9.labelTypography, labelClassName), children: labelText }),
41864
41980
  /* @__PURE__ */ jsx(
41865
41981
  "div",
41866
41982
  {
41867
41983
  className: cn(
41868
41984
  "min-w-0",
41869
- sizeStyles8.valueTypography,
41985
+ sizeStyles9.valueTypography,
41870
41986
  valueClassName
41871
41987
  ),
41872
41988
  children: valueDisplay
@@ -42206,6 +42322,80 @@ function KeyValueManager({
42206
42322
  )
42207
42323
  ] });
42208
42324
  }
42325
+ var stateVisuals3 = {
42326
+ met: {
42327
+ icon: Check,
42328
+ textClass: "text-success"
42329
+ },
42330
+ unmet: {
42331
+ icon: Circle,
42332
+ textClass: "text-muted-foreground"
42333
+ }
42334
+ };
42335
+ var sizeStyles8 = {
42336
+ sm: {
42337
+ text: "text-xs",
42338
+ icon: "h-3.5 w-3.5 shrink-0",
42339
+ gap: "gap-2",
42340
+ rowGap: "gap-1"
42341
+ },
42342
+ default: {
42343
+ text: "text-sm",
42344
+ icon: "size-4 shrink-0",
42345
+ gap: "gap-2",
42346
+ rowGap: "gap-1.5"
42347
+ },
42348
+ lg: {
42349
+ text: "text-base",
42350
+ icon: "size-5 shrink-0",
42351
+ gap: "gap-2.5",
42352
+ rowGap: "gap-2"
42353
+ }
42354
+ };
42355
+ var RequirementList = forwardRef(
42356
+ function RequirementList2({
42357
+ items,
42358
+ size = "sm",
42359
+ metLabel = "Requirement met",
42360
+ unmetLabel = "Requirement not met",
42361
+ live = true,
42362
+ className,
42363
+ ...rest
42364
+ }, ref) {
42365
+ const styles = sizeStyles8[size];
42366
+ return /* @__PURE__ */ jsx(
42367
+ "ul",
42368
+ {
42369
+ ref,
42370
+ "aria-live": live ? "polite" : void 0,
42371
+ ...rest,
42372
+ className: cn("flex flex-col", styles.rowGap, className),
42373
+ children: items.map((item) => {
42374
+ const visuals = stateVisuals3[item.met ? "met" : "unmet"];
42375
+ const Icon2 = visuals.icon;
42376
+ return /* @__PURE__ */ jsxs(
42377
+ "li",
42378
+ {
42379
+ className: cn(
42380
+ "flex items-center transition-colors",
42381
+ styles.gap,
42382
+ styles.text,
42383
+ visuals.textClass
42384
+ ),
42385
+ children: [
42386
+ /* @__PURE__ */ jsx(Icon2, { className: styles.icon, "aria-hidden": true }),
42387
+ item.label,
42388
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: item.met ? metLabel : unmetLabel })
42389
+ ]
42390
+ },
42391
+ item.id
42392
+ );
42393
+ })
42394
+ }
42395
+ );
42396
+ }
42397
+ );
42398
+ RequirementList.displayName = "RequirementList";
42209
42399
  var SIZE_STYLES3 = {
42210
42400
  sm: {
42211
42401
  rowPad: "py-2",
@@ -49033,4 +49223,4 @@ function PageContainerSkeleton({
49033
49223
  );
49034
49224
  }
49035
49225
 
49036
- export { Accordion3 as Accordion, AdvancedSearchBox, Alert, AnimatedCard, AnimatedRainmakerLogo, AreaChart, AsyncCombobox, AsyncMultiSelect, BarChart, BasicDetailsCard, CHART_CATEGORY_COLORS, CHART_SERIES_COLORS, Calendar, CalendarDayButton, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox2 as Checkbox, CircularProgress, Code, CollapsibleCard, ComposedChart, ConfirmationDialog, ContentContainer, CopiableText, DEFAULT_CHART_SERIES_COLORS, DataTable, DatePicker, DateRangePicker, DeviceIcon, Dialog2 as Dialog, DialogClose2 as DialogClose, DialogContent2 as DialogContent, DialogDescription2 as DialogDescription, DialogFooter2 as DialogFooter, DialogHeader2 as DialogHeader, DialogTitle2 as DialogTitle, DialogTrigger2 as DialogTrigger, DonutChart, DynamicList, FileUpload, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, FullSizeError, FullscreenDialog, IconAvatar, IconTextActionCard, Illustration, InlineError, KeyValueManager, LineChart, ListDetails, LottieAnimationContainer, MarkdownContent, MonospaceContent, OverflowBadgeList, PRESET_IDS, PRESET_LABELS, PageContainer, PageContainerSkeleton, Pagination, PopCollectionItem, PreviewCard2 as PreviewCard, PreviewCardBackdrop2 as PreviewCardBackdrop, PreviewCardPanel, PreviewCardTrigger2 as PreviewCardTrigger, ProgressBar, RadioGroup3 as RadioGroup, ScrollableSections, SearchBox, SectionCard, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SelectableCardList, SimpleCard, SimpleClickableCard, SimpleInfoCard, SimpleList, SimplePaginatedList, SimplifiedDate, Spinner, StatCard, StatusCardList, Switch2 as Switch, TYPOGRAPHY_VARIANTS, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, TableSkeleton, Tabs2 as Tabs, TabsContent2 as TabsContent, TabsContents2 as TabsContents, TabsList2 as TabsList, TabsTrigger2 as TabsTrigger, Tag, TagInput, Textarea, TimePicker, Toast, Toaster, TogglableItemsList, ToggleGroup2 as ToggleGroup, ToggleGroupItem2 as ToggleGroupItem, TransferList, TreemapChart, Typography, UserTypeBadge, VerificationInProgress, VerticalStepper, animatedCardAnimations, animatedCardTypeKeys, buildSeriesChartConfig, computeDateRange, getChartSeriesColor, illustrationRegistry, illustrationsById, no_data_card_default, parseSvgViewBoxAspectRatio, toast, typographyDefaultElement, typographyVariantClasses, useFormField, userTypeBadgeRegistry, userTypeBadgeSizeVariants, userTypeBadgeUserTypes };
49226
+ export { Accordion3 as Accordion, AdvancedSearchBox, Alert, AnimatedCard, AnimatedRainmakerLogo, AreaChart, AsyncCombobox, AsyncMultiSelect, BarChart, BasicDetailsCard, CHART_CATEGORY_COLORS, CHART_SERIES_COLORS, Calendar, CalendarDayButton, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, Checkbox2 as Checkbox, CircularProgress, Code, CollapsibleCard, ComposedChart, ConfirmationDialog, ContentContainer, CopiableText, DEFAULT_CHART_SERIES_COLORS, DEFAULT_PAGE_SIZE_OPTIONS, DataTable, DatePicker, DateRangePicker, DeviceIcon, Dialog2 as Dialog, DialogClose2 as DialogClose, DialogContent2 as DialogContent, DialogDescription2 as DialogDescription, DialogFooter2 as DialogFooter, DialogHeader2 as DialogHeader, DialogTitle2 as DialogTitle, DialogTrigger2 as DialogTrigger, DonutChart, DynamicList, FileUpload, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, FullSizeError, FullscreenDialog, IconAvatar, IconTextActionCard, Illustration, InlineError, KeyValueManager, LineChart, ListDetails, LottieAnimationContainer, MarkdownContent, MonospaceContent, OverflowBadgeList, PRESET_IDS, PRESET_LABELS, PageContainer, PageContainerSkeleton, Pagination, PopCollectionItem, PreviewCard2 as PreviewCard, PreviewCardBackdrop2 as PreviewCardBackdrop, PreviewCardPanel, PreviewCardTrigger2 as PreviewCardTrigger, ProgressBar, RadioGroup3 as RadioGroup, RequirementList, ScrollableSections, SearchBox, SectionCard, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SelectableCardList, SimpleCard, SimpleClickableCard, SimpleInfoCard, SimpleList, SimplePaginatedList, SimplifiedDate, Spinner, StatCard, StatusCardList, Switch2 as Switch, TYPOGRAPHY_VARIANTS, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, TableSkeleton, Tabs2 as Tabs, TabsContent2 as TabsContent, TabsContents2 as TabsContents, TabsList2 as TabsList, TabsTrigger2 as TabsTrigger, Tag, TagInput, Textarea, TimePicker, Toast, Toaster, TogglableItemsList, ToggleGroup2 as ToggleGroup, ToggleGroupItem2 as ToggleGroupItem, TransferList, TreemapChart, Typography, UserTypeBadge, VerificationInProgress, VerticalStepper, animatedCardAnimations, animatedCardTypeKeys, buildSeriesChartConfig, computeDateRange, getChartSeriesColor, illustrationRegistry, illustrationsById, no_data_card_default, parseSvgViewBoxAspectRatio, toast, typographyDefaultElement, typographyVariantClasses, useFormField, userTypeBadgeRegistry, userTypeBadgeSizeVariants, userTypeBadgeUserTypes };
@@ -1,6 +1,6 @@
1
- import { ProgressBar } from './chunk-JOSB72WF.js';
1
+ import { ProgressBar } from './chunk-E6IO2DVV.js';
2
2
  import { Card, CardContent } from './chunk-JPMN2UMF.js';
3
- import { Tooltip2 } from './chunk-QJVPE3FM.js';
3
+ import { Tooltip2 } from './chunk-34PXJOCS.js';
4
4
  import { jsx, jsxs } from 'react/jsx-runtime';
5
5
 
6
6
  function CopyrightCard({
@@ -1,4 +1,4 @@
1
- import { Avatar, Menu, List, Button, Link } from './chunk-QJVPE3FM.js';
1
+ import { Avatar, Menu, List, Button, Link } from './chunk-34PXJOCS.js';
2
2
  import { cn } from './chunk-VU4CZ76T.js';
3
3
  import { motion, AnimatePresence } from 'framer-motion';
4
4
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
- import { FooterCard, MyAccountMenu, ProfileCard, AppLogo } from './chunk-JL7VATX6.js';
2
- import { useSidebar, SidebarTrigger, SidebarProvider, Sidebar2, SidebarInset, parseTextMarkup, isSidebarGroup } from './chunk-QJVPE3FM.js';
1
+ import { FooterCard, MyAccountMenu, ProfileCard, AppLogo } from './chunk-SYEKNRS5.js';
2
+ import { useSidebar, SidebarTrigger, SidebarProvider, Sidebar2, SidebarInset, parseTextMarkup, isPathPrefixOf, isSidebarGroup } from './chunk-34PXJOCS.js';
3
3
  import { Button, Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator } from './chunk-F5P6S7K2.js';
4
4
  import { cn } from './chunk-VU4CZ76T.js';
5
5
  import { Menu, Palette, Check, Globe, LogOut } from 'lucide-react';
@@ -213,10 +213,6 @@ function WorkspaceBreadcrumbs({
213
213
  }
214
214
 
215
215
  // src/layouts/workspace-layout/breadcrumbs/derive-breadcrumbs.ts
216
- function isPathPrefixOf(prefix, fullPath) {
217
- if (prefix === fullPath) return true;
218
- return fullPath.startsWith(prefix) && (prefix.endsWith("/") || fullPath[prefix.length] === "/");
219
- }
220
216
  function labelFromPath(path) {
221
217
  const last = path.split("/").filter(Boolean).pop();
222
218
  if (!last) return "Home";
@@ -1,7 +1,7 @@
1
- export { CopyrightCard, PageLoader } from '../chunk-36DQX2ML.js';
2
- export { AnimatedRainmakerLogo } from '../chunk-JOSB72WF.js';
1
+ export { CopyrightCard, PageLoader } from '../chunk-IT5T6Y4V.js';
2
+ export { AnimatedRainmakerLogo } from '../chunk-E6IO2DVV.js';
3
3
  import '../chunk-JPMN2UMF.js';
4
- export { AppLogo, FooterCard, MyAccountMenu, ProfileCard } from '../chunk-JL7VATX6.js';
5
- import '../chunk-QJVPE3FM.js';
4
+ export { AppLogo, FooterCard, MyAccountMenu, ProfileCard } from '../chunk-SYEKNRS5.js';
5
+ import '../chunk-34PXJOCS.js';
6
6
  import '../chunk-F5P6S7K2.js';
7
7
  import '../chunk-VU4CZ76T.js';