@inceptionbg/iui 2.0.11 → 2.0.12

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 (105) hide show
  1. package/dist/icons/index.d.ts +5 -1
  2. package/dist/icons/index.js +1 -1
  3. package/dist/index.d.ts +151 -80
  4. package/dist/index.js +1 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/iui.css +1 -1
  7. package/package.json +1 -1
  8. package/src/assets/icons/duotone/faCircleUser.ts +6 -6
  9. package/src/assets/icons/index.ts +2 -0
  10. package/src/assets/icons/light/faArrowDownShortWide.ts +1 -1
  11. package/src/assets/icons/light/faArrowDownWideShort.ts +1 -1
  12. package/src/assets/icons/light/faArrowUpArrowDown.ts +5 -5
  13. package/src/assets/icons/light/faArrowUpRightFromSquare.ts +1 -1
  14. package/src/assets/icons/light/faArrowsToLine.ts +1 -1
  15. package/src/assets/icons/light/faArrowsUpDown.ts +1 -1
  16. package/src/assets/icons/light/faBookmark.ts +15 -0
  17. package/src/assets/icons/light/faBookmarkSlash.ts +15 -0
  18. package/src/assets/icons/light/faCalendarPlus.ts +5 -5
  19. package/src/assets/icons/light/faCheck.ts +1 -1
  20. package/src/assets/icons/light/faChevronDown.ts +5 -5
  21. package/src/assets/icons/light/faChevronRight.ts +5 -5
  22. package/src/assets/icons/light/faCircleInfo.ts +5 -5
  23. package/src/assets/icons/light/faCircleXmark.ts +5 -5
  24. package/src/assets/icons/light/faClipboardCheck.ts +5 -5
  25. package/src/assets/icons/light/faClockRotateLeft.ts +1 -1
  26. package/src/assets/icons/light/faEllipsisVertical.ts +1 -1
  27. package/src/assets/icons/light/faEye.ts +5 -5
  28. package/src/assets/icons/light/faEyeSlash.ts +5 -5
  29. package/src/assets/icons/light/faFilter.ts +5 -5
  30. package/src/assets/icons/light/faGear.ts +1 -1
  31. package/src/assets/icons/light/faHouse.ts +5 -5
  32. package/src/assets/icons/light/faIdBadge.ts +5 -5
  33. package/src/assets/icons/light/faLineColumns.ts +5 -5
  34. package/src/assets/icons/light/faLink.ts +1 -1
  35. package/src/assets/icons/light/faMagnifyingGlass.ts +5 -5
  36. package/src/assets/icons/light/faPen.ts +5 -5
  37. package/src/assets/icons/light/faPrint.ts +5 -5
  38. package/src/assets/icons/light/faQuestion.ts +5 -5
  39. package/src/assets/icons/light/faRotateRight.ts +5 -5
  40. package/src/assets/icons/light/faTrashCan.ts +5 -5
  41. package/src/assets/icons/light/faTriangleExclamation.ts +5 -5
  42. package/src/assets/icons/light/faXmark.ts +1 -1
  43. package/src/assets/icons/regular/faArrowLeft.ts +6 -6
  44. package/src/assets/icons/regular/faArrowRightArrowLeft.ts +1 -1
  45. package/src/assets/icons/regular/faCircleCheck.ts +1 -1
  46. package/src/assets/icons/regular/faCircleExclamation.ts +1 -1
  47. package/src/assets/icons/regular/faCircleInfo.ts +1 -1
  48. package/src/assets/icons/regular/faFileArrowDown.ts +1 -1
  49. package/src/assets/icons/regular/faFilterCircleXmark.ts +1 -1
  50. package/src/assets/icons/regular/faTriangleExclamation.ts +1 -1
  51. package/src/assets/icons/solid/faAngleLeft.ts +1 -1
  52. package/src/assets/icons/solid/faAngleRight.ts +1 -1
  53. package/src/assets/icons/solid/faArrowDownWideShort.ts +1 -1
  54. package/src/assets/icons/solid/faCaretDown.ts +1 -1
  55. package/src/assets/icons/solid/faCheck.ts +5 -5
  56. package/src/assets/icons/solid/faEllipsisVertical.ts +1 -1
  57. package/src/assets/icons/solid/faFilter.ts +1 -1
  58. package/src/assets/icons/solid/faFloppyDisk.ts +1 -1
  59. package/src/assets/icons/solid/faGripDotsVertical.ts +1 -1
  60. package/src/assets/icons/solid/faListUl.ts +1 -1
  61. package/src/assets/icons/solid/faMinus.ts +6 -6
  62. package/src/assets/icons/solid/faPlus.ts +6 -6
  63. package/src/assets/icons/solid/faPrint.ts +1 -1
  64. package/src/assets/icons/solid/faRotateRight.ts +1 -1
  65. package/src/assets/icons/solid/faXmark.ts +1 -1
  66. package/src/components/Button/Button.tsx +1 -1
  67. package/src/components/Button/IconButton.tsx +1 -1
  68. package/src/components/Dashboard/FastLinksWidget/FastLinksWidget.tsx +1 -1
  69. package/src/components/Dialog/components/DialogFooter.tsx +1 -1
  70. package/src/components/Header/Components/ModuleSelect.tsx +14 -6
  71. package/src/components/Inputs/InputWrapper.tsx +1 -1
  72. package/src/components/Inputs/TextInput.tsx +1 -1
  73. package/src/components/List/List.tsx +18 -0
  74. package/src/components/List/ListItem.tsx +24 -0
  75. package/src/components/Loader/ProgressBar.tsx +41 -0
  76. package/src/components/Menu/Menu.tsx +0 -3
  77. package/src/components/Menu/MenuItem.tsx +21 -23
  78. package/src/components/Menu/NewMenu.tsx +0 -3
  79. package/src/components/Pullover/Pullover.tsx +5 -4
  80. package/src/components/Sidebar/types/ISidebar.ts +1 -1
  81. package/src/components/Table/Table.tsx +18 -11
  82. package/src/components/Table/components/filters/TableFilters.tsx +3 -6
  83. package/src/components/Table/components/footer/TableFooter.tsx +6 -10
  84. package/src/components/Table/components/header/TableHeader.tsx +22 -24
  85. package/src/components/Table/components/header/TableHeaderRow.tsx +16 -7
  86. package/{idea/Table/Components/Print → src/components/Table/components/print}/TablePrint.tsx +89 -96
  87. package/src/components/Table/components/sort/TableSort.tsx +2 -0
  88. package/src/components/Table/components/templates/TableTemplates.tsx +81 -0
  89. package/src/components/Table/hooks/useTablePrint.ts +75 -0
  90. package/src/index.ts +8 -0
  91. package/src/styles/App.scss +2 -0
  92. package/src/styles/common/_animations.scss +8 -14
  93. package/src/styles/common/helpers/_base.scss +0 -4
  94. package/src/styles/components/_header.scss +21 -9
  95. package/src/styles/components/_list.scss +40 -0
  96. package/src/styles/components/_loader.scss +3 -1
  97. package/src/styles/components/_menu.scss +19 -18
  98. package/src/styles/components/_print.scss +36 -46
  99. package/src/styles/components/_progressBar.scss +83 -0
  100. package/src/styles/components/_table.scss +16 -22
  101. package/src/types/ITable.ts +55 -32
  102. package/src/utils/i18n/i18nIUICyrilic.ts +2 -1
  103. package/src/utils/i18n/i18nIUILatin.ts +16 -12
  104. package/src/utils/i18n/i18nIUIMe.ts +2 -1
  105. package/src/utils/icons.ts +1 -1
