@licklist/design 0.78.32 → 0.78.33

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 (123) hide show
  1. package/dist/Maintenance/MaintenancePage.js +1 -0
  2. package/dist/index.js +8 -1
  3. package/dist/v2/components/ActionMenu/ActionMenu.d.ts +14 -0
  4. package/dist/v2/components/ActionMenu/ActionMenu.d.ts.map +1 -0
  5. package/dist/v2/components/ActionMenu/ActionMenu.js +159 -0
  6. package/dist/v2/components/ActionMenu/ActionMenu.scss.js +6 -0
  7. package/dist/v2/components/ActionMenu/index.d.ts +2 -0
  8. package/dist/v2/components/ActionMenu/index.d.ts.map +1 -0
  9. package/dist/v2/components/Alert/Alert.scss.js +1 -1
  10. package/dist/v2/components/Badge/Badge.d.ts +10 -0
  11. package/dist/v2/components/Badge/Badge.d.ts.map +1 -0
  12. package/dist/v2/components/Badge/Badge.js +19 -0
  13. package/dist/v2/components/Badge/Badge.scss.js +6 -0
  14. package/dist/v2/components/Badge/index.d.ts +2 -0
  15. package/dist/v2/components/Badge/index.d.ts.map +1 -0
  16. package/dist/v2/components/Button/Button.d.ts +3 -2
  17. package/dist/v2/components/Button/Button.d.ts.map +1 -1
  18. package/dist/v2/components/Button/Button.js +13 -6
  19. package/dist/v2/components/Button/Button.scss.js +1 -1
  20. package/dist/v2/components/Button/GhostButton.scss.js +1 -1
  21. package/dist/v2/components/Button/index.d.ts +2 -0
  22. package/dist/v2/components/Button/index.d.ts.map +1 -1
  23. package/dist/v2/components/Checkbox/Checkbox.scss.js +1 -1
  24. package/dist/v2/components/FormField/FormField.d.ts.map +1 -1
  25. package/dist/v2/components/FormField/FormField.scss.js +1 -1
  26. package/dist/v2/components/Modal/DeleteModal.d.ts +15 -0
  27. package/dist/v2/components/Modal/DeleteModal.d.ts.map +1 -0
  28. package/dist/v2/components/Modal/DeleteModal.js +151 -0
  29. package/dist/v2/components/Modal/DeleteModal.scss.js +6 -0
  30. package/dist/v2/components/Modal/index.d.ts +3 -0
  31. package/dist/v2/components/Modal/index.d.ts.map +1 -0
  32. package/dist/v2/components/NewInput/NewInput.d.ts +2 -0
  33. package/dist/v2/components/NewInput/NewInput.d.ts.map +1 -1
  34. package/dist/v2/components/NewInput/NewInput.js +37 -12
  35. package/dist/v2/components/NewPageHeader/NewPageHeader.d.ts +4 -1
  36. package/dist/v2/components/NewPageHeader/NewPageHeader.d.ts.map +1 -1
  37. package/dist/v2/components/NewPageHeader/NewPageHeader.js +18 -11
  38. package/dist/v2/components/NewPageHeader/NewPageHeader.scss.js +1 -1
  39. package/dist/v2/components/NewTable/NewTable.d.ts +21 -0
  40. package/dist/v2/components/NewTable/NewTable.d.ts.map +1 -0
  41. package/dist/v2/components/NewTable/NewTable.js +63 -0
  42. package/dist/v2/components/NewTable/NewTable.scss.js +6 -0
  43. package/dist/v2/components/NewTable/index.d.ts +2 -0
  44. package/dist/v2/components/NewTable/index.d.ts.map +1 -0
  45. package/dist/v2/components/Pagination/Pagination.d.ts +13 -0
  46. package/dist/v2/components/Pagination/Pagination.d.ts.map +1 -0
  47. package/dist/v2/components/Pagination/Pagination.js +76 -0
  48. package/dist/v2/components/Pagination/Pagination.scss.js +6 -0
  49. package/dist/v2/components/Pagination/index.d.ts +2 -0
  50. package/dist/v2/components/Pagination/index.d.ts.map +1 -0
  51. package/dist/v2/components/QuickFilter/QuickFilter.d.ts +14 -0
  52. package/dist/v2/components/QuickFilter/QuickFilter.d.ts.map +1 -0
  53. package/dist/v2/components/QuickFilter/QuickFilter.js +70 -0
  54. package/dist/v2/components/QuickFilter/QuickFilter.scss.js +6 -0
  55. package/dist/v2/components/QuickFilter/index.d.ts +2 -0
  56. package/dist/v2/components/QuickFilter/index.d.ts.map +1 -0
  57. package/dist/v2/components/SectionHeader/SectionHeader.d.ts.map +1 -1
  58. package/dist/v2/components/Select/Select.d.ts +7 -4
  59. package/dist/v2/components/Select/Select.d.ts.map +1 -1
  60. package/dist/v2/components/Select/Select.js +53 -24
  61. package/dist/v2/components/Select/Select.scss.js +1 -1
  62. package/dist/v2/components/TableSortIcon/TableSortIcon.d.ts +9 -0
  63. package/dist/v2/components/TableSortIcon/TableSortIcon.d.ts.map +1 -0
  64. package/dist/v2/components/TableSortIcon/TableSortIcon.js +14 -0
  65. package/dist/v2/components/TableSortIcon/index.d.ts +2 -0
  66. package/dist/v2/components/TableSortIcon/index.d.ts.map +1 -0
  67. package/dist/v2/components/WYSIWYGEditor/Icons.js +2 -2
  68. package/dist/v2/components/WYSIWYGEditor/WYSIWYGEditor.scss.js +1 -1
  69. package/dist/v2/components/index.d.ts +17 -4
  70. package/dist/v2/components/index.d.ts.map +1 -1
  71. package/dist/v2/icons/index.d.ts +46 -0
  72. package/dist/v2/icons/index.d.ts.map +1 -1
  73. package/dist/v2/icons/index.js +358 -4
  74. package/dist/v2/navigation/DashboardLayout/ProviderSidebar.d.ts.map +1 -1
  75. package/dist/v2/navigation/DashboardLayout/ProviderSidebar.js +4 -8
  76. package/dist/v2/pages/Settings/components/SidebarCustomisation.js +9 -3
  77. package/dist/v2/pages/Settings/components/SidebarNavItem.js +9 -3
  78. package/dist/v2/styles/form/NewInput.scss.js +1 -1
  79. package/package.json +3 -3
  80. package/src/v2/components/ActionMenu/ActionMenu.scss +106 -0
  81. package/src/v2/components/ActionMenu/ActionMenu.tsx +115 -0
  82. package/src/v2/components/ActionMenu/index.ts +1 -0
  83. package/src/v2/components/Badge/Badge.scss +82 -0
  84. package/src/v2/components/Badge/Badge.tsx +25 -0
  85. package/src/v2/components/Badge/index.ts +1 -0
  86. package/src/v2/components/Button/Button.tsx +18 -4
  87. package/src/v2/components/Button/GhostButton.scss +11 -1
  88. package/src/v2/components/Button/index.ts +2 -0
  89. package/src/v2/components/Customer/CustomerDetail.scss +319 -0
  90. package/src/v2/components/Customer/CustomersList.scss +815 -0
  91. package/src/v2/components/FormField/FormField.tsx +19 -21
  92. package/src/v2/components/Modal/DeleteModal.scss +254 -0
  93. package/src/v2/components/Modal/DeleteModal.tsx +102 -0
  94. package/src/v2/components/Modal/index.ts +3 -0
  95. package/src/v2/components/NewInput/NewInput.stories.tsx +3 -18
  96. package/src/v2/components/NewInput/NewInput.tsx +35 -12
  97. package/src/v2/components/NewPageHeader/NewPageHeader.scss +17 -8
  98. package/src/v2/components/NewPageHeader/NewPageHeader.tsx +17 -10
  99. package/src/v2/components/NewTable/NewTable.scss +126 -0
  100. package/src/v2/components/NewTable/NewTable.tsx +92 -0
  101. package/src/v2/components/NewTable/index.ts +1 -0
  102. package/src/v2/components/Pagination/Pagination.scss +142 -0
  103. package/src/v2/components/Pagination/Pagination.tsx +80 -0
  104. package/src/v2/components/Pagination/index.ts +1 -0
  105. package/src/v2/components/QuickFilter/QuickFilter.scss +67 -0
  106. package/src/v2/components/QuickFilter/QuickFilter.tsx +51 -0
  107. package/src/v2/components/QuickFilter/index.ts +1 -0
  108. package/src/v2/components/SectionHeader/SectionHeader.tsx +5 -7
  109. package/src/v2/components/Select/Select.scss +61 -24
  110. package/src/v2/components/Select/Select.stories.tsx +77 -1
  111. package/src/v2/components/Select/Select.tsx +63 -34
  112. package/src/v2/components/TableSortIcon/TableSortIcon.tsx +20 -0
  113. package/src/v2/components/TableSortIcon/index.ts +1 -0
  114. package/src/v2/components/WYSIWYGEditor/Icons.tsx +2 -2
  115. package/src/v2/components/index.ts +44 -5
  116. package/src/v2/icons/index.tsx +123 -3
  117. package/src/v2/navigation/DashboardLayout/ProviderSidebar.tsx +3 -1
  118. package/src/v2/navigation/config.tsx +1 -1
  119. package/src/v2/pages/Settings/components/SidebarCustomisation.tsx +1 -1
  120. package/src/v2/styles/common.scss +7 -0
  121. package/src/v2/styles/components/Button.scss +34 -2
  122. package/src/v2/styles/form/NewInput.scss +45 -21
  123. package/src/v2/styles/index.scss +1 -0
