@trops/dash-core 0.1.196 → 0.1.197

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, SelectableCard, Tabs3, 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, Tag2, Tag3, ButtonIcon3, DashPanel, colorNames, shades, themeVariants, DataList, Checkbox, StatCard, Card, Tabs, Accordion, Alert, Toast, ProgressBar, Toggle, Breadcrumbs, Card2, Tabs2, Accordion2, Alert2, Toast2, ProgressBar2, Toggle2, Breadcrumbs2, Card3, 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, 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, Tag2, Tag3, ButtonIcon3, DashPanel, colorNames, shades, themeVariants, Tabs3, DataList, Checkbox, StatCard, Card, Tabs, Accordion, Alert, Toast, ProgressBar, Toggle, Breadcrumbs, Card2, Tabs2, Accordion2, Alert2, Toast2, ProgressBar2, Toggle2, Breadcrumbs2, Card3, 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';
@@ -5256,192 +5256,6 @@ var LayoutQuickAddMenu = function LayoutQuickAddMenu(_ref) {
5256
5256
  });
5257
5257
  };
5258
5258
 
5259
- var CATEGORIES = [{
5260
- key: "reporting",
5261
- label: "Reporting",
5262
- icon: "chart-bar",
5263
- description: "Dashboards for data visualization and reports"
5264
- }, {
5265
- key: "monitoring",
5266
- label: "Monitoring",
5267
- icon: "heart-pulse",
5268
- description: "System health, uptime, and performance monitoring"
5269
- }, {
5270
- key: "productivity",
5271
- label: "Productivity",
5272
- icon: "list-check",
5273
- description: "Task tracking, calendars, and workflow management"
5274
- }, {
5275
- key: "development",
5276
- label: "Development",
5277
- icon: "code",
5278
- description: "Code repos, CI/CD, and developer tools"
5279
- }, {
5280
- key: "communication",
5281
- label: "Communication",
5282
- icon: "comments",
5283
- description: "Messages, channels, and team communication"
5284
- }, {
5285
- key: "custom",
5286
- label: "Custom",
5287
- icon: "grid-2",
5288
- description: "Build a fully custom dashboard"
5289
- }];
5290
-
5291
- /**
5292
- * WizardIntentStep
5293
- *
5294
- * Step 0 of the Dashboard Wizard. Presents category cards so the user
5295
- * can indicate what kind of dashboard they want to build.
5296
- * Multi-select — user can pick multiple categories.
5297
- *
5298
- * @param {Object} props
5299
- * @param {Object} props.state - Wizard state from useWizardState
5300
- * @param {Function} props.dispatch - Wizard dispatch from useWizardState
5301
- */
5302
- var WizardIntentStep = function WizardIntentStep(_ref) {
5303
- var state = _ref.state,
5304
- dispatch = _ref.dispatch;
5305
- var handleToggle = function handleToggle(key) {
5306
- dispatch({
5307
- type: "TOGGLE_INTENT",
5308
- payload: key
5309
- });
5310
- };
5311
- return /*#__PURE__*/jsxs("div", {
5312
- className: "wizard-intent-step",
5313
- children: [/*#__PURE__*/jsx("h3", {
5314
- className: "wizard-step-header",
5315
- children: "What is this dashboard for?"
5316
- }), /*#__PURE__*/jsx("div", {
5317
- className: "wizard-card-grid",
5318
- children: CATEGORIES.map(function (cat) {
5319
- return /*#__PURE__*/jsx(SelectableCard, {
5320
- icon: /*#__PURE__*/jsx(FontAwesomeIcon, {
5321
- icon: cat.icon,
5322
- fixedWidth: true
5323
- }),
5324
- label: cat.label,
5325
- description: cat.description,
5326
- selected: state.intent.includes(cat.key),
5327
- onSelect: function onSelect() {
5328
- return handleToggle(cat.key);
5329
- }
5330
- }, cat.key);
5331
- })
5332
- })]
5333
- });
5334
- };
5335
-
5336
- var FALLBACK = "puzzle-piece";
5337
-
5338
- /**
5339
- * Resolve an icon name to a valid FontAwesome icon reference.
5340
- * Tries solid (fas) first, then brand (fab). Returns "puzzle-piece" if
5341
- * the icon is falsy or not found in either prefix.
5342
- */
5343
- var resolveIcon = function resolveIcon(iconName) {
5344
- if (!iconName) return FALLBACK;
5345
-
5346
- // Already an array tuple like ["fab", "github"] — pass through
5347
- if (Array.isArray(iconName)) return iconName;
5348
-
5349
- // Try solid
5350
- if (findIconDefinition({
5351
- prefix: "fas",
5352
- iconName: iconName
5353
- })) return iconName;
5354
-
5355
- // Try brand
5356
- if (findIconDefinition({
5357
- prefix: "fab",
5358
- iconName: iconName
5359
- })) return ["fab", iconName];
5360
- return FALLBACK;
5361
- };
5362
-
5363
- var WizardProvidersStep = function WizardProvidersStep(_ref) {
5364
- var state = _ref.state,
5365
- dispatch = _ref.dispatch;
5366
- var _useContext = useContext(AppContext),
5367
- providersMap = _useContext.providers;
5368
- var providerList = useMemo(function () {
5369
- if (!providersMap || _typeof(providersMap) !== "object") return [];
5370
- return Object.values(providersMap).map(function (p) {
5371
- return {
5372
- key: p.type || p.name,
5373
- name: p.name,
5374
- type: p.type,
5375
- icon: p.icon || p.type,
5376
- configured: !!(p.credentials && Object.keys(p.credentials).length > 0)
5377
- };
5378
- });
5379
- }, [providersMap]);
5380
-
5381
- // Pre-check configured providers on first render
5382
- React__default.useEffect(function () {
5383
- if (state.providers.length === 0 && providerList.length > 0) {
5384
- var configuredKeys = providerList.filter(function (p) {
5385
- return p.configured;
5386
- }).map(function (p) {
5387
- return p.key;
5388
- });
5389
- if (configuredKeys.length > 0) {
5390
- dispatch({
5391
- type: "SET_PROVIDERS",
5392
- payload: configuredKeys
5393
- });
5394
- }
5395
- }
5396
- }, [providerList, state.providers.length, dispatch]);
5397
- var handleToggle = function handleToggle(key) {
5398
- dispatch({
5399
- type: "TOGGLE_PROVIDER",
5400
- payload: key
5401
- });
5402
- };
5403
- if (providerList.length === 0) {
5404
- return /*#__PURE__*/jsxs("div", {
5405
- className: "wizard-providers-step",
5406
- children: [/*#__PURE__*/jsx("h3", {
5407
- className: "wizard-step-header",
5408
- children: "Which tools and services do you use?"
5409
- }), /*#__PURE__*/jsx("p", {
5410
- className: "wizard-empty-message",
5411
- children: "No providers configured yet. Add providers in Settings first."
5412
- })]
5413
- });
5414
- }
5415
- return /*#__PURE__*/jsxs("div", {
5416
- className: "wizard-providers-step",
5417
- children: [/*#__PURE__*/jsx("h3", {
5418
- className: "wizard-step-header",
5419
- children: "Which tools and services do you use?"
5420
- }), /*#__PURE__*/jsx("div", {
5421
- className: "wizard-card-grid",
5422
- children: providerList.map(function (provider) {
5423
- var isSelected = state.providers.includes(provider.key);
5424
- var needsSetup = isSelected && !provider.configured;
5425
- return /*#__PURE__*/jsx(SelectableCard, {
5426
- icon: /*#__PURE__*/jsx(FontAwesomeIcon, {
5427
- icon: resolveIcon(provider.icon),
5428
- fixedWidth: true
5429
- }),
5430
- label: provider.name,
5431
- description: needsSetup ? /*#__PURE__*/jsx("span", {
5432
- className: "wizard-needs-setup-badge",
5433
- children: "Needs setup"
5434
- }) : null,
5435
- selected: isSelected,
5436
- onSelect: function onSelect() {
5437
- return handleToggle(provider.key);
5438
- }
5439
- }, provider.key);
5440
- })
5441
- })]
5442
- });
5443
- };
5444
-
5445
5259
  function _createForOfIteratorHelper$e(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$e(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; } } }; }
