@lensui/lens-table 0.1.89 → 0.1.91

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.cjs CHANGED
@@ -953,47 +953,59 @@ function TextEditor({ value, type, min, max, integer = false, style, labels, onC
953
953
  var import_react6 = require("react");
954
954
  var import_react_dom = require("react-dom");
955
955
  var import_jsx_runtime7 = require("react/jsx-runtime");
956
- function TextAreaEditor({ value, title, maxLength, style, labels, onChange, onCommit, onCancel }) {
956
+ function TextAreaEditor({ value, title, maxLength, inline = false, style, labels, onChange, onCommit, onCancel }) {
957
957
  const [open, setOpen] = (0, import_react6.useState)(false);
958
+ const inlineHeaderHeight = typeof style.height === "number" ? style.height : 34;
959
+ const editorStyle = inline && open ? {
960
+ ...style,
961
+ "--rvg-textarea-inline-header-height": `${inlineHeaderHeight}px`
962
+ } : style;
958
963
  const handleKeyDown = (event) => {
959
964
  event.stopPropagation();
960
965
  if (event.key === "Enter") onCommit(value);
961
966
  if (event.key === "Escape") onCancel();
962
967
  };
963
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "rvg-native-editor rvg-textarea-editor", style, children: [
964
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
965
- "input",
966
- {
967
- value,
968
- autoFocus: true,
969
- maxLength,
970
- onChange: (event) => onChange(event.target.value),
971
- onKeyDown: handleKeyDown
972
- }
973
- ),
974
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
975
- "button",
976
- {
977
- type: "button",
978
- className: "rvg-textarea-trigger",
979
- "aria-label": title,
980
- onPointerDown: (event) => {
981
- event.preventDefault();
982
- event.stopPropagation();
983
- },
984
- onClick: () => setOpen(true),
985
- children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(MultilineEditorIcon, {})
986
- }
987
- ),
988
- open && (0, import_react_dom.createPortal)(
989
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "rvg-textarea-backdrop", role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("section", { className: "rvg-textarea-dialog", role: "dialog", "aria-modal": "true", "aria-label": title, children: [
990
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("header", { children: title }),
968
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
969
+ "div",
970
+ {
971
+ className: `rvg-native-editor rvg-textarea-editor${inline && open ? " is-inline-expanded" : ""}`,
972
+ style: editorStyle,
973
+ children: [
991
974
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
975
+ "input",
976
+ {
977
+ value,
978
+ autoFocus: true,
979
+ maxLength,
980
+ onChange: (event) => onChange(event.target.value),
981
+ onKeyDown: handleKeyDown
982
+ }
983
+ ),
984
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
985
+ "button",
986
+ {
987
+ type: "button",
988
+ className: "rvg-textarea-trigger",
989
+ "aria-label": title,
990
+ "aria-expanded": inline ? open : void 0,
991
+ onPointerDown: (event) => {
992
+ event.preventDefault();
993
+ event.stopPropagation();
994
+ },
995
+ onClick: () => setOpen((current) => inline ? !current : true),
996
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(MultilineEditorIcon, {})
997
+ }
998
+ ),
999
+ open && inline && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
992
1000
  "textarea",
993
1001
  {
1002
+ className: "rvg-textarea-inline",
1003
+ "aria-label": title,
1004
+ "data-rvg-preserve-edit": true,
994
1005
  value,
995
1006
  autoFocus: true,
996
1007
  maxLength,
1008
+ onPointerDown: (event) => event.stopPropagation(),
997
1009
  onChange: (event) => onChange(event.target.value),
998
1010
  onKeyDown: (event) => {
999
1011
  event.stopPropagation();
@@ -1002,11 +1014,30 @@ function TextAreaEditor({ value, title, maxLength, style, labels, onChange, onCo
1002
1014
  }
1003
1015
  }
1004
1016
  ),
1005
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("footer", { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("button", { type: "button", onClick: () => onCommit(value), children: labels.confirm }) })
1006
- ] }) }),
1007
- document.body
1008
- )
1009
- ] });
1017
+ open && !inline && (0, import_react_dom.createPortal)(
1018
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "rvg-textarea-backdrop", role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("section", { className: "rvg-textarea-dialog", role: "dialog", "aria-modal": "true", "aria-label": title, children: [
1019
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("header", { children: title }),
1020
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1021
+ "textarea",
1022
+ {
1023
+ value,
1024
+ autoFocus: true,
1025
+ maxLength,
1026
+ onChange: (event) => onChange(event.target.value),
1027
+ onKeyDown: (event) => {
1028
+ event.stopPropagation();
1029
+ if ((event.metaKey || event.ctrlKey) && event.key === "Enter") onCommit(value);
1030
+ if (event.key === "Escape") setOpen(false);
1031
+ }
1032
+ }
1033
+ ),
1034
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("footer", { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("button", { type: "button", onClick: () => onCommit(value), children: labels.confirm }) })
1035
+ ] }) }),
1036
+ document.body
1037
+ )
1038
+ ]
1039
+ }
1040
+ );
1010
1041
  }
