@trops/dash-core 0.1.225 → 0.1.227

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, Card2, Tag3, 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, 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';
4
4
  export * from '@trops/dash-react';
5
5
  export { ThemeContext } from '@trops/dash-react';
6
6
  import _typeof from '@babel/runtime/helpers/typeof';
@@ -5879,6 +5879,29 @@ var WizardDiscoverStep = function WizardDiscoverStep(_ref) {
5879
5879
  payload: prov
5880
5880
  });
5881
5881
  }, [dispatch]);
5882
+
5883
+ // Tab state (DASH-185)
5884
+ var _useState = useState("dashboards"),
5885
+ _useState2 = _slicedToArray(_useState, 2),
5886
+ activeTab = _useState2[0],
5887
+ setActiveTab = _useState2[1];
5888
+
5889
+ // Clear selection handler (DASH-186)
5890
+ var hasSelection = state.selectedDashboard !== null || state.selectedWidgets.length > 0;
5891
+ var handleClearSelection = useCallback(function () {
5892
+ dispatch({
5893
+ type: "SET_SELECTED_DASHBOARD",
5894
+ payload: null
5895
+ });
5896
+ dispatch({
5897
+ type: "SET_SELECTED_WIDGETS",
5898
+ payload: []
5899
+ });
5900
+ dispatch({
5901
+ type: "SET_PATH",
5902
+ payload: null
5903
+ });
5904
+ }, [dispatch]);
5882
5905
  var hasResults = filteredDashboards.length > 0 || filteredWidgets.length > 0;
5883
5906
  var hasActiveFilters = filters.categories.length > 0 || filters.providers.length > 0;
5884
5907
  return /*#__PURE__*/jsxs("div", {
@@ -5924,8 +5947,43 @@ var WizardDiscoverStep = function WizardDiscoverStep(_ref) {
5924
5947
  })
5925
5948
  })]
5926
5949
  })]
5950
+ }), /*#__PURE__*/jsxs("div", {
5951
+ className: "flex items-center justify-between",
5952
+ children: [/*#__PURE__*/jsxs("div", {
5953
+ className: "flex gap-1",
5954
+ children: [/*#__PURE__*/jsxs("button", {
5955
+ type: "button",
5956
+ className: "px-4 py-2 text-sm font-medium rounded-t transition-colors ".concat(activeTab === "dashboards" ? "bg-gray-800 text-blue-400 border-b-2 border-blue-400" : "text-gray-400 hover:text-gray-200"),
5957
+ onClick: function onClick() {
5958
+ return setActiveTab("dashboards");
5959
+ },
5960
+ children: ["Dashboards (", filteredDashboards.length, ")"]
5961
+ }), /*#__PURE__*/jsxs("button", {
5962
+ type: "button",
5963
+ className: "px-4 py-2 text-sm font-medium rounded-t transition-colors ".concat(activeTab === "widgets" ? "bg-gray-800 text-blue-400 border-b-2 border-blue-400" : "text-gray-400 hover:text-gray-200"),
5964
+ onClick: function onClick() {
5965
+ return setActiveTab("widgets");
5966
+ },
5967
+ children: ["Widgets (", filteredWidgets.length, ")", state.selectedWidgets.length > 0 && /*#__PURE__*/jsx("span", {
5968
+ className: "ml-1.5",
5969
+ children: /*#__PURE__*/jsx(Tag3, {
5970
+ text: "".concat(state.selectedWidgets.length, " selected")
5971
+ })
5972
+ })]
5973
+ })]
5974
+ }), hasSelection && /*#__PURE__*/jsx(Button, {
5975
+ onClick: handleClearSelection,
5976
+ title: "Clear Selection",
5977
+ textSize: "text-xs",
5978
+ padding: "py-1 px-3",
5979
+ backgroundColor: "bg-gray-700",
5980
+ textColor: "text-gray-400",
5981
+ hoverTextColor: "hover:text-white",
5982
+ hoverBackgroundColor: "hover:bg-gray-600",
5983
+ icon: "xmark"
5984
+ })]
5927
5985
  }), /*#__PURE__*/jsx("div", {
5928
- className: "flex flex-col gap-6 mt-2",
5986
+ className: "flex flex-col gap-6",
5929
5987
  children: isLoading ? /*#__PURE__*/jsxs("div", {
5930
5988
  className: "flex flex-col items-center justify-center gap-2 py-12 text-gray-400",
5931
5989
  children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
@@ -5955,12 +6013,9 @@ var WizardDiscoverStep = function WizardDiscoverStep(_ref) {
5955
6013
  children: "Try removing some filters to see more results."
5956
6014
  })]
5957
6015
  }) : /*#__PURE__*/jsxs(Fragment, {
5958
- children: [filteredDashboards.length > 0 && /*#__PURE__*/jsxs("div", {
6016
+ children: [activeTab === "dashboards" && filteredDashboards.length > 0 && /*#__PURE__*/jsx("div", {
5959
6017
  className: "flex flex-col gap-3",
5960
- children: [/*#__PURE__*/jsxs("h4", {
5961
- className: "text-sm font-semibold text-gray-300 flex items-center gap-2",
5962
- children: ["Dashboards (", filteredDashboards.length, " result", filteredDashboards.length !== 1 ? "s" : "", ")"]
5963
- }), /*#__PURE__*/jsx("div", {
6018
+ children: /*#__PURE__*/jsx("div", {
5964
6019
  className: "grid grid-cols-3 gap-3",
5965
6020
  children: filteredDashboards.map(function (dash) {
5966
6021
  var isSelected = state.selectedDashboard && state.selectedDashboard.name === dash.name;
@@ -6016,15 +6071,18 @@ var WizardDiscoverStep = function WizardDiscoverStep(_ref) {
6016
6071
  })]
6017
6072
  }, dash.name);
6018
6073
  })
6074
+ })
6075
+ }), activeTab === "dashboards" && filteredDashboards.length === 0 && /*#__PURE__*/jsxs("div", {
6076
+ className: "flex flex-col items-center justify-center gap-2 py-12 text-gray-500",
6077
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
6078
+ icon: "grid-2",
6079
+ fixedWidth: true
6080
+ }), /*#__PURE__*/jsx("p", {
6081
+ children: "No dashboards match your search."
6019
6082
  })]
6020
- }), filteredWidgets.length > 0 && /*#__PURE__*/jsxs("div", {
6083
+ }), activeTab === "widgets" && filteredWidgets.length > 0 && /*#__PURE__*/jsx("div", {
6021
6084
  className: "flex flex-col gap-3",
6022
- children: [/*#__PURE__*/jsxs("h4", {
6023
- className: "text-sm font-semibold text-gray-300 flex items-center gap-2",
6024
- children: ["Widgets (", filteredWidgets.length, " result", filteredWidgets.length !== 1 ? "s" : "", ")", state.selectedWidgets.length > 0 && /*#__PURE__*/jsx(Tag3, {
6025
- text: "".concat(state.selectedWidgets.length, " selected")
6026
- })]
6027
- }), /*#__PURE__*/jsx("div", {
6085
+ children: /*#__PURE__*/jsx("div", {
6028
6086
  className: "grid grid-cols-3 gap-3",
6029
6087
  children: filteredWidgets.map(function (widget) {
6030
6088
  var checked = isWidgetSelected(widget);
@@ -6063,6 +6121,14 @@ var WizardDiscoverStep = function WizardDiscoverStep(_ref) {
6063
6121
  })]
6064
6122
  }, widget.key);
6065
6123
  })
6124
+ })
6125
+ }), activeTab === "widgets" && filteredWidgets.length === 0 && /*#__PURE__*/jsxs("div", {
6126
+ className: "flex flex-col items-center justify-center gap-2 py-12 text-gray-500",
6127
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
6128
+ icon: "puzzle-piece",
6129
+ fixedWidth: true
6130
+ }), /*#__PURE__*/jsx("p", {
6131
+ children: "No widgets match your search."
6066
6132
  })]
