@trops/dash-core 0.1.26 → 0.1.28

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.esm.js CHANGED
@@ -26,7 +26,6 @@ import _getPrototypeOf from '@babel/runtime/helpers/getPrototypeOf';
26
26
  import _inherits from '@babel/runtime/helpers/inherits';
27
27
  import colors from 'tailwindcss/colors';
28
28
  import * as ReactDOM from 'react-dom';
29
- import * as dashCore from '@trops/dash-core';
30
29
  import { findIconDefinition } from '@fortawesome/fontawesome-svg-core';
31
30
  import algoliasearch from 'algoliasearch';
32
31
  import { InstantSearch, Hits } from 'react-instantsearch-hooks-web';
@@ -7162,39 +7161,45 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
7162
7161
  isCreatingProvider = _useState24[0],
7163
7162
  setIsCreatingProvider = _useState24[1];
7164
7163
 
7165
- // Registry state
7166
- var _useState25 = useState(false),
7164
+ // Installed widget grouping
7165
+ var _useState25 = useState(new Set()),
7167
7166
  _useState26 = _slicedToArray(_useState25, 2),
7168
- isLoadingRegistry = _useState26[0],
7169
- setIsLoadingRegistry = _useState26[1];
7170
- var _useState27 = useState(null),
7167
+ expandedGroups = _useState26[0],
7168
+ setExpandedGroups = _useState26[1];
7169
+
7170
+ // Registry state
7171
+ var _useState27 = useState(false),
7171
7172
  _useState28 = _slicedToArray(_useState27, 2),
7172
- registryError = _useState28[0],
7173
- setRegistryError = _useState28[1];
7174
- var _useState29 = useState([]),
7173
+ isLoadingRegistry = _useState28[0],
7174
+ setIsLoadingRegistry = _useState28[1];
7175
+ var _useState29 = useState(null),
7175
7176
  _useState30 = _slicedToArray(_useState29, 2),
7176
- registryPackages = _useState30[0],
7177
- setRegistryPackages = _useState30[1];
7178
- var _useState31 = useState("packages"),
7177
+ registryError = _useState30[0],
7178
+ setRegistryError = _useState30[1];
7179
+ var _useState31 = useState([]),
7179
7180
  _useState32 = _slicedToArray(_useState31, 2),
7180
- registryViewMode = _useState32[0],
7181
- setRegistryViewMode = _useState32[1]; // "packages" | "widgets"
7182
- var _useState33 = useState(new Set()),
7181
+ registryPackages = _useState32[0],
7182
+ setRegistryPackages = _useState32[1];
7183
+ var _useState33 = useState("packages"),
7183
7184
  _useState34 = _slicedToArray(_useState33, 2),
7184
- expandedPackages = _useState34[0],
7185
- setExpandedPackages = _useState34[1];
7186
- var _useState35 = useState(null),
7185
+ registryViewMode = _useState34[0],
7186
+ setRegistryViewMode = _useState34[1]; // "packages" | "widgets"
7187
+ var _useState35 = useState(new Set()),
7187
7188
  _useState36 = _slicedToArray(_useState35, 2),
7188
- selectedPackage = _useState36[0],
7189
- setSelectedPackage = _useState36[1];
7190
- var _useState37 = useState(false),
7189
+ expandedPackages = _useState36[0],
7190
+ setExpandedPackages = _useState36[1];
7191
+ var _useState37 = useState(null),
7191
7192
  _useState38 = _slicedToArray(_useState37, 2),
7192
- isInstalling = _useState38[0],
7193
- setIsInstalling = _useState38[1];
7194
- var _useState39 = useState(null),
7193
+ selectedPackage = _useState38[0],
7194
+ setSelectedPackage = _useState38[1];
7195
+ var _useState39 = useState(false),
7195
7196
  _useState40 = _slicedToArray(_useState39, 2),
7196
- installError = _useState40[0],
7197
- setInstallError = _useState40[1];
7197
+ isInstalling = _useState40[0],
7198
+ setIsInstalling = _useState40[1];
7199
+ var _useState41 = useState(null),
7200
+ _useState42 = _slicedToArray(_useState41, 2),
7201
+ installError = _useState42[0],
7202
+ setInstallError = _useState42[1];
7198
7203
 
7199
7204
  // Phase 3: Recent Widgets - localStorage functions
7200
7205
  var loadRecentWidgets = function loadRecentWidgets() {
@@ -7266,6 +7271,7 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
7266
7271
  setSearchQuery("");
7267
7272
  setSelectedAuthor("all");
7268
7273
  setSelectedProvider("all");
7274
+ setExpandedGroups(new Set()); // Start with all groups collapsed
7269
7275
  }
7270
7276
  // eslint-disable-next-line react-hooks/exhaustive-deps
7271
7277
  }, [isOpen]);
@@ -7419,6 +7425,42 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
7419
7425
  };
7420
7426
  var filteredWidgets = getFilteredWidgets();
7421
7427
 
7428
+ // Set of installed package names for "Installed" badge in Discover mode
7429
+ var installedPackageNames = useMemo(function () {
7430
+ var names = new Set();
7431
+ var map = ComponentManager.map();
7432
+ Object.values(map).forEach(function (widget) {
7433
+ if (widget._sourcePackage) names.add(widget._sourcePackage);
7434
+ });
7435
+ return names;
7436
+ }, [widgets]);
7437
+
7438
+ // Group installed widgets by package > author > "Other"
7439
+ var groupedInstalledWidgets = useMemo(function () {
7440
+ if (selectedSource !== "Installed") return {};
7441
+ var groups = {};
7442
+ filteredWidgets.forEach(function (widget) {
7443
+ var group = widget["package"] || widget.author || "Other";
7444
+ if (!groups[group]) groups[group] = [];
7445
+ groups[group].push(widget);
7446
+ });
7447
+ return groups;
7448
+ }, [filteredWidgets, selectedSource]);
7449
+ var installedGroupNames = useMemo(function () {
7450
+ return Object.keys(groupedInstalledWidgets).sort();
7451
+ }, [groupedInstalledWidgets]);
7452
+ var toggleGroup = function toggleGroup(groupName) {
7453
+ setExpandedGroups(function (prev) {
7454
+ var next = new Set(prev);
7455
+ if (next.has(groupName)) {
7456
+ next["delete"](groupName);
7457
+ } else {
7458
+ next.add(groupName);
7459
+ }
7460
+ return next;
7461
+ });
7462
+ };
7463
+
7422
7464
  // Group filtered widgets by package (for package view in Discover)
