@trops/dash-core 0.1.245 → 0.1.249

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
@@ -1,6 +1,6 @@
1
1
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
2
  import * as DashReact from '@trops/dash-react';
3
- import { isObject, ThemeContext, deepCopy, MainSection, getUUID, getStylesForItem, themeObjects, Heading, SearchInput, ButtonIcon, SubHeading3, InputText, Button, FontAwesomeIcon, Tag, Sidebar, Paragraph, Modal, Panel, Stepper, Tag2, Tag3, Card2, Card3, Heading3, MenuItem3, FormLabel, SelectMenu, Switch, SelectInput, CodeEditorInline, SettingsModal, SubHeading2, tailwindHeightFractions, Menu3, Panel3, DropdownPanel, MenuItem2, ButtonIcon2, DragComponent, ConfirmationModal, DropComponent, getStyleName, capitalizeFirstLetter, colorTypes, getCSSStyleForClassname, Panel2, Heading2, SubHeading, Paragraph2, Paragraph3, Button2, Button3, MenuItem, ButtonIcon3, DashPanel, colorNames, shades, themeVariants, Tabs3, DataList, Checkbox, StatCard, Card, Tabs, Accordion, Alert, Toast, ProgressBar, Toggle, Breadcrumbs, Tabs2, Accordion2, Alert2, Toast2, ProgressBar2, Toggle2, Breadcrumbs2, Accordion3, Alert3, Toast3, ProgressBar3, Toggle3, Breadcrumbs3, ThemeFromUrlPane, TextArea, Icon2, AlgoliaSearchBox, CommandPalette, EmptyState, Navbar, withRouter, Menu as Menu$1 } from '@trops/dash-react';
3
+ import { isObject, ThemeContext, deepCopy, MainSection, getUUID, getStylesForItem, themeObjects, Heading, SearchInput, ButtonIcon, SubHeading3, InputText, Button, FontAwesomeIcon, Tag, Modal, Sidebar, Paragraph, Panel, Stepper, Tag2, Tag3, Card2, Card3, Heading3, MenuItem3, FormLabel, SelectMenu, Switch, SelectInput, CodeEditorInline, SettingsModal, SubHeading2, tailwindHeightFractions, Menu3, Panel3, DropdownPanel, MenuItem2, ButtonIcon2, DragComponent, ConfirmationModal, DropComponent, getStyleName, capitalizeFirstLetter, colorTypes, getCSSStyleForClassname, Panel2, Heading2, SubHeading, Paragraph2, Paragraph3, Button2, Button3, MenuItem, ButtonIcon3, DashPanel, colorNames, shades, themeVariants, Tabs3, DataList, Checkbox, StatCard, Card, Tabs, Accordion, Alert, Toast, ProgressBar, Toggle, Breadcrumbs, Tabs2, Accordion2, Alert2, Toast2, ProgressBar2, Toggle2, Breadcrumbs2, Accordion3, Alert3, Toast3, ProgressBar3, Toggle3, Breadcrumbs3, ThemeFromUrlPane, TextArea, Icon2, AlgoliaSearchBox, CommandPalette, EmptyState, Navbar, withRouter, Menu as Menu$1 } from '@trops/dash-react';
4
4
  export * from '@trops/dash-react';
5
5
  export { ThemeContext } from '@trops/dash-react';
6
6
  import _typeof from '@babel/runtime/helpers/typeof';
@@ -3556,6 +3556,102 @@ var StarRating = function StarRating(_ref) {
3556
3556
  });
3557
3557
  };
3558
3558
 
