@helpwave/hightide 0.1.37 → 0.1.39

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 (144) hide show
  1. package/dist/components/date/DatePicker.js.map +1 -1
  2. package/dist/components/date/DatePicker.mjs.map +1 -1
  3. package/dist/components/date/DayPicker.js.map +1 -1
  4. package/dist/components/date/DayPicker.mjs.map +1 -1
  5. package/dist/components/date/TimeDisplay.js.map +1 -1
  6. package/dist/components/date/TimeDisplay.mjs.map +1 -1
  7. package/dist/components/date/YearMonthPicker.js.map +1 -1
  8. package/dist/components/date/YearMonthPicker.mjs.map +1 -1
  9. package/dist/components/date/index.js.map +1 -1
  10. package/dist/components/date/index.mjs.map +1 -1
  11. package/dist/components/dialog/ConfirmDialog.js +15 -9
  12. package/dist/components/dialog/ConfirmDialog.js.map +1 -1
  13. package/dist/components/dialog/ConfirmDialog.mjs +16 -10
  14. package/dist/components/dialog/ConfirmDialog.mjs.map +1 -1
  15. package/dist/components/dialog/Dialog.d.mts +4 -5
  16. package/dist/components/dialog/Dialog.d.ts +4 -5
  17. package/dist/components/dialog/Dialog.js +15 -9
  18. package/dist/components/dialog/Dialog.js.map +1 -1
  19. package/dist/components/dialog/Dialog.mjs +16 -10
  20. package/dist/components/dialog/Dialog.mjs.map +1 -1
  21. package/dist/components/dialog/DiscardChangesDialog.js +15 -9
  22. package/dist/components/dialog/DiscardChangesDialog.js.map +1 -1
  23. package/dist/components/dialog/DiscardChangesDialog.mjs +16 -10
  24. package/dist/components/dialog/DiscardChangesDialog.mjs.map +1 -1
  25. package/dist/components/dialog/InputDialog.js +15 -9
  26. package/dist/components/dialog/InputDialog.js.map +1 -1
  27. package/dist/components/dialog/InputDialog.mjs +16 -10
  28. package/dist/components/dialog/InputDialog.mjs.map +1 -1
  29. package/dist/components/dialog/LanguageDialog.js +188 -154
  30. package/dist/components/dialog/LanguageDialog.js.map +1 -1
  31. package/dist/components/dialog/LanguageDialog.mjs +151 -116
  32. package/dist/components/dialog/LanguageDialog.mjs.map +1 -1
  33. package/dist/components/dialog/ThemeDialog.js +191 -157
  34. package/dist/components/dialog/ThemeDialog.js.map +1 -1
  35. package/dist/components/dialog/ThemeDialog.mjs +151 -116
  36. package/dist/components/dialog/ThemeDialog.mjs.map +1 -1
  37. package/dist/components/dialog/index.js +205 -171
  38. package/dist/components/dialog/index.js.map +1 -1
  39. package/dist/components/dialog/index.mjs +152 -117
  40. package/dist/components/dialog/index.mjs.map +1 -1
  41. package/dist/components/index.js +337 -299
  42. package/dist/components/index.js.map +1 -1
  43. package/dist/components/index.mjs +198 -159
  44. package/dist/components/index.mjs.map +1 -1
  45. package/dist/components/layout/Carousel.d.mts +2 -1
  46. package/dist/components/layout/Carousel.d.ts +2 -1
  47. package/dist/components/layout/Carousel.js +4 -0
  48. package/dist/components/layout/Carousel.js.map +1 -1
  49. package/dist/components/layout/Carousel.mjs +4 -0
  50. package/dist/components/layout/Carousel.mjs.map +1 -1
  51. package/dist/components/layout/TextImage.js.map +1 -1
  52. package/dist/components/layout/TextImage.mjs.map +1 -1
  53. package/dist/components/layout/index.js +4 -0
  54. package/dist/components/layout/index.js.map +1 -1
  55. package/dist/components/layout/index.mjs +4 -0
  56. package/dist/components/layout/index.mjs.map +1 -1
  57. package/dist/components/loading-states/ErrorComponent.js.map +1 -1
  58. package/dist/components/loading-states/ErrorComponent.mjs.map +1 -1
  59. package/dist/components/loading-states/LoadingAnimation.js.map +1 -1
  60. package/dist/components/loading-states/LoadingAnimation.mjs.map +1 -1
  61. package/dist/components/loading-states/index.js.map +1 -1
  62. package/dist/components/loading-states/index.mjs.map +1 -1
  63. package/dist/components/navigation/Pagination.js.map +1 -1
  64. package/dist/components/navigation/Pagination.mjs.map +1 -1
  65. package/dist/components/navigation/StepperBar.js.map +1 -1
  66. package/dist/components/navigation/StepperBar.mjs.map +1 -1
  67. package/dist/components/navigation/index.js.map +1 -1
  68. package/dist/components/navigation/index.mjs.map +1 -1
  69. package/dist/components/properties/CheckboxProperty.js.map +1 -1
  70. package/dist/components/properties/CheckboxProperty.mjs.map +1 -1
  71. package/dist/components/properties/DateProperty.js.map +1 -1
  72. package/dist/components/properties/DateProperty.mjs.map +1 -1
  73. package/dist/components/properties/MultiSelectProperty.js +129 -101
  74. package/dist/components/properties/MultiSelectProperty.js.map +1 -1
  75. package/dist/components/properties/MultiSelectProperty.mjs +131 -102
  76. package/dist/components/properties/MultiSelectProperty.mjs.map +1 -1
  77. package/dist/components/properties/NumberProperty.js.map +1 -1
  78. package/dist/components/properties/NumberProperty.mjs.map +1 -1
  79. package/dist/components/properties/PropertyBase.js.map +1 -1
  80. package/dist/components/properties/PropertyBase.mjs.map +1 -1
  81. package/dist/components/properties/SelectProperty.js +129 -101
  82. package/dist/components/properties/SelectProperty.js.map +1 -1
  83. package/dist/components/properties/SelectProperty.mjs +131 -102
  84. package/dist/components/properties/SelectProperty.mjs.map +1 -1
  85. package/dist/components/properties/TextProperty.js.map +1 -1
  86. package/dist/components/properties/TextProperty.mjs.map +1 -1
  87. package/dist/components/properties/index.js +129 -101
  88. package/dist/components/properties/index.js.map +1 -1
  89. package/dist/components/properties/index.mjs +131 -102
  90. package/dist/components/properties/index.mjs.map +1 -1
  91. package/dist/components/table/Table.js.map +1 -1
  92. package/dist/components/table/Table.mjs.map +1 -1
  93. package/dist/components/table/TableFilterButton.js.map +1 -1
  94. package/dist/components/table/TableFilterButton.mjs.map +1 -1
  95. package/dist/components/table/index.js.map +1 -1
  96. package/dist/components/table/index.mjs.map +1 -1
  97. package/dist/components/user-action/CopyToClipboardWrapper.js.map +1 -1
  98. package/dist/components/user-action/CopyToClipboardWrapper.mjs.map +1 -1
  99. package/dist/components/user-action/DateAndTimePicker.js.map +1 -1
  100. package/dist/components/user-action/DateAndTimePicker.mjs.map +1 -1
  101. package/dist/components/user-action/SearchBar.js.map +1 -1
  102. package/dist/components/user-action/SearchBar.mjs.map +1 -1
  103. package/dist/components/user-action/index.js +129 -101
  104. package/dist/components/user-action/index.js.map +1 -1
  105. package/dist/components/user-action/index.mjs +131 -102
  106. package/dist/components/user-action/index.mjs.map +1 -1
  107. package/dist/components/user-action/select/Select.d.mts +2 -0
  108. package/dist/components/user-action/select/Select.d.ts +2 -0
  109. package/dist/components/user-action/select/Select.js +129 -101
  110. package/dist/components/user-action/select/Select.js.map +1 -1
  111. package/dist/components/user-action/select/Select.mjs +131 -102
  112. package/dist/components/user-action/select/Select.mjs.map +1 -1
  113. package/dist/components/user-action/select/index.js +129 -101
  114. package/dist/components/user-action/select/index.js.map +1 -1
  115. package/dist/components/user-action/select/index.mjs +131 -102
  116. package/dist/components/user-action/select/index.mjs.map +1 -1
  117. package/dist/hooks/index.js.map +1 -1
  118. package/dist/hooks/index.mjs.map +1 -1
  119. package/dist/hooks/useValidators.js.map +1 -1
  120. package/dist/hooks/useValidators.mjs.map +1 -1
  121. package/dist/index.js +362 -324
  122. package/dist/index.js.map +1 -1
  123. package/dist/index.mjs +206 -167
  124. package/dist/index.mjs.map +1 -1
  125. package/dist/localization/LanguageProvider.js +1 -1
  126. package/dist/localization/LanguageProvider.js.map +1 -1
  127. package/dist/localization/LanguageProvider.mjs +1 -1
  128. package/dist/localization/LanguageProvider.mjs.map +1 -1
  129. package/dist/localization/index.js +1 -1
  130. package/dist/localization/index.js.map +1 -1
  131. package/dist/localization/index.mjs +1 -1
  132. package/dist/localization/index.mjs.map +1 -1
  133. package/dist/localization/useTranslation.js.map +1 -1
  134. package/dist/localization/useTranslation.mjs.map +1 -1
  135. package/dist/style/globals.css +0 -3
  136. package/dist/theming/index.js +1 -1
  137. package/dist/theming/index.js.map +1 -1
  138. package/dist/theming/index.mjs +1 -1
  139. package/dist/theming/index.mjs.map +1 -1
  140. package/dist/theming/useTheme.js +1 -1
  141. package/dist/theming/useTheme.js.map +1 -1
  142. package/dist/theming/useTheme.mjs +1 -1
  143. package/dist/theming/useTheme.mjs.map +1 -1
  144. package/package.json +1 -1
