@uniformdev/design-system 20.7.1-alpha.83 → 20.7.1-alpha.84

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/esm/index.js CHANGED
@@ -665,7 +665,7 @@ var cq = (size) => `@container (min-width: ${size})`;
665
665
  var prefersReducedMotion = (cssProp) => `@media (prefers-reduced-motion: ${cssProp})`;
666
666
 
667
667
  // src/components/Layout/styles/AsideAndSectionLayout.styles.ts
668
- var AsideAdnSectionLayoutContainer = (withSidebar) => css5`
668
+ var AsideAndSectionLayoutContainer = (withSidebar) => css5`
669
669
  display: grid;
670
670
  gap: var(--spacing-sm) 0;
671
671
  height: 100%;
@@ -674,19 +674,18 @@ var AsideAdnSectionLayoutContainer = (withSidebar) => css5`
674
674
  margin-left: ${withSidebar ? 0 : "var(--spacing-sm)"};
675
675
 
676
676
  ${mq("md")} {
677
- grid-template-columns: ${withSidebar ? "200px 1fr" : "1fr"};
677
+ grid-template-columns: ${withSidebar ? "fit-content(25%) 1fr" : "1fr"};
678
678
  }
679
679
  `;
680
- var AsideAdnSectionLayoutAsideStyles = css5`
680
+ var AsideAndSectionLayoutAsideStyles = css5`
681
681
  order: 1;
682
682
  padding: var(--spacing-base) 0 var(--spacing-base) var(--spacing-base);
683
683
 
684
684
  ${mq("md")} {
685
685
  order: 0;
686
- grid-template-columns: minmax(0, 200px) 1fr;
687
686
  }
688
687
  `;
689
- var AsideAdnSectionLayoutSectionStyles = css5`
688
+ var AsideAndSectionLayoutSectionStyles = css5`
690
689
  display: flex;
691
690
  background: var(--white);
692
691
  padding: var(--spacing-lg);
@@ -694,11 +693,11 @@ var AsideAdnSectionLayoutSectionStyles = css5`
694
693
  position: relative;
695
694
  overflow: hidden;
696
695
  `;
697
- var AsideAdnSectionLayoutSectionScrollable = css5`
696
+ var AsideAndSectionLayoutSectionScrollable = css5`
698
697
  overflow: auto;
699
698
  ${scrollbarStyles}
700
699
  `;
701
- var AsideAdnSectionLayoutStickyAsideStyles = css5`
700
+ var AsideAndSectionLayoutStickyAsideStyles = css5`
702
701
  position: sticky;
703
702
  top: var(--spacing-sm);
704
703
  `;
@@ -714,21 +713,21 @@ var AsideAndSectionLayout = ({
714
713
  "main",
715
714
  {
716
715
  css: [
717
- AsideAdnSectionLayoutContainer(Boolean(sidebar)),
718
- isStickyAside ? AsideAdnSectionLayoutSectionScrollable : null
716
+ AsideAndSectionLayoutContainer(Boolean(sidebar)),
717
+ isStickyAside ? AsideAndSectionLayoutSectionScrollable : null
719
718
  ],
720
719
  children: [
721
720
  sidebar ? /* @__PURE__ */ jsx5(
722
721
  "aside",
723
722
  {
724
723
  css: [
725
- AsideAdnSectionLayoutAsideStyles,
726
- isStickyAside ? AsideAdnSectionLayoutStickyAsideStyles : null
724
+ AsideAndSectionLayoutAsideStyles,
725
+ isStickyAside ? AsideAndSectionLayoutStickyAsideStyles : null
727
726
  ],
728
727
  children: sidebar
729
728
  }
730
729
  ) : null,
731
- /* @__PURE__ */ jsx5("section", { css: AsideAdnSectionLayoutSectionStyles, children })
730
+ /* @__PURE__ */ jsx5("section", { css: AsideAndSectionLayoutSectionStyles, children })
732
731
  ]
733
732
  }
734
733
  );
@@ -2275,7 +2274,15 @@ var IconInner = ({ icon, iconColor = "default", size = "1.5rem", ...otherProps }
2275
2274
  );
2276
2275
  return null;
2277
2276
  }
2278
- return /* @__PURE__ */ jsx16(IconComponent, { role: "img", size, ...otherProps, css: [IconImg, customColor[iconColor]] });
2277
+ return /* @__PURE__ */ jsx16(
2278
+ IconComponent,
2279
+ {
2280
+ role: "img",
2281
+ size,
2282
+ ...otherProps,
2283
+ css: [IconImg, iconColor ? functionalColors : void 0, customColor[iconColor]]
2284
+ }
2285
+ );
2279
2286
  };
2280
2287
  var Icon = React3.memo(IconInner);
2281
2288
 
@@ -4008,10 +4015,11 @@ var DropdownStyleMenuTrigger = forwardRef2(
4008
4015
  const buttonVariantStyle = variant === "ghost" ? ghostButtonStyle : outlineButtonStyle;
4009
4016
  return /* @__PURE__ */ jsx23("button", { ref, ...buttonProps, css: [buttonStyle(bgColor), buttonVariantStyle], type: "button", children: /* @__PURE__ */ jsxs13(HorizontalRhythm, { align: "center", gap: "xs", children: [
4010
4017
  /* @__PURE__ */ jsx23("div", { children }),
4011
- /* @__PURE__ */ jsx23(CgChevronDown, { iconColor: "currentColor", size: "1rem" })
4018
+ /* @__PURE__ */ jsx23(Icon, { icon: CgChevronDown, iconColor: "currentColor", size: "1rem" })
4012
4019
  ] }) });
4013
4020
  }
4014
4021
  );
4022
+ DropdownStyleMenuTrigger.displayName = "DropdownStyleMenuTrigger";
4015
4023
 
4016
4024
  // src/components/Menu/Menu.tsx
4017
4025
  import {
@@ -7103,12 +7111,13 @@ var Counter = ({
7103
7111
  if (typeof count === "undefined") {
7104
7112
  return null;
7105
7113
  }
7106
- const isTripleDigits = count > 99 ? /* @__PURE__ */ jsxs39("span", { css: counterTripleValue, title: `${count}`, children: [
7114
+ const isNumber = typeof count === "number";
7115
+ const isTripleDigits = isNumber && count > 99 ? /* @__PURE__ */ jsxs39("span", { css: counterTripleValue, title: `${count}`, children: [
7107
7116
  "99",
7108
7117
  /* @__PURE__ */ jsx60(Icon, { icon: "math-plus", iconColor: "currentColor", size: "0.5rem", css: counterIcon.tripleValue })
7109
7118
  ] }) : count;
7110
7119
  const formatCount = count === 0 ? /* @__PURE__ */ jsx60("span", { css: counterZeroValue, title: `${count}` }) : isTripleDigits;
7111
- return /* @__PURE__ */ jsxs39("div", { css: [counterContainer(bgColor, Boolean(icon)), sizeStyles[size]], ...props, children: [
7120
+ return /* @__PURE__ */ jsxs39("div", { css: [counterContainer(bgColor, Boolean(icon || !isNumber)), sizeStyles[size]], ...props, children: [
7112
7121
  icon ? /* @__PURE__ */ jsx60(
7113
7122
  "span",
7114
7123
  {
@@ -7641,7 +7650,6 @@ var descriptionListLabelStyles = css51`
7641
7650
  `;
7642
7651
  var descriptionListValueStyles = css51`
7643
7652
  display: flex;
7644
- align-items: center;
7645
7653
  margin: 0;