@@ -0,0 +1,81 @@
1
+ import { useState, type FC } from 'react';
2
+ import { IconButton } from '../../../Button/IconButton';
3
+ import { useTranslation } from 'react-i18next';
4
+ import { useTableContext } from '../../contexts/TableContext';
5
+ import { faBookmark, faBookmarkSlash } from '../../../../assets/icons';
6
+ import { usePopupControl } from '../../../../hooks/usePopupControl';
7
+ import { Pullover } from '../../../Pullover/Pullover';
8
+
9
+ export const TableTemplates: FC = () => {
10
+ const { t } = useTranslation();
11
+ const { templates } = useTableContext();
12
+ const { control, onClose, onOpen } = usePopupControl();
13
+
14
+ return (
15
+ <>
16
+ <IconButton
17
+ tooltip={t('Templates')}
18
+ icon={faBookmark}
19
+ active={control.isOpen}
20
+ onClick={onOpen}
21
+ size="s"
22
+ variant="outlined"
23
+ />
24
+
25
+ <Pullover
26
+ control={control}
27
+ header={{
28
+ title: t('Templates'),
29
+ onSearch: templates?.setSearch,
30
+ }}
31
+ // onFormSubmit={() => {
32
+ // const data = deleteEmptyPropsIncludingArray(searchData);
33
+ // onSearch?.(excludeFromSearch ? deleteProps(data, excludeFromSearch) : data);
34
+ // onClose();
35
+ // }}
36
+ footer={{
37
+ confirmButton: {
38
+ label: t('ApplyTemplate'),
39
+ type: 'submit',
40
+ },
41
+ additionalButton: {
42
+ label: t('ResetTemplate'),
43
+ icon: faBookmarkSlash,
44
+ onClick: () => {
45
+ // setSearchData?.(defaultSearch);
46
+ // onSearch?.(defaultSearch);
47
+ // onClose();
48
+ },
49
+ // disabled: defaultSearch
50
+ // ? JSON.stringify(searchData) === JSON.stringify(defaultSearch)
51
+ // : Object.keys(searchData).length === 0,
52
+ },
53
+ }}
54
+ // contentClassName="iui-filters-list"
55
+ onCloseCallback={() => templates?.setSearch?.('')}
56
+ size="w600"
57
+ >
58
+ Templates
59
+ {templates?.items.map(item => (
60
+ <div key={item.uuid}>{item.name}</div>
61
+ ))}
62
+ </Pullover>
63
+ </>
64
+ // <Menu
65
+ // isOpen={isMenuOpen}
66
+ // onClose={onMenuClose}
67
+ // renderButton={ref => (
68
+ // <Tooltip label={t('Templates')} ref={ref}>
69
+ // <IconButton
70
+ // icon={faBookmark}
71
+ // active={isMenuOpen}
72
+ // onClick={onMenuOpen}
73
+ // size="s"
74
+ // variant="outlined"
75
+ // />
76
+ // </Tooltip>
77
+ // )}
78
+ // items={templates?.menuItems}
79
+ // />
80
+ );
81
+ };
@@ -0,0 +1,75 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { IGetPrintData, IPrintData } from '../../../types/ITable';
3
+ import { usePopupControl } from '../../../hooks/usePopupControl';
4
+
5
+ type Props<T> = {
6
+ getPrintData: IGetPrintData<T>;
7
+ totalRows?: number;
8
+ };
9
+
10
+ const limit = 1000;
11
+ const defaultData = { items: [], totalRows: 0 };
12
+
13
+ export const useTablePrint = <T>({
14
+ getPrintData,
15
+ totalRows: initialTotalRows = 0,
16
+ }: Props<T>) => {
17
+ const printPopupControl = usePopupControl();
18
+
19
+ const [data, setData] = useState<{ items: T[]; totalRows: number }>(defaultData);
20
+ const [offset, setOffset] = useState(0);
21
+ const [isLoading, setIsLoading] = useState(false);
22
+
23
+ useEffect(() => {
24
+ if (printPopupControl.control.isOpen) {
25
+ setIsLoading(true);
26
+ setOffset(0);
27
+ }
28
+ return () => {
29
+ setIsLoading(false);
30
+ setData(defaultData);
31
+ setOffset(0);
32
+ };
33
+ }, [printPopupControl.control.isOpen]);
34
+
35
+ useEffect(() => {
36
+ if (printPopupControl.control.isOpen) {
37
+ getPrintData({
38
+ pagination: { limit, offset },
39
+ noTotalRows: !!initialTotalRows || offset > 0,
40
+ })
41
+ .then(({ items, totalRows: newTotalRows }) => {
42
+ setData(prevState => {
43
+ const newData = offset === 0 ? items : prevState.items.concat(items);
44
+ const totalRows =
45
+ newTotalRows || initialTotalRows || prevState.totalRows || 0;
46
+
47
+ if (items?.length === limit) {
48
+ setOffset(offset => offset + 1);
49
+ } else {
50
+ setIsLoading(false);
51
+ }
52
+
53
+ return { items: newData, totalRows };
54
+ });
55
+ })
56
+ .catch(() => setIsLoading(false));
57
+ }
58
+ // eslint-disable-next-line react-hooks/exhaustive-deps
59
+ }, [printPopupControl.control.isOpen, initialTotalRows, offset]);
60
+
61
+ const loaded = data.items.length;
62
+ const progress = data.totalRows ? (loaded / data.totalRows) * 100 : 0;
63
+
64
+ const printData: Pick<
65
+ IPrintData<T>,
66
+ 'printPopupControl' | 'isLoading' | 'progress' | 'items'
67
+ > = {
68
+ printPopupControl,
69
+ isLoading,
70
+ progress,
71
+ items: data.items ?? [],
72
+ };
73
+
74
+ return printData;
75
+ };
package/src/index.ts CHANGED
@@ -22,6 +22,7 @@ import type { IError } from './types/IError';
22
22
  import type { ISelectData } from './types/ISelect';
