@trops/dash-core 0.1.459 → 0.1.461

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
@@ -2,7 +2,7 @@ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
2
2
  import _typeof from '@babel/runtime/helpers/typeof';
3
3
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
4
  import * as DashReact from '@trops/dash-react';
5
- import { isObject, ThemeContext, deepCopy, MainSection, getUUID, getStylesForItem, themeObjects, Heading, SearchInput, ButtonIcon, SubHeading3, InputText, Button, FontAwesomeIcon, Tag, Modal, Button3, Button2, Paragraph, Sidebar, Panel, Stepper, Tag2, Tag3, Card2, Card3, Heading3, MenuItem3, FormLabel, SelectMenu, Switch, SelectInput, CodeEditorVS, SettingsModal, SubHeading2, tailwindHeightFractions, Menu3, Panel3, ButtonIcon2, DropdownPanel, MenuItem2, DragComponent, ConfirmationModal, DropComponent, getStyleName, capitalizeFirstLetter, colorTypes, getCSSStyleForClassname, Panel2, Heading2, SubHeading, Paragraph2, Paragraph3, 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, CodeEditorInline, Icon2, AlgoliaSearchBox, CommandPalette, useSidebar, EmptyState, Navbar, withRouter, Menu as Menu$1 } from '@trops/dash-react';
5
+ import { isObject, ThemeContext, deepCopy, MainSection, getUUID, getStylesForItem, themeObjects, Heading, SearchInput, ButtonIcon, SubHeading3, InputText, Button, FontAwesomeIcon, Tag, Modal, Button3, Button2, Paragraph, Sidebar, Panel, Stepper, Tag3, Card2, Card3, Heading3, MenuItem3, FormLabel, SelectMenu, Switch, SelectInput, CodeEditorVS, SettingsModal, SubHeading2, tailwindHeightFractions, Menu3, Panel3, ButtonIcon2, DropdownPanel, MenuItem2, DragComponent, ConfirmationModal, DropComponent, getStyleName, capitalizeFirstLetter, colorTypes, getCSSStyleForClassname, Panel2, Heading2, SubHeading, Paragraph2, Paragraph3, MenuItem, Tag2, 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, CodeEditorInline, Icon2, AlgoliaSearchBox, CommandPalette, useSidebar, EmptyState, Navbar, withRouter, Menu as Menu$1 } from '@trops/dash-react';
6
6
  export * from '@trops/dash-react';
7
7
  export { ThemeContext } from '@trops/dash-react';
8
8
  import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
