powr-sdk-web 6.0.0 → 6.2.0

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.
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.v = exports.s = exports.SIDEBAR_WIDTH = exports.NARROW_QUERY = exports.HEADER_HEIGHT = void 0;
7
+ var _tokens = require("../theme/tokens");
8
+ 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); }
9
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
10
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
11
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
12
+ /**
13
+ * Shell styles. Every colour is a `--powr-*` var with today's neutral as the
14
+ * fallback — the wrapper has no palette of its own (clone-leak guardrail).
15
+ */
16
+
17
+ var v = exports.v = {
18
+ bg: (0, _tokens.powrVar)("bg", "#fafafa"),
19
+ surface: (0, _tokens.powrVar)("surface", "#ffffff"),
20
+ text: (0, _tokens.powrVar)("text", "#111827"),
21
+ muted: (0, _tokens.powrVar)("muted", "#6b7280"),
22
+ border: (0, _tokens.powrVar)("border", "#e5e7eb"),
23
+ primary: (0, _tokens.powrVar)("primary", "#2563eb"),
24
+ primaryFg: (0, _tokens.powrVar)("primary-fg", "#ffffff"),
25
+ danger: (0, _tokens.powrVar)("danger", "#dc2626"),
26
+ radius: (0, _tokens.powrVar)("radius", "0.5rem"),
27
+ font: (0, _tokens.powrVar)("font", "system-ui, -apple-system, Segoe UI, Roboto, sans-serif")
28
+ };
29
+ var SIDEBAR_WIDTH = exports.SIDEBAR_WIDTH = 240;
30
+ var HEADER_HEIGHT = exports.HEADER_HEIGHT = 56;
31
+ var NARROW_QUERY = exports.NARROW_QUERY = "(max-width: 900px)";
32
+ var s = exports.s = {
33
+ root: {
34
+ minHeight: "100vh",
35
+ display: "flex",
36
+ flexDirection: "column",
37
+ background: v.bg,
38
+ color: v.text,
39
+ fontFamily: v.font
40
+ },
41
+ header: {
42
+ position: "sticky",
43
+ top: 0,
44
+ zIndex: 40,
45
+ height: HEADER_HEIGHT,
46
+ display: "flex",
47
+ alignItems: "center",
48
+ gap: 16,
49
+ padding: "0 16px",
50
+ borderBottom: "1px solid ".concat(v.border),
51
+ background: v.surface
52
+ },
53
+ brand: {
54
+ display: "inline-flex",
55
+ alignItems: "center",
56
+ gap: 8,
57
+ fontWeight: 700,
58
+ fontSize: 16,
59
+ color: v.text,
60
+ textDecoration: "none",
61
+ whiteSpace: "nowrap"
62
+ },
63
+ headerNav: {
64
+ display: "flex",
65
+ alignItems: "center",
66
+ gap: 4,
67
+ marginLeft: 8
68
+ },
69
+ headerRight: {
70
+ marginLeft: "auto",
71
+ display: "flex",
72
+ alignItems: "center",
73
+ gap: 8
74
+ },
75
+ body: {
76
+ display: "flex",
77
+ flex: 1,
78
+ minHeight: 0
79
+ },
80
+ sidebar: {
81
+ width: SIDEBAR_WIDTH,
82
+ flexShrink: 0,
83
+ position: "sticky",
84
+ top: HEADER_HEIGHT,
85
+ alignSelf: "flex-start",
86
+ height: "calc(100vh - ".concat(HEADER_HEIGHT, "px)"),
87
+ overflowY: "auto",
88
+ padding: 12,
89
+ borderRight: "1px solid ".concat(v.border),
90
+ background: v.surface
91
+ },
92
+ main: {
93
+ flex: 1,
94
+ minWidth: 0,
95
+ padding: "calc(24px * var(--powr-density, 1))"
96
+ },
97
+ footer: {
98
+ padding: "12px 16px",
99
+ borderTop: "1px solid ".concat(v.border),
100
+ color: v.muted,
101
+ fontSize: 12,
102
+ background: v.surface
103
+ },
104
+ navItem: function navItem(active, vertical) {
105
+ return {
106
+ display: "flex",
107
+ alignItems: "center",
108
+ gap: 10,
109
+ padding: vertical ? "9px 12px" : "6px 10px",
110
+ borderRadius: v.radius,
111
+ fontSize: 14,
112
+ lineHeight: 1.2,
113
+ textDecoration: "none",
114
+ cursor: "pointer",
115
+ whiteSpace: "nowrap",
116
+ color: active ? v.primary : v.text,
117
+ background: active ? "color-mix(in srgb, ".concat(v.primary, " 10%, transparent)") : "transparent",
118
+ fontWeight: active ? 600 : 500
119
+ };
120
+ },
121
+ navIcon: {
122
+ display: "inline-flex",
123
+ width: 18,
124
+ justifyContent: "center",
125
+ color: "inherit"
126
+ },
127
+ iconButton: {
128
+ width: 36,
129
+ height: 36,
130
+ display: "inline-flex",
131
+ alignItems: "center",
132
+ justifyContent: "center",
133
+ borderRadius: v.radius,
134
+ border: "1px solid ".concat(v.border),
135
+ background: v.surface,
136
+ color: v.text,
137
+ cursor: "pointer",
138
+ fontSize: 16,
139
+ padding: 0
140
+ },
141
+ avatarButton: {
142
+ display: "inline-flex",
143
+ alignItems: "center",
144
+ gap: 8,
145
+ height: 36,
146
+ padding: "0 10px 0 4px",
147
+ borderRadius: 999,
148
+ border: "1px solid ".concat(v.border),
149
+ background: v.surface,
150
+ color: v.text,
151
+ cursor: "pointer",
152
+ fontSize: 13
153
+ },
154
+ avatar: {
155
+ width: 28,
156
+ height: 28,
157
+ borderRadius: "50%",
158
+ display: "inline-flex",
159
+ alignItems: "center",
160
+ justifyContent: "center",
161
+ background: v.primary,
162
+ color: v.primaryFg,
163
+ fontSize: 12,
164
+ fontWeight: 700
165
+ },
166
+ menu: {
167
+ position: "absolute",
168
+ right: 0,
169
+ top: "calc(100% + 6px)",
170
+ minWidth: 220,
171
+ padding: 6,
172
+ borderRadius: v.radius,
173
+ border: "1px solid ".concat(v.border),
174
+ background: v.surface,
175
+ boxShadow: "0 10px 30px rgba(0,0,0,0.12)",
176
+ zIndex: 50
177
+ },
178
+ menuHeader: {
179
+ padding: "8px 10px 10px",
180
+ borderBottom: "1px solid ".concat(v.border),
181
+ marginBottom: 4
182
+ },
183
+ menuItem: function menuItem(danger) {
184
+ return {
185
+ display: "flex",
186
+ width: "100%",
187
+ alignItems: "center",
188
+ gap: 8,
189
+ padding: "8px 10px",
190
+ borderRadius: "calc(".concat(v.radius, " - 2px)"),
191
+ border: "none",
192
+ background: "transparent",
193
+ color: danger ? v.danger : v.text,
194
+ fontSize: 14,
195
+ textAlign: "left",
196
+ textDecoration: "none",
197
+ cursor: "pointer"
198
+ };
199
+ },
200
+ overlay: {
201
+ position: "fixed",
202
+ inset: 0,
203
+ background: "rgba(0,0,0,0.4)",
204
+ zIndex: 60
205
+ },
206
+ drawer: function drawer(side) {
207
+ return _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({
208
+ position: "fixed",
209
+ top: 0,
210
+ bottom: 0
211
+ }, side, 0), "width", "min(360px, 90vw)"), "padding", 16), "overflowY", "auto"), "background", v.surface), "color", v.text), "borderLeft", side === "right" ? "1px solid ".concat(v.border) : "none"), "borderRight", side === "left" ? "1px solid ".concat(v.border) : "none"), "boxShadow", "0 0 40px rgba(0,0,0,0.2)"), "zIndex", 61);
212
+ },
213
+ drawerHead: {
214
+ display: "flex",
215
+ alignItems: "center",
216
+ justifyContent: "space-between",
217
+ marginBottom: 12
218
+ },
219
+ gatePage: {
220
+ minHeight: "100vh",
221
+ display: "flex",
222
+ flexDirection: "column",
223
+ background: v.bg,
224
+ color: v.text,
225
+ fontFamily: v.font
226
+ },
227
+ gateCard: {
228
+ width: "min(480px, 100%)",
229
+ margin: "40px auto",
230
+ padding: 8
231
+ },
232
+ skeletonBar: function skeletonBar(w) {
233
+ return {
234
+ height: 12,
235
+ width: w,
236
+ borderRadius: 6,
237
+ background: v.border,
238
+ opacity: 0.6
239
+ };
240
+ }
241
+ };
@@ -4,7 +4,12 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports["default"] = PowrThemeProvider;
7
- exports.powrThemeStorageKey = powrThemeStorageKey;
7
+ Object.defineProperty(exports, "powrThemeStorageKey", {
8
+ enumerable: true,
9
+ get: function get() {
10
+ return _tokens.powrThemeStorageKey;
11
+ }
12
+ });
8
13
  exports.usePowrTheme = usePowrTheme;
