@trops/dash-react 1.0.25 → 1.0.26

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.js CHANGED
@@ -2,8 +2,8 @@ import { library } from '@fortawesome/fontawesome-svg-core';
2
2
  import * as SolidIcons from '@fortawesome/free-solid-svg-icons';
3
3
  export * from '@fortawesome/free-solid-svg-icons';
4
4
  import * as BrandIcons from '@fortawesome/free-brands-svg-icons';
5
- import React, { createContext, useContext, createElement, useMemo, useEffect, useState, useRef, Fragment, useCallback, Children } from 'react';
6
- import { jsxs, jsx, Fragment as Fragment$1 } from 'react/jsx-runtime';
5
+ import React, { createContext, useContext, useState, useCallback, useMemo, createElement, useEffect, useRef, Fragment, Children } from 'react';
6
+ import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
7
7
  import { Dialog, Transition } from '@headlessui/react';
8
8
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
9
9
  export { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
@@ -29,6 +29,93 @@ var ThemeContext = /*#__PURE__*/createContext({
29
29
  rawThemes: null
30
30
  });
31
31
 
32
+ function _typeof$H(o) { "@babel/helpers - typeof"; return _typeof$H = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof$H(o); }
33
+ function ownKeys$A(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
34
+ function _objectSpread$A(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$A(Object(t), !0).forEach(function (r) { _defineProperty$B(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$A(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
35
+ function _defineProperty$B(e, r, t) { return (r = _toPropertyKey$F(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
36
+ function _toPropertyKey$F(t) { var i = _toPrimitive$F(t, "string"); return "symbol" == _typeof$H(i) ? i : i + ""; }
37
+ function _toPrimitive$F(t, r) { if ("object" != _typeof$H(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof$H(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
38
+ function _slicedToArray$c(r, e) { return _arrayWithHoles$c(r) || _iterableToArrayLimit$c(r, e) || _unsupportedIterableToArray$f(r, e) || _nonIterableRest$c(); }
39
+ function _nonIterableRest$c() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
40
+ function _unsupportedIterableToArray$f(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$f(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$f(r, a) : void 0; } }
41
+ function _arrayLikeToArray$f(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; }
42
+ function _iterableToArrayLimit$c(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
43
+ function _arrayWithHoles$c(r) { if (Array.isArray(r)) return r; }
44
+ var ThemePreviewProvider = function ThemePreviewProvider(_ref) {
45
+ var children = _ref.children;
46
+ var parentCtx = useContext(ThemeContext);
47
+ var _useState = useState(null),
48
+ _useState2 = _slicedToArray$c(_useState, 2),
49
+ previewTheme = _useState2[0],
50
+ setPreviewThemeState = _useState2[1];
51
+ var _useState3 = useState(true),
52
+ _useState4 = _slicedToArray$c(_useState3, 2),
53
+ showPreview = _useState4[0],
54
+ setShowPreview = _useState4[1];
55
+ var isPreview = previewTheme !== null && showPreview;
56
+ var setPreviewTheme = useCallback(function (theme) {
57
+ setPreviewThemeState(theme);
58
+ setShowPreview(true);
59
+ }, []);
60
+ var clearPreview = useCallback(function () {
61
+ setPreviewThemeState(null);
62
+ setShowPreview(true);
63
+ }, []);
64
+ var togglePreview = useCallback(function () {
65
+ setShowPreview(function (prev) {
66
+ return !prev;
67
+ });
68
+ }, []);
69
+
70
+ // Build the overridden context value
71
+ var ctxValue = useMemo(function () {
72
+ if (!isPreview) return parentCtx;
73
+ return _objectSpread$A(_objectSpread$A({}, parentCtx), {}, {
74
+ currentTheme: previewTheme
75
+ });
76
+ }, [parentCtx, isPreview, previewTheme]);
77
+
78
+ // Preview control bag — passed to render-prop children and available via useThemePreview
79
+ var previewControls = useMemo(function () {
80
+ return {
81
+ isPreview: isPreview,
82
+ showPreview: showPreview,
83
+ previewTheme: previewTheme,
84
+ setPreviewTheme: setPreviewTheme,
85
+ clearPreview: clearPreview,
86
+ togglePreview: togglePreview
87
+ };
88
+ }, [isPreview, showPreview, previewTheme, setPreviewTheme, clearPreview, togglePreview]);
89
+ var content = typeof children === "function" ? children(previewControls) : children;
90
+ return /*#__PURE__*/jsx(ThemePreviewContext.Provider, {
91
+ value: previewControls,
92
+ children: /*#__PURE__*/jsx(ThemeContext.Provider, {
93
+ value: ctxValue,
94
+ children: content
95
+ })
96
+ });
97
+ };
98
+
99
+ /**
100
+ * Separate context for preview controls so components can access
101
+ * preview state without re-creating the ThemeContext provider.
102
+ */
103
+ var ThemePreviewContext = /*#__PURE__*/createContext({
104
+ isPreview: false,
105
+ showPreview: true,
106
+ previewTheme: null,
107
+ setPreviewTheme: function setPreviewTheme() {},
108
+ clearPreview: function clearPreview() {},
109
+ togglePreview: function togglePreview() {}
110
+ });
111
+
112
+ /**
113
+ * useThemePreview — access preview controls from any descendant.
114
+ */
115
+ var useThemePreview = function useThemePreview() {
116
+ return useContext(ThemePreviewContext);
117
+ };
118
+
32
119
  var WidgetContext = /*#__PURE__*/createContext({
33
120
  widgetData: null
34
121
  });
@@ -8212,6 +8299,7 @@ var URL_REGEX = /^https?:\/\/.+\..+/i;
8212
8299
  * - onExtract: async (url) => { palette, roleAssignments, suggestedName }
8213
8300
  * - onGenerate: (theme) => void — called when user clicks Generate Theme
8214
8301
  * - onMapToTheme: async (palette, roleAssignments) => theme object
8302
+ * - onPreview: (theme) => void — called with generated theme for live preview (optional)
8215
8303
  * - inline: boolean — if true, omits outer padding (for embedding in wizard)
8216
8304
  * - className: additional CSS classes
8217
8305
  */
@@ -8222,6 +8310,8 @@ var ThemeFromUrlPane = function ThemeFromUrlPane(_ref) {
8222
8310
  onGenerate = _ref$onGenerate === void 0 ? null : _ref$onGenerate,
8223
8311
  _ref$onMapToTheme = _ref.onMapToTheme,
8224
8312
  onMapToTheme = _ref$onMapToTheme === void 0 ? null : _ref$onMapToTheme,
8313
+ _ref$onPreview = _ref.onPreview,
8314
+ onPreview = _ref$onPreview === void 0 ? null : _ref$onPreview,
8225
8315
  _ref$inline = _ref.inline,
8226
8316
  inline = _ref$inline === void 0 ? false : _ref$inline,
8227
8317
  _ref$className = _ref.className,
@@ -8302,7 +8392,7 @@ var ThemeFromUrlPane = function ThemeFromUrlPane(_ref) {
8302
8392
 
8303
8393
  // Auto-generate theme if mapper is available
8304
8394
  if (!onMapToTheme) {
8305
- _context.next = 22;
8395
+ _context.next = 23;
8306
8396
  break;
8307
8397
  }
8308
8398
  _context.next = 20;
@@ -8310,23 +8400,24 @@ var ThemeFromUrlPane = function ThemeFromUrlPane(_ref) {
8310
8400
  case 20:
8311
8401
  theme = _context.sent;
8312
8402
  setGeneratedTheme(theme);
8313
- case 22:
8314
- _context.next = 28;
8403
+ if (onPreview) onPreview(theme);
8404
+ case 23:
8405
+ _context.next = 29;
8315
8406
  break;
8316
- case 24:
8317
- _context.prev = 24;
8407
+ case 25:
8408
+ _context.prev = 25;
8318
8409
  _context.t0 = _context["catch"](7);
8319
8410
  message = (_context.t0 === null || _context.t0 === void 0 ? void 0 : _context.t0.message) || "Failed to extract colors. Check the URL and try again.";
8320
8411
  setError(message);
8321
- case 28:
8322
- _context.prev = 28;
8412
+ case 29:
8413
+ _context.prev = 29;
8323
8414
  setLoading(false);
8324
- return _context.finish(28);
8325
- case 31:
8415
+ return _context.finish(29);
8416
+ case 32:
8326
8417
  case "end":
8327
8418
  return _context.stop();
8328
8419
  }
8329
- }, _callee, null, [[7, 24, 28, 31]]);
8420
+ }, _callee, null, [[7, 25, 29, 32]]);
8330
8421
  }));
8331
8422
  return _handleExtract.apply(this, arguments);
8332
8423
  }
@@ -8343,6 +8434,7 @@ var ThemeFromUrlPane = function ThemeFromUrlPane(_ref) {
8343
8434
  if (onMapToTheme) {
8344
8435
  onMapToTheme(palette, newAssignments).then(function (theme) {
8345
8436
  setGeneratedTheme(theme);
8437
+ if (onPreview) onPreview(theme);
8346
8438
  });
8347
8439
  }
8348
8440
  }
@@ -8469,6 +8561,85 @@ function deriveNameFromUrl(url) {
8469
8561
  }
8470
8562
  }
8471
8563
 
8564
+ var ThemePreviewBanner = function ThemePreviewBanner(_ref) {
8565
+ var _ref$onSave = _ref.onSave,
8566
+ onSave = _ref$onSave === void 0 ? null : _ref$onSave,
8567
+ _ref$onCancel = _ref.onCancel,
8568
+ onCancel = _ref$onCancel === void 0 ? null : _ref$onCancel,
8569
+ _ref$position = _ref.position,
8570
+ position = _ref$position === void 0 ? "bottom" : _ref$position,
8571
+ _ref$className = _ref.className,
8572
+ className = _ref$className === void 0 ? "" : _ref$className;
8573
+ var _useContext = useContext(ThemeContext),
8574
+ currentTheme = _useContext.currentTheme;
8575
+ var _useThemePreview = useThemePreview(),
8576
+ isPreview = _useThemePreview.isPreview,
8577
+ showPreview = _useThemePreview.showPreview,
8578
+ togglePreview = _useThemePreview.togglePreview,
8579
+ clearPreview = _useThemePreview.clearPreview;
8580
+ if (!isPreview && showPreview) return null;
8581
+
8582
+ // Only show when there's a preview theme loaded (even if toggled off)
8583
+ var _useThemePreview2 = useThemePreview(),
8584
+ previewTheme = _useThemePreview2.previewTheme;
8585
+ if (!previewTheme) return null;
8586
+ getStylesForItem(themeObjects.BUTTON, currentTheme, {
8587
+ scrollable: false,
8588
+ grow: false
8589
+ });
8590
+ var positionClasses = position === "top" ? "top-0 left-0 right-0" : "bottom-0 left-0 right-0";
8591
+ function handleSave() {
8592
+ if (onSave) onSave();
8593
+ }
8594
+ function handleCancel() {
8595
+ if (onCancel) {
8596
+ onCancel();
8597
+ } else {
8598
+ clearPreview();
8599
+ }
8600
+ }
8601
+ return /*#__PURE__*/jsx("div", {
8602
+ className: "fixed ".concat(positionClasses, " z-50 flex items-center justify-center p-3 ").concat(className),
8603
+ children: /*#__PURE__*/jsxs("div", {
8604
+ className: "flex flex-row items-center gap-3 px-4 py-2.5 rounded-lg bg-amber-500/90 text-black shadow-lg backdrop-blur-sm",
8605
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
8606
+ icon: "eye",
8607
+ className: "h-3.5 w-3.5"
8608
+ }), /*#__PURE__*/jsx("span", {
8609
+ className: "text-sm font-semibold",
8610
+ children: "Preview Mode"
8611
+ }), /*#__PURE__*/jsx("div", {
8612
+ className: "w-px h-5 bg-black/20"
8613
+ }), /*#__PURE__*/jsxs("button", {
8614
+ type: "button",
8615
+ onClick: togglePreview,
8616
+ className: "flex items-center gap-1.5 px-2.5 py-1 rounded text-xs font-medium bg-black/10 hover:bg-black/20 transition-colors",
8617
+ title: showPreview ? "Show original theme" : "Show preview theme",
8618
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
8619
+ icon: showPreview ? "eye-slash" : "eye",
8620
+ className: "h-3 w-3"
8621
+ }), showPreview ? "Original" : "Preview"]
8622
+ }), onSave && /*#__PURE__*/jsxs("button", {
8623
+ type: "button",
8624
+ onClick: handleSave,
8625
+ className: "flex items-center gap-1.5 px-2.5 py-1 rounded text-xs font-medium bg-black/20 hover:bg-black/30 transition-colors",
8626
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
8627
+ icon: "check",
8628
+ className: "h-3 w-3"
8629
+ }), "Save"]
8630
+ }), /*#__PURE__*/jsxs("button", {
8631
+ type: "button",
8632
+ onClick: handleCancel,
8633
+ className: "flex items-center gap-1.5 px-2.5 py-1 rounded text-xs font-medium bg-black/10 hover:bg-black/20 transition-colors",
8634
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
8635
+ icon: "xmark",
8636
+ className: "h-3 w-3"
8637
+ }), "Cancel"]
8638
+ })]
8639
+ })
8640
+ });
8641
+ };
8642
+
8472
8643
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
8473
8644
  function _regeneratorRuntime() { var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
8474
8645
  function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
@@ -8677,5 +8848,5 @@ if (process.env.NODE_ENV !== "development") {
8677
8848
  console.log = function () {};
8678
8849
  }
8679
8850
 
8680
- export { Accordion, Accordion2, Accordion3, Alert, Alert2, Alert3, AlertBanner, AlgoliaRefinementList, AlgoliaSearchBox, Breadcrumbs, Breadcrumbs2, Breadcrumbs3, Button, Button2, Button3, ButtonIcon, ButtonIcon2, ButtonIcon3, Card, Card2, Card3, Checkbox, CodeEditorInline, CodeEditorVS, CodeRenderer, CommandPalette, ConfirmationModal, Container, DashPanel, DashPanel2, DashPanel3, DataList, DragComponent, Drawer, DropComponent, DropdownPanel, DropdownPanel2, DropdownPanel3, EmptyState, ErrorMessage, FormField, FormLabel, Heading, Heading2, Heading3, Icon, Icon2, Icon3, InputText, LayoutContainer, MainSection, Menu, Menu2, Menu3, MenuItem, MenuItem2, MenuItem3, MockAlgolia, MockLayout, MockWrapper, Modal, Navbar, PalettePreviewPane, Panel, Panel2, Panel3, Paragraph, Paragraph2, Paragraph3, ProgressBar, ProgressBar2, ProgressBar3, RadioGroup, SearchInput, SelectInput, SelectMenu, SettingsModal, Sidebar, Skeleton, Slider, StatCard, Stepper, SubHeading, SubHeading2, SubHeading3, Switch, TabbedNavbar, Table, Table2, Table3, Tabs, Tabs2, Tabs3, Tag, Tag2, Tag3, TextArea, ThemeContext, ThemeFromUrlPane, Toast, Toast2, Toast3, Toggle, Toggle2, Toggle3, Tooltip, WidgetChrome, WidgetContext, capitalizeFirstLetter, colorNames, colorTypes, deepCopy, getCSSStyleForClassname, getClassForObjectType, getDefaultStylesForItem, getRandomInt, getStyleName, getStylesForItem, getUUID$1 as getUUID, isObject, mock, mockText, objectTypes, shades, styleClassNames, tailwindHeightFractions, themeObjects, themeVariants, useSidebar, withRouter };
8851
+ export { Accordion, Accordion2, Accordion3, Alert, Alert2, Alert3, AlertBanner, AlgoliaRefinementList, AlgoliaSearchBox, Breadcrumbs, Breadcrumbs2, Breadcrumbs3, Button, Button2, Button3, ButtonIcon, ButtonIcon2, ButtonIcon3, Card, Card2, Card3, Checkbox, CodeEditorInline, CodeEditorVS, CodeRenderer, CommandPalette, ConfirmationModal, Container, DashPanel, DashPanel2, DashPanel3, DataList, DragComponent, Drawer, DropComponent, DropdownPanel, DropdownPanel2, DropdownPanel3, EmptyState, ErrorMessage, FormField, FormLabel, Heading, Heading2, Heading3, Icon, Icon2, Icon3, InputText, LayoutContainer, MainSection, Menu, Menu2, Menu3, MenuItem, MenuItem2, MenuItem3, MockAlgolia, MockLayout, MockWrapper, Modal, Navbar, PalettePreviewPane, Panel, Panel2, Panel3, Paragraph, Paragraph2, Paragraph3, ProgressBar, ProgressBar2, ProgressBar3, RadioGroup, SearchInput, SelectInput, SelectMenu, SettingsModal, Sidebar, Skeleton, Slider, StatCard, Stepper, SubHeading, SubHeading2, SubHeading3, Switch, TabbedNavbar, Table, Table2, Table3, Tabs, Tabs2, Tabs3, Tag, Tag2, Tag3, TextArea, ThemeContext, ThemeFromUrlPane, ThemePreviewBanner, ThemePreviewContext, ThemePreviewProvider, Toast, Toast2, Toast3, Toggle, Toggle2, Toggle3, Tooltip, WidgetChrome, WidgetContext, capitalizeFirstLetter, colorNames, colorTypes, deepCopy, getCSSStyleForClassname, getClassForObjectType, getDefaultStylesForItem, getRandomInt, getStyleName, getStylesForItem, getUUID$1 as getUUID, isObject, mock, mockText, objectTypes, shades, styleClassNames, tailwindHeightFractions, themeObjects, themeVariants, useSidebar, useThemePreview, withRouter };
8681
8852
  //# sourceMappingURL=index.js.map