@keboola/design 3.0.0 → 3.1.1

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/mermaid.cjs CHANGED
@@ -7,7 +7,9 @@ var clsx = require('clsx');
7
7
  var tailwindMerge = require('tailwind-merge');
8
8
  var reactTooltip = require('@radix-ui/react-tooltip');
9
9
  var classVarianceAuthority = require('class-variance-authority');
10
+ var brandRegistry = require('@keboola/brand-registry');
10
11
  var jsxRuntime = require('react/jsx-runtime');
12
+ var DOMPurify = require('dompurify');
11
13
  var reactSlot = require('@radix-ui/react-slot');
12
14
  var lucide_react_star = require('lucide-react');
13
15
 
@@ -32,6 +34,7 @@ function _interopNamespace(e) {
32
34
  }
33
35
 
34
36
  var colors__default = /*#__PURE__*/_interopDefault(colors);
37
+ var DOMPurify__default = /*#__PURE__*/_interopDefault(DOMPurify);
35
38
  var lucide_react_star__namespace = /*#__PURE__*/_interopNamespace(lucide_react_star);
36
39
 
37
40
  var __defProp = Object.defineProperty;
@@ -66,17 +69,49 @@ var keyCodes = {
66
69
  ENTER: "Enter",
67
70
  SPACE: " "
68
71
  };
