@phillips/seldon 1.167.0 → 1.169.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.
- package/dist/components/Drawer/Drawer.d.ts +9 -1
- package/dist/components/Drawer/Drawer.js +67 -35
- package/dist/components/Drawer/Drawer.stories.d.ts +1 -1
- package/dist/components/Modal/Modal.d.ts +8 -0
- package/dist/components/Modal/Modal.js +45 -32
- package/dist/components/Modal/Modal.stories.d.ts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +74 -72
- package/dist/patterns/FilterMenu/FilterMenu.d.ts +1 -1
- package/dist/patterns/FilterMenu/FilterMenu.js +10 -10
- package/dist/patterns/FiltersInline/FilterButton.d.ts +28 -0
- package/dist/patterns/FiltersInline/FilterButton.js +35 -0
- package/dist/patterns/FiltersInline/FilterDropdownMenuDesktop.d.ts +3 -0
- package/dist/patterns/FiltersInline/FilterDropdownMenuDesktop.js +92 -0
- package/dist/patterns/FiltersInline/FilterDropdownMenuMobile.d.ts +3 -0
- package/dist/patterns/FiltersInline/FilterDropdownMenuMobile.js +99 -0
- package/dist/patterns/FiltersInline/FiltersInline.d.ts +12 -0
- package/dist/patterns/FiltersInline/FiltersInline.js +65 -0
- package/dist/patterns/FiltersInline/FiltersInline.stories.d.ts +17 -0
- package/dist/patterns/FiltersInline/FiltersInline.test.d.ts +1 -0
- package/dist/patterns/FiltersInline/MainFilterDropdown.d.ts +3 -0
- package/dist/patterns/FiltersInline/MainFilterDropdown.js +102 -0
- package/dist/patterns/FiltersInline/SubFilterDropdown.d.ts +3 -0
- package/dist/patterns/FiltersInline/SubFilterDropdown.js +135 -0
- package/dist/patterns/FiltersInline/index.d.ts +1 -0
- package/dist/patterns/FiltersInline/types.d.ts +191 -0
- package/dist/patterns/FiltersInline/types.js +4 -0
- package/dist/patterns/FiltersInline/utils.d.ts +61 -0
- package/dist/patterns/FiltersInline/utils.js +33 -0
- package/dist/scss/componentStyles.scss +3 -0
- package/dist/scss/components/Drawer/_drawer.scss +113 -2
- package/dist/scss/components/Modal/_modal.scss +5 -0
- package/dist/scss/patterns/FiltersInline/_filterButton.scss +26 -0
- package/dist/scss/patterns/FiltersInline/_filterDropdownMenu.scss +126 -0
- package/dist/scss/patterns/FiltersInline/_filtersInline.scss +15 -0
- package/package.json +1 -1
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enum for the main filter button types.
|
|
3
|
+
* Used to distinguish between different filter categories.
|
|
4
|
+
*/
|
|
5
|
+
export declare enum FilterButtonType {
|
|
6
|
+
Filter = "Filter",// Drawer filter
|
|
7
|
+
Sort = "Sort",// Sort filter
|
|
8
|
+
Sale = "Sale",// Sale filter
|
|
9
|
+
Departments = "Departments",// Departments filter
|
|
10
|
+
Month = "Month",// Month filter
|
|
11
|
+
Location = "Location"
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Enum for the icon types used in filter buttons.
|
|
15
|
+
*/
|
|
16
|
+
export declare enum FilterButtonIconType {
|
|
17
|
+
Filter = "Filter",// Filter icon
|
|
18
|
+
Sort = "Sort",// Sort icon
|
|
19
|
+
ChevronUp = "ChevronUp",// Chevron up icon
|
|
20
|
+
ChevronDown = "ChevronDown"
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Represents a single filter option (e.g., for a dropdown or button group).
|
|
24
|
+
*/
|
|
25
|
+
export type AuctionFilter = {
|
|
26
|
+
/** Unique identifier for the filter option */
|
|
27
|
+
id: string;
|
|
28
|
+
/** Display label for the filter option */
|
|
29
|
+
label: string;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Represents a filter button with a count and optional labels.
|
|
33
|
+
*/
|
|
34
|
+
export type AuctionFilterButton = {
|
|
35
|
+
/** Number of items matching this filter */
|
|
36
|
+
auctionCount: number;
|
|
37
|
+
/** Optional list of filter labels for this button */
|
|
38
|
+
filterLabels?: AuctionFilter[];
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Represents a single dimension/option within a filter (e.g., a checkbox or radio option).
|
|
42
|
+
*/
|
|
43
|
+
export type FilterDimension = {
|
|
44
|
+
/** Display label for the filter dimension */
|
|
45
|
+
label: string;
|
|
46
|
+
/** Whether this dimension is disabled */
|
|
47
|
+
disabled?: boolean;
|
|
48
|
+
/** Whether this dimension is currently active/selected */
|
|
49
|
+
active?: boolean;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Represents a filter group (e.g., "Sale", "Department") with its options.
|
|
53
|
+
*/
|
|
54
|
+
export type FilterType = {
|
|
55
|
+
/** Display label for the filter group */
|
|
56
|
+
label: string;
|
|
57
|
+
/** Unique identifier for the filter group */
|
|
58
|
+
id: string;
|
|
59
|
+
/** Type of filter (e.g., 'checkbox', 'radio') */
|
|
60
|
+
type: 'checkbox' | 'radio';
|
|
61
|
+
/** Set of filter dimensions/options for this filter group */
|
|
62
|
+
filterDimensions: Set<FilterDimension>;
|
|
63
|
+
/** FilterType for the filter */
|
|
64
|
+
buttonType: FilterButtonType;
|
|
65
|
+
/** Translated label for the filter button */
|
|
66
|
+
filterButtonLabelTranslated?: string;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Handler for when a filter input changes (checkbox, radio, or select).
|
|
70
|
+
*/
|
|
71
|
+
export type FilterChangeHandler = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>, filterId: string) => void;
|
|
72
|
+
/**
|
|
73
|
+
* Handler for when filters are updated (e.g., after selection).
|
|
74
|
+
*/
|
|
75
|
+
export type FilterUpdateHandler = (returnCountOnly?: boolean) => void;
|
|
76
|
+
/**
|
|
77
|
+
* Handler for clearing a filter group by its id.
|
|
78
|
+
*/
|
|
79
|
+
export type ClearFilterHandler = (filterId: string) => void;
|
|
80
|
+
/**
|
|
81
|
+
* Common props shared by all filter-related components.
|
|
82
|
+
*/
|
|
83
|
+
export interface BaseFilterProps {
|
|
84
|
+
/** Optional CSS class for the component */
|
|
85
|
+
className?: string;
|
|
86
|
+
/** Array of filter groups to display */
|
|
87
|
+
filters?: FilterType[];
|
|
88
|
+
/** Handler for filter selection changes */
|
|
89
|
+
onSelectFilter?: FilterChangeHandler;
|
|
90
|
+
/** Handler for updating filters/results */
|
|
91
|
+
onApplyFilter?: FilterUpdateHandler;
|
|
92
|
+
/** Handler for clearing a filter group */
|
|
93
|
+
onClickClear?: ClearFilterHandler;
|
|
94
|
+
/** Number of results to display */
|
|
95
|
+
resultsCount?: number;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Optional aria-labels for accessibility on various filter button elements.
|
|
99
|
+
*/
|
|
100
|
+
export interface FilterButtonAriaLabels {
|
|
101
|
+
/** Aria-label for the filter button itself */
|
|
102
|
+
button?: string;
|
|
103
|
+
/** Aria-label for the drawer (mobile or filter drawer) */
|
|
104
|
+
drawer?: string;
|
|
105
|
+
/** Aria-label for filter button */
|
|
106
|
+
ariaLabel?: string;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Props for the FiltersInline component (main component).
|
|
110
|
+
*/
|
|
111
|
+
export interface FiltersInlineProps extends BaseFilterProps {
|
|
112
|
+
/** Unique id for component testing */
|
|
113
|
+
id: string;
|
|
114
|
+
/** Handler for filter button click */
|
|
115
|
+
handleFilterClick?: () => void;
|
|
116
|
+
/** List of states for the filter buttons */
|
|
117
|
+
filtersListState?: boolean[];
|
|
118
|
+
/** Setter for the filter button states */
|
|
119
|
+
setFiltersLabelListState?: (state: boolean[]) => void;
|
|
120
|
+
/** Main filter button type (e.g., 'Filter', 'Sort') */
|
|
121
|
+
mainFilterLabel: FilterButtonType;
|
|
122
|
+
/** Object containing translated strings for dropdown menu actions.*/
|
|
123
|
+
dropdownMenuTranslation?: DropdownMenuTranslation;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Props for an individual filter button.
|
|
127
|
+
*/
|
|
128
|
+
export interface FilterDropdownProps extends BaseFilterProps {
|
|
129
|
+
/** Unique id for component testing */
|
|
130
|
+
id: string;
|
|
131
|
+
/** Unique id for this filter, used instead of index */
|
|
132
|
+
filterId?: number;
|
|
133
|
+
/** Label for the filter button */
|
|
134
|
+
filterButtonLabel: string;
|
|
135
|
+
/** Type of filter button (e.g., 'Filter', 'Sort') */
|
|
136
|
+
buttonType?: FilterButtonType;
|
|
137
|
+
/** Handler for filter button click */
|
|
138
|
+
handleClick?: (state: boolean[]) => void;
|
|
139
|
+
/** List of states for the filter buttons */
|
|
140
|
+
filtersListState?: boolean[];
|
|
141
|
+
/** Index of the filter button in the filtersListState */
|
|
142
|
+
index?: number;
|
|
143
|
+
/** Optional aria-labels for accessibility on various filter button elements. */
|
|
144
|
+
ariaLabels?: FilterButtonAriaLabels;
|
|
145
|
+
/** Translated label for the filter button */
|
|
146
|
+
filterButtonLabelTranslated?: string;
|
|
147
|
+
/** Object containing translated strings for dropdown menu actions.*/
|
|
148
|
+
dropdownMenuTranslation?: DropdownMenuTranslation;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Object containing translated strings for dropdown menu actions.
|
|
152
|
+
* - confirm: Label for the confirm/apply button.
|
|
153
|
+
* - clearAll: Label for the "Clear all" button.
|
|
154
|
+
* - showAuctions: Label for the button showing the number of auctions/results.
|
|
155
|
+
*/
|
|
156
|
+
export type DropdownMenuTranslation = {
|
|
157
|
+
confirm?: string | null;
|
|
158
|
+
clearAll?: string | null;
|
|
159
|
+
showAuctions?: string | null;
|
|
160
|
+
};
|
|
161
|
+
/**
|
|
162
|
+
* Props for the filter dropdown menu component (desktop or mobile).
|
|
163
|
+
*/
|
|
164
|
+
export interface FilterDropdownMenuProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
165
|
+
/** Optional custom class name for the dropdown container */
|
|
166
|
+
className?: string;
|
|
167
|
+
/** The type of filter button (e.g. 'Sort', 'Departments', etc.) */
|
|
168
|
+
buttonType?: string;
|
|
169
|
+
/** Array of filter objects, each with a set of filter dimensions */
|
|
170
|
+
filters?: {
|
|
171
|
+
filterDimensions: Set<FilterDimension>;
|
|
172
|
+
}[];
|
|
173
|
+
/** Index of the filter to display (typically corresponds to the selected filter) */
|
|
174
|
+
filterIndex?: number;
|
|
175
|
+
/** Handler for when a filter input is changed */
|
|
176
|
+
onSelectFilter?: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>, filterType: string) => void;
|
|
177
|
+
/** Handler for when the filter is confirmed or updated */
|
|
178
|
+
onApplyFilter?: (returnCountOnly?: boolean) => void;
|
|
179
|
+
/** Handler for clearing the filter (by type) */
|
|
180
|
+
onClickClear?: (filterType: string) => void;
|
|
181
|
+
/** Number of results to display in the dropdown action button */
|
|
182
|
+
resultsCount?: number;
|
|
183
|
+
/** Optional aria-labels for accessibility, for mobile and desktop variants */
|
|
184
|
+
ariaLabels?: string;
|
|
185
|
+
/** Label for the filter button */
|
|
186
|
+
filterButtonLabel: string;
|
|
187
|
+
/** Translated label for the filter button */
|
|
188
|
+
filterButtonLabelTranslated?: string;
|
|
189
|
+
/** Object containing translated strings for dropdown menu actions.*/
|
|
190
|
+
dropdownMenuTranslation?: DropdownMenuTranslation;
|
|
191
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { FilterButtonIconType, FilterButtonType, FilterDimension, FilterType } from './types';
|
|
2
|
+
export declare const FilterButtons: FilterButtonType[];
|
|
3
|
+
export declare const FiltersInlineFilters: {
|
|
4
|
+
Sort: {
|
|
5
|
+
id: string;
|
|
6
|
+
label: string;
|
|
7
|
+
active: boolean;
|
|
8
|
+
}[];
|
|
9
|
+
Sale: {
|
|
10
|
+
id: string;
|
|
11
|
+
label: string;
|
|
12
|
+
active: boolean;
|
|
13
|
+
}[];
|
|
14
|
+
Departments: {
|
|
15
|
+
id: string;
|
|
16
|
+
label: string;
|
|
17
|
+
value: string;
|
|
18
|
+
active: boolean;
|
|
19
|
+
}[];
|
|
20
|
+
Month: ({
|
|
21
|
+
id: string;
|
|
22
|
+
label: string;
|
|
23
|
+
value: string;
|
|
24
|
+
active: boolean;
|
|
25
|
+
disabled?: undefined;
|
|
26
|
+
} | {
|
|
27
|
+
id: string;
|
|
28
|
+
label: string;
|
|
29
|
+
value: string;
|
|
30
|
+
active: boolean;
|
|
31
|
+
disabled: boolean;
|
|
32
|
+
})[];
|
|
33
|
+
Location: {
|
|
34
|
+
id: string;
|
|
35
|
+
label: string;
|
|
36
|
+
value: string;
|
|
37
|
+
active: boolean;
|
|
38
|
+
}[];
|
|
39
|
+
};
|
|
40
|
+
export declare const SalesMockData: {
|
|
41
|
+
auctionType: string;
|
|
42
|
+
titleText: string;
|
|
43
|
+
date: string;
|
|
44
|
+
location: string;
|
|
45
|
+
department: string;
|
|
46
|
+
}[];
|
|
47
|
+
export declare const countActiveFilters: (filters?: FilterType[], buttonType?: string) => {
|
|
48
|
+
totalCount: number;
|
|
49
|
+
filterCount: number;
|
|
50
|
+
};
|
|
51
|
+
export declare const getFilterDimensions: (filters: {
|
|
52
|
+
filterDimensions: Set<FilterDimension>;
|
|
53
|
+
}[] | undefined, filterIndex: number | undefined) => FilterDimension[];
|
|
54
|
+
export declare const getIcon: (type: FilterButtonIconType, isSelected: boolean) => "ChevronDown" | "ChevronUp" | "Filters";
|
|
55
|
+
export declare const getFilterButtonClickHandler: (filtersListState: boolean[] | undefined, handleClick: ((state: boolean[]) => void) | undefined, filterId: number) => () => void;
|
|
56
|
+
export declare function handleInputChange(e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>, buttonType: string, handleFilterSelection?: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>, filterType: string) => void): void;
|
|
57
|
+
/**
|
|
58
|
+
* Utility to reset all filter states to false and call the handler.
|
|
59
|
+
*/
|
|
60
|
+
export declare function resetAllFilters(filtersListState: boolean[] | undefined, handleClick: ((state: boolean[]) => void) | undefined): void;
|
|
61
|
+
export declare function getFilterButtonLabel(filterButtonLabel: string, filterCount: number | null, filterButtonLabelTranslated: string | null): string;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { FilterButtonType as e } from "./types.js";
|
|
2
|
+
e.Filter, e.Sort, e.Sale, e.Departments, e.Month, e.Location;
|
|
3
|
+
const f = (n, t) => {
|
|
4
|
+
if (!n) return { totalCount: 0, filterCount: 0 };
|
|
5
|
+
const r = n.filter((o) => o.id !== "Sort").reduce(
|
|
6
|
+
(o, i) => o + Array.from(i.filterDimensions).filter((s) => s.active).length,
|
|
7
|
+
0
|
|
8
|
+
), u = t === "Sort" ? 0 : (() => {
|
|
9
|
+
const o = n.find((i) => i.id === t)?.filterDimensions;
|
|
10
|
+
return o ? Array.from(o).filter((i) => i.active).length : 0;
|
|
11
|
+
})();
|
|
12
|
+
return { totalCount: r, filterCount: u };
|
|
13
|
+
}, m = (n, t) => n && typeof t == "number" && n[t - 1] && n[t - 1].filterDimensions ? Array.from(n[t - 1].filterDimensions) : [], a = (n, t) => n === "Filter" ? "Filters" : t ? "ChevronUp" : "ChevronDown", l = (n, t, r) => () => {
|
|
14
|
+
n && t && t(n.map((u, o) => o === r ? !u : !1));
|
|
15
|
+
};
|
|
16
|
+
function p(n, t, r) {
|
|
17
|
+
r && r(n, t);
|
|
18
|
+
}
|
|
19
|
+
function D(n, t) {
|
|
20
|
+
n && t && t(n.map(() => !1));
|
|
21
|
+
}
|
|
22
|
+
function F(n, t, r) {
|
|
23
|
+
return r || `${n}` + (t && t > 0 ? ` (${t})` : "");
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
f as countActiveFilters,
|
|
27
|
+
l as getFilterButtonClickHandler,
|
|
28
|
+
F as getFilterButtonLabel,
|
|
29
|
+
m as getFilterDimensions,
|
|
30
|
+
a as getIcon,
|
|
31
|
+
p as handleInputChange,
|
|
32
|
+
D as resetAllFilters
|
|
33
|
+
};
|
|
@@ -70,6 +70,9 @@
|
|
|
70
70
|
@use 'patterns/FavoritesCollectionTile/favoritesCollectionTile';
|
|
71
71
|
@use 'patterns/SaleCard/saleCard';
|
|
72
72
|
@use 'patterns/SaleCard/saleCardActions';
|
|
73
|
+
@use 'patterns/FiltersInline/filtersInline';
|
|
74
|
+
@use 'patterns/FiltersInline/filterButton';
|
|
75
|
+
@use 'patterns/FiltersInline/filterDropdownMenu';
|
|
73
76
|
|
|
74
77
|
// Site Furniture
|
|
75
78
|
@use 'site-furniture/Header/header';
|
|
@@ -46,9 +46,47 @@
|
|
|
46
46
|
position: absolute;
|
|
47
47
|
right: 10px;
|
|
48
48
|
top: 10px;
|
|
49
|
+
|
|
50
|
+
&--bottom {
|
|
51
|
+
align-self: flex-start;
|
|
52
|
+
margin: $spacing-md;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Bottom sheet modifier
|
|
57
|
+
&--bottom {
|
|
58
|
+
border-radius: 16px 16px 0 0;
|
|
59
|
+
box-shadow: 0 -2px 16px rgba(0, 0, 0, 8%);
|
|
60
|
+
height: auto;
|
|
61
|
+
inset: auto 0 0;
|
|
62
|
+
max-width: 100%;
|
|
63
|
+
min-height: 30vh;
|
|
64
|
+
width: 100%;
|
|
65
|
+
|
|
66
|
+
@media (max-width: $breakpoint-sm) {
|
|
67
|
+
max-width: 100%;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
&__bottom-content {
|
|
72
|
+
align-items: center;
|
|
73
|
+
border-bottom: 1px solid $medium-gray;
|
|
74
|
+
display: flex;
|
|
75
|
+
margin-bottom: $spacing-sm;
|
|
76
|
+
width: 100%;
|
|
77
|
+
|
|
78
|
+
&--label {
|
|
79
|
+
flex: 1;
|
|
80
|
+
font-variation-settings: 'wght' 600;
|
|
81
|
+
margin: $spacing-md;
|
|
82
|
+
padding-right: $spacing-xxxl;
|
|
83
|
+
text-align: center;
|
|
84
|
+
width: fit-content;
|
|
85
|
+
}
|
|
49
86
|
}
|
|
50
87
|
}
|
|
51
88
|
|
|
89
|
+
// Drawer open/close animations
|
|
52
90
|
.#{$px}-drawer[data-state='open'] {
|
|
53
91
|
animation: content-show $drawer-content-transition;
|
|
54
92
|
}
|
|
@@ -57,14 +95,39 @@
|
|
|
57
95
|
animation: content-close $drawer-content-transition;
|
|
58
96
|
}
|
|
59
97
|
|
|
60
|
-
|
|
98
|
+
// Overlay animations
|
|
99
|
+
.#{$px}-drawer__overlay[data-state='open'] {
|
|
61
100
|
animation: overlay-show $default-overlay-transition;
|
|
62
101
|
}
|
|
63
102
|
|
|
64
|
-
.#{$px}
|
|
103
|
+
.#{$px}-drawer__overlay[data-state='closed'] {
|
|
65
104
|
animation: overlay-close $default-overlay-transition;
|
|
66
105
|
}
|
|
67
106
|
|
|
107
|
+
// Drawer left side
|
|
108
|
+
.#{$px}-drawer[data-side='left'][data-state='open'] {
|
|
109
|
+
animation: content-show-left $drawer-content-transition;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.#{$px}-drawer[data-side='left'][data-state='closed'] {
|
|
113
|
+
animation: content-close-left $drawer-content-transition;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.#{$px}-drawer[data-side='left'] {
|
|
117
|
+
left: 0;
|
|
118
|
+
right: auto;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Drawer bottom sheet animations
|
|
122
|
+
.#{$px}-drawer--bottom[data-state='open'] {
|
|
123
|
+
animation: bottom-sheet-content-show $drawer-content-transition;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.#{$px}-drawer--bottom[data-state='closed'] {
|
|
127
|
+
animation: bottom-sheet-content-close $drawer-content-transition;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Keyframes
|
|
68
131
|
@keyframes content-show {
|
|
69
132
|
from {
|
|
70
133
|
opacity: 0;
|
|
@@ -89,6 +152,54 @@
|
|
|
89
152
|
}
|
|
90
153
|
}
|
|
91
154
|
|
|
155
|
+
@keyframes content-show-left {
|
|
156
|
+
from {
|
|
157
|
+
opacity: 0;
|
|
158
|
+
transform: translateX(-100%);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
to {
|
|
162
|
+
opacity: 1;
|
|
163
|
+
transform: translateX(0);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
@keyframes content-close-left {
|
|
168
|
+
from {
|
|
169
|
+
opacity: 1;
|
|
170
|
+
transform: translateX(0);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
to {
|
|
174
|
+
opacity: 0;
|
|
175
|
+
transform: translateX(-100%);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
@keyframes bottom-sheet-content-show {
|
|
180
|
+
from {
|
|
181
|
+
opacity: 0;
|
|
182
|
+
transform: translateY(100%);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
to {
|
|
186
|
+
opacity: 1;
|
|
187
|
+
transform: translateY(0);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
@keyframes bottom-sheet-content-close {
|
|
192
|
+
from {
|
|
193
|
+
opacity: 1;
|
|
194
|
+
transform: translateY(0);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
to {
|
|
198
|
+
opacity: 0;
|
|
199
|
+
transform: translateY(100%);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
92
203
|
@keyframes overlay-show {
|
|
93
204
|
from {
|
|
94
205
|
opacity: 0;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
@use '../../allPartials' as *;
|
|
2
|
+
|
|
3
|
+
.#{$px}-filter-button {
|
|
4
|
+
border: 1px solid $light-gray;
|
|
5
|
+
gap: 4px;
|
|
6
|
+
padding: $spacing-xsm $spacing-sm;
|
|
7
|
+
|
|
8
|
+
&--selected {
|
|
9
|
+
border: 1px solid $pure-black;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
&--count {
|
|
13
|
+
background: $pure-black;
|
|
14
|
+
border: 2px solid $white;
|
|
15
|
+
border-radius: 50%;
|
|
16
|
+
color: $white;
|
|
17
|
+
display: inline-block;
|
|
18
|
+
font-size: var(--label-size3);
|
|
19
|
+
height: 1.5rem;
|
|
20
|
+
position: absolute;
|
|
21
|
+
right: 0;
|
|
22
|
+
text-align: center;
|
|
23
|
+
top: -15px;
|
|
24
|
+
width: 1.5rem;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
@use '../../allPartials' as *;
|
|
2
|
+
|
|
3
|
+
.#{$px}-filter-dropdown-menu {
|
|
4
|
+
background: $white;
|
|
5
|
+
border-radius: $spacing-xsm;
|
|
6
|
+
box-shadow: 0 4px 6px $medium-gray;
|
|
7
|
+
display: flex;
|
|
8
|
+
flex-direction: column;
|
|
9
|
+
min-width: 430px;
|
|
10
|
+
padding: $spacing-md;
|
|
11
|
+
|
|
12
|
+
&__filters {
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
gap: $spacing-xsm;
|
|
16
|
+
padding-bottom: var(--spacing-sm);
|
|
17
|
+
|
|
18
|
+
&--mobile {
|
|
19
|
+
padding: 0 $spacing-md $spacing-md;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
&__button-wrap {
|
|
24
|
+
display: flex;
|
|
25
|
+
justify-content: flex-end;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
&__buttons-wrap {
|
|
29
|
+
display: flex;
|
|
30
|
+
gap: $spacing-sm;
|
|
31
|
+
justify-content: space-between;
|
|
32
|
+
|
|
33
|
+
&--drawer {
|
|
34
|
+
box-shadow: 0 -4px 8px -4px $medium-gray;
|
|
35
|
+
gap: $spacing-xl;
|
|
36
|
+
padding: $spacing-md;
|
|
37
|
+
width: 100%;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
&__mobile-wrap {
|
|
42
|
+
box-shadow: 0 -4px 8px -4px $medium-gray;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
&__header {
|
|
46
|
+
margin-bottom: $spacing-sm;
|
|
47
|
+
margin-top: 0;
|
|
48
|
+
|
|
49
|
+
&--mobile {
|
|
50
|
+
padding: $spacing-md $spacing-md 0 $spacing-md;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
&__button {
|
|
55
|
+
align-self: flex-end;
|
|
56
|
+
padding: $spacing-sm $spacing-md;
|
|
57
|
+
|
|
58
|
+
&--mobile {
|
|
59
|
+
display: block;
|
|
60
|
+
margin: $spacing-sm auto $spacing-md auto;
|
|
61
|
+
width: 80%;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
&__buttons {
|
|
66
|
+
align-items: center;
|
|
67
|
+
display: flex;
|
|
68
|
+
flex-direction: row;
|
|
69
|
+
justify-content: space-between;
|
|
70
|
+
padding: 14px $spacing-md;
|
|
71
|
+
|
|
72
|
+
&--left {
|
|
73
|
+
margin-left: auto;
|
|
74
|
+
margin-right: 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
&--right {
|
|
78
|
+
margin-left: 0;
|
|
79
|
+
margin-right: auto;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
&--mobile {
|
|
83
|
+
display: block;
|
|
84
|
+
margin-bottom: $spacing-md;
|
|
85
|
+
margin-top: $spacing-sm;
|
|
86
|
+
width: 45%;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
&__button-text {
|
|
91
|
+
color: $white;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
&--mobile {
|
|
95
|
+
border-radius: $spacing-xsm $spacing-xsm 0 0;
|
|
96
|
+
box-shadow: none;
|
|
97
|
+
padding: 0;
|
|
98
|
+
width: 100vw;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.#{$px}-input {
|
|
102
|
+
&__wrapper {
|
|
103
|
+
align-items: center;
|
|
104
|
+
display: flex;
|
|
105
|
+
flex-direction: row;
|
|
106
|
+
justify-content: space-between;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
&__label {
|
|
110
|
+
align-self: center;
|
|
111
|
+
margin: 0;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
.#{$px}-input__input[type='radio'] {
|
|
115
|
+
align-self: center;
|
|
116
|
+
margin-left: auto;
|
|
117
|
+
}
|
|
118
|
+
.#{$px}-input__input[type='checkbox'] {
|
|
119
|
+
align-self: center;
|
|
120
|
+
margin-left: auto;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.#{$px}-filter-drawer-mobile {
|
|
125
|
+
padding: 0;
|
|
126
|
+
}
|