reso-ui 3.0.0-alpha.19 → 3.0.0-alpha.20

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 (95) hide show
  1. package/README.md +378 -4
  2. package/dist/cjs/components/Buttons/Back/Back.js +3 -1
  3. package/dist/cjs/components/Buttons/Back/Back.js.map +1 -1
  4. package/dist/cjs/components/Card/Dashboard-Overview-Card/Dashboard-Overview-Card.js +28 -0
  5. package/dist/cjs/components/Card/Dashboard-Overview-Card/Dashboard-Overview-Card.js.map +1 -0
  6. package/dist/cjs/components/Card/Dashboard-Overview-Card-Container/Dashboard-Overview-Card-Container.js +14 -0
  7. package/dist/cjs/components/Card/Dashboard-Overview-Card-Container/Dashboard-Overview-Card-Container.js.map +1 -0
  8. package/dist/cjs/components/Dialog/Dialog.js +1 -1
  9. package/dist/cjs/components/Dialog/Dialog.js.map +1 -1
  10. package/dist/cjs/components/Enlarged-Image-Modal/Enlarged-Image-Modal.js +82 -0
  11. package/dist/cjs/components/Enlarged-Image-Modal/Enlarged-Image-Modal.js.map +1 -0
  12. package/dist/cjs/components/Icon/Icon.js +1 -1
  13. package/dist/cjs/components/Icon/Icon.js.map +1 -1
  14. package/dist/cjs/components/Infinite-Scroll-Container/Infinite-Scroll-Container.js +2 -1
  15. package/dist/cjs/components/Infinite-Scroll-Container/Infinite-Scroll-Container.js.map +1 -1
  16. package/dist/cjs/components/Loaders/ShimmerLoader/ShimmerLoader.js.map +1 -1
  17. package/dist/cjs/forms/Controls/Dropdown/Dropdown-Select/Dropdown-Select.js +2 -2
  18. package/dist/cjs/index.js +6 -6
  19. package/dist/cjs/providers/ThemeProvider.js +4 -1
  20. package/dist/cjs/providers/ThemeProvider.js.map +1 -1
  21. package/dist/esm/components/Buttons/Back/Back.js +3 -1
  22. package/dist/esm/components/Buttons/Back/Back.js.map +1 -1
  23. package/dist/esm/components/Card/Dashboard-Overview-Card/Dashboard-Overview-Card.d.ts +12 -0
  24. package/dist/esm/components/Card/Dashboard-Overview-Card/Dashboard-Overview-Card.js +26 -0
  25. package/dist/esm/components/Card/Dashboard-Overview-Card/Dashboard-Overview-Card.js.map +1 -0
  26. package/dist/esm/components/Card/Dashboard-Overview-Card/index.d.ts +2 -0
  27. package/dist/esm/components/Card/Dashboard-Overview-Card-Container/Dashboard-Overview-Card-Container.d.ts +9 -0
  28. package/dist/esm/components/Card/Dashboard-Overview-Card-Container/Dashboard-Overview-Card-Container.js +12 -0
  29. package/dist/esm/components/Card/Dashboard-Overview-Card-Container/Dashboard-Overview-Card-Container.js.map +1 -0
  30. package/dist/esm/components/Card/Dashboard-Overview-Card-Container/index.d.ts +2 -0
  31. package/dist/esm/components/Card/index.d.ts +2 -3
  32. package/dist/esm/components/Dialog/Dialog.js +1 -1
  33. package/dist/esm/components/Dialog/Dialog.js.map +1 -1
  34. package/dist/esm/components/Enlarged-Image-Modal/Enlarged-Image-Modal.d.ts +20 -0
  35. package/dist/esm/components/Enlarged-Image-Modal/Enlarged-Image-Modal.js +80 -0
  36. package/dist/esm/components/Enlarged-Image-Modal/Enlarged-Image-Modal.js.map +1 -0
  37. package/dist/esm/components/Enlarged-Image-Modal/index.d.ts +2 -0
  38. package/dist/esm/components/Icon/Icon.js +1 -1
  39. package/dist/esm/components/Icon/Icon.js.map +1 -1
  40. package/dist/esm/components/Infinite-Scroll-Container/Infinite-Scroll-Container.js +2 -1
  41. package/dist/esm/components/Infinite-Scroll-Container/Infinite-Scroll-Container.js.map +1 -1
  42. package/dist/esm/components/Loaders/ShimmerLoader/ShimmerLoader.d.ts +1 -0
  43. package/dist/esm/components/Loaders/ShimmerLoader/ShimmerLoader.js.map +1 -1
  44. package/dist/esm/components/index.d.ts +1 -0
  45. package/dist/esm/forms/Controls/Dropdown/Dropdown-Select/Dropdown-Select.js +2 -2
  46. package/dist/esm/index.js +3 -3
  47. package/dist/esm/providers/ThemeProvider.js +4 -1
  48. package/dist/esm/providers/ThemeProvider.js.map +1 -1
  49. package/dist/src/library/components/Card/Dashboard-Overview-Card/Dashboard-Overview-Card.d.ts +12 -0
  50. package/dist/src/library/components/Card/Dashboard-Overview-Card/index.d.ts +2 -0
  51. package/dist/src/library/components/Card/Dashboard-Overview-Card/stories/Dashboard-Overview-Card.stories.d.ts +20 -0
  52. package/dist/src/library/components/Card/Dashboard-Overview-Card-Container/Dashboard-Overview-Card-Container.d.ts +9 -0
  53. package/dist/src/library/components/Card/Dashboard-Overview-Card-Container/index.d.ts +2 -0
  54. package/dist/src/library/components/Card/Dashboard-Overview-Card-Container/stories/Dashboard-Overview-Card-Container.stories.d.ts +18 -0
  55. package/dist/src/library/components/Card/index.d.ts +2 -3
  56. package/dist/src/library/components/Containers/Flex/stories/Flex.stories.d.ts +1 -0
  57. package/dist/src/library/components/Dialog/stories/Dialog.stories.d.ts +30 -0
  58. package/dist/src/library/components/Enlarged-Image-Modal/Enlarged-Image-Modal.d.ts +20 -0
  59. package/dist/src/library/components/Enlarged-Image-Modal/index.d.ts +2 -0
  60. package/dist/src/library/components/Enlarged-Image-Modal/stories/Enlarged-Image-Modal.stories.d.ts +9 -0
  61. package/dist/src/library/components/Errors/Full-Screen-Error/stories/Full-Screen-Error.stories.d.ts +9 -0
  62. package/dist/src/library/components/Loaders/ShimmerLoader/ShimmerLoader.d.ts +1 -0
  63. package/dist/src/library/components/index.d.ts +1 -0
  64. package/dist/src/{library/components/Card/Card-Container/stories/Card-Container.stories.d.ts → utility-classes.stories.d.ts} +1 -3
  65. package/dist/styles.css +1 -1
  66. package/package.json +1 -1
  67. package/dist/cjs/components/Card/Card-Container/Card-Container.js +0 -16
  68. package/dist/cjs/components/Card/Card-Container/Card-Container.js.map +0 -1
  69. package/dist/cjs/components/Card/Card-Content/Card-Content.js +0 -15
  70. package/dist/cjs/components/Card/Card-Content/Card-Content.js.map +0 -1
  71. package/dist/cjs/components/Card/Card-Summary-Value/Card-Summary-Value.js +0 -14
  72. package/dist/cjs/components/Card/Card-Summary-Value/Card-Summary-Value.js.map +0 -1
  73. package/dist/esm/components/Card/Card-Container/Card-Container.d.ts +0 -9
  74. package/dist/esm/components/Card/Card-Container/Card-Container.js +0 -14
  75. package/dist/esm/components/Card/Card-Container/Card-Container.js.map +0 -1
  76. package/dist/esm/components/Card/Card-Container/index.d.ts +0 -2
  77. package/dist/esm/components/Card/Card-Content/Card-Content.d.ts +0 -9
  78. package/dist/esm/components/Card/Card-Content/Card-Content.js +0 -13
  79. package/dist/esm/components/Card/Card-Content/Card-Content.js.map +0 -1
  80. package/dist/esm/components/Card/Card-Content/index.d.ts +0 -2
  81. package/dist/esm/components/Card/Card-Summary-Value/Card-Summary-Value.d.ts +0 -7
  82. package/dist/esm/components/Card/Card-Summary-Value/Card-Summary-Value.js +0 -12
  83. package/dist/esm/components/Card/Card-Summary-Value/Card-Summary-Value.js.map +0 -1
  84. package/dist/esm/components/Card/Card-Summary-Value/index.d.ts +0 -2
  85. package/dist/src/library/components/Card/Card-Container/Card-Container.d.ts +0 -9
  86. package/dist/src/library/components/Card/Card-Container/index.d.ts +0 -2
  87. package/dist/src/library/components/Card/Card-Content/Card-Content.d.ts +0 -9
  88. package/dist/src/library/components/Card/Card-Content/index.d.ts +0 -2
  89. package/dist/src/library/components/Card/Card-Content/stories/Card-Content.stories.d.ts +0 -17
  90. package/dist/src/library/components/Card/Card-Summary-Value/Card-Summary-Value.d.ts +0 -7
  91. package/dist/src/library/components/Card/Card-Summary-Value/index.d.ts +0 -2
  92. package/dist/src/library/components/Card/Card-Summary-Value/stories/Card-Summary-Value.stories.d.ts +0 -17
  93. /package/dist/src/library/components/Card/{Card-Content/__test__/Card-Content.test.d.ts → Dashboard-Overview-Card/__test__/Dashboard-Overview-Card.test.d.ts} +0 -0
  94. /package/dist/src/library/components/Card/{Card-Container/__test__/Card-Container.test.d.ts → Dashboard-Overview-Card-Container/__test__/Dashboard-Overview-Card-Container.test.d.ts} +0 -0
  95. /package/dist/src/library/components/{Card/Card-Summary-Value/__test__/Card-Summary-Value.test.d.ts → Enlarged-Image-Modal/__test__/Enlarged-Image-Modal.test.d.ts} +0 -0