7646
7654
  `;
7647
7655
 
@@ -9480,7 +9488,13 @@ import {
9480
9488
  verticalListSortingStrategy
9481
9489
  } from "@dnd-kit/sortable";
9482
9490
  import { CSS } from "@dnd-kit/utilities";
9483
- import { useCallback as useCallback7, useEffect as useEffect11, useMemo as useMemo5, useRef as useRef6, useState as useState11 } from "react";
9491
+ import {
9492
+ useCallback as useCallback7,
9493
+ useEffect as useEffect11,
9494
+ useMemo as useMemo5,
9495
+ useRef as useRef6,
9496
+ useState as useState11
9497
+ } from "react";
9484
9498
 
9485
9499
  // src/utils/useDebouncedCallback.ts
9486
9500
  import { useEffect as useEffect10, useMemo as useMemo4, useRef as useRef5 } from "react";
@@ -9571,8 +9585,12 @@ var KeyValueInput = ({
9571
9585
  renderIconSelector
9572
9586
  }) => {
9573
9587
  const [isDragging, setIsDragging] = useState11(false);
9588
+ const [indexToFocus, setIndexToFocus] = useState11(null);
9574
9589
  const popoverStoresMap = useRef6({});
9575
- const lastRowFirstInputRef = useRef6(null);
9590
+ const keyInputRefsMap = useRef6({});
9591
+ const [blockAutoGenerateForValues, setBlockAutoGenerateForValues] = useState11(
9592
+ () => new Set(value.map((item) => item.value))
9593
+ );
9576
9594
  const sensors = useSensors(
9577
9595
  useSensor(PointerSensor),
9578
9596
  useSensor(KeyboardSensor, {
@@ -9582,13 +9600,28 @@ var KeyValueInput = ({
9582
9600
  const valueWithIds = useMemo5(() => {
9583
9601
  return value.map((item, index) => ({ ...item, id: generateItemId(item, index) }));
9584
9602
  }, [value]);
9585
- const handleAddOptionRow = useCallback7(() => {
9586
- onChange([...value, newItemDefault]);
9587
- }, [onChange, value, newItemDefault]);
9603
+ const handleAddOptionRow = useCallback7(
9604
+ (insertIndex) => {
9605
+ const newValue = [...value];
9606
+ newValue.splice(insertIndex + 1, 0, newItemDefault);
9607
+ setIndexToFocus(insertIndex + 1);
9608
+ onChange(newValue);
9609
+ },
9610
+ [onChange, value, newItemDefault]
9611
+ );
9588
9612
  const handleDeleteOptionRow = useCallback7(
9589
9613
  (deleteIndex) => {
9590
9614
  const updatedOptions = value.filter((_, index) => index !== deleteIndex);
9591
9615
  onChange(updatedOptions);
9616
+ setBlockAutoGenerateForValues((current) => {
9617
+ const newSet = new Set(current);
9618
+ newSet.delete(value[deleteIndex].value);
9619
+ return newSet;
9620
+ });
9621
+ if (updatedOptions.length > 0) {
9622
+ const focusIndex = deleteIndex >= updatedOptions.length ? updatedOptions.length - 1 : deleteIndex;
9623
+ setIndexToFocus(focusIndex);
9624
+ }
9592
9625
  },
9593
9626
  [value, onChange]
9594
9627
  );
@@ -9612,6 +9645,34 @@ var KeyValueInput = ({
9612
9645
  },
9613
9646
  [onChange, value]
9614
9647
  );
9648
+ const handleKeyPaste = useCallback7(
9649
+ (rowIndex, e) => {
9650
+ const pastedText = e.clipboardData.getData("text");
9651
+ const lines = pastedText.split("\n").filter((line) => line.trim() !== "");
9652
+ if (lines.length <= 1) {
9653
+ return;
9654
+ }
9655
+ e.preventDefault();
9656
+ const newItems = [];
9657
+ lines.forEach((line) => {
9658
+ const linePieces = line.split(",");
9659
+ const hasMultipleCommas = linePieces.length > 2;
9660
+ if (linePieces.length > 1 && !hasMultipleCommas) {
9661
+ const key = linePieces[0].trim();
9662
+ const val = linePieces[1].trim();
9663
+ newItems.push({ key, value: val });
9664
+ } else {
9665
+ const trimmedLine = line.trim();
9666
+ newItems.push({ key: trimmedLine, value: trimmedLine });
9667
+ }
9668
+ });
9669
+ const newValue = [...value];
9670
+ newValue.splice(rowIndex, 1, ...newItems);
9671
+ onChange(newValue);
9672
+ setIndexToFocus(rowIndex + newItems.length - 1);
9673
+ },
9674
+ [onChange, value]
9675
+ );
9615
9676
  const handleDragEnd = useCallback7(
9616
9677
  (e) => {
9617
9678
  setIsDragging(false);
@@ -9635,10 +9696,17 @@ var KeyValueInput = ({
9635
9696
  setIsDragging(false);
9636
9697
  }, [setIsDragging]);
9637
9698
  useEffect11(() => {
9638
- if (lastRowFirstInputRef.current && value.length > 1) {
9639
- lastRowFirstInputRef.current.focus();
9640
- }
9641
- }, [value.length]);
9699
+ const timeoutId = setTimeout(() => {
9700
+ var _a;
9701
+ if (indexToFocus !== null && keyInputRefsMap.current[indexToFocus]) {
9702
+ (_a = keyInputRefsMap.current[indexToFocus]) == null ? void 0 : _a.focus();
9703
+ setIndexToFocus(null);
9704
+ }
9705
+ });
9706
+ return () => {
9707
+ clearTimeout(timeoutId);
9708
+ };
9709
+ }, [indexToFocus]);
9642
9710
  return /* @__PURE__ */ jsxs59(VerticalRhythm, { gap: "xs", children: [
9643
9711
  /* @__PURE__ */ jsx91(HorizontalRhythm, { align: "center", justify: "space-between", css: { marginBottom: "var(--spacing-xs)" }, children: /* @__PURE__ */ jsx91("span", { css: LabelStyles, children: label2 }) }),
9644
9712
  /* @__PURE__ */ jsxs59(
@@ -9676,18 +9744,24 @@ var KeyValueInput = ({
9676
9744
  }
9677
9745
  )
9678
9746
  ] }),
9679
- /* @__PURE__ */ jsxs59(HorizontalRhythm, { align: "center", gap: "xs", children: [
9680
- /* @__PURE__ */ jsx91("span", { children: valueLabel }),
9681
- !valueInfoPopover ? null : /* @__PURE__ */ jsx91(
9682
- Popover3,
9683
- {
9684
- buttonText: `${valueLabel} info`,
9685
- iconColor: "gray",
9686
- placement: "bottom-start",
9687
- onInit: ({ store }) => popoverStoresMap.current.value = store,
9688
- children: valueInfoPopover
9689
- }
9690
- )
9747
+ /* @__PURE__ */ jsxs59(HorizontalRhythm, { align: "center", justify: "space-between", children: [
9748
+ /* @__PURE__ */ jsxs59(HorizontalRhythm, { align: "center", gap: "xs", children: [
9749
+ /* @__PURE__ */ jsx91("span", { children: valueLabel }),
9750
+ !valueInfoPopover ? null : /* @__PURE__ */ jsx91(
9751
+ Popover3,
9752
+ {
9753
+ buttonText: `${valueLabel} info`,
9754
+ iconColor: "gray",
9755
+ placement: "bottom-start",
9756
+ onInit: ({ store }) => popoverStoresMap.current.value = store,
9757
+ children: valueInfoPopover
9758
+ }
9759
+ )
9760
+ ] }),
9761
+ /* @__PURE__ */ jsxs59(Caption, { css: { fontSize: "var(--fs-xs)" }, children: [
9762
+ getFormattedShortcut("enter"),
9763
+ " to insert row"
9764
+ ] })
9691
9765
  ] })
9692
9766
  ]
9693
9767
  }
@@ -9705,7 +9779,7 @@ var KeyValueInput = ({
9705
9779
  KeyValueInputItem,
9706
9780
  {
9707
9781
  id,
9708
- firstInputRef: index === value.length - 1 ? lastRowFirstInputRef : null,
9782
+ firstInputRef: (ref) => keyInputRefsMap.current[index] = ref,
9709
9783
  value: item,
9710
9784
  keyLabel: `${keyLabel}, row ${index}`,
9711
9785
  valueLabel: `${valueLabel}, row ${index}`,
@@ -9718,9 +9792,16 @@ var KeyValueInput = ({
9718
9792
  onDelete: () => handleDeleteOptionRow(index),
9719
9793
  onFocusChange: handleFocusChange,
9720
9794
  "data-testid": "key-value-input-item",
9721
- onEnter: handleAddOptionRow,
9795
+ onEnter: () => handleAddOptionRow(index),
9796
+ onKeyPaste: (e) => handleKeyPaste(index, e),
9722
9797
  showIconColumn,
9723
- renderIconSelector
9798
+ renderIconSelector,
9799
+ blockAutoGenerateValue: item.value !== "" && blockAutoGenerateForValues.has(item.value),
9800
+ onBlurValue: (value2) => setBlockAutoGenerateForValues((current) => {
9801
+ const newSet = new Set(current);
9802
+ newSet.add(value2);
9803
+ return newSet;
9804
+ })
9724
9805
  },
9725
9806
  isDragging ? id : index
9726
9807
  )) })
@@ -9729,7 +9810,7 @@ var KeyValueInput = ({
9729
9810
  /* @__PURE__ */ jsx91(
9730
9811
  AddListButton,
9731
9812
  {
9732
- onButtonClick: handleAddOptionRow,
9813
+ onButtonClick: () => handleAddOptionRow(value.length - 1),
9733
9814
  disabled: disabled2,
9734
9815
  "data-testid": "add-input-row-action",
9735
9816
  css: { marginTop: "var(--spacing-sm)", marginLeft: "var(--spacing-base)" }
@@ -9752,8 +9833,11 @@ var KeyValueInputItem = ({
9752
9833
  disabledDelete = false,
9753
9834
  disabledDnd = false,
9754
9835
  onEnter,
9836
+ onKeyPaste,
9755
9837
  showIconColumn = false,
9756
- renderIconSelector
9838
+ renderIconSelector,
9839
+ blockAutoGenerateValue,
9840
+ onBlurValue
9757
9841
  }) => {
9758
9842
  const { attributes, listeners, setNodeRef, transform, transition, setActivatorNodeRef, isSorting } = useSortable({
9759
9843
  id,
@@ -9768,6 +9852,11 @@ var KeyValueInputItem = ({
9768
9852
  onEnter();
9769
9853
  }
9770
9854
  };
9855
+ const handleValueKeyDown = (e) => {
9856
+ if (e.key === "Enter") {
9857
+ onEnter();
9858
+ }
9859
+ };
9771
9860
  return /* @__PURE__ */ jsxs59("div", { css: rowWrapper, ref: setNodeRef, style, children: [
9772
9861
  /* @__PURE__ */ jsx91(DragHandle, { disableDnd: disabledDnd, ref: setActivatorNodeRef, ...attributes, ...listeners }),
9773
9862
  /* @__PURE__ */ jsxs59(
@@ -9811,7 +9900,7 @@ var KeyValueInputItem = ({
9811
9900
  showLabel: false,
9812
9901
  disabled: disabled2,
9813
9902
  onChange: (e) => {
9814
- const hasStoredValue = value.value !== value.key;
9903
+ const hasStoredValue = value.value !== value.key || blockAutoGenerateValue;
9815
9904
  onChange == null ? void 0 : onChange({
9816
9905
  key: e.currentTarget.value,
9817
9906
  value: hasStoredValue ? value.value : e.currentTarget.value,
@@ -9821,6 +9910,7 @@ var KeyValueInputItem = ({
9821
9910
  onBlur: () => onFocusChange == null ? void 0 : onFocusChange(false),
9822
9911
  onFocus: () => onFocusChange == null ? void 0 : onFocusChange(true),
9823
9912
  onKeyDown: handleEnter,
9913
+ onPaste: onKeyPaste,
9824
9914
  value: value.key,
9825
9915
  errorMessage: isSorting ? void 0 : error == null ? void 0 : error.key,
9826
9916
  "data-testid": "key"
@@ -9839,9 +9929,12 @@ var KeyValueInputItem = ({
9839
9929
  icon: value.icon
9840
9930
  });
9841
9931
  },
9842
- onBlur: () => onFocusChange == null ? void 0 : onFocusChange(false),
9932
+ onBlur: () => {
9933
+ onFocusChange == null ? void 0 : onFocusChange(false);
9934
+ onBlurValue == null ? void 0 : onBlurValue(value.value);
9935
+ },
9843
9936
  onFocus: () => onFocusChange == null ? void 0 : onFocusChange(true),
9844
- onKeyDown: handleEnter,
9937
+ onKeyDown: handleValueKeyDown,
9845
9938
  value: value.value,
9846
9939
  errorMessage: isSorting ? void 0 : error == null ? void 0 : error.value,
9847
9940
  "data-testid": "value"
@@ -12323,7 +12416,7 @@ var ParameterLabel = ({ id, asSpan, children, testId, ...props }) => {
12323
12416
  import { forwardRef as forwardRef21 } from "react";
12324
12417
  import { jsx as jsx120 } from "@emotion/react/jsx-runtime";
12325
12418
  var ParameterMenuButton = forwardRef21(
12326
- ({ label: label2, children, disabled: disabled2 }, ref) => {
12419
+ ({ label: label2, children, disabled: disabled2, withoutPortal }, ref) => {
12327
12420
  return /* @__PURE__ */ jsx120(
12328
12421
  Menu,
12329
12422
  {
@@ -12340,6 +12433,7 @@ var ParameterMenuButton = forwardRef21(
12340
12433
  children: /* @__PURE__ */ jsx120(Icon, { icon: "more-alt", iconColor: "currentColor", size: "0.9rem" })
12341
12434
  }
12342
12435
  ),
12436
+ withoutPortal,
12343
12437
  children
12344
12438
  }
12345
12439
  );
@@ -12431,6 +12525,7 @@ var ParameterShell = ({
12431
12525
  title,
12432
12526
  children,
12433
12527
  isParameterGroup = false,
12528
+ menuWithoutPortal,
12434
12529
  ...props
12435
12530
  }) => {
12436
12531
  const [manualErrorMessage, setManualErrorMessage] = useState14(void 0);
@@ -12462,7 +12557,15 @@ var ParameterShell = ({
12462
12557
  children: actionItems
12463
12558
  }
12464
12559
  ) : null,
12465
- menuItems ? /* @__PURE__ */ jsx121(ParameterMenuButton, { label: `${label2} menu`, disabled: props.disabled, children: menuItems }) : null,
12560
+ menuItems ? /* @__PURE__ */ jsx121(
12561
+ ParameterMenuButton,
12562
+ {
12563
+ label: `${label2} menu`,
12564
+ disabled: props.disabled,
12565
+ withoutPortal: menuWithoutPortal,
12566
+ children: menuItems
12567
+ }
12568
+ ) : null,
12466
12569
  /* @__PURE__ */ jsx121(
12467
12570
  ParameterShellContext.Provider,
12468
12571
  {
@@ -16174,55 +16277,63 @@ var RichText = ({
16174
16277
  onInsertAsset
16175
16278
  }
16176
16279
  ),
16177
- /* @__PURE__ */ jsxs90("div", { css: editorContainerWrapper, ref: onPortalContainerRef, children: [
16178
- /* @__PURE__ */ jsxs90(
16179
- "div",
16180
- {
16181
- css: editorContainer,
16182
- className: editorInputWrapperClassName,
16183
- ref: onEditorContainerRef,
16184
- "data-testid": "value-container",
16185
- children: [
16186
- /* @__PURE__ */ jsx134(
16187
- RichTextPlugin,
16188
- {
16189
- contentEditable: /* @__PURE__ */ jsx134(ContentEditable, { css: editorInput, className: editorInputClassName }),
16190
- placeholder: /* @__PURE__ */ jsx134("div", { css: editorPlaceholder, "data-placeholder": true, children: placeholder != null ? placeholder : readOnly ? "empty" : "start editing..." }),
16191
- ErrorBoundary: LexicalErrorBoundary
16192
- }
16193
- ),
16194
- /* @__PURE__ */ jsx134(ListPlugin, {}),
16195
- /* @__PURE__ */ jsx134(ListIndentPlugin, { maxDepth: 4 }),
16196
- /* @__PURE__ */ jsx134(TablePlugin, { hasCellMerge: false, hasCellBackgroundColor: false }),
16197
- /* @__PURE__ */ jsx134("div", { css: editorContainerOverflowWrapper, "data-testid": "table-action-menu-plugin", children: editorContainerRef && portalContainerRef && !minimalInteractivity ? /* @__PURE__ */ jsx134(
16198
- TableActionMenuPlugin,
16199
- {
16200
- positioningAnchorEl: editorContainerRef,
16201
- menuPortalEl: portalContainerRef
16202
- }
16203
- ) : null }),
16204
- editorContainerRef && !minimalInteractivity ? /* @__PURE__ */ jsx134(TableCellResizerPlugin, { positioningAnchorEl: editorContainerRef }) : null,
16205
- readOnly ? null : /* @__PURE__ */ jsx134(HistoryPlugin, {}),
16206
- /* @__PURE__ */ jsx134(DisableStylesPlugin, {}),
16207
- /* @__PURE__ */ jsx134(MarkdownShortcutPlugin, { transformers: MARKDOWN_TRANSFORMERS })
16208
- ]
16209
- }
16210
- ),
16211
- /* @__PURE__ */ jsx134(Fragment18, { children }),
16212
- editorContainerRef ? /* @__PURE__ */ jsx134(
16213
- LinkNodePlugin,
16214
- {
16215
- onConnectLink: onConnectLink ? onConnectLink : () => Promise.resolve(),
16216
- getBoundPath: (variables == null ? void 0 : variables.bindVariables) ? (path) => {
16217
- var _a, _b;
16218
- return (_b = (_a = variables.bindVariables) == null ? void 0 : _a.call(variables, path)) != null ? _b : path;
16219
- } : void 0,
16220
- positioningAnchorEl: editorContainerRef
16221
- }
16222
- ) : null,
16223
- /* @__PURE__ */ jsx134(TableSelectionPlugin_default, {}),
16224
- /* @__PURE__ */ jsx134(ImprovedAssetSelectionPlugin_default, {})
16225
- ] })
16280
+ /* @__PURE__ */ jsxs90(
16281
+ "div",
16282
+ {
16283
+ css: editorContainerWrapper,
16284
+ "data-editor-container-wrapper": true,
16285
+ ref: onPortalContainerRef,
16286
+ children: [
16287
+ /* @__PURE__ */ jsxs90(
16288
+ "div",
16289
+ {
16290
+ css: editorContainer,
16291
+ className: editorInputWrapperClassName,
16292
+ ref: onEditorContainerRef,
16293
+ "data-testid": "value-container",
16294
+ children: [
16295
+ /* @__PURE__ */ jsx134(
16296
+ RichTextPlugin,
16297
+ {
16298
+ contentEditable: /* @__PURE__ */ jsx134(ContentEditable, { css: editorInput, className: editorInputClassName }),
16299
+ placeholder: /* @__PURE__ */ jsx134("div", { css: editorPlaceholder, "data-placeholder": true, children: placeholder != null ? placeholder : readOnly ? "empty" : "start editing..." }),
16300
+ ErrorBoundary: LexicalErrorBoundary
16301
+ }
16302
+ ),
16303
+ /* @__PURE__ */ jsx134(ListPlugin, {}),
16304
+ /* @__PURE__ */ jsx134(ListIndentPlugin, { maxDepth: 4 }),
16305
+ /* @__PURE__ */ jsx134(TablePlugin, { hasCellMerge: false, hasCellBackgroundColor: false }),
16306
+ /* @__PURE__ */ jsx134("div", { css: editorContainerOverflowWrapper, "data-testid": "table-action-menu-plugin", children: editorContainerRef && portalContainerRef && !minimalInteractivity ? /* @__PURE__ */ jsx134(
16307
+ TableActionMenuPlugin,
16308
+ {
16309
+ positioningAnchorEl: editorContainerRef,
16310
+ menuPortalEl: portalContainerRef
16311
+ }
16312
+ ) : null }),
16313
+ editorContainerRef && !minimalInteractivity ? /* @__PURE__ */ jsx134(TableCellResizerPlugin, { positioningAnchorEl: editorContainerRef }) : null,
16314
+ readOnly ? null : /* @__PURE__ */ jsx134(HistoryPlugin, {}),
16315
+ /* @__PURE__ */ jsx134(DisableStylesPlugin, {}),
16316
+ /* @__PURE__ */ jsx134(MarkdownShortcutPlugin, { transformers: MARKDOWN_TRANSFORMERS })
16317
+ ]
16318
+ }
16319
+ ),
16320
+ /* @__PURE__ */ jsx134(Fragment18, { children }),
16321
+ editorContainerRef ? /* @__PURE__ */ jsx134(
16322
+ LinkNodePlugin,
16323
+ {
16324
+ onConnectLink: onConnectLink ? onConnectLink : () => Promise.resolve(),
16325
+ getBoundPath: (variables == null ? void 0 : variables.bindVariables) ? (path) => {
16326
+ var _a, _b;
16327
+ return (_b = (_a = variables.bindVariables) == null ? void 0 : _a.call(variables, path)) != null ? _b : path;
16328
+ } : void 0,
16329
+ positioningAnchorEl: editorContainerRef
16330
+ }
16331
+ ) : null,
16332
+ /* @__PURE__ */ jsx134(TableSelectionPlugin_default, {}),
16333
+ /* @__PURE__ */ jsx134(ImprovedAssetSelectionPlugin_default, {})
16334
+ ]
16335
+ }
16336
+ )
16226
16337
  ] });
16227
16338
  };
16228
16339
 
@@ -16864,7 +16975,7 @@ var lightFadingOut = keyframes5`
16864
16975
  `;
16865
16976
  var skeletonStyles = css106`