5446
5260
  function _unsupportedIterableToArray$e(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$e(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$e(r, a) : void 0; } }
5447
5261
  function _arrayLikeToArray$e(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; }
@@ -5729,372 +5543,408 @@ var useRegistrySearch = function useRegistrySearch() {
5729
5543
  };
5730
5544
  };
5731
5545
 
5732
- var WizardResultsStep = function WizardResultsStep(_ref) {
5546
+ var FALLBACK = "puzzle-piece";
5547
+
5548
+ /**
5549
+ * Resolve an icon name to a valid FontAwesome icon reference.
5550
+ * Tries solid (fas) first, then brand (fab). Returns "puzzle-piece" if
5551
+ * the icon is falsy or not found in either prefix.
5552
+ */
5553
+ var resolveIcon = function resolveIcon(iconName) {
5554
+ if (!iconName) return FALLBACK;
5555
+
5556
+ // Already an array tuple like ["fab", "github"] — pass through
5557
+ if (Array.isArray(iconName)) return iconName;
5558
+
5559
+ // Try solid
5560
+ if (findIconDefinition({
5561
+ prefix: "fas",
5562
+ iconName: iconName
5563
+ })) return iconName;
5564
+
5565
+ // Try brand
5566
+ if (findIconDefinition({
5567
+ prefix: "fab",
5568
+ iconName: iconName
5569
+ })) return ["fab", iconName];
5570
+ return FALLBACK;
5571
+ };
5572
+
5573
+ var DASHBOARD_TAGS$1 = ["productivity", "monitoring", "analytics", "communication", "developer", "sales", "marketing", "finance", "project-management", "social", "news", "utilities"];
5574
+
5575
+ var KNOWN_PROVIDERS = [{
5576
+ key: "google-drive",
5577
+ name: "Google Drive"
5578
+ }, {
5579
+ key: "slack",
5580
+ name: "Slack"
5581
+ }, {
5582
+ key: "github",
5583
+ name: "GitHub"
5584
+ }, {
5585
+ key: "gmail",
5586
+ name: "Gmail"
5587
+ }, {
5588
+ key: "google-calendar",
5589
+ name: "Google Calendar"
5590
+ }, {
5591
+ key: "notion",
5592
+ name: "Notion"
5593
+ }, {
5594
+ key: "linear",
5595
+ name: "Linear"
5596
+ }, {
5597
+ key: "algolia",
5598
+ name: "Algolia"
5599
+ }, {
5600
+ key: "contentful",
5601
+ name: "Contentful"
5602
+ }, {
5603
+ key: "jira",
5604
+ name: "Jira"
5605
+ }, {
5606
+ key: "openai",
5607
+ name: "OpenAI"
5608
+ }, {
5609
+ key: "postgres",
5610
+ name: "PostgreSQL"
5611
+ }];
5612
+
5613
+ /**
5614
+ * WizardDiscoverStep
5615
+ *
5616
+ * Step 0 of the Dashboard Wizard. Combines search, category/provider
5617
+ * filter chips, and results (dashboards + widgets) in a single view.
5618
+ * Replaces the old Intent, Providers, and Results steps.
5619
+ *
5620
+ * - Selecting a dashboard sets path to "prebuilt" and clears widget selections.
5621
+ * - Selecting widgets sets path to "custom" and clears dashboard selection.
5622
+ *
5623
+ * @param {Object} props
5624
+ * @param {Object} props.state - Wizard state from useWizardState
5625
+ * @param {Function} props.dispatch - Wizard dispatch from useWizardState
5626
+ */
5627
+ var WizardDiscoverStep = function WizardDiscoverStep(_ref) {
5733
5628
  var state = _ref.state,
5734
5629
  dispatch = _ref.dispatch;
5735
- var _useState = useState("prebuilt"),
5736
- _useState2 = _slicedToArray(_useState, 2),
5737
- activeTab = _useState2[0],
5738
- setActiveTab = _useState2[1];
5630
+ var filters = state.filters;
5739
5631
 
5740
- // --- Dashboard search (Tab A) ---
5741
- var _useState3 = useState([]),
5742
- _useState4 = _slicedToArray(_useState3, 2),
5743
- dashboards = _useState4[0],
5744
- setDashboards = _useState4[1];
5745
- var _useState5 = useState(false),
5746
- _useState6 = _slicedToArray(_useState5, 2),
5747
- dashLoading = _useState6[0],
5748
- setDashLoading = _useState6[1];
5749
- var _useState7 = useState(null),
5750
- _useState8 = _slicedToArray(_useState7, 2),
5751
- dashError = _useState8[0],
5752
- setDashError = _useState8[1];
5753
- var dashFilters = useMemo(function () {
5754
- return {
5755
- category: state.intent.length ? state.intent.join(",") : undefined,
5756
- providerTypes: state.providers.length ? state.providers : undefined
5757
- };
5758
- }, [state.intent, state.providers]);
5759
- var searchDashboards = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
5760
- var _window$mainApi;
5761
- var result, _t;
5762
- return _regeneratorRuntime.wrap(function (_context) {
5763
- while (1) switch (_context.prev = _context.next) {
5764
- case 0:
5765
- if ((_window$mainApi = window.mainApi) !== null && _window$mainApi !== void 0 && (_window$mainApi = _window$mainApi.registry) !== null && _window$mainApi !== void 0 && _window$mainApi.searchDashboards) {
5766
- _context.next = 1;
5767
- break;
5768
- }
5769
- setDashboards([]);
5770
- return _context.abrupt("return");
5771
- case 1:
5772
- setDashLoading(true);
5773
- setDashError(null);
5774
- _context.prev = 2;
5775
- _context.next = 3;
5776
- return window.mainApi.registry.searchDashboards("", dashFilters);
5777
- case 3:
5778
- result = _context.sent;
5779
- setDashboards(result.packages || []);
5780
- _context.next = 5;
5781
- break;
5782
- case 4:
5783
- _context.prev = 4;
5784
- _t = _context["catch"](2);
5785
- setDashError(_t.message || "Failed to search dashboards");
5786
- setDashboards([]);
5787
- case 5:
5788
- _context.prev = 5;
5789
- setDashLoading(false);
5790
- return _context.finish(5);
5791
- case 6:
5792
- case "end":
5793
- return _context.stop();
5794
- }
5795
- }, _callee, null, [[2, 4, 5, 6]]);
5796
- })), [dashFilters]);
5797
- useEffect(function () {
5798
- searchDashboards();
5799
- }, [searchDashboards]);
5800
-
5801
- // --- Widget search (Tab B) ---
5632
+ // --- Registry search ---
5802
5633
  var _useRegistrySearch = useRegistrySearch({
5803
5634
  filterByCapabilities: true
5804
5635
  }),
