kaleido-ui 0.1.108 → 0.1.109

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.
@@ -4711,7 +4711,7 @@ function ActivityList({
4711
4711
  return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "flex flex-col items-center justify-center py-16", children: [
4712
4712
  /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "mb-4 flex size-16 items-center justify-center rounded-full bg-white/5", children: emptyIcon ?? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(DefaultEmptyIcon, { name: "receipt_long" }) }),
4713
4713
  /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("h3", { className: "mb-1 text-base font-semibold", children: hasActiveFilters ? filteredEmptyTitle : emptyTitle }),
4714
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("p", { className: "mb-4 max-w-[240px] text-center text-xs text-muted-foreground", children: hasActiveFilters ? filteredEmptyDescription : emptyDescription }),
4714
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("p", { className: "mb-4 max-w-[240px] text-center text-xs text-white/70", children: hasActiveFilters ? filteredEmptyDescription : emptyDescription }),
4715
4715
  hasActiveFilters && onClearFilters ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Button, { variant: "surface", size: "sm", onClick: onClearFilters, children: "Clear Filters" }) : renderEmptyActions?.()
4716
4716
  ] });
4717
4717
  }
@@ -4721,7 +4721,7 @@ function ActivityList({
4721
4721
  return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
4722
4722
  "div",
4723
4723
  {
4724
- className: "relative overflow-hidden rounded-2xl bg-surface-card bg-gradient-to-b from-white/[0.025] to-primary/[0.035] shadow-inner transition-all animate-in fade-in slide-in-from-bottom-2 duration-500",
4724
+ className: "relative overflow-hidden rounded-2xl bg-card bg-none shadow-inner transition-all animate-in fade-in slide-in-from-bottom-2 duration-500",
4725
4725
  children: [
4726
4726
  /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
4727
4727
  TransactionCard,
@@ -4734,7 +4734,7 @@ function ActivityList({
4734
4734
  onSubAmountInfo: item.onSubAmountInfo,
4735
4735
  timestamp: item.timestamp,
4736
4736
  onClick: () => onExpandedChange?.(isExpanded ? null : item.id),
4737
- className: "relative z-[1]"
4737
+ className: cn("relative z-[1] bg-card", isExpanded && "shadow-none")
4738
4738
  }
4739
4739
  ),
4740
4740
  isExpanded && // -mt-4/pt-4 slides the details up behind the card's bottom
@@ -4766,63 +4766,69 @@ function ActivityFilterBar({
4766
4766
  onClearFilters,
4767
4767
  searchPlaceholder = "Search by txid, asset..."
4768
4768
  }) {
4769
- return (
4770
- // All three controls (search input, status dropdown, clear button) share
4771
- // the same h-11 height and rounded-2xl card radius so the bar reads as
4772
- // one family with the cards below it.
4773
- /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "flex h-11 items-center gap-2", children: [
4774
- /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "relative h-full flex-1", children: [
4775
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4776
- AppIcon,
4777
- {
4778
- name: "search",
4779
- className: "absolute left-3 top-1/2 size-4 -translate-y-1/2 text-white/40"
4780
- }
4781
- ),
4782
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4783
- "input",
4784
- {
4785
- type: "text",
4786
- placeholder: searchPlaceholder,
4787
- value: searchTerm,
4788
- onChange: (event) => onSearchTermChange(event.target.value),
4789
- className: "h-full w-full rounded-2xl bg-surface-card pl-9 pr-8 text-xs text-white shadow-inner backdrop-blur-xl transition-all placeholder:text-white/30 focus:bg-surface-elevated focus:outline-none"
4790
- }
4791
- ),
4792
- searchTerm && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4793
- "button",
4794
- {
4795
- type: "button",
4796
- onClick: () => onSearchTermChange(""),
4797
- className: "absolute right-2 top-1/2 -translate-y-1/2 text-white/40 transition-colors hover:text-white",
4798
- children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(AppIcon, { name: "close", className: "size-icon-sm" })
4799
- }
4800
- )
4801
- ] }),
4802
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "h-full w-28 shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
4803
- Select,
4769
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "flex h-11 items-center gap-2", children: [
4770
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "relative h-full flex-1", children: [
4771
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4772
+ AppIcon,
4804
4773
  {
4805
- value: statusFilter,
4806
- onValueChange: (value) => onStatusFilterChange(value),
4807
- children: [
4808
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(SelectTrigger, { className: "h-full rounded-2xl border-0 bg-surface-card px-3 py-0 text-xs font-bold text-white shadow-inner backdrop-blur-xl hover:bg-surface-elevated focus:ring-0 data-[state=open]:bg-surface-elevated", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(SelectValue, {}) }),
4809
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(SelectContent, { className: "bg-popover/95 p-1.5 shadow-popover", children: statusOptions.map((option) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(SelectItem, { value: option.value, className: "py-2 text-xs", children: option.label }, option.value)) })
4810
- ]
4774
+ name: "search",
4775
+ size: "sm",
4776
+ className: "absolute left-3 top-1/2 -translate-y-1/2 text-white/30"
4811
4777
  }
4812
- ) }),
4813
- hasActiveFilters && onClearFilters && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4814
- Button,
4778
+ ),
4779
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4780
+ "input",
4815
4781
  {
4816
- variant: "surface",
4817
- size: "icon-lg",
4818
- onClick: onClearFilters,
4819
- title: "Clear Filters",
4820
- className: "h-11 w-11 shrink-0 rounded-2xl",
4821
- children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(AppIcon, { name: "close", className: "size-icon-lg" })
4782
+ type: "text",
4783
+ "data-testid": "activity-search",
4784
+ placeholder: searchPlaceholder,
4785
+ value: searchTerm,
4786
+ onChange: (event) => onSearchTermChange(event.target.value),
4787
+ className: "h-full w-full rounded-xl border border-transparent bg-white/5 py-2.5 pl-10 pr-8 text-sm text-white outline-none transition-all placeholder:text-white/25 focus:border-primary/25 focus:bg-white/8"
4788
+ }
4789
+ ),
4790
+ searchTerm && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4791
+ "button",
4792
+ {
4793
+ type: "button",
4794
+ "aria-label": "Clear search",
4795
+ onClick: () => onSearchTermChange(""),
4796
+ className: "absolute right-2 top-1/2 -translate-y-1/2 rounded-md p-1 text-white/40 transition-colors hover:text-white",
4797
+ children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(AppIcon, { name: "close", size: "sm" })
4822
4798
  }
