@datatechsolutions/ui 2.7.138 → 2.7.140

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.
@@ -656,7 +656,7 @@ function LoadingSpinner({ className }) {
656
656
  return /* @__PURE__ */ jsxRuntime.jsxs(
657
657
  "svg",
658
658
  {
659
- className: clsx__default.default("h-4 w-4 animate-spin", className),
659
+ className: clsx__default.default("h-4 w-4 animate-spin motion-reduce:animate-none", className),
660
660
  xmlns: "http://www.w3.org/2000/svg",
661
661
  fill: "none",
662
662
  viewBox: "0 0 24 24",
@@ -766,7 +766,8 @@ function IconButton({
766
766
  isIosColor && finalColor === "ios-red" && "text-[#FF3B30] dark:text-[#FF453A]",
767
767
  isIosColor && finalColor === "ios-green" && "text-[#34C759] dark:text-[#30D158]",
768
768
  isIosColor && finalColor === "ios-orange" && "text-[#FF9500] dark:text-[#FF9F0A]",
769
- isIosColor && finalColor === "ios-purple" && "text-[#AF52DE] dark:text-[#BF5AF2]"
769
+ isIosColor && finalColor === "ios-purple" && "text-[#AF52DE] dark:text-[#BF5AF2]",
770
+ !isIosColor && "text-slate-700 dark:text-slate-300"
770
771
  ),
771
772
  outline: clsx__default.default(
772
773
  "bg-transparent border",
@@ -954,6 +955,7 @@ var Input = React11.forwardRef(
954
955
  const helperId = `${inputId}-helper`;
955
956
  const [isFocused, setIsFocused] = React11.useState(false);
956
957
  const [showPassword, setShowPassword] = React11.useState(false);
958
+ const prefersReducedMotion2 = framerMotion.useReducedMotion();
957
959
  const hasValue = value !== void 0 && value !== "";
958
960
  const characterCount = typeof value === "string" ? value.length : 0;
959
961
  const isOverLimit = maxCharacters ? characterCount > maxCharacters : false;
@@ -988,14 +990,14 @@ var Input = React11.forwardRef(
988
990
  liquid-surface h-12 w-full rounded-xl border-0
989
991
  px-4 py-3 text-base
990
992
  text-slate-900 dark:text-white
991
- placeholder:text-slate-400 dark:placeholder:text-slate-500
993
+ placeholder:text-slate-500 dark:placeholder:text-slate-500
992
994
  transition-all duration-200
993
995
  disabled:cursor-not-allowed disabled:opacity-50
994
996
  ` : `
995
997
  liquid-surface h-11 w-full rounded-xl
996
998
  px-3.5 py-2.5 text-base
997
999
  text-slate-900 dark:text-white
998
- placeholder:text-slate-400 dark:placeholder:text-slate-500
1000
+ placeholder:text-slate-500 dark:placeholder:text-slate-500
999
1001
  transition-all duration-200
1000
1002
  disabled:cursor-not-allowed disabled:opacity-50
1001
1003
  `;
@@ -1023,7 +1025,7 @@ var Input = React11.forwardRef(
1023
1025
  exit: { opacity: 0, scale: 0.8 },
1024
1026
  transition: { duration: 0.15 },
1025
1027
  onClick: togglePassword,
1026
- className: "p-1 rounded-full text-slate-400 hover:text-slate-600 dark:hover:text-slate-300 hover:bg-white/40 dark:hover:bg-white/[0.08] transition-colors",
1028
+ className: "p-2 min-h-[44px] min-w-[44px] flex items-center justify-center rounded-full text-slate-400 hover:text-slate-600 dark:hover:text-slate-300 hover:bg-white/40 dark:hover:bg-white/[0.08] transition-colors",
1027
1029
  "aria-label": showPassword ? t("hidePassword") : t("showPassword"),
1028
1030
  children: showPassword ? /* @__PURE__ */ jsxRuntime.jsx(solid.EyeSlashIcon, { className: "h-5 w-5" }) : /* @__PURE__ */ jsxRuntime.jsx(solid.EyeIcon, { className: "h-5 w-5" })
1029
1031
  }
@@ -1037,7 +1039,8 @@ var Input = React11.forwardRef(
1037
1039
  exit: { opacity: 0, scale: 0.8 },
1038
1040
  transition: { duration: 0.15 },
1039
1041
  onClick: handleClear,
1040
- className: "p-1 rounded-full text-slate-400 hover:text-slate-600 dark:hover:text-slate-300 hover:bg-white/40 dark:hover:bg-white/[0.08] transition-colors",
1042
+ className: "p-2 min-h-[44px] min-w-[44px] flex items-center justify-center rounded-full text-slate-400 hover:text-slate-600 dark:hover:text-slate-300 hover:bg-white/40 dark:hover:bg-white/[0.08] transition-colors",
1043
+ "aria-label": "Clear input",
1041
1044
  children: /* @__PURE__ */ jsxRuntime.jsx(solid.XMarkIcon, { className: "h-5 w-5" })
1042
1045
  }
1043
1046
  ) })
@@ -1065,7 +1068,7 @@ var Input = React11.forwardRef(
1065
1068
  children: successMessage
1066
1069
  }
1067
1070
  ),
1068
- !error && !successMessage && helperText && /* @__PURE__ */ jsxRuntime.jsx("p", { id: helperId, className: "text-sm text-slate-500 dark:text-slate-400", children: helperText })
1071
+ !error && !successMessage && helperText && /* @__PURE__ */ jsxRuntime.jsx("p", { id: helperId, className: "text-sm text-slate-600 dark:text-slate-400", children: helperText })
1069
1072
  ] }),
1070
1073
  showCharacterCount && /* @__PURE__ */ jsxRuntime.jsxs(
1071
1074
  "span",
@@ -1108,16 +1111,33 @@ var Input = React11.forwardRef(
1108
1111
  ...props
1109
1112
  }
1110
1113
  ),
1111
- /* @__PURE__ */ jsxRuntime.jsx(
1114
+ prefersReducedMotion2 ? /* @__PURE__ */ jsxRuntime.jsx(
1115
+ "label",
1116
+ {
1117
+ htmlFor: inputId,
1118
+ className: `
1119
+ absolute left-3.5 pointer-events-none
1120
+ text-slate-500 dark:text-slate-400
1121
+ transition-all duration-200
1122
+ ${icon ? "left-11" : ""}
1123
+ `,
1124
+ style: {
1125
+ top: hasValue || isFocused ? "0.5rem" : "50%",
1126
+ transform: hasValue || isFocused ? "none" : "translateY(-50%)",
1127
+ fontSize: hasValue || isFocused ? "0.75rem" : "1rem"
1128
+ },
1129
+ children: label
1130
+ }
1131
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1112
1132
  framerMotion.motion.label,
1113
1133
  {
1114
1134
  htmlFor: inputId,
1115
1135
  className: `
1116
- absolute left-3.5 pointer-events-none
1117
- text-slate-500 dark:text-slate-400
1118
- transition-all duration-200
1119
- ${icon ? "left-11" : ""}
1120
- `,
1136
+ absolute left-3.5 pointer-events-none
1137
+ text-slate-500 dark:text-slate-400
1138
+ transition-all duration-200
1139
+ ${icon ? "left-11" : ""}
1140
+ `,
1121
1141
  initial: false,
1122
1142
  animate: {
1123
1143
  top: hasValue || isFocused ? "0.5rem" : "50%",
@@ -1589,11 +1609,11 @@ var Select = React11.forwardRef(
1589
1609
  cursor-pointer
1590
1610
  `,
1591
1611
  children: [
1592
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: selectedOption ? "" : "text-slate-400", children: selectedOption?.label || placeholder }),
1612
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: selectedOption ? "" : "text-slate-500", children: selectedOption?.label || placeholder }),
1593
1613
  /* @__PURE__ */ jsxRuntime.jsx(
1594
1614
  solid.ChevronDownIcon,
1595
1615
  {
1596
- className: `h-5 w-5 text-slate-400 transition-transform duration-200
1616
+ className: `h-5 w-5 text-slate-500 transition-transform duration-200
1597
1617
  ${isOpen ? "rotate-180" : ""}`
1598
1618
  }
1599
1619
  )
@@ -1630,7 +1650,7 @@ var Select = React11.forwardRef(
1630
1650
  }
1631
1651
  ) })
1632
1652
  ] }),
1633
- error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-ios-red", children: error })
1653
+ error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-ios-red", role: "alert", "aria-live": "polite", children: error })
1634
1654
  ] });
1635
1655
  }
