@octavius2929-personal/design-system 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1000,36 +1000,103 @@ var import_react17 = require("react");
1000
1000
  var import_react16 = require("react");
1001
1001
 
1002
1002
  // src/components/avatar/use-styles.css.ts
1003
+ var dot = "use-styles_dot__1mn1rmu8";
1004
+ var dotSize = { sm: "use-styles_dotSize_sm__1mn1rmu9", md: "use-styles_dotSize_md__1mn1rmua", lg: "use-styles_dotSize_lg__1mn1rmub" };
1005
+ var dotTone = { online: "use-styles_dotTone_online__1mn1rmuc", away: "use-styles_dotTone_away__1mn1rmud", busy: "use-styles_dotTone_busy__1mn1rmue", offline: "use-styles_dotTone_offline__1mn1rmuf" };
1006
+ var image = "use-styles_image__1mn1rmu2";
1007
+ var mark = "use-styles_mark__1mn1rmug";
1008
+ var markShape = { online: "use-styles_markShape_online__1mn1rmuh", busy: "use-styles_markShape_busy__1mn1rmui", away: "use-styles_markShape_away__1mn1rmuj", offline: "use-styles_markShape_offline__1mn1rmuk" };
1003
1009
  var root3 = "use-styles_root__1mn1rmu0";
1004
- var size2 = { sm: "use-styles_size_sm__1mn1rmu1", md: "use-styles_size_md__1mn1rmu2", lg: "use-styles_size_lg__1mn1rmu3" };
1005
- var variant = { "default": "use-styles_variant_default__1mn1rmu4", filled: "use-styles_variant_filled__1mn1rmu5" };
1010
+ var size2 = { sm: "use-styles_size_sm__1mn1rmu3", md: "use-styles_size_md__1mn1rmu4", lg: "use-styles_size_lg__1mn1rmu5" };
1011
+ var statusText = "surfaces_srOnly__1qa7atn0";
1012
+ var variant = { "default": "use-styles_variant_default__1mn1rmu6", filled: "use-styles_variant_filled__1mn1rmu7" };
1013
+ var visual = "use-styles_visual__1mn1rmu1";
1006
1014
 
1007
1015
  // src/components/avatar/use-styles.ts