23
23
  import type { ITab } from './types/ITab';
24
24
  import type {
25
+ IGetPrintData,
25
26
  IPagination,
26
27
  IPaginationControl,
27
28
  ITable,
@@ -70,7 +71,9 @@ import {
70
71
  SelectCreatable,
71
72
  } from './components/Inputs/Selects/Select';
72
73
  import { TextInput } from './components/Inputs/TextInput';
74
+ import { List } from './components/List/List';
73
75
  import { FullScreenLoader, LazyLoader, Loader } from './components/Loader/Loader';
76
+ import { ProgressBar } from './components/Loader/ProgressBar';
74
77
  import { Menu } from './components/Menu/Menu';
75
78
  import { MenuItem } from './components/Menu/MenuItem';
76
79
  // import { ItemActionsMenu } from './components/Table/Components/Edit/ItemActionsMenu';
@@ -97,6 +100,7 @@ import { useDefaultTemplate } from './components/Table/hooks/useDefaultTemplate'
97
100
  import { useTableEdit } from './components/Table/hooks/useTableEdit';
98
101
  import { useTableFilterFields } from './components/Table/hooks/useTableFilterFields';
99
102
  import { useTablePagination } from './components/Table/hooks/useTablePagination';
103
+ import { useTablePrint } from './components/Table/hooks/useTablePrint';
100
104
  import { useTableSearch } from './components/Table/hooks/useTableSearch';
101
105
  import { useTableSelect } from './components/Table/hooks/useTableSelect';
102
106
  import { useTableSort } from './components/Table/hooks/useTableSort';
@@ -196,12 +200,14 @@ export {
196
200
  TextAreaInput,
197
201
  LazyLoader,
198
202
  Loader,
203
+ List,
199
204
  Menu,
200
205
  MenuItem,
201
206
  NotificationBadge,
202
207
  NumberInput,
203
208
  PageLayout,
204
209
  PasswordInput,
210
+ ProgressBar,
205
211
  Pullover,
206
212
  PillBadge,
207
213
  Radio,
@@ -230,6 +236,7 @@ export {
230
236
  useTableEdit,
231
237
  useTableFilterFields,
232
238
  useTablePagination,
239
+ useTablePrint,
233
240
  useTableSearch,
234
241
  useTableSelect,
235
242
  useTableSort,
@@ -267,6 +274,7 @@ export type {
267
274
  ITableFilterData,
268
275
  ITableFilterItem,
269
276
  ITableSort,
277
+ IGetPrintData,
270
278
  ITreeItem,
271
279
  IValueLabel,
272
280
  IconDefinition,
@@ -25,11 +25,13 @@
25
25
  @use './components/inputDateTime';
26
26
  @use './components/inputRadio';
27
27
  @use './components/inputSelect';
28
+ @use './components/list';
28
29
  @use './components/loader';
29
30
  @use './components/menu';
30
31
  @use './components/page';
31
32
  @use './components/portal';
32
33
  @use './components/print';
34
+ @use './components/progressBar';
33
35
  @use './components/pullover';
34
36
  @use './components/scrollbar';
35
37
  @use './components/sidebar';
@@ -24,20 +24,14 @@
24
24
  }
25
25
  }
26
26
 
27
- // @keyframes linear-progress {
28
- // 0% {
29
- // background-size: 200% 100%;
30
- // background-position: left -31.25% top 0%;
31
- // }
32
- // 50% {
33
- // background-size: 800% 100%;
34
- // background-position: left -49% top 0%;
35
- // }
36
- // 100% {
37
- // background-size: 400% 100%;
38
- // background-position: left -102% top 0%;
39
- // }
40
- // }
27
+ @keyframes shimmer {
28
+ 0% {
29
+ left: -100%;
30
+ }
31
+ 100% {
32
+ left: 100%;
33
+ }
34
+ }
41
35
 
42
36
  @keyframes auto-fill {
43
37
  to {
@@ -49,7 +49,3 @@ a {
49
49
  .hover-neutral:hover {
50
50
  background-color: var(--neutral-hover);
51
51
  }
52
-
53
- .no-border {
54
- border: none !important;
55
- }
@@ -21,6 +21,7 @@
21
21
  }
22
22
  }
23
23
 
24
+ ///// Modules /////
24
25
  .module-name {
25
26
  display: flex;
26
27
  align-items: center;
@@ -32,15 +33,25 @@
32
33
  background-color: var(--neutral-hover);
33
34
  }
34
35
  }
35
- .module-item {
36
- display: flex;
37
- flex-direction: column;
38
- gap: 8px;
39
- align-items: center;
40
- padding: 8px;
41
- border-radius: 8px;
42
- .menu-item-label {
43
- font-weight: 600;
36
+ .modules-menu {
37
+ display: grid;
38
+ grid-template-columns: repeat(2, 1fr);
39
+ padding: 8px !important;
40
+ @media #{bp.$mobile} {
41
+ grid-template-columns: 1fr;
42
+ }
43
+ .module-item {
44
+ display: flex;
45
+ flex-direction: column;
46
+ gap: 8px;
47
+ align-items: center;
48
+ padding: 8px;
49
+ border-radius: 8px;
50
+ .menu-item-label {
51
+ font-weight: 600;
52
+ white-space: pre-line;
53
+ text-align: center;
54
+ }
44
55
  }
45
56
  }
46
57
  .module-item .menu-item-icon,
@@ -59,6 +70,7 @@
59
70
  }
60
71
  }
61
72
 
73
+ ///// User Box /////
62
74
  .user-box {
63
75
  display: flex;
64
76
  align-items: center;
@@ -0,0 +1,40 @@
1
+ .iui-list {
2
+ overflow: auto;
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: 8px;
6
+ .iui-list-item {
7
+ border: var(--border);
8
+ border-radius: 8px;
9
+ padding: 12px 16px;
10
+ p {
11
+ font-size: 14px;
12
+ line-height: 20px;
13
+ }
14
+ .iui-list-item-desc {
15
+ display: flex;
16
+ line-height: 1.5;
17
+ gap: 8px;
18
+ font-size: 12px;
19
+ color: var(--neutral);
20
+ margin-top: 4px;
21
+ }
22
+ &.disabled {
23
+ cursor: default;
24
+ opacity: 0.5;
25
+ }
26
+ &:not(.disabled) {
27
+ cursor: pointer;
28
+ &:hover {
29
+ background-color: var(--neutral-hover);
30
+ }
31
+ &.active {
32
+ background-color: var(--primary);
33
+ color: var(--text-inverse);
34
+ .iui-list-item-desc {
35
+ color: var(--neutral-300);
36
+ }
37
+ }
38
+ }
39
+ }
40
+ }
@@ -35,8 +35,10 @@
35
35
  }
36
36
 
37
37
  .empty-loader {
38
- height: 60px;
39
38
  width: 100%;
39
+ .loader {
40
+ min-height: fit-content;
41
+ }
40
42
  }
41
43
 
42
44
  .full-page-loader {
@@ -22,6 +22,24 @@
22
22
  }
23
23
 
24
24
  .iui-menu-item {
25
+ display: flex;
26
+ align-items: center;
27
+ gap: 8px;
28
+ padding: 8px 16px;
29
+ user-select: none;
30
+ .menu-item-icon {
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: center;
34
+ color: var(--text);
35
+ svg {
36
+ height: 16px;
37
+ width: 16px;
38
+ }
39
+ }
40
+ .menu-item-label {
41
+ width: 100%;
42
+ }
25
43
  &.clickable:hover:not(:disabled):not(.disabled):not(.active) {
26
44
  background-color: var(--neutral-hover);
27
45
  }
@@ -29,30 +47,13 @@
29
47
  transition: none;
30
48
  background-color: var(--primary);
31
49
  color: var(--text-inverse);
32
- .menu-item-content .menu-item-icon {
50
+ .menu-item-icon {
33
51
  color: var(--text-inverse);
34
52
  }
35
53
  }
36
54
  &.with-devider:not(:last-child) {
37
55
  border-bottom: var(--border);
38
56
  }
39
- .menu-item-content {
40
- display: flex;
41
- align-items: center;
42
- gap: 8px;
43
- padding: 8px 16px;
44
- user-select: none;
45
- .menu-item-icon {
46
- display: flex;
47
- align-items: center;
48
- justify-content: center;
49
- color: var(--text);
50
- svg {
51
- height: 16px;
52
- width: 16px;
53
- }
54
- }
55
- }
56
57
  .menu-item-badge {
57
58
  top: -3px;
58
59
  right: -3px;
@@ -1,14 +1,6 @@
1
- .iui-print-dialog {
2
- position: absolute;
3
- z-index: 2000;
4
- left: 0;
5
- top: 0;
6
- bottom: 0;
7
- left: 0;
8
- min-height: 100vh;
9
- width: 100%;
10
- animation: fade-in 200ms forwards;
11
- & > .content {
1
+ .iui-print {
2
+ padding: 0 !important;
3
+ & > .print-content {
12
4
  background: #fefefe;
13
5
  padding: 10px 50px 60px 50px;
14
6
  p,
@@ -24,46 +16,17 @@
24
16
  margin-bottom: 5px;
25
17
  }
26
18
  }
27
- @media print {
28
- .content {
29
- padding: 0;
30
- }
31
- }
32
- }
33
- .iui-print-actions {
34
- position: fixed;
35
- left: 0;
36
- right: 0;
37
- bottom: 0;
38
- height: 50px;
39
- background-color: #fefefe;
40
- box-shadow: var(--container-shadow);
41
- display: flex;
42
- align-items: center;
43
- justify-content: center;
44
19
  }
45
20
 
46
21
  .print-table {
47
- @media print and (orientation: landscape) {
48
- width: 842pt;
49
- }
50
- @media print and (orientation: portrait) {
51
- width: 595pt;
52
- }
53
- // font-size: 10pt;
22
+ border-spacing: 0px;
23
+ border-collapse: collapse;
54
24
  thead tr {
55
25
  background: #f1f1f1;
56
26
  }
57
- th {
58
- padding: 5px;
59
- border: 1px solid silver;
60
- p {
61
- // font-size: 10pt;
62
- padding: 4px 8px !important;
63
- }
64
- }
27
+ th,
65
28
  td {
66
- padding: 3px;
29
+ padding: 4px;
67
30
  border: 1px solid silver;
68
31
  }
69
32
  }
@@ -72,14 +35,41 @@
72
35
  @page {
73
36
  margin: 6.5mm;
74
37
  }
38
+
39
+ @media (orientation: landscape) {
40
+ .iui-print {
41
+ width: 842pt;
42
+ }
43
+ }
44
+ @media (orientation: portrait) {
45
+ .iui-print {
46
+ width: 595pt;
47
+ }
48
+ }
49
+ .pullover {
50
+ position: static !important;
51
+ overflow: visible !important;
52
+ }
53
+ .iui-print {
54
+ position: absolute !important;
55
+ inset: 0 !important;
56
+ width: 100% !important;
57
+ background: white !important;
58
+ overflow: visible !important;
59
+ .print-content {
60
+ padding: 0 !important;
61
+ height: auto !important;
62
+ overflow: visible !important;
63
+ }
64
+ }
75
65
  #root,
76
66
  .no-print {
77
- display: none;
67
+ display: none !important;
78
68
  }
79
69
  body {
80
70
  -webkit-print-color-adjust: exact;
81
71
  print-color-adjust: exact;
82
- // overflow: visible !important;
72
+ overflow: visible !important;
83
73
  }
84
74
  tbody td {
85
75
  white-space: pre-wrap !important;
@@ -0,0 +1,83 @@
1
+ .progress-bar-container {
2
+ width: 100%;
3
+ max-width: 400px;
4
+ margin: auto;
5
+ }
6
+
7
+ .progress-label {
8
+ margin-bottom: 8px;
9
+ font-size: 16px;
10
+ color: var(--text);
11
+ }
12
+
13
+ .progress-bar-bg {
14
+ position: relative;
15
+ width: 100%;
16
+ height: 32px;
17
+ background: var(--neutral-200);
18
+ border-radius: 16px;
19
+ overflow: hidden;
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ }
24
+
25
+ .progress-bar-fill {
26
+ position: absolute;
27
+ left: 0;
28
+ height: 100%;
29
+ background: linear-gradient(90deg, var(--primary-400) 0%, var(--primary-600) 100%);
30
+ transition: width 0.3s cubic-bezier(0.67, 0.01, 0.83, 0.98);
31
+ overflow: hidden;
32
+
33
+ // Subtle shimmer animation to show activity
34
+ &.loading::before {
35
+ content: '';
36
+ position: absolute;
37
+ top: 0;
38
+ left: -100%;
39
+ width: 80%;
40
+ height: 100%;
41
+ background: linear-gradient(
42
+ 90deg,
43
+ transparent 0%,
44
+ rgba(255, 255, 255, 0.3) 50%,
45
+ transparent 100%
46
+ );
47
+ animation: shimmer 2s ease-in-out infinite;
48
+ }
49
+ }
50
+
51
+ .progress-bar-text {
52
+ width: 100%;
53
+ text-align: center;
54
+ font-size: 16px;
55
+ font-weight: bold;
56
+ color: var(--text);
57
+ border-radius: 32px;
58
+ padding: 0 8px;
59
+ pointer-events: none;
60
+ z-index: 1;
61
+ position: relative;
62
+
63
+ // White text overlay that shows only where progress bar is
64
+ &::after {
65
+ content: var(--progress-text, '');
66
+ position: absolute;
67
+ top: 0;
68
+ left: 0;
69
+ right: 0;
70
+ bottom: 0;
71
+ color: white;
72
+ display: flex;
73
+ align-items: center;
74
+ justify-content: center;
75
+ clip-path: polygon(
76
+ 0 0,
77
+ var(--progress-clip, 0%) 0%,
78
+ var(--progress-clip, 0%) 100%,
79
+ 0 100%
80
+ );
81
+ transition: clip-path 0.3s cubic-bezier(0.67, 0.01, 0.83, 0.98);
82
+ }
83
+ }