5636
+ packages = _useRegistrySearch.packages,
5805
5637
  flatWidgets = _useRegistrySearch.flatWidgets,
5806
- widgetsLoading = _useRegistrySearch.isLoading,
5807
- widgetsError = _useRegistrySearch.error;
5808
-
5809
- // Filter widgets by selected categories + providers
5810
- var filteredWidgets = useMemo(function () {
5811
- return flatWidgets.filter(function (w) {
5812
- // Category filter: match if widget's category overlaps user intent
5813
- var catMatch = state.intent.length === 0 || state.intent.some(function (cat) {
5814
- return (w.packageCategory || "").toLowerCase() === cat.toLowerCase();
5815
- });
5816
-
5817
- // Provider filter: match if widget requires any of the selected providers
5818
- var providerMatch = state.providers.length === 0 || (w.providers || []).some(function (p) {
5819
- return state.providers.includes(p.type);
5820
- }) || (w.packageProviders || []).some(function (p) {
5821
- return state.providers.includes(p.type);
5822
- });
5823
- return catMatch && providerMatch;
5824
- });
5825
- }, [flatWidgets, state.intent, state.providers]);
5638
+ isLoading = _useRegistrySearch.isLoading,
5639
+ error = _useRegistrySearch.error,
5640
+ searchQuery = _useRegistrySearch.searchQuery,
5641
+ setSearchQuery = _useRegistrySearch.setSearchQuery;
5826
5642
 
5827
- // --- Tab change: set wizard path ---
5828
- var handleTabChange = useCallback(function (tab) {
5829
- setActiveTab(tab);
5643
+ // Sync search query from wizard state on mount
5644
+ useEffect(function () {
5645
+ if (filters.query) {
5646
+ setSearchQuery(filters.query);
5647
+ }
5648
+ // eslint-disable-next-line react-hooks/exhaustive-deps
5649
+ }, []);
5650
+ var handleSearchChange = useCallback(function (e) {
5651
+ var q = e.target.value;
5652
+ setSearchQuery(q);
5830
5653
  dispatch({
5831
- type: "SET_PATH",
5832
- payload: tab === "prebuilt" ? "prebuilt" : "custom"
5654
+ type: "SET_SEARCH_QUERY",
5655
+ payload: q
5833
5656
  });
5834
- }, [dispatch]);
5657
+ }, [setSearchQuery, dispatch]);
5835
5658
 
5836
- // Set initial path on mount
5837
- useEffect(function () {
5838
- if (!state.path) {
5839
- dispatch({
5840
- type: "SET_PATH",
5841
- payload: "prebuilt"
5842
- });
5843
- }
5844
- }, [state.path, dispatch]);
5659
+ // --- Client-side category + provider filtering ---
5660
+ var filteredDashboards = useMemo(function () {
5661
+ var dashPkgs = packages.filter(function (pkg) {
5662
+ return (pkg.type || "").toLowerCase() === "dashboard";
5663
+ });
5664
+ return applyFilters(dashPkgs, filters, "package");
5665
+ }, [packages, filters]);
5666
+ var filteredWidgets = useMemo(function () {
5667
+ return applyFilters(flatWidgets, filters, "widget");
5668
+ }, [flatWidgets, filters]);
5845
5669
 
5846
- // --- Dashboard selection (single-select) ---
5670
+ // --- Selection handlers ---
5847
5671
  var handleSelectDashboard = useCallback(function (dashboard) {
5848
5672
  dispatch({
5849
5673
  type: "SET_SELECTED_DASHBOARD",
5850
5674
  payload: dashboard
5851
5675
  });
5676
+ dispatch({
5677
+ type: "SET_SELECTED_WIDGETS",
5678
+ payload: []
5679
+ });
5680
+ dispatch({
5681
+ type: "SET_PATH",
5682
+ payload: "prebuilt"
5683
+ });
5852
5684
  }, [dispatch]);
5853
-
5854
- // --- Widget selection (multi-select) ---
5855
5685
  var handleToggleWidget = useCallback(function (widget) {
5856
5686
  dispatch({
5857
5687
  type: "TOGGLE_WIDGET",
5858
5688
  payload: widget
5859
5689
  });
5690
+ dispatch({
5691
+ type: "SET_SELECTED_DASHBOARD",
5692
+ payload: null
5693
+ });
5694
+ dispatch({
5695
+ type: "SET_PATH",
5696
+ payload: "custom"
5697
+ });
5860
5698
  }, [dispatch]);
