@guiexpert/table 1.1.97 → 1.1.98

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/README.md CHANGED
@@ -58,6 +58,9 @@ 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
61
64
  - Custom Filtering
62
65
  - In-place Cell Editing
63
66
  - 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
 
@@ -623,13 +647,15 @@ html[data-theme="dark"] {
623
647
  }
624
648
  /* Fill handle and batch edit (since 1.1.96) – colors in table-color-vars.css (--ge-table-fill-*, --ge-table-cell-*) */
625
649
 
626
- /* the square at the bottom right corner of the selected range; its center sits on the corner */
650
+ /* the square at the bottom end corner of the selected range (right-to-left: bottom left); its center sits on it */
627
651
  .ge-table-fill-handle {
628
652
  position: absolute;
629
653
  z-index: 9000; /* above the cells, below the overlay (10000) */
630
654
  width: 7px;
631
655
  height: 7px;
632
- margin: -4px 0 0 -4px;
656
+ margin: 0;
657
+ margin-block-start: -4px;
658
+ margin-inline-start: -4px;
633
659
  box-sizing: border-box;
634
660
  background: var(--ge-table-fill-handle-color);
635
661
  border: 1px solid var(--ge-table-fill-handle-border);
@@ -664,6 +690,11 @@ html[data-theme="dark"] {
664
690
  background-image: linear-gradient(225deg, var(--ge-table-cell-pending-marker) 6px, transparent 6px);
665
691
  }
666
692
 
693
+ /* right-to-left: the corner mark at the top end (left) */
694
+ .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) {
695
+ background-image: linear-gradient(135deg, var(--ge-table-cell-pending-marker) 6px, transparent 6px);
696
+ }
697
+
667
698
  /* the color only while the cell is not selected – a selected cell keeps the selection color (and the corner mark) */