3559
+ var InstallProgressModal = function InstallProgressModal(_ref) {
3560
+ var isOpen = _ref.isOpen,
3561
+ setIsOpen = _ref.setIsOpen,
3562
+ _ref$widgets = _ref.widgets,
3563
+ widgets = _ref$widgets === void 0 ? [] : _ref$widgets,
3564
+ _ref$isComplete = _ref.isComplete,
3565
+ isComplete = _ref$isComplete === void 0 ? false : _ref$isComplete,
3566
+ onDone = _ref.onDone;
3567
+ var _useContext = useContext(ThemeContext),
3568
+ currentTheme = _useContext.currentTheme;
3569
+ var panelStyles = getStylesForItem(themeObjects.PANEL, currentTheme, {
3570
+ grow: false
3571
+ });
3572
+
3573
+ // Prevent dismissal while installation is in progress
3574
+ var guardedSetIsOpen = function guardedSetIsOpen(val) {
3575
+ if (isComplete) setIsOpen(val);
3576
+ };
3577
+ var doneCount = widgets.filter(function (w) {
3578
+ return w.status === "installed" || w.status === "already-installed" || w.status === "failed";
3579
+ }).length;
3580
+ function statusIcon(status) {
3581
+ switch (status) {
3582
+ case "downloading":
3583
+ return /*#__PURE__*/jsx("div", {
3584
+ className: "animate-spin rounded-full h-4 w-4 border-b-2 border-blue-400 flex-shrink-0"
3585
+ });
3586
+ case "installed":
3587
+ case "already-installed":
3588
+ return /*#__PURE__*/jsx(FontAwesomeIcon, {
3589
+ icon: "circle-check",
3590
+ className: "h-4 w-4 text-green-400 flex-shrink-0"
3591
+ });
3592
+ case "failed":
3593
+ return /*#__PURE__*/jsx(FontAwesomeIcon, {
3594
+ icon: "circle-xmark",
3595
+ className: "h-4 w-4 text-red-400 flex-shrink-0"
3596
+ });
3597
+ default:
3598
+ // pending
3599
+ return /*#__PURE__*/jsx(FontAwesomeIcon, {
3600
+ icon: "clock",
3601
+ className: "h-4 w-4 opacity-30 flex-shrink-0"
3602
+ });
3603
+ }
3604
+ }
3605
+ return /*#__PURE__*/jsx(Modal, {
3606
+ isOpen: isOpen,
3607
+ setIsOpen: guardedSetIsOpen,
3608
+ width: "w-[440px]",
3609
+ height: "auto",
3610
+ children: /*#__PURE__*/jsxs("div", {
3611
+ className: "flex flex-col rounded-lg overflow-hidden ".concat(panelStyles.backgroundColor || "bg-gray-900", " ").concat(panelStyles.textColor || "text-gray-200"),
3612
+ children: [/*#__PURE__*/jsx("div", {
3613
+ className: "px-5 pt-5 pb-3",
3614
+ children: /*#__PURE__*/jsx("h3", {
3615
+ className: "text-sm font-semibold",
3616
+ children: isComplete ? "Installation Complete" : "Installing widget ".concat(doneCount + 1, " of ").concat(widgets.length, "...")
3617
+ })
3618
+ }), /*#__PURE__*/jsx("div", {
3619
+ className: "px-5 pb-3 space-y-1.5 max-h-64 overflow-y-auto",
3620
+ children: widgets.map(function (w, idx) {
3621
+ return /*#__PURE__*/jsxs("div", {
3622
+ children: [/*#__PURE__*/jsxs("div", {
3623
+ className: "flex items-center gap-2.5 p-2 rounded ".concat(currentTheme["bg-primary-medium"] || "bg-white/5"),
3624
+ children: [statusIcon(w.status), /*#__PURE__*/jsx("span", {
3625
+ className: "text-sm flex-1 truncate",
3626
+ children: w.displayName
3627
+ }), /*#__PURE__*/jsx("span", {
3628
+ className: "text-[10px] opacity-40",
3629
+ children: w.status === "already-installed" ? "Already installed" : w.status === "downloading" ? "Downloading..." : w.status === "installed" ? "Installed" : w.status === "failed" ? "Failed" : "Pending"
3630
+ })]
3631
+ }), w.status === "failed" && w.error && /*#__PURE__*/jsx("p", {
3632
+ className: "text-[10px] text-red-400/80 mt-0.5 ml-7 truncate",
3633
+ children: w.error
3634
+ })]
3635
+ }, idx);
3636
+ })
3637
+ }), /*#__PURE__*/jsx("div", {
3638
+ className: "flex items-center justify-end px-5 py-3 border-t ".concat(currentTheme["border-primary-medium"] || "border-white/10"),
3639
+ children: /*#__PURE__*/jsx(Button, {
3640
+ title: "Done",
3641
+ bgColor: isComplete ? "bg-blue-600" : "bg-gray-700",
3642
+ hoverBackgroundColor: isComplete ? "hover:bg-blue-700" : "",
3643
+ textSize: "text-sm",
3644
+ padding: "py-1.5 px-4",
3645
+ onClick: function onClick() {
3646
+ if (isComplete && onDone) onDone();
3647
+ },
3648
+ disabled: !isComplete
3649
+ })
3650
+ })]
3651
+ })
3652
+ });
3653
+ };
3654
+
3559
3655
  function _createForOfIteratorHelper$g(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$g(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
3560
3656
  function _unsupportedIterableToArray$g(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$g(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$g(r, a) : void 0; } }
3561
3657
  function _arrayLikeToArray$g(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
@@ -3598,15 +3694,30 @@ var RegistryDashboardDetail = function RegistryDashboardDetail(_ref) {
3598
3694
  _useState12 = _slicedToArray(_useState11, 2),
3599
3695
  authError = _useState12[0],
3600
3696
  setAuthError = _useState12[1];
3697
+ var _useState13 = useState(false),
3698
+ _useState14 = _slicedToArray(_useState13, 2),
3699
+ showProgressModal = _useState14[0],
3700
+ setShowProgressModal = _useState14[1];
3701
+ var _useState15 = useState([]),
3702
+ _useState16 = _slicedToArray(_useState15, 2),
3703
+ progressWidgets = _useState16[0],
3704
+ setProgressWidgets = _useState16[1];
3705
+ var _useState17 = useState(false),
3706
+ _useState18 = _slicedToArray(_useState17, 2),
3707
+ progressComplete = _useState18[0],
3708
+ setProgressComplete = _useState18[1];
3709
+ var progressResultRef = useRef(null);
3601
3710
  var pollIntervalRef = useRef(null);
3711
+ var cleanupProgressRef = useRef(null);
3602
3712
  var pkg = dashboardPackage;
3603
3713
  if (!pkg) return null;
3604
3714
 
3605
- // Clean up polling on unmount
3715
+ // Clean up polling and progress listener on unmount
3606
3716
  // eslint-disable-next-line react-hooks/rules-of-hooks
3607
3717
  useEffect(function () {
3608
3718
  return function () {
3609
3719
  if (pollIntervalRef.current) clearInterval(pollIntervalRef.current);
3720
+ if (cleanupProgressRef.current) cleanupProgressRef.current();
3610
3721
  };
3611
3722
  }, []);
3612
3723
 
@@ -3635,10 +3746,10 @@ var RegistryDashboardDetail = function RegistryDashboardDetail(_ref) {
3635
3746
  }, [pkg.name]);
3636
3747
  function handleInstall() {
3637
3748
  return _handleInstall.apply(this, arguments);
3638
- }
3749
+ } // eslint-disable-next-line react-hooks/rules-of-hooks
3639
3750
  function _handleInstall() {
3640
3751
  _handleInstall = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
3641
- var _result$workspace, result, _t;
3752
+ var deps, _window$mainApi2, _window$mainApi2$onIn, result, _result$workspace2, _t;
3642
3753
  return _regeneratorRuntime.wrap(function (_context) {
3643
3754
  while (1) switch (_context.prev = _context.next) {
3644
3755
  case 0:
@@ -3652,6 +3763,35 @@ var RegistryDashboardDetail = function RegistryDashboardDetail(_ref) {
3652
3763
  setInstallResult(null);
3653
3764
  setAuthFlow(null);
3654
3765
  setAuthError(null);
3766
+
3767
+ // Initialize progress modal from widget deps
3768
+ deps = widgetDeps.length > 0 ? widgetDeps : [];
3769
+ if (deps.length > 0) {
3770
+ setProgressWidgets(deps.map(function (w) {
3771
+ return {
3772
+ packageName: w["package"] || w.name,
3773
+ displayName: w.displayName || w.name || w["package"],
3774
+ status: "pending"
3775
+ };
3776
+ }));
3777
+ setProgressComplete(false);
3778
+ setShowProgressModal(true);
3779
+
3780
+ // Register progress listener
3781
+ if (cleanupProgressRef.current) cleanupProgressRef.current();
3782
+ cleanupProgressRef.current = (_window$mainApi2 = window.mainApi) === null || _window$mainApi2 === void 0 || (_window$mainApi2 = _window$mainApi2.dashboardConfig) === null || _window$mainApi2 === void 0 || (_window$mainApi2$onIn = _window$mainApi2.onInstallProgress) === null || _window$mainApi2$onIn === void 0 ? void 0 : _window$mainApi2$onIn.call(_window$mainApi2, function (data) {
3783
+ setProgressWidgets(function (prev) {
3784
+ var next = _toConsumableArray(prev);
3785
+ if (data.index >= 0 && data.index < next.length) {
3786
+ next[data.index] = _objectSpread$D(_objectSpread$D({}, next[data.index]), {}, {
3787
+ status: data.status,
3788
+ error: data.error || null
3789
+ });
3790
+ }
3791
+ return next;
3792
+ });
3793
+ });
3794
+ }
3655
3795
  _context.prev = 2;
3656
3796
  _context.next = 3;
3657
3797
  return window.mainApi.dashboardConfig.installDashboardFromRegistry(appId, pkg.name);
@@ -3661,33 +3801,52 @@ var RegistryDashboardDetail = function RegistryDashboardDetail(_ref) {
3661
3801
  _context.next = 4;
3662
3802
  break;
3663
3803
  }
3664
- // Auth needed — show inline auth prompt (DASH-135)
3804
+ // Auth needed — close progress modal, show inline auth prompt
3805
+ setShowProgressModal(false);
3665
3806
  setIsInstalling(false);
3666
3807
  setInstallResult({
3667
3808
  status: "auth",
3668
3809
  message: result.error || "Sign in to install this dashboard."
3669
3810
  });
3811
+ if (cleanupProgressRef.current) {
3812
+ cleanupProgressRef.current();
3813
+ cleanupProgressRef.current = null;
3814
+ }
3670
3815
  return _context.abrupt("return");
3671
3816
  case 4:
3672
- setInstallResult({
3673
- status: result !== null && result !== void 0 && result.success ? "success" : "error",
3674
- message: result !== null && result !== void 0 && result.success ? "Dashboard \"".concat(((_result$workspace = result.workspace) === null || _result$workspace === void 0 ? void 0 : _result$workspace.name) || pkg.name, "\" installed successfully.") : (result === null || result === void 0 ? void 0 : result.error) || "Installation failed."
3675
- });
3676
- if (result !== null && result !== void 0 && result.success && onInstallComplete) {
3677
- onInstallComplete(result);
3817
+ // Store result for use when modal closes
3818
+ progressResultRef.current = result;
3819
+ setProgressComplete(true);
3820
+
3821
+ // If no progress modal was shown, apply result directly
3822
+ if (deps.length === 0) {
3823
+ setInstallResult({
3824
+ status: result !== null && result !== void 0 && result.success ? "success" : "error",
3825
+ message: result !== null && result !== void 0 && result.success ? "Dashboard \"".concat(((_result$workspace2 = result.workspace) === null || _result$workspace2 === void 0 ? void 0 : _result$workspace2.name) || pkg.name, "\" installed successfully.") : (result === null || result === void 0 ? void 0 : result.error) || "Installation failed."
3826
+ });
3827
+ if (result !== null && result !== void 0 && result.success && onInstallComplete) {
3828
+ onInstallComplete(result);
3829
+ }
3678
3830
  }
3679
3831
  _context.next = 6;
3680
3832
  break;
3681
3833
  case 5:
3682
3834
  _context.prev = 5;
3683
3835
  _t = _context["catch"](2);
3684
- setInstallResult({
3685
- status: "error",
3686
- message: _t.message || "Failed to install dashboard."
3687
- });
3836
+ setProgressComplete(true);
3837
+ if (deps.length === 0) {
3838
+ setInstallResult({
3839
+ status: "error",
3840
+ message: _t.message || "Failed to install dashboard."
3841
+ });
3842
+ }
3688
3843
  case 6:
3689
3844
  _context.prev = 6;
3690
3845
  setIsInstalling(false);
3846
+ if (cleanupProgressRef.current) {
3847
+ cleanupProgressRef.current();
3848
+ cleanupProgressRef.current = null;
3849
+ }
3691
3850
  return _context.finish(6);
3692
3851
  case 7:
3693
3852
  case "end":
@@ -3697,6 +3856,20 @@ var RegistryDashboardDetail = function RegistryDashboardDetail(_ref) {
3697
3856
  }));
3698
3857
  return _handleInstall.apply(this, arguments);
3699
3858
  }
3859
+ var handleProgressDone = useCallback(function () {
3860
+ setShowProgressModal(false);
3861
+ var result = progressResultRef.current;
3862
+ if (result) {
3863
+ var _result$workspace;
3864
+ setInstallResult({
3865
+ status: result.success ? "success" : "error",
3866
+ message: result.success ? "Dashboard \"".concat(((_result$workspace = result.workspace) === null || _result$workspace === void 0 ? void 0 : _result$workspace.name) || pkg.name, "\" installed successfully.") : result.error || "Installation failed."
3867
+ });
3868
+ if (result.success && onInstallComplete) {
3869
+ onInstallComplete(result);
3870
+ }
3871
+ }
3872
+ }, [pkg.name, onInstallComplete]);
3700
3873
  function handleSignIn() {
3701
3874
  return _handleSignIn.apply(this, arguments);
3702
3875
  }
@@ -4078,6 +4251,12 @@ var RegistryDashboardDetail = function RegistryDashboardDetail(_ref) {
4078
4251
  onClick: handleInstall,
4079
4252
  disabled: isInstalling
4080
4253
  })
4254
+ }), /*#__PURE__*/jsx(InstallProgressModal, {
4255
+ isOpen: showProgressModal,
4256
+ setIsOpen: setShowProgressModal,
4257
+ widgets: progressWidgets,
4258
+ isComplete: progressComplete,
4259
+ onDone: handleProgressDone
4081
4260
  })]
4082
4261
  });