@@ -6870,6 +6870,11 @@ var useRegistrySearch = function useRegistrySearch() {
6870
6870
  search: search,
6871
6871
  installPackage: installPackage,
6872
6872
  retry: retry,
6873
+ // refetch is an alias of retry, exposed under the name the
6874
+ // Wizard's sign-in flow uses to re-fetch the registry once
6875
+ // the user signs in (so private results show up without a
6876
+ // manual reload).
6877
+ refetch: retry,
6873
6878
  showAllPackages: showAllPackages,
6874
6879
  setShowAllPackages: setShowAllPackages,
6875
6880
  appCapabilities: appCapabilities
@@ -6946,12 +6951,19 @@ var KNOWN_PROVIDERS = [{
6946
6951
  /**
6947
6952
  * WizardDiscoverStep
6948
6953
  *
6949
- * Step 0 of the Dashboard Wizard. Combines search, category/provider
6950
- * filter chips, and results (dashboards + widgets) in a single view.
6951
- * Replaces the old Intent, Providers, and Results steps.
6954
+ * Step 0 of the Dashboard Wizard. Two-column layout mirroring the
6955
+ * dash-registry homepage: a left filter sidebar (TYPE / CATEGORIES /
6956
+ * PROVIDERS as vertical lists) and a right content pane with the
6957
+ * search input + result grid.
6952
6958
  *
6953
- * - Selecting a dashboard sets path to "prebuilt" and clears widget selections.
6954
- * - Selecting widgets sets path to "custom" and clears dashboard selection.
6959
+ * - TYPE filter (single-select): All / Dashboards / Widgets. Replaces
6960
+ * the previous tab bar so the right pane is a single result surface.
6961
+ * - CATEGORIES + PROVIDERS (multi-select): preserves the existing
6962
+ * wizard filter shape (`filters.categories[]`, `filters.providers[]`).
6963
+ *
6964
+ * Selecting a dashboard sets path = "prebuilt" and clears widget
6965
+ * selections. Selecting widgets sets path = "custom" and clears the
6966
+ * dashboard selection.
6955
6967
  *
6956
6968
  * @param {Object} props
6957
6969
  * @param {Object} props.state - Wizard state from useWizardState
@@ -6971,7 +6983,27 @@ var WizardDiscoverStep = function WizardDiscoverStep(_ref) {
6971
6983
  isLoading = _useRegistrySearch.isLoading,
6972
6984
  error = _useRegistrySearch.error,
6973
6985
  searchQuery = _useRegistrySearch.searchQuery,
6974
- setSearchQuery = _useRegistrySearch.setSearchQuery;
6986
+ setSearchQuery = _useRegistrySearch.setSearchQuery,
6987
+ refetch = _useRegistrySearch.refetch;
6988
+
6989
+ // --- Registry auth (device-code OAuth) ---
6990
+ // Surfaces a sign-in CTA when the user isn't authenticated so they
6991
+ // see private dashboards/widgets they have access to. After
6992
+ // successful auth, `refetch` re-runs the registry search so the
6993
+ // results refresh automatically — no manual reload needed.
6994
+ var _useRegistryAuth = useRegistryAuth(),
6995
+ isAuthenticated = _useRegistryAuth.isAuthenticated,
6996
+ isAuthenticating = _useRegistryAuth.isAuthenticating,
6997
+ authError = _useRegistryAuth.authError,
6998
+ checkAuth = _useRegistryAuth.checkAuth,
6999
+ initiateAuth = _useRegistryAuth.initiateAuth,
7000
+ cancelAuth = _useRegistryAuth.cancelAuth;
7001
+ useEffect(function () {
7002
+ checkAuth();
7003
+ }, [checkAuth]);
7004
+ var handleSignIn = useCallback(function () {
7005
+ initiateAuth(refetch);
7006
+ }, [initiateAuth, refetch]);
6975
7007
 
6976
7008
  // Sync search query from wizard state on mount
6977
7009
  useEffect(function () {
@@ -7034,7 +7066,7 @@ var WizardDiscoverStep = function WizardDiscoverStep(_ref) {
7034
7066
  });
7035
7067
  }, [state.selectedWidgets]);
7036
7068
 
7037
- // --- Filter chip handlers ---
7069
+ // --- Filter handlers ---
7038
7070
  var handleToggleCategory = useCallback(function (cat) {
7039
7071
  return dispatch({
7040
7072
  type: "TOGGLE_FILTER_CATEGORY",
@@ -7048,13 +7080,26 @@ var WizardDiscoverStep = function WizardDiscoverStep(_ref) {
7048
7080
  });
7049
7081
  }, [dispatch]);
7050
7082
 
7051
- // Tab state (DASH-185)
7083
+ // TYPE filter — replaces the old tab bar. Binary because the
7084
+ // wizard's data model is mutually exclusive: selecting a dashboard
7085
+ // clears widgets and sets path="prebuilt"; selecting a widget
7086
+ // clears the dashboard and sets path="custom". An "All" view would
7087
+ // imply you can browse both freely when in reality the first click
7088
+ // commits you to one of two paths. Defaulting to "dashboards" since
7089
+ // pre-built is the simpler, more common starting point.
7052
7090
  var _useState = useState("dashboards"),
7053
7091
  _useState2 = _slicedToArray(_useState, 2),
7054
- activeTab = _useState2[0],
7055
- setActiveTab = _useState2[1];
7092
+ typeFilter = _useState2[0],
7093
+ setTypeFilter = _useState2[1];
7094
+ var TYPE_OPTIONS = [{
7095
+ key: "dashboards",
7096
+ label: "Dashboards"
7097
+ }, {
7098
+ key: "widgets",
7099
+ label: "Widgets"
7100
+ }];
7056
7101
 
7057
- // Clear selection handler (DASH-186)
7102
+ // Clear-selection handler
7058
7103
  var hasSelection = state.selectedDashboard !== null || state.selectedWidgets.length > 0;
7059
7104
  var handleClearSelection = useCallback(function () {
7060
7105
  dispatch({
@@ -7070,236 +7115,276 @@ var WizardDiscoverStep = function WizardDiscoverStep(_ref) {
7070
7115
  payload: null
7071
7116
  });
7072
7117
  }, [dispatch]);
7073
- var hasResults = filteredDashboards.length > 0 || filteredWidgets.length > 0;
7118
+ var showDashboards = typeFilter === "dashboards";
7119
+ var showWidgets = typeFilter === "widgets";
7120
+ var visibleDashboards = showDashboards ? filteredDashboards : [];
7121
+ var visibleWidgets = showWidgets ? filteredWidgets : [];
7122
+ var hasResults = visibleDashboards.length > 0 || visibleWidgets.length > 0;
7074
7123
  var hasActiveFilters = filters.categories.length > 0 || filters.providers.length > 0;
7124
+
7125
+ // Shared row class for sidebar list items.
7126
+ var rowClass = function rowClass(active) {
7127
+ return "text-sm py-1.5 px-3 rounded text-left transition-colors flex items-center justify-between ".concat(active ? "bg-blue-900 text-blue-200" : "text-gray-400 hover:bg-gray-800 hover:text-gray-200");
7128
+ };
7129
+ var sectionLabelClass = "text-xs font-semibold text-gray-400 uppercase tracking-wide px-3 mb-1";
7075
7130
  return /*#__PURE__*/jsxs("div", {
7076
- className: "flex flex-col gap-4",
7077
- children: [/*#__PURE__*/jsx(InputText, {
7078
- value: searchQuery,
7079
- onChange: handleSearchChange,
7080
- placeholder: "Search registry..."
7081
- }), /*#__PURE__*/jsxs("div", {
7082
- className: "flex flex-col gap-3",
7083
- children: [/*#__PURE__*/jsxs("div", {
7084
- className: "flex flex-col gap-1.5",
7085
- children: [/*#__PURE__*/jsx("span", {
7086
- className: "text-xs font-semibold text-gray-400 uppercase tracking-wide",
7087
- children: "Categories"
7088
- }), /*#__PURE__*/jsx("div", {
7089
- className: "flex flex-wrap gap-1.5",
7090
- children: DASHBOARD_TAGS$1.map(function (tag) {
7091
- return /*#__PURE__*/jsx(Tag2, {
7092
- text: tag,
7093
- onClick: function onClick() {
7094
- return handleToggleCategory(tag);
7095
- },
7096
- active: filters.categories.includes(tag)
7097
- }, tag);
7098
- })
7099
- })]
7100
- }), /*#__PURE__*/jsxs("div", {
7101
- className: "flex flex-col gap-1.5",
7131
+ className: "flex flex-row gap-4",
7132
+ children: [/*#__PURE__*/jsxs("aside", {
7133
+ className: "flex-shrink-0 w-56 flex flex-col gap-4 overflow-y-auto",
7134
+ children: [!isAuthenticated && /*#__PURE__*/jsxs("div", {
7135
+ className: "flex flex-col gap-2 px-3 py-3 rounded bg-gray-800 text-gray-300",
7102
7136
  children: [/*#__PURE__*/jsx("span", {
7103
- className: "text-xs font-semibold text-gray-400 uppercase tracking-wide",
7104
- children: "Providers"
7105
- }), /*#__PURE__*/jsx("div", {
7106
- className: "flex flex-wrap gap-1.5",
7107
- children: KNOWN_PROVIDERS.map(function (prov) {
7108
- return /*#__PURE__*/jsx(Tag2, {
7109
- text: prov.name,
7110
- onClick: function onClick() {
7111
- return handleToggleProvider(prov.key);
7112
- },
7113
- active: filters.providers.includes(prov.key)
7114
- }, prov.key);
7115
- })
7116
- })]
7117
- })]
7118
- }), /*#__PURE__*/jsxs("div", {
7119
- className: "flex items-center justify-between",
7120
- children: [/*#__PURE__*/jsxs("div", {
7121
- className: "flex gap-1",
7122
- children: [/*#__PURE__*/jsxs("button", {
7123
- type: "button",
7124
- 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"),
7125
- onClick: function onClick() {
7126
- return setActiveTab("dashboards");
7127
- },
7128
- children: ["Dashboards (", filteredDashboards.length, ")"]
7129
- }), /*#__PURE__*/jsxs("button", {
7137
+ className: "text-xs font-semibold text-gray-200",
7138
+ children: "Sign in to registry"
7139
+ }), /*#__PURE__*/jsx("span", {
7140
+ className: "text-xs text-gray-400",
7141
+ children: "See dashboards and widgets you have access to"
7142
+ }), !isAuthenticating ? /*#__PURE__*/jsx("button", {
7130
7143
  type: "button",
7131
- 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"),
7132
- onClick: function onClick() {
7133
- return setActiveTab("widgets");
7134
- },
7135
- children: ["Widgets (", filteredWidgets.length, ")", state.selectedWidgets.length > 0 && /*#__PURE__*/jsx("span", {
7136
- className: "ml-1.5",
7137
- children: /*#__PURE__*/jsx(Tag3, {
7138
- text: "".concat(state.selectedWidgets.length, " selected")
7139
- })
7144
+ onClick: handleSignIn,
7145
+ className: "mt-1 text-xs py-1.5 px-3 rounded bg-blue-600 text-white hover:bg-blue-500 transition-colors",
7146
+ children: "Sign in"
7147
+ }) : /*#__PURE__*/jsxs("div", {
7148
+ className: "mt-1 flex flex-col gap-1",
7149
+ children: [/*#__PURE__*/jsx("span", {
7150
+ className: "text-xs text-gray-400",
7151
+ children: "Waiting for browser\u2026"
7152
+ }), /*#__PURE__*/jsx("button", {
7153
+ type: "button",
7154
+ onClick: cancelAuth,
7155
+ className: "text-xs text-gray-400 hover:text-gray-200 underline self-start",
7156
+ children: "Cancel"
7140
7157
  })]
7158
+ }), authError && /*#__PURE__*/jsx("span", {
7159
+ className: "text-xs text-red-400",
7160
+ children: authError
7141
7161
  })]
7142
- }), hasSelection && /*#__PURE__*/jsx(Button, {
7143
- onClick: handleClearSelection,
7144
- title: "Clear Selection",
7145
- textSize: "text-xs",
7146
- padding: "py-1 px-3",
7147
- backgroundColor: "bg-gray-700",
7148
- textColor: "text-gray-400",
7149
- hoverTextColor: "hover:text-white",
7150
- hoverBackgroundColor: "hover:bg-gray-600",
7151
- icon: "xmark"
7152
- })]
7153
- }), /*#__PURE__*/jsx("div", {
7154
- className: "flex flex-col gap-6",
7155
- children: isLoading ? /*#__PURE__*/jsxs("div", {
7156
- className: "flex flex-col items-center justify-center gap-2 py-12 text-gray-400",
7162
+ }), isAuthenticated && /*#__PURE__*/jsxs("div", {
7163
+ className: "flex items-center gap-2 px-3 text-xs text-gray-500",
7157
7164
  children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
7158
- icon: "spinner",
7159
- spin: true,
7160
- fixedWidth: true
7165
+ icon: "circle-check",
7166
+ className: "text-green-400 text-xs"
7161
7167
  }), /*#__PURE__*/jsx("span", {
7162
- children: "Searching registry..."
7168
+ children: "Signed in"
7163
7169
  })]
7164
- }) : error ? /*#__PURE__*/jsxs("div", {
7165
- className: "flex items-center gap-2 text-red-400 py-4",
7166
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
7167
- icon: "circle-exclamation",
7168
- fixedWidth: true
7169
- }), /*#__PURE__*/jsx("span", {
7170
- children: error
7170
+ }), /*#__PURE__*/jsxs("div", {
7171
+ className: "flex flex-col",
7172
+ children: [/*#__PURE__*/jsx("span", {
7173
+ className: sectionLabelClass,
7174
+ children: "TYPE"
7175
+ }), TYPE_OPTIONS.map(function (opt) {
7176
+ var active = typeFilter === opt.key;
7177
+ var showBadge = opt.key === "widgets" && state.selectedWidgets.length > 0;
7178
+ return /*#__PURE__*/jsxs("button", {
7179
+ type: "button",
7180
+ onClick: function onClick() {
7181
+ return setTypeFilter(opt.key);
7182
+ },
7183
+ className: rowClass(active),
7184
+ children: [/*#__PURE__*/jsx("span", {
7185
+ children: opt.label
7186
+ }), showBadge && /*#__PURE__*/jsx(Tag3, {
7187
+ text: "".concat(state.selectedWidgets.length, " selected")
7188
+ })]
7189
+ }, opt.key);
7171
7190
  })]
7172
- }) : !hasResults ? /*#__PURE__*/jsxs("div", {
7173
- className: "flex flex-col items-center justify-center gap-2 py-12 text-gray-500",
7174
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
7175
- icon: "magnifying-glass",
7176
- fixedWidth: true
7177
- }), /*#__PURE__*/jsx("p", {
7178
- children: "No results match your search."
7179
- }), hasActiveFilters && /*#__PURE__*/jsx("p", {
7180
- className: "text-xs text-gray-600",
7181
- children: "Try removing some filters to see more results."
7191
+ }), /*#__PURE__*/jsxs("div", {
7192
+ className: "flex flex-col",
7193
+ children: [/*#__PURE__*/jsx("span", {
7194
+ className: sectionLabelClass,
7195
+ children: "CATEGORIES"
7196
+ }), DASHBOARD_TAGS$1.map(function (tag) {
7197
+ var active = filters.categories.includes(tag);
7198
+ return /*#__PURE__*/jsx("button", {
7199
+ type: "button",
7200
+ onClick: function onClick() {
7201
+ return handleToggleCategory(tag);
7202
+ },
7203
+ className: "".concat(rowClass(active), " capitalize"),
7204
+ children: /*#__PURE__*/jsx("span", {
7205
+ children: tag
7206
+ })
7207
+ }, tag);
7182
7208
  })]
7183
- }) : /*#__PURE__*/jsxs(Fragment, {
7184
- children: [activeTab === "dashboards" && filteredDashboards.length > 0 && /*#__PURE__*/jsx("div", {
7185
- className: "flex flex-col gap-3",
7186
- children: /*#__PURE__*/jsx("div", {
7187
- className: "grid grid-cols-3 gap-3",
7188
- children: filteredDashboards.map(function (dash) {
7189
- var isSelected = state.selectedDashboard && state.selectedDashboard.name === dash.name;
7190
- var widgetCount = (dash.widgets || []).length;
7191
- var providerTags = (dash.providers || []).map(function (p) {
7192
- return p.name || p.type;
7193
- }).filter(Boolean);
7194
- return /*#__PURE__*/jsxs(Card2, {
7195
- hover: true,
7196
- selected: isSelected,
7197
- padding: "p-5",
7198
- rounded: "rounded-lg",
7199
- className: "hover:shadow-lg",
7200
- onClick: function onClick() {
7201
- return handleSelectDashboard(dash);
7202
- },
7203
- children: [/*#__PURE__*/jsxs("div", {
7204
- className: "flex flex-col items-center text-center gap-2",
7205
- children: [/*#__PURE__*/jsxs("div", {
7206
- className: "relative",
7207
- children: [/*#__PURE__*/jsx("span", {
7208
- className: "text-2xl",
7209
- children: /*#__PURE__*/jsx(FontAwesomeIcon, {
7210
- icon: resolveIcon(dash.icon || "grid-2"),
7211
- fixedWidth: true,
7212
- className: "text-gray-400"
7213
- })
7214
- }), isSelected && /*#__PURE__*/jsx(FontAwesomeIcon, {
7215
- icon: "circle-check",
7216
- className: "absolute -top-1 -right-3 text-blue-400 text-xs"
7217
- })]
7218
- }), /*#__PURE__*/jsx("span", {
7219
- className: "text-sm font-semibold text-gray-200",
7220
- children: dash.displayName || dash.name
7221
- })]
7222
- }), dash.description && /*#__PURE__*/jsx("p", {
7223
- className: "text-xs text-gray-400 mt-2 line-clamp-2 text-center",
7224
- children: dash.description
7225
- }), /*#__PURE__*/jsxs("div", {
7226
- className: "flex items-center justify-between mt-3 pt-2 border-t border-gray-700/50",
7227
- children: [/*#__PURE__*/jsxs("span", {
7228
- className: "text-xs text-gray-500",
7229
- children: [widgetCount, " widget", widgetCount !== 1 ? "s" : ""]
7230
- }), providerTags.length > 0 && /*#__PURE__*/jsx("div", {
7231
- className: "flex flex-wrap gap-1 justify-end",
7232
- children: providerTags.slice(0, 3).map(function (tag) {
7233
- return /*#__PURE__*/jsx("span", {
7234
- className: "text-xs px-1.5 py-0.5 rounded bg-gray-800 text-gray-400",
7235
- children: tag
7236
- }, tag);
7237
- })
7238
- })]
7239
- })]
7240
- }, dash.name);
7209
+ }), /*#__PURE__*/jsxs("div", {
7210
+ className: "flex flex-col",
7211
+ children: [/*#__PURE__*/jsx("span", {
7212
+ className: sectionLabelClass,
7213
+ children: "PROVIDERS"
7214
+ }), KNOWN_PROVIDERS.map(function (prov) {
7215
+ var active = filters.providers.includes(prov.key);
7216
+ return /*#__PURE__*/jsx("button", {
7217
+ type: "button",
7218
+ onClick: function onClick() {
7219
+ return handleToggleProvider(prov.key);
7220
+ },
7221
+ className: rowClass(active),
7222
+ children: /*#__PURE__*/jsx("span", {
7223
+ children: prov.name
7241
7224
  })
7225
+ }, prov.key);
7226
+ })]
7227
+ })]
7228
+ }), /*#__PURE__*/jsxs("div", {
7229
+ className: "flex-1 min-w-0 flex flex-col gap-4",
7230
+ children: [/*#__PURE__*/jsxs("div", {
7231
+ className: "flex items-center gap-3",
7232
+ children: [/*#__PURE__*/jsx("div", {
7233
+ className: "flex-1",
7234
+ children: /*#__PURE__*/jsx(InputText, {
7235
+ value: searchQuery,
7236
+ onChange: handleSearchChange,
7237
+ placeholder: "Search registry..."
7242
7238
  })
7243
- }), activeTab === "dashboards" && filteredDashboards.length === 0 && /*#__PURE__*/jsxs("div", {
7239
+ }), hasSelection && /*#__PURE__*/jsx(Button, {
7240
+ onClick: handleClearSelection,
7241
+ title: "Clear Selection",
7242
+ textSize: "text-xs",
7243
+ padding: "py-1 px-3",
7244
+ backgroundColor: "bg-gray-700",
7245
+ textColor: "text-gray-400",
7246
+ hoverTextColor: "hover:text-white",
7247
+ hoverBackgroundColor: "hover:bg-gray-600",
7248
+ icon: "xmark"
7249
+ })]
7250
+ }), !isLoading && !error && /*#__PURE__*/jsx("div", {
7251
+ className: "text-xs text-gray-500 px-1",
7252
+ children: showDashboards ? "".concat(visibleDashboards.length, " dashboard").concat(visibleDashboards.length === 1 ? "" : "s") : "".concat(visibleWidgets.length, " widget").concat(visibleWidgets.length === 1 ? "" : "s")
7253
+ }), /*#__PURE__*/jsx("div", {
7254
+ className: "flex flex-col gap-6",
7255
+ children: isLoading ? /*#__PURE__*/jsxs("div", {
7256
+ className: "flex flex-col items-center justify-center gap-2 py-12 text-gray-400",
7257
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
7258
+ icon: "spinner",
7259
+ spin: true,
7260
+ fixedWidth: true
7261
+ }), /*#__PURE__*/jsx("span", {
7262
+ children: "Searching registry..."
7263
+ })]
7264
+ }) : error ? /*#__PURE__*/jsxs("div", {
7265
+ className: "flex items-center gap-2 text-red-400 py-4",
7266
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
7267
+ icon: "circle-exclamation",
7268
+ fixedWidth: true
7269
+ }), /*#__PURE__*/jsx("span", {
7270
+ children: error
7271
+ })]
7272
+ }) : !hasResults ? /*#__PURE__*/jsxs("div", {
7244
7273
  className: "flex flex-col items-center justify-center gap-2 py-12 text-gray-500",
7245
7274
  children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
7246
- icon: "grid-2",
7275
+ icon: "magnifying-glass",
7247
7276
  fixedWidth: true
7248
7277
  }), /*#__PURE__*/jsx("p", {
7249
- children: "No dashboards match your search."
7278
+ children: "No results match your search."
7279
+ }), hasActiveFilters && /*#__PURE__*/jsx("p", {
7280
+ className: "text-xs text-gray-600",
7281
+ children: "Try removing some filters to see more results."
7250
7282
  })]
7251
- }), activeTab === "widgets" && filteredWidgets.length > 0 && /*#__PURE__*/jsx("div", {
7252
- className: "flex flex-col gap-3",
7253
- children: /*#__PURE__*/jsx("div", {
7254
- className: "grid grid-cols-3 gap-3",
7255
- children: filteredWidgets.map(function (widget) {
7256
- var checked = isWidgetSelected(widget);
7257
- return /*#__PURE__*/jsxs(Card2, {
7258
- hover: true,
7259
- selected: checked,
7260
- padding: "p-4",
7261
- rounded: "rounded-lg",
7262
- className: "hover:shadow-lg flex flex-col",
7263
- onClick: function onClick() {
7264
- return handleToggleWidget(widget);
7265
- },
7266
- children: [/*#__PURE__*/jsxs("div", {
7267
- className: "flex items-start justify-between gap-2",
7283
+ }) : /*#__PURE__*/jsxs(Fragment, {
7284
+ children: [showDashboards && visibleDashboards.length > 0 && /*#__PURE__*/jsx("div", {
7285
+ className: "flex flex-col gap-3",
7286
+ children: /*#__PURE__*/jsx("div", {
7287
+ className: "grid grid-cols-3 gap-3",
7288
+ children: visibleDashboards.map(function (dash) {
7289
+ var isSelected = state.selectedDashboard && state.selectedDashboard.name === dash.name;
7290
+ var widgetCount = (dash.widgets || []).length;
7291
+ var providerTags = (dash.providers || []).map(function (p) {
7292
+ return p.name || p.type;
7293
+ }).filter(Boolean);
7294
+ return /*#__PURE__*/jsxs(Card2, {
7295
+ hover: true,
7296
+ selected: isSelected,
7297
+ padding: "p-5",
7298
+ rounded: "rounded-lg",
7299
+ className: "hover:shadow-lg",
7300
+ onClick: function onClick() {
7301
+ return handleSelectDashboard(dash);
7302
+ },
7268
7303
  children: [/*#__PURE__*/jsxs("div", {
7269
- className: "flex items-center gap-1.5",
7270
- children: [widget.icon && /*#__PURE__*/jsx(FontAwesomeIcon, {
7271
- icon: resolveIcon(widget.icon),
7272
- fixedWidth: true,
7273
- className: "text-gray-400 text-sm"
7304
+ className: "flex flex-col items-center text-center gap-2",
7305
+ children: [/*#__PURE__*/jsxs("div", {
7306
+ className: "relative",
7307
+ children: [/*#__PURE__*/jsx("span", {
7308
+ className: "text-2xl",
7309
+ children: /*#__PURE__*/jsx(FontAwesomeIcon, {
7310
+ icon: resolveIcon(dash.icon || "grid-2"),
7311
+ fixedWidth: true,
7312
+ className: "text-gray-400"
7313
+ })
7314
+ }), isSelected && /*#__PURE__*/jsx(FontAwesomeIcon, {
7315
+ icon: "circle-check",
7316
+ className: "absolute -top-1 -right-3 text-blue-400 text-xs"
7317
+ })]
7274
7318
  }), /*#__PURE__*/jsx("span", {
7275
- className: "text-sm font-medium text-gray-200 truncate",
7276
- children: widget.name
7319
+ className: "text-sm font-semibold text-gray-200",
7320
+ children: dash.displayName || dash.name
7321
+ })]
7322
+ }), dash.description && /*#__PURE__*/jsx("p", {
7323
+ className: "text-xs text-gray-400 mt-2 line-clamp-2 text-center",
7324
+ children: dash.description
7325
+ }), /*#__PURE__*/jsxs("div", {
7326
+ className: "flex items-center justify-between mt-3 pt-2 border-t border-gray-700/50",
7327
+ children: [/*#__PURE__*/jsxs("span", {
7328
+ className: "text-xs text-gray-500",
7329
+ children: [widgetCount, " widget", widgetCount !== 1 ? "s" : ""]
7330
+ }), providerTags.length > 0 && /*#__PURE__*/jsx("div", {
7331
+ className: "flex flex-wrap gap-1 justify-end",
7332
+ children: providerTags.slice(0, 3).map(function (tag) {
7333
+ return /*#__PURE__*/jsx("span", {
7334
+ className: "text-xs px-1.5 py-0.5 rounded bg-gray-800 text-gray-400",
7335
+ children: tag
7336
+ }, tag);
7337
+ })
7277
7338
  })]
7278
- }), /*#__PURE__*/jsx(FontAwesomeIcon, {
7279
- icon: checked ? "square-check" : "square",
7280
- fixedWidth: true,
7281
- className: checked ? "text-blue-400 flex-shrink-0" : "text-gray-500 flex-shrink-0"
7282
7339
  })]
7283
- }), widget.description && /*#__PURE__*/jsx("p", {
7284
- className: "text-xs text-gray-400 line-clamp-2 mt-1.5 flex-1",
7285
- children: widget.description
7286
- }), widget.packageDisplayName && /*#__PURE__*/jsx("span", {
7287
- className: "text-xs text-gray-500 mt-2 pt-1.5 border-t border-gray-700/50 truncate",
7288
- children: widget.packageDisplayName
7289
- })]
7290
- }, widget.key);
7340
+ }, dash.name);
7341
+ })
7342
+ })
7343
+ }), showWidgets && visibleWidgets.length > 0 && /*#__PURE__*/jsx("div", {
7344
+ className: "flex flex-col gap-3",
7345
+ children: /*#__PURE__*/jsx("div", {
7346
+ className: "grid grid-cols-3 gap-3",
7347
+ children: visibleWidgets.map(function (widget) {
7348
+ var checked = isWidgetSelected(widget);
7349
+ return /*#__PURE__*/jsxs(Card2, {
7350
+ hover: true,
7351
+ selected: checked,
7352
+ padding: "p-4",
7353
+ rounded: "rounded-lg",
7354
+ className: "hover:shadow-lg flex flex-col",
7355
+ onClick: function onClick() {
7356
+ return handleToggleWidget(widget);
7357
+ },
7358
+ children: [/*#__PURE__*/jsxs("div", {
7359
+ className: "flex items-start justify-between gap-2",
7360
+ children: [/*#__PURE__*/jsxs("div", {
7361
+ className: "flex items-center gap-1.5",
7362
+ children: [widget.icon && /*#__PURE__*/jsx(FontAwesomeIcon, {
7363
+ icon: resolveIcon(widget.icon),
7364
+ fixedWidth: true,
7365
+ className: "text-gray-400 text-sm"
7366
+ }), /*#__PURE__*/jsx("span", {
7367
+ className: "text-sm font-medium text-gray-200 truncate",
7368
+ children: widget.name
7369
+ })]
7370
+ }), /*#__PURE__*/jsx(FontAwesomeIcon, {
7371
+ icon: checked ? "square-check" : "square",
7372
+ fixedWidth: true,
7373
+ className: checked ? "text-blue-400 flex-shrink-0" : "text-gray-500 flex-shrink-0"
7374
+ })]
7375
+ }), widget.description && /*#__PURE__*/jsx("p", {
7376
+ className: "text-xs text-gray-400 line-clamp-2 mt-1.5 flex-1",
7377
+ children: widget.description
7378
+ }), widget.packageDisplayName && /*#__PURE__*/jsx("span", {
7379
+ className: "text-xs text-gray-500 mt-2 pt-1.5 border-t border-gray-700/50 truncate",
7380
+ children: widget.packageDisplayName
7381
+ })]
7382
+ }, widget.key);
7383
+ })
7291
7384
  })
7292
- })
7293
- }), activeTab === "widgets" && filteredWidgets.length === 0 && /*#__PURE__*/jsxs("div", {
7294
- className: "flex flex-col items-center justify-center gap-2 py-12 text-gray-500",
7295
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
7296
- icon: "puzzle-piece",
7297
- fixedWidth: true
7298
- }), /*#__PURE__*/jsx("p", {
7299
- children: "No widgets match your search."
7300
7385
  })]
7301
- })]
7302
- })
7386
+ })
7387
+ })]
7303
7388
  })]
7304
7389
  });
7305
7390
  };
@@ -9294,7 +9379,7 @@ hasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBu
9294
9379
  var hasPropertyDescriptors_1 = hasPropertyDescriptors;
9295
9380
 
9296
9381
  var keys = objectKeys$2;
9297
- var hasSymbols$4 = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
9382
+ var hasSymbols$5 = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
9298
9383
 
9299
9384
  var toStr$4 = Object.prototype.toString;
9300
9385
  var concat = Array.prototype.concat;
@@ -9327,7 +9412,7 @@ var defineProperty$1 = function (object, name, value, predicate) {
9327
9412
  var defineProperties$1 = function (object, map) {
9328
9413
  var predicates = arguments.length > 2 ? arguments[2] : {};
9329
9414
  var props = keys(map);
9330
- if (hasSymbols$4) {
9415
+ if (hasSymbols$5) {
9331
9416
  props = concat.call(props, Object.getOwnPropertySymbols(map));
9332
9417
  }
9333
9418
  for (var i = 0; i < props.length; i += 1) {
@@ -9393,11 +9478,11 @@ var sign$1 = function sign(number) {
9393
9478
  };
9394
9479
 
9395
9480
  var shams$1;
9396
- var hasRequiredShams$1;
9481
+ var hasRequiredShams;
9397
9482
 
9398
- function requireShams$1 () {
9399
- if (hasRequiredShams$1) return shams$1;
9400
- hasRequiredShams$1 = 1;
9483
+ function requireShams () {
9484
+ if (hasRequiredShams) return shams$1;
9485
+ hasRequiredShams = 1;
9401
9486
 
9402
9487
  /** @type {import('./shams')} */
9403
9488
  /* eslint complexity: [2, 18], max-statements: [2, 33] */
@@ -9446,10 +9531,10 @@ function requireShams$1 () {
9446
9531
  }
9447
9532
 
9448
9533
  var origSymbol = typeof Symbol !== 'undefined' && Symbol;
9449
- var hasSymbolSham = requireShams$1();
9534
+ var hasSymbolSham = requireShams();
9450
9535
 
9451
9536
  /** @type {import('.')} */
9452
- var hasSymbols$3 = function hasNativeSymbols() {
9537
+ var hasSymbols$4 = function hasNativeSymbols() {
9453
9538
  if (typeof origSymbol !== 'function') { return false; }
9454
9539
  if (typeof Symbol !== 'function') { return false; }
9455
9540
  if (typeof origSymbol('foo') !== 'symbol') { return false; }
@@ -9753,7 +9838,7 @@ var ThrowTypeError = $gOPD$1
9753
9838
  }())
9754
9839
  : throwTypeError;
9755
9840
 
9756
- var hasSymbols$2 = hasSymbols$3();
9841
+ var hasSymbols$3 = hasSymbols$4();
9757
9842
 
9758
9843
  var getProto$2 = getProto$3;
9759
9844
  var $ObjectGPO = requireObject_getPrototypeOf();
@@ -9771,7 +9856,7 @@ var INTRINSICS = {
9771
9856
  '%AggregateError%': typeof AggregateError === 'undefined' ? undefined$1 : AggregateError,
9772
9857
  '%Array%': Array,
9773
9858
  '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer,
9774
- '%ArrayIteratorPrototype%': hasSymbols$2 && getProto$2 ? getProto$2([][Symbol.iterator]()) : undefined$1,
9859
+ '%ArrayIteratorPrototype%': hasSymbols$3 && getProto$2 ? getProto$2([][Symbol.iterator]()) : undefined$1,
9775
9860
  '%AsyncFromSyncIteratorPrototype%': undefined$1,
9776
9861
  '%AsyncFunction%': needsEval,
9777
9862
  '%AsyncGenerator%': needsEval,
@@ -9802,10 +9887,10 @@ var INTRINSICS = {
9802
9887
  '%Int32Array%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array,
9803
9888
  '%isFinite%': isFinite,
9804
9889
  '%isNaN%': isNaN,
9805
- '%IteratorPrototype%': hasSymbols$2 && getProto$2 ? getProto$2(getProto$2([][Symbol.iterator]())) : undefined$1,
9890
+ '%IteratorPrototype%': hasSymbols$3 && getProto$2 ? getProto$2(getProto$2([][Symbol.iterator]())) : undefined$1,
9806
9891
  '%JSON%': typeof JSON === 'object' ? JSON : undefined$1,
9807
9892
  '%Map%': typeof Map === 'undefined' ? undefined$1 : Map,
9808
- '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols$2 || !getProto$2 ? undefined$1 : getProto$2(new Map()[Symbol.iterator]()),
9893
+ '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols$3 || !getProto$2 ? undefined$1 : getProto$2(new Map()[Symbol.iterator]()),
9809
9894
  '%Math%': Math,
9810
9895
  '%Number%': Number,
9811
9896
  '%Object%': $Object$2,
@@ -9819,11 +9904,11 @@ var INTRINSICS = {
9819
9904
  '%Reflect%': typeof Reflect === 'undefined' ? undefined$1 : Reflect,
9820
9905
  '%RegExp%': RegExp,
9821
9906
  '%Set%': typeof Set === 'undefined' ? undefined$1 : Set,
9822
- '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols$2 || !getProto$2 ? undefined$1 : getProto$2(new Set()[Symbol.iterator]()),
9907
+ '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols$3 || !getProto$2 ? undefined$1 : getProto$2(new Set()[Symbol.iterator]()),
9823
9908
  '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer,
9824
9909
  '%String%': String,
9825
- '%StringIteratorPrototype%': hasSymbols$2 && getProto$2 ? getProto$2(''[Symbol.iterator]()) : undefined$1,
9826
- '%Symbol%': hasSymbols$2 ? Symbol : undefined$1,
9910
+ '%StringIteratorPrototype%': hasSymbols$3 && getProto$2 ? getProto$2(''[Symbol.iterator]()) : undefined$1,
9911
+ '%Symbol%': hasSymbols$3 ? Symbol : undefined$1,
9827
9912
  '%SyntaxError%': $SyntaxError$1,
9828
9913
  '%ThrowTypeError%': ThrowTypeError,
9829
9914
  '%TypedArray%': TypedArray,
@@ -10176,12 +10261,12 @@ var callBound$i = function callBoundIntrinsic(name, allowMissing) {
10176
10261
 
10177
10262
  // modified from https://github.com/es-shims/es6-shim
10178
10263
  var objectKeys$1 = objectKeys$2;
10179
- var hasSymbols$1 = requireShams$1()();
10264
+ var hasSymbols$2 = requireShams()();
10180
10265
  var callBound$h = callBound$i;
10181
10266
  var $Object$1 = esObjectAtoms;
10182
10267
  var $push = callBound$h('Array.prototype.push');
10183
10268
  var $propIsEnumerable = callBound$h('Object.prototype.propertyIsEnumerable');
10184
- var originalGetSymbols = hasSymbols$1 ? $Object$1.getOwnPropertySymbols : null;
10269
+ var originalGetSymbols = hasSymbols$2 ? $Object$1.getOwnPropertySymbols : null;
10185
10270
 
10186
10271
  // eslint-disable-next-line no-unused-vars
10187
10272
  var implementation$8 = function assign(target, source1) {
@@ -10195,7 +10280,7 @@ var implementation$8 = function assign(target, source1) {
10195
10280
 
10196
10281
  // step 3.a.ii:
10197
10282
  var keys = objectKeys$1(from);
10198
- var getSymbols = hasSymbols$1 && ($Object$1.getOwnPropertySymbols || originalGetSymbols);
10283
+ var getSymbols = hasSymbols$2 && ($Object$1.getOwnPropertySymbols || originalGetSymbols);
10199
10284
  if (getSymbols) {
10200
10285
  var syms = getSymbols(from);
10201
10286
  for (var j = 0; j < syms.length; ++j) {
@@ -10492,23 +10577,14 @@ var regexp_prototype_flags = flagsBound;
10492
10577
 
10493
10578
  var esGetIterator = {exports: {}};
10494
10579
 
10495
- var shams;
10496
- var hasRequiredShams;
10497
-
10498
- function requireShams () {
10499
- if (hasRequiredShams) return shams;
10500
- hasRequiredShams = 1;
10580
+ var hasSymbols$1 = requireShams();
10501
10581
 
10502
- var hasSymbols = requireShams$1();
10503
-
10504
- /** @type {import('.')} */
10505
- shams = function hasToStringTagShams() {
10506
- return hasSymbols() && !!Symbol.toStringTag;
10507
- };
10508
- return shams;
10509
- }
10582
+ /** @type {import('.')} */
10583
+ var shams = function hasToStringTagShams() {
10584
+ return hasSymbols$1() && !!Symbol.toStringTag;
10585
+ };
10510
10586
 
10511
- var hasToStringTag$7 = requireShams()();
10587
+ var hasToStringTag$7 = shams();
10512
10588
  var callBound$f = callBound$i;
10513
10589
 
10514
10590
  var $toString$7 = callBound$f('Object.prototype.toString');
@@ -11545,7 +11621,7 @@ var tryStringObject = function tryStringObject(value) {
11545
11621
  /** @type {(receiver: ThisParameterType<typeof Object.prototype.toString>, ...args: Parameters<typeof Object.prototype.toString>) => ReturnType<typeof Object.prototype.toString>} */
11546
11622
  var $toString$6 = callBound$c('Object.prototype.toString');
11547
11623
  var strClass = '[object String]';
11548
- var hasToStringTag$6 = requireShams()();
11624
+ var hasToStringTag$6 = shams();
11549
11625
 
11550
11626
  /** @type {import('.')} */
11551
11627
  var isString$2 = function isString(value) {
@@ -11661,7 +11737,7 @@ var isSet$2 = exported$1 || function isSet(x) {
11661
11737
  var isArguments$1 = isArguments$2;
11662
11738
  var getStopIterationIterator = stopIterationIterator;
11663
11739
 
11664
- if (hasSymbols$3() || requireShams$1()()) {
11740
+ if (hasSymbols$4() || requireShams()()) {
11665
11741
  var $iterator = Symbol.iterator;
11666
11742
  // Symbol is available natively or shammed
11667
11743
  // natively:
@@ -11950,7 +12026,7 @@ var tryDateObject = function tryDateGetDayCall(value) {
11950
12026
  /** @type {(value: unknown) => string} */
11951
12027
  var toStr$2 = callBound$9('Object.prototype.toString');
11952
12028
  var dateClass = '[object Date]';
11953
- var hasToStringTag$5 = requireShams()();
12029
+ var hasToStringTag$5 = shams();
11954
12030
 
11955
12031
  /** @type {import('.')} */
11956
12032
  var isDateObject = function isDateObject(value) {
@@ -11961,7 +12037,7 @@ var isDateObject = function isDateObject(value) {
11961
12037
  };
11962
12038
 
11963
12039
  var callBound$8 = callBound$i;
11964
- var hasToStringTag$4 = requireShams()();
12040
+ var hasToStringTag$4 = shams();
11965
12041
  var hasOwn = hasown;
11966
12042
  var gOPD$1 = gopd$1;
11967
12043
 
@@ -12066,7 +12142,7 @@ var tryNumberObject = function tryNumberObject(value) {
12066
12142
  };
12067
12143
  var $toString$3 = callBound$6('Object.prototype.toString');
12068
12144
  var numClass = '[object Number]';
12069
- var hasToStringTag$3 = requireShams()();
12145
+ var hasToStringTag$3 = shams();
12070
12146
 
12071
12147
  /** @type {import('.')} */
12072
12148
  var isNumberObject = function isNumberObject(value) {
@@ -12093,7 +12169,7 @@ var tryBooleanObject = function booleanBrandCheck(value) {
12093
12169
  }
12094
12170
  };
12095
12171
  var boolClass = '[object Boolean]';
12096
- var hasToStringTag$2 = requireShams()();
12172
+ var hasToStringTag$2 = shams();
12097
12173
 
12098
12174
  /** @type {import('.')} */
12099
12175
  var isBooleanObject = function isBoolean(value) {
@@ -12135,7 +12211,7 @@ function requireSafeRegexTest () {
12135
12211
 
12136
12212
  var callBound$4 = callBound$i;
12137
12213
  var $toString$1 = callBound$4('Object.prototype.toString');
12138
- var hasSymbols = hasSymbols$3();
12214
+ var hasSymbols = hasSymbols$4();
12139
12215
  var safeRegexTest = requireSafeRegexTest();
12140
12216
 
12141
12217
  if (hasSymbols) {
@@ -12581,7 +12657,7 @@ var gOPD = gopd$1;
12581
12657
  var getProto = getProto$3;
12582
12658
 
12583
12659
  var $toString = callBound$2('Object.prototype.toString');
12584
- var hasToStringTag = requireShams()();
12660
+ var hasToStringTag = shams();
12585
12661
 
12586
12662
  var g = typeof globalThis === 'undefined' ? commonjsGlobal : globalThis;
12587
12663
  var typedArrays = availableTypedArrays();