@sarunyu/system-one 4.9.27 → 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
@@ -1515,11 +1515,20 @@ function BottomSheet({
1515
1515
  className,
1516
1516
  contentClassName
1517
1517
  }) {
1518
- return /* @__PURE__ */ jsxs(Drawer, { direction: "bottom", open, onOpenChange, children: [
1518
+ const [everOpened, setEverOpened] = useState(!!open);
1519
+ useEffect(() => {
1520
+ if (open) setEverOpened(true);
1521
+ }, [open]);
1522
+ const handleOpenChange = (next) => {
1523
+ if (next) setEverOpened(true);
1524
+ onOpenChange == null ? void 0 : onOpenChange(next);
1525
+ };
1526
+ return /* @__PURE__ */ jsxs(Drawer, { direction: "bottom", open, onOpenChange: handleOpenChange, children: [
1519
1527
  trigger ? /* @__PURE__ */ jsx(DrawerTrigger, { asChild: true, children: trigger }) : null,
1520
- /* @__PURE__ */ jsxs(
1528
+ everOpened && /* @__PURE__ */ jsxs(
1521
1529
  DrawerContent,
1522
1530
  {
1531
+ "aria-describedby": void 0,
1523
1532
  className: cn(
1524
1533
  "[&>div:first-child]:hidden rounded-t-[24px] border-t-0 px-4 pb-6 pt-2",
1525
1534
  className
@@ -1556,21 +1565,37 @@ function Header({
1556
1565
  rightIcon,
1557
1566
  onActionClick
1558
1567
  }) {
1559
- return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-3", rightSide === "action" ? "pr-2" : void 0), children: [
1560
- /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
1561
- /* @__PURE__ */ jsx(Leading, { headerType, imageSrc, leftIcon }),
1562
- /* @__PURE__ */ jsx("p", { className: "truncate text-base leading-6 font-bold text-foreground", children: title })
1563
- ] }),
1564
- /* @__PURE__ */ jsx(
1565
- Trailing,
1566
- {
1567
- rightSide,
1568
- actionLabel,
1569
- rightIcon,
1570
- onActionClick
1571
- }
1572
- )
1573
- ] });
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
+ );
1574
1599
  }
1575
1600
  function Leading({
1576
1601
  headerType,
@@ -1578,7 +1603,14 @@ function Leading({
1578
1603
  leftIcon
1579
1604
  }) {
1580
1605
  if (headerType === "image") {
1581
- 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" });
1582
1614
  }
1583
1615
  if (headerType === "icon") {
1584
1616
  return /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-foreground", children: leftIcon ?? /* @__PURE__ */ jsx(Circle, { size: 22 }) });
@@ -1595,7 +1627,7 @@ function Trailing({
1595
1627
  return /* @__PURE__ */ jsx(
1596
1628
  Button,
1597
1629
  {
1598
- className: "px-0 py-0 text-base leading-6 font-bold",
1630
+ className: "text-base leading-6 font-bold",
1599
1631
  onClick: onActionClick,
1600
1632
  size: "md",
1601
1633
  variant: "plain",
@@ -5938,6 +5970,138 @@ const TimeInput = forwardRef(
5938
5970
  }
5939
5971
  );
5940
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
+ }
5941
6105
  const index = {
5942
6106
  Button,
5943
6107
  Badge,
@@ -5971,11 +6135,15 @@ const index = {
5971
6135
  TableCell,
5972
6136
  TextArea,
5973
6137
  TimeInput,
6138
+ Avatar,
6139
+ AvatarStack,
5974
6140
  cn,
5975
6141
  useIsMobile
5976
6142
  };
5977
6143
  export {
5978
6144
  Alert,
6145
+ Avatar,
6146
+ AvatarStack,
5979
6147
  Badge,
5980
6148
  BottomSheet,
5981
6149
  Button,