@bannerstudio/svelte 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +33 -0
- package/src/BannerStudioEmbed.svelte +53 -0
- package/src/BannerStudioEmbed.svelte.d.ts +21 -0
- package/src/index.d.ts +2 -0
- package/src/index.js +1 -0
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bannerstudio/svelte",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Svelte component for embedding Banner Studio banners.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"files": [
|
|
9
|
+
"src"
|
|
10
|
+
],
|
|
11
|
+
"svelte": "./src/index.js",
|
|
12
|
+
"types": "./src/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./src/index.d.ts",
|
|
16
|
+
"svelte": "./src/index.js",
|
|
17
|
+
"default": "./src/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./BannerStudioEmbed.svelte": {
|
|
20
|
+
"types": "./src/BannerStudioEmbed.svelte.d.ts",
|
|
21
|
+
"svelte": "./src/BannerStudioEmbed.svelte"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@bannerstudio/core": "^0.1.0"
|
|
26
|
+
},
|
|
27
|
+
"peerDependencies": {
|
|
28
|
+
"svelte": ">=4.0.0"
|
|
29
|
+
},
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { onMount } from 'svelte'
|
|
3
|
+
import { buildEmbedUrl, attachBannerMessages } from '@bannerstudio/core'
|
|
4
|
+
|
|
5
|
+
/** Banner Studio API base, e.g. https://api.bannerstud.io */
|
|
6
|
+
export let apiBase
|
|
7
|
+
/** Affiliate code. */
|
|
8
|
+
export let affiliate
|
|
9
|
+
/** Embed type (default 'top'). */
|
|
10
|
+
export let type = 'top'
|
|
11
|
+
/** Optional placement code. */
|
|
12
|
+
export let placement = ''
|
|
13
|
+
/** Optional audience segment for the current visitor (e.g. 'guest', 'pro'). */
|
|
14
|
+
export let segment = ''
|
|
15
|
+
/** Reserved height in px — the bounding box that prevents CLS (default 90). */
|
|
16
|
+
export let height = 90
|
|
17
|
+
/**
|
|
18
|
+
* Optional server-fetched meta (`fetchBannerMeta`). When provided, the box is
|
|
19
|
+
* reserved only if `active` (zero CLS, no gap when empty). When omitted, the
|
|
20
|
+
* component always renders and reserves `height` (client mode).
|
|
21
|
+
*/
|
|
22
|
+
export let meta = undefined
|
|
23
|
+
|
|
24
|
+
let iframeEl
|
|
25
|
+
let currentHeight = meta?.height ?? height
|
|
26
|
+
let closed = false
|
|
27
|
+
|
|
28
|
+
$: src = buildEmbedUrl({ apiBase, affiliate, type, placement: placement || undefined, segment: segment || undefined })
|
|
29
|
+
$: active = meta === undefined || meta?.active === true
|
|
30
|
+
|
|
31
|
+
onMount(() => {
|
|
32
|
+
if (!iframeEl) return
|
|
33
|
+
return attachBannerMessages(iframeEl, {
|
|
34
|
+
onHeight: (h) => { currentHeight = h > 0 ? h : 0 },
|
|
35
|
+
onEmpty: () => { currentHeight = 0 },
|
|
36
|
+
onClose: () => { closed = true },
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
{#if !closed && active}
|
|
42
|
+
<div style="height:{currentHeight}px;overflow:hidden">
|
|
43
|
+
<iframe
|
|
44
|
+
bind:this={iframeEl}
|
|
45
|
+
{src}
|
|
46
|
+
title="Banner"
|
|
47
|
+
scrolling="no"
|
|
48
|
+
frameborder="0"
|
|
49
|
+
allowtransparency="true"
|
|
50
|
+
style="width:100%;height:100%;border:0;display:block"
|
|
51
|
+
></iframe>
|
|
52
|
+
</div>
|
|
53
|
+
{/if}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { SvelteComponent } from 'svelte'
|
|
2
|
+
import type { BannerType, BannerMeta } from '@bannerstudio/core'
|
|
3
|
+
|
|
4
|
+
export interface BannerStudioEmbedProps {
|
|
5
|
+
/** Banner Studio API base, e.g. https://api.bannerstud.io */
|
|
6
|
+
apiBase: string
|
|
7
|
+
/** Affiliate code. */
|
|
8
|
+
affiliate: string
|
|
9
|
+
/** Embed type (default 'top'). */
|
|
10
|
+
type?: BannerType
|
|
11
|
+
/** Optional placement code. */
|
|
12
|
+
placement?: string
|
|
13
|
+
/** Optional audience segment for the current visitor (e.g. 'guest', 'pro'). */
|
|
14
|
+
segment?: string
|
|
15
|
+
/** Reserved height in px — the bounding box that prevents CLS (default 90). */
|
|
16
|
+
height?: number
|
|
17
|
+
/** Optional server-fetched meta (`fetchBannerMeta`) to gate rendering. */
|
|
18
|
+
meta?: BannerMeta | null
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export default class BannerStudioEmbed extends SvelteComponent<BannerStudioEmbedProps> {}
|
package/src/index.d.ts
ADDED
package/src/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as BannerStudioEmbed } from './BannerStudioEmbed.svelte'
|