@alegendstale/holly-components 1.4.0 → 2.0.2
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/README.md +9 -5
- package/dist/components/absolute-container/absolute-container.d.ts +17 -3
- package/dist/components/absolute-container/absolute-container.d.ts.map +1 -1
- package/dist/components/absolute-container/absolute-container.js +22 -25
- package/dist/components/absolute-container/absolute-container.stories.d.ts +3 -1
- package/dist/components/absolute-container/absolute-container.stories.d.ts.map +1 -1
- package/dist/components/absolute-container/absolute-container.stories.js +35 -7
- package/dist/components/absolute-container/absolute-container.styles.d.ts +3 -0
- package/dist/components/absolute-container/absolute-container.styles.d.ts.map +1 -0
- package/dist/components/absolute-container/absolute-container.styles.js +18 -0
- package/dist/components/bottom-sheet/bottom-sheet.d.ts +25 -0
- package/dist/components/bottom-sheet/bottom-sheet.d.ts.map +1 -1
- package/dist/components/bottom-sheet/bottom-sheet.js +29 -127
- package/dist/components/bottom-sheet/bottom-sheet.stories.d.ts +5 -2
- package/dist/components/bottom-sheet/bottom-sheet.stories.d.ts.map +1 -1
- package/dist/components/bottom-sheet/bottom-sheet.stories.js +31 -7
- package/dist/components/bottom-sheet/bottom-sheet.styles.d.ts +3 -0
- package/dist/components/bottom-sheet/bottom-sheet.styles.d.ts.map +1 -0
- package/dist/components/bottom-sheet/bottom-sheet.styles.js +115 -0
- package/dist/components/canvas/canvas-base.d.ts +8 -1
- package/dist/components/canvas/canvas-base.d.ts.map +1 -1
- package/dist/components/canvas/canvas-base.js +14 -11
- package/dist/components/canvas/canvas-base.stories.d.ts +7 -0
- package/dist/components/canvas/canvas-base.stories.d.ts.map +1 -0
- package/dist/components/canvas/canvas-base.stories.js +24 -0
- package/dist/components/canvas/canvas-gradient.d.ts +10 -3
- package/dist/components/canvas/canvas-gradient.d.ts.map +1 -1
- package/dist/components/canvas/canvas-gradient.js +13 -9
- package/dist/components/canvas/canvas-gradient.stories.d.ts +14 -0
- package/dist/components/canvas/canvas-gradient.stories.d.ts.map +1 -0
- package/dist/components/canvas/canvas-gradient.stories.js +46 -0
- package/dist/components/canvas/canvas-image.d.ts +25 -16
- package/dist/components/canvas/canvas-image.d.ts.map +1 -1
- package/dist/components/canvas/canvas-image.js +84 -72
- package/dist/components/canvas/canvas-image.stories.d.ts +13 -0
- package/dist/components/canvas/canvas-image.stories.d.ts.map +1 -0
- package/dist/components/canvas/canvas-image.stories.js +49 -0
- package/dist/components/canvas/canvas-image.styles.d.ts +3 -0
- package/dist/components/canvas/canvas-image.styles.d.ts.map +1 -0
- package/dist/components/canvas/canvas-image.styles.js +21 -0
- package/dist/components/carousel-scroller/carousel-scroller.d.ts +23 -6
- package/dist/components/carousel-scroller/carousel-scroller.d.ts.map +1 -1
- package/dist/components/carousel-scroller/carousel-scroller.js +32 -80
- package/dist/components/carousel-scroller/carousel-scroller.stories.d.ts +4 -2
- package/dist/components/carousel-scroller/carousel-scroller.stories.d.ts.map +1 -1
- package/dist/components/carousel-scroller/carousel-scroller.stories.js +22 -6
- package/dist/components/carousel-scroller/carousel-scroller.styles.d.ts +3 -0
- package/dist/components/carousel-scroller/carousel-scroller.styles.d.ts.map +1 -0
- package/dist/components/carousel-scroller/carousel-scroller.styles.js +66 -0
- package/dist/components/color-palette/color-palette-utils.d.ts.map +1 -1
- package/dist/components/color-palette/color-palette.d.ts +53 -16
- package/dist/components/color-palette/color-palette.d.ts.map +1 -1
- package/dist/components/color-palette/color-palette.js +72 -126
- package/dist/components/color-palette/color-palette.styles.d.ts +3 -0
- package/dist/components/color-palette/color-palette.styles.d.ts.map +1 -0
- package/dist/components/color-palette/color-palette.styles.js +90 -0
- package/dist/components/color-palette/component/color-palette-component.d.ts +16 -2
- package/dist/components/color-palette/component/color-palette-component.d.ts.map +1 -1
- package/dist/components/color-palette/component/color-palette-component.js +18 -19
- package/dist/components/color-palette/component/color-palette-component.stories.d.ts +4 -2
- package/dist/components/color-palette/component/color-palette-component.stories.d.ts.map +1 -1
- package/dist/components/color-palette/component/color-palette-component.stories.js +34 -36
- package/dist/components/color-palette/component/color-palette-component.styles.d.ts +3 -0
- package/dist/components/color-palette/component/color-palette-component.styles.d.ts.map +1 -0
- package/dist/components/color-palette/component/color-palette-component.styles.js +10 -0
- package/dist/components/color-palette/editor/color-palette-editor.d.ts +28 -14
- package/dist/components/color-palette/editor/color-palette-editor.d.ts.map +1 -1
- package/dist/components/color-palette/editor/color-palette-editor.js +30 -216
- package/dist/components/color-palette/editor/color-palette-editor.stories.d.ts +9 -2
- package/dist/components/color-palette/editor/color-palette-editor.stories.d.ts.map +1 -1
- package/dist/components/color-palette/editor/color-palette-editor.stories.js +32 -4
- package/dist/components/color-palette/editor/color-palette-editor.styles.d.ts +3 -0
- package/dist/components/color-palette/editor/color-palette-editor.styles.d.ts.map +1 -0
- package/dist/components/color-palette/editor/color-palette-editor.styles.js +147 -0
- package/dist/components/color-palette/editor/settings-item.d.ts +20 -0
- package/dist/components/color-palette/editor/settings-item.d.ts.map +1 -0
- package/dist/components/color-palette/editor/settings-item.js +43 -0
- package/dist/components/color-palette/editor/settings-item.styles.d.ts +3 -0
- package/dist/components/color-palette/editor/settings-item.styles.d.ts.map +1 -0
- package/dist/components/color-palette/editor/settings-item.styles.js +34 -0
- package/dist/components/color-palette/item/color-palette-item-edit.d.ts +9 -2
- package/dist/components/color-palette/item/color-palette-item-edit.d.ts.map +1 -1
- package/dist/components/color-palette/item/color-palette-item-edit.js +12 -57
- package/dist/components/color-palette/item/color-palette-item-edit.styles.d.ts +3 -0
- package/dist/components/color-palette/item/color-palette-item-edit.styles.d.ts.map +1 -0
- package/dist/components/color-palette/item/color-palette-item-edit.styles.js +51 -0
- package/dist/components/color-palette/item/color-palette-item.d.ts +21 -2
- package/dist/components/color-palette/item/color-palette-item.d.ts.map +1 -1
- package/dist/components/color-palette/item/color-palette-item.js +23 -89
- package/dist/components/color-palette/item/color-palette-item.styles.d.ts +3 -0
- package/dist/components/color-palette/item/color-palette-item.styles.d.ts.map +1 -0
- package/dist/components/color-palette/item/color-palette-item.styles.js +83 -0
- package/dist/components/color-palette/menu/color-palette-menu.d.ts +15 -3
- package/dist/components/color-palette/menu/color-palette-menu.d.ts.map +1 -1
- package/dist/components/color-palette/menu/color-palette-menu.js +15 -54
- package/dist/components/color-palette/menu/color-palette-menu.styles.d.ts +3 -0
- package/dist/components/color-palette/menu/color-palette-menu.styles.d.ts.map +1 -0
- package/dist/components/color-palette/menu/color-palette-menu.styles.js +49 -0
- package/dist/components/color-palette/menu/color-palette-reorder.d.ts +8 -1
- package/dist/components/color-palette/menu/color-palette-reorder.d.ts.map +1 -1
- package/dist/components/color-palette/menu/color-palette-reorder.js +11 -36
- package/dist/components/color-palette/menu/color-palette-reorder.styles.d.ts +3 -0
- package/dist/components/color-palette/menu/color-palette-reorder.styles.d.ts.map +1 -0
- package/dist/components/color-palette/menu/color-palette-reorder.styles.js +31 -0
- package/dist/components/color-palette/storybook/color-palette-invalid.stories.d.ts +26 -8
- package/dist/components/color-palette/storybook/color-palette-invalid.stories.d.ts.map +1 -1
- package/dist/components/color-palette/storybook/color-palette-invalid.stories.js +10 -39
- package/dist/components/color-palette/storybook/color-palette-valid.stories.d.ts +26 -8
- package/dist/components/color-palette/storybook/color-palette-valid.stories.d.ts.map +1 -1
- package/dist/components/color-palette/storybook/color-palette-valid.stories.js +30 -58
- package/dist/components/color-palette/storybook/color-palette.stories.d.ts +18 -4
- package/dist/components/color-palette/storybook/color-palette.stories.d.ts.map +1 -1
- package/dist/components/color-palette/storybook/color-palette.stories.js +65 -14
- package/dist/components/draw-svg/draw-svg.d.ts +11 -0
- package/dist/components/draw-svg/draw-svg.d.ts.map +1 -1
- package/dist/components/draw-svg/draw-svg.js +15 -45
- package/dist/components/draw-svg/draw-svg.stories.d.ts +2 -14
- package/dist/components/draw-svg/draw-svg.stories.d.ts.map +1 -1
- package/dist/components/draw-svg/draw-svg.stories.js +21 -97
- package/dist/components/draw-svg/draw-svg.styles.d.ts +3 -0
- package/dist/components/draw-svg/draw-svg.styles.d.ts.map +1 -0
- package/dist/components/draw-svg/draw-svg.styles.js +39 -0
- package/dist/components/responsive-svg/responsive-svg.d.ts +35 -15
- package/dist/components/responsive-svg/responsive-svg.d.ts.map +1 -1
- package/dist/components/responsive-svg/responsive-svg.js +59 -97
- package/dist/components/responsive-svg/responsive-svg.stories.d.ts +5 -4
- package/dist/components/responsive-svg/responsive-svg.stories.d.ts.map +1 -1
- package/dist/components/responsive-svg/responsive-svg.stories.js +93 -109
- package/dist/components/responsive-svg/responsive-svg.styles.d.ts +3 -0
- package/dist/components/responsive-svg/responsive-svg.styles.d.ts.map +1 -0
- package/dist/components/responsive-svg/responsive-svg.styles.js +46 -0
- package/dist/components/tool-tip/tool-tip.d.ts +24 -9
- package/dist/components/tool-tip/tool-tip.d.ts.map +1 -1
- package/dist/components/tool-tip/tool-tip.js +49 -90
- package/dist/components/tool-tip/tool-tip.stories.d.ts +4 -1
- package/dist/components/tool-tip/tool-tip.stories.d.ts.map +1 -1
- package/dist/components/tool-tip/tool-tip.stories.js +35 -5
- package/dist/components/tool-tip/tool-tip.styles.d.ts +3 -0
- package/dist/components/tool-tip/tool-tip.styles.d.ts.map +1 -0
- package/dist/components/tool-tip/tool-tip.styles.js +58 -0
- package/package.json +23 -19
- package/dist/components/bottom-sheet/bottom-sheet.test.d.ts +0 -2
- package/dist/components/bottom-sheet/bottom-sheet.test.d.ts.map +0 -1
- package/dist/components/bottom-sheet/bottom-sheet.test.js +0 -15
- package/dist/components/tool-tip/Tooltip2.d.ts +0 -17
- package/dist/components/tool-tip/Tooltip2.d.ts.map +0 -1
- package/dist/components/tool-tip/Tooltip2.js +0 -104
|
@@ -4,35 +4,55 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
import { html
|
|
8
|
-
import { property, query } from 'lit/decorators.js';
|
|
7
|
+
import { html } from 'lit';
|
|
8
|
+
import { customElement, property, query } from 'lit/decorators.js';
|
|
9
9
|
import quantize from 'quantize';
|
|
10
10
|
import { CanvasBase } from './canvas-base.js';
|
|
11
|
-
import
|
|
11
|
+
import styles from './canvas-image.styles.js';
|
|
12
|
+
const imageStatus = ['idle', 'loading', 'success', 'error'];
|
|
13
|
+
/**
|
|
14
|
+
* Utility component to make creating and retrieving image colors easier based on canvas coordinates.
|
|
15
|
+
*
|
|
16
|
+
* @dependency canvas-base
|
|
17
|
+
*/
|
|
12
18
|
let CanvasImage = class CanvasImage extends CanvasBase {
|
|
13
19
|
constructor() {
|
|
14
20
|
super(...arguments);
|
|
21
|
+
/** The image URL. */
|
|
15
22
|
this.imageURL = '';
|
|
23
|
+
/** Whether to apply smoothing to the image generated by the canvas. */
|
|
16
24
|
this.smoothing = false;
|
|
17
|
-
|
|
25
|
+
/** The canvas width. */
|
|
18
26
|
this.width = 0;
|
|
27
|
+
/** The canvas height. */
|
|
19
28
|
this.height = 0;
|
|
20
|
-
/**
|
|
21
|
-
|
|
22
|
-
*/
|
|
23
|
-
this.waitForLoading = () => new Promise((resolve) => {
|
|
24
|
-
const checkLoading = setInterval(() => {
|
|
25
|
-
if (!this.loading) {
|
|
26
|
-
clearInterval(checkLoading);
|
|
27
|
-
resolve(true);
|
|
28
|
-
}
|
|
29
|
-
}, 100);
|
|
30
|
-
});
|
|
29
|
+
/** @readonly Used to style the canvas based on its current state. */
|
|
30
|
+
this.status = 'idle';
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
static { this.styles = [...CanvasBase.styles, styles]; }
|
|
33
|
+
updated(_changedProperties) {
|
|
34
|
+
super.updated(_changedProperties);
|
|
35
|
+
if (_changedProperties.has('imageURL')) {
|
|
36
|
+
this.status = this.imageURL ? 'loading' : 'idle';
|
|
37
|
+
}
|
|
38
|
+
else if ((_changedProperties.has('width') || _changedProperties.has('height')) && this.status === 'success') {
|
|
39
|
+
this._performDraw();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
get updateComplete() {
|
|
43
|
+
const _waitForImage = async () => {
|
|
44
|
+
await super.updateComplete;
|
|
45
|
+
if (this.status === 'loading') {
|
|
46
|
+
await new Promise((resolve) => {
|
|
47
|
+
this.addEventListener('canvas-ready', resolve, { once: true });
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
if (this.status === 'error') {
|
|
51
|
+
throw new Error(`canvas-image failed to load ${this.imageURL}`);
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
};
|
|
55
|
+
return _waitForImage();
|
|
36
56
|
}
|
|
37
57
|
render() {
|
|
38
58
|
// Allows CORS requests for images from different domains
|
|
@@ -41,42 +61,44 @@ let CanvasImage = class CanvasImage extends CanvasBase {
|
|
|
41
61
|
<img
|
|
42
62
|
src=${this.imageURL}
|
|
43
63
|
crossorigin='anonymous'
|
|
44
|
-
@load=${() => this.
|
|
64
|
+
@load=${() => this._performDraw()}
|
|
65
|
+
@error=${() => this._handleLoadError()}
|
|
45
66
|
>
|
|
46
67
|
`;
|
|
47
68
|
}
|
|
48
69
|
/**
|
|
49
70
|
* Updates & loads the canvas image.
|
|
50
71
|
* Attempts to preserve aspect ratio based on width.
|
|
51
|
-
* @param width The canvas width
|
|
52
|
-
* @param height The canvas height
|
|
53
72
|
*/
|
|
54
|
-
|
|
55
|
-
|
|
73
|
+
_performDraw() {
|
|
74
|
+
const img = this.image;
|
|
75
|
+
if (!img || !this.context)
|
|
56
76
|
return;
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
//
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
+
// Calculate the new height based on the aspect ratio
|
|
78
|
+
const aspectRatio = img.naturalHeight / img.naturalWidth;
|
|
79
|
+
let drawWidth = this.width;
|
|
80
|
+
let drawHeight = drawWidth * aspectRatio;
|
|
81
|
+
// Ensure the new height fits within the canvas height
|
|
82
|
+
if (drawHeight > this.height) {
|
|
83
|
+
// Adjust width if height exceeds canvas height
|
|
84
|
+
drawWidth = this.height / aspectRatio;
|
|
85
|
+
drawHeight = this.height;
|
|
86
|
+
}
|
|
87
|
+
this.canvas.width = drawWidth;
|
|
88
|
+
this.canvas.height = drawHeight;
|
|
89
|
+
this.context.imageSmoothingEnabled = this.smoothing;
|
|
90
|
+
this.context.drawImage(img, 0, 0, drawWidth, drawHeight);
|
|
91
|
+
this.status = 'success';
|
|
92
|
+
this.dispatchEvent(new CustomEvent('canvas-ready'));
|
|
93
|
+
}
|
|
94
|
+
/** @internal Handle errors when the image fails to load. */
|
|
95
|
+
_handleLoadError() {
|
|
96
|
+
// Return to idle state if there is no URL.
|
|
97
|
+
this.status = this.imageURL === '' ? 'idle' : 'error';
|
|
98
|
+
this.dispatchEvent(new CustomEvent('canvas-ready'));
|
|
77
99
|
}
|
|
78
100
|
/**
|
|
79
|
-
* Gets the most frequent colors in an image
|
|
101
|
+
* Gets the most frequent colors in an image.
|
|
80
102
|
* @param numColors Number of colors to return
|
|
81
103
|
* @param quality Artificially reduce number of pixels (higher = less accurate but faster)
|
|
82
104
|
* @returns Most frequent colors
|
|
@@ -88,7 +110,7 @@ let CanvasImage = class CanvasImage extends CanvasBase {
|
|
|
88
110
|
*/
|
|
89
111
|
const nColors = numColors <= 7 ? numColors : numColors + 1;
|
|
90
112
|
// Wait for image to load
|
|
91
|
-
await this.
|
|
113
|
+
await this.updateComplete;
|
|
92
114
|
// Get an array of pixels
|
|
93
115
|
const pixels = await this.createPixelArray(quality);
|
|
94
116
|
if (!pixels)
|
|
@@ -99,13 +121,13 @@ let CanvasImage = class CanvasImage extends CanvasBase {
|
|
|
99
121
|
return colorMap ? colorMap.palette() : [];
|
|
100
122
|
}
|
|
101
123
|
/**
|
|
102
|
-
* Creates an array of pixels from the image
|
|
124
|
+
* Creates an array of pixels from the image.
|
|
103
125
|
* Inspired by colorthief
|
|
104
126
|
* @param quality Artificially reduce number of pixels (higher = less accurate but faster)
|
|
105
|
-
* @returns
|
|
127
|
+
* @returns Array of pixels
|
|
106
128
|
*/
|
|
107
129
|
async createPixelArray(quality) {
|
|
108
|
-
await this.
|
|
130
|
+
await this.updateComplete;
|
|
109
131
|
const pixelArray = [];
|
|
110
132
|
const imageData = (await this.getImageData())?.data;
|
|
111
133
|
if (!imageData)
|
|
@@ -125,36 +147,17 @@ let CanvasImage = class CanvasImage extends CanvasBase {
|
|
|
125
147
|
}
|
|
126
148
|
return pixelArray;
|
|
127
149
|
}
|
|
128
|
-
/**
|
|
129
|
-
* Gets the image data from the canvas
|
|
130
|
-
*/
|
|
150
|
+
/** Gets the image data from the canvas. */
|
|
131
151
|
async getImageData(x = 0, y = 0) {
|
|
132
152
|
try {
|
|
133
|
-
await this.
|
|
134
|
-
return this.context.getImageData(x, y, this.width, this.height);
|
|
153
|
+
await this.updateComplete;
|
|
154
|
+
return this.context.getImageData(x, y, this.canvas.width, this.canvas.height);
|
|
135
155
|
}
|
|
136
156
|
catch (e) {
|
|
137
157
|
throw new Error('Failed to get image data.');
|
|
138
158
|
}
|
|
139
159
|
}
|
|
140
160
|
};
|
|
141
|
-
CanvasImage.styles = [
|
|
142
|
-
...CanvasBase.styles,
|
|
143
|
-
css `
|
|
144
|
-
:host {
|
|
145
|
-
display: block;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/* Hide when width hasn't been set */
|
|
149
|
-
canvas:not([width]) {
|
|
150
|
-
display: none;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
img {
|
|
154
|
-
display: none;
|
|
155
|
-
}
|
|
156
|
-
`,
|
|
157
|
-
];
|
|
158
161
|
__decorate([
|
|
159
162
|
query('img')
|
|
160
163
|
], CanvasImage.prototype, "image", void 0);
|
|
@@ -164,7 +167,16 @@ __decorate([
|
|
|
164
167
|
__decorate([
|
|
165
168
|
property({ type: Boolean })
|
|
166
169
|
], CanvasImage.prototype, "smoothing", void 0);
|
|
170
|
+
__decorate([
|
|
171
|
+
property({ type: Number })
|
|
172
|
+
], CanvasImage.prototype, "width", void 0);
|
|
173
|
+
__decorate([
|
|
174
|
+
property({ type: Number })
|
|
175
|
+
], CanvasImage.prototype, "height", void 0);
|
|
176
|
+
__decorate([
|
|
177
|
+
property({ type: String, reflect: true, attribute: 'data-status' })
|
|
178
|
+
], CanvasImage.prototype, "status", void 0);
|
|
167
179
|
CanvasImage = __decorate([
|
|
168
|
-
|
|
180
|
+
customElement('canvas-image')
|
|
169
181
|
], CanvasImage);
|
|
170
182
|
export { CanvasImage };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/web-components-vite';
|
|
2
|
+
declare const meta: Meta;
|
|
3
|
+
export default meta;
|
|
4
|
+
export type Props = {
|
|
5
|
+
imageURL: string;
|
|
6
|
+
smoothing: boolean;
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
};
|
|
10
|
+
type Story = StoryObj<Props>;
|
|
11
|
+
export declare const Example: Story;
|
|
12
|
+
export declare const Error: Story;
|
|
13
|
+
//# sourceMappingURL=canvas-image.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-image.stories.d.ts","sourceRoot":"","sources":["../../../src/components/canvas/canvas-image.stories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,IAAI,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAc/E,QAAA,MAAM,IAAI,EAAE,IAKX,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,MAAM,MAAM,KAAK,GAAG;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAA;CACd,CAAC;AAEF,KAAK,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAgB7B,eAAO,MAAM,OAAO,EAAE,KAQrB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAQnB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { html } from 'lit';
|
|
2
|
+
import CanvasBaseStory from './canvas-base.stories.js';
|
|
3
|
+
const argTypes = {
|
|
4
|
+
...CanvasBaseStory.argTypes,
|
|
5
|
+
image: { control: false },
|
|
6
|
+
imageURL: { control: 'text' },
|
|
7
|
+
smoothing: { control: 'boolean' },
|
|
8
|
+
width: { control: 'number' },
|
|
9
|
+
height: { control: 'number' },
|
|
10
|
+
'data-status': { control: false }
|
|
11
|
+
};
|
|
12
|
+
const meta = {
|
|
13
|
+
title: 'Canvas/Image',
|
|
14
|
+
tags: ['autodocs'],
|
|
15
|
+
component: 'canvas-image',
|
|
16
|
+
argTypes,
|
|
17
|
+
};
|
|
18
|
+
export default meta;
|
|
19
|
+
const template = {
|
|
20
|
+
render: ({ imageURL, smoothing, width, height }) => {
|
|
21
|
+
return html `
|
|
22
|
+
<canvas-image
|
|
23
|
+
imageURL=${imageURL}
|
|
24
|
+
?smoothing=${smoothing}
|
|
25
|
+
width=${width}
|
|
26
|
+
height=${height}
|
|
27
|
+
>
|
|
28
|
+
</canvas-image>
|
|
29
|
+
`;
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
export const Example = {
|
|
33
|
+
...template,
|
|
34
|
+
args: {
|
|
35
|
+
imageURL: 'https://jollybandit.com/GreekzCaricature-md.webp',
|
|
36
|
+
smoothing: false,
|
|
37
|
+
width: 500,
|
|
38
|
+
height: 500
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
export const Error = {
|
|
42
|
+
...template,
|
|
43
|
+
args: {
|
|
44
|
+
imageURL: 'hello',
|
|
45
|
+
smoothing: false,
|
|
46
|
+
width: 500,
|
|
47
|
+
height: 500
|
|
48
|
+
},
|
|
49
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-image.styles.d.ts","sourceRoot":"","sources":["../../../src/components/canvas/canvas-image.styles.ts"],"names":[],"mappings":";AAEA,wBAmBE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { css } from 'lit';
|
|
2
|
+
export default css `
|
|
3
|
+
:host {
|
|
4
|
+
display: block;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
:host([data-status='error']) {
|
|
8
|
+
width: 100px;
|
|
9
|
+
height: 100px;
|
|
10
|
+
border: 2px solid red;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/* Hide when width hasn't been set */
|
|
14
|
+
canvas:not([width]) {
|
|
15
|
+
display: none;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
img {
|
|
19
|
+
display: none;
|
|
20
|
+
}
|
|
21
|
+
`;
|
|
@@ -5,20 +5,37 @@ type EventMap = {
|
|
|
5
5
|
};
|
|
6
6
|
export interface CarouselContainerProps {
|
|
7
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* A carousel which can have any number of slides, and rotates circularly.
|
|
10
|
+
*
|
|
11
|
+
* @cssprop {<length>} --padding - The size of the scroller padding.
|
|
12
|
+
* @cssprop {<length>} --margin - The size of the scroller margin.
|
|
13
|
+
*/
|
|
8
14
|
export declare class CarouselScroller extends LitElement {
|
|
9
|
-
static styles: import("lit").CSSResult;
|
|
10
|
-
|
|
11
|
-
|
|
15
|
+
static styles: import("lit").CSSResult[];
|
|
16
|
+
/** The items that will be used as slides. */
|
|
17
|
+
protected slotEl: HTMLSlotElement;
|
|
18
|
+
/** The slides being used. */
|
|
19
|
+
protected slotChildren: HTMLElement[];
|
|
20
|
+
/** Public way to subscribe to events. */
|
|
12
21
|
emitter: EventEmitter<EventMap>;
|
|
13
|
-
|
|
14
|
-
|
|
22
|
+
/** @internal */
|
|
23
|
+
private _currentSlide;
|
|
24
|
+
/** @internal */
|
|
25
|
+
private debouncers;
|
|
15
26
|
constructor();
|
|
16
27
|
disconnectedCallback(): void;
|
|
17
28
|
render(): import("lit-html").TemplateResult<1>;
|
|
29
|
+
/** Gets the current slide.
|
|
30
|
+
* @returns HTMLElement
|
|
31
|
+
*/
|
|
18
32
|
getCurrentSlide(): HTMLElement;
|
|
33
|
+
/** Scrolls to the slide before the current slide. */
|
|
19
34
|
scrollToPrevSlide(): void;
|
|
35
|
+
/** Scrolls to the slide after the current slide. */
|
|
20
36
|
scrollToNextSlide(): void;
|
|
21
|
-
|
|
37
|
+
/** @internal */
|
|
38
|
+
protected slotChange(): void;
|
|
22
39
|
}
|
|
23
40
|
declare global {
|
|
24
41
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"carousel-scroller.d.ts","sourceRoot":"","sources":["../../../src/components/carousel-scroller/carousel-scroller.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"carousel-scroller.d.ts","sourceRoot":"","sources":["../../../src/components/carousel-scroller/carousel-scroller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,UAAU,EAAE,MAAM,KAAK,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,KAAK,QAAQ,GAAG;IACf,WAAW,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;CAC3C,CAAC;AAEF,MAAM,WAAW,sBAAsB;CAAG;AAE1C;;;;;GAKG;AACH,qBACa,gBAAiB,SAAQ,UAAU;IAC/C,MAAM,CAAC,MAAM,4BAAY;IAEzB,6CAA6C;IAE7C,SAAS,CAAC,MAAM,EAAG,eAAe,CAAC;IAEnC,6BAA6B;IAC7B,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,CAAM;IAE3C,yCAAyC;IAClC,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAgC;IAEtE,gBAAgB;IAChB,OAAO,CAAC,aAAa,CAAa;IAElC,gBAAgB;IAChB,OAAO,CAAC,UAAU,CAAiB;;IAUnC,oBAAoB,IAAI,IAAI;IAK5B,MAAM;IAYN;;OAEG;IACI,eAAe;IAItB,qDAAqD;IAC9C,iBAAiB;IAUxB,oDAAoD;IAC7C,iBAAiB;IAUxB,gBAAgB;IAChB,SAAS,CAAC,UAAU;CAapB;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,mBAAmB,EAAE,gBAAgB,CAAA;KACrC;CACD"}
|
|
@@ -4,16 +4,27 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
import {
|
|
8
|
-
import { query } from 'lit/decorators.js';
|
|
7
|
+
import { html, LitElement } from 'lit';
|
|
8
|
+
import { customElement, query } from 'lit/decorators.js';
|
|
9
9
|
import { EventEmitter } from '../../utils/EventEmitter.js';
|
|
10
|
-
import
|
|
10
|
+
import styles from './carousel-scroller.styles.js';
|
|
11
|
+
/**
|
|
12
|
+
* A carousel which can have any number of slides, and rotates circularly.
|
|
13
|
+
*
|
|
14
|
+
* @cssprop {<length>} --padding - The size of the scroller padding.
|
|
15
|
+
* @cssprop {<length>} --margin - The size of the scroller margin.
|
|
16
|
+
*/
|
|
11
17
|
let CarouselScroller = class CarouselScroller extends LitElement {
|
|
18
|
+
static { this.styles = [styles]; }
|
|
12
19
|
constructor() {
|
|
13
20
|
super();
|
|
21
|
+
/** The slides being used. */
|
|
14
22
|
this.slotChildren = [];
|
|
23
|
+
/** Public way to subscribe to events. */
|
|
15
24
|
this.emitter = new EventEmitter();
|
|
16
|
-
|
|
25
|
+
/** @internal */
|
|
26
|
+
this._currentSlide = 0;
|
|
27
|
+
/** @internal */
|
|
17
28
|
this.debouncers = new WeakMap();
|
|
18
29
|
this.emitter.on('slotsLoaded', (slotChildren) => {
|
|
19
30
|
this.slotChildren = slotChildren;
|
|
@@ -34,27 +45,33 @@ let CarouselScroller = class CarouselScroller extends LitElement {
|
|
|
34
45
|
</div>
|
|
35
46
|
`;
|
|
36
47
|
}
|
|
48
|
+
/** Gets the current slide.
|
|
49
|
+
* @returns HTMLElement
|
|
50
|
+
*/
|
|
37
51
|
getCurrentSlide() {
|
|
38
|
-
return this.slotChildren[this.
|
|
52
|
+
return this.slotChildren[this._currentSlide - 1];
|
|
39
53
|
}
|
|
54
|
+
/** Scrolls to the slide before the current slide. */
|
|
40
55
|
scrollToPrevSlide() {
|
|
41
|
-
this.
|
|
42
|
-
this.
|
|
43
|
-
? (this.
|
|
44
|
-
: this.
|
|
56
|
+
this._currentSlide =
|
|
57
|
+
this._currentSlide === 0
|
|
58
|
+
? (this._currentSlide = this.slotChildren.length - 1)
|
|
59
|
+
: this._currentSlide - 1;
|
|
45
60
|
this.slotChildren
|
|
46
|
-
.at(this.
|
|
61
|
+
.at(this._currentSlide)
|
|
47
62
|
?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
|
48
63
|
}
|
|
64
|
+
/** Scrolls to the slide after the current slide. */
|
|
49
65
|
scrollToNextSlide() {
|
|
50
|
-
this.
|
|
51
|
-
this.
|
|
66
|
+
this._currentSlide =
|
|
67
|
+
this._currentSlide === this.slotChildren.length - 1
|
|
52
68
|
? 0
|
|
53
|
-
: this.
|
|
69
|
+
: this._currentSlide + 1;
|
|
54
70
|
this.slotChildren
|
|
55
|
-
.at(this.
|
|
71
|
+
.at(this._currentSlide)
|
|
56
72
|
?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
|
57
73
|
}
|
|
74
|
+
/** @internal */
|
|
58
75
|
slotChange() {
|
|
59
76
|
const slotElements = Array.from(this.slotEl
|
|
60
77
|
.assignedElements()
|
|
@@ -64,75 +81,10 @@ let CarouselScroller = class CarouselScroller extends LitElement {
|
|
|
64
81
|
this.debouncers.set(this.slotEl, timeoutId);
|
|
65
82
|
}
|
|
66
83
|
};
|
|
67
|
-
CarouselScroller.styles = css `
|
|
68
|
-
:host {
|
|
69
|
-
--padding: 40px;
|
|
70
|
-
--margin: 80px;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
.container {
|
|
74
|
-
width: 600px;
|
|
75
|
-
height: 400px;
|
|
76
|
-
margin: 20px;
|
|
77
|
-
border-radius: 20px;
|
|
78
|
-
overflow: hidden;
|
|
79
|
-
position: relative;
|
|
80
|
-
|
|
81
|
-
& > button {
|
|
82
|
-
position: absolute;
|
|
83
|
-
width: var(--padding);
|
|
84
|
-
height: calc(var(--padding) * 2);
|
|
85
|
-
z-index: 1;
|
|
86
|
-
background-color: #00000080;
|
|
87
|
-
border: none;
|
|
88
|
-
bottom: calc(50% - var(--padding));
|
|
89
|
-
font-size: 32px;
|
|
90
|
-
|
|
91
|
-
&:hover {
|
|
92
|
-
background-color: #6352b880;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
&:nth-child(1) {
|
|
96
|
-
left: 0;
|
|
97
|
-
border-top-right-radius: 314px;
|
|
98
|
-
border-bottom-right-radius: 314px;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
&:nth-child(2) {
|
|
102
|
-
right: 0;
|
|
103
|
-
border-top-left-radius: 314px;
|
|
104
|
-
border-bottom-left-radius: 314px;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
& > div {
|
|
109
|
-
display: flex;
|
|
110
|
-
overflow-x: scroll;
|
|
111
|
-
position: relative;
|
|
112
|
-
scroll-behavior: smooth;
|
|
113
|
-
scroll-snap-type: x mandatory;
|
|
114
|
-
scrollbar-width: none;
|
|
115
|
-
padding: 0 var(--padding);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
::slotted(*) {
|
|
119
|
-
display: flex;
|
|
120
|
-
flex-direction: column;
|
|
121
|
-
justify-content: center;
|
|
122
|
-
min-height: calc(400px - var(--margin));
|
|
123
|
-
min-width: calc(600px - var(--margin));
|
|
124
|
-
max-height: calc(400px - var(--margin));
|
|
125
|
-
max-width: calc(600px - var(--margin));
|
|
126
|
-
background: white;
|
|
127
|
-
scroll-snap-align: center;
|
|
128
|
-
padding: calc(var(--margin) / 2);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
`;
|
|
132
84
|
__decorate([
|
|
133
85
|
query('slot')
|
|
134
86
|
], CarouselScroller.prototype, "slotEl", void 0);
|
|
135
87
|
CarouselScroller = __decorate([
|
|
136
|
-
|
|
88
|
+
customElement('carousel-scroller')
|
|
137
89
|
], CarouselScroller);
|
|
138
90
|
export { CarouselScroller };
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/web-components';
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/web-components-vite';
|
|
2
2
|
declare const meta: Meta;
|
|
3
3
|
export default meta;
|
|
4
4
|
type Props = {
|
|
5
|
-
items:
|
|
5
|
+
items: string[];
|
|
6
|
+
'--padding': string;
|
|
7
|
+
'--margin': string;
|
|
6
8
|
};
|
|
7
9
|
type Story = StoryObj<Props>;
|
|
8
10
|
export declare const Empty: Story;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"carousel-scroller.stories.d.ts","sourceRoot":"","sources":["../../../src/components/carousel-scroller/carousel-scroller.stories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"carousel-scroller.stories.d.ts","sourceRoot":"","sources":["../../../src/components/carousel-scroller/carousel-scroller.stories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,IAAI,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAc/E,QAAA,MAAM,IAAI,EAAE,IAKX,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,KAAK,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAyB7B,eAAO,MAAM,KAAK,EAAE,KAKnB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAKvB,CAAC"}
|
|
@@ -1,15 +1,31 @@
|
|
|
1
1
|
import { html } from 'lit';
|
|
2
2
|
import { repeat } from 'lit/directives/repeat.js';
|
|
3
|
+
import { styleMap } from 'lit/directives/style-map.js';
|
|
4
|
+
const argTypes = {
|
|
5
|
+
items: { control: 'object' },
|
|
6
|
+
slotEl: { control: false },
|
|
7
|
+
slotChildren: { control: false },
|
|
8
|
+
emitter: { control: false },
|
|
9
|
+
'--padding': { control: 'text' },
|
|
10
|
+
'--margin': { control: 'text' }
|
|
11
|
+
};
|
|
3
12
|
const meta = {
|
|
4
13
|
title: 'Carousel Scroller',
|
|
5
14
|
tags: ['autodocs'],
|
|
6
15
|
component: 'carousel-scroller',
|
|
16
|
+
argTypes
|
|
7
17
|
};
|
|
8
18
|
export default meta;
|
|
9
|
-
const
|
|
10
|
-
render: ({ items }) => {
|
|
19
|
+
const template = {
|
|
20
|
+
render: ({ items, '--padding': padding, '--margin': margin }) => {
|
|
21
|
+
const styles = {
|
|
22
|
+
'--padding': padding,
|
|
23
|
+
'--margin': margin
|
|
24
|
+
};
|
|
11
25
|
return html `
|
|
12
|
-
<carousel-scroller
|
|
26
|
+
<carousel-scroller
|
|
27
|
+
style=${styleMap(styles)}
|
|
28
|
+
>
|
|
13
29
|
${repeat(items, (item) => html `<div>${item}</div>`)}
|
|
14
30
|
</carousel-scroller>
|
|
15
31
|
`;
|
|
@@ -21,19 +37,19 @@ const items = [
|
|
|
21
37
|
'three'
|
|
22
38
|
];
|
|
23
39
|
export const Empty = {
|
|
24
|
-
...
|
|
40
|
+
...template,
|
|
25
41
|
args: {
|
|
26
42
|
items: [],
|
|
27
43
|
},
|
|
28
44
|
};
|
|
29
45
|
export const OneItem = {
|
|
30
|
-
...
|
|
46
|
+
...template,
|
|
31
47
|
args: {
|
|
32
48
|
items: [items[0]],
|
|
33
49
|
},
|
|
34
50
|
};
|
|
35
51
|
export const ManyItems = {
|
|
36
|
-
...
|
|
52
|
+
...template,
|
|
37
53
|
args: {
|
|
38
54
|
items,
|
|
39
55
|
},
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carousel-scroller.styles.d.ts","sourceRoot":"","sources":["../../../src/components/carousel-scroller/carousel-scroller.styles.ts"],"names":[],"mappings":";AAEA,wBAgEE"}
|