@_linked/shape-ui 2.0.0 → 2.3.0

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 (207) hide show
  1. package/lib/esm/columns.d.ts +58 -0
  2. package/lib/esm/columns.js +173 -0
  3. package/lib/esm/columns.js.map +1 -0
  4. package/lib/esm/components/AddInstanceForms.d.ts +38 -0
  5. package/lib/esm/components/AddInstanceForms.js +143 -0
  6. package/lib/esm/components/AddInstanceForms.js.map +1 -0
  7. package/lib/esm/components/AddInstanceForms.module.css +12 -0
  8. package/lib/esm/components/BatchEditDrawer.d.ts +13 -0
  9. package/lib/esm/components/BatchEditDrawer.js +122 -0
  10. package/lib/esm/components/BatchEditDrawer.js.map +1 -0
  11. package/lib/esm/components/BatchEditDrawer.module.css +193 -0
  12. package/lib/esm/components/CustomMultiSelect.d.ts +26 -0
  13. package/lib/esm/components/CustomMultiSelect.js +344 -0
  14. package/lib/esm/components/CustomMultiSelect.js.map +1 -0
  15. package/lib/esm/components/CustomMultiSelect.module.css +291 -0
  16. package/lib/esm/components/DynamicFormField.d.ts +21 -0
  17. package/lib/esm/components/DynamicFormField.js +149 -0
  18. package/lib/esm/components/DynamicFormField.js.map +1 -0
  19. package/lib/esm/components/DynamicFormField.module.css +169 -0
  20. package/lib/esm/components/EditInstanceForms.d.ts +15 -0
  21. package/lib/esm/components/EditInstanceForms.js +118 -0
  22. package/lib/esm/components/EditInstanceForms.js.map +1 -0
  23. package/lib/esm/components/FilterBadge.d.ts +20 -0
  24. package/lib/esm/components/FilterBadge.js +26 -0
  25. package/lib/esm/components/FilterBadge.js.map +1 -0
  26. package/lib/esm/components/FilterBadge.module.css +25 -0
  27. package/lib/esm/components/FormField.d.ts +18 -0
  28. package/lib/esm/components/FormField.js +9 -0
  29. package/lib/esm/components/FormField.js.map +1 -0
  30. package/lib/esm/components/FormField.module.css +57 -0
  31. package/lib/esm/components/InstanceDeletionDialog.d.ts +17 -0
  32. package/lib/esm/components/InstanceDeletionDialog.js +83 -0
  33. package/lib/esm/components/InstanceDeletionDialog.js.map +1 -0
  34. package/lib/esm/components/InstanceDeletionDialog.module.css +59 -0
  35. package/lib/esm/components/InstanceOverview.d.ts +43 -0
  36. package/lib/esm/components/InstanceOverview.js +236 -0
  37. package/lib/esm/components/InstanceOverview.js.map +1 -0
  38. package/lib/esm/components/InstanceOverview.module.css +35 -0
  39. package/lib/esm/components/InstanceView.d.ts +29 -0
  40. package/lib/esm/components/InstanceView.js +97 -0
  41. package/lib/esm/components/InstanceView.js.map +1 -0
  42. package/lib/esm/components/InstanceView.module.css +157 -0
  43. package/lib/esm/components/NodeBadge.d.ts +25 -0
  44. package/lib/esm/components/NodeBadge.js +29 -0
  45. package/lib/esm/components/NodeBadge.js.map +1 -0
  46. package/lib/esm/components/NodeValuesEditor.d.ts +15 -0
  47. package/lib/esm/components/NodeValuesEditor.js +29 -0
  48. package/lib/esm/components/NodeValuesEditor.js.map +1 -0
  49. package/lib/esm/components/NodeValuesEditor.module.css +4 -0
  50. package/lib/esm/components/ReactTable.d.ts +59 -0
  51. package/lib/esm/components/ReactTable.js +378 -0
  52. package/lib/esm/components/ReactTable.js.map +1 -0
  53. package/lib/esm/components/ReactTable.module.css +950 -0
  54. package/lib/esm/components/TextfieldEditor.d.ts +1 -2
  55. package/lib/esm/components/TextfieldEditor.js +2 -2
  56. package/lib/esm/components/TextfieldEditor.js.map +1 -1
  57. package/lib/esm/components/forms.module.css +96 -0
  58. package/lib/esm/host.d.ts +196 -0
  59. package/lib/esm/host.js +25 -0
  60. package/lib/esm/host.js.map +1 -0
  61. package/lib/esm/hostContext.d.ts +34 -0
  62. package/lib/esm/hostContext.js +95 -0
  63. package/lib/esm/hostContext.js.map +1 -0
  64. package/lib/esm/index.d.ts +60 -10
  65. package/lib/esm/index.js +60 -14
  66. package/lib/esm/index.js.map +1 -1
  67. package/lib/esm/read.d.ts +48 -0
  68. package/lib/esm/read.js +96 -0
  69. package/lib/esm/read.js.map +1 -0
  70. package/lib/esm/search.d.ts +32 -0
  71. package/lib/esm/search.js +87 -0
  72. package/lib/esm/search.js.map +1 -0
  73. package/lib/esm/shape/contracts.d.ts +58 -0
  74. package/lib/esm/shape/contracts.js +15 -0
  75. package/lib/esm/shape/contracts.js.map +1 -0
  76. package/lib/esm/shape/naming.d.ts +30 -0
  77. package/lib/esm/shape/naming.js +52 -0
  78. package/lib/esm/shape/naming.js.map +1 -0
  79. package/lib/esm/shape/nodeDisplay.d.ts +36 -0
  80. package/lib/esm/shape/nodeDisplay.js +117 -0
  81. package/lib/esm/shape/nodeDisplay.js.map +1 -0
  82. package/lib/esm/shape/propertyTypes.d.ts +12 -0
  83. package/lib/esm/shape/propertyTypes.js +60 -0
  84. package/lib/esm/shape/propertyTypes.js.map +1 -0
  85. package/lib/esm/shape/propertyVisibility.d.ts +56 -0
  86. package/lib/esm/shape/propertyVisibility.js +112 -0
  87. package/lib/esm/shape/propertyVisibility.js.map +1 -0
  88. package/lib/esm/shape/shapeDependencies.d.ts +41 -0
  89. package/lib/esm/shape/shapeDependencies.js +141 -0
  90. package/lib/esm/shape/shapeDependencies.js.map +1 -0
  91. package/lib/esm/shape/tableFilters.d.ts +35 -0
  92. package/lib/esm/shape/tableFilters.js +171 -0
  93. package/lib/esm/shape/tableFilters.js.map +1 -0
  94. package/lib/esm/shape/useFormDependencies.d.ts +38 -0
  95. package/lib/esm/shape/useFormDependencies.js +178 -0
  96. package/lib/esm/shape/useFormDependencies.js.map +1 -0
  97. package/lib/esm/shape/validation.d.ts +15 -0
  98. package/lib/esm/shape/validation.js +106 -0
  99. package/lib/esm/shape/validation.js.map +1 -0
  100. package/lib/esm/tokens.css +25 -0
  101. package/lib/esm/types.d.ts +22 -0
  102. package/lib/esm/types.js +1 -0
  103. package/lib/esm/types.js.map +1 -0
  104. package/lib/esm/write.d.ts +51 -0
  105. package/lib/esm/write.js +99 -0
  106. package/lib/esm/write.js.map +1 -0
  107. package/package.json +44 -18
  108. package/src/backend.ts +1 -0
  109. package/src/columns.regression.test.ts +143 -0
  110. package/src/columns.test.ts +200 -0
  111. package/src/columns.ts +228 -0
  112. package/src/components/AddInstanceForms.module.css +12 -0
  113. package/src/components/AddInstanceForms.tsx +321 -0
  114. package/src/components/AvatarEditor.tsx +34 -0
  115. package/src/components/BatchEditDrawer.module.css +193 -0
  116. package/src/components/BatchEditDrawer.tsx +295 -0
  117. package/src/components/CheckboxEditor.module.css +6 -0
  118. package/src/components/CheckboxEditor.tsx +86 -0
  119. package/src/components/CustomMultiSelect.module.css +291 -0
  120. package/src/components/CustomMultiSelect.tsx +527 -0
  121. package/src/components/DateEditor.tsx +50 -0
  122. package/src/components/DynamicFormField.module.css +169 -0
  123. package/src/components/DynamicFormField.tsx +357 -0
  124. package/src/components/EditInstanceForms.tsx +260 -0
  125. package/src/components/FilterBadge.module.css +25 -0
  126. package/src/components/FilterBadge.tsx +70 -0
  127. package/src/components/FormField.module.css +57 -0
  128. package/src/components/FormField.tsx +59 -0
  129. package/src/components/ImageValueEditor.module.css +3 -0
  130. package/src/components/ImageValueEditor.tsx +82 -0
  131. package/src/components/InstanceDeletionDialog.module.css +59 -0
  132. package/src/components/InstanceDeletionDialog.tsx +175 -0
  133. package/src/components/InstanceOverview.module.css +35 -0
  134. package/src/components/InstanceOverview.tsx +385 -0
  135. package/src/components/InstanceView.module.css +157 -0
  136. package/src/components/InstanceView.tsx +212 -0
  137. package/src/components/NodeBadge.tsx +60 -0
  138. package/src/components/NodeValuesEditor.module.css +4 -0
  139. package/src/components/NodeValuesEditor.tsx +64 -0
  140. package/src/components/RadioButtonEditor.module.css +22 -0
  141. package/src/components/RadioButtonEditor.tsx +96 -0
  142. package/src/components/ReactTable.module.css +950 -0
  143. package/src/components/ReactTable.tsx +1013 -0
  144. package/src/components/SelectEditor.tsx +85 -0
  145. package/src/components/ShapeTable.module.css +394 -0
  146. package/src/components/SwitchEditor.tsx +60 -0
  147. package/src/components/TextareaEditor.tsx +55 -0
  148. package/src/components/TextfieldEditor.tsx +67 -0
  149. package/src/components/ToggleEditor.tsx +63 -0
  150. package/src/components/forms.module.css +96 -0
  151. package/src/host.ts +226 -0
  152. package/src/hostContext.tsx +114 -0
  153. package/src/index.ts +93 -0
  154. package/src/package.ts +21 -0
  155. package/src/read.ts +148 -0
  156. package/src/search.test.ts +174 -0
  157. package/src/search.ts +108 -0
  158. package/src/shape/contracts.ts +66 -0
  159. package/src/shape/naming.ts +52 -0
  160. package/src/shape/nodeDisplay.ts +114 -0
  161. package/src/shape/propertyTypes.ts +86 -0
  162. package/src/shape/propertyVisibility.ts +180 -0
  163. package/src/shape/shapeDependencies.ts +183 -0
  164. package/src/shape/tableFilters.ts +223 -0
  165. package/src/shape/types.ts +1158 -0
  166. package/src/shape/useFormDependencies.ts +257 -0
  167. package/src/shape/validation.ts +121 -0
  168. package/src/tokens.css +25 -0
  169. package/src/types.ts +20 -0
  170. package/src/utils/helper.ts +35 -0
  171. package/src/write.test.ts +174 -0
  172. package/src/write.ts +114 -0
  173. package/.changeset/README.md +0 -20
  174. package/.changeset/config.json +0 -14
  175. package/.github/workflows/changeset-check.yml +0 -44
  176. package/.github/workflows/ci.yml +0 -43
  177. package/.github/workflows/publish.yml +0 -158
  178. package/CHANGELOG.md +0 -30
  179. package/lib/esm/components/AvatarEditor.d.ts +0 -20
  180. package/lib/esm/components/AvatarEditor.js +0 -7
  181. package/lib/esm/components/AvatarEditor.js.map +0 -1
  182. package/lib/esm/components/CheckboxEditor.d.ts +0 -21
  183. package/lib/esm/components/CheckboxEditor.js +0 -44
  184. package/lib/esm/components/CheckboxEditor.js.map +0 -1
  185. package/lib/esm/components/DateEditor.d.ts +0 -20
  186. package/lib/esm/components/DateEditor.js +0 -22
  187. package/lib/esm/components/DateEditor.js.map +0 -1
  188. package/lib/esm/components/RadioButtonEditor.d.ts +0 -23
  189. package/lib/esm/components/RadioButtonEditor.js +0 -41
  190. package/lib/esm/components/RadioButtonEditor.js.map +0 -1
  191. package/lib/esm/components/SelectEditor.d.ts +0 -21
  192. package/lib/esm/components/SelectEditor.js +0 -30
  193. package/lib/esm/components/SelectEditor.js.map +0 -1
  194. package/lib/esm/components/SwitchEditor.d.ts +0 -21
  195. package/lib/esm/components/SwitchEditor.js +0 -23
  196. package/lib/esm/components/SwitchEditor.js.map +0 -1
  197. package/lib/esm/components/TextareaEditor.d.ts +0 -23
  198. package/lib/esm/components/TextareaEditor.js +0 -15
  199. package/lib/esm/components/TextareaEditor.js.map +0 -1
  200. package/lib/esm/components/ToggleEditor.d.ts +0 -22
  201. package/lib/esm/components/ToggleEditor.js +0 -23
  202. package/lib/esm/components/ToggleEditor.js.map +0 -1
  203. package/lib/esm/ontologies/lincd-ui.d.ts +0 -6
  204. package/lib/esm/ontologies/lincd-ui.js +0 -18
  205. package/lib/esm/ontologies/lincd-ui.js.map +0 -1
  206. package/tsconfig-cjs.json +0 -8
  207. package/tsconfig-esm.json +0 -9