4083
4262
  };
@@ -8136,7 +8315,7 @@ hasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBu
8136
8315
  var hasPropertyDescriptors_1 = hasPropertyDescriptors;
8137
8316
 
8138
8317
  var keys = objectKeys$2;
8139
- var hasSymbols$5 = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
8318
+ var hasSymbols$4 = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
8140
8319
 
8141
8320
  var toStr$4 = Object.prototype.toString;
8142
8321
  var concat = Array.prototype.concat;
@@ -8169,7 +8348,7 @@ var defineProperty$1 = function (object, name, value, predicate) {
8169
8348
  var defineProperties$1 = function (object, map) {
8170
8349
  var predicates = arguments.length > 2 ? arguments[2] : {};
8171
8350
  var props = keys(map);
8172
- if (hasSymbols$5) {
8351
+ if (hasSymbols$4) {
8173
8352
  props = concat.call(props, Object.getOwnPropertySymbols(map));
8174
8353
  }
8175
8354
  for (var i = 0; i < props.length; i += 1) {
@@ -8235,11 +8414,11 @@ var sign$1 = function sign(number) {
8235
8414
  };
8236
8415
 
8237
8416
  var shams$1;
8238
- var hasRequiredShams;
8417
+ var hasRequiredShams$1;
8239
8418
 
8240
- function requireShams () {
8241
- if (hasRequiredShams) return shams$1;
8242
- hasRequiredShams = 1;
8419
+ function requireShams$1 () {
8420
+ if (hasRequiredShams$1) return shams$1;
8421
+ hasRequiredShams$1 = 1;
8243
8422
 
8244
8423
  /** @type {import('./shams')} */
8245
8424
  /* eslint complexity: [2, 18], max-statements: [2, 33] */
@@ -8288,10 +8467,10 @@ function requireShams () {
8288
8467
  }
8289
8468
 
8290
8469
  var origSymbol = typeof Symbol !== 'undefined' && Symbol;
8291
- var hasSymbolSham = requireShams();
8470
+ var hasSymbolSham = requireShams$1();
8292
8471
 
8293
8472
  /** @type {import('.')} */
8294
- var hasSymbols$4 = function hasNativeSymbols() {
8473
+ var hasSymbols$3 = function hasNativeSymbols() {
8295
8474
  if (typeof origSymbol !== 'function') { return false; }
8296
8475
  if (typeof Symbol !== 'function') { return false; }
8297
8476
  if (typeof origSymbol('foo') !== 'symbol') { return false; }
@@ -8595,7 +8774,7 @@ var ThrowTypeError = $gOPD$1
8595
8774
  }())
8596
8775
  : throwTypeError;
8597
8776
 
8598
- var hasSymbols$3 = hasSymbols$4();
8777
+ var hasSymbols$2 = hasSymbols$3();
8599
8778
 
8600
8779
  var getProto$2 = getProto$3;
8601
8780
  var $ObjectGPO = requireObject_getPrototypeOf();
@@ -8613,7 +8792,7 @@ var INTRINSICS = {
8613
8792
  '%AggregateError%': typeof AggregateError === 'undefined' ? undefined$1 : AggregateError,
8614
8793
  '%Array%': Array,
8615
8794
  '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer,
8616
- '%ArrayIteratorPrototype%': hasSymbols$3 && getProto$2 ? getProto$2([][Symbol.iterator]()) : undefined$1,
8795
+ '%ArrayIteratorPrototype%': hasSymbols$2 && getProto$2 ? getProto$2([][Symbol.iterator]()) : undefined$1,
8617
8796
  '%AsyncFromSyncIteratorPrototype%': undefined$1,
8618
8797
  '%AsyncFunction%': needsEval,
8619
8798
  '%AsyncGenerator%': needsEval,
@@ -8644,10 +8823,10 @@ var INTRINSICS = {
8644
8823
  '%Int32Array%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array,
8645
8824
  '%isFinite%': isFinite,
8646
8825
  '%isNaN%': isNaN,
8647
- '%IteratorPrototype%': hasSymbols$3 && getProto$2 ? getProto$2(getProto$2([][Symbol.iterator]())) : undefined$1,
8826
+ '%IteratorPrototype%': hasSymbols$2 && getProto$2 ? getProto$2(getProto$2([][Symbol.iterator]())) : undefined$1,
8648
8827
  '%JSON%': typeof JSON === 'object' ? JSON : undefined$1,
8649
8828
  '%Map%': typeof Map === 'undefined' ? undefined$1 : Map,
8650
- '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols$3 || !getProto$2 ? undefined$1 : getProto$2(new Map()[Symbol.iterator]()),
8829
+ '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols$2 || !getProto$2 ? undefined$1 : getProto$2(new Map()[Symbol.iterator]()),
8651
8830
  '%Math%': Math,
8652
8831
  '%Number%': Number,
8653
8832
  '%Object%': $Object$2,
@@ -8661,11 +8840,11 @@ var INTRINSICS = {
8661
8840
  '%Reflect%': typeof Reflect === 'undefined' ? undefined$1 : Reflect,
8662
8841
  '%RegExp%': RegExp,
8663
8842
  '%Set%': typeof Set === 'undefined' ? undefined$1 : Set,
8664
- '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols$3 || !getProto$2 ? undefined$1 : getProto$2(new Set()[Symbol.iterator]()),
8843
+ '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols$2 || !getProto$2 ? undefined$1 : getProto$2(new Set()[Symbol.iterator]()),
8665
8844
  '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer,
8666
8845
  '%String%': String,
8667
- '%StringIteratorPrototype%': hasSymbols$3 && getProto$2 ? getProto$2(''[Symbol.iterator]()) : undefined$1,
8668
- '%Symbol%': hasSymbols$3 ? Symbol : undefined$1,
8846
+ '%StringIteratorPrototype%': hasSymbols$2 && getProto$2 ? getProto$2(''[Symbol.iterator]()) : undefined$1,
8847
+ '%Symbol%': hasSymbols$2 ? Symbol : undefined$1,
8669
8848
  '%SyntaxError%': $SyntaxError$1,
8670
8849
  '%ThrowTypeError%': ThrowTypeError,
8671
8850
  '%TypedArray%': TypedArray,
@@ -9018,12 +9197,12 @@ var callBound$i = function callBoundIntrinsic(name, allowMissing) {
9018
9197
 
9019
9198
  // modified from https://github.com/es-shims/es6-shim
9020
9199
  var objectKeys$1 = objectKeys$2;
9021
- var hasSymbols$2 = requireShams()();
9200
+ var hasSymbols$1 = requireShams$1()();
9022
9201
  var callBound$h = callBound$i;
9023
9202
  var $Object$1 = esObjectAtoms;
9024
9203
  var $push = callBound$h('Array.prototype.push');
9025
9204
  var $propIsEnumerable = callBound$h('Object.prototype.propertyIsEnumerable');
9026
- var originalGetSymbols = hasSymbols$2 ? $Object$1.getOwnPropertySymbols : null;
9205
+ var originalGetSymbols = hasSymbols$1 ? $Object$1.getOwnPropertySymbols : null;
9027
9206
 
9028
9207
  // eslint-disable-next-line no-unused-vars
9029
9208
  var implementation$8 = function assign(target, source1) {
@@ -9037,7 +9216,7 @@ var implementation$8 = function assign(target, source1) {
9037
9216
 
9038
9217
  // step 3.a.ii:
9039
9218
  var keys = objectKeys$1(from);
9040
- var getSymbols = hasSymbols$2 && ($Object$1.getOwnPropertySymbols || originalGetSymbols);
9219
+ var getSymbols = hasSymbols$1 && ($Object$1.getOwnPropertySymbols || originalGetSymbols);
9041
9220
  if (getSymbols) {
9042
9221
  var syms = getSymbols(from);
9043
9222
  for (var j = 0; j < syms.length; ++j) {
@@ -9334,14 +9513,23 @@ var regexp_prototype_flags = flagsBound;
9334
9513
 
9335
9514
  var esGetIterator = {exports: {}};
9336
9515
 
9337
- var hasSymbols$1 = requireShams();
9516
+ var shams;
9517
+ var hasRequiredShams;
9338
9518
 
9339
- /** @type {import('.')} */
9340
- var shams = function hasToStringTagShams() {
9341
- return hasSymbols$1() && !!Symbol.toStringTag;
9342
- };
9519
+ function requireShams () {
9520
+ if (hasRequiredShams) return shams;
9521
+ hasRequiredShams = 1;
9522
+
9523
+ var hasSymbols = requireShams$1();
9524
+
9525
+ /** @type {import('.')} */
9526
+ shams = function hasToStringTagShams() {
9527
+ return hasSymbols() && !!Symbol.toStringTag;
9528
+ };
9529
+ return shams;
9530
+ }
9343
9531
 
9344
- var hasToStringTag$7 = shams();
9532
+ var hasToStringTag$7 = requireShams()();
9345
9533
  var callBound$f = callBound$i;
9346
9534
 
9347
9535
  var $toString$7 = callBound$f('Object.prototype.toString');
@@ -10378,7 +10566,7 @@ var tryStringObject = function tryStringObject(value) {
10378
10566
  /** @type {(receiver: ThisParameterType<typeof Object.prototype.toString>, ...args: Parameters<typeof Object.prototype.toString>) => ReturnType<typeof Object.prototype.toString>} */
10379
10567
  var $toString$6 = callBound$c('Object.prototype.toString');
10380
10568
  var strClass = '[object String]';
10381
- var hasToStringTag$6 = shams();
10569
+ var hasToStringTag$6 = requireShams()();
10382
10570
 
10383
10571
  /** @type {import('.')} */
10384
10572
  var isString$2 = function isString(value) {
@@ -10494,7 +10682,7 @@ var isSet$2 = exported$1 || function isSet(x) {
10494
10682
  var isArguments$1 = isArguments$2;
10495
10683
  var getStopIterationIterator = stopIterationIterator;
10496
10684
 
10497
- if (hasSymbols$4() || requireShams()()) {
10685
+ if (hasSymbols$3() || requireShams$1()()) {
10498
10686
  var $iterator = Symbol.iterator;
10499
10687
  // Symbol is available natively or shammed
10500
10688
  // natively:
@@ -10783,7 +10971,7 @@ var tryDateObject = function tryDateGetDayCall(value) {
10783
10971
  /** @type {(value: unknown) => string} */
10784
10972
  var toStr$2 = callBound$9('Object.prototype.toString');
10785
10973
  var dateClass = '[object Date]';
10786
- var hasToStringTag$5 = shams();
10974
+ var hasToStringTag$5 = requireShams()();
10787
10975
 
10788
10976
  /** @type {import('.')} */
10789
10977
  var isDateObject = function isDateObject(value) {
@@ -10794,7 +10982,7 @@ var isDateObject = function isDateObject(value) {
10794
10982
  };
10795
10983
 
10796
10984
  var callBound$8 = callBound$i;
10797
- var hasToStringTag$4 = shams();
10985
+ var hasToStringTag$4 = requireShams()();
10798
10986
  var hasOwn = hasown;
10799
10987
  var gOPD$1 = gopd$1;
10800
10988
 
@@ -10899,7 +11087,7 @@ var tryNumberObject = function tryNumberObject(value) {
10899
11087
  };
10900
11088
  var $toString$3 = callBound$6('Object.prototype.toString');
10901
11089
  var numClass = '[object Number]';
10902
- var hasToStringTag$3 = shams();
11090
+ var hasToStringTag$3 = requireShams()();
10903
11091
 
10904
11092
  /** @type {import('.')} */
10905
11093
  var isNumberObject = function isNumberObject(value) {
@@ -10926,7 +11114,7 @@ var tryBooleanObject = function booleanBrandCheck(value) {
10926
11114
  }
10927
11115
  };
10928
11116
  var boolClass = '[object Boolean]';
10929
- var hasToStringTag$2 = shams();
11117
+ var hasToStringTag$2 = requireShams()();
10930
11118
 
10931
11119
  /** @type {import('.')} */
10932
11120
  var isBooleanObject = function isBoolean(value) {
@@ -10968,7 +11156,7 @@ function requireSafeRegexTest () {
10968
11156
 
10969
11157
  var callBound$4 = callBound$i;
10970
11158
  var $toString$1 = callBound$4('Object.prototype.toString');
10971
- var hasSymbols = hasSymbols$4();
11159
+ var hasSymbols = hasSymbols$3();
10972
11160
  var safeRegexTest = requireSafeRegexTest();
10973
11161
 
10974
11162
  if (hasSymbols) {
@@ -11414,7 +11602,7 @@ var gOPD = gopd$1;
11414
11602
  var getProto = getProto$3;
11415
11603
 
11416
11604
  var $toString = callBound$2('Object.prototype.toString');
11417
- var hasToStringTag = shams();
11605
+ var hasToStringTag = requireShams()();
11418
11606
 
11419
11607
  var g = typeof globalThis === 'undefined' ? commonjsGlobal : globalThis;
11420
11608
  var typedArrays = availableTypedArrays();
@@ -22935,6 +23123,397 @@ var ExternalWidget = function ExternalWidget(_ref) {
22935
23123
  });
22936
23124
  };
22937
23125
 
23126
+ var RegistryPackageDetail = function RegistryPackageDetail(_ref) {
23127
+ var widget = _ref.widget,
23128
+ onInstall = _ref.onInstall,
23129
+ _ref$isInstalling = _ref.isInstalling,
23130
+ isInstalling = _ref$isInstalling === void 0 ? false : _ref$isInstalling,
23131
+ _ref$installError = _ref.installError,
23132
+ installError = _ref$installError === void 0 ? null : _ref$installError,
23133
+ _ref$isInstalled = _ref.isInstalled,
23134
+ isInstalled = _ref$isInstalled === void 0 ? false : _ref$isInstalled;
23135
+ var _useContext = useContext(ThemeContext),
23136
+ currentTheme = _useContext.currentTheme;
23137
+ var panelStyles = getStylesForItem(themeObjects.PANEL, currentTheme, {
23138
+ grow: false
23139
+ });
23140
+ if (!widget) return null;
23141
+ return /*#__PURE__*/jsxs("div", {
23142
+ className: "flex flex-col flex-1 min-h-0",
23143
+ children: [/*#__PURE__*/jsxs("div", {
23144
+ className: "flex-1 min-h-0 overflow-y-auto p-6 space-y-6 ".concat(panelStyles.textColor || "text-gray-200"),
23145
+ children: [/*#__PURE__*/jsxs("div", {
23146
+ className: "flex flex-row items-center gap-3",
23147
+ children: [/*#__PURE__*/jsx("div", {
23148
+ className: "h-5 w-5 flex-shrink-0 flex items-center justify-center",
23149
+ children: /*#__PURE__*/jsx(FontAwesomeIcon, {
23150
+ icon: widget.icon || "cube",
23151
+ className: "h-5 w-5"
23152
+ })
23153
+ }), /*#__PURE__*/jsxs("div", {
23154
+ children: [/*#__PURE__*/jsxs("div", {
23155
+ className: "flex items-center gap-2",
23156
+ children: [/*#__PURE__*/jsx(SubHeading3, {
23157
+ title: widget.packageDisplayName,
23158
+ padding: false
23159
+ }), isInstalled && /*#__PURE__*/jsx("span", {
23160
+ className: "text-[10px] px-1.5 py-0.5 rounded bg-emerald-500/20 text-emerald-400 flex-shrink-0",
23161
+ children: "Installed"
23162
+ })]
23163
+ }), /*#__PURE__*/jsxs("div", {
23164
+ className: "flex items-center gap-2 mt-0.5",
23165
+ children: [/*#__PURE__*/jsxs("span", {
23166
+ className: "text-sm opacity-60",
23167
+ children: ["by ", widget.packageAuthor || "Unknown"]
23168
+ }), /*#__PURE__*/jsxs("span", {
23169
+ className: "text-xs px-2 py-0.5 rounded ".concat(currentTheme["bg-primary-medium"], " opacity-70"),
23170
+ children: ["v", widget.packageVersion]
23171
+ })]
23172
+ })]
23173
+ })]
23174
+ }), /*#__PURE__*/jsx("hr", {
23175
+ className: currentTheme["border-primary-medium"]
23176
+ }), widget.packageDescription && /*#__PURE__*/jsx("p", {
23177
+ className: "text-sm",
23178
+ children: widget.packageDescription
23179
+ }), widget.packageTags && widget.packageTags.length > 0 && /*#__PURE__*/jsx("div", {
23180
+ className: "flex flex-wrap gap-1",
23181
+ children: widget.packageTags.map(function (tag) {
23182
+ return /*#__PURE__*/jsx("span", {
23183
+ className: "text-xs px-2 py-0.5 rounded ".concat(currentTheme["bg-primary-medium"], " opacity-60"),
23184
+ children: tag
23185
+ }, tag);
23186
+ })
23187
+ }), /*#__PURE__*/jsxs("div", {
23188
+ children: [/*#__PURE__*/jsx("span", {
23189
+ className: "text-xs font-semibold opacity-50 mb-1 block",
23190
+ children: "INCLUDED WIDGETS"
23191
+ }), /*#__PURE__*/jsx("div", {
23192
+ className: "space-y-1.5",
23193
+ children: (widget.packageWidgets || []).map(function (w, idx) {
23194
+ return /*#__PURE__*/jsxs("div", {
23195
+ className: "p-2 rounded ".concat(currentTheme["bg-primary-medium"]),
23196
+ children: [/*#__PURE__*/jsx("div", {
23197
+ className: "text-sm font-medium",
23198
+ children: w.displayName || w.name
23199
+ }), w.description && /*#__PURE__*/jsx("div", {
23200
+ className: "text-xs opacity-50 mt-0.5",
23201
+ children: w.description
23202
+ }), getUserConfigurableProviders(w.providers).length > 0 && /*#__PURE__*/jsxs("div", {
23203
+ className: "space-y-1 mt-1",
23204
+ children: [/*#__PURE__*/jsx("div", {
23205
+ className: "flex gap-1 flex-wrap",
23206
+ children: getUserConfigurableProviders(w.providers).map(function (p, pidx) {
23207
+ return /*#__PURE__*/jsxs("span", {
23208
+ className: "text-xs px-1.5 py-0.5 rounded bg-blue-900/30 text-blue-400",
23209
+ children: [p.type, p.required ? " *" : ""]
23210
+ }, pidx);
23211
+ })
23212
+ }), getUserConfigurableProviders(w.providers).some(function (p) {
23213
+ var _p$requiredTools;
23214
+ return ((_p$requiredTools = p.requiredTools) === null || _p$requiredTools === void 0 ? void 0 : _p$requiredTools.length) > 0;
23215
+ }) && /*#__PURE__*/jsx("div", {
23216
+ className: "flex flex-wrap gap-1 ml-1",
23217
+ children: getUserConfigurableProviders(w.providers).filter(function (p) {
23218
+ var _p$requiredTools2;
23219
+ return ((_p$requiredTools2 = p.requiredTools) === null || _p$requiredTools2 === void 0 ? void 0 : _p$requiredTools2.length) > 0;
23220
+ }).flatMap(function (p) {
23221
+ return p.requiredTools.map(function (tool) {
23222
+ return /*#__PURE__*/jsx("span", {
23223
+ className: "text-[10px] font-mono px-1.5 py-0.5 rounded bg-white/5 opacity-60",
23224
+ children: tool
23225
+ }, "".concat(p.type, "-").concat(tool));
23226
+ });
23227
+ })
23228
+ })]
23229
+ })]
23230
+ }, idx);
23231
+ })
23232
+ })]
23233
+ }), widget.appOrigin && /*#__PURE__*/jsxs("div", {
23234
+ className: "flex items-center gap-1.5 text-xs opacity-50",
23235
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
23236
+ icon: "laptop",
23237
+ className: "h-3 w-3"
23238
+ }), /*#__PURE__*/jsxs("span", {
23239
+ children: ["Built for ", widget.appOrigin]
23240
+ })]
23241
+ }), widget.missingApis && widget.missingApis.length > 0 && /*#__PURE__*/jsx("div", {
23242
+ className: "p-2 rounded bg-yellow-900/30 border border-yellow-700",
23243
+ children: /*#__PURE__*/jsxs("p", {
23244
+ className: "text-xs text-yellow-400",
23245
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
23246
+ icon: "triangle-exclamation",
23247
+ className: "mr-1"
23248
+ }), "Incompatible \u2014 requires ", widget.missingApis.join(", "), " API", widget.missingApis.length !== 1 ? "s" : ""]
23249
+ })
23250
+ }), widget.repository && /*#__PURE__*/jsxs("div", {
23251
+ children: [/*#__PURE__*/jsx("span", {
23252
+ className: "text-xs font-semibold opacity-50 mb-1 block",
23253
+ children: "REPOSITORY"
23254
+ }), /*#__PURE__*/jsx("button", {
23255
+ type: "button",
23256
+ onClick: function onClick() {
23257
+ var _window$mainApi;
23258
+ return (_window$mainApi = window.mainApi) === null || _window$mainApi === void 0 || (_window$mainApi = _window$mainApi.shell) === null || _window$mainApi === void 0 ? void 0 : _window$mainApi.openExternal(widget.repository);
23259
+ },
23260
+ className: "text-sm text-blue-400 hover:text-blue-300 hover:underline transition-colors break-all text-left",
23261
+ children: widget.repository
23262
+ })]
23263
+ }), installError && /*#__PURE__*/jsx("div", {
23264
+ className: "p-2 rounded bg-red-900/30 border border-red-700",
23265
+ children: /*#__PURE__*/jsx("p", {
23266
+ className: "text-xs text-red-400",
23267
+ children: installError
23268
+ })
23269
+ })]
23270
+ }), /*#__PURE__*/jsx("div", {
23271
+ className: "flex items-center justify-end px-6 py-3 border-t ".concat(currentTheme["border-primary-medium"]),
23272
+ children: /*#__PURE__*/jsx(Button, {
23273
+ title: isInstalled ? "Installed" : isInstalling ? "Installing..." : "Install Package",
23274
+ bgColor: isInstalled ? "bg-emerald-600/50" : "bg-blue-600",
23275
+ hoverBackgroundColor: isInstalled || isInstalling ? "" : "hover:bg-blue-700",
23276
+ textSize: "text-sm",
23277
+ padding: "py-1.5 px-4",
23278
+ onClick: onInstall,
23279
+ disabled: isInstalling || isInstalled
23280
+ })
23281
+ })]
23282
+ });
23283
+ };
23284
+
23285
+ function getWidgetSearchQuery(componentKey) {
23286
+ var parts = componentKey.split(".");
23287
+ if (parts.length >= 3) {
23288
+ return {
23289
+ packageName: parts[1],
23290
+ widgetName: parts[2],
23291
+ scope: parts[0]
23292
+ };
23293
+ }
23294
+ return {
23295
+ packageName: null,
23296
+ widgetName: componentKey,
23297
+ scope: null
23298
+ };
23299
+ }
23300
+
23301
+ /**
23302
+ * Convert a raw registry package object into the flat widget shape
23303
+ * expected by RegistryPackageDetail.
23304
+ */
23305
+ function packageToFlatWidget(pkg) {
23306
+ return {
23307
+ key: "".concat(pkg.name, "/0"),
23308
+ name: pkg.displayName || pkg.name,
23309
+ icon: pkg.icon || null,
23310
+ isRegistry: true,
23311
+ packageName: pkg.name,
23312
+ packageScope: pkg.scope || null,
23313
+ packageDisplayName: pkg.displayName || pkg.name,
23314
+ packageVersion: pkg.version,
23315
+ packageAuthor: pkg.author || "",
23316
+ packageDescription: pkg.description || "",
23317
+ packageTags: pkg.tags || [],
23318
+ packageCategory: pkg.category || "",
23319
+ downloadUrl: pkg.downloadUrl || "",
23320
+ repository: pkg.repository || "",
23321
+ publishedAt: pkg.publishedAt || "",
23322
+ packageWidgets: pkg.widgets || [],
23323
+ appOrigin: pkg.appOrigin || null,
23324
+ packageProviders: pkg.providers || [],
23325
+ missingApis: []
23326
+ };
23327
+ }
23328
+
23329
+ /**
23330
+ * WidgetNotFound — rendered in place of an unresolvable widget.
23331
+ *
23332
+ * Shows the existing "Widget Not Found" error display and adds a
23333
+ * "Find in Registry" button that does an exact registry lookup and
23334
+ * opens an install modal.
23335
+ */
23336
+ var WidgetNotFound = function WidgetNotFound(_ref) {
23337
+ var component = _ref.component;
23338
+ var _useState = useState(false),
23339
+ _useState2 = _slicedToArray(_useState, 2),
23340
+ showModal = _useState2[0],
23341
+ setShowModal = _useState2[1];
23342
+ var _useState3 = useState(null),
23343
+ _useState4 = _slicedToArray(_useState3, 2),
23344
+ registryWidget = _useState4[0],
23345
+ setRegistryWidget = _useState4[1];
23346
+ var _useState5 = useState(false),
23347
+ _useState6 = _slicedToArray(_useState5, 2),
23348
+ isLoading = _useState6[0],
23349
+ setIsLoading = _useState6[1];
23350
+ var _useState7 = useState(false),
23351
+ _useState8 = _slicedToArray(_useState7, 2),
23352
+ notFound = _useState8[0],
23353
+ setNotFound = _useState8[1];
23354
+ var _useState9 = useState(false),
23355
+ _useState0 = _slicedToArray(_useState9, 2),
23356
+ isInstalling = _useState0[0],
23357
+ setIsInstalling = _useState0[1];
23358
+ var _useState1 = useState(null),
23359
+ _useState10 = _slicedToArray(_useState1, 2),
23360
+ installError = _useState10[0],
23361
+ setInstallError = _useState10[1];
23362
+ var lookupWidget = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
23363
+ var _getWidgetSearchQuery, packageName, widgetName, pkg, result;
23364
+ return _regeneratorRuntime.wrap(function (_context) {
23365
+ while (1) switch (_context.prev = _context.next) {
23366
+ case 0:
23367
+ setShowModal(true);
23368
+ setIsLoading(true);
23369
+ setNotFound(false);
23370
+ setRegistryWidget(null);
23371
+ setInstallError(null);
23372
+ _getWidgetSearchQuery = getWidgetSearchQuery(component), packageName = _getWidgetSearchQuery.packageName, widgetName = _getWidgetSearchQuery.widgetName;
23373
+ _context.prev = 1;
23374
+ pkg = null; // Scoped ID — exact package lookup
23375
+ if (!packageName) {
23376
+ _context.next = 3;
23377
+ break;
23378
+ }
23379
+ _context.next = 2;
23380
+ return window.mainApi.registry.getPackage(packageName);
23381
+ case 2:
23382
+ pkg = _context.sent;
23383
+ case 3:
23384
+ if (pkg) {
23385
+ _context.next = 5;
23386
+ break;
23387
+ }
23388
+ _context.next = 4;
23389
+ return window.mainApi.registry.search(widgetName);
23390
+ case 4:
23391
+ result = _context.sent;
23392
+ pkg = (result.packages || []).find(function (p) {
23393
+ return (p.widgets || []).some(function (w) {
23394
+ return w.name === widgetName;
23395
+ });
23396
+ });
23397
+ case 5:
23398
+ if (pkg) {
23399
+ setRegistryWidget(packageToFlatWidget(pkg));
23400
+ } else {
23401
+ setNotFound(true);
23402
+ }
23403
+ _context.next = 7;
23404
+ break;
23405
+ case 6:
23406
+ _context.prev = 6;
23407
+ _context["catch"](1);
23408
+ setNotFound(true);
23409
+ case 7:
23410
+ setIsLoading(false);
23411
+ case 8:
23412
+ case "end":
23413
+ return _context.stop();
23414
+ }
23415
+ }, _callee, null, [[1, 6]]);
23416
+ })), [component]);
23417
+ var handleInstall = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
23418
+ var packageName, packageScope, downloadUrl, packageVersion, scopedId, resolvedUrl, _t2;
23419
+ return _regeneratorRuntime.wrap(function (_context2) {
23420
+ while (1) switch (_context2.prev = _context2.next) {
23421
+ case 0:
23422
+ if (registryWidget) {
23423
+ _context2.next = 1;
23424
+ break;
23425
+ }
23426
+ return _context2.abrupt("return");
23427
+ case 1:
23428
+ setIsInstalling(true);
23429
+ setInstallError(null);
23430
+ _context2.prev = 2;
23431
+ packageName = registryWidget.packageName, packageScope = registryWidget.packageScope, downloadUrl = registryWidget.downloadUrl, packageVersion = registryWidget.packageVersion;
23432
+ scopedId = packageScope ? "@".concat(packageScope.replace(/^@/, ""), "/").concat(packageName) : packageName;
23433
+ resolvedUrl = downloadUrl.replace(/\{version\}/g, packageVersion).replace(/\{name\}/g, packageName);
23434
+ _context2.next = 3;
23435
+ return window.mainApi.widgets.install(scopedId, resolvedUrl);
23436
+ case 3:
23437
+ setShowModal(false);
23438
+ _context2.next = 5;
23439
+ break;
23440
+ case 4:
23441
+ _context2.prev = 4;
23442
+ _t2 = _context2["catch"](2);
23443
+ setInstallError(_t2.message || "Failed to install package");
23444
+ case 5:
23445
+ setIsInstalling(false);
23446
+ case 6:
23447
+ case "end":
23448
+ return _context2.stop();
23449
+ }
23450
+ }, _callee2, null, [[2, 4]]);
23451
+ })), [registryWidget]);
23452
+ return /*#__PURE__*/jsxs(Fragment, {
23453
+ children: [/*#__PURE__*/jsxs("div", {
23454
+ className: "flex flex-col h-full justify-center items-center w-full z-10 gap-2 p-4 text-center",
23455
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
23456
+ icon: "triangle-exclamation",
23457
+ className: "h-6 w-6 text-amber-500"
23458
+ }), /*#__PURE__*/jsx("div", {
23459
+ className: "text-sm font-semibold text-gray-300",
23460
+ children: "Widget Not Found"
23461
+ }), /*#__PURE__*/jsx("div", {
23462
+ className: "text-xs text-gray-500 font-mono",
23463
+ children: component
23464
+ }), /*#__PURE__*/jsx("div", {
23465
+ className: "text-xs text-gray-600 mt-1",
23466
+ children: "This widget may have been uninstalled or renamed."
23467
+ }), /*#__PURE__*/jsxs("button", {
23468
+ type: "button",
23469
+ className: "flex items-center gap-1.5 text-xs text-blue-400 hover:text-blue-300 transition-colors mt-2",
23470
+ onClick: lookupWidget,
23471
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
23472
+ icon: "magnifying-glass",
23473
+ className: "h-3 w-3"
23474
+ }), "Find in Registry"]
23475
+ })]
23476
+ }), showModal && /*#__PURE__*/jsxs(Modal, {
23477
+ title: "Registry Package",
23478
+ width: "w-1/3",
23479
+ height: "h-auto",
23480
+ onClose: function onClose() {
23481
+ return setShowModal(false);
23482
+ },
23483
+ children: [isLoading && /*#__PURE__*/jsx("div", {
23484
+ className: "flex items-center justify-center p-12",
23485
+ children: /*#__PURE__*/jsx(FontAwesomeIcon, {
23486
+ icon: "spinner",
23487
+ className: "h-5 w-5 text-gray-400 animate-spin"
23488
+ })
23489
+ }), !isLoading && registryWidget && /*#__PURE__*/jsx(RegistryPackageDetail, {
23490
+ widget: registryWidget,
23491
+ onInstall: handleInstall,
23492
+ isInstalling: isInstalling,
23493
+ installError: installError
23494
+ }), !isLoading && notFound && /*#__PURE__*/jsxs("div", {
23495
+ className: "flex flex-col items-center justify-center gap-3 p-12 text-center",
23496
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
23497
+ icon: "triangle-exclamation",
23498
+ className: "h-6 w-6 text-amber-500"
23499
+ }), /*#__PURE__*/jsx("div", {
23500
+ className: "text-sm text-gray-400",
23501
+ children: "This widget is not available in the registry."
23502
+ }), /*#__PURE__*/jsx(Button, {
23503
+ title: "Close",
23504
+ bgColor: "bg-gray-600",
23505
+ hoverBackgroundColor: "hover:bg-gray-700",
23506
+ textSize: "text-sm",
23507
+ padding: "py-1.5 px-4",
23508
+ onClick: function onClick() {
23509
+ return setShowModal(false);
23510
+ }
23511
+ })]
23512
+ })]
23513
+ })]
23514
+ });
23515
+ };
23516
+
22938
23517
  var GRID_CELL_WIDGET_TYPE = "grid-cell-widget";
