@tui-cruises/mein-schiff-web-react-component-library 3.0.5 → 3.0.7
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/CHANGELOG.md +21 -0
- package/icons/icons/arrival.tsx +20 -0
- package/icons/icons/index.ts +1 -0
- package/index.tsx +1 -2
- package/package.json +1 -1
- package/public/videos/placeholder.mp4 +0 -0
- package/src/components/core/Alert/Alert.tsx +2 -2
- package/src/components/core/Icon/Icon.tsx +0 -1
- package/src/components/core/Pictogram/Pictogram.tsx +1 -0
- package/src/components/core/FavoriteButton/FavoriteButton.tsx +0 -294
- package/src/components/core/FavoriteButton/index.ts +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [3.0.7](https://bitbucket.org/yours_truly/tuic-mein-schiff-web-react-component-library/compare/v3.0.6...v3.0.7) (2025-10-23)
|
|
6
|
+
|
|
7
|
+
### [3.0.6](https://bitbucket.org/yours_truly/tuic-mein-schiff-web-react-component-library/compare/v2.2.11...v3.0.6) (2025-10-23)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* **EC-1589:** next15 ([f7f195e](https://bitbucket.org/yours_truly/tuic-mein-schiff-web-react-component-library/commit/f7f195e4a667094f98ef1d91ff081b3e8339c56a))
|
|
13
|
+
* **FavoriteButton:** delete 'FavoriteButton' from core components ([5d2bcb0](https://bitbucket.org/yours_truly/tuic-mein-schiff-web-react-component-library/commit/5d2bcb0fade07bcf608414a88fa1273dfb5d6e04))
|
|
14
|
+
* fix carousel for next15 ([307b74e](https://bitbucket.org/yours_truly/tuic-mein-schiff-web-react-component-library/commit/307b74ec8164c253183aad39ed73724d53721f7e))
|
|
15
|
+
* icon next15 ([a44efc6](https://bitbucket.org/yours_truly/tuic-mein-schiff-web-react-component-library/commit/a44efc67244f6d3d470323dea7110d7c5c949336))
|
|
16
|
+
* next15 prep ([c228c08](https://bitbucket.org/yours_truly/tuic-mein-schiff-web-react-component-library/commit/c228c084b32c60499eaf055e6f9e5dc698ebaf72))
|
|
17
|
+
* next15 prep ([9d1adcf](https://bitbucket.org/yours_truly/tuic-mein-schiff-web-react-component-library/commit/9d1adcf970b8a75ec478211bdf01933e0bd7a03e))
|
|
18
|
+
* **Price:** new price information component ([b1a67bc](https://bitbucket.org/yours_truly/tuic-mein-schiff-web-react-component-library/commit/b1a67bc66e7c1342aeefd3d60d2597bff7236578))
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
### Bug Fixes
|
|
22
|
+
|
|
23
|
+
* **Alert:** update text styles ([c3742e3](https://bitbucket.org/yours_truly/tuic-mein-schiff-web-react-component-library/commit/c3742e36d1f59acec4766e458f56656d0f2147e8))
|
|
24
|
+
* **Icon:** add missing 'arrival' icon (pull request [#11](https://bitbucket.org/yours_truly/tuic-mein-schiff-web-react-component-library/issues/11)) ([afbd480](https://bitbucket.org/yours_truly/tuic-mein-schiff-web-react-component-library/commit/afbd4809d3aec214685286ec677361ff9a8af6e1))
|
|
25
|
+
|
|
5
26
|
### [3.0.5](https://bitbucket.org/yours_truly/tuic-mein-schiff-web-react-component-library/compare/v3.0.4...v3.0.5) (2025-09-16)
|
|
6
27
|
|
|
7
28
|
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SVGProps } from 'react';
|
|
2
|
+
const SvgArrival = (props: SVGProps<SVGSVGElement>) => (
|
|
3
|
+
<svg
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
width="1em"
|
|
6
|
+
height="1em"
|
|
7
|
+
fill="none"
|
|
8
|
+
viewBox="0 0 24 24"
|
|
9
|
+
color="currentColor"
|
|
10
|
+
{...props}
|
|
11
|
+
>
|
|
12
|
+
<path
|
|
13
|
+
fill="currentColor"
|
|
14
|
+
fillRule="evenodd"
|
|
15
|
+
d="M10.684 1.983a.83.83 0 0 1 .435.392l3.385 6.534 3.546 1.132a.83.83 0 0 1 .352.221l2.16 2.287c.193.195.515.613.595 1.16.044.3.014.645-.158.984-.17.334-.447.603-.796.812-.616.37-1.325.566-1.925.67a7.4 7.4 0 0 1-1.51.107 1 1 0 0 1-.174-.026L5.386 13.289a.83.83 0 0 1-.376-.217L1.466 9.53a.83.83 0 0 1-.241-.658l.412-5.027a.833.833 0 0 1 1.094-.723l2.225.742c.243.081.435.27.521.51l.68 1.903 1.527.43-.846-4.877A.833.833 0 0 1 7.965.912zm-.901 1.436-1.05-.413.819 4.72a.833.833 0 0 1-1.048.944L5.29 7.763a.83.83 0 0 1-.558-.521l-.688-1.926-.833-.278-.294 3.585 3.112 3.112 10.9 2.885c.241.005.633-.013 1.066-.088.491-.085.978-.232 1.35-.456a.7.7 0 0 0 .162-.13.4.4 0 0 0-.048-.115.6.6 0 0 0-.101-.13l-2.02-2.138-3.669-1.17a.83.83 0 0 1-.486-.411zM0 19.834c0-.46.373-.834.833-.834h20a.833.833 0 1 1 0 1.667h-20A.833.833 0 0 1 0 19.833"
|
|
16
|
+
clipRule="evenodd"
|
|
17
|
+
/>
|
|
18
|
+
</svg>
|
|
19
|
+
);
|
|
20
|
+
export default SvgArrival;
|
package/icons/icons/index.ts
CHANGED
|
@@ -7,6 +7,7 @@ export const dynamicComponents = {
|
|
|
7
7
|
airplane: dynamic(() => import('./airplane'), { ssr: false }),
|
|
8
8
|
anchor: dynamic(() => import('./anchor'), { ssr: false }),
|
|
9
9
|
'angle-tool': dynamic(() => import('./angle-tool'), { ssr: false }),
|
|
10
|
+
arrival: dynamic(() => import('./arrival'), { ssr: false }),
|
|
10
11
|
'arrow-down': dynamic(() => import('./arrow-down'), { ssr: false }),
|
|
11
12
|
'arrow-left': dynamic(() => import('./arrow-left'), { ssr: false }),
|
|
12
13
|
'arrow-right': dynamic(() => import('./arrow-right'), { ssr: false }),
|
package/index.tsx
CHANGED
|
@@ -28,7 +28,6 @@ export * from './src/components/core/Skeleton';
|
|
|
28
28
|
export * from './src/components/core/SwitchToggle';
|
|
29
29
|
export * from './src/components/core/Tag';
|
|
30
30
|
export * from './src/components/core/Tooltip';
|
|
31
|
-
export * from './src/components/core/FavoriteButton';
|
|
32
31
|
export * from './src/components/core/IconButton';
|
|
33
32
|
export * from './src/components/core/InputField';
|
|
34
33
|
export * from './src/components/core/Pagination';
|
|
@@ -49,7 +48,7 @@ export * from './src/components/core/TextButton';
|
|
|
49
48
|
export * from './src/components/core/Toast';
|
|
50
49
|
|
|
51
50
|
// Shared Components
|
|
52
|
-
export * from './src/components/shared/NextFontMeinSchiffSansPro'; // @
|
|
51
|
+
export * from './src/components/shared/NextFontMeinSchiffSansPro'; // @revisit: Utils
|
|
53
52
|
export * from './src/components/shared/UniversalCarousel';
|
|
54
53
|
|
|
55
54
|
/**
|
package/package.json
CHANGED
|
Binary file
|
|
@@ -97,14 +97,14 @@ export const Alert: FC<AlertProps> = ({
|
|
|
97
97
|
)}
|
|
98
98
|
|
|
99
99
|
{(children || cta || (!headline && onClose)) && (
|
|
100
|
-
<div className={twJoin('flex', iconName && headline ? '
|
|
100
|
+
<div className={twJoin('flex', iconName && headline ? 'pl-8' : '')}>
|
|
101
101
|
{(children || cta) && (
|
|
102
102
|
<div className="flex-1 space-y-4">
|
|
103
103
|
{children && (
|
|
104
104
|
<div
|
|
105
105
|
className={twJoin(
|
|
106
106
|
'cf-rich-text text-current',
|
|
107
|
-
size === 'sm' ? 'text-sm' : 'text-lg',
|
|
107
|
+
size === 'sm' ? 'text-sm' : 'text-base md:text-lg',
|
|
108
108
|
)}
|
|
109
109
|
>
|
|
110
110
|
{children}
|
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
AnchorHTMLAttributes,
|
|
5
|
-
ButtonHTMLAttributes,
|
|
6
|
-
Dispatch,
|
|
7
|
-
forwardRef,
|
|
8
|
-
ForwardRefRenderFunction,
|
|
9
|
-
ReactNode,
|
|
10
|
-
SetStateAction,
|
|
11
|
-
useState,
|
|
12
|
-
} from 'react';
|
|
13
|
-
import { twMerge } from 'tailwind-merge';
|
|
14
|
-
import { Icon } from '../../core/Icon';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Handler for click events, expected to manage active state toggling and possibly return a promise for async handling.
|
|
18
|
-
*/
|
|
19
|
-
type OnClickHandler = (
|
|
20
|
-
active: boolean,
|
|
21
|
-
) => void | boolean | Promise<void | boolean>;
|
|
22
|
-
|
|
23
|
-
type CommonProps = {
|
|
24
|
-
className?: string;
|
|
25
|
-
/**
|
|
26
|
-
* The initial 'active' state of the component when it mounts.
|
|
27
|
-
*
|
|
28
|
-
* ```tsx
|
|
29
|
-
* <FavoriteButton defaultActive={true} />
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
defaultActive?: boolean;
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* A React node or a function that returns a React node.
|
|
36
|
-
*
|
|
37
|
-
* ```tsx
|
|
38
|
-
* <FavoriteButton>
|
|
39
|
-
* <Icon name="eye-off" size="md" />
|
|
40
|
-
* </FavoriteButton>
|
|
41
|
-
* ```
|
|
42
|
-
*
|
|
43
|
-
* The function receives the current `active` state as a parameter,
|
|
44
|
-
* enabling the rendering of different content based on the state.
|
|
45
|
-
*
|
|
46
|
-
* ```tsx
|
|
47
|
-
* <FavoriteButton>
|
|
48
|
-
* {(active) => (
|
|
49
|
-
* <Icon name={active ? 'eye-off' : 'eye-empty'} size="md" />
|
|
50
|
-
* )}
|
|
51
|
-
* </FavoriteButton>
|
|
52
|
-
* ```
|
|
53
|
-
*
|
|
54
|
-
*/
|
|
55
|
-
children?: ReactNode | ((active: boolean) => ReactNode);
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
type PropsAsButton = CommonProps &
|
|
59
|
-
Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick' | 'children'> & {
|
|
60
|
-
as: 'button';
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Callback triggered when the component is clicked.
|
|
64
|
-
*
|
|
65
|
-
* The handler receives a boolean argument indicating the next 'active' state.
|
|
66
|
-
* - If the handler returns a boolean, the component's active state will be set to the returned value.
|
|
67
|
-
* - If a Promise is returned, the component will wait for the Promise to resolve and use the resolved boolean value to update the active state.
|
|
68
|
-
*
|
|
69
|
-
* ```tsx
|
|
70
|
-
* const handleClick = (nextActiveState: boolean) => {
|
|
71
|
-
* // Your handling logic here
|
|
72
|
-
* return !nextActiveState; // Or return a promise that resolves to a boolean
|
|
73
|
-
* };
|
|
74
|
-
*
|
|
75
|
-
* <FavoriteButton onClick={handleClick} />
|
|
76
|
-
* ```
|
|
77
|
-
*/
|
|
78
|
-
onClick?: OnClickHandler;
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
type PropsAsAnchor = CommonProps &
|
|
82
|
-
AnchorHTMLAttributes<HTMLAnchorElement> & {
|
|
83
|
-
as: 'a';
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
type Props = PropsAsButton | PropsAsAnchor;
|
|
87
|
-
|
|
88
|
-
const createClickHandler = (
|
|
89
|
-
active: boolean,
|
|
90
|
-
setPending: Dispatch<SetStateAction<boolean | undefined>>,
|
|
91
|
-
setActive: Dispatch<SetStateAction<boolean>>,
|
|
92
|
-
onClick: OnClickHandler | undefined,
|
|
93
|
-
) => {
|
|
94
|
-
return async () => {
|
|
95
|
-
if (!onClick) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
setPending(true);
|
|
100
|
-
|
|
101
|
-
const nextActive = !active;
|
|
102
|
-
|
|
103
|
-
setActive(nextActive);
|
|
104
|
-
|
|
105
|
-
const returnValue = await onClick(nextActive);
|
|
106
|
-
|
|
107
|
-
setPending(false);
|
|
108
|
-
|
|
109
|
-
if (typeof returnValue !== 'boolean') {
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
setActive(returnValue);
|
|
114
|
-
};
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
const renderDefaultIcon = (active: boolean) => {
|
|
118
|
-
if (active) {
|
|
119
|
-
return (
|
|
120
|
-
<Icon
|
|
121
|
-
name="heart-filled"
|
|
122
|
-
size="md"
|
|
123
|
-
className="fill-surface-primary-100 text-marine-high-emphasis"
|
|
124
|
-
/>
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
return (
|
|
129
|
-
<>
|
|
130
|
-
<Icon name="heart" size="md" className="sm:group-hover:hidden" />
|
|
131
|
-
<Icon
|
|
132
|
-
name="heart-filled"
|
|
133
|
-
size="md"
|
|
134
|
-
className="hidden sm:group-hover:block sm:group-hover:fill-surface-secondary-100"
|
|
135
|
-
/>
|
|
136
|
-
</>
|
|
137
|
-
);
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
const renderChildren = (
|
|
141
|
-
active: boolean,
|
|
142
|
-
children: Props['children'],
|
|
143
|
-
): ReactNode => {
|
|
144
|
-
if (typeof children === 'undefined') {
|
|
145
|
-
return renderDefaultIcon(active);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (typeof children === 'function') {
|
|
149
|
-
return children(active);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
return children;
|
|
153
|
-
};
|
|
154
|
-
|
|
155
|
-
const FavoriteButtonRenderFunction: ForwardRefRenderFunction<
|
|
156
|
-
HTMLButtonElement | HTMLAnchorElement,
|
|
157
|
-
Props
|
|
158
|
-
> = (props, ref?) => {
|
|
159
|
-
const {
|
|
160
|
-
className,
|
|
161
|
-
as = 'button',
|
|
162
|
-
defaultActive = false,
|
|
163
|
-
onClick,
|
|
164
|
-
children,
|
|
165
|
-
...rest
|
|
166
|
-
} = props;
|
|
167
|
-
|
|
168
|
-
const [active, setActive] = useState(defaultActive);
|
|
169
|
-
const [pending, setPending] = useState<boolean>();
|
|
170
|
-
|
|
171
|
-
const handleClick =
|
|
172
|
-
as === 'a'
|
|
173
|
-
? onClick
|
|
174
|
-
: createClickHandler(
|
|
175
|
-
active,
|
|
176
|
-
setPending,
|
|
177
|
-
setActive,
|
|
178
|
-
onClick as OnClickHandler | undefined,
|
|
179
|
-
);
|
|
180
|
-
|
|
181
|
-
const shouldAnimate = typeof pending !== 'undefined' && as !== 'a';
|
|
182
|
-
const shouldTransition = as !== 'a';
|
|
183
|
-
|
|
184
|
-
const elementClassList = [
|
|
185
|
-
'group inline-flex p-2.5 appearance-none rounded-full',
|
|
186
|
-
'focus:outline-none focus-visible:shadow-focus-state active:bg-surface-primary-40 disabled:pointer-events-none',
|
|
187
|
-
active
|
|
188
|
-
? 'bg-surface-primary-80 text-marine-high-emphasis'
|
|
189
|
-
: 'text-marine-high-emphasis sm:hover:bg-surface-secondary-7 sm:hover:text-marine-high-emphasis',
|
|
190
|
-
];
|
|
191
|
-
|
|
192
|
-
const iconWrapperClassList = [
|
|
193
|
-
shouldTransition && 'group-active:transition-transform',
|
|
194
|
-
shouldAnimate ? 'animate-[favorite-pulse_600ms_ease-in-out]' : '',
|
|
195
|
-
shouldTransition && !active
|
|
196
|
-
? 'group-active:scale-[0.66] group-active:animate-none'
|
|
197
|
-
: '',
|
|
198
|
-
];
|
|
199
|
-
|
|
200
|
-
const Element = as;
|
|
201
|
-
|
|
202
|
-
return (
|
|
203
|
-
<Element
|
|
204
|
-
className={twMerge(elementClassList.join(' '), className)}
|
|
205
|
-
onClick={handleClick}
|
|
206
|
-
disabled={pending}
|
|
207
|
-
ref={ref}
|
|
208
|
-
{...(rest as any)}
|
|
209
|
-
>
|
|
210
|
-
<div className={iconWrapperClassList.join(' ')}>
|
|
211
|
-
{renderChildren(active, children)}
|
|
212
|
-
</div>
|
|
213
|
-
</Element>
|
|
214
|
-
);
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* `FavoriteButton` is a component, for creating interactive buttons, offering various customization options to fit into different use cases such as liking or favoriting items.
|
|
219
|
-
*
|
|
220
|
-
* ```tsx
|
|
221
|
-
* const handleClick = (active) => alert(active ? 'Liked' : 'Unliked');
|
|
222
|
-
* <FavoriteButton onClick={handleClick} />
|
|
223
|
-
* ```
|
|
224
|
-
*
|
|
225
|
-
* With the above code, a `FavoriteButton` is rendered using default icons, and it logs the new active state upon being clicked.
|
|
226
|
-
*
|
|
227
|
-
* ## Available Props
|
|
228
|
-
*
|
|
229
|
-
* | Name | Type | Description |
|
|
230
|
-
* |---|---|--------|
|
|
231
|
-
* | `defaultActive`| `boolean` | Sets the initial active state of the component. |
|
|
232
|
-
* | `onClick` | `OnClickHandler` | Handles click events and state transitions. |
|
|
233
|
-
* | `as` | `"button"` \| `"a"` | Determines the HTML element type. |
|
|
234
|
-
* | `children` | `ReactNode` \| (active: boolean) => ReactNode | Supply your custom icon using children. |
|
|
235
|
-
* | ...rest | | Extra props which are forwarded to the element. |
|
|
236
|
-
*
|
|
237
|
-
* ## Icon Management
|
|
238
|
-
*
|
|
239
|
-
* Iconography within the `FavoriteButton` component is managed dynamically by adopting a strategy that employs render props. This allows you to have absolute control over how icons should appear across distinct states.
|
|
240
|
-
*
|
|
241
|
-
* ### Simple Custom Icon Rendering
|
|
242
|
-
*
|
|
243
|
-
* For simple use cases just provide an icon as the child of the favorite button.
|
|
244
|
-
*
|
|
245
|
-
* ```tsx
|
|
246
|
-
* <FavoriteButton>
|
|
247
|
-
* <Icon name="eye-empty" size="md" />
|
|
248
|
-
* </FavoriteButton>
|
|
249
|
-
* ```
|
|
250
|
-
*
|
|
251
|
-
* ### Advanced Icon Handling and Styling with Render Props
|
|
252
|
-
*
|
|
253
|
-
* Utilize render props for straightforward and effective control over icon presentation and styling across different component states. By employing a function that takes the active state as an argument, you can precisely define icons and apply styles for both the active and inactive states dynamically. The active parameter allows for conditional rendering of icons and the application of styles as per requirements:
|
|
254
|
-
*
|
|
255
|
-
* ```tsx
|
|
256
|
-
* // Icon based on state
|
|
257
|
-
*
|
|
258
|
-
* <FavoriteButton>
|
|
259
|
-
* {active => <Icon name={active ? 'eye-off' : 'eye-empty'} size="md" />}
|
|
260
|
-
* </FavoriteButton>
|
|
261
|
-
*
|
|
262
|
-
* In the presented code snippet, the `FavoriteButton` renders a colored and filled airplane icon when in an active state. On the other hand, during an inactive state, it depicts the same airplane icon, modifying its color upon hover.
|
|
263
|
-
*
|
|
264
|
-
* Using render props in such a manner awards you a significant level of control over the management of icons and their respective styles, fostering subtle visual feedback in response to user interactions with the `FavoriteButton` component. This approach is particularly beneficial in situations that demand comprehensive customization and dynamic styling predicated upon component states, ensuring that your UI remains both dynamic and visually consistent.
|
|
265
|
-
*
|
|
266
|
-
* ## Handling Click Events with `onClick`
|
|
267
|
-
*
|
|
268
|
-
* Manage click events and synchronize the component’s active state with potential asynchronous actions like API calls via `onClick`:
|
|
269
|
-
*
|
|
270
|
-
* ```tsx
|
|
271
|
-
* const handleClick = async (active) => {
|
|
272
|
-
* const serverResponse = await someAsyncAction();
|
|
273
|
-
* return serverResponse.liked;
|
|
274
|
-
* };
|
|
275
|
-
*
|
|
276
|
-
* <FavoriteButton onClick={handleClick} />
|
|
277
|
-
* ```
|
|
278
|
-
*
|
|
279
|
-
* Here, upon a user click, the component instantaneously toggles its state. Then, `someAsyncAction` communicates with a server and once the response is returned from the handler, the component ensures to align and represent this new state in the UI.
|
|
280
|
-
*
|
|
281
|
-
* ## Rendering as Anchor
|
|
282
|
-
*
|
|
283
|
-
* Using `FavoriteButton` as an anchor (`a`) element is straightforward:
|
|
284
|
-
*
|
|
285
|
-
* ```tsx
|
|
286
|
-
* <FavoriteButton as="a" href="#" />
|
|
287
|
-
* ```
|
|
288
|
-
*
|
|
289
|
-
* However, it's pivotal to note that when `FavoriteButton` is rendered as an anchor element (`as="a"`), it operates purely as a navigational link, devoid of internal state management or animations associated with state changes. It exists simply as a stylized link, diverting users to specified URLs without toggling between states or triggering animations on click events.
|
|
290
|
-
*/
|
|
291
|
-
export const FavoriteButton = forwardRef<
|
|
292
|
-
HTMLButtonElement | HTMLAnchorElement,
|
|
293
|
-
Props
|
|
294
|
-
>(FavoriteButtonRenderFunction) as typeof FavoriteButtonRenderFunction;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './FavoriteButton';
|