16866
16977
  animation: ${lightFadingOut} 1s ease-out infinite alternate;
16867
- background-color: var(--gray-900);
16978
+ background-color: var(--gray-500);
16868
16979
  `;
16869
16980
 
16870
16981
  // src/components/Skeleton/Skeleton.tsx
package/dist/index.d.mts CHANGED
@@ -1502,8 +1502,10 @@ declare const MultilineChip: ({ children, onClick, ...props }: MultilineChipProp
1502
1502
  type CounterBgColors = 'var(--white)' | 'var(--gray-50)' | 'var(--accent-light)' | 'var(--accent-dark)' | 'transparent';
1503
1503
  type CounterIconColors = 'auto' | 'var(--utility-caution-icon)' | 'var(--utility-danger-icon)' | 'var(--utility-info-icon)' | 'var(--utility-success-icon)' | 'red';
1504
1504
  type CounterProps = {
1505
- /** sets the count value, a 0 will show a dot instead of a number. Undefined will cause the counter to disappear. */
1506
- count: number | undefined;
1505
+ /** sets the count value, a 0 will show a dot instead of a number. Undefined will cause the counter to disappear.
1506
+ * String can be used for formatting purposes, e.g. "1.2k" or regionalized number, e.g. "1,200"
1507
+ */
1508
+ count: number | string | undefined;
1507
1509
  /** sets the background color
1508
1510
  * @default 'transparent'
1509
1511
  */
@@ -3372,6 +3374,8 @@ type ParameterMenuButtonProps = {
3372
3374
  label: string;
3373
3375
  children?: ReactNode;
3374
3376
  disabled?: boolean;
3377
+ /** set to true to render the menu directly in the parent DOM */
3378
+ withoutPortal?: boolean;
3375
3379
  };
3376
3380
  /** @example <ParameterMenuButton label="label value"><MenuItem>menu option component</MenuItem></ParameterMenuButton> */
3377
3381
  declare const ParameterMenuButton: React$1.ForwardRefExoticComponent<ParameterMenuButtonProps & React$1.RefAttributes<HTMLButtonElement>>;
@@ -3734,12 +3738,15 @@ type ParameterShellOverrideProps = {
3734
3738
  */
3735
3739
  isParameterGroup?: boolean;
3736
3740
  };
3737
- type ParameterShellProps = React.InputHTMLAttributes<HTMLDivElement> & CommonParameterInputProps & ParameterShellOverrideProps;
3741
+ type ParameterShellProps = React.InputHTMLAttributes<HTMLDivElement> & CommonParameterInputProps & ParameterShellOverrideProps & {
3742
+ /** set to true to render the menu directly in the parent DOM */
3743
+ menuWithoutPortal?: boolean;
3744
+ };
3738
3745
  /**
3739
3746
  * Uniform Parameter shell component
3740
3747
  * @example <ParameterShell label="my label" id="my-id"><ParameterInput onChange={() => {}} /></ParameterShell>
3741
3748
  */
3742
- declare const ParameterShell: ({ label, labelLeadingIcon, labelTrailingIcon, hiddenLabel, id, errorMessage, warningMessage, infoMessage, caption, errorTestId, captionTestId, menuItems, actionItems, hasOverriddenValue, onResetOverriddenValue, title, children, isParameterGroup, ...props }: ParameterShellProps) => _emotion_react_jsx_runtime.JSX.Element;
3749
+ declare const ParameterShell: ({ label, labelLeadingIcon, labelTrailingIcon, hiddenLabel, id, errorMessage, warningMessage, infoMessage, caption, errorTestId, captionTestId, menuItems, actionItems, hasOverriddenValue, onResetOverriddenValue, title, children, isParameterGroup, menuWithoutPortal, ...props }: ParameterShellProps) => _emotion_react_jsx_runtime.JSX.Element;
3743
3750
  declare const ParameterShellPlaceholder: ({ children }: {
3744
3751
  children?: ReactNode;
3745
3752
  }) => _emotion_react_jsx_runtime.JSX.Element;
package/dist/index.d.ts CHANGED
@@ -1502,8 +1502,10 @@ declare const MultilineChip: ({ children, onClick, ...props }: MultilineChipProp
1502
1502
  type CounterBgColors = 'var(--white)' | 'var(--gray-50)' | 'var(--accent-light)' | 'var(--accent-dark)' | 'transparent';
1503
1503
  type CounterIconColors = 'auto' | 'var(--utility-caution-icon)' | 'var(--utility-danger-icon)' | 'var(--utility-info-icon)' | 'var(--utility-success-icon)' | 'red';
1504
1504
  type CounterProps = {
1505
- /** sets the count value, a 0 will show a dot instead of a number. Undefined will cause the counter to disappear. */
1506
- count: number | undefined;
1505
+ /** sets the count value, a 0 will show a dot instead of a number. Undefined will cause the counter to disappear.
1506
+ * String can be used for formatting purposes, e.g. "1.2k" or regionalized number, e.g. "1,200"
1507
+ */
1508
+ count: number | string | undefined;
1507
1509
  /** sets the background color
1508
1510
  * @default 'transparent'
1509
1511
  */
@@ -3372,6 +3374,8 @@ type ParameterMenuButtonProps = {
3372
3374
  label: string;
3373
3375
  children?: ReactNode;
3374
3376
  disabled?: boolean;
3377
+ /** set to true to render the menu directly in the parent DOM */
3378
+ withoutPortal?: boolean;
3375
3379
  };
3376
3380
  /** @example <ParameterMenuButton label="label value"><MenuItem>menu option component</MenuItem></ParameterMenuButton> */
3377
3381
  declare const ParameterMenuButton: React$1.ForwardRefExoticComponent<ParameterMenuButtonProps & React$1.RefAttributes<HTMLButtonElement>>;
@@ -3734,12 +3738,15 @@ type ParameterShellOverrideProps = {
3734
3738
  */
3735
3739
  isParameterGroup?: boolean;
3736
3740
  };
3737
- type ParameterShellProps = React.InputHTMLAttributes<HTMLDivElement> & CommonParameterInputProps & ParameterShellOverrideProps;
3741
+ type ParameterShellProps = React.InputHTMLAttributes<HTMLDivElement> & CommonParameterInputProps & ParameterShellOverrideProps & {
3742
+ /** set to true to render the menu directly in the parent DOM */
3743
+ menuWithoutPortal?: boolean;
3744
+ };
3738
3745
  /**
3739
3746
  * Uniform Parameter shell component
3740
3747
  * @example <ParameterShell label="my label" id="my-id"><ParameterInput onChange={() => {}} /></ParameterShell>
3741
3748
  */
3742
- declare const ParameterShell: ({ label, labelLeadingIcon, labelTrailingIcon, hiddenLabel, id, errorMessage, warningMessage, infoMessage, caption, errorTestId, captionTestId, menuItems, actionItems, hasOverriddenValue, onResetOverriddenValue, title, children, isParameterGroup, ...props }: ParameterShellProps) => _emotion_react_jsx_runtime.JSX.Element;
3749
+ declare const ParameterShell: ({ label, labelLeadingIcon, labelTrailingIcon, hiddenLabel, id, errorMessage, warningMessage, infoMessage, caption, errorTestId, captionTestId, menuItems, actionItems, hasOverriddenValue, onResetOverriddenValue, title, children, isParameterGroup, menuWithoutPortal, ...props }: ParameterShellProps) => _emotion_react_jsx_runtime.JSX.Element;
3743
3750
  declare const ParameterShellPlaceholder: ({ children }: {
3744
3751
  children?: ReactNode;
3745
3752
  }) => _emotion_react_jsx_runtime.JSX.Element;
package/dist/index.js CHANGED
@@ -2337,7 +2337,7 @@ var cq = (size) => `@container (min-width: ${size})`;
2337
2337
  var prefersReducedMotion = (cssProp) => `@media (prefers-reduced-motion: ${cssProp})`;
2338
2338
 
2339
2339
  // src/components/Layout/styles/AsideAndSectionLayout.styles.ts
2340
- var AsideAdnSectionLayoutContainer = (withSidebar) => import_react6.css`
2340
+ var AsideAndSectionLayoutContainer = (withSidebar) => import_react6.css`
2341
2341
  display: grid;
2342
2342
  gap: var(--spacing-sm) 0;
2343
2343
  height: 100%;
@@ -2346,19 +2346,18 @@ var AsideAdnSectionLayoutContainer = (withSidebar) => import_react6.css`
2346
2346
  margin-left: ${withSidebar ? 0 : "var(--spacing-sm)"};
