@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
@@ -498,6 +498,7 @@ import {
498
498
  useEffect as useEffect6,
499
499
  useId as useId3,
500
500
  useImperativeHandle,
501
+ useMemo as useMemo2,
501
502
  useRef as useRef2,
502
503
  useState as useState7
503
504
  } from "react";
@@ -1023,9 +1024,9 @@ function useFloatingElement({
1023
1024
 
1024
1025
  // src/components/user-action/select/Select.tsx
1025
1026
  import { createPortal } from "react-dom";
1026
- import { Fragment as Fragment2, jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
1027
+ import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
1027
1028
  var defaultToggleOpenOptions = {
1028
- highlightStartPosition: "first"
1029
+ highlightStartPositionBehavior: "first"
1029
1030
  };
1030
1031
  var SelectContext = createContext2(null);
1031
1032
  function useSelectContext() {
@@ -1048,47 +1049,62 @@ var SelectRoot = ({
1048
1049
  isMultiSelect = false,
1049
1050
  iconAppearance = "left"
1050
1051
  }) => {
1051
- const [options, setOptions] = useState7([]);
1052
1052
  const triggerRef = useRef2(null);
1053
1053
  const generatedId = useId3();
1054
1054
  const usedId = id ?? generatedId;
1055
1055
  const [internalState, setInternalState] = useState7({
1056
- isOpen
1056
+ isOpen,
1057
+ options: []
1057
1058
  });
1058
- const selectedValues = isMultiSelect ? values ?? [] : [value].filter(Boolean);
1059
+ const selectedValues = useMemo2(
1060
+ () => isMultiSelect ? values ?? [] : [value].filter(Boolean),
1061
+ [isMultiSelect, value, values]
1062
+ );
1063
+ const selectedOptions = useMemo2(
1064
+ () => selectedValues.map((value2) => internalState.options.find((option) => value2 === option.value)).filter(Boolean),
1065
+ [selectedValues, internalState.options]
1066
+ );
1059
1067
  const state = {
1060
1068
  ...internalState,
1061
1069
  id: usedId,
1062
1070
  disabled,
1063
1071
  invalid,
1064
1072
  value: selectedValues,
1065
- options,
1066
- selectedOptions: selectedValues.map((value2) => options.find((option) => value2 === option.value)).filter(Boolean)
1073
+ selectedOptions
1067
1074
  };
1068
1075
  const config = {
1069
1076
  isMultiSelect,
1070
1077
  iconAppearance
1071
1078
  };
1072
1079
  const registerItem = useCallback5((item) => {
1073
- setOptions((prev) => {
1074
- const updated = [...prev, item];
1075
- updated.sort((a, b) => {
1080
+ setInternalState((prev) => {
1081
+ const updatedOptions = [...prev.options, item];
1082
+ updatedOptions.sort((a, b) => {
1076
1083
  const aEl = a.ref.current;
1077
1084
  const bEl = b.ref.current;
1078
1085
  if (!aEl || !bEl) return 0;
1079
1086
  return aEl.compareDocumentPosition(bEl) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;
1080
1087
  });
1081
- return updated;
1088
+ return {
1089
+ ...prev,
1090
+ options: updatedOptions
1091
+ };
1082
1092
  });
1083
1093
  }, []);
1084
1094
  const unregisterItem = useCallback5((value2) => {
1085
- setOptions((prev) => prev.filter((i) => i.value !== value2));
1095
+ setInternalState((prev) => {
1096
+ const updatedOptions = prev.options.filter((i) => i.value !== value2);
1097
+ return {
1098
+ ...prev,
1099
+ options: updatedOptions
1100
+ };
1101
+ });
1086
1102
  }, []);
1087
1103
  const toggleSelection = (value2, isSelected) => {
1088
1104
  if (disabled) {
1089
1105
  return;
1090
1106
  }
1091
- const option = options.find((i) => i.value === value2);
1107
+ const option = state.options.find((i) => i.value === value2);
1092
1108
  if (!option) {
1093
1109
  console.error(`SelectOption with value: ${value2} not found`);
1094
1110
  return;
@@ -1131,35 +1147,40 @@ var SelectRoot = ({
1131
1147
  triggerRef.current = null;
1132
1148
  }, []);
1133
1149
  const toggleOpen = (isOpen2, toggleOpenOptions) => {
1134
- const { highlightStartPosition } = { ...defaultToggleOpenOptions, ...toggleOpenOptions };
1135
- let highlightedIndex;
1136
- if (highlightStartPosition === "first") {
1137
- highlightedIndex = options.findIndex((option) => !option.disabled);
1138
- } else {
1139
- highlightedIndex = options.length - 1 - [...options].reverse().findIndex((option) => !option.disabled);
1140
- }
1141
- if (highlightedIndex === -1 || highlightedIndex === options.length) {
1142
- highlightedIndex = 0;
1150
+ const { highlightStartPositionBehavior } = { ...defaultToggleOpenOptions, ...toggleOpenOptions };
1151
+ let firstSelectedValue;
1152
+ let firstEnabledValue;
1153
+ for (let i = 0; i < state.options.length; i++) {
1154
+ const currentOption = state.options[highlightStartPositionBehavior === "first" ? i : state.options.length - i - 1];
1155
+ if (!currentOption.disabled) {
1156
+ if (!firstEnabledValue) {
1157
+ firstEnabledValue = currentOption.value;
1158
+ }
1159
+ if (selectedValues.includes(currentOption.value)) {
1160
+ firstSelectedValue = currentOption.value;
1161
+ break;
1162
+ }
1163
+ }
1143
1164
  }
1144
1165
  setInternalState((prevState) => ({
1145
1166
  ...prevState,
1146
1167
  isOpen: isOpen2 ?? !prevState.isOpen,
1147
- highlightedValue: options[highlightedIndex].value
1168
+ highlightedValue: firstSelectedValue ?? firstEnabledValue
1148
1169
  }));
1149
1170
  };
1150
1171
  const moveHighlightedIndex = (delta) => {
1151
- let highlightedIndex = options.findIndex((value2) => value2.value === internalState.highlightedValue);
1172
+ let highlightedIndex = state.options.findIndex((value2) => value2.value === internalState.highlightedValue);
1152
1173
  if (highlightedIndex === -1) {
1153
1174
  highlightedIndex = 0;
1154
1175
  }
1155
- const optionLength = options.length;
1176
+ const optionLength = state.options.length;
1156
1177
  const startIndex = (highlightedIndex + delta % optionLength + optionLength) % optionLength;
1157
1178
  const isForward = delta >= 0;
1158
- let highlightedValue = options[startIndex].value;
1159
- for (let i = 0; i < options.length; i++) {
1179
+ let highlightedValue = state.options[startIndex].value;
1180
+ for (let i = 0; i < state.options.length; i++) {
1160
1181
  const index = (startIndex + (isForward ? i : -i) + optionLength) % optionLength;
1161
- if (!options[index].disabled) {
1162
- highlightedValue = options[index].value;
1182
+ if (!state.options[index].disabled) {
1183
+ highlightedValue = state.options[index].value;
1163
1184
  break;
1164
1185
  }
1165
1186
  }
@@ -1170,9 +1191,9 @@ var SelectRoot = ({
1170
1191
  };
1171
1192
  useEffect6(() => {
1172
1193
  if (!internalState.highlightedValue) return;
1173
- const highlighted = options.find((value2) => value2.value === internalState.highlightedValue);
1194
+ const highlighted = internalState.options.find((value2) => value2.value === internalState.highlightedValue);
1174
1195
  if (highlighted) {
1175
- highlighted.ref.current.scrollIntoView({ behavior: "instant", block: "nearest" });
1196
+ highlighted.ref.current?.scrollIntoView({ behavior: "instant", block: "nearest" });
1176
1197
  } else {
1177
1198
  console.error(`SelectRoot: Could not find highlighted value (${internalState.highlightedValue})`);
1178
1199
  }
@@ -1309,12 +1330,12 @@ var SelectButton = forwardRef3(function SelectButton2({ placeholder, selectedDis
1309
1330
  props.onKeyDown?.(event);
1310
1331
  switch (event.key) {
1311
1332
  case "ArrowDown":
1312
- toggleOpen(true, { highlightStartPosition: "first" });
1333
+ toggleOpen(true, { highlightStartPositionBehavior: "first" });
1313
1334
  event.preventDefault();
1314
1335
  event.stopPropagation();
1315
1336
  break;
1316
1337
  case "ArrowUp":
1317
- toggleOpen(true, { highlightStartPosition: "last" });
1338
+ toggleOpen(true, { highlightStartPositionBehavior: "last" });
1318
1339
  event.preventDefault();
1319
1340
  event.stopPropagation();
1320
1341
  break;
@@ -1408,10 +1429,10 @@ var SelectChipDisplay = forwardRef3(function SelectChipDisplay2({ ...props }, re
1408
1429
  onKeyDown: (event) => {
1409
1430
  switch (event.key) {
1410
1431
  case "ArrowDown":
1411
- toggleOpen(true, { highlightStartPosition: "first" });
1432
+ toggleOpen(true, { highlightStartPositionBehavior: "first" });
1412
1433
  break;
1413
1434
  case "ArrowUp":
1414
- toggleOpen(true, { highlightStartPosition: "last" });
1435
+ toggleOpen(true, { highlightStartPositionBehavior: "last" });
1415
1436
  }
1416
1437
  },
1417
1438
  size: "small",
@@ -1432,6 +1453,7 @@ var SelectContent = forwardRef3(
1432
1453
  function SelectContent2({
1433
1454
  alignment,
1434
1455
  orientation = "vertical",
1456
+ containerClassName,
1435
1457
  ...props
1436
1458
  }, ref) {
1437
1459
  const innerRef = useRef2(null);
@@ -1448,76 +1470,83 @@ var SelectContent = forwardRef3(
1448
1470
  active: state.isOpen && !!position
1449
1471
  });
1450
1472
  return createPortal(
1451
- /* @__PURE__ */ jsxs5(Fragment2, { children: [
1452
- /* @__PURE__ */ jsx6(
1453
- "div",
1454
- {
1455
- hidden: !state.isOpen,
1456
- onClick: () => trigger.toggleOpen(false),
1457
- className: clsx5("fixed w-screen h-screen inset-0")
1458
- }
1459
- ),
1460
- /* @__PURE__ */ jsx6(
1461
- "ul",
1462
- {
1463
- ...props,
1464
- id: `${state.id}-listbox`,
1465
- ref: innerRef,
1466
- hidden: !state.isOpen,
1467
- onKeyDown: (event) => {
1468
- switch (event.key) {
1469
- case "Escape":
1470
- trigger.toggleOpen(false);
1471
- event.preventDefault();
1472
- event.stopPropagation();
1473
- break;
1474
- case match(orientation, {
1475
- vertical: "ArrowDown",
1476
- horizontal: "ArrowUp"
1477
- }):
1478
- item.moveHighlightedIndex(1);
1479
- event.preventDefault();
1480
- break;
1481
- case match(orientation, {
1482
- vertical: "ArrowUp",
1483
- horizontal: "ArrowDown"
1484
- }):
1485
- item.moveHighlightedIndex(-1);
1486
- event.preventDefault();
1487
- break;
1488
- case "Home":
1489
- event.preventDefault();
1490
- break;
1491
- case "End":
1492
- event.preventDefault();
1493
- break;
1494
- case "Enter":
1495
- // Fall through
1496
- case " ":
1497
- if (state.highlightedValue) {
1498
- item.toggleSelection(state.highlightedValue);
1499
- if (!config.isMultiSelect) {
1473
+ /* @__PURE__ */ jsxs5(
1474
+ "div",
1475
+ {
1476
+ id: `select-container-${state.id}`,
1477
+ className: clsx5("fixed inset-0 w-screen h-screen", containerClassName),
1478
+ hidden: !state.isOpen,
1479
+ children: [
1480
+ /* @__PURE__ */ jsx6(
1481
+ "div",
1482
+ {
1483
+ id: `select-background-${state.id}`,
1484
+ onClick: () => trigger.toggleOpen(false),
1485
+ className: clsx5("fixed inset-0 w-screen h-screen")
1486
+ }
1487
+ ),
1488
+ /* @__PURE__ */ jsx6(
1489
+ "ul",
1490
+ {
1491
+ ...props,
1492
+ id: `${state.id}-listbox`,
1493
+ ref: innerRef,
1494
+ onKeyDown: (event) => {
1495
+ switch (event.key) {
1496
+ case "Escape":
1500
1497
  trigger.toggleOpen(false);
1501
- }
1502
- event.preventDefault();
1498
+ event.preventDefault();
1499
+ event.stopPropagation();
1500
+ break;
1501
+ case match(orientation, {
1502
+ vertical: "ArrowDown",
1503
+ horizontal: "ArrowUp"
1504
+ }):
1505
+ item.moveHighlightedIndex(1);
1506
+ event.preventDefault();
1507
+ break;
1508
+ case match(orientation, {
1509
+ vertical: "ArrowUp",
1510
+ horizontal: "ArrowDown"
1511
+ }):
1512
+ item.moveHighlightedIndex(-1);
1513
+ event.preventDefault();
1514
+ break;
1515
+ case "Home":
1516
+ event.preventDefault();
1517
+ break;
1518
+ case "End":
1519
+ event.preventDefault();
1520
+ break;
1521
+ case "Enter":
1522
+ // Fall through
1523
+ case " ":
1524
+ if (state.highlightedValue) {
1525
+ item.toggleSelection(state.highlightedValue);
1526
+ if (!config.isMultiSelect) {
1527
+ trigger.toggleOpen(false);
1528
+ }
1529
+ event.preventDefault();
1530
+ }
1531
+ break;
1503
1532
  }
1504
- break;
1533
+ },
1534
+ className: clsx5("flex-col-0 p-2 bg-menu-background text-menu-text rounded-md shadow-hw-bottom focus-style-within overflow-auto", props.className),
1535
+ style: {
1536
+ opacity: position ? void 0 : 0,
1537
+ position: "fixed",
1538
+ ...position
1539
+ },
1540
+ role: "listbox",
1541
+ "aria-multiselectable": config.isMultiSelect,
1542
+ "aria-orientation": orientation,
1543
+ tabIndex: position ? 0 : void 0,
1544
+ children: props.children
1505
1545
  }
1506
- },
1507
- className: clsx5("flex-col-0 p-2 bg-menu-background text-menu-text rounded-md shadow-hw-bottom focus-style-within overflow-auto", props.className),
1508
- style: {
1509
- opacity: position ? void 0 : 0,
1510
- position: "fixed",
1511
- ...position
1512
- },
1513
- role: "listbox",
1514
- "aria-multiselectable": config.isMultiSelect,
1515
- "aria-orientation": orientation,
1516
- tabIndex: position ? 0 : void 0,
1517
- children: props.children
1518
- }
1519
- )
1520
- ] }),
1546
+ )
1547
+ ]
1548
+ }
1549
+ ),
1521
1550
  document.body
1522
1551
  );
1523
1552
  }