norma-library 0.5.817 → 0.6.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 (134) hide show
  1. package/dist/esm/components/Box/styles.d.ts +1 -1
  2. package/dist/esm/components/Breadcrumb/styles.d.ts +4 -4
  3. package/dist/esm/components/Card.d.ts +2 -2
  4. package/dist/esm/components/ChatMessageBalloon/ChatMessageBalloon.style.d.ts +5 -16
  5. package/dist/esm/components/ChatMessageBalloon/ChatMessageBalloon.style.js +5 -5
  6. package/dist/esm/components/ChatMessageBalloon/ChatMessageBalloon.style.js.map +1 -1
  7. package/dist/esm/components/DateInput/styles.d.ts +2 -2
  8. package/dist/esm/components/IconButton.js +2 -2
  9. package/dist/esm/components/IconButton.js.map +1 -1
  10. package/dist/esm/components/Modal.js +7 -7
  11. package/dist/esm/components/Modal.js.map +1 -1
  12. package/dist/esm/components/MultiSelectInput/components/Option/styles.d.ts +1 -1
  13. package/dist/esm/components/MultiSelectInput/styles.d.ts +2 -2
  14. package/dist/esm/components/ProgressBar.d.ts +1 -1
  15. package/dist/esm/components/ProgressBar.js +32 -17
  16. package/dist/esm/components/ProgressBar.js.map +1 -1
  17. package/dist/esm/components/RadioGroup.js +4 -3
  18. package/dist/esm/components/RadioGroup.js.map +1 -1
  19. package/dist/esm/components/RangerSlider.js +7 -5
  20. package/dist/esm/components/RangerSlider.js.map +1 -1
  21. package/dist/esm/components/SelectInput/components/Option/styles.d.ts +1 -1
  22. package/dist/esm/components/SelectInput/styles.d.ts +2 -2
  23. package/dist/esm/components/StatusModal/StatusModal.d.ts +11 -0
  24. package/dist/esm/components/StatusModal/StatusModal.js +26 -0
  25. package/dist/esm/components/StatusModal/StatusModal.js.map +1 -0
  26. package/dist/esm/components/StatusModal/StatusModal.style.d.ts +13 -0
  27. package/dist/esm/components/StatusModal/StatusModal.style.js +12 -0
  28. package/dist/esm/components/StatusModal/StatusModal.style.js.map +1 -0
  29. package/dist/esm/components/Table/components/header/index.js +3 -4
  30. package/dist/esm/components/Table/components/header/index.js.map +1 -1
  31. package/dist/esm/components/Table/components/header/styles.d.ts +8 -8
  32. package/dist/esm/components/Table/components/pagination/styles.d.ts +1 -1
  33. package/dist/esm/components/Table/components/tbody/styles.d.ts +1 -1
  34. package/dist/esm/components/Table/index.js +2 -2
  35. package/dist/esm/components/Table/index.js.map +1 -1
  36. package/dist/esm/components/Table/interface.d.ts +1 -0
  37. package/dist/esm/components/Table/styles.d.ts +10 -10
  38. package/dist/esm/components/Tabs.js +0 -1
  39. package/dist/esm/components/Tabs.js.map +1 -1
  40. package/dist/esm/components/TextInput/styles.d.ts +3 -3
  41. package/dist/esm/components/Typography/Text/styles.d.ts +1 -1
  42. package/dist/esm/components/Typography/Title/styles.d.ts +1 -1
  43. package/dist/esm/components/UncontrolledTable/components/header/index.d.ts +3 -0
  44. package/dist/esm/components/UncontrolledTable/components/header/index.js +25 -0
  45. package/dist/esm/components/UncontrolledTable/components/header/index.js.map +1 -0
  46. package/dist/esm/components/UncontrolledTable/components/header/styles.d.ts +9 -0
  47. package/dist/esm/components/UncontrolledTable/components/header/styles.js +12 -0
  48. package/dist/esm/components/UncontrolledTable/components/header/styles.js.map +1 -0
  49. package/dist/esm/components/UncontrolledTable/components/index.d.ts +4 -0
  50. package/dist/esm/components/UncontrolledTable/components/index.js +5 -0
  51. package/dist/esm/components/UncontrolledTable/components/index.js.map +1 -0
  52. package/dist/esm/components/UncontrolledTable/components/pagination/index.d.ts +11 -0
  53. package/dist/esm/components/UncontrolledTable/components/pagination/index.js +18 -0
  54. package/dist/esm/components/UncontrolledTable/components/pagination/index.js.map +1 -0
  55. package/dist/esm/components/UncontrolledTable/components/pagination/styles.d.ts +2 -0
  56. package/dist/esm/components/UncontrolledTable/components/pagination/styles.js +5 -0
  57. package/dist/esm/components/UncontrolledTable/components/pagination/styles.js.map +1 -0
  58. package/dist/esm/components/UncontrolledTable/components/tbody/index.d.ts +3 -0
  59. package/dist/esm/components/UncontrolledTable/components/tbody/index.js +15 -0
  60. package/dist/esm/components/UncontrolledTable/components/tbody/index.js.map +1 -0
  61. package/dist/esm/components/UncontrolledTable/components/tbody/styles.d.ts +3 -0
  62. package/dist/esm/components/UncontrolledTable/components/tbody/styles.js +12 -0
  63. package/dist/esm/components/UncontrolledTable/components/tbody/styles.js.map +1 -0
  64. package/dist/esm/components/UncontrolledTable/index.d.ts +4 -0
  65. package/dist/esm/components/UncontrolledTable/index.js +86 -0
  66. package/dist/esm/components/UncontrolledTable/index.js.map +1 -0
  67. package/dist/esm/components/UncontrolledTable/interface.d.ts +40 -0
  68. package/dist/esm/components/UncontrolledTable/interface.js +2 -0
  69. package/dist/esm/components/UncontrolledTable/interface.js.map +1 -0
  70. package/dist/esm/components/UncontrolledTable/styles.d.ts +14 -0
  71. package/dist/esm/components/UncontrolledTable/styles.js +22 -0
  72. package/dist/esm/components/UncontrolledTable/styles.js.map +1 -0
  73. package/dist/esm/components/UncontrolledTabs/UncontrolledTabs.d.ts +14 -0
  74. package/dist/esm/components/UncontrolledTabs/UncontrolledTabs.js +29 -0
  75. package/dist/esm/components/UncontrolledTabs/UncontrolledTabs.js.map +1 -0
  76. package/dist/esm/components/UncontrolledTabs/UncontrolledTabs.style.d.ts +12 -0
  77. package/dist/esm/components/UncontrolledTabs/UncontrolledTabs.style.js +49 -0
  78. package/dist/esm/components/UncontrolledTabs/UncontrolledTabs.style.js.map +1 -0
  79. package/dist/esm/helpers/colors.d.ts +4 -0
  80. package/dist/esm/helpers/colors.js +56 -9
  81. package/dist/esm/helpers/colors.js.map +1 -1
  82. package/dist/esm/hooks/useClickOutside.d.ts +2 -0
  83. package/dist/esm/hooks/useClickOutside.js +16 -0
  84. package/dist/esm/hooks/useClickOutside.js.map +1 -0
  85. package/dist/esm/index.d.ts +6 -1
  86. package/dist/esm/index.js +6 -1
  87. package/dist/esm/index.js.map +1 -1
  88. package/dist/esm/interfaces/Modal.d.ts +2 -1
  89. package/dist/esm/interfaces/ProgressBar.d.ts +11 -1
  90. package/dist/esm/interfaces/RadioGroup.d.ts +2 -1
  91. package/dist/esm/types/index.d.ts +4 -1
  92. package/dist/esm/utils/styledBreakpoints.d.ts +10 -0
  93. package/dist/esm/utils/styledBreakpoints.js +12 -0
  94. package/dist/esm/utils/styledBreakpoints.js.map +1 -0
  95. package/package.json +3 -3
  96. package/src/components/ChatMessageBalloon/ChatMessageBalloon.style.ts +16 -16
  97. package/src/components/IconButton.tsx +3 -3
  98. package/src/components/Modal.tsx +17 -27
  99. package/src/components/ProgressBar.tsx +47 -23
  100. package/src/components/RadioGroup.tsx +4 -1
  101. package/src/components/RangerSlider.tsx +7 -7
  102. package/src/components/StatusModal/StatusModal.style.tsx +75 -0
  103. package/src/components/StatusModal/StatusModal.tsx +58 -0
  104. package/src/components/Table/components/header/index.tsx +5 -2
  105. package/src/components/Table/index.tsx +2 -1
  106. package/src/components/Table/interface.ts +1 -0
  107. package/src/components/Tabs.tsx +0 -1
  108. package/src/components/UncontrolledTable/components/header/index.tsx +65 -0
  109. package/src/components/UncontrolledTable/components/header/styles.tsx +63 -0
  110. package/src/components/UncontrolledTable/components/index.tsx +9 -0
  111. package/src/components/UncontrolledTable/components/pagination/index.tsx +43 -0
  112. package/src/components/UncontrolledTable/components/pagination/styles.tsx +29 -0
  113. package/src/components/UncontrolledTable/components/tbody/index.tsx +33 -0
  114. package/src/components/UncontrolledTable/components/tbody/styles.tsx +32 -0
  115. package/src/components/UncontrolledTable/index.tsx +221 -0
  116. package/src/components/UncontrolledTable/interface.ts +43 -0
  117. package/src/components/UncontrolledTable/styles.tsx +123 -0
  118. package/src/components/UncontrolledTabs/UncontrolledTabs.style.tsx +56 -0
  119. package/src/components/UncontrolledTabs/UncontrolledTabs.tsx +68 -0
  120. package/src/helpers/colors.ts +62 -10
  121. package/src/hooks/useClickOutside.tsx +18 -0
  122. package/src/index.ts +13 -4
  123. package/src/interfaces/Modal.ts +3 -1
  124. package/src/interfaces/ProgressBar.ts +12 -1
  125. package/src/interfaces/RadioGroup.ts +2 -1
  126. package/src/stories/Modal.stories.tsx +55 -4
  127. package/src/stories/ModalStatus.stories.tsx +46 -0
  128. package/src/stories/ProgressBar.stories.tsx +48 -27
  129. package/src/stories/RangerSlider.stories.tsx +126 -35
  130. package/src/stories/Tabs.stories.tsx +0 -1
  131. package/src/stories/UncontrolledTable.stories.tsx +305 -0
  132. package/src/stories/UncontrolledTabs.stories.tsx +63 -0
  133. package/src/types/index.ts +4 -1
  134. package/src/utils/styledBreakpoints.ts +25 -0