1008
- function useStyles6({
1009
- size: size3 = "md",
1010
- filled,
1011
- className
1012
- }) {
1016
+ function useStyles6({ size: size3 = "md", filled, status, className }) {
1013
1017
  const { themeClass } = useTheme();
1014
1018
  const root25 = (0, import_react16.useMemo)(
1015
- () => [
1016
- themeClass,
1017
- root3,
1018
- size2[size3],
1019
- filled ? variant.filled : variant.default,
1020
- className
1021
- ].filter(Boolean).join(" "),
1022
- [themeClass, size3, filled, className]
1019
+ () => [themeClass, root3, size2[size3]].filter(Boolean).join(" "),
1020
+ [themeClass, size3]
1023
1021
  );
1024
- return { root: root25 };
1022
+ const visual2 = (0, import_react16.useMemo)(
1023
+ () => [visual, filled ? variant.filled : variant.default, className].filter(Boolean).join(" "),
1024
+ [filled, className]
1025
+ );
1026
+ const dot4 = (0, import_react16.useMemo)(
1027
+ () => status ? [dot, dotSize[size3], dotTone[status]].filter(Boolean).join(" ") : "",
1028
+ [status, size3]
1029
+ );
1030
+ const mark2 = (0, import_react16.useMemo)(
1031
+ () => status ? [mark, markShape[status]].filter(Boolean).join(" ") : "",
1032
+ [status]
1033
+ );
1034
+ return { root: root25, visual: visual2, image, dot: dot4, mark: mark2, statusText };
1025
1035
  }
1026
1036
 
1027
1037
  // src/components/avatar/index.tsx
1028
1038
  var import_jsx_runtime8 = require("react/jsx-runtime");
1029
- var Avatar = (0, import_react17.forwardRef)(function Avatar2({ size: size3, filled, className, children, testId, ...rest }, ref) {
1030
- const { root: root25 } = useStyles6({ size: size3, filled, className });
1031
- const { testId: dataTestId } = useTestId("media", testId);
1032
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { ref, className: root25, "data-testid": dataTestId, ...rest, children });
1039
+ function getInitials(name) {
1040
+ const words = name?.trim().split(/\s+/).filter(Boolean) ?? [];
1041
+ if (words.length === 0) return "";
1042
+ const firstWord = words[0] ?? "";
1043
+ const firstLetter = Array.from(firstWord)[0] ?? "";
1044
+ if (words.length === 1) return firstLetter.toLocaleUpperCase();
1045
+ const secondWord = words[1] ?? "";
1046
+ const secondLetter = Array.from(secondWord)[0] ?? "";
1047
+ return (firstLetter + secondLetter).toLocaleUpperCase();
1048
+ }
1049
+ var statusLabel = {
1050
+ online: "Online",
1051
+ away: "Away",
1052
+ busy: "Busy",
1053
+ offline: "Offline"
1054
+ };
1055
+ var Avatar = (0, import_react17.forwardRef)(function Avatar2({
1056
+ size: size3,
1057
+ filled,
1058
+ src,
1059
+ alt,
1060
+ name,
1061
+ status,
1062
+ decorative = false,
1063
+ className,
1064
+ children,
1065
+ testId,
1066
+ ...rest
1067
+ }, ref) {
1068
+ const [imgFailed, setImgFailed] = (0, import_react17.useState)(false);
1069
+ const [lastSrc, setLastSrc] = (0, import_react17.useState)(src);
1070
+ if (src !== lastSrc) {
1071
+ setLastSrc(src);
1072
+ setImgFailed(false);
1073
+ }
1074
+ const { root: root25, visual: visual2, image: image2, dot: dot4, mark: mark2, statusText: statusText2 } = useStyles6({
1075
+ size: size3,
1076
+ filled,
1077
+ status,
1078
+ className
1079
+ });
1080
+ const { testId: dataTestId, slot } = useTestId("media", testId);
1081
+ const showImage = Boolean(src) && !imgFailed;
1082
+ const accessibleName = alt?.trim() || name?.trim() || void 0;
1083
+ const fallback = children ?? getInitials(name);
1084
+ const visualA11yProps = decorative ? { "aria-hidden": true } : showImage ? {} : accessibleName ? { role: "img", "aria-label": accessibleName } : {};
1085
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { ref, className: root25, "data-testid": dataTestId, ...rest, children: [
1086
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: visual2, "data-testid": slot("visual"), ...visualA11yProps, children: showImage ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1087
+ "img",
1088
+ {
1089
+ src,
1090
+ alt: decorative ? "" : accessibleName ?? "",
1091
+ className: image2,
1092
+ onError: () => setImgFailed(true)
1093
+ }
1094
+ ) : fallback }),
1095
+ status && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("span", { className: dot4, "data-testid": slot("status"), "data-status": status, children: [
1096
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: mark2, "aria-hidden": "true" }),
1097
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: statusText2, children: statusLabel[status] })
1098
+ ] })
1099
+ ] });
1033
1100
  });
1034
1101
 
1035
1102
  // src/components/badge/index.tsx
@@ -1039,7 +1106,7 @@ var import_react19 = require("react");
1039
1106
  var import_react18 = require("react");
1040
1107
 
1041
1108
  // src/components/badge/use-styles.css.ts
1042
- var dot = "use-styles_dot__1wpei6p1";
1109
+ var dot2 = "use-styles_dot__1wpei6p1";
1043
1110
  var root4 = "use-styles_root__1wpei6p0";
1044
1111
  var tone2 = { ink: "use-styles_tone_ink__1wpei6p2", accent: "use-styles_tone_accent__1wpei6p3" };
1045
1112
 
@@ -1053,18 +1120,18 @@ function useStyles7({
1053
1120
  () => [themeClass, root4, className].filter(Boolean).join(" "),
1054
1121
  [themeClass, className]
1055
1122
  );
1056
- const dot3 = (0, import_react18.useMemo)(() => [dot, tone2[tone4]].join(" "), [tone4]);
1057
- return { root: root25, dot: dot3 };
1123
+ const dot4 = (0, import_react18.useMemo)(() => [dot2, tone2[tone4]].join(" "), [tone4]);
1124
+ return { root: root25, dot: dot4 };
1058
1125
  }
1059
1126
 
1060
1127
  // src/components/badge/index.tsx
1061
1128
  var import_jsx_runtime9 = require("react/jsx-runtime");
1062
1129
  var Badge = (0, import_react19.forwardRef)(function Badge2({ count, tone: tone4, className, children, testId, ...rest }, ref) {
1063
- const { root: root25, dot: dot3 } = useStyles7({ tone: tone4, className });
1130
+ const { root: root25, dot: dot4 } = useStyles7({ tone: tone4, className });
1064
1131
  const { testId: dataTestId, slot } = useTestId("media", testId);
1065
1132
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { ref, className: root25, "data-testid": dataTestId, ...rest, children: [
1066
1133
  children,
1067
- count != null && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: dot3, "data-testid": slot("dot"), children: count })
1134
+ count != null && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: dot4, "data-testid": slot("dot"), children: count })
1068
1135
  ] });
1069
1136
  });
1070
1137
 
