@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
@@ -1617,6 +1617,7 @@ import {
1617
1617
  useEffect as useEffect11,
1618
1618
  useId as useId4,
1619
1619
  useImperativeHandle as useImperativeHandle2,
1620
+ useMemo as useMemo5,
1620
1621
  useRef as useRef8,
1621
1622
  useState as useState12
1622
1623
  } from "react";
@@ -2125,9 +2126,9 @@ function useFloatingElement({
2125
2126
 
2126
2127
  // src/components/user-action/select/Select.tsx
2127
2128
  import { createPortal } from "react-dom";
2128
- import { Fragment as Fragment5, jsx as jsx15, jsxs as jsxs8 } from "react/jsx-runtime";
2129
+ import { jsx as jsx15, jsxs as jsxs8 } from "react/jsx-runtime";
2129
2130
  var defaultToggleOpenOptions = {
2130
- highlightStartPosition: "first"
2131
+ highlightStartPositionBehavior: "first"
2131
2132
  };
2132
2133
  var SelectContext = createContext3(null);
2133
2134
  function useSelectContext() {
@@ -2150,47 +2151,62 @@ var SelectRoot = ({
2150
2151
  isMultiSelect = false,
2151
2152
  iconAppearance = "left"
2152
2153
  }) => {
2153
- const [options, setOptions] = useState12([]);
2154
2154
  const triggerRef = useRef8(null);
2155
2155
  const generatedId = useId4();
2156
2156
  const usedId = id ?? generatedId;
2157
2157
  const [internalState, setInternalState] = useState12({
2158
- isOpen
2158
+ isOpen,
2159
+ options: []
2159
2160
  });
2160
- const selectedValues = isMultiSelect ? values ?? [] : [value].filter(Boolean);
2161
+ const selectedValues = useMemo5(
2162
+ () => isMultiSelect ? values ?? [] : [value].filter(Boolean),
2163
+ [isMultiSelect, value, values]
2164
+ );
2165
+ const selectedOptions = useMemo5(
2166
+ () => selectedValues.map((value2) => internalState.options.find((option) => value2 === option.value)).filter(Boolean),
2167
+ [selectedValues, internalState.options]
2168
+ );
2161
2169
  const state = {
2162
2170
  ...internalState,
2163
2171
  id: usedId,
2164
2172
  disabled,
2165
2173
  invalid,
2166
2174
  value: selectedValues,
2167
- options,
2168
- selectedOptions: selectedValues.map((value2) => options.find((option) => value2 === option.value)).filter(Boolean)
2175
+ selectedOptions
2169
2176
  };
2170
2177
  const config = {
2171
2178
  isMultiSelect,
2172
2179
  iconAppearance
2173
2180
  };
2174
2181
  const registerItem = useCallback9((item) => {
2175
- setOptions((prev) => {
2176
- const updated = [...prev, item];
2177
- updated.sort((a, b) => {
2182
+ setInternalState((prev) => {
2183
+ const updatedOptions = [...prev.options, item];
2184
+ updatedOptions.sort((a, b) => {
2178
2185
  const aEl = a.ref.current;
2179
2186
  const bEl = b.ref.current;
2180
2187
  if (!aEl || !bEl) return 0;
2181
2188
  return aEl.compareDocumentPosition(bEl) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;
2182
2189
  });
2183
- return updated;
2190
+ return {
2191
+ ...prev,
2192
+ options: updatedOptions
2193
+ };
2184
2194
  });
2185
2195
  }, []);
2186
2196
  const unregisterItem = useCallback9((value2) => {
2187
- setOptions((prev) => prev.filter((i) => i.value !== value2));
2197
+ setInternalState((prev) => {
2198
+ const updatedOptions = prev.options.filter((i) => i.value !== value2);
2199
+ return {
2200
+ ...prev,
2201
+ options: updatedOptions
2202
+ };
2203
+ });
2188
2204
  }, []);
2189
2205
  const toggleSelection = (value2, isSelected) => {
2190
2206
  if (disabled) {
2191
2207
  return;
2192
2208
  }
2193
- const option = options.find((i) => i.value === value2);
2209
+ const option = state.options.find((i) => i.value === value2);
2194
2210
  if (!option) {
2195
2211
  console.error(`SelectOption with value: ${value2} not found`);
2196
2212
  return;
@@ -2233,35 +2249,40 @@ var SelectRoot = ({
2233
2249
  triggerRef.current = null;
2234
2250
  }, []);
2235
2251
  const toggleOpen = (isOpen2, toggleOpenOptions) => {
2236
- const { highlightStartPosition } = { ...defaultToggleOpenOptions, ...toggleOpenOptions };
2237
- let highlightedIndex;
2238
- if (highlightStartPosition === "first") {
2239
- highlightedIndex = options.findIndex((option) => !option.disabled);
2240
- } else {
2241
- highlightedIndex = options.length - 1 - [...options].reverse().findIndex((option) => !option.disabled);
2242
- }
2243
- if (highlightedIndex === -1 || highlightedIndex === options.length) {
2244
- highlightedIndex = 0;
2252
+ const { highlightStartPositionBehavior } = { ...defaultToggleOpenOptions, ...toggleOpenOptions };
2253
+ let firstSelectedValue;
2254
+ let firstEnabledValue;
2255
+ for (let i = 0; i < state.options.length; i++) {
2256
+ const currentOption = state.options[highlightStartPositionBehavior === "first" ? i : state.options.length - i - 1];
2257
+ if (!currentOption.disabled) {
2258
+ if (!firstEnabledValue) {
2259
+ firstEnabledValue = currentOption.value;
2260
+ }
2261
+ if (selectedValues.includes(currentOption.value)) {
2262
+ firstSelectedValue = currentOption.value;
2263
+ break;
2264
+ }
2265
+ }
2245
2266
  }
2246
2267
  setInternalState((prevState) => ({
2247
2268
  ...prevState,
2248
2269
  isOpen: isOpen2 ?? !prevState.isOpen,
2249
- highlightedValue: options[highlightedIndex].value
2270
+ highlightedValue: firstSelectedValue ?? firstEnabledValue
2250
2271
  }));
2251
2272
  };
2252
2273
  const moveHighlightedIndex = (delta) => {
2253
- let highlightedIndex = options.findIndex((value2) => value2.value === internalState.highlightedValue);
2274
+ let highlightedIndex = state.options.findIndex((value2) => value2.value === internalState.highlightedValue);
2254
2275
  if (highlightedIndex === -1) {
2255
2276
  highlightedIndex = 0;
2256
2277
  }
2257
- const optionLength = options.length;
2278
+ const optionLength = state.options.length;
2258
2279
  const startIndex = (highlightedIndex + delta % optionLength + optionLength) % optionLength;
2259
2280
  const isForward = delta >= 0;
2260
- let highlightedValue = options[startIndex].value;
2261
- for (let i = 0; i < options.length; i++) {
2281
+ let highlightedValue = state.options[startIndex].value;
2282
+ for (let i = 0; i < state.options.length; i++) {
2262
2283
  const index = (startIndex + (isForward ? i : -i) + optionLength) % optionLength;
2263
- if (!options[index].disabled) {
2264
- highlightedValue = options[index].value;
2284
+ if (!state.options[index].disabled) {
2285
+ highlightedValue = state.options[index].value;
2265
2286
  break;
2266
2287
  }
2267
2288
  }
@@ -2272,9 +2293,9 @@ var SelectRoot = ({
2272
2293
  };
2273
2294
  useEffect11(() => {
2274
2295
  if (!internalState.highlightedValue) return;
2275
- const highlighted = options.find((value2) => value2.value === internalState.highlightedValue);
2296
+ const highlighted = internalState.options.find((value2) => value2.value === internalState.highlightedValue);
2276
2297
  if (highlighted) {
2277
- highlighted.ref.current.scrollIntoView({ behavior: "instant", block: "nearest" });
2298
+ highlighted.ref.current?.scrollIntoView({ behavior: "instant", block: "nearest" });
2278
2299
  } else {
2279
2300
  console.error(`SelectRoot: Could not find highlighted value (${internalState.highlightedValue})`);
2280
2301
  }
@@ -2411,12 +2432,12 @@ var SelectButton = forwardRef7(function SelectButton2({ placeholder, selectedDis
2411
2432
  props.onKeyDown?.(event);
2412
2433
  switch (event.key) {
2413
2434
  case "ArrowDown":
2414
- toggleOpen(true, { highlightStartPosition: "first" });
2435
+ toggleOpen(true, { highlightStartPositionBehavior: "first" });
2415
2436
  event.preventDefault();
2416
2437
  event.stopPropagation();
2417
2438
  break;
2418
2439
  case "ArrowUp":
2419
- toggleOpen(true, { highlightStartPosition: "last" });
2440
+ toggleOpen(true, { highlightStartPositionBehavior: "last" });
2420
2441
  event.preventDefault();
2421
2442
  event.stopPropagation();
2422
2443
  break;
@@ -2510,10 +2531,10 @@ var SelectChipDisplay = forwardRef7(function SelectChipDisplay2({ ...props }, re
2510
2531
  onKeyDown: (event) => {
2511
2532
  switch (event.key) {
2512
2533
  case "ArrowDown":
2513
- toggleOpen(true, { highlightStartPosition: "first" });
2534
+ toggleOpen(true, { highlightStartPositionBehavior: "first" });
2514
2535
  break;
2515
2536
  case "ArrowUp":
2516
- toggleOpen(true, { highlightStartPosition: "last" });
2537
+ toggleOpen(true, { highlightStartPositionBehavior: "last" });
2517
2538
  }
2518
2539
  },
2519
2540
  size: "small",
@@ -2534,6 +2555,7 @@ var SelectContent = forwardRef7(
2534
2555
  function SelectContent2({
2535
2556
  alignment,
2536
2557
  orientation = "vertical",
2558
+ containerClassName,
2537
2559
  ...props
2538
2560
  }, ref) {
2539
2561
  const innerRef = useRef8(null);
@@ -2550,76 +2572,83 @@ var SelectContent = forwardRef7(
2550
2572
  active: state.isOpen && !!position
2551
2573
  });
2552
2574
  return createPortal(
2553
- /* @__PURE__ */ jsxs8(Fragment5, { children: [
2554
- /* @__PURE__ */ jsx15(
2555
- "div",
2556
- {
2557
- hidden: !state.isOpen,
2558
- onClick: () => trigger.toggleOpen(false),
2559
- className: clsx9("fixed w-screen h-screen inset-0")
2560
- }
2561
- ),
2562
- /* @__PURE__ */ jsx15(
2563
- "ul",
2564
- {
2565
- ...props,
2566
- id: `${state.id}-listbox`,
2567
- ref: innerRef,
2568
- hidden: !state.isOpen,
2569
- onKeyDown: (event) => {
2570
- switch (event.key) {
2571
- case "Escape":
2572
- trigger.toggleOpen(false);
2573
- event.preventDefault();
2574
- event.stopPropagation();
2575
- break;
2576
- case match(orientation, {
2577
- vertical: "ArrowDown",
2578
- horizontal: "ArrowUp"
2579
- }):
2580
- item.moveHighlightedIndex(1);
2581
- event.preventDefault();
2582
- break;
2583
- case match(orientation, {
2584
- vertical: "ArrowUp",
2585
- horizontal: "ArrowDown"
2586
- }):
2587
- item.moveHighlightedIndex(-1);
2588
- event.preventDefault();
2589
- break;
2590
- case "Home":
2591
- event.preventDefault();
2592
- break;
2593
- case "End":
2594
- event.preventDefault();
2595
- break;
2596
- case "Enter":
2597
- // Fall through
2598
- case " ":
2599
- if (state.highlightedValue) {
2600
- item.toggleSelection(state.highlightedValue);
2601
- if (!config.isMultiSelect) {
2575
+ /* @__PURE__ */ jsxs8(
2576
+ "div",
2577
+ {
2578
+ id: `select-container-${state.id}`,
2579
+ className: clsx9("fixed inset-0 w-screen h-screen", containerClassName),
2580
+ hidden: !state.isOpen,
2581
+ children: [
2582
+ /* @__PURE__ */ jsx15(
2583
+ "div",
2584
+ {
2585
+ id: `select-background-${state.id}`,
2586
+ onClick: () => trigger.toggleOpen(false),
2587
+ className: clsx9("fixed inset-0 w-screen h-screen")
2588
+ }
2589
+ ),
2590
+ /* @__PURE__ */ jsx15(
2591
+ "ul",
2592
+ {
2593
+ ...props,
2594
+ id: `${state.id}-listbox`,
2595
+ ref: innerRef,
2596
+ onKeyDown: (event) => {
2597
+ switch (event.key) {
2598
+ case "Escape":
2602
2599
  trigger.toggleOpen(false);
2603
- }
2604
- event.preventDefault();
2600
+ event.preventDefault();
2601
+ event.stopPropagation();
2602
+ break;
2603
+ case match(orientation, {
2604
+ vertical: "ArrowDown",
2605
+ horizontal: "ArrowUp"
2606
+ }):
2607
+ item.moveHighlightedIndex(1);
2608
+ event.preventDefault();
2609
+ break;
2610
+ case match(orientation, {
2611
+ vertical: "ArrowUp",
2612
+ horizontal: "ArrowDown"
2613
+ }):
2614
+ item.moveHighlightedIndex(-1);
2615
+ event.preventDefault();
2616
+ break;
2617
+ case "Home":
2618
+ event.preventDefault();
2619
+ break;
2620
+ case "End":
2621
+ event.preventDefault();
2622
+ break;
2623
+ case "Enter":
2624
+ // Fall through
2625
+ case " ":
2626
+ if (state.highlightedValue) {
2627
+ item.toggleSelection(state.highlightedValue);
2628
+ if (!config.isMultiSelect) {
2629
+ trigger.toggleOpen(false);
2630
+ }
2631
+ event.preventDefault();
2632
+ }
2633
+ break;
2605
2634
  }
2606
- break;
2635
+ },
2636
+ className: clsx9("flex-col-0 p-2 bg-menu-background text-menu-text rounded-md shadow-hw-bottom focus-style-within overflow-auto", props.className),
2637
+ style: {
2638
+ opacity: position ? void 0 : 0,
2639
+ position: "fixed",
2640
+ ...position
2641
+ },
2642
+ role: "listbox",
2643
+ "aria-multiselectable": config.isMultiSelect,
2644
+ "aria-orientation": orientation,
2645
+ tabIndex: position ? 0 : void 0,
2646
+ children: props.children
2607
2647
  }
2608
- },
2609
- className: clsx9("flex-col-0 p-2 bg-menu-background text-menu-text rounded-md shadow-hw-bottom focus-style-within overflow-auto", props.className),
2610
- style: {
2611
- opacity: position ? void 0 : 0,
2612
- position: "fixed",
2613
- ...position
2614
- },
2615
- role: "listbox",
2616
- "aria-multiselectable": config.isMultiSelect,
2617
- "aria-orientation": orientation,
2618
- tabIndex: position ? 0 : void 0,
2619
- children: props.children
2620
- }
2621
- )
2622
- ] }),
2648
+ )
2649
+ ]
2650
+ }
2651
+ ),
2623
2652
  document.body
2624
2653
  );
2625
2654
  }