@guiexpert/table 1.1.97 → 1.1.99

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.
Files changed (110) hide show
  1. package/README.md +12 -0
  2. package/css/main.css +381 -27
  3. package/css/table-classes.css +33 -9
  4. package/css/table-clipboard.css +41 -0
  5. package/css/table-color-vars.css +56 -0
  6. package/css/table-fill-batch.css +9 -2
  7. package/css/table-master-detail.css +20 -0
  8. package/css/table-sheet-editing.css +149 -0
  9. package/css/table-spreadsheet.css +50 -0
  10. package/css/table-tree.css +23 -16
  11. package/index.cjs +54 -67
  12. package/index.d.ts +52 -0
  13. package/index.js +18968 -11475
  14. package/lib/table/action/action-id.type.d.ts +1 -1
  15. package/lib/table/action/shortcut.service.d.ts +9 -0
  16. package/lib/table/aria/aria-texts.d.ts +26 -0
  17. package/lib/table/aria/aria-texts.if.d.ts +196 -0
  18. package/lib/table/batch-edit/batch-edit-service.d.ts +22 -0
  19. package/lib/table/batch-edit/cell-change.if.d.ts +6 -2
  20. package/lib/table/batch-edit/pending-cell-changes.d.ts +7 -0
  21. package/lib/table/batch-edit/write-row-value.d.ts +14 -0
  22. package/lib/table/calc/column-values.d.ts +2 -0
  23. package/lib/table/clipboard/clipboard-html.d.ts +41 -0
  24. package/lib/table/clipboard/clipboard-keymap.d.ts +18 -0
  25. package/lib/table/clipboard/clipboard-options.d.ts +30 -0
  26. package/lib/table/clipboard/clipboard-options.if.d.ts +67 -0
  27. package/lib/table/clipboard/clipboard-service.d.ts +122 -0
  28. package/lib/table/clipboard/input-pipes.d.ts +59 -0
  29. package/lib/table/clipboard/paste-plan.d.ts +96 -0
  30. package/lib/table/clipboard/tsv.d.ts +31 -0
  31. package/lib/table/crud/crud-object-edit.d.ts +2 -0
  32. package/lib/table/crud/crud-object-view.d.ts +2 -0
  33. package/lib/table/crud/crud-table-model-factory.d.ts +2 -0
  34. package/lib/table/data/common/event/ge-edit-event.d.ts +46 -0
  35. package/lib/table/data/common/event/ge-row-drag-event.d.ts +2 -2
  36. package/lib/table/data/common/event/ge-undo-event.d.ts +29 -0
  37. package/lib/table/data/options/table-options.d.ts +34 -0
  38. package/lib/table/data/options/table-options.if.d.ts +116 -1
  39. package/lib/table/data/tablemodel/areamodel/abstract-area-model.d.ts +11 -2
  40. package/lib/table/data/tablemodel/areamodel/area-model-array-of-arrays.d.ts +14 -0
  41. package/lib/table/data/tablemodel/areamodel/area-model-object-array.d.ts +14 -0
  42. package/lib/table/data/tablemodel/areamodel/area-model.if.d.ts +11 -0
  43. package/lib/table/data/tablemodel/column/column-def.d.ts +13 -0
  44. package/lib/table/data/tablemodel/column/column-def.if.d.ts +36 -1
  45. package/lib/table/data/tablemodel/column/default-editable.d.ts +18 -0
  46. package/lib/table/ele-scope.d.ts +37 -0
  47. package/lib/table/event-adapter.d.ts +6 -0
  48. package/lib/table/event-listener-hub.d.ts +10 -0
  49. package/lib/table/event-listener.if.d.ts +16 -0
  50. package/lib/table/factory/pivot-factory.d.ts +1 -1
  51. package/lib/table/factory/row-group-factory.d.ts +1 -1
  52. package/lib/table/factory/table-factory.d.ts +14 -0
  53. package/lib/table/formula/formula-ast.if.d.ts +32 -2
  54. package/lib/table/formula/formula-error.d.ts +4 -2
  55. package/lib/table/formula/parser.d.ts +5 -2
  56. package/lib/table/formula/tokenizer.d.ts +5 -2
  57. package/lib/table/input-handler.d.ts +8 -0
  58. package/lib/table/master-detail/master-detail-service.d.ts +9 -0
  59. package/lib/table/render-scope.d.ts +40 -0
  60. package/lib/table/row-drag/row-drag-service.d.ts +3 -2
  61. package/lib/table/rtl/rtl-util.d.ts +126 -0
  62. package/lib/table/rtl/table-direction.type.d.ts +23 -0
  63. package/lib/table/selection/selection-service.d.ts +48 -0
  64. package/lib/table/service/convenience-dom.service.d.ts +49 -1
  65. package/lib/table/service/excel-export-options.if.d.ts +23 -0
  66. package/lib/table/service/excel-service.d.ts +12 -2
  67. package/lib/table/service/excel-service.if.d.ts +38 -1
  68. package/lib/table/sheet/cell-address.d.ts +100 -0
  69. package/lib/table/sheet/cell-formula-options.d.ts +27 -0
  70. package/lib/table/sheet/cell-formula-options.if.d.ts +27 -0
  71. package/lib/table/sheet/excel-formula.d.ts +20 -0
  72. package/lib/table/sheet/format-formula.d.ts +19 -0
  73. package/lib/table/sheet/sheet-cells.if.d.ts +17 -0
  74. package/lib/table/sheet/sheet-compiler.d.ts +47 -0
  75. package/lib/table/sheet/sheet-engine.d.ts +207 -0
  76. package/lib/table/sheet/sheet-function-info.d.ts +25 -0
  77. package/lib/table/sheet/sheet-functions.d.ts +27 -0
  78. package/lib/table/sheet/sheet-values.d.ts +154 -0
  79. package/lib/table/sheet/shift-formula.d.ts +71 -0
  80. package/lib/table/sheet/table-sheet.d.ts +214 -0
  81. package/lib/table/sheet-editing/cell-editor-service.d.ts +105 -0
  82. package/lib/table/sheet-editing/cell-editor.if.d.ts +110 -0
  83. package/lib/table/sheet-editing/editing-keymap.d.ts +17 -0
  84. package/lib/table/sheet-editing/editing-options.d.ts +34 -0
  85. package/lib/table/sheet-editing/editing-options.if.d.ts +49 -0
  86. package/lib/table/sheet-editing/editors/date-cell-editor.d.ts +23 -0
  87. package/lib/table/sheet-editing/editors/number-cell-editor.d.ts +18 -0
  88. package/lib/table/sheet-editing/editors/select-cell-editor.d.ts +36 -0
  89. package/lib/table/sheet-editing/editors/text-cell-editor.d.ts +35 -0
  90. package/lib/table/sheet-editing/formula-assist.d.ts +103 -0
  91. package/lib/table/sheet-editing/formula-text.d.ts +61 -0
  92. package/lib/table/sheet-editing/sheet-navigation.d.ts +26 -0
  93. package/lib/table/spreadsheet/area-model-sheet.d.ts +170 -0
  94. package/lib/table/spreadsheet/formula-bar.d.ts +53 -0
  95. package/lib/table/spreadsheet/spreadsheet-factory.d.ts +111 -0
  96. package/lib/table/spreadsheet/spreadsheet-options.if.d.ts +28 -0
  97. package/lib/table/spreadsheet/spreadsheet-preset.d.ts +37 -0
  98. package/lib/table/spreadsheet/structure-edit.d.ts +35 -0
  99. package/lib/table/table-api.d.ts +533 -4
  100. package/lib/table/table-scope.d.ts +299 -1
  101. package/lib/table/undo/cell-changes-undoable.d.ts +34 -0
  102. package/lib/table/undo/model-rows.d.ts +17 -0
  103. package/lib/table/undo/pending-changes-undoable.d.ts +35 -0
  104. package/lib/table/undo/undo-keymap.d.ts +17 -0
  105. package/lib/table/undo/undo-options.d.ts +26 -0
  106. package/lib/table/undo/undo-options.if.d.ts +30 -0
  107. package/lib/table/undo/undo-service.d.ts +103 -0
  108. package/lib/table/undo/undo-stack.d.ts +62 -0
  109. package/lib/table/undo/undoable.if.d.ts +36 -0
  110. package/package.json +1 -1