@@ -1331,7 +1398,7 @@ var import_react26 = require("react");
1331
1398
  // src/components/radio/use-styles.css.ts
1332
1399
  var circle = "use-styles_circle__vy61b42";
1333
1400
  var disabled2 = "use-styles_disabled__vy61b41";
1334
- var dot2 = "use-styles_dot__vy61b43";
1401
+ var dot3 = "use-styles_dot__vy61b43";
1335
1402
  var input2 = "surfaces_srOnly__1qa7atn0";
1336
1403
  var label2 = "use-styles_label__vy61b44";
1337
1404
  var root7 = "use-styles_root__vy61b40";
@@ -1350,7 +1417,7 @@ function useStyles11({
1350
1417
  root: root25,
1351
1418
  input: input2,
1352
1419
  circle,
1353
- dot: dot2,
1420
+ dot: dot3,
1354
1421
  label: label2
1355
1422
  };
1356
1423
  }
@@ -1358,7 +1425,7 @@ function useStyles11({
1358
1425
  // src/components/radio/index.tsx
1359
1426
  var import_jsx_runtime15 = require("react/jsx-runtime");
1360
1427
  var Radio = (0, import_react27.forwardRef)(function Radio2({ checked, onChange, label: label8, name, value, disabled: disabled4, testId, ...rest }, ref) {
1361
- const { root: root25, input: input6, circle: circle2, dot: dot3, label: labelClass } = useStyles11({ disabled: disabled4 });
1428
+ const { root: root25, input: input6, circle: circle2, dot: dot4, label: labelClass } = useStyles11({ disabled: disabled4 });
1362
1429
  const { testId: dataTestId } = useTestId("toggle", testId);
1363
1430
  return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("label", { className: root25, "data-testid": dataTestId, "data-state": states({ checked, disabled: disabled4 }), children: [
1364
1431
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
@@ -1375,7 +1442,7 @@ var Radio = (0, import_react27.forwardRef)(function Radio2({ checked, onChange,
1375
1442
  ...rest
1376
1443
  }
1377
1444
  ),
1378
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: circle2, children: checked && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: dot3 }) }),
1445
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: circle2, children: checked && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: dot4 }) }),
1379
1446
  label8 != null && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: labelClass, children: label8 })
1380
1447
  ] });
1381
1448
  });
@@ -1678,60 +1745,65 @@ var BaseField = (0, import_react33.forwardRef)(function BaseField2({ label: labe
1678
1745
  });
1679
1746
 
1680
1747
  // src/components/text-field/index.tsx
1681
- var import_jsx_runtime19 = (
1682
- // En multiline el control es un <textarea>: no reenviamos `controlRef` porque el
1683
- // tipo público de la ref es HTMLInputElement (la ref aplica solo a la rama <input>).
1684
- require("react/jsx-runtime")
1685
- );
1686
- var TextField = (0, import_react34.forwardRef)(function TextField2({
1687
- label: label8,
1688
- help,
1689
- error,
1690
- startIcon,
1691
- multiline,
1692
- rows,
1693
- type = "text",
1694
- onChange,
1695
- className,
1696
- id,
1697
- testId,
1698
- ...rest
1699
- }, ref) {
1700
- const rawTestId = rest["data-testid"];
1701
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1702
- BaseField,
1703
- {
1748
+ var import_jsx_runtime19 = require("react/jsx-runtime");
1749
+ var TextField = (0, import_react34.forwardRef)(
1750
+ function TextField2({
1751
+ label: label8,
1752
+ help,
1753
+ error,
1754
+ startIcon,
1755
+ multiline,
1756
+ rows,
1757
+ type = "text",
1758
+ onChange,
1759
+ className,
1760
+ id,
1761
+ testId,
1762
+ ...rest
1763
+ }, ref) {
1764
+ const inputRef = (0, import_react34.useRef)(null);
1765
+ const textareaRef = (0, import_react34.useRef)(null);
1766
+ (0, import_react34.useImperativeHandle)(
1704
1767
  ref,
1705
- label: label8,
1706
- help,
1707
- error,
1708
- startIcon,
1709
- id,
1710
- className,
1711
- testId,
1712
- children: ({ ref: controlRef, ...control }) => multiline ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1713
- "textarea",
1714
- {
1715
- ...rest,
1716
- ...control,
1717
- "data-testid": rawTestId ?? control["data-testid"],
1718
- rows: rows ?? 4,
1719
- onChange: (e) => onChange?.(e.target.value)
1720
- }
1721
- ) : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1722
- "input",
1723
- {
1724
- ...rest,
1725
- ...control,
1726
- "data-testid": rawTestId ?? control["data-testid"],
1727
- ref: controlRef,
1728
- type,
1729
- onChange: (e) => onChange?.(e.target.value)
1730
- }
1731
- )
1732
- }
1733
- );
1734
- });
1768
+ () => multiline ? textareaRef.current : inputRef.current,
1769
+ [multiline]
1770
+ );
1771
+ const rawTestId = rest["data-testid"];
1772
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1773
+ BaseField,
1774
+ {
1775
+ label: label8,
1776
+ help,
1777
+ error,
1778
+ startIcon,
1779
+ id,
1780
+ className,
1781
+ testId,
1782
+ children: (control) => multiline ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1783
+ "textarea",
1784
+ {
1785
+ ...rest,
1786
+ ...control,
1787
+ "data-testid": rawTestId ?? control["data-testid"],
1788
+ ref: textareaRef,
1789
+ rows: rows ?? 4,
1790
+ onChange: (e) => onChange?.(e.target.value)
1791
+ }
1792
+ ) : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1793
+ "input",
1794
+ {
1795
+ ...rest,
1796
+ ...control,
1797
+ "data-testid": rawTestId ?? control["data-testid"],
1798
+ ref: inputRef,
1799
+ type,
1800
+ onChange: (e) => onChange?.(e.target.value)
1801
+ }
1802
+ )
1803
+ }
1804
+ );
1805
+ }
1806
+ );
1735
1807
 
