@lindle/linoardo 1.0.20 → 1.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/button.cjs +32 -16
  2. package/dist/button.cjs.map +1 -1
  3. package/dist/button.d.cts +17 -7
  4. package/dist/button.d.ts +17 -7
  5. package/dist/button.js +1 -1
  6. package/dist/card.cjs +2 -2
  7. package/dist/card.cjs.map +1 -1
  8. package/dist/card.js +1 -1
  9. package/dist/chip.cjs +8 -9
  10. package/dist/chip.cjs.map +1 -1
  11. package/dist/chip.d.cts +4 -4
  12. package/dist/chip.d.ts +4 -4
  13. package/dist/chip.js +1 -1
  14. package/dist/{chunk-B5FW33K3.js → chunk-2UL3S6KC.js} +4 -4
  15. package/dist/chunk-2UL3S6KC.js.map +1 -0
  16. package/dist/chunk-67USTSXI.js +214 -0
  17. package/dist/chunk-67USTSXI.js.map +1 -0
  18. package/dist/{chunk-5PBPURGP.js → chunk-DSZ3EOQB.js} +10 -11
  19. package/dist/chunk-DSZ3EOQB.js.map +1 -0
  20. package/dist/{chunk-SZU6OYLS.js → chunk-F2G2JRKA.js} +33 -18
  21. package/dist/chunk-F2G2JRKA.js.map +1 -0
  22. package/dist/{chunk-MFLH36XK.js → chunk-JGEXEDKS.js} +3 -3
  23. package/dist/{chunk-MFLH36XK.js.map → chunk-JGEXEDKS.js.map} +1 -1
  24. package/dist/chunk-NEYVJE67.js +170 -0
  25. package/dist/chunk-NEYVJE67.js.map +1 -0
  26. package/dist/{chunk-36T6I3XH.js → chunk-SAGQYMS3.js} +14 -14
  27. package/dist/chunk-SAGQYMS3.js.map +1 -0
  28. package/dist/chunk-VPF7M2PB.js +141 -0
  29. package/dist/chunk-VPF7M2PB.js.map +1 -0
  30. package/dist/chunk-Z5A2OIDI.js +312 -0
  31. package/dist/chunk-Z5A2OIDI.js.map +1 -0
  32. package/dist/hero.cjs +143 -0
  33. package/dist/hero.cjs.map +1 -0
  34. package/dist/hero.d.cts +34 -0
  35. package/dist/hero.d.ts +34 -0
  36. package/dist/hero.js +3 -0
  37. package/dist/hero.js.map +1 -0
  38. package/dist/index.cjs +741 -58
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.d.cts +26 -55
  41. package/dist/index.d.ts +26 -55
  42. package/dist/index.js +126 -260
  43. package/dist/index.js.map +1 -1
  44. package/dist/input.cjs +1 -1
  45. package/dist/input.cjs.map +1 -1
  46. package/dist/input.js +1 -1
  47. package/dist/notification.cjs +236 -0
  48. package/dist/notification.cjs.map +1 -0
  49. package/dist/notification.d.cts +34 -0
  50. package/dist/notification.d.ts +34 -0
  51. package/dist/notification.js +3 -0
  52. package/dist/notification.js.map +1 -0
  53. package/dist/profileCard.cjs +392 -0
  54. package/dist/profileCard.cjs.map +1 -0
  55. package/dist/profileCard.d.cts +29 -0
  56. package/dist/profileCard.d.ts +29 -0
  57. package/dist/profileCard.js +5 -0
  58. package/dist/profileCard.js.map +1 -0
  59. package/dist/progress.cjs +314 -0
  60. package/dist/progress.cjs.map +1 -0
  61. package/dist/progress.d.cts +30 -0
  62. package/dist/progress.d.ts +30 -0
  63. package/dist/progress.js +3 -0
  64. package/dist/progress.js.map +1 -0
  65. package/dist/select.cjs +12 -12
  66. package/dist/select.cjs.map +1 -1
  67. package/dist/select.js +1 -1
  68. package/dist/styles.css +381 -6
  69. package/dist/switch.d.cts +1 -1
  70. package/dist/switch.d.ts +1 -1
  71. package/package.json +12 -1
  72. package/dist/chunk-36T6I3XH.js.map +0 -1
  73. package/dist/chunk-5PBPURGP.js.map +0 -1
  74. package/dist/chunk-B5FW33K3.js.map +0 -1
  75. package/dist/chunk-SZU6OYLS.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -30,17 +30,18 @@ var React3__namespace = /*#__PURE__*/_interopNamespace(React3);
30
30
  var iconBaseClasses = {
31
31
  mdi: ["mdi"]
32
32
  };
33
+
34
+ // src/Containment/Button/states.button.ts
33
35
  var base = "btn-base focus-visible:outline-none focus-visible:ring-2 rounded-lg transition-colors duration-200 font-medium disabled:opacity-50 disabled:cursor-not-allowed";
34
- var blackAndWhiteVariantClass = "bg-white text-black border border-black focus-visible:ring-black/40 focus-visible:ring-offset-white";
35
36
  var blackAndWhitePaletteClasses = {
36
- solid: tailwindMerge.twMerge(blackAndWhiteVariantClass, "bg-black text-white"),
37
- outline: blackAndWhiteVariantClass,
38
- ghost: "bg-neutral-300 text-white",
39
- text: blackAndWhiteVariantClass,
40
- filled: "bg-black text-white",
41
- underlined: tailwindMerge.twMerge(blackAndWhiteVariantClass, "b"),
42
- rounded: blackAndWhiteVariantClass,
43
- sharp: "bg-black text-white rounded-none"
37
+ solid: "bg-black text-white hover:bg-black/90 focus-visible:ring-black/40 focus-visible:ring-offset-white",
38
+ outline: "border-2 border-black text-black bg-white hover:bg-black hover:text-white focus-visible:ring-black/40 focus-visible:ring-offset-white",
39
+ ghost: "text-black bg-neutral-200 hover:bg-neutral-300 focus-visible:ring-black/20 border border-transparent",
40
+ text: "bg-transparent text-black hover:bg-neutral-200 focus-visible:ring-black/20 underline-offset-2 border border-transparent",
41
+ filled: "bg-black/10 text-black border border-black/30 hover:bg-black/20 focus-visible:ring-black/20",
42
+ underlined: "bg-transparent text-black border border-transparent underline decoration-2 underline-offset-4 hover:bg-neutral-200 focus-visible:ring-black/20",
43
+ rounded: "rounded-full border-2 border-black bg-white text-black hover:bg-black hover:text-white focus-visible:ring-black/40 focus-visible:ring-offset-white",
44
+ sharp: "bg-black text-white rounded-none hover:bg-black/90 focus-visible:ring-black/40"
44
45
  };