@@ -0,0 +1,950 @@
1
+ /* ============================================================================
2
+ ReactTable.module.css
3
+
4
+ Data table component with sorting, filtering, and pagination.
5
+ Uses semantic tokens from theme.css.
6
+ ============================================================================ */
7
+
8
+ /* === Action Bar (above table) === */
9
+ .action {
10
+ display: flex;
11
+ justify-content: flex-start;
12
+ align-items: center;
13
+ gap: var(--surface-gap);
14
+ margin-bottom: 0;
15
+ padding: var(--space-md) var(--space-md);
16
+ border-radius: var(--radius-box) var(--radius-surface) 0 0;
17
+ overflow: visible;
18
+ }
19
+
20
+ .action.withBorder {
21
+ border-bottom: 1px solid var(--table-row-border);
22
+ }
23
+
24
+ /* === Table Mode Toggle === */
25
+ .tableModeToggle {
26
+ display: flex;
27
+ gap: 2px;
28
+ margin-left: var(--space-xs);
29
+ }
30
+
31
+ /* === Filter Drawer === */
32
+ .filterDrawer {
33
+ position: fixed !important;
34
+ top: 0 !important;
35
+ right: 0 !important;
36
+ bottom: 0 !important;
37
+ left: auto !important;
38
+ height: 100vh !important;
39
+ max-height: 100vh !important;
40
+ width: 320px !important;
41
+ min-width: 320px !important;
42
+ background-color: var(--surface-bg) !important;
43
+ border-left: 1px solid var(--surface-border) !important;
44
+ box-shadow: -4px 0 24px rgba(0, 0, 0, 0.15) !important;
45
+ /* Square corners on right, curved on left */
46
+ border-radius: var(--radius-surface) 0 0 var(--radius-surface) !important;
47
+ }
48
+
49
+ .filterDrawerContent {
50
+ display: flex;
51
+ flex-direction: column;
52
+ height: 100%;
53
+ }
54
+
55
+ .filterDrawerHeader {
56
+ padding: var(--space-lg) !important;
57
+ border-bottom: 1px solid var(--surface-border);
58
+ text-align: left !important;
59
+ }
60
+
61
+ .filterDrawerHeader h2,
62
+ .filterDrawerHeader [class*='Title'] {
63
+ color: var(--heading-color);
64
+ margin-bottom: var(--space-xs);
65
+ }
66
+
67
+ .filterDrawerHeader p,
68
+ .filterDrawerHeader [class*='Description'] {
69
+ color: var(--table-cell-text);
70
+ color: var(--text-auxiliary);
71
+ }
72
+
73
+ .filterDrawerBody {
74
+ flex: 1;
75
+ padding: var(--space-lg);
76
+ overflow-y: auto;
77
+ }
78
+
79
+ .filterDrawerFooter {
80
+ padding: var(--space-lg) !important;
81
+ border-top: 1px solid var(--surface-border);
82
+ display: flex;
83
+ gap: var(--space-sm);
84
+ justify-content: flex-end;
85
+ }
86
+
87
+ /* Dark mode for filter drawer */
88
+ [data-theme='dark'] .filterDrawer {
89
+ background-color: var(--surface-bg) !important;
90
+ border-left-color: var(--surface-border) !important;
91
+ box-shadow: -4px 0 24px rgba(0, 0, 0, 0.4) !important;
92
+ }
93
+
94
+ [data-theme='dark'] .filterDrawerHeader {
95
+ border-bottom-color: var(--surface-border);
96
+ }
97
+
98
+ [data-theme='dark'] .filterDrawerHeader h2,
99
+ [data-theme='dark'] .filterDrawerHeader [class*='Title'] {
100
+ color: var(--react-table-gray-50, var(--color-gray-50));
101
+ }
102
+
103
+ [data-theme='dark'] .filterDrawerHeader p,
104
+ [data-theme='dark'] .filterDrawerHeader [class*='Description'] {
105
+ color: var(--react-table-gray-400, var(--color-gray-400));
106
+ }
107
+
108
+ [data-theme='dark'] .filterDrawerFooter {
109
+ border-top-color: var(--surface-border);
110
+ }
111
+
112
+ /* === Selection Bar (batch operations) === */
113
+ .selectionBar {
114
+ display: flex;
115
+ align-items: center;
116
+ justify-content: space-between;
117
+ gap: var(--space-md);
118
+ padding: var(--space-sm) var(--space-md);
119
+ background-color: color-mix(in srgb, var(--react-table-tertiary-500, var(--color-tertiary-500)) 8%, var(--surface-bg));
120
+ border-bottom: 1px solid color-mix(in srgb, var(--react-table-tertiary-500, var(--color-tertiary-500)) 30%, transparent);
121
+ overflow: hidden;
122
+ }
123
+
124
+ .selectionCount {
125
+ font-size: var(--typography-small-size);
126
+ font-weight: 600;
127
+ color: var(--react-table-tertiary-500, var(--color-tertiary-500));
128
+ white-space: nowrap;
129
+ }
130
+
131
+ .selectionActions {
132
+ display: flex;
133
+ align-items: center;
134
+ gap: var(--space-sm);
135
+ }
136
+
137
+ /* === Batch Result Bar === */
138
+ .batchResultBar {
139
+ display: flex;
140
+ align-items: center;
141
+ justify-content: space-between;
142
+ gap: var(--space-md);
143
+ padding: var(--space-sm) var(--space-md);
144
+ background-color: color-mix(in srgb, var(--react-table-green-500, var(--color-green-500)) 10%, var(--surface-bg));
145
+ border-bottom: 1px solid color-mix(in srgb, var(--react-table-green-500, var(--color-green-500)) 30%, transparent);
146
+ font-size: var(--typography-small-size);
147
+ color: var(--react-table-green-600, var(--color-green-600));
148
+ overflow: hidden;
149
+ }
150
+
151
+ .batchResultError {
152
+ background-color: color-mix(in srgb, var(--react-table-red-500, var(--color-red-500)) 8%, var(--surface-bg));
153
+ border-bottom-color: color-mix(in srgb, var(--react-table-red-500, var(--color-red-500)) 30%, transparent);
154
+ color: var(--intent-danger-text);
155
+ }
156
+
157
+ .batchResultDismiss {
158
+ display: flex;
159
+ align-items: center;
160
+ background: none;
161
+ border: none;
162
+ color: inherit;
163
+ cursor: pointer;
164
+ padding: var(--space-xs);
165
+ border-radius: var(--radius-field);
166
+ transition: background-color var(--transition-fast);
167
+ }
168
+
169
+ .batchResultDismiss:hover {
170
+ background-color: rgba(0, 0, 0, 0.05);
171
+ }
172
+
173
+ [data-theme='dark'] .batchResultBar {
174
+ color: var(--react-table-green-400, var(--color-green-400));
175
+ }
176
+
177
+ [data-theme='dark'] .batchResultError {
178
+ color: var(--react-table-red-400, var(--color-red-400));
179
+ }
180
+
181
+ [data-theme='dark'] .batchResultDismiss:hover {
182
+ background-color: rgba(255, 255, 255, 0.05);
183
+ }
184
+
185
+ /* === Table Wrapper === */
186
+ .tableWrapper {
187
+ display: flex;
188
+ flex-direction: column;
189
+ background-color: var(--surface-bg);
190
+ border: 1px solid var(--surface-border);
191
+ border-radius: var(--radius-box);
192
+ position: relative;
193
+ isolation: isolate;
194
+ }
195
+
196
+ /* === Delete Button === */
197
+ .deleteDataButton {
198
+ color: var(--intent-danger-text) !important;
199
+ border-color: var(--intent-danger-border) !important;
200
+
201
+ &:hover {
202
+ color: #fff !important;
203
+ background-color: var(--react-table-red-500, var(--color-red-500)) !important;
204
+ }
205
+ }
206
+
207
+ /* === Table Bar (filters row) === */
208
+ .tableBar {
209
+ display: flex;
210
+ align-items: center;
211
+ justify-content: space-between;
212
+ gap: var(--space-lg);
213
+ border-bottom: 1px solid var(--table-row-border);
214
+ padding: var(--space-sm) var(--space-md);
215
+ background-color: var(--table-header-bg);
216
+ overflow: hidden;
217
+ }
218
+
219
+ .filterBar {
220
+ display: flex;
221
+ gap: var(--surface-gap);
222
+ align-items: center;
223
+ flex: 1;
224
+ min-height: 40px;
225
+ }
226
+
227
+ .filterLabel {
228
+ color: var(--react-table-gray-500, var(--color-gray-500));
229
+ font-size: var(--typography-large-size);
230
+ }
231
+
232
+ [data-theme='dark'] .filterLabel {
233
+ color: var(--react-table-gray-400, var(--color-gray-400));
234
+ }
235
+
236
+ /* === Tab Filters (All Items, High Priority, Completed) === */
237
+ .tabFilters {
238
+ display: flex;
239
+ align-items: center;
240
+ gap: 0.25rem;
241
+ padding: 0.25rem;
242
+ background-color: var(--field-bg);
243
+ border-radius: var(--radius-full);
244
+ }
245
+
246
+ .tabButton {
247
+ padding: var(--space-sm) 1rem;
248
+ border-radius: var(--radius-full);
249
+ font-size: var(--typography-small-size);
250
+ font-weight: 500;
251
+ color: var(--table-cell-text);
252
+ background-color: transparent;
253
+ border: none;
254
+ cursor: pointer;
255
+ transition: all var(--transition-fast);
256
+
257
+ &:hover {
258
+ background-color: var(--list-item-bg-hover);
259
+ }
260
+
261
+ &.active {
262
+ background-color: var(--surface-bg);
263
+ color: var(--text-primary);
264
+ color: var(--table-cell-text-primary);
265
+ box-shadow: var(--surface-shadow);
266
+ }
267
+ }
268
+
269
+ /* === Filter/Sort Icons === */
270
+ .tableActions {
271
+ display: flex;
272
+ align-items: center;
273
+ gap: var(--space-sm);
274
+ color: var(--react-table-gray-400, var(--color-gray-400));
275
+
276
+ span,
277
+ button {
278
+ cursor: pointer;
279
+ padding: var(--space-sm);
280
+ border-radius: var(--radius-field);
281
+ transition: all var(--transition-fast);
282
+
283
+ &:hover {
284
+ color: var(--react-table-tertiary-500, var(--color-tertiary-500));
285
+ background-color: var(--list-item-bg-hover);
286
+ }
287
+ }
288
+ }
289
+
290
+ /* === Table Container === */
291
+ .tableContainer {
292
+ width: 100%;
293
+ max-height: 600px;
294
+ overflow: auto;
295
+ }
296
+
297
+ /* Custom scrollbar styling */
298
+ .tableContainer::-webkit-scrollbar {
299
+ width: 12px;
300
+ height: 12px;
301
+ }
302
+
303
+ .tableContainer::-webkit-scrollbar-track {
304
+ background: var(--surface-bg);
305
+ }
306
+
307
+ .tableContainer::-webkit-scrollbar-thumb {
308
+ background: var(--react-table-gray-300, var(--color-gray-300));
309
+ border-radius: 6px;
310
+ border: 3px solid var(--surface-bg);
311
+ }
312
+
313
+ .tableContainer::-webkit-scrollbar-thumb:hover {
314
+ background: var(--react-table-gray-400, var(--color-gray-400));
315
+ }
316
+
317
+ .tableContainer::-webkit-scrollbar-corner {
318
+ background: var(--surface-bg);
319
+ }
320
+
321
+ /* === Table === */
322
+ .table {
323
+ width: 100%;
324
+ table-layout: auto;
325
+ border-collapse: collapse;
326
+ border-spacing: 0;
327
+ }
328
+
329
+ /* === Table Row === */
330
+ .tr {
331
+ display: table-row;
332
+ }
333
+
334
+ /* === Cell Value States === */
335
+ .green {
336
+ color: var(--react-table-green-600, var(--color-green-600));
337
+ }
338
+
339
+ .red {
340
+ color: var(--react-table-red-500, var(--color-red-500));
341
+ }
342
+
343
+ /* === Table Header === */
344
+ thead th {
345
+ position: sticky;
346
+ top: 0;
347
+ background-color: var(--table-header-bg);
348
+ color: var(--table-header-text);
349
+ font-size: var(--typography-small-size);
350
+ font-weight: 600;
351
+ text-transform: uppercase;
352
+ letter-spacing: 0.05em;
353
+ padding: var(--space-lg) 1.5rem;
354
+ text-align: left;
355
+ border-bottom: 1px solid var(--table-header-border);
356
+ white-space: nowrap;
357
+ }
358
+
359
+ .th {
360
+ cursor: pointer;
361
+ background-color: var(--table-header-bg);
362
+ }
363
+
364
+ .th:first-child {
365
+ z-index: 1;
366
+ }
367
+
368
+ .th:last-child {
369
+ z-index: 1;
370
+ text-align: right;
371
+ }
372
+
373
+ .th:first-child,
374
+ .td:first-child {
375
+ text-align: left;
376
+ vertical-align: middle;
377
+ }
378
+
379
+ .th:last-child,
380
+ .td:last-child {
381
+ width: 100px;
382
+ text-align: right;
383
+ }
384
+
385
+ /* === Sortable Column Header === */
386
+ .canSort {
387
+ display: inline-flex;
388
+ align-items: center;
389
+ gap: var(--space-xs-plus);
390
+ cursor: pointer;
391
+
392
+ &:hover {
393
+ color: var(--react-table-tertiary-500, var(--color-tertiary-500));
394
+ }
395
+ }
396
+
397
+ /* === Table Body === */
398
+ tbody td {
399
+ font-size: var(--typography-small-size);
400
+ font-weight: 400;
401
+ color: var(--table-cell-text);
402
+ padding: var(--space-lg) 1.5rem;
403
+ vertical-align: middle;
404
+ border-bottom: 1px solid var(--table-row-border);
405
+ white-space: nowrap;
406
+
407
+ @media only screen and (max-width: 768px) {
408
+ padding: var(--space-sm) var(--space-md);
409
+ }
410
+ }
411
+
412
+ /* Sticky columns mobile padding */
413
+ @media only screen and (max-width: 768px) {
414
+ thead th.sticky {
415
+ padding: var(--space-sm) var(--space-sm);
416
+ }
417
+
418
+ tbody td.sticky {
419
+ padding: var(--space-sm) var(--space-sm);
420
+ }
421
+
422
+ tbody td.stickyRight {
423
+ padding: var(--space-sm) var(--space-xs);
424
+ }
425
+ }
426
+
427
+ .td {
428
+ vertical-align: middle;
429
+ }
430
+
431
+ /* === Table Row === */
432
+ tbody tr {
433
+ background-color: var(--table-row-bg);
434
+ transition: background-color var(--transition-fast);
435
+
436
+ &:hover {
437
+ background-color: var(--table-row-bg-hover);
438
+ }
439
+ }
440
+
441
+ /* Pick mode: clickable row with highlight */
442
+ .pickableRow:hover {
443
+ background-color: color-mix(in srgb, var(--react-table-tertiary-500, var(--color-tertiary-500)) 10%, var(--table-row-bg-hover)) !important;
444
+ }
445
+
446
+ .pickableRow:hover .sticky {
447
+ background-color: color-mix(in srgb, var(--react-table-tertiary-500, var(--color-tertiary-500)) 10%, var(--table-row-bg-hover)) !important;
448
+ }
449
+
450
+ /* Pick mode: disabled rows (maxCount reached) */
451
+ .pickDisabledRow {
452
+ opacity: 0.5;
453
+ }
454
+
455
+ /* === Primary Cell Text (IDs, Names) === */
456
+ .cellPrimary {
457
+ font-weight: 500;
458
+ color: var(--table-cell-text-primary);
459
+ }
460
+
461
+ /* === Cell with Avatar === */
462
+ .cellWithAvatar {
463
+ display: flex;
464
+ align-items: center;
465
+ gap: var(--space-sm-plus);
466
+ }
467
+
468
+ .cellAvatar {
469
+ width: 28px;
470
+ height: 28px;
471
+ border-radius: 50%;
472
+ display: flex;
473
+ align-items: center;
474
+ justify-content: center;
475
+ font-size: var(--text-xs);
476
+ font-weight: 700;
477
+ flex-shrink: 0;
478
+ }
479
+
480
+ /* === Action Buttons === */
481
+ .actionButtons {
482
+ display: flex;
483
+ align-items: center;
484
+ justify-content: flex-end;
485
+ gap: var(--space-xs);
486
+ }
487
+
488
+ .actionTableButton {
489
+ background-color: transparent;
490
+ border: none;
491
+ padding: var(--space-xs-plus);
492
+ border-radius: var(--radius-field);
493
+ cursor: pointer;
494
+ transition: all var(--transition-fast);
495
+ display: flex;
496
+ align-items: center;
497
+ justify-content: center;
498
+ }
499
+
500
+ .actionTableButton svg {
501
+ width: 18px;
502
+ height: 18px;
503
+ }
504
+
505
+ /* View action - green (using !important to override IconButton library styles) */
506
+ .viewAction {
507
+ color: var(--react-table-green-500, var(--color-green-500)) !important;
508
+ }
509
+
510
+ .viewAction:hover {
511
+ color: var(--react-table-green-600, var(--color-green-600)) !important;
512
+ background-color: color-mix(
513
+ in srgb,
514
+ var(--react-table-green-500, var(--color-green-500)) 12%,
515
+ transparent
516
+ ) !important;
517
+ }
518
+
519
+ /* Edit action - tertiary/teal */
520
+ .editAction {
521
+ color: var(--react-table-tertiary-500, var(--color-tertiary-500)) !important;
522
+ }
523
+
524
+ .editAction:hover {
525
+ color: var(--react-table-tertiary-600, var(--color-tertiary-600)) !important;
526
+ background-color: color-mix(
527
+ in srgb,
528
+ var(--react-table-tertiary-500, var(--color-tertiary-500)) 12%,
529
+ transparent
530
+ ) !important;
531
+ }
532
+
533
+ /* Delete/Remove action - red */
534
+ .removeAction {
535
+ color: var(--react-table-red-500, var(--color-red-500)) !important;
536
+ }
537
+
538
+ .removeAction:hover {
539
+ color: var(--react-table-red-600, var(--color-red-600)) !important;
540
+ background-color: color-mix(
541
+ in srgb,
542
+ var(--react-table-red-500, var(--color-red-500)) 12%,
543
+ transparent
544
+ ) !important;
545
+ }
546
+
547
+ /* Mobile/Tablet - more condensed action buttons */
548
+ @media only screen and (max-width: 768px) {
549
+ .actionButtons {
550
+ gap: 0;
551
+ }
552
+
553
+ .actionTableButton {
554
+ padding: var(--space-xs);
555
+ }
556
+
557
+ .actionTableButton svg {
558
+ width: 16px;
559
+ height: 16px;
560
+ }
561
+ }
562
+
563
+ /* === Sticky Columns === */
564
+ .sticky {
565
+ position: sticky;
566
+ background: var(--table-row-bg);
567
+ }
568
+
569
+ tbody tr:hover .sticky {
570
+ background: var(--table-row-bg-hover);
571
+ }
572
+
573
+ .stickyLeft {
574
+ left: 0;
575
+ }
576
+
577
+ .stickyRight {
578
+ right: 0;
579
+ background: var(--surface-bg);
580
+ }
581
+
582
+ /* === Checkbox Styling for Table === */
583
+ .th:first-child,
584
+ .td:first-child {
585
+ /* Smaller checkbox in table */
586
+ --checkbox-size: 18px;
587
+ --checkbox-indicator-size: 12px;
588
+ }
589
+
590
+ /* === Pagination === */
591
+ .pagination {
592
+ display: flex;
593
+ justify-content: flex-end;
594
+ align-items: center;
595
+ gap: var(--space-lg);
596
+ padding: var(--space-lg) 1.5rem;
597
+ border-top: 1px solid var(--table-row-border);
598
+ background-color: var(--table-header-bg);
599
+
600
+ @media only screen and (max-width: 1024px) {
601
+ gap: var(--space-md);
602
+ padding: var(--space-md) 1rem;
603
+ }
604
+
605
+ @media only screen and (max-width: 768px) {
606
+ gap: var(--space-sm);
607
+ padding: var(--space-sm) var(--space-md);
608
+ font-size: var(--text-xs);
609
+ }
610
+
611
+ @media only screen and (max-width: 430px) {
612
+ justify-content: center;
613
+ flex-wrap: wrap;
614
+ }
615
+ }
616
+
617
+ .pageInfo {
618
+ display: flex;
619
+ align-items: center;
620
+ gap: 0.25rem;
621
+ /* Let Typography component control base font-size */
622
+ color: var(--pagination-text);
623
+
624
+ strong,
625
+ .bold {
626
+ font-weight: 600;
627
+ color: var(--pagination-text-bold);
628
+ }
629
+
630
+ @media only screen and (max-width: 1024px) {
631
+ font-size: var(--text-xs);
632
+ }
633
+
634
+ @media only screen and (max-width: 768px) {
635
+ font-size: var(--text-xs);
636
+ }
637
+ }
638
+
639
+ .goToPageForm {
640
+ width: 80px;
641
+
642
+ @media only screen and (max-width: 768px) {
643
+ width: 60px;
644
+ }
645
+ }
646
+
647
+ /* Number input spinner buttons for dark mode */
648
+ [data-theme='dark'] .goToPageForm::-webkit-inner-spin-button,
649
+ [data-theme='dark'] .goToPageForm::-webkit-outer-spin-button {
650
+ filter: invert(1);
651
+ }
652
+
653
+ .pageInput,
654
+ .pageShowItem {
655
+ @media only screen and (max-width: 1024px) {
656
+ font-size: var(--text-xs);
657
+ }
658
+
659
+ @media only screen and (max-width: 430px) {
660
+ display: none;
661
+ }
662
+ }
663
+
664
+ /* === Pagination Buttons === */
665
+ .paginationButtons {
666
+ display: flex;
667
+ gap: var(--space-sm);
668
+ }
669
+
670
+ .paginationButton {
671
+ display: flex;
672
+ justify-content: center;
673
+ align-items: center;
674
+ width: 36px;
675
+ height: 36px;
676
+ background-color: transparent;
677
+ border: 1px solid var(--pagination-button-border);
678
+ border-radius: 50%;
679
+ color: var(--pagination-text);
680
+ cursor: pointer;
681
+ transition: all var(--transition-fast);
682
+
683
+ &:hover:not(:disabled) {
684
+ border-color: var(--pagination-button-hover-border);
685
+ color: var(--pagination-button-hover-text);
686
+ }
687
+
688
+ &:disabled {
689
+ opacity: 0.5;
690
+ cursor: not-allowed;
691
+ }
692
+
693
+ svg {
694
+ width: 16px;
695
+ height: 16px;
696
+ }
697
+
698
+ @media only screen and (max-width: 768px) {
699
+ width: 32px;
700
+ height: 32px;
701
+
702
+ svg {
703
+ width: 14px;
704
+ height: 14px;
705
+ }
706
+ }
707
+ }
708
+
709
+ /* === Content Loader === */
710
+ .content {
711
+ display: flex;
712
+ justify-content: center;
713
+ align-items: center;
714
+ padding: 3rem;
715
+ }
716
+
717
+ /* === Scrollable Body Container === */
718
+ .tbodyContainer {
719
+ display: block;
720
+ max-height: 350px;
721
+ overflow-y: auto;
722
+ }
723
+
724
+ .tbodyContainer tbody {
725
+ display: block;
726
+ }
727
+
728
+ .tbodyContainer tr {
729
+ display: table;
730
+ width: 100%;
731
+ table-layout: fixed;
732
+ }
733
+
734
+ .tbodyContainer td {
735
+ display: table-cell;
736
+ }
737
+
738
+ /* === Drawer Body (for modals) === */
739
+ .drawerBody {
740
+ display: flex;
741
+ flex-direction: column;
742
+ justify-content: center;
743
+ align-items: center;
744
+ margin: 1.5rem 0;
745
+
746
+ img {
747
+ width: 150px;
748
+ }
749
+ }
750
+
751
+ .form {
752
+ display: flex;
753
+ flex-direction: column;
754
+ width: 100%;
755
+ gap: 1.25rem;
756
+ margin-top: 1.5rem;
757
+ }
758
+
759
+ .formSection {
760
+ display: flex;
761
+ flex-direction: column;
762
+ gap: var(--space-sm);
763
+
764
+ p {
765
+ text-align: center;
766
+ }
767
+ }
768
+
769
+ /* === Enum Checkboxes (multi-select filter) === */
770
+ .enumCheckboxes {
771
+ display: flex;
772
+ flex-direction: column;
773
+ gap: var(--space-xs);
774
+ max-height: 200px;
775
+ overflow-y: auto;
776
+ padding: var(--space-xs) 0;
777
+ }
778
+
779
+ .enumCheckboxLabel {
780
+ display: flex;
781
+ align-items: center;
782
+ gap: var(--space-sm);
783
+ padding: var(--space-xs) var(--space-sm);
784
+ border-radius: var(--radius-field);
785
+ cursor: pointer;
786
+ font-size: var(--typography-small-size);
787
+ color: var(--text-primary);
788
+ transition: background-color var(--transition-fast);
789
+ }
790
+
791
+ .enumCheckboxLabel:hover {
792
+ background-color: var(--list-item-bg-hover);
793
+ }
794
+
795
+ /* === Filter Notice === */
796
+ .filterNotice {
797
+ color: var(--text-auxiliary);
798
+ font-size: var(--text-xs);
799
+ margin-top: var(--space-md);
800
+ text-align: center;
801
+ }
802
+
803
+ /* === Badge (inline with table) === */
804
+ .badge {
805
+ display: inline-flex;
806
+ align-items: center;
807
+ background-color: transparent;
808
+ color: var(--react-table-tertiary-500, var(--color-tertiary-500));
809
+ border: 1px solid var(--react-table-tertiary-500, var(--color-tertiary-500));
810
+ padding: var(--space-xs-plus) 0.75rem;
811
+ border-radius: var(--radius-field);
812
+ font-size: var(--typography-small-size);
813
+ font-weight: 500;
814
+ }
815
+
816
+ .badgeText {
817
+ margin-right: 0.25rem;
818
+ }
819
+
820
+ .badgeCloseButton {
821
+ display: flex;
822
+ align-items: center;
823
+ justify-content: center;
824
+ border: none;
825
+ background: none;
826
+ color: inherit;
827
+ cursor: pointer;
828
+ margin-left: 0.25rem;
829
+ padding: 0;
830
+
831
+ &:hover {
832
+ color: var(--intent-danger-text);
833
+ }
834
+ }
835
+
836
+ /* === Dark Mode === */
837
+ [data-theme='dark'] .tableWrapper {
838
+ background-color: var(--surface-bg);
839
+ border-color: var(--surface-border);
840
+ }
841
+
842
+ [data-theme='dark'] thead th {
843
+ background-color: var(--table-header-bg);
844
+ color: var(--table-header-text);
845
+ border-color: var(--table-header-border);
846
+ }
847
+
848
+ [data-theme='dark'] tbody tr {
849
+ background-color: var(--table-row-bg);
850
+ }
851
+
852
+ [data-theme='dark'] tbody tr:hover {
853
+ background-color: var(--table-row-bg-hover);
854
+ }
855
+
856
+ [data-theme='dark'] tbody td {
857
+ color: var(--table-cell-text);
858
+ border-color: var(--table-row-border);
859
+ }
860
+
861
+ [data-theme='dark'] .cellPrimary {
862
+ color: var(--table-cell-text-primary);
863
+ }
864
+
865
+ [data-theme='dark'] .pagination {
866
+ background-color: var(--table-header-bg);
867
+ border-color: var(--table-row-border);
868
+ }
869
+
870
+ /* .tabButton.active uses --text-primary which auto-adjusts for dark mode */
871
+ [data-theme='dark'] .tabButton.active {
872
+ background-color: var(--surface-bg);
873
+ color: var(--table-cell-text-primary);
874
+ }
875
+
876
+ /* Dark mode action buttons */
877
+ [data-theme='dark'] .viewAction {
878
+ color: var(--react-table-green-400, var(--color-green-400)) !important;
879
+ }
880
+
881
+ [data-theme='dark'] .viewAction:hover {
882
+ color: var(--react-table-green-300, var(--color-green-300)) !important;
883
+ background-color: color-mix(
884
+ in srgb,
885
+ var(--react-table-green-500, var(--color-green-500)) 15%,
886
+ transparent
887
+ ) !important;
888
+ }
889
+
890
+ [data-theme='dark'] .editAction {
891
+ color: var(--react-table-tertiary-400, var(--color-tertiary-400)) !important;
892
+ }
893
+
894
+ [data-theme='dark'] .editAction:hover {
895
+ color: var(--react-table-tertiary-300, var(--color-tertiary-300)) !important;
896
+ background-color: color-mix(
897
+ in srgb,
898
+ var(--react-table-tertiary-500, var(--color-tertiary-500)) 15%,
899
+ transparent
900
+ ) !important;
901
+ }
902
+
903
+ [data-theme='dark'] .removeAction {
904
+ color: var(--react-table-red-400, var(--color-red-400)) !important;
905
+ }
906
+
907
+ [data-theme='dark'] .removeAction:hover {
908
+ color: var(--react-table-red-300, var(--color-red-300)) !important;
909
+ background-color: color-mix(
910
+ in srgb,
911
+ var(--react-table-red-500, var(--color-red-500)) 15%,
912
+ transparent
913
+ ) !important;
914
+ }
915
+
916
+ /* Dark mode sticky columns */
917
+ [data-theme='dark'] .sticky {
918
+ background: var(--table-row-bg);
919
+ }
920
+
921
+ [data-theme='dark'] tbody tr:hover .sticky {
922
+ background: var(--table-row-bg-hover);
923
+ }
924
+
925
+ [data-theme='dark'] .stickyRight {
926
+ background: var(--surface-bg);
927
+ }
928
+
929
+ [data-theme='dark'] thead th.sticky,
930
+ [data-theme='dark'] thead th.stickyRight {
931
+ background: var(--table-header-bg);
932
+ }
933
+
934
+ /* Dark mode scrollbar */
935
+ [data-theme='dark'] .tableContainer::-webkit-scrollbar-track {
936
+ background: var(--surface-bg);
937
+ }
938
+
939
+ [data-theme='dark'] .tableContainer::-webkit-scrollbar-thumb {
940
+ background: var(--react-table-gray-700, var(--color-gray-700));
941
+ border-color: var(--surface-bg);
942
+ }
943
+
944
+ [data-theme='dark'] .tableContainer::-webkit-scrollbar-thumb:hover {
945
+ background: var(--react-table-gray-600, var(--color-gray-600));
946
+ }
947
+
948
+ [data-theme='dark'] .tableContainer::-webkit-scrollbar-corner {
949
+ background: var(--surface-bg);
950
+ }