6067
6133
  })]
6068
6134
  })
@@ -6100,442 +6166,6 @@ function applyFilters(items, filters, mode) {
6100
6166
 
6101
6167
  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; }
6102
6168
  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; }
6103
- var TOTAL_STEPS = 3; // Steps 0-2: Discover, Layout, Customize
6104
-
6105
- var initialState = {
6106
- step: 0,
6107
- filters: {
6108
- categories: [],
6109
- providers: [],
6110
- query: ""
6111
- },
6112
- selectedWidgets: [],
6113
- selectedDashboard: null,
6114
- layout: {
6115
- templateKey: null,
6116
- widgetOrder: []
6117
- },
6118
- customization: {
6119
- name: "",
6120
- menuId: null,
6121
- theme: null
6122
- },
6123
- path: null
6124
- };
6125
- function wizardReducer(state, action) {
6126
- switch (action.type) {
6127
- case "SET_STEP":
6128
- return _objectSpread$B(_objectSpread$B({}, state), {}, {
6129
- step: action.payload
6130
- });
6131
- case "SET_FILTERS":
6132
- return _objectSpread$B(_objectSpread$B({}, state), {}, {
6133
- filters: _objectSpread$B(_objectSpread$B({}, state.filters), action.payload)
6134
- });
6135
- case "TOGGLE_FILTER_CATEGORY":
6136
- {
6137
- var categories = state.filters.categories.includes(action.payload) ? state.filters.categories.filter(function (c) {
6138
- return c !== action.payload;
6139
- }) : [].concat(_toConsumableArray(state.filters.categories), [action.payload]);
6140
- return _objectSpread$B(_objectSpread$B({}, state), {}, {
6141
- filters: _objectSpread$B(_objectSpread$B({}, state.filters), {}, {
6142
- categories: categories
6143
- })
6144
- });
6145
- }
6146
- case "TOGGLE_FILTER_PROVIDER":
6147
- {
6148
- var providers = state.filters.providers.includes(action.payload) ? state.filters.providers.filter(function (p) {
6149
- return p !== action.payload;
6150
- }) : [].concat(_toConsumableArray(state.filters.providers), [action.payload]);
6151
- return _objectSpread$B(_objectSpread$B({}, state), {}, {
6152
- filters: _objectSpread$B(_objectSpread$B({}, state.filters), {}, {
6153
- providers: providers
6154
- })
6155
- });
6156
- }
6157
- case "SET_SEARCH_QUERY":
6158
- return _objectSpread$B(_objectSpread$B({}, state), {}, {
6159
- filters: _objectSpread$B(_objectSpread$B({}, state.filters), {}, {
6160
- query: action.payload
6161
- })
6162
- });
6163
- case "SET_SELECTED_WIDGETS":
6164
- return _objectSpread$B(_objectSpread$B({}, state), {}, {
6165
- selectedWidgets: action.payload
6166
- });
6167
- case "TOGGLE_WIDGET":
6168
- {
6169
- var exists = state.selectedWidgets.some(function (w) {
6170
- return w.name === action.payload.name;
6171
- });
6172
- var selectedWidgets = exists ? state.selectedWidgets.filter(function (w) {
6173
- return w.name !== action.payload.name;
6174
- }) : [].concat(_toConsumableArray(state.selectedWidgets), [action.payload]);
6175
- return _objectSpread$B(_objectSpread$B({}, state), {}, {
6176
- selectedWidgets: selectedWidgets
6177
- });
6178
- }
6179
- case "SET_SELECTED_DASHBOARD":
6180
- return _objectSpread$B(_objectSpread$B({}, state), {}, {
6181
- selectedDashboard: action.payload
6182
- });
6183
- case "SET_PATH":
6184
- return _objectSpread$B(_objectSpread$B({}, state), {}, {
6185
- path: action.payload
6186
- });
6187
- case "SET_LAYOUT":
6188
- return _objectSpread$B(_objectSpread$B({}, state), {}, {
6189
- layout: action.payload
6190
- });
6191
- case "REORDER_WIDGETS":
6192
- return _objectSpread$B(_objectSpread$B({}, state), {}, {
6193
- layout: _objectSpread$B(_objectSpread$B({}, state.layout), {}, {
6194
- widgetOrder: action.payload
6195
- })
6196
- });
6197
- case "SET_CUSTOMIZATION":
6198
- return _objectSpread$B(_objectSpread$B({}, state), {}, {
6199
- customization: _objectSpread$B(_objectSpread$B({}, state.customization), action.payload)
6200
- });
6201
- case "RESET":
6202
- return _objectSpread$B({}, initialState);
6203
- default:
6204
- return state;
6205
- }
6206
- }
6207
- function widgetCountToTemplate(count) {
6208
- if (count <= 1) return "single";
6209
- if (count === 2) return "two-columns";
6210
- if (count === 3) return "three-columns";
6211
- if (count === 4) return "two-by-two";
6212
- if (count <= 6) return "two-by-three";
6213
- return "three-by-three";
6214
- }
6215
- function getCanProceed(state) {
6216
- switch (state.step) {
6217
- case 0:
6218
- return state.selectedDashboard !== null || state.selectedWidgets.length > 0;
6219
- case 1:
6220
- return state.layout.templateKey !== null;
6221
- case 2:
6222
- return state.customization.name.trim().length > 0;
6223
- default:
6224
- return false;
6225
- }
6226
- }
6227
- var useWizardState = function useWizardState() {
6228
- var _useReducer = useReducer(wizardReducer, initialState),
6229
- _useReducer2 = _slicedToArray(_useReducer, 2),
6230
- state = _useReducer2[0],
6231
- dispatch = _useReducer2[1];
6232
- var canProceed = useMemo(function () {
6233
- return getCanProceed(state);
6234
- }, [state]);
6235
- var selectedCount = useMemo(function () {
6236
- return state.selectedWidgets.length;
6237
- }, [state.selectedWidgets]);
6238
- var isPrebuiltPath = state.path === "prebuilt";
6239
- var isCustomPath = state.path === "custom";
6240
- var nextStep = useCallback(function () {
6241
- if (getCanProceed(state) && state.step < TOTAL_STEPS - 1) {
6242
- dispatch({
6243
- type: "SET_STEP",
6244
- payload: state.step + 1
6245
- });
6246
- }
6247
- }, [state]);
6248
- var prevStep = useCallback(function () {
6249
- if (state.step > 0) {
6250
- dispatch({
6251
- type: "SET_STEP",
6252
- payload: state.step - 1
6253
- });
6254
- }
6255
- }, [state.step]);
6256
- var goToStep = useCallback(function (n) {
6257
- if (n >= 0 && n < TOTAL_STEPS) {
6258
- dispatch({
6259
- type: "SET_STEP",
6260
- payload: n
6261
- });
6262
- }
6263
- }, []);
6264
- return {
6265
- state: state,
6266
- dispatch: dispatch,
6267
- nextStep: nextStep,
6268
- prevStep: prevStep,
6269
- goToStep: goToStep,
6270
- canProceed: canProceed,
6271
- selectedCount: selectedCount,
6272
- isPrebuiltPath: isPrebuiltPath,
6273
- isCustomPath: isCustomPath,
6274
- widgetCountToTemplate: widgetCountToTemplate
6275
- };
6276
- };
6277
-
6278
- var WizardLayoutPreviewStep = function WizardLayoutPreviewStep(_ref) {
6279
- var state = _ref.state,
6280
- dispatch = _ref.dispatch;
6281
- var isPrebuilt = state.path === "prebuilt";
6282
-
6283
- // Auto-select template and populate widget order on mount / widget change
6284
- useEffect(function () {
6285
- if (isPrebuilt) return;
6286
- var templateKey = widgetCountToTemplate(state.selectedWidgets.length);
6287
- var template = layoutTemplates.find(function (t) {
6288
- return t.id === templateKey;
6289
- });
6290
- if (!template) return;
6291
-
6292
- // Only update if template changed or widget order is empty
6293
- if (state.layout.templateKey !== templateKey || state.layout.widgetOrder.length === 0) {
6294
- var widgetOrder = state.selectedWidgets.map(function (w) {
6295
- return w.name || w.key;
6296
- });
6297
- dispatch({
6298
- type: "SET_LAYOUT",
6299
- payload: {
6300
- templateKey: templateKey,
6301
- widgetOrder: widgetOrder
6302
- }
6303
- });
6304
- }
6305
- }, [isPrebuilt, state.selectedWidgets, state.layout.templateKey, state.layout.widgetOrder.length, dispatch]);
6306
- if (isPrebuilt) {
6307
- return /*#__PURE__*/jsx(PrebuiltPreview, {
6308
- dashboard: state.selectedDashboard
6309
- });
6310
- }
6311
- var template = layoutTemplates.find(function (t) {
6312
- return t.id === state.layout.templateKey;
6313
- });
6314
- return /*#__PURE__*/jsxs("div", {
6315
- className: "flex flex-col gap-4",
6316
- children: [/*#__PURE__*/jsx("h3", {
6317
- className: "text-lg font-semibold text-gray-200",
6318
- children: "Preview your layout"
6319
- }), /*#__PURE__*/jsx("p", {
6320
- className: "text-sm text-gray-400",
6321
- children: "Drag widgets to rearrange their placement in the grid."
6322
- }), template ? /*#__PURE__*/jsx(LayoutGrid, {
6323
- template: template,
6324
- widgetOrder: state.layout.widgetOrder,
6325
- widgets: state.selectedWidgets,
6326
- dispatch: dispatch
6327
- }) : /*#__PURE__*/jsxs("div", {
6328
- className: "flex flex-col items-center justify-center gap-2 py-12 text-gray-500",
6329
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
6330
- icon: "grid-2",
6331
- fixedWidth: true
6332
- }), /*#__PURE__*/jsx("p", {
6333
- children: "No layout template available."
6334
- })]
6335
- })]
6336
- });
6337
- };
6338
-
6339
- // --- Pre-built dashboard preview ---
6340
-
6341
- var PrebuiltPreview = function PrebuiltPreview(_ref2) {
6342
- var dashboard = _ref2.dashboard;
6343
- if (!dashboard) {
6344
- return /*#__PURE__*/jsxs("div", {
6345
- className: "flex flex-col gap-4",
6346
- children: [/*#__PURE__*/jsx("h3", {
6347
- className: "text-lg font-semibold text-gray-200",
6348
- children: "Dashboard preview"
6349
- }), /*#__PURE__*/jsxs("div", {
6350
- className: "flex flex-col items-center justify-center gap-2 py-12 text-gray-500",
6351
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
6352
- icon: "box-open",
6353
- fixedWidth: true
6354
- }), /*#__PURE__*/jsx("p", {
6355
- children: "No dashboard selected."
6356
- })]
6357
- })]
6358
- });
6359
- }
6360
- var widgets = dashboard.widgets || [];
6361
- return /*#__PURE__*/jsxs("div", {
6362
- className: "flex flex-col gap-4",
6363
- children: [/*#__PURE__*/jsx("h3", {
6364
- className: "text-lg font-semibold text-gray-200",
6365
- children: "Dashboard preview"
6366
- }), /*#__PURE__*/jsxs("div", {
6367
- className: "rounded-lg border border-gray-700/50 bg-gray-800/50 p-4 flex flex-col gap-3",
6368
- children: [/*#__PURE__*/jsxs("div", {
6369
- className: "flex items-center gap-2",
6370
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
6371
- icon: resolveIcon(dashboard.icon || "grid-2"),
6372
- fixedWidth: true,
6373
- className: "text-blue-400"
6374
- }), /*#__PURE__*/jsx("span", {
6375
- className: "text-base font-semibold text-gray-200",
6376
- children: dashboard.displayName || dashboard.name
6377
- })]
6378
- }), dashboard.description && /*#__PURE__*/jsx("p", {
6379
- className: "text-sm text-gray-400",
6380
- children: dashboard.description
6381
- }), /*#__PURE__*/jsxs("div", {
6382
- className: "flex flex-col gap-1.5",
6383
- children: [/*#__PURE__*/jsxs("span", {
6384
- className: "text-xs font-semibold text-gray-400 uppercase tracking-wide",
6385
- children: ["Includes ", widgets.length, " widget", widgets.length !== 1 ? "s" : "", ":"]
6386
- }), /*#__PURE__*/jsx("ul", {
6387
- className: "flex flex-col gap-1",
6388
- children: widgets.map(function (w, i) {
6389
- return /*#__PURE__*/jsxs("li", {
6390
- className: "flex items-center gap-2 text-sm text-gray-300",
6391
- children: [w.icon && /*#__PURE__*/jsx(FontAwesomeIcon, {
6392
- icon: resolveIcon(w.icon),
6393
- fixedWidth: true,
6394
- className: "text-gray-500 text-xs"
6395
- }), /*#__PURE__*/jsx("span", {
6396
- children: w.displayName || w.name
6397
- })]
6398
- }, w.name || i);
6399
- })
6400
- })]
6401
- })]
6402
- })]
6403
- });
6404
- };
6405
-
6406
- // --- Drag-reorder grid ---
6407
-
6408
- var LayoutGrid = function LayoutGrid(_ref3) {
6409
- var template = _ref3.template,
6410
- widgetOrder = _ref3.widgetOrder,
6411
- widgets = _ref3.widgets,
6412
- dispatch = _ref3.dispatch;
6413
- var _useState = useState(null),
6414
- _useState2 = _slicedToArray(_useState, 2),
6415
- dragIndex = _useState2[0],
6416
- setDragIndex = _useState2[1];
6417
- var _useState3 = useState(null),
6418
- _useState4 = _slicedToArray(_useState3, 2),
6419
- dragOverIndex = _useState4[0],
6420
- setDragOverIndex = _useState4[1];
6421
- var dragRef = useRef(null);
6422
- var totalCells = template.previewCells.length;
6423
-
6424
- // Build cell contents: widget names for filled cells, null for empty
6425
- var cellContents = template.previewCells.map(function (_, i) {
6426
- var widgetId = widgetOrder[i] || null;
6427
- if (!widgetId) return null;
6428
- var widget = widgets.find(function (w) {
6429
- return (w.name || w.key) === widgetId;
6430
- });
6431
- return widget || {
6432
- name: widgetId
6433
- };
6434
- });
6435
- var handleDragStart = useCallback(function (e, index) {
6436
- setDragIndex(index);
6437
- dragRef.current = index;
6438
- e.dataTransfer.effectAllowed = "move";
6439
- e.dataTransfer.setData("text/plain", String(index));
6440
- }, []);
6441
- var handleDragOver = useCallback(function (e, index) {
6442
- e.preventDefault();
6443
- e.dataTransfer.dropEffect = "move";
6444
- setDragOverIndex(index);
6445
- }, []);
6446
- var handleDragLeave = useCallback(function () {
6447
- setDragOverIndex(null);
6448
- }, []);
6449
- var handleDrop = useCallback(function (e, dropIndex) {
6450
- e.preventDefault();
6451
- var fromIndex = dragRef.current;
6452
- setDragIndex(null);
6453
- setDragOverIndex(null);
6454
- dragRef.current = null;
6455
- if (fromIndex === null || fromIndex === dropIndex) return;
6456
-
6457
- // Swap the two positions in widgetOrder
6458
- var newOrder = _toConsumableArray(widgetOrder);
6459
- // Pad array to cover all cells
6460
- while (newOrder.length < totalCells) {
6461
- newOrder.push(null);
6462
- }
6463
- var temp = newOrder[fromIndex];
6464
- newOrder[fromIndex] = newOrder[dropIndex];
6465
- newOrder[dropIndex] = temp;
6466
-
6467
- // Trim trailing nulls
6468
- while (newOrder.length > 0 && newOrder[newOrder.length - 1] === null) {
6469
- newOrder.pop();
6470
- }
6471
- dispatch({
6472
- type: "REORDER_WIDGETS",
6473
- payload: newOrder
6474
- });
6475
- }, [widgetOrder, totalCells, dispatch]);
6476
- var handleDragEnd = useCallback(function () {
6477
- setDragIndex(null);
6478
- setDragOverIndex(null);
6479
- dragRef.current = null;
6480
- }, []);
6481
- return /*#__PURE__*/jsx("div", {
6482
- className: "gap-3 p-4",
6483
- style: {
6484
- display: "grid",
6485
- gridTemplateRows: "repeat(".concat(template.rows, ", 1fr)"),
6486
- gridTemplateColumns: "repeat(".concat(template.cols, ", 1fr)")
6487
- },
6488
- children: template.previewCells.map(function (cell, i) {
6489
- var content = cellContents[i];
6490
- var isDragging = dragIndex === i;
6491
- var isDragOver = dragOverIndex === i;
6492
- var hasWidget = content !== null;
6493
- var cellStyle = {};
6494
- if (cell.rowSpan) cellStyle.gridRow = "span ".concat(cell.rowSpan);
6495
- if (cell.colSpan) cellStyle.gridColumn = "span ".concat(cell.colSpan);
6496
- var cellClasses = ["rounded-lg border transition-all flex items-center justify-center min-h-[60px]", hasWidget ? "border-gray-600 bg-gray-800/80 cursor-grab" : "border-dashed border-gray-700 bg-gray-800/30", isDragging ? "opacity-50 scale-95" : "", isDragOver ? "ring-2 ring-blue-400 border-blue-400" : ""].filter(Boolean).join(" ");
6497
- return /*#__PURE__*/jsx("div", {
6498
- className: cellClasses,
6499
- style: cellStyle,
6500
- draggable: hasWidget,
6501
- onDragStart: hasWidget ? function (e) {
6502
- return handleDragStart(e, i);
6503
- } : undefined,
6504
- onDragOver: function onDragOver(e) {
6505
- return handleDragOver(e, i);
6506
- },
6507
- onDragLeave: handleDragLeave,
6508
- onDrop: function onDrop(e) {
6509
- return handleDrop(e, i);
6510
- },
6511
- onDragEnd: handleDragEnd,
6512
- children: hasWidget ? /*#__PURE__*/jsxs("div", {
6513
- className: "flex items-center gap-2 px-3 py-2 text-sm text-gray-300",
6514
- children: [content.icon && /*#__PURE__*/jsx(FontAwesomeIcon, {
6515
- icon: resolveIcon(content.icon),
6516
- fixedWidth: true,
6517
- className: "text-gray-400 text-xs"
6518
- }), /*#__PURE__*/jsx("span", {
6519
- className: "truncate",
6520
- children: content.displayName || content.name || content.key
6521
- }), /*#__PURE__*/jsx(FontAwesomeIcon, {
6522
- icon: "grip-vertical",
6523
- className: "text-gray-600 ml-auto"
6524
- })]
6525
- }) : /*#__PURE__*/jsx("div", {
6526
- className: "text-gray-600",
6527
- children: /*#__PURE__*/jsx(FontAwesomeIcon, {
6528
- icon: "plus",
6529
- fixedWidth: true
6530
- })
6531
- })
6532
- }, "".concat(cell.row, "-").concat(cell.col));
6533
- })
6534
- });
6535
- };
6536
-
6537
- function ownKeys$A(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; }
6538
- function _objectSpread$A(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$A(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$A(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
6539
6169
  var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
6540
6170
  var _state$selectedDashbo, _state$selectedDashbo2;
6541
6171
  var state = _ref.state,
@@ -6550,7 +6180,9 @@ var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
6550
6180
  onInstallDashboard = _ref$onInstallDashboa === void 0 ? null : _ref$onInstallDashboa,
6551
6181
  _ref$onOpenDashboard = _ref.onOpenDashboard,
6552
6182
  onOpenDashboard = _ref$onOpenDashboard === void 0 ? null : _ref$onOpenDashboard,
6553
- appId = _ref.appId;
6183
+ appId = _ref.appId,
6184
+ _ref$createHandlerRef = _ref.createHandlerRef,
6185
+ createHandlerRef = _ref$createHandlerRef === void 0 ? null : _ref$createHandlerRef;
6554
6186
  var _useContext = useContext(ThemeContext),
6555
6187
  themes = _useContext.themes,
6556
6188
  appThemeKey = _useContext.themeKey;
@@ -6575,9 +6207,9 @@ var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
6575
6207
 
6576
6208
  // Creation state
6577
6209
  var _useState9 = useState(false),
6578
- _useState0 = _slicedToArray(_useState9, 2);
6579
- _useState0[0];
6580
- var setCreating = _useState0[1];
6210
+ _useState0 = _slicedToArray(_useState9, 2),
6211
+ creating = _useState0[0],
6212
+ setCreating = _useState0[1];
6581
6213
  var _useState1 = useState(null),
6582
6214
  _useState10 = _slicedToArray(_useState1, 2),
6583
6215
  error = _useState10[0],
@@ -6586,9 +6218,15 @@ var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
6586
6218
  _useState12 = _slicedToArray(_useState11, 2),
6587
6219
  createdDashboard = _useState12[0],
6588
6220
  setCreatedDashboard = _useState12[1];
6221
+
6222
+ // Sub-step state (DASH-188): 0 = Name, 1 = Folder, 2 = Theme
6223
+ var _useState13 = useState(0),
6224
+ _useState14 = _slicedToArray(_useState13, 2),
6225
+ subStep = _useState14[0],
6226
+ setSubStep = _useState14[1];
6589
6227
  var isPrebuilt = state.path === "prebuilt";
6590
6228
 
6591
- // Initialize customization defaults on mount
6229
+ // Initialize customization defaults when stepping into this step
6592
6230
  useEffect(function () {
6593
6231
  setLocalMenuItems(menuItems);
6594
6232
  var updates = {};
@@ -6606,6 +6244,10 @@ var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
6606
6244
  })[0]) === null || _Object$entries$sort$ === void 0 ? void 0 : _Object$entries$sort$[0];
6607
6245
  updates.theme = appThemeKey || fallback || null;
6608
6246
  }
6247
+ // Auto-populate name from selected dashboard (DASH-184)
6248
+ if (!state.customization.name && state.selectedDashboard) {
6249
+ updates.name = state.selectedDashboard.displayName || state.selectedDashboard.name || "";
6250
+ }
6609
6251
  if (Object.keys(updates).length > 0) {
6610
6252
  dispatch({
6611
6253
  type: "SET_CUSTOMIZATION",
@@ -6613,65 +6255,10 @@ var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
6613
6255
  });
6614
6256
  }
6615
6257
  // eslint-disable-next-line react-hooks/exhaustive-deps
6616
- }, []);
6617
- var handleNameChange = useCallback(function (val) {
6618
- dispatch({
6619
- type: "SET_CUSTOMIZATION",
6620
- payload: {
6621
- name: val
6622
- }
6623
- });
6624
- }, [dispatch]);
6625
- var handleMenuSelect = useCallback(function (id) {
6626
- dispatch({
6627
- type: "SET_CUSTOMIZATION",
6628
- payload: {
6629
- menuId: id
6630
- }
6631
- });
6632
- setIsCreatingFolder(false);
6633
- setNewFolderName("");
6634
- setNewFolderIcon(null);
6635
- }, [dispatch]);
6636
- var handleThemeSelect = useCallback(function (key) {
6637
- dispatch({
6638
- type: "SET_CUSTOMIZATION",
6639
- payload: {
6640
- theme: key
6641
- }
6642
- });
6643
- }, [dispatch]);
6644
- function handleCancelNewFolder() {
6645
- setIsCreatingFolder(false);
6646
- setNewFolderName("");
6647
- setNewFolderIcon(null);
6648
- }
6649
- function handleSaveNewFolder() {
6650
- if (!newFolderName.trim() || !newFolderIcon) return;
6651
- var newItem = {
6652
- id: Date.now(),
6653
- name: newFolderName.trim(),
6654
- icon: newFolderIcon
6655
- };
6656
- setLocalMenuItems(function (prev) {
6657
- return [].concat(_toConsumableArray(prev), [newItem]);
6658
- });
6659
- dispatch({
6660
- type: "SET_CUSTOMIZATION",
6661
- payload: {
6662
- menuId: newItem.id
6663
- }
6664
- });
6665
- if (onSaveMenuItem) {
6666
- onSaveMenuItem(newItem);
6667
- }
6668
- setIsCreatingFolder(false);
6669
- setNewFolderName("");
6670
- setNewFolderIcon(null);
6671
- }
6258
+ }, [state.step, state.selectedDashboard]);
6672
6259
 