22939
23518
  var SIDEBAR_WIDGET_TYPE = "sidebar-widget";
22940
23519
 
@@ -24959,21 +25538,8 @@ function renderComponent(component, id) {
24959
25538
  // WidgetFactory.render() always returns a React element (truthy),
24960
25539
  // so the old ternary fallback could never fire.
24961
25540
  if (!isWidgetResolvable(component)) {
24962
- return /*#__PURE__*/jsxs("div", {
24963
- className: "flex flex-col h-full justify-center items-center w-full z-10 gap-2 p-4 text-center",
24964
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
24965
- icon: "triangle-exclamation",
24966
- className: "h-6 w-6 text-amber-500"
24967
- }), /*#__PURE__*/jsx("div", {
24968
- className: "text-sm font-semibold text-gray-300",
24969
- children: "Widget Not Found"
24970
- }), /*#__PURE__*/jsx("div", {
24971
- className: "text-xs text-gray-500 font-mono",
24972
- children: component
24973
- }), /*#__PURE__*/jsx("div", {
24974
- className: "text-xs text-gray-600 mt-1",
24975
- children: "This widget may have been uninstalled or renamed."
24976
- })]
25541
+ return /*#__PURE__*/jsx(WidgetNotFound, {
25542
+ component: component
24977
25543
  });
24978
25544
  }