2347
2347
 
2348
2348
  ${mq("md")} {
2349
- grid-template-columns: ${withSidebar ? "200px 1fr" : "1fr"};
2349
+ grid-template-columns: ${withSidebar ? "fit-content(25%) 1fr" : "1fr"};
2350
2350
  }
2351
2351
  `;
2352
- var AsideAdnSectionLayoutAsideStyles = import_react6.css`
2352
+ var AsideAndSectionLayoutAsideStyles = import_react6.css`
2353
2353
  order: 1;
2354
2354
  padding: var(--spacing-base) 0 var(--spacing-base) var(--spacing-base);
2355
2355
 
2356
2356
  ${mq("md")} {
2357
2357
  order: 0;
2358
- grid-template-columns: minmax(0, 200px) 1fr;
2359
2358
  }
2360
2359
  `;
2361
- var AsideAdnSectionLayoutSectionStyles = import_react6.css`
2360
+ var AsideAndSectionLayoutSectionStyles = import_react6.css`
2362
2361
  display: flex;
2363
2362
  background: var(--white);
2364
2363
  padding: var(--spacing-lg);
@@ -2366,11 +2365,11 @@ var AsideAdnSectionLayoutSectionStyles = import_react6.css`
2366
2365
  position: relative;
2367
2366
  overflow: hidden;
2368
2367
  `;