@@ -3179,6 +3179,7 @@ import {
3179
3179
  useEffect as useEffect20,
3180
3180
  useId as useId5,
3181
3181
  useImperativeHandle as useImperativeHandle3,
3182
+ useMemo as useMemo5,
3182
3183
  useRef as useRef12,
3183
3184
  useState as useState20
3184
3185
  } from "react";
@@ -3573,9 +3574,9 @@ function useFloatingElement({
3573
3574
 
3574
3575
  // src/components/user-action/select/Select.tsx
3575
3576
  import { createPortal as createPortal2 } from "react-dom";
3576
- import { Fragment as Fragment6, jsx as jsx25, jsxs as jsxs18 } from "react/jsx-runtime";
3577
+ import { jsx as jsx25, jsxs as jsxs18 } from "react/jsx-runtime";
3577
3578
  var defaultToggleOpenOptions = {
3578
- highlightStartPosition: "first"
3579
+ highlightStartPositionBehavior: "first"
3579
3580
  };
3580
3581
  var SelectContext = createContext3(null);
3581
3582
  function useSelectContext() {
@@ -3598,47 +3599,62 @@ var SelectRoot = ({
3598
3599
  isMultiSelect = false,
3599
3600
  iconAppearance = "left"
3600
3601
  }) => {
3601
- const [options, setOptions] = useState20([]);
3602
3602
  const triggerRef = useRef12(null);
3603
3603
  const generatedId = useId5();
3604
3604
  const usedId = id ?? generatedId;
3605
3605
  const [internalState, setInternalState] = useState20({
3606
- isOpen
3606
+ isOpen,
3607
+ options: []
3607
3608
  });
3608
- const selectedValues = isMultiSelect ? values ?? [] : [value].filter(Boolean);
3609
+ const selectedValues = useMemo5(
3610
+ () => isMultiSelect ? values ?? [] : [value].filter(Boolean),
3611
+ [isMultiSelect, value, values]
3612
+ );
3613
+ const selectedOptions = useMemo5(
3614
+ () => selectedValues.map((value2) => internalState.options.find((option) => value2 === option.value)).filter(Boolean),
3615
+ [selectedValues, internalState.options]
3616
+ );
3609
3617
  const state = {
3610
3618
  ...internalState,
3611
3619
  id: usedId,
3612
3620
  disabled,
3613
3621
  invalid,
3614
3622
  value: selectedValues,
3615
- options,
3616
- selectedOptions: selectedValues.map((value2) => options.find((option) => value2 === option.value)).filter(Boolean)
3623
+ selectedOptions
3617
3624
  };
3618
3625
  const config = {
3619
3626
  isMultiSelect,
3620
3627
  iconAppearance
3621
3628
  };
3622
3629
  const registerItem = useCallback10((item) => {
3623
- setOptions((prev) => {
3624
- const updated = [...prev, item];
3625
- updated.sort((a, b) => {
3630
+ setInternalState((prev) => {
3631
+ const updatedOptions = [...prev.options, item];
3632
+ updatedOptions.sort((a, b) => {
3626
3633
  const aEl = a.ref.current;
3627
3634
  const bEl = b.ref.current;
3628
3635
  if (!aEl || !bEl) return 0;
3629
3636
  return aEl.compareDocumentPosition(bEl) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;
3630
3637
  });
3631
- return updated;
3638
+ return {
3639
+ ...prev,
3640
+ options: updatedOptions
3641
+ };
3632
3642
  });
3633
3643
  }, []);
3634
3644
  const unregisterItem = useCallback10((value2) => {
3635
- setOptions((prev) => prev.filter((i) => i.value !== value2));
3645
+ setInternalState((prev) => {
3646
+ const updatedOptions = prev.options.filter((i) => i.value !== value2);
3647
+ return {
3648
+ ...prev,
3649
+ options: updatedOptions
3650
+ };
3651
+ });
3636
3652
  }, []);
3637
3653
  const toggleSelection = (value2, isSelected) => {
3638
3654
  if (disabled) {
3639
3655
  return;
3640
3656
  }
3641
- const option = options.find((i) => i.value === value2);
3657
+ const option = state.options.find((i) => i.value === value2);
3642
3658
  if (!option) {
3643
3659
  console.error(`SelectOption with value: ${value2} not found`);
3644
3660
  return;
@@ -3681,35 +3697,40 @@ var SelectRoot = ({
3681
3697
  triggerRef.current = null;
3682
3698
  }, []);
3683
3699
  const toggleOpen = (isOpen2, toggleOpenOptions) => {
3684
- const { highlightStartPosition } = { ...defaultToggleOpenOptions, ...toggleOpenOptions };
3685
- let highlightedIndex;
3686
- if (highlightStartPosition === "first") {
3687
- highlightedIndex = options.findIndex((option) => !option.disabled);
3688
- } else {
3689
- highlightedIndex = options.length - 1 - [...options].reverse().findIndex((option) => !option.disabled);
3690
- }
3691
- if (highlightedIndex === -1 || highlightedIndex === options.length) {
3692
- highlightedIndex = 0;
3700
+ const { highlightStartPositionBehavior } = { ...defaultToggleOpenOptions, ...toggleOpenOptions };
3701
+ let firstSelectedValue;
3702
+ let firstEnabledValue;
3703
+ for (let i = 0; i < state.options.length; i++) {
3704
+ const currentOption = state.options[highlightStartPositionBehavior === "first" ? i : state.options.length - i - 1];
3705
+ if (!currentOption.disabled) {
3706
+ if (!firstEnabledValue) {
3707
+ firstEnabledValue = currentOption.value;
3708
+ }
3709
+ if (selectedValues.includes(currentOption.value)) {
3710
+ firstSelectedValue = currentOption.value;
3711
+ break;
3712
+ }
3713
+ }
3693
3714
  }
3694
3715
  setInternalState((prevState) => ({
3695
3716
  ...prevState,
3696
3717
  isOpen: isOpen2 ?? !prevState.isOpen,
3697
- highlightedValue: options[highlightedIndex].value
3718
+ highlightedValue: firstSelectedValue ?? firstEnabledValue
3698
3719
  }));
3699
3720
  };
3700
3721
  const moveHighlightedIndex = (delta) => {
3701
- let highlightedIndex = options.findIndex((value2) => value2.value === internalState.highlightedValue);
3722
+ let highlightedIndex = state.options.findIndex((value2) => value2.value === internalState.highlightedValue);
3702
3723
  if (highlightedIndex === -1) {
3703
3724
  highlightedIndex = 0;
3704
3725
  }
3705
- const optionLength = options.length;
3726
+ const optionLength = state.options.length;
3706
3727
  const startIndex = (highlightedIndex + delta % optionLength + optionLength) % optionLength;
3707
3728
  const isForward = delta >= 0;
3708
- let highlightedValue = options[startIndex].value;
3709
- for (let i = 0; i < options.length; i++) {
3729
+ let highlightedValue = state.options[startIndex].value;
3730
+ for (let i = 0; i < state.options.length; i++) {
3710
3731
  const index = (startIndex + (isForward ? i : -i) + optionLength) % optionLength;
3711
- if (!options[index].disabled) {
3712
- highlightedValue = options[index].value;
3732
+ if (!state.options[index].disabled) {
3733
+ highlightedValue = state.options[index].value;
3713
3734
  break;
3714
3735
  }
3715
3736
  }
@@ -3720,9 +3741,9 @@ var SelectRoot = ({
3720
3741
  };
3721
3742
  useEffect20(() => {
3722
3743
  if (!internalState.highlightedValue) return;
3723
- const highlighted = options.find((value2) => value2.value === internalState.highlightedValue);
3744
+ const highlighted = internalState.options.find((value2) => value2.value === internalState.highlightedValue);
3724
3745
  if (highlighted) {
3725
- highlighted.ref.current.scrollIntoView({ behavior: "instant", block: "nearest" });
3746
+ highlighted.ref.current?.scrollIntoView({ behavior: "instant", block: "nearest" });
3726
3747
  } else {
3727
3748
  console.error(`SelectRoot: Could not find highlighted value (${internalState.highlightedValue})`);
3728
3749
  }
@@ -3859,12 +3880,12 @@ var SelectButton = forwardRef10(function SelectButton2({ placeholder, selectedDi
3859
3880
  props.onKeyDown?.(event);
3860
3881
  switch (event.key) {
3861
3882
  case "ArrowDown":
3862
- toggleOpen(true, { highlightStartPosition: "first" });
3883
+ toggleOpen(true, { highlightStartPositionBehavior: "first" });
3863
3884
  event.preventDefault();
3864
3885
  event.stopPropagation();
3865
3886
  break;
3866
3887
  case "ArrowUp":
3867
- toggleOpen(true, { highlightStartPosition: "last" });
3888
+ toggleOpen(true, { highlightStartPositionBehavior: "last" });
3868
3889
  event.preventDefault();
3869
3890
  event.stopPropagation();
3870
3891
  break;
@@ -3958,10 +3979,10 @@ var SelectChipDisplay = forwardRef10(function SelectChipDisplay2({ ...props }, r
3958
3979
  onKeyDown: (event) => {
3959
3980
  switch (event.key) {
3960
3981
  case "ArrowDown":
3961
- toggleOpen(true, { highlightStartPosition: "first" });
3982
+ toggleOpen(true, { highlightStartPositionBehavior: "first" });
3962
3983
  break;
3963
3984
  case "ArrowUp":
3964
- toggleOpen(true, { highlightStartPosition: "last" });
3985
+ toggleOpen(true, { highlightStartPositionBehavior: "last" });
3965
3986
  }
3966
3987
  },
3967
3988
  size: "small",
@@ -3982,6 +4003,7 @@ var SelectContent = forwardRef10(
3982
4003
  function SelectContent2({
3983
4004
  alignment,
3984
4005
  orientation = "vertical",
4006
+ containerClassName,
3985
4007
  ...props
3986
4008
  }, ref) {
3987
4009
  const innerRef = useRef12(null);
@@ -3998,76 +4020,83 @@ var SelectContent = forwardRef10(
3998
4020
  active: state.isOpen && !!position
3999
4021
  });
4000
4022
  return createPortal2(
4001
- /* @__PURE__ */ jsxs18(Fragment6, { children: [
4002
- /* @__PURE__ */ jsx25(
4003
- "div",
4004
- {
4005
- hidden: !state.isOpen,
4006
- onClick: () => trigger.toggleOpen(false),
4007
- className: clsx20("fixed w-screen h-screen inset-0")
4008
- }
4009
- ),
4010
- /* @__PURE__ */ jsx25(
4011
- "ul",
4012
- {
4013
- ...props,
4014
- id: `${state.id}-listbox`,
4015
- ref: innerRef,
4016
- hidden: !state.isOpen,
4017
- onKeyDown: (event) => {
4018
- switch (event.key) {
4019
- case "Escape":
4020
- trigger.toggleOpen(false);
4021
- event.preventDefault();
4022
- event.stopPropagation();
4023
- break;
4024
- case match(orientation, {
4025
- vertical: "ArrowDown",
4026
- horizontal: "ArrowUp"
4027
- }):
4028
- item.moveHighlightedIndex(1);
4029
- event.preventDefault();
4030
- break;
4031
- case match(orientation, {
4032
- vertical: "ArrowUp",
4033
- horizontal: "ArrowDown"
4034
- }):
4035
- item.moveHighlightedIndex(-1);
4036
- event.preventDefault();
4037
- break;
4038
- case "Home":
4039
- event.preventDefault();
4040
- break;
4041
- case "End":
4042
- event.preventDefault();
4043
- break;
4044
- case "Enter":
4045
- // Fall through
4046
- case " ":
4047
- if (state.highlightedValue) {
4048
- item.toggleSelection(state.highlightedValue);
4049
- if (!config.isMultiSelect) {
4023
+ /* @__PURE__ */ jsxs18(
4024
+ "div",
4025
+ {
4026
+ id: `select-container-${state.id}`,
4027
+ className: clsx20("fixed inset-0 w-screen h-screen", containerClassName),
4028
+ hidden: !state.isOpen,
4029
+ children: [
4030
+ /* @__PURE__ */ jsx25(
4031
+ "div",
4032
+ {
4033
+ id: `select-background-${state.id}`,
4034
+ onClick: () => trigger.toggleOpen(false),
4035
+ className: clsx20("fixed inset-0 w-screen h-screen")
4036
+ }
4037
+ ),
4038
+ /* @__PURE__ */ jsx25(
4039
+ "ul",
4040
+ {
4041
+ ...props,
4042
+ id: `${state.id}-listbox`,
4043
+ ref: innerRef,
4044
+ onKeyDown: (event) => {
4045
+ switch (event.key) {
4046
+ case "Escape":
4050
4047
  trigger.toggleOpen(false);
4051
- }
4052
- event.preventDefault();
4048
+ event.preventDefault();
4049
+ event.stopPropagation();
4050
+ break;
4051
+ case match(orientation, {
4052
+ vertical: "ArrowDown",
4053
+ horizontal: "ArrowUp"
4054
+ }):
4055
+ item.moveHighlightedIndex(1);
4056
+ event.preventDefault();
4057
+ break;
4058
+ case match(orientation, {
4059
+ vertical: "ArrowUp",
4060
+ horizontal: "ArrowDown"
4061
+ }):
4062
+ item.moveHighlightedIndex(-1);
4063
+ event.preventDefault();
4064
+ break;
4065
+ case "Home":
4066
+ event.preventDefault();
4067
+ break;
4068
+ case "End":
4069
+ event.preventDefault();
4070
+ break;
4071
+ case "Enter":
4072
+ // Fall through
4073
+ case " ":
4074
+ if (state.highlightedValue) {
4075
+ item.toggleSelection(state.highlightedValue);
4076
+ if (!config.isMultiSelect) {
4077
+ trigger.toggleOpen(false);
4078
+ }
4079
+ event.preventDefault();
4080
+ }
4081
+ break;
4053
4082
  }
4054
- break;
4083
+ },
4084
+ className: clsx20("flex-col-0 p-2 bg-menu-background text-menu-text rounded-md shadow-hw-bottom focus-style-within overflow-auto", props.className),
4085
+ style: {
4086
+ opacity: position ? void 0 : 0,
4087
+ position: "fixed",
4088
+ ...position
4089
+ },
4090
+ role: "listbox",
4091
+ "aria-multiselectable": config.isMultiSelect,
4092
+ "aria-orientation": orientation,
4093
+ tabIndex: position ? 0 : void 0,
4094
+ children: props.children
4055
4095
  }
4056
- },
4057
- className: clsx20("flex-col-0 p-2 bg-menu-background text-menu-text rounded-md shadow-hw-bottom focus-style-within overflow-auto", props.className),
4058
- style: {
4059
- opacity: position ? void 0 : 0,
4060
- position: "fixed",
4061
- ...position
4062
- },
4063
- role: "listbox",
4064
- "aria-multiselectable": config.isMultiSelect,
4065
- "aria-orientation": orientation,
4066
- tabIndex: position ? 0 : void 0,
4067
- children: props.children
4068
- }
4069
- )
4070
- ] }),
4096
+ )
4097
+ ]
4098
+ }
4099
+ ),
4071
4100
  document.body
4072
4101
  );
4073
4102
  }