4823
4799
  )
4824
- ] })
4825
- );
4800
+ ] }),
4801
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "h-full w-28 shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
4802
+ Select,
4803
+ {
4804
+ value: statusFilter,
4805
+ onValueChange: (value) => onStatusFilterChange(value),
4806
+ children: [
4807
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4808
+ SelectTrigger,
4809
+ {
4810
+ "aria-label": "Filter activity by status",
4811
+ className: "h-full rounded-xl border-0 bg-white/5 px-3 py-0 text-xs font-bold text-white shadow-none hover:bg-white/8 focus:ring-0 data-[state=open]:bg-white/8",
4812
+ children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(SelectValue, {})
4813
+ }
4814
+ ),
4815
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(SelectContent, { className: "bg-popover/95 p-1.5 shadow-popover", children: statusOptions.map((option) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(SelectItem, { value: option.value, className: "py-2 text-xs", children: option.label }, option.value)) })
4816
+ ]
4817
+ }
4818
+ ) }),
4819
+ hasActiveFilters && onClearFilters && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
4820
+ Button,
4821
+ {
4822
+ variant: "surface",
4823
+ size: "icon-lg",
4824
+ onClick: onClearFilters,
4825
+ "aria-label": "Clear filters",
4826
+ title: "Clear Filters",
4827
+ className: "h-11 w-11 shrink-0 rounded-xl",
4828
+ children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(AppIcon, { name: "close", size: "lg" })
4829
+ }
4830
+ )
4831
+ ] });
4826
4832
  }
4827
4833
 
4828
4834
  // src/web/components/activity-network-filters.tsx
