Rocket QR Code Example
1import { rocket } from 'datastar'
2
3const qrCreator = (
4 await import('https://cdn.jsdelivr.net/npm/[email protected]/+esm')
5).default
6
7const isHex = (value) => /^#[\da-f]{6}$/i.test(String(value ?? ''))
8const getErrorText = ({ text, size, colorDark, colorLight }) =>
9 [
10 !text && 'Text is required',
11 (size < 50 || size > 1000) && 'Size must be 50-1000px',
12 (!isHex(colorDark) || !isHex(colorLight)) &&
13 'Colors must be valid hex codes',
14 ]
15 .filter(Boolean)
16 .join(', ')
17
18rocket('qr-code', {
19 props: ({ string, number, oneOf }) => ({
20 text: string.trim.default('Hello World'),
21 size: number.clamp(50, 1000).default(200),
22 errorLevel: oneOf('L', 'M', 'Q', 'H').default('L'),
23 colorDark: string.trim.upper.prefix('#').maxLength(7).default('#000000'),
24 colorLight: string.trim.upper.prefix('#').maxLength(7).default('#FFFFFF'),
25 }),
26 onFirstRender({ refs, observeProps, props }) {
27 const renderQR = () => {
28 if (!(refs.canvas instanceof HTMLCanvasElement) || getErrorText(props))
29 return
30 qrCreator.render(
31 {
32 text: props.text,
33 radius: 0,
34 ecLevel: props.errorLevel,
35 fill: props.colorDark,
36 background: props.colorLight,
37 size: props.size,
38 },
39 refs.canvas,
40 )
41 }
42
43 renderQR()
44 observeProps(renderQR)
45 },
46 render: ({ html, props: { text, size, colorDark, colorLight } }) => html`
47 <style>
48 :host {
49 display: inline-flex;
50 width: ${size}px;
51 height: ${size}px;
52 align-items: center;
53 justify-content: center;
54 position: relative;
55 }
56
57 canvas {
58 display: block;
59 }
60
61 .qr-error {
62 font-weight: bold;
63 text-align: center;
64 }
65 </style>
66
67 ${
68 getErrorText({ text, size, colorDark, colorLight })
69 ? html`<div class="qr-error">${getErrorText({ text, size, colorDark, colorLight })}</div>`
70 : html`<canvas data-ref:canvas data-ignore-morph></canvas>`
71
72}
73 `,
74})