package/README.md CHANGED
@@ -58,6 +58,18 @@ This is the UI-agnostic table component for your next web app. 😊
58
58
  created lazily and kept while scrolling, fixed or measured height, keyboard (Enter, Tab) and screen readers
59
59
  (`aria-expanded`), `tableApi.setDetailExpanded()` / `expandAllDetails()`, stored with the table state
60
60
  (`tableOptions.masterDetail`) – since 1.1.97. Variable row heights use prefix sums (O(log n) per scroll frame)
61
+ - Right-to-left (Arabic, Hebrew, Persian, Urdu): `tableOptions.direction: "rtl"` (or `"auto"` from the page) mirrors
62
+ the whole table – first column on the right, horizontal scrolling, fixed columns, tree indent, resize handles, fill
63
+ handle, row drag, master/detail, arrow keys; right-to-left Excel sheet – since 1.1.98
64
+ - Excel-style editing (`tableOptions.editing`): type to overwrite, F2, Enter/Tab, Delete, Ctrl+Enter, Ctrl+arrow to
65
+ the data edge, IME; copy, cut and paste with Excel and Google Sheets (`clipboard`); undo and redo of every change
66
+ (`undo`, `tableApi.undo()`) – since 1.1.99
67
+ - Spreadsheet cell formulas (`tableOptions.cellFormulas`): `=B2*C2`, `$A$1`, ranges, 70 Excel functions, a dependency
68
+ graph that recalculates only dependent cells, colored references and pointing while typing, Excel export with real
69
+ formulas – own parser, no `eval`. `SheetEngine` works without a table – since 1.1.99
70
+ - Spreadsheet mode: `SpreadsheetFactory.create({ data })` builds column letters, row numbers, a sparse body (a million
71
+ empty rows cost nothing) and all of the above; `FormulaBar`, insert/delete rows and columns with adjusted references;
72
+ `spreadsheet: true` for an existing table – since 1.1.99
61
73
  - Custom Filtering
62
74
  - In-place Cell Editing