6673
- // --- Create logic ---
6674
- useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
6260
+ // --- Create logic (DASH-191: moved above useEffect so ref captures actual function) ---
6261
+ var handleCreate = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
6675
6262
  var _state$customization, name, menuId, theme, result, _window$mainApi, installResult, updatedWorkspace, _window$mainApi2, template, layoutObj, widgetOrder, cells, _loop, i, workspace, _t;
6676
6263
  return _regeneratorRuntime.wrap(function (_context2) {
6677
6264
  while (1) switch (_context2.prev = _context2.next) {
@@ -6713,7 +6300,7 @@ var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
6713
6300
  _context2.next = 6;
6714
6301
  break;
6715
6302
  }
6716
- updatedWorkspace = _objectSpread$A(_objectSpread$A({}, installResult.workspace), {}, {
6303
+ updatedWorkspace = _objectSpread$B(_objectSpread$B({}, installResult.workspace), {}, {
6717
6304
  name: name.trim(),
6718
6305
  menuId: menuId || 1,
6719
6306
  themeKey: theme
@@ -6822,6 +6409,72 @@ var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
6822
6409
  }, _callee, null, [[1, 16, 17, 18]]);
6823
6410
  })), [state, isPrebuilt, onInstallDashboard, onCreateWorkspace, appId]);
