@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.
Files changed (57) hide show
  1. package/dist/core/toastr/index.d.ts +1 -1
  2. package/dist/core/toastr/toastr.scss +38 -0
  3. package/dist/core/toastr/toastr.svelte.d.ts +1 -1
  4. package/dist/core/toastr/toastr.svelte.js +13 -6
  5. package/dist/core/toastr/types.d.ts +2 -0
  6. package/dist/ui/cropper/image-editor-dialog/cmp.image-editor-dialog.svelte +8 -7
  7. package/dist/ui/cropper/image-editor-dialog/index.d.ts +2 -2
  8. package/dist/ui/cropper/image-editor-dialog/index.js +1 -1
  9. package/dist/ui/cropper/image-editor-dialog/types.d.ts +11 -3
  10. package/dist/ui/cropper/img-cropper/cmp.img-cropper.svelte +1 -2
  11. package/dist/ui/cropper/img-cropper/img-cropper-base-worker.svelte.d.ts +8 -11
  12. package/dist/ui/cropper/img-cropper/img-cropper-base-worker.svelte.js +19 -7
  13. package/dist/ui/cropper/img-cropper/img-cropper-utils.d.ts +1 -0
  14. package/dist/ui/cropper/img-cropper/img-cropper-utils.js +23 -0
  15. package/dist/ui/cropper/img-cropper/img-cropper-worker.svelte.d.ts +9 -10
  16. package/dist/ui/cropper/img-cropper/img-cropper.svelte.d.ts +7 -19
  17. package/dist/ui/cropper/img-cropper/img-cropper.svelte.js +10 -5
  18. package/dist/ui/cropper/img-cropper/index.d.ts +1 -1
  19. package/dist/ui/dialog/cmp.dialog-container.svelte +12 -12
  20. package/dist/ui/dialog/dialog-data.d.ts +2 -0
  21. package/dist/ui/dialog/dialog-mount.d.ts +1 -1
  22. package/dist/ui/dialog/dialog-mount.js +2 -2
  23. package/dist/ui/dialog/dialogs.svelte.d.ts +3 -0
  24. package/dist/ui/dialog/dialogs.svelte.js +21 -2
  25. package/dist/ui/dialog/index.d.ts +1 -1
  26. package/dist/ui/dialog/index.js +1 -1
  27. package/dist/ui/dialog/types.svelte.d.ts +3 -14
  28. package/dist/ui/dialog/types.svelte.js +3 -18
  29. package/dist/ui/form-group/cmp.form-group-label.svelte +25 -0
  30. package/dist/ui/form-group/cmp.form-group-label.svelte.d.ts +8 -0
  31. package/dist/ui/form-group/cmp.form-group-note.svelte +16 -0
  32. package/dist/ui/form-group/cmp.form-group-note.svelte.d.ts +7 -0
  33. package/dist/ui/form-group/cmp.form-group.svelte +16 -0
  34. package/dist/ui/form-group/cmp.form-group.svelte.d.ts +8 -0
  35. package/dist/ui/form-group/index.d.ts +3 -0
  36. package/dist/ui/form-group/index.js +3 -0
  37. package/dist/ui/html-block/cmp.html-block.svelte +112 -0
  38. package/dist/ui/html-block/cmp.html-block.svelte.d.ts +7 -0
  39. package/dist/ui/html-block/index.d.ts +1 -0
  40. package/dist/ui/html-block/index.js +1 -0
  41. package/dist/ui/media-viewer-dialog/cmp.media-viewer-dialog.svelte +50 -0
  42. package/dist/ui/media-viewer-dialog/cmp.media-viewer-dialog.svelte.d.ts +9 -0
  43. package/dist/ui/media-viewer-dialog/index.d.ts +14 -0
  44. package/dist/ui/media-viewer-dialog/index.js +18 -0
  45. package/dist/ui/media-viewer-dialog/media-viewer-item.svelte +61 -0
  46. package/dist/ui/media-viewer-dialog/media-viewer-item.svelte.d.ts +7 -0
  47. package/dist/ui/media-viewer-dialog/types.d.ts +15 -0
  48. package/dist/ui/media-viewer-dialog/types.js +1 -0
  49. package/dist/ui/player/carousel/cmp.carousel.svelte +25 -4
  50. package/dist/ui/player/carousel/cmp.carousel.svelte.d.ts +3 -1
  51. package/dist/ui/player/feed-slider/cmp.feed-slider.svelte +3 -5
  52. package/dist/ui/player/utils/index.d.ts +1 -0
  53. package/dist/ui/player/utils/index.js +1 -0
  54. package/dist/ui/player/{feed-slider → utils}/wheel-gestures-adapter.d.ts +6 -2
  55. package/dist/ui/player/{feed-slider → utils}/wheel-gestures-adapter.js +22 -13
  56. package/dist/ui/video/cmp.video.svelte +16 -7
  57. 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
- * - EMA over axisVelocity[1] to smooth noisy streams (esp. on Windows)
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
- // Respect external guards (e.g., paging boundaries)
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
- wheelGestures.on('wheel', ({ axisDelta: [, axisDeltaY], axisVelocity: [, axisVelocityY] }) => {
42
- const velocityY = axisVelocityY || 0;
43
- const deltaY = axisDeltaY || 0;
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 += (velocityY - emaVelocity) * EMA_ALPHA;
55
+ emaVelocity += (velocity - emaVelocity) * EMA_ALPHA;
47
56
  const emaMagnitude = Math.abs(emaVelocity);
48
- const velocitySign = Math.sign(emaVelocity) || Math.sign(velocityY);
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(deltaY);
56
- const absVel = Math.abs(velocityY);
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 = deltaY > 0 ? 1 : -1; // 1 = next/down, -1 = previous/up
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 ? 1 : -1; // 1 = next/down, -1 = previous/up
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 = true, autoplay = false, loop = false, inert = false, allowPreloading = false, hideSpeaker = false, hidePlayButton = false, intersectionContainer, scrubberPosition = 'bottom', on } = $props();
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 class="video__overlay" onclick={togglePlay} onkeydown={() => ({})} role="none">
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={() => (showControlsOnHover = true)}
275
- onmouseleave={() => (showControlsOnHover = false)}
282
+ onmouseenter={() => (showProgressOnHover = true)}
283
+ onmouseleave={() => (showProgressOnHover = false)}
276
284
  role="none">
277
- {#if showControlsOnHover || (!showControlsOnHover && isVideoPaused)}
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.11",
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"