3.0.1 • Published 25 days ago

@rodneylab/sveltekit-components v3.0.1

Weekly downloads
-
License
BSD-3-Clause
Repository
github
Last release
25 days ago

sveltekit-components

Open in StackBlitz

Library of TypeScript friendly SvelteKit components for adding functionality to your SvelteKit apps.

Setup

To install the package run

pnpm add -D @rodneylab/sveltekit-components @rodneylab/sveltekit-map-component
pnpm add --save-peer leaflet

Components

Form Fields

Add accessible text, email and password inputs to your SvelteKit site forms. See full SvelteKit form examples or get started with extracts below:

<script lang="ts">
	import {
		EmailInputField,
		PasswordInputField,
		TextArea,
		TextInputField,
	} from '@rodneylab/sveltekit-components';
</script>

<form on:submit|preventDefault={handleSubmit}>
	<TextInputField
		value={name}
		id="form-name"
		placeholder="Blake Jones"
		title="Name"
		error={errors?.name ?? null}
		on:update={(event) => {
			name = event.detail;
		}}
		style="padding-bottom:1rem"
	/>
	<EmailInputField
		value={email}
		id="form-email"
		placeholder="blake@example.com"
		title="Email"
		error={errors?.email ?? null}
		on:update={(event) => {
			email = event.detail;
		}}
		style="padding-bottom:1rem"
	/>
	<TextArea
		value={message}
		id="form-message"
		placeholder="Enter your message here"
		title="Message"
		error={errors?.message ?? null}
		on:update={(event) => {
			message = event.detail;
		}}
		style="padding-bottom:1rem"
	/>
	<button type="submit" disabled={submitting}>Submit form</button>
</form>

<form on:submit|preventDefault={handleSubmit}>
	<EmailInputField
		value={email}
		id="login-email"
		placeholder="blake@example.com"
		title="Email"
		error={errors?.email ?? null}
		on:update={(event) => {
			email = event.detail;
		}}
		style="padding-bottom:1rem"
	/>
	<PasswordInputField
		value={password}
		id="login-password"
		placeholder="P@$sw0rD"
		title="Password"
		error={errors?.password ?? null}
		on:update={(event) => {
			password = event.detail;
		}}
		style="padding-bottom:1rem;border-style:none"
	/>
	<button type="submit" disabled={submitting}>Submit form</button>
</form>

Image

Responsive image component with lazy loading support. Requires the vanilla-lazyload package for lazy loading and vite-imagetools for responsive image support:

pnpm install -D vanilla-lazyload vite-imagetools

You will also need to update svelte.config.js configuration to use vite-imagetools:

/** @type {import('@sveltejs/kit').Config} */
import { imagetools } from 'vite-imagetools';
...

const config = {
  kit: {
    // hydrate the <div id="svelte"> element in src/app.html
    target: '#svelte',
    vite: {
      plugins: [imagetools()],
    },
  },
};

export default config;

For lazyloading, load the vanilla-lazyload script into the document in a layout component (e.g. src/routes/__layout.svelte):

  import lazyload from 'vanilla-lazyload';
  import { browser } from '$app/environment';

  if (browser && !document.lazyloadInstance) {
    document.lazyloadInstance = new lazyload();
  }

Then use the Image component on a page:

<script>
	import { onMount } from 'svelte';
	import { browser } from '$app/environment';
	import { Image } from '@rodneylab/sveltekit-components';

	import meta from '$lib/assets/your-image.jpg?w=768&metadata';
	import srcsetJpeg from '$lib/assets/your-image.jpg?w=1536;1280;768;640&jpeg&srcset';
	import srcsetWebp from '$lib/assets/your-image.jpg?w=1536;1280;768;640&webp&srcset';

	export let imageData;

	onMount(() => {
		if (browser) {
			document.lazyloadInstance.update();
		}
	});

	const { width, height, src } = meta;
	const sources = [
		{ srcset: srcsetWebp, type: 'image/webp' },
		{ srcset: srcsetJpeg, type: 'image/jpeg' },
	];

	const sizes = '(max-width: 672px) calc(100vw - 32px), 672px';
</script>

<Image {alt} {width} {height} {src} {sources} {placeholder} {sizes} style={'border-radius:12px'} />

The code in onMount only needs to be called once for each page, so if, for example, you have component A, B and C all containing an image and included in page Z, add the onMount code only to page Z and add the Image component (without onMount code) to A.svelte, B.svelte and C.svelte.

If you want to load the image eagerly use the loading prop to specify this:

<Image {alt} {width} loading="eager" {height} {src} {sources} {placeholder} {sizes} />

Best practise is to load the largest contentful paint above the fold eagerly. Typically this means eager loading for banner images.

Props

See article on SvelteKit images which provides much more background on what these props are and how you might update them.

Map

Add a map to your SvelteKit site using Mapbox with OpenStreetMap and LeafletJS. Requires a Mapbox access token, just add it your to the .env file in your project:

PUBLIC_MAPBOX_ACCESS_TOKEN=your.token

Add the component to a .svelte file in your project:

<script>
	import { Map } from '@rodneylab/sveltekit-map-component';
	const latitude = 51.50162;
	const longitude = -0.14115;
	const zoom = 16;
	const location = { latitude, longitude };
</script>

<Map
	id="my-map"
	{location}
	{zoom}
	importance="high"
	markerMarkup="<p>We are <strong>here</strong>!</p>"
/>

Further Info

To create your own SvelteKit component library see the video on creating a SvelteKit component library. Drop a comment on that page if you have a question.

Feel free to jump into the Rodney Lab matrix chat room.

3.0.1

25 days ago

3.0.0

11 months ago

2.0.2

1 year ago

2.0.1

1 year ago

1.0.3

1 year ago

2.0.0

1 year ago

1.0.2

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago

0.2.16

2 years ago

0.2.14

2 years ago

0.2.13

2 years ago

0.2.12

2 years ago

0.2.11

2 years ago

0.2.10

2 years ago

0.2.7

2 years ago

0.2.6

2 years ago

0.2.9

2 years ago

0.2.8

2 years ago

0.2.5

2 years ago

0.2.1

3 years ago

0.2.0

3 years ago

0.2.3

3 years ago

0.2.2

3 years ago

0.2.4

3 years ago

0.1.0

3 years ago

0.1.2

3 years ago

0.1.1

3 years ago

0.1.3

3 years ago

0.0.7

3 years ago

0.0.6

3 years ago

0.0.5

3 years ago

0.0.4

3 years ago

0.0.3

3 years ago

0.0.1

3 years ago