@sarunyu/system-one 4.9.23 → 4.9.25

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
@@ -8,6 +8,7 @@ import { BellSimple, FunnelSimple, CheckCircle, Warning, XCircle, Info, Bookmark
8
8
  import { DayPicker, useDayPicker } from "react-day-picker";
9
9
  import * as Popover from "@radix-ui/react-popover";
10
10
  import { Drawer as Drawer$1 } from "vaul";
11
+ import { createPortal } from "react-dom";
11
12
  function cn(...inputs) {
12
13
  return twMerge(clsx(inputs));
13
14
  }
@@ -2637,6 +2638,9 @@ const Dropdown = forwardRef(
2637
2638
  const [search, setSearch] = useState("");
2638
2639
  const containerRef = useRef(null);
2639
2640
  const inputRef = useRef(null);
2641
+ const triggerRef = useRef(null);
2642
+ const menuRef = useRef(null);
2643
+ const [menuStyle, setMenuStyle] = useState({});
2640
2644
  const controlled = value !== void 0;
2641
2645
  const currentValue = controlled ? value : internalValue;
2642
2646
  const isDisabled = forceState === "disabled";
@@ -2667,12 +2671,29 @@ const Dropdown = forwardRef(
2667
2671
  useEffect(() => {
2668
2672
  if (!open) setSearch("");
2669
2673
  }, [open]);
2674
+ const updateMenuPosition = useCallback(() => {
2675
+ if (!triggerRef.current) return;
2676
+ const rect = triggerRef.current.getBoundingClientRect();
2677
+ setMenuStyle({ position: "fixed", top: rect.bottom + 4, left: rect.left, width: rect.width });
2678
+ }, []);
2679
+ useEffect(() => {
2680
+ if (!open) return;
2681
+ updateMenuPosition();
2682
+ window.addEventListener("scroll", updateMenuPosition, true);
2683
+ window.addEventListener("resize", updateMenuPosition);
2684
+ return () => {
2685
+ window.removeEventListener("scroll", updateMenuPosition, true);
2686
+ window.removeEventListener("resize", updateMenuPosition);
2687
+ };
2688
+ }, [open, updateMenuPosition]);
2670
2689
  useEffect(() => {
2671
2690
  if (!open) return;
2672
2691
  const handler = (e) => {
2673
- if (containerRef.current && !containerRef.current.contains(e.target)) {
2674
- setOpen(false);
2675
- }
2692
+ var _a2, _b;
2693
+ const target = e.target;
2694
+ const inContainer = ((_a2 = containerRef.current) == null ? void 0 : _a2.contains(target)) ?? false;
2695
+ const inMenu = ((_b = menuRef.current) == null ? void 0 : _b.contains(target)) ?? false;
2696
+ if (!inContainer && !inMenu) setOpen(false);
2676
2697
  };
2677
2698
  document.addEventListener("mousedown", handler);
2678
2699
  return () => document.removeEventListener("mousedown", handler);
@@ -2712,6 +2733,7 @@ const Dropdown = forwardRef(
2712
2733
  /* @__PURE__ */ jsxs(
2713
2734
  "div",
2714
2735
  {
2736
+ ref: triggerRef,
2715
2737
  onClick: handleToggle,
2716
2738
  className: cn(
2717
2739
  "relative flex gap-2 items-center rounded-lg px-3.5",
@@ -2868,46 +2890,52 @@ const Dropdown = forwardRef(
2868
2890
  }
2869
2891
  )
2870
2892
  ),
2871
- isFocus ? /* @__PURE__ */ jsx(CaretUp, { size: 22, className: cn("shrink-0", caretClassName) }) : /* @__PURE__ */ jsx(CaretDown, { size: 22, className: cn("shrink-0", caretClassName) }),
2872
- open && !forceState && options.length > 0 && /* @__PURE__ */ jsx(
2893
+ isFocus ? /* @__PURE__ */ jsx(CaretUp, { size: 22, className: cn("shrink-0", caretClassName) }) : /* @__PURE__ */ jsx(CaretDown, { size: 22, className: cn("shrink-0", caretClassName) })
2894
+ ]
2895
+ }
2896
+ ),
2897
+ open && !forceState && options.length > 0 && createPortal(
2898
+ /* @__PURE__ */ jsx(
2899
+ "div",
2900
+ {
2901
+ ref: menuRef,
2902
+ className: cn(
2903
+ "bg-popover rounded-lg overflow-clip p-2 flex flex-col items-start text-popover-foreground",
2904
+ filteredOptions.length > 10 && "overflow-y-auto"
2905
+ ),
2906
+ style: {
2907
+ ...menuStyle,
2908
+ boxShadow: "var(--elevation-popover)",
2909
+ zIndex: 9999,
2910
+ ...filteredOptions.length > 10 ? { maxHeight: 10 * 48 + 16 } : {}
2911
+ },
2912
+ children: filteredOptions.length > 0 ? filteredOptions.map((opt) => /* @__PURE__ */ jsx(
2873
2913
  "div",
2874
2914
  {
2915
+ onClick: (e) => {
2916
+ e.stopPropagation();
2917
+ handleSelect(opt.value);
2918
+ },
2875
2919
  className: cn(
2876
- "absolute top-full left-0 w-full mt-1 bg-popover rounded-lg overflow-clip p-2 z-50 flex flex-col items-start text-popover-foreground",
2877
- filteredOptions.length > 10 && "overflow-y-auto"
2920
+ "w-full shrink-0 rounded-[4px] cursor-pointer transition-colors duration-100",
2921
+ opt.value === currentValue ? "bg-primary-action-light" : "bg-popover hover:bg-disabled-bg"
2878
2922
  ),
2879
- style: {
2880
- boxShadow: "var(--elevation-popover)",
2881
- ...filteredOptions.length > 10 ? { maxHeight: 10 * 48 + 16 } : {}
2882
- },
2883
- children: filteredOptions.length > 0 ? filteredOptions.map((opt) => /* @__PURE__ */ jsx(
2884
- "div",
2923
+ children: /* @__PURE__ */ jsx("div", { className: "flex flex-row items-center size-full", children: /* @__PURE__ */ jsx("div", { className: "flex items-center p-3.5 relative w-full", children: /* @__PURE__ */ jsx(
2924
+ "p",
2885
2925
  {
2886
- onClick: (e) => {
2887
- e.stopPropagation();
2888
- handleSelect(opt.value);
2889
- },
2890
2926
  className: cn(
2891
- "w-full shrink-0 rounded-[4px] cursor-pointer transition-colors duration-100",
2892
- opt.value === currentValue ? "bg-primary-action-light" : "bg-popover hover:bg-disabled-bg"
2927
+ "flex-1 min-w-0 min-h-[1px] leading-5 not-italic overflow-hidden text-sm text-ellipsis whitespace-nowrap",
2928
+ opt.value === currentValue ? "text-primary-action" : "text-foreground"
2893
2929
  ),
2894
- children: /* @__PURE__ */ jsx("div", { className: "flex flex-row items-center size-full", children: /* @__PURE__ */ jsx("div", { className: "flex items-center p-3.5 relative w-full", children: /* @__PURE__ */ jsx(
2895
- "p",
2896
- {
2897
- className: cn(
2898
- "flex-1 min-w-0 min-h-[1px] leading-5 not-italic overflow-hidden text-sm text-ellipsis whitespace-nowrap",
2899
- opt.value === currentValue ? "text-primary-action" : "text-foreground"
2900
- ),
2901
- children: opt.label
2902
- }
2903
- ) }) })
2904
- },
2905
- opt.value
2906
- )) : /* @__PURE__ */ jsx("div", { className: "w-full shrink-0 bg-popover", children: /* @__PURE__ */ jsx("div", { className: "flex flex-row items-center size-full", children: /* @__PURE__ */ jsx("div", { className: "flex items-center p-[14px] relative w-full", children: /* @__PURE__ */ jsx("p", { className: "flex-1 min-w-0 min-h-[1px] leading-[20px] not-italic text-[14px] text-disabled", children: "No results found" }) }) }) })
2907
- }
2908
- )
2909
- ]
2910
- }
2930
+ children: opt.label
2931
+ }
2932
+ ) }) })
2933
+ },
2934
+ opt.value
2935
+ )) : /* @__PURE__ */ jsx("div", { className: "w-full shrink-0 bg-popover", children: /* @__PURE__ */ jsx("div", { className: "flex flex-row items-center size-full", children: /* @__PURE__ */ jsx("div", { className: "flex items-center p-[14px] relative w-full", children: /* @__PURE__ */ jsx("p", { className: "flex-1 min-w-0 min-h-[1px] leading-[20px] not-italic text-[14px] text-disabled", children: "No results found" }) }) }) })
2936
+ }
2937
+ ),
2938
+ document.body
2911
2939
  ),