24979
25545
  if ("height" in params) {
@@ -38290,7 +38856,10 @@ var DashboardsSection = function DashboardsSection(_ref) {
38290
38856
  setInstallMode(null);
38291
38857
  setViewMode("grouped");
38292
38858
  },
38293
- appId: appId
38859
+ appId: appId,
38860
+ onInstallComplete: function onInstallComplete() {
38861
+ onReloadWorkspaces && onReloadWorkspaces();
38862
+ }
38294
38863
  });
38295
38864
  } else if (selectedWorkspace) {
38296
38865
  detailContent = /*#__PURE__*/jsx(DashboardDetail, {
@@ -43728,165 +44297,6 @@ var InstallWidgetPicker = function InstallWidgetPicker(_ref2) {
43728
44297
  });
43729
44298
  };
43730
44299
 
43731
- var RegistryPackageDetail = function RegistryPackageDetail(_ref) {
43732
- var widget = _ref.widget,
43733
- onInstall = _ref.onInstall,
43734
- _ref$isInstalling = _ref.isInstalling,
43735
- isInstalling = _ref$isInstalling === void 0 ? false : _ref$isInstalling,
43736
- _ref$installError = _ref.installError,
43737
- installError = _ref$installError === void 0 ? null : _ref$installError,
43738
- _ref$isInstalled = _ref.isInstalled,
43739
- isInstalled = _ref$isInstalled === void 0 ? false : _ref$isInstalled;
43740
- var _useContext = useContext(ThemeContext),
43741
- currentTheme = _useContext.currentTheme;
43742
- var panelStyles = getStylesForItem(themeObjects.PANEL, currentTheme, {
43743
- grow: false
43744
- });
43745
- if (!widget) return null;
43746
- return /*#__PURE__*/jsxs("div", {
43747
- className: "flex flex-col flex-1 min-h-0",
43748
- children: [/*#__PURE__*/jsxs("div", {
43749
- className: "flex-1 min-h-0 overflow-y-auto p-6 space-y-6 ".concat(panelStyles.textColor || "text-gray-200"),
43750
- children: [/*#__PURE__*/jsxs("div", {
43751
- className: "flex flex-row items-center gap-3",
43752
- children: [/*#__PURE__*/jsx("div", {
43753
- className: "h-5 w-5 flex-shrink-0 flex items-center justify-center",
43754
- children: /*#__PURE__*/jsx(FontAwesomeIcon, {
43755
- icon: widget.icon || "cube",
43756
- className: "h-5 w-5"
43757
- })
43758
- }), /*#__PURE__*/jsxs("div", {
43759
- children: [/*#__PURE__*/jsxs("div", {
43760
- className: "flex items-center gap-2",
43761
- children: [/*#__PURE__*/jsx(SubHeading3, {
43762
- title: widget.packageDisplayName,
43763
- padding: false
43764
- }), isInstalled && /*#__PURE__*/jsx("span", {
43765
- className: "text-[10px] px-1.5 py-0.5 rounded bg-emerald-500/20 text-emerald-400 flex-shrink-0",
43766
- children: "Installed"
43767
- })]
43768
- }), /*#__PURE__*/jsxs("div", {
43769
- className: "flex items-center gap-2 mt-0.5",
43770
- children: [/*#__PURE__*/jsxs("span", {
43771
- className: "text-sm opacity-60",
43772
- children: ["by ", widget.packageAuthor || "Unknown"]
43773
- }), /*#__PURE__*/jsxs("span", {
43774
- className: "text-xs px-2 py-0.5 rounded ".concat(currentTheme["bg-primary-medium"], " opacity-70"),
43775
- children: ["v", widget.packageVersion]
43776
- })]
43777
- })]
43778
- })]
43779
- }), /*#__PURE__*/jsx("hr", {
43780
- className: currentTheme["border-primary-medium"]
43781
- }), widget.packageDescription && /*#__PURE__*/jsx("p", {
43782
- className: "text-sm",
43783
- children: widget.packageDescription
43784
- }), widget.packageTags && widget.packageTags.length > 0 && /*#__PURE__*/jsx("div", {
43785
- className: "flex flex-wrap gap-1",
43786
- children: widget.packageTags.map(function (tag) {
43787
- return /*#__PURE__*/jsx("span", {
43788
- className: "text-xs px-2 py-0.5 rounded ".concat(currentTheme["bg-primary-medium"], " opacity-60"),
43789
- children: tag
43790
- }, tag);
43791
- })
43792
- }), /*#__PURE__*/jsxs("div", {
43793
- children: [/*#__PURE__*/jsx("span", {
43794
- className: "text-xs font-semibold opacity-50 mb-1 block",
43795
- children: "INCLUDED WIDGETS"
43796
- }), /*#__PURE__*/jsx("div", {
43797
- className: "space-y-1.5",
43798
- children: (widget.packageWidgets || []).map(function (w, idx) {
43799
- return /*#__PURE__*/jsxs("div", {
43800
- className: "p-2 rounded ".concat(currentTheme["bg-primary-medium"]),
43801
- children: [/*#__PURE__*/jsx("div", {
43802
- className: "text-sm font-medium",
43803
- children: w.displayName || w.name
43804
- }), w.description && /*#__PURE__*/jsx("div", {
43805
- className: "text-xs opacity-50 mt-0.5",
43806
- children: w.description
43807
- }), getUserConfigurableProviders(w.providers).length > 0 && /*#__PURE__*/jsxs("div", {
43808
- className: "space-y-1 mt-1",
43809
- children: [/*#__PURE__*/jsx("div", {
43810
- className: "flex gap-1 flex-wrap",
43811
- children: getUserConfigurableProviders(w.providers).map(function (p, pidx) {
43812
- return /*#__PURE__*/jsxs("span", {
43813
- className: "text-xs px-1.5 py-0.5 rounded bg-blue-900/30 text-blue-400",
43814
- children: [p.type, p.required ? " *" : ""]
43815
- }, pidx);
43816
- })
43817
- }), getUserConfigurableProviders(w.providers).some(function (p) {
43818
- var _p$requiredTools;
43819
- return ((_p$requiredTools = p.requiredTools) === null || _p$requiredTools === void 0 ? void 0 : _p$requiredTools.length) > 0;
43820
- }) && /*#__PURE__*/jsx("div", {
43821
- className: "flex flex-wrap gap-1 ml-1",
43822
- children: getUserConfigurableProviders(w.providers).filter(function (p) {
43823
- var _p$requiredTools2;
43824
- return ((_p$requiredTools2 = p.requiredTools) === null || _p$requiredTools2 === void 0 ? void 0 : _p$requiredTools2.length) > 0;
43825
- }).flatMap(function (p) {
43826
- return p.requiredTools.map(function (tool) {
43827
- return /*#__PURE__*/jsx("span", {
43828
- className: "text-[10px] font-mono px-1.5 py-0.5 rounded bg-white/5 opacity-60",
43829
- children: tool
43830
- }, "".concat(p.type, "-").concat(tool));
43831
- });
43832
- })
43833
- })]
43834
- })]
43835
- }, idx);
43836
- })
43837
- })]
43838
- }), widget.appOrigin && /*#__PURE__*/jsxs("div", {
43839
- className: "flex items-center gap-1.5 text-xs opacity-50",
43840
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
43841
- icon: "laptop",
43842
- className: "h-3 w-3"
43843
- }), /*#__PURE__*/jsxs("span", {
43844
- children: ["Built for ", widget.appOrigin]
43845
- })]
43846
- }), widget.missingApis && widget.missingApis.length > 0 && /*#__PURE__*/jsx("div", {
43847
- className: "p-2 rounded bg-yellow-900/30 border border-yellow-700",
43848
- children: /*#__PURE__*/jsxs("p", {
43849
- className: "text-xs text-yellow-400",
43850
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
43851
- icon: "triangle-exclamation",
43852
- className: "mr-1"
43853
- }), "Incompatible \u2014 requires ", widget.missingApis.join(", "), " API", widget.missingApis.length !== 1 ? "s" : ""]
43854
- })
43855
- }), widget.repository && /*#__PURE__*/jsxs("div", {
43856
- children: [/*#__PURE__*/jsx("span", {
43857
- className: "text-xs font-semibold opacity-50 mb-1 block",
43858
- children: "REPOSITORY"
43859
- }), /*#__PURE__*/jsx("button", {
43860
- type: "button",
43861
- onClick: function onClick() {
43862
- var _window$mainApi;
43863
- return (_window$mainApi = window.mainApi) === null || _window$mainApi === void 0 || (_window$mainApi = _window$mainApi.shell) === null || _window$mainApi === void 0 ? void 0 : _window$mainApi.openExternal(widget.repository);
43864
- },
43865
- className: "text-sm text-blue-400 hover:text-blue-300 hover:underline transition-colors break-all text-left",
43866
- children: widget.repository
43867
- })]
43868
- }), installError && /*#__PURE__*/jsx("div", {
43869
- className: "p-2 rounded bg-red-900/30 border border-red-700",
43870
- children: /*#__PURE__*/jsx("p", {
43871
- className: "text-xs text-red-400",
43872
- children: installError
43873
- })
43874
- })]
43875
- }), /*#__PURE__*/jsx("div", {
43876
- className: "flex items-center justify-end px-6 py-3 border-t ".concat(currentTheme["border-primary-medium"]),
43877
- children: /*#__PURE__*/jsx(Button, {
43878
- title: isInstalled ? "Installed" : isInstalling ? "Installing..." : "Install Package",
43879
- bgColor: isInstalled ? "bg-emerald-600/50" : "bg-blue-600",
43880
- hoverBackgroundColor: isInstalled || isInstalling ? "" : "hover:bg-blue-700",
43881
- textSize: "text-sm",
43882
- padding: "py-1.5 px-4",
43883
- onClick: onInstall,
43884
- disabled: isInstalling || isInstalled
43885
- })
43886
- })]
43887
- });
43888
- };
43889
-
43890
44300
  function _createForOfIteratorHelper$2(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$2(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
43891
44301
  function _unsupportedIterableToArray$2(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$2(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$2(r, a) : void 0; } }
43892
44302
  function _arrayLikeToArray$2(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
@@ -50600,5 +51010,5 @@ var WorkspaceMenu = function WorkspaceMenu(_ref) {
50600
51010
 
50601
51011
  ComponentManager.registerContainerTypes(LayoutContainer, LayoutGridContainer);
50602
51012
 
50603
- 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, DashboardWizardModal, 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_RUN_AUTH_COMPLETE, MCP_RUN_AUTH_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, PanelEditItemNotifications, 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_EXTRACT_FROM_URL, THEME_EXTRACT_FROM_URL_COMPLETE, THEME_EXTRACT_FROM_URL_ERROR, THEME_LIST, THEME_LIST_COMPLETE, THEME_LIST_ERROR, THEME_MAP_PALETTE, THEME_MAP_PALETTE_COMPLETE, THEME_MAP_PALETTE_ERROR, THEME_SAVE, THEME_SAVE_COMPLETE, THEME_SAVE_ERROR, ThemeApi, ThemeColorDots, ThemeManagerModal, ThemeModel, ThemeWrapper, WELCOME_STORAGE_KEY, 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, WelcomePrompt, Widget, WidgetApi, WidgetConfigPanel, WidgetContext, WidgetFactory, WidgetPopoutStage, WidgetProviderWrapper, WidgetSidebar, WizardCustomizeStep, WizardDiscoverStep, Workspace, WorkspaceContext, WorkspaceFooter, WorkspaceMenu, WorkspaceModel, addChildToLayoutItem, addItemToItemLayout, buildMcpConfigFromOverrides, canHaveChildren, changeDirectionForLayoutItem, createProviderRegistry, deriveFormFields, envMappingToRows, evaluateBundle, extractWidgetConfigs, formStateToMcpJson, formatFieldName, generateCustomTheme, generateHarmonyTheme, generateRandomTheme, generateThemeName, getBorderStyle, getChildrenForLayoutItem, getComponentInLayout, getContainerBorderColor, getContainerColor, getIndexOfLayoutChildrenForItem, getIndexOfLayoutItem, getLayoutItemById, getLayoutItemForWorkspace, getNearestParentWorkspace, getNextHighestId, getNextHighestItemInLayout, getNextHighestOrder, getNextHighestParentId, getNextLowestItemInLayout, getParentForLayoutItem, getParentWorkspaceForItem, getThemePresets, getUserConfigurableProviders, getWidgetsForWorkspace, getWorkspacesForWorkspace, headerTemplateToRows, isContainer, isLikelySecret, isMaxOrderForItem, isMinOrderForItem, isWidget, isWidgetResolvable, isWorkspace, layoutItemHasWorkspaceAsChild, loadWidgetBundle, mcpJsonToFormState, numChildrenForLayout, removeItemFromLayout, renderComponent, renderGridLayout, renderGridLayoutFlow, _renderLayout as renderLayout, renderLayoutMenu, replaceItemInLayout, resolveIcon, setHostModules, traverseParentTree, updateLayoutItem, updateParentForItem, useDashboard, useMcpDashServer, useMcpProvider, useNotifications, useProvider, useProviderClient, useScheduler, useWebSocketProvider, useWidgetEvents, useWidgetProviders, useWidgetSchedulerStatus, useWizardState, validateCellMerge, validateGridCell, validateGridPlacement, validateWidgetPlacement, widgetCountToTemplate, withProviderDetection };
51013
+ 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, DashboardWizardModal, 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_RUN_AUTH_COMPLETE, MCP_RUN_AUTH_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, PanelEditItemNotifications, 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_EXTRACT_FROM_URL, THEME_EXTRACT_FROM_URL_COMPLETE, THEME_EXTRACT_FROM_URL_ERROR, THEME_LIST, THEME_LIST_COMPLETE, THEME_LIST_ERROR, THEME_MAP_PALETTE, THEME_MAP_PALETTE_COMPLETE, THEME_MAP_PALETTE_ERROR, THEME_SAVE, THEME_SAVE_COMPLETE, THEME_SAVE_ERROR, ThemeApi, ThemeColorDots, ThemeManagerModal, ThemeModel, ThemeWrapper, WELCOME_STORAGE_KEY, 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, WelcomePrompt, Widget, WidgetApi, WidgetConfigPanel, WidgetContext, WidgetFactory, WidgetNotFound, WidgetPopoutStage, WidgetProviderWrapper, WidgetSidebar, WizardCustomizeStep, WizardDiscoverStep, Workspace, WorkspaceContext, WorkspaceFooter, WorkspaceMenu, WorkspaceModel, addChildToLayoutItem, addItemToItemLayout, buildMcpConfigFromOverrides, canHaveChildren, changeDirectionForLayoutItem, createProviderRegistry, deriveFormFields, envMappingToRows, evaluateBundle, extractWidgetConfigs, formStateToMcpJson, formatFieldName, generateCustomTheme, generateHarmonyTheme, generateRandomTheme, generateThemeName, getBorderStyle, getChildrenForLayoutItem, getComponentInLayout, getContainerBorderColor, getContainerColor, getIndexOfLayoutChildrenForItem, getIndexOfLayoutItem, getLayoutItemById, getLayoutItemForWorkspace, getNearestParentWorkspace, getNextHighestId, getNextHighestItemInLayout, getNextHighestOrder, getNextHighestParentId, getNextLowestItemInLayout, getParentForLayoutItem, getParentWorkspaceForItem, getThemePresets, getUserConfigurableProviders, getWidgetsForWorkspace, getWorkspacesForWorkspace, headerTemplateToRows, isContainer, isLikelySecret, isMaxOrderForItem, isMinOrderForItem, isWidget, isWidgetResolvable, isWorkspace, layoutItemHasWorkspaceAsChild, loadWidgetBundle, mcpJsonToFormState, numChildrenForLayout, removeItemFromLayout, renderComponent, renderGridLayout, renderGridLayoutFlow, _renderLayout as renderLayout, renderLayoutMenu, replaceItemInLayout, resolveIcon, setHostModules, traverseParentTree, updateLayoutItem, updateParentForItem, useDashboard, useMcpDashServer, useMcpProvider, useNotifications, useProvider, useProviderClient, useScheduler, useWebSocketProvider, useWidgetEvents, useWidgetProviders, useWidgetSchedulerStatus, useWizardState, validateCellMerge, validateGridCell, validateGridPlacement, validateWidgetPlacement, widgetCountToTemplate, withProviderDetection };
50604
51014
  //# sourceMappingURL=index.esm.js.map