1011
1042
 
1012
1043
  // src/core/format.ts
@@ -3829,6 +3860,7 @@ function TableInner({
3829
3860
  value: draft,
3830
3861
  title: column.editor.title ?? column.title,
3831
3862
  maxLength: column.editor.maxLength,
3863
+ inline: column.editor.inline,
3832
3864
  style: editorStyle,
3833
3865
  labels,
3834
3866
  onChange: setDraft,
package/dist/index.css CHANGED
@@ -1691,11 +1691,6 @@
1691
1691
  border-right-color: color-mix(in srgb, var(--rvg-color-axis-selection-text) 34%, transparent);
1692
1692
  color: var(--rvg-color-axis-selection-text);
1693
1693
  }
1694
- .rvg-row-drag-preview-cell svg {
1695
- width: 16px;
1696
- height: 16px;
1697
- fill: var(--rvg-color-icon);
1698
- }
1699
1694
  .rvg-row-drag-preview-cell.is-selected {
1700
1695
  z-index: 1;
1701
1696
  background: var(--rvg-color-selection-fill);
@@ -2758,6 +2753,24 @@
2758
2753
  .rvg-textarea-editor {
2759
2754
  padding-right: 24px;
2760
2755
  }
2756
+ .rvg-textarea-editor.is-inline-expanded {
2757
+ z-index: 8;
2758
+ display: grid;
2759
+ height: calc(var(--rvg-textarea-inline-header-height) + 116px) !important;
2760
+ padding: 0;
2761
+ grid-template-rows: var(--rvg-textarea-inline-header-height) minmax(0, 1fr);
2762
+ align-items: stretch;
2763
+ gap: 0;
2764
+ overflow: hidden;
2765
+ border: 2px solid var(--rvg-color-primary);
2766
+ background: var(--rvg-color-bg);
2767
+ }
2768
+ .rvg-textarea-editor.is-inline-expanded > input {
2769
+ width: 100%;
2770
+ height: 100%;
2771
+ min-height: 0;
2772
+ padding: 0 24px 0 4px;
2773
+ }
2761
2774
  .rvg-textarea-trigger {
2762
2775
  position: absolute;
2763
2776
  top: 50%;
@@ -2774,11 +2787,36 @@
2774
2787
  cursor: pointer;
2775
2788
  transform: translateY(-50%);
2776
2789
  }
2790
+ .rvg-textarea-editor.is-inline-expanded .rvg-textarea-trigger {
2791
+ top: calc(var(--rvg-textarea-inline-header-height) / 2);
2792
+ }
2777
2793
  .rvg-multiline-icon {
2778
2794
  width: 13px;
2779
2795
  height: 13px;
2780
2796
  fill: currentColor;
2781
2797
  }
2798
+ .rvg-textarea-inline {
2799
+ display: block;
2800
+ width: 100%;
2801
+ height: 100%;
2802
+ min-width: 0;
2803
+ min-height: 0;
2804
+ margin: 0;
2805
+ padding: 8px;
2806
+ resize: none;
2807
+ border: 0;
2808
+ border-top: 1px solid var(--rvg-color-primary);
2809
+ border-radius: 0;
2810
+ outline: none;
2811
+ background: var(--rvg-color-bg);
2812
+ color: var(--rvg-color-text);
2813
+ font:
2814
+ var(--rvg-font-size-body)/1.5 Inter,
2815
+ ui-sans-serif,
2816
+ system-ui,
2817
+ sans-serif;
2818
+ box-sizing: border-box;
2819
+ }
2782
2820
  .rvg-textarea-backdrop {
2783
2821
  position: fixed;
2784
2822
  z-index: 1200;
package/dist/index.d.cts CHANGED
@@ -218,6 +218,8 @@ interface GridColumn<Row> {
218
218
  type: 'textarea';
219
219
  title?: string;
220
220
  maxLength?: number;
221
+ /** Expands one integrated multiline editor below the active cell instead of opening a modal dialog. */
222
+ inline?: boolean;
221
223
  } | {
222
224
  type: 'date' | 'time' | 'date-time' | 'year' | 'month' | 'date-range' | 'time-range' | 'date-time-range';
223
225
  format?: string;
package/dist/index.d.ts CHANGED
@@ -218,6 +218,8 @@ interface GridColumn<Row> {
218
218
  type: 'textarea';
219
219
  title?: string;
220
220
  maxLength?: number;
221
+ /** Expands one integrated multiline editor below the active cell instead of opening a modal dialog. */
222
+ inline?: boolean;
221
223
  } | {
222
224
  type: 'date' | 'time' | 'date-time' | 'year' | 'month' | 'date-range' | 'time-range' | 'date-time-range';
223
225
  format?: string;
package/dist/index.js CHANGED
@@ -923,47 +923,59 @@ function TextEditor({ value, type, min, max, integer = false, style, labels, onC
923
923
  import { useState as useState4 } from "react";
924
924
  import { createPortal } from "react-dom";
925
925
  import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
926
- function TextAreaEditor({ value, title, maxLength, style, labels, onChange, onCommit, onCancel }) {
926
+ function TextAreaEditor({ value, title, maxLength, inline = false, style, labels, onChange, onCommit, onCancel }) {
927
927
  const [open, setOpen] = useState4(false);
928
+ const inlineHeaderHeight = typeof style.height === "number" ? style.height : 34;
929
+ const editorStyle = inline && open ? {
930
+ ...style,
931
+ "--rvg-textarea-inline-header-height": `${inlineHeaderHeight}px`
932
+ } : style;
928
933
  const handleKeyDown = (event) => {
929
934
  event.stopPropagation();
930
935
  if (event.key === "Enter") onCommit(value);
931
936
  if (event.key === "Escape") onCancel();
932
937
  };
933
- return /* @__PURE__ */ jsxs7("div", { className: "rvg-native-editor rvg-textarea-editor", style, children: [
934
- /* @__PURE__ */ jsx7(
935
- "input",
936
- {
937
- value,
938
- autoFocus: true,
939
- maxLength,
940
- onChange: (event) => onChange(event.target.value),
941
- onKeyDown: handleKeyDown
942
- }
943
- ),
944
- /* @__PURE__ */ jsx7(
945
- "button",
946
- {
947
- type: "button",
948
- className: "rvg-textarea-trigger",
949
- "aria-label": title,
950
- onPointerDown: (event) => {
951
- event.preventDefault();
952
- event.stopPropagation();
953
- },
954
- onClick: () => setOpen(true),
955
- children: /* @__PURE__ */ jsx7(MultilineEditorIcon, {})
956
- }
957
- ),
958
- open && createPortal(
959
- /* @__PURE__ */ jsx7("div", { className: "rvg-textarea-backdrop", role: "presentation", children: /* @__PURE__ */ jsxs7("section", { className: "rvg-textarea-dialog", role: "dialog", "aria-modal": "true", "aria-label": title, children: [
960
- /* @__PURE__ */ jsx7("header", { children: title }),
938
+ return /* @__PURE__ */ jsxs7(
939
+ "div",
940
+ {
941
+ className: `rvg-native-editor rvg-textarea-editor${inline && open ? " is-inline-expanded" : ""}`,
942
+ style: editorStyle,
943
+ children: [
961
944
  /* @__PURE__ */ jsx7(
945
+ "input",
946
+ {
947
+ value,
948
+ autoFocus: true,
949
+ maxLength,
950
+ onChange: (event) => onChange(event.target.value),
951
+ onKeyDown: handleKeyDown
952
+ }
953
+ ),
954
+ /* @__PURE__ */ jsx7(
955
+ "button",
956
+ {
957
+ type: "button",
958
+ className: "rvg-textarea-trigger",
959
+ "aria-label": title,
960
+ "aria-expanded": inline ? open : void 0,
961
+ onPointerDown: (event) => {
962
+ event.preventDefault();
963
+ event.stopPropagation();
964
+ },
965
+ onClick: () => setOpen((current) => inline ? !current : true),
966
+ children: /* @__PURE__ */ jsx7(MultilineEditorIcon, {})
967
+ }
968
+ ),
969
+ open && inline && /* @__PURE__ */ jsx7(
962
970
  "textarea",
963
971
  {
972
+ className: "rvg-textarea-inline",
973
+ "aria-label": title,
974
+ "data-rvg-preserve-edit": true,
964
975
  value,
965
976
  autoFocus: true,
966
977
  maxLength,
978
+ onPointerDown: (event) => event.stopPropagation(),
967
979
  onChange: (event) => onChange(event.target.value),
968
980
  onKeyDown: (event) => {
969
981
  event.stopPropagation();
@@ -972,11 +984,30 @@ function TextAreaEditor({ value, title, maxLength, style, labels, onChange, onCo
972
984
  }
973
985
  }
974
986
  ),
975
- /* @__PURE__ */ jsx7("footer", { children: /* @__PURE__ */ jsx7("button", { type: "button", onClick: () => onCommit(value), children: labels.confirm }) })
976
- ] }) }),
977
- document.body
978
- )
979
- ] });
987
+ open && !inline && createPortal(
988
+ /* @__PURE__ */ jsx7("div", { className: "rvg-textarea-backdrop", role: "presentation", children: /* @__PURE__ */ jsxs7("section", { className: "rvg-textarea-dialog", role: "dialog", "aria-modal": "true", "aria-label": title, children: [
989
+ /* @__PURE__ */ jsx7("header", { children: title }),
990
+ /* @__PURE__ */ jsx7(
991
+ "textarea",
992
+ {
993
+ value,
994
+ autoFocus: true,
995
+ maxLength,
996
+ onChange: (event) => onChange(event.target.value),
997
+ onKeyDown: (event) => {
998
+ event.stopPropagation();
999
+ if ((event.metaKey || event.ctrlKey) && event.key === "Enter") onCommit(value);
1000
+ if (event.key === "Escape") setOpen(false);
1001
+ }
1002
+ }
1003
+ ),
1004
+ /* @__PURE__ */ jsx7("footer", { children: /* @__PURE__ */ jsx7("button", { type: "button", onClick: () => onCommit(value), children: labels.confirm }) })
1005
+ ] }) }),
1006
+ document.body
1007
+ )
1008
+ ]
1009
+ }
1010
+ );
980
1011
  }
981
1012
 
982
1013
  // src/core/format.ts
@@ -3799,6 +3830,7 @@ function TableInner({
3799
3830
  value: draft,
3800
3831
  title: column.editor.title ?? column.title,
3801
3832
  maxLength: column.editor.maxLength,
3833
+ inline: column.editor.inline,
3802
3834
  style: editorStyle,
3803
3835
  labels,
3804
3836
  onChange: setDraft,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lensui/lens-table",
3
- "version": "0.1.89",
3
+ "version": "0.1.91",
4
4
  "description": "A lightweight, canvas-rendered React table component for LensUI.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",