5861
5699
  var isWidgetSelected = useCallback(function (widget) {
5862
5700
  return state.selectedWidgets.some(function (w) {
5863
5701
  return w.name === widget.name;
5864
5702
  });
5865
5703
  }, [state.selectedWidgets]);
5866
- return /*#__PURE__*/jsxs("div", {
5867
- className: "wizard-results-step",
5868
- children: [/*#__PURE__*/jsx("h3", {
5869
- className: "wizard-step-header",
5870
- children: "Choose your starting point"
5871
- }), /*#__PURE__*/jsxs(Tabs3, {
5872
- value: activeTab,
5873
- onValueChange: handleTabChange,
5874
- className: "wizard-results-tabs",
5875
- children: [/*#__PURE__*/jsxs(Tabs3.List, {
5876
- className: "wizard-results-tab-list",
5877
- children: [/*#__PURE__*/jsx(Tabs3.Trigger, {
5878
- value: "prebuilt",
5879
- children: "Pre-built Dashboards"
5880
- }), /*#__PURE__*/jsxs(Tabs3.Trigger, {
5881
- value: "custom",
5882
- children: ["Build Your Own", state.selectedWidgets.length > 0 && /*#__PURE__*/jsx("span", {
5883
- className: "wizard-count-badge",
5884
- children: state.selectedWidgets.length
5885
- })]
5886
- })]
5887
- }), /*#__PURE__*/jsx(Tabs3.Content, {
5888
- value: "prebuilt",
5889
- children: /*#__PURE__*/jsx(DashboardList, {
5890
- dashboards: dashboards,
5891
- isLoading: dashLoading,
5892
- error: dashError,
5893
- selectedDashboard: state.selectedDashboard,
5894
- onSelect: handleSelectDashboard
5895
- })
5896
- }), /*#__PURE__*/jsx(Tabs3.Content, {
5897
- value: "custom",
5898
- children: /*#__PURE__*/jsx(WidgetList, {
5899
- widgets: filteredWidgets,
5900
- isLoading: widgetsLoading,
5901
- error: widgetsError,
5902
- isSelected: isWidgetSelected,
5903
- onToggle: handleToggleWidget,
5904
- selectedCount: state.selectedWidgets.length
5905
- })
5906
- })]
5907
- })]
5908
- });
5909
- };
5910
-
5911
- // --- Sub-components ---
5912
5704
 
