@indico-data/design-system 2.48.0 → 2.50.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 (41) hide show
  1. package/lib/components/table/Table.stories.d.ts +1 -0
  2. package/lib/components/table/components/HorizontalStickyHeader.d.ts +10 -0
  3. package/lib/components/table/components/__tests__/HorizontalStickyHeader.test.d.ts +1 -0
  4. package/lib/components/table/components/helpers.d.ts +6 -0
  5. package/lib/components/table/hooks/usePinnedColumnsManager.d.ts +8 -0
  6. package/lib/components/table/sampleData.d.ts +4 -0
  7. package/lib/components/table/types.d.ts +11 -1
  8. package/lib/components/table/utils/processColumns.d.ts +2 -0
  9. package/lib/index.css +188 -89
  10. package/lib/index.d.ts +12 -1
  11. package/lib/index.esm.css +188 -89
  12. package/lib/index.esm.js +238 -2
  13. package/lib/index.esm.js.map +1 -1
  14. package/lib/index.js +238 -2
  15. package/lib/index.js.map +1 -1
  16. package/lib/stylesAndAnimations/utilityClasses/UtilityClassesData.d.ts +7 -0
  17. package/lib/stylesAndAnimations/utilityClasses/UtilityClassesTable.d.ts +1 -0
  18. package/lib/stylesAndAnimations/utilityClasses/UtilityClassesTable.stories.d.ts +6 -0
  19. package/lib/utils/getPreviousHeadersWidth.d.ts +1 -0
  20. package/package.json +1 -1
  21. package/src/components/table/Table.mdx +134 -0
  22. package/src/components/table/Table.stories.tsx +71 -2
  23. package/src/components/table/Table.tsx +16 -1
  24. package/src/components/table/components/HorizontalStickyHeader.tsx +57 -0
  25. package/src/components/table/components/__tests__/HorizontalStickyHeader.test.tsx +104 -0
  26. package/src/components/table/components/helpers.ts +90 -0
  27. package/src/components/table/hooks/usePinnedColumnsManager.ts +146 -0
  28. package/src/components/table/{sampleData.ts → sampleData.tsx} +156 -1
  29. package/src/components/table/styles/Table.scss +32 -15
  30. package/src/components/table/styles/_variables.scss +2 -0
  31. package/src/components/table/types.ts +13 -1
  32. package/src/components/table/utils/processColumns.tsx +35 -0
  33. package/src/setup/setupTests.ts +8 -0
  34. package/src/storybookDocs/Permafrost.mdx +22 -11
  35. package/src/styles/_borders.scss +2 -1
  36. package/src/stylesAndAnimations/borders/BorderColor.tsx +14 -6
  37. package/src/stylesAndAnimations/utilityClasses/UtilityClasses.mdx +24 -0
  38. package/src/stylesAndAnimations/utilityClasses/UtilityClassesData.ts +230 -0
  39. package/src/stylesAndAnimations/utilityClasses/UtilityClassesTable.stories.tsx +13 -0
  40. package/src/stylesAndAnimations/utilityClasses/UtilityClassesTable.tsx +146 -0
  41. package/src/utils/getPreviousHeadersWidth.ts +12 -0
@@ -5,3 +5,4 @@ declare const meta: Meta;
5
5
  export default meta;
6
6
  type Story = StoryObj<typeof Table<SampleDataRow>>;
7
7
  export declare const Default: Story;