2912
2940
  showBelow && /* @__PURE__ */ jsx("div", { className: "flex items-start px-[4px] text-[12px] leading-[16px]", children: /* @__PURE__ */ jsx("span", { className: "flex-1 min-w-0", style: { color: leftColor }, children: leftText }) })
2913
2941
  ]
@@ -3095,6 +3123,9 @@ const DropdownMultiple = forwardRef(
3095
3123
  const containerRef = useRef(null);
3096
3124
  const inputRef = useRef(null);
3097
3125
  const measureRef = useRef(null);
3126
+ const triggerRef = useRef(null);
3127
+ const menuRef = useRef(null);
3128
+ const [menuStyle, setMenuStyle] = useState({});
3098
3129
  React__default.useImperativeHandle(ref, () => containerRef.current);
3099
3130
  const controlled = value !== void 0;
3100
3131
  const currentValue = controlled ? value : internalValue;
@@ -3140,12 +3171,29 @@ const DropdownMultiple = forwardRef(
3140
3171
  useEffect(() => {
3141
3172
  if (!open) setSearch("");
3142
3173
  }, [open]);
3174
+ const updateMenuPosition = useCallback(() => {
3175
+ if (!triggerRef.current) return;
3176
+ const rect = triggerRef.current.getBoundingClientRect();
3177
+ setMenuStyle({ position: "fixed", top: rect.bottom + 4, left: rect.left, width: rect.width });
3178
+ }, []);
3179
+ useEffect(() => {
3180
+ if (!open) return;
3181
+ updateMenuPosition();
3182
+ window.addEventListener("scroll", updateMenuPosition, true);
3183
+ window.addEventListener("resize", updateMenuPosition);
3184
+ return () => {
3185
+ window.removeEventListener("scroll", updateMenuPosition, true);
3186
+ window.removeEventListener("resize", updateMenuPosition);
3187
+ };
3188
+ }, [open, updateMenuPosition]);
3143
3189
  useEffect(() => {
3144
3190
  if (!open) return;
3145
3191
  const handler = (e) => {
3146
- if (containerRef.current && !containerRef.current.contains(e.target)) {
3147
- setOpen(false);
3148
- }
3192
+ var _a, _b;
3193
+ const target = e.target;
3194
+ const inContainer = ((_a = containerRef.current) == null ? void 0 : _a.contains(target)) ?? false;
3195
+ const inMenu = ((_b = menuRef.current) == null ? void 0 : _b.contains(target)) ?? false;
3196
+ if (!inContainer && !inMenu) setOpen(false);
3149
3197
  };
3150
3198
  document.addEventListener("mousedown", handler);
3151
3199
  return () => document.removeEventListener("mousedown", handler);
@@ -3379,6 +3427,7 @@ const DropdownMultiple = forwardRef(
3379
3427
  /* @__PURE__ */ jsxs(
3380
3428
  "div",
3381
3429
  {
3430
+ ref: triggerRef,
3382
3431
  onClick: handleTriggerClick,
3383
3432
  className: cn(
3384
3433
  "relative flex gap-[8px] items-center rounded-[8px]",
@@ -3414,76 +3463,82 @@ const DropdownMultiple = forwardRef(
3414
3463
  )
3415
3464
  }
3416
3465
  ),
3417
- /* @__PURE__ */ jsx("span", { className: "shrink-0", style: { color: caretColor }, children: isFocus ? /* @__PURE__ */ jsx(CaretUp, { size: 22 }) : /* @__PURE__ */ jsx(CaretDown, { size: 22 }) }),
3418
- open && !isStatic && options.length > 0 && /* @__PURE__ */ jsx(
3466
+ /* @__PURE__ */ jsx("span", { className: "shrink-0", style: { color: caretColor }, children: isFocus ? /* @__PURE__ */ jsx(CaretUp, { size: 22 }) : /* @__PURE__ */ jsx(CaretDown, { size: 22 }) })
3467
+ ]
3468
+ }
3469
+ ),
3470
+ open && !isStatic && options.length > 0 && createPortal(
3471
+ /* @__PURE__ */ jsx(
3472
+ "div",
3473
+ {
3474
+ ref: menuRef,
3475
+ className: "bg-popover rounded-[8px] overflow-clip p-[8px] flex flex-col items-start text-popover-foreground",
3476
+ style: {
3477
+ ...menuStyle,
3478
+ boxShadow: "var(--elevation-popover)",
3479
+ zIndex: 9999
3480
+ },
3481
+ children: /* @__PURE__ */ jsx(
3419
3482
  "div",
3420
3483
  {
3421
- className: "absolute top-full left-0 w-full mt-1 bg-popover rounded-[8px] overflow-clip p-[8px] z-50 flex flex-col items-start text-popover-foreground",
3422
- style: {
3423
- boxShadow: "var(--elevation-popover)"
3424
- },
3425
- children: /* @__PURE__ */ jsx(
3426
- "div",
3427
- {
3428
- className: cn(
3429
- "w-full flex flex-col",
3430
- filteredOptions.length > 10 && "overflow-y-auto"
3431
- ),
3432
- style: filteredOptions.length > 10 ? { maxHeight: 10 * 48 } : void 0,
3433
- children: filteredOptions.length > 0 ? filteredOptions.map((opt) => {
3434
- const isSelected = currentValue.includes(opt.value);
3435
- return /* @__PURE__ */ jsx(
3436
- "div",
3437
- {
3438
- onClick: (e) => {
3439
- var _a;
3440
- e.stopPropagation();
3441
- handleToggleOption(opt.value);
3442
- (_a = inputRef.current) == null ? void 0 : _a.focus();
3443
- },
3444
- className: cn(
3445
- "w-full shrink-0 rounded-[4px] cursor-pointer transition-colors duration-100",
3446
- isSelected ? "bg-primary-action-light" : "bg-popover hover:bg-disabled-bg"
3447
- ),
3448
- children: /* @__PURE__ */ jsx("div", { className: "flex flex-row items-center size-full", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-[8px] p-[14px] relative w-full", children: [
3449
- /* @__PURE__ */ jsx(
3450
- "p",
3451
- {
3452
- className: cn(
3453
- "flex-1 min-w-0 min-h-[1px] leading-[20px] not-italic overflow-hidden text-[14px] text-ellipsis whitespace-nowrap",
3454
- isSelected ? "text-primary-action" : "text-foreground"
3455
- ),
3456
- children: opt.label
3457
- }
3484
+ className: cn(
3485
+ "w-full flex flex-col",
3486
+ filteredOptions.length > 10 && "overflow-y-auto"
3487
+ ),
3488
+ style: filteredOptions.length > 10 ? { maxHeight: 10 * 48 } : void 0,
3489
+ children: filteredOptions.length > 0 ? filteredOptions.map((opt) => {
3490
+ const isSelected = currentValue.includes(opt.value);
3491
+ return /* @__PURE__ */ jsx(
3492
+ "div",
3493
+ {
3494
+ onClick: (e) => {
3495
+ var _a;
3496
+ e.stopPropagation();
3497
+ handleToggleOption(opt.value);
3498
+ (_a = inputRef.current) == null ? void 0 : _a.focus();
3499
+ },
3500
+ className: cn(
3501
+ "w-full shrink-0 rounded-[4px] cursor-pointer transition-colors duration-100",
3502
+ isSelected ? "bg-primary-action-light" : "bg-popover hover:bg-disabled-bg"
3503
+ ),
3504
+ children: /* @__PURE__ */ jsx("div", { className: "flex flex-row items-center size-full", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-[8px] p-[14px] relative w-full", children: [
3505
+ /* @__PURE__ */ jsx(
3506
+ "p",
3507
+ {
3508
+ className: cn(
3509
+ "flex-1 min-w-0 min-h-[1px] leading-[20px] not-italic overflow-hidden text-[14px] text-ellipsis whitespace-nowrap",
3510
+ isSelected ? "text-primary-action" : "text-foreground"
3458
3511
  ),
3459
- /* @__PURE__ */ jsx(
3460
- "div",
3512
+ children: opt.label
3513
+ }
3514
+ ),
3515
+ /* @__PURE__ */ jsx(
3516
+ "div",
3517
+ {
3518
+ className: cn(
3519
+ "shrink-0 w-[16px] h-[16px] rounded-[3px] flex items-center justify-center transition-colors duration-100",
3520
+ "bg-transparent"
3521
+ ),
3522
+ children: isSelected && /* @__PURE__ */ jsx(
3523
+ Check,
3461
3524
  {
3462
- className: cn(
3463
- "shrink-0 w-[16px] h-[16px] rounded-[3px] flex items-center justify-center transition-colors duration-100",
3464
- "bg-transparent"
3465
- ),
3466
- children: isSelected && /* @__PURE__ */ jsx(
3467
- Check,
3468
- {
3469
- size: 12,
3470
- weight: "bold",
3471
- className: "text-primary-action"
3472
- }
3473
- )
3525
+ size: 12,
3526
+ weight: "bold",
3527
+ className: "text-primary-action"
3474
3528
  }
3475
3529
  )
3476
- ] }) })
3477
- },
3478
- opt.value
3479
- );
3480
- }) : /* @__PURE__ */ jsx("div", { className: "w-full shrink-0 bg-popover", children: /* @__PURE__ */ jsx("div", { className: "flex flex-row items-center size-full", children: /* @__PURE__ */ jsx("div", { className: "flex items-center p-[14px] relative w-full", children: /* @__PURE__ */ jsx("p", { className: "flex-1 min-w-0 min-h-[1px] leading-[20px] not-italic text-[14px] text-disabled", children: "No results found" }) }) }) })
3481
- }
3482
- )
3530
+ }
3531
+ )
3532
+ ] }) })
3533
+ },
3534
+ opt.value
3535
+ );
3536
+ }) : /* @__PURE__ */ jsx("div", { className: "w-full shrink-0 bg-popover", children: /* @__PURE__ */ jsx("div", { className: "flex flex-row items-center size-full", children: /* @__PURE__ */ jsx("div", { className: "flex items-center p-[14px] relative w-full", children: /* @__PURE__ */ jsx("p", { className: "flex-1 min-w-0 min-h-[1px] leading-[20px] not-italic text-[14px] text-disabled", children: "No results found" }) }) }) })
3483
3537
  }
3484
3538
  )
3485
- ]
3486
- }
3539
+ }
3540
+ ),
3541
+ document.body
3487
3542
  ),
