@shohojdhara/atomix 0.3.4 → 0.3.5
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/atomix.css +9 -10
- package/dist/atomix.css.map +1 -0
- package/dist/atomix.min.css +15108 -11
- package/dist/atomix.min.css.map +1 -0
- package/dist/charts.d.ts +1929 -0
- package/dist/charts.js +6482 -0
- package/dist/charts.js.map +1 -0
- package/dist/core.d.ts +1289 -0
- package/dist/core.js +3357 -0
- package/dist/core.js.map +1 -0
- package/dist/forms.d.ts +1085 -0
- package/dist/forms.js +2450 -0
- package/dist/forms.js.map +1 -0
- package/dist/heavy.d.ts +636 -0
- package/dist/heavy.js +4550 -0
- package/dist/heavy.js.map +1 -0
- package/dist/index.d.ts +5161 -4990
- package/dist/index.esm.js +1457 -784
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1473 -790
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/layout.d.ts +300 -0
- package/dist/layout.js +336 -0
- package/dist/layout.js.map +1 -0
- package/dist/theme.d.ts +1992 -0
- package/dist/theme.js +5348 -0
- package/dist/theme.js.map +1 -0
- package/package.json +66 -20
- package/scripts/atomix-cli.js +544 -16
- package/scripts/cli/__tests__/cli-commands.test.js +204 -0
- package/scripts/cli/__tests__/utils.test.js +201 -0
- package/scripts/cli/__tests__/vitest.config.js +26 -0
- package/scripts/cli/interactive-init.js +1 -1
- package/scripts/cli/token-manager.js +32 -7
- package/scripts/cli/utils.js +347 -0
- package/src/components/Accordion/Accordion.tsx +5 -54
- package/src/components/Accordion/index.ts +1 -1
- package/src/components/Avatar/Avatar.tsx +3 -3
- package/src/components/Badge/Badge.tsx +3 -3
- package/src/components/Breadcrumb/Breadcrumb.tsx +3 -3
- package/src/components/Card/ElevationCard.tsx +1 -1
- package/src/components/Chart/AnimatedChart.tsx +19 -17
- package/src/components/Chart/AreaChart.tsx +5 -1
- package/src/components/Chart/BarChart.tsx +1 -0
- package/src/components/Chart/BubbleChart.tsx +6 -5
- package/src/components/Chart/ChartToolbar.tsx +1 -0
- package/src/components/Chart/FunnelChart.tsx +1 -1
- package/src/components/Chart/RadarChart.tsx +19 -12
- package/src/components/Chart/ScatterChart.tsx +3 -3
- package/src/components/Chart/TreemapChart.tsx +2 -1
- package/src/components/Chart/WaterfallChart.tsx +0 -1
- package/src/components/Chart/types.ts +12 -2
- package/src/components/Chart/utils.ts +4 -3
- package/src/components/DataTable/DataTable.tsx +3 -3
- package/src/components/Dropdown/Dropdown.tsx +12 -9
- package/src/components/Footer/FooterSection.tsx +3 -3
- package/src/components/Form/Checkbox.tsx +3 -3
- package/src/components/Form/Input.tsx +4 -2
- package/src/components/Form/Radio.tsx +3 -3
- package/src/components/Form/Select.tsx +3 -3
- package/src/components/Form/Textarea.tsx +4 -2
- package/src/components/List/List.stories.tsx +3 -3
- package/src/components/List/List.tsx +3 -3
- package/src/components/List/ListGroup.tsx +3 -1
- package/src/components/Modal/Modal.tsx +3 -3
- package/src/components/Navigation/Menu/MegaMenu.tsx +9 -3
- package/src/components/Navigation/Menu/Menu.tsx +9 -3
- package/src/components/Pagination/Pagination.tsx +6 -5
- package/src/components/PhotoViewer/PhotoViewerImage.tsx +2 -2
- package/src/components/Popover/Popover.tsx +4 -4
- package/src/components/Progress/Progress.tsx +6 -2
- package/src/components/Rating/Rating.tsx +5 -2
- package/src/components/Slider/Slider.tsx +10 -9
- package/src/components/Spinner/Spinner.tsx +3 -3
- package/src/components/Tabs/Tabs.tsx +3 -3
- package/src/components/Tooltip/Tooltip.tsx +3 -3
- package/src/components/index.ts +5 -2
- package/src/layouts/MasonryGrid/MasonryGrid.tsx +2 -2
- package/src/lib/composables/useChartPerformance.ts +102 -78
- package/src/lib/composables/useChartScale.ts +10 -0
- package/src/lib/composables/useHero.ts +9 -2
- package/src/lib/composables/useHeroBackgroundSlider.ts +5 -3
- package/src/lib/composables/useSideMenu.ts +1 -0
- package/src/lib/composables/useVideoPlayer.ts +3 -2
- package/src/lib/config/loader.ts +55 -13
- package/src/lib/hooks/index.ts +0 -1
- package/src/lib/hooks/useComponentCustomization.ts +10 -14
- package/src/lib/hooks/usePerformanceMonitor.ts +149 -0
- package/src/lib/patterns/index.ts +2 -2
- package/src/lib/patterns/slots.tsx +2 -2
- package/src/lib/theme/composeTheme.ts +1 -1
- package/src/lib/theme/core/ThemeEngine.ts +8 -0
- package/src/lib/theme/core/ThemeValidator.ts +5 -2
- package/src/lib/theme/devtools/Inspector.tsx +1 -1
- package/src/lib/theme/devtools/LiveEditor.tsx +11 -5
- package/src/lib/theme/generateCSSVariables.ts +1 -1
- package/src/lib/theme/i18n/rtl.ts +2 -1
- package/src/lib/theme/runtime/ThemeApplicator.ts +28 -11
- package/src/lib/theme/runtime/ThemeErrorBoundary.tsx +3 -3
- package/src/lib/theme/runtime/ThemeManager.ts +4 -0
- package/src/lib/theme-tools.ts +1 -1
- package/src/lib/types/components.ts +183 -34
- package/src/lib/types/partProps.ts +0 -16
- package/src/lib/utils/fontPreloader.ts +148 -0
- package/src/lib/utils/index.ts +11 -0
- package/src/lib/utils/memoryMonitor.ts +189 -0
- package/src/styles/01-settings/_settings.fonts.scss +2 -5
- package/src/styles/03-generic/_generated-root.css +22 -1
- package/src/styles/06-components/_components.navbar.scss +0 -6
- package/src/themes/themes.config.js +37 -4
- package/scripts/build-themes.js +0 -208
- package/src/components/AtomixGlass/atomixGLass.old.tsx +0 -1263
package/dist/layout.d.ts
ADDED
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import React, { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
interface GridProps extends HTMLAttributes<HTMLDivElement> {
|
|
4
|
+
/**
|
|
5
|
+
* The content to be rendered within the grid
|
|
6
|
+
*/
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
/**
|
|
9
|
+
* Additional CSS class names
|
|
10
|
+
*/
|
|
11
|
+
className?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Control the horizontal alignment of items
|
|
14
|
+
*/
|
|
15
|
+
justifyContent?: 'start' | 'end' | 'center' | 'between' | 'around' | 'evenly';
|
|
16
|
+
/**
|
|
17
|
+
* Control the vertical alignment of items
|
|
18
|
+
*/
|
|
19
|
+
alignItems?: 'start' | 'end' | 'center' | 'baseline' | 'stretch';
|
|
20
|
+
/**
|
|
21
|
+
* No gutters between columns
|
|
22
|
+
*/
|
|
23
|
+
noGutters?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Flex direction
|
|
26
|
+
*/
|
|
27
|
+
direction?: 'row' | 'column' | 'row-reverse' | 'column-reverse';
|
|
28
|
+
/**
|
|
29
|
+
* Wrap behavior
|
|
30
|
+
*/
|
|
31
|
+
wrap?: 'nowrap' | 'wrap' | 'wrap-reverse';
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Grid component for creating responsive layouts.
|
|
35
|
+
* Uses the CSS grid system defined in _objects.grid.scss.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* <Grid>
|
|
40
|
+
* <GridCol sm={6} md={4} lg={3}>Column content</GridCol>
|
|
41
|
+
* <GridCol sm={6} md={4} lg={3}>Column content</GridCol>
|
|
42
|
+
* <GridCol sm={6} md={4} lg={3}>Column content</GridCol>
|
|
43
|
+
* </Grid>
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
declare const Grid: React.ForwardRefExoticComponent<GridProps & React.RefAttributes<HTMLDivElement>>;
|
|
47
|
+
|
|
48
|
+
interface MasonryGridProps extends HTMLAttributes<HTMLDivElement> {
|
|
49
|
+
/**
|
|
50
|
+
* The content to be rendered within the masonry grid
|
|
51
|
+
*/
|
|
52
|
+
children: ReactNode;
|
|
53
|
+
/**
|
|
54
|
+
* Additional CSS class names
|
|
55
|
+
*/
|
|
56
|
+
className?: string;
|
|
57
|
+
/**
|
|
58
|
+
* Number of columns at extra small breakpoint (default)
|
|
59
|
+
*/
|
|
60
|
+
xs?: number;
|
|
61
|
+
/**
|
|
62
|
+
* Number of columns at small breakpoint
|
|
63
|
+
*/
|
|
64
|
+
sm?: number;
|
|
65
|
+
/**
|
|
66
|
+
* Number of columns at medium breakpoint
|
|
67
|
+
*/
|
|
68
|
+
md?: number;
|
|
69
|
+
/**
|
|
70
|
+
* Number of columns at large breakpoint
|
|
71
|
+
*/
|
|
72
|
+
lg?: number;
|
|
73
|
+
/**
|
|
74
|
+
* Number of columns at extra large breakpoint
|
|
75
|
+
*/
|
|
76
|
+
xl?: number;
|
|
77
|
+
/**
|
|
78
|
+
* Number of columns at extra extra large breakpoint
|
|
79
|
+
*/
|
|
80
|
+
xxl?: number;
|
|
81
|
+
/**
|
|
82
|
+
* Gap between items (in pixels)
|
|
83
|
+
*/
|
|
84
|
+
gap?: number;
|
|
85
|
+
/**
|
|
86
|
+
* Whether to animate item transitions
|
|
87
|
+
*/
|
|
88
|
+
animate?: boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Whether to handle image loading to prevent layout shifts
|
|
91
|
+
* When true, items will be shown immediately and positions updated as images load
|
|
92
|
+
*/
|
|
93
|
+
imagesLoaded?: boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Callback fired when all images are loaded and layout is complete
|
|
96
|
+
*/
|
|
97
|
+
onLayoutComplete?: () => void;
|
|
98
|
+
/**
|
|
99
|
+
* Callback fired each time an image loads and layout is updated
|
|
100
|
+
*/
|
|
101
|
+
onImageLoad?: (loadedCount: number, totalCount: number) => void;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* MasonryGrid component for creating a responsive masonry layout.
|
|
105
|
+
* Uses JavaScript to position items optimally based on available vertical space,
|
|
106
|
+
* similar to how a mason fits stones in a wall.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```tsx
|
|
110
|
+
* <MasonryGrid xs={1} sm={2} md={3} lg={4}>
|
|
111
|
+
* <MasonryGridItem>Item 1</MasonryGridItem>
|
|
112
|
+
* <MasonryGridItem>Item 2</MasonryGridItem>
|
|
113
|
+
* <MasonryGridItem>Item 3</MasonryGridItem>
|
|
114
|
+
* </MasonryGrid>
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
declare const MasonryGrid: React.ForwardRefExoticComponent<MasonryGridProps & React.RefAttributes<HTMLDivElement>>;
|
|
118
|
+
|
|
119
|
+
interface GridColProps extends HTMLAttributes<HTMLDivElement> {
|
|
120
|
+
/**
|
|
121
|
+
* The content to be rendered within the column
|
|
122
|
+
*/
|
|
123
|
+
children: ReactNode;
|
|
124
|
+
/**
|
|
125
|
+
* Additional CSS class names
|
|
126
|
+
*/
|
|
127
|
+
className?: string;
|
|
128
|
+
/**
|
|
129
|
+
* Number of columns to span at extra small breakpoint (default)
|
|
130
|
+
*/
|
|
131
|
+
xs?: number | 'auto' | boolean;
|
|
132
|
+
/**
|
|
133
|
+
* Number of columns to span at small breakpoint
|
|
134
|
+
*/
|
|
135
|
+
sm?: number | 'auto' | boolean;
|
|
136
|
+
/**
|
|
137
|
+
* Number of columns to span at medium breakpoint
|
|
138
|
+
*/
|
|
139
|
+
md?: number | 'auto' | boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Number of columns to span at large breakpoint
|
|
142
|
+
*/
|
|
143
|
+
lg?: number | 'auto' | boolean;
|
|
144
|
+
/**
|
|
145
|
+
* Number of columns to span at extra large breakpoint
|
|
146
|
+
*/
|
|
147
|
+
xl?: number | 'auto' | boolean;
|
|
148
|
+
/**
|
|
149
|
+
* Number of columns to span at extra extra large breakpoint
|
|
150
|
+
*/
|
|
151
|
+
xxl?: number | 'auto' | boolean;
|
|
152
|
+
/**
|
|
153
|
+
* Offset at extra small breakpoint
|
|
154
|
+
*/
|
|
155
|
+
offsetXs?: number;
|
|
156
|
+
/**
|
|
157
|
+
* Offset at small breakpoint
|
|
158
|
+
*/
|
|
159
|
+
offsetSm?: number;
|
|
160
|
+
/**
|
|
161
|
+
* Offset at medium breakpoint
|
|
162
|
+
*/
|
|
163
|
+
offsetMd?: number;
|
|
164
|
+
/**
|
|
165
|
+
* Offset at large breakpoint
|
|
166
|
+
*/
|
|
167
|
+
offsetLg?: number;
|
|
168
|
+
/**
|
|
169
|
+
* Offset at extra large breakpoint
|
|
170
|
+
*/
|
|
171
|
+
offsetXl?: number;
|
|
172
|
+
/**
|
|
173
|
+
* Offset at extra extra large breakpoint
|
|
174
|
+
*/
|
|
175
|
+
offsetXxl?: number;
|
|
176
|
+
/**
|
|
177
|
+
* Flex grow property
|
|
178
|
+
*/
|
|
179
|
+
grow?: boolean;
|
|
180
|
+
/**
|
|
181
|
+
* Flex shrink property
|
|
182
|
+
*/
|
|
183
|
+
shrink?: boolean;
|
|
184
|
+
/**
|
|
185
|
+
* Flex basis property
|
|
186
|
+
*/
|
|
187
|
+
basis?: string;
|
|
188
|
+
/**
|
|
189
|
+
* Alignment of the column
|
|
190
|
+
*/
|
|
191
|
+
align?: 'start' | 'end' | 'center' | 'baseline' | 'stretch';
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* GridCol component for creating columns within a Grid.
|
|
195
|
+
* Uses the CSS grid column classes defined in _objects.grid.scss.
|
|
196
|
+
*/
|
|
197
|
+
declare const GridCol: React.ForwardRefExoticComponent<GridColProps & React.RefAttributes<HTMLDivElement>>;
|
|
198
|
+
|
|
199
|
+
interface ContainerProps extends HTMLAttributes<HTMLDivElement> {
|
|
200
|
+
/**
|
|
201
|
+
* The content to be rendered within the container
|
|
202
|
+
*/
|
|
203
|
+
children: ReactNode;
|
|
204
|
+
/**
|
|
205
|
+
* Additional CSS class names
|
|
206
|
+
*/
|
|
207
|
+
className?: string;
|
|
208
|
+
/**
|
|
209
|
+
* Container type:
|
|
210
|
+
* - undefined: responsive container with max-width at each breakpoint
|
|
211
|
+
* - 'fluid': full width container
|
|
212
|
+
* - 'sm', 'md', 'lg', 'xl', 'xxl': responsive container with max-width at specified breakpoint
|
|
213
|
+
*/
|
|
214
|
+
type?: 'fluid' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Container component for creating responsive layouts.
|
|
218
|
+
* Uses the CSS container classes defined in _objects.container.scss.
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* ```tsx
|
|
222
|
+
* <Container>
|
|
223
|
+
* Content with responsive max-width
|
|
224
|
+
* </Container>
|
|
225
|
+
*
|
|
226
|
+
* <Container type="fluid">
|
|
227
|
+
* Full width content
|
|
228
|
+
* </Container>
|
|
229
|
+
*
|
|
230
|
+
* <Container type="md">
|
|
231
|
+
* Content with max-width at md breakpoint
|
|
232
|
+
* </Container>
|
|
233
|
+
* ```
|
|
234
|
+
*/
|
|
235
|
+
declare const Container: React.ForwardRefExoticComponent<ContainerProps & React.RefAttributes<HTMLDivElement>>;
|
|
236
|
+
|
|
237
|
+
interface RowProps extends HTMLAttributes<HTMLDivElement> {
|
|
238
|
+
/**
|
|
239
|
+
* The content to be rendered within the row
|
|
240
|
+
*/
|
|
241
|
+
children: ReactNode;
|
|
242
|
+
/**
|
|
243
|
+
* Additional CSS class names
|
|
244
|
+
*/
|
|
245
|
+
className?: string;
|
|
246
|
+
/**
|
|
247
|
+
* Control the horizontal alignment of items
|
|
248
|
+
*/
|
|
249
|
+
justifyContent?: 'start' | 'end' | 'center' | 'between' | 'around' | 'evenly';
|
|
250
|
+
/**
|
|
251
|
+
* Control the vertical alignment of items
|
|
252
|
+
*/
|
|
253
|
+
alignItems?: 'start' | 'end' | 'center' | 'baseline' | 'stretch';
|
|
254
|
+
/**
|
|
255
|
+
* No gutters between columns
|
|
256
|
+
*/
|
|
257
|
+
noGutters?: boolean;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Row component for creating rows within a Grid or Container.
|
|
261
|
+
* Uses the CSS row classes defined in _objects.grid.scss.
|
|
262
|
+
*
|
|
263
|
+
* @example
|
|
264
|
+
* ```tsx
|
|
265
|
+
* <Container>
|
|
266
|
+
* <Row justifyContent="between" alignItems="center">
|
|
267
|
+
* <GridCol md={6}>Column content</GridCol>
|
|
268
|
+
* <GridCol md={6}>Column content</GridCol>
|
|
269
|
+
* </Row>
|
|
270
|
+
* </Container>
|
|
271
|
+
* ```
|
|
272
|
+
*/
|
|
273
|
+
declare const Row: React.ForwardRefExoticComponent<RowProps & React.RefAttributes<HTMLDivElement>>;
|
|
274
|
+
|
|
275
|
+
interface MasonryGridItemProps extends HTMLAttributes<HTMLDivElement> {
|
|
276
|
+
/**
|
|
277
|
+
* The content to be rendered within the masonry grid item
|
|
278
|
+
*/
|
|
279
|
+
children: ReactNode;
|
|
280
|
+
/**
|
|
281
|
+
* Additional CSS class names
|
|
282
|
+
*/
|
|
283
|
+
className?: string;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* MasonryGridItem component for creating items within a MasonryGrid.
|
|
287
|
+
* Each item will be positioned optimally by the parent MasonryGrid component.
|
|
288
|
+
*
|
|
289
|
+
* @example
|
|
290
|
+
* ```tsx
|
|
291
|
+
* <MasonryGrid>
|
|
292
|
+
* <MasonryGridItem>Item 1</MasonryGridItem>
|
|
293
|
+
* <MasonryGridItem>Item 2</MasonryGridItem>
|
|
294
|
+
* </MasonryGrid>
|
|
295
|
+
* ```
|
|
296
|
+
*/
|
|
297
|
+
declare const MasonryGridItem: React.ForwardRefExoticComponent<MasonryGridItemProps & React.RefAttributes<HTMLDivElement>>;
|
|
298
|
+
|
|
299
|
+
export { Container, Grid, GridCol, MasonryGrid, MasonryGridItem, Row };
|
|
300
|
+
export type { ContainerProps, GridColProps, GridProps, MasonryGridItemProps, MasonryGridProps, RowProps };
|
package/dist/layout.js
ADDED
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
import React, { forwardRef, useState, useRef, useEffect, useImperativeHandle, useCallback, Children, isValidElement } from "react";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Grid component for creating responsive layouts.
|
|
7
|
+
* Uses the CSS grid system defined in _objects.grid.scss.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* <Grid>
|
|
12
|
+
* <GridCol sm={6} md={4} lg={3}>Column content</GridCol>
|
|
13
|
+
* <GridCol sm={6} md={4} lg={3}>Column content</GridCol>
|
|
14
|
+
* <GridCol sm={6} md={4} lg={3}>Column content</GridCol>
|
|
15
|
+
* </Grid>
|
|
16
|
+
* ```
|
|
17
|
+
*/ const Grid = forwardRef((({children: children, className: className = "", justifyContent: justifyContent, alignItems: alignItems, noGutters: noGutters, direction: direction, wrap: wrap, ...props}, ref) => {
|
|
18
|
+
const classes = [ "o-grid" ];
|
|
19
|
+
return justifyContent && classes.push(`u-justify-content-${justifyContent}`), alignItems && classes.push(`u-align-items-${alignItems}`),
|
|
20
|
+
noGutters && classes.push("o-grid--no-gutters"), direction && classes.push(`u-flex-direction-${direction}`),
|
|
21
|
+
wrap && classes.push(`u-flex-wrap-${wrap}`), className && classes.push(className),
|
|
22
|
+
jsx("div", {
|
|
23
|
+
ref: ref,
|
|
24
|
+
className: classes.join(" "),
|
|
25
|
+
...props,
|
|
26
|
+
children: children
|
|
27
|
+
});
|
|
28
|
+
}));
|
|
29
|
+
|
|
30
|
+
Grid.displayName = "Grid";
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* MasonryGrid component for creating a responsive masonry layout.
|
|
34
|
+
* Uses JavaScript to position items optimally based on available vertical space,
|
|
35
|
+
* similar to how a mason fits stones in a wall.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* <MasonryGrid xs={1} sm={2} md={3} lg={4}>
|
|
40
|
+
* <MasonryGridItem>Item 1</MasonryGridItem>
|
|
41
|
+
* <MasonryGridItem>Item 2</MasonryGridItem>
|
|
42
|
+
* <MasonryGridItem>Item 3</MasonryGridItem>
|
|
43
|
+
* </MasonryGrid>
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
const MasonryGrid = forwardRef((({children: children, className: className = "", xs: xs = 1, sm: sm, md: md, lg: lg, xl: xl, xxl: xxl, gap: gap = 16, animate: animate = !0, imagesLoaded: imagesLoaded = !0, onLayoutComplete: onLayoutComplete, onImageLoad: onImageLoad, ...props}, ref) => {
|
|
47
|
+
// === REFS & STATE ===
|
|
48
|
+
const [columns, setColumns] = useState(xs), [positions, setPositions] = useState([]), [layoutComplete, setLayoutComplete] = useState(!1), [loadingImages, setLoadingImages] = useState(!1), containerRef = useRef(null), columnHeights = useRef([]), imagesLoadedCount = useRef(0), totalImagesCount = useRef(0), imageElements = useRef(new Map);
|
|
49
|
+
useEffect((() => {
|
|
50
|
+
setLoadingImages(!!imagesLoaded);
|
|
51
|
+
}), [ columns, imagesLoaded ]),
|
|
52
|
+
// Forward ref for parent components
|
|
53
|
+
useImperativeHandle(ref, (() => containerRef.current));
|
|
54
|
+
// === HANDLE RESPONSIVE COLUMNS ===
|
|
55
|
+
const getResponsiveColumns = useCallback((() => {
|
|
56
|
+
const width = window.innerWidth;
|
|
57
|
+
return width >= 1400 && void 0 !== xxl ? xxl : width >= 1200 && void 0 !== xl ? xl : width >= 992 && void 0 !== lg ? lg : width >= 768 && void 0 !== md ? md : width >= 576 && void 0 !== sm ? sm : xs;
|
|
58
|
+
}), [ xs, sm, md, lg, xl, xxl ]);
|
|
59
|
+
useEffect((() => {
|
|
60
|
+
const handleResize = () => setColumns(getResponsiveColumns());
|
|
61
|
+
return handleResize(), // Set on mount
|
|
62
|
+
window.addEventListener("resize", handleResize), () => window.removeEventListener("resize", handleResize);
|
|
63
|
+
}), [ getResponsiveColumns ]);
|
|
64
|
+
// === PREPARE ITEMS WITH REFS ===
|
|
65
|
+
const [items, setItems] = useState([]);
|
|
66
|
+
useEffect((() => {
|
|
67
|
+
const newItems = [];
|
|
68
|
+
Children.forEach(children, ((child, index) => {
|
|
69
|
+
isValidElement(child) && newItems.push({
|
|
70
|
+
id: child.key?.toString() || `masonry-item-${index}`,
|
|
71
|
+
element: child,
|
|
72
|
+
position: null,
|
|
73
|
+
ref: React.createRef()
|
|
74
|
+
});
|
|
75
|
+
})), setItems(newItems);
|
|
76
|
+
}), [ children ]);
|
|
77
|
+
// === TRACK & MANAGE IMAGES ===
|
|
78
|
+
const handleImageLoad = useCallback((img => {
|
|
79
|
+
if (!imageElements.current.get(img)) {
|
|
80
|
+
// Add loaded class for animation
|
|
81
|
+
if (imageElements.current.set(img, !0), imagesLoadedCount.current += 1, containerRef.current && imagesLoaded) {
|
|
82
|
+
const itemElement = img.closest(".o-masonry-grid > div");
|
|
83
|
+
itemElement && (itemElement.offsetHeight, itemElement.classList.add("o-masonry-grid__item-loaded"),
|
|
84
|
+
itemElement.classList.remove("o-masonry-grid__item-loading"));
|
|
85
|
+
}
|
|
86
|
+
// Ensure layout is recalculated after DOM paints the item image (prevents overlap on slow/late image loads)
|
|
87
|
+
requestAnimationFrame((() => {
|
|
88
|
+
requestAnimationFrame((() => {
|
|
89
|
+
calculateLayout();
|
|
90
|
+
}));
|
|
91
|
+
})), onImageLoad?.(imagesLoadedCount.current, totalImagesCount.current),
|
|
92
|
+
// If all images have loaded, update loading state and complete layout
|
|
93
|
+
imagesLoadedCount.current >= totalImagesCount.current && totalImagesCount.current > 0 && (setLayoutComplete(!0),
|
|
94
|
+
setLoadingImages(!1), // This ensures the loading class is removed *immediately* after images load
|
|
95
|
+
// Force a double requestAnimationFrame for final layout calculation after all images are loaded (guarantees DOM paint)
|
|
96
|
+
requestAnimationFrame((() => {
|
|
97
|
+
requestAnimationFrame((() => {
|
|
98
|
+
calculateLayout(),
|
|
99
|
+
// As a failsafe, if still present for some render lag, force another setLoadingImages(false)
|
|
100
|
+
setLoadingImages(!1);
|
|
101
|
+
}));
|
|
102
|
+
})), onLayoutComplete?.());
|
|
103
|
+
}
|
|
104
|
+
}), [ onImageLoad, onLayoutComplete, imagesLoaded ]), trackImages = useCallback((() => {
|
|
105
|
+
if (!imagesLoaded || !containerRef.current) return;
|
|
106
|
+
imageElements.current.clear(), imagesLoadedCount.current = 0;
|
|
107
|
+
const images = containerRef.current.querySelectorAll("img");
|
|
108
|
+
return totalImagesCount.current = images.length, 0 === images.length ? (setLayoutComplete(!0),
|
|
109
|
+
setLoadingImages(!1), void onLayoutComplete?.()) : (setLoadingImages(!0), images.forEach((img => {
|
|
110
|
+
const masonryImg = img, itemElement = img.closest(".o-masonry-grid > div");
|
|
111
|
+
if (itemElement && itemElement.classList.add("o-masonry-grid__item-loading"), img.complete) handleImageLoad(img); else {
|
|
112
|
+
const loadHandler = () => handleImageLoad(img);
|
|
113
|
+
img.addEventListener("load", loadHandler), img.addEventListener("error", loadHandler),
|
|
114
|
+
masonryImg._masonryLoadHandler = loadHandler;
|
|
115
|
+
}
|
|
116
|
+
})), () => {
|
|
117
|
+
images.forEach((img => {
|
|
118
|
+
const masonryImg = img;
|
|
119
|
+
masonryImg._masonryLoadHandler && (img.removeEventListener("load", masonryImg._masonryLoadHandler),
|
|
120
|
+
img.removeEventListener("error", masonryImg._masonryLoadHandler), delete masonryImg._masonryLoadHandler);
|
|
121
|
+
}));
|
|
122
|
+
});
|
|
123
|
+
}), [ imagesLoaded, handleImageLoad, onLayoutComplete ]), calculateLayout = useCallback((() => {
|
|
124
|
+
if (!containerRef.current || 0 === items.length) return;
|
|
125
|
+
const colWidth = (containerRef.current.offsetWidth - gap * (columns - 1)) / columns;
|
|
126
|
+
columnHeights.current = Array(columns).fill(0);
|
|
127
|
+
const newPositions = [];
|
|
128
|
+
items.forEach(((item, index) => {
|
|
129
|
+
if (item.ref.current) {
|
|
130
|
+
// Find the shortest column
|
|
131
|
+
const shortestCol = columnHeights.current.indexOf(Math.min(...columnHeights.current)), left = shortestCol * (colWidth + gap), top = columnHeights.current[shortestCol] ?? 0, height = item.ref.current.offsetHeight;
|
|
132
|
+
columnHeights.current[shortestCol] = top + height + gap, newPositions[index] = {
|
|
133
|
+
left: left,
|
|
134
|
+
top: top,
|
|
135
|
+
width: colWidth,
|
|
136
|
+
height: height
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
})), setPositions(newPositions);
|
|
140
|
+
}), [ items, columns, gap ]);
|
|
141
|
+
// === OBSERVE CONTAINER RESIZE ===
|
|
142
|
+
useEffect((() => {
|
|
143
|
+
if (!containerRef.current) return;
|
|
144
|
+
let animationFrame = null;
|
|
145
|
+
const observer = new ResizeObserver((() => {
|
|
146
|
+
animationFrame && cancelAnimationFrame(animationFrame), animationFrame = requestAnimationFrame((() => calculateLayout()));
|
|
147
|
+
}));
|
|
148
|
+
return observer.observe(containerRef.current), () => {
|
|
149
|
+
observer.disconnect(), animationFrame && cancelAnimationFrame(animationFrame);
|
|
150
|
+
};
|
|
151
|
+
}), [ calculateLayout ]),
|
|
152
|
+
// === LAYOUT EFFECT (REPLACES setTimeout) ===
|
|
153
|
+
React.useLayoutEffect((() => imagesLoaded ? trackImages() : (calculateLayout(),
|
|
154
|
+
setLayoutComplete(!0), void setLoadingImages(!1))
|
|
155
|
+
// Only reset layoutComplete when items or columns change
|
|
156
|
+
), [ items, columns, calculateLayout, imagesLoaded, trackImages ]),
|
|
157
|
+
// === NEW: Add ResizeObservers to all grid items for bulletproof image+content measurement ===
|
|
158
|
+
React.useEffect((() => {
|
|
159
|
+
// Clean up old observers if items ever change
|
|
160
|
+
const observers = [];
|
|
161
|
+
return items.forEach((item => {
|
|
162
|
+
if (item.ref.current) {
|
|
163
|
+
const obs = new ResizeObserver((() => {
|
|
164
|
+
// Double rAF: ensures layout only runs after DOM/paint/async renders
|
|
165
|
+
requestAnimationFrame((() => {
|
|
166
|
+
requestAnimationFrame((() => {
|
|
167
|
+
calculateLayout();
|
|
168
|
+
}));
|
|
169
|
+
}));
|
|
170
|
+
}));
|
|
171
|
+
obs.observe(item.ref.current), observers.push(obs);
|
|
172
|
+
}
|
|
173
|
+
})), () => {
|
|
174
|
+
observers.forEach((obs => obs.disconnect()));
|
|
175
|
+
};
|
|
176
|
+
}), [ items, calculateLayout ]);
|
|
177
|
+
// Ensure loadingImages state resets when items/columns/imagesLoaded change
|
|
178
|
+
// === DETERMINE CONTAINER HEIGHT ===
|
|
179
|
+
const containerHeight = columnHeights.current.length > 0 ? Math.max(...columnHeights.current) : 0, classes = [ "o-masonry-grid", className, animate ? "o-masonry-grid--animate" : "", loadingImages ? "o-masonry-grid--loading-images" : "" ].filter(Boolean).join(" ");
|
|
180
|
+
// === DETERMINE CLASSES ===
|
|
181
|
+
// === RENDER ===
|
|
182
|
+
return jsx("div", {
|
|
183
|
+
ref: containerRef,
|
|
184
|
+
className: classes,
|
|
185
|
+
style: {
|
|
186
|
+
position: "relative",
|
|
187
|
+
width: "100%",
|
|
188
|
+
height: `${containerHeight}px`,
|
|
189
|
+
...props.style
|
|
190
|
+
},
|
|
191
|
+
...props,
|
|
192
|
+
children: items.map(((item, index) => {
|
|
193
|
+
const position = positions[index];
|
|
194
|
+
return jsx("div", position ? {
|
|
195
|
+
ref: item.ref,
|
|
196
|
+
className: "o-masonry-grid__item",
|
|
197
|
+
style: {
|
|
198
|
+
position: "absolute",
|
|
199
|
+
left: `${position.left}px`,
|
|
200
|
+
top: `${position.top}px`,
|
|
201
|
+
width: `${position.width}px`,
|
|
202
|
+
opacity: 1
|
|
203
|
+
},
|
|
204
|
+
children: item.element
|
|
205
|
+
} : {
|
|
206
|
+
ref: item.ref,
|
|
207
|
+
style: {
|
|
208
|
+
opacity: 0,
|
|
209
|
+
position: "absolute"
|
|
210
|
+
},
|
|
211
|
+
children: item.element
|
|
212
|
+
}, item.id);
|
|
213
|
+
}))
|
|
214
|
+
});
|
|
215
|
+
}));
|
|
216
|
+
|
|
217
|
+
MasonryGrid.displayName = "MasonryGrid";
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* GridCol component for creating columns within a Grid.
|
|
221
|
+
* Uses the CSS grid column classes defined in _objects.grid.scss.
|
|
222
|
+
*/
|
|
223
|
+
const GridCol = forwardRef((({children: children, className: className = "", xs: xs, sm: sm, md: md, lg: lg, xl: xl, xxl: xxl, offsetXs: offsetXs, offsetSm: offsetSm, offsetMd: offsetMd, offsetLg: offsetLg, offsetXl: offsetXl, offsetXxl: offsetXxl, grow: grow, shrink: shrink, basis: basis, align: align, ...props}, ref) => {
|
|
224
|
+
// If no specific size is provided, use auto class
|
|
225
|
+
const classes = xs || sm || md || lg || xl || xxl ? [ "o-grid__col" ] : [ "o-grid__col", "o-grid__col--auto" ], processResponsiveProp = (value, breakpoint) => {
|
|
226
|
+
void 0 !== value && (
|
|
227
|
+
// Handle boolean values
|
|
228
|
+
!0 !== value ? !1 !== value && (
|
|
229
|
+
// Handle string/number values
|
|
230
|
+
"xs" === breakpoint ? "auto" === value ? classes.push("o-grid__col--auto") : classes.push(`o-grid__col--${value}`) : "auto" === value ? classes.push(`o-grid__col--${breakpoint}-auto`) : classes.push(`o-grid__col--${breakpoint}-${value}`)) : classes.push("xs" === breakpoint ? "o-grid__col--auto" : `o-grid__col--${breakpoint}-auto`));
|
|
231
|
+
};
|
|
232
|
+
// Add column size classes based on the exact SCSS pattern
|
|
233
|
+
return processResponsiveProp(xs, "xs"), processResponsiveProp(sm, "sm"), processResponsiveProp(md, "md"),
|
|
234
|
+
processResponsiveProp(lg, "lg"), processResponsiveProp(xl, "xl"), processResponsiveProp(xxl, "xxl"),
|
|
235
|
+
// Add offset classes based on the exact SCSS pattern
|
|
236
|
+
offsetXs && classes.push(`o-grid__offset--${offsetXs}`), offsetSm && classes.push(`o-grid__offset--sm-${offsetSm}`),
|
|
237
|
+
offsetMd && classes.push(`o-grid__offset--md-${offsetMd}`), offsetLg && classes.push(`o-grid__offset--lg-${offsetLg}`),
|
|
238
|
+
offsetXl && classes.push(`o-grid__offset--xl-${offsetXl}`), offsetXxl && classes.push(`o-grid__offset--xxl-${offsetXxl}`),
|
|
239
|
+
// Add flex properties
|
|
240
|
+
void 0 !== grow && classes.push(grow ? "u-flex-grow-1" : "u-flex-grow-0"), void 0 !== shrink && classes.push(shrink ? "u-flex-shrink-1" : "u-flex-shrink-0"),
|
|
241
|
+
basis && classes.push(`u-flex-basis-${basis}`), align && classes.push(`u-align-self-${align}`),
|
|
242
|
+
className && classes.push(className), jsx("div", {
|
|
243
|
+
ref: ref,
|
|
244
|
+
className: classes.join(" "),
|
|
245
|
+
...props,
|
|
246
|
+
children: children
|
|
247
|
+
});
|
|
248
|
+
}));
|
|
249
|
+
|
|
250
|
+
GridCol.displayName = "GridCol";
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Container component for creating responsive layouts.
|
|
254
|
+
* Uses the CSS container classes defined in _objects.container.scss.
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* ```tsx
|
|
258
|
+
* <Container>
|
|
259
|
+
* Content with responsive max-width
|
|
260
|
+
* </Container>
|
|
261
|
+
*
|
|
262
|
+
* <Container type="fluid">
|
|
263
|
+
* Full width content
|
|
264
|
+
* </Container>
|
|
265
|
+
*
|
|
266
|
+
* <Container type="md">
|
|
267
|
+
* Content with max-width at md breakpoint
|
|
268
|
+
* </Container>
|
|
269
|
+
* ```
|
|
270
|
+
*/
|
|
271
|
+
const Container = forwardRef((({children: children, className: className = "", type: type, ...props}, ref) => {
|
|
272
|
+
let containerClass = "o-container";
|
|
273
|
+
return type && (containerClass = `o-container-${type}`), jsx("div", {
|
|
274
|
+
ref: ref,
|
|
275
|
+
className: `${containerClass} ${className}`.trim(),
|
|
276
|
+
...props,
|
|
277
|
+
children: children
|
|
278
|
+
});
|
|
279
|
+
}));
|
|
280
|
+
|
|
281
|
+
Container.displayName = "Container";
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Row component for creating rows within a Grid or Container.
|
|
285
|
+
* Uses the CSS row classes defined in _objects.grid.scss.
|
|
286
|
+
*
|
|
287
|
+
* @example
|
|
288
|
+
* ```tsx
|
|
289
|
+
* <Container>
|
|
290
|
+
* <Row justifyContent="between" alignItems="center">
|
|
291
|
+
* <GridCol md={6}>Column content</GridCol>
|
|
292
|
+
* <GridCol md={6}>Column content</GridCol>
|
|
293
|
+
* </Row>
|
|
294
|
+
* </Container>
|
|
295
|
+
* ```
|
|
296
|
+
*/
|
|
297
|
+
const Row = forwardRef((({children: children, className: className = "", justifyContent: justifyContent, alignItems: alignItems, noGutters: noGutters, ...props}, ref) => {
|
|
298
|
+
const classes = [ "o-grid" ];
|
|
299
|
+
return justifyContent && classes.push(`u-justify-content-${justifyContent}`), alignItems && classes.push(`u-align-items-${alignItems}`),
|
|
300
|
+
noGutters && classes.push("o-grid--no-gutters"), className && classes.push(className),
|
|
301
|
+
jsx("div", {
|
|
302
|
+
ref: ref,
|
|
303
|
+
className: classes.join(" "),
|
|
304
|
+
...props,
|
|
305
|
+
children: children
|
|
306
|
+
});
|
|
307
|
+
}));
|
|
308
|
+
|
|
309
|
+
Row.displayName = "Row";
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* MasonryGridItem component for creating items within a MasonryGrid.
|
|
313
|
+
* Each item will be positioned optimally by the parent MasonryGrid component.
|
|
314
|
+
*
|
|
315
|
+
* @example
|
|
316
|
+
* ```tsx
|
|
317
|
+
* <MasonryGrid>
|
|
318
|
+
* <MasonryGridItem>Item 1</MasonryGridItem>
|
|
319
|
+
* <MasonryGridItem>Item 2</MasonryGridItem>
|
|
320
|
+
* </MasonryGrid>
|
|
321
|
+
* ```
|
|
322
|
+
*/
|
|
323
|
+
const MasonryGridItem = forwardRef((({children: children, className: className = "", ...props}, ref) => {
|
|
324
|
+
const classes = [ "o-masonry-grid__item-inner" ];
|
|
325
|
+
return className && classes.push(className), jsx("div", {
|
|
326
|
+
ref: ref,
|
|
327
|
+
className: classes.join(" "),
|
|
328
|
+
...props,
|
|
329
|
+
children: children
|
|
330
|
+
});
|
|
331
|
+
}));
|
|
332
|
+
|
|
333
|
+
MasonryGridItem.displayName = "MasonryGridItem";
|
|
334
|
+
|
|
335
|
+
export { Container, Grid, GridCol, MasonryGrid, MasonryGridItem, Row };
|
|
336
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sources":["../src/layouts/Grid/Grid.tsx","../src/layouts/MasonryGrid/MasonryGrid.tsx","../src/layouts/Grid/GridCol.tsx","../src/layouts/Grid/Container.tsx","../src/layouts/Grid/Row.tsx","../src/layouts/MasonryGrid/MasonryGridItem.tsx"],"sourcesContent":[null,null,null,null,null,null],"names":["Grid","forwardRef","children","className","justifyContent","alignItems","noGutters","direction","wrap","props","ref","classes","push","_jsx","join","displayName","MasonryGrid","xs","sm","md","lg","xl","xxl","gap","animate","imagesLoaded","onLayoutComplete","onImageLoad","columns","setColumns","useState","positions","setPositions","layoutComplete","setLayoutComplete","loadingImages","setLoadingImages","containerRef","useRef","columnHeights","imagesLoadedCount","totalImagesCount","imageElements","Map","useEffect","useImperativeHandle","current","getResponsiveColumns","useCallback","width","window","innerWidth","undefined","handleResize","addEventListener","removeEventListener","items","setItems","newItems","Children","forEach","child","index","isValidElement","id","key","toString","element","position","React","createRef","handleImageLoad","img","get","set","itemElement","closest","offsetHeight","classList","add","remove","requestAnimationFrame","calculateLayout","trackImages","clear","images","querySelectorAll","length","masonryImg","complete","loadHandler","_masonryLoadHandler","colWidth","offsetWidth","Array","fill","newPositions","item","shortestCol","indexOf","Math","min","left","top","height","animationFrame","observer","ResizeObserver","cancelAnimationFrame","observe","disconnect","useLayoutEffect","observers","obs","containerHeight","max","filter","Boolean","style","map","opacity","GridCol","offsetXs","offsetSm","offsetMd","offsetLg","offsetXl","offsetXxl","grow","shrink","basis","align","processResponsiveProp","value","breakpoint","Container","type","containerClass","trim","Row","MasonryGridItem"],"mappings":";;;;;;;;;;;;;;;;GA8CaA,OAAAA,QAAOC,YAClB,EACIC,oBAAUC,uBAAY,IAAIC,gCAAgBC,wBAAYC,sBAAWC,sBAAWC,eAASC,QACvFC;IAEA,MAAMC,UAAU,EAAC;IA0BjB,OAxBIP,kBACFO,QAAQC,KAAK,qBAAqBR,mBAGhCC,cACFM,QAAQC,KAAK,iBAAiBP;IAG5BC,aACFK,QAAQC,KAAK,uBAGXL,aACFI,QAAQC,KAAK,oBAAoBL;IAG/BC,QACFG,QAAQC,KAAK,eAAeJ,SAG1BL,aACFQ,QAAQC,KAAKT;IAIbU;QAAKH,KAAKA;QAAKP,WAAWQ,QAAQG,KAAK;WAAUL;kBAC9CP;;AACG;;AAKZF,KAAKe,cAAc;;;;;;;;;;;;;;;;ACgBNC,MAAAA,eAAcf,YACzB,EAEIC,oBACAC,uBAAY,IACZc,SAAK,GACLC,QACAC,QACAC,QACAC,QACAC,UACAC,WAAM,IACNC,oBAAU,GACVC,8BAAe,GACfC,oCACAC,6BACGlB,QAELC;;IAGA,OAAOkB,SAASC,cAAcC,SAASb,MAChCc,WAAWC,gBAAgBF,SAAyB,MACpDG,gBAAgBC,qBAAqBJ,UAAS,KAC9CK,eAAeC,oBAAoBN,UAAS,IAC7CO,eAAeC,OAAuB,OACtCC,gBAAgBD,OAAiB,KACjCE,oBAAoBF,OAAO,IAC3BG,mBAAmBH,OAAO,IAC1BI,gBAAgBJ,OAAuC,IAAIK;IAEjEC,WAAU;QACUR,mBAAdX;AACwB,QAC3B,EAACG,SAASH;;IAQboB,oBAAoBnC,MAAK,MAAM2B,aAAaS;;IAG5C,MAAMC,uBAAuBC,aAAY;QACvC,MAAMC,QAAQC,OAAOC;QACrB,OAAIF,SAAS,aAAgBG,MAAR9B,MAA0BA,MAC3C2B,SAAS,aAAeG,MAAP/B,KAAyBA,KAC1C4B,SAAS,YAAcG,MAAPhC,KAAyBA,KACzC6B,SAAS,YAAcG,MAAPjC,KAAyBA,KACzC8B,SAAS,YAAcG,MAAPlC,KAAyBA,KACtCD;AAAE,QACR,EAACA,IAAIC,IAAIC,IAAIC,IAAIC,IAAIC;IAExBsB,WAAU;QACR,MAAMS,eAAeA,MAAMxB,WAAWkB;QAGtC,OAFAM;QACAH,OAAOI,iBAAiB,UAAUD,eAC3B,MAAMH,OAAOK,oBAAoB,UAAUF;AAAa,QAC9D,EAACN;;IAGJ,OAAOS,OAAOC,YAAY3B,SAA4B;IAEtDc,WAAU;QACR,MAAMc,WAA8B;QACpCC,SAASC,QAAQ1D,WAAU,CAAC2D,OAAOC;aAC5BC,eAAeF,UACpBH,SAAS9C,KAAK;gBACZoD,IAAIH,MAAMI,KAAKC,cAAc,gBAAgBJ;gBAC7CK,SAASN;gBACTO,UAAU;gBACV1D,MAAK2D,MAAMC;;AACX,aAEJb,SAASC;AAAS,QACjB,EAACxD;;IAIJ,MAAMqE,kBAAkBvB,aACrBwB;QACC,KAAI9B,cAAcI,QAAQ2B,IAAID,MAA9B;;YAIA,IAHA9B,cAAcI,QAAQ4B,IAAIF,MAAK,IAC/BhC,kBAAkBM,WAAW,GAEzBT,aAAaS,WAAWrB,cAAc;gBACxC,MAAMkD,cAAcH,IAAII,QAAQ;gBAC5BD,gBAEIA,YAA4BE,cAClCF,YAAYG,UAAUC,IAAI;gBAC1BJ,YAAYG,UAAUE,OAAO;AAEjC;;wBAEAC,uBAAsB;gBACpBA,uBAAsB;oBACpBC;AAAiB;AACjB,iBAEJvD,cAAca,kBAAkBM,SAASL,iBAAiBK;;YAGtDN,kBAAkBM,WAAWL,iBAAiBK,WAAWL,iBAAiBK,UAAU,MACtFZ,mBAAkB;YAClBE,kBAAiB;;YAEjB6C,uBAAsB;gBACpBA,uBAAsB;oBACpBC;;oBAEA9C,kBAAiB;AAAM;AACvB,iBAEJV;AAjCkC;AAkCpC,QAEF,EAACC,aAAaD,kBAAkBD,iBAG5B0D,cAAcnC,aAAY;QAC9B,KAAKvB,iBAAiBY,aAAaS,SAAS;QAC5CJ,cAAcI,QAAQsC,SACtB5C,kBAAkBM,UAAU;QAC5B,MAAMuC,SAAShD,aAAaS,QAAQwC,iBAAiB;QAErD,OADA7C,iBAAiBK,UAAUuC,OAAOE,QACZ,MAAlBF,OAAOE,UACTrD,mBAAkB;QAClBE,kBAAiB,SACjBV,yBAGFU,kBAAiB,IACjBiD,OAAOzB,SAAQY;YACb,MAAMgB,aAAahB,KACbG,cAAcH,IAAII,QAAQ;YAIhC,IAHID,eACFA,YAAYG,UAAUC,IAAI,iCAExBP,IAAIiB,UACNlB,gBAAgBC,WACX;gBACL,MAAMkB,cAAcA,MAAMnB,gBAAgBC;gBAC1CA,IAAIlB,iBAAiB,QAAQoC,cAC7BlB,IAAIlB,iBAAiB,SAASoC;gBAC9BF,WAAWG,sBAAsBD;AACnC;AAAA,aAGK;YACLL,OAAOzB,SAAQY;gBACb,MAAMgB,aAAahB;gBACfgB,WAAWG,wBACbnB,IAAIjB,oBAAoB,QAAQiC,WAAWG;gBAC3CnB,IAAIjB,oBAAoB,SAASiC,WAAWG,6BACrCH,WAAWG;AACpB;AACA;AACH,QACA,EAAClE,cAAc8C,iBAAiB7C,qBAG7BwD,kBAAkBlC,aAAY;QAClC,KAAKX,aAAaS,WAA4B,MAAjBU,MAAM+B,QAAc;QACjD,MACMK,YADiBvD,aAAaS,QAAQ+C,cACTtE,OAAOK,UAAU,MAAMA;QAC1DW,cAAcO,UAAUgD,MAAMlE,SAASmE,KAAK;QAC5C,MAAMC,eAA+B;QACrCxC,MAAMI,SAAQ,CAACqC,MAAMnC;YACnB,IAAImC,KAAKvF,IAAIoC,SAAS;;gBAEpB,MAAMoD,cAAc3D,cAAcO,QAAQqD,QAAQC,KAAKC,OAAO9D,cAAcO,WACtEwD,OAAOJ,eAAeN,WAAWrE,MACjCgF,MAAMhE,cAAcO,QAAQoD,gBAAgB,GAC5CM,SAASP,KAAKvF,IAAIoC,QAAQ+B;gBAChCtC,cAAcO,QAAQoD,eAAeK,MAAMC,SAASjF,KACpDyE,aAAalC,SAAS;oBACpBwC;oBACAC;oBACAtD,OAAO2C;oBACPY;;AAEJ;AAAA,aAEFxE,aAAagE;AAAa,QACzB,EAACxC,OAAO5B,SAASL;;IAGpBqB,WAAU;QACR,KAAKP,aAAaS,SAAS;QAC3B,IAAI2D,iBAAkE;QACtE,MAAMC,WAAW,IAAIC,gBAAe;YAC9BF,kBAAgBG,qBAAqBH,iBACzCA,iBAAiBxB,uBAAsB,MAAMC;AAAkB;QAGjE,OADAwB,SAASG,QAAQxE,aAAaS,UACvB;YACL4D,SAASI,cACLL,kBAAgBG,qBAAqBH;AAAe;AACzD,QACA,EAACvB;;IAGJb,MAAM0C,iBAAgB,MAChBtF,eACc0D,iBAGhBD;IACAhD,mBAAkB,SAClBE,kBAAiB;;OAIlB,EAACoB,OAAO5B,SAASsD,iBAAiBzD,cAAc0D;;IAGnDd,MAAMzB,WAAU;;QAEd,MAAMoE,YAA8B;QAepC,OAdAxD,MAAMI,SAAQqC;YACZ,IAAIA,KAAKvF,IAAIoC,SAAS;gBACpB,MAAMmE,MAAM,IAAIN,gBAAe;;oBAE7B1B,uBAAsB;wBACpBA,uBAAsB;4BACpBC;AAAiB;AACjB;AACF;gBAEJ+B,IAAIJ,QAAQZ,KAAKvF,IAAIoC,UACrBkE,UAAUpG,KAAKqG;AACjB;AAAA,aAEK;YACLD,UAAUpD,SAAQqD,OAAOA,IAAIH;AAAa;AAC3C,QACA,EAACtD,OAAO0B;;;IAKX,MAAMgC,kBACJ3E,cAAcO,QAAQyC,SAAS,IAAIa,KAAKe,OAAO5E,cAAcO,WAAW,GAGpEnC,UAAU,EACd,kBACAR,WACAqB,UAAU,4BAA4B,IACtCW,gBAAgB,mCAAmC,KAElDiF,OAAOC,SACPvG,KAAK;;;IAIR,OACED,IACE,OAAA;QAAAH,KAAK2B;QACLlC,WAAWQ;QACX2G,OAAO;YACLlD,UAAU;YACVnB,OAAO;YACPuD,QAAQ,GAAGU;eACRzG,MAAM6G;;WAEP7G;QAEHP,UAAAsD,MAAM+D,KAAI,CAACtB,MAAMnC;YAChB,MAAMM,WAAWrC,UAAU+B;YAC3B,OAQEjD,IAAA,OARGuD,WAQH;gBAEE1D,KAAKuF,KAAKvF;gBACVP,WAAU;gBACVmH,OAAO;oBACLlD,UAAU;oBACVkC,MAAM,GAAGlC,SAASkC;oBAClBC,KAAK,GAAGnC,SAASmC;oBACjBtD,OAAO,GAAGmB,SAASnB;oBACnBuE,SAAS;;gBAGVtH,UAAA+F,KAAK9B;gBAlBN;gBAAmBzD,KAAKuF,KAAKvF;gBAAwC4G,OAAO;oBAAEE,SAAS;oBAAGpD,UAAU;;gBAAYlE,UAC7G+F,KAAK9B;eAMH8B,KAAKjC;AAYN;;AAGN;;AAKZhD,YAAYD,cAAc;;;;;;AClUb0G,MAAAA,WAAUxH,YACrB,EAEIC,oBACAC,uBAAY,IACZc,QACAC,QACAC,QACAC,QACAC,QACAC,UACAoG,oBACAC,oBACAC,oBACAC,oBACAC,oBACAC,sBACAC,YACAC,gBACAC,cACAC,iBACG1H,QAELC;;IAGA,MACMC,UADiBM,MAAOC,MAAOC,MAAOC,MAAOC,MAAOC,MACa,EAAC,kBAAxC,EAAC,eAAe,uBAG1C8G,wBAAwBA,CAC5BC,OACAC;aAEclF,MAAViF;;SAGU,MAAVA,SAKU,MAAVA;;QAMe,SAAfC,aACY,WAAVD,QACF1H,QAAQC,KAAK,uBAEbD,QAAQC,KAAK,gBAAgByH,WAGjB,WAAVA,QACF1H,QAAQC,KAAK,gBAAgB0H,qBAE7B3H,QAAQC,KAAK,gBAAgB0H,cAAcD,YApB7C1H,QAAQC,KAAoB,SAAf0H,aAAsB,sBAAsB,gBAAgBA;AAsB3E;;IAsCF,OAlCAF,sBAAsBnH,IAAI,OAC1BmH,sBAAsBlH,IAAI,OAC1BkH,sBAAsBjH,IAAI;IAC1BiH,sBAAsBhH,IAAI,OAC1BgH,sBAAsB/G,IAAI,OAC1B+G,sBAAsB9G,KAAK;;IAGvBoG,YAAU/G,QAAQC,KAAK,mBAAmB8G,aAC1CC,YAAUhH,QAAQC,KAAK,sBAAsB+G;IAC7CC,YAAUjH,QAAQC,KAAK,sBAAsBgH,aAC7CC,YAAUlH,QAAQC,KAAK,sBAAsBiH;IAC7CC,YAAUnH,QAAQC,KAAK,sBAAsBkH,aAC7CC,aAAWpH,QAAQC,KAAK,uBAAuBmH;;SAGtC3E,MAAT4E,QACFrH,QAAQC,KAAKoH,OAAO,kBAAkB,uBAGzB5E,MAAX6E,UACFtH,QAAQC,KAAKqH,SAAS,oBAAoB;IAGxCC,SACFvH,QAAQC,KAAK,gBAAgBsH,UAG3BC,SACFxH,QAAQC,KAAK,gBAAgBuH;IAG3BhI,aAAWQ,QAAQC,KAAKT,YAG1BU;QAAKH,KAAKA;QAAKP,WAAWQ,QAAQG,KAAK;WAAUL;kBAC9CP;;AACG;;AAKZuH,QAAQ1G,cAAc;;;;;;;;;;;;;;;;;;;;;ACpJTwH,MAAAA,aAAYtI,YACvB,EAAGC,oBAAUC,uBAAY,IAAIqI,eAAS/H,QAASC;IAC7C,IAAI+H,iBAAiB;IAMrB,OAJID,SACFC,iBAAiB,eAAeD,SAIhC3H;QAAKH,KAAKA;QAAKP,WAAW,GAAGsI,kBAAkBtI,YAAYuI;WAAYjI;QACpEP,UAAAA;;AACG;;AAKZqI,UAAUxH,cAAc;;;;;;;;;;;;;;;;AChBX4H,MAAAA,OAAM1I,YACjB,EAAGC,oBAAUC,uBAAY,IAAIC,gCAAgBC,wBAAYC,yBAAcG,QAASC;IAC9E,MAAMC,UAAU,EAAC;IAkBjB,OAhBIP,kBACFO,QAAQC,KAAK,qBAAqBR,mBAGhCC,cACFM,QAAQC,KAAK,iBAAiBP;IAG5BC,aACFK,QAAQC,KAAK,uBAGXT,aACFQ,QAAQC,KAAKT;IAIbU;QAAKH,KAAKA;QAAKP,WAAWQ,QAAQG,KAAK;WAAUL;kBAC9CP;;AACG;;AAKZyI,IAAI5H,cAAc;;;;;;;;;;;;;;AC1CL6H,MAAAA,mBAAkB3I,YAC7B,EAAGC,oBAAUC,uBAAY,OAAOM,QAASC;IACvC,MAAMC,UAAU,EAAC;IAMjB,OAJIR,aACFQ,QAAQC,KAAKT,YAIbU;QAAKH,KAAKA;QAAKP,WAAWQ,QAAQG,KAAK;WAAUL;kBAC9CP;;AACG;;AAKZ0I,gBAAgB7H,cAAc;;"}
|