63
75
  - Userdefined Key and Mouse Events
package/css/main.css CHANGED
@@ -49,8 +49,8 @@
49
49
 
50
50
 
51
51
  .ge-table-label-div .ge-table-label {
52
- padding-left: 10px;
53
- padding-right: 10px;
52
+ padding-inline-start: 10px;
53
+ padding-inline-end: 10px;
54
54
  }
55
55
 
56
56
  /* Total rows of AreaModelAggregateFooter (1.1.94) – before the align classes, so a column's footer class wins */
@@ -74,21 +74,45 @@
74
74
  overflow: visible;
75
75
  }
76
76
 
77
+ /* "left" and "right" describe the left-to-right layout: start and end of the row – mirrored in right-to-left
78
+ (direction: "rtl", since 1.1.98). A column that must stay physically right needs its own class. */
77
79
  .ge-table-text-align-left {
78
- text-align: left;
80
+ text-align: start;
79
81
  }
80
82
 
81
83
  .ge-table-text-align-right {
84
+ text-align: end;
85
+ }
86
+
87
+ .ge-table-text-align-start {
88
+ text-align: start;
89
+ }
90
+
91
+ .ge-table-text-align-end {
92
+ text-align: end;
93
+ }
94
+
95
+ /* Latin text with punctuation in a right-to-left table ("Rossi S.p.A." would show as ".Rossi S.p.A"): every label gets
96
+ the direction of its own text (unicode-bidi: plaintext) and stays aligned to the start of the table (since 1.1.98). */
97
+ .ge-table-text-plaintext {
98
+ text-align: left;
99
+ }
100
+
101
+ .ge-table[dir="rtl"] .ge-table-text-plaintext:not(.ge-table[dir="rtl"] .ge-table[dir="ltr"] .ge-table-text-plaintext) {
82
102
  text-align: right;
83
103
  }
84
104
 
105
+ .ge-table-text-plaintext .ge-table-label {
106
+ unicode-bidi: plaintext;
107
+ }
108
+
85
109
  .ge-table-text-align-center {
86
110
  text-align: center;
87
111
  }
88
112
 
89
113
  /* Row checkbox */
90
114
  .ge-table-row-checkbox-div {
91
- padding-left: 14px;
115
+ padding-inline-start: 14px;
92
116
  }
93
117
  .ge-table-body-east {
94
118
  z-index: 999;
@@ -112,10 +136,10 @@
112
136
  overflow-y: auto;
113
137
  table th,
114
138
  table td {
115
- text-align: left;
139
+ text-align: start;
116
140
 
117
141
  &:nth-child(2) {
118
- padding-left: 12px;
142
+ padding-inline-start: 12px;
119
143
  }
120
144
  &.ge-table-crud-object-view-object-child {
121
145
  font-weight: bold;
@@ -152,7 +176,7 @@
152
176
  justify-items: stretch;
153
177
  label {
154
178
  align-self: end;
155
- text-align: right;
179
+ text-align: end;
156
180
  line-height: 2;
157
181
  }
158
182
  }
@@ -176,9 +200,9 @@
176
200
  }
177
201
 
178
202
 
179
- /* room for the sort icon (20px, absolute, right) – otherwise it covers right-aligned header labels */
203
+ /* room for the sort icon (20px, absolute, at the end) – otherwise it covers end-aligned header labels */
180
204
  .ge-table-col-div:has(> .ge-table-sorted-icon-div) .ge-table-label {
181
- padding-right: 22px;
205
+ padding-inline-end: 22px;
182
206
  }
183
207
 
184
208
 
@@ -256,6 +280,47 @@
256
280
  animation: none; /* a still ring segment and the text */
257
281
  }
258
282
  }
283
+ /* Copy, cut and paste (since 1.1.99, tableOptions.clipboard) */
284
+
285
+ /* the hidden text field that gets the focus for the moment of Ctrl/⌘+C, X, V (the browser fires its clipboard event there) */
286
+ .ge-table-clipboard-proxy {
287
+ position: absolute;
288
+ top: 0;
289
+ left: 0;
290
+ width: 1px;
291
+ height: 1px;
292
+ margin: 0;
293
+ padding: 0;
294
+ border: 0;
295
+ opacity: 0;
296
+ overflow: hidden;
297
+ resize: none;
298
+ pointer-events: none;
299
+ font-size: 16px; /* iOS zooms into a focused field with a smaller font */
300
+ }
301
+
302
+ /* cut cells: a dashed frame ("marching ants") until they are pasted, Escape or another change */
303
+ .ge-table-cut-range {
304
+ position: absolute;
305
+ display: none;
306
+ z-index: 8998; /* below the fill preview (8999) and the editor (9500) */
307
+ box-sizing: border-box;
308
+ pointer-events: none;
309
+ border: 2px dashed var(--ge-table-cut-range-border);
310
+ animation: ge-table-cut-range-ants 0.8s linear infinite;
311
+ }
312
+
313
+ @keyframes ge-table-cut-range-ants {
314
+ 50% {
315
+ border-color: var(--ge-table-cut-range-border-alt);
316
+ }
317
+ }
318
+
319
+ @media (prefers-reduced-motion: reduce) {
320
+ .ge-table-cut-range {
321
+ animation: none; /* the dashed frame alone */
322
+ }
323
+ }
259
324
 