3488
3543
  showBelow && /* @__PURE__ */ jsx("div", { className: "flex items-start px-[4px] text-[12px] leading-[16px]", children: /* @__PURE__ */ jsx(
3489
3544
  "span",
@@ -3559,7 +3614,7 @@ const Input = forwardRef(function Input2({
3559
3614
  onBlurProp == null ? void 0 : onBlurProp(e);
3560
3615
  setFocused(false);
3561
3616
  };
3562
- const containerFlex = isFilled ? !hasRight ? "flex-col items-start justify-center" : rightIcon ? "flex items-center gap-[8px]" : "flex items-end gap-[8px]" : cn("flex items-center", hasRight && "gap-[8px]");
3617
+ const containerFlex = isFilled ? !hasRight ? "flex-col items-start justify-center" : rightIcon ? "flex items-center gap-[8px]" : "flex items-center gap-[8px]" : cn("flex items-center", hasRight && "gap-[8px]");
3563
3618
  const inputCaretStyle = {
3564
3619
  caretColor: "var(--caret-color)"
3565
3620
  };
@@ -3568,7 +3623,8 @@ const Input = forwardRef(function Input2({
3568
3623
  "div",
3569
3624
  {
3570
3625
  className: cn(
3571
- "relative rounded-lg min-h-[48px]",
3626
+ "relative rounded-lg",
3627
+ isFilled ? "min-h-[48px]" : "h-[48px]",
3572
3628
  padding,
3573
3629
  bg,
3574
3630
  containerFlex
@@ -3645,7 +3701,7 @@ const Input = forwardRef(function Input2({
3645
3701
  } : {
3646
3702
  ...inputStyleProp,
3647
3703
  color: "transparent",
3648
- caretColor: isFocus ? "var(--caret-color)" : "transparent",
3704
+ caretColor: focused ? "var(--caret-color)" : "transparent",
3649
3705
  padding: hasRight ? "12px 14px" : "14px",
3650
3706
  fontSize: "16px",
3651
3707
  lineHeight: "24px"
@@ -4037,16 +4093,16 @@ const Notification = forwardRef(
4037
4093
  style: { width: (mobileAlign == null ? void 0 : mobileAlign.width) ?? panelWidth },
4038
4094
  children: /* @__PURE__ */ jsxs("div", { className: "max-h-[480px] overflow-y-auto", children: [
4039
4095
  !hasItems && /* @__PURE__ */ jsx("div", { className: "px-4 py-8 text-center text-sm text-muted-foreground", children: emptyText }),
4040
- groups.map((group) => /* @__PURE__ */ jsx("div", { className: "w-full", children: /* @__PURE__ */ jsx("div", { children: group.items.map((item) => /* @__PURE__ */ jsx(
4096
+ groups.map((group, gi) => /* @__PURE__ */ jsx("div", { className: "w-full", children: /* @__PURE__ */ jsx("div", { children: group.items.map((item, ii) => /* @__PURE__ */ jsx(
4041
4097
  NotificationRow,
4042
4098
  {
4043
4099
  item,
4044
4100
  onItemClick: handleItemClick,
4045
- hideIndicator: clickedItemIds.has(item.id),
4101
+ hideIndicator: item.id ? clickedItemIds.has(item.id) : false,
4046
4102
  demoteNewBackground: wasDismissed
4047
4103
  },
4048
- item.id
4049
- )) }) }, group.label))
4104
+ item.id ?? `${gi}-${ii}`
4105
+ )) }) }, group.label ?? gi))
4050
4106
  ] })
4051
4107
  }
4052
4108
  ) })
@@ -4816,6 +4872,7 @@ const TableRow = forwardRef(
4816
4872
  selected = false,
4817
4873
  onSelectedChange,
4818
4874
  hoverable = true,
4875
+ header: _header,
4819
4876
  onMouseEnter,
4820
4877
  onMouseLeave,
4821
4878
  ...props
@@ -4859,6 +4916,7 @@ const TableHeaderCell = forwardRef(
4859
4916
  fixed,
4860
4917
  fixedOffset = 0,
4861
4918
  fixedShadow,
4919
+ contentAlign: _contentAlign,
4862
4920
  children = "Title text",
4863
4921
  style: styleProp,
4864
4922
  onClick: onClickProp,
@@ -5042,10 +5100,22 @@ const TableCell = forwardRef(function TableCell2({
5042
5100
  }
5043
5101
  );
5044
5102
  });
5103
+ const TableHead = forwardRef(
5104
+ function TableHead2({ className, ...props }, ref) {
5105
+ return /* @__PURE__ */ jsx("thead", { ref, className: cn("", className), ...props });
5106
+ }
5107
+ );
5108
+ const TableBody = forwardRef(
5109
+ function TableBody2({ className, ...props }, ref) {
5110
+ return /* @__PURE__ */ jsx("tbody", { ref, className: cn("", className), ...props });
5111
+ }
5112
+ );
5045
5113
  Table.displayName = "Table";
5046
5114
  TableRow.displayName = "TableRow";
5047
5115
  TableHeaderCell.displayName = "TableHeaderCell";
5048
5116
  TableCell.displayName = "TableCell";
5117
+ TableHead.displayName = "TableHead";
5118
+ TableBody.displayName = "TableBody";
5049
5119
  const TextArea = forwardRef(
5050
5120
  function TextArea2({
5051
5121
  placeholder = "Text label",
@@ -5894,6 +5964,8 @@ const index = {
5894
5964
  Tag,
5895
5965
  StatusTag,
5896
5966
  Table,
5967
+ TableHead,
5968
+ TableBody,
5897
5969
  TableRow,
5898
5970
  TableHeaderCell,
5899
5971
  TableCell,
@@ -5923,7 +5995,9 @@ export {
5923
5995
  Tab,
5924
5996
  TabGroup,
5925
5997
  Table,
5998
+ TableBody,
5926
5999
  TableCell,
6000
+ TableHead,
5927
6001
  TableHeaderCell,
5928
6002
  TableRow,
5929
6003
  Tag,