45
46
  var paletteVariantClasses = {
46
47
  primary: {
@@ -136,7 +137,9 @@ var resolveIconClassName = (icon) => {
136
137
  }
137
138
  const [library, providedName] = icon;
138
139
  const normalizedLibrary = library.trim();
139
- const baseClasses = iconBaseClasses[normalizedLibrary] ?? [normalizedLibrary];
140
+ const baseClasses = iconBaseClasses[normalizedLibrary] ?? [
141
+ normalizedLibrary
142
+ ];
140
143
  const iconName = providedName.trim();
141
144
  if (!iconName) {
142
145
  return baseClasses.join(" ");
@@ -152,12 +155,19 @@ var sizeClasses = {
152
155
  "x-large": "px-7 py-3.5 text-xl"
153
156
  };
154
157
  var iconOnlySizeClasses = {
155
- "x-small": "p-2 text-xs aspect-square",
158
+ "x-small": "p-0 text-xs aspect-square",
156
159
  small: "p-2.5 text-sm aspect-square",
157
160
  medium: "p-3 text-base aspect-square",
158
161
  large: "p-3.5 text-lg aspect-square",
159
162
  "x-large": "p-4 text-xl aspect-square"
160
163
  };
164
+ var iconOnlyIconSizeClasses = {
165
+ "x-small": "text-sm",
166
+ small: "text-base",
167
+ medium: "text-lg",
168
+ large: "text-xl",
169
+ "x-large": "text-2xl"
170
+ };
161
171
  var Button = React3__namespace.forwardRef(
162
172
  ({
163
173
  variant = "solid",
@@ -172,28 +182,34 @@ var Button = React3__namespace.forwardRef(
172
182
  children,
173
183
  disabled,
174
184
  onClick,
185
+ type,
186
+ as,
175
187
  ...rest
176
188
  }, ref) => {
189
+ const Component = as ?? "button";
177
190
  const variantClass = resolveVariantClass(variant, color);
178
191
  const sizeClass = iconOnly ? iconOnlySizeClasses[size] ?? iconOnlySizeClasses.medium : sizeClasses[size] ?? sizeClasses.medium;
192
+ const iconSizeClass = iconOnly ? iconOnlyIconSizeClasses[size] ?? iconOnlyIconSizeClasses.medium : void 0;
179
193
  const blockClass = block ? "w-full" : null;
194
+ const isNativeButton = Component === "button";
180
195
  const isDisabled = disabled || loading;
181
- const cursor = onClick && !isDisabled ? "cursor-pointer" : "cursor-default";
196
+ const cursor = (onClick || type === "submit") && !isDisabled ? "cursor-pointer" : "cursor-default";
182
197
  const resolvedIconClass = resolveIconClassName(icon);
183
198
  const shouldRenderIcon = Boolean(resolvedIconClass && !loading);
184
199
  const isLoadingTextProvided = loadingText !== void 0 && loadingText !== null;
185
200
  const content = iconOnly ? null : loading && isLoadingTextProvided ? loadingText : children;
186
201
  const hasDecorators = (loading || shouldRenderIcon) && Boolean(content);
187
202
  const gapClass = hasDecorators ? "gap-2" : void 0;
188
- const loadingIconClass = loading ? tailwindMerge.twMerge("mdi mdi-loading mdi-spin", "leading-none") : void 0;
189
- const iconClassName = shouldRenderIcon ? tailwindMerge.twMerge("leading-none", resolvedIconClass) : void 0;
203
+ const loadingIconClass = loading ? tailwindMerge.twMerge("mdi mdi-loading mdi-spin", "leading-none", iconSizeClass) : void 0;
204
+ const iconClassName = shouldRenderIcon ? tailwindMerge.twMerge("leading-none", iconSizeClass, resolvedIconClass) : void 0;
190
205
  return /* @__PURE__ */ jsxRuntime.jsxs(
191
- "button",
206
+ Component,
192
207
  {
193
208
  ...rest,
194
209
  ref,
195
210
  onClick,
196
- disabled: isDisabled,
211
+ disabled: isNativeButton ? isDisabled : void 0,
212
+ "aria-disabled": !isNativeButton ? isDisabled : void 0,
197
213
  className: tailwindMerge.twMerge(base, cursor, variantClass, sizeClass, blockClass, gapClass, className),
198
214
  "data-loading": loading || void 0,
199
215
  "aria-busy": loading || void 0,
@@ -217,16 +233,15 @@ var chipSizeClasses = {
217
233
  large: "text-base px-5 py-2 min-h-[2.5rem]"
218
234
  };
219
235
  var closeButtonClasses = "ml-1 flex h-5 w-5 shrink-0 items-center justify-center rounded-full border border-transparent text-current/70 transition-colors duration-200 hover:bg-current/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-current/30 focus-visible:ring-offset-2";
220
- var blackAndWhiteChipVariantClass = "bg-white text-black border border-black hover:bg-white focus-visible:ring-black/40 focus-visible:ring-offset-white";
221
236
  var blackAndWhitePaletteClasses2 = {
222
- solid: blackAndWhiteChipVariantClass,
223
- outline: blackAndWhiteChipVariantClass,
224
- ghost: blackAndWhiteChipVariantClass,
225
- text: blackAndWhiteChipVariantClass,
226
- filled: blackAndWhiteChipVariantClass,
227
- underlined: blackAndWhiteChipVariantClass,
228
- rounded: blackAndWhiteChipVariantClass,
229
- sharp: `${blackAndWhiteChipVariantClass} rounded-none`
237
+ solid: "bg-black text-white border border-black hover:bg-black/90 focus-visible:ring-black/40 focus-visible:ring-offset-white",
238
+ outline: "bg-white text-black border-2 border-black hover:bg-black hover:text-white focus-visible:ring-black/40 focus-visible:ring-offset-white",
239
+ ghost: "bg-neutral-200 text-black border border-transparent hover:bg-neutral-300 focus-visible:ring-black/20",
240
+ text: "bg-transparent text-black border border-transparent hover:bg-neutral-200 focus-visible:ring-black/20",
241
+ filled: "bg-black/10 text-black border border-black/30 hover:bg-black/20 focus-visible:ring-black/20",
242
+ underlined: "bg-transparent text-black border-0 border-b-2 border-black px-0 rounded-none hover:text-black/80 focus-visible:ring-black/20",
243
+ rounded: "rounded-full bg-white text-black border-2 border-black hover:bg-black hover:text-white focus-visible:ring-black/40 focus-visible:ring-offset-white",
244
+ sharp: "rounded-none bg-black text-white border border-black hover:bg-black/90 focus-visible:ring-black/40 focus-visible:ring-offset-white"
230
245
  };
231
246
  var paletteVariantClasses2 = {
232
247
  primary: {
@@ -1421,7 +1436,7 @@ var paddingClasses = {
1421
1436
  var cardBase = "card-base relative w-full overflow-hidden bg-white text-gray-900 transition-colors dark:bg-slate-900 dark:text-slate-100";
1422
1437
  var variantClasses = {
1423
1438
  solid: "rounded-2xl border border-gray-200 bg-white shadow-lg shadow-gray-200/55 dark:border-slate-800 dark:bg-slate-900 dark:shadow-black/30",
1424
- outline: "rounded-2xl border border-gray-300 bg-white shadow-none dark:border-slate-700 dark:bg-slate-900",
1439
+ outline: "rounded-2xl border-2 border-black bg-white shadow-none dark:border-black dark:bg-slate-900",
1425
1440
  text: "rounded-2xl border border-transparent bg-transparent shadow-none dark:border-transparent dark:bg-transparent",
1426
1441
  ghost: "rounded-2xl border border-transparent bg-gray-50 shadow-none dark:border-transparent dark:bg-slate-800",
1427
1442
  filled: "rounded-2xl border border-gray-200 bg-gray-50 shadow-sm dark:border-slate-800 dark:bg-slate-800 dark:shadow-black/20",
@@ -1635,6 +1650,143 @@ function resolveItemContent(item, index, renderItem) {
1635
1650
  }
1636
1651
  return item;
1637
1652
  }
1653
+ var positionClasses = {
1654
+ fixed: "fixed inset-x-0 top-0",
1655
+ absolute: "absolute inset-x-0 top-0",
1656
+ sticky: "sticky inset-x-0 top-0",
1657
+ static: "static",
1658
+ relative: "relative"
1659
+ };
1660
+ var colorClasses = {
1661
+ primary: "bg-primary text-white",
1662
+ surface: "bg-white text-gray-900 border-b border-gray-200",
1663
+ muted: "bg-gray-50 text-gray-900 border-b border-gray-200",
1664
+ dark: "bg-gray-900 text-white",
1665
+ transparent: "bg-transparent text-inherit"
1666
+ };
1667
+ var AppBar = ({
1668
+ title,
1669
+ logo,
1670
+ logoAlt = "Logo",
1671
+ brandHref,
1672
+ navigation = [],
1673
+ actions,
1674
+ position = "static",
1675
+ color = "surface",
1676
+ dense = false,
1677
+ elevated = true,
1678
+ contained = true,
1679
+ titlePosition = "start",
1680
+ className,
1681
+ children,
1682
+ ...rest
1683
+ }) => {
1684
+ const [mobileOpen, setMobileOpen] = React3__namespace.useState(false);
1685
+ const isDark = color === "primary" || color === "dark";
1686
+ const isTransparent = color === "transparent";
1687
+ const barClass = tailwindMerge.twMerge(
1688
+ "app-bar z-40 w-full backdrop-blur-md",
1689
+ positionClasses[position] ?? positionClasses.static,
1690
+ colorClasses[color] ?? colorClasses.surface,
1691
+ elevated && !isTransparent ? "shadow-sm shadow-black/10" : void 0,
1692
+ "relative",
1693
+ className
1694
+ );
1695
+ const innerClass = tailwindMerge.twMerge(
1696
+ "mx-auto flex w-full items-center gap-4",
1697
+ contained ? "max-w-6xl px-4 sm:px-6 lg:px-8" : "px-4",
1698
+ dense ? "py-2.5" : "py-4"
1699
+ );
1700
+ const brandTextClass = isDark ? "text-white" : "text-gray-900";
1701
+ const navBaseClass = tailwindMerge.twMerge(
1702
+ "inline-flex items-center gap-2 rounded-xl px-3 py-2 text-sm font-medium transition focus-visible:outline-none",
1703
+ isDark ? "hover:bg-white/10 focus-visible:ring-2 focus-visible:ring-white/70" : "hover:bg-gray-100 focus-visible:ring-2 focus-visible:ring-primary/50 focus-visible:ring-offset-2 focus-visible:ring-offset-transparent"
1704
+ );
1705
+ const navActiveClass = isDark ? "bg-white/15 text-white" : "bg-primary/10 text-primary";
1706
+ const renderNavItem = (item, index) => {
1707
+ const { href, label, active, onClick } = item;
1708
+ const Component = href ? "a" : "button";
1709
+ const resolvedHref = href && href.trim().length > 0 ? href : void 0;
1710
+ return /* @__PURE__ */ jsxRuntime.jsx(
1711
+ Component,
1712
+ {
1713
+ href: resolvedHref,
1714
+ onClick,
1715
+ className: tailwindMerge.twMerge(navBaseClass, active ? navActiveClass : void 0),
1716
+ "aria-current": active ? "page" : void 0,
1717
+ children: label
1718
+ },
1719
+ `${resolvedHref ?? "item"}-${index}`
1720
+ );
1721
+ };
1722
+ const brandAlignClass = titlePosition === "center" ? "justify-self-center text-center" : titlePosition === "end" ? "justify-self-end text-right" : "justify-self-start";
1723
+ const brandNode = title || logo ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: tailwindMerge.twMerge("flex min-w-0 items-center gap-3", brandAlignClass), children: [
1724
+ logo ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-10 w-10 shrink-0 items-center justify-center overflow-hidden rounded-xl bg-white/10 ring-1 ring-black/5", children: /* @__PURE__ */ jsxRuntime.jsx(
1725
+ "img",
1726
+ {
1727
+ src: logo,
1728
+ alt: logoAlt,
1729
+ className: "h-full w-full object-cover",
1730
+ loading: "lazy",
1731
+ decoding: "async"
1732
+ }
1733
+ ) }) : null,
1734
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: title ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: tailwindMerge.twMerge("text-base font-semibold leading-tight", brandTextClass), children: brandHref ? /* @__PURE__ */ jsxRuntime.jsx("a", { href: brandHref, className: "hover:underline focus-visible:outline-none", children: title }) : title }) : null })
1735
+ ] }) : null;
1736
+ return /* @__PURE__ */ jsxRuntime.jsxs("header", { ...rest, className: barClass, children: [
1737
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: innerClass, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid w-full grid-cols-[auto_1fr_auto] items-center gap-3", children: [
1738
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1739
+ navigation.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
1740
+ "button",
1741
+ {
1742
+ type: "button",
1743
+ "aria-label": "Otev\u0159\xEDt navigaci",
1744
+ className: tailwindMerge.twMerge(
1745
+ "inline-flex h-10 w-10 items-center justify-center rounded-xl text-xl sm:hidden",
1746
+ isDark ? "text-white hover:bg-white/10 focus-visible:ring-2 focus-visible:ring-white/60" : "text-gray-700 hover:bg-gray-100 focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2 focus-visible:ring-offset-transparent"
1747
+ ),
1748
+ "aria-expanded": mobileOpen,
1749
+ onClick: () => setMobileOpen((open) => !open),
1750
+ children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: mobileOpen ? "mdi mdi-close" : "mdi mdi-menu", "aria-hidden": true })
1751
+ }
1752
+ ) : null,
1753
+ navigation.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "hidden items-center gap-1 sm:flex", "aria-label": "Hlavni navigace", children: navigation.map(renderNavItem) }) : null
1754
+ ] }),
1755
+ brandNode,
1756
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-auto flex items-center justify-end gap-2", children: [
1757
+ children,
1758
+ actions
1759
+ ] })
1760
+ ] }) }),
1761
+ navigation.length > 0 && mobileOpen ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sm:hidden", children: /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "absolute inset-x-0 top-full border-t border-gray-200/70 bg-white/95 p-3 shadow-lg shadow-gray-900/5 backdrop-blur-md", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-2", "aria-label": "Mobilni navigace", children: navigation.map((item, index) => {
1762
+ const { href, label, active, onClick } = item;
1763
+ const Component = href ? "a" : "button";
1764
+ const resolvedHref = href && href.trim().length > 0 ? href : void 0;
1765
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1766
+ Component,
1767
+ {
1768
+ href: resolvedHref,
1769
+ onClick: (event) => {
1770
+ onClick?.(event);
1771
+ setMobileOpen(false);
1772
+ },
1773
+ className: tailwindMerge.twMerge(
1774
+ "flex items-center justify-between rounded-xl px-3 py-2 text-sm font-medium transition",
1775
+ active ? "bg-primary/10 text-primary" : "text-gray-800 hover:bg-gray-100"
1776
+ ),
1777
+ "aria-current": active ? "page" : void 0,
1778
+ children: [
1779
+ label,
1780
+ active ? /* @__PURE__ */ jsxRuntime.jsx("i", { className: "mdi mdi-circle-small text-primary", "aria-hidden": true }) : null
1781
+ ]
1782
+ },
1783
+ `${resolvedHref ?? "mobile-item"}-${index}`
1784
+ );
1785
+ }) }) }) }) : null
1786
+ ] });
1787
+ };
1788
+ AppBar.displayName = "AppBar";
1789
+ var AppBar_default = AppBar;
1638
1790
  var containerVariants = {
1639
1791
  solid: "bg-gradient-to-br from-primary via-primary/90 to-indigo-600 text-white shadow-2xl shadow-primary/30",
1640
1792
  outline: "border border-gray-200 bg-white text-gray-900",
@@ -1778,7 +1930,17 @@ var variantMap = {
1778
1930
  rounded: "bg-white text-gray-900 border border-gray-200 rounded-3xl shadow-md",
1779
1931
  sharp: "bg-white text-gray-900 border border-gray-200 rounded-none shadow"
1780
1932
  };
1781
- var radiusMap = {
1933
+ var cardRadiusMap = {
1934
+ solid: "rounded-2xl",
1935
+ outline: "rounded-2xl",
1936
+ text: "rounded-2xl",
1937
+ ghost: "rounded-2xl",
1938
+ filled: "rounded-3xl",
1939
+ underlined: "rounded-t-2xl",
1940
+ rounded: "rounded-3xl",
1941
+ sharp: "rounded-none"
1942
+ };
1943
+ var avatarRadiusMap = {
1782
1944
  solid: "rounded-2xl",
1783
1945
  outline: "rounded-2xl",
1784
1946
  text: "rounded-2xl",
@@ -1789,13 +1951,26 @@ var radiusMap = {
1789
1951
  sharp: "rounded-none"
1790
1952
  };
1791
1953
  var isDarkVariant = (variant) => variant === "filled";
1792
- var SocialIcons = ({ socials = [], dark }) => {
1954
+ var SocialIcons = ({
1955
+ socials = [],
1956
+ dark
1957
+ }) => {
1793
1958
  if (socials.length === 0) return null;
1794
- const iconBase = tailwindMerge.twMerge(
1959
+ tailwindMerge.twMerge(
1795
1960
  "flex h-10 w-10 items-center justify-center rounded-full border text-lg transition",
1796
1961
  dark ? "border-white/30 text-white hover:bg-white/10" : "border-gray-200 text-gray-600 hover:border-primary/50 hover:text-primary"
1797
1962
  );
1798
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2", children: socials.map((link) => /* @__PURE__ */ jsxRuntime.jsx("a", { href: link.href, "aria-label": link.label ?? link.icon, className: iconBase, children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: tailwindMerge.twMerge("mdi", link.icon), "aria-hidden": true }) }, link.href)) });
1963
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2", children: socials.map((link) => (
1964
+ // <a
1965
+ // key={link.href}
1966
+ // href={link.href}
1967
+ // aria-label={link.label ?? link.icon}
1968
+ // className={iconBase}
1969
+ // >
1970
+ // <i className={twMerge('mdi', link.icon)} aria-hidden />
1971
+ // </a>
1972
+ /* @__PURE__ */ jsxRuntime.jsx(Button_default, { iconOnly: true, icon: link.icon, variant: "rounded", size: "x-small" })
1973
+ )) });
1799
1974
  };
1800
1975
  var Badges = ({ badges = [], dark }) => {
1801
1976
  if (badges.length === 0) return null;
@@ -1805,19 +1980,14 @@ var Badges = ({ badges = [], dark }) => {
1805
1980
  );
1806
1981
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2", children: badges.map((badge) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: badgeBase, children: badge.label }, badge.label)) });
1807
1982
  };
1808
- var AvatarFrame = ({
1809
- avatar,
1810
- size = "md",
1811
- ring,
1812
- radius
1813
- }) => {
1983
+ var AvatarFrame = ({ avatar, size = "md", ring, radius }) => {
1814
1984
  const dimension = size === "lg" ? "h-28 w-28" : "h-20 w-20";
1815
1985
  const ringClass = ring ? "ring-4 ring-white/80 ring-offset-4 ring-offset-transparent" : "";
1816
1986
  return /* @__PURE__ */ jsxRuntime.jsx(
1817
1987
  "div",
1818
1988
  {
1819
1989
  className: tailwindMerge.twMerge(
1820
- "overflow-hidden bg-gradient-to-br from-primary/10 to-primary/30",
1990
+ "overflow-hidden bg-linear-to-br from-primary/10 to-primary/30",
1821
1991
  radius,
1822
1992
  dimension,
1823
1993
  ringClass
@@ -1847,14 +2017,15 @@ var ProfileCard = ({
1847
2017
  ...rest
1848
2018
  }) => {
1849
2019
  const baseVariant = variantMap[variant] ?? variantMap.solid;
1850
- const radius = radiusMap[variant] ?? "rounded-2xl";
2020
+ const cardRadius = cardRadiusMap[variant] ?? "rounded-2xl";
2021
+ const avatarRadius = avatarRadiusMap[variant] ?? "rounded-2xl";
1851
2022
  const dark = isDarkVariant(variant);
1852
2023
  const muted = dark ? "text-white/70" : "text-gray-600";
1853
2024
  const accent = dark ? "text-white" : "text-gray-900";
1854
2025
  const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1855
2026
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
1856
2027
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
1857
- /* @__PURE__ */ jsxRuntime.jsx(AvatarFrame, { avatar, radius }),
2028
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarFrame, { avatar, radius: avatarRadius }),
1858
2029
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1859
2030
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: tailwindMerge.twMerge("text-xl font-semibold", accent), children: name }),
1860
2031
  role && /* @__PURE__ */ jsxRuntime.jsx("p", { className: tailwindMerge.twMerge("text-sm font-medium", muted), children: role })
@@ -1866,9 +2037,9 @@ var ProfileCard = ({
1866
2037
  /* @__PURE__ */ jsxRuntime.jsx(SocialIcons, { socials, dark })
1867
2038
  ] });
1868
2039
  const spotlightContent = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative overflow-hidden", children: [
1869
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-br from-primary/10 via-transparent to-primary/20 blur-3xl" }),
2040
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-linear-to-br from-primary/10 via-transparent to-primary/20 blur-3xl" }),
1870
2041
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex flex-col gap-6 md:flex-row md:items-center", children: [
1871
- /* @__PURE__ */ jsxRuntime.jsx(AvatarFrame, { avatar, size: "lg", ring: true, radius }),
2042
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarFrame, { avatar, size: "lg", ring: true, radius: avatarRadius }),
1872
2043
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
1873
2044
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: tailwindMerge.twMerge("text-2xl font-semibold", accent), children: name }),
1874
2045
  role && /* @__PURE__ */ jsxRuntime.jsx("p", { className: tailwindMerge.twMerge("text-sm font-medium uppercase tracking-wide", muted), children: role }),