7423
7465
  var getGroupedByPackage = function getGroupedByPackage() {
7424
7466
  var groups = {};
@@ -7619,8 +7661,10 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
7619
7661
  var isAddButtonEnabled = function isAddButtonEnabled() {
7620
7662
  if (!selectedWidget) return false;
7621
7663
 
7622
- // For registry widgets, always enabled (install action)
7623
- if (selectedWidget.isRegistry) return true;
7664
+ // For registry widgets, enabled unless already installed
7665
+ if (selectedWidget.isRegistry) {
7666
+ return !installedPackageNames.has(selectedWidget.packageName);
7667
+ }
7624
7668
 
7625
7669
  // Check providers: all required providers must be selected
7626
7670
  var hasRequiredProviders = selectedWidget.providers ? selectedWidget.providers.filter(function (p) {
@@ -7725,31 +7769,56 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
7725
7769
  children: /*#__PURE__*/jsx("div", {
7726
7770
  className: "flex items-center justify-between w-full",
7727
7771
  children: /*#__PURE__*/jsxs("div", {
7728
- className: "flex items-center space-x-2 flex-1 min-w-0",
7772
+ className: "flex items-center gap-2 flex-1 min-w-0",
7729
7773
  children: [/*#__PURE__*/jsx("span", {
7730
7774
  className: "text-xs text-gray-500",
7731
7775
  children: expandedPackages.has(group.name) ? "\u25BC" : "\u25B6"
7732
7776
  }), /*#__PURE__*/jsxs("div", {
7733
7777
  className: "min-w-0 flex-1",
7734
7778
  children: [/*#__PURE__*/jsx("div", {
7735
- className: "text-base font-medium truncate",
7779
+ className: "text-sm font-medium truncate",
7736
7780
  children: group.displayName
7737
7781
  }), /*#__PURE__*/jsxs("div", {
7738
7782
  className: "text-xs text-gray-500",
7739
7783
  children: [group.widgets.length, " widget", group.widgets.length !== 1 ? "s" : "", " \xB7 v", group.version]
7740
7784
  })]
7785
+ }), installedPackageNames.has(group.name) && /*#__PURE__*/jsx("span", {
7786
+ className: "text-[10px] px-1.5 py-0.5 rounded bg-green-500/20 text-green-400 flex-shrink-0",
7787
+ children: "Installed"
7741
7788
  })]
7742
7789
  })
7743
7790
  })
7744
7791
  }), expandedPackages.has(group.name) && group.widgets.map(function (widget) {
7792
+ var _widget$providers;
7745
7793
  return /*#__PURE__*/jsx(MenuItem3, {
7746
7794
  onClick: function onClick() {
7747
7795
  return handleWidgetSelect(widget);
7748
7796
  },
7749
7797
  selected: (selectedWidget === null || selectedWidget === void 0 ? void 0 : selectedWidget.key) === widget.key,
7750
- children: /*#__PURE__*/jsx("div", {
7751
- className: "pl-6 text-sm",
7752
- children: widget.name
7798
+ children: /*#__PURE__*/jsxs("div", {
7799
+ className: "flex items-center gap-2 pl-6 w-full",
7800
+ children: [/*#__PURE__*/jsx(WidgetIcon, {
7801
+ icon: widget.icon,
7802
+ className: "h-4 w-4 opacity-60 flex-shrink-0",
7803
+ fallback: "puzzle-piece"
7804
+ }), /*#__PURE__*/jsxs("div", {
7805
+ className: "flex-1 min-w-0",
7806
+ children: [/*#__PURE__*/jsx("div", {
7807
+ className: "text-sm font-medium truncate",
7808
+ children: widget.name
7809
+ }), widget.description && /*#__PURE__*/jsx("div", {
7810
+ className: "text-xs opacity-50 truncate",
7811
+ children: widget.description
7812
+ }), ((_widget$providers = widget.providers) === null || _widget$providers === void 0 ? void 0 : _widget$providers.length) > 0 && /*#__PURE__*/jsx("div", {
7813
+ className: "flex flex-wrap gap-1 mt-0.5",
7814
+ children: widget.providers.map(function (p) {
7815
+ return /*#__PURE__*/jsx("span", {
7816
+ className: "text-[10px] px-1.5 py-0.5 rounded bg-blue-500/20 text-blue-300",
7817
+ children: p.type
7818
+ }, p.type);
7819
+ })
7820
+ })]
7821
+ })]
7753
7822
  })
7754
7823
  }, widget.key);
7755
7824
  })]
@@ -7764,19 +7833,44 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
7764
7833
  padding: true,
7765
7834
  height: "h-full",
7766
7835
  children: filteredWidgets.map(function (widget) {
7836
+ var _widget$providers2;
7767
7837
  return /*#__PURE__*/jsx(MenuItem3, {
7768
7838
  onClick: function onClick() {
7769
7839
  return handleWidgetSelect(widget);
7770
7840
  },
7771
7841
  selected: (selectedWidget === null || selectedWidget === void 0 ? void 0 : selectedWidget.key) === widget.key,
7772
7842
  children: /*#__PURE__*/jsxs("div", {
7773
- className: "flex items-center justify-between w-full",
7774
- children: [/*#__PURE__*/jsx("div", {
7775
- className: "text-base font-medium",
7776
- children: widget.name
7777
- }), /*#__PURE__*/jsx("span", {
7778
- className: "text-xs text-gray-500",
7779
- children: widget.packageDisplayName
7843
+ className: "flex items-center gap-2 w-full",
7844
+ children: [/*#__PURE__*/jsx(WidgetIcon, {
7845
+ icon: widget.icon,
7846
+ className: "h-4 w-4 opacity-60 flex-shrink-0",
7847
+ fallback: "puzzle-piece"
7848
+ }), /*#__PURE__*/jsxs("div", {
7849
+ className: "flex-1 min-w-0",
7850
+ children: [/*#__PURE__*/jsx("div", {
7851
+ className: "text-sm font-medium truncate",
7852
+ children: widget.name
7853
+ }), widget.description && /*#__PURE__*/jsx("div", {
7854
+ className: "text-xs opacity-50 truncate",
7855
+ children: widget.description
7856
+ }), ((_widget$providers2 = widget.providers) === null || _widget$providers2 === void 0 ? void 0 : _widget$providers2.length) > 0 && /*#__PURE__*/jsx("div", {
7857
+ className: "flex flex-wrap gap-1 mt-0.5",
7858
+ children: widget.providers.map(function (p) {
7859
+ return /*#__PURE__*/jsx("span", {
7860
+ className: "text-[10px] px-1.5 py-0.5 rounded bg-blue-500/20 text-blue-300",
7861
+ children: p.type
7862
+ }, p.type);
7863
+ })
7864
+ })]
7865
+ }), /*#__PURE__*/jsxs("div", {
7866
+ className: "flex items-center gap-1.5 flex-shrink-0",
7867
+ children: [installedPackageNames.has(widget.packageName) && /*#__PURE__*/jsx("span", {
7868
+ className: "text-[10px] px-1.5 py-0.5 rounded bg-green-500/20 text-green-400",
7869
+ children: "Installed"
7870
+ }), /*#__PURE__*/jsx("span", {
7871
+ className: "text-xs text-gray-500",
7872
+ children: widget.packageDisplayName
7873
+ })]
7780
7874
  })]
7781
7875
  })
7782
7876
  }, widget.key);
@@ -7808,6 +7902,9 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
7808
7902
  }), /*#__PURE__*/jsxs("span", {
7809
7903
  className: "text-xs px-2 py-0.5 rounded ".concat(currentTheme["bg-primary-medium"], " text-gray-300"),
7810
7904
  children: ["v", selectedWidget.packageVersion]
7905
+ }), installedPackageNames.has(selectedWidget.packageName) && /*#__PURE__*/jsx("span", {
7906
+ className: "text-xs px-2 py-0.5 rounded bg-green-500/20 text-green-400",
7907
+ children: "Installed"
7811
7908
  })]
7812
7909
  })]
7813
7910
  }), /*#__PURE__*/jsx("hr", {
@@ -7901,70 +7998,78 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
7901
7998
  }), /*#__PURE__*/jsxs("div", {
7902
7999
  className: "flex flex-col w-full lg:w-2/3 h-full overflow-hidden",
7903
8000
  children: [/*#__PURE__*/jsxs("div", {
7904
- className: "flex flex-row items-center space-x-3 mb-4 px-2",
7905
- children: [/*#__PURE__*/jsx("input", {
7906
- type: "text",
7907
- placeholder: selectedSource === "Discover" ? "Search packages and widgets..." : "Search widgets...",
7908
- value: searchQuery,
7909
- onChange: function onChange(e) {
7910
- return setSearchQuery(e.target.value);
7911
- },
7912
- className: "flex-1 px-3 py-2 rounded text-sm ".concat(currentTheme["bg-primary-medium"], " ").concat(currentTheme["text-primary-light"], " ").concat(currentTheme["border-primary-medium"], " border focus:outline-none focus:ring-2 focus:ring-blue-500")
7913
- }), /*#__PURE__*/jsxs("select", {
7914
- value: selectedAuthor,
7915
- onChange: function onChange(e) {
7916
- return setSelectedAuthor(e.target.value);
7917
- },
7918
- className: "px-3 py-2 rounded text-sm ".concat(currentTheme["bg-primary-medium"], " ").concat(currentTheme["text-primary-light"], " ").concat(currentTheme["border-primary-medium"], " border focus:outline-none focus:ring-2 focus:ring-blue-500"),
7919
- children: [/*#__PURE__*/jsx("option", {
7920
- value: "all",
7921
- children: "All Authors"
7922
- }), getUniqueAuthors().map(function (author) {
7923
- return /*#__PURE__*/jsx("option", {
7924
- value: author,
7925
- children: author
7926
- }, author);
7927
- })]
7928
- }), selectedSource === "Installed" && /*#__PURE__*/jsxs("select", {
7929
- value: selectedProvider,
7930
- onChange: function onChange(e) {
7931
- return setSelectedProvider(e.target.value);
7932
- },
7933
- className: "px-3 py-2 rounded text-sm ".concat(currentTheme["bg-primary-medium"], " ").concat(currentTheme["text-primary-light"], " ").concat(currentTheme["border-primary-medium"], " border focus:outline-none focus:ring-2 focus:ring-blue-500"),
7934
- children: [/*#__PURE__*/jsx("option", {
7935
- value: "all",
7936
- children: "All Providers"
7937
- }), getUniqueProviders().map(function (provider) {
7938
- return /*#__PURE__*/jsx("option", {
7939
- value: provider,
7940
- children: provider === "none" ? "No Providers" : provider
7941
- }, provider);
7942
- })]
7943
- }), selectedSource === "Discover" && /*#__PURE__*/jsxs("select", {
7944
- value: registryViewMode,
7945
- onChange: function onChange(e) {
7946
- return setRegistryViewMode(e.target.value);
7947
- },
7948
- className: "px-3 py-2 rounded text-sm ".concat(currentTheme["bg-primary-medium"], " ").concat(currentTheme["text-primary-light"], " ").concat(currentTheme["border-primary-medium"], " border focus:outline-none focus:ring-2 focus:ring-blue-500"),
7949
- children: [/*#__PURE__*/jsx("option", {
7950
- value: "packages",
7951
- children: "Packages"
7952
- }), /*#__PURE__*/jsx("option", {
7953
- value: "widgets",
7954
- children: "Widgets"
8001
+ className: "flex flex-col gap-3 mb-4 px-2",
8002
+ children: [/*#__PURE__*/jsxs("div", {
8003
+ className: "flex flex-row items-center gap-3",
8004
+ children: [/*#__PURE__*/jsxs("div", {
8005
+ className: "flex bg-white/5 rounded-md p-0.5 flex-shrink-0",
8006
+ children: [/*#__PURE__*/jsx("button", {
8007
+ type: "button",
8008
+ onClick: function onClick() {
8009
+ return setSelectedSource("Installed");
8010
+ },
8011
+ className: "px-3 py-1.5 rounded text-sm transition-colors ".concat(selectedSource === "Installed" ? "bg-white/10 font-medium opacity-90" : "opacity-50 hover:opacity-70"),
8012
+ children: "Installed"
8013
+ }), /*#__PURE__*/jsx("button", {
8014
+ type: "button",
8015
+ onClick: function onClick() {
8016
+ return setSelectedSource("Discover");
8017
+ },
8018
+ className: "px-3 py-1.5 rounded text-sm transition-colors ".concat(selectedSource === "Discover" ? "bg-white/10 font-medium opacity-90" : "opacity-50 hover:opacity-70"),
8019
+ children: "Discover"
8020
+ })]
8021
+ }), /*#__PURE__*/jsx(SearchInput, {
8022
+ value: searchQuery,
8023
+ onChange: setSearchQuery,
8024
+ placeholder: selectedSource === "Discover" ? "Search packages and widgets..." : "Search widgets...",
8025
+ className: "flex-1",
8026
+ inputClassName: "py-1.5 text-sm"
7955
8027
  })]
7956
- }), /*#__PURE__*/jsxs("select", {
7957
- value: selectedSource,
7958
- onChange: function onChange(e) {
7959
- return setSelectedSource(e.target.value);
7960
- },
7961
- className: "px-3 py-2 rounded text-sm ".concat(currentTheme["bg-primary-medium"], " ").concat(currentTheme["text-primary-light"], " ").concat(currentTheme["border-primary-medium"], " border focus:outline-none focus:ring-2 focus:ring-blue-500"),
7962
- children: [/*#__PURE__*/jsx("option", {
7963
- value: "Installed",
7964
- children: "Installed"
7965
- }), /*#__PURE__*/jsx("option", {
7966
- value: "Discover",
7967
- children: "Discover"
8028
+ }), /*#__PURE__*/jsxs("div", {
8029
+ className: "flex flex-row items-center gap-2",
8030
+ children: [/*#__PURE__*/jsxs("select", {
8031
+ value: selectedAuthor,
8032
+ onChange: function onChange(e) {
8033
+ return setSelectedAuthor(e.target.value);
8034
+ },
8035
+ className: "px-2 py-1 rounded text-xs bg-transparent border ".concat(currentTheme["border-primary-medium"] || "border-gray-700", " ").concat(currentTheme["text-primary-light"] || "text-gray-300", " focus:outline-none appearance-none cursor-pointer"),
8036
+ children: [/*#__PURE__*/jsx("option", {
8037
+ value: "all",
8038
+ children: "All Authors"
8039
+ }), getUniqueAuthors().map(function (author) {
8040
+ return /*#__PURE__*/jsx("option", {
8041
+ value: author,
8042
+ children: author
8043
+ }, author);
8044
+ })]
8045
+ }), selectedSource === "Installed" && /*#__PURE__*/jsxs("select", {
8046
+ value: selectedProvider,
8047
+ onChange: function onChange(e) {
8048
+ return setSelectedProvider(e.target.value);
8049
+ },
8050
+ className: "px-2 py-1 rounded text-xs bg-transparent border ".concat(currentTheme["border-primary-medium"] || "border-gray-700", " ").concat(currentTheme["text-primary-light"] || "text-gray-300", " focus:outline-none appearance-none cursor-pointer"),
8051
+ children: [/*#__PURE__*/jsx("option", {
8052
+ value: "all",
8053
+ children: "All Providers"
8054
+ }), getUniqueProviders().map(function (provider) {
8055
+ return /*#__PURE__*/jsx("option", {
8056
+ value: provider,
8057
+ children: provider === "none" ? "No Providers" : provider
8058
+ }, provider);
8059
+ })]
8060
+ }), selectedSource === "Discover" && /*#__PURE__*/jsxs("select", {
8061
+ value: registryViewMode,
8062
+ onChange: function onChange(e) {
8063
+ return setRegistryViewMode(e.target.value);
8064
+ },
8065
+ className: "px-2 py-1 rounded text-xs bg-transparent border ".concat(currentTheme["border-primary-medium"] || "border-gray-700", " ").concat(currentTheme["text-primary-light"] || "text-gray-300", " focus:outline-none appearance-none cursor-pointer"),
8066
+ children: [/*#__PURE__*/jsx("option", {
8067
+ value: "packages",
8068
+ children: "Packages"
8069
+ }), /*#__PURE__*/jsx("option", {
8070
+ value: "widgets",
8071
+ children: "Widgets"
8072
+ })]
7968
8073
  })]
7969
8074
  })]
7970
8075
  }), /*#__PURE__*/jsxs("div", {
@@ -7995,7 +8100,7 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
7995
8100
  className: "px-2 py-1 mb-2 border-b ".concat(currentTheme["border-primary-medium"]),
7996
8101
  children: /*#__PURE__*/jsx(Paragraph, {
7997
8102
  className: "text-xs font-semibold text-gray-400",
7998
- children: "RECENT WIDGETS"
8103
+ children: "RECENT"
7999
8104
  })
8000
8105
  }), recentWidgets.map(function (widget) {
8001
8106
  return /*#__PURE__*/jsx(MenuItem3, {
@@ -8004,28 +8109,75 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
8004
8109
  },
8005
8110
  selected: (selectedWidget === null || selectedWidget === void 0 ? void 0 : selectedWidget.key) === widget.key,
8006
8111
  children: /*#__PURE__*/jsxs("div", {
8007
- className: "flex items-center space-x-2 w-full",
8008
- children: [/*#__PURE__*/jsx("span", {
8009
- className: "text-xs",
8010
- children: "\uD83D\uDD52"
8011
- }), /*#__PURE__*/jsx("div", {
8012
- className: "text-base font-medium flex-1",
8013
- children: widget.name
8112
+ className: "flex items-center gap-2 w-full",
8113
+ children: [/*#__PURE__*/jsx(WidgetIcon, {
8114
+ icon: widget.icon,
8115
+ className: "h-4 w-4 opacity-60 flex-shrink-0",
8116
+ fallback: "puzzle-piece"
8117
+ }), /*#__PURE__*/jsxs("div", {
8118
+ className: "flex-1 min-w-0",
8119
+ children: [/*#__PURE__*/jsx("div", {
8120
+ className: "text-sm font-medium truncate",
8121
+ children: widget.name
8122
+ }), widget.description && /*#__PURE__*/jsx("div", {
8123
+ className: "text-xs opacity-50 truncate",
8124
+ children: widget.description
8125
+ })]
8014
8126
  })]
8015
8127
  })
8016
8128
  }, "recent-".concat(widget.key));
8017
8129
  })]
8018
- }), filteredWidgets.map(function (widget) {
8019
- return /*#__PURE__*/jsx(MenuItem3, {
8020
- onClick: function onClick() {
8021
- return handleWidgetSelect(widget);
8022
- },
8023
- selected: (selectedWidget === null || selectedWidget === void 0 ? void 0 : selectedWidget.key) === widget.key,
8024
- children: /*#__PURE__*/jsx("div", {
8025
- className: "text-base font-medium",
8026
- children: widget.name
8027
- })
8028
- }, widget.key);
8130
+ }), installedGroupNames.map(function (groupName) {
8131
+ return /*#__PURE__*/jsxs("div", {
8132
+ className: "mb-1",
8133
+ children: [/*#__PURE__*/jsxs("button", {
8134
+ type: "button",
8135
+ onClick: function onClick() {
8136
+ return toggleGroup(groupName);
8137
+ },
8138
+ className: "flex items-center gap-1.5 w-full px-2 py-1.5 text-xs font-semibold text-gray-400 hover:text-gray-300 transition-colors",
8139
+ children: [/*#__PURE__*/jsx("span", {
8140
+ className: "text-[10px] opacity-60",
8141
+ children: expandedGroups.has(groupName) ? "\u25BC" : "\u25B6"
8142
+ }), groupName, /*#__PURE__*/jsx("span", {
8143
+ className: "opacity-40 ml-auto",
8144
+ children: groupedInstalledWidgets[groupName].length
8145
+ })]
8146
+ }), expandedGroups.has(groupName) && groupedInstalledWidgets[groupName].map(function (widget) {
8147
+ var _widget$providers3;
8148
+ return /*#__PURE__*/jsx(MenuItem3, {
8149
+ onClick: function onClick() {
8150
+ return handleWidgetSelect(widget);
8151
+ },
8152
+ selected: (selectedWidget === null || selectedWidget === void 0 ? void 0 : selectedWidget.key) === widget.key,
8153
+ children: /*#__PURE__*/jsxs("div", {
8154
+ className: "flex items-center gap-2 w-full",
8155
+ children: [/*#__PURE__*/jsx(WidgetIcon, {
8156
+ icon: widget.icon,
8157
+ className: "h-4 w-4 opacity-60 flex-shrink-0",
8158
+ fallback: "puzzle-piece"
8159
+ }), /*#__PURE__*/jsxs("div", {
8160
+ className: "flex-1 min-w-0",
8161
+ children: [/*#__PURE__*/jsx("div", {
8162
+ className: "text-sm font-medium truncate",
8163
+ children: widget.name
8164
+ }), widget.description && /*#__PURE__*/jsx("div", {
8165
+ className: "text-xs opacity-50 truncate",
8166
+ children: widget.description
8167
+ }), ((_widget$providers3 = widget.providers) === null || _widget$providers3 === void 0 ? void 0 : _widget$providers3.length) > 0 && /*#__PURE__*/jsx("div", {
8168
+ className: "flex flex-wrap gap-1 mt-0.5",
8169
+ children: widget.providers.map(function (p) {
8170
+ return /*#__PURE__*/jsx("span", {
8171
+ className: "text-[10px] px-1.5 py-0.5 rounded bg-blue-500/20 text-blue-300",
8172
+ children: p.type
8173
+ }, p.type);
8174
+ })
8175
+ })]
8176
+ })]
8177
+ })
8178
+ }, widget.key);
8179
+ })]
8180
+ }, groupName);
8029
8181
  })]
8030
8182
  })
8031
8183
  }), /*#__PURE__*/jsx("div", {
@@ -8214,7 +8366,7 @@ var EnhancedWidgetDropdown = function EnhancedWidgetDropdown(_ref) {
8214
8366
  padding: "py-2 px-4",
8215
8367
  onClick: onClose
8216
8368
  }), /*#__PURE__*/jsx(Button, {
8217
- title: selectedWidget !== null && selectedWidget !== void 0 && selectedWidget.isRegistry ? isInstalling ? "Installing..." : "Install Package" : "Add to Dashboard",
8369
+ title: selectedWidget !== null && selectedWidget !== void 0 && selectedWidget.isRegistry ? isInstalling ? "Installing..." : installedPackageNames.has(selectedWidget.packageName) ? "Already Installed" : "Install Package" : "Add to Dashboard",
8218
8370
  bgColor: "bg-gray-800",
8219
8371
  hoverBackgroundColor: isAddButtonEnabled() && !isInstalling ? selectedWidget !== null && selectedWidget !== void 0 && selectedWidget.isRegistry ? "hover:bg-blue-700" : "hover:bg-green-700" : "",
8220
8372
  textSize: "text-lg",
@@ -21333,14 +21485,26 @@ var PropTypes = /*@__PURE__*/getDefaultExportFromCjs(propTypesExports);
21333
21485
  function ownKeys$b(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
21334
21486
  function _objectSpread$b(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$b(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$b(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
21335
21487
 
21336
- // Map of package names to the host app's module instances.
21337
- // When the CJS bundle calls require("react"), it receives the
21338
- // exact same React singleton the host app uses.
21339
- var MODULE_MAP = {
21488
+ // Host-injected module references (e.g., "@trops/dash-core").
21489
+ // Set by the host app via setHostModules() after all modules are fully loaded,
21490
+ // avoiding the self-referential import that breaks under webpack scope hoisting.
21491
+ var _hostModules = {};
21492
+
21493
+ /**
21494
+ * Allow the host app to inject module references for the require shim.
21495
+ * Called from Dash.js after importing dash-core, so the full namespace is available.
21496
+ *
21497
+ * @param {object} modules - Map of package names to module namespaces
21498
+ */
21499
+ function setHostModules(modules) {
21500
+ _hostModules = modules;
21501
+ }
21502
+
21503
+ // Base modules that can be statically imported without circular issues.
21504
+ var BASE_MODULE_MAP = {
21340
21505
  react: React,
21341
21506
  "react-dom": ReactDOM,
21342
21507
  "@trops/dash-react": DashReact,
21343
- "@trops/dash-core": dashCore,
21344
21508
  "react/jsx-runtime": jsxRuntime,
21345
21509
  "prop-types": PropTypes
21346
21510
  };
@@ -21353,13 +21517,16 @@ var MODULE_MAP = {
21353
21517
  * @returns {object} The module.exports from the evaluated bundle
21354
21518
  */
21355
21519
  function evaluateBundle(source, widgetName) {
21520
+ // Merge base modules with host-provided modules (e.g., "@trops/dash-core")
21521
+ // at call time so _hostModules is populated by the time widgets load.
21522
+ var moduleMap = _objectSpread$b(_objectSpread$b({}, BASE_MODULE_MAP), _hostModules);
21356
21523
  var module = {
21357
21524
  exports: {}
21358
21525
  };
21359
21526
  var exports = module.exports;
21360
21527
  var require = function require(name) {
21361
- if (MODULE_MAP[name]) {
21362
- var mod = MODULE_MAP[name];
21528
+ if (moduleMap[name]) {
21529
+ var mod = moduleMap[name];
21363
21530
  // CJS interop: `import * as X` creates an ES module namespace where
21364
21531
  // named exports may live under `.default` (e.g. @trops/dash-react).
21365
21532
  // CJS bundles expect `require("pkg").Widget` to work, so merge
@@ -32407,5 +32574,5 @@ var WorkspaceMenu = function WorkspaceMenu(_ref) {
32407
32574
 
32408
32575
  ComponentManager.registerContainerTypes(LayoutContainer, LayoutGridContainer);
32409
32576
 
32410
- export { ALGOLIA_ANALYTICS_FOR_QUERY, ALGOLIA_ANALYTICS_FOR_QUERY_COMPLETE, ALGOLIA_ANALYTICS_FOR_QUERY_ERROR, ALGOLIA_LIST_INDICES, ALGOLIA_LIST_INDICES_COMPLETE, ALGOLIA_LIST_INDICES_ERROR, AVAILABLE_COLORS, AddMenuItemModal, AdvancedMcpConfig, AppContext, AppSettingsModal, AppThemeScope, AppWrapper, CHOOSE_FILE, CHOOSE_FILE_COMPLETE, CHOOSE_FILE_ERROR, ColorModel, ComponentConfigModel, ComponentManager, ContextModel, DATA_JSON_TO_CSV_FILE, DATA_JSON_TO_CSV_FILE_COMPLETE, DATA_JSON_TO_CSV_FILE_ERROR, DATA_JSON_TO_CSV_STRING, DATA_JSON_TO_CSV_STRING_COMPLETE, DATA_JSON_TO_CSV_STRING_ERROR, DATA_READ_FROM_FILE, DATA_READ_FROM_FILE_COMPLETE, DATA_READ_FROM_FILE_ERROR, DATA_SAVE_TO_FILE, DATA_SAVE_TO_FILE_COMPLETE, DATA_SAVE_TO_FILE_ERROR, DashCommandPalette, DashNavbar, DashSidebar, DashTabBar, DashboardStage as Dashboard, DashboardApi, DashboardContext, DashboardFooter, DashboardHeader, DashboardMenuItem, DashboardModel, DashboardMonitor, DashboardPublisher, DashboardStage, DashboardThemeProvider, DashboardWrapper, ElectronDashboardApi, ErrorBoundary, ExternalWidget, GRID_CELL_WIDGET_TYPE, HARMONY_STRATEGIES, LAYOUT_LIST, LAYOUT_LIST_COMPLETE, LAYOUT_LIST_ERROR, LAYOUT_SAVE, LAYOUT_SAVE_COMPLETE, LAYOUT_SAVE_ERROR, Layout, LayoutBuilder, LayoutBuilderAddItemModal, LayoutBuilderConfigContainerMenuItem, LayoutBuilderConfigMenuItem, LayoutBuilderConfigModal, LayoutBuilderEditItemModal, LayoutBuilderEventModal, LayoutBuilderGridItem, LayoutContainer, LayoutDragBuilder, LayoutDragBuilderEdit, LayoutGridContainer, LayoutManagerModal, LayoutModel, LayoutQuickAddMenu, MCP_CALL_TOOL_COMPLETE, MCP_CALL_TOOL_ERROR, MCP_GET_CATALOG_COMPLETE, MCP_GET_CATALOG_ERROR, MCP_LIST_RESOURCES_COMPLETE, MCP_LIST_RESOURCES_ERROR, MCP_LIST_TOOLS_COMPLETE, MCP_LIST_TOOLS_ERROR, MCP_READ_RESOURCE_COMPLETE, MCP_READ_RESOURCE_ERROR, MCP_SERVER_STATUS_COMPLETE, MCP_SERVER_STATUS_ERROR, MCP_START_SERVER_COMPLETE, MCP_START_SERVER_ERROR, MCP_STOP_SERVER_COMPLETE, MCP_STOP_SERVER_ERROR, MENU_ITEMS_DELETE, MENU_ITEMS_DELETE_COMPLETE, MENU_ITEMS_DELETE_ERROR, MENU_ITEMS_LIST, MENU_ITEMS_LIST_COMPLETE, MENU_ITEMS_LIST_ERROR, MENU_ITEMS_SAVE, MENU_ITEMS_SAVE_COMPLETE, MENU_ITEMS_SAVE_ERROR, MainMenu, MainMenuItem, MainMenuSection, McpServerPicker, MenuItemModel, MenuSlideOverlay, MergeCellsModal, MissingProviderPrompt, MockDashboardApi, PROVIDER_DELETE_COMPLETE, PROVIDER_DELETE_ERROR, PROVIDER_GET_COMPLETE, PROVIDER_GET_ERROR, PROVIDER_LIST_COMPLETE, PROVIDER_LIST_ERROR, PROVIDER_SAVE_COMPLETE, PROVIDER_SAVE_ERROR, PanelCode, PanelEditItem, PanelEditItemHandlers, ProviderContext, ProviderErrorBoundary, ProviderForm, ProviderSelector, SECURE_STORAGE_ENCRYPT_STRING, SECURE_STORAGE_ENCRYPT_STRING_COMPLETE, SECURE_STORAGE_ENCRYPT_STRING_ERROR, SECURE_STORE_ENCRYPTION_CHECK, SECURE_STORE_ENCRYPTION_CHECK_COMPLETE, SECURE_STORE_ENCRYPTION_CHECK_ERROR, SECURE_STORE_GET_DATA, SECURE_STORE_GET_DATA_COMPLETE, SECURE_STORE_GET_DATA_ERROR, SECURE_STORE_SET_DATA, SECURE_STORE_SET_DATA_COMPLETE, SECURE_STORE_SET_DATA_ERROR, SETTINGS_GET, SETTINGS_GET_COMPLETE, SETTINGS_GET_ERROR, SETTINGS_SAVE, SETTINGS_SAVE_COMPLETE, SETTINGS_SAVE_ERROR, SIDEBAR_WIDGET_TYPE, SettingsModel, SideMenu, SplitCellModal, THEME_DELETE, THEME_DELETE_COMPLETE, THEME_DELETE_ERROR, THEME_LIST, THEME_LIST_COMPLETE, THEME_LIST_ERROR, THEME_SAVE, THEME_SAVE_COMPLETE, THEME_SAVE_ERROR, ThemeApi, ThemeManagerModal, ThemeModel, ThemeWrapper, WORKSPACE_DELETE, WORKSPACE_DELETE_COMPLETE, WORKSPACE_DELETE_ERROR, WORKSPACE_LIST, WORKSPACE_LIST_COMPLETE, WORKSPACE_LIST_ERROR, WORKSPACE_SAVE, WORKSPACE_SAVE_COMPLETE, WORKSPACE_SAVE_ERROR, WebDashboardApi, Widget, WidgetApi, WidgetConfigPanel, WidgetContext, WidgetFactory, WidgetProviderWrapper, WidgetSidebar, Workspace, WorkspaceContext, WorkspaceFooter, WorkspaceMenu, WorkspaceModel, addChildToLayoutItem, addItemToItemLayout, buildMcpConfigFromOverrides, canHaveChildren, changeDirectionForLayoutItem, createProviderRegistry, deriveFormFields, envMappingToRows, evaluateBundle, extractWidgetConfigs, formatFieldName, generateCustomTheme, generateHarmonyTheme, generateRandomTheme, generateThemeName, getBorderStyle, getChildrenForLayoutItem, getComponentInLayout, getContainerBorderColor, getContainerColor, getIndexOfLayoutChildrenForItem, getIndexOfLayoutItem, getLayoutItemById, getLayoutItemForWorkspace, getNearestParentWorkspace, getNextHighestId, getNextHighestItemInLayout, getNextHighestOrder, getNextHighestParentId, getNextLowestItemInLayout, getParentForLayoutItem, getParentWorkspaceForItem, getThemePresets, getWidgetsForWorkspace, getWorkspacesForWorkspace, headerTemplateToRows, isContainer, isLikelySecret, isMaxOrderForItem, isMinOrderForItem, isWidget, isWidgetResolvable, isWorkspace, layoutItemHasWorkspaceAsChild, loadWidgetBundle, numChildrenForLayout, removeItemFromLayout, renderComponent, renderGridLayout, renderGridLayoutFlow, _renderLayout as renderLayout, renderLayoutMenu, replaceItemInLayout, resolveIcon, traverseParentTree, updateLayoutItem, updateParentForItem, useDashboard, useMcpProvider, useProvider, useProviderClient, useWidgetEvents, useWidgetProviders, validateCellMerge, validateGridCell, validateGridPlacement, validateWidgetPlacement, withProviderDetection };
32577
+ export { ALGOLIA_ANALYTICS_FOR_QUERY, ALGOLIA_ANALYTICS_FOR_QUERY_COMPLETE, ALGOLIA_ANALYTICS_FOR_QUERY_ERROR, ALGOLIA_LIST_INDICES, ALGOLIA_LIST_INDICES_COMPLETE, ALGOLIA_LIST_INDICES_ERROR, AVAILABLE_COLORS, AddMenuItemModal, AdvancedMcpConfig, AppContext, AppSettingsModal, AppThemeScope, AppWrapper, CHOOSE_FILE, CHOOSE_FILE_COMPLETE, CHOOSE_FILE_ERROR, ColorModel, ComponentConfigModel, ComponentManager, ContextModel, DATA_JSON_TO_CSV_FILE, DATA_JSON_TO_CSV_FILE_COMPLETE, DATA_JSON_TO_CSV_FILE_ERROR, DATA_JSON_TO_CSV_STRING, DATA_JSON_TO_CSV_STRING_COMPLETE, DATA_JSON_TO_CSV_STRING_ERROR, DATA_READ_FROM_FILE, DATA_READ_FROM_FILE_COMPLETE, DATA_READ_FROM_FILE_ERROR, DATA_SAVE_TO_FILE, DATA_SAVE_TO_FILE_COMPLETE, DATA_SAVE_TO_FILE_ERROR, DashCommandPalette, DashNavbar, DashSidebar, DashTabBar, DashboardStage as Dashboard, DashboardApi, DashboardContext, DashboardFooter, DashboardHeader, DashboardMenuItem, DashboardModel, DashboardMonitor, DashboardPublisher, DashboardStage, DashboardThemeProvider, DashboardWrapper, ElectronDashboardApi, ErrorBoundary, ExternalWidget, GRID_CELL_WIDGET_TYPE, HARMONY_STRATEGIES, LAYOUT_LIST, LAYOUT_LIST_COMPLETE, LAYOUT_LIST_ERROR, LAYOUT_SAVE, LAYOUT_SAVE_COMPLETE, LAYOUT_SAVE_ERROR, Layout, LayoutBuilder, LayoutBuilderAddItemModal, LayoutBuilderConfigContainerMenuItem, LayoutBuilderConfigMenuItem, LayoutBuilderConfigModal, LayoutBuilderEditItemModal, LayoutBuilderEventModal, LayoutBuilderGridItem, LayoutContainer, LayoutDragBuilder, LayoutDragBuilderEdit, LayoutGridContainer, LayoutManagerModal, LayoutModel, LayoutQuickAddMenu, MCP_CALL_TOOL_COMPLETE, MCP_CALL_TOOL_ERROR, MCP_GET_CATALOG_COMPLETE, MCP_GET_CATALOG_ERROR, MCP_LIST_RESOURCES_COMPLETE, MCP_LIST_RESOURCES_ERROR, MCP_LIST_TOOLS_COMPLETE, MCP_LIST_TOOLS_ERROR, MCP_READ_RESOURCE_COMPLETE, MCP_READ_RESOURCE_ERROR, MCP_SERVER_STATUS_COMPLETE, MCP_SERVER_STATUS_ERROR, MCP_START_SERVER_COMPLETE, MCP_START_SERVER_ERROR, MCP_STOP_SERVER_COMPLETE, MCP_STOP_SERVER_ERROR, MENU_ITEMS_DELETE, MENU_ITEMS_DELETE_COMPLETE, MENU_ITEMS_DELETE_ERROR, MENU_ITEMS_LIST, MENU_ITEMS_LIST_COMPLETE, MENU_ITEMS_LIST_ERROR, MENU_ITEMS_SAVE, MENU_ITEMS_SAVE_COMPLETE, MENU_ITEMS_SAVE_ERROR, MainMenu, MainMenuItem, MainMenuSection, McpServerPicker, MenuItemModel, MenuSlideOverlay, MergeCellsModal, MissingProviderPrompt, MockDashboardApi, PROVIDER_DELETE_COMPLETE, PROVIDER_DELETE_ERROR, PROVIDER_GET_COMPLETE, PROVIDER_GET_ERROR, PROVIDER_LIST_COMPLETE, PROVIDER_LIST_ERROR, PROVIDER_SAVE_COMPLETE, PROVIDER_SAVE_ERROR, PanelCode, PanelEditItem, PanelEditItemHandlers, ProviderContext, ProviderErrorBoundary, ProviderForm, ProviderSelector, SECURE_STORAGE_ENCRYPT_STRING, SECURE_STORAGE_ENCRYPT_STRING_COMPLETE, SECURE_STORAGE_ENCRYPT_STRING_ERROR, SECURE_STORE_ENCRYPTION_CHECK, SECURE_STORE_ENCRYPTION_CHECK_COMPLETE, SECURE_STORE_ENCRYPTION_CHECK_ERROR, SECURE_STORE_GET_DATA, SECURE_STORE_GET_DATA_COMPLETE, SECURE_STORE_GET_DATA_ERROR, SECURE_STORE_SET_DATA, SECURE_STORE_SET_DATA_COMPLETE, SECURE_STORE_SET_DATA_ERROR, SETTINGS_GET, SETTINGS_GET_COMPLETE, SETTINGS_GET_ERROR, SETTINGS_SAVE, SETTINGS_SAVE_COMPLETE, SETTINGS_SAVE_ERROR, SIDEBAR_WIDGET_TYPE, SettingsModel, SideMenu, SplitCellModal, THEME_DELETE, THEME_DELETE_COMPLETE, THEME_DELETE_ERROR, THEME_LIST, THEME_LIST_COMPLETE, THEME_LIST_ERROR, THEME_SAVE, THEME_SAVE_COMPLETE, THEME_SAVE_ERROR, ThemeApi, ThemeManagerModal, ThemeModel, ThemeWrapper, WORKSPACE_DELETE, WORKSPACE_DELETE_COMPLETE, WORKSPACE_DELETE_ERROR, WORKSPACE_LIST, WORKSPACE_LIST_COMPLETE, WORKSPACE_LIST_ERROR, WORKSPACE_SAVE, WORKSPACE_SAVE_COMPLETE, WORKSPACE_SAVE_ERROR, WebDashboardApi, Widget, WidgetApi, WidgetConfigPanel, WidgetContext, WidgetFactory, WidgetProviderWrapper, WidgetSidebar, Workspace, WorkspaceContext, WorkspaceFooter, WorkspaceMenu, WorkspaceModel, addChildToLayoutItem, addItemToItemLayout, buildMcpConfigFromOverrides, canHaveChildren, changeDirectionForLayoutItem, createProviderRegistry, deriveFormFields, envMappingToRows, evaluateBundle, extractWidgetConfigs, formatFieldName, generateCustomTheme, generateHarmonyTheme, generateRandomTheme, generateThemeName, getBorderStyle, getChildrenForLayoutItem, getComponentInLayout, getContainerBorderColor, getContainerColor, getIndexOfLayoutChildrenForItem, getIndexOfLayoutItem, getLayoutItemById, getLayoutItemForWorkspace, getNearestParentWorkspace, getNextHighestId, getNextHighestItemInLayout, getNextHighestOrder, getNextHighestParentId, getNextLowestItemInLayout, getParentForLayoutItem, getParentWorkspaceForItem, getThemePresets, getWidgetsForWorkspace, getWorkspacesForWorkspace, headerTemplateToRows, isContainer, isLikelySecret, isMaxOrderForItem, isMinOrderForItem, isWidget, isWidgetResolvable, isWorkspace, layoutItemHasWorkspaceAsChild, loadWidgetBundle, numChildrenForLayout, removeItemFromLayout, renderComponent, renderGridLayout, renderGridLayoutFlow, _renderLayout as renderLayout, renderLayoutMenu, replaceItemInLayout, resolveIcon, setHostModules, traverseParentTree, updateLayoutItem, updateParentForItem, useDashboard, useMcpProvider, useProvider, useProviderClient, useWidgetEvents, useWidgetProviders, validateCellMerge, validateGridCell, validateGridPlacement, validateWidgetPlacement, withProviderDetection };
32411
32578
  //# sourceMappingURL=index.esm.js.map