@@ -0,0 +1,221 @@
1
+ import React, { useState, useMemo, useRef } from 'react';
2
+ import * as S from './styles';
3
+
4
+ import {
5
+ flexRender,
6
+ getCoreRowModel,
7
+ getSortedRowModel,
8
+ useReactTable,
9
+ ColumnFiltersState,
10
+ TableOptions,
11
+ } from '@tanstack/react-table';
12
+
13
+ import { Pagination, Header, TBody } from './components';
14
+ import { UncontrolledTableProps } from './interface';
15
+ import useClickOutside from '../../hooks/useClickOutside';
16
+
17
+ const UncontrolledTable = (props: UncontrolledTableProps) => {
18
+ const {
19
+ data,
20
+ columns,
21
+ onClick,
22
+ onMouseOver,
23
+ onMouseOut,
24
+ showTotalResults,
25
+ showSettings,
26
+ onChangePage,
27
+ pagination,
28
+ totalPages,
29
+ showClearFields,
30
+ onClearFieldsClick,
31
+ onFilterClick,
32
+ onSortClick,
33
+ customTotalResults,
34
+ labels,
35
+ tableClassName,
36
+ stickyHeader,
37
+ } = props;
38
+
39
+ const [openFilterDialog, setOpenFilterDialog] = useState('');
40
+ const [sorting, setSorting] = useState<any>([]);
41
+ const [filterByColumn, setFilterByColumn] = useState<ColumnFiltersState>([]);
42
+ const [globalFilters, setGlobalFilters] = useState<any>([]);
43
+ const [orderSmallest, setOrderSmallest] = useState(false);
44
+ const [orderLargest, setOrderLargest] = useState(false);
45
+
46
+ const reactTableConfig = useMemo(() => {
47
+ const config: TableOptions<unknown> = {
48
+ columns: columns as any,
49
+ data,
50
+ state: {
51
+ sorting: sorting,
52
+ columnFilters: filterByColumn,
53
+ pagination: pagination,
54
+ },
55
+ rowCount: totalPages,
56
+ getCoreRowModel: getCoreRowModel(),
57
+ getSortedRowModel: getSortedRowModel(),
58
+ onSortingChange: setSorting,
59
+ onColumnFiltersChange: setFilterByColumn,
60
+ manualPagination: true,
61
+ };
62
+
63
+ return config;
64
+ }, [data, sorting, filterByColumn, columns, pagination]);
65
+
66
+ const table = useReactTable(reactTableConfig);
67
+ const filterRef = useRef<HTMLDivElement>(null);
68
+
69
+ useClickOutside(filterRef, () => setOpenFilterDialog(''));
70
+
71
+ return (
72
+ <S.Container>
73
+ <Header
74
+ table={table}
75
+ globalFilters={globalFilters}
76
+ orderSmallest={orderSmallest}
77
+ orderLargest={orderLargest}
78
+ showTotalResults={showTotalResults}
79
+ showSettings={showSettings}
80
+ setGlobalFilters={setGlobalFilters}
81
+ setOrderLargest={setOrderLargest}
82
+ setOrderSmallest={setOrderSmallest}
83
+ showClearFiels={showClearFields}
84
+ customTotalResults={customTotalResults}
85
+ clearLabel={labels?.clearFilter}
86
+ onClearFieldsClick={() => onClearFieldsClick && onClearFieldsClick()}
87
+ />
88
+ <S.Table className={tableClassName || ''}>
89
+ <S.Thead $sticky={stickyHeader}>
90
+ {table.getHeaderGroups().map((headerGroup: any) => (
91
+ <S.TableRow key={headerGroup.id}>
92
+ {headerGroup.headers.map((header: any) => (
93
+ <S.Th key={header.id}>
94
+ <S.ColumnContent
95
+ onClick={() => {
96
+ if (!header?.column?.columnDef?.disableMenu)
97
+ setOpenFilterDialog(header.column.columnDef.accessorKey);
98
+ }}
99
+ >
100
+ <S.TextColumn>
101
+ {!header.isPlaceholder && flexRender(header.column.columnDef.header, header.getContext())}
102
+ </S.TextColumn>
103
+ {!header?.column?.columnDef?.disableMenu && (
104
+ <S.IconFilterDialog>
105
+ <svg fill="#666" focusable="false" aria-hidden="true" viewBox="0 0 24 24">
106
+ <path d="m7 10 5 5 5-5z" />
107
+ </svg>
108
+ </S.IconFilterDialog>
109
+ )}
110
+ </S.ColumnContent>
111
+ {openFilterDialog === header.column.columnDef.accessorKey && (
112
+ <S.FilterDialog ref={filterRef}>
113
+ <S.ListFilterDialog>
114
+ <S.OptionFilterDialog
115
+ style={{
116
+ background: orderSmallest ? 'rgba(0, 0, 0, 0.04)' : '',
117
+ }}
118
+ onClick={() => {
119
+ onSortClick && onSortClick(header.column.columnDef.accessorKey, 'asc');
120
+ setOpenFilterDialog('');
121
+ }}
122
+ >
123
+ <div className="icon">
124
+ <svg
125
+ fill="#666"
126
+ stroke="currentColor"
127
+ strokeWidth="1.5"
128
+ viewBox="0 0 24 24"
129
+ xmlns="http://www.w3.org/2000/svg"
130
+ aria-hidden="true"
131
+ width="20"
132
+ height="20"
133
+ >
134
+ <path
135
+ strokeLinecap="round"
136
+ strokeLinejoin="round"
137
+ d="M12 4.5v15m0 0l6.75-6.75M12 19.5l-6.75-6.75"
138
+ />
139
+ </svg>
140
+ </div>
141
+ <p>{labels?.orderAsc || 'Menor primeiro'}</p>
142
+ </S.OptionFilterDialog>
143
+ <S.OptionFilterDialog
144
+ style={{
145
+ background: orderLargest ? 'rgba(0, 0, 0, 0.04)' : '',
146
+ }}
147
+ onClick={() => {
148
+ onSortClick && onSortClick(header.column.columnDef.accessorKey, 'desc');
149
+ setOpenFilterDialog('');
150
+ }}
151
+ >
152
+ <div className="icon rotate">
153
+ <svg
154
+ fill="#666"
155
+ stroke="currentColor"
156
+ strokeWidth="1.5"
157
+ viewBox="0 0 24 24"
158
+ xmlns="http://www.w3.org/2000/svg"
159
+ aria-hidden="true"
160
+ width="20"
161
+ height="20"
162
+ >
163
+ <path
164
+ strokeLinecap="round"
165
+ strokeLinejoin="round"
166
+ d="M12 4.5v15m0 0l6.75-6.75M12 19.5l-6.75-6.75"
167
+ ></path>
168
+ </svg>
169
+ </div>
170
+ <p>{labels?.orderDesc || 'Maior primeiro'}</p>
171
+ </S.OptionFilterDialog>
172
+ {!header?.column?.columnDef?.nofilter && (
173
+ <S.OptionFilterDialog
174
+ onClick={() => {
175
+ onFilterClick && onFilterClick(header.column.columnDef.accessorKey);
176
+ setOpenFilterDialog('');
177
+ }}
178
+ >
179
+ <div className="icon">
180
+ <svg
181
+ fill="none"
182
+ stroke="currentColor"
183
+ strokeWidth="1.5"
184
+ viewBox="0 0 24 24"
185
+ xmlns="http://www.w3.org/2000/svg"
186
+ aria-hidden="true"
187
+ width="16"
188
+ height="16"
189
+ >
190
+ <path
191
+ strokeLinecap="round"
192
+ strokeLinejoin="round"
193
+ d="M12 3c2.755 0 5.455.232 8.083.678.533.09.917.556.917 1.096v1.044a2.25 2.25 0 01-.659 1.591l-5.432 5.432a2.25 2.25 0 00-.659 1.591v2.927a2.25 2.25 0 01-1.244 2.013L9.75 21v-6.568a2.25 2.25 0 00-.659-1.591L3.659 7.409A2.25 2.25 0 013 5.818V4.774c0-.54.384-1.006.917-1.096A48.32 48.32 0 0112 3z"
194
+ ></path>
195
+ </svg>
196
+ </div>
197
+ <p>{labels?.filter || 'Filtrar por'}</p>
198
+ </S.OptionFilterDialog>
199
+ )}
200
+ </S.ListFilterDialog>
201
+ </S.FilterDialog>
202
+ )}
203
+ </S.Th>
204
+ ))}
205
+ </S.TableRow>
206
+ ))}
207
+ </S.Thead>
208
+ <TBody table={table} onClick={onClick} onMouseOver={onMouseOver} onMouseOut={onMouseOut} />
209
+ </S.Table>
210
+ {pagination && (
211
+ <Pagination
212
+ pagination={pagination}
213
+ count={totalPages}
214
+ onChangePage={(page: number) => onChangePage({ ...pagination, pageIndex: page })}
215
+ />
216
+ )}
217
+ </S.Container>
218
+ );
219
+ };
220
+
221
+ export default UncontrolledTable;
@@ -0,0 +1,43 @@
1
+ import { ColumnDef } from '@tanstack/react-table';
2
+
3
+ type Labels = {
4
+ orderAsc: string;
5
+ orderDesc: string;
6
+ filter: string;
7
+ clearFilter: string;
8
+ };
9
+
10
+ interface Pagination {
11
+ pageIndex: number;
12
+ pageSize: number;
13
+ }
14
+
15
+ export interface UncontrolledTableProps {
16
+ data: any;
17
+ columns: ColumnDef<ColumnsTable>[];
18
+ onClick: any;
19
+ onMouseOver: any;
20
+ onMouseOut: any;
21
+ showTotalResults: boolean;
22
+ showSettings: boolean;
23
+ pagination?: Pagination;
24
+ totalPages: number;
25
+ showClearFields?: boolean;
26
+ customTotalResults?: string;
27
+ onChangePage: (pagination: Pagination) => void;
28
+ onClearFieldsClick?: () => void;
29
+ onFilterClick?: (column: string) => void;
30
+ onSortClick?: (column: string, direction: string) => void;
31
+ labels?: Labels;
32
+ tableClassName?: string;
33
+ stickyHeader?: boolean;
34
+ }
35
+
36
+ export interface ColumnsTable {
37
+ header: string;
38
+ accessorKey: string;
39
+ type: string;
40
+ enableColumnFilter: boolean;
41
+ filterFn: string;
42
+ nofilter?: boolean;
43
+ }
@@ -0,0 +1,123 @@
1
+ import { breakpoints } from '../../utils/styledBreakpoints';
2
+ import styled from 'styled-components';
3
+
4
+ export const Container = styled.div`
5
+ background-color: #fff;
6
+ `;
7
+
8
+ export const Table = styled.table`
9
+ display: table;
10
+ width: 100%;
11
+ border-collapse: collapse;
12
+ border-spacing: 0;
13
+ min-width: 650px;
14
+ border: none;
15
+ `;
16
+
17
+ const StickyStyles = `
18
+ position: sticky;
19
+ top: 0;
20
+ z-index: 99;
21
+ background: #fff;
22
+ `;
23
+
24
+ export const Thead = styled.thead<{ $sticky?: boolean }>`
25
+ display: table-header-group;
26
+ ${props => props.$sticky && StickyStyles}
27
+ `;
28
+
29
+ export const TableRow = styled.tr`
30
+ color: inherit;
31
+ display: table-row;
32
+ vertical-align: middle;
33
+ outline: 0;
34
+ `;
35
+
36
+ export const Th = styled.th`
37
+ font-weight: 500;
38
+ font-size: 0.875rem;
39
+ line-height: 1.5rem;
40
+ letter-spacing: 0.01071em;
41
+ display: table-cell;
42
+ vertical-align: inherit;
43
+ border-bottom: 1px solid rgba(224, 224, 224, 1);
44
+ text-align: left;
45
+ padding: 16px;
46
+ ${breakpoints({
47
+ cssProp: 'padding',
48
+ cssPropUnits: 'px',
49
+ values: [{ 1440: 8 }],
50
+ mediaQueryType: 'max-width',
51
+ })};
52
+ color: rgba(0, 0, 0, 0.87);
53
+ color: #666666;
54
+ font-size: 0.875rem;
55
+ font-weight: 700;
56
+ `;
57
+
58
+ export const ColumnContent = styled.div`
59
+ display: flex;
60
+ align-items: center;
61
+ gap: 5px;
62
+ `;
63
+
64
+ export const TextColumn = styled.span``;
65
+
66
+ export const IconFilterDialog = styled.div`
67
+ height: 20px;
68
+ width: 20px;
69
+ `;
70
+
71
+ export const FilterDialog = styled.div`
72
+ position: absolute;
73
+ padding: 10px 0;
74
+ margin: 6px 0px 0 0;
75
+ width: max-content;
76
+ background: #fff;
77
+ box-shadow: 0px 3px 6px #00000029;
78
+ border: 1px solid #e0e0e0;
79
+ z-index: 99;
80
+ `;
81
+
82
+ export const ListFilterDialog = styled.div`
83
+ display: flex;
84
+ flex-direction: column;
85
+ .label {
86
+ margin: 0 0 8px 0;
87
+ color: #666666;
88
+ font-size: 14px;
89
+ font-weight: 400;
90
+ text-align: left;
91
+ }
92
+ .select {
93
+ border: 1px solid #e0e0e0;
94
+ padding: 8px 12px;
95
+ }
96
+ `;
97
+
98
+ export const OptionFilterDialog = styled.div`
99
+ display: flex;
100
+ gap: 16px;
101
+ align-items: center;
102
+ padding: 6px 15px;
103
+ cursor: pointer;
104
+ &:hover {
105
+ background: rgba(0, 0, 0, 0.04);
106
+ }
107
+ .icon {
108
+ color: #666;
109
+ }
110
+ .rotate {
111
+ rotate: 180deg;
112
+ }
113
+ div {
114
+ width: 20px;
115
+ height: 20px;
116
+ }
117
+ p {
118
+ margin: 0;
119
+ color: #666666;
120
+ font-size: 16px;
121
+ font-weight: 400;
122
+ }
123
+ `;
@@ -0,0 +1,56 @@
1
+ import React from 'react';
2
+ import { styled } from '@mui/material/styles';
3
+ import { TabsProps } from '@mui/material/Tabs';
4
+
5
+ import { Tab, Tabs } from '@mui/material';
6
+ import { ColorVariant } from '@/types';
7
+ import { palette } from '../../helpers';
8
+
9
+ const colorMap: Record<ColorVariant, string> = {
10
+ inherit: palette.inherit,
11
+ primary: palette.primary,
12
+ secondary: palette.secondary,
13
+ error: palette.error,
14
+ warning: palette.warning,
15
+ info: palette.info,
16
+ success: palette.success,
17
+ };
18
+
19
+ interface StyledTabProps {
20
+ label: string;
21
+ color: ColorVariant;
22
+ }
23
+
24
+ export const NormaTabs: React.ComponentType<TabsProps & { color: ColorVariant }> = styled(Tabs)<{
25
+ color: ColorVariant;
26
+ }>(({ color }) => ({
27
+ borderBottom: '1px solid #e8e8e8',
28
+ '& .Mui-selected': {
29
+ color: colorMap[color],
30
+ },
31
+ '& .MuiTabs-indicator': {
32
+ backgroundColor: colorMap[color],
33
+ },
34
+ '& .MuiButtonBase-root': {
35
+ textTransform: 'none',
36
+ },
37
+ }));
38
+
39
+ export const NormaTab: React.ComponentType<StyledTabProps> = styled((props: StyledTabProps) => (
40
+ <Tab disableRipple {...props} />
41
+ ))(({ theme, color }) => ({
42
+ textTransform: 'none',
43
+ fontWeight: theme.typography.fontWeightRegular,
44
+ fontSize: theme.typography.pxToRem(15),
45
+ marginRight: theme.spacing(1),
46
+ color: '#666666',
47
+ padding: '5px 15px',
48
+ top: '5px',
49
+ minWidth: '60px',
50
+ '&.Mui-selected': {
51
+ color: colorMap[color],
52
+ },
53
+ '&.Mui-focusVisible': {
54
+ backgroundColor: 'rgba(100, 95, 228, 0.32)',
55
+ },
56
+ }));
@@ -0,0 +1,68 @@
1
+ import React, { SyntheticEvent } from 'react';
2
+ import { Box, SxProps } from '@mui/material';
3
+ import { ColorVariant, DataTabs, MuiTabsBaseProps, TabsVariant } from '@/types';
4
+ import { NormaTab, NormaTabs } from './UncontrolledTabs.style';
5
+ import { Theme } from '@emotion/react';
6
+
7
+ interface Props extends MuiTabsBaseProps {
8
+ sx?: SxProps<Theme>;
9
+ tabs: DataTabs[];
10
+ tab: number;
11
+ onTabChange: (event: SyntheticEvent, tab: number) => void;
12
+ color?: ColorVariant;
13
+ variant?: TabsVariant;
14
+ }
15
+
16
+ interface TabPanelProps {
17
+ children?: React.ReactNode;
18
+ index: number;
19
+ value: number;
20
+ }
21
+
22
+ function TabPanel(props: TabPanelProps) {
23
+ const { children, value, index, ...other } = props;
24
+
25
+ return (
26
+ <div
27
+ role="tabpanel"
28
+ hidden={value !== index}
29
+ id={`simple-tabpanel-${index}`}
30
+ aria-labelledby={`simple-tab-${index}`}
31
+ {...other}
32
+ >
33
+ {value === index && <Box sx={{ p: 3 }}>{children}</Box>}
34
+ </div>
35
+ );
36
+ }
37
+
38
+ function a11yProps(index: number) {
39
+ return {
40
+ id: `simple-tab-${index}`,
41
+ 'aria-controls': `simple-tabpanel-${index}`,
42
+ };
43
+ }
44
+
45
+ const UncontrolledTabs = ({ tabs, tab, color = 'primary', onTabChange, ...props }: Props) => {
46
+ const handleChange = (event: SyntheticEvent, newValue: number) => {
47
+ onTabChange(event, newValue);
48
+ };
49
+
50
+ return (
51
+ <Box sx={{ width: '100%' }}>
52
+ <Box>
53
+ <NormaTabs value={tab} color={color} onChange={handleChange} aria-label="tabs" {...props}>
54
+ {tabs.map((item, key) => (
55
+ <NormaTab key={key} label={item.label} color={color} {...a11yProps(key)} />
56
+ ))}
57
+ </NormaTabs>
58
+ </Box>
59
+ {tabs.map((item, key) => (
60
+ <TabPanel {...item.tabPanel?.props} key={key} value={tab} index={key}>
61
+ {item.children}
62
+ </TabPanel>
63
+ ))}
64
+ </Box>
65
+ );
66
+ };
67
+
68
+ export default UncontrolledTabs;
@@ -1,20 +1,20 @@
1
- import { createTheme } from '@mui/material/styles';
1
+ import { createTheme, PaletteOptions } from '@mui/material/styles';
2
2
 
