@streamscloud/kit 0.1.11 → 0.1.12-1772041668184
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/dist/core/toastr/index.d.ts +1 -1
- package/dist/core/toastr/toastr.scss +38 -0
- package/dist/core/toastr/toastr.svelte.d.ts +1 -1
- package/dist/core/toastr/toastr.svelte.js +13 -6
- package/dist/core/toastr/types.d.ts +2 -0
- package/dist/ui/cropper/image-editor-dialog/cmp.image-editor-dialog.svelte +8 -7
- package/dist/ui/cropper/image-editor-dialog/index.d.ts +2 -2
- package/dist/ui/cropper/image-editor-dialog/index.js +1 -1
- package/dist/ui/cropper/image-editor-dialog/types.d.ts +11 -3
- package/dist/ui/cropper/img-cropper/cmp.img-cropper.svelte +1 -2
- package/dist/ui/cropper/img-cropper/img-cropper-base-worker.svelte.d.ts +8 -11
- package/dist/ui/cropper/img-cropper/img-cropper-base-worker.svelte.js +19 -7
- package/dist/ui/cropper/img-cropper/img-cropper-utils.d.ts +1 -0
- package/dist/ui/cropper/img-cropper/img-cropper-utils.js +23 -0
- package/dist/ui/cropper/img-cropper/img-cropper-worker.svelte.d.ts +9 -10
- package/dist/ui/cropper/img-cropper/img-cropper.svelte.d.ts +7 -19
- package/dist/ui/cropper/img-cropper/img-cropper.svelte.js +10 -5
- package/dist/ui/cropper/img-cropper/index.d.ts +1 -1
- package/dist/ui/dialog/cmp.dialog-container.svelte +12 -12
- package/dist/ui/dialog/dialog-data.d.ts +2 -0
- package/dist/ui/dialog/dialog-mount.d.ts +1 -1
- package/dist/ui/dialog/dialog-mount.js +2 -2
- package/dist/ui/dialog/dialogs.svelte.d.ts +3 -0
- package/dist/ui/dialog/dialogs.svelte.js +21 -2
- package/dist/ui/dialog/index.d.ts +1 -1
- package/dist/ui/dialog/index.js +1 -1
- package/dist/ui/dialog/types.svelte.d.ts +3 -14
- package/dist/ui/dialog/types.svelte.js +3 -18
- package/dist/ui/form-group/cmp.form-group-label.svelte +25 -0
- package/dist/ui/form-group/cmp.form-group-label.svelte.d.ts +8 -0
- package/dist/ui/form-group/cmp.form-group-note.svelte +16 -0
- package/dist/ui/form-group/cmp.form-group-note.svelte.d.ts +7 -0
- package/dist/ui/form-group/cmp.form-group.svelte +16 -0
- package/dist/ui/form-group/cmp.form-group.svelte.d.ts +8 -0
- package/dist/ui/form-group/index.d.ts +3 -0
- package/dist/ui/form-group/index.js +3 -0
- package/dist/ui/html-block/cmp.html-block.svelte +112 -0
- package/dist/ui/html-block/cmp.html-block.svelte.d.ts +7 -0
- package/dist/ui/html-block/index.d.ts +1 -0
- package/dist/ui/html-block/index.js +1 -0
- package/dist/ui/media-viewer-dialog/cmp.media-viewer-dialog.svelte +50 -0
- package/dist/ui/media-viewer-dialog/cmp.media-viewer-dialog.svelte.d.ts +9 -0
- package/dist/ui/media-viewer-dialog/index.d.ts +14 -0
- package/dist/ui/media-viewer-dialog/index.js +18 -0
- package/dist/ui/media-viewer-dialog/media-viewer-item.svelte +61 -0
- package/dist/ui/media-viewer-dialog/media-viewer-item.svelte.d.ts +7 -0
- package/dist/ui/media-viewer-dialog/types.d.ts +15 -0
- package/dist/ui/media-viewer-dialog/types.js +1 -0
- package/dist/ui/player/carousel/cmp.carousel.svelte +25 -4
- package/dist/ui/player/carousel/cmp.carousel.svelte.d.ts +3 -1
- package/dist/ui/player/feed-slider/cmp.feed-slider.svelte +3 -5
- package/dist/ui/player/utils/index.d.ts +1 -0
- package/dist/ui/player/utils/index.js +1 -0
- package/dist/ui/player/{feed-slider → utils}/wheel-gestures-adapter.d.ts +6 -2
- package/dist/ui/player/{feed-slider → utils}/wheel-gestures-adapter.js +22 -13
- package/dist/ui/video/cmp.video.svelte +16 -7
- package/package.json +14 -1
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
import { WheelGestures } from 'wheel-gestures';
|
|
3
3
|
/**
|
|
4
4
|
* Minimal, robust wheel adapter:
|
|
5
|
-
* -
|
|
5
|
+
* - Configurable axis: 'y' reads Y only; 'x' prefers X but remaps Y when X is negligible
|
|
6
|
+
* - EMA over velocity to smooth noisy streams (esp. on Windows)
|
|
6
7
|
* - Cooldown blocks triggers while animation runs
|
|
7
8
|
* - Mouse fallback: if velocity is near zero but delta is large, treat as a discrete "kick"
|
|
8
9
|
*/
|
|
9
10
|
export const createWheelAdapter = (target, params) => {
|
|
10
|
-
const { cbs } = params;
|
|
11
|
+
const { axis = 'y', cbs } = params;
|
|
11
12
|
// Tunables
|
|
12
13
|
const PEAK_THRESHOLD = 0.4; // EMA magnitude threshold to consider as a "peak"
|
|
13
14
|
const ACCEL_THRESHOLD = 0.02; // minimal directional EMA rise to count as real acceleration
|
|
@@ -30,41 +31,49 @@ export const createWheelAdapter = (target, params) => {
|
|
|
30
31
|
}, cbs.getAnimationDurationMs() + 100);
|
|
31
32
|
};
|
|
32
33
|
const fire = (direction) => {
|
|
33
|
-
|
|
34
|
-
if ((direction > 0 && !cbs.canLoadNext()) || (direction < 0 && !cbs.canLoadPrevious())) {
|
|
34
|
+
if ((direction === 'next' && !cbs.canLoadNext()) || (direction === 'previous' && !cbs.canLoadPrevious())) {
|
|
35
35
|
return;
|
|
36
36
|
}
|
|
37
37
|
isAnimating = true;
|
|
38
38
|
cbs.onTrigger(direction);
|
|
39
39
|
startCooldown();
|
|
40
40
|
};
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
const getAxisValues = (axisDelta, axisVelocity) => {
|
|
42
|
+
if (axis === 'y') {
|
|
43
|
+
return [axisDelta[1], axisVelocity[1]];
|
|
44
|
+
}
|
|
45
|
+
// axis === 'x': prefer X, fall back to Y (remap vertical scroll to horizontal)
|
|
46
|
+
if (Math.abs(axisDelta[0]) >= Math.abs(axisDelta[1])) {
|
|
47
|
+
return [axisDelta[0], axisVelocity[0]];
|
|
48
|
+
}
|
|
49
|
+
return [axisDelta[1], axisVelocity[1]];
|
|
50
|
+
};
|
|
51
|
+
wheelGestures.on('wheel', ({ axisDelta, axisVelocity }) => {
|
|
52
|
+
const [delta, velocity] = getAxisValues(axisDelta, axisVelocity);
|
|
44
53
|
// Tracking only: always update EMA and compute signs/acceleration
|
|
45
54
|
previousEmaVelocity = emaVelocity;
|
|
46
|
-
emaVelocity += (
|
|
55
|
+
emaVelocity += (velocity - emaVelocity) * EMA_ALPHA;
|
|
47
56
|
const emaMagnitude = Math.abs(emaVelocity);
|
|
48
|
-
const velocitySign = Math.sign(emaVelocity) || Math.sign(
|
|
57
|
+
const velocitySign = Math.sign(emaVelocity) || Math.sign(velocity);
|
|
49
58
|
const emaAcceleration = emaVelocity - previousEmaVelocity;
|
|
50
59
|
// During animation we only track; no arming, no triggering
|
|
51
60
|
if (isAnimating) {
|
|
52
61
|
return;
|
|
53
62
|
}
|
|
54
63
|
// Path 1: mouse-like discrete kick (platform-agnostic via delta/velocity ratio)
|
|
55
|
-
const absDelta = Math.abs(
|
|
56
|
-
const absVel = Math.abs(
|
|
64
|
+
const absDelta = Math.abs(delta);
|
|
65
|
+
const absVel = Math.abs(velocity);
|
|
57
66
|
const stepRatio = absDelta / Math.max(1e-6, absVel);
|
|
58
67
|
const isMouseLikeKick = absDelta >= MOUSE_DELTA_KICK && stepRatio >= MOUSE_STEP_RATIO_KICK;
|
|
59
68
|
if (isMouseLikeKick) {
|
|
60
|
-
const direction =
|
|
69
|
+
const direction = delta > 0 ? 'next' : 'previous';
|
|
61
70
|
fire(direction);
|
|
62
71
|
return;
|
|
63
72
|
}
|
|
64
73
|
// Path 2: trackpad/inertia via EMA acceleration and peak gating
|
|
65
74
|
const isAcceleratingInDirection = velocitySign !== 0 && emaAcceleration * velocitySign > ACCEL_THRESHOLD;
|
|
66
75
|
if (isAcceleratingInDirection && emaMagnitude > PEAK_THRESHOLD) {
|
|
67
|
-
const direction = velocitySign > 0 ?
|
|
76
|
+
const direction = velocitySign > 0 ? 'next' : 'previous';
|
|
68
77
|
fire(direction);
|
|
69
78
|
}
|
|
70
79
|
});
|
|
@@ -8,10 +8,11 @@ import IconSpeaker from '@fluentui/svg-icons/icons/speaker_2_20_regular.svg?raw'
|
|
|
8
8
|
import IconSpeakerMute from '@fluentui/svg-icons/icons/speaker_mute_20_regular.svg?raw';
|
|
9
9
|
import { untrack } from 'svelte';
|
|
10
10
|
import { fade } from 'svelte/transition';
|
|
11
|
-
let { src, poster, id = randomNanoid(), controls =
|
|
11
|
+
let { src, poster, id = randomNanoid(), controls = false, autoplay = false, loop = false, inert = false, allowPreloading = false, hideSpeaker = false, hidePlayButton = false, intersectionContainer, scrubberPosition = 'bottom', on } = $props();
|
|
12
12
|
let video = $state(null);
|
|
13
13
|
let videoContainerRef = $state(null);
|
|
14
14
|
let showControlsOnHover = $state(false);
|
|
15
|
+
let showProgressOnHover = $state(false);
|
|
15
16
|
let isVideoPaused = $state(true);
|
|
16
17
|
let percentageCompleted = $state(0);
|
|
17
18
|
let everActivated = $state(false);
|
|
@@ -246,7 +247,13 @@ const handleSeek = (percent) => {
|
|
|
246
247
|
<img class="video__poster" src={poster} alt="" />
|
|
247
248
|
{/if}
|
|
248
249
|
{#if !controls || !everActivated}
|
|
249
|
-
<div
|
|
250
|
+
<div
|
|
251
|
+
class="video__overlay"
|
|
252
|
+
onclick={togglePlay}
|
|
253
|
+
onkeydown={() => ({})}
|
|
254
|
+
onmouseenter={() => (showControlsOnHover = true)}
|
|
255
|
+
onmouseleave={() => (showControlsOnHover = false)}
|
|
256
|
+
role="none">
|
|
250
257
|
{#if isVideoPaused && !hidePlayButton}
|
|
251
258
|
<button type="button" aria-label="play" class="video__playback-button" onclick={togglePlay} onkeydown={() => ({})}>
|
|
252
259
|
<Icon src={IconPlay} color="white" />
|
|
@@ -256,6 +263,7 @@ const handleSeek = (percent) => {
|
|
|
256
263
|
<Icon src={IconPause} color="white" />
|
|
257
264
|
</button>
|
|
258
265
|
{/if}
|
|
266
|
+
|
|
259
267
|
{#if (showControlsOnHover || MediaVolumeManager.isMuted) && !hideSpeaker}
|
|
260
268
|
<button type="button" aria-label={MediaVolumeManager.isMuted ? 'mute' : 'unmute'} class="video__mute-button" onclick={toggleMute}>
|
|
261
269
|
{#if MediaVolumeManager.isMuted}
|
|
@@ -271,10 +279,10 @@ const handleSeek = (percent) => {
|
|
|
271
279
|
class="video__progress-container"
|
|
272
280
|
class:video__progress-container--top={scrubberPosition === 'top'}
|
|
273
281
|
class:video__progress-container--bottom={scrubberPosition === 'bottom'}
|
|
274
|
-
onmouseenter={() => (
|
|
275
|
-
onmouseleave={() => (
|
|
282
|
+
onmouseenter={() => (showProgressOnHover = true)}
|
|
283
|
+
onmouseleave={() => (showProgressOnHover = false)}
|
|
276
284
|
role="none">
|
|
277
|
-
{#if
|
|
285
|
+
{#if showProgressOnHover || (!showProgressOnHover && isVideoPaused)}
|
|
278
286
|
<div
|
|
279
287
|
class="video__seek-bar"
|
|
280
288
|
transition:fade={{ duration: isVideoPaused ? 0 : 300 }}
|
|
@@ -321,12 +329,12 @@ A full-featured video player with custom overlay controls, play/pause, mute, see
|
|
|
321
329
|
background: var(--_video--background-color);
|
|
322
330
|
}
|
|
323
331
|
.video__playback-button {
|
|
332
|
+
--sc-kit--icon--size: 2.5rem;
|
|
324
333
|
--sc-kit--icon--filter: drop-shadow(1px 1px #000000);
|
|
325
334
|
position: absolute;
|
|
326
335
|
top: 50%;
|
|
327
336
|
left: 50%;
|
|
328
337
|
transform: translate(-50%, -50%);
|
|
329
|
-
font-size: 2em;
|
|
330
338
|
}
|
|
331
339
|
.video__playback-button--pause {
|
|
332
340
|
/* Set 'container-type: inline-size;' to reference container*/
|
|
@@ -337,10 +345,11 @@ A full-featured video player with custom overlay controls, play/pause, mute, see
|
|
|
337
345
|
}
|
|
338
346
|
}
|
|
339
347
|
.video__mute-button {
|
|
348
|
+
--sc-kit--icon--size: 1.25rem;
|
|
349
|
+
--sc-kit--icon--filter: drop-shadow(1px 1px #000000);
|
|
340
350
|
position: absolute;
|
|
341
351
|
top: 0.625em;
|
|
342
352
|
right: 0.625em;
|
|
343
|
-
font-size: 1em;
|
|
344
353
|
z-index: 1;
|
|
345
354
|
}
|
|
346
355
|
.video__poster {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@streamscloud/kit",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.12-1772041668184",
|
|
4
4
|
"author": "StreamsCloud",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"pack": "npm run build && npm pack",
|
|
18
18
|
"preview": "vite preview",
|
|
19
19
|
"check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json",
|
|
20
|
+
"check:strict": "svelte-check --tsconfig ./tsconfig.app.json --fail-on-warnings --output machine && eslint . --format codeframe --max-warnings 0 && prettier --check --plugin prettier-plugin-svelte --cache .",
|
|
20
21
|
"lint": "prettier --check --plugin prettier-plugin-svelte . && eslint .",
|
|
21
22
|
"lint-format": "prettier --write --plugin prettier-plugin-svelte . && eslint --fix .",
|
|
22
23
|
"format": "prettier --write --plugin prettier-plugin-svelte ."
|
|
@@ -104,6 +105,10 @@
|
|
|
104
105
|
"types": "./dist/ui/dialog/index.d.ts",
|
|
105
106
|
"svelte": "./dist/ui/dialog/index.js"
|
|
106
107
|
},
|
|
108
|
+
"./ui/form-group": {
|
|
109
|
+
"types": "./dist/ui/form-group/index.d.ts",
|
|
110
|
+
"svelte": "./dist/ui/form-group/index.js"
|
|
111
|
+
},
|
|
107
112
|
"./ui/dropdown": {
|
|
108
113
|
"types": "./dist/ui/dropdown/index.d.ts",
|
|
109
114
|
"svelte": "./dist/ui/dropdown/index.js"
|
|
@@ -112,6 +117,10 @@
|
|
|
112
117
|
"types": "./dist/ui/dynamic-component/index.d.ts",
|
|
113
118
|
"svelte": "./dist/ui/dynamic-component/index.js"
|
|
114
119
|
},
|
|
120
|
+
"./ui/html-block": {
|
|
121
|
+
"types": "./dist/ui/html-block/index.d.ts",
|
|
122
|
+
"svelte": "./dist/ui/html-block/index.js"
|
|
123
|
+
},
|
|
115
124
|
"./ui/icon": {
|
|
116
125
|
"types": "./dist/ui/icon/index.d.ts",
|
|
117
126
|
"svelte": "./dist/ui/icon/index.js"
|
|
@@ -144,6 +153,10 @@
|
|
|
144
153
|
"types": "./dist/ui/media-playback/index.d.ts",
|
|
145
154
|
"svelte": "./dist/ui/media-playback/index.js"
|
|
146
155
|
},
|
|
156
|
+
"./ui/media-viewer-dialog": {
|
|
157
|
+
"types": "./dist/ui/media-viewer-dialog/index.d.ts",
|
|
158
|
+
"svelte": "./dist/ui/media-viewer-dialog/index.js"
|
|
159
|
+
},
|
|
147
160
|
"./ui/player/buttons": {
|
|
148
161
|
"types": "./dist/ui/player/buttons/index.d.ts",
|
|
149
162
|
"svelte": "./dist/ui/player/buttons/index.js"
|