5913
- var DashboardList = function DashboardList(_ref3) {
5914
- var dashboards = _ref3.dashboards,
5915
- isLoading = _ref3.isLoading,
5916
- error = _ref3.error,
5917
- selectedDashboard = _ref3.selectedDashboard,
5918
- onSelect = _ref3.onSelect;
5919
- if (isLoading) {
5920
- return /*#__PURE__*/jsxs("div", {
5921
- className: "wizard-loading",
5922
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
5923
- icon: "spinner",
5924
- spin: true,
5925
- fixedWidth: true,
5926
- className: "wizard-loading-icon"
5927
- }), /*#__PURE__*/jsx("span", {
5928
- children: "Searching dashboards..."
5929
- })]
5930
- });
5931
- }
5932
- if (error) {
5933
- return /*#__PURE__*/jsxs("div", {
5934
- className: "wizard-error",
5935
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
5936
- icon: "circle-exclamation",
5937
- fixedWidth: true
5938
- }), /*#__PURE__*/jsx("span", {
5939
- children: error
5940
- })]
5941
- });
5942
- }
5943
- if (dashboards.length === 0) {
5944
- return /*#__PURE__*/jsxs("div", {
5945
- className: "wizard-empty",
5946
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
5947
- icon: "box-open",
5948
- fixedWidth: true,
5949
- className: "wizard-empty-icon"
5950
- }), /*#__PURE__*/jsx("p", {
5951
- children: "No pre-built dashboards match your selections."
5952
- }), /*#__PURE__*/jsx("p", {
5953
- className: "wizard-empty-hint",
5954
- children: "Try the \"Build Your Own\" tab to pick individual widgets."
5955
- })]
5956
- });
5957
- }
5958
- return /*#__PURE__*/jsx("div", {
5959
- className: "wizard-dashboard-list",
5960
- children: dashboards.map(function (dash) {
5961
- var isSelected = selectedDashboard && selectedDashboard.name === dash.name;
5962
- var widgetCount = (dash.widgets || []).length;
5963
- var providerNames = (dash.providers || []).map(function (p) {
5964
- return p.name || p.type;
5965
- }).join(", ");
5966
- return /*#__PURE__*/jsxs("button", {
5967
- type: "button",
5968
- className: "wizard-dashboard-card ".concat(isSelected ? "wizard-dashboard-card--selected" : ""),
5969
- onClick: function onClick() {
5970
- return onSelect(dash);
5971
- },
5972
- children: [/*#__PURE__*/jsxs("div", {
5973
- className: "wizard-dashboard-card-header",
5974
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
5975
- icon: resolveIcon(dash.icon || "grid-2"),
5976
- fixedWidth: true,
5977
- className: "wizard-dashboard-card-icon"
5978
- }), /*#__PURE__*/jsx("span", {
5979
- className: "wizard-dashboard-card-name",
5980
- children: dash.displayName || dash.name
5981
- }), isSelected && /*#__PURE__*/jsx(FontAwesomeIcon, {
5982
- icon: "circle-check",
5983
- className: "wizard-dashboard-card-check"
5984
- })]
5985
- }), dash.description && /*#__PURE__*/jsx("p", {
5986
- className: "wizard-dashboard-card-desc",
5987
- children: dash.description
5988
- }), /*#__PURE__*/jsxs("div", {
5989
- className: "wizard-dashboard-card-meta",
5990
- children: [/*#__PURE__*/jsxs("span", {
5991
- children: [widgetCount, " widget", widgetCount !== 1 ? "s" : ""]
5992
- }), providerNames && /*#__PURE__*/jsx("span", {
5993
- children: providerNames
5994
- })]
5995
- })]
5996
- }, dash.name);
5997
- })
5998
- });
5999
- };
6000
- var WidgetList = function WidgetList(_ref4) {
6001
- var widgets = _ref4.widgets,
6002
- isLoading = _ref4.isLoading,
6003
- error = _ref4.error,
6004
- isSelected = _ref4.isSelected,
6005
- onToggle = _ref4.onToggle,
6006
- selectedCount = _ref4.selectedCount;
6007
- if (isLoading) {
6008
- return /*#__PURE__*/jsxs("div", {
6009
- className: "wizard-loading",
6010
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
6011
- icon: "spinner",
6012
- spin: true,
6013
- fixedWidth: true,
6014
- className: "wizard-loading-icon"
6015
- }), /*#__PURE__*/jsx("span", {
6016
- children: "Searching widgets..."
6017
- })]
6018
- });
6019
- }
6020
- if (error) {
6021
- return /*#__PURE__*/jsxs("div", {
6022
- className: "wizard-error",
6023
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
6024
- icon: "circle-exclamation",
6025
- fixedWidth: true
6026
- }), /*#__PURE__*/jsx("span", {
6027
- children: error
6028
- })]
5705
+ // --- Filter chip handlers ---
5706
+ var handleToggleCategory = useCallback(function (cat) {
5707
+ return dispatch({
5708
+ type: "TOGGLE_FILTER_CATEGORY",
5709
+ payload: cat
6029
5710
  });
6030
- }
6031
- if (widgets.length === 0) {
6032
- return /*#__PURE__*/jsxs("div", {
6033
- className: "wizard-empty",
6034
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
6035
- icon: "puzzle-piece",
6036
- fixedWidth: true,
6037
- className: "wizard-empty-icon"
6038
- }), /*#__PURE__*/jsx("p", {
6039
- children: "No widgets match your selections."
6040
- }), /*#__PURE__*/jsx("p", {
6041
- className: "wizard-empty-hint",
6042
- children: "Try adjusting your categories or providers in the previous steps."
6043
- })]
5711
+ }, [dispatch]);
5712
+ var handleToggleProvider = useCallback(function (prov) {
5713
+ return dispatch({
5714
+ type: "TOGGLE_FILTER_PROVIDER",
5715
+ payload: prov
6044
5716
  });
6045
- }
5717
+ }, [dispatch]);
5718
+ var hasResults = filteredDashboards.length > 0 || filteredWidgets.length > 0;
5719
+ var hasActiveFilters = filters.categories.length > 0 || filters.providers.length > 0;
6046
5720
  return /*#__PURE__*/jsxs("div", {
6047
- className: "wizard-widget-list",
6048
- children: [selectedCount > 0 && /*#__PURE__*/jsxs("p", {
6049
- className: "wizard-widget-count",
6050
- children: [selectedCount, " widget", selectedCount !== 1 ? "s" : "", " selected"]
6051
- }), widgets.map(function (widget) {
6052
- var checked = isSelected(widget);
6053
- return /*#__PURE__*/jsxs("button", {
6054
- type: "button",
6055
- className: "wizard-widget-card ".concat(checked ? "wizard-widget-card--selected" : ""),
6056
- onClick: function onClick() {
6057
- return onToggle(widget);
6058
- },
6059
- children: [/*#__PURE__*/jsx("div", {
6060
- className: "wizard-widget-card-checkbox",
6061
- children: /*#__PURE__*/jsx(FontAwesomeIcon, {
6062
- icon: checked ? "square-check" : "square",
6063
- fixedWidth: true
5721
+ className: "wizard-discover-step",
5722
+ children: [/*#__PURE__*/jsx("div", {
5723
+ className: "wizard-discover-search",
5724
+ children: /*#__PURE__*/jsxs("div", {
5725
+ className: "wizard-discover-search-input",
5726
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
5727
+ icon: "magnifying-glass",
5728
+ fixedWidth: true,
5729
+ className: "wizard-discover-search-icon"
5730
+ }), /*#__PURE__*/jsx("input", {
5731
+ type: "text",
5732
+ placeholder: "Search registry...",
5733
+ value: searchQuery,
5734
+ onChange: handleSearchChange,
5735
+ className: "wizard-discover-input"
5736
+ })]
5737
+ })
5738
+ }), /*#__PURE__*/jsxs("div", {
5739
+ className: "wizard-discover-filters",
5740
+ children: [/*#__PURE__*/jsxs("div", {
5741
+ className: "wizard-discover-filter-row",
5742
+ children: [/*#__PURE__*/jsx("span", {
5743
+ className: "wizard-discover-filter-label",
5744
+ children: "Categories"
5745
+ }), /*#__PURE__*/jsx("div", {
5746
+ className: "wizard-discover-chips",
5747
+ children: DASHBOARD_TAGS$1.map(function (tag) {
5748
+ return /*#__PURE__*/jsx("button", {
5749
+ type: "button",
5750
+ className: "wizard-chip ".concat(filters.categories.includes(tag) ? "wizard-chip--active" : ""),
5751
+ onClick: function onClick() {
5752
+ return handleToggleCategory(tag);
5753
+ },
5754
+ children: tag
5755
+ }, tag);
6064
5756
  })
6065
- }), /*#__PURE__*/jsxs("div", {
6066
- className: "wizard-widget-card-info",
6067
- children: [/*#__PURE__*/jsxs("div", {
6068
- className: "wizard-widget-card-header",
6069
- children: [widget.icon && /*#__PURE__*/jsx(FontAwesomeIcon, {
6070
- icon: resolveIcon(widget.icon),
6071
- fixedWidth: true,
6072
- className: "wizard-widget-card-icon"
6073
- }), /*#__PURE__*/jsx("span", {
6074
- className: "wizard-widget-card-name",
6075
- children: widget.name
5757
+ })]
5758
+ }), /*#__PURE__*/jsxs("div", {
5759
+ className: "wizard-discover-filter-row",
5760
+ children: [/*#__PURE__*/jsx("span", {
5761
+ className: "wizard-discover-filter-label",
5762
+ children: "Providers"
5763
+ }), /*#__PURE__*/jsx("div", {
5764
+ className: "wizard-discover-chips",
5765
+ children: KNOWN_PROVIDERS.map(function (prov) {
5766
+ return /*#__PURE__*/jsx("button", {
5767
+ type: "button",
5768
+ className: "wizard-chip ".concat(filters.providers.includes(prov.key) ? "wizard-chip--active" : ""),
5769
+ onClick: function onClick() {
5770
+ return handleToggleProvider(prov.key);
5771
+ },
5772
+ children: prov.name
5773
+ }, prov.key);
5774
+ })
5775
+ })]
5776
+ })]
5777
+ }), /*#__PURE__*/jsx("div", {
5778
+ className: "wizard-discover-results",
5779
+ children: isLoading ? /*#__PURE__*/jsxs("div", {
5780
+ className: "wizard-loading",
5781
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
5782
+ icon: "spinner",
5783
+ spin: true,
5784
+ fixedWidth: true,
5785
+ className: "wizard-loading-icon"
5786
+ }), /*#__PURE__*/jsx("span", {
5787
+ children: "Searching registry..."
5788
+ })]
5789
+ }) : error ? /*#__PURE__*/jsxs("div", {
5790
+ className: "wizard-error",
5791
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
5792
+ icon: "circle-exclamation",
5793
+ fixedWidth: true
5794
+ }), /*#__PURE__*/jsx("span", {
5795
+ children: error
5796
+ })]
5797
+ }) : !hasResults ? /*#__PURE__*/jsxs("div", {
5798
+ className: "wizard-empty",
5799
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
5800
+ icon: "magnifying-glass",
5801
+ fixedWidth: true,
5802
+ className: "wizard-empty-icon"
5803
+ }), /*#__PURE__*/jsx("p", {
5804
+ children: "No results match your search."
5805
+ }), hasActiveFilters && /*#__PURE__*/jsx("p", {
5806
+ className: "wizard-empty-hint",
5807
+ children: "Try removing some filters to see more results."
5808
+ })]
5809
+ }) : /*#__PURE__*/jsxs(Fragment, {
5810
+ children: [filteredDashboards.length > 0 && /*#__PURE__*/jsxs("div", {
5811
+ className: "wizard-discover-section",
5812
+ children: [/*#__PURE__*/jsxs("h4", {
5813
+ className: "wizard-discover-section-title",
5814
+ children: ["Dashboards (", filteredDashboards.length, " result", filteredDashboards.length !== 1 ? "s" : "", ")"]
5815
+ }), /*#__PURE__*/jsx("div", {
5816
+ className: "wizard-dashboard-list",
5817
+ children: filteredDashboards.map(function (dash) {
5818
+ var isSelected = state.selectedDashboard && state.selectedDashboard.name === dash.name;
5819
+ var widgetCount = (dash.widgets || []).length;
5820
+ var providerNames = (dash.providers || []).map(function (p) {
5821
+ return p.name || p.type;
5822
+ }).join(", ");
5823
+ return /*#__PURE__*/jsxs("button", {
5824
+ type: "button",
5825
+ className: "wizard-dashboard-card ".concat(isSelected ? "wizard-dashboard-card--selected" : ""),
5826
+ onClick: function onClick() {
5827
+ return handleSelectDashboard(dash);
5828
+ },
5829
+ children: [/*#__PURE__*/jsxs("div", {
5830
+ className: "wizard-dashboard-card-header",
5831
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
5832
+ icon: resolveIcon(dash.icon || "grid-2"),
5833
+ fixedWidth: true,
5834
+ className: "wizard-dashboard-card-icon"
5835
+ }), /*#__PURE__*/jsx("span", {
5836
+ className: "wizard-dashboard-card-name",
5837
+ children: dash.displayName || dash.name
5838
+ }), isSelected && /*#__PURE__*/jsx(FontAwesomeIcon, {
5839
+ icon: "circle-check",
5840
+ className: "wizard-dashboard-card-check"
5841
+ })]
5842
+ }), dash.description && /*#__PURE__*/jsx("p", {
5843
+ className: "wizard-dashboard-card-desc",
5844
+ children: dash.description
5845
+ }), /*#__PURE__*/jsxs("div", {
5846
+ className: "wizard-dashboard-card-meta",
5847
+ children: [/*#__PURE__*/jsxs("span", {
5848
+ children: [widgetCount, " widget", widgetCount !== 1 ? "s" : ""]
5849
+ }), providerNames && /*#__PURE__*/jsx("span", {
5850
+ children: providerNames
5851
+ })]
5852
+ })]
5853
+ }, dash.name);
5854
+ })
5855
+ })]
5856
+ }), filteredWidgets.length > 0 && /*#__PURE__*/jsxs("div", {
5857
+ className: "wizard-discover-section",
5858
+ children: [/*#__PURE__*/jsxs("h4", {
5859
+ className: "wizard-discover-section-title",
5860
+ children: ["Widgets (", filteredWidgets.length, " result", filteredWidgets.length !== 1 ? "s" : "", ")", state.selectedWidgets.length > 0 && /*#__PURE__*/jsxs("span", {
5861
+ className: "wizard-count-badge",
5862
+ children: [state.selectedWidgets.length, " selected"]
6076
5863
  })]
6077
- }), widget.description && /*#__PURE__*/jsx("p", {
6078
- className: "wizard-widget-card-desc",
6079
- children: widget.description
6080
- }), widget.packageDisplayName && /*#__PURE__*/jsx("span", {
6081
- className: "wizard-widget-card-package",
6082
- children: widget.packageDisplayName
5864
+ }), /*#__PURE__*/jsx("div", {
5865
+ className: "wizard-widget-list",
5866
+ children: filteredWidgets.map(function (widget) {
5867
+ var checked = isWidgetSelected(widget);
5868
+ return /*#__PURE__*/jsxs("button", {
5869
+ type: "button",
5870
+ className: "wizard-widget-card ".concat(checked ? "wizard-widget-card--selected" : ""),
5871
+ onClick: function onClick() {
5872
+ return handleToggleWidget(widget);
5873
+ },
5874
+ children: [/*#__PURE__*/jsx("div", {
5875
+ className: "wizard-widget-card-checkbox",
5876
+ children: /*#__PURE__*/jsx(FontAwesomeIcon, {
5877
+ icon: checked ? "square-check" : "square",
5878
+ fixedWidth: true
5879
+ })
5880
+ }), /*#__PURE__*/jsxs("div", {
5881
+ className: "wizard-widget-card-info",
5882
+ children: [/*#__PURE__*/jsxs("div", {
5883
+ className: "wizard-widget-card-header",
5884
+ children: [widget.icon && /*#__PURE__*/jsx(FontAwesomeIcon, {
5885
+ icon: resolveIcon(widget.icon),
5886
+ fixedWidth: true,
5887
+ className: "wizard-widget-card-icon"
5888
+ }), /*#__PURE__*/jsx("span", {
5889
+ className: "wizard-widget-card-name",
5890
+ children: widget.name
5891
+ })]
5892
+ }), widget.description && /*#__PURE__*/jsx("p", {
5893
+ className: "wizard-widget-card-desc",
5894
+ children: widget.description
5895
+ }), widget.packageDisplayName && /*#__PURE__*/jsx("span", {
5896
+ className: "wizard-widget-card-package",
5897
+ children: widget.packageDisplayName
5898
+ })]
5899
+ })]
5900
+ }, widget.key);
5901
+ })
6083
5902
  })]
6084
5903
  })]
6085
- }, widget.key);
5904
+ })
6086
5905
  })]
6087
5906
  });