package/README.md CHANGED
@@ -1,23 +1,40 @@
1
1
  # Reso UI
2
2
 
3
- React component library for Reso Applications.
3
+ A React component library built with TypeScript + SCSS. Ships as tree-shakeable ESM + CJS output via Rollup.
4
4
 
5
5
  **Storybook:** [reso-ui-storybook.s3-website-ap-southeast-1.amazonaws.com](http://reso-ui-storybook.s3-website-ap-southeast-1.amazonaws.com/)
6
6
 
7
7
  ---
8
8
 
9
+ ## Guiding Principles
10
+
11
+ 1. **Customizability-first** — Clients can and should be able to override most if not all units of a UI component. Override the entire palette via `<ResoUiProvider theme={...}>`, or override colours and behaviour directly on individual components via props. Clients should NOT override styles by hacky CSS means (e.g. directly overwriting compiled CSS class names in their projects).
12
+
13
+ 2. **Clean and minimalistic** — We eliminate clutter and prioritize ease of interaction for app users AND ease of component use for developers. Maximum configurability, yet minimal complication. Easy. Simple. Minimal.
14
+
15
+ 3. **In-house solutions** — We build everything ourselves (drag and drop, date selector calculations, etc). No dependencies on third-party component libraries unless absolutely necessary.
16
+
17
+ 4. **Performant and zero runtime cost** — Theming via CSS custom properties; no theme object traversal at render time.
18
+
19
+ ---
20
+
9
21
  ## Table of Contents
10
22
 
11
23
  - [Using the Library (Client Setup)](#using-the-library-client-setup)
12
24
  - [Requirements](#requirements)
13
25
  - [Install](#install)
14
26
  - [Client project files](#client-project-files)
15
- - [Webpack config](#webpack-config)
27
+ - [Bundler Setup](#bundler-setup)
28
+ - [Vite](#vite)
29
+ - [Webpack](#webpack)
30
+ - [Next.js](#nextjs)
31
+ - [Create React App (CRA)](#create-react-app-cra)
16
32
  - [Provider setup](#provider-setup)
17
33
  - [Import styles](#import-styles)
18
34
  - [Basic usage](#basic-usage)
19
35
  - [Theming & Dark Mode Setup](#theming--dark-mode-setup)
20
36
  - [Overriding the Color Palette](#overriding-the-color-palette)
37
+ - [Utility Classes](#utility-classes)
21
38
  - [Dev Notes](#dev-notes)
22
39
  - [CI/CD Notes](#cicd-notes)
23
40
 
@@ -85,13 +102,71 @@ Then add it to your `tsconfig.json`:
85
102
 
86
103
  ---
87
104
 
88
- ### Webpack config
105
+ ### Bundler Setup
106
+
107
+ The library ships pre-compiled JS (ESM + CJS), a single CSS file, and the Poppins and DancingScript font files — all locally bundled with no external network dependency.
108
+
109
+ Pick the section that matches your bundler:
110
+
111
+ ---
112
+
113
+ #### Vite
114
+
115
+ Tested with Vite **6.x** (`@vitejs/plugin-react` 5.x).
116
+
117
+ Vite handles CSS imports and font asset resolution out of the box. **No `vite.config.ts` changes are required** for reso-ui to work.
118
+
119
+ Install the core Vite dependencies:
120
+
121
+ ```bash
122
+ npm install -D vite@^6.4.2 @vitejs/plugin-react@^5.2.0
123
+ ```
124
+
125
+ If your project uses its own SCSS files, install the `sass` package:
126
+
127
+ ```bash
128
+ npm install -D sass@^1.87.0
129
+ ```
89
130
 
90
- The library ships pre-compiled JS (ESM + CJS), a single CSS file, and the Poppins and DancingScript font files — all locally bundled with no external network dependency. Your webpack config needs:
131
+ If your project imports `.svg` files as React components, add `vite-plugin-svgr`:
132
+
133
+ ```bash
134
+ npm install -D vite-plugin-svgr@^5.2.0
135
+ ```
136
+
137
+ ```ts
138
+ // vite.config.ts
139
+ import { defineConfig } from "vite";
140
+ import react from "@vitejs/plugin-react";
141
+ import svgr from "vite-plugin-svgr";
142
+
143
+ export default defineConfig({
144
+ plugins: [react(), svgr()],
145
+ });
146
+ ```
147
+
148
+ That's it — `import "reso-ui/styles"` works immediately since Vite natively processes CSS from `node_modules` and resolves the relative `url(fonts/...)` paths in the stylesheet.
149
+
150
+ ---
151
+
152
+ #### Webpack
153
+
154
+ Tested with Webpack **5.x** (matches the Reso online-store and web-storefront projects).
155
+
156
+ Your webpack config needs:
91
157
 
92
158
  1. **CSS loader** — to handle `import "reso-ui/styles"`
93
159
  2. **asset modules** — to resolve the `.ttf` font files referenced in the library CSS
94
160
 
161
+ Install the required loaders:
162
+
163
+ ```bash
164
+ npm install -D webpack@^5.99.6 webpack-cli@^6.0.1 webpack-dev-server@^5.2.1 \
165
+ ts-loader@^9.5.2 style-loader@^4.0.0 css-loader@^7.1.2 \
166
+ sass-loader@^16.0.5 sass@^1.87.0 \
167
+ html-webpack-plugin@^5.6.3
168
+ ```
169
+
95
170
  Minimum webpack rules:
96
171
 
97
172
  ```js
@@ -132,6 +207,146 @@ module.exports = {
132
207
 
133
208
  ---
134
209
 
210
+ #### Next.js
211
+
212
+ Tested with Next.js **15.x** (App Router and Pages Router).
213
+
214
+ Next.js handles CSS imports, font asset resolution, and TypeScript out of the box. **No `next.config` changes are required** for reso-ui to work.
215
+
216
+ ```bash
217
+ npm install next@^15.5.18 react@^18.2.0 react-dom@^18.2.0
218
+ npm install reso-ui classnames
219
+ ```
220
+
221
+ If your project uses its own SCSS files:
222
+
223
+ ```bash
224
+ npm install -D sass@^1.87.0
225
+ ```
226
+
227
+ If your project imports `.svg` files as React components, configure `@svgr/webpack` in `next.config`:
228
+
229
+ ```js
230
+ // next.config.mjs
231
+ const nextConfig = {
232
+ webpack(config) {
233
+ config.module.rules.push({
234
+ test: /\.svg$/,
235
+ use: ["@svgr/webpack"],
236
+ });
237
+ return config;
238
+ },
239
+ };
240
+
241
+ export default nextConfig;
242
+ ```
243
+
244
+ ```bash
245
+ npm install -D @svgr/webpack@^8.1.0
246
+ ```
247
+
248
+ ##### App Router setup
249
+
250
+ Reso UI components use React context and hooks internally, so they require a `"use client"` boundary. Create a client-side provider wrapper:
251
+
252
+ ```tsx
253
+ // src/providers/ResoUiClientProvider.tsx
254
+ "use client";
255
+
256
+ import { ResoUiProvider } from "reso-ui";
257
+
258
+ export const ResoUiClientProvider = ({ children }: { children: React.ReactNode }) => (
259
+ <ResoUiProvider mode="system">
260
+ {children}
261
+ </ResoUiProvider>
262
+ );
263
+ ```
264
+
265
+ Then import the styles and provider in your root layout:
266
+
267
+ ```tsx
268
+ // src/app/layout.tsx
269
+ import "reso-ui/styles";
270
+ import "./globals.css";
271
+ import { ResoUiClientProvider } from "@/providers/ResoUiClientProvider";
272
+
273
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
274
+ return (
275
+ <html lang="en">
276
+ <body>
277
+ <ResoUiClientProvider>
278
+ {children}
279
+ </ResoUiClientProvider>
280
+ </body>
281
+ </html>
282
+ );
283
+ }
284
+ ```
285
+
286
+ Use reso-ui components in any Client Component:
287
+
288
+ ```tsx
289
+ // src/app/dashboard/page.tsx
290
+ "use client";
291
+
292
+ import { Button, Text, View } from "reso-ui";
293
+
294
+ export default function DashboardPage() {
295
+ return (
296
+ <View pt={9} ph={4}>
297
+ <Text Element="h1">Dashboard</Text>
298
+ <Button text="Click me" onClick={() => alert("clicked")} />
299
+ </View>
300
+ );
301
+ }
302
+ ```
303
+
304
+ ##### Pages Router setup
305
+
306
+ Import styles and wrap with the provider in `_app.tsx`:
307
+
308
+ ```tsx
309
+ // pages/_app.tsx
310
+ import "reso-ui/styles";
311
+ import "../styles/globals.css";
312
+ import { ResoUiProvider } from "reso-ui";
313
+ import type { AppProps } from "next/app";
314
+
315
+ export default function App({ Component, pageProps }: AppProps) {
316
+ return (
317
+ <ResoUiProvider mode="system">
318
+ <Component {...pageProps} />
319
+ </ResoUiProvider>
320
+ );
321
+ }
322
+ ```
323
+
324
+ > **Note:** Reso UI does not ship `"use client"` directives. In the App Router, all pages and components that use reso-ui components must be Client Components (marked with `"use client"`), or the reso-ui components must be wrapped in a Client Component.
325
+
326
+ ---
327
+
328
+ #### Create React App (CRA)
329
+
330
+ Tested with **react-scripts 5.x**.
331
+
332
+ CRA handles CSS imports, font asset resolution, and SVG imports out of the box. **No configuration changes are required.**
333
+
334
+ ```bash
335
+ npx create-react-app my-app --template typescript
336
+ cd my-app
337
+ npm install reso-ui classnames
338
+ ```
339
+
340
+ If your project uses its own SCSS files, install the `sass` package:
341
+
342
+ ```bash
343
+ npm install -D sass@^1.87.0
344
+ ```
345
+
346
+ Everything else works immediately — CRA's built-in webpack config already includes CSS loaders, asset modules for fonts, and `@svgr/webpack` for SVG imports.
347
+
348
+ ---
349
+
135
350
  ### Provider setup
136
351
 
137
352
  Wrap your application root with `ResoUiProvider`. It provides theming and responsive context to all Reso UI components.
@@ -385,6 +600,165 @@ Pass a partial `theme.colors` object to override semantic color roles. Keys map
385
600
 
386
601
  ---
387
602
 
603
+ ## Utility Classes
604
+
605
+ Reso UI ships utility CSS classes that consumer projects can apply directly via `className` or `rootClassName`. These are included in the `reso-ui/styles` stylesheet and support dark mode automatically where applicable.
606
+
607
+ ### Quick Reference
608
+
609
+ | Class | Category | Dark Mode | Description |
610
+ |-------|----------|-----------|-------------|
611
+ | [`resoui_section_border`](#section-border) | Layout | Yes | Bordered section container with default border-radius |
612
+ | [`resoui_table_base`](#tables) | Tables | Yes | Base `<table>` styling (font, collapse, full width) |
613
+ | [`resoui_th_base`](#tables) | Tables | Yes | Table header cell (padding, border, font-weight) |
614
+ | [`resoui_tr_base`](#tables) | Tables | Yes | Table row (border, hover highlight) |
615
+ | [`resoui_tr_base_selected`](#tables) | Tables | Yes | Selected table row highlight |
616
+ | [`resoui_td_base`](#tables) | Tables | No | Table data cell (padding) |
617
+ | [`resoui_navItem_base`](#nav-item-base) | Navigation | No | Nav item base layout for custom NavItem renders |
618
+ | [`resoui_dropdown_option_base`](#dropdown-option-base) | Forms | Yes | Dropdown option base for custom DropdownSelect options |
619
+ | [`resoui_no_select`](#general-utilities) | General | No | Disable text selection |
620
+ | [`resoui_component_disabled`](#general-utilities) | General | No | Disabled overlay with pointer-events disabled |
621
+ | [`resoui_background_image`](#general-utilities) | General | No | Background image with cover |
622
+ | [`resoui_truncate`](#text-utilities) | Text | No | Truncate text with ellipsis |
623
+ | [`resoui_text_no_block_margin`](#text-utilities) | Text | No | Remove default block margins |
624
+ | [`resoui_text_no_inline_margin`](#text-utilities) | Text | No | Remove default inline margins |
625
+
626
+ ### Section Border
627
+
628
+ A bordered container for card-like content sections. Apply via `rootClassName` on `Flex` or `View`.
629
+
630
+ ```tsx
631
+ import { Flex, Text } from "reso-ui";
632
+
633
+ <Flex direction="column" rootClassName="resoui_section_border" pa={5}>
634
+ <Text Element="h3">Section Title</Text>
635
+ <Text>Section content goes here.</Text>
636
+ </Flex>
637
+ ```
638
+
639
+ Light mode: `1px solid` neutral border + default border-radius. Dark mode: border color automatically darkens.
640
+
641
+ ### Tables
642
+
643
+ Base styles for native HTML `<table>` elements. Apply via the `className` attribute. Dark mode is handled automatically.
644
+
645
+ | Class | Apply to | What it does |
646
+ |-------|----------|-------------|
647
+ | `resoui_table_base` | `<table>` | Font-family, border-collapse, full width, font size |
648
+ | `resoui_th_base` | `<th>` | Padding, bottom border, font-weight 500, left-aligned |
649
+ | `resoui_tr_base` | `<tr>` | Bottom border, hover background highlight |
650
+ | `resoui_tr_base_selected` | `<tr>` | Selected row highlight (combine with `resoui_tr_base`) |
651
+ | `resoui_td_base` | `<td>` | Cell padding |
652
+
653
+ ```tsx
654
+ <table className="resoui_table_base">
655
+ <thead>
656
+ <tr>
657
+ <th className="resoui_th_base">Name</th>
658
+ <th className="resoui_th_base">Email</th>
659
+ <th className="resoui_th_base">Role</th>
660
+ </tr>
661
+ </thead>
662
+ <tbody>
663
+ <tr className="resoui_tr_base">
664
+ <td className="resoui_td_base">John Doe</td>
665
+ <td className="resoui_td_base">john@example.com</td>
666
+ <td className="resoui_td_base">Admin</td>
667
+ </tr>
668
+ </tbody>
669
+ </table>
670
+ ```
671
+
672
+ For selected rows, combine both classes:
673
+
674
+ ```tsx
675
+ <tr className={`resoui_tr_base ${selectedId === item.id ? "resoui_tr_base_selected" : ""}`}>
676
+ ```
677
+
678
+ Add custom column-specific styles alongside the utility classes:
679
+
680
+ ```tsx
681
+ <th className="resoui_th_base myPage_th_right">Amount</th>
682
+ <td className="resoui_td_base myPage_td_mono">$120.00</td>
683
+ ```
684
+
685
+ ```scss
686
+ .myPage_th_right { text-align: right; }
687
+ .myPage_td_mono { font-family: monospace; font-size: 12px; }
688
+ ```
689
+
690
+ ### Nav Item Base
691
+
692
+ Base layout class for custom nav items rendered inside `NavItem` via `renderCustomNavItem`. Provides standard sizing consistent with the `Navbar`.
693
+
694
+ ```tsx
695
+ import { NavItem } from "reso-ui";
696
+ import { Link, useLocation } from "react-router-dom";
697
+
698
+ const AppNavItem = ({ to, children }) => {
699
+ const { pathname } = useLocation();
700
+
701
+ return (
702
+ <NavItem
703
+ renderCustomNavItem={() => (
704
+ <Link
705
+ to={to}
706
+ className={`navItem_base ${pathname === to ? "my_nav_active" : ""}`}
707
+ >
708
+ {children}
709
+ </Link>
710
+ )}
711
+ >
712
+ {children}
713
+ </NavItem>
714
+ );
715
+ };
716
+ ```
717
+
718
+ ### Dropdown Option Base
719
+
720
+ Base class for custom dropdown options rendered inside `DropdownSelect`. Provides consistent sizing, padding, and dark mode text color.
721
+
722
+ ```tsx
723
+ import { DropdownSelect } from "reso-ui";
724
+ import { Link } from "react-router-dom";
725
+
726
+ <DropdownSelect label="Account">
727
+ <Link to="/profile" className="resoui_dropdown_option_base">My Profile</Link>
728
+ <Link to="/settings" className="resoui_dropdown_option_base">Settings</Link>
729
+ </DropdownSelect>
730
+ ```
731
+
732
+ ### General Utilities
733
+
734
+ | Class | What it does |
735
+ |-------|-------------|
736
+ | `resoui_no_select` | Prevent text selection (all browser prefixes) |
737
+ | `resoui_component_disabled` | Semi-transparent overlay + disable pointer events |
738
+ | `resoui_background_image` | Background image: cover, centered, no-repeat |
739
+
740
+ ```tsx
741
+ <Flex rootClassName={isLocked ? "resoui_component_disabled" : ""}>
742
+ <Text>This section is locked</Text>
743
+ </Flex>
744
+ ```
745
+
746
+ ### Text Utilities
747
+
748
+ | Class | What it does |
749
+ |-------|-------------|
750
+ | `resoui_truncate` | Truncate with ellipsis (`overflow: hidden; text-overflow: ellipsis; white-space: nowrap`) |
751
+ | `resoui_text_no_block_margin` | Remove block margins from headings (`margin-block-start: 0`) |
752
+ | `resoui_text_no_inline_margin` | Remove inline margins |
753
+
754
+ ```tsx
755
+ <Text rootClassName="resoui_truncate" rootStyles={{ maxWidth: "200px" }}>
756
+ Very long product name that should be truncated
757
+ </Text>
758
+ ```
759
+
760
+ ---
761
+
388
762
  ## Dev Notes
389
763
 
390
764
  ### Available commands
@@ -1,6 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var React = require('react');
4
+ var ChevronSingleLeft = require('../../../icons/svg/ChevronSingleLeft.svg.js');
5
+ var Icon = require('../../Icon/Icon.js');
4
6
  var styles = require('../../../utils/styles.js');
5
7
 
6
8
  const Back = ({ to, text = "Back", disabled = false, rootClassName, rootStyles = {}, linkClassName, linkStyles = {}, ...spacingsProps }) => {
@@ -13,7 +15,7 @@ const Back = ({ to, text = "Back", disabled = false, rootClassName, rootStyles =
13
15
  const linkClasses = styles.createComponentStyles(styles.createLayoutStyles({}, linkClassName));
14
16
  return (React.createElement("div", { "data-testid": "back-root", className: containerStyles, style: rootStyles, role: "navigation" },
15
17
  React.createElement("a", { rel: "noreferrer", href: to, className: linkClasses, style: linkStyles, "data-testid": "back-link" },
16
- "<",
18
+ React.createElement(Icon.Icon, { SvgIcon: ChevronSingleLeft.default, width: 14, height: 14 }),
17
19
  " ",
18
20
  text)));
19
21
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Back.js","sources":["../../../../../src/library/components/Buttons/Back/Back.tsx"],"sourcesContent":[null],"names":["createComponentStyles","createLayoutStyles","withSpacingsProps"],"mappings":";;;;;AAyBO,MAAM,IAAI,GAAG,CAAC,EACnB,EAAE,EACF,IAAI,GAAG,MAAM,EACb,QAAQ,GAAG,KAAK,EAChB,aAAa,EACb,UAAU,GAAG,EAAE,EACf,aAAa,EACb,UAAU,GAAG,EAAE,EACf,GAAG,aAAa,EACL,KAAI;AACf,IAAA,MAAM,eAAe,GAAGA,4BAAqB,CAC3CC,yBAAkB,CAChBC,wBAAiB,CACf;AACE,QAAA,qBAAqB,EAAE,IAAI;AAC5B,KAAA,EACD,aAAa,CACd,EACD,aAAa,EACb;QACE,QAAQ;AACR,QAAA,gBAAgB,EAAE,IAAI;AACvB,KAAA,CACF,CACF;IAED,MAAM,WAAW,GAAGF,4BAAqB,CACvCC,yBAAkB,CAAC,EAAE,EAAE,aAAa,CAAC,CACtC;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,aAAA,EACc,WAAW,EACvB,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,UAAU,EACjB,IAAI,EAAC,YAAY,EAAA;AAEjB,QAAA,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EACE,GAAG,EAAC,YAAY,EAChB,IAAI,EAAE,EAAE,EACR,SAAS,EAAE,WAAW,EACtB,KAAK,EAAE,UAAU,iBACL,WAAW,EAAA;YAEtB,GAAG;;YAAG,IAAI,CACT,CACA;AAEV;;;;"}
1
+ {"version":3,"file":"Back.js","sources":["../../../../../src/library/components/Buttons/Back/Back.tsx"],"sourcesContent":[null],"names":["createComponentStyles","createLayoutStyles","withSpacingsProps","Icon","ChevronSingleLeft"],"mappings":";;;;;;;AA4BO,MAAM,IAAI,GAAG,CAAC,EACnB,EAAE,EACF,IAAI,GAAG,MAAM,EACb,QAAQ,GAAG,KAAK,EAChB,aAAa,EACb,UAAU,GAAG,EAAE,EACf,aAAa,EACb,UAAU,GAAG,EAAE,EACf,GAAG,aAAa,EACL,KAAI;AACf,IAAA,MAAM,eAAe,GAAGA,4BAAqB,CAC3CC,yBAAkB,CAChBC,wBAAiB,CACf;AACE,QAAA,qBAAqB,EAAE,IAAI;AAC5B,KAAA,EACD,aAAa,CACd,EACD,aAAa,EACb;QACE,QAAQ;AACR,QAAA,gBAAgB,EAAE,IAAI;AACvB,KAAA,CACF,CACF;IAED,MAAM,WAAW,GAAGF,4BAAqB,CACvCC,yBAAkB,CAAC,EAAE,EAAE,aAAa,CAAC,CACtC;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,aAAA,EACc,WAAW,EACvB,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,UAAU,EACjB,IAAI,EAAC,YAAY,EAAA;AAEjB,QAAA,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EACE,GAAG,EAAC,YAAY,EAChB,IAAI,EAAE,EAAE,EACR,SAAS,EAAE,WAAW,EACtB,KAAK,EAAE,UAAU,iBACL,WAAW,EAAA;AAEvB,YAAA,KAAA,CAAA,aAAA,CAACE,SAAI,EAAA,EAAC,OAAO,EAAEC,yBAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAA,CAAI;;YAAE,IAAI,CAC/D,CACA;AAEV;;;;"}
@@ -0,0 +1,28 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var styles = require('../../../utils/styles.js');
5
+
6
+ const DashboardOverviewCard = ({ label, value, badge, onClick, rootClassName, rootStyles = {}, ...spacingsProps }) => {
7
+ const containerStyles = styles.createComponentStyles(styles.createLayoutStyles(styles.withSpacingsProps({
8
+ resoui_dashboard_overview_card: true,
9
+ resoui_dashboard_overview_card_clickable: !!onClick,
10
+ }, spacingsProps), rootClassName));
11
+ return (React.createElement("div", { className: containerStyles, style: rootStyles, "data-testid": "dashboard-overview-card-root", onClick: onClick, role: onClick ? "button" : undefined, tabIndex: onClick ? 0 : undefined, onKeyDown: onClick
12
+ ? (e) => {
13
+ if (e.key === "Enter" || e.key === " ") {
14
+ e.preventDefault();
15
+ onClick();
16
+ }
17
+ }
18
+ : undefined },
19
+ React.createElement("div", { className: "resoui_dashboard_overview_card_label" },
20
+ React.createElement("span", { className: "resoui_dashboard_overview_card_label_text" }, label),
21
+ badge != null && badge > 0 && (React.createElement("span", { className: "resoui_dashboard_overview_card_badge" },
22
+ "+",
23
+ badge))),
24
+ React.createElement("div", { className: "resoui_dashboard_overview_card_value" }, value)));
25
+ };
26
+
27
+ exports.DashboardOverviewCard = DashboardOverviewCard;
28
+ //# sourceMappingURL=Dashboard-Overview-Card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard-Overview-Card.js","sources":["../../../../../src/library/components/Card/Dashboard-Overview-Card/Dashboard-Overview-Card.tsx"],"sourcesContent":[null],"names":["createComponentStyles","createLayoutStyles","withSpacingsProps"],"mappings":";;;;;AAqBO,MAAM,qBAAqB,GAAG,CAAC,EACpC,KAAK,EACL,KAAK,EACL,KAAK,EACL,OAAO,EACP,aAAa,EACb,UAAU,GAAG,EAAE,EACf,GAAG,aAAa,EACY,KAAI;AAChC,IAAA,MAAM,eAAe,GAAGA,4BAAqB,CAC3CC,yBAAkB,CAChBC,wBAAiB,CACf;AACE,QAAA,8BAA8B,EAAE,IAAI;QACpC,wCAAwC,EAAE,CAAC,CAAC,OAAO;AACpD,KAAA,EACD,aAAa,CACd,EACD,aAAa,CACd,CACF;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,UAAU,iBACL,8BAA8B,EAC1C,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,EACpC,QAAQ,EAAE,OAAO,GAAG,CAAC,GAAG,SAAS,EACjC,SAAS,EACP;AACE,cAAE,CAAC,CAAC,KAAI;AACJ,gBAAA,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE;oBACtC,CAAC,CAAC,cAAc,EAAE;AAClB,oBAAA,OAAO,EAAE;gBACX;YACF;AACF,cAAE,SAAS,EAAA;QAGf,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,sCAAsC,EAAA;AACnD,YAAA,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,2CAA2C,EAAA,EACxD,KAAK,CACD;YACN,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,KACzB,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,sCAAsC,EAAA;;gBAClD,KAAK,CACF,CACR,CACG;QACN,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,sCAAsC,EAAA,EAAE,KAAK,CAAO,CAC/D;AAEV;;;;"}
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var styles = require('../../../utils/styles.js');
5
+
6
+ const DashboardOverviewCardContainer = ({ children, rootClassName, rootStyles = {}, ...spacingsProps }) => {
7
+ const containerStyles = styles.createComponentStyles(styles.createLayoutStyles(styles.withSpacingsProps({
8
+ resoui_dashboard_overview_card_container: true,
9
+ }, spacingsProps), rootClassName));
10
+ return (React.createElement("div", { className: containerStyles, style: rootStyles, "data-testid": "dashboard-overview-card-container-root" }, children));
11
+ };
12
+
13
+ exports.DashboardOverviewCardContainer = DashboardOverviewCardContainer;
14
+ //# sourceMappingURL=Dashboard-Overview-Card-Container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard-Overview-Card-Container.js","sources":["../../../../../src/library/components/Card/Dashboard-Overview-Card-Container/Dashboard-Overview-Card-Container.tsx"],"sourcesContent":[null],"names":["createComponentStyles","createLayoutStyles","withSpacingsProps"],"mappings":";;;;;AAoBO,MAAM,8BAA8B,GAAG,CAAC,EAC7C,QAAQ,EACR,aAAa,EACb,UAAU,GAAG,EAAE,EACf,GAAG,aAAa,EACqB,KAAI;AACzC,IAAA,MAAM,eAAe,GAAGA,4BAAqB,CAC3CC,yBAAkB,CAChBC,wBAAiB,CACf;AACE,QAAA,wCAAwC,EAAE,IAAI;AAC/C,KAAA,EACD,aAAa,CACd,EACD,aAAa,CACd,CACF;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,UAAU,iBACL,wCAAwC,EAAA,EAEnD,QAAQ,CACL;AAEV;;;;"}
@@ -49,7 +49,7 @@ onClickYes, onClickNo, onClickOk, rootClassName, rootStyles, yesButtonClassName,
49
49
  onClickNo();
50
50
  }
51
51
  }, text: noText }),
52
- React.createElement(Button.Button, { rootClassName: yesButtonClasses, rootStyles: yesButtonStyles, onClick: () => {
52
+ React.createElement(Button.Button, { type: "primary", rootClassName: yesButtonClasses, rootStyles: yesButtonStyles, onClick: () => {
53
53
  if (validations.methodHasValue(onClickYes)) {
54
54
  onClickYes();
55
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.js","sources":["../../../../src/library/components/Dialog/Dialog.tsx"],"sourcesContent":[null],"names":["createComponentStyles","createLayoutStyles","ModalContainer","ModalHeader","methodHasValue","ModalBody","Button"],"mappings":"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"}
1
+ {"version":3,"file":"Dialog.js","sources":["../../../../src/library/components/Dialog/Dialog.tsx"],"sourcesContent":[null],"names":["createComponentStyles","createLayoutStyles","ModalContainer","ModalHeader","methodHasValue","ModalBody","Button"],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var styles = require('../../utils/styles.js');
5
+ var useDisableBodyScroll = require('../../hooks/useDisableBodyScroll.js');
6
+ var ResponsiveContext = require('../../context/ResponsiveContext.js');
7
+ require('../../context/ThemeContext.js');
8
+ var Image = require('../Images/Image/Image.js');
9
+ var CloseButton = require('../Buttons/Close-Button/Close-Button.js');
10
+ var Icon = require('../Icon/Icon.js');
11
+ var ChevronSingleLeft = require('../../icons/svg/ChevronSingleLeft.svg.js');
12
+ var ChevronSingleRight = require('../../icons/svg/ChevronSingleRight.svg.js');
13
+
14
+ const TRANSITION_DURATION = 250;
15
+ const EnlargedImageModal = ({ isOpen = false, onClose, imageSrc, imageAlt = "Enlarged image", hasNext = false, hasPrevious = false, onNext, onPrevious, layer = 1, width = 640, height = 640, objectFit = "contain", rootClassName, rootStyles = {}, ...spacingsProps }) => {
16
+ useDisableBodyScroll.useDisableBodyScroll(isOpen);
17
+ const { isMobile } = React.useContext(ResponsiveContext.ResponsiveContext);
18
+ const [_isOpen, _setIsOpen] = React.useState(false);
19
+ React.useEffect(() => {
20
+ if (isOpen) {
21
+ _setIsOpen(true);
22
+ }
23
+ else {
24
+ const timeout = setTimeout(() => _setIsOpen(false), TRANSITION_DURATION);
25
+ return () => clearTimeout(timeout);
26
+ }
27
+ }, [isOpen]);
28
+ const handleKeyDown = React.useCallback((e) => {
29
+ if (!isOpen)
30
+ return;
31
+ if (e.key === "Escape") {
32
+ onClose();
33
+ }
34
+ else if (e.key === "ArrowRight" && hasNext && onNext) {
35
+ onNext();
36
+ }
37
+ else if (e.key === "ArrowLeft" && hasPrevious && onPrevious) {
38
+ onPrevious();
39
+ }
40
+ }, [isOpen, onClose, hasNext, hasPrevious, onNext, onPrevious]);
41
+ React.useEffect(() => {
42
+ document.addEventListener("keydown", handleKeyDown);
43
+ return () => document.removeEventListener("keydown", handleKeyDown);
44
+ }, [handleKeyDown]);
45
+ const backdropClasses = styles.createComponentStyles(styles.createLayoutStyles({
46
+ resoui_enlarged_image_modal_backdrop: true,
47
+ resoui_enlarged_image_modal_backdrop_transition: true,
48
+ resoui_enlarged_image_modal_backdrop_open: isOpen ? _isOpen : isOpen,
49
+ }));
50
+ const containerClasses = styles.createComponentStyles(styles.createLayoutStyles(styles.withSpacingsProps({
51
+ resoui_enlarged_image_modal_container: true,
52
+ resoui_enlarged_image_modal_container_transition: true,
53
+ resoui_enlarged_image_modal_container_open: isOpen ? _isOpen : isOpen,
54
+ }, spacingsProps), rootClassName));
55
+ const computedZIndex = layer + 10;
56
+ const getIsOpen = () => (isOpen ? isOpen : _isOpen);
57
+ const imageSize = isMobile ? 360 : width;
58
+ const imageHeight = isMobile ? 360 : height;
59
+ return (getIsOpen() && (React.createElement("div", { className: backdropClasses, style: { zIndex: computedZIndex }, "data-testid": "enlarged-image-modal-backdrop", role: "dialog", "aria-modal": "true", "aria-label": imageAlt },
60
+ React.createElement("div", { className: "resoui_enlarged_image_modal_close" },
61
+ React.createElement(CloseButton.CloseButton, { onClick: onClose })),
62
+ React.createElement("div", { className: containerClasses, style: { zIndex: computedZIndex + 1, ...rootStyles }, "data-testid": "enlarged-image-modal-root" },
63
+ React.createElement(Image.Image, { rootStyles: {
64
+ width: `${imageSize}px`,
65
+ height: `${imageHeight}px`,
66
+ }, src: imageSrc, alt: imageAlt, onClick: onClose, clickable: "zoomOut", objectFit: objectFit })),
67
+ hasPrevious && onPrevious && (React.createElement("button", { className: "resoui_enlarged_image_modal_nav resoui_enlarged_image_modal_nav_previous resoui_no_select", onClick: (e) => {
68
+ e.preventDefault();
69
+ e.stopPropagation();
70
+ onPrevious();
71
+ }, "data-testid": "enlarged-image-modal-nav-previous", "aria-label": "Previous image", type: "button" },
72
+ React.createElement(Icon.Icon, { SvgIcon: ChevronSingleLeft.default, width: 24, height: 24 }))),
73
+ hasNext && onNext && (React.createElement("button", { className: "resoui_enlarged_image_modal_nav resoui_enlarged_image_modal_nav_next resoui_no_select", onClick: (e) => {
74
+ e.preventDefault();
75
+ e.stopPropagation();
76
+ onNext();
77
+ }, "data-testid": "enlarged-image-modal-nav-next", "aria-label": "Next image", type: "button" },
78
+ React.createElement(Icon.Icon, { SvgIcon: ChevronSingleRight.default, width: 24, height: 24 }))))));
79
+ };
80
+
81
+ exports.EnlargedImageModal = EnlargedImageModal;
82
+ //# sourceMappingURL=Enlarged-Image-Modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Enlarged-Image-Modal.js","sources":["../../../../src/library/components/Enlarged-Image-Modal/Enlarged-Image-Modal.tsx"],"sourcesContent":[null],"names":["useDisableBodyScroll","useContext","ResponsiveContext","useState","useEffect","useCallback","createComponentStyles","createLayoutStyles","withSpacingsProps","CloseButton","Image","Icon","ChevronSingleLeft","ChevronSingleRight"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  var React = require('react');
4
4
  var styles = require('../../utils/styles.js');
5
5
 
6
- const Icon = ({ SvgIcon, width = 32, height = 32, inline = false, fill = "#434B59", stroke = "current", rootClassName, rootStyles = {}, ...spacingsProps }) => {
6
+ const Icon = ({ SvgIcon, width = 32, height = 32, inline = false, fill = "currentColor", stroke = "current", rootClassName, rootStyles = {}, ...spacingsProps }) => {
7
7
  const containerClasses = styles.createComponentStyles(styles.createLayoutStyles(styles.withSpacingsProps({
8
8
  resoui_icon_container: true,
9
9
  resoui_icon_container_inline: inline,
@@ -1 +1 @@
1
- {"version":3,"file":"Icon.js","sources":["../../../../src/library/components/Icon/Icon.tsx"],"sourcesContent":[null],"names":["createComponentStyles","createLayoutStyles","withSpacingsProps"],"mappings":";;;;;AA4BO,MAAM,IAAI,GAAG,CAAC,EACnB,OAAO,EACP,KAAK,GAAG,EAAE,EACV,MAAM,GAAG,EAAE,EACX,MAAM,GAAG,KAAK,EACd,IAAI,GAAG,SAAS,EAChB,MAAM,GAAG,SAAS,EAClB,aAAa,EACb,UAAU,GAAG,EAAE,EACf,GAAG,aAAa,EACL,KAAI;AACf,IAAA,MAAM,gBAAgB,GAAGA,4BAAqB,CAC5CC,yBAAkB,CAChBC,wBAAiB,CACf;AACE,QAAA,qBAAqB,EAAE,IAAI;AAC3B,QAAA,4BAA4B,EAAE,MAAM;AACrC,KAAA,EACD,aAAa,CACd,EACD,aAAa,CACd,CACF;IAED,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,aAAA,EACc,WAAW,EACvB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,UAAU,EAAA;QAEjB,KAAA,CAAA,aAAA,CAAC,OAAO,mBACM,eAAe,EAC3B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EAAA,CACd,CACE;AAEV;;;;"}
1
+ {"version":3,"file":"Icon.js","sources":["../../../../src/library/components/Icon/Icon.tsx"],"sourcesContent":[null],"names":["createComponentStyles","createLayoutStyles","withSpacingsProps"],"mappings":";;;;;AA4BO,MAAM,IAAI,GAAG,CAAC,EACnB,OAAO,EACP,KAAK,GAAG,EAAE,EACV,MAAM,GAAG,EAAE,EACX,MAAM,GAAG,KAAK,EACd,IAAI,GAAG,cAAc,EACrB,MAAM,GAAG,SAAS,EAClB,aAAa,EACb,UAAU,GAAG,EAAE,EACf,GAAG,aAAa,EACL,KAAI;AACf,IAAA,MAAM,gBAAgB,GAAGA,4BAAqB,CAC5CC,yBAAkB,CAChBC,wBAAiB,CACf;AACE,QAAA,qBAAqB,EAAE,IAAI;AAC3B,QAAA,4BAA4B,EAAE,MAAM;AACrC,KAAA,EACD,aAAa,CACd,EACD,aAAa,CACd,CACF;IAED,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,aAAA,EACc,WAAW,EACvB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,UAAU,EAAA;QAEjB,KAAA,CAAA,aAAA,CAAC,OAAO,mBACM,eAAe,EAC3B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EAAA,CACd,CACE;AAEV;;;;"}
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var React = require('react');
4
+ var Loader = require('../Loaders/Loader/Loader.js');
4
5
  var styles = require('../../utils/styles.js');
5
6
 
6
7
  const InfiniteScrollContainer = ({ children, isLoading = true, currentPage = 1, setCurrentPage, totalPages = 1, fetchedForPage, onFetchData, height = "100%", loader, scrollThreshold = 1, rootClassName, rootStyles = {}, ...spacingsProps }) => {
@@ -35,7 +36,7 @@ const InfiniteScrollContainer = ({ children, isLoading = true, currentPage = 1,
35
36
  };
36
37
  return (React.createElement("div", { className: containerStyles, style: { height, maxHeight: height, ...rootStyles }, "data-testid": "infinite-scroll-container-root", onScroll: handleScroll },
37
38
  children,
38
- isLoading && (React.createElement("div", { ref: loaderRef, className: "resoui_infiniteScroll_loader", "data-testid": "infinite-scroll-loader" }, loader || React.createElement("span", null, "Loading...")))));
39
+ isLoading && (React.createElement("div", { ref: loaderRef, className: "resoui_infiniteScroll_loader", "data-testid": "infinite-scroll-loader" }, loader || React.createElement(Loader.Loader, { size: "small" })))));
39
40
  };
40
41
 
41
42
  exports.InfiniteScrollContainer = InfiniteScrollContainer;