260
325
 
261
326
  .ge-table { background-color: var(--ge-table-bg); }
@@ -493,6 +558,34 @@
493
558
  --ge-table-detail-border: #c9d1db;
494
559
  --ge-table-detail-toggle-color: #5f6368;
495
560
  --ge-table-detail-toggle-hover-bg: rgba(128, 128, 128, 0.15);
561
+
562
+ /* Excel-style editing (since 1.1.99): the editor above the cell */
563
+ --ge-table-cell-editor-bg: #fff;
564
+ --ge-table-cell-editor-text: #111;
565
+ --ge-table-cell-editor-border: #0a6ebd;
566
+ --ge-table-cell-editor-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
567
+ --ge-table-cell-editor-invalid-border: #d93025;
568
+ --ge-table-cut-range-border: #0a6ebd;
569
+ --ge-table-cut-range-border-alt: #9ec9ec;
570
+ /* formula input (since 1.1.99): colors of the references 0–7, function list and hint */
571
+ --ge-table-formula-ref-0: #1a73e8;
572
+ --ge-table-formula-ref-1: #d93025;
573
+ --ge-table-formula-ref-2: #7b1fa2;
574
+ --ge-table-formula-ref-3: #188038;
575
+ --ge-table-formula-ref-4: #c26401;
576
+ --ge-table-formula-ref-5: #00838f;
577
+ --ge-table-formula-ref-6: #c2185b;
578
+ --ge-table-formula-ref-7: #5d4037;
579
+ --ge-table-formula-popup-bg: #fff;
580
+ --ge-table-formula-popup-text: #111;
581
+ --ge-table-formula-popup-muted: #5f6368;
582
+ --ge-table-formula-popup-border: #c4c7c5;
583
+ --ge-table-formula-popup-active-bg: #e8f0fe;
584
+ /* formula bar (since 1.1.99) */
585
+ --ge-table-formula-bar-bg: #fff;
586
+ --ge-table-formula-bar-text: #111;
587
+ --ge-table-formula-bar-muted: #5f6368;
588
+ --ge-table-formula-bar-border: #c4c7c5;
496
589
  }
497
590
 
498
591
 
@@ -620,16 +713,46 @@ html[data-theme="dark"] {
620
713
  --ge-table-detail-border: #3c434d;
621
714
  --ge-table-detail-toggle-color: #bdc1c6;
622
715
  --ge-table-detail-toggle-hover-bg: rgba(255, 255, 255, 0.12);
716
+
717
+ /* Excel-style editing (since 1.1.99) */
718
+ --ge-table-cell-editor-bg: #1f2937;
719
+ --ge-table-cell-editor-text: #f3f4f6;
720
+ --ge-table-cell-editor-border: #8ab4f8;
721
+ --ge-table-cell-editor-shadow: 0 2px 6px rgba(0, 0, 0, 0.6);
722
+ --ge-table-cell-editor-invalid-border: #f28b82;
723
+ --ge-table-cut-range-border: #8ab4f8;
724
+ --ge-table-cut-range-border-alt: #3c5a85;
725
+ /* formula input (since 1.1.99) */
726
+ --ge-table-formula-ref-0: #8ab4f8;
727
+ --ge-table-formula-ref-1: #f28b82;
728
+ --ge-table-formula-ref-2: #d7aefb;
729
+ --ge-table-formula-ref-3: #81c995;
730
+ --ge-table-formula-ref-4: #fcad70;
731
+ --ge-table-formula-ref-5: #78d9ec;
732
+ --ge-table-formula-ref-6: #ff8bcb;
733
+ --ge-table-formula-ref-7: #d7ccc8;
734
+ --ge-table-formula-popup-bg: #1f2937;
735
+ --ge-table-formula-popup-text: #f3f4f6;
736
+ --ge-table-formula-popup-muted: #9aa0a6;
737
+ --ge-table-formula-popup-border: #4b5563;
738
+ --ge-table-formula-popup-active-bg: #374151;
739
+ /* formula bar (since 1.1.99) */
740
+ --ge-table-formula-bar-bg: #1f2937;
741
+ --ge-table-formula-bar-text: #f3f4f6;
742
+ --ge-table-formula-bar-muted: #9aa0a6;
743
+ --ge-table-formula-bar-border: #4b5563;
623
744
  }
624
745
  /* Fill handle and batch edit (since 1.1.96) – colors in table-color-vars.css (--ge-table-fill-*, --ge-table-cell-*) */
625
746
 
