@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.js CHANGED
@@ -1,11 +1,13 @@
1
- import { forwardRef, useId, useState, useRef, useEffect, useCallback } from 'react';
1
+ import { createContext, forwardRef, useId, useState, useRef, useEffect, useMemo, useCallback, use } from 'react';
2
2
  import { renderMermaidSVG } from 'beautiful-mermaid';
3
3
  import colors from '@keboola/tailwind-config/colors';
4
4
  import { clsx } from 'clsx';
5
5
  import { extendTailwindMerge } from 'tailwind-merge';
6
6
  import { Root as Root$1, Trigger, Portal, Content } from '@radix-ui/react-tooltip';
7
7
  import { cva } from 'class-variance-authority';
8
+ import { keboolaLegacy } from '@keboola/brand-registry';
8
9
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
10
+ import DOMPurify from 'dompurify';
9
11
  import { Root, Slottable } from '@radix-ui/react-slot';
10
12
  import * as lucide_react_star from 'lucide-react';
11
13
 
@@ -41,17 +43,49 @@ var keyCodes = {
41
43
  ENTER: "Enter",
42
44
  SPACE: " "
43
45
  };
46
+ var ThemeContext = createContext(null);
47
+
48
+ // src/components/internal/useIsLegacyBrand.ts
49
+ var useIsLegacyBrand = () => {
50
+ const context = use(ThemeContext);
51
+ return context === null || context.brand.id === keboolaLegacy.id;
52
+ };
44
53
  var tooltipVariants = cva(
45
54
  [
46
55
  "tailwindcss-preflight",
47
56
  "tw-inline-block",
48
- "tw-rounded",
49
- "tw-bg-neutral-800",
50
- "tw-text-white",
51
57
  "tw-break-anywhere",
52
58
  "tw-max-h-96",
53
59
  "tw-overflow-y-auto",
54
- "tw-z-[1060]"
60
+ "tw-z-[1060]",
61
+ // legacy (dark) chrome — default
62
+ "tw-rounded",
63
+ "tw-bg-neutral-800",
64
+ "tw-text-white",
65
+ // argo chrome overrides — semantic floating-panel tokens
66
+ "data-[argo=true]:tw-rounded-2xl",
67
+ "data-[argo=true]:tw-border",
68
+ "data-[argo=true]:tw-border-solid",
69
+ "data-[argo=true]:tw-border-border",
70
+ "data-[argo=true]:tw-bg-popover",
71
+ "data-[argo=true]:tw-text-popover-foreground",
72
+ "data-[argo=true]:tw-shadow-md",
73
+ // argo open animation
74
+ "data-[argo=true]:data-[state=delayed-open]:tw-animate-in",
75
+ "data-[argo=true]:data-[state=instant-open]:tw-animate-in",
76
+ "data-[argo=true]:data-[state=delayed-open]:tw-fade-in-0",
77
+ "data-[argo=true]:data-[state=instant-open]:tw-fade-in-0",
78
+ "data-[argo=true]:data-[state=delayed-open]:tw-zoom-in-95",
79
+ "data-[argo=true]:data-[state=instant-open]:tw-zoom-in-95",
80
+ // argo closed animation
81
+ "data-[argo=true]:data-[state=closed]:tw-animate-out",
82
+ "data-[argo=true]:data-[state=closed]:tw-fade-out-0",
83
+ "data-[argo=true]:data-[state=closed]:tw-zoom-out-95",
84
+ // argo position animation
85
+ "data-[argo=true]:data-[side=bottom]:tw-slide-in-from-top-2",
86
+ "data-[argo=true]:data-[side=left]:tw-slide-in-from-right-2",
87
+ "data-[argo=true]:data-[side=right]:tw-slide-in-from-left-2",
88
+ "data-[argo=true]:data-[side=top]:tw-slide-in-from-bottom-2"
55
89
  ],
56
90
  {
57
91
  defaultVariants: {
@@ -84,6 +118,7 @@ var tooltipVariants = cva(
84
118
  var TooltipContent = ({
85
119
  className,
86
120
  variant,
121
+ argo,
87
122
  keepOpenOnPointerDownOutside = false,
88
123
  children,
89
124
  onPointerDownOutside,
@@ -93,6 +128,8 @@ var TooltipContent = ({
93
128
  placement = "right",
94
129
  ...rest
95
130
  }) => {
131
+ const isLegacy = useIsLegacyBrand();
132
+ const renderArgo = !isLegacy || argo === true;
96
133
  const handlePointerDownOutside = (event) => {
97
134
  if (keepOpenOnPointerDownOutside) event.preventDefault();
98
135
  onPointerDownOutside?.(event);
@@ -101,7 +138,8 @@ var TooltipContent = ({
101
138
  Content,
102
139
  {
103
140
  ...rest,
104
- "data-tooltip-content": true,
141
+ "data-tooltip-content": renderArgo ? void 0 : true,
142
+ "data-argo": renderArgo,
105
143
  sideOffset,
106
144
  collisionPadding,
107
145
  onPointerDownOutside: handlePointerDownOutside,
@@ -160,6 +198,7 @@ var Tooltip = ({
160
198
  className,
161
199
  keepOpenOnTriggerClick = false,
162
200
  variant,
201
+ argo,
163
202
  placement = "right",
164
203
  forceHide = false,
165
204
  forceShow = false,
@@ -198,6 +237,7 @@ var Tooltip = ({
198
237
  {
199
238
  className,
200
239
  variant: resolvedVariant,
240
+ argo,
201
241
  placement,
202
242
  keepOpenOnPointerDownOutside: keepOpenOnTriggerClick,
203
243
  children: tooltip
@@ -224,7 +264,7 @@ var ANIMATION_CLASS_NAME = cn(
224
264
  "tw-relative",
225
265
  "tw-overflow-hidden",
226
266
  "tw-pointer-events-none",
227
- "tw-bg-neutral-150",
267
+ "tw-bg-muted",
228
268
  // before
229
269
  'before:tw-content-[""]',
230
270
  "before:tw-opacity-100",
@@ -463,6 +503,8 @@ var argoVariants = cva(
463
503
  "tw-bg-clip-padding",
464
504
  // anchor support
465
505
  "!tw-no-underline",
506
+ "aria-disabled:tw-cursor-not-allowed",
507
+ "aria-disabled:tw-opacity-50",
466
508
  // icon
467
509
  "tw-shrink-0",
468
510
  "[&_svg]:tw-pointer-events-none",
@@ -565,14 +607,11 @@ var Button = ({
565
607
  block = false,
566
608
  ...buttonProps
567
609
  }) => {
610
+ const isLegacy = useIsLegacyBrand();
611
+ const renderArgo = !isLegacy || argo;
568
612
  const Comp = asChild ? Root : "button";
569
613
  const isIconOnly = String(size).startsWith("icon");
570
- const classNames = argo ? argoVariants({ variant, size, block, className }) : variants({
571
- size,
572
- variant,
573
- block,
574
- className
575
- });
614
+ const classNames = renderArgo ? argoVariants({ variant, size, block, className }) : variants({ size, variant, block, className });
576
615
  const handleClick = (event) => {
577
616
  const isAnchor = event.currentTarget.tagName === "A";
578
617
  if (isAnchor && disabled) {
@@ -693,6 +732,10 @@ var MIN_SCALE = 0.5;
693
732
  var MAX_SCALE = 3;
694
733
  var ZOOM_STEP = 0.1;
695
734
  var ZoomableSvg = ({ html, copyText, className }) => {
735
+ const safeHtml = useMemo(
736
+ () => DOMPurify.sanitize(html, { USE_PROFILES: { svg: true, svgFilters: true } }),
737
+ [html]
738
+ );
696
739
  const containerRef = useRef(null);
697
740
  const [scale, setScale] = useState(1);
698
741
  const [translate, setTranslate] = useState({ x: 0, y: 0 });
@@ -788,7 +831,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
788
831
  isFullscreen && "tw-h-full [&>svg]:tw-h-full"
789
832
  ),
790
833
  style: { transform: `translate(${translate.x}px, ${translate.y}px) scale(${scale})` },
791
- dangerouslySetInnerHTML: { __html: html }
834
+ dangerouslySetInnerHTML: { __html: safeHtml }
792
835
  }
793
836
  )
794
837
  }
@@ -841,7 +884,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
841
884
  "div",
842
885
  {
843
886
  role: "presentation",
844
- className: "tw-fixed tw-inset-0 tw-z-[1060] tw-bg-neutral-50 tw-p-4",
887
+ className: "tw-fixed tw-inset-0 tw-z-[1060] tw-bg-muted tw-p-4",
845
888
  onClick: stopPropagation,
846
889
  children: diagramContent
847
890
  }
@@ -851,13 +894,18 @@ var ZoomableSvg = ({ html, copyText, className }) => {
851
894
  "div",
852
895
  {
853
896
  className: cn(
854
- "tw-overflow-hidden tw-rounded-md tw-border tw-border-neutral-150 tw-bg-neutral-50",
897
+ "tw-overflow-hidden tw-rounded-md tw-border tw-border-border tw-bg-muted",
855
898
  className
856
899
  ),
857
900
  children: diagramContent
858
901
  }
859
902
  );
860
903
  };
904
+ var PRIMARY_FALLBACK_CHANNELS = "31 143 255";
905
+ var resolvePrimary = () => {
906
+ const channels = typeof document === "undefined" ? PRIMARY_FALLBACK_CHANNELS : getComputedStyle(document.documentElement).getPropertyValue("--color-primary").trim() || PRIMARY_FALLBACK_CHANNELS;
907
+ return `rgb(${channels})`;
908
+ };
861
909
  var mermaidPromise = null;
862
910
  var getMermaid = () => {
863
911
  if (!mermaidPromise) {
@@ -906,7 +954,7 @@ var getMermaid = () => {
906
954
  taskTextColor: colors.neutral[800],
907
955
  taskTextDarkColor: colors.neutral[800],
908
956
  taskTextLightColor: colors.neutral[800],
909
- activeTaskBorderColor: colors.primary.DEFAULT,
957
+ activeTaskBorderColor: resolvePrimary(),
910
958
  activeTaskBkgColor: colors.secondary[200],
911
959
  doneTaskBorderColor: colors.primary[600],
912
960
  doneTaskBkgColor: colors.primary[100],
@@ -958,46 +1006,28 @@ var makeResponsive = (svgString) => {
958
1006
  };
959
1007
  var RENDER_DEBOUNCE_MS = 300;
960
1008
  var svgCache = /* @__PURE__ */ new Map();
1009
+ var resolveSyncSvg = (code) => {
1010
+ const cached = svgCache.get(code);
1011
+ if (cached) return cached;
1012
+ const fast = tryFastRender(code);
1013
+ if (fast) svgCache.set(code, fast);
1014
+ return fast;
1015
+ };
961
1016
  var MermaidDiagram = ({ code }) => {
962
1017
  const id = useId();
963
- const [svg, setSvg] = useState(() => {
964
- const cached = svgCache.get(code);
965
- if (cached) return cached;
966
- const fast = tryFastRender(code);
967
- if (fast) {
968
- svgCache.set(code, fast);
969
- return fast;
970
- }
971
- return null;
972
- });
1018
+ const [svg, setSvg] = useState(() => resolveSyncSvg(code));
973
1019
  const [renderFailed, setRenderFailed] = useState(false);
974
1020
  const debounceRef = useRef(null);
975
1021
  const renderIdRef = useRef(0);
976
1022
  const [prevCode, setPrevCode] = useState(code);
977
1023
  if (code !== prevCode) {
978
1024
  setPrevCode(code);
979
- const cached = svgCache.get(code);
980
- const fast = cached ?? tryFastRender(code);
981
- if (fast && !cached) svgCache.set(code, fast);
982
- setSvg(fast);
1025
+ setSvg(resolveSyncSvg(code));
983
1026
  setRenderFailed(false);
984
1027
  }
985
1028
  useEffect(() => {
986
- if (svgCache.has(code)) {
987
- setSvg(svgCache.get(code));
988
- setRenderFailed(false);
989
- return;
990
- }
991
- const fastResult = tryFastRender(code);
992
- if (fastResult) {
993
- svgCache.set(code, fastResult);
994
- setSvg(fastResult);
995
- setRenderFailed(false);
996
- return;
997
- }
998
- setSvg(null);
1029
+ if (svgCache.has(code)) return;
999
1030
  const currentRenderId = ++renderIdRef.current;
1000
- setRenderFailed(false);
1001
1031
  if (debounceRef.current) {
1002
1032
  clearTimeout(debounceRef.current);
1003
1033
  }