2369
- var AsideAdnSectionLayoutSectionScrollable = import_react6.css`
2368
+ var AsideAndSectionLayoutSectionScrollable = import_react6.css`
2370
2369
  overflow: auto;
2371
2370
  ${scrollbarStyles}
2372
2371
  `;
2373
- var AsideAdnSectionLayoutStickyAsideStyles = import_react6.css`
2372
+ var AsideAndSectionLayoutStickyAsideStyles = import_react6.css`
2374
2373
  position: sticky;
2375
2374
  top: var(--spacing-sm);
2376
2375
  `;
@@ -2386,21 +2385,21 @@ var AsideAndSectionLayout = ({
2386
2385
  "main",
2387
2386
  {
2388
2387
  css: [
2389
- AsideAdnSectionLayoutContainer(Boolean(sidebar)),
2390
- isStickyAside ? AsideAdnSectionLayoutSectionScrollable : null
2388
+ AsideAndSectionLayoutContainer(Boolean(sidebar)),
2389
+ isStickyAside ? AsideAndSectionLayoutSectionScrollable : null
2391
2390
  ],
2392
2391
  children: [
2393
2392
  sidebar ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2394
2393
  "aside",
2395
2394
  {
2396
2395
  css: [
2397
- AsideAdnSectionLayoutAsideStyles,
2398
- isStickyAside ? AsideAdnSectionLayoutStickyAsideStyles : null
2396
+ AsideAndSectionLayoutAsideStyles,
2397
+ isStickyAside ? AsideAndSectionLayoutStickyAsideStyles : null
2399
2398
  ],
2400
2399
  children: sidebar
2401
2400
  }
2402
2401
  ) : null,
2403
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("section", { css: AsideAdnSectionLayoutSectionStyles, children })
2402
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("section", { css: AsideAndSectionLayoutSectionStyles, children })
2404
2403
  ]
2405
2404
  }
2406
2405
  );
@@ -3989,7 +3988,15 @@ var IconInner = ({ icon, iconColor = "default", size = "1.5rem", ...otherProps }
3989
3988
  );
3990
3989
  return null;
3991
3990
  }
3992
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(IconComponent, { role: "img", size, ...otherProps, css: [IconImg, customColor[iconColor]] });
3991
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
3992
+ IconComponent,
3993
+ {
3994
+ role: "img",
3995
+ size,
3996
+ ...otherProps,
3997
+ css: [IconImg, iconColor ? functionalColors : void 0, customColor[iconColor]]
3998
+ }
3999
+ );
3993
4000
  };
3994
4001
  var Icon = import_react24.default.memo(IconInner);
3995
4002
 