626
- /* the square at the bottom right corner of the selected range; its center sits on the corner */
747
+ /* the square at the bottom end corner of the selected range (right-to-left: bottom left); its center sits on it */
627
748
  .ge-table-fill-handle {
628
749
  position: absolute;
629
750
  z-index: 9000; /* above the cells, below the overlay (10000) */
630
751
  width: 7px;
631
752
  height: 7px;
632
- margin: -4px 0 0 -4px;
753
+ margin: 0;
754
+ margin-block-start: -4px;
755
+ margin-inline-start: -4px;
633
756
  box-sizing: border-box;
634
757
  background: var(--ge-table-fill-handle-color);
635
758
  border: 1px solid var(--ge-table-fill-handle-border);
@@ -664,6 +787,11 @@ html[data-theme="dark"] {
664
787
  background-image: linear-gradient(225deg, var(--ge-table-cell-pending-marker) 6px, transparent 6px);
665
788
  }
666
789
 
790
+ /* right-to-left: the corner mark at the top end (left) */
791
+ .ge-table[dir="rtl"] .ge-table-col-div.ge-table-cell-pending:not(.ge-table[dir="rtl"] .ge-table[dir="ltr"] .ge-table-col-div.ge-table-cell-pending) {
792
+ background-image: linear-gradient(135deg, var(--ge-table-cell-pending-marker) 6px, transparent 6px);
793
+ }
794
+
667
795
  /* the color only while the cell is not selected – a selected cell keeps the selection color (and the corner mark) */
668
796
  .ge-table-col-div.ge-table-cell-pending:not([class*="-selected-range"]) {
669
797
  background-color: var(--ge-table-cell-pending-bg);
@@ -774,6 +902,26 @@ html[data-theme="dark"] {
774
902
  .ge-table-detail-toggle.ge-table-detail-toggle-expanded::before {
775
903
  transform: rotate(90deg);
776
904
  }
905
+
906
+ /* right-to-left (since 1.1.98): the triangle points to the left, expanded down */
907
+ .ge-table[dir="rtl"] .ge-table-detail-toggle:not(.ge-table[dir="rtl"] .ge-table[dir="ltr"] .ge-table-detail-toggle)::before {
908
+ border-width: 4px 6px 4px 0;
909
+ border-color: transparent var(--ge-table-detail-toggle-color) transparent transparent;
910
+ }
911
+
912
+ .ge-table[dir="rtl"] .ge-table-detail-toggle.ge-table-detail-toggle-expanded:not(.ge-table[dir="rtl"] .ge-table[dir="ltr"] .ge-table-detail-toggle.ge-table-detail-toggle-expanded)::before {
913
+ transform: rotate(-90deg);
914
+ }
915
+
916
+ /* right-to-left (since 1.1.98): the triangle points to the left, expanded down */
917
+ .ge-table[dir="rtl"] .ge-table-detail-toggle:not(.ge-table[dir="rtl"] .ge-table[dir="ltr"] .ge-table-detail-toggle)::before {
918
+ border-width: 4px 6px 4px 0;
919
+ border-color: transparent var(--ge-table-detail-toggle-color) transparent transparent;
920
+ }
921
+
922
+ .ge-table[dir="rtl"] .ge-table-detail-toggle.ge-table-detail-toggle-expanded:not(.ge-table[dir="rtl"] .ge-table[dir="ltr"] .ge-table-detail-toggle.ge-table-detail-toggle-expanded)::before {
923
+ transform: rotate(-90deg);
924
+ }
777
925
  /* Pivot tables (PivotFactory / AreaModelPivot, since 1.1.94) */
778
926
 
779
927
  /* every value cell: numbers on the end side, same digit widths */
@@ -922,26 +1070,225 @@ html[data-theme="dark"] {
922
1070
  font-variant-numeric: tabular-nums;
923
1071
  font-weight: var(--ge-table-row-group-label-font-weight);
924
1072
  }
1073
+ /* Excel-style editing (since 1.1.99): one editor element above the edited cell (tableOptions.editing) */
1074
+ .ge-table-cell-editor {
1075
+ position: absolute;
1076
+ display: none;
1077
+ box-sizing: border-box;
1078
+ z-index: 9500; /* above the cells, the detail layer (1000) and the fill preview (8999), below the focus frame (9999) and overlay (10000) */
1079
+ background: var(--ge-table-cell-editor-bg);
1080
+ box-shadow: var(--ge-table-cell-editor-shadow);
1081
+ }
1082
+ .ge-table-cell-editor.ge-table-cell-editor-clipped {
1083
+ pointer-events: none; /* scrolled out of view: invisible, but still focused */
1084
+ box-shadow: none;
1085
+ }
1086
+ .ge-table-cell-editor-field {
1087
+ box-sizing: border-box;
1088
+ width: 100%;
1089
+ height: 100%;
1090
+ margin: 0;
1091
+ padding: 0 6px;
1092
+ border: 2px solid var(--ge-table-cell-editor-border);
1093
+ border-radius: 0;
1094
+ outline: none;
1095
+ font: inherit;
1096
+ color: var(--ge-table-cell-editor-text);
1097
+ background: var(--ge-table-cell-editor-bg);
1098
+ }
1099
+ .ge-table-cell-editor-field[aria-invalid="true"] {
1100
+ border-color: var(--ge-table-cell-editor-invalid-border);
1101
+ }
1102
+ .ge-table-cell-editor-number {
1103
+ text-align: end;
1104
+ font-variant-numeric: tabular-nums;
1105
+ }
1106
+
1107
+ /* The editors inside the cell (InputCellRenderer, SelectCellRenderer) – before 1.1.99 these were inline styles,
1108
+ which a strict Content-Security-Policy (style-src without 'unsafe-inline') blocks */
1109
+ input.ge-table-cell-editor-input {
1110
+ width: calc(100% - 8px);
1111
+ height: 100%;
1112
+ border: 0;
1113
+ padding: 0;
1114
+ padding-inline-start: 8px;
1115
+ }
1116
+ select.ge-table-cell-editor-select {
1117
+ width: 100%;
1118
+ height: 100%;
1119
+ border: 0;
1120
+ padding: 0;
1121
+ padding-inline-start: 8px;
1122
+ }
1123
+
1124
+ /* Formula input (since 1.1.99, tableOptions.cellFormulas): colored references in the editor (a mirror behind the
1125
+ transparent text of the input), frames around the referenced cells, function suggestions and the argument hint */
1126
+ .ge-table-formula-mirror {
1127
+ position: absolute;
1128
+ inset: 0;
1129
+ box-sizing: border-box;
1130
+ display: flex;
1131
+ align-items: center;
1132
+ padding: 0 6px;
1133
+ border: 2px solid transparent;
1134
+ overflow: hidden;
1135
+ white-space: pre;
1136
+ pointer-events: none;
1137
+ font: inherit;
1138
+ color: var(--ge-table-cell-editor-text);
1139
+ direction: ltr;
1140
+ text-align: left;
1141
+ }
1142
+ .ge-table-cell-editor-field.ge-table-formula-input {
1143
+ position: relative;
1144
+ color: transparent;
1145
+ caret-color: var(--ge-table-cell-editor-text);
1146
+ background: transparent;
1147
+ text-align: left; /* formulas read left to right (Excel), also in number columns and right-to-left tables */
1148
+ direction: ltr;
1149
+ }
1150
+ .ge-table-cell-editor-field.ge-table-formula-input::selection {
1151
+ color: transparent;
1152
+ background: rgba(10, 110, 189, 0.3); /* the mirror's text stays readable under the selection */
1153
+ }
1154
+ .ge-table-formula-ref {
1155
+ position: absolute;
1156
+ box-sizing: border-box;
1157
+ border: 2px solid var(--ge-table-formula-ref-0);
1158
+ pointer-events: none;
1159
+ z-index: 9400; /* above the cells, below the editor (9500) */
1160
+ }
1161
+ .ge-table-formula-ref-text-0 { color: var(--ge-table-formula-ref-0); }
1162
+ .ge-table-formula-ref-text-1 { color: var(--ge-table-formula-ref-1); }
1163
+ .ge-table-formula-ref-text-2 { color: var(--ge-table-formula-ref-2); }
1164
+ .ge-table-formula-ref-text-3 { color: var(--ge-table-formula-ref-3); }
1165
+ .ge-table-formula-ref-text-4 { color: var(--ge-table-formula-ref-4); }
1166
+ .ge-table-formula-ref-text-5 { color: var(--ge-table-formula-ref-5); }
1167
+ .ge-table-formula-ref-text-6 { color: var(--ge-table-formula-ref-6); }
1168
+ .ge-table-formula-ref-text-7 { color: var(--ge-table-formula-ref-7); }
1169
+ .ge-table-formula-ref.ge-table-formula-ref-1 { border-color: var(--ge-table-formula-ref-1); }
1170
+ .ge-table-formula-ref.ge-table-formula-ref-2 { border-color: var(--ge-table-formula-ref-2); }
1171
+ .ge-table-formula-ref.ge-table-formula-ref-3 { border-color: var(--ge-table-formula-ref-3); }
1172
+ .ge-table-formula-ref.ge-table-formula-ref-4 { border-color: var(--ge-table-formula-ref-4); }
1173
+ .ge-table-formula-ref.ge-table-formula-ref-5 { border-color: var(--ge-table-formula-ref-5); }
1174
+ .ge-table-formula-ref.ge-table-formula-ref-6 { border-color: var(--ge-table-formula-ref-6); }
1175
+ .ge-table-formula-ref.ge-table-formula-ref-7 { border-color: var(--ge-table-formula-ref-7); }
1176
+ .ge-table-formula-list,
1177
+ .ge-table-formula-hint {
1178
+ position: absolute;
1179
+ top: 100%;
1180
+ inset-inline-start: 0;
1181
+ margin-top: 2px;
1182
+ box-sizing: border-box;
1183
+ background: var(--ge-table-formula-popup-bg);
1184
+ color: var(--ge-table-formula-popup-text);
1185
+ border: 1px solid var(--ge-table-formula-popup-border);
1186
+ box-shadow: var(--ge-table-cell-editor-shadow);
1187
+ font-size: 13px;
1188
+ line-height: 1.5;
1189
+ }
1190
+ .ge-table-formula-list {
1191
+ min-width: 260px;
1192
+ max-width: 420px;
1193
+ max-height: 216px;
1194
+ overflow-y: auto;
1195
+ padding: 2px 0;
1196
+ }
1197
+ .ge-table-formula-option {
1198
+ display: flex;
1199
+ gap: 8px;
1200
+ padding: 1px 8px;
1201
+ white-space: nowrap;
1202
+ cursor: pointer;
1203
+ }
1204
+ .ge-table-formula-option[aria-selected="true"] {
1205
+ background: var(--ge-table-formula-popup-active-bg);
1206
+ }
1207
+ .ge-table-formula-option-name {
1208
+ font-weight: 600;
1209
+ }
1210
+ .ge-table-formula-option-description {
1211
+ overflow: hidden;
1212
+ text-overflow: ellipsis;
1213
+ color: var(--ge-table-formula-popup-muted);
1214
+ }
1215
+ .ge-table-formula-hint {
1216
+ padding: 2px 8px;
1217
+ white-space: nowrap;
1218
+ }
1219
+ .ge-table-formula-hint b {
1220
+ font-weight: 700;
1221
+ }
1222
+ /* Spreadsheet mode (since 1.1.99): the formula bar (FormulaBar) */
1223
+ .ge-table-formula-bar {
1224
+ display: flex;
1225
+ align-items: stretch;
1226
+ gap: 0;
1227
+ box-sizing: border-box;
1228
+ height: 30px;
1229
+ border: 1px solid var(--ge-table-formula-bar-border);
1230
+ background: var(--ge-table-formula-bar-bg);
1231
+ color: var(--ge-table-formula-bar-text);
1232
+ font: inherit;
1233
+ }
1234
+ .ge-table-formula-bar-address,
1235
+ .ge-table-formula-bar-input {
1236
+ box-sizing: border-box;
1237
+ margin: 0;
1238
+ padding: 0 8px;
1239
+ border: 0;
1240
+ outline: none;
1241
+ font: inherit;
1242
+ color: inherit;
1243
+ background: transparent;
1244
+ }
1245
+ .ge-table-formula-bar-address {
1246
+ flex: 0 0 96px;
1247
+ width: 96px;
1248
+ border-inline-end: 1px solid var(--ge-table-formula-bar-border);
1249
+ font-variant-numeric: tabular-nums;
1250
+ }
1251
+ .ge-table-formula-bar-address[aria-invalid="true"] {
1252
+ box-shadow: inset 0 0 0 2px var(--ge-table-cell-editor-invalid-border);
1253
+ }
1254
+ .ge-table-formula-bar-fx {
1255
+ display: flex;
1256
+ align-items: center;
1257
+ padding: 0 8px;
1258
+ font-style: italic;
1259
+ color: var(--ge-table-formula-bar-muted);
1260
+ border-inline-end: 1px solid var(--ge-table-formula-bar-border);
1261
+ }
1262
+ .ge-table-formula-bar-input {
1263
+ flex: 1 1 auto;
1264
+ min-width: 0;
1265
+ direction: ltr; /* formulas read left to right */
1266
+ text-align: left;
1267
+ }
1268
+ .ge-table-formula-bar-address:focus-visible,
1269
+ .ge-table-formula-bar-input:focus-visible {
1270
+ box-shadow: inset 0 0 0 2px var(--ge-table-cell-editor-border);
1271
+ }
925
1272
  /* Tree table */
926
1273
 
927
1274
  .ge-table-col-div.ge-table-col-div-0.ge-table-tree-cell {
928
- text-align: left;
1275
+ text-align: start;
929
1276
  }
930
1277
 
931
1278
  .ge-table-tree-cell .ge-table-label-div {
932
- padding-left: 0;
933
- padding-right: 10px;
1279
+ padding-inline-start: 0;
1280
+ padding-inline-end: 10px;
934
1281
  display: inline;
935
1282
  }
936
1283
 
937
1284
 
938
1285
  .ge-table-col-tree {
939
- text-align: left;
1286
+ text-align: start;
940
1287
  }
941
1288
 
942
1289
  /* Row numbers (RowNumberColumnDef) in a tree: no tree look – right aligned like in a flat table (since 1.1.93) */
943
1290
  .ge-table-col-div.ge-table-row-number.ge-table-tree-cell {
944
- text-align: right;
1291
+ text-align: end;
945
1292
  }
946
1293
  .ge-table-row-number.ge-table-tree-cell .ge-table-label-div {
947
1294
  display: block;
@@ -949,47 +1296,47 @@ html[data-theme="dark"] {
949
1296
  }
950
1297
 
951
1298
  .ge-padding-property-checkbox {
952
- padding-left: 0;
1299
+ padding-inline-start: 0;
953
1300
  }
954
1301
 
955
1302
  .ge-table-col-tree.ge-table-tree-deep-0 {
956
- padding-left: 16px;
1303
+ padding-inline-start: 16px;
957
1304
  }
958
1305
 
959
1306
  .ge-table-col-tree.ge-table-tree-deep-1 {
960
- padding-left: 36px;
1307
+ padding-inline-start: 36px;
961
1308
  }
962
1309
 
963
1310
  .ge-table-col-tree.ge-table-tree-deep-2 {
964
- padding-left: 56px;
1311
+ padding-inline-start: 56px;
965
1312
  }
966
1313
 
967
1314
  .ge-table-col-tree.ge-table-tree-deep-3 {
968
- padding-left: 76px;
1315
+ padding-inline-start: 76px;
969
1316
  }
970
1317
 
971
1318
  .ge-table-col-tree.ge-table-tree-deep-4 {
972
- padding-left: 96px;
1319
+ padding-inline-start: 96px;
973
1320
  }
974
1321
 
975
1322
  .ge-table-col-tree.ge-table-tree-deep-5 {
976
- padding-left: 116px;
1323
+ padding-inline-start: 116px;
977
1324
  }
978
1325
 
979
1326
  .ge-table-col-tree.ge-table-tree-deep-6 {
980
- padding-left: 136px;
1327
+ padding-inline-start: 136px;
981
1328
  }
982
1329
 
983
1330
  .ge-table-col-tree.ge-table-tree-deep-7 {
984
- padding-left: 156px;
1331
+ padding-inline-start: 156px;
985
1332
  }
986
1333
 
987
1334
  .ge-table-col-tree.ge-table-tree-deep-8 {
988
- padding-left: 176px;
1335
+ padding-inline-start: 176px;
989
1336
  }
990
1337
 
991
1338
  .ge-table-col-tree.ge-table-tree-deep-9 {
992
- padding-left: 196px;
1339
+ padding-inline-start: 196px;
993
1340
  }
994
1341
 
995
1342
  .ge-table-col-div.ge-table-col-tree.ge-table-tree-cell {
@@ -1000,3 +1347,10 @@ html[data-theme="dark"] {
1000
1347
  display: grid;
1001
1348
  grid-template-columns: 16px 20px 1fr;
1002
1349
  }
1350
+
1351
+ /* Right-to-left (direction: "rtl", since 1.1.98): the arrow ">" is mirrored by the browser ("<"), so the expanded
1352
+ arrow of the default icon turns the other way (its transform is an inline style: !important). */
1353
+ .ge-table[dir="rtl"] .gt-table-tree-arrow-expanded:not(.ge-table[dir="rtl"] .ge-table[dir="ltr"] .gt-table-tree-arrow-expanded) {
1354
+ transform: rotate(-90deg) translate(-66%, -66%) !important;
1355
+ transform-origin: 100% 0 !important;
1356
+ }
@@ -42,8 +42,8 @@
42
42
 
43
43
 
44
44
  .ge-table-label-div .ge-table-label {
45
- padding-left: 10px;
46
- padding-right: 10px;
45
+ padding-inline-start: 10px;
46
+ padding-inline-end: 10px;
47
47
  }
48
48
 
49
49
  /* Total rows of AreaModelAggregateFooter (1.1.94) – before the align classes, so a column's footer class wins */
@@ -67,21 +67,45 @@
67
67
  overflow: visible;
68
68
  }
69
69
 
70
+ /* "left" and "right" describe the left-to-right layout: start and end of the row – mirrored in right-to-left
71
+ (direction: "rtl", since 1.1.98). A column that must stay physically right needs its own class. */
70
72
  .ge-table-text-align-left {
71
- text-align: left;
73
+ text-align: start;
72
74
  }
73
75
 
74
76
  .ge-table-text-align-right {
77
+ text-align: end;
78
+ }
79
+
80
+ .ge-table-text-align-start {
81
+ text-align: start;
82
+ }
83
+
84
+ .ge-table-text-align-end {
85
+ text-align: end;
86
+ }
87
+
88
+ /* Latin text with punctuation in a right-to-left table ("Rossi S.p.A." would show as ".Rossi S.p.A"): every label gets
89
+ the direction of its own text (unicode-bidi: plaintext) and stays aligned to the start of the table (since 1.1.98). */
90
+ .ge-table-text-plaintext {
91
+ text-align: left;
92
+ }
93
+
94
+ .ge-table[dir="rtl"] .ge-table-text-plaintext:not(.ge-table[dir="rtl"] .ge-table[dir="ltr"] .ge-table-text-plaintext) {
75
95
  text-align: right;
76
96
  }
77
97
 
98
+ .ge-table-text-plaintext .ge-table-label {
99
+ unicode-bidi: plaintext;
100
+ }
101
+
78
102
  .ge-table-text-align-center {
79
103
  text-align: center;
80
104
  }
81
105
 
82
106
  /* Row checkbox */
83
107
  .ge-table-row-checkbox-div {
84
- padding-left: 14px;
108
+ padding-inline-start: 14px;
85
109
  }
86
110
  .ge-table-body-east {
87
111
  z-index: 999;
@@ -105,10 +129,10 @@
105
129
  overflow-y: auto;
106
130
  table th,
107
131
  table td {
108
- text-align: left;
132
+ text-align: start;
109
133
 
110
134
  &:nth-child(2) {
111
- padding-left: 12px;
135
+ padding-inline-start: 12px;
112
136
  }
113
137
  &.ge-table-crud-object-view-object-child {
114
138
  font-weight: bold;
@@ -145,7 +169,7 @@
145
169
  justify-items: stretch;
146
170
  label {
147
171
  align-self: end;
148
- text-align: right;
172
+ text-align: end;
149
173
  line-height: 2;
150
174
  }
151
175
  }
@@ -169,9 +193,9 @@
169
193
  }
170
194
 
171
195
 
172
- /* room for the sort icon (20px, absolute, right) – otherwise it covers right-aligned header labels */
196
+ /* room for the sort icon (20px, absolute, at the end) – otherwise it covers end-aligned header labels */
173
197
  .ge-table-col-div:has(> .ge-table-sorted-icon-div) .ge-table-label {
174
- padding-right: 22px;
198
+ padding-inline-end: 22px;
175
199
  }
176
200
 
177
201