6824
6411
 
6412
+ // Expose handleCreate and creating state to parent via ref (DASH-183)
6413
+ useEffect(function () {
6414
+ if (createHandlerRef) {
6415
+ createHandlerRef.current = {
6416
+ handleCreate: handleCreate,
6417
+ creating: creating
6418
+ };
6419
+ }
6420
+ }, [createHandlerRef, handleCreate, creating]);
6421
+ var handleNameChange = useCallback(function (val) {
6422
+ dispatch({
6423
+ type: "SET_CUSTOMIZATION",
6424
+ payload: {
6425
+ name: val
6426
+ }
6427
+ });
6428
+ }, [dispatch]);
6429
+ var handleMenuSelect = useCallback(function (id) {
6430
+ dispatch({
6431
+ type: "SET_CUSTOMIZATION",
6432
+ payload: {
6433
+ menuId: id
6434
+ }
6435
+ });
6436
+ setIsCreatingFolder(false);
6437
+ setNewFolderName("");
6438
+ setNewFolderIcon(null);
6439
+ setSubStep(2); // Auto-advance to Theme
6440
+ }, [dispatch]);
6441
+ var handleThemeSelect = useCallback(function (key) {
6442
+ dispatch({
6443
+ type: "SET_CUSTOMIZATION",
6444
+ payload: {
6445
+ theme: key
6446
+ }
6447
+ });
6448
+ }, [dispatch]);
6449
+ function handleCancelNewFolder() {
6450
+ setIsCreatingFolder(false);
6451
+ setNewFolderName("");
6452
+ setNewFolderIcon(null);
6453
+ }
6454
+ function handleSaveNewFolder() {
6455
+ if (!newFolderName.trim() || !newFolderIcon) return;
6456
+ var newItem = {
6457
+ id: Date.now(),
6458
+ name: newFolderName.trim(),
6459
+ icon: newFolderIcon
6460
+ };
6461
+ setLocalMenuItems(function (prev) {
6462
+ return [].concat(_toConsumableArray(prev), [newItem]);
6463
+ });
6464
+ dispatch({
6465
+ type: "SET_CUSTOMIZATION",
6466
+ payload: {
6467
+ menuId: newItem.id
6468
+ }
6469
+ });
6470
+ if (onSaveMenuItem) {
6471
+ onSaveMenuItem(newItem);
6472
+ }
6473
+ setIsCreatingFolder(false);
6474
+ setNewFolderName("");
6475
+ setNewFolderIcon(null);
6476
+ }
6477
+
6825
6478
  // --- Success state ---
