@keboola/design 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.
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';
@@ -14,6 +14,7 @@ import { Root, Group, Trigger as Trigger$4 } from '@radix-ui/react-dropdown-menu
14
14
  import * as ScrollAreaPrimitive2 from '@radix-ui/react-scroll-area';
15
15
  import { Root as Root$7 } from '@radix-ui/react-toggle';
16
16
  import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';
17
+ import * as RLabel from '@radix-ui/react-label';
17
18
  import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
18
19
  import { Root as Root$8, Trigger as Trigger$5, Portal as Portal$1, Content as Content$1, Cancel, Action, Overlay as Overlay$1, Title as Title$1 } from '@radix-ui/react-alert-dialog';
19
20
  import * as DialogPrimitive from '@radix-ui/react-dialog';
@@ -25,7 +26,6 @@ import { Root as Root$a, Trigger as Trigger$3, Portal as Portal$4, Content as Co
25
26
  import { Command as Command$1, CommandInput as CommandInput$1, defaultFilter, useCommandState } from 'cmdk';
26
27
  export { defaultFilter, useCommandState } from 'cmdk';
27
28
  import TextareaAutosize from 'react-textarea-autosize';
28
- import * as RLabel from '@radix-ui/react-label';
29
29
  import { Root as Root$3, Thumb } from '@radix-ui/react-switch';
30
30
  import * as RRadioGroup from '@radix-ui/react-radio-group';
31
31
  import { Item, Indicator as Indicator$2 } from '@radix-ui/react-radio-group';
@@ -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;
@@ -2768,6 +2768,7 @@ var Clipboard = ({
2768
2768
  ] });
2769
2769
  };
2770
2770
  var DEFAULT_ICON = /* @__PURE__ */ jsx(icons_exports.Copy, {});
2771
+ var DEFAULT_ARIA_LABEL = "Copy";
2771
2772
  var ClipboardButton = ({
2772
2773
  // clipboard props
2773
2774
  text,
@@ -2779,20 +2780,24 @@ var ClipboardButton = ({
2779
2780
  variant = "outline",
2780
2781
  children,
2781
2782
  ...rest
2782
- }) => /* @__PURE__ */ jsx(
2783
- Clipboard,
2784
- {
2785
- asChild: true,
2786
- tooltip,
2787
- tooltipPlacement,
2788
- tooltipVariant,
2789
- text,
2790
- children: /* @__PURE__ */ jsxs(Button, { ...rest, variant, disabled: !text, children: [
2791
- icon,
2792
- children
2793
- ] })
2794
- }
2795
- );
2783
+ }) => {
2784
+ const defaultAriaLabel = typeof tooltip === "string" && tooltip.trim() ? tooltip : DEFAULT_ARIA_LABEL;
2785
+ const ariaLabel = rest["aria-label"] ?? (children == null ? defaultAriaLabel : void 0);
2786
+ return /* @__PURE__ */ jsx(
2787
+ Clipboard,
2788
+ {
2789
+ asChild: true,
2790
+ tooltip,
2791
+ tooltipPlacement,
2792
+ tooltipVariant,
2793
+ text,
2794
+ children: /* @__PURE__ */ jsxs(Button, { ...rest, "aria-label": ariaLabel, variant, disabled: !text, children: [
2795
+ icon,
2796
+ children
2797
+ ] })
2798
+ }
2799
+ );
2800
+ };
2796
2801
  var ClipboardInline = ({
2797
2802
  // clipboard props
2798
2803
  text,
@@ -2817,6 +2822,264 @@ var ClipboardInline = ({
2817
2822
  ] })
2818
2823
  }
2819
2824
  );