668
699
  .ge-table-col-div.ge-table-cell-pending:not([class*="-selected-range"]) {
669
700
  background-color: var(--ge-table-cell-pending-bg);
@@ -774,6 +805,26 @@ html[data-theme="dark"] {
774
805
  .ge-table-detail-toggle.ge-table-detail-toggle-expanded::before {
775
806
  transform: rotate(90deg);
776
807
  }
808
+
809
+ /* right-to-left (since 1.1.98): the triangle points to the left, expanded down */
810
+ .ge-table[dir="rtl"] .ge-table-detail-toggle:not(.ge-table[dir="rtl"] .ge-table[dir="ltr"] .ge-table-detail-toggle)::before {
811
+ border-width: 4px 6px 4px 0;
812
+ border-color: transparent var(--ge-table-detail-toggle-color) transparent transparent;
813
+ }
814
+
815
+ .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 {
816
+ transform: rotate(-90deg);
817
+ }
818
+
819
+ /* right-to-left (since 1.1.98): the triangle points to the left, expanded down */
820
+ .ge-table[dir="rtl"] .ge-table-detail-toggle:not(.ge-table[dir="rtl"] .ge-table[dir="ltr"] .ge-table-detail-toggle)::before {
821
+ border-width: 4px 6px 4px 0;
822
+ border-color: transparent var(--ge-table-detail-toggle-color) transparent transparent;
823
+ }
824
+
825
+ .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 {
826
+ transform: rotate(-90deg);
827
+ }
777
828
  /* Pivot tables (PivotFactory / AreaModelPivot, since 1.1.94) */
778
829
 
779
830
  /* every value cell: numbers on the end side, same digit widths */
@@ -925,23 +976,23 @@ html[data-theme="dark"] {
925
976
  /* Tree table */
926
977
 
927
978
  .ge-table-col-div.ge-table-col-div-0.ge-table-tree-cell {
928
- text-align: left;
979
+ text-align: start;
929
980
  }
930
981
 
931
982
  .ge-table-tree-cell .ge-table-label-div {
932
- padding-left: 0;
933
- padding-right: 10px;
983
+ padding-inline-start: 0;
984
+ padding-inline-end: 10px;
934
985
  display: inline;
935
986
  }
936
987
 
937
988
 
938
989
  .ge-table-col-tree {
939
- text-align: left;
990
+ text-align: start;
940
991
  }
941
992
 
942
993
  /* Row numbers (RowNumberColumnDef) in a tree: no tree look – right aligned like in a flat table (since 1.1.93) */
943
994
  .ge-table-col-div.ge-table-row-number.ge-table-tree-cell {
944
- text-align: right;
995
+ text-align: end;
945
996
  }
946
997
  .ge-table-row-number.ge-table-tree-cell .ge-table-label-div {
947
998
  display: block;
@@ -949,47 +1000,47 @@ html[data-theme="dark"] {
949
1000
  }
950
1001
 
951
1002
  .ge-padding-property-checkbox {
952
- padding-left: 0;
1003
+ padding-inline-start: 0;
953
1004
  }
954
1005
 
955
1006
  .ge-table-col-tree.ge-table-tree-deep-0 {
956
- padding-left: 16px;
1007
+ padding-inline-start: 16px;
957
1008
  }
958
1009
 
959
1010
  .ge-table-col-tree.ge-table-tree-deep-1 {
960
- padding-left: 36px;
1011
+ padding-inline-start: 36px;
961
1012
  }
962
1013
 
963
1014
  .ge-table-col-tree.ge-table-tree-deep-2 {
964
- padding-left: 56px;
1015
+ padding-inline-start: 56px;
965
1016
  }
966
1017
 
967
1018
  .ge-table-col-tree.ge-table-tree-deep-3 {
968
- padding-left: 76px;
1019
+ padding-inline-start: 76px;
969
1020
  }
970
1021
 
971
1022
  .ge-table-col-tree.ge-table-tree-deep-4 {
972
- padding-left: 96px;
1023
+ padding-inline-start: 96px;
973
1024
  }
974
1025
 
975
1026
  .ge-table-col-tree.ge-table-tree-deep-5 {
976
- padding-left: 116px;
1027
+ padding-inline-start: 116px;
977
1028
  }
978
1029
 
979
1030
  .ge-table-col-tree.ge-table-tree-deep-6 {
980
- padding-left: 136px;
1031
+ padding-inline-start: 136px;
981
1032
  }
982
1033
 
983
1034
  .ge-table-col-tree.ge-table-tree-deep-7 {
984
- padding-left: 156px;
1035
+ padding-inline-start: 156px;
985
1036
  }
986
1037
 
987
1038
  .ge-table-col-tree.ge-table-tree-deep-8 {
988
- padding-left: 176px;
1039
+ padding-inline-start: 176px;
989
1040
  }
990
1041
 
991
1042
  .ge-table-col-tree.ge-table-tree-deep-9 {
992
- padding-left: 196px;
1043
+ padding-inline-start: 196px;
993
1044
  }
994
1045
 
995
1046
  .ge-table-col-div.ge-table-col-tree.ge-table-tree-cell {
@@ -1000,3 +1051,10 @@ html[data-theme="dark"] {
1000
1051
  display: grid;
1001
1052
  grid-template-columns: 16px 20px 1fr;
1002
1053
  }
1054
+
1055
+ /* Right-to-left (direction: "rtl", since 1.1.98): the arrow ">" is mirrored by the browser ("<"), so the expanded
1056
+ arrow of the default icon turns the other way (its transform is an inline style: !important). */
1057
+ .ge-table[dir="rtl"] .gt-table-tree-arrow-expanded:not(.ge-table[dir="rtl"] .ge-table[dir="ltr"] .gt-table-tree-arrow-expanded) {
1058
+ transform: rotate(-90deg) translate(-66%, -66%) !important;
1059
+ transform-origin: 100% 0 !important;
1060
+ }
@@ -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
 
@@ -1,12 +1,14 @@
1
1
  /* Fill handle and batch edit (since 1.1.96) – colors in table-color-vars.css (--ge-table-fill-*, --ge-table-cell-*) */
2
2
 
3
- /* the square at the bottom right corner of the selected range; its center sits on the corner */
3
+ /* the square at the bottom end corner of the selected range (right-to-left: bottom left); its center sits on it */
4
4
  .ge-table-fill-handle {
5
5
  position: absolute;
6
6
  z-index: 9000; /* above the cells, below the overlay (10000) */
7
7
  width: 7px;
8
8
  height: 7px;
9
- margin: -4px 0 0 -4px;
9
+ margin: 0;
10
+ margin-block-start: -4px;
11
+ margin-inline-start: -4px;
10
12
  box-sizing: border-box;
11
13
  background: var(--ge-table-fill-handle-color);
12
14
  border: 1px solid var(--ge-table-fill-handle-border);
@@ -41,6 +43,11 @@
41
43
  background-image: linear-gradient(225deg, var(--ge-table-cell-pending-marker) 6px, transparent 6px);
42
44
  }
43
45
 
46
+ /* right-to-left: the corner mark at the top end (left) */
47
+ .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) {
48
+ background-image: linear-gradient(135deg, var(--ge-table-cell-pending-marker) 6px, transparent 6px);
49
+ }
50
+
44
51
  /* the color only while the cell is not selected – a selected cell keeps the selection color (and the corner mark) */
45
52
  .ge-table-col-div.ge-table-cell-pending:not([class*="-selected-range"]) {
46
53
  background-color: var(--ge-table-cell-pending-bg);
@@ -93,3 +93,23 @@
93
93
  .ge-table-detail-toggle.ge-table-detail-toggle-expanded::before {
94
94
  transform: rotate(90deg);
95
95
  }
96
+
97
+ /* right-to-left (since 1.1.98): the triangle points to the left, expanded down */
98
+ .ge-table[dir="rtl"] .ge-table-detail-toggle:not(.ge-table[dir="rtl"] .ge-table[dir="ltr"] .ge-table-detail-toggle)::before {
99
+ border-width: 4px 6px 4px 0;
100
+ border-color: transparent var(--ge-table-detail-toggle-color) transparent transparent;
101
+ }
102
+
103
+ .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 {
104
+ transform: rotate(-90deg);
105
+ }
106
+
107
+ /* right-to-left (since 1.1.98): the triangle points to the left, expanded down */
108
+ .ge-table[dir="rtl"] .ge-table-detail-toggle:not(.ge-table[dir="rtl"] .ge-table[dir="ltr"] .ge-table-detail-toggle)::before {
109
+ border-width: 4px 6px 4px 0;
110
+ border-color: transparent var(--ge-table-detail-toggle-color) transparent transparent;
111
+ }
112
+
113
+ .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 {
114
+ transform: rotate(-90deg);
115
+ }
@@ -1,23 +1,23 @@
1
1
  /* Tree table */
2
2
 
3
3
  .ge-table-col-div.ge-table-col-div-0.ge-table-tree-cell {
4
- text-align: left;
4
+ text-align: start;
5
5
  }
6
6
 
7
7
  .ge-table-tree-cell .ge-table-label-div {
8
- padding-left: 0;
9
- padding-right: 10px;
8
+ padding-inline-start: 0;
9
+ padding-inline-end: 10px;
10
10
  display: inline;
11
11
  }
12
12
 
13
13
 
14
14
  .ge-table-col-tree {
15
- text-align: left;
15
+ text-align: start;
16
16
  }
17
17
 
18
18
  /* Row numbers (RowNumberColumnDef) in a tree: no tree look – right aligned like in a flat table (since 1.1.93) */
19
19
  .ge-table-col-div.ge-table-row-number.ge-table-tree-cell {
20
- text-align: right;
20
+ text-align: end;
21
21
  }
22
22
  .ge-table-row-number.ge-table-tree-cell .ge-table-label-div {
23
23
  display: block;
@@ -25,47 +25,47 @@
25
25
  }
26
26
 
27
27
  .ge-padding-property-checkbox {
28
- padding-left: 0;
28
+ padding-inline-start: 0;
29
29
  }
30
30
 
31
31
  .ge-table-col-tree.ge-table-tree-deep-0 {
32
- padding-left: 16px;
32
+ padding-inline-start: 16px;
33
33
  }
34
34
 
35
35
  .ge-table-col-tree.ge-table-tree-deep-1 {
36
- padding-left: 36px;
36
+ padding-inline-start: 36px;
37
37
  }
38
38
 
39
39
  .ge-table-col-tree.ge-table-tree-deep-2 {
40
- padding-left: 56px;
40
+ padding-inline-start: 56px;
41
41
  }
42
42
 
43
43
  .ge-table-col-tree.ge-table-tree-deep-3 {
44
- padding-left: 76px;
44
+ padding-inline-start: 76px;
45
45
  }
46
46
 
47
47
  .ge-table-col-tree.ge-table-tree-deep-4 {
48
- padding-left: 96px;
48
+ padding-inline-start: 96px;
49
49
  }
50
50
 
51
51
  .ge-table-col-tree.ge-table-tree-deep-5 {
52
- padding-left: 116px;
52
+ padding-inline-start: 116px;
53
53
  }
54
54
 
55
55
  .ge-table-col-tree.ge-table-tree-deep-6 {
56
- padding-left: 136px;
56
+ padding-inline-start: 136px;
57
57
  }
58
58
 
59
59
  .ge-table-col-tree.ge-table-tree-deep-7 {
60
- padding-left: 156px;
60
+ padding-inline-start: 156px;
61
61
  }
62
62
 
63
63
  .ge-table-col-tree.ge-table-tree-deep-8 {
64
- padding-left: 176px;
64
+ padding-inline-start: 176px;
65
65
  }
66
66
 
67
67
  .ge-table-col-tree.ge-table-tree-deep-9 {
68
- padding-left: 196px;
68
+ padding-inline-start: 196px;
69
69
  }
70
70
 
71
71
  .ge-table-col-div.ge-table-col-tree.ge-table-tree-cell {
@@ -76,3 +76,10 @@
76
76
  display: grid;
77
77
  grid-template-columns: 16px 20px 1fr;
78
78
  }
79
+
80
+ /* Right-to-left (direction: "rtl", since 1.1.98): the arrow ">" is mirrored by the browser ("<"), so the expanded
81
+ arrow of the default icon turns the other way (its transform is an inline style: !important). */
82
+ .ge-table[dir="rtl"] .gt-table-tree-arrow-expanded:not(.ge-table[dir="rtl"] .ge-table[dir="ltr"] .gt-table-tree-arrow-expanded) {
83
+ transform: rotate(-90deg) translate(-66%, -66%) !important;
84
+ transform-origin: 100% 0 !important;
85
+ }