@likable-hair/svelte 3.1.43 → 3.1.45

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.
@@ -3,7 +3,7 @@ import "./FileInput.css";
3
3
  import { createEventDispatcher } from "svelte";
4
4
  let clazz = "";
5
5
  export { clazz as class };
6
- export let files = void 0, placeholder = void 0, persistOverUpload = true, disabled = false;
6
+ export let files = void 0, placeholder = void 0, persistOverUpload = true, disabled = false, maxFiles = void 0;
7
7
  let inputElement = void 0;
8
8
  let dropAreaActive = false;
9
9
  const highlight = (highlighted) => {
@@ -12,27 +12,41 @@ const highlight = (highlighted) => {
12
12
  const dispatch = createEventDispatcher();
13
13
  function handleFileDrop(event) {
14
14
  let droppedFiles = event.dataTransfer?.files;
15
+ let limitedFiles;
15
16
  if (droppedFiles) {
17
+ if (maxFiles !== void 0) {
18
+ let freeSlots = Math.max(0, maxFiles - (files?.length || 0));
19
+ limitedFiles = Array.from(droppedFiles).slice(0, freeSlots);
20
+ } else {
21
+ limitedFiles = Array.from(droppedFiles);
22
+ }
16
23
  if (!persistOverUpload)
17
- files = Array.from(droppedFiles);
24
+ files = limitedFiles;
18
25
  else
19
- files = files ? [...files, ...Array.from(droppedFiles)] : Array.from(droppedFiles);
26
+ files = files ? [...files, ...limitedFiles] : limitedFiles;
20
27
  dispatch("fileDrop", {
21
28
  nativeEvent: event,
22
- files: Array.from(droppedFiles)
29
+ files: limitedFiles
23
30
  });
24
31
  }
25
32
  }
26
33
  function handleFileFromInput(event) {
27
34
  let selectedFiles = event.target.files;
35
+ let limitedFiles;
28
36
  if (selectedFiles) {
37
+ if (maxFiles !== void 0) {
38
+ let freeSlots = Math.max(0, maxFiles - (files?.length || 0));
39
+ limitedFiles = Array.from(selectedFiles).slice(0, freeSlots);
40
+ } else {
41
+ limitedFiles = Array.from(selectedFiles);
42
+ }
29
43
  if (!persistOverUpload)
30
- files = Array.from(selectedFiles);
44
+ files = limitedFiles;
31
45
  else
32
- files = files ? [...files, ...Array.from(selectedFiles)] : Array.from(selectedFiles);
46
+ files = files ? [...files, ...limitedFiles] : limitedFiles;
33
47
  dispatch("fileSelect", {
34
48
  nativeEvent: event,
35
- files: Array.from(selectedFiles)
49
+ files: limitedFiles
36
50
  });
37
51
  }
38
52
  }
@@ -49,6 +63,7 @@ function handleFileFromInput(event) {
49
63
  }}
50
64
  class:disabled
51
65
  class="drop-area {clazz}"
66
+ role="presentation"
52
67
  >
53
68
  <slot name="body" active={dropAreaActive}>
54
69
  <span> { placeholder || 'Drop file here or click to upload'} </span>
@@ -59,6 +74,7 @@ function handleFileFromInput(event) {
59
74
  multiple
60
75
  bind:this={inputElement}
61
76
  on:input={handleFileFromInput}
77
+ on:change
62
78
  {disabled}
63
79
  />
64
80
  </div>
@@ -100,7 +116,7 @@ function handleFileFromInput(event) {
100
116
  .drop-area > input {
101
117
  display: none;
102
118
  }
103
- .drop-area:hover:not(.disabled) {
119
+ .drop-area:hover:not(.disabled) {
104
120
  box-shadow: var(
105
121
  --file-input-focus-shadow,
106
122
  var(--file-input-default-focus-shadow)
@@ -8,8 +8,10 @@ declare const __propDef: {
8
8
  placeholder?: string | undefined;
9
9
  persistOverUpload?: boolean | undefined;
10
10
  disabled?: boolean | undefined;
11
+ maxFiles?: number | undefined;
11
12
  };
12
13
  events: {
14
+ change: Event;
13
15
  fileDrop: CustomEvent<{
14
16
  nativeEvent: DragEvent;
15
17
  files: File[];
@@ -5,7 +5,7 @@ import FileInput from "./FileInput.svelte";
5
5
  import Icon from "../media/Icon.svelte";
6
6
  let clazz = "";
7
7
  export { clazz as class };
8
- export let files = [], persistOverUpload = true, dropAreaActive = true, icon = "mdi-file-document";
8
+ export let files = [], persistOverUpload = true, dropAreaActive = true, icon = "mdi-file-document", disabled = false, maxFiles = void 0;
9
9
  let fileActive = null;
10
10
  function handleFileMouseEnter(file) {
11
11
  dropAreaActive = false;
@@ -29,11 +29,14 @@ function handleRemove(file) {
29
29
  <FileInput
30
30
  bind:files
31
31
  {persistOverUpload}
32
+ disabled={disabled || (maxFiles !== undefined && files.length >= maxFiles)}
32
33
  --file-input-border-radius="var(--file-input-list-border-radius,var(--file-input-list-default-border-radius))"
33
34
  --file-input-background-color="var(--file-input-list-background-color,var(--file-input-list-default-background-color))"
34
35
  --file-input-color="var(--file-input-list-color,var(--file-input-list-default-color))"
35
36
  --file-input-height="var(--file-input-list-height,var(--file-input-list-default-height))"
36
37
  --file-input-width="var(--file-input-list-width,var(--file-input-list-default-width))"
38
+ on:change
39
+ {maxFiles}
37
40
  >
38
41
  <span
39
42
  slot="body"
@@ -115,7 +118,7 @@ function handleRemove(file) {
115
118
  var(--file-input-list-default-hover-color)
116
119
  );
117
120
  }
118
-
121
+
119
122
  .body-container {
120
123
  border: dotted;
121
124
  border-color: var(
@@ -128,7 +131,7 @@ function handleRemove(file) {
128
131
  );
129
132
  width: calc(100% - 20px);
130
133
  height: calc(100% - 20px);
131
- box-sizing: border-box;
134
+ box-sizing: border-box;
132
135
  margin: auto;
133
136
  position: relative;
134
137
  display: flex;
@@ -8,8 +8,12 @@ declare const __propDef: {
8
8
  persistOverUpload?: boolean | undefined;
9
9
  dropAreaActive?: boolean | undefined;
10
10
  icon?: string | undefined;
11
+ disabled?: boolean | undefined;
12
+ maxFiles?: number | undefined;
11
13
  };
12
14
  events: {
15
+ change: Event;
16
+ } & {
13
17
  [evt: string]: CustomEvent<any>;
14
18
  };
15
19
  slots: {};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@likable-hair/svelte",
3
3
  "description": "A Svelte component for likablehair and others",
4
- "version": "3.1.43",
4
+ "version": "3.1.45",
5
5
  "scripts": {
6
6
  "host": "vite --host",
7
7
  "dev": "vite dev",