@keboola/design 6.1.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.
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import { clsx } from 'clsx';
6
6
  import { extendTailwindMerge } from 'tailwind-merge';
7
7
  import { Root as Root$6, Trigger, Portal, Content, Provider } from '@radix-ui/react-tooltip';
8
8
  import { cva } from 'class-variance-authority';
9
- import { keboolaLegacySidebar, keboolaLegacyTopnav } from '@keboola/brand-registry';
9
+ import { keboolaLegacySidebar, keboolaLegacyTopnav, keboola } from '@keboola/brand-registry';
10
10
  export { brandSchema, exampleCustomer, keboola, keboolaLegacySidebar, keboolaLegacyTopnav } from '@keboola/brand-registry';
11
11
  import { jsxs, jsx, Fragment as Fragment$1 } from 'react/jsx-runtime';
12
12
  import * as DropdownMenuPrimitive3 from '@radix-ui/react-dropdown-menu';
@@ -263,7 +263,7 @@ var require_react_is_development = __commonJS({
263
263
  var ContextProvider = REACT_PROVIDER_TYPE;
264
264
  var Element = REACT_ELEMENT_TYPE;
265
265
  var ForwardRef = REACT_FORWARD_REF_TYPE;
266
- var Fragment16 = REACT_FRAGMENT_TYPE;
266
+ var Fragment17 = REACT_FRAGMENT_TYPE;
267
267
  var Lazy = REACT_LAZY_TYPE;
268
268
  var Memo = REACT_MEMO_TYPE;
269
269
  var Portal10 = REACT_PORTAL_TYPE;
@@ -322,7 +322,7 @@ var require_react_is_development = __commonJS({
322
322
  exports$1.ContextProvider = ContextProvider;
323
323
  exports$1.Element = Element;
324
324
  exports$1.ForwardRef = ForwardRef;
325
- exports$1.Fragment = Fragment16;
325
+ exports$1.Fragment = Fragment17;
326
326
  exports$1.Lazy = Lazy;
327
327
  exports$1.Memo = Memo;
328
328
  exports$1.Portal = Portal10;
@@ -4036,8 +4036,8 @@ var FullScreenModalHeader = ({
4036
4036
  {
4037
4037
  text: previousTitle,
4038
4038
  className: cn(
4039
- "tw-relative tw-top-0 tw-cursor-pointer tw-text-base tw-font-normal tw-text-neutral-400 tw-underline",
4040
- "hover:tw-text-neutral-800 hover:tw-no-underline",
4039
+ "tw-relative tw-top-0 tw-cursor-pointer tw-text-base tw-font-normal tw-text-muted-foreground tw-underline",
4040
+ "hover:tw-text-foreground hover:tw-no-underline",
4041
4041
  isTitleWithIcon && "tw-ml-14"
4042
4042
  )
4043
4043
  }
@@ -10990,8 +10990,8 @@ var ClearButton = ({ onClick, testId }) => {
10990
10990
  "tw-flex",
10991
10991
  "tw-items-center",
10992
10992
  "tw-cursor-pointer",
10993
- "tw-text-neutral-300",
10994
- "hover:tw-text-neutral-800"
10993
+ "tw-text-muted-foreground",
10994
+ "hover:tw-text-foreground"
10995
10995
  ),
10996
10996
  "data-testid": testId,
10997
10997
  children: /* @__PURE__ */ jsx(icons_exports.X, { className: "tw-size-4" })
@@ -11832,23 +11832,23 @@ var BadgeLabel = ({
11832
11832
  var badgeColors = {
11833
11833
  gray: "tw-bg-neutral-400 tw-text-white tw-decoration-neutral-400",
11834
11834
  "gray-darker": "tw-bg-neutral-500 tw-text-white tw-decoration-neutral-500",
11835
- "gray-inverse": "tw-bg-neutral-100 tw-text-neutral-400 tw-decoration-neutral-100",
11835
+ "gray-inverse": "tw-bg-neutral-100 tw-text-neutral-400 tw-decoration-neutral-100 [[data-theme=dark]_&]:tw-bg-neutral-800 [[data-theme=dark]_&]:tw-text-neutral-300 [[data-theme=dark]_&]:tw-decoration-neutral-800",
11836
11836
  green: "tw-bg-green-500 tw-text-white tw-decoration-green-500",
11837
11837
  "green-darker": "tw-bg-green-600 tw-text-white tw-decoration-green-600",
11838
- "green-inverse": "tw-bg-green-100 tw-text-green-900 tw-decoration-green-100",
11838
+ "green-inverse": "tw-bg-green-100 tw-text-green-900 tw-decoration-green-100 [[data-theme=dark]_&]:tw-bg-green-900 [[data-theme=dark]_&]:tw-text-green-200 [[data-theme=dark]_&]:tw-decoration-green-900",
11839
11839
  blue: "tw-bg-blue-500 tw-text-white tw-decoration-blue-500",
11840
- "blue-inverse": "tw-bg-blue-100 tw-text-blue-600 tw-decoration-blue-100",
11840
+ "blue-inverse": "tw-bg-blue-100 tw-text-blue-600 tw-decoration-blue-100 [[data-theme=dark]_&]:tw-bg-blue-900 [[data-theme=dark]_&]:tw-text-blue-200 [[data-theme=dark]_&]:tw-decoration-blue-900",
11841
11841
  red: "tw-bg-error-500 tw-text-white tw-decoration-error-500",
11842
11842
  orange: "tw-bg-warning-500 tw-text-white tw-decoration-warning-500",
11843
- "orange-inverse": "tw-bg-warning-100 tw-text-warning-500 tw-decoration-warning-100",
11843
+ "orange-inverse": "tw-bg-warning-100 tw-text-warning-500 tw-decoration-warning-100 [[data-theme=dark]_&]:tw-bg-warning-900 [[data-theme=dark]_&]:tw-text-warning-200 [[data-theme=dark]_&]:tw-decoration-warning-900",
11844
11844
  amber: "tw-bg-warning-300 tw-text-warning-800 tw-decoration-warning-300",
11845
11845
  "amber-inverse": "tw-bg-warning-100 tw-text-warning-700 tw-decoration-warning-100",
11846
11846
  teal: "tw-bg-teal-500 tw-text-white tw-decoration-teal-500",
11847
- "teal-inverse": "tw-bg-teal-100 tw-text-teal-800 tw-decoration-teal-100",
11847
+ "teal-inverse": "tw-bg-teal-100 tw-text-teal-800 tw-decoration-teal-100 [[data-theme=dark]_&]:tw-bg-teal-900 [[data-theme=dark]_&]:tw-text-teal-200 [[data-theme=dark]_&]:tw-decoration-teal-900",
11848
11848
  purple: "tw-bg-purple-500 tw-text-white tw-decoration-purple-500",
11849
- "purple-inverse": "tw-bg-purple-100 tw-text-purple-800 tw-decoration-purple-100",
11849
+ "purple-inverse": "tw-bg-purple-100 tw-text-purple-800 tw-decoration-purple-100 [[data-theme=dark]_&]:tw-bg-purple-900 [[data-theme=dark]_&]:tw-text-purple-200 [[data-theme=dark]_&]:tw-decoration-purple-900",
11850
11850
  cyan: "tw-bg-cyan-500 tw-text-white tw-decoration-cyan-500",
11851
- "cyan-inverse": "tw-bg-cyan-100 tw-text-cyan-800 tw-decoration-cyan-100",
11851
+ "cyan-inverse": "tw-bg-cyan-100 tw-text-cyan-800 tw-decoration-cyan-100 [[data-theme=dark]_&]:tw-bg-cyan-900 [[data-theme=dark]_&]:tw-text-cyan-200 [[data-theme=dark]_&]:tw-decoration-cyan-900",
11852
11852
  "sidebar-primary": "tw-bg-sidebar-primary tw-text-white tw-decoration-sidebar-primary",
11853
11853
  white: "tw-bg-white/90 tw-text-neutral-600 tw-decoration-white/90"
11854
11854
  };
@@ -18421,9 +18421,7 @@ var headerVariants = cva(
18421
18421
  variants: {
18422
18422
  variant: {
18423
18423
  default: "tw-bg-muted",
18424
- // White surface kept literal until a `card` token exists (UT-4396);
18425
- // `background` is the page base, not an elevated panel surface.
18426
- white: "tw-bg-white"
18424
+ white: "tw-bg-card"
18427
18425
  },
18428
18426
  isDisabled: {
18429
18427
  true: "tw-cursor-not-allowed tw-opacity-50",
@@ -18488,7 +18486,7 @@ var CollapsiblePanel = ({
18488
18486
  {
18489
18487
  open,
18490
18488
  className: cn(
18491
- "tw-rounded !tw-border !tw-border-solid !tw-border-border tw-bg-white",
18489
+ "tw-rounded !tw-border !tw-border-solid !tw-border-border tw-bg-card",
18492
18490
  className
18493
18491
  ),
18494
18492
  header: /* @__PURE__ */ jsxs(
@@ -18696,6 +18694,18 @@ var tokensToCssVars = ({
18696
18694
  vars.set("--font-weight-semibold", typography?.weight?.semibold);
18697
18695
  vars.set("--font-weight-bold", typography?.weight?.bold);
18698
18696
  vars.set("--letter-spacing-chrome", typography?.letterSpacing?.chrome);
18697
+ vars.set("--type-display-size", typography?.typeScale?.display?.size);
18698
+ vars.set("--type-display-weight", typography?.typeScale?.display?.weight);
18699
+ vars.set("--type-display-leading", typography?.typeScale?.display?.leading);
18700
+ vars.set("--type-display-tracking", typography?.typeScale?.display?.tracking);
18701
+ vars.set("--type-heading-size", typography?.typeScale?.heading?.size);
18702
+ vars.set("--type-heading-weight", typography?.typeScale?.heading?.weight);
18703
+ vars.set("--type-heading-leading", typography?.typeScale?.heading?.leading);
18704
+ vars.set("--type-heading-tracking", typography?.typeScale?.heading?.tracking);
18705
+ vars.set("--type-body-size", typography?.typeScale?.body?.size);
18706
+ vars.set("--type-body-weight", typography?.typeScale?.body?.weight);
18707
+ vars.set("--type-body-leading", typography?.typeScale?.body?.leading);
18708
+ vars.set("--type-body-tracking", typography?.typeScale?.body?.tracking);
18699
18709
  vars.set("--radius-sm", radii?.sm);
18700
18710
  vars.set("--radius-md", radii?.md);
18701
18711
  vars.set("--radius-lg", radii?.lg);
@@ -23201,6 +23211,150 @@ var pairChunksIntoConflicts = (chunks) => {
23201
23211
  }
23202
23212
  return conflicts;
23203
23213
  };
23214
+ var DashboardHeroRoot = ({ className, children, ...rest }) => /* @__PURE__ */ jsx(
23215
+ "section",
23216
+ {
23217
+ className: cn(
23218
+ "tw-flex tw-flex-col tw-gap-6 tw-rounded-lg tw-border tw-border-solid tw-border-border tw-bg-card tw-p-8 tw-text-card-foreground",
23219
+ "md:tw-flex-row md:tw-items-center md:tw-justify-between",
23220
+ className
23221
+ ),
23222
+ ...rest,
23223
+ children
23224
+ }
23225
+ );
23226
+ var DashboardHeroBody = ({ className, children, ...rest }) => /* @__PURE__ */ jsx("div", { className: cn("tw-flex tw-flex-col tw-gap-3", className), ...rest, children });
23227
+ var DashboardHeroEyebrow = ({ className, children, ...rest }) => /* @__PURE__ */ jsx(
23228
+ "p",
23229
+ {
23230
+ className: cn(
23231
+ "tw-m-0 tw-text-sm tw-font-semibold tw-uppercase tw-tracking-wide tw-text-primary",
23232
+ className
23233
+ ),
23234
+ ...rest,
23235
+ children
23236
+ }
23237
+ );
23238
+ var DashboardHeroTitle = ({ className, children, ...rest }) => /* @__PURE__ */ jsx(
23239
+ "h1",
23240
+ {
23241
+ className: cn(
23242
+ "tw-m-0 tw-text-3xl tw-font-semibold tw-leading-tight tw-tracking-tight tw-text-foreground",
23243
+ className
23244
+ ),
23245
+ ...rest,
23246
+ children
23247
+ }
23248
+ );
23249
+ var DashboardHeroDescription = ({ className, children, ...rest }) => /* @__PURE__ */ jsx(
23250
+ "p",
23251
+ {
23252
+ className: cn("tw-m-0 tw-max-w-prose tw-text-base tw-text-muted-foreground", className),
23253
+ ...rest,
23254
+ children
23255
+ }
23256
+ );
23257
+ var DashboardHeroActions = ({ className, children, ...rest }) => /* @__PURE__ */ jsx("div", { className: cn("tw-mt-2 tw-flex tw-flex-wrap tw-items-center tw-gap-3", className), ...rest, children });
23258
+ var DashboardHeroAside = ({ className, children, ...rest }) => /* @__PURE__ */ jsx("div", { className: cn("tw-flex tw-shrink-0 tw-flex-col tw-gap-2", className), ...rest, children });
23259
+ var DashboardHero = DashboardHeroRoot;
23260
+ DashboardHero.Body = DashboardHeroBody;
23261
+ DashboardHero.Eyebrow = DashboardHeroEyebrow;
23262
+ DashboardHero.Title = DashboardHeroTitle;
23263
+ DashboardHero.Description = DashboardHeroDescription;
23264
+ DashboardHero.Actions = DashboardHeroActions;
23265
+ DashboardHero.Aside = DashboardHeroAside;
23266
+ var trendClassnames = cva(
23267
+ ["tw-inline-flex", "tw-items-center", "tw-gap-1", "tw-text-sm", "tw-font-medium"],
23268
+ {
23269
+ variants: {
23270
+ direction: {
23271
+ up: "tw-text-success",
23272
+ down: "tw-text-destructive",
23273
+ flat: "tw-text-muted-foreground"
23274
+ }
23275
+ },
23276
+ defaultVariants: {
23277
+ direction: "flat"
23278
+ }
23279
+ }
23280
+ );
23281
+ var StatCardRoot = ({ className, children, bordered = true, ...rest }) => /* @__PURE__ */ jsx(Card, { bordered, className: cn("tw-gap-2", className), role: "group", ...rest, children });
23282
+ var StatCardIcon = ({ className, children, ...rest }) => /* @__PURE__ */ jsx(
23283
+ "div",
23284
+ {
23285
+ className: cn(
23286
+ "tw-flex tw-size-9 tw-items-center tw-justify-center tw-rounded-md tw-bg-accent tw-text-accent-foreground",
23287
+ '[&_svg:not([class*="tw-size-"])]:tw-size-5',
23288
+ className
23289
+ ),
23290
+ ...rest,
23291
+ children
23292
+ }
23293
+ );
23294
+ var StatCardLabel = ({ className, children, ...rest }) => /* @__PURE__ */ jsx(
23295
+ "p",
23296
+ {
23297
+ className: cn("tw-m-0 tw-text-sm tw-font-medium tw-text-muted-foreground", className),
23298
+ ...rest,
23299
+ children
23300
+ }
23301
+ );
23302
+ var StatCardValue = ({ className, children, ...rest }) => /* @__PURE__ */ jsx(
23303
+ "p",
23304
+ {
23305
+ className: cn(
23306
+ "tw-m-0 tw-text-3xl tw-font-semibold tw-leading-tight tw-tracking-tight tw-text-foreground",
23307
+ className
23308
+ ),
23309
+ ...rest,
23310
+ children
23311
+ }
23312
+ );
23313
+ var StatCardTrend = ({ className, direction = "flat", icon, children, ...rest }) => /* @__PURE__ */ jsxs("span", { className: trendClassnames({ direction, className }), ...rest, children: [
23314
+ icon,
23315
+ children
23316
+ ] });
23317
+ var StatCardFootnote = ({ className, children, ...rest }) => /* @__PURE__ */ jsx("p", { className: cn("tw-m-0 tw-text-xs tw-text-muted-foreground", className), ...rest, children });
23318
+ var StatCard = StatCardRoot;
23319
+ StatCard.Icon = StatCardIcon;
23320
+ StatCard.Label = StatCardLabel;
23321
+ StatCard.Value = StatCardValue;
23322
+ StatCard.Trend = StatCardTrend;
23323
+ StatCard.Footnote = StatCardFootnote;
23324
+ var gridClassnames = cva(["tw-grid", "tw-gap-4"], {
23325
+ variants: {
23326
+ columns: {
23327
+ 2: "tw-grid-cols-1 sm:tw-grid-cols-2",
23328
+ 3: "tw-grid-cols-1 sm:tw-grid-cols-2 lg:tw-grid-cols-3",
23329
+ 4: "tw-grid-cols-1 sm:tw-grid-cols-2 lg:tw-grid-cols-4"
23330
+ }
23331
+ },
23332
+ defaultVariants: {
23333
+ columns: 4
23334
+ }
23335
+ });
23336
+ var StatCardGrid = ({ className, columns = 4, children, ...rest }) => /* @__PURE__ */ jsx("div", { className: gridClassnames({ columns, className }), ...rest, children });
23337
+ var ChartPanel = ({
23338
+ title,
23339
+ description,
23340
+ titleAs = "h3",
23341
+ toolbar,
23342
+ footer,
23343
+ className,
23344
+ bordered = true,
23345
+ children,
23346
+ ...rest
23347
+ }) => /* @__PURE__ */ jsxs(Card, { bordered, className: cn("tw-gap-4", className), ...rest, children: [
23348
+ /* @__PURE__ */ jsxs(Card.Header, { className: "tw-flex tw-items-start tw-justify-between tw-gap-4", children: [
23349
+ /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-flex-col tw-gap-1", children: [
23350
+ /* @__PURE__ */ jsx(Card.Title, { as: titleAs, children: title }),
23351
+ description ? /* @__PURE__ */ jsx("p", { className: "tw-m-0 tw-text-sm tw-text-muted-foreground", children: description }) : null
23352
+ ] }),
23353
+ toolbar ? /* @__PURE__ */ jsx("div", { className: "tw-flex tw-shrink-0 tw-items-center tw-gap-2", children: toolbar }) : null
23354
+ ] }),
23355
+ /* @__PURE__ */ jsx(Card.Content, { children }),
23356
+ footer ? /* @__PURE__ */ jsx("div", { className: "tw-border-0 tw-border-t tw-border-solid tw-border-border tw-pt-3 tw-text-sm tw-text-muted-foreground", children: footer }) : null
23357
+ ] });
23204
23358
  var { fieldContext, useFieldContext, formContext, useFormContext } = createFormHookContexts();
23205
23359
  var FormBody = ({ children, className, ...formProps }) => {
23206
23360
  const form = useFormContext();
@@ -23640,6 +23794,686 @@ function useAutosizeInput({
23640
23794
  ] });
23641
23795
  return { inputRef, inputStyle, sizerElement };
23642
23796
  }
23797
+
23798
+ // src/blocks/BrandEditor/color.ts
23799
+ var hexToChannels = (hex) => {
23800
+ let h = hex.trim().replace(/^#/, "");
23801
+ if (h.length === 3 || h.length === 4) {
23802
+ h = h.slice(0, 3).split("").map((c) => c + c).join("");
23803
+ } else if (h.length === 8) {
23804
+ h = h.slice(0, 6);
23805
+ }
23806
+ if (!/^[0-9a-fA-F]{6}$/.test(h)) return "0 0 0";
23807
+ const n = parseInt(h, 16);
23808
+ return `${n >> 16 & 255} ${n >> 8 & 255} ${n & 255}`;
23809
+ };
23810
+ var channelsToHex = (channels) => {
23811
+ const [r = 0, g = 0, b = 0] = channels.trim().split(/\s+/).map((n) => Number(n) || 0);
23812
+ const to2 = (v) => Math.max(0, Math.min(255, v)).toString(16).padStart(2, "0");
23813
+ return `#${to2(r)}${to2(g)}${to2(b)}`;
23814
+ };
23815
+ var COMPLETE_HEX = /^([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
23816
+ var ColorField = ({ id, label, channels, onChange }) => {
23817
+ const hex = channelsToHex(channels);
23818
+ return /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-items-center tw-justify-between tw-gap-2", children: [
23819
+ /* @__PURE__ */ jsx(Label2, { htmlFor: id, className: "tw-text-xs tw-font-normal tw-text-foreground", children: label }),
23820
+ /* @__PURE__ */ jsx(
23821
+ ColorInput,
23822
+ {
23823
+ id,
23824
+ sizing: "medium",
23825
+ value: hex,
23826
+ className: "tw-w-36",
23827
+ onValueChange: (next) => {
23828
+ const clean = next.trim().replace(/^#/, "");
23829
+ if (COMPLETE_HEX.test(clean)) onChange(hexToChannels(`#${clean}`));
23830
+ }
23831
+ }
23832
+ )
23833
+ ] });
23834
+ };
23835
+
23836
+ // src/blocks/BrandEditor/contrast.ts
23837
+ var clampChannel = (n) => Number.isFinite(n) ? Math.min(255, Math.max(0, n)) : 0;
23838
+ var parseChannels = (channels) => {
23839
+ const [r = 0, g = 0, b = 0] = channels.trim().split(/\s+/).map((n) => clampChannel(Number(n)));
23840
+ return [r, g, b];
23841
+ };
23842
+ var relativeLuminance = (channels) => {
23843
+ const [r = 0, g = 0, b = 0] = parseChannels(channels).map((c) => {
23844
+ const s = c / 255;
23845
+ return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;
23846
+ });
23847
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
23848
+ };
23849
+ var contrastRatio = (fg, bg) => {
23850
+ const l1 = relativeLuminance(fg);
23851
+ const l2 = relativeLuminance(bg);
23852
+ const [lighter, darker] = l1 >= l2 ? [l1, l2] : [l2, l1];
23853
+ return (lighter + 0.05) / (darker + 0.05);
23854
+ };
23855
+ var wcagLevel = (ratio) => ratio >= 7 ? "AAA" : ratio >= 4.5 ? "AA" : "fail";
23856
+ var ControlSection = ({ title, children }) => /* @__PURE__ */ jsxs("section", { className: "tw-flex tw-flex-col tw-gap-3 tw-border-b tw-border-border tw-p-4", children: [
23857
+ /* @__PURE__ */ jsx("h3", { className: "tw-m-0 tw-text-xs tw-font-semibold tw-uppercase tw-tracking-wide tw-text-muted-foreground", children: title }),
23858
+ children
23859
+ ] });
23860
+ var LogoField = ({ id, label, value, onChange }) => /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-flex-col tw-gap-1", children: [
23861
+ /* @__PURE__ */ jsx(Label2, { htmlFor: id, className: "tw-text-xs tw-font-normal tw-text-foreground", children: label }),
23862
+ /* @__PURE__ */ jsx(
23863
+ Textarea,
23864
+ {
23865
+ id,
23866
+ value,
23867
+ onValueChange: onChange,
23868
+ maxRows: 4,
23869
+ placeholder: "<svg\u2026>, a data: URI, or an https:// URL",
23870
+ className: "tw-font-mono tw-text-xs"
23871
+ }
23872
+ )
23873
+ ] });
23874
+ var TextField2 = ({ id, label, value, onChange, placeholder }) => /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-flex-col tw-gap-1", children: [
23875
+ /* @__PURE__ */ jsx(Label2, { htmlFor: id, className: "tw-text-xs tw-font-normal tw-text-foreground", children: label }),
23876
+ /* @__PURE__ */ jsx(
23877
+ TextInput,
23878
+ {
23879
+ id,
23880
+ sizing: "small",
23881
+ value,
23882
+ onValueChange: onChange,
23883
+ placeholder,
23884
+ className: "tw-font-mono tw-text-xs"
23885
+ }
23886
+ )
23887
+ ] });
23888
+ var DEFAULT_FALLBACK_FONT = "'Inter', system-ui, sans-serif";
23889
+ var DEFAULT_FONT_OPTIONS = [
23890
+ { value: DEFAULT_FALLBACK_FONT, label: "Inter (default)" },
23891
+ { value: "'Space Grotesk', system-ui, sans-serif", label: "Space Grotesk" },
23892
+ { value: "'Poppins', system-ui, sans-serif", label: "Poppins" },
23893
+ { value: "'Manrope', system-ui, sans-serif", label: "Manrope" },
23894
+ { value: "'Quicksand', system-ui, sans-serif", label: "Quicksand" },
23895
+ { value: "'Baloo 2', system-ui, sans-serif", label: "Baloo 2" },
23896
+ { value: "'Fraunces', Georgia, serif", label: "Fraunces (serif)" },
23897
+ { value: "Georgia, 'Times New Roman', serif", label: "Georgia (serif)" },
23898
+ { value: "'JetBrains Mono', ui-monospace, monospace", label: "JetBrains Mono" },
23899
+ { value: "system-ui, sans-serif", label: "System UI" }
23900
+ ];
23901
+ var COLOR_LABELS = {
23902
+ primary: "Primary",
23903
+ primaryForeground: "Primary foreground",
23904
+ background: "Background",
23905
+ foreground: "Foreground",
23906
+ card: "Card",
23907
+ cardForeground: "Card foreground",
23908
+ popover: "Popover",
23909
+ popoverForeground: "Popover foreground",
23910
+ secondary: "Secondary",
23911
+ secondaryForeground: "Secondary foreground",
23912
+ muted: "Muted",
23913
+ mutedForeground: "Muted foreground",
23914
+ accent: "Accent",
23915
+ accentForeground: "Accent foreground",
23916
+ border: "Border",
23917
+ input: "Input",
23918
+ ring: "Ring",
23919
+ ringOffset: "Ring offset",
23920
+ destructive: "Destructive",
23921
+ destructiveForeground: "Destructive foreground",
23922
+ success: "Success",
23923
+ successForeground: "Success foreground",
23924
+ warning: "Warning",
23925
+ warningForeground: "Warning foreground",
23926
+ info: "Info",
23927
+ infoForeground: "Info foreground"
23928
+ };
23929
+ var SIDEBAR_LABELS = {
23930
+ sidebar: "Sidebar",
23931
+ sidebarForeground: "Foreground",
23932
+ sidebarPrimary: "Primary",
23933
+ sidebarPrimaryForeground: "Primary foreground",
23934
+ sidebarAccent: "Accent",
23935
+ sidebarAccentForeground: "Accent foreground",
23936
+ sidebarBorder: "Border",
23937
+ sidebarRing: "Ring"
23938
+ };
23939
+ var CHART_LABELS = {
23940
+ chart1: "Chart 1",
23941
+ chart2: "Chart 2",
23942
+ chart3: "Chart 3",
23943
+ chart4: "Chart 4",
23944
+ chart5: "Chart 5"
23945
+ };
23946
+ var WEIGHT_LABELS = {
23947
+ normal: "Normal",
23948
+ medium: "Medium",
23949
+ semibold: "Semibold",
23950
+ bold: "Bold"
23951
+ };
23952
+ var SHADOW_LABELS = {
23953
+ sm: "Small",
23954
+ md: "Medium",
23955
+ lg: "Large",
23956
+ lift: "Lift (raised)"
23957
+ };
23958
+ var SPACING_LABELS = {
23959
+ gutter: "Gutter (between sections)",
23960
+ inset: "Inset (in-container)"
23961
+ };
23962
+ var MOTION_LABELS = {
23963
+ duration: "Duration",
23964
+ easing: "Easing"
23965
+ };
23966
+ var COLOR_SLOTS = Object.keys(COLOR_LABELS);
23967
+ var SIDEBAR_SLOTS = Object.keys(SIDEBAR_LABELS);
23968
+ var CHART_SLOTS = Object.keys(CHART_LABELS);
23969
+ var WEIGHT_SLOTS = Object.keys(WEIGHT_LABELS);
23970
+ var SHADOW_SLOTS = Object.keys(SHADOW_LABELS);
23971
+ var SPACING_SLOTS = Object.keys(SPACING_LABELS);
23972
+ var MOTION_SLOTS = Object.keys(MOTION_LABELS);
23973
+ var RADIUS_SIZES = ["sm", "md", "lg"];
23974
+ var A11Y_PAIRS = [
23975
+ { label: "Text on background", fg: "foreground", bg: "background" },
23976
+ { label: "Text on card", fg: "cardForeground", bg: "card" },
23977
+ { label: "Primary button", fg: "primaryForeground", bg: "primary" },
23978
+ { label: "Muted text", fg: "mutedForeground", bg: "muted" },
23979
+ { label: "Accent", fg: "accentForeground", bg: "accent" }
23980
+ ];
23981
+ var DEFAULT_SIDEBAR = {
23982
+ light: {
23983
+ sidebar: "255 255 255",
23984
+ sidebarForeground: "30 41 59",
23985
+ sidebarPrimary: "31 143 255",
23986
+ sidebarPrimaryForeground: "255 255 255",
23987
+ sidebarAccent: "219 234 254",
23988
+ sidebarAccentForeground: "30 41 59",
23989
+ sidebarBorder: "229 231 235",
23990
+ sidebarRing: "31 143 255"
23991
+ },
23992
+ dark: {
23993
+ sidebar: "14 14 18",
23994
+ sidebarForeground: "229 230 236",
23995
+ sidebarPrimary: "31 143 255",
23996
+ sidebarPrimaryForeground: "255 255 255",
23997
+ sidebarAccent: "38 38 45",
23998
+ sidebarAccentForeground: "229 230 236",
23999
+ sidebarBorder: "48 49 57",
24000
+ sidebarRing: "31 143 255"
24001
+ }
24002
+ };
24003
+ var DEFAULT_RADII = {
24004
+ sm: "0.25rem",
24005
+ md: "0.375rem",
24006
+ lg: "0.5rem"
24007
+ };
24008
+ var DEFAULT_CHART = {
24009
+ light: {
24010
+ chart1: "31 143 255",
24011
+ chart2: "0 194 135",
24012
+ chart3: "146 92 255",
24013
+ chart4: "245 147 0",
24014
+ chart5: "237 94 223"
24015
+ },
24016
+ dark: {
24017
+ chart1: "92 173 255",
24018
+ chart2: "0 230 161",
24019
+ chart3: "173 133 255",
24020
+ chart4: "255 190 92",
24021
+ chart5: "242 140 232"
24022
+ }
24023
+ };
24024
+ var DEFAULT_FONT_WEIGHTS = {
24025
+ normal: "400",
24026
+ medium: "500",
24027
+ semibold: "600",
24028
+ bold: "700"
24029
+ };
24030
+ var DEFAULT_LETTER_SPACING = "1px";
24031
+ var MONO_FALLBACK = "'JetBrains Mono', ui-monospace, monospace";
24032
+ var DEFAULT_SHADOWS = {
24033
+ sm: "0 1px 2px 0 rgb(0 0 0 / 0.05)",
24034
+ md: "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)",
24035
+ lg: "0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)",
24036
+ lift: "0 10px 30px -12px rgb(0 0 0 / 0.28), 0 2px 6px rgb(0 0 0 / 0.06)"
24037
+ };
24038
+ var DEFAULT_SPACING = {
24039
+ gutter: "1.5rem",
24040
+ inset: "1.5rem"
24041
+ };
24042
+ var DEFAULT_MOTION = {
24043
+ duration: "200ms",
24044
+ easing: "cubic-bezier(0.2, 0.7, 0.2, 1)"
24045
+ };
24046
+ var DEFAULT_GRADIENT = "linear-gradient(135deg, rgb(var(--color-primary)), rgb(var(--color-accent, var(--color-primary))))";
24047
+ var numOf = (value, fallback) => {
24048
+ const n = Number.parseFloat(value);
24049
+ return Number.isFinite(n) ? n : fallback;
24050
+ };
24051
+ var letterSpacingToPx = (value) => {
24052
+ const n = Number.parseFloat(value);
24053
+ if (!Number.isFinite(n)) return 0;
24054
+ return value.trim().endsWith("em") ? n * 16 : n;
24055
+ };
24056
+ var pxToLetterSpacing = (px, currentValue) => currentValue.trim().endsWith("em") ? `${Number((px / 16).toFixed(3))}em` : `${px}px`;
24057
+ var lengthToPx = (value) => {
24058
+ const n = Number.parseFloat(value);
24059
+ if (!Number.isFinite(n)) return 0;
24060
+ return Math.round(value.trim().endsWith("rem") ? n * 16 : n);
24061
+ };
24062
+ var pxToLength = (px, currentValue) => {
24063
+ const trimmed = currentValue.trim();
24064
+ if (trimmed.endsWith("rem")) return `${px / 16}rem`;
24065
+ if (/^-?\d*\.?\d+$/.test(trimmed)) return `${px}`;
24066
+ return `${px}px`;
24067
+ };
24068
+ var isSvgMarkup = (source) => source.trimStart().startsWith("<");
24069
+ var isImageSource = (source) => /^(data:|https?:\/\/)/.test(source.trim());
24070
+ var LogoPreviewImage = ({ source, className }) => {
24071
+ const safeSvg = useMemo(
24072
+ () => isSvgMarkup(source) ? DOMPurify.sanitize(source, { USE_PROFILES: { svg: true, svgFilters: true } }) : null,
24073
+ [source]
24074
+ );
24075
+ if (safeSvg !== null) {
24076
+ return /* @__PURE__ */ jsx("span", { "aria-hidden": true, className, dangerouslySetInnerHTML: { __html: safeSvg } });
24077
+ }
24078
+ if (isImageSource(source)) {
24079
+ return /* @__PURE__ */ jsx("img", { src: source, alt: "", className });
24080
+ }
24081
+ return null;
24082
+ };
24083
+ var BrandEditor = ({
24084
+ value,
24085
+ onChange,
24086
+ colorScheme = "light",
24087
+ onColorSchemeChange,
24088
+ fontOptions = DEFAULT_FONT_OPTIONS
24089
+ }) => {
24090
+ const baseId = useId();
24091
+ const { theme } = value;
24092
+ const coreColors = colorScheme === "light" ? theme.colors : theme.colorsDark;
24093
+ const sidebarColors = colorScheme === "light" ? theme.colors?.sidebar : theme.colorsDark?.sidebar;
24094
+ const chartColors = colorScheme === "light" ? theme.colors?.chart : theme.colorsDark?.chart;
24095
+ const defaultColors = colorScheme === "light" ? keboola.theme.colors : keboola.theme.colorsDark;
24096
+ const radii = theme.radii ?? DEFAULT_RADII;
24097
+ const typography = theme.typography;
24098
+ const setColor = (slot, channels) => {
24099
+ if (colorScheme === "light") {
24100
+ onChange({ ...value, theme: { ...theme, colors: { ...theme.colors, [slot]: channels } } });
24101
+ return;
24102
+ }
24103
+ onChange({
24104
+ ...value,
24105
+ theme: { ...theme, colorsDark: { ...theme.colorsDark, [slot]: channels } }
24106
+ });
24107
+ };
24108
+ const setSidebarColor = (slot, channels) => {
24109
+ if (colorScheme === "light") {
24110
+ const base = theme.colors?.sidebar ?? DEFAULT_SIDEBAR.light;
24111
+ onChange({
24112
+ ...value,
24113
+ theme: { ...theme, colors: { ...theme.colors, sidebar: { ...base, [slot]: channels } } }
24114
+ });
24115
+ return;
24116
+ }
24117
+ const sidebarBase = theme.colorsDark?.sidebar ?? DEFAULT_SIDEBAR.dark;
24118
+ onChange({
24119
+ ...value,
24120
+ theme: {
24121
+ ...theme,
24122
+ colorsDark: { ...theme.colorsDark, sidebar: { ...sidebarBase, [slot]: channels } }
24123
+ }
24124
+ });
24125
+ };
24126
+ const setChart = (slot, channels) => {
24127
+ const base = chartColors ?? DEFAULT_CHART[colorScheme];
24128
+ const chart = { ...base, [slot]: channels };
24129
+ if (colorScheme === "light") {
24130
+ onChange({ ...value, theme: { ...theme, colors: { ...theme.colors, chart } } });
24131
+ return;
24132
+ }
24133
+ onChange({ ...value, theme: { ...theme, colorsDark: { ...theme.colorsDark, chart } } });
24134
+ };
24135
+ const setRadius = (size, radius) => onChange({
24136
+ ...value,
24137
+ theme: { ...theme, radii: { ...theme.radii ?? DEFAULT_RADII, [size]: radius } }
24138
+ });
24139
+ const patchTypography = (patch) => onChange({ ...value, theme: { ...theme, typography: { ...theme.typography, ...patch } } });
24140
+ const setFontFace = (face, font) => patchTypography({ [face]: font.trim() || void 0 });
24141
+ const setFontWeight = (slot, weight) => patchTypography({ weight: { ...theme.typography?.weight, [slot]: weight || void 0 } });
24142
+ const setLetterSpacing = (chrome) => patchTypography({ letterSpacing: { chrome: chrome.trim() || void 0 } });
24143
+ const setShadow = (slot, shadow) => onChange({
24144
+ ...value,
24145
+ theme: { ...theme, shadows: { ...theme.shadows, [slot]: shadow.trim() || void 0 } }
24146
+ });
24147
+ const setSpacing = (slot, length) => onChange({
24148
+ ...value,
24149
+ theme: { ...theme, spacing: { ...theme.spacing, [slot]: length.trim() || void 0 } }
24150
+ });
24151
+ const setMotion = (slot, token) => onChange({
24152
+ ...value,
24153
+ theme: { ...theme, motion: { ...theme.motion, [slot]: token.trim() || void 0 } }
24154
+ });
24155
+ const setGradient = (gradient) => onChange({
24156
+ ...value,
24157
+ theme: { ...theme, gradient: { brand: gradient.trim() || void 0 } }
24158
+ });
24159
+ const setLogo = (slot, source) => {
24160
+ const trimmed = source.trim();
24161
+ const nextLogo = { ...value.logo };
24162
+ if (trimmed) nextLogo[slot] = trimmed;
24163
+ else delete nextLogo[slot];
24164
+ const { logo: _drop, ...rest } = value;
24165
+ onChange(Object.keys(nextLogo).length > 0 ? { ...value, logo: nextLogo } : rest);
24166
+ };
24167
+ return /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-flex-col", children: [
24168
+ /* @__PURE__ */ jsxs(ControlSection, { title: "Colors", children: [
24169
+ onColorSchemeChange ? /* @__PURE__ */ jsxs(
24170
+ ToggleGroup,
24171
+ {
24172
+ type: "single",
24173
+ value: colorScheme,
24174
+ onValueChange: (next) => {
24175
+ if (next === "light" || next === "dark") onColorSchemeChange(next);
24176
+ },
24177
+ "aria-label": "Color scheme",
24178
+ className: "tw-w-full",
24179
+ children: [
24180
+ /* @__PURE__ */ jsx(ToggleGroup.Item, { value: "light", className: "tw-flex-1", children: "Light" }),
24181
+ /* @__PURE__ */ jsx(ToggleGroup.Item, { value: "dark", className: "tw-flex-1", children: "Dark" })
24182
+ ]
24183
+ }
24184
+ ) : null,
24185
+ /* @__PURE__ */ jsx("div", { className: "tw-flex tw-flex-col tw-gap-2", children: COLOR_SLOTS.map((slot) => /* @__PURE__ */ jsx(
24186
+ ColorField,
24187
+ {
24188
+ id: `${baseId}color-${colorScheme}-${slot}`,
24189
+ label: COLOR_LABELS[slot],
24190
+ channels: coreColors?.[slot] ?? defaultColors?.[slot] ?? "0 0 0",
24191
+ onChange: (channels) => setColor(slot, channels)
24192
+ },
24193
+ slot
24194
+ )) })
24195
+ ] }),
24196
+ /* @__PURE__ */ jsxs(ControlSection, { title: "Accessibility", children: [
24197
+ /* @__PURE__ */ jsxs("p", { className: "tw-m-0 tw-text-xs tw-text-muted-foreground", children: [
24198
+ "WCAG contrast for the ",
24199
+ colorScheme,
24200
+ " palette (AA needs 4.5:1)."
24201
+ ] }),
24202
+ /* @__PURE__ */ jsx("div", { className: "tw-flex tw-flex-col tw-gap-1.5", children: A11Y_PAIRS.map((pair) => {
24203
+ const fg = coreColors?.[pair.fg] ?? defaultColors?.[pair.fg] ?? "0 0 0";
24204
+ const bg = coreColors?.[pair.bg] ?? defaultColors?.[pair.bg] ?? "255 255 255";
24205
+ const ratio = contrastRatio(fg, bg);
24206
+ const level = wcagLevel(ratio);
24207
+ return /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-items-center tw-justify-between tw-gap-2", children: [
24208
+ /* @__PURE__ */ jsx("span", { className: "tw-text-xs tw-text-foreground", children: pair.label }),
24209
+ /* @__PURE__ */ jsxs("span", { className: "tw-flex tw-items-center tw-gap-1.5", children: [
24210
+ /* @__PURE__ */ jsxs("span", { className: "tw-text-xs tw-tabular-nums tw-text-muted-foreground", children: [
24211
+ ratio.toFixed(1),
24212
+ ":1"
24213
+ ] }),
24214
+ /* @__PURE__ */ jsx(Badge, { color: level === "fail" ? "red" : "green", children: level === "fail" ? "Fail" : level })
24215
+ ] })
24216
+ ] }, pair.label);
24217
+ }) })
24218
+ ] }),
24219
+ /* @__PURE__ */ jsx(ControlSection, { title: "Sidebar colors", children: /* @__PURE__ */ jsxs(Collapsible, { className: "tw-flex tw-flex-col tw-gap-2", children: [
24220
+ /* @__PURE__ */ jsx(Collapsible.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "small", className: "tw-w-full", children: [
24221
+ "Toggle sidebar tokens (",
24222
+ colorScheme,
24223
+ ")"
24224
+ ] }) }),
24225
+ /* @__PURE__ */ jsx(Collapsible.Content, { className: "tw-flex tw-flex-col tw-gap-2", children: SIDEBAR_SLOTS.map((slot) => /* @__PURE__ */ jsx(
24226
+ ColorField,
24227
+ {
24228
+ id: `${baseId}sidebar-${colorScheme}-${slot}`,
24229
+ label: SIDEBAR_LABELS[slot],
24230
+ channels: sidebarColors?.[slot] ?? DEFAULT_SIDEBAR[colorScheme][slot],
24231
+ onChange: (channels) => setSidebarColor(slot, channels)
24232
+ },
24233
+ slot
24234
+ )) })
24235
+ ] }) }),
24236
+ /* @__PURE__ */ jsxs(ControlSection, { title: "Chart palette", children: [
24237
+ /* @__PURE__ */ jsxs("p", { className: "tw-m-0 tw-text-xs tw-text-muted-foreground", children: [
24238
+ "Categorical series colours for the ",
24239
+ colorScheme,
24240
+ " palette (`--color-chart-1\u20265`)."
24241
+ ] }),
24242
+ /* @__PURE__ */ jsx("div", { className: "tw-flex tw-flex-col tw-gap-2", children: CHART_SLOTS.map((slot) => /* @__PURE__ */ jsx(
24243
+ ColorField,
24244
+ {
24245
+ id: `${baseId}chart-${colorScheme}-${slot}`,
24246
+ label: CHART_LABELS[slot],
24247
+ channels: chartColors?.[slot] ?? DEFAULT_CHART[colorScheme][slot],
24248
+ onChange: (channels) => setChart(slot, channels)
24249
+ },
24250
+ slot
24251
+ )) })
24252
+ ] }),
24253
+ /* @__PURE__ */ jsx(ControlSection, { title: "Radius", children: RADIUS_SIZES.map((size) => {
24254
+ const current = radii[size];
24255
+ const px = lengthToPx(current);
24256
+ return /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-flex-col tw-gap-1", children: [
24257
+ /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-items-center tw-justify-between", children: [
24258
+ /* @__PURE__ */ jsx(Label2, { className: "tw-text-xs tw-font-normal tw-uppercase tw-text-foreground", children: size }),
24259
+ /* @__PURE__ */ jsx("span", { className: "tw-text-xs tw-tabular-nums tw-text-muted-foreground", children: radii[size] })
24260
+ ] }),
24261
+ /* @__PURE__ */ jsx(
24262
+ Slider,
24263
+ {
24264
+ min: 0,
24265
+ max: 24,
24266
+ step: 1,
24267
+ value: [px],
24268
+ onValueChange: (values) => setRadius(size, pxToLength(values[0] ?? 0, current))
24269
+ }
24270
+ )
24271
+ ] }, size);
24272
+ }) }),
24273
+ /* @__PURE__ */ jsxs(ControlSection, { title: "Typography", children: [
24274
+ /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-flex-col tw-gap-1", children: [
24275
+ /* @__PURE__ */ jsx(
24276
+ Label2,
24277
+ {
24278
+ htmlFor: `${baseId}font-family`,
24279
+ className: "tw-text-xs tw-font-normal tw-text-foreground",
24280
+ children: "Font family"
24281
+ }
24282
+ ),
24283
+ /* @__PURE__ */ jsx(
24284
+ Select2,
24285
+ {
24286
+ id: `${baseId}font-family`,
24287
+ value: typography?.fontFamily ?? DEFAULT_FALLBACK_FONT,
24288
+ onValueChange: (font) => setFontFace("fontFamily", font),
24289
+ items: fontOptions
24290
+ }
24291
+ )
24292
+ ] }),
24293
+ /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-flex-col tw-gap-1", children: [
24294
+ /* @__PURE__ */ jsx(
24295
+ Label2,
24296
+ {
24297
+ htmlFor: `${baseId}font-display`,
24298
+ className: "tw-text-xs tw-font-normal tw-text-foreground",
24299
+ children: "Display font (headings)"
24300
+ }
24301
+ ),
24302
+ /* @__PURE__ */ jsx(
24303
+ Select2,
24304
+ {
24305
+ id: `${baseId}font-display`,
24306
+ value: typography?.fontDisplay ?? typography?.fontFamily ?? DEFAULT_FALLBACK_FONT,
24307
+ onValueChange: (font) => setFontFace("fontDisplay", font),
24308
+ items: fontOptions
24309
+ }
24310
+ )
24311
+ ] }),
24312
+ /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-flex-col tw-gap-1", children: [
24313
+ /* @__PURE__ */ jsx(
24314
+ Label2,
24315
+ {
24316
+ htmlFor: `${baseId}font-mono`,
24317
+ className: "tw-text-xs tw-font-normal tw-text-foreground",
24318
+ children: "Monospace font"
24319
+ }
24320
+ ),
24321
+ /* @__PURE__ */ jsx(
24322
+ Select2,
24323
+ {
24324
+ id: `${baseId}font-mono`,
24325
+ value: typography?.fontMono ?? MONO_FALLBACK,
24326
+ onValueChange: (font) => setFontFace("fontMono", font),
24327
+ items: fontOptions
24328
+ }
24329
+ )
24330
+ ] }),
24331
+ /* @__PURE__ */ jsx("span", { className: "tw-text-xs tw-text-muted-foreground", children: "Chrome font weights" }),
24332
+ WEIGHT_SLOTS.map((slot) => {
24333
+ const current = typography?.weight?.[slot] ?? DEFAULT_FONT_WEIGHTS[slot];
24334
+ return /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-flex-col tw-gap-1", children: [
24335
+ /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-items-center tw-justify-between", children: [
24336
+ /* @__PURE__ */ jsx(Label2, { className: "tw-text-xs tw-font-normal tw-text-foreground", children: WEIGHT_LABELS[slot] }),
24337
+ /* @__PURE__ */ jsx("span", { className: "tw-text-xs tw-tabular-nums tw-text-muted-foreground", children: current })
24338
+ ] }),
24339
+ /* @__PURE__ */ jsx(
24340
+ Slider,
24341
+ {
24342
+ min: 100,
24343
+ max: 900,
24344
+ step: 25,
24345
+ value: [numOf(current, 400)],
24346
+ onValueChange: (values) => setFontWeight(slot, String(values[0] ?? 400))
24347
+ }
24348
+ )
24349
+ ] }, slot);
24350
+ }),
24351
+ /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-flex-col tw-gap-1", children: [
24352
+ /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-items-center tw-justify-between", children: [
24353
+ /* @__PURE__ */ jsx(Label2, { className: "tw-text-xs tw-font-normal tw-text-foreground", children: "Chrome letter spacing" }),
24354
+ /* @__PURE__ */ jsx("span", { className: "tw-text-xs tw-tabular-nums tw-text-muted-foreground", children: typography?.letterSpacing?.chrome ?? DEFAULT_LETTER_SPACING })
24355
+ ] }),
24356
+ /* @__PURE__ */ jsx(
24357
+ Slider,
24358
+ {
24359
+ min: -2,
24360
+ max: 4,
24361
+ step: 0.25,
24362
+ value: [letterSpacingToPx(typography?.letterSpacing?.chrome ?? DEFAULT_LETTER_SPACING)],
24363
+ onValueChange: (values) => setLetterSpacing(
24364
+ pxToLetterSpacing(
24365
+ values[0] ?? 0,
24366
+ typography?.letterSpacing?.chrome ?? DEFAULT_LETTER_SPACING
24367
+ )
24368
+ )
24369
+ }
24370
+ )
24371
+ ] })
24372
+ ] }),
24373
+ /* @__PURE__ */ jsxs(ControlSection, { title: "Elevation", children: [
24374
+ /* @__PURE__ */ jsx("p", { className: "tw-m-0 tw-text-xs tw-text-muted-foreground", children: "Box-shadow scale (`--shadow-*`), shared across light & dark. Empty inherits the default." }),
24375
+ SHADOW_SLOTS.map((slot) => /* @__PURE__ */ jsx(
24376
+ TextField2,
24377
+ {
24378
+ id: `${baseId}shadow-${slot}`,
24379
+ label: SHADOW_LABELS[slot],
24380
+ value: theme.shadows?.[slot] ?? "",
24381
+ placeholder: DEFAULT_SHADOWS[slot],
24382
+ onChange: (next) => setShadow(slot, next)
24383
+ },
24384
+ slot
24385
+ ))
24386
+ ] }),
24387
+ /* @__PURE__ */ jsxs(ControlSection, { title: "Density", children: [
24388
+ /* @__PURE__ */ jsx("p", { className: "tw-m-0 tw-text-xs tw-text-muted-foreground", children: "Semantic spacing (`--space-*`), as CSS lengths." }),
24389
+ SPACING_SLOTS.map((slot) => /* @__PURE__ */ jsx(
24390
+ TextField2,
24391
+ {
24392
+ id: `${baseId}spacing-${slot}`,
24393
+ label: SPACING_LABELS[slot],
24394
+ value: theme.spacing?.[slot] ?? "",
24395
+ placeholder: DEFAULT_SPACING[slot],
24396
+ onChange: (next) => setSpacing(slot, next)
24397
+ },
24398
+ slot
24399
+ ))
24400
+ ] }),
24401
+ /* @__PURE__ */ jsxs(ControlSection, { title: "Motion", children: [
24402
+ /* @__PURE__ */ jsx("p", { className: "tw-m-0 tw-text-xs tw-text-muted-foreground", children: "Base transition `duration` + `easing` (`--motion-*`)." }),
24403
+ MOTION_SLOTS.map((slot) => /* @__PURE__ */ jsx(
24404
+ TextField2,
24405
+ {
24406
+ id: `${baseId}motion-${slot}`,
24407
+ label: MOTION_LABELS[slot],
24408
+ value: theme.motion?.[slot] ?? "",
24409
+ placeholder: DEFAULT_MOTION[slot],
24410
+ onChange: (next) => setMotion(slot, next)
24411
+ },
24412
+ slot
24413
+ ))
24414
+ ] }),
24415
+ /* @__PURE__ */ jsx(ControlSection, { title: "Gradient", children: /* @__PURE__ */ jsx(
24416
+ TextField2,
24417
+ {
24418
+ id: `${baseId}gradient-brand`,
24419
+ label: "Brand gradient",
24420
+ value: theme.gradient?.brand ?? "",
24421
+ placeholder: DEFAULT_GRADIENT,
24422
+ onChange: setGradient
24423
+ }
24424
+ ) }),
24425
+ /* @__PURE__ */ jsxs(ControlSection, { title: "Logo", children: [
24426
+ /* @__PURE__ */ jsx(
24427
+ LogoField,
24428
+ {
24429
+ id: `${baseId}logo-mark`,
24430
+ label: "Mark (icon)",
24431
+ value: value.logo?.mark ?? "",
24432
+ onChange: (source) => setLogo("mark", source)
24433
+ }
24434
+ ),
24435
+ /* @__PURE__ */ jsx(
24436
+ LogoField,
24437
+ {
24438
+ id: `${baseId}logo-wordmark`,
24439
+ label: "Wordmark (full)",
24440
+ value: value.logo?.wordmark ?? "",
24441
+ onChange: (source) => setLogo("wordmark", source)
24442
+ }
24443
+ ),
24444
+ /* @__PURE__ */ jsxs(Collapsible, { className: "tw-flex tw-flex-col tw-gap-2", children: [
24445
+ /* @__PURE__ */ jsx(Collapsible.Trigger, { asChild: true, children: /* @__PURE__ */ jsx(Button, { variant: "outline", size: "small", className: "tw-w-full", children: "Toggle dark-mode logos" }) }),
24446
+ /* @__PURE__ */ jsxs(Collapsible.Content, { className: "tw-flex tw-flex-col tw-gap-2", children: [
24447
+ /* @__PURE__ */ jsx(
24448
+ LogoField,
24449
+ {
24450
+ id: `${baseId}logo-mark-dark`,
24451
+ label: "Mark (dark)",
24452
+ value: value.logo?.markDark ?? "",
24453
+ onChange: (source) => setLogo("markDark", source)
24454
+ }
24455
+ ),
24456
+ /* @__PURE__ */ jsx(
24457
+ LogoField,
24458
+ {
24459
+ id: `${baseId}logo-wordmark-dark`,
24460
+ label: "Wordmark (dark)",
24461
+ value: value.logo?.wordmarkDark ?? "",
24462
+ onChange: (source) => setLogo("wordmarkDark", source)
24463
+ }
24464
+ )
24465
+ ] })
24466
+ ] }),
24467
+ /* @__PURE__ */ jsxs("div", { className: "tw-flex tw-flex-col tw-gap-1", children: [
24468
+ /* @__PURE__ */ jsx("span", { className: "tw-text-xs tw-text-muted-foreground", children: "Preview" }),
24469
+ /* @__PURE__ */ jsx("div", { className: "tw-flex tw-min-h-12 tw-items-center tw-gap-4 tw-rounded-md tw-border tw-border-border tw-bg-background tw-p-3", children: value.logo?.mark || value.logo?.wordmark ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
24470
+ value.logo.mark ? /* @__PURE__ */ jsx(LogoPreviewImage, { source: value.logo.mark, className: "tw-h-8" }) : null,
24471
+ value.logo.wordmark ? /* @__PURE__ */ jsx(LogoPreviewImage, { source: value.logo.wordmark, className: "tw-h-8" }) : null
24472
+ ] }) : /* @__PURE__ */ jsx("span", { className: "tw-text-xs tw-text-muted-foreground", children: "No logo set" }) })
24473
+ ] })
24474
+ ] })
24475
+ ] });
24476
+ };
23643
24477
  /*! Bundled license information:
23644
24478
 
23645
24479
  react-is/cjs/react-is.production.min.js:
@@ -23670,6 +24504,6 @@ object-assign/index.js:
23670
24504
  *)
23671
24505
  */