8
+ export declare const PinnedColumns: Story;
@@ -0,0 +1,10 @@
1
+ interface HorizontalStickyHeaderProps {
2
+ children: React.ReactNode;
3
+ position: number;
4
+ onPinColumn?: (columnId: string) => void;
5
+ isPinned?: boolean;
6
+ forceUpdate?: number;
7
+ pinnedColumnIds: string[];
8
+ }
9
+ declare const HorizontalStickyHeader: ({ children, position, onPinColumn, isPinned, pinnedColumnIds, }: HorizontalStickyHeaderProps) => import("react/jsx-runtime").JSX.Element;
10
+ export default HorizontalStickyHeader;
@@ -0,0 +1,6 @@
1
+ import { CSSObject } from 'styled-components';
2
+ export declare const getPreviousHeadersWidth: (position: number, pinnedColumnIds: string[]) => number;
3
+ export declare const applyStickyStylesToTableHeader: (position: number, left: number) => Promise<void>;
4
+ export declare const sortPinnedColumns: <T>(columns: T[], pinnedColumnIds: string[]) => T[];
5
+ export declare const getPinnedColumnStyles: (isPinned: boolean, index: number, pinnedColumnIds: string[]) => CSSObject;
6
+ export declare const clearStickyStyles: (header: HTMLElement) => void;
@@ -0,0 +1,8 @@
1
+ import { TableColumn } from '../types';
2
+ /**
3
+ * Hook to manage pinned columns in a table
4
+ * Handles initialization, toggling, positioning and resizing of pinned columns
5
+ */
6
+ export declare const usePinnedColumnsManager: <T>(columns: TableColumn<T>[], canPinColumns: boolean, onPinnedColumnsChange?: (pinnedColumnIds: string[]) => void) => {
7
+ columnsWithPinning: TableColumn<T>[];
8
+ };
@@ -6,6 +6,10 @@ export interface SampleDataRow {
6
6
  weapon: string;
7
7
  backstory: string;
8
8
  favoriteMeal: string;
9
+ homeland: string;
10
+ alignment: string;
11
+ specialAbility: string;
12
+ test: string;
9
13
  }
10
14
  export declare const sampleData: SampleDataRow[];
11
15
  export declare const columns: TableColumn<SampleDataRow>[];
@@ -1,12 +1,22 @@
1
1
  import { Direction as RDTDirection, Alignment as RDTAlignment, TableColumn as RDTTableColumn, IDataTableProps } from 'react-data-table-component';
2
+ import { CSSObject } from 'styled-components';
2
3
  export type Direction = `${RDTDirection}`;
3
4
  export type Alignment = `${RDTAlignment}`;
4
- export type TableColumn<T> = RDTTableColumn<T>;
5
+ export interface PinnableColumn<T> extends RDTTableColumn<T> {
6
+ id: string;
7
+ isPinned?: boolean;
8
+ style?: CSSObject;
9
+ position?: number;
10
+ }
11
+ export type TableColumn<T> = PinnableColumn<T>;
5
12
  export interface TableProps<T> extends Omit<IDataTableProps<T>, 'paginationComponent' | 'direction' | 'subHeaderAlign'> {
13
+ columns: TableColumn<T>[];
6
14
  isDisabled?: boolean;
7
15
  isLoading?: boolean;
8
16
  direction?: Direction;
9
17
  subHeaderAlign?: 'left' | 'right' | 'center';
10
18
  isFullHeight?: boolean;
11
19
  totalEntriesText?: string;
20
+ canPinColumns?: boolean;
21
+ onPinnedColumnsChange?: (pinnedColumnIds: any[]) => void;
12
22
  }
@@ -0,0 +1,2 @@
1
+ import { TableColumn } from '../types';
2
+ export declare const processColumns: <T>(columns: TableColumn<T>[], pinnedColumnIds: string[], togglePinnedColumn: (id: string) => void) => TableColumn<T>[];
package/lib/index.css CHANGED
@@ -804,6 +804,8 @@ a:hover,
804
804
  --pf-table-highlighted-box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4), 0 8px 16px rgba(0, 0, 0, 0.3);
805
805
  --pf-table-font-size: var(--pf-font-size-body2);
806
806
  --pf-table-pagination-background-color: var(--pf-primary-color-700);
807
+ --pf-table-pinned-column-border-color: var(--pf-primary-color-100);
808
+ --pf-table-pinned-column-background-color: var(--pf-table-background-color);
807
809
  }
808
810
 