6088
5907
  };
6089
5908
 
5909
+ // --- Helpers ---
5910
+
5911
+ function applyFilters(items, filters, mode) {
5912
+ return items.filter(function (item) {
5913
+ // Category filter
5914
+ if (filters.categories.length > 0) {
5915
+ var itemCategory = mode === "widget" ? (item.packageCategory || "").toLowerCase() : (item.category || "").toLowerCase();
5916
+ if (!filters.categories.some(function (c) {
5917
+ return c.toLowerCase() === itemCategory;
5918
+ })) {
5919
+ return false;
5920
+ }
5921
+ }
5922
+
5923
+ // Provider filter
5924
+ if (filters.providers.length > 0) {
5925
+ var itemProviders = mode === "widget" ? [].concat(_toConsumableArray(item.providers || []), _toConsumableArray(item.packageProviders || [])) : item.providers || [];
5926
+ var hasMatchingProvider = itemProviders.some(function (p) {
5927
+ return filters.providers.includes(p.type);
5928
+ });
5929
+ if (!hasMatchingProvider) {
5930
+ return false;
5931
+ }
5932
+ }
5933
+ return true;
5934
+ });
5935
+ }
5936
+
6090
5937
  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; }
6091
5938
  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; }
6092
- var TOTAL_STEPS = 6; // Steps 0-5
5939
+ var TOTAL_STEPS = 3; // Steps 0-2: Discover, Layout, Customize
6093
5940
 