23672
24506
 
23673
- export { Alert, AlertModal, AnswerSummary, AppShell, ArgoDesignContext, AutoSaveTextarea, Avatar, Badge, BrandLogo, Breadcrumb, Button, ButtonGroup, ButtonInline, Calendar, Card, Checkbox, Clipboard, ClipboardButton, ClipboardInline, Collapse, Collapsible, CollapsiblePanel, CollapsibleStepHeader, ColorInput, ColorModeSwitch, Combobox, Command, CommandGroup, CommandInput, CommandItem, CommandList, ConflictStatusIndicator, CopyField, DEFAULT_COLOR_SCHEME, DEFAULT_BRAND_ID as DEFAULT_KEBOOLA_BRAND_ID, DateInput, DatePicker, DateRangeInput, DateRangePicker, DiffType, DiffView, DotsLoader, DropdownMenu, EmptyConfigurationActionCard, EmptySearchContent, EmptyState, ErrorState, FileUpload, FormGroup, FullScreenModal, FullScreenModalBody, FullScreenModalHeader, HelpBlock, HoverCard, InlineStepDetail, InlineStepLabel, InputGroup, Kbd, Label2 as Label, Link, Markdown, MarkedText, MessageBubble, Modal, MultiActionButtonGroup, MultiCombobox, Navbar, NumberInput, OtpInput, PageHeader, PageLayout, PageToolbar, Pagination, PaneHeader, PanelWithDetails, PasswordInput, PlanApproval, PlanRewritingIndicator, Popconfirm, Popover, Progress, PromptInput, Question, QuestionBlock, RadioGroup2 as RadioGroup, ResizableHandle, ResizablePanelGroup, ScrollArea, ScrollBar, Search, SearchForm, SearchInput, SearchInputWithNavigation, Select2 as Select, Separator2 as Separator, Sheet, Sidebar, SidebarProvider, Skeleton, SkeletonList, Slider, SplitButton, SpotlightBackdrop, Stepper, SuggestedPrompt, Switch, Table, Tabs2 as Tabs, TabsContent, Tagger, TextInput, Textarea, ThemeProvider, ThinkingIndicator, TimeInput, TimePicker, Timeline, Toaster, Toggle, ToggleGroup, ToolCallApproval, ToolCallChip, Tooltip, TooltipProvider, Truncated, UsageStats, UsageStatsRing, ZoomableSvg, argoVariants, cn, computeDiffRows, computeLineInformation, copyToClipboard, isMac, kbdVariants, keys, mergeRefs, setServerFieldErrors, toast, useAppForm, useArgoDesign, useAutosizeInput, useMergeDiff, useNotification, useScrollbarPosition, useSidebar, useTargetRect, useTheme, withForm };
24507
+ export { Alert, AlertModal, AnswerSummary, AppShell, ArgoDesignContext, AutoSaveTextarea, Avatar, Badge, BrandEditor, BrandLogo, Breadcrumb, Button, ButtonGroup, ButtonInline, Calendar, Card, ChartPanel, Checkbox, Clipboard, ClipboardButton, ClipboardInline, Collapse, Collapsible, CollapsiblePanel, CollapsibleStepHeader, ColorInput, ColorModeSwitch, Combobox, Command, CommandGroup, CommandInput, CommandItem, CommandList, ConflictStatusIndicator, CopyField, DEFAULT_COLOR_SCHEME, DEFAULT_FALLBACK_FONT, DEFAULT_FONT_OPTIONS, DEFAULT_BRAND_ID as DEFAULT_KEBOOLA_BRAND_ID, DashboardHero, DateInput, DatePicker, DateRangeInput, DateRangePicker, DiffType, DiffView, DotsLoader, DropdownMenu, EmptyConfigurationActionCard, EmptySearchContent, EmptyState, ErrorState, FileUpload, FormGroup, FullScreenModal, FullScreenModalBody, FullScreenModalHeader, HelpBlock, HoverCard, InlineStepDetail, InlineStepLabel, InputGroup, Kbd, Label2 as Label, Link, Markdown, MarkedText, MessageBubble, Modal, MultiActionButtonGroup, MultiCombobox, Navbar, NumberInput, OtpInput, PageHeader, PageLayout, PageToolbar, Pagination, PaneHeader, PanelWithDetails, PasswordInput, PlanApproval, PlanRewritingIndicator, Popconfirm, Popover, Progress, PromptInput, Question, QuestionBlock, RadioGroup2 as RadioGroup, ResizableHandle, ResizablePanelGroup, ScrollArea, ScrollBar, Search, SearchForm, SearchInput, SearchInputWithNavigation, Select2 as Select, Separator2 as Separator, Sheet, Sidebar, SidebarProvider, Skeleton, SkeletonList, Slider, SplitButton, SpotlightBackdrop, StatCard, StatCardGrid, Stepper, SuggestedPrompt, Switch, Table, Tabs2 as Tabs, TabsContent, Tagger, TextInput, Textarea, ThemeProvider, ThinkingIndicator, TimeInput, TimePicker, Timeline, Toaster, Toggle, ToggleGroup, ToolCallApproval, ToolCallChip, Tooltip, TooltipProvider, Truncated, UsageStats, UsageStatsRing, ZoomableSvg, argoVariants, channelsToHex, cn, computeDiffRows, computeLineInformation, contrastRatio, copyToClipboard, hexToChannels, isMac, kbdVariants, keys, mergeRefs, setServerFieldErrors, toast, useAppForm, useArgoDesign, useAutosizeInput, useMergeDiff, useNotification, useScrollbarPosition, useSidebar, useTargetRect, useTheme, wcagLevel, withForm };
23674
24508
  //# sourceMappingURL=index.js.map
23675
24509
  //# sourceMappingURL=index.js.map