@@ -1879,7 +2050,7 @@ var ProfileCard = ({
1879
2050
  ] })
1880
2051
  ] });
1881
2052
  const splitContent = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-6 md:grid-cols-[auto,1fr] md:items-center", children: [
1882
- /* @__PURE__ */ jsxRuntime.jsx(AvatarFrame, { avatar, size: "lg", ring: true, radius }),
2053
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarFrame, { avatar, size: "lg", ring: true, radius: avatarRadius }),
1883
2054
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
1884
2055
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1885
2056
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: tailwindMerge.twMerge("text-2xl font-semibold", accent), children: name }),
@@ -1902,7 +2073,7 @@ var ProfileCard = ({
1902
2073
  className: tailwindMerge.twMerge(
1903
2074
  "profile-card relative overflow-hidden p-6 transition duration-200 hover:-translate-y-0.5 hover:shadow-xl",
1904
2075
  baseVariant,
1905
- radius,
2076
+ cardRadius,
1906
2077
  className
1907
2078
  ),
1908
2079
  children: layoutMap[layout] ?? layoutMap.classic
@@ -1960,7 +2131,7 @@ var Input = ({
1960
2131
  const variantClasses3 = {
1961
2132
  solid: "rounded border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40",
1962
2133
  sharp: "rounded-none border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40",
1963
- outline: "rounded border border-gray-300 bg-transparent focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30 dark:border-gray-600 dark:bg-transparent dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40",
2134
+ outline: "rounded border-2 border-black bg-white focus-visible:border-black focus-visible:ring-2 focus-visible:ring-black/30 dark:border-black dark:bg-transparent dark:focus-visible:border-black dark:focus-visible:ring-black/40",
1964
2135
  text: "rounded-none border-0 border-b border-transparent px-0 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent dark:border-b-gray-600 dark:focus-visible:border-primary/70",
1965
2136
  ghost: "rounded border border-transparent bg-gray-50 text-gray-900 focus-visible:bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/15 dark:bg-slate-800 dark:text-gray-100 dark:focus-visible:bg-slate-700 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/25",
1966
2137
  filled: "rounded border border-gray-200 bg-gray-100 focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/25 dark:border-gray-700 dark:bg-slate-800 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/30",
@@ -2082,16 +2253,16 @@ function generateString(length = 5) {
2082
2253
  }
2083
2254
  return result;
2084
2255
  }
2085
- var baseClass = "select-base w-full appearance-none focus-visible:outline-none focus-visible:ring-primary transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed bg-white text-gray-900";
2256
+ var baseClass = "select-base w-full appearance-none focus-visible:outline-none focus-visible:ring-primary transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed bg-white text-gray-900 placeholder:text-gray-500 dark:bg-slate-900 dark:text-gray-100 dark:placeholder:text-gray-400";
2086
2257
  var variantClasses2 = {
2087
- solid: "rounded border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30",
2088
- sharp: "rounded-none border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30",
2089
- outline: "rounded border border-gray-300 bg-transparent focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30",
2090
- text: "rounded-none border-0 border-b border-transparent pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent",
2091
- ghost: "rounded border border-transparent bg-gray-50 text-gray-900 focus-visible:bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/15",
2092
- filled: "rounded border border-gray-200 bg-gray-100 focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/25",
2093
- underlined: "rounded-none border-0 border-b border-gray-300 pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent",
2094
- rounded: "rounded-full pl-4 pr-10 border border-gray-300 bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/20 shadow-sm"
2258
+ solid: "rounded border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40",
2259
+ sharp: "rounded-none border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40",
2260
+ outline: "rounded border-2 border-black bg-white focus-visible:border-black focus-visible:ring-2 focus-visible:ring-black/30 dark:border-black dark:bg-transparent dark:focus-visible:border-black dark:focus-visible:ring-black/40",
2261
+ text: "rounded-none border-0 border-b border-transparent pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent dark:border-b-gray-600 dark:focus-visible:border-primary/70",
2262
+ ghost: "rounded border border-transparent bg-gray-50 text-gray-900 focus-visible:bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/15 dark:bg-slate-800 dark:text-gray-100 dark:focus-visible:bg-slate-700 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/25",
2263
+ filled: "rounded border border-gray-200 bg-gray-100 focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/25 dark:border-gray-700 dark:bg-slate-800 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/30",
2264
+ underlined: "rounded-none border-0 border-b border-gray-300 pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent dark:border-b-gray-600 dark:focus-visible:border-primary/70",
2265
+ rounded: "rounded-full pl-4 pr-10 border border-gray-300 bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/20 shadow-sm dark:border-gray-600 dark:bg-slate-900 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/30 dark:shadow-black/20"
2095
2266
  };
2096
2267
  var sizeClasses2 = {
2097
2268
  "x-small": { padding: "pl-2 pr-8 py-2", text: "text-xs" },
@@ -2173,7 +2344,7 @@ var Select = ({
2173
2344
  const shouldRenderPlaceholder = !multiple && placeholderText !== void 0;
2174
2345
  const labelShouldFloat = hasValue || isFocused;
2175
2346
  const labelLeftClass = "left-3";
2176
- const labelBgDefault = ["outline", "text", "underlined"].includes(variant) ? "bg-transparent" : "bg-white/90";
2347
+ const labelBgDefault = ["outline", "text", "underlined"].includes(variant) ? "bg-transparent" : "bg-white/90 dark:bg-slate-900";
2177
2348
  const handleFocus = (event) => {
2178
2349
  if (hidePlaceholderUntilFocus) setIsFocused(true);
2179
2350
  onFocus?.(event);
@@ -2209,13 +2380,13 @@ var Select = ({
2209
2380
  ]
2210
2381
  }
2211
2382
  ),
2212
- !multiple && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "pointer-events-none absolute inset-y-0 right-3 flex items-center text-gray-500", children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "mdi mdi-chevron-down text-base leading-none", "aria-hidden": true }) }),
2383
+ !multiple && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "pointer-events-none absolute inset-y-0 right-3 flex items-center text-gray-500 dark:text-gray-300", children: /* @__PURE__ */ jsxRuntime.jsx("i", { className: "mdi mdi-chevron-down text-base leading-none", "aria-hidden": true }) }),
2213
2384
  label && /* @__PURE__ */ jsxRuntime.jsx(
2214
2385
  "label",
2215
2386
  {
2216
2387
  htmlFor: selectId,
2217
2388
  className: tailwindMerge.twMerge(
2218
- "absolute transition-all duration-150 pointer-events-none text-gray-700",
2389
+ "absolute transition-all duration-150 pointer-events-none text-gray-700 dark:text-gray-200",
2219
2390
  labelLeftClass,
2220
2391
  labelShouldFloat ? [
2221
2392
  "top-0 text-xs px-1",
@@ -2507,7 +2678,7 @@ var sizeClasses3 = {
2507
2678
  large: "text-lg",
2508
2679
  "x-large": "text-2xl"
2509
2680
  };
2510
- var colorClasses = {
2681
+ var colorClasses2 = {
2511
2682
  primary: "text-primary",
2512
2683
  neutral: "text-gray-700",
2513
2684
  info: "text-sky-600",
@@ -2539,11 +2710,521 @@ var Icon = ({ className, icon, size, color, ...rest }) => {
2539
2710
  }
2540
2711
  const classBase = "mdi";
2541
2712
  const sizeClass = size ? sizeClasses3[size] ?? sizeClasses3.medium : void 0;
2542
- const colorClass = color ? colorClasses[color] ?? colorClasses.primary : void 0;
2713
+ const colorClass = color ? colorClasses2[color] ?? colorClasses2.primary : void 0;
2543
2714
  return /* @__PURE__ */ jsxRuntime.jsx("i", { ...rest, className: tailwindMerge.twMerge(classBase, iconValue, sizeClass, colorClass, className) });
2544
2715
  };
2545
2716
  var Icon_default = Icon;
2717
+ var placementClasses3 = {
2718
+ topLeft: "top-4 left-4 items-start",
2719
+ topRight: "top-4 right-4 items-end",
2720
+ bottomLeft: "bottom-4 left-4 items-start",
2721
+ bottomRight: "bottom-4 right-4 items-end"
2722
+ };
2723
+ var typeIconMap = {
2724
+ info: "mdi-information-outline",
2725
+ success: "mdi-check-circle-outline",
2726
+ warning: "mdi-alert-outline",
2727
+ error: "mdi-close-circle-outline"
2728
+ };
2729
+ var typeAccentMap = {
2730
+ info: "bg-sky-50 text-sky-600",
2731
+ success: "bg-emerald-50 text-emerald-600",
2732
+ warning: "bg-amber-50 text-amber-700",
2733
+ error: "bg-red-50 text-red-600"
2734
+ };
2735
+ var typeTone = {
2736
+ info: {
2737
+ bg: "bg-sky-50",
2738
+ text: "text-sky-900",
2739
+ border: "border-sky-200",
2740
+ iconBg: "bg-sky-100",
2741
+ iconText: "text-sky-600"
2742
+ },
2743
+ success: {
2744
+ bg: "bg-emerald-50",
2745
+ text: "text-emerald-900",
2746
+ border: "border-emerald-200",
2747
+ iconBg: "bg-emerald-100",
2748
+ iconText: "text-emerald-600"
2749
+ },
2750
+ warning: {
2751
+ bg: "bg-amber-50",
2752
+ text: "text-amber-900",
2753
+ border: "border-amber-200",
2754
+ iconBg: "bg-amber-100",
2755
+ iconText: "text-amber-700"
2756
+ },
2757
+ error: {
2758
+ bg: "bg-red-50",
2759
+ text: "text-red-900",
2760
+ border: "border-red-200",
2761
+ iconBg: "bg-red-100",
2762
+ iconText: "text-red-600"
2763
+ }
2764
+ };
2765
+ var resolveVariantClass3 = (variant, type) => {
2766
+ const tone = type ? typeTone[type] : void 0;
2767
+ switch (variant) {
2768
+ case "filled":
2769
+ return tailwindMerge.twMerge(
2770
+ tone?.bg ?? "bg-primary/10",
2771
+ tone?.text ?? "text-primary",
2772
+ "border border-transparent shadow-none"
2773
+ );
2774
+ case "outline":
2775
+ return tailwindMerge.twMerge(
2776
+ "bg-white/90",
2777
+ tone?.text ?? "text-gray-900",
2778
+ tone?.border ?? "border-primary/20",
2779
+ "border-[1.5px]"
2780
+ );
2781
+ case "ghost":
2782
+ return tailwindMerge.twMerge(
2783
+ "bg-transparent shadow-none border border-transparent",
2784
+ tone?.text ?? "text-gray-900"
2785
+ );
2786
+ case "solid":
2787
+ default:
2788
+ return "bg-white/95 text-gray-900 border border-gray-200";
2789
+ }
2790
+ };
2791
+ var resolveIconClassName4 = (icon) => {
2792
+ if (!icon) return void 0;
2793
+ if (typeof icon === "string") {
2794
+ const trimmed = icon.trim();
2795
+ if (!trimmed) return void 0;
2796
+ if (trimmed.includes(" ")) return trimmed;
2797
+ const normalized2 = trimmed.startsWith("mdi-") ? trimmed : `mdi-${trimmed}`;
2798
+ return `mdi ${normalized2}`;
2799
+ }
2800
+ const [library, iconName] = icon;
2801
+ const normalized = iconName?.startsWith("mdi-") ? iconName : `mdi-${iconName}`;
2802
+ return `mdi ${library} ${normalized}`.trim();
2803
+ };
2804
+ var resolveIconNode = (icon, fallbackClassName) => {
2805
+ if (React3__namespace.isValidElement(icon)) return icon;
2806
+ const iconClassName = resolveIconClassName4(icon) ?? fallbackClassName;
2807
+ if (!iconClassName) return null;
2808
+ const hasBase = iconClassName.split(" ").some((token) => token.trim() === "mdi");
2809
+ const hasGlyph = iconClassName.includes("mdi-");
2810
+ const finalClassName = hasBase && hasGlyph ? iconClassName : `mdi ${iconClassName}`.trim();
2811
+ return /* @__PURE__ */ jsxRuntime.jsx("i", { className: finalClassName, "aria-hidden": true });
2812
+ };
2813
+ var NotificationCard = ({ item }) => {
2814
+ const {
2815
+ key,
2816
+ message,
2817
+ description,
2818
+ icon,
2819
+ closeIcon,
2820
+ closable = true,
2821
+ btn,
2822
+ onClick,
2823
+ className,
2824
+ style,
2825
+ role = "status",
2826
+ type,
2827
+ variant = "solid",
2828
+ ...rest
2829
+ } = item;
2830
+ const hasMessage = message !== void 0 && message !== null;
2831
+ const hasDescription = description !== void 0 && description !== null;
2832
+ const hasContent = hasMessage || hasDescription;
2833
+ const accentClass = type ? typeAccentMap[type] : void 0;
2834
+ const iconNode = resolveIconNode(icon, type ? `mdi ${typeIconMap[type]}` : void 0);
2835
+ const closeIconNode = resolveIconNode(closeIcon, "mdi mdi-close");
2836
+ const variantClass = resolveVariantClass3(variant, type);
2837
+ const toneIconBg = type ? typeTone[type]?.iconBg : void 0;
2838
+ const toneIconText = type ? typeTone[type]?.iconText : void 0;
2839
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2840
+ "article",
2841
+ {
2842
+ ...rest,
2843
+ role,
2844
+ className: tailwindMerge.twMerge(
2845
+ "pointer-events-auto flex w-88 max-w-[calc(100vw-2.5rem)] gap-3 rounded-2xl p-4 shadow-xl ring-1 ring-black/5 backdrop-blur-sm transition hover:-translate-y-0.5 hover:shadow-2xl focus:outline-none",
2846
+ "dark:border-gray-800 dark:bg-gray-900/95 dark:text-gray-50 dark:ring-white/5",
2847
+ variantClass,
2848
+ className
2849
+ ),
2850
+ style,
2851
+ onClick,
2852
+ children: [
2853
+ iconNode ? /* @__PURE__ */ jsxRuntime.jsx(
2854
+ "div",
2855
+ {
2856
+ className: tailwindMerge.twMerge(
2857
+ "mt-0.5 flex h-10 w-10 shrink-0 items-center justify-center rounded-xl text-xl",
2858
+ toneIconBg ?? accentClass ?? "bg-primary/10",
2859
+ toneIconText ?? "text-primary"
2860
+ ),
2861
+ children: iconNode
2862
+ }
2863
+ ) : null,
2864
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1 space-y-1", children: [
2865
+ hasContent ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
2866
+ hasMessage ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[15px] font-semibold leading-5 text-gray-900 dark:text-white", children: message }) : null,
2867
+ hasDescription ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm leading-6 text-gray-600 dark:text-gray-300", children: description }) : null
2868
+ ] }) : null,
2869
+ btn ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pt-1 text-sm", children: btn }) : null
2870
+ ] }),
2871
+ closable ? /* @__PURE__ */ jsxRuntime.jsx(
2872
+ "button",
2873
+ {
2874
+ type: "button",
2875
+ "aria-label": "Zav\u0159\xEDt upozorn\u011Bn\xED",
2876
+ className: "-mr-1 -mt-1 h-8 w-8 shrink-0 rounded-full text-gray-500 transition hover:bg-gray-100 hover:text-gray-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-white",
2877
+ onClick: (event) => {
2878
+ event.stopPropagation();
2879
+ item.onClose?.();
2880
+ },
2881
+ children: closeIconNode
2882
+ }
2883
+ ) : null
2884
+ ]
2885
+ }
2886
+ );
2887
+ };
2888
+ var Notification = ({
2889
+ items = [],
2890
+ placement = "topRight",
2891
+ gap = 12,
2892
+ containerClassName,
2893
+ className,
2894
+ ...rest
2895
+ }) => {
2896
+ if (!items.length) return null;
2897
+ const grouped = /* @__PURE__ */ new Map();
2898
+ items.forEach((item) => {
2899
+ const resolvedKey = item.key ?? `notification-${item.message ?? Math.random()}`;
2900
+ const resolvedPlacement = item.placement ?? placement;
2901
+ const group = grouped.get(resolvedPlacement) ?? [];
2902
+ group.push({ ...item, key: resolvedKey });
2903
+ grouped.set(resolvedPlacement, group);
2904
+ });
2905
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: Array.from(grouped.entries()).map(([groupPlacement, groupItems]) => /* @__PURE__ */ jsxRuntime.jsx(
2906
+ "div",
2907
+ {
2908
+ className: tailwindMerge.twMerge(
2909
+ "pointer-events-none fixed z-70 flex w-full max-w-[24rem] flex-col",
2910
+ placementClasses3[groupPlacement],
2911
+ containerClassName,
2912
+ className
2913
+ ),
2914
+ style: { gap: `${gap}px` },
2915
+ ...rest,
2916
+ children: groupItems.map((item) => /* @__PURE__ */ jsxRuntime.jsx(NotificationCard, { item }, item.key))
2917
+ },
2918
+ groupPlacement
2919
+ )) });
2920
+ };
2921
+ var Notification_default = Notification;
2922
+ var clampPercent = (value) => {
2923
+ if (value === void 0 || value === null || Number.isNaN(value)) {
2924
+ return 0;
2925
+ }
2926
+ return Math.min(100, Math.max(0, value));
2927
+ };
2928
+ var statusIconMap = {
2929
+ success: "mdi mdi-check",
2930
+ exception: "mdi mdi-alert"
2931
+ };
2932
+ var strokeColorByStatus = {
2933
+ normal: "rgb(99 102 241)",
2934
+ active: "rgb(99 102 241)",
2935
+ success: "rgb(16 185 129)",
2936
+ exception: "rgb(239 68 68)"
2937
+ };
2938
+ var trailColorDefault = "rgb(229 231 235)";
2939
+ var resolveStroke = (status, strokeColor, gradientId) => {
2940
+ if (!strokeColor) {
2941
+ return { color: strokeColorByStatus[status] };
2942
+ }
2943
+ if (typeof strokeColor === "string") {
2944
+ return { color: strokeColor };
2945
+ }
2946
+ const id = gradientId ?? `progress-gradient-${Math.random().toString(16).slice(2)}`;
2947
+ return {
2948
+ color: `url(#${id})`,
2949
+ gradient: { id, from: strokeColor.from, to: strokeColor.to },
2950
+ cssGradient: `linear-gradient(90deg, ${strokeColor.from}, ${strokeColor.to})`
2951
+ };
2952
+ };
2953
+ var resolveRotation = (gapPosition) => {
2954
+ switch (gapPosition) {
2955
+ case "bottom":
2956
+ return 90;
2957
+ case "left":
2958
+ return 180;
2959
+ case "right":
2960
+ return 0;
2961
+ case "top":
2962
+ default:
2963
+ return -90;
2964
+ }
2965
+ };
2966
+ var buildGradientId = (strokeColor) => {
2967
+ if (strokeColor && typeof strokeColor !== "string") {
2968
+ const from = strokeColor.from.replace(/\W+/g, "");
2969
+ const to = strokeColor.to.replace(/\W+/g, "");
2970
+ return `progress-gradient-${from}-${to}`;
2971
+ }
2972
+ return void 0;
2973
+ };
2974
+ var InfoNode = ({ status, percent, successPercent, format }) => {
2975
+ const iconClass = status === "success" || status === "exception" ? statusIconMap[status] : void 0;
2976
+ const content = typeof format === "function" ? format(percent, successPercent) : iconClass ? /* @__PURE__ */ jsxRuntime.jsx("i", { className: iconClass, "aria-hidden": true }) : `${Math.round(percent)}%`;
2977
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium text-gray-700 dark:text-gray-200", children: content });
2978
+ };
2979
+ var renderSteps = (percent, steps, status, strokeStyle, trailColor, height) => {
2980
+ const filled = Math.round(percent / 100 * steps);
2981
+ const stepStyle = height ? { height } : {};
2982
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex w-full items-center gap-1", style: stepStyle, children: Array.from({ length: steps }).map((_, idx) => {
2983
+ const isFilled = idx < filled;
2984
+ const resolvedStyle = {
2985
+ ...isFilled ? strokeStyle : { backgroundColor: trailColor ?? trailColorDefault },
2986
+ height
2987
+ };
2988
+ return /* @__PURE__ */ jsxRuntime.jsx(
2989
+ "span",
2990
+ {
2991
+ className: tailwindMerge.twMerge(
2992
+ "flex-1 rounded-full",
2993
+ isFilled ? void 0 : "bg-gray-200 dark:bg-gray-800",
2994
+ status === "active" && isFilled ? "animate-pulse" : void 0
2995
+ ),
2996
+ style: resolvedStyle
2997
+ },
2998
+ idx
2999
+ );
3000
+ }) });
3001
+ };
3002
+ var LineProgress = ({
3003
+ percent,
3004
+ status,
3005
+ successPercent,
3006
+ format,
3007
+ showInfo = true,
3008
+ strokeWidth,
3009
+ trailColor,
3010
+ strokeColor,
3011
+ success,
3012
+ size = "default",
3013
+ steps,
3014
+ className,
3015
+ style,
3016
+ ...rest
3017
+ }) => {
3018
+ const height = strokeWidth ?? (size === "small" ? 6 : size === "large" ? 12 : 8);
3019
+ const gradientId = buildGradientId(strokeColor);
3020
+ const { color, gradient, cssGradient } = resolveStroke(status, strokeColor, gradientId);
3021
+ const stepStrokeStyle = gradient ? { backgroundImage: cssGradient } : { backgroundColor: color };
3022
+ const lineStyle = {
3023
+ height,
3024
+ backgroundColor: trailColor ?? trailColorDefault
3025
+ };
3026
+ const barStyle = {
3027
+ width: `${percent}%`,
3028
+ height,
3029
+ backgroundColor: color,
3030
+ background: gradient ? cssGradient : color
3031
+ };
3032
+ const successWidth = successPercent ? Math.min(successPercent, percent) : 0;
3033
+ const successColor = success?.strokeColor ?? "rgb(16 185 129)";
3034
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: tailwindMerge.twMerge("flex w-full items-center gap-3", className), style, ...rest, children: [
3035
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative w-full overflow-hidden rounded-full", style: lineStyle, children: typeof steps === "number" && steps > 1 ? renderSteps(percent, steps, status, stepStrokeStyle, trailColor, height) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3036
+ /* @__PURE__ */ jsxRuntime.jsx(
3037
+ "div",
3038
+ {
3039
+ className: tailwindMerge.twMerge(
3040
+ "h-full rounded-full transition-[width] duration-300 ease-out",
3041
+ status === "active" ? "animate-pulse" : void 0
3042
+ ),
3043
+ style: barStyle
3044
+ }
3045
+ ),
3046
+ successWidth > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
3047
+ "div",
3048
+ {
3049
+ className: "absolute inset-y-0 left-0 rounded-full transition-[width] duration-300 ease-out",
3050
+ style: { width: `${successWidth}%`, height, backgroundColor: successColor }
3051
+ }
3052
+ ) : null
3053
+ ] }) }),
3054
+ showInfo ? /* @__PURE__ */ jsxRuntime.jsx(InfoNode, { status, percent, successPercent, format }) : null
3055
+ ] });
3056
+ };
3057
+ var CircleProgress = ({
3058
+ percent,
3059
+ status,
3060
+ successPercent,
3061
+ format,
3062
+ showInfo = true,
3063
+ strokeWidth,
3064
+ trailColor,
3065
+ strokeColor,
3066
+ success,
3067
+ width = 120,
3068
+ type,
3069
+ gapDegree,
3070
+ gapPosition = "top",
3071
+ className,
3072
+ style,
3073
+ ...rest
3074
+ }) => {
3075
+ const stroke = strokeWidth ?? 10;
3076
+ const radius = (width - stroke) / 2;
3077
+ const circumference = 2 * Math.PI * radius;
3078
+ const gap = type === "dashboard" ? gapDegree ?? 75 : gapDegree ?? 0;
3079
+ const perimeter = circumference - gap / 360 * circumference;
3080
+ const dashOffsetBase = gap / 360 * circumference / 2;
3081
+ const dashArray = `${perimeter} ${circumference}`;
3082
+ const gradientId = buildGradientId(strokeColor);
3083
+ const { color, gradient } = resolveStroke(status, strokeColor, gradientId);
3084
+ const rotation = resolveRotation(gapPosition);
3085
+ const successColor = success?.strokeColor ?? "rgb(16 185 129)";
3086
+ const progressDashOffset = (100 - percent) / 100 * perimeter + dashOffsetBase;
3087
+ const successDashOffset = (100 - successPercent) / 100 * perimeter + dashOffsetBase;
3088
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: tailwindMerge.twMerge("inline-flex flex-col items-center justify-center", className), style, ...rest, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-center justify-center", style: { width, height: width }, children: [
3089
+ /* @__PURE__ */ jsxRuntime.jsxs(
3090
+ "svg",
3091
+ {
3092
+ width,
3093
+ height: width,
3094
+ viewBox: `0 0 ${width} ${width}`,
3095
+ className: "absolute inset-0 overflow-visible",
3096
+ style: { transform: `rotate(${rotation}deg)` },
3097
+ children: [
3098
+ gradient ? /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsxs("linearGradient", { id: gradient.id, x1: "0%", y1: "0%", x2: "100%", y2: "0%", children: [
3099
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0%", stopColor: gradient.from }),
3100
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "100%", stopColor: gradient.to })
3101
+ ] }) }) : null,
3102
+ /* @__PURE__ */ jsxRuntime.jsx(
3103
+ "circle",
3104
+ {
3105
+ cx: width / 2,
3106
+ cy: width / 2,
3107
+ r: radius,
3108
+ strokeWidth: stroke,
3109
+ stroke: trailColor ?? trailColorDefault,
3110
+ fill: "none",
3111
+ strokeDasharray: dashArray,
3112
+ strokeDashoffset: dashOffsetBase,
3113
+ strokeLinecap: "round"
3114
+ }
3115
+ ),
3116
+ /* @__PURE__ */ jsxRuntime.jsx(
3117
+ "circle",
3118
+ {
3119
+ cx: width / 2,
3120
+ cy: width / 2,
3121
+ r: radius,
3122
+ strokeWidth: stroke,
3123
+ stroke: color,
3124
+ fill: "none",
3125
+ strokeDasharray: dashArray,
3126
+ strokeDashoffset: progressDashOffset,
3127
+ strokeLinecap: "round",
3128
+ className: tailwindMerge.twMerge(status === "active" ? "animate-[spin_3s_linear_infinite]" : void 0)
3129
+ }
3130
+ ),
3131
+ successPercent > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
3132
+ "circle",
3133
+ {
3134
+ cx: width / 2,
3135
+ cy: width / 2,
3136
+ r: radius,
3137
+ strokeWidth: stroke,
3138
+ stroke: successColor,
3139
+ fill: "none",
3140
+ strokeDasharray: dashArray,
3141
+ strokeDashoffset: successDashOffset,
3142
+ strokeLinecap: "round"
3143
+ }
3144
+ ) : null
3145
+ ]
3146
+ }
3147
+ ),
3148
+ showInfo ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-semibold text-gray-800 dark:text-gray-100", children: /* @__PURE__ */ jsxRuntime.jsx(InfoNode, { status, percent, successPercent, format }) }) }) : null
3149
+ ] }) });
3150
+ };
3151
+ var Progress = (props) => {
3152
+ const toNumber2 = (value) => {
3153
+ if (typeof value === "string") {
3154
+ const parsed = Number.parseFloat(value);
3155
+ return Number.isFinite(parsed) ? parsed : void 0;
3156
+ }
3157
+ return value;
3158
+ };
3159
+ const {
3160
+ percent: rawPercent = 0,
3161
+ success,
3162
+ status: providedStatus,
3163
+ type = "line",
3164
+ showInfo = true,
3165
+ format,
3166
+ strokeWidth,
3167
+ trailColor,
3168
+ strokeColor,
3169
+ width,
3170
+ size,
3171
+ steps,
3172
+ gapDegree,
3173
+ gapPosition,
3174
+ className,
3175
+ style,
3176
+ ...restProps
3177
+ } = props;
3178
+ const percent = clampPercent(toNumber2(rawPercent));
3179
+ const successPercent = clampPercent(toNumber2(success?.percent));
3180
+ const status = providedStatus ?? (percent >= 100 ? "success" : "normal");
3181
+ const resolvedClassName = tailwindMerge.twMerge("min-w-[200px]", className);
3182
+ if (type === "circle" || type === "dashboard") {
3183
+ return /* @__PURE__ */ jsxRuntime.jsx(
3184
+ CircleProgress,
3185
+ {
3186
+ ...restProps,
3187
+ type,
3188
+ percent,
3189
+ successPercent,
3190
+ success,
3191
+ status,
3192
+ showInfo,
3193
+ className: resolvedClassName,
3194
+ format,
3195
+ strokeWidth,
3196
+ trailColor,
3197
+ strokeColor,
3198
+ width,
3199
+ gapDegree,
3200
+ gapPosition,
3201
+ style
3202
+ }
3203
+ );
3204
+ }
3205
+ return /* @__PURE__ */ jsxRuntime.jsx(
3206
+ LineProgress,
3207
+ {
3208
+ percent,
3209
+ successPercent,
3210
+ success,
3211
+ status,
3212
+ showInfo,
3213
+ className: resolvedClassName,
3214
+ format,
3215
+ strokeWidth,
3216
+ trailColor,
3217
+ strokeColor,
3218
+ size,
3219
+ steps,
3220
+ style,
3221
+ ...restProps
3222
+ }
3223
+ );
3224
+ };
3225
+ var Progress_default = Progress;
2546
3226
 
3227
+ exports.AppBar = AppBar_default;
2547
3228
  exports.Button = Button_default;
2548
3229
  exports.Card = Card_default;
2549
3230
  exports.Chip = Chip_default;
@@ -2557,7 +3238,9 @@ exports.List = List_default;
2557
3238
  exports.ListItem = Item_default;
2558
3239
  exports.Masonry = Masonry_default;
2559
3240
  exports.Menu = Menu_default;
3241
+ exports.Notification = Notification_default;
2560
3242
  exports.ProfileCard = ProfileCard_default;
3243
+ exports.Progress = Progress_default;
2561
3244
  exports.Select = Select_default;
2562
3245
  exports.Slider = Slider_default;
2563
3246
  exports.Switch = Switch_default;