6094
5941
  var initialState = {
6095
5942
  step: 0,
6096
- intent: [],
6097
- providers: [],
5943
+ filters: {
5944
+ categories: [],
5945
+ providers: [],
5946
+ query: ""
5947
+ },
6098
5948
  selectedWidgets: [],
6099
5949
  selectedDashboard: null,
6100
5950
  layout: {
@@ -6114,32 +5964,38 @@ function wizardReducer(state, action) {
6114
5964
  return _objectSpread$B(_objectSpread$B({}, state), {}, {
6115
5965
  step: action.payload
6116
5966
  });
6117
- case "SET_INTENT":
5967
+ case "SET_FILTERS":
6118
5968
  return _objectSpread$B(_objectSpread$B({}, state), {}, {
6119
- intent: action.payload
5969
+ filters: _objectSpread$B(_objectSpread$B({}, state.filters), action.payload)
6120
5970
  });
6121
- case "TOGGLE_INTENT":
5971
+ case "TOGGLE_FILTER_CATEGORY":
6122
5972
  {
6123
- var intent = state.intent.includes(action.payload) ? state.intent.filter(function (i) {
6124
- return i !== action.payload;
6125
- }) : [].concat(_toConsumableArray(state.intent), [action.payload]);
5973
+ var categories = state.filters.categories.includes(action.payload) ? state.filters.categories.filter(function (c) {
5974
+ return c !== action.payload;
5975
+ }) : [].concat(_toConsumableArray(state.filters.categories), [action.payload]);
6126
5976
  return _objectSpread$B(_objectSpread$B({}, state), {}, {
6127
- intent: intent
5977
+ filters: _objectSpread$B(_objectSpread$B({}, state.filters), {}, {
5978
+ categories: categories
5979
+ })
6128
5980
  });
6129
5981
  }
6130
- case "SET_PROVIDERS":
6131
- return _objectSpread$B(_objectSpread$B({}, state), {}, {
6132
- providers: action.payload
6133
- });
6134
- case "TOGGLE_PROVIDER":
5982
+ case "TOGGLE_FILTER_PROVIDER":
6135
5983
  {
6136
- var providers = state.providers.includes(action.payload) ? state.providers.filter(function (p) {
5984
+ var providers = state.filters.providers.includes(action.payload) ? state.filters.providers.filter(function (p) {
6137
5985
  return p !== action.payload;
6138
- }) : [].concat(_toConsumableArray(state.providers), [action.payload]);
5986
+ }) : [].concat(_toConsumableArray(state.filters.providers), [action.payload]);
6139
5987
  return _objectSpread$B(_objectSpread$B({}, state), {}, {
6140
- providers: providers
5988
+ filters: _objectSpread$B(_objectSpread$B({}, state.filters), {}, {
5989
+ providers: providers
5990
+ })
6141
5991
  });
6142
5992
  }
5993
+ case "SET_SEARCH_QUERY":
5994
+ return _objectSpread$B(_objectSpread$B({}, state), {}, {
5995
+ filters: _objectSpread$B(_objectSpread$B({}, state.filters), {}, {
5996
+ query: action.payload
5997
+ })
5998
+ });
6143
5999
  case "SET_SELECTED_WIDGETS":
6144
6000
  return _objectSpread$B(_objectSpread$B({}, state), {}, {
6145
6001
  selectedWidgets: action.payload
@@ -6195,17 +6051,11 @@ function widgetCountToTemplate(count) {
6195
6051
  function getCanProceed(state) {
6196
6052
  switch (state.step) {
6197
6053
  case 0:
6198
- return state.intent.length > 0;
6054
+ return state.selectedDashboard !== null || state.selectedWidgets.length > 0;
6199
6055
  case 1:
6200
- return state.providers.length > 0;
6201
- case 2:
6202
- return state.path === "prebuilt" ? state.selectedDashboard !== null : state.selectedWidgets.length > 0;
6203
- case 3:
6204
6056
  return state.layout.templateKey !== null;
6205
- case 4:
6057
+ case 2:
6206
6058
  return state.customization.name.trim().length > 0;
6207
- case 5:
6208
- return true;
6209
6059
  default:
6210
6060
  return false;
6211
6061
  }
@@ -6844,7 +6694,7 @@ var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
6844
6694
  }
6845
6695
 
6846
6696
  // --- Provider setup summary ---
6847
- var selectedProviders = (state.providers || []).map(function (provKey) {
6697
+ var selectedProviders = (state.filters && state.filters.providers || []).map(function (provKey) {
6848
6698
  var prov = (providersMap === null || providersMap === void 0 ? void 0 : providersMap[provKey]) || {};
6849
6699
  return {
6850
6700
  key: provKey,
@@ -7136,14 +6986,8 @@ var WizardCustomizeStep = function WizardCustomizeStep(_ref) {
7136
6986
  };
7137
6987
 
7138
6988
  var STEP_LABELS = [{
7139
- label: "Intent",
7140
- description: "Choose categories"
7141
- }, {
7142
- label: "Providers",
7143
- description: "Select data sources"
7144
- }, {
7145
- label: "Browse",
7146
- description: "Pick widgets or dashboards"
6989
+ label: "Discover",
6990
+ description: "Search & select"
7147
6991
  }, {
7148
6992
  label: "Layout",
7149
6993
  description: "Arrange your widgets"
@@ -7205,23 +7049,23 @@ var DashboardWizardModal = function DashboardWizardModal(_ref) {
7205
7049
  // Skip layout step for prebuilt path
7206
7050
  var handleNext = useCallback(function () {
7207
7051
  if (!canProceed) return;
7208
- if (state.step === 2 && isPrebuiltPath) {
7209
- // Skip layout step (3), go straight to customize (4)
7210
- goToStep(4);
7052
+ if (state.step === 0 && isPrebuiltPath) {
7053
+ // Skip layout step (1), go straight to customize (2)
7054
+ goToStep(2);
7211
7055
  } else {
7212
7056
  nextStep();
7213
7057
  }
7214
7058
  }, [canProceed, state.step, isPrebuiltPath, goToStep, nextStep]);
7215
7059
  var handleBack = useCallback(function () {
7216
- if (state.step === 4 && isPrebuiltPath) {
7217
- // Skip back over layout step (3), go to browse (2)
7218
- goToStep(2);
7060
+ if (state.step === 2 && isPrebuiltPath) {
7061
+ // Skip back over layout step (1), go to discover (0)
7062
+ goToStep(0);
7219
7063
  } else {
7220
7064
  prevStep();
7221
7065
  }
7222
7066
  }, [state.step, isPrebuiltPath, goToStep, prevStep]);
7223
- var isLastStep = state.step === 4;
7224
- state.step === 4 && state._created;
7067
+ var isLastStep = state.step === 2;
7068
+ state.step === 2 && state._created;
7225
7069
  return /*#__PURE__*/jsx(Modal, {
7226
7070
  isOpen: open,
7227
7071
  setIsOpen: setIsOpen,
@@ -7263,7 +7107,7 @@ var DashboardWizardModal = function DashboardWizardModal(_ref) {
7263
7107
  description: STEP_LABELS[0].description,
7264
7108
  children: /*#__PURE__*/jsx("div", {
7265
7109
  className: "flex-1 min-h-0 overflow-y-auto",
7266
- children: /*#__PURE__*/jsx(WizardIntentStep, {
7110
+ children: /*#__PURE__*/jsx(WizardDiscoverStep, {
7267
7111
  state: state,
7268
7112
  dispatch: dispatch
7269
7113
  })
@@ -7273,7 +7117,7 @@ var DashboardWizardModal = function DashboardWizardModal(_ref) {
7273
7117
  description: STEP_LABELS[1].description,
7274
7118
  children: /*#__PURE__*/jsx("div", {
7275
7119
  className: "flex-1 min-h-0 overflow-y-auto",
7276
- children: /*#__PURE__*/jsx(WizardProvidersStep, {
7120
+ children: /*#__PURE__*/jsx(WizardLayoutPreviewStep, {
7277
7121
  state: state,
7278
7122
  dispatch: dispatch
7279
7123
  })
@@ -7281,26 +7125,6 @@ var DashboardWizardModal = function DashboardWizardModal(_ref) {
7281
7125
  }), /*#__PURE__*/jsx(Stepper.Step, {
7282
7126
  label: STEP_LABELS[2].label,
7283
7127
  description: STEP_LABELS[2].description,
7284
- children: /*#__PURE__*/jsx("div", {
7285
- className: "flex-1 min-h-0 overflow-y-auto",
7286
- children: /*#__PURE__*/jsx(WizardResultsStep, {
7287
- state: state,
7288
- dispatch: dispatch
7289
- })
7290
- })
7291
- }), /*#__PURE__*/jsx(Stepper.Step, {
7292
- label: STEP_LABELS[3].label,
7293
- description: STEP_LABELS[3].description,
7294
- children: /*#__PURE__*/jsx("div", {
7295
- className: "flex-1 min-h-0 overflow-y-auto",
7296
- children: /*#__PURE__*/jsx(WizardLayoutPreviewStep, {
7297
- state: state,
7298
- dispatch: dispatch
7299
- })
7300
- })
7301
- }), /*#__PURE__*/jsx(Stepper.Step, {
7302
- label: STEP_LABELS[4].label,
7303
- description: STEP_LABELS[4].description,
7304
7128
  children: /*#__PURE__*/jsx("div", {
7305
7129
  className: "flex-1 min-h-0 overflow-y-auto",
7306
7130
  children: /*#__PURE__*/jsx(WizardCustomizeStep, {
@@ -50024,5 +49848,5 @@ var WorkspaceMenu = function WorkspaceMenu(_ref) {
50024
49848
 
50025
49849
  ComponentManager.registerContainerTypes(LayoutContainer, LayoutGridContainer);
50026
49850
 
50027
- 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, WORKSPACE_DELETE, WORKSPACE_DELETE_COMPLETE, WORKSPACE_DELETE_ERROR, WORKSPACE_LIST, WORKSPACE_LIST_COMPLETE, WORKSPACE_LIST_ERROR, WORKSPACE_SAVE, WORKSPACE_SAVE_COMPLETE, WORKSPACE_SAVE_ERROR, WebDashboardApi, Widget, WidgetApi, WidgetConfigPanel, WidgetContext, WidgetFactory, WidgetPopoutStage, WidgetProviderWrapper, WidgetSidebar, WizardCustomizeStep, WizardIntentStep, WizardLayoutPreviewStep, WizardProvidersStep, WizardResultsStep, 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 };
49851
+ 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, WORKSPACE_DELETE, WORKSPACE_DELETE_COMPLETE, WORKSPACE_DELETE_ERROR, WORKSPACE_LIST, WORKSPACE_LIST_COMPLETE, WORKSPACE_LIST_ERROR, WORKSPACE_SAVE, WORKSPACE_SAVE_COMPLETE, WORKSPACE_SAVE_ERROR, WebDashboardApi, Widget, WidgetApi, WidgetConfigPanel, WidgetContext, WidgetFactory, 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 };
50028
49852
  //# sourceMappingURL=index.esm.js.map