@sarunyu/system-one 4.9.28 → 4.9.30

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.js CHANGED
@@ -1565,21 +1565,37 @@ function Header({
1565
1565
  rightIcon,
1566
1566
  onActionClick
1567
1567
  }) {
1568
- return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-3", rightSide === "action" ? "pr-2" : void 0), children: [
1569
- /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
1570
- /* @__PURE__ */ jsx(Leading, { headerType, imageSrc, leftIcon }),
1571
- /* @__PURE__ */ jsx("p", { className: "truncate text-base leading-6 font-bold text-foreground", children: title })
1572
- ] }),
1573
- /* @__PURE__ */ jsx(
1574
- Trailing,
1575
- {
1576
- rightSide,
1577
- actionLabel,
1578
- rightIcon,
1579
- onActionClick
1580
- }
1581
- )
1582
- ] });
1568
+ return /* @__PURE__ */ jsxs(
1569
+ "div",
1570
+ {
1571
+ className: cn(
1572
+ "flex items-center gap-3",
1573
+ rightSide === "action" ? "pr-2" : void 0
1574
+ ),
1575
+ children: [
1576
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
1577
+ /* @__PURE__ */ jsx(
1578
+ Leading,
1579
+ {
1580
+ headerType,
1581
+ imageSrc,
1582
+ leftIcon
1583
+ }
1584
+ ),
1585
+ /* @__PURE__ */ jsx("p", { className: "truncate text-base leading-6 font-bold text-foreground", children: title })
1586
+ ] }),
1587
+ /* @__PURE__ */ jsx(
1588
+ Trailing,
1589
+ {
1590
+ rightSide,
1591
+ actionLabel,
1592
+ rightIcon,
1593
+ onActionClick
1594
+ }
1595
+ )
1596
+ ]
1597
+ }
1598
+ );
1583
1599
  }