6826
6479
  if (createdDashboard) {
6827
6480
  return /*#__PURE__*/jsx("div", {
@@ -6876,18 +6529,44 @@ var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
6876
6529
  return item.id === state.customization.menuId;
6877
6530
  });
6878
6531
  var selectedTheme = themes && state.customization.theme ? themes[state.customization.theme] : null;
6532
+ var SUB_STEPS = [{
6533
+ label: "Name",
6534
+ icon: "input-text"
6535
+ }, {
6536
+ label: "Folder",
6537
+ icon: "folder"
6538
+ }, {
6539
+ label: "Theme",
6540
+ icon: "palette"
6541
+ }];
6879
6542
  return /*#__PURE__*/jsxs("div", {
6880
6543
  className: "flex flex-col gap-4",
6881
6544
  children: [/*#__PURE__*/jsx("h3", {
6882
6545
  className: "text-lg font-semibold text-gray-200",
6883
6546
  children: "Customize your dashboard"
6884
- }), /*#__PURE__*/jsx("p", {
6885
- className: "text-sm text-gray-400",
6886
- children: "Name your dashboard, choose a folder, and pick a theme."
6547
+ }), /*#__PURE__*/jsx("div", {
6548
+ className: "flex items-center gap-2 mb-2",
6549
+ children: SUB_STEPS.map(function (s, i) {
6550
+ return /*#__PURE__*/jsxs(React__default.Fragment, {
6551
+ children: [i > 0 && /*#__PURE__*/jsx("div", {
6552
+ className: "flex-1 h-px ".concat(i <= subStep ? "bg-blue-500" : "bg-gray-700")
6553
+ }), /*#__PURE__*/jsxs("button", {
6554
+ type: "button",
6555
+ className: "flex items-center gap-1.5 px-3 py-1.5 rounded-full text-xs font-medium transition-colors ".concat(i === subStep ? "bg-blue-600 text-white" : i < subStep ? "bg-blue-900/50 text-blue-300 cursor-pointer" : "bg-gray-800 text-gray-500"),
6556
+ onClick: function onClick() {
6557
+ return setSubStep(i);
6558
+ },
6559
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
6560
+ icon: s.icon,
6561
+ fixedWidth: true
6562
+ }), s.label]
6563
+ })]
6564
+ }, s.label);
6565
+ })
6887
6566
  }), /*#__PURE__*/jsxs("div", {
6888
6567
  className: "flex flex-col gap-6",
6889
- children: [/*#__PURE__*/jsxs("div", {
6890
- className: "flex flex-col gap-2",
6568
+ children: [subStep === 0 && /*#__PURE__*/jsxs("div", {
6569
+ className: "flex flex-col gap-3",
6891
6570
  children: [/*#__PURE__*/jsxs("label", {
6892
6571
  className: "flex items-center gap-2 text-sm font-semibold text-gray-300",
6893
6572
  children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
@@ -6899,9 +6578,25 @@ var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
6899
6578
  onChange: handleNameChange,
6900
6579
  placeholder: "My Dashboard",
6901
6580
  autoFocus: true
6581
+ }), /*#__PURE__*/jsx("div", {
6582
+ className: "flex justify-end mt-2",
6583
+ children: /*#__PURE__*/jsx(Button, {
6584
+ onClick: function onClick() {
6585
+ return setSubStep(1);
6586
+ },
6587
+ title: "Next",
6588
+ textSize: "text-sm",
6589
+ padding: "py-1.5 px-4",
6590
+ backgroundColor: state.customization.name.trim() ? "bg-blue-600" : "bg-gray-700",
6591
+ textColor: state.customization.name.trim() ? "text-white" : "text-gray-500",
6592
+ hoverTextColor: state.customization.name.trim() ? "hover:text-white" : "hover:text-gray-500",
6593
+ hoverBackgroundColor: state.customization.name.trim() ? "hover:bg-blue-500" : "hover:bg-gray-700",
6594
+ disabled: !state.customization.name.trim(),
6595
+ icon: "arrow-right"
6596
+ })
6902
6597
  })]
6903
- }), /*#__PURE__*/jsxs("div", {
6904
- className: "flex flex-col gap-2",
6598
+ }), subStep === 1 && /*#__PURE__*/jsxs("div", {
6599
+ className: "flex flex-col gap-3",
6905
6600
  children: [/*#__PURE__*/jsxs("label", {
6906
6601
  className: "flex items-center gap-2 text-sm font-semibold text-gray-300",
6907
6602
  children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
@@ -6992,9 +6687,24 @@ var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
6992
6687
  })
6993
6688
  }, item.id);
6994
6689
  })]
6690
+ }), /*#__PURE__*/jsx("div", {
6691
+ className: "flex justify-end mt-2",
6692
+ children: /*#__PURE__*/jsx(Button, {
6693
+ onClick: function onClick() {
6694
+ return setSubStep(2);
6695
+ },
6696
+ title: "Next",
6697
+ textSize: "text-sm",
6698
+ padding: "py-1.5 px-4",
6699
+ backgroundColor: "bg-blue-600",
6700
+ textColor: "text-white",
6701
+ hoverTextColor: "hover:text-white",
6702
+ hoverBackgroundColor: "hover:bg-blue-500",
6703
+ icon: "arrow-right"
6704
+ })
6995
6705
  })]
6996
- }), /*#__PURE__*/jsxs("div", {
6997
- className: "flex flex-col gap-2",
6706
+ }), subStep === 2 && /*#__PURE__*/jsxs("div", {
6707
+ className: "flex flex-col gap-3",
6998
6708
  children: [/*#__PURE__*/jsxs("label", {
6999
6709
  className: "flex items-center gap-2 text-sm font-semibold text-gray-300",
7000
6710
  children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
@@ -7141,12 +6851,202 @@ var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
7141
6851
  });
7142
6852
  };
7143
6853
 
6854
+ function ownKeys$A(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; }
6855
+ function _objectSpread$A(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$A(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$A(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
6856
+ var TOTAL_STEPS = 2; // Steps 0-1: Discover, Customize
6857
+
6858
+ var initialState = {
6859
+ step: 0,
6860
+ filters: {
6861
+ categories: [],
6862
+ providers: [],
6863
+ query: ""
6864
+ },
6865
+ selectedWidgets: [],
6866
+ selectedDashboard: null,
6867
+ layout: {
6868
+ templateKey: null,
6869
+ widgetOrder: []
6870
+ },
6871
+ customization: {
6872
+ name: "",
6873
+ menuId: null,
6874
+ theme: null
6875
+ },
6876
+ path: null
6877
+ };
6878
+ function wizardReducer(state, action) {
6879
+ switch (action.type) {
6880
+ case "SET_STEP":
6881
+ return _objectSpread$A(_objectSpread$A({}, state), {}, {
6882
+ step: action.payload
6883
+ });
6884
+ case "SET_FILTERS":
6885
+ return _objectSpread$A(_objectSpread$A({}, state), {}, {
6886
+ filters: _objectSpread$A(_objectSpread$A({}, state.filters), action.payload)
6887
+ });
6888
+ case "TOGGLE_FILTER_CATEGORY":
6889
+ {
6890
+ var categories = state.filters.categories.includes(action.payload) ? state.filters.categories.filter(function (c) {
6891
+ return c !== action.payload;
6892
+ }) : [].concat(_toConsumableArray(state.filters.categories), [action.payload]);
6893
+ return _objectSpread$A(_objectSpread$A({}, state), {}, {
6894
+ filters: _objectSpread$A(_objectSpread$A({}, state.filters), {}, {
6895
+ categories: categories
6896
+ })
6897
+ });
6898
+ }
6899
+ case "TOGGLE_FILTER_PROVIDER":
6900
+ {
6901
+ var providers = state.filters.providers.includes(action.payload) ? state.filters.providers.filter(function (p) {
6902
+ return p !== action.payload;
6903
+ }) : [].concat(_toConsumableArray(state.filters.providers), [action.payload]);
6904
+ return _objectSpread$A(_objectSpread$A({}, state), {}, {
6905
+ filters: _objectSpread$A(_objectSpread$A({}, state.filters), {}, {
6906
+ providers: providers
6907
+ })
6908
+ });
6909
+ }
6910
+ case "SET_SEARCH_QUERY":
6911
+ return _objectSpread$A(_objectSpread$A({}, state), {}, {
6912
+ filters: _objectSpread$A(_objectSpread$A({}, state.filters), {}, {
6913
+ query: action.payload
6914
+ })
6915
+ });
6916
+ case "SET_SELECTED_WIDGETS":
6917
+ {
6918
+ var templateKey = widgetCountToTemplate(action.payload.length);
6919
+ var widgetOrder = action.payload.map(function (w) {
6920
+ return w.name || w.key;
6921
+ });
6922
+ return _objectSpread$A(_objectSpread$A({}, state), {}, {
6923
+ selectedWidgets: action.payload,
6924
+ layout: {
6925
+ templateKey: templateKey,
6926
+ widgetOrder: widgetOrder
6927
+ }
6928
+ });
6929
+ }
6930
+ case "TOGGLE_WIDGET":
6931
+ {
6932
+ var exists = state.selectedWidgets.some(function (w) {
6933
+ return w.name === action.payload.name;
6934
+ });
6935
+ var selectedWidgets = exists ? state.selectedWidgets.filter(function (w) {
6936
+ return w.name !== action.payload.name;
6937
+ }) : [].concat(_toConsumableArray(state.selectedWidgets), [action.payload]);
6938
+ var toggleTemplateKey = widgetCountToTemplate(selectedWidgets.length);
6939
+ var toggleWidgetOrder = selectedWidgets.map(function (w) {
6940
+ return w.name || w.key;
6941
+ });
6942
+ return _objectSpread$A(_objectSpread$A({}, state), {}, {
6943
+ selectedWidgets: selectedWidgets,
6944
+ layout: {
6945
+ templateKey: toggleTemplateKey,
6946
+ widgetOrder: toggleWidgetOrder
6947
+ }
6948
+ });
6949
+ }
6950
+ case "SET_SELECTED_DASHBOARD":
6951
+ return _objectSpread$A(_objectSpread$A({}, state), {}, {
6952
+ selectedDashboard: action.payload
6953
+ });
6954
+ case "SET_PATH":
6955
+ return _objectSpread$A(_objectSpread$A({}, state), {}, {
6956
+ path: action.payload
6957
+ });
6958
+ case "SET_LAYOUT":
6959
+ return _objectSpread$A(_objectSpread$A({}, state), {}, {
6960
+ layout: action.payload
6961
+ });
6962
+ case "REORDER_WIDGETS":
6963
+ return _objectSpread$A(_objectSpread$A({}, state), {}, {
6964
+ layout: _objectSpread$A(_objectSpread$A({}, state.layout), {}, {
6965
+ widgetOrder: action.payload
6966
+ })
6967
+ });
6968
+ case "SET_CUSTOMIZATION":
6969
+ return _objectSpread$A(_objectSpread$A({}, state), {}, {
6970
+ customization: _objectSpread$A(_objectSpread$A({}, state.customization), action.payload)
6971
+ });
6972
+ case "RESET":
6973
+ return _objectSpread$A({}, initialState);
6974
+ default:
6975
+ return state;
6976
+ }
6977
+ }
6978
+ function widgetCountToTemplate(count) {
6979
+ if (count <= 1) return "single";
6980
+ if (count === 2) return "two-columns";
6981
+ if (count === 3) return "three-columns";
6982
+ if (count === 4) return "two-by-two";
6983
+ if (count <= 6) return "two-by-three";
6984
+ return "three-by-three";
6985
+ }
6986
+ function getCanProceed(state) {
6987
+ switch (state.step) {
6988
+ case 0:
6989
+ return state.selectedDashboard !== null || state.selectedWidgets.length > 0;
6990
+ case 1:
6991
+ return state.customization.name.trim().length > 0;
6992
+ default:
6993
+ return false;
6994
+ }
6995
+ }
6996
+ var useWizardState = function useWizardState() {
6997
+ var _useReducer = useReducer(wizardReducer, initialState),
6998
+ _useReducer2 = _slicedToArray(_useReducer, 2),
6999
+ state = _useReducer2[0],
7000
+ dispatch = _useReducer2[1];
7001
+ var canProceed = useMemo(function () {
7002
+ return getCanProceed(state);
7003
+ }, [state]);
7004
+ var selectedCount = useMemo(function () {
7005
+ return state.selectedWidgets.length;
7006
+ }, [state.selectedWidgets]);
7007
+ var isPrebuiltPath = state.path === "prebuilt";
7008
+ var isCustomPath = state.path === "custom";
7009
+ var nextStep = useCallback(function () {
7010
+ if (getCanProceed(state) && state.step < TOTAL_STEPS - 1) {
7011
+ dispatch({
7012
+ type: "SET_STEP",
7013
+ payload: state.step + 1
7014
+ });
7015
+ }
7016
+ }, [state]);
7017
+ var prevStep = useCallback(function () {
7018
+ if (state.step > 0) {
7019
+ dispatch({
7020
+ type: "SET_STEP",
7021
+ payload: state.step - 1
7022
+ });
7023
+ }
7024
+ }, [state.step]);
7025
+ var goToStep = useCallback(function (n) {
7026
+ if (n >= 0 && n < TOTAL_STEPS) {
7027
+ dispatch({
7028
+ type: "SET_STEP",
7029
+ payload: n
7030
+ });
7031
+ }
7032
+ }, []);
7033
+ return {
7034
+ state: state,
7035
+ dispatch: dispatch,
7036
+ nextStep: nextStep,
7037
+ prevStep: prevStep,
7038
+ goToStep: goToStep,
7039
+ canProceed: canProceed,
7040
+ selectedCount: selectedCount,
7041
+ isPrebuiltPath: isPrebuiltPath,
7042
+ isCustomPath: isCustomPath,
7043
+ widgetCountToTemplate: widgetCountToTemplate
7044
+ };
7045
+ };
7046
+
7144
7047
  var STEP_LABELS = [{
7145
7048
  label: "Discover",
7146
7049
  description: "Search & select"
7147
- }, {
7148
- label: "Layout",
7149
- description: "Arrange your widgets"
7150
7050
  }, {
7151
7051
  label: "Customize",
7152
7052
  description: "Name, folder & theme"
@@ -7160,6 +7060,7 @@ var STEP_LABELS = [{
7160
7060
  * Resets wizard state cleanly on close.
7161
7061
  */
7162
7062
  var DashboardWizardModal = function DashboardWizardModal(_ref) {
7063
+ var _createHandlerRef$cur, _createHandlerRef$cur2;
7163
7064
  var open = _ref.open,
7164
7065
  setIsOpen = _ref.setIsOpen,
7165
7066
  _ref$menuItems = _ref.menuItems,
@@ -7175,14 +7076,13 @@ var DashboardWizardModal = function DashboardWizardModal(_ref) {
7175
7076
  _ref$onReloadWorkspac = _ref.onReloadWorkspaces,
7176
7077
  onReloadWorkspaces = _ref$onReloadWorkspac === void 0 ? null : _ref$onReloadWorkspac,
7177
7078
  appId = _ref.appId;
7079
+ var createHandlerRef = useRef(null);
7178
7080
  var _useWizardState = useWizardState(),
7179
7081
  state = _useWizardState.state,
7180
7082
  dispatch = _useWizardState.dispatch,
7181
7083
  nextStep = _useWizardState.nextStep,
7182
7084
  prevStep = _useWizardState.prevStep,
7183
- goToStep = _useWizardState.goToStep,
7184
- canProceed = _useWizardState.canProceed,
7185
- isPrebuiltPath = _useWizardState.isPrebuiltPath;
7085
+ canProceed = _useWizardState.canProceed;
7186
7086
 
7187
7087
  // Reset wizard state when modal opens
7188
7088
  useEffect(function () {
@@ -7198,30 +7098,16 @@ var DashboardWizardModal = function DashboardWizardModal(_ref) {
7198
7098
  var handleStepChange = useCallback(function (newStep) {
7199
7099
  // Stepper only allows going backwards; forward is via Next button
7200
7100
  if (newStep < state.step) {
7201
- goToStep(newStep);
7101
+ prevStep();
7202
7102
  }
7203
- }, [state.step, goToStep]);
7204
-
7205
- // Skip layout step for prebuilt path
7103
+ }, [state.step, prevStep]);
7206
7104
  var handleNext = useCallback(function () {
7207
7105
  if (!canProceed) return;
7208
- if (state.step === 0 && isPrebuiltPath) {
7209
- // Skip layout step (1), go straight to customize (2)
7210
- goToStep(2);
7211
- } else {
7212
- nextStep();
7213
- }
7214
- }, [canProceed, state.step, isPrebuiltPath, goToStep, nextStep]);
7215
- var handleBack = useCallback(function () {
7216
- if (state.step === 2 && isPrebuiltPath) {
7217
- // Skip back over layout step (1), go to discover (0)
7218
- goToStep(0);
7219
- } else {
7220
- prevStep();
7221
- }
7222
- }, [state.step, isPrebuiltPath, goToStep, prevStep]);
7223
- var isLastStep = state.step === 2;
7224
- state.step === 2 && state._created;
7106
+ nextStep();
7107
+ }, [canProceed, nextStep]);
7108
+ var isLastStep = state.step === 1;
7109
+ var isCreating = (_createHandlerRef$cur = (_createHandlerRef$cur2 = createHandlerRef.current) === null || _createHandlerRef$cur2 === void 0 ? void 0 : _createHandlerRef$cur2.creating) !== null && _createHandlerRef$cur !== void 0 ? _createHandlerRef$cur : false;
7110
+ var canCreate = canProceed && !isCreating;
7225
7111
  return /*#__PURE__*/jsx(Modal, {
7226
7112
  isOpen: open,
7227
7113
  setIsOpen: setIsOpen,
@@ -7271,16 +7157,6 @@ var DashboardWizardModal = function DashboardWizardModal(_ref) {
7271
7157
  }), /*#__PURE__*/jsx(Stepper.Step, {
7272
7158
  label: STEP_LABELS[1].label,
7273
7159
  description: STEP_LABELS[1].description,
7274
- children: /*#__PURE__*/jsx("div", {
7275
- className: "flex-1 min-h-0 overflow-y-auto",
7276
- children: /*#__PURE__*/jsx(WizardLayoutPreviewStep, {
7277
- state: state,
7278
- dispatch: dispatch
7279
- })
7280
- })
7281
- }), /*#__PURE__*/jsx(Stepper.Step, {
7282
- label: STEP_LABELS[2].label,
7283
- description: STEP_LABELS[2].description,
7284
7160
  children: /*#__PURE__*/jsx("div", {
7285
7161
  className: "flex-1 min-h-0 overflow-y-auto",
7286
7162
  children: /*#__PURE__*/jsx(WizardCustomizeStep, {
@@ -7295,14 +7171,15 @@ var DashboardWizardModal = function DashboardWizardModal(_ref) {
7295
7171
  if (_onOpenDashboard) _onOpenDashboard(ws);
7296
7172
  if (onReloadWorkspaces) onReloadWorkspaces();
7297
7173
  },
7298
- appId: appId
7174
+ appId: appId,
7175
+ createHandlerRef: createHandlerRef
7299
7176
  })
7300
7177
  })
7301
7178
  })]
7302
7179
  }), /*#__PURE__*/jsxs("div", {
7303
7180
  className: "flex flex-row justify-between items-center pt-4 mt-4 border-t border-gray-700/50",
7304
7181
  children: [/*#__PURE__*/jsx(Button, {
7305
- onClick: state.step === 0 ? handleClose : handleBack,
7182
+ onClick: state.step === 0 ? handleClose : prevStep,
7306
7183
  title: state.step === 0 ? "Cancel" : "Back",
7307
7184
  textSize: "text-sm",
7308
7185
  padding: "py-2 px-4",
@@ -7313,7 +7190,21 @@ var DashboardWizardModal = function DashboardWizardModal(_ref) {
7313
7190
  }), /*#__PURE__*/jsxs("span", {
7314
7191
  className: "text-xs text-gray-500",
7315
7192
  children: ["Step ", state.step + 1, " of ", STEP_LABELS.length]
7316
- }), !isLastStep ? /*#__PURE__*/jsx(Button, {
7193
+ }), isLastStep ? /*#__PURE__*/jsx(Button, {
7194
+ onClick: function onClick() {
7195
+ var _createHandlerRef$cur3, _createHandlerRef$cur4;
7196
+ return (_createHandlerRef$cur3 = createHandlerRef.current) === null || _createHandlerRef$cur3 === void 0 || (_createHandlerRef$cur4 = _createHandlerRef$cur3.handleCreate) === null || _createHandlerRef$cur4 === void 0 ? void 0 : _createHandlerRef$cur4.call(_createHandlerRef$cur3);
7197
+ },
7198
+ title: isCreating ? "Creating..." : "Create Dashboard",
7199
+ textSize: "text-sm",
7200
+ padding: "py-2 px-4",
7201
+ backgroundColor: canCreate ? "bg-green-600" : "bg-gray-700",
7202
+ textColor: canCreate ? "text-white" : "text-gray-500",
7203
+ hoverTextColor: canCreate ? "hover:text-white" : "hover:text-gray-500",
7204
+ hoverBackgroundColor: canCreate ? "hover:bg-green-500" : "hover:bg-gray-700",
7205
+ disabled: !canCreate,
7206
+ icon: isCreating ? "spinner" : "plus"
7207
+ }) : /*#__PURE__*/jsx(Button, {
7317
7208
  onClick: handleNext,
7318
7209
  title: "Next",
7319
7210
  textSize: "text-sm",
@@ -7324,7 +7215,7 @@ var DashboardWizardModal = function DashboardWizardModal(_ref) {
7324
7215
  hoverBackgroundColor: canProceed ? "hover:bg-blue-500" : "hover:bg-gray-700",
7325
7216
  disabled: !canProceed,
7326
7217
  icon: "arrow-right"
7327
- }) : /*#__PURE__*/jsx("div", {})]
7218
+ })]
7328
7219
  })]
7329
7220
  })]
7330
7221
  })
@@ -48215,6 +48106,10 @@ var DashboardStageInner = function DashboardStageInner(_ref2) {
48215
48106
  handleOpenTab(newWorkspace);
48216
48107
  setSidebarCollapsed(true);
48217
48108
  setPreviewMode(false);
48109
+ return {
48110
+ success: true,
48111
+ workspace: newWorkspace
48112
+ };
48218
48113
  } catch (e) {
48219
48114
  }
48220
48115
  }
@@ -50227,5 +50122,5 @@ var WorkspaceMenu = function WorkspaceMenu(_ref) {
50227
50122
 
50228
50123
  ComponentManager.registerContainerTypes(LayoutContainer, LayoutGridContainer);
50229
50124
 
50230
- 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, WizardLayoutPreviewStep, 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 };
50125
+ 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 };
50231
50126
  //# sourceMappingURL=index.esm.js.map