|
1 | 1 | <script> |
2 | | - import { createEventDispatcher, onMount, onDestroy } from 'svelte'; |
| 2 | + import { onMount, onDestroy } from 'svelte'; |
3 | 3 | import { colorClasses } from '../shared/mixins.js'; |
4 | | - import { classNames, plainText, createEmitter } from '../shared/utils.js'; |
5 | | - import { restProps } from '../shared/rest-props.js'; |
| 4 | + import { classNames, plainText } from '../shared/utils.js'; |
6 | 5 | import { app, f7ready } from '../shared/f7.js'; |
7 | 6 |
|
8 | 7 | import CardHeader from './card-header.svelte'; |
9 | 8 | import CardContent from './card-content.svelte'; |
10 | 9 | import CardFooter from './card-footer.svelte'; |
11 | 10 |
|
12 | | - const emit = createEmitter(createEventDispatcher, $$props); |
13 | | -
|
14 | | - let className = undefined; |
15 | | - export { className as class }; |
16 | | -
|
17 | | - export let title = undefined; |
18 | | - export let content = undefined; |
19 | | - export let footer = undefined; |
20 | | - export let raised = false; |
21 | | - export let outline = false; |
22 | | - export let outlineIos = false; |
23 | | - export let outlineMd = false; |
24 | | - export let headerDivider = false; |
25 | | - export let footerDivider = false; |
26 | | - export let expandable = false; |
27 | | - export let expandableAnimateWidth = false; |
28 | | - export let expandableOpened = false; |
29 | | - export let animate = undefined; |
30 | | - export let hideNavbarOnOpen = undefined; |
31 | | - export let hideToolbarOnOpen = undefined; |
32 | | - export let hideStatusbarOnOpen = undefined; |
33 | | - export let scrollableEl = undefined; |
34 | | - export let swipeToClose = undefined; |
35 | | - export let closeByBackdropClick = undefined; |
36 | | - export let backdrop = undefined; |
37 | | - export let backdropEl = undefined; |
38 | | - export let padding = true; |
| 11 | + let { |
| 12 | + class: className, |
| 13 | + title = undefined, |
| 14 | + raised = false, |
| 15 | + outline = false, |
| 16 | + outlineIos = false, |
| 17 | + outlineMd = false, |
| 18 | + headerDivider = false, |
| 19 | + footerDivider = false, |
| 20 | + expandable = false, |
| 21 | + expandableAnimateWidth = false, |
| 22 | + expandableOpened = false, |
| 23 | + animate = undefined, |
| 24 | + hideNavbarOnOpen = undefined, |
| 25 | + hideToolbarOnOpen = undefined, |
| 26 | + hideStatusbarOnOpen = undefined, |
| 27 | + scrollableEl = undefined, |
| 28 | + swipeToClose = undefined, |
| 29 | + closeByBackdropClick = undefined, |
| 30 | + backdrop = undefined, |
| 31 | + backdropEl = undefined, |
| 32 | + padding = true, |
| 33 | + children, |
| 34 | + header, |
| 35 | + content, |
| 36 | + footer, |
| 37 | + ...restProps |
| 38 | + } = $props(); |
| 39 | +
|
| 40 | +
|
| 41 | +
|
| 42 | +
|
39 | 43 |
|
40 | 44 | let el; |
41 | 45 |
|
42 | | - $: classes = classNames( |
| 46 | + const classes = $derived(classNames( |
43 | 47 | className, |
44 | 48 | 'card', |
45 | 49 | { |
|
52 | 56 | 'card-expandable': expandable, |
53 | 57 | 'card-expandable-animate-width': expandableAnimateWidth, |
54 | 58 | }, |
55 | | - colorClasses($$props), |
56 | | - ); |
57 | | -
|
58 | | - /* eslint-disable no-undef */ |
59 | | - $: hasHeaderSlots = $$slots.header; |
60 | | - $: hasContentSlots = $$slots.content; |
61 | | - $: hasFooterSlots = $$slots.footer; |
62 | | - /* eslint-enable no-undef */ |
| 59 | + colorClasses(restProps), |
| 60 | + )); |
63 | 61 |
|
64 | 62 | function open() { |
65 | 63 | app.f7.card.open(el); |
|
82 | 80 | } |
83 | 81 | } |
84 | 82 |
|
85 | | - $: watchOpened(expandableOpened); |
| 83 | + $effect(() => watchOpened(expandableOpened)); |
86 | 84 |
|
87 | 85 | function onBeforeOpen(cardEl, prevent) { |
88 | 86 | if (cardEl !== el) return; |
89 | | - emit('cardBeforeOpen', [el, prevent]); |
| 87 | + restProps.cardBeforeOpen?.(el, prevent); |
90 | 88 | } |
91 | 89 | function onOpen(cardEl) { |
92 | 90 | if (cardEl !== el) return; |
93 | | - emit('cardOpen', [el]); |
| 91 | + restProps.cardOpen?.(el); |
94 | 92 | expandableOpened = true; |
95 | 93 | } |
96 | 94 | function onOpened(cardEl, pageEl) { |
97 | 95 | if (cardEl !== el) return; |
98 | | - emit('cardOpened', [el, pageEl]); |
| 96 | + restProps.cardOpened?.(el, pageEl); |
99 | 97 | } |
100 | 98 | function onClose(cardEl) { |
101 | 99 | if (cardEl !== el) return; |
102 | | - emit('cardClose', [el]); |
| 100 | + restProps.cardClose?.(el); |
103 | 101 | } |
104 | 102 | function onClosed(cardEl, pageEl) { |
105 | 103 | if (cardEl !== el) return; |
106 | | - emit('cardClosed', [el, pageEl]); |
| 104 | + restProps.cardClosed?.(el, pageEl); |
107 | 105 | expandableOpened = false; |
108 | 106 | } |
109 | 107 |
|
|
152 | 150 | : closeByBackdropClick.toString()} |
153 | 151 | data-backdrop={typeof backdrop === 'undefined' ? backdrop : backdrop.toString()} |
154 | 152 | data-backdrop-el={backdropEl} |
155 | | - {...restProps($$restProps)} |
| 153 | + {...restProps} |
156 | 154 | > |
157 | | - {#if typeof title !== 'undefined' || hasHeaderSlots} |
| 155 | + {#if typeof title !== 'undefined' || typeof header !== 'undefined'} |
158 | 156 | <CardHeader> |
159 | 157 | {plainText(title)} |
160 | | - <slot name="header" /> |
| 158 | + {#if typeof header === 'function'} |
| 159 | + {@render header?.()} |
| 160 | + {:else if (typeof header !== 'undefined')} |
| 161 | + {header} |
| 162 | + {/if} |
161 | 163 | </CardHeader> |
162 | 164 | {/if} |
163 | | - {#if typeof content !== 'undefined' || hasContentSlots} |
| 165 | + {#if typeof content !== 'undefined' || typeof content !== 'undefined'} |
164 | 166 | <CardContent {padding}> |
165 | | - {plainText(content)} |
166 | | - <slot name="content" /> |
| 167 | + {#if typeof content === 'function'} |
| 168 | + {@render content?.()} |
| 169 | + {:else if (typeof content !== 'undefined')} |
| 170 | + {content} |
| 171 | + {/if} |
167 | 172 | </CardContent> |
168 | 173 | {/if} |
169 | | - {#if typeof footer !== 'undefined' || hasFooterSlots} |
| 174 | + {#if typeof footer !== 'undefined' || typeof footer !== 'undefined'} |
170 | 175 | <CardFooter> |
171 | | - {plainText(footer)} |
172 | | - <slot name="footer" /> |
| 176 | + {#if typeof footer === 'function'} |
| 177 | + {@render footer?.()} |
| 178 | + {:else if (typeof footer !== 'undefined')} |
| 179 | + {footer} |
| 180 | + {/if} |
173 | 181 | </CardFooter> |
174 | 182 | {/if} |
175 | | - <slot /> |
| 183 | + {@render children?.()} |
176 | 184 | </div> |
0 commit comments