72
+ var ThemeContext = react.createContext(null);
73
+
74
+ // src/components/internal/useIsLegacyBrand.ts
75
+ var useIsLegacyBrand = () => {
76
+ const context = react.use(ThemeContext);
77
+ return context === null || context.brand.id === brandRegistry.keboolaLegacy.id;
78
+ };
69
79
  var tooltipVariants = classVarianceAuthority.cva(
70
80
  [
71
81
  "tailwindcss-preflight",
72
82
  "tw-inline-block",
73
- "tw-rounded",
74
- "tw-bg-neutral-800",
75
- "tw-text-white",
76
83
  "tw-break-anywhere",
77
84
  "tw-max-h-96",
78
85
  "tw-overflow-y-auto",
79
- "tw-z-[1060]"
86
+ "tw-z-[1060]",
87
+ // legacy (dark) chrome — default
88
+ "tw-rounded",
89
+ "tw-bg-neutral-800",
90
+ "tw-text-white",
91
+ // argo chrome overrides — semantic floating-panel tokens
92
+ "data-[argo=true]:tw-rounded-2xl",
93
+ "data-[argo=true]:tw-border",
94
+ "data-[argo=true]:tw-border-solid",
95
+ "data-[argo=true]:tw-border-border",
96
+ "data-[argo=true]:tw-bg-popover",
97
+ "data-[argo=true]:tw-text-popover-foreground",
98
+ "data-[argo=true]:tw-shadow-md",
99
+ // argo open animation
100
+ "data-[argo=true]:data-[state=delayed-open]:tw-animate-in",
101
+ "data-[argo=true]:data-[state=instant-open]:tw-animate-in",
102
+ "data-[argo=true]:data-[state=delayed-open]:tw-fade-in-0",
103
+ "data-[argo=true]:data-[state=instant-open]:tw-fade-in-0",
104
+ "data-[argo=true]:data-[state=delayed-open]:tw-zoom-in-95",
105
+ "data-[argo=true]:data-[state=instant-open]:tw-zoom-in-95",
106
+ // argo closed animation
107
+ "data-[argo=true]:data-[state=closed]:tw-animate-out",
108
+ "data-[argo=true]:data-[state=closed]:tw-fade-out-0",
109
+ "data-[argo=true]:data-[state=closed]:tw-zoom-out-95",
110
+ // argo position animation
111
+ "data-[argo=true]:data-[side=bottom]:tw-slide-in-from-top-2",
112
+ "data-[argo=true]:data-[side=left]:tw-slide-in-from-right-2",
113
+ "data-[argo=true]:data-[side=right]:tw-slide-in-from-left-2",
114
+ "data-[argo=true]:data-[side=top]:tw-slide-in-from-bottom-2"
80
115
  ],
81
116
  {
82
117
  defaultVariants: {
@@ -109,6 +144,7 @@ var tooltipVariants = classVarianceAuthority.cva(
109
144
  var TooltipContent = ({
110
145
  className,
111
146
  variant,
147
+ argo,
112
148
  keepOpenOnPointerDownOutside = false,
113
149
  children,
114
150
  onPointerDownOutside,
@@ -118,6 +154,8 @@ var TooltipContent = ({
118
154
  placement = "right",
119
155
  ...rest
120
156
  }) => {
157
+ const isLegacy = useIsLegacyBrand();
158
+ const renderArgo = !isLegacy || argo === true;
121
159
  const handlePointerDownOutside = (event) => {
122
160
  if (keepOpenOnPointerDownOutside) event.preventDefault();
123
161
  onPointerDownOutside?.(event);
@@ -126,7 +164,8 @@ var TooltipContent = ({
126
164
  reactTooltip.Content,
127
165
  {
128
166
  ...rest,
129
- "data-tooltip-content": true,
167
+ "data-tooltip-content": renderArgo ? void 0 : true,
168
+ "data-argo": renderArgo,
130
169
  sideOffset,
131
170
  collisionPadding,
132
171
  onPointerDownOutside: handlePointerDownOutside,
@@ -185,6 +224,7 @@ var Tooltip = ({
185
224
  className,
186
225
  keepOpenOnTriggerClick = false,
187
226
  variant,
227
+ argo,
188
228
  placement = "right",
189
229
  forceHide = false,
190
230
  forceShow = false,
@@ -223,6 +263,7 @@ var Tooltip = ({
223
263
  {
224
264
  className,
225
265
  variant: resolvedVariant,
266
+ argo,
226
267
  placement,
227
268
  keepOpenOnPointerDownOutside: keepOpenOnTriggerClick,
228
269
  children: tooltip
@@ -249,7 +290,7 @@ var ANIMATION_CLASS_NAME = cn(
249
290
  "tw-relative",
250
291
  "tw-overflow-hidden",
251
292
  "tw-pointer-events-none",
252
- "tw-bg-neutral-150",
293
+ "tw-bg-muted",
253
294
  // before
254
295
  'before:tw-content-[""]',
255
296
  "before:tw-opacity-100",
@@ -488,6 +529,8 @@ var argoVariants = classVarianceAuthority.cva(
488
529
  "tw-bg-clip-padding",
489
530
  // anchor support
490
531
  "!tw-no-underline",
532
+ "aria-disabled:tw-cursor-not-allowed",
533
+ "aria-disabled:tw-opacity-50",
491
534
  // icon
492
535
  "tw-shrink-0",
493
536
  "[&_svg]:tw-pointer-events-none",
@@ -590,14 +633,11 @@ var Button = ({
590
633
  block = false,
591
634
  ...buttonProps
592
635
  }) => {
636
+ const isLegacy = useIsLegacyBrand();
637
+ const renderArgo = !isLegacy || argo;
593
638
  const Comp = asChild ? reactSlot.Root : "button";
594
639
  const isIconOnly = String(size).startsWith("icon");
595
- const classNames = argo ? argoVariants({ variant, size, block, className }) : variants({
596
- size,
597
- variant,
598
- block,
599
- className
600
- });
640
+ const classNames = renderArgo ? argoVariants({ variant, size, block, className }) : variants({ size, variant, block, className });
601
641
  const handleClick = (event) => {
602
642
  const isAnchor = event.currentTarget.tagName === "A";
603
643
  if (isAnchor && disabled) {
@@ -718,6 +758,10 @@ var MIN_SCALE = 0.5;
718
758
  var MAX_SCALE = 3;
719
759
  var ZOOM_STEP = 0.1;
720
760
  var ZoomableSvg = ({ html, copyText, className }) => {
761
+ const safeHtml = react.useMemo(
762
+ () => DOMPurify__default.default.sanitize(html, { USE_PROFILES: { svg: true, svgFilters: true } }),
763
+ [html]
764
+ );
721
765
  const containerRef = react.useRef(null);
722
766
  const [scale, setScale] = react.useState(1);
723
767
  const [translate, setTranslate] = react.useState({ x: 0, y: 0 });
@@ -813,7 +857,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
813
857
  isFullscreen && "tw-h-full [&>svg]:tw-h-full"
814
858
  ),
815
859
  style: { transform: `translate(${translate.x}px, ${translate.y}px) scale(${scale})` },
816
- dangerouslySetInnerHTML: { __html: html }
860
+ dangerouslySetInnerHTML: { __html: safeHtml }
817
861
  }
818
862
  )
819
863
  }
@@ -866,7 +910,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
866
910
  "div",
867
911
  {
868
912
  role: "presentation",
869
- className: "tw-fixed tw-inset-0 tw-z-[1060] tw-bg-neutral-50 tw-p-4",
913
+ className: "tw-fixed tw-inset-0 tw-z-[1060] tw-bg-muted tw-p-4",
870
914
  onClick: stopPropagation,
871
915
  children: diagramContent
872
916
  }
@@ -876,13 +920,18 @@ var ZoomableSvg = ({ html, copyText, className }) => {
876
920
  "div",
877
921
  {
878
922
  className: cn(
879
- "tw-overflow-hidden tw-rounded-md tw-border tw-border-neutral-150 tw-bg-neutral-50",
923
+ "tw-overflow-hidden tw-rounded-md tw-border tw-border-border tw-bg-muted",
880
924
  className
881
925
  ),
882
926
  children: diagramContent
883
927
  }
884
928
  );
885
929
  };
930
+ var PRIMARY_FALLBACK_CHANNELS = "31 143 255";
931
+ var resolvePrimary = () => {
932
+ const channels = typeof document === "undefined" ? PRIMARY_FALLBACK_CHANNELS : getComputedStyle(document.documentElement).getPropertyValue("--color-primary").trim() || PRIMARY_FALLBACK_CHANNELS;
933
+ return `rgb(${channels})`;
934
+ };
886
935
  var mermaidPromise = null;
887
936
  var getMermaid = () => {
888
937
  if (!mermaidPromise) {
@@ -931,7 +980,7 @@ var getMermaid = () => {
931
980
  taskTextColor: colors__default.default.neutral[800],
932
981
  taskTextDarkColor: colors__default.default.neutral[800],
933
982
  taskTextLightColor: colors__default.default.neutral[800],
934
- activeTaskBorderColor: colors__default.default.primary.DEFAULT,
983
+ activeTaskBorderColor: resolvePrimary(),
935
984
  activeTaskBkgColor: colors__default.default.secondary[200],
936
985
  doneTaskBorderColor: colors__default.default.primary[600],
937
986
  doneTaskBkgColor: colors__default.default.primary[100],
@@ -983,46 +1032,28 @@ var makeResponsive = (svgString) => {
983
1032
  };
984
1033
  var RENDER_DEBOUNCE_MS = 300;
985
1034
  var svgCache = /* @__PURE__ */ new Map();
1035
+ var resolveSyncSvg = (code) => {
1036
+ const cached = svgCache.get(code);
1037
+ if (cached) return cached;
1038
+ const fast = tryFastRender(code);
1039
+ if (fast) svgCache.set(code, fast);
1040
+ return fast;
1041
+ };
986
1042
  var MermaidDiagram = ({ code }) => {
987
1043
  const id = react.useId();
988
- const [svg, setSvg] = react.useState(() => {
989
- const cached = svgCache.get(code);
990
- if (cached) return cached;
991
- const fast = tryFastRender(code);
992
- if (fast) {
993
- svgCache.set(code, fast);
994
- return fast;
995
- }
996
- return null;
997
- });
1044
+ const [svg, setSvg] = react.useState(() => resolveSyncSvg(code));
998
1045
  const [renderFailed, setRenderFailed] = react.useState(false);
999
1046
  const debounceRef = react.useRef(null);
1000
1047
  const renderIdRef = react.useRef(0);
1001
1048
  const [prevCode, setPrevCode] = react.useState(code);
1002
1049
  if (code !== prevCode) {
1003
1050
  setPrevCode(code);
1004
- const cached = svgCache.get(code);
1005
- const fast = cached ?? tryFastRender(code);
1006
- if (fast && !cached) svgCache.set(code, fast);
1007
- setSvg(fast);
1051
+ setSvg(resolveSyncSvg(code));
1008
1052
  setRenderFailed(false);
1009
1053
  }
1010
1054
  react.useEffect(() => {
1011
- if (svgCache.has(code)) {
1012
- setSvg(svgCache.get(code));
1013
- setRenderFailed(false);
1014
- return;
1015
- }
1016
- const fastResult = tryFastRender(code);
1017
- if (fastResult) {
1018
- svgCache.set(code, fastResult);
1019
- setSvg(fastResult);
1020
- setRenderFailed(false);
1021
- return;
1022
- }
1023
- setSvg(null);
1055
+ if (svgCache.has(code)) return;
1024
1056
  const currentRenderId = ++renderIdRef.current;
1025
- setRenderFailed(false);
1026
1057
  if (debounceRef.current) {
1027
1058
  clearTimeout(debounceRef.current);
1028
1059
  }