1636
1656
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
@@ -1662,11 +1682,11 @@ var Select = React11.forwardRef(
1662
1682
  /* @__PURE__ */ jsxRuntime.jsx(
1663
1683
  solid.ChevronDownIcon,
1664
1684
  {
1665
- className: "absolute right-3 top-1/2 -translate-y-1/2 h-5 w-5 text-slate-400 pointer-events-none"
1685
+ className: "absolute right-3 top-1/2 -translate-y-1/2 h-5 w-5 text-slate-500 pointer-events-none"
1666
1686
  }
1667
1687
  )
1668
1688
  ] }),
1669
- error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-ios-red", children: error })
1689
+ error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-ios-red", role: "alert", "aria-live": "polite", children: error })
1670
1690
  ] });
1671
1691
  }
1672
1692
  );
@@ -1714,13 +1734,13 @@ function DropdownSelect({
1714
1734
  ${error ? "border-ios-red ring-4 ring-ios-red/10" : ""}
1715
1735
  `,
1716
1736
  children: [
1717
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: selectedOption ? "" : "text-slate-400", children: selectedOption?.label || placeholder }),
1737
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: selectedOption ? "" : "text-slate-500", children: selectedOption?.label || placeholder }),
1718
1738
  /* @__PURE__ */ jsxRuntime.jsx(
1719
1739
  framerMotion.motion.div,
1720
1740
  {
1721
1741
  animate: { rotate: isOpen ? 180 : 0 },
1722
1742
  transition: { duration: 0.2 },
1723
- children: /* @__PURE__ */ jsxRuntime.jsx(solid.ChevronDownIcon, { className: "h-5 w-5 text-slate-400" })
1743
+ children: /* @__PURE__ */ jsxRuntime.jsx(solid.ChevronDownIcon, { className: "h-5 w-5 text-slate-500" })
1724
1744
  }
1725
1745
  )
1726
1746
  ]
@@ -1764,7 +1784,7 @@ function DropdownSelect({
1764
1784
  }
1765
1785
  )
1766
1786
  ] }) }),
1767
- error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-ios-red", children: error })
1787
+ error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-ios-red", role: "alert", "aria-live": "polite", children: error })
1768
1788
  ] });
1769
1789
  }
1770
1790
  var sizes = {
@@ -2014,24 +2034,46 @@ function HeroSection({
2014
2034
  labelExtra,
2015
2035
  children
2016
2036
  }) {
2017
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "liquid-surface overflow-hidden rounded-2xl", children: [
2018
- gradient && /* @__PURE__ */ jsxRuntime.jsx("div", { className: `h-1.5 w-full bg-gradient-to-r ${gradient}` }),
2019
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 sm:p-8", children: [
2020
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-slate-600 dark:text-white/70", children: [
2021
- icon,
2022
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium", children: label }),
2023
- labelExtra
2024
- ] }),
2025
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex flex-wrap items-center justify-between gap-4", children: [
2026
- /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold tracking-tight text-slate-900 dark:text-white sm:text-4xl", children: title }),
2027
- actions && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-3", children: actions })
2028
- ] }),
2029
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 max-w-xl text-sm text-slate-500 dark:text-white/60 sm:mt-3 sm:text-lg", children: subtitle }),
2030
- toolbar && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4", children: toolbar }),
2031
- badges && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 flex flex-wrap items-center gap-4", children: badges }),
2032
- children
2033
- ] })
2034
- ] });
2037
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2038
+ "div",
2039
+ {
2040
+ role: "banner",
2041
+ "data-testid": "hero-section",
2042
+ className: "liquid-surface overflow-hidden rounded-2xl",
2043
+ children: [
2044
+ gradient && /* @__PURE__ */ jsxRuntime.jsx("div", { className: `h-1.5 w-full bg-gradient-to-r ${gradient}` }),
2045
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-5 sm:p-8", children: [
2046
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-slate-600 dark:text-white/70", children: [
2047
+ icon,
2048
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium", children: label }),
2049
+ labelExtra
2050
+ ] }),
2051
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex flex-wrap items-center justify-between gap-4", children: [
2052
+ /* @__PURE__ */ jsxRuntime.jsx(
2053
+ "h1",
2054
+ {
2055
+ "data-testid": "hero-title",
2056
+ className: "text-2xl font-bold tracking-tight text-slate-900 dark:text-white sm:text-4xl",
2057
+ children: title
2058
+ }
2059
+ ),
2060
+ actions && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-3", children: actions })
2061
+ ] }),
2062
+ /* @__PURE__ */ jsxRuntime.jsx(
2063
+ "p",
2064
+ {
2065
+ "data-testid": "hero-subtitle",
2066
+ className: "mt-2 max-w-xl text-sm text-slate-500 dark:text-white/60 sm:mt-3 sm:text-lg",
2067
+ children: subtitle
2068
+ }
2069
+ ),
2070
+ toolbar && /* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": "hero-toolbar", className: "mt-4", children: toolbar }),
2071
+ badges && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 flex flex-wrap items-center gap-4", children: badges }),
2072
+ children
2073
+ ] })
2074
+ ]
2075
+ }
2076
+ );
2035
2077
  }
2036
2078
  var DEFAULT_STYLE_CONFIG = {
2037
2079
  default: {
@@ -2304,6 +2346,9 @@ function StatCard({
2304
2346
  return /* @__PURE__ */ jsxRuntime.jsxs(
2305
2347
  "div",
2306
2348
  {
2349
+ role: "status",
2350
+ "aria-label": label,
2351
+ "data-testid": label ? `stat-card-${label.toLowerCase().replace(/\s+/g, "-")}` : "stat-card",
2307
2352
  onClick,
2308
2353
  className: `group relative overflow-hidden rounded-xl p-5 transition-all duration-200 ${isClickable ? "cursor-pointer" : ""} ${isActive ? `bg-gradient-to-br ${colorConfig.activeGradient} ring-2 ring-offset-2 ${colorConfig.activeRing} shadow-xl` : `liquid-surface hover:shadow-md ${isFiltered ? "ring-indigo-300 dark:ring-indigo-500/50" : isUrgent ? "ring-amber-300 dark:ring-amber-500/50" : ""}`} ${className}`,
2309
2354
  children: [
@@ -2335,6 +2380,7 @@ function StatCard({
2335
2380
  /* @__PURE__ */ jsxRuntime.jsx(
2336
2381
  "p",
2337
2382
  {
2383
+ "data-testid": "stat-card-value",
2338
2384
  className: `mt-4 text-3xl font-bold ${isActive ? "text-white" : isUrgent ? colorConfig.urgentValueColor || colorConfig.valueColor : colorConfig.valueColor}`,
2339
2385
  children: value
2340
2386
  }
@@ -2342,6 +2388,7 @@ function StatCard({
2342
2388
  /* @__PURE__ */ jsxRuntime.jsx(
2343
2389
  "p",
2344
2390
  {
2391
+ "data-testid": "stat-card-label",
2345
2392
  className: `mt-1 text-sm ${isActive ? "text-white/75" : "text-slate-500 dark:text-slate-400"}`,
2346
2393
  children: label
2347
2394
  }
@@ -2645,7 +2692,7 @@ function CircleSpinner({ size, color, className, ariaLabel }) {
2645
2692
  "div",
2646
2693
  {
2647
2694
  className: clsx.clsx(
2648
- "rounded-full animate-spin",
2695
+ "rounded-full animate-spin motion-reduce:animate-none",
2649
2696
  config.size,
2650
2697
  config.border,
2651
2698
  colors3.track,
@@ -2660,9 +2707,10 @@ function CircleSpinner({ size, color, className, ariaLabel }) {
2660
2707
  function DotsSpinner({ size, color, className, ariaLabel }) {
2661
2708
  const config = sizeConfig[size];
2662
2709
  const colors3 = colorClasses2[color];
2710
+ const prefersReducedMotion2 = framerMotion.useReducedMotion();
2663
2711
  const dotVariants = {
2664
2712
  initial: { scale: 0.8, opacity: 0.4 },
2665
- animate: { scale: 1, opacity: 1 }
2713
+ animate: prefersReducedMotion2 ? { scale: 1, opacity: 1 } : { scale: 1, opacity: 1 }
2666
2714
  };
2667
2715
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: clsx.clsx("flex items-center gap-1", className), role: "status", "aria-label": ariaLabel, children: [0, 1, 2].map((index) => /* @__PURE__ */ jsxRuntime.jsx(
2668
2716
  framerMotion.motion.div,
@@ -2675,7 +2723,7 @@ function DotsSpinner({ size, color, className, ariaLabel }) {
2675
2723
  variants: dotVariants,
2676
2724
  initial: "initial",
2677
2725
  animate: "animate",
2678
- transition: {
2726
+ transition: prefersReducedMotion2 ? { duration: 0 } : {
2679
2727
  duration: 0.5,
2680
2728
  repeat: Infinity,
2681
2729
  repeatType: "reverse",
@@ -2688,16 +2736,17 @@ function DotsSpinner({ size, color, className, ariaLabel }) {
2688
2736
  function PulseSpinner({ size, color, className, ariaLabel }) {
2689
2737
  const config = sizeConfig[size];
2690
2738
  const colors3 = colorClasses2[color];
2739
+ const prefersReducedMotion2 = framerMotion.useReducedMotion();
2691
2740
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: clsx.clsx("relative", config.size, className), role: "status", "aria-label": ariaLabel, children: [
2692
2741
  /* @__PURE__ */ jsxRuntime.jsx(
2693
2742
  framerMotion.motion.div,
2694
2743
  {
2695
2744
  className: clsx.clsx("absolute inset-0 rounded-full", colors3.dot),
2696
- animate: {
2745
+ animate: prefersReducedMotion2 ? {} : {
2697
2746
  scale: [1, 1.5, 1],
2698
2747
  opacity: [0.7, 0, 0.7]
2699
2748
  },
2700
- transition: {
2749
+ transition: prefersReducedMotion2 ? { duration: 0 } : {
2701
2750
  duration: 1.5,
2702
2751
  repeat: Infinity,
2703
2752
  ease: "easeInOut"
@@ -2732,7 +2781,8 @@ function Spinner({
2732
2781
  {
2733
2782
  size,
2734
2783
  color,
2735
- className
2784
+ className,
2785
+ ariaLabel
2736
2786
  }
2737
2787
  );
2738
2788
  }
@@ -3037,10 +3087,42 @@ function SegmentedControl({
3037
3087
  chunkUZ3CMNUJ_js.triggerHaptic("light");
3038
3088
  onChange(segmentValue);
3039
3089
  };
3090
+ const handleKeyDown = React11.useCallback(
3091
+ (event) => {
3092
+ if (disabled) return;
3093
+ const currentIndex = normalizedSegments.findIndex((seg) => seg.value === value);
3094
+ let nextIndex = -1;
3095
+ if (event.key === "ArrowRight" || event.key === "ArrowDown") {
3096
+ event.preventDefault();
3097
+ nextIndex = (currentIndex + 1) % normalizedSegments.length;
3098
+ } else if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
3099
+ event.preventDefault();
3100
+ nextIndex = (currentIndex - 1 + normalizedSegments.length) % normalizedSegments.length;
3101
+ } else if (event.key === "Home") {
3102
+ event.preventDefault();
3103
+ nextIndex = 0;
3104
+ } else if (event.key === "End") {
3105
+ event.preventDefault();
3106
+ nextIndex = normalizedSegments.length - 1;
3107
+ }
3108
+ if (nextIndex >= 0) {
3109
+ const nextSegment = normalizedSegments[nextIndex];
3110
+ onChange(nextSegment.value);
3111
+ chunkUZ3CMNUJ_js.triggerHaptic("light");
3112
+ const buttons = containerRef.current?.querySelectorAll("button");
3113
+ buttons?.[nextIndex]?.focus();
3114
+ }
3115
+ },
3116
+ [disabled, normalizedSegments, value, onChange]
3117
+ );
3040
3118
  return /* @__PURE__ */ jsxRuntime.jsxs(
3041
3119
  "div",
3042
3120
  {
3043
3121
  ref: containerRef,
3122
+ role: "tablist",
3123
+ "aria-live": "polite",
3124
+ "data-testid": "segmented-control",
3125
+ onKeyDown: handleKeyDown,
3044
3126
  className: `
3045
3127
  relative inline-flex items-center rounded-xl
3046
3128
  bg-white/40 dark:bg-white/[0.08]
@@ -3067,6 +3149,11 @@ function SegmentedControl({
3067
3149
  "button",
3068
3150
  {
3069
3151
  type: "button",
3152
+ role: "tab",
3153
+ "aria-selected": isSelected,
3154
+ "aria-label": segment.label,
3155
+ tabIndex: isSelected ? 0 : -1,
3156
+ "data-testid": `tab-${segment.value}`,
3070
3157
  onClick: () => handleSelect(segment.value),
3071
3158
  className: `
3072
3159
  relative z-10 flex items-center justify-center gap-1.5
@@ -4262,7 +4349,7 @@ function TableSkeletonRow({
4262
4349
  "div",
4263
4350
  {
4264
4351
  className: clsx__default.default(
4265
- "h-4 rounded bg-slate-200 dark:bg-slate-700 animate-pulse",
4352
+ "h-4 rounded bg-slate-200 dark:bg-slate-700 animate-pulse motion-reduce:animate-none",
4266
4353
  i === 0 ? "w-32" : i === columns - 1 ? "w-16" : "w-24"
4267
4354
  )
4268
4355
  }
@@ -4943,7 +5030,7 @@ function DynamicIslandNotification({
4943
5030
  icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: `h-8 w-8 rounded-full ${styles2.iconBg} flex items-center justify-center shrink-0`, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-5 w-5 text-white", children: icon }) }),
4944
5031
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0", children: [
4945
5032
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold truncate", children: title }),
4946
- message && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-gray-400 truncate", children: message })
5033
+ message && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-gray-500 truncate", children: message })
4947
5034
  ] })
4948
5035
  ] })
4949
5036
  ),
@@ -4954,7 +5041,7 @@ function DynamicIslandNotification({
4954
5041
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0", children: [
4955
5042
  appName && /* @__PURE__ */ jsxRuntime.jsx("p", { className: `text-[11px] uppercase tracking-wide font-medium ${styles2.accentColor}`, children: appName }),
4956
5043
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[15px] font-semibold leading-tight", children: title }),
4957
- message && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[13px] text-gray-400 mt-0.5 truncate", children: message })
5044
+ message && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[13px] text-gray-500 mt-0.5 truncate", children: message })
4958
5045
  ] })
4959
5046
  ] })
4960
5047
  )
@@ -5071,7 +5158,7 @@ function NotificationBellButton() {
5071
5158
  children: [
5072
5159
  /* @__PURE__ */ jsxRuntime.jsx(HeroIcons.BellIcon, { className: "h-5 w-5" }),
5073
5160
  totalCount > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "absolute top-1 right-1 flex h-2 w-2", children: [
5074
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "animate-ping absolute inline-flex h-full w-full rounded-full bg-indigo-400 opacity-75" }),
5161
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "animate-ping motion-reduce:animate-none absolute inline-flex h-full w-full rounded-full bg-indigo-400 opacity-75" }),
5075
5162
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "relative inline-flex rounded-full h-2 w-2 bg-indigo-500" })
5076
5163
  ] }) : null
5077
5164
  ]
@@ -5178,7 +5265,7 @@ function NotificationDrawer({
5178
5265
  {
5179
5266
  type: "button",
5180
5267
  onClick: () => onRemove(item.id),
5181
- className: "absolute right-2.5 top-2.5 rounded-lg p-1 text-gray-300 opacity-0 transition-all group-hover:opacity-100 hover:text-gray-500 active:scale-95 dark:text-gray-600 dark:hover:text-gray-400",
5268
+ className: "absolute right-2.5 top-2.5 rounded-lg p-1 text-gray-300 opacity-0 transition-all group-hover:opacity-100 group-focus-within:opacity-100 hover:text-gray-500 active:scale-95 dark:text-gray-600 dark:hover:text-gray-400",
5182
5269
  "aria-label": t("dismiss"),
5183
5270
  children: /* @__PURE__ */ jsxRuntime.jsx(HeroIcons.XMarkIcon, { className: "h-3.5 w-3.5" })
5184
5271
  }
@@ -5383,7 +5470,7 @@ var StatusBadge = React11.forwardRef(function StatusBadge2({ status, label, size
5383
5470
  "data-testid": `status-badge-${status}`,
5384
5471
  className: `inline-flex items-center gap-1.5 rounded-full border font-semibold backdrop-blur-sm ${SIZE_STYLES[size]} ${toneStyle.container} ${className}`,
5385
5472
  children: [
5386
- IconComponent ? /* @__PURE__ */ jsxRuntime.jsx(IconComponent, { className: `h-3 w-3 ${configuredStatus.animateIcon ? "animate-spin" : ""}` }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: `h-2 w-2 rounded-full ${toneStyle.dot}` }),
5473
+ IconComponent ? /* @__PURE__ */ jsxRuntime.jsx(IconComponent, { className: `h-3 w-3 ${configuredStatus.animateIcon ? "animate-spin motion-reduce:animate-none" : ""}` }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: `h-2 w-2 rounded-full ${toneStyle.dot}` }),
5387
5474
  resolvedLabel2
5388
5475
  ]
5389
5476
  }
@@ -5413,11 +5500,14 @@ function GlassModal({
5413
5500
  children,
5414
5501
  panelClassName = "rounded-[2rem]",
5415
5502
  contentClassName = "fixed inset-0 flex items-center justify-center overflow-y-auto p-3 sm:p-5 lg:p-6",
5416
- zIndex = "z-50"
5417
- }) {
5418
- return /* @__PURE__ */ jsxRuntime.jsxs(Headless6.Dialog, { open, onClose, className: `relative ${zIndex}`, children: [
5419
- /* @__PURE__ */ jsxRuntime.jsx(Headless6.DialogBackdrop, { className: "fixed inset-0 bg-slate-900/40 backdrop-blur-md dark:bg-black/50" }),
5420
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: contentClassName, children: /* @__PURE__ */ jsxRuntime.jsx(Headless6.DialogPanel, { className: panelClassName, children }) })
5503
+ zIndex = "z-50",
5504
+ overlayTestId,
5505
+ panelTestId,
5506
+ ariaLabelledBy
5507
+ }) {
5508
+ return /* @__PURE__ */ jsxRuntime.jsxs(Headless6.Dialog, { open, onClose, className: `relative ${zIndex}`, "aria-labelledby": ariaLabelledBy, children: [
5509
+ /* @__PURE__ */ jsxRuntime.jsx(Headless6.DialogBackdrop, { className: "fixed inset-0 bg-slate-900/40 backdrop-blur-md dark:bg-black/50", "data-testid": overlayTestId }),
5510
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: contentClassName, children: /* @__PURE__ */ jsxRuntime.jsx(Headless6.DialogPanel, { className: panelClassName, "data-testid": panelTestId, children }) })
5421
5511
  ] });
5422
5512
  }
5423
5513
  function Text({ className, ...props }) {
@@ -5920,7 +6010,8 @@ function GlassModalShell({
5920
6010
  type: "button",
5921
6011
  onClick: onClose,
5922
6012
  "aria-label": closeLabel,
5923
- className: "absolute right-4 top-4 inline-flex h-9 w-9 items-center justify-center rounded-xl text-slate-400 transition hover:bg-white/40 hover:text-slate-700 dark:hover:bg-white/[0.08] dark:hover:text-white",
6013
+ "data-testid": "modal-close",
6014
+ className: "absolute right-4 top-4 inline-flex h-9 w-9 items-center justify-center rounded-xl text-slate-400 transition hover:bg-white/40 hover:text-slate-700 dark:hover:bg-white/[0.08] dark:hover:text-white focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2",
5924
6015
  children: /* @__PURE__ */ jsxRuntime.jsx(HeroIcons.XMarkIcon, { className: "h-5 w-5" })
5925
6016
  }
5926
6017
  ),
@@ -5930,14 +6021,14 @@ function GlassModalShell({
5930
6021
  ] }),
5931
6022
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3 pr-10", children: [
5932
6023
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
5933
- /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl font-bold text-slate-900 dark:text-white sm:text-2xl", children: title }),
6024
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { id: "modal-title", "data-testid": "modal-title", className: "text-xl font-bold text-slate-900 dark:text-white sm:text-2xl", children: title }),
5934
6025
  subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-sm text-slate-500 dark:text-slate-400", children: subtitle })
5935
6026
  ] }),
5936
6027
  headerActions && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-2", children: headerActions })
5937
6028
  ] })
5938
6029
  ] }),
5939
6030
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-[72vh] overflow-y-auto px-5 pb-5 sm:px-8 sm:pb-8", children }),
5940
- footer && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-t border-white/20 px-5 py-4 dark:border-white/10 sm:px-8", children: footer })
6031
+ footer && /* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": "modal-footer", className: "border-t border-white/20 px-5 py-4 dark:border-white/10 sm:px-8", children: footer })
5941
6032
  ] });
5942
6033
  return /* @__PURE__ */ jsxRuntime.jsx(
5943
6034
  GlassModal,
@@ -5946,7 +6037,10 @@ function GlassModalShell({
5946
6037
  onClose,
5947
6038
  contentClassName: "fixed inset-0 overflow-y-auto p-3 sm:p-6",
5948
6039
  panelClassName: `liquid-surface-strong w-full overflow-hidden rounded-2xl mx-auto mt-[4vh] sm:mt-[8vh] ${SIZE_CLASSES2[maxWidth]} ${className}`,
6040
+ ariaLabelledBy: "modal-title",
5949
6041
  zIndex,
6042
+ overlayTestId: "modal-overlay",
6043
+ panelTestId: "modal-panel",
5950
6044
  children: onSubmit ? /* @__PURE__ */ jsxRuntime.jsx("form", { onSubmit: handleSubmit, children: inner }) : inner
5951
6045
  }
5952
6046
  );
@@ -5977,6 +6071,7 @@ function GlassFormModal({
5977
6071
  disabled: isLoading,
5978
6072
  outline: true,
5979
6073
  className: "w-full sm:w-auto",
6074
+ "data-testid": "form-modal-cancel",
5980
6075
  children: cancelLabel
5981
6076
  }
5982
6077
  ),
@@ -5989,11 +6084,12 @@ function GlassFormModal({
5989
6084
  loadingText: submitLabel,
5990
6085
  color: "ios-glass-blue",
5991
6086
  className: "w-full sm:w-auto",
6087
+ "data-testid": "form-modal-submit",
5992
6088
  children: submitLabel
5993
6089
  }
5994
6090
  )
5995
6091
  ] }) }) : void 0;
5996
- return /* @__PURE__ */ jsxRuntime.jsx(
6092
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": "form-modal", role: "dialog", "aria-modal": "true", "aria-label": title, children: /* @__PURE__ */ jsxRuntime.jsx(
5997
6093
  GlassModalShell,
5998
6094
  {
5999
6095
  open,
@@ -6007,7 +6103,7 @@ function GlassFormModal({
6007
6103
  footer: defaultFooter,
6008
6104
  children
6009
6105
  }
6010
- );
6106
+ ) });
6011
6107
  }
6012
6108
  function ContextMenu({
6013
6109
  position,
@@ -6648,12 +6744,13 @@ function wrapperClass(error) {
6648
6744
  error ? "focus-within:ring-2 focus-within:ring-offset-2 focus-within:ring-red-400/30" : "focus-within:ring-2 focus-within:ring-offset-2 focus-within:ring-indigo-500 dark:focus-within:ring-offset-gray-900"
6649
6745
  ].join(" ");
6650
6746
  }
6651
- function FieldMeta({ hint, error }) {
6747
+ function FieldMeta({ hint, error, errorId, hintId }) {
6652
6748
  if (!hint && !error) return null;
6653
6749
  return /* @__PURE__ */ jsxRuntime.jsx(
6654
6750
  "p",
6655
6751
  {
6656
- className: `mt-1.5 text-xs ${error ? "text-red-500" : "text-gray-500 dark:text-gray-400"}`,
6752
+ id: error ? errorId : hintId,
6753
+ className: `mt-1.5 text-xs ${error ? "text-red-500" : "text-slate-600 dark:text-gray-400"}`,
6657
6754
  ...error ? { role: "alert", "aria-live": "polite" } : {},
6658
6755
  children: error ?? hint
6659
6756
  }
@@ -6670,23 +6767,32 @@ function FormInput({
6670
6767
  onValueChange,
6671
6768
  ...props
6672
6769
  }) {
6673
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
6674
- label ? /* @__PURE__ */ jsxRuntime.jsxs("label", { className: `mb-1.5 block font-medium text-gray-500 dark:text-gray-400 ${labelClasses[inputSize]}`, children: [
6770
+ const autoId = React11.useId();
6771
+ const inputId = props.id ?? autoId;
6772
+ const errorId = `${inputId}-error`;
6773
+ const hintId = `${inputId}-hint`;
6774
+ const describedBy = error ? errorId : hint ? hintId : void 0;
6775
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": label ? `field-${label.toLowerCase().replace(/\s+/g, "-")}` : "form-field", children: [
6776
+ label ? /* @__PURE__ */ jsxRuntime.jsxs("label", { htmlFor: inputId, className: `mb-1.5 block font-medium text-gray-500 dark:text-gray-400 ${labelClasses[inputSize]}`, children: [
6675
6777
  label,
6676
6778
  required ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-0.5 text-red-500", children: "*" }) : null
6677
6779
  ] }) : null,
6678
6780
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: wrapperClass(error), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `relative flex items-center ${sizeClasses3[inputSize]} ${className}`, children: [
6679
- icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mr-2 text-gray-400 dark:text-gray-500", children: icon }) : null,
6781
+ icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mr-2 text-gray-400 dark:text-gray-500", "aria-hidden": "true", children: icon }) : null,
6680
6782
  /* @__PURE__ */ jsxRuntime.jsx(
6681
6783
  "input",
6682
6784
  {
6683
6785
  ...props,
6684
- className: "w-full bg-transparent text-gray-900 placeholder:text-gray-400 focus:outline-none dark:text-white dark:placeholder:text-gray-500",
6786
+ id: inputId,
6787
+ required,
6788
+ "aria-invalid": error ? true : void 0,
6789
+ "aria-describedby": describedBy,
6790
+ className: "w-full bg-transparent text-gray-900 placeholder:text-slate-500 focus:outline-none dark:text-white dark:placeholder:text-gray-500",
6685
6791
  onChange: (event) => onValueChange?.(event.target.value)
6686
6792
  }
6687
6793
  )
6688
6794
  ] }) }),
6689
- /* @__PURE__ */ jsxRuntime.jsx(FieldMeta, { hint, error })
6795
+ /* @__PURE__ */ jsxRuntime.jsx(FieldMeta, { hint, error, errorId, hintId })
6690
6796
  ] });
6691
6797
  }
6692
6798
  function FormTextarea({
@@ -6699,8 +6805,13 @@ function FormTextarea({
6699
6805
  onValueChange,
6700
6806
  ...props
6701
6807
  }) {
6702
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
6703
- label ? /* @__PURE__ */ jsxRuntime.jsxs("label", { className: `mb-1.5 block font-medium text-gray-500 dark:text-gray-400 ${labelClasses[inputSize]}`, children: [
6808
+ const autoId = React11.useId();
6809
+ const inputId = props.id ?? autoId;
6810
+ const errorId = `${inputId}-error`;
6811
+ const hintId = `${inputId}-hint`;
6812
+ const describedBy = error ? errorId : hint ? hintId : void 0;
6813
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": label ? `field-${label.toLowerCase().replace(/\s+/g, "-")}` : "form-field", children: [
6814
+ label ? /* @__PURE__ */ jsxRuntime.jsxs("label", { htmlFor: inputId, className: `mb-1.5 block font-medium text-gray-500 dark:text-gray-400 ${labelClasses[inputSize]}`, children: [
6704
6815
  label,
6705
6816
  required ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-0.5 text-red-500", children: "*" }) : null
6706
6817
  ] }) : null,
@@ -6708,11 +6819,15 @@ function FormTextarea({
6708
6819
  "textarea",
6709
6820
  {
6710
6821
  ...props,
6711
- className: `w-full resize-y bg-transparent px-3.5 py-2.5 text-gray-900 placeholder:text-gray-400 focus:outline-none dark:text-white dark:placeholder:text-gray-500 ${className}`,
6822
+ id: inputId,
6823
+ required,
6824
+ "aria-invalid": error ? true : void 0,
6825
+ "aria-describedby": describedBy,
6826
+ className: `w-full resize-y bg-transparent px-3.5 py-2.5 text-gray-900 placeholder:text-slate-500 focus:outline-none dark:text-white dark:placeholder:text-gray-500 ${className}`,
6712
6827
  onChange: (event) => onValueChange?.(event.target.value)
6713
6828
  }
6714
6829
  ) }),
6715
- /* @__PURE__ */ jsxRuntime.jsx(FieldMeta, { hint, error })
6830
+ /* @__PURE__ */ jsxRuntime.jsx(FieldMeta, { hint, error, errorId, hintId })
6716
6831
  ] });
6717
6832
  }
6718
6833
  var priceSizeConfig = {
@@ -6744,9 +6859,14 @@ function FormPriceInput({
6744
6859
  max,
6745
6860
  className = ""
6746
6861
  }) {
6862
+ const autoId = React11.useId();
6863
+ const inputId = autoId;
6864
+ const errorId = `${inputId}-error`;
6865
+ const hintId = `${inputId}-hint`;
6866
+ const describedBy = error ? errorId : hint ? hintId : void 0;
6747
6867
  const sizes3 = priceSizeConfig[priceSize ?? defaultPriceSize(inputSize)];
6748
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
6749
- label ? /* @__PURE__ */ jsxRuntime.jsxs("label", { className: `mb-1.5 block font-medium text-gray-500 dark:text-gray-400 ${labelClasses[inputSize]}`, children: [
6868
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": label ? `field-${label.toLowerCase().replace(/\s+/g, "-")}` : "form-field", children: [
6869
+ label ? /* @__PURE__ */ jsxRuntime.jsxs("label", { htmlFor: inputId, className: `mb-1.5 block font-medium text-gray-500 dark:text-gray-400 ${labelClasses[inputSize]}`, children: [
6750
6870
  label,
6751
6871
  required ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-0.5 text-red-500", children: "*" }) : null
6752
6872
  ] }) : null,
@@ -6762,19 +6882,24 @@ function FormPriceInput({
6762
6882
  /* @__PURE__ */ jsxRuntime.jsx(
6763
6883
  "input",
6764
6884
  {
6885
+ id: inputId,
6765
6886
  type: "number",
6766
6887
  step,
6767
6888
  value,
6768
6889
  onChange: (event) => onValueChange?.(event.target.value),
6769
6890
  placeholder,
6770
6891
  disabled,
6892
+ required,
6771
6893
  min,
6772
6894
  max,
6773
- className: `w-full bg-transparent tabular-nums ${sizes3.input} ${sizes3.padding} text-gray-900 placeholder:text-gray-400 focus:outline-none dark:text-white dark:placeholder:text-gray-500 ${colorClass ?? ""} ${className}`
6895
+ "aria-invalid": error ? true : void 0,
6896
+ "aria-describedby": describedBy,
6897
+ "aria-label": label ? `${label} in ${currencySymbol}` : void 0,
6898
+ className: `w-full bg-transparent tabular-nums ${sizes3.input} ${sizes3.padding} text-gray-900 placeholder:text-slate-500 focus:outline-none dark:text-white dark:placeholder:text-gray-500 ${colorClass ?? ""} ${className}`
6774
6899
  }
6775
6900
  )
6776
6901
  ] }) }),
6777
- /* @__PURE__ */ jsxRuntime.jsx(FieldMeta, { hint, error })
6902
+ /* @__PURE__ */ jsxRuntime.jsx(FieldMeta, { hint, error, errorId, hintId })
6778
6903
  ] });
6779
6904
  }
6780
6905
  function FormSelect({
@@ -6788,8 +6913,13 @@ function FormSelect({
6788
6913
  options,
6789
6914
  ...props
6790
6915
  }) {
6791
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
6792
- label ? /* @__PURE__ */ jsxRuntime.jsxs("label", { className: `mb-1.5 block font-medium text-gray-500 dark:text-gray-400 ${labelClasses[inputSize]}`, children: [
6916
+ const autoId = React11.useId();
6917
+ const inputId = props.id ?? autoId;
6918
+ const errorId = `${inputId}-error`;
6919
+ const hintId = `${inputId}-hint`;
6920
+ const describedBy = error ? errorId : hint ? hintId : void 0;
6921
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": label ? `field-${label.toLowerCase().replace(/\s+/g, "-")}` : "form-field", children: [
6922
+ label ? /* @__PURE__ */ jsxRuntime.jsxs("label", { htmlFor: inputId, className: `mb-1.5 block font-medium text-gray-500 dark:text-gray-400 ${labelClasses[inputSize]}`, children: [
6793
6923
  label,
6794
6924
  required ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-0.5 text-red-500", children: "*" }) : null
6795
6925
  ] }) : null,
@@ -6797,12 +6927,16 @@ function FormSelect({
6797
6927
  "select",
6798
6928
  {
6799
6929
  ...props,
6930
+ id: inputId,
6931
+ required,
6932
+ "aria-invalid": error ? true : void 0,
6933
+ "aria-describedby": describedBy,
6800
6934
  className: `w-full bg-transparent ${sizeClasses3[inputSize]} text-gray-900 focus:outline-none dark:text-white ${className}`,
6801
6935
  onChange: (event) => onValueChange?.(event.target.value),
6802
6936
  children: options.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option.value, children: option.label }, option.value))
6803
6937
  }
6804
6938
  ) }),
6805
- /* @__PURE__ */ jsxRuntime.jsx(FieldMeta, { hint, error })
6939
+ /* @__PURE__ */ jsxRuntime.jsx(FieldMeta, { hint, error, errorId, hintId })
6806
6940
  ] });
6807
6941
  }
6808
6942
  var Form = React11__namespace.default.forwardRef(
@@ -6984,7 +7118,7 @@ function BaseForm({
6984
7118
  color: "ios-glass-blue",
6985
7119
  disabled: isLoading || submitDisabled,
6986
7120
  children: [
6987
- isLoading && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-4 w-4 animate-spin rounded-full border-2 border-white border-t-transparent" }),
7121
+ isLoading && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-4 w-4 animate-spin motion-reduce:animate-none rounded-full border-2 border-white border-t-transparent" }),
6988
7122
  submitLabel
6989
7123
  ]
6990
7124
  }
@@ -7305,7 +7439,7 @@ function StepNavigationButtons({
7305
7439
  onClick: onContinue,
7306
7440
  className: `${CONTINUE_BUTTON_CLASSES}${!onBack ? " w-full" : ""}`,
7307
7441
  children: isLoading && showSpinner ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center justify-center gap-2", children: [
7308
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-4 w-4 animate-spin rounded-full border-2 border-white border-t-transparent" }),
7442
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-4 w-4 animate-spin motion-reduce:animate-none rounded-full border-2 border-white border-t-transparent" }),
7309
7443
  displayLabel
7310
7444
  ] }) : displayLabel
7311
7445
  }
@@ -7336,7 +7470,7 @@ function SearchFilterToolbar({
7336
7470
  label
7337
7471
  };
7338
7472
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
7339
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
7473
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { role: "search", "data-testid": "search-toolbar", className: "flex items-center gap-3", children: [
7340
7474
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "liquid-surface flex flex-1 items-center gap-2 flex-wrap min-h-12 rounded-xl px-3.5 py-1.5 transition-colors duration-200 focus-within:ring-2 focus-within:ring-offset-2 focus-within:ring-blue-500 dark:focus-within:ring-offset-gray-900", children: [
7341
7475
  /* @__PURE__ */ jsxRuntime.jsx(HeroIcons.MagnifyingGlassIcon, { className: "h-5 w-5 shrink-0 text-slate-400 dark:text-slate-500" }),
7342
7476
  filterPills,
@@ -7347,7 +7481,9 @@ function SearchFilterToolbar({
7347
7481
  value: query,
7348
7482
  onChange: (event) => onQueryChange(event.target.value),
7349
7483
  placeholder,
7350
- className: "min-w-[100px] flex-1 bg-transparent py-1 text-base text-gray-900 outline-none placeholder:text-slate-400 dark:text-white dark:placeholder:text-slate-500"
7484
+ "aria-label": label,
7485
+ "data-testid": "search-input",
7486
+ className: "min-w-[100px] flex-1 bg-transparent py-1 text-base text-gray-900 outline-none focus-visible:ring-2 focus-visible:ring-blue-500 placeholder:text-slate-400 dark:text-white dark:placeholder:text-slate-500"
7351
7487
  }
7352
7488
  )
7353
7489
  ] }),
@@ -7435,6 +7571,12 @@ function SearchFilterToolbar({
7435
7571
  function isPlainTextTitle(title) {
7436
7572
  return typeof title === "string" || typeof title === "number";
7437
7573
  }
7574
+ function getTestIdFromTitle(title) {
7575
+ if (isPlainTextTitle(title)) {
7576
+ return `entity-card-${String(title).toLowerCase().replace(/\s+/g, "-")}`;
7577
+ }
7578
+ return "entity-card";
7579
+ }
7438
7580
  function StatusBadgeInternal({ status }) {
7439
7581
  const tCommon = nextIntl.useTranslations("common");
7440
7582
  if (typeof status !== "boolean") {
@@ -7461,9 +7603,24 @@ function EntityCard({
7461
7603
  dragProps
7462
7604
  }) {
7463
7605
  const isInteractive = Boolean(onClick);
7606
+ const plainTextTitle = isPlainTextTitle(title) ? String(title) : void 0;
7607
+ const handleKeyDown = React11.useCallback(
7608
+ (event) => {
7609
+ if (onClick && (event.key === "Enter" || event.key === " ")) {
7610
+ event.preventDefault();
7611
+ onClick();
7612
+ }
7613
+ },
7614
+ [onClick]
7615
+ );
7464
7616
  return /* @__PURE__ */ jsxRuntime.jsxs(
7465
7617
  Card,
7466
7618
  {
7619
+ role: isInteractive ? "article" : "listitem",
7620
+ "aria-label": isInteractive ? plainTextTitle : void 0,
7621
+ "data-testid": getTestIdFromTitle(title),
7622
+ tabIndex: isInteractive ? 0 : void 0,
7623
+ onKeyDown: isInteractive ? handleKeyDown : void 0,
7467
7624
  className: `group overflow-hidden transition-all duration-200 hover:-translate-y-0.5 hover:shadow-md ${isInteractive ? "cursor-pointer" : ""} ${className}`,
7468
7625
  onPress: onClick,
7469
7626
  pressable: isInteractive,
@@ -7472,21 +7629,21 @@ function EntityCard({
7472
7629
  accentGradient && /* @__PURE__ */ jsxRuntime.jsx("div", { className: `h-1.5 w-full bg-gradient-to-r ${accentGradient}` }),
7473
7630
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-4", children: [
7474
7631
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-3", children: [
7475
- /* @__PURE__ */ jsxRuntime.jsx(
7632
+ /* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": "entity-card-title", children: /* @__PURE__ */ jsxRuntime.jsx(
7476
7633
  ItemSummary,
7477
7634
  {
7478
7635
  icon,
7479
7636
  title,
7480
- subtitle,
7637
+ subtitle: subtitle ? /* @__PURE__ */ jsxRuntime.jsx("span", { "data-testid": "entity-card-subtitle", children: subtitle }) : void 0,
7481
7638
  iconContainerClassName: "shrink-0",
7482
7639
  titleClassName: isPlainTextTitle(title) ? "truncate font-semibold text-slate-900 dark:text-white" : "font-semibold text-slate-900 dark:text-white",
7483
7640
  subtitleClassName: "mt-0.5 text-xs text-slate-500 dark:text-slate-400"
7484
7641
  }
7485
- ),
7642
+ ) }),
7486
7643
  status !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(StatusBadgeInternal, { status })
7487
7644
  ] }),
7488
7645
  children && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3", children }),
7489
- footer && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 border-t border-white/30 pt-3 dark:border-white/10 flex gap-2 justify-end opacity-0 transition-opacity duration-200 group-hover:opacity-100", children: footer })
7646
+ footer && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 border-t border-white/30 pt-3 dark:border-white/10 flex gap-2 justify-end opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-within:opacity-100", children: footer })
7490
7647
  ] })
7491
7648
  ]
7492
7649
  }
@@ -7635,6 +7792,10 @@ function FilterTileButton({
7635
7792
  {
7636
7793
  type: "button",
7637
7794
  onClick,
7795
+ role: "checkbox",
7796
+ "aria-checked": isActive,
7797
+ "aria-label": label,
7798
+ "data-testid": `filter-tile-${label.toLowerCase().replace(/\s+/g, "-")}`,
7638
7799
  className: `relative overflow-hidden rounded-2xl p-4 text-left transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 ${tokens.focusRing} dark:ring-offset-gray-900 ${isActive ? tokens.activeGradient : INACTIVE_CLASSES}`,
7639
7800
  children: [
7640
7801
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -8073,8 +8234,8 @@ function AnalysisSkeleton() {
8073
8234
  }
8074
8235
 
8075
8236
  // src/components/skeletons/shimmer.tsx
8076
- var shimmerClass = "bg-gradient-to-r from-gray-200 via-gray-100 to-gray-200 dark:from-gray-700 dark:via-gray-600 dark:to-gray-700 animate-shimmer bg-[length:200%_100%]";
8077
- var shimmerWhiteClass = "bg-white/20 animate-pulse";
8237
+ var shimmerClass = "bg-gradient-to-r from-gray-200 via-gray-100 to-gray-200 dark:from-gray-700 dark:via-gray-600 dark:to-gray-700 animate-shimmer motion-reduce:animate-none bg-[length:200%_100%]";
8238
+ var shimmerWhiteClass = "bg-white/20 animate-pulse motion-reduce:animate-none";
8078
8239
  function SectionHeaderSkeleton() {
8079
8240
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
8080
8241
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: `h-10 w-10 rounded-lg ${shimmerClass}` }),
@@ -8669,6 +8830,7 @@ function Badge({ color = "zinc", className, ...props }) {
8669
8830
  return /* @__PURE__ */ jsxRuntime.jsx(
8670
8831
  "span",
8671
8832
  {
8833
+ "data-testid": "badge",
8672
8834
  ...props,
8673
8835
  className: clsx__default.default(
8674
8836
  className,
@@ -8883,14 +9045,14 @@ function DynamicIslandConfirm({
8883
9045
  chunkUZ3CMNUJ_js.triggerHaptic("warning");
8884
9046
  }
8885
9047
  }, [open]);
8886
- return /* @__PURE__ */ jsxRuntime.jsxs(Headless6.Dialog, { open, onClose, className: "relative z-[120]", children: [
9048
+ return /* @__PURE__ */ jsxRuntime.jsxs(Headless6.Dialog, { open, onClose, className: "relative z-[120]", "aria-labelledby": "dynamic-island-title", children: [
8887
9049
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed inset-0 bg-black/10 backdrop-blur-[2px]" }),
8888
9050
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed inset-0 flex items-start justify-center pt-3 px-4", children: /* @__PURE__ */ jsxRuntime.jsxs(Headless6.DialogPanel, { className: "w-full max-w-sm rounded-[28px] bg-black/95 p-3 text-white shadow-2xl", children: [
8889
9051
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 px-2 py-1", children: [
8890
9052
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: `h-9 w-9 shrink-0 rounded-xl ${iconBackground} flex items-center justify-center`, children: icon ?? /* @__PURE__ */ jsxRuntime.jsx(HeroIcons.TrashIcon, { className: "h-5 w-5 text-white" }) }),
8891
9053
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
8892
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[11px] uppercase tracking-wide text-gray-400", children: appName }),
8893
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold", children: title })
9054
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[11px] uppercase tracking-wide text-gray-500", children: appName }),
9055
+ /* @__PURE__ */ jsxRuntime.jsx("p", { id: "dynamic-island-title", className: "text-sm font-semibold", children: title })
8894
9056
  ] })
8895
9057
  ] }),
8896
9058
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 grid grid-cols-2 gap-2", children: [
@@ -8899,7 +9061,7 @@ function DynamicIslandConfirm({
8899
9061
  {
8900
9062
  type: "button",
8901
9063
  onClick: onClose,
8902
- className: "rounded-xl bg-white/10 px-3 py-2 text-sm font-medium hover:bg-white/15",
9064
+ className: "rounded-xl bg-white/10 px-3 py-3 text-sm font-medium hover:bg-white/15 focus-visible:ring-2 focus-visible:ring-white/70",
8903
9065
  children: resolvedCancelLabel
8904
9066
  }
8905
9067
  ),
@@ -8908,7 +9070,7 @@ function DynamicIslandConfirm({
8908
9070
  {
8909
9071
  type: "button",
8910
9072
  onClick: onConfirm,
8911
- className: "rounded-xl bg-ios-red px-3 py-2 text-sm font-semibold text-white hover:bg-ios-red-hover",
9073
+ className: "rounded-xl bg-ios-red px-3 py-3 text-sm font-semibold text-white hover:bg-ios-red-hover focus-visible:ring-2 focus-visible:ring-white/70",
8912
9074
  children: resolvedConfirmLabel
8913
9075
  }
8914
9076
  )
@@ -9460,66 +9622,80 @@ var ACCENT_MAP = {
9460
9622
  function PageEmptyState({ title, message, iconName }) {
9461
9623
  const Icon = ICON_MAP[iconName] || FallbackIcon;
9462
9624
  const accent = ACCENT_MAP[iconName] || ACCENT_MAP["folder-open"];
9463
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-20", children: /* @__PURE__ */ jsxRuntime.jsxs(
9464
- framerMotion.motion.div,
9625
+ const prefersReducedMotion2 = framerMotion.useReducedMotion();
9626
+ const noMotion = { opacity: 1, scale: 1, y: 0 };
9627
+ const noTransition = { duration: 0 };
9628
+ return /* @__PURE__ */ jsxRuntime.jsx(
9629
+ "div",
9465
9630
  {
9466
- initial: { opacity: 0, scale: 0.95 },
9467
- animate: { opacity: 1, scale: 1 },
9468
- transition: springPresets.gentle,
9469
- className: "liquid-surface w-full max-w-lg rounded-2xl px-8 py-14 text-center",
9470
- children: [
9471
- /* @__PURE__ */ jsxRuntime.jsx(
9472
- framerMotion.motion.div,
9473
- {
9474
- initial: { scale: 0.6, opacity: 0 },
9475
- animate: { scale: 1, opacity: 1 },
9476
- transition: springPresets.bouncy,
9477
- className: "mx-auto mb-6",
9478
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: `inline-flex h-20 w-20 items-center justify-center rounded-full backdrop-blur-md border ${accent.container}`, children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: `h-10 w-10 ${accent.icon}` }) })
9479
- }
9480
- ),
9481
- /* @__PURE__ */ jsxRuntime.jsx(
9482
- framerMotion.motion.h3,
9483
- {
9484
- initial: { y: 12, opacity: 0 },
9485
- animate: { y: 0, opacity: 1 },
9486
- transition: { ...springPresets.default, delay: 0.1 },
9487
- className: "text-xl font-semibold text-gray-900 dark:text-white",
9488
- children: title
9489
- }
9490
- ),
9491
- /* @__PURE__ */ jsxRuntime.jsx(
9492
- framerMotion.motion.p,
9493
- {
9494
- initial: { y: 12, opacity: 0 },
9495
- animate: { y: 0, opacity: 1 },
9496
- transition: { ...springPresets.default, delay: 0.15 },
9497
- className: "mt-3 text-sm text-gray-500 dark:text-gray-400 max-w-sm mx-auto leading-relaxed",
9498
- children: message
9499
- }
9500
- ),
9501
- /* @__PURE__ */ jsxRuntime.jsx(
9502
- framerMotion.motion.div,
9503
- {
9504
- initial: { opacity: 0 },
9505
- animate: { opacity: 1 },
9506
- transition: { delay: 0.3 },
9507
- className: "mt-8 flex items-center justify-center gap-1.5",
9508
- children: [0, 1, 2].map((i) => /* @__PURE__ */ jsxRuntime.jsx(
9631
+ role: "region",
9632
+ "aria-label": title,
9633
+ "data-testid": "empty-state",
9634
+ className: "flex items-center justify-center py-20",
9635
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
9636
+ framerMotion.motion.div,
9637
+ {
9638
+ initial: prefersReducedMotion2 ? false : { opacity: 0, scale: 0.95 },
9639
+ animate: prefersReducedMotion2 ? noMotion : { opacity: 1, scale: 1 },
9640
+ transition: prefersReducedMotion2 ? noTransition : springPresets.gentle,
9641
+ className: "liquid-surface w-full max-w-lg rounded-2xl px-8 py-14 text-center",
9642
+ children: [
9643
+ /* @__PURE__ */ jsxRuntime.jsx(
9509
9644
  framerMotion.motion.div,
9510
9645
  {
9511
- initial: { scale: 0 },
9512
- animate: { scale: 1 },
9513
- transition: { ...springPresets.bouncy, delay: 0.35 + i * 0.08 },
9514
- className: "h-1.5 w-1.5 rounded-full bg-gray-300 dark:bg-gray-600"
9515
- },
9516
- i
9517
- ))
9518
- }
9519
- )
9520
- ]
9646
+ initial: prefersReducedMotion2 ? false : { scale: 0.6, opacity: 0 },
9647
+ animate: prefersReducedMotion2 ? noMotion : { scale: 1, opacity: 1 },
9648
+ transition: prefersReducedMotion2 ? noTransition : springPresets.bouncy,
9649
+ className: "mx-auto mb-6",
9650
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: `inline-flex h-20 w-20 items-center justify-center rounded-full backdrop-blur-md border ${accent.container}`, children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: `h-10 w-10 ${accent.icon}` }) })
9651
+ }
9652
+ ),
9653
+ /* @__PURE__ */ jsxRuntime.jsx(
9654
+ framerMotion.motion.h3,
9655
+ {
9656
+ "data-testid": "empty-state-title",
9657
+ initial: prefersReducedMotion2 ? false : { y: 12, opacity: 0 },
9658
+ animate: prefersReducedMotion2 ? noMotion : { y: 0, opacity: 1 },
9659
+ transition: prefersReducedMotion2 ? noTransition : { ...springPresets.default, delay: 0.1 },
9660
+ className: "text-xl font-semibold text-gray-900 dark:text-white",
9661
+ children: title
9662
+ }
9663
+ ),
9664
+ /* @__PURE__ */ jsxRuntime.jsx(
9665
+ framerMotion.motion.p,
9666
+ {
9667
+ "data-testid": "empty-state-message",
9668
+ initial: prefersReducedMotion2 ? false : { y: 12, opacity: 0 },
9669
+ animate: prefersReducedMotion2 ? noMotion : { y: 0, opacity: 1 },
9670
+ transition: prefersReducedMotion2 ? noTransition : { ...springPresets.default, delay: 0.15 },
9671
+ className: "mt-3 text-sm text-gray-500 dark:text-gray-400 max-w-sm mx-auto leading-relaxed",
9672
+ children: message
9673
+ }
9674
+ ),
9675
+ /* @__PURE__ */ jsxRuntime.jsx(
9676
+ framerMotion.motion.div,
9677
+ {
9678
+ initial: prefersReducedMotion2 ? false : { opacity: 0 },
9679
+ animate: prefersReducedMotion2 ? noMotion : { opacity: 1 },
9680
+ transition: prefersReducedMotion2 ? noTransition : { delay: 0.3 },
9681
+ className: "mt-8 flex items-center justify-center gap-1.5",
9682
+ children: [0, 1, 2].map((i) => /* @__PURE__ */ jsxRuntime.jsx(
9683
+ framerMotion.motion.div,
9684
+ {
9685
+ initial: prefersReducedMotion2 ? false : { scale: 0 },
9686
+ animate: prefersReducedMotion2 ? noMotion : { scale: 1 },
9687
+ transition: prefersReducedMotion2 ? noTransition : { ...springPresets.bouncy, delay: 0.35 + i * 0.08 },
9688
+ className: "h-1.5 w-1.5 rounded-full bg-gray-300 dark:bg-gray-600"
9689
+ },
9690
+ i
9691
+ ))
9692
+ }
9693
+ )
9694
+ ]
9695
+ }
9696
+ )
9521
9697
  }
9522
- ) });
9698
+ );
9523
9699
  }
9524
9700
  var WINDSOCK_LOADER = { gradient: "from-emerald-500 to-teal-600", accentRing: "ring-emerald-500/30" };
9525
9701
  var FUEL_PRICE_LOADER = { gradient: "from-blue-500 to-indigo-600", accentRing: "ring-blue-500/30" };
@@ -9548,7 +9724,7 @@ function BrandedLoader({
9548
9724
  "div",
9549
9725
  {
9550
9726
  className: clsx__default.default(
9551
- "absolute -inset-3 animate-ping rounded-3xl opacity-20",
9727
+ "absolute -inset-3 animate-ping motion-reduce:animate-none rounded-3xl opacity-20",
9552
9728
  `bg-gradient-to-br ${gradient}`
9553
9729
  ),
9554
9730
  style: { animationDuration: "2s" }
@@ -9560,7 +9736,7 @@ function BrandedLoader({
9560
9736
  className: clsx__default.default(
9561
9737
  "absolute -inset-1.5 rounded-[22px] ring-2",
9562
9738
  accentRing,
9563
- "animate-pulse"
9739
+ "animate-pulse motion-reduce:animate-none"
9564
9740
  ),
9565
9741
  style: { animationDuration: "1.5s" }
9566
9742
  }
@@ -9597,7 +9773,7 @@ function BrandedLoader({
9597
9773
  className: clsx__default.default(
9598
9774
  "h-1.5 w-1.5 rounded-full",
9599
9775
  `bg-gradient-to-br ${gradient}`,
9600
- "animate-bounce"
9776
+ "animate-bounce motion-reduce:animate-none"
9601
9777
  ),
9602
9778
  style: { animationDelay: `${i * 150}ms`, animationDuration: "0.8s" }
9603
9779
  },
@@ -9612,7 +9788,7 @@ function BrandedLoader({
9612
9788
  className: clsx__default.default(
9613
9789
  "h-2 w-2 rounded-full",
9614
9790
  `bg-gradient-to-br ${gradient}`,
9615
- "animate-bounce"
9791
+ "animate-bounce motion-reduce:animate-none"
9616
9792
  ),
9617
9793
  style: { animationDelay: `${i * 150}ms`, animationDuration: "0.8s" }
9618
9794
  },
@@ -11159,7 +11335,7 @@ function NotificationBadge({ count, className = "" }) {
11159
11335
  return /* @__PURE__ */ jsxRuntime.jsx(
11160
11336
  "span",
11161
11337
  {
11162
- className: `absolute -top-1 -right-1 flex items-center justify-center min-w-[18px] h-[18px] px-1 text-[10px] font-bold text-white bg-red-500 rounded-full ring-2 ring-white dark:ring-gray-800 ${count > 0 ? "animate-pulse" : ""} ${className}`,
11338
+ className: `absolute -top-1 -right-1 flex items-center justify-center min-w-[18px] h-[18px] px-1 text-[10px] font-bold text-white bg-red-500 rounded-full ring-2 ring-white dark:ring-gray-800 ${count > 0 ? "animate-pulse motion-reduce:animate-none" : ""} ${className}`,
11163
11339
  children: displayCount
11164
11340
  }
11165
11341
  );
@@ -12389,11 +12565,15 @@ function FilterPill({ icon, label, variant, onRemove }) {
12389
12565
  {
12390
12566
  type: "button",
12391
12567
  onClick: onRemove,
12568
+ role: "option",
12569
+ "aria-selected": true,
12570
+ "aria-label": typeof label === "string" ? label : void 0,
12571
+ "data-testid": "filter-pill",
12392
12572
  className: `liquid-pill liquid-pill-${variant}`,
12393
12573
  children: [
12394
12574
  icon,
12395
12575
  label,
12396
- /* @__PURE__ */ jsxRuntime.jsx(HeroIcons.XMarkIcon, { className: "liquid-pill-dismiss" })
12576
+ /* @__PURE__ */ jsxRuntime.jsx(HeroIcons.XMarkIcon, { className: "liquid-pill-dismiss", "data-testid": "filter-pill-remove" })
12397
12577
  ]
12398
12578
  }
12399
12579
  );
@@ -12658,7 +12838,7 @@ function DataPagination({
12658
12838
  value: params?.limit ?? effectivePageSize,
12659
12839
  onChange: (event) => handlePageSizeChange(event.target.value),
12660
12840
  disabled: loading,
12661
- className: "rounded-xl liquid-surface px-2 py-1.5 text-xs font-medium text-slate-700 outline-none dark:text-slate-300",
12841
+ className: "rounded-xl liquid-surface px-2 py-1.5 text-xs font-medium text-slate-700 outline-none focus-visible:ring-2 focus-visible:ring-blue-500 dark:text-slate-300",
12662
12842
  children: pageSizeOptions.map((size) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: size, children: size }, size))
12663
12843
  }
12664
12844
  ),
@@ -12677,7 +12857,7 @@ function DataPagination({
12677
12857
  (page, index) => page === "..." ? /* @__PURE__ */ jsxRuntime.jsx(
12678
12858
  "span",
12679
12859
  {
12680
- className: "inline-flex h-9 w-6 items-center justify-center text-xs text-slate-400",
12860
+ className: "inline-flex h-9 w-6 items-center justify-center text-xs text-slate-500",
12681
12861
  children: "\u2026"
12682
12862
  },
12683
12863
  `ellipsis-${index}`
@@ -13877,6 +14057,20 @@ function PlatformShell({
13877
14057
  extras
13878
14058
  ] });
13879
14059
  }
14060
+ function SkipToContent({
14061
+ targetId = "main-content",
14062
+ label = "Skip to main content"
14063
+ }) {
14064
+ return /* @__PURE__ */ jsxRuntime.jsx(
14065
+ "a",
14066
+ {
14067
+ href: `#${targetId}`,
14068
+ className: "sr-only focus:not-sr-only focus:fixed focus:top-4 focus:left-4 focus:z-[9999] focus:rounded-lg focus:bg-white focus:px-4 focus:py-2 focus:text-sm focus:font-semibold focus:text-indigo-600 focus:shadow-lg focus:ring-2 focus:ring-indigo-500 focus:outline-none dark:focus:bg-gray-800 dark:focus:text-indigo-400",
14069
+ "data-testid": "skip-to-content",
14070
+ children: label
14071
+ }
14072
+ );
14073
+ }
13880
14074
 
13881
14075
  Object.defineProperty(exports, "LOCALE_FLAGS", {
13882
14076
  enumerable: true,
@@ -14096,6 +14290,7 @@ exports.ServerErrorPage = ServerErrorPage;
14096
14290
  exports.SettingsDialog = SettingsDialog;
14097
14291
  exports.SettingsModal = SettingsModal;
14098
14292
  exports.Sheet = Sheet;
14293
+ exports.SkipToContent = SkipToContent;
14099
14294
  exports.SocialLoginButtons = SocialLoginButtons;
14100
14295
  exports.SortableTableHeader = SortableTableHeader;
14101
14296
  exports.Spinner = Spinner;
@@ -14216,5 +14411,5 @@ exports.useGeoMapState = useGeoMapState;
14216
14411
  exports.useNotifications = useNotifications;
14217
14412
  exports.usePlatformShellStore = usePlatformShellStore;
14218
14413
  exports.usePullToRefresh = usePullToRefresh;
14219
- //# sourceMappingURL=chunk-5IE2FIWT.js.map
14220
- //# sourceMappingURL=chunk-5IE2FIWT.js.map
14414
+ //# sourceMappingURL=chunk-WXI7OCNY.js.map
14415
+ //# sourceMappingURL=chunk-WXI7OCNY.js.map