@@ -4845,118 +4851,81 @@ function ActivityNetworkFilters({
4845
4851
  filters,
4846
4852
  activeFilter,
4847
4853
  onChange,
4848
- className
4854
+ className,
4855
+ ariaLabel = "Filter activity by network"
4849
4856
  }) {
4850
4857
  if (filters.length <= 1) return null;
4851
- return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { className: cn("flex gap-1.5 overflow-x-auto py-0.5 no-scrollbar", className), children: filters.map((filter) => {
4852
- const isActive = activeFilter === filter.value;
4853
- return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
4854
- "button",
4855
- {
4856
- type: "button",
4857
- onClick: () => onChange(filter.value),
4858
- className: cn(
4859
- // `leading-none` on the button normalizes the line-box for
4860
- // both the icon span and the label span; without it the
4861
- // icon (now `leading-none` from Icon primitive) and the text
4862
- // (default leading) get center-aligned along different
4863
- // visual axes and the glyph drifts above the text.
4864
- "inline-flex shrink-0 items-center gap-1.5 rounded-full px-2.5 py-1.5 text-xxs font-bold uppercase tracking-wider leading-none transition-all active:scale-95",
4865
- isActive ? "bg-primary/15 text-primary shadow-inner hover:bg-primary/20" : "bg-surface-card text-white/45 hover:bg-surface-elevated hover:text-white/80"
4866
- ),
4867
- children: [
4868
- /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
4869
- "span",
4870
- {
4871
- className: cn(
4872
- "flex items-center justify-center",
4873
- isActive ? "opacity-100" : "scale-90 opacity-70"
4858
+ return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
4859
+ "div",
4860
+ {
4861
+ role: "group",
4862
+ "aria-label": ariaLabel,
4863
+ className: cn("flex gap-1.5 overflow-x-auto pb-0.5 no-scrollbar", className),
4864
+ children: filters.map((filter) => {
4865
+ const isActive = activeFilter === filter.value;
4866
+ return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
4867
+ "button",
4868
+ {
4869
+ type: "button",
4870
+ "aria-pressed": isActive,
4871
+ onClick: () => onChange(filter.value),
4872
+ className: cn(
4873
+ "flex shrink-0 items-center gap-1 rounded-full px-2.5 py-1.5 text-xxs font-bold uppercase tracking-wider transition-all",
4874
+ isActive ? "bg-primary/15 text-primary ring-1 ring-primary/20" : "bg-white/5 text-muted-foreground hover:bg-white/8 hover:text-white"
4875
+ ),
4876
+ children: [
4877
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
4878
+ "span",
4879
+ {
4880
+ "aria-hidden": true,
4881
+ className: "flex size-3 items-center justify-center",
4882
+ children: filter.icon ?? getActivityNetworkFilterIcon(filter.value)
4883
+ }
4874
4884
  ),
4875
- children: filter.icon ?? getActivityNetworkFilterIcon(filter.value)
4876
- }
4877
- ),
4878
- /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("span", { children: filter.label })
4879
- ]
4880
- },
4881
- filter.value
4882
- );
4883
- }) });
4885
+ filter.label
4886
+ ]
4887
+ },
4888
+ filter.value
4889
+ );
4890
+ })
4891
+ }
4892
+ );
4884
4893
  }
4885
4894
 
4886
4895
  // src/web/components/activity-type-tabs.tsx
4887
4896
  var import_jsx_runtime44 = require("react/jsx-runtime");
4888
4897
  function ActivityTypeTabs({ counts = {} }) {
4889
- return /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(TabsList, { className: "grid h-12 w-full grid-cols-4 gap-1 rounded-2xl bg-surface-card p-1 backdrop-blur-xl", children: [
4890
- /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
4891
- TabsTrigger,
4892
- {
4893
- value: "all",
4894
- className: "h-full rounded-xl px-2 text-xs font-bold tracking-wide transition-all data-[state=active]:bg-surface-elevated data-[state=active]:text-white",
4895
- children: [
4896
- "All",
4897
- counts.all ? /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("span", { className: "ml-1 opacity-60", children: [
4898
- "(",
4899
- counts.all,
4900
- ")"
4901
- ] }) : null
4902
- ]
4903
- }
4904
- ),
4905
- /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
4906
- TabsTrigger,
4907
- {
4908
- value: "received",
4909
- className: "group h-full rounded-xl px-1.5 text-xs font-bold tracking-wide transition-all hover:text-tx-receive data-[state=active]:bg-tx-receive/15 data-[state=active]:text-tx-receive data-[state=active]:hover:bg-tx-receive/20 data-[state=active]:hover:text-tx-receive",
4910
- children: [
4911
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
4912
- AppIcon,
4913
- {
4914
- name: "receive",
4915
- size: "sm",
4916
- className: "mr-1 shrink-0 leading-none text-muted-foreground transition-colors group-hover:text-tx-receive group-data-[state=active]:text-tx-receive"
4917
- }
4918
- ),
4919
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { children: "In" })
4920
- ]
4921
- }
4922
- ),
4923
- /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
4924
- TabsTrigger,
4925
- {
4926
- value: "sent",
4927
- className: "group h-full rounded-xl px-1.5 text-xs font-bold tracking-wide transition-all hover:text-tx-sent data-[state=active]:bg-tx-sent/15 data-[state=active]:text-tx-sent data-[state=active]:hover:bg-tx-sent/20 data-[state=active]:hover:text-tx-sent",
4928
- children: [
4929
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
4930
- AppIcon,
4931
- {
4932
- name: "send",
4933
- size: "sm",
4934
- className: "mr-1 shrink-0 leading-none text-muted-foreground transition-colors group-hover:text-tx-sent group-data-[state=active]:text-tx-sent"
4935
- }
4936
- ),
4937
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { children: "Out" })
4938
- ]
4939
- }
4940
- ),
4941
- /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
4942
- TabsTrigger,
4943
- {
4944
- value: "swaps",
4945
- className: "group h-full rounded-xl px-1.5 text-xs font-bold tracking-wide transition-all hover:text-network-arkade data-[state=active]:bg-network-arkade/15 data-[state=active]:text-network-arkade data-[state=active]:hover:bg-network-arkade/20 data-[state=active]:hover:text-network-arkade",
4946
- children: [
4947
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
4948
- AppIcon,
4949
- {
4950
- name: "swap",
4951
- size: "sm",
4952
- className: "mr-1 shrink-0 leading-none text-muted-foreground transition-colors group-hover:text-network-arkade group-data-[state=active]:text-network-arkade"
4953
- }
4954
- ),
4955
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { children: "Swaps" })
4956
- ]
4957
- }
4958
- )
4959
- ] });
4898
+ const actions = [
4899
+ { value: "all", label: "All" },
4900
+ { value: "received", label: "In", icon: "receive", actionIcon: "call_received" },
4901
+ { value: "swaps", label: "Swap", icon: "swap", actionIcon: "swap_horiz" },
4902
+ { value: "sent", label: "Out", icon: "send", actionIcon: "arrow_outward" }
4903
+ ];
4904
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(TabsList, { className: "grid h-12 w-full grid-cols-4 gap-1 rounded-2xl bg-surface-card p-1 backdrop-blur-xl", children: actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
4905
+ TabsTrigger,
4906
+ {
4907
+ value: action.value,
4908
+ "data-action-icon": action.actionIcon,
4909
+ className: "group h-full rounded-xl px-1.5 text-xs font-bold tracking-wide text-muted-foreground transition-all hover:text-primary data-[state=active]:bg-primary/15 data-[state=active]:text-primary data-[state=active]:hover:bg-primary/20 data-[state=active]:hover:text-primary",
4910
+ children: [
4911
+ action.icon && /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
4912
+ AppIcon,
4913
+ {
4914
+ name: action.icon,
4915
+ size: "sm",
4916
+ className: "mr-1 shrink-0 leading-none text-muted-foreground transition-colors group-hover:text-primary group-data-[state=active]:text-primary"
4917
+ }
4918
+ ),
4919
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { children: action.label }),
4920
+ action.value === "all" && counts.all ? /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("span", { className: "ml-1", children: [
4921
+ "(",
4922
+ counts.all,
4923
+ ")"
4924
+ ] }) : null
4925
+ ]
4926
+ },
4927
+ action.value
4928
+ )) });
4960
4929
  }