9
14
  var _react = _interopRequireWildcard(require("react"));
10
15
  var _tokens = require("./tokens");
@@ -24,11 +29,7 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
24
29
  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); }
25
30
  var config = require("../config");
26
31
  var PowrThemeContext = /*#__PURE__*/(0, _react.createContext)(null);
27
- var STORAGE_PREFIX = "powr-theme";
28
32
  var DARK_QUERY = "(prefers-color-scheme: dark)";
29
- function powrThemeStorageKey(projectId) {
30
- return "".concat(STORAGE_PREFIX, ":").concat(projectId || "default");
31
- }
32
33
  function readStorage(key) {
33
34
  if (typeof window === "undefined") return null;
34
35
  try {
@@ -91,7 +92,7 @@ function PowrThemeProvider(_ref) {
91
92
  className = _ref.className,
92
93
  onChange = _ref.onChange,
93
94
  children = _ref.children;
94
- var storageKey = powrThemeStorageKey(projectId || config.projectId);
95
+ var storageKey = (0, _tokens.powrThemeStorageKey)(projectId || config.projectId);
95
96
  var _useState = (0, _react.useState)(function () {
96
97
  return (0, _tokens.normalizeScheme)(schemeProp);
97
98
  }),
@@ -164,8 +165,10 @@ function PowrThemeProvider(_ref) {
164
165
  }, [resolved]);
165
166
 
166
167
  // attach="root": write on <html> so product CSS, portals and toasts see the same vars.
168
+ // Wait for the cache read: otherwise the first commit writes the prop defaults
169
+ // over what `powrThemeInitScript` already painted (one light frame for dark users).
167
170
  (0, _react.useEffect)(function () {
168
- if (attach !== "root" || typeof document === "undefined") return undefined;
171
+ if (attach !== "root" || typeof document === "undefined" || !hydrated) return undefined;
169
172
  var el = document.documentElement;
170
173
  for (var _i = 0, _Object$keys = Object.keys(cssVars); _i < _Object$keys.length; _i++) {
171
174
  var name = _Object$keys[_i];
@@ -193,11 +196,21 @@ function PowrThemeProvider(_ref) {
193
196
  el.removeAttribute("data-powr-preset");
194
197
  el.style.removeProperty("color-scheme");
195
198
  };
196
- }, [attach, cssVars, resolved.scheme, resolved.density, resolved.preset]);
199
+ }, [attach, hydrated, cssVars, resolved.scheme, resolved.density, resolved.preset]);
197
200
  var commit = (0, _react.useCallback)(function (next) {
198
- if (persist) writeStorage(storageKey, next);
199
201
  if (typeof onChange === "function") onChange(next);
200
- }, [persist, storageKey, onChange]);
202
+ }, [onChange]);
203
+
204
+ // Cache from state, not from setter closures — three back-to-back setX calls
205
+ // (host pull) must leave the cache equal to the final state, not the first.
206
+ (0, _react.useEffect)(function () {
207
+ if (!hydrated || !persist) return;
208
+ writeStorage(storageKey, {
209
+ scheme: scheme,
210
+ density: density,
211
+ preset: preset
212
+ });
213
+ }, [hydrated, persist, storageKey, scheme, density, preset]);
201
214
  var setScheme = (0, _react.useCallback)(function (value) {
202
215
  var s = (0, _tokens.normalizeScheme)(value);
203
216
  setSchemeState(s);
@@ -0,0 +1,323 @@
1
+ "use strict";
2
+
3
+ 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); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = PowrThemeSettings;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _PowrThemeProvider = require("./PowrThemeProvider");
10
+ var _tokens = require("./tokens");
11
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t2 in e) "default" !== _t2 && {}.hasOwnProperty.call(e, _t2) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t2)) && (i.get || i.set) ? o(f, _t2, i) : f[_t2] = e[_t2]); return f; })(e, t); }
12
+ function ownKeys(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; }
13
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
14
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
15
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
16
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
17
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
18
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
19
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
20
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
21
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
22
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
23
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(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(r, a) : void 0; } }
24
+ function _arrayLikeToArray(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; }
25
+ function _iterableToArrayLimit(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; } }
26
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
27
+ /**
28
+ * User-level theme selectors: scheme · density · product preset.
29
+ *
30
+ * Reads and writes through `usePowrTheme()`, so it needs a `PowrThemeProvider`
31
+ * above it. Legacy apps mount this inside their own Settings page; the
32
+ * wrapper opens it in a drawer. Presets come from the product — this panel
33
+ * never invents colours (no colour wheel).
34
+ *
35
+ * `onSave` is the hook for card 3 (host `/users/me/preferences`). Until then
36
+ * changes are live + cached in localStorage by the provider.
37
+ */
38
+
39
+ var SCHEME_LABELS = {
40
+ light: "Light",
41
+ dark: "Dark",
42
+ system: "System"
43
+ };
44
+ var DENSITY_LABELS = {
45
+ comfortable: "Comfortable",
46
+ compact: "Compact"
47
+ };
48
+ var styles = {
49
+ root: {
50
+ display: "grid",
51
+ gap: 20,
52
+ color: (0, _tokens.powrVar)("text", "#111827"),
53
+ fontFamily: (0, _tokens.powrVar)("font", "system-ui, sans-serif")
54
+ },
55
+ title: {
56
+ margin: 0,
57
+ fontSize: 16,
58
+ fontWeight: 600
59
+ },
60
+ label: {
61
+ display: "block",
62
+ fontSize: 12,
63
+ fontWeight: 600,
64
+ letterSpacing: "0.04em",
65
+ textTransform: "uppercase",
66
+ color: (0, _tokens.powrVar)("muted", "#6b7280"),
67
+ marginBottom: 8
68
+ },
69
+ segmented: {
70
+ display: "inline-flex",
71
+ padding: 3,
72
+ gap: 2,
73
+ borderRadius: (0, _tokens.powrVar)("radius", "0.5rem"),
74
+ border: "1px solid ".concat((0, _tokens.powrVar)("border", "#e5e7eb")),
75
+ background: (0, _tokens.powrVar)("bg", "#fafafa")
76
+ },
77
+ segment: function segment(active) {
78
+ return {
79
+ padding: "6px 12px",
80
+ fontSize: 13,
81
+ lineHeight: 1.2,
82
+ borderRadius: "calc(".concat((0, _tokens.powrVar)("radius", "0.5rem"), " - 2px)"),
83
+ border: "none",
84
+ cursor: "pointer",
85
+ background: active ? (0, _tokens.powrVar)("surface", "#fff") : "transparent",
86
+ color: active ? (0, _tokens.powrVar)("text", "#111827") : (0, _tokens.powrVar)("muted", "#6b7280"),
87
+ boxShadow: active ? "0 1px 2px rgba(0,0,0,0.08)" : "none",
88
+ fontWeight: active ? 600 : 400
89
+ };
90
+ },
91
+ presetGrid: {
92
+ display: "grid",
93
+ gridTemplateColumns: "repeat(auto-fill, minmax(140px, 1fr))",
94
+ gap: 8
95
+ },
96
+ presetCard: function presetCard(active) {
97
+ return {
98
+ display: "grid",
99
+ gap: 8,
100
+ padding: 10,
101
+ textAlign: "left",
102
+ cursor: "pointer",
103
+ borderRadius: (0, _tokens.powrVar)("radius", "0.5rem"),
104
+ border: "2px solid ".concat(active ? (0, _tokens.powrVar)("primary", "#2563eb") : (0, _tokens.powrVar)("border", "#e5e7eb")),
105
+ background: (0, _tokens.powrVar)("surface", "#fff"),
106
+ color: (0, _tokens.powrVar)("text", "#111827")
107
+ };
108
+ },
109
+ swatchRow: {
110
+ display: "flex",
111
+ gap: 4
112
+ },
113
+ swatch: function swatch(bg) {
114
+ return {
115
+ width: 18,
116
+ height: 18,
117
+ borderRadius: 4,
118
+ background: bg,
119
+ border: "1px solid ".concat((0, _tokens.powrVar)("border", "#e5e7eb"))
120
+ };
121
+ },
122
+ footer: {
123
+ display: "flex",
124
+ gap: 8,
125
+ alignItems: "center"
126
+ },
127
+ button: function button(primary) {
128
+ return {
129
+ padding: "8px 14px",
130
+ fontSize: 13,
131
+ cursor: "pointer",
132
+ borderRadius: (0, _tokens.powrVar)("radius", "0.5rem"),
133
+ border: "1px solid ".concat(primary ? (0, _tokens.powrVar)("primary", "#2563eb") : (0, _tokens.powrVar)("border", "#e5e7eb")),
134
+ background: primary ? (0, _tokens.powrVar)("primary", "#2563eb") : (0, _tokens.powrVar)("surface", "#fff"),
135
+ color: primary ? (0, _tokens.powrVar)("primary-fg", "#fff") : (0, _tokens.powrVar)("text", "#111827")
136
+ };
137
+ },
138
+ hint: {
139
+ fontSize: 12,
140
+ color: (0, _tokens.powrVar)("muted", "#6b7280"),
141
+ margin: 0
142
+ }
143
+ };
144
+ function Segmented(_ref) {
145
+ var value = _ref.value,
146
+ options = _ref.options,
147
+ labels = _ref.labels,
148
+ onChange = _ref.onChange,
149
+ name = _ref.name;
150
+ return /*#__PURE__*/_react["default"].createElement("div", {
151
+ role: "radiogroup",
152
+ "aria-label": name,
153
+ style: styles.segmented
154
+ }, options.map(function (opt) {
155
+ return /*#__PURE__*/_react["default"].createElement("button", {
156
+ key: opt,
157
+ type: "button",
158
+ role: "radio",
159
+ "aria-checked": value === opt,
160
+ onClick: function onClick() {
161
+ return onChange(opt);
162
+ },
163
+ style: styles.segment(value === opt)
164
+ }, labels[opt] || opt);
165
+ }));
166
+ }
167
+ function presetSwatches(preset, dark) {
168
+ var t = dark && preset.dark || preset.tokens || {};
169
+ return [t.bg, t.surface, t.primary, t.text].filter(Boolean);
170
+ }
171
+
172
+ /**
173
+ * @param {object} props
174
+ * @param {string} [props.title="Appearance"]
175
+ * @param {boolean} [props.showScheme=true]
176
+ * @param {boolean} [props.showDensity=true]
177
+ * @param {boolean} [props.showPresets=true] - Hidden automatically when the product passed no presets.
178
+ * @param {(value: {scheme, density, preset}) => void|Promise<void>} [props.onSave] - Card 3: host save. Shows a Save button when given.
179
+ * @param {boolean} [props.saving]
180
+ * @param {string} [props.saveLabel="Save"]
181
+ */
182
+ function PowrThemeSettings(_ref2) {
183
+ var _ref2$title = _ref2.title,
184
+ title = _ref2$title === void 0 ? "Appearance" : _ref2$title,
185
+ _ref2$showScheme = _ref2.showScheme,
186
+ showScheme = _ref2$showScheme === void 0 ? true : _ref2$showScheme,
187
+ _ref2$showDensity = _ref2.showDensity,
188
+ showDensity = _ref2$showDensity === void 0 ? true : _ref2$showDensity,
189
+ _ref2$showPresets = _ref2.showPresets,
190
+ showPresets = _ref2$showPresets === void 0 ? true : _ref2$showPresets,
191
+ onSave = _ref2.onSave,
192
+ _ref2$saving = _ref2.saving,
193
+ saving = _ref2$saving === void 0 ? false : _ref2$saving,
194
+ _ref2$error = _ref2.error,
195
+ error = _ref2$error === void 0 ? null : _ref2$error,
196
+ _ref2$saveLabel = _ref2.saveLabel,
197
+ saveLabel = _ref2$saveLabel === void 0 ? "Save" : _ref2$saveLabel;
198
+ var t = (0, _PowrThemeProvider.usePowrTheme)();
199
+ var _useState = (0, _react.useState)(null),
200
+ _useState2 = _slicedToArray(_useState, 2),
201
+ savedAt = _useState2[0],
202
+ setSavedAt = _useState2[1];
203
+ var dirty = savedAt === null || savedAt.scheme !== t.scheme || savedAt.density !== t.density || savedAt.preset !== t.preset;
204
+ var handleSave = /*#__PURE__*/function () {
205
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
206
+ var value, _t;
207
+ return _regenerator().w(function (_context) {
208
+ while (1) switch (_context.p = _context.n) {
209
+ case 0:
210
+ value = {
211
+ scheme: t.scheme,
212
+ density: t.density,
213
+ preset: t.preset
214
+ };
215
+ _context.p = 1;
216
+ _context.n = 2;
217
+ return onSave(value);
218
+ case 2:
219
+ setSavedAt(value);
220
+ _context.n = 4;
221
+ break;
222
+ case 3:
223
+ _context.p = 3;
224
+ _t = _context.v;
225
+ case 4:
226
+ return _context.a(2);
227
+ }
228
+ }, _callee, null, [[1, 3]]);
229
+ }));
230
+ return function handleSave() {
231
+ return _ref3.apply(this, arguments);
232
+ };
233
+ }();
234
+ var presets = Array.isArray(t.presets) ? t.presets : [];
235
+ var hasPresets = showPresets && presets.length > 0;
236
+ var isDark = t.resolvedScheme === "dark";
237
+ return /*#__PURE__*/_react["default"].createElement("div", {
238
+ style: styles.root
239
+ }, title ? /*#__PURE__*/_react["default"].createElement("h3", {
240
+ style: styles.title
241
+ }, title) : null, showScheme ? /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("span", {
242
+ style: styles.label
243
+ }, "Scheme"), /*#__PURE__*/_react["default"].createElement(Segmented, {
244
+ name: "Scheme",
245
+ value: t.scheme,
246
+ options: _tokens.POWR_SCHEMES,
247
+ labels: SCHEME_LABELS,
248
+ onChange: t.setScheme
249
+ }), t.scheme === "system" ? /*#__PURE__*/_react["default"].createElement("p", {
250
+ style: _objectSpread(_objectSpread({}, styles.hint), {}, {
251
+ marginTop: 6
252
+ })
253
+ }, "Following your device: ", t.resolvedScheme, ".") : null) : null, showDensity ? /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("span", {
254
+ style: styles.label
255
+ }, "Density"), /*#__PURE__*/_react["default"].createElement(Segmented, {
256
+ name: "Density",
257
+ value: t.density,
258
+ options: Object.keys(_tokens.POWR_DENSITIES),
259
+ labels: DENSITY_LABELS,
260
+ onChange: t.setDensity
261
+ })) : null, hasPresets ? /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("span", {
262
+ style: styles.label
263
+ }, "Theme"), /*#__PURE__*/_react["default"].createElement("div", {
264
+ style: styles.presetGrid
265
+ }, /*#__PURE__*/_react["default"].createElement("button", {
266
+ type: "button",
267
+ "aria-pressed": !t.preset,
268
+ onClick: function onClick() {
269
+ return t.setPreset(null);
270
+ },
271
+ style: styles.presetCard(!t.preset)
272
+ }, /*#__PURE__*/_react["default"].createElement("span", {
273
+ style: {
274
+ fontSize: 13,
275
+ fontWeight: 600
276
+ }
277
+ }, "Default"), /*#__PURE__*/_react["default"].createElement("span", {
278
+ style: styles.hint
279
+ }, "App\u2019s standard look")), presets.map(function (p) {
280
+ return /*#__PURE__*/_react["default"].createElement("button", {
281
+ key: p.id,
282
+ type: "button",
283
+ "aria-pressed": t.preset === p.id,
284
+ onClick: function onClick() {
285
+ return t.setPreset(p.id);
286
+ },
287
+ style: styles.presetCard(t.preset === p.id)
288
+ }, /*#__PURE__*/_react["default"].createElement("span", {
289
+ style: {
290
+ fontSize: 13,
291
+ fontWeight: 600
292
+ }
293
+ }, p.label || p.id), /*#__PURE__*/_react["default"].createElement("span", {
294
+ style: styles.swatchRow
295
+ }, presetSwatches(p, isDark).map(function (c, i) {
296
+ return /*#__PURE__*/_react["default"].createElement("span", {
297
+ key: i,
298
+ style: styles.swatch(c)
299
+ });
300
+ })));
301
+ }))) : null, /*#__PURE__*/_react["default"].createElement("div", {
302
+ style: styles.footer
303
+ }, onSave ? /*#__PURE__*/_react["default"].createElement("button", {
304
+ type: "button",
305
+ disabled: saving,
306
+ onClick: handleSave,
307
+ style: _objectSpread(_objectSpread({}, styles.button(true)), {}, {
308
+ opacity: saving ? 0.6 : 1
309
+ })
310
+ }, saving ? "Saving…" : saveLabel) : null, /*#__PURE__*/_react["default"].createElement("button", {
311
+ type: "button",
312
+ onClick: t.reset,
313
+ style: styles.button(false)
314
+ }, "Reset"), error ? /*#__PURE__*/_react["default"].createElement("p", {
315
+ style: _objectSpread(_objectSpread({}, styles.hint), {}, {
316
+ color: (0, _tokens.powrVar)("danger", "#dc2626")
317
+ })
318
+ }, error) : onSave ? /*#__PURE__*/_react["default"].createElement("p", {
319
+ style: styles.hint
320
+ }, dirty ? "Saves to your Powr account — follows you to other devices." : "Saved to your account.") : /*#__PURE__*/_react["default"].createElement("p", {
321
+ style: styles.hint
322
+ }, "Saved on this device.")));
323
+ }