1736
1808
  // src/components/password-field/index.tsx
1737
1809
  var import_react36 = require("react");
@@ -3319,7 +3391,19 @@ function useStyles29() {
3319
3391
  // src/components/snackbar/index.tsx
3320
3392
  var import_jsx_runtime44 = require("react/jsx-runtime");
3321
3393
  var DEFAULT_DURATION = 5e3;
3322
- var Snackbar = (0, import_react65.forwardRef)(function Snackbar2({ open, message: message2, action, onClose, duration = DEFAULT_DURATION, testId }, ref) {
3394
+ var Snackbar = (0, import_react65.forwardRef)(function Snackbar2({
3395
+ open,
3396
+ message: message2,
3397
+ action,
3398
+ onClose,
3399
+ duration = DEFAULT_DURATION,
3400
+ testId,
3401
+ onMouseEnter,
3402
+ onMouseLeave,
3403
+ onFocus,
3404
+ onBlur,
3405
+ ...rest
3406
+ }, ref) {
3323
3407
  const { root: root25, message: messageClass, closeBtn: closeBtn2 } = useStyles29();
3324
3408
  const { testId: dataTestId, slot } = useTestId("feedback", testId);
3325
3409
  const onCloseRef = (0, import_react65.useRef)(onClose);
@@ -3346,21 +3430,25 @@ var Snackbar = (0, import_react65.forwardRef)(function Snackbar2({ open, message
3346
3430
  scheduleTimer();
3347
3431
  return clearTimer;
3348
3432
  }, [scheduleTimer, clearTimer]);
3349
- const handleMouseEnter = () => {
3433
+ const handleMouseEnter = (event) => {
3350
3434
  interactingRef.current.hover = true;
3351
3435
  clearTimer();
3436
+ onMouseEnter?.(event);
3352
3437
  };
3353
- const handleMouseLeave = () => {
3438
+ const handleMouseLeave = (event) => {
3354
3439
  interactingRef.current.hover = false;
3355
3440
  scheduleTimer();
3441
+ onMouseLeave?.(event);
3356
3442
  };
3357
- const handleFocus = () => {
3443
+ const handleFocus = (event) => {
3358
3444
  interactingRef.current.focus = true;
3359
3445
  clearTimer();
3446
+ onFocus?.(event);
3360
3447
  };
3361
- const handleBlur = () => {
3448
+ const handleBlur = (event) => {
3362
3449
  interactingRef.current.focus = false;
3363
3450
  scheduleTimer();
3451
+ onBlur?.(event);
3364
3452
  };
3365
3453
  if (!open || typeof document === "undefined") return null;
3366
3454
  return (0, import_react_dom2.createPortal)(
@@ -3369,12 +3457,13 @@ var Snackbar = (0, import_react65.forwardRef)(function Snackbar2({ open, message
3369
3457
  {
3370
3458
  ref,
3371
3459
  role: "status",
3372
- className: root25,
3373
3460
  "data-testid": dataTestId,
3374
3461
  onMouseEnter: handleMouseEnter,
3375
3462
  onMouseLeave: handleMouseLeave,
3376
3463
  onFocus: handleFocus,
3377
3464
  onBlur: handleBlur,
3465
+ ...rest,
3466
+ className: root25,
3378
3467
  children: [
3379
3468
  /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: messageClass, "data-testid": slot("message"), children: message2 }),
3380
3469
  action,