809
811
  .table-loading {
@@ -856,6 +858,20 @@ a:hover,
856
858
  .table-body::-webkit-scrollbar-thumb:hover {
857
859
  background: var(--pf-primary-color);
858
860
  }
861
+ .table .table__column__pin-action {
862
+ padding: 0;
863
+ padding-right: var(--pf-padding-1);
864
+ }
865
+ .table .table__column--is-pinned {
866
+ opacity: 1;
867
+ }
868
+ .table .table__column--is-not-pinned {
869
+ opacity: 0.3;
870
+ }
871
+ .table .table__header-cell {
872
+ display: flex;
873
+ align-items: center;
874
+ }
859
875
  .table > *:nth-child(3) {
860
876
  margin-top: auto;
861
877
  background-color: transparent;
@@ -881,27 +897,26 @@ a:hover,
881
897
  .table button:disabled svg {
882
898
  fill: var(--pf-table-disabled-button-color);
883
899
  }
900
+ .table .rdt_TableHead {
901
+ z-index: 3;
902
+ }
884
903
  .table .rdt_TableHeader {
885
904
  border-radius: var(--pf-rounded) 0;
886
905
  border: var(--pf-border-sm) solid var(--pf-table-border-color);
887
906
  border-bottom: none;
888
907
  }
889
- .table .rdt_TableHeadRow > :first-child,
890
- .table .rdt_TableRow > :first-child {
891
- padding-left: var(--pf-padding-4);
892
- min-width: 60px;
893
- justify-content: left;
894
- }
895
908
  .table .rdt_TableRow {
896
909
  border-top: var(--pf-border-sm) solid var(--pf-table-border-color);
897
910
  border-bottom: var(--pf-border-sm) solid var(--pf-table-border-color);
898
911
  }
912
+ .table .rdt_TableRow:hover {
913
+ border-top: var(--pf-border-sm) solid var(--pf-table-border-color);
914
+ border-bottom: var(--pf-border-sm) solid var(--pf-table-border-color);
915
+ outline-color: var(--pf-table-border-color);
916
+ }
899
917
  .table .rdt_TableRow:hover .rdt_TableCell {
900
918
  background-color: var(--pf-table-hover-color) !important;
901
919
  }
902
- .table .rdt_TableRow:first-child .rdt_TableCell {
903
- border-top: var(--pf-border-sm) solid var(--pf-table-border-color);
904
- }
905
920
  .table .rdt_TableCell,
906
921
  .table .rdt_TableCol {
907
922
  font-size: var(--pf-table-font-size);
@@ -910,6 +925,10 @@ a:hover,
910
925
  .table .rdt_TableCol:not(:first-child) {
911
926
  border-left: var(--pf-border-sm) solid var(--pf-table-border-color);
912
927
  }
928
+ .table .rdt_TableCell:not(:last-of-type),
929
+ .table .rdt_TableCol:not(:last-of-type) {
930
+ border-bottom-width: 0;
931
+ }
913
932
  .table .table--striped .rdt_TableRow:nth-child(odd) .rdt_TableCell {
914
933
  background-color: var(--pf-table-stripe-color);
915
934
  }
@@ -4185,124 +4204,124 @@ p,
4185
4204
  border-color: var(--pf-secondary-color-900);
4186
4205
  }
4187
4206
 
4188
- .border-gray {
4189
- border-color: var(--pf-gray-color);
4207
+ .border-tertiary {
4208
+ border-color: var(--pf-tertiary-color);
4190
4209
  }
4191
4210
 
4192
- .border-gray-100 {
4193
- border-color: var(--pf-gray-color-100);
4211
+ .border-tertiary-100 {
4212
+ border-color: var(--pf-tertiary-color-100);
4194
4213
  }
4195
4214
 
4196
- .border-gray-200 {
4197
- border-color: var(--pf-gray-color-200);
4215
+ .border-tertiary-200 {
4216
+ border-color: var(--pf-tertiary-color-200);
4198
4217
  }
4199
4218
 
4200
- .border-gray-300 {
4201
- border-color: var(--pf-gray-color-300);
4219
+ .border-tertiary-300 {
4220
+ border-color: var(--pf-tertiary-color-300);
4202
4221
  }
4203
4222
 
4204
- .border-gray-400 {
4205
- border-color: var(--pf-gray-color-400);
4223
+ .border-tertiary-400 {
4224
+ border-color: var(--pf-tertiary-color-400);
4206
4225
  }
4207
4226
 
4208
- .border-gray-500 {
4209
- border-color: var(--pf-gray-color-500);
4227
+ .border-tertiary-500 {
4228
+ border-color: var(--pf-tertiary-color-500);
4210
4229
  }
4211
4230
 
4212
- .border-gray-600 {
4213
- border-color: var(--pf-gray-color-600);
4231
+ .border-tertiary-600 {
4232
+ border-color: var(--pf-tertiary-color-600);
4214
4233
  }
4215
4234
 
4216
- .border-gray-700 {
4217
- border-color: var(--pf-gray-color-700);
4235
+ .border-tertiary-700 {
4236
+ border-color: var(--pf-tertiary-color-700);
4218
4237
  }
4219
4238
 
4220
- .border-gray-800 {
4221
- border-color: var(--pf-gray-color-800);
4239
+ .border-tertiary-800 {
4240
+ border-color: var(--pf-tertiary-color-800);
4222
4241
  }
4223
4242
 
4224
- .border-gray-900 {
4225
- border-color: var(--pf-gray-color-900);
4243
+ .border-tertiary-900 {
4244
+ border-color: var(--pf-tertiary-color-900);
4226
4245
  }
4227
4246
 
4228
- .border-steel {
4229
- border-color: var(--pf-steel-color);
4247
+ .border-gray {
4248
+ border-color: var(--pf-gray-color);
4230
4249
  }
4231
4250
 
4232
- .border-steel-100 {
4233
- border-color: var(--pf-steel-color-100);
4251
+ .border-gray-100 {
4252
+ border-color: var(--pf-gray-color-100);
4234
4253
  }
4235
4254
 
4236
- .border-steel-200 {
4237
- border-color: var(--pf-steel-color-200);
4255
+ .border-gray-200 {
4256
+ border-color: var(--pf-gray-color-200);
4238
4257
  }
4239
4258
 
4240
- .border-steel-300 {
4241
- border-color: var(--pf-steel-color-300);
4259
+ .border-gray-300 {
4260
+ border-color: var(--pf-gray-color-300);
4242
4261
  }
4243
4262
 
4244
- .border-steel-400 {
4245
- border-color: var(--pf-steel-color-400);
4263
+ .border-gray-400 {
4264
+ border-color: var(--pf-gray-color-400);
4246
4265
  }
4247
4266
 
4248
- .border-steel-500 {
4249
- border-color: var(--pf-steel-color-500);
4267
+ .border-gray-500 {
4268
+ border-color: var(--pf-gray-color-500);
4250
4269
  }
4251
4270
 
4252
- .border-steel-600 {
4253
- border-color: var(--pf-steel-color-600);
4271
+ .border-gray-600 {
4272
+ border-color: var(--pf-gray-color-600);
4254
4273
  }
4255
4274
 
4256
- .border-steel-700 {
4257
- border-color: var(--pf-steel-color-700);
4275
+ .border-gray-700 {
4276
+ border-color: var(--pf-gray-color-700);
4258
4277
  }
4259
4278
 
4260
- .border-steel-800 {
4261
- border-color: var(--pf-steel-color-800);
4279
+ .border-gray-800 {
4280
+ border-color: var(--pf-gray-color-800);
4262
4281
  }
4263
4282
 
4264
- .border-steel-900 {
4265
- border-color: var(--pf-steel-color-900);
4283
+ .border-gray-900 {
4284
+ border-color: var(--pf-gray-color-900);
4266
4285
  }
4267
4286
 
4268
- .border-green {
4269
- border-color: var(--pf-green-color);
4287
+ .border-red {
4288
+ border-color: var(--pf-red-color);
4270
4289
  }
4271
4290
 
4272
- .border-green-100 {
4273
- border-color: var(--pf-green-color-100);
4291
+ .border-red-100 {
4292
+ border-color: var(--pf-red-color-100);
4274
4293
  }
4275
4294
 
4276
- .border-green-200 {
4277
- border-color: var(--pf-green-color-200);
4295
+ .border-red-200 {
4296
+ border-color: var(--pf-red-color-200);
4278
4297
  }
4279
4298
 
4280
- .border-green-300 {
4281
- border-color: var(--pf-green-color-300);
4299
+ .border-red-300 {
4300
+ border-color: var(--pf-red-color-300);
4282
4301
  }
4283
4302
 
4284
- .border-green-400 {
4285
- border-color: var(--pf-green-color-400);
4303
+ .border-red-400 {
4304
+ border-color: var(--pf-red-color-400);
4286
4305
  }
4287
4306
 
4288
- .border-green-500 {
4289
- border-color: var(--pf-green-color-500);
4307
+ .border-red-500 {
4308
+ border-color: var(--pf-red-color-500);
4290
4309
  }
4291
4310
 
4292
- .border-green-600 {
4293
- border-color: var(--pf-green-color-600);
4311
+ .border-red-600 {
4312
+ border-color: var(--pf-red-color-600);
4294
4313
  }
4295
4314
 
4296
- .border-green-700 {
4297
- border-color: var(--pf-green-color-700);
4315
+ .border-red-700 {
4316
+ border-color: var(--pf-red-color-700);
4298
4317
  }
4299
4318
 
4300
- .border-green-800 {
4301
- border-color: var(--pf-green-color-800);
4319
+ .border-red-800 {
4320
+ border-color: var(--pf-red-color-800);
4302
4321
  }
4303
4322
 
4304
- .border-green-900 {
4305
- border-color: var(--pf-green-color-900);
4323
+ .border-red-900 {
4324
+ border-color: var(--pf-red-color-900);
4306
4325
  }
4307
4326
 
4308
4327
  .border-orange {
@@ -4345,44 +4364,124 @@ p,
4345
4364
  border-color: var(--pf-orange-color-900);
4346
4365
  }
4347
4366
 
4348
- .border-red {
4349
- border-color: var(--pf-red-color);
4367
+ .border-yellow {
4368
+ border-color: var(--pf-yellow-color);
4350
4369
  }
4351
4370
 
4352
- .border-red-100 {
4353
- border-color: var(--pf-red-color-100);
4371
+ .border-yellow-100 {
4372
+ border-color: var(--pf-yellow-color-100);
4354
4373
  }
4355
4374
 
4356
- .border-red-200 {
4357
- border-color: var(--pf-red-color-200);
4375
+ .border-yellow-200 {
4376
+ border-color: var(--pf-yellow-color-200);
4358
4377
  }
4359
4378
 
4360
- .border-red-300 {
4361
- border-color: var(--pf-red-color-300);
4379
+ .border-yellow-300 {
4380
+ border-color: var(--pf-yellow-color-300);
4362
4381
  }
4363
4382
 
4364
- .border-red-400 {
4365
- border-color: var(--pf-red-color-400);
4383
+ .border-yellow-400 {
4384
+ border-color: var(--pf-yellow-color-400);
4366
4385
  }
4367
4386
 
4368
- .border-red-500 {
4369
- border-color: var(--pf-red-color-500);
4387
+ .border-yellow-500 {
4388
+ border-color: var(--pf-yellow-color-500);
4370
4389
  }
4371
4390
 
4372
- .border-red-600 {
4373
- border-color: var(--pf-red-color-600);
4391
+ .border-yellow-600 {
4392
+ border-color: var(--pf-yellow-color-600);
4374
4393
  }
4375
4394
 
4376
- .border-red-700 {
4377
- border-color: var(--pf-red-color-700);
4395
+ .border-yellow-700 {
4396
+ border-color: var(--pf-yellow-color-700);
4378
4397
  }
4379
4398
 
4380
- .border-red-800 {
4381
- border-color: var(--pf-red-color-800);
4399
+ .border-yellow-800 {
4400
+ border-color: var(--pf-yellow-color-800);
4382
4401
  }
4383
4402
 
4384
- .border-red-900 {
4385
- border-color: var(--pf-red-color-900);
4403
+ .border-yellow-900 {
4404
+ border-color: var(--pf-yellow-color-900);
4405
+ }
4406
+
4407
+ .border-green {
4408
+ border-color: var(--pf-green-color);
4409
+ }
4410
+
4411
+ .border-green-100 {
4412
+ border-color: var(--pf-green-color-100);
4413
+ }
4414
+
4415
+ .border-green-200 {
4416
+ border-color: var(--pf-green-color-200);
4417
+ }
4418
+
4419
+ .border-green-300 {
4420
+ border-color: var(--pf-green-color-300);
4421
+ }
4422
+
4423
+ .border-green-400 {
4424
+ border-color: var(--pf-green-color-400);
4425
+ }
4426
+
4427
+ .border-green-500 {
4428
+ border-color: var(--pf-green-color-500);
4429
+ }
4430
+
4431
+ .border-green-600 {
4432
+ border-color: var(--pf-green-color-600);
4433
+ }
4434
+
4435
+ .border-green-700 {
4436
+ border-color: var(--pf-green-color-700);
4437
+ }
4438
+
4439
+ .border-green-800 {
4440
+ border-color: var(--pf-green-color-800);
4441
+ }
4442
+
4443
+ .border-green-900 {
4444
+ border-color: var(--pf-green-color-900);
4445
+ }
4446
+
4447
+ .border-purple {
4448
+ border-color: var(--pf-purple-color);
4449
+ }
4450
+
4451
+ .border-purple-100 {
4452
+ border-color: var(--pf-purple-color-100);
4453
+ }
4454
+
4455
+ .border-purple-200 {
4456
+ border-color: var(--pf-purple-color-200);
4457
+ }
4458
+
4459
+ .border-purple-300 {
4460
+ border-color: var(--pf-purple-color-300);
4461
+ }
4462
+
4463
+ .border-purple-400 {
4464
+ border-color: var(--pf-purple-color-400);
4465
+ }
4466
+
4467
+ .border-purple-500 {
4468
+ border-color: var(--pf-purple-color-500);
4469
+ }
4470
+
4471
+ .border-purple-600 {
4472
+ border-color: var(--pf-purple-color-600);
4473
+ }
4474
+
4475
+ .border-purple-700 {
4476
+ border-color: var(--pf-purple-color-700);
4477
+ }
4478
+
4479
+ .border-purple-800 {
4480
+ border-color: var(--pf-purple-color-800);
4481
+ }
4482
+
4483
+ .border-purple-900 {
4484
+ border-color: var(--pf-purple-color-900);
4386
4485
  }
4387
4486
 
4388
4487
  .rounded {
package/lib/index.d.ts CHANGED
@@ -4,7 +4,8 @@ export * from '@floating-ui/react-dom';
4
4
  import React$1, { CSSProperties, MouseEventHandler, ReactElement } from 'react';
5
5
  import * as react_jsx_runtime from 'react/jsx-runtime';
6
6
  import { ContainerProps, RowProps, ColProps } from 'react-grid-system';
7
- import { IDataTableProps, Direction as Direction$1 } from 'react-data-table-component';
7
+ import { IDataTableProps, Direction as Direction$1, TableColumn as TableColumn$1 } from 'react-data-table-component';
8
+ import { CSSObject } from 'styled-components';
8
9
  import { Props as Props$7 } from 'react-select';
9
10
  import { DateRange, OnSelectHandler, Mode, CustomComponents, Matcher, Formatters, MonthChangeEventHandler, DayEventHandler } from 'react-day-picker';
10
11
 
@@ -184,13 +185,23 @@ type SelectOption = {
184
185
  };
185
186
 
186
187
  type Direction = `${Direction$1}`;
188
+ interface PinnableColumn<T> extends TableColumn$1<T> {
189
+ id: string;
190
+ isPinned?: boolean;
191
+ style?: CSSObject;
192
+ position?: number;
193
+ }
194
+ type TableColumn<T> = PinnableColumn<T>;
187
195
  interface TableProps<T> extends Omit<IDataTableProps<T>, 'paginationComponent' | 'direction' | 'subHeaderAlign'> {
196
+ columns: TableColumn<T>[];
188
197
  isDisabled?: boolean;
189
198
  isLoading?: boolean;
190
199
  direction?: Direction;
191
200
  subHeaderAlign?: 'left' | 'right' | 'center';
192
201
  isFullHeight?: boolean;
193
202
  totalEntriesText?: string;
203
+ canPinColumns?: boolean;
204
+ onPinnedColumnsChange?: (pinnedColumnIds: any[]) => void;
194
205
  }
195
206
 
196
207
  type PillSize = 'sm' | 'md' | 'lg';