3
3
  export const getPalette = () => {
4
4
  return {
5
- primary: 'rgb(219, 102, 25)',
5
+ primary: '#db6619',
6
6
  primaryLight: '#FFDB9F',
7
7
  primaryMedium: '#FFA84C',
8
8
  primaryDark: '#B74608',
9
- inherit: 'rgb(102, 102, 102)',
10
- secondary: 'rgb(67, 187, 242)',
11
- error: 'rgb(214, 54, 67)',
12
- warning: 'rgb(255, 195, 0)',
13
- info: 'rgb(113, 213, 247)',
14
- success: 'rgb(107, 194, 53)',
9
+ inherit: '#666666',
10
+ secondary: '#43bbf2',
11
+ error: '#d63643',
12
+ warning: '#ffc300',
13
+ info: '#71d5f7',
14
+ success: '#6bc235',
15
15
  white: '#ffffff',
16
- black: 'rgb(0, 0, 0)',
17
- helper: 'rgb(90, 42, 121)',
16
+ black: '#000000',
17
+ helper: '#5a2a79',
18
18
  secondaryLight: '#D9FCFE',
19
19
  secondaryMedium: '#71D5F7',
20
20
  secondaryDark: '#154F8C',
@@ -135,6 +135,50 @@ export const olosPalette = {
135
135
  },
136
136
  };
137
137
 
138
+ export const newOlosPalette: PaletteOptions = {
139
+ primary: {
140
+ main: palette.primary,
141
+ light: palette.primaryLight,
142
+ dark: palette.primaryDark,
143
+ '500': palette.primaryMedium,
144
+ },
145
+ secondary: {
146
+ main: palette.secondary,
147
+ light: palette.secondaryLight,
148
+ dark: palette.secondaryDark,
149
+ '500': palette.secondaryMedium,
150
+ },
151
+ error: {
152
+ main: palette.error,
153
+ light: palette.errorLight,
154
+ dark: palette.errorDark,
155
+ '500': palette.errorMedium,
156
+ },
157
+ warning: {
158
+ main: palette.warning,
159
+ light: palette.warningLight,
160
+ dark: palette.warningDark,
161
+ '500': palette.warningMedium,
162
+ },
163
+ info: {
164
+ main: palette.inherit,
165
+ light: palette.inheritLight,
166
+ dark: palette.inheritDark,
167
+ '500': palette.inheritMedium,
168
+ },
169
+ success: {
170
+ main: palette.success,
171
+ light: palette.successLight,
172
+ dark: palette.successDark,
173
+ '500': palette.successMedium,
174
+ },
175
+ text: {
176
+ primary: palette.black,
177
+ secondary: palette.primary,
178
+ disabled: palette.inherit,
179
+ }
180
+ };
181
+
138
182
  export const lightTheme = createTheme({
139
183
  palette: {
140
184
  mode: 'light',
@@ -142,6 +186,13 @@ export const lightTheme = createTheme({
142
186
  },
143
187
  });
144
188
 
189
+ export const newLightTheme = createTheme({
190
+ palette: {
191
+ mode: 'light',
192
+ ...newOlosPalette,
193
+ },
194
+ });
195
+
145
196
  export const darkTheme = createTheme({
146
197
  palette: {
147
198
  mode: 'dark',
@@ -156,6 +207,7 @@ export const darkTheme = createTheme({
156
207
  export const themes = {
157
208
  light: lightTheme,
158
209
  dark: darkTheme,
210
+ newLight: newLightTheme,
159
211
  };
160
212
 
161
213
  type PaletteKey = keyof typeof getPalette;
@@ -0,0 +1,18 @@
1
+ import { useEffect } from 'react';
2
+
3
+ const useClickOutside = (ref: React.RefObject<HTMLElement>, callback: () => void) => {
4
+ const handleClickOutside = (event: MouseEvent) => {
5
+ if (ref.current && !ref.current.contains(event.target as Node)) {
6
+ callback();
7
+ }
8
+ };
9
+
10
+ useEffect(() => {
11
+ document.addEventListener('mousedown', handleClickOutside);
12
+ return () => {
13
+ document.removeEventListener('mousedown', handleClickOutside);
14
+ };
15
+ }, [ref, callback]);
16
+ };
17
+
18
+ export default useClickOutside;
package/src/index.ts CHANGED
@@ -18,14 +18,18 @@ import { ChatMessage, ChatMessageBalloon } from './components';
18
18
  import { NormaProvider } from './providers/NormaProvider';
19
19
  import { themes, getPalette } from './helpers';
20
20
  import DateInput from './components/DateInput';
21
- import Box from './components/Box'
21
+ import Box from './components/Box';
22
22
  import Breadcrumb from './components/Breadcrumb';
23
23
  import SelectInput from './components/SelectInput';
24
24
  import MultiSelectInput from './components/MultiSelectInput';
25
- import { Title, Text } from './components/Typography'
25
+ import { Title, Text } from './components/Typography';
26
26
  import TextInput from './components/TextInput';
27
27
  import Table from './components/Table';
28
-
28
+ import UncontrolledTable from './components/UncontrolledTable';
29
+ import UncontrolledTabs from './components/UncontrolledTabs/UncontrolledTabs';
30
+ import { ModalStatus } from './components/StatusModal/StatusModal';
31
+ import { breakpoints } from './utils/styledBreakpoints';
32
+ import { useTheme } from '@mui/material';
29
33
 
30
34
  export {
31
35
  Accordion,
@@ -57,5 +61,10 @@ export {
57
61
  Text,
58
62
  Title,
59
63
  TextInput,
60
- Table
64
+ Table,
65
+ UncontrolledTable,
66
+ UncontrolledTabs,
67
+ ModalStatus,
68
+ breakpoints,
69
+ useTheme
61
70
  };
@@ -8,9 +8,11 @@ export interface ModalBaseProps extends MuiModalBaseProps {
8
8
  open: boolean;
9
9
  onClose?: React.ReactEventHandler<{}>;
10
10
  action?: OnAction[];
11
+ actionSpaceBetween?: boolean;
11
12
  className?: string;
12
- full?: boolean;
13
13
  title?: string;
14
14
  id?: string;
15
15
  paperProps?: MuiPaperBaseProps;
16
+ width?: string;
17
+
16
18
  }