1584
1600
  function Leading({
1585
1601
  headerType,
@@ -1587,7 +1603,14 @@ function Leading({
1587
1603
  leftIcon
1588
1604
  }) {
1589
1605
  if (headerType === "image") {
1590
- return imageSrc ? /* @__PURE__ */ jsx("img", { alt: "", className: "size-8 shrink-0 rounded-md object-cover", src: imageSrc }) : /* @__PURE__ */ jsx("div", { className: "size-8 shrink-0 rounded-md bg-muted" });
1606
+ return imageSrc ? /* @__PURE__ */ jsx(
1607
+ "img",
1608
+ {
1609
+ alt: "",
1610
+ className: "size-8 shrink-0 rounded-md object-cover",
1611
+ src: imageSrc
1612
+ }
1613
+ ) : /* @__PURE__ */ jsx("div", { className: "size-8 shrink-0 rounded-md bg-muted" });
1591
1614
  }
1592
1615
  if (headerType === "icon") {
1593
1616
  return /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-foreground", children: leftIcon ?? /* @__PURE__ */ jsx(Circle, { size: 22 }) });
@@ -1604,7 +1627,7 @@ function Trailing({
1604
1627
  return /* @__PURE__ */ jsx(
1605
1628
  Button,
1606
1629
  {
1607
- className: "px-0 py-0 text-base leading-6 font-bold",
1630
+ className: "text-base leading-6 font-bold",
1608
1631
  onClick: onActionClick,
1609
1632
  size: "md",
1610
1633
  variant: "plain",
@@ -5947,6 +5970,138 @@ const TimeInput = forwardRef(
5947
5970
  }
5948
5971
  );
5949
5972
  TimeInput.displayName = "TimeInput";
5973
+ const avatarPlaceholder = "data:image/png;base64,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";
5974
+ const TEXT_GRADIENT = "linear-gradient(to top right, #B5D3F8, #E6F6FB)";
5975
+ const TEXT_COLOR = "#00A2D9";
5976
+ const SIZE_CONFIG = {
5977
+ xxs: { container: "size-4", fontSize: "text-[11px]", dotSize: "size-[5px]", dotRing: "ring-[1.5px]" },
5978
+ xs: { container: "size-5", fontSize: "text-sm", dotSize: "size-[5px]", dotRing: "ring-[1.5px]" },
5979
+ s: { container: "size-6", fontSize: "text-base", dotSize: "size-[6px]", dotRing: "ring-[1.5px]" },
5980
+ m: { container: "size-8", fontSize: "text-xl", dotSize: "size-[7px]", dotRing: "ring-2" },
5981
+ l: { container: "size-10", fontSize: "text-[26px]", dotSize: "size-[9px]", dotRing: "ring-2" },
5982
+ xl: { container: "size-12", fontSize: "text-[32px]", dotSize: "size-[11px]", dotRing: "ring-2" },
5983
+ xxl: { container: "size-13", fontSize: "text-[37px]", dotSize: "size-[13px]", dotRing: "ring-2" }
5984
+ };
5985
+ function Avatar({
5986
+ type = "photo",
5987
+ size = "m",
5988
+ status = false,
5989
+ src,
5990
+ alt = "",
5991
+ initials,
5992
+ className
5993
+ }) {
5994
+ const { container, fontSize, dotSize, dotRing } = SIZE_CONFIG[size];
5995
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative inline-flex shrink-0", container, className), children: [
5996
+ type === "photo" && /* @__PURE__ */ jsx(
5997
+ "img",
5998
+ {
5999
+ src,
6000
+ alt,
6001
+ className: "size-full rounded-full object-cover bg-bg-default-tertiary"
6002
+ }
6003
+ ),
6004
+ type === "placeholder" && /* @__PURE__ */ jsx(
6005
+ "img",
6006
+ {
6007
+ src: avatarPlaceholder,
6008
+ alt: "",
6009
+ className: "size-full rounded-full object-cover",
6010
+ "aria-hidden": "true"
6011
+ }
6012
+ ),
6013
+ type === "text" && /* @__PURE__ */ jsx(
6014
+ "div",
6015
+ {
6016
+ className: "relative size-full rounded-full overflow-hidden",
6017
+ style: { background: TEXT_GRADIENT },
6018
+ children: /* @__PURE__ */ jsx(
6019
+ "span",
6020
+ {
6021
+ className: cn(
6022
+ "absolute left-1/2 top-1/2 font-bold leading-none select-none whitespace-nowrap",
6023
+ fontSize
6024
+ ),
6025
+ style: {
6026
+ color: TEXT_COLOR,
6027
+ transform: "translate(-50%, calc(-50% + 0.07em))"
6028
+ },
6029
+ children: (initials ?? "").slice(0, 2).toUpperCase()
6030
+ }
6031
+ )
6032
+ }
6033
+ ),
6034
+ status && type === "photo" && /* @__PURE__ */ jsx(
6035
+ "span",
6036
+ {
6037
+ "aria-label": "Online",
6038
+ className: cn(
6039
+ "absolute bottom-0 right-0 block rounded-full bg-bg-success",
6040
+ dotSize,
6041
+ dotRing,
6042
+ "ring-white"
6043
+ )
6044
+ }
6045
+ )
6046
+ ] });
6047
+ }
6048
+ const STACK_CONFIG = {
6049
+ small: { avatarSize: "xxs", avatarPx: 16, overlapPx: 4 },
6050
+ medium: { avatarSize: "xs", avatarPx: 20, overlapPx: 5 },
6051
+ large: { avatarSize: "s", avatarPx: 24, overlapPx: 5 }
6052
+ };
6053
+ function subtractMask(avatarPx, overlapPx) {
6054
+ const r = avatarPx / 2;
6055
+ const spacingPx = avatarPx - overlapPx;
6056
+ const biteX = spacingPx + r;
6057
+ const biteY = r;
6058
+ const biteR = r + 1;
6059
+ const self = `radial-gradient(circle at ${r}px ${r}px, white ${r}px, transparent ${r}px)`;
6060
+ const bite = `radial-gradient(circle at ${biteX}px ${biteY}px, white ${biteR}px, transparent ${biteR}px)`;
6061
+ return {
6062
+ maskImage: `${self}, ${bite}`,
6063
+ maskComposite: "subtract",
6064
+ WebkitMaskImage: `${bite}, ${self}`,
6065
+ WebkitMaskComposite: "destination-out"
6066
+ };
6067
+ }
6068
+ function AvatarStack({
6069
+ items,
6070
+ size = "small",
6071
+ max = 5,
6072
+ className
6073
+ }) {
6074
+ const { avatarSize, avatarPx, overlapPx } = STACK_CONFIG[size];
6075
+ const visible = items.slice(0, max);
6076
+ return /* @__PURE__ */ jsx("div", { className: cn("flex shrink-0", className), children: visible.map((item, i) => {
6077
+ const isLast = i === visible.length - 1;
6078
+ return /* @__PURE__ */ jsx(
6079
+ "div",
6080
+ {
6081
+ className: "relative flex shrink-0",
6082
+ style: {
6083
+ width: avatarPx,
6084
+ height: avatarPx,
6085
+ marginLeft: i > 0 ? -overlapPx : 0,
6086
+ // Leftmost = highest z-index: its transparent bite reveals the avatar below.
6087
+ zIndex: visible.length - i,
6088
+ ...isLast ? {} : subtractMask(avatarPx, overlapPx)
6089
+ },
6090
+ children: /* @__PURE__ */ jsx(
6091
+ Avatar,
6092
+ {
6093
+ type: item.type ?? "photo",
6094
+ size: avatarSize,
6095
+ src: item.src,
6096
+ alt: item.alt,
6097
+ initials: item.initials
6098
+ }
6099
+ )
6100
+ },
6101
+ i
6102
+ );
6103
+ }) });
6104
+ }
5950
6105
  const index = {
5951
6106
  Button,
5952
6107
  Badge,
@@ -5980,11 +6135,15 @@ const index = {
5980
6135
  TableCell,
5981
6136
  TextArea,
5982
6137
  TimeInput,
6138
+ Avatar,
6139
+ AvatarStack,
5983
6140
  cn,
5984
6141
  useIsMobile
5985
6142
  };
5986
6143
  export {
5987
6144
  Alert,
6145
+ Avatar,
6146
+ AvatarStack,
5988
6147
  Badge,
5989
6148
  BottomSheet,
5990
6149
  Button,