@@ -5739,10 +5746,11 @@ var DropdownStyleMenuTrigger = (0, import_react31.forwardRef)(
5739
5746
  const buttonVariantStyle = variant === "ghost" ? ghostButtonStyle : outlineButtonStyle;
5740
5747
  return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("button", { ref, ...buttonProps, css: [buttonStyle(bgColor), buttonVariantStyle], type: "button", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(HorizontalRhythm, { align: "center", gap: "xs", children: [
5741
5748
  /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { children }),
5742
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_CgChevronDown2.CgChevronDown, { iconColor: "currentColor", size: "1rem" })
5749
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Icon, { icon: import_CgChevronDown2.CgChevronDown, iconColor: "currentColor", size: "1rem" })
5743
5750
  ] }) });
5744
5751
  }
5745
5752
  );
5753
+ DropdownStyleMenuTrigger.displayName = "DropdownStyleMenuTrigger";
5746
5754
 
5747
5755
  // src/components/Menu/Menu.tsx
5748
5756
  init_emotion_jsx_shim();
@@ -8900,12 +8908,13 @@ var Counter = ({
8900
8908
  if (typeof count === "undefined") {
8901
8909
  return null;
8902
8910
  }
8903
- const isTripleDigits = count > 99 ? /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)("span", { css: counterTripleValue, title: `${count}`, children: [
8911
+ const isNumber = typeof count === "number";
8912
+ const isTripleDigits = isNumber && count > 99 ? /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)("span", { css: counterTripleValue, title: `${count}`, children: [
8904
8913
  "99",
8905
8914
  /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(Icon, { icon: "math-plus", iconColor: "currentColor", size: "0.5rem", css: counterIcon.tripleValue })
8906
8915
  ] }) : count;
8907
8916
  const formatCount = count === 0 ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("span", { css: counterZeroValue, title: `${count}` }) : isTripleDigits;
8908
- return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)("div", { css: [counterContainer(bgColor, Boolean(icon)), sizeStyles[size]], ...props, children: [
8917
+ return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)("div", { css: [counterContainer(bgColor, Boolean(icon || !isNumber)), sizeStyles[size]], ...props, children: [
8909
8918
  icon ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
8910
8919
  "span",
8911
8920
  {
@@ -9440,7 +9449,6 @@ var descriptionListLabelStyles = import_react75.css`
9440
9449
  `;
9441
9450
  var descriptionListValueStyles = import_react75.css`
9442
9451
  display: flex;
9443
- align-items: center;
9444
9452
  margin: 0;
9445
9453
  `;
9446
9454
 
@@ -11428,8 +11436,12 @@ var KeyValueInput = ({
11428
11436
  renderIconSelector
11429
11437
  }) => {
11430
11438
  const [isDragging, setIsDragging] = (0, import_react106.useState)(false);
11439
+ const [indexToFocus, setIndexToFocus] = (0, import_react106.useState)(null);
11431
11440
  const popoverStoresMap = (0, import_react106.useRef)({});
11432
- const lastRowFirstInputRef = (0, import_react106.useRef)(null);
11441
+ const keyInputRefsMap = (0, import_react106.useRef)({});
11442
+ const [blockAutoGenerateForValues, setBlockAutoGenerateForValues] = (0, import_react106.useState)(
11443
+ () => new Set(value.map((item) => item.value))
11444
+ );
11433
11445
  const sensors = (0, import_core.useSensors)(
11434
11446
  (0, import_core.useSensor)(import_core.PointerSensor),
11435
11447
  (0, import_core.useSensor)(import_core.KeyboardSensor, {
@@ -11439,13 +11451,28 @@ var KeyValueInput = ({
11439
11451
  const valueWithIds = (0, import_react106.useMemo)(() => {
11440
11452
  return value.map((item, index) => ({ ...item, id: generateItemId(item, index) }));
11441
11453
  }, [value]);
11442
- const handleAddOptionRow = (0, import_react106.useCallback)(() => {
11443
- onChange([...value, newItemDefault]);
11444
- }, [onChange, value, newItemDefault]);
11454
+ const handleAddOptionRow = (0, import_react106.useCallback)(
11455
+ (insertIndex) => {
11456
+ const newValue = [...value];
11457
+ newValue.splice(insertIndex + 1, 0, newItemDefault);
11458
+ setIndexToFocus(insertIndex + 1);
11459
+ onChange(newValue);
11460
+ },
11461
+ [onChange, value, newItemDefault]
11462
+ );
11445
11463
  const handleDeleteOptionRow = (0, import_react106.useCallback)(
11446
11464
  (deleteIndex) => {
11447
11465
  const updatedOptions = value.filter((_, index) => index !== deleteIndex);
11448
11466
  onChange(updatedOptions);
11467
+ setBlockAutoGenerateForValues((current) => {
11468
+ const newSet = new Set(current);
11469
+ newSet.delete(value[deleteIndex].value);
11470
+ return newSet;
11471
+ });
11472
+ if (updatedOptions.length > 0) {
11473
+ const focusIndex = deleteIndex >= updatedOptions.length ? updatedOptions.length - 1 : deleteIndex;
11474
+ setIndexToFocus(focusIndex);
11475
+ }
11449
11476
  },
11450
11477
  [value, onChange]
11451
11478
  );
@@ -11469,6 +11496,34 @@ var KeyValueInput = ({
11469
11496
  },
11470
11497
  [onChange, value]
11471
11498
  );
11499
+ const handleKeyPaste = (0, import_react106.useCallback)(
11500
+ (rowIndex, e) => {
11501
+ const pastedText = e.clipboardData.getData("text");
11502
+ const lines = pastedText.split("\n").filter((line) => line.trim() !== "");
11503
+ if (lines.length <= 1) {
11504
+ return;
11505
+ }
11506
+ e.preventDefault();
11507
+ const newItems = [];
11508
+ lines.forEach((line) => {
11509
+ const linePieces = line.split(",");
11510
+ const hasMultipleCommas = linePieces.length > 2;
11511
+ if (linePieces.length > 1 && !hasMultipleCommas) {
11512
+ const key = linePieces[0].trim();
11513
+ const val = linePieces[1].trim();
11514
+ newItems.push({ key, value: val });
11515
+ } else {
11516
+ const trimmedLine = line.trim();
11517
+ newItems.push({ key: trimmedLine, value: trimmedLine });
11518
+ }
11519
+ });
11520
+ const newValue = [...value];
11521
+ newValue.splice(rowIndex, 1, ...newItems);
11522
+ onChange(newValue);
11523
+ setIndexToFocus(rowIndex + newItems.length - 1);
11524
+ },
11525
+ [onChange, value]
11526
+ );
11472
11527
  const handleDragEnd = (0, import_react106.useCallback)(
11473
11528
  (e) => {
11474
11529
  setIsDragging(false);
@@ -11492,10 +11547,17 @@ var KeyValueInput = ({
11492
11547
  setIsDragging(false);
11493
11548
  }, [setIsDragging]);
11494
11549
  (0, import_react106.useEffect)(() => {
11495
- if (lastRowFirstInputRef.current && value.length > 1) {
11496
- lastRowFirstInputRef.current.focus();
11497
- }
11498
- }, [value.length]);
11550
+ const timeoutId = setTimeout(() => {
11551
+ var _a;
11552
+ if (indexToFocus !== null && keyInputRefsMap.current[indexToFocus]) {
11553
+ (_a = keyInputRefsMap.current[indexToFocus]) == null ? void 0 : _a.focus();
11554
+ setIndexToFocus(null);
11555
+ }
11556
+ });
11557
+ return () => {
11558
+ clearTimeout(timeoutId);
11559
+ };
11560
+ }, [indexToFocus]);
11499
11561
  return /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)(VerticalRhythm, { gap: "xs", children: [
11500
11562
  /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(HorizontalRhythm, { align: "center", justify: "space-between", css: { marginBottom: "var(--spacing-xs)" }, children: /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { css: LabelStyles, children: label2 }) }),
11501
11563
  /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)(
@@ -11533,18 +11595,24 @@ var KeyValueInput = ({
11533
11595
  }
11534
11596
  )
11535
11597
  ] }),
11536
- /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)(HorizontalRhythm, { align: "center", gap: "xs", children: [
11537
- /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { children: valueLabel }),
11538
- !valueInfoPopover ? null : /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
11539
- Popover3,
11540
- {
11541
- buttonText: `${valueLabel} info`,
11542
- iconColor: "gray",
11543
- placement: "bottom-start",
11544
- onInit: ({ store }) => popoverStoresMap.current.value = store,
11545
- children: valueInfoPopover
11546
- }
11547
- )
11598
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)(HorizontalRhythm, { align: "center", justify: "space-between", children: [
11599
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)(HorizontalRhythm, { align: "center", gap: "xs", children: [
11600
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { children: valueLabel }),
11601
+ !valueInfoPopover ? null : /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
11602
+ Popover3,
11603
+ {
11604
+ buttonText: `${valueLabel} info`,
11605
+ iconColor: "gray",
11606
+ placement: "bottom-start",
11607
+ onInit: ({ store }) => popoverStoresMap.current.value = store,
11608
+ children: valueInfoPopover
11609
+ }
11610
+ )
11611
+ ] }),
11612
+ /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)(Caption, { css: { fontSize: "var(--fs-xs)" }, children: [
11613
+ getFormattedShortcut("enter"),
11614
+ " to insert row"
11615
+ ] })
11548
11616
  ] })
11549
11617
  ]
11550
11618
  }
@@ -11562,7 +11630,7 @@ var KeyValueInput = ({
11562
11630
  KeyValueInputItem,
11563
11631
  {
11564
11632
  id,
11565
- firstInputRef: index === value.length - 1 ? lastRowFirstInputRef : null,
11633
+ firstInputRef: (ref) => keyInputRefsMap.current[index] = ref,
11566
11634
  value: item,
11567
11635
  keyLabel: `${keyLabel}, row ${index}`,
11568
11636
  valueLabel: `${valueLabel}, row ${index}`,
@@ -11575,9 +11643,16 @@ var KeyValueInput = ({
11575
11643
  onDelete: () => handleDeleteOptionRow(index),
11576
11644
  onFocusChange: handleFocusChange,
11577
11645
  "data-testid": "key-value-input-item",
11578
- onEnter: handleAddOptionRow,
11646
+ onEnter: () => handleAddOptionRow(index),
11647
+ onKeyPaste: (e) => handleKeyPaste(index, e),
11579
11648
  showIconColumn,
11580
- renderIconSelector
11649
+ renderIconSelector,
11650
+ blockAutoGenerateValue: item.value !== "" && blockAutoGenerateForValues.has(item.value),
11651
+ onBlurValue: (value2) => setBlockAutoGenerateForValues((current) => {
11652
+ const newSet = new Set(current);
11653
+ newSet.add(value2);
11654
+ return newSet;
11655
+ })
11581
11656
  },
11582
11657
  isDragging ? id : index
11583
11658
  )) })
@@ -11586,7 +11661,7 @@ var KeyValueInput = ({
11586
11661
  /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(
11587
11662
  AddListButton,
11588
11663
  {
11589
- onButtonClick: handleAddOptionRow,
11664
+ onButtonClick: () => handleAddOptionRow(value.length - 1),
11590
11665
  disabled: disabled2,
11591
11666
  "data-testid": "add-input-row-action",
11592
11667
  css: { marginTop: "var(--spacing-sm)", marginLeft: "var(--spacing-base)" }
@@ -11609,8 +11684,11 @@ var KeyValueInputItem = ({
11609
11684
  disabledDelete = false,
11610
11685
  disabledDnd = false,
11611
11686
  onEnter,
11687
+ onKeyPaste,
11612
11688
  showIconColumn = false,
11613
- renderIconSelector
11689
+ renderIconSelector,
11690
+ blockAutoGenerateValue,
11691
+ onBlurValue
11614
11692
  }) => {
11615
11693
  const { attributes, listeners, setNodeRef, transform, transition, setActivatorNodeRef, isSorting } = (0, import_sortable.useSortable)({
11616
11694
  id,
@@ -11625,6 +11703,11 @@ var KeyValueInputItem = ({
11625
11703
  onEnter();
11626
11704
  }
11627
11705
  };
11706
+ const handleValueKeyDown = (e) => {
11707
+ if (e.key === "Enter") {
11708
+ onEnter();
11709
+ }
11710
+ };
11628
11711
  return /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("div", { css: rowWrapper, ref: setNodeRef, style, children: [
11629
11712
  /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(DragHandle, { disableDnd: disabledDnd, ref: setActivatorNodeRef, ...attributes, ...listeners }),
11630
11713
  /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)(
@@ -11668,7 +11751,7 @@ var KeyValueInputItem = ({
11668
11751
  showLabel: false,
11669
11752
  disabled: disabled2,
11670
11753
  onChange: (e) => {
11671
- const hasStoredValue = value.value !== value.key;
11754
+ const hasStoredValue = value.value !== value.key || blockAutoGenerateValue;
11672
11755
  onChange == null ? void 0 : onChange({
11673
11756
  key: e.currentTarget.value,
11674
11757
  value: hasStoredValue ? value.value : e.currentTarget.value,
@@ -11678,6 +11761,7 @@ var KeyValueInputItem = ({
11678
11761
  onBlur: () => onFocusChange == null ? void 0 : onFocusChange(false),
11679
11762
  onFocus: () => onFocusChange == null ? void 0 : onFocusChange(true),
11680
11763
  onKeyDown: handleEnter,
11764
+ onPaste: onKeyPaste,
11681
11765
  value: value.key,
11682
11766
  errorMessage: isSorting ? void 0 : error == null ? void 0 : error.key,
11683
11767
  "data-testid": "key"
@@ -11696,9 +11780,12 @@ var KeyValueInputItem = ({
11696
11780
  icon: value.icon
11697
11781
  });
11698
11782
  },
11699
- onBlur: () => onFocusChange == null ? void 0 : onFocusChange(false),
11783
+ onBlur: () => {
11784
+ onFocusChange == null ? void 0 : onFocusChange(false);
11785
+ onBlurValue == null ? void 0 : onBlurValue(value.value);
11786
+ },
11700
11787
  onFocus: () => onFocusChange == null ? void 0 : onFocusChange(true),
11701
- onKeyDown: handleEnter,
11788
+ onKeyDown: handleValueKeyDown,
11702
11789
  value: value.value,
11703
11790
  errorMessage: isSorting ? void 0 : error == null ? void 0 : error.value,
11704
11791
  "data-testid": "value"
@@ -14251,7 +14338,7 @@ init_emotion_jsx_shim();
14251
14338
  var import_react139 = require("react");
14252
14339
  var import_jsx_runtime120 = require("@emotion/react/jsx-runtime");
14253
14340
  var ParameterMenuButton = (0, import_react139.forwardRef)(
14254
- ({ label: label2, children, disabled: disabled2 }, ref) => {
14341
+ ({ label: label2, children, disabled: disabled2, withoutPortal }, ref) => {
14255
14342
  return /* @__PURE__ */ (0, import_jsx_runtime120.jsx)(
14256
14343
  Menu,
14257
14344
  {
@@ -14268,6 +14355,7 @@ var ParameterMenuButton = (0, import_react139.forwardRef)(
14268
14355
  children: /* @__PURE__ */ (0, import_jsx_runtime120.jsx)(Icon, { icon: "more-alt", iconColor: "currentColor", size: "0.9rem" })
14269
14356
  }
14270
14357
  ),
14358
+ withoutPortal,
14271
14359
  children
14272
14360
  }
14273
14361
  );
@@ -14360,6 +14448,7 @@ var ParameterShell = ({
14360
14448
  title,
14361
14449
  children,
14362
14450
  isParameterGroup = false,
14451
+ menuWithoutPortal,
14363
14452
  ...props
14364
14453
  }) => {
14365
14454
  const [manualErrorMessage, setManualErrorMessage] = (0, import_react142.useState)(void 0);
@@ -14391,7 +14480,15 @@ var ParameterShell = ({
14391
14480
  children: actionItems
14392
14481
  }
14393
14482
  ) : null,
14394
- menuItems ? /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(ParameterMenuButton, { label: `${label2} menu`, disabled: props.disabled, children: menuItems }) : null,
14483
+ menuItems ? /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(
14484
+ ParameterMenuButton,
14485
+ {
14486
+ label: `${label2} menu`,
14487
+ disabled: props.disabled,
14488
+ withoutPortal: menuWithoutPortal,
14489
+ children: menuItems
14490
+ }
14491
+ ) : null,
14395
14492
  /* @__PURE__ */ (0, import_jsx_runtime121.jsx)(
14396
14493
  ParameterShellContext.Provider,
14397
14494
  {
@@ -18043,55 +18140,63 @@ var RichText = ({
18043
18140
  onInsertAsset
18044
18141
  }
18045
18142
  ),
18046
- /* @__PURE__ */ (0, import_jsx_runtime134.jsxs)("div", { css: editorContainerWrapper, ref: onPortalContainerRef, children: [
18047
- /* @__PURE__ */ (0, import_jsx_runtime134.jsxs)(
18048
- "div",
18049
- {
18050
- css: editorContainer,
18051
- className: editorInputWrapperClassName,
18052
- ref: onEditorContainerRef,
18053
- "data-testid": "value-container",
18054
- children: [
18055
- /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(
18056
- import_LexicalRichTextPlugin.RichTextPlugin,
18057
- {
18058
- contentEditable: /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(import_LexicalContentEditable.ContentEditable, { css: editorInput, className: editorInputClassName }),
18059
- placeholder: /* @__PURE__ */ (0, import_jsx_runtime134.jsx)("div", { css: editorPlaceholder, "data-placeholder": true, children: placeholder != null ? placeholder : readOnly ? "empty" : "start editing..." }),
18060
- ErrorBoundary: import_LexicalErrorBoundary.default
18061
- }
18062
- ),
18063
- /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(import_LexicalListPlugin.ListPlugin, {}),
18064
- /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(ListIndentPlugin, { maxDepth: 4 }),
18065
- /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(import_LexicalTablePlugin.TablePlugin, { hasCellMerge: false, hasCellBackgroundColor: false }),
18066
- /* @__PURE__ */ (0, import_jsx_runtime134.jsx)("div", { css: editorContainerOverflowWrapper, "data-testid": "table-action-menu-plugin", children: editorContainerRef && portalContainerRef && !minimalInteractivity ? /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(
18067
- TableActionMenuPlugin,
18068
- {
18069
- positioningAnchorEl: editorContainerRef,
18070
- menuPortalEl: portalContainerRef
18071
- }
18072
- ) : null }),
18073
- editorContainerRef && !minimalInteractivity ? /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(TableCellResizerPlugin, { positioningAnchorEl: editorContainerRef }) : null,
18074
- readOnly ? null : /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(import_LexicalHistoryPlugin.HistoryPlugin, {}),
18075
- /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(DisableStylesPlugin, {}),
18076
- /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(import_LexicalMarkdownShortcutPlugin.MarkdownShortcutPlugin, { transformers: MARKDOWN_TRANSFORMERS })
18077
- ]
18078
- }
18079
- ),
18080
- /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(import_jsx_runtime134.Fragment, { children }),
18081
- editorContainerRef ? /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(
18082
- LinkNodePlugin,
18083
- {
18084
- onConnectLink: onConnectLink ? onConnectLink : () => Promise.resolve(),
18085
- getBoundPath: (variables == null ? void 0 : variables.bindVariables) ? (path) => {
18086
- var _a, _b;
18087
- return (_b = (_a = variables.bindVariables) == null ? void 0 : _a.call(variables, path)) != null ? _b : path;
18088
- } : void 0,
18089
- positioningAnchorEl: editorContainerRef
18090
- }
18091
- ) : null,
18092
- /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(TableSelectionPlugin_default, {}),
18093
- /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(ImprovedAssetSelectionPlugin_default, {})
18094
- ] })
18143
+ /* @__PURE__ */ (0, import_jsx_runtime134.jsxs)(
18144
+ "div",
18145
+ {
18146
+ css: editorContainerWrapper,
18147
+ "data-editor-container-wrapper": true,
18148
+ ref: onPortalContainerRef,
18149
+ children: [
18150
+ /* @__PURE__ */ (0, import_jsx_runtime134.jsxs)(
18151
+ "div",
18152
+ {
18153
+ css: editorContainer,
18154
+ className: editorInputWrapperClassName,
18155
+ ref: onEditorContainerRef,
18156
+ "data-testid": "value-container",
18157
+ children: [
18158
+ /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(
18159
+ import_LexicalRichTextPlugin.RichTextPlugin,
18160
+ {
18161
+ contentEditable: /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(import_LexicalContentEditable.ContentEditable, { css: editorInput, className: editorInputClassName }),
18162
+ placeholder: /* @__PURE__ */ (0, import_jsx_runtime134.jsx)("div", { css: editorPlaceholder, "data-placeholder": true, children: placeholder != null ? placeholder : readOnly ? "empty" : "start editing..." }),
18163
+ ErrorBoundary: import_LexicalErrorBoundary.default
18164
+ }
18165
+ ),
18166
+ /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(import_LexicalListPlugin.ListPlugin, {}),
18167
+ /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(ListIndentPlugin, { maxDepth: 4 }),
18168
+ /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(import_LexicalTablePlugin.TablePlugin, { hasCellMerge: false, hasCellBackgroundColor: false }),
18169
+ /* @__PURE__ */ (0, import_jsx_runtime134.jsx)("div", { css: editorContainerOverflowWrapper, "data-testid": "table-action-menu-plugin", children: editorContainerRef && portalContainerRef && !minimalInteractivity ? /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(
18170
+ TableActionMenuPlugin,
18171
+ {
18172
+ positioningAnchorEl: editorContainerRef,
18173
+ menuPortalEl: portalContainerRef
18174
+ }
18175
+ ) : null }),
18176
+ editorContainerRef && !minimalInteractivity ? /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(TableCellResizerPlugin, { positioningAnchorEl: editorContainerRef }) : null,
18177
+ readOnly ? null : /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(import_LexicalHistoryPlugin.HistoryPlugin, {}),
18178
+ /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(DisableStylesPlugin, {}),
18179
+ /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(import_LexicalMarkdownShortcutPlugin.MarkdownShortcutPlugin, { transformers: MARKDOWN_TRANSFORMERS })
18180
+ ]
18181
+ }
18182
+ ),
18183
+ /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(import_jsx_runtime134.Fragment, { children }),
18184
+ editorContainerRef ? /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(
18185
+ LinkNodePlugin,
18186
+ {
18187
+ onConnectLink: onConnectLink ? onConnectLink : () => Promise.resolve(),
18188
+ getBoundPath: (variables == null ? void 0 : variables.bindVariables) ? (path) => {
18189
+ var _a, _b;
18190
+ return (_b = (_a = variables.bindVariables) == null ? void 0 : _a.call(variables, path)) != null ? _b : path;
18191
+ } : void 0,
18192
+ positioningAnchorEl: editorContainerRef
18193
+ }
18194
+ ) : null,
18195
+ /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(TableSelectionPlugin_default, {}),
18196
+ /* @__PURE__ */ (0, import_jsx_runtime134.jsx)(ImprovedAssetSelectionPlugin_default, {})
18197
+ ]
18198
+ }
18199
+ )
18095
18200
  ] });
18096
18201
  };
18097
18202
 
@@ -18749,7 +18854,7 @@ var lightFadingOut = import_react176.keyframes`
18749
18854
  `;
18750
18855
  var skeletonStyles = import_react176.css`
18751
18856
  animation: ${lightFadingOut} 1s ease-out infinite alternate;
18752
- background-color: var(--gray-900);
18857
+ background-color: var(--gray-500);
18753
18858
  `;
18754
18859
 
18755
18860
  // src/components/Skeleton/Skeleton.tsx
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uniformdev/design-system",
3
- "version": "20.7.1-alpha.83+9085e999d1",
3
+ "version": "20.7.1-alpha.84+047b6dcb94",
4
4
  "description": "Uniform design system components",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "exports": {
@@ -38,8 +38,8 @@
38
38
  "@storybook/theming": "^8.3.3",
39
39
  "@types/react": "18.3.24",
40
40
  "@types/react-dom": "18.3.7",
41
- "@uniformdev/canvas": "^20.7.1-alpha.83+9085e999d1",
42
- "@uniformdev/richtext": "^20.7.1-alpha.83+9085e999d1",
41
+ "@uniformdev/canvas": "^20.7.1-alpha.84+047b6dcb94",
42
+ "@uniformdev/richtext": "^20.7.1-alpha.84+047b6dcb94",
43
43
  "@vitest/coverage-v8": "3.2.4",
44
44
  "autoprefixer": "10.4.21",
45
45
  "hygen": "6.2.11",
@@ -93,5 +93,5 @@
93
93
  "publishConfig": {
94
94
  "access": "public"
95
95
  },
96
- "gitHead": "9085e999d1c99bc2d084085dc9983eb5df91f556"
96
+ "gitHead": "047b6dcb9431790be9151a1762ae0880ebe02276"
97
97
  }