2825
+ var CopyContext = createContext(null);
2826
+ var useCopyContext = () => {
2827
+ const ctx = use(CopyContext);
2828
+ if (!ctx) throw new Error("CopyField.* components must be used within a CopyField.Root");
2829
+ return ctx;
2830
+ };
2831
+ var LINE_HEIGHT_REM = 1.25;
2832
+ var VERTICAL_PADDING_REM = 1.25;
2833
+ var CopyBox = ({ className, children }) => {
2834
+ const { copied, handleCopy, mono, minLines, maxLines, boxId, labelId, hasLabel } = useCopyContext();
2835
+ const multiline = maxLines > 1;
2836
+ const multilineStyle = multiline ? {
2837
+ minHeight: `${minLines * LINE_HEIGHT_REM + VERTICAL_PADDING_REM}rem`,
2838
+ maxHeight: `${maxLines * LINE_HEIGHT_REM + VERTICAL_PADDING_REM}rem`
2839
+ } : void 0;
2840
+ const handleKeyDown2 = (event) => {
2841
+ if (event.target !== event.currentTarget) return;
2842
+ if (event.key !== "Enter" && event.key !== " ") return;
2843
+ event.preventDefault();
2844
+ handleCopy();
2845
+ };
2846
+ return /* @__PURE__ */ jsx(Tooltip, { triggerAsChild: true, placement: "top", tooltip: copied ? "Copied" : "Copy", forceShow: copied, children: /* @__PURE__ */ jsx(
2847
+ "div",
2848
+ {
2849
+ role: "button",
2850
+ tabIndex: 0,
2851
+ id: boxId,
2852
+ "aria-labelledby": hasLabel ? labelId : void 0,
2853
+ onClick: handleCopy,
2854
+ onKeyDown: handleKeyDown2,
2855
+ style: multilineStyle,
2856
+ className: cn(
2857
+ "tw-group tw-relative tw-flex tw-w-fit tw-max-w-full tw-cursor-pointer tw-gap-2 tw-rounded-2xl [corner-shape:superellipse(2)] tw-border tw-border-[#e4e4e4] tw-bg-[#fafafa] tw-px-3 tw-py-2.5 tw-text-left tw-shadow-sm tw-transition-colors hover:tw-bg-[#f2f2f2]",
2858
+ multiline ? "tw-items-start tw-overflow-auto" : "tw-items-center tw-overflow-hidden",
2859
+ mono && "tw-font-mono tw-text-[13px]",
2860
+ className
2861
+ ),
2862
+ children
2863
+ }
2864
+ ) });
2865
+ };
2866
+ var CopyButton = ({ className }) => {
2867
+ const { copied, maxLines } = useCopyContext();
2868
+ return /* @__PURE__ */ jsx(
2869
+ "span",
2870
+ {
2871
+ "aria-hidden": true,
2872
+ className: cn(
2873
+ "tw-pointer-events-none tw-flex tw-shrink-0 tw-items-center tw-text-[#8b8b8b] group-hover:tw-text-[#5c5c5c]",
2874
+ maxLines > 1 && "tw-self-start tw-pt-0.5",
2875
+ className
2876
+ ),
2877
+ children: copied ? /* @__PURE__ */ jsx(icons_exports.Check, { className: "tw-size-4" }) : /* @__PURE__ */ jsx(icons_exports.Copy, { className: "tw-size-4" })
2878
+ }
2879
+ );
2880
+ };
2881
+ var CopyChildren = ({ children, className }) => {
2882
+ const { maxLines } = useCopyContext();
2883
+ const multiline = maxLines > 1;
2884
+ return /* @__PURE__ */ jsx(
2885
+ "span",
2886
+ {
2887
+ className: cn(
2888
+ "tw-min-w-0 tw-flex-1 tw-select-text tw-text-[#3f3f3f]",
2889
+ multiline ? "tw-whitespace-pre-wrap tw-break-words" : "tw-truncate",
2890
+ className
2891
+ ),
2892
+ children
2893
+ }
2894
+ );
2895
+ };
2896
+ var CopyFooter = ({ children, className }) => {
2897
+ if (!children) return null;
2898
+ return /* @__PURE__ */ jsx("p", { className: cn("tw-m-0 tw-text-xs tw-text-muted-foreground", className), children });
2899
+ };
2900
+ var MASK = "*".repeat(12);
2901
+ var CopyHidden = ({ children, revealable = true, className }) => {
2902
+ const { hidden, registerRevealable } = useCopyContext();
2903
+ useEffect(() => {
2904
+ if (!revealable) return void 0;
2905
+ return registerRevealable();
2906
+ }, [revealable, registerRevealable]);
2907
+ const masked = revealable ? hidden : true;
2908
+ return /* @__PURE__ */ jsx("span", { className: cn("tw-select-none", className), children: masked ? MASK : children });
2909
+ };
2910
+ var Optional = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { ...props, "aria-hidden": true, className: cn("tw-ml-0.5", "tw-text-muted-foreground", className), children: "(optional)" });
2911
+ var Required = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { ...props, "aria-hidden": true, className: cn("tw-ml-0.5", "tw-text-primary", className), children: "*" });
2912
+ var Label2 = ({ className, children, id, htmlFor, ...rest }) => /* @__PURE__ */ jsx(
2913
+ RLabel.Root,
2914
+ {
2915
+ ...rest,
2916
+ id: id?.toString(),
2917
+ htmlFor: htmlFor?.toString(),
2918
+ className: cn(
2919
+ "tw-m-0 tw-text-foreground tw-font-normal peer-disabled:tw-opacity-50",
2920
+ className
2921
+ ),
2922
+ children
2923
+ }
2924
+ );
2925
+ Label2.Optional = Optional;
2926
+ Label2.Required = Required;
2927
+ var CopyLabel = ({ children, leading, trailing, className }) => {
2928
+ const { labelId, registerLabel } = useCopyContext();
2929
+ useEffect(() => registerLabel(), [registerLabel]);
2930
+ return /* @__PURE__ */ jsxs("div", { className: cn("tw-flex tw-items-center tw-gap-1", className), children: [
2931
+ /* @__PURE__ */ jsx(Label2, { id: labelId, children }),
2932
+ leading,
2933
+ trailing != null && /* @__PURE__ */ jsx("span", { className: "tw-ml-auto tw-flex tw-items-center", children: trailing })
2934
+ ] });
2935
+ };
2936
+ var CopyPrefix = ({ children, className }) => /* @__PURE__ */ jsx(
2937
+ "span",
2938
+ {
2939
+ "aria-hidden": true,
2940
+ className: cn(
2941
+ "tw-shrink-0 tw-select-none tw-self-stretch tw-border-r tw-border-[#e4e4e4] tw-pr-2 tw-text-[#6b6b6b]",
2942
+ className
2943
+ ),
2944
+ children
2945
+ }
2946
+ );
2947
+ var CopyReveal = ({ className }) => {
2948
+ const { hidden, toggleHidden, hasRevealable, maxLines } = useCopyContext();
2949
+ if (!hasRevealable) return null;
2950
+ const handleClick = (event) => {
2951
+ event.stopPropagation();
2952
+ toggleHidden();
2953
+ };
2954
+ return /* @__PURE__ */ jsx(
2955
+ "button",
2956
+ {
2957
+ type: "button",
2958
+ onClick: handleClick,
2959
+ "aria-label": hidden ? "Show value" : "Hide value",
2960
+ className: cn(
2961
+ "tw-flex tw-shrink-0 tw-items-center tw-text-[#8b8b8b] hover:tw-text-[#5c5c5c]",
2962
+ maxLines > 1 && "tw-self-start tw-pt-0.5",
2963
+ className
2964
+ ),
2965
+ children: hidden ? /* @__PURE__ */ jsx(icons_exports.Eye, { className: "tw-size-4" }) : /* @__PURE__ */ jsx(icons_exports.EyeOff, { className: "tw-size-4" })
2966
+ }
2967
+ );
2968
+ };
2969
+ var CopyRoot = ({
2970
+ value,
2971
+ mono = false,
2972
+ onCopy,
2973
+ hiddenByDefault = false,
2974
+ minLines = 1,
2975
+ maxLines,
2976
+ className,
2977
+ children
2978
+ }) => {
2979
+ const [copied, setCopied] = useState(false);
2980
+ const [hidden, setHidden] = useState(hiddenByDefault);
2981
+ const [revealableCount, setRevealableCount] = useState(0);
2982
+ const [labelCount, setLabelCount] = useState(0);
2983
+ const resetTimerRef = useRef(void 0);
2984
+ const generatedId = useId();
2985
+ const labelId = `${generatedId}-label`;
2986
+ const boxId = `${generatedId}-box`;
2987
+ useEffect(() => () => clearTimeout(resetTimerRef.current), []);
2988
+ const handleCopy = useCallback(() => {
2989
+ const selection = window.getSelection();
2990
+ const boxEl = document.getElementById(boxId);
2991
+ if (selection && !selection.isCollapsed && selection.anchorNode && boxEl?.contains(selection.anchorNode)) {
2992
+ return;
2993
+ }
2994
+ copyToClipboard(value).then(() => {
2995
+ onCopy?.();
2996
+ setCopied(true);
2997
+ clearTimeout(resetTimerRef.current);
2998
+ resetTimerRef.current = setTimeout(() => setCopied(false), 1500);
2999
+ }).catch((error) => {
3000
+ console.error("Copy to clipboard failed", error);
3001
+ });
3002
+ }, [value, onCopy, boxId]);
3003
+ const toggleHidden = useCallback(() => setHidden((prev) => !prev), []);
3004
+ const registerRevealable = useCallback(() => {
3005
+ setRevealableCount((count) => count + 1);
3006
+ return () => setRevealableCount((count) => count - 1);
3007
+ }, []);
3008
+ const registerLabel = useCallback(() => {
3009
+ setLabelCount((count) => count + 1);
3010
+ return () => setLabelCount((count) => count - 1);
3011
+ }, []);
3012
+ const contextValue = useMemo(
3013
+ () => ({
3014
+ copied,
3015
+ handleCopy,
3016
+ value,
3017
+ mono,
3018
+ hidden,
3019
+ toggleHidden,
3020
+ registerRevealable,
3021
+ hasRevealable: revealableCount > 0,
3022
+ registerLabel,
3023
+ hasLabel: labelCount > 0,
3024
+ minLines,
3025
+ maxLines: maxLines ?? minLines,
3026
+ labelId,
3027
+ boxId
3028
+ }),
3029
+ [
3030
+ copied,
3031
+ handleCopy,
3032
+ value,
3033
+ mono,
3034
+ hidden,
3035
+ toggleHidden,
3036
+ registerRevealable,
3037
+ revealableCount,
3038
+ registerLabel,
3039
+ labelCount,
3040
+ minLines,
3041
+ maxLines,
3042
+ labelId,
3043
+ boxId
3044
+ ]
3045
+ );
3046
+ return /* @__PURE__ */ jsx(CopyContext, { value: contextValue, children: /* @__PURE__ */ jsx("div", { className: cn("tw-flex tw-w-fit tw-max-w-full tw-flex-col tw-gap-1", className), children }) });
3047
+ };
3048
+ var CopySuffix = ({ children, className }) => /* @__PURE__ */ jsx(
3049
+ "span",
3050
+ {
3051
+ "aria-hidden": true,
3052
+ className: cn(
3053
+ "tw-shrink-0 tw-select-none tw-self-stretch tw-border-l tw-border-[#e4e4e4] tw-pl-2 tw-text-[#6b6b6b]",
3054
+ className
3055
+ ),
3056
+ children
3057
+ }
3058
+ );
3059
+
3060
+ // src/blocks/CopyField/CopyField.tsx
3061
+ var CopyField = {
3062
+ /** Container. Owns the copied `value`, mask state, and copy context. */
3063
+ Root: CopyRoot,
3064
+ /** Visible label above the box, with optional `leading`/`trailing` slots. */
3065
+ Label: CopyLabel,
3066
+ /** The clickable copy target row. */
3067
+ Box: CopyBox,
3068
+ /** Muted, non-selectable prefix addon (not copied). */
3069
+ Prefix: CopyPrefix,
3070
+ /** Displayed value (truncates single-line, wraps multi-line). */
3071
+ Children: CopyChildren,
3072
+ /** Muted, non-selectable suffix addon (not copied). */
3073
+ Suffix: CopySuffix,
3074
+ /** Masks its children with dots; copy still copies the real value. */
3075
+ Hidden: CopyHidden,
3076
+ /** Eye toggle that reveals/masks revealable `CopyField.Hidden` content. */
3077
+ Reveal: CopyReveal,
3078
+ /** Copy affordance icon — shows Copy/Check with feedback. */
3079
+ Button: CopyButton,
3080
+ /** Small helper text below the box. */
3081
+ Footer: CopyFooter
3082
+ };
2820
3083
  var Link = ({
2821
3084
  ref,
2822
3085
  children,
@@ -3773,8 +4036,8 @@ var FullScreenModalHeader = ({
3773
4036
  {
3774
4037
  text: previousTitle,
3775
4038
  className: cn(
3776
- "tw-relative tw-top-0 tw-cursor-pointer tw-text-base tw-font-normal tw-text-neutral-400 tw-underline",
3777
- "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",
3778
4041
  isTitleWithIcon && "tw-ml-14"
3779
4042
  )
3780
4043
  }
@@ -6751,7 +7014,7 @@ __export(custom_components_exports, {
6751
7014
  NextMonthButton: () => NextMonthButton,
6752
7015
  Option: () => Option,
6753
7016
  PreviousMonthButton: () => PreviousMonthButton,
6754
- Root: () => Root16,
7017
+ Root: () => Root17,
6755
7018
  Select: () => Select,
6756
7019
  Week: () => Week,
6757
7020
  WeekNumber: () => WeekNumber,
@@ -6931,7 +7194,7 @@ function Option(props) {
6931
7194
  function PreviousMonthButton(props) {
6932
7195
  return React26.createElement("button", { ...props });
6933
7196
  }
6934
- function Root16(props) {
7197
+ function Root17(props) {
6935
7198
  const { rootRef, ...rest } = props;
6936
7199
  return React26.createElement("div", { ...rest, ref: rootRef });
6937
7200
  }
@@ -9999,23 +10262,6 @@ var TimePicker = ({
9999
10262
  )
10000
10263
  ] });
10001
10264
  };
10002
- var Optional = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { ...props, "aria-hidden": true, className: cn("tw-ml-0.5", "tw-text-muted-foreground", className), children: "(optional)" });
10003
- var Required = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { ...props, "aria-hidden": true, className: cn("tw-ml-0.5", "tw-text-primary", className), children: "*" });
10004
- var Label2 = ({ className, children, id, htmlFor, ...rest }) => /* @__PURE__ */ jsx(
10005
- RLabel.Root,
10006
- {
10007
- ...rest,
10008
- id: id?.toString(),
10009
- htmlFor: htmlFor?.toString(),
10010
- className: cn(
10011
- "tw-m-0 tw-text-foreground tw-font-normal peer-disabled:tw-opacity-50",
10012
- className
10013
- ),
10014
- children
10015
- }
10016
- );
10017
- Label2.Optional = Optional;
10018
- Label2.Required = Required;
10019
10265
  var FieldBoxDescription = ({ className, ...props }) => /* @__PURE__ */ jsx(
10020
10266
  "span",
10021
10267
  {
@@ -10744,8 +10990,8 @@ var ClearButton = ({ onClick, testId }) => {
10744
10990
  "tw-flex",
10745
10991
  "tw-items-center",
10746
10992
  "tw-cursor-pointer",
10747
- "tw-text-neutral-300",
10748
- "hover:tw-text-neutral-800"
10993
+ "tw-text-muted-foreground",
10994
+ "hover:tw-text-foreground"
10749
10995
  ),
10750
10996
  "data-testid": testId,
10751
10997
  children: /* @__PURE__ */ jsx(icons_exports.X, { className: "tw-size-4" })
@@ -11586,23 +11832,23 @@ var BadgeLabel = ({
11586
11832
  var badgeColors = {
11587
11833
  gray: "tw-bg-neutral-400 tw-text-white tw-decoration-neutral-400",
11588
11834
  "gray-darker": "tw-bg-neutral-500 tw-text-white tw-decoration-neutral-500",
11589
- "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",
11590
11836
  green: "tw-bg-green-500 tw-text-white tw-decoration-green-500",
11591
11837
  "green-darker": "tw-bg-green-600 tw-text-white tw-decoration-green-600",
11592
- "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",
11593
11839
  blue: "tw-bg-blue-500 tw-text-white tw-decoration-blue-500",
11594
- "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",
11595
11841
  red: "tw-bg-error-500 tw-text-white tw-decoration-error-500",
11596
11842
  orange: "tw-bg-warning-500 tw-text-white tw-decoration-warning-500",
11597
- "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",
11598
11844
  amber: "tw-bg-warning-300 tw-text-warning-800 tw-decoration-warning-300",
11599
11845
  "amber-inverse": "tw-bg-warning-100 tw-text-warning-700 tw-decoration-warning-100",
11600
11846
  teal: "tw-bg-teal-500 tw-text-white tw-decoration-teal-500",
11601
- "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",
11602
11848
  purple: "tw-bg-purple-500 tw-text-white tw-decoration-purple-500",
11603
- "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",
11604
11850
  cyan: "tw-bg-cyan-500 tw-text-white tw-decoration-cyan-500",
11605
- "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",
11606
11852
  "sidebar-primary": "tw-bg-sidebar-primary tw-text-white tw-decoration-sidebar-primary",
11607
11853
  white: "tw-bg-white/90 tw-text-neutral-600 tw-decoration-white/90"
11608
11854
  };
@@ -16368,6 +16614,12 @@ var PromptInputCommands = ({ items, open, onSelect, filterValue, children }) =>
16368
16614
  children
16369
16615
  ] });
16370
16616
  };
16617
+ var ARIA_LABEL_BY_STATUS = {
16618
+ ready: "Send message",
16619
+ streaming: "Stop",
16620
+ interrupted: "Continue",
16621
+ submitted: "Sending\u2026"
16622
+ };
16371
16623
  var PromptInputSubmit = ({
16372
16624
  ref,
16373
16625
  disabled,
@@ -16390,6 +16642,7 @@ var PromptInputSubmit = ({
16390
16642
  ref,
16391
16643
  type: "submit",
16392
16644
  disabled,
16645
+ "aria-label": ARIA_LABEL_BY_STATUS[status],
16393
16646
  size: "icon-sm",
16394
16647
  variant: "invisible",
16395
16648
  isLoading: status === "submitted",
@@ -17836,7 +18089,7 @@ var cardTitleClassnames = cn(
17836
18089
  "tw-text-base",
17837
18090
  "tw-text-card-foreground"
17838
18091
  );
17839
- var CardTitle = ({ children, className, ...rest }) => /* @__PURE__ */ jsx("h3", { className: cn(cardTitleClassnames, className), ...rest, children });
18092
+ var CardTitle = ({ children, className, as: Tag = "h3", ...rest }) => /* @__PURE__ */ jsx(Tag, { className: cn(cardTitleClassnames, className), ...rest, children });
17840
18093
  var Card = ({
17841
18094
  children,
17842
18095
  className,
@@ -18168,9 +18421,7 @@ var headerVariants = cva(
18168
18421
  variants: {
18169
18422
  variant: {
18170
18423
  default: "tw-bg-muted",
18171
- // White surface kept literal until a `card` token exists (UT-4396);
18172
- // `background` is the page base, not an elevated panel surface.
18173
- white: "tw-bg-white"
18424
+ white: "tw-bg-card"
18174
18425
  },
18175
18426
  isDisabled: {
18176
18427
  true: "tw-cursor-not-allowed tw-opacity-50",
@@ -18235,7 +18486,7 @@ var CollapsiblePanel = ({
18235
18486
  {
18236
18487
  open,
18237
18488
  className: cn(
18238
- "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",
18239
18490
  className
18240
18491
  ),
18241
18492
  header: /* @__PURE__ */ jsxs(
@@ -18443,6 +18694,18 @@ var tokensToCssVars = ({
18443
18694
  vars.set("--font-weight-semibold", typography?.weight?.semibold);
18444
18695
  vars.set("--font-weight-bold", typography?.weight?.bold);
18445
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);
18446
18709
  vars.set("--radius-sm", radii?.sm);
18447
18710
  vars.set("--radius-md", radii?.md);
18448
18711
  vars.set("--radius-lg", radii?.lg);
@@ -22948,6 +23211,150 @@ var pairChunksIntoConflicts = (chunks) => {
22948
23211
  }
22949
23212
  return conflicts;
22950
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
+ ] });
22951
23358
  var { fieldContext, useFieldContext, formContext, useFormContext } = createFormHookContexts();
22952
23359
  var FormBody = ({ children, className, ...formProps }) => {
22953
23360
  const form = useFormContext();
@@ -23387,6 +23794,686 @@ function useAutosizeInput({
23387
23794
  ] });
23388
23795
  return { inputRef, inputStyle, sizerElement };
23389
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
+ };
23390
24477
  /*! Bundled license information:
23391
24478
 
23392
24479
  react-is/cjs/react-is.production.min.js:
@@ -23417,6 +24504,6 @@ object-assign/index.js:
23417
24504
  *)
23418
24505
  */
23419
24506
 
23420
- 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, 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 };
23421
24508
  //# sourceMappingURL=index.js.map
23422
24509
  //# sourceMappingURL=index.js.map