@@ -0,0 +1,126 @@
1
+ .new-table-wrapper {
2
+ width: 100%;
3
+ overflow-x: auto;
4
+ overflow-y: visible;
5
+
6
+ &.action-menu-open {
7
+ overflow: visible !important;
8
+ }
9
+ }
10
+
11
+ .new-table {
12
+ width: 100%;
13
+ border-collapse: collapse;
14
+ text-align: left;
15
+
16
+ &__head {
17
+ background-color: var(--surface-secondary, #F8F8FA);
18
+ }
19
+
20
+ &__header-cell {
21
+ padding: 16px 24px;
22
+ font-size: var(--text-small-size, 13px);
23
+ font-weight: 500;
24
+ color: var(--label-secondary, #9399B3);
25
+ border-bottom: 1px solid var(--border-primary, #E8E9EF);
26
+ white-space: nowrap;
27
+ }
28
+
29
+ &__body {
30
+ background-color: var(--neutral-white, #FFFFFF);
31
+ }
32
+
33
+ &__row {
34
+ border-bottom: 1px solid var(--border-primary, #E8E9EF);
35
+ transition: background-color 0.2s ease;
36
+ overflow: visible;
37
+
38
+ &.action-menu-open {
39
+ overflow: visible !important;
40
+ z-index: 20;
41
+ position: relative;
42
+
43
+ .new-table__cell {
44
+ overflow: visible !important;
45
+ }
46
+ }
47
+
48
+ &:last-child {
49
+ border-bottom: none;
50
+ }
51
+
52
+ &--clickable {
53
+ cursor: pointer;
54
+ &:hover {
55
+ background-color: var(--surface-primary-hover, #F8F8FA);
56
+ }
57
+ }
58
+ }
59
+
60
+ &__cell {
61
+ padding: 16px 24px;
62
+ font-size: var(--text-base-size, 14px);
63
+ color: var(--label-primary, #121E52);
64
+ vertical-align: middle;
65
+ overflow: visible;
66
+ }
67
+
68
+ &__no-data-cell {
69
+ padding: 64px 24px;
70
+ text-align: center;
71
+ font-size: 16px;
72
+ font-weight: 500;
73
+ color: #9399B3;
74
+ }
75
+ }
76
+
77
+ // Mobile styles
78
+ @media (max-width: 768px) {
79
+ .new-table-wrapper {
80
+ -webkit-overflow-scrolling: touch;
81
+ }
82
+
83
+ .new-table {
84
+ min-width: 600px; // Ensure table doesn't collapse too much
85
+
86
+ &__header-cell {
87
+ padding: 12px 16px;
88
+ font-size: 12px;
89
+ }
90
+
91
+ &__cell {
92
+ padding: 12px 16px;
93
+ font-size: 13px;
94
+ }
95
+
96
+ &__no-data-cell {
97
+ padding: 48px 16px;
98
+ font-size: 14px;
99
+ }
100
+ }
101
+ }
102
+
103
+ @media (max-width: 480px) {
104
+ .new-table {
105
+ min-width: 500px;
106
+
107
+ &__header-cell,
108
+ &__cell {
109
+ padding: 10px 12px;
110
+ }
111
+
112
+ &__header-cell {
113
+ font-size: 11px;
114
+ }
115
+
116
+ &__cell {
117
+ font-size: 12px;
118
+ }
119
+
120
+ &__no-data-cell {
121
+ padding: 32px 12px;
122
+ font-size: 13px;
123
+ }
124
+ }
125
+ }
126
+
@@ -0,0 +1,92 @@
1
+ import React from 'react'
2
+ import './NewTable.scss'
3
+
4
+ export interface NewTableColumn<T> {
5
+ header: React.ReactNode
6
+ accessor: keyof T | ((row: T) => React.ReactNode)
7
+ className?: string
8
+ width?: string | number
9
+ disableRowClick?: boolean
10
+ }
11
+
12
+ export interface NewTableProps<T> {
13
+ columns: NewTableColumn<T>[]
14
+ data: T[]
15
+ className?: string
16
+ rowClassName?: string | ((row: T) => string)
17
+ onRowClick?: (row: T) => void
18
+ noDataText?: string
19
+ }
20
+
21
+ export function NewTable<T extends { id?: string | number }>({
22
+ columns,
23
+ data,
24
+ className = '',
25
+ rowClassName = '',
26
+ onRowClick,
27
+ noDataText,
28
+ }: NewTableProps<T>) {
29
+ return (
30
+ <div className={`new-table-wrapper ${className}`}>
31
+ <table className="new-table">
32
+ <thead className="new-table__head">
33
+ <tr>
34
+ {columns.map((column, index) => (
35
+ <th
36
+ key={index}
37
+ className={`new-table__header-cell ${column.className || ''}`}
38
+ style={{ width: column.width }}
39
+ >
40
+ {column.header}
41
+ </th>
42
+ ))}
43
+ </tr>
44
+ </thead>
45
+ <tbody className="new-table__body">
46
+ {data.length > 0 ? (
47
+ data.map((row, rowIndex) => {
48
+ const customRowClass = typeof rowClassName === 'function' ? rowClassName(row) : rowClassName
49
+ return (
50
+ <tr
51
+ key={row.id || rowIndex}
52
+ className={`new-table__row ${onRowClick ? 'new-table__row--clickable' : ''} ${customRowClass}`}
53
+ onClick={() => onRowClick?.(row)}
54
+ >
55
+ {columns.map((column, colIndex) => {
56
+ const content =
57
+ typeof column.accessor === 'function'
58
+ ? column.accessor(row)
59
+ : (row[column.accessor] as React.ReactNode)
60
+
61
+ return (
62
+ <td
63
+ key={colIndex}
64
+ className={`new-table__cell ${column.className || ''}`}
65
+ role="presentation"
66
+ onClick={(e) => {
67
+ if (column.disableRowClick) {
68
+ e.stopPropagation()
69
+ }
70
+ }}
71
+ >
72
+ {content}
73
+ </td>
74
+ )
75
+ })}
76
+ </tr>
77
+ )
78
+ })
79
+ ) : (
80
+ noDataText && (
81
+ <tr className="new-table__no-data-row">
82
+ <td colSpan={columns.length} className="new-table__no-data-cell">
83
+ {noDataText}
84
+ </td>
85
+ </tr>
86
+ )
87
+ )}
88
+ </tbody>
89
+ </table>
90
+ </div>
91
+ )
92
+ }
@@ -0,0 +1 @@
1
+ export * from './NewTable'
@@ -0,0 +1,142 @@
1
+ .v2-pagination {
2
+ display: flex;
3
+ align-items: center;
4
+ gap: 16px;
5
+ font-family: var(--font-family-sans, 'Geist', sans-serif), serif;
6
+
7
+ &__controls {
8
+ display: flex;
9
+ gap: 8px;
10
+ }
11
+
12
+ &__button {
13
+ display: flex;
14
+ align-items: center;
15
+ justify-content: center;
16
+ width: 44px;
17
+ height: 44px;
18
+ border-radius: 50%;
19
+ border: none;
20
+ cursor: pointer;
21
+ background-color: #efeffe; // Light purple background
22
+ color: #6200ee; // Primary purple color
23
+ transition: background-color 0.2s ease, color 0.2s ease;
24
+ flex-shrink: 0; // Prevent button from shrinking
25
+
26
+ &:hover:not(:disabled) {
27
+ background-color: #cdccfc;
28
+ }
29
+
30
+ &:active:not(:disabled) {
31
+ background-color: #b4b4fa;
32
+ }
33
+
34
+ &:focus-visible {
35
+ outline: 2px solid #6200ee;
36
+ outline-offset: 2px;
37
+ }
38
+
39
+ &:disabled {
40
+ background-color: #e5e7eb; // Light gray
41
+ color: #9ca3af; // Gray arrow
42
+ cursor: not-allowed;
43
+ }
44
+
45
+ svg {
46
+ width: 24px;
47
+ height: 24px;
48
+ flex-shrink: 0; // Prevent SVG from shrinking
49
+ }
50
+ }
51
+
52
+ &__info {
53
+ display: flex;
54
+ flex-direction: column;
55
+ gap: 2px;
56
+ }
57
+
58
+ &__page-number {
59
+ font-size: 15px;
60
+ font-weight: 600;
61
+ color: #14215a; // Main fill primary
62
+ }
63
+
64
+ &__showing {
65
+ font-size: 13px;
66
+ font-weight: 500;
67
+ color: #626a90; // Secondary text color
68
+ }
69
+ }
70
+
71
+ // Mobile styles
72
+ @media (max-width: 768px) {
73
+ .v2-pagination {
74
+ gap: 12px;
75
+
76
+ &__controls {
77
+ gap: 6px;
78
+ }
79
+
80
+ &__button {
81
+ width: 40px;
82
+ height: 40px;
83
+
84
+ svg {
85
+ width: 20px;
86
+ height: 20px;
87
+ }
88
+ }
89
+
90
+ &__info {
91
+ gap: 2px;
92
+ }
93
+
94
+ &__page-number {
95
+ font-size: 14px;
96
+ }
97
+
98
+ &__showing {
99
+ font-size: 12px;
100
+ }
101
+ }
102
+ }
103
+
104
+ @media (max-width: 480px) {
105
+ .v2-pagination {
106
+ flex-direction: column;
107
+ gap: 10px;
108
+ align-items: flex-start;
109
+
110
+ &__controls {
111
+ order: 2;
112
+ width: 100%;
113
+ justify-content: center;
114
+ }
115
+
116
+ &__button {
117
+ width: 36px;
118
+ height: 36px;
119
+
120
+ svg {
121
+ width: 18px;
122
+ height: 18px;
123
+ }
124
+ }
125
+
126
+ &__info {
127
+ order: 1;
128
+ width: 100%;
129
+ text-align: center;
130
+ align-items: center;
131
+ }
132
+
133
+ &__page-number {
134
+ font-size: 13px;
135
+ }
136
+
137
+ &__showing {
138
+ font-size: 11px;
139
+ }
140
+ }
141
+ }
142
+
@@ -0,0 +1,80 @@
1
+ import React from 'react'
2
+ import './Pagination.scss'
3
+ import { ArrowLeftIcon, ArrowRightIcon } from '../../icons'
4
+
5
+ export interface PaginationProps {
6
+ currentPage: number
7
+ totalPages: number
8
+ totalItems: number
9
+ itemsPerPage: number
10
+ onPageChange: (page: number) => void
11
+ t: (key: string, options?: any) => string
12
+ entityName?: string
13
+ }
14
+
15
+ export const Pagination: React.FC<PaginationProps> = ({
16
+ currentPage,
17
+ totalPages,
18
+ totalItems,
19
+ itemsPerPage,
20
+ onPageChange,
21
+ t,
22
+ entityName = 'items'
23
+ }) => {
24
+ const startItem = (currentPage - 1) * itemsPerPage + 1
25
+ const endItem = Math.min(currentPage * itemsPerPage, totalItems)
26
+ const isFirstPage = currentPage <= 1
27
+ const isLastPage = currentPage >= totalPages
28
+
29
+ const handlePrev = (e: React.MouseEvent<HTMLButtonElement>) => {
30
+ e.preventDefault()
31
+ if (!isFirstPage) {
32
+ onPageChange(currentPage - 1)
33
+ }
34
+ }
35
+
36
+ const handleNext = (e: React.MouseEvent<HTMLButtonElement>) => {
37
+ e.preventDefault()
38
+ if (!isLastPage) {
39
+ onPageChange(currentPage + 1)
40
+ }
41
+ }
42
+
43
+ return (
44
+ <div className="v2-pagination">
45
+ <div className="v2-pagination__controls">
46
+ <button
47
+ type="button"
48
+ className="v2-pagination__button"
49
+ onClick={handlePrev}
50
+ disabled={isFirstPage}
51
+ aria-label={t('App:previous', { defaultValue: 'Previous' })}
52
+ >
53
+ <ArrowLeftIcon />
54
+ </button>
55
+ <button
56
+ type="button"
57
+ className="v2-pagination__button"
58
+ onClick={handleNext}
59
+ disabled={isLastPage}
60
+ aria-label={t('App:next', { defaultValue: 'Next' })}
61
+ >
62
+ <ArrowRightIcon />
63
+ </button>
64
+ </div>
65
+ <div className="v2-pagination__info">
66
+ <div className="v2-pagination__page-number">
67
+ {t('App:page', { from: currentPage })}
68
+ </div>
69
+ <div className="v2-pagination__showing">
70
+ {t('App:paginationText', {
71
+ type: entityName,
72
+ from: startItem,
73
+ to: endItem,
74
+ total: totalItems
75
+ })}
76
+ </div>
77
+ </div>
78
+ </div>
79
+ )
80
+ }
@@ -0,0 +1 @@
1
+ export * from './Pagination'
@@ -0,0 +1,67 @@
1
+ .quick-filter {
2
+ display: flex;
3
+ align-items: center;
4
+ gap: 12px;
5
+
6
+ &__label {
7
+ font-size: var(--text-small-size, 13px);
8
+ font-weight: 500;
9
+ color: var(--label-secondary, #9399B3);
10
+ white-space: nowrap;
11
+ }
12
+
13
+ &__options {
14
+ display: flex;
15
+ flex-wrap: wrap;
16
+ gap: 8px;
17
+
18
+ .ghost-button {
19
+ border-radius: 100px;
20
+ }
21
+ }
22
+ }
23
+
24
+ // Mobile styles
25
+ @media (max-width: 768px) {
26
+ .quick-filter {
27
+ display: flex;
28
+ flex-direction: row;
29
+ align-items: flex-start;
30
+ gap: 12px;
31
+ width: 100%;
32
+
33
+ &__label {
34
+ font-size: 12px;
35
+ }
36
+
37
+ &__options {
38
+ flex: 1;
39
+ display: flex;
40
+ flex-wrap: wrap;
41
+ gap: 6px;
42
+ padding: 0;
43
+ margin: 0;
44
+ min-width: 0;
45
+
46
+ .ghost-button {
47
+ flex-shrink: 0;
48
+ border-radius: 100px;
49
+ }
50
+ }
51
+ }
52
+ }
53
+
54
+ @media (max-width: 480px) {
55
+ .quick-filter {
56
+ gap: 8px;
57
+
58
+ &__label {
59
+ font-size: 11px;
60
+ }
61
+
62
+ &__options {
63
+ gap: 4px;
64
+ }
65
+ }
66
+ }
67
+
@@ -0,0 +1,51 @@
1
+ import React from 'react'
2
+ import { GhostButton } from '../Button'
3
+ import './QuickFilter.scss'
4
+
5
+ export interface QuickFilterOption {
6
+ label: string
7
+ value: string
8
+ }
9
+
10
+ export interface QuickFilterProps {
11
+ options: QuickFilterOption[]
12
+ selectedValues: string[]
13
+ onChange: (selectedValues: string[]) => void
14
+ label?: string
15
+ }
16
+
17
+ export const QuickFilter: React.FC<QuickFilterProps> = ({
18
+ options,
19
+ selectedValues = [],
20
+ onChange,
21
+ label,
22
+ }) => {
23
+ const toggleOption = (value: string) => {
24
+ if (selectedValues?.includes(value)) {
25
+ onChange(selectedValues.filter((v) => v !== value))
26
+ } else {
27
+ onChange([...selectedValues, value])
28
+ }
29
+ }
30
+
31
+ return (
32
+ <div className="quick-filter">
33
+ {label && <span className="quick-filter__label">{label}</span>}
34
+ <div className="quick-filter__options">
35
+ {options.map((option) => (
36
+ <GhostButton
37
+ key={option.value}
38
+ type="button"
39
+ size="sm"
40
+ className={
41
+ selectedValues?.includes(option.value) ? 'active' : ''
42
+ }
43
+ onClick={() => toggleOption(option.value)}
44
+ >
45
+ {option.label}
46
+ </GhostButton>
47
+ ))}
48
+ </div>
49
+ </div>
50
+ )
51
+ }
@@ -0,0 +1 @@
1
+ export * from './QuickFilter'
@@ -6,10 +6,8 @@ export interface SectionHeaderProps {
6
6
  className?: string;
7
7
  }
8
8
 
9
- export const SectionHeader: React.FC<SectionHeaderProps> = ({ title, className = '' }) => {
10
- return (
11
- <span className={`section-header ${className}`}>
12
- {title}
13
- </span>
14
- );
15
- };
9
+ export const SectionHeader: React.FC<SectionHeaderProps> = ({ title, className = '' }) => (
10
+ <span className={`section-header ${className}`}>
11
+ {title}
12
+ </span>
13
+ );
@@ -1,20 +1,41 @@
1
1
  @import '../../design-system/typography/Typography.scss';
2
2
 
3
+ .select-wrapper {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: var(--spacing-sm, 8px);
7
+ width: 100%;
8
+ }
9
+
10
+ .select-label {
11
+ font-family: var(--font-family-sans, 'Geist', sans-serif);
12
+ font-size: 15px;
13
+ font-style: normal;
14
+ font-weight: 600;
15
+ line-height: 20px;
16
+ color: var(--label-primary, #121E52);
17
+ display: block;
18
+ }
19
+
20
+ .select-label-optional {
21
+ font-family: var(--font-family-sans, 'Geist', sans-serif);
22
+ font-size: 15px;
23
+ font-weight: 600;
24
+ line-height: 20px;
25
+ color: var(--label-primary, #121E52);
26
+ }
27
+
28
+
3
29
  .select-container {
4
30
  position: relative;
5
- display: inline-block;
6
- width: auto;
7
- max-width: 152px;
8
-
9
- @media (min-width: 768px) {
10
- max-width: 448px;
11
- }
31
+ display: block;
32
+ width: 100%;
12
33
  }
13
34
 
14
35
  .select {
15
36
  @include typography('heading.h5');
16
37
  display: block;
17
- width: auto;
38
+ width: 100%;
18
39
  height: 40px;
19
40
  padding: 8px var(--padding-reg, 16px);
20
41
  padding-right: 40px;
@@ -28,13 +49,12 @@
28
49
  border-radius: var(--radius-md, 4px);
29
50
  transition: all 0.2s ease-in-out;
30
51
  &:hover:not(:disabled) {
31
- border-color: var(--disabled-regular);
52
+ border-color: var(--border-primary);
32
53
  }
33
54
 
34
55
  &:focus {
35
56
  outline: none;
36
- border-color: var(--highlight-dark);
37
- box-shadow: 0 0 0 3px var(--surface-highlight-soft);
57
+ border-color: var(--border-selected, #6200EE);
38
58
  }
39
59
 
40
60
  // Variants
@@ -49,7 +69,7 @@
49
69
 
50
70
  &--focus {
51
71
  background-color: var(--surface-secondary);
52
- border-color: var(--border-selected);
72
+ border-color: var(--border-selected, #6200EE);
53
73
  }
54
74
 
55
75
  &--secondary {
@@ -148,26 +168,14 @@
148
168
  }
149
169
 
150
170
  .select {
151
- &:focus {
152
- outline: none;
153
- border-color: var(--highlight-dark);
154
- box-shadow: 0 0 0 3px var(--surface-highlight-soft);
155
- transform: translateY(-1px);
156
- }
157
-
158
171
  &:active {
159
172
  transform: translateY(0px);
160
- box-shadow: 0 0 0 2px var(--surface-highlight-soft);
161
173
  }
162
174
 
163
175
  &.select--transitioning {
164
176
  opacity: 0.8;
165
177
  transform: scale(0.98);
166
178
  border-color: var(--cyan-700);
167
-
168
- &:focus {
169
- transform: scale(0.98) translateY(-1px);
170
- }
171
179
  }
172
180
  }
173
181
 
@@ -186,3 +194,32 @@
186
194
  .select--filter-active {
187
195
  animation: filterPulse 0.6s ease-out;
188
196
  }
197
+
198
+ .select-helper-text {
199
+ font-family: var(--font-family-sans, 'Geist', sans-serif);
200
+ font-size: var(--text-regular-size, 15px);
201
+ font-style: normal;
202
+ font-weight: 400;
203
+ line-height: var(--text-regular-line, 20px);
204
+ margin-top: 2px;
205
+ color: var(--label-secondary, #626A90);
206
+ min-width: max-content;
207
+ white-space: nowrap;
208
+
209
+ @media (max-width: 768px) {
210
+ min-width: unset;
211
+ white-space: normal;
212
+ word-wrap: break-word;
213
+ }
214
+ }
215
+
216
+ .select-error-text {
217
+ font-family: var(--font-family-sans, 'Geist', sans-serif);
218
+ font-size: var(--text-sm-size, 13px);
219
+ font-style: normal;
220
+ font-weight: 400;
221
+ line-height: var(--text-sm-line, 18px);
222
+ color: var(--status-error, #D32F2F);
223
+ margin-top: 2px;
224
+ }
225
+