4961
4930
 
4962
4931
  // src/web/components/activity-detail-row.tsx
@@ -910,9 +910,10 @@ interface ActivityNetworkFiltersProps<TValue extends string = ActivityNetworkFil
910
910
  activeFilter: TValue;
911
911
  onChange: (value: TValue) => void;
912
912
  className?: string;
913
+ ariaLabel?: string;
913
914
  }
914
915
  declare function getActivityNetworkFilterIcon(filter: ActivityNetworkFilterValue): react_jsx_runtime.JSX.Element;
915
- declare function ActivityNetworkFilters<TValue extends string = ActivityNetworkFilterValue>({ filters, activeFilter, onChange, className, }: ActivityNetworkFiltersProps<TValue>): react_jsx_runtime.JSX.Element | null;
916
+ declare function ActivityNetworkFilters<TValue extends string = ActivityNetworkFilterValue>({ filters, activeFilter, onChange, className, ariaLabel, }: ActivityNetworkFiltersProps<TValue>): react_jsx_runtime.JSX.Element | null;
916
917
 
917
918
  type ActivityTypeTabValue = 'all' | 'received' | 'sent' | 'swaps';
918
919
  interface ActivityTypeTabCounts {
@@ -910,9 +910,10 @@ interface ActivityNetworkFiltersProps<TValue extends string = ActivityNetworkFil
910
910
  activeFilter: TValue;
911
911
  onChange: (value: TValue) => void;
912
912
  className?: string;
913
+ ariaLabel?: string;
913
914
  }
914
915
  declare function getActivityNetworkFilterIcon(filter: ActivityNetworkFilterValue): react_jsx_runtime.JSX.Element;
915
- declare function ActivityNetworkFilters<TValue extends string = ActivityNetworkFilterValue>({ filters, activeFilter, onChange, className, }: ActivityNetworkFiltersProps<TValue>): react_jsx_runtime.JSX.Element | null;
916
+ declare function ActivityNetworkFilters<TValue extends string = ActivityNetworkFilterValue>({ filters, activeFilter, onChange, className, ariaLabel, }: ActivityNetworkFiltersProps<TValue>): react_jsx_runtime.JSX.Element | null;
916
917
 
917
918
  type ActivityTypeTabValue = 'all' | 'received' | 'sent' | 'swaps';
918
919
  interface ActivityTypeTabCounts {
package/dist/web/index.js CHANGED
@@ -4529,7 +4529,7 @@ function ActivityList({
4529
4529
  return /* @__PURE__ */ jsxs28("div", { className: "flex flex-col items-center justify-center py-16", children: [
4530
4530
  /* @__PURE__ */ jsx41("div", { className: "mb-4 flex size-16 items-center justify-center rounded-full bg-white/5", children: emptyIcon ?? /* @__PURE__ */ jsx41(DefaultEmptyIcon, { name: "receipt_long" }) }),
4531
4531
  /* @__PURE__ */ jsx41("h3", { className: "mb-1 text-base font-semibold", children: hasActiveFilters ? filteredEmptyTitle : emptyTitle }),
4532
- /* @__PURE__ */ jsx41("p", { className: "mb-4 max-w-[240px] text-center text-xs text-muted-foreground", children: hasActiveFilters ? filteredEmptyDescription : emptyDescription }),
4532
+ /* @__PURE__ */ jsx41("p", { className: "mb-4 max-w-[240px] text-center text-xs text-white/70", children: hasActiveFilters ? filteredEmptyDescription : emptyDescription }),
4533
4533
  hasActiveFilters && onClearFilters ? /* @__PURE__ */ jsx41(Button, { variant: "surface", size: "sm", onClick: onClearFilters, children: "Clear Filters" }) : renderEmptyActions?.()
4534
4534
  ] });
4535
4535
  }
@@ -4539,7 +4539,7 @@ function ActivityList({
4539
4539
  return /* @__PURE__ */ jsxs28(
4540
4540
  "div",
4541
4541
  {
4542
- className: "relative overflow-hidden rounded-2xl bg-surface-card bg-gradient-to-b from-white/[0.025] to-primary/[0.035] shadow-inner transition-all animate-in fade-in slide-in-from-bottom-2 duration-500",
4542
+ className: "relative overflow-hidden rounded-2xl bg-card bg-none shadow-inner transition-all animate-in fade-in slide-in-from-bottom-2 duration-500",
4543
4543
  children: [
4544
4544
  /* @__PURE__ */ jsx41(
4545
4545
  TransactionCard,
@@ -4552,7 +4552,7 @@ function ActivityList({
4552
4552
  onSubAmountInfo: item.onSubAmountInfo,
4553
4553
  timestamp: item.timestamp,
4554
4554
  onClick: () => onExpandedChange?.(isExpanded ? null : item.id),
4555
- className: "relative z-[1]"
4555
+ className: cn("relative z-[1] bg-card", isExpanded && "shadow-none")
4556
4556
  }
4557
4557
  ),
4558
4558
  isExpanded && // -mt-4/pt-4 slides the details up behind the card's bottom
@@ -4584,63 +4584,69 @@ function ActivityFilterBar({
4584
4584
  onClearFilters,
4585
4585
  searchPlaceholder = "Search by txid, asset..."
4586
4586
  }) {
4587
- return (
4588
- // All three controls (search input, status dropdown, clear button) share
4589
- // the same h-11 height and rounded-2xl card radius so the bar reads as
4590
- // one family with the cards below it.
4591
- /* @__PURE__ */ jsxs29("div", { className: "flex h-11 items-center gap-2", children: [
4592
- /* @__PURE__ */ jsxs29("div", { className: "relative h-full flex-1", children: [
4593
- /* @__PURE__ */ jsx42(
4594
- AppIcon,
4595
- {
4596
- name: "search",
4597
- className: "absolute left-3 top-1/2 size-4 -translate-y-1/2 text-white/40"
4598
- }
4599
- ),
4600
- /* @__PURE__ */ jsx42(
4601
- "input",
4602
- {
4603
- type: "text",
4604
- placeholder: searchPlaceholder,
4605
- value: searchTerm,
4606
- onChange: (event) => onSearchTermChange(event.target.value),
4607
- className: "h-full w-full rounded-2xl bg-surface-card pl-9 pr-8 text-xs text-white shadow-inner backdrop-blur-xl transition-all placeholder:text-white/30 focus:bg-surface-elevated focus:outline-none"
4608
- }
4609
- ),
4610
- searchTerm && /* @__PURE__ */ jsx42(
4611
- "button",
4612
- {
4613
- type: "button",
4614
- onClick: () => onSearchTermChange(""),
4615
- className: "absolute right-2 top-1/2 -translate-y-1/2 text-white/40 transition-colors hover:text-white",
4616
- children: /* @__PURE__ */ jsx42(AppIcon, { name: "close", className: "size-icon-sm" })
4617
- }
4618
- )
4619
- ] }),
4620
- /* @__PURE__ */ jsx42("div", { className: "h-full w-28 shrink-0", children: /* @__PURE__ */ jsxs29(
4621
- Select,
4587
+ return /* @__PURE__ */ jsxs29("div", { className: "flex h-11 items-center gap-2", children: [
4588
+ /* @__PURE__ */ jsxs29("div", { className: "relative h-full flex-1", children: [
4589
+ /* @__PURE__ */ jsx42(
4590
+ AppIcon,
4622
4591
  {
4623
- value: statusFilter,
4624
- onValueChange: (value) => onStatusFilterChange(value),
4625
- children: [
4626
- /* @__PURE__ */ jsx42(SelectTrigger, { className: "h-full rounded-2xl border-0 bg-surface-card px-3 py-0 text-xs font-bold text-white shadow-inner backdrop-blur-xl hover:bg-surface-elevated focus:ring-0 data-[state=open]:bg-surface-elevated", children: /* @__PURE__ */ jsx42(SelectValue, {}) }),
4627
- /* @__PURE__ */ jsx42(SelectContent, { className: "bg-popover/95 p-1.5 shadow-popover", children: statusOptions.map((option) => /* @__PURE__ */ jsx42(SelectItem, { value: option.value, className: "py-2 text-xs", children: option.label }, option.value)) })
4628
- ]
4592
+ name: "search",
4593
+ size: "sm",
4594
+ className: "absolute left-3 top-1/2 -translate-y-1/2 text-white/30"
4629
4595
  }
4630
- ) }),
4631
- hasActiveFilters && onClearFilters && /* @__PURE__ */ jsx42(
4632
- Button,
4596
+ ),
4597
+ /* @__PURE__ */ jsx42(
4598
+ "input",
4633
4599
  {
4634
- variant: "surface",
4635
- size: "icon-lg",
4636
- onClick: onClearFilters,
4637
- title: "Clear Filters",
4638
- className: "h-11 w-11 shrink-0 rounded-2xl",
4639
- children: /* @__PURE__ */ jsx42(AppIcon, { name: "close", className: "size-icon-lg" })
4600
+ type: "text",
4601
+ "data-testid": "activity-search",
4602
+ placeholder: searchPlaceholder,
4603
+ value: searchTerm,
4604
+ onChange: (event) => onSearchTermChange(event.target.value),
4605
+ className: "h-full w-full rounded-xl border border-transparent bg-white/5 py-2.5 pl-10 pr-8 text-sm text-white outline-none transition-all placeholder:text-white/25 focus:border-primary/25 focus:bg-white/8"
4606
+ }
4607
+ ),
4608
+ searchTerm && /* @__PURE__ */ jsx42(
4609
+ "button",
4610
+ {
4611
+ type: "button",
4612
+ "aria-label": "Clear search",
4613
+ onClick: () => onSearchTermChange(""),
4614
+ className: "absolute right-2 top-1/2 -translate-y-1/2 rounded-md p-1 text-white/40 transition-colors hover:text-white",
4615
+ children: /* @__PURE__ */ jsx42(AppIcon, { name: "close", size: "sm" })
4640
4616
  }
4641
4617
  )
4642
- ] })
4643
- );
4618
+ ] }),
4619
+ /* @__PURE__ */ jsx42("div", { className: "h-full w-28 shrink-0", children: /* @__PURE__ */ jsxs29(
4620
+ Select,
4621
+ {
4622
+ value: statusFilter,
4623
+ onValueChange: (value) => onStatusFilterChange(value),
4624
+ children: [
4625
+ /* @__PURE__ */ jsx42(
4626
+ SelectTrigger,
4627
+ {
4628
+ "aria-label": "Filter activity by status",
4629
+ className: "h-full rounded-xl border-0 bg-white/5 px-3 py-0 text-xs font-bold text-white shadow-none hover:bg-white/8 focus:ring-0 data-[state=open]:bg-white/8",
4630
+ children: /* @__PURE__ */ jsx42(SelectValue, {})
4631
+ }
4632
+ ),
4633
+ /* @__PURE__ */ jsx42(SelectContent, { className: "bg-popover/95 p-1.5 shadow-popover", children: statusOptions.map((option) => /* @__PURE__ */ jsx42(SelectItem, { value: option.value, className: "py-2 text-xs", children: option.label }, option.value)) })
4634
+ ]
4635
+ }
4636
+ ) }),
4637
+ hasActiveFilters && onClearFilters && /* @__PURE__ */ jsx42(
4638
+ Button,
4639
+ {
4640
+ variant: "surface",
4641
+ size: "icon-lg",
4642
+ onClick: onClearFilters,
4643
+ "aria-label": "Clear filters",
4644
+ title: "Clear Filters",
4645
+ className: "h-11 w-11 shrink-0 rounded-xl",
4646
+ children: /* @__PURE__ */ jsx42(AppIcon, { name: "close", size: "lg" })
4647
+ }
4648
+ )
4649
+ ] });
4644
4650
  }
4645
4651
 
4646
4652
  // src/web/components/activity-network-filters.tsx
@@ -4663,118 +4669,81 @@ function ActivityNetworkFilters({
4663
4669
  filters,
4664
4670
  activeFilter,
4665
4671
  onChange,
4666
- className
4672
+ className,
4673
+ ariaLabel = "Filter activity by network"
4667
4674
  }) {
4668
4675
  if (filters.length <= 1) return null;
4669
- return /* @__PURE__ */ jsx43("div", { className: cn("flex gap-1.5 overflow-x-auto py-0.5 no-scrollbar", className), children: filters.map((filter) => {
4670
- const isActive = activeFilter === filter.value;
4671
- return /* @__PURE__ */ jsxs30(
4672
- "button",
4673
- {
4674
- type: "button",
4675
- onClick: () => onChange(filter.value),
4676
- className: cn(
4677
- // `leading-none` on the button normalizes the line-box for
4678
- // both the icon span and the label span; without it the
4679
- // icon (now `leading-none` from Icon primitive) and the text
4680
- // (default leading) get center-aligned along different
4681
- // visual axes and the glyph drifts above the text.
4682
- "inline-flex shrink-0 items-center gap-1.5 rounded-full px-2.5 py-1.5 text-xxs font-bold uppercase tracking-wider leading-none transition-all active:scale-95",
4683
- isActive ? "bg-primary/15 text-primary shadow-inner hover:bg-primary/20" : "bg-surface-card text-white/45 hover:bg-surface-elevated hover:text-white/80"
4684
- ),
4685
- children: [
4686
- /* @__PURE__ */ jsx43(
4687
- "span",
4688
- {
4689
- className: cn(
4690
- "flex items-center justify-center",
4691
- isActive ? "opacity-100" : "scale-90 opacity-70"
4676
+ return /* @__PURE__ */ jsx43(
4677
+ "div",
4678
+ {
4679
+ role: "group",
4680
+ "aria-label": ariaLabel,
4681
+ className: cn("flex gap-1.5 overflow-x-auto pb-0.5 no-scrollbar", className),
4682
+ children: filters.map((filter) => {
4683
+ const isActive = activeFilter === filter.value;
4684
+ return /* @__PURE__ */ jsxs30(
4685
+ "button",
4686
+ {
4687
+ type: "button",
4688
+ "aria-pressed": isActive,
4689
+ onClick: () => onChange(filter.value),
4690
+ className: cn(
4691
+ "flex shrink-0 items-center gap-1 rounded-full px-2.5 py-1.5 text-xxs font-bold uppercase tracking-wider transition-all",
4692
+ isActive ? "bg-primary/15 text-primary ring-1 ring-primary/20" : "bg-white/5 text-muted-foreground hover:bg-white/8 hover:text-white"
4693
+ ),
4694
+ children: [
4695
+ /* @__PURE__ */ jsx43(
4696
+ "span",
4697
+ {
4698
+ "aria-hidden": true,
4699
+ className: "flex size-3 items-center justify-center",
4700
+ children: filter.icon ?? getActivityNetworkFilterIcon(filter.value)
4701
+ }
4692
4702
  ),
4693
- children: filter.icon ?? getActivityNetworkFilterIcon(filter.value)
4694
- }
4695
- ),
4696
- /* @__PURE__ */ jsx43("span", { children: filter.label })
4697
- ]
4698
- },
4699
- filter.value
4700
- );
4701
- }) });
4703
+ filter.label
4704
+ ]
4705
+ },
4706
+ filter.value
4707
+ );
4708
+ })
4709
+ }
4710
+ );
4702
4711
  }
4703
4712
 
4704
4713
  // src/web/components/activity-type-tabs.tsx
4705
4714
  import { jsx as jsx44, jsxs as jsxs31 } from "react/jsx-runtime";
4706
4715
  function ActivityTypeTabs({ counts = {} }) {
4707
- return /* @__PURE__ */ jsxs31(TabsList, { className: "grid h-12 w-full grid-cols-4 gap-1 rounded-2xl bg-surface-card p-1 backdrop-blur-xl", children: [
4708
- /* @__PURE__ */ jsxs31(
4709
- TabsTrigger,
4710
- {
4711
- value: "all",
4712
- className: "h-full rounded-xl px-2 text-xs font-bold tracking-wide transition-all data-[state=active]:bg-surface-elevated data-[state=active]:text-white",
4713
- children: [
4714
- "All",
4715
- counts.all ? /* @__PURE__ */ jsxs31("span", { className: "ml-1 opacity-60", children: [
4716
- "(",
4717
- counts.all,
4718
- ")"
4719
- ] }) : null
4720
- ]
4721
- }
4722
- ),
4723
- /* @__PURE__ */ jsxs31(
4724
- TabsTrigger,
4725
- {
4726
- value: "received",
4727
- className: "group h-full rounded-xl px-1.5 text-xs font-bold tracking-wide transition-all hover:text-tx-receive data-[state=active]:bg-tx-receive/15 data-[state=active]:text-tx-receive data-[state=active]:hover:bg-tx-receive/20 data-[state=active]:hover:text-tx-receive",
4728
- children: [
4729
- /* @__PURE__ */ jsx44(
4730
- AppIcon,
4731
- {
4732
- name: "receive",
4733
- size: "sm",
4734
- className: "mr-1 shrink-0 leading-none text-muted-foreground transition-colors group-hover:text-tx-receive group-data-[state=active]:text-tx-receive"
4735
- }
4736
- ),
4737
- /* @__PURE__ */ jsx44("span", { children: "In" })
4738
- ]
4739
- }
4740
- ),
4741
- /* @__PURE__ */ jsxs31(
4742
- TabsTrigger,
4743
- {
4744
- value: "sent",
4745
- className: "group h-full rounded-xl px-1.5 text-xs font-bold tracking-wide transition-all hover:text-tx-sent data-[state=active]:bg-tx-sent/15 data-[state=active]:text-tx-sent data-[state=active]:hover:bg-tx-sent/20 data-[state=active]:hover:text-tx-sent",
4746
- children: [
4747
- /* @__PURE__ */ jsx44(
4748
- AppIcon,
4749
- {
4750
- name: "send",
4751
- size: "sm",
4752
- className: "mr-1 shrink-0 leading-none text-muted-foreground transition-colors group-hover:text-tx-sent group-data-[state=active]:text-tx-sent"
4753
- }
4754
- ),
4755
- /* @__PURE__ */ jsx44("span", { children: "Out" })
4756
- ]
4757
- }
4758
- ),
4759
- /* @__PURE__ */ jsxs31(
4760
- TabsTrigger,
4761
- {
4762
- value: "swaps",
4763
- className: "group h-full rounded-xl px-1.5 text-xs font-bold tracking-wide transition-all hover:text-network-arkade data-[state=active]:bg-network-arkade/15 data-[state=active]:text-network-arkade data-[state=active]:hover:bg-network-arkade/20 data-[state=active]:hover:text-network-arkade",
4764
- children: [
4765
- /* @__PURE__ */ jsx44(
4766
- AppIcon,
4767
- {
4768
- name: "swap",
4769
- size: "sm",
4770
- className: "mr-1 shrink-0 leading-none text-muted-foreground transition-colors group-hover:text-network-arkade group-data-[state=active]:text-network-arkade"
4771
- }
4772
- ),
4773
- /* @__PURE__ */ jsx44("span", { children: "Swaps" })
4774
- ]
4775
- }
4776
- )
4777
- ] });
4716
+ const actions = [
4717
+ { value: "all", label: "All" },
4718
+ { value: "received", label: "In", icon: "receive", actionIcon: "call_received" },
4719
+ { value: "swaps", label: "Swap", icon: "swap", actionIcon: "swap_horiz" },
4720
+ { value: "sent", label: "Out", icon: "send", actionIcon: "arrow_outward" }
4721
+ ];
4722
+ return /* @__PURE__ */ jsx44(TabsList, { className: "grid h-12 w-full grid-cols-4 gap-1 rounded-2xl bg-surface-card p-1 backdrop-blur-xl", children: actions.map((action) => /* @__PURE__ */ jsxs31(
4723
+ TabsTrigger,
4724
+ {
4725
+ value: action.value,
4726
+ "data-action-icon": action.actionIcon,
4727
+ className: "group h-full rounded-xl px-1.5 text-xs font-bold tracking-wide text-muted-foreground transition-all hover:text-primary data-[state=active]:bg-primary/15 data-[state=active]:text-primary data-[state=active]:hover:bg-primary/20 data-[state=active]:hover:text-primary",
4728
+ children: [
4729
+ action.icon && /* @__PURE__ */ jsx44(
4730
+ AppIcon,
4731
+ {
4732
+ name: action.icon,
4733
+ size: "sm",
4734
+ className: "mr-1 shrink-0 leading-none text-muted-foreground transition-colors group-hover:text-primary group-data-[state=active]:text-primary"
4735
+ }
4736
+ ),
4737
+ /* @__PURE__ */ jsx44("span", { children: action.label }),
4738
+ action.value === "all" && counts.all ? /* @__PURE__ */ jsxs31("span", { className: "ml-1", children: [
4739
+ "(",
4740
+ counts.all,
4741
+ ")"
4742
+ ] }) : null
4743
+ ]
4744
+ },
4745
+ action.value
4746
+ )) });
4778
4747
  }
4779
4748
 
4780
4749
  // src/web/components/activity-detail-row.tsx
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kaleido-ui",
3
- "version": "0.1.108",
3
+ "version": "0.1.109",
4
4
  "description": "KaleidoSwap shared UI library — design tokens, web components (Tailwind + Radix), and React Native components extending WDK UI Kit",
5
5
  "license": "MIT",
6
6
  "type": "module",