ece-docs-components 1.0.105 → 1.0.106

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.
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var lib = {};
3
+ var cjs = {};
4
4
 
5
- exports.__exports = lib;
5
+ exports.__exports = cjs;
6
6
  //# sourceMappingURL=index8.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var cjs = {};
3
+ var lib = {};
4
4
 
5
- exports.__exports = cjs;
5
+ exports.__exports = lib;
6
6
  //# sourceMappingURL=index9.js.map
@@ -7,10 +7,10 @@ var styles = require('@mui/material/styles');
7
7
  var iconsMaterial = require('@mui/icons-material');
8
8
  var reactToastify = require('react-toastify');
9
9
 
10
- const HiddenInput = styles.styled('input')({
11
- display: 'none',
10
+ const HiddenInput = styles.styled("input")({
11
+ display: "none",
12
12
  });
13
- const FileUploadButton = ({ id, label = 'Upload File', accept, multiple = false, onFileSelect, variant = 'primary', size = 'md', }) => {
13
+ const FileUploadButton = ({ id, label = "Upload File", accept, multiple = false, onFileSelect, variant = "primary", size = "md", onError, maxSizeBytes = 25 * 1024 * 1024, sendToast = true, children, }) => {
14
14
  const handleFileChange = (event) => {
15
15
  const files = event.target.files;
16
16
  if (!files || files.length === 0) {
@@ -20,32 +20,43 @@ const FileUploadButton = ({ id, label = 'Upload File', accept, multiple = false,
20
20
  // If multiple, filter; if single, validate the first
21
21
  if (multiple) {
22
22
  const valid = [];
23
- for (const f of Array.from(files)) {
24
- if (f.size > (25 * 1024 * 1024))
25
- continue;
26
- valid.push(f);
23
+ const rejected = [];
24
+ for (const file of Array.from(files)) {
25
+ if (file.size > maxSizeBytes) {
26
+ rejected.push(file);
27
+ }
28
+ else {
29
+ valid.push(file);
30
+ }
31
+ }
32
+ if (rejected.length > 0) {
33
+ onError?.(rejected);
34
+ }
35
+ if (valid.length === 0) {
36
+ onFileSelect?.(null);
37
+ event.target.value = "";
38
+ return;
27
39
  }
28
40
  const dt = new DataTransfer();
29
41
  valid.forEach((f) => dt.items.add(f));
30
42
  onFileSelect?.(dt.files);
43
+ return;
31
44
  }
32
- else {
33
- const f = files[0];
34
- if (f.size > (25 * 1024 * 1024)) {
35
- // Notify user and abort selection
36
- // Example: toast.error('File exceeds 5MB');
37
- reactToastify.toast.error('File exceeds 25MB');
38
- onFileSelect?.(null);
39
- // Clear the input so user can reselect
40
- event.target.value = '';
41
- return;
45
+ const file = files[0];
46
+ if (file.size > maxSizeBytes) {
47
+ if (sendToast) {
48
+ reactToastify.toast.error("File exceeds 25MB");
42
49
  }
43
- onFileSelect?.(files);
50
+ onError?.([file]);
51
+ onFileSelect?.(null);
52
+ event.target.value = "";
53
+ return;
44
54
  }
55
+ onFileSelect?.(files);
45
56
  };
46
57
  const autoId = React.useId();
47
58
  const inputId = id || `file-upload-${autoId}`;
48
- return (jsxRuntime.jsxs("label", { htmlFor: inputId, children: [jsxRuntime.jsx(HiddenInput, { id: inputId, type: "file", accept: accept, multiple: multiple, onChange: handleFileChange }), jsxRuntime.jsxs(Button.Button, { component: "span", variant: variant, size: size, children: [jsxRuntime.jsx(iconsMaterial.FileUploadRounded, {}), label] })] }));
59
+ return (jsxRuntime.jsxs("label", { htmlFor: inputId, children: [jsxRuntime.jsx(HiddenInput, { id: inputId, type: "file", accept: accept, multiple: multiple, onChange: handleFileChange }), jsxRuntime.jsx(Button.Button, { component: "span", variant: variant, size: size, children: children ?? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(iconsMaterial.FileUploadRounded, {}), label] })) })] }));
49
60
  };
50
61
 
51
62
  exports.FileUploadButton = FileUploadButton;
@@ -1 +1 @@
1
- {"version":3,"file":"FileUploadButton.js","sources":["../../../../src/components/FileUploadButton.tsx"],"sourcesContent":["import React, { useId } from 'react';\r\nimport { Button } from './Button'; // Import your existing styled button component\r\nimport { styled } from '@mui/material/styles';\r\nimport { FileUploadRounded } from '@mui/icons-material';\r\nimport { toast } from 'react-toastify';\r\n\r\ninterface FileUploadButtonProps {\r\n id?: string;\r\n label?: string;\r\n accept?: string;\r\n multiple?: boolean;\r\n onFileSelect?: (files: FileList | null) => void;\r\n variant?: 'primary' | 'secondary' | 'outline' | 'marked-read' | 'mark-read' | 'danger';\r\n size?: 'sm' | 'md' | 'lg';\r\n}\r\n\r\nconst HiddenInput = styled('input')({\r\n display: 'none',\r\n});\r\n\r\nexport const FileUploadButton: React.FC<FileUploadButtonProps> = ({\r\n id,\r\n label = 'Upload File',\r\n accept,\r\n multiple = false,\r\n onFileSelect,\r\n variant = 'primary',\r\n size = 'md',\r\n}) => {\r\nconst handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = event.target.files;\r\n\r\n if (!files || files.length === 0) {\r\n onFileSelect?.(files);\r\n return;\r\n }\r\n\r\n // If multiple, filter; if single, validate the first\r\n if (multiple) {\r\n const valid: File[] = [];\r\n for (const f of Array.from(files)) {\r\n if ((25 * 1024 * 1024) && f.size > (25 * 1024 * 1024)) continue;\r\n valid.push(f);\r\n }\r\n const dt = new DataTransfer();\r\n valid.forEach((f) => dt.items.add(f));\r\n onFileSelect?.(dt.files);\r\n } else {\r\n const f = files[0];\r\n if ((25 * 1024 * 1024) && f.size > (25 * 1024 * 1024)) {\r\n // Notify user and abort selection\r\n // Example: toast.error('File exceeds 5MB');\r\n toast.error('File exceeds 25MB')\r\n onFileSelect?.(null);\r\n // Clear the input so user can reselect\r\n event.target.value = '';\r\n return;\r\n }\r\n onFileSelect?.(files);\r\n }\r\n };\r\n const autoId = useId(); \r\n const inputId = id || `file-upload-${autoId}`;\r\n return (\r\n <label htmlFor={inputId}>\r\n <HiddenInput\r\n id={inputId}\r\n type=\"file\"\r\n accept={accept}\r\n multiple={multiple}\r\n onChange={handleFileChange}\r\n />\r\n <Button\r\n component=\"span\"\r\n variant={variant}\r\n size={size}\r\n >\r\n <FileUploadRounded/>{label}\r\n </Button>\r\n </label>\r\n );\r\n};\r\n"],"names":["styled","toast","useId","_jsxs","_jsx","Button","FileUploadRounded"],"mappings":";;;;;;;;;AAgBA,MAAM,WAAW,GAAGA,aAAM,CAAC,OAAO,CAAC,CAAC;AAClC,IAAA,OAAO,EAAE,MAAM;AAChB,CAAA,CAAC;AAEK,MAAM,gBAAgB,GAAoC,CAAC,EAChE,EAAE,EACF,KAAK,GAAG,aAAa,EACrB,MAAM,EACN,QAAQ,GAAG,KAAK,EAChB,YAAY,EACZ,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,IAAI,GACZ,KAAI;AACL,IAAA,MAAM,gBAAgB,GAAG,CAAC,KAA0C,KAAI;AACpE,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK;QAEhC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAChC,YAAA,YAAY,GAAG,KAAK,CAAC;YACrB;QACF;;QAGA,IAAI,QAAQ,EAAE;YACZ,MAAM,KAAK,GAAW,EAAE;YACxB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACjC,gBAAA,IAA0B,CAAC,CAAC,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;oBAAE;AACvD,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACf;AACA,YAAA,MAAM,EAAE,GAAG,IAAI,YAAY,EAAE;AAC7B,YAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrC,YAAA,YAAY,GAAG,EAAE,CAAC,KAAK,CAAC;QAC1B;aAAO;AACL,YAAA,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YAClB,IAA0B,CAAC,CAAC,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE;;;AAGrD,gBAAAC,mBAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC;AAChC,gBAAA,YAAY,GAAG,IAAI,CAAC;;AAEpB,gBAAA,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;gBACvB;YACF;AACA,YAAA,YAAY,GAAG,KAAK,CAAC;QACvB;AACF,IAAA,CAAC;AACD,IAAA,MAAM,MAAM,GAAGC,WAAK,EAAE;AACtB,IAAA,MAAM,OAAO,GAAG,EAAE,IAAI,CAAA,YAAA,EAAe,MAAM,EAAE;IAC7C,QACEC,eAAA,CAAA,OAAA,EAAA,EAAO,OAAO,EAAE,OAAO,aACrBC,cAAA,CAAC,WAAW,EAAA,EACV,EAAE,EAAE,OAAO,EACX,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,gBAAgB,EAAA,CAC1B,EACFD,eAAA,CAACE,aAAM,EAAA,EACL,SAAS,EAAC,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EAAA,QAAA,EAAA,CAEVD,cAAA,CAACE,+BAAiB,EAAA,EAAA,CAAE,EAAC,KAAK,CAAA,EAAA,CACnB,CAAA,EAAA,CACH;AAEZ;;;;"}
1
+ {"version":3,"file":"FileUploadButton.js","sources":["../../../../src/components/FileUploadButton.tsx"],"sourcesContent":["import React, { useId } from \"react\";\r\nimport { Button } from \"./Button\"; // Import your existing styled button component\r\nimport { styled } from \"@mui/material/styles\";\r\nimport { FileUploadRounded } from \"@mui/icons-material\";\r\nimport { toast } from \"react-toastify\";\r\n\r\ninterface FileUploadButtonProps {\r\n id?: string;\r\n label?: string;\r\n accept?: string;\r\n multiple?: boolean;\r\n onFileSelect?: (files: FileList | null) => void;\r\n variant?:\r\n | \"primary\"\r\n | \"secondary\"\r\n | \"outline\"\r\n | \"marked-read\"\r\n | \"mark-read\"\r\n | \"danger\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n onError?: (files: File[]) => void;\r\n maxSizeBytes?: number;\r\n sendToast?: boolean;\r\n children?: React.ReactNode;\r\n}\r\n\r\nconst HiddenInput = styled(\"input\")({\r\n display: \"none\",\r\n});\r\n\r\nexport const FileUploadButton: React.FC<FileUploadButtonProps> = ({\r\n id,\r\n label = \"Upload File\",\r\n accept,\r\n multiple = false,\r\n onFileSelect,\r\n variant = \"primary\",\r\n size = \"md\",\r\n onError,\r\n maxSizeBytes = 25 * 1024 * 1024,\r\n sendToast = true,\r\n children,\r\n}) => {\r\n const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = event.target.files;\r\n\r\n if (!files || files.length === 0) {\r\n onFileSelect?.(files);\r\n return;\r\n }\r\n\r\n // If multiple, filter; if single, validate the first\r\n if (multiple) {\r\n const valid: File[] = [];\r\n const rejected: File[] = [];\r\n for (const file of Array.from(files)) {\r\n if (file.size > maxSizeBytes) {\r\n rejected.push(file);\r\n } else {\r\n valid.push(file);\r\n }\r\n }\r\n\r\n if (rejected.length > 0) {\r\n onError?.(rejected);\r\n }\r\n\r\n if (valid.length === 0) {\r\n onFileSelect?.(null);\r\n event.target.value = \"\";\r\n return;\r\n }\r\n\r\n const dt = new DataTransfer();\r\n valid.forEach((f) => dt.items.add(f));\r\n onFileSelect?.(dt.files);\r\n return;\r\n }\r\n\r\n const file = files[0];\r\n if (file.size > maxSizeBytes) {\r\n if (sendToast) {\r\n toast.error(\"File exceeds 25MB\");\r\n }\r\n onError?.([file]);\r\n onFileSelect?.(null);\r\n event.target.value = \"\";\r\n return;\r\n }\r\n onFileSelect?.(files);\r\n };\r\n const autoId = useId();\r\n const inputId = id || `file-upload-${autoId}`;\r\n return (\r\n <label htmlFor={inputId}>\r\n <HiddenInput\r\n id={inputId}\r\n type=\"file\"\r\n accept={accept}\r\n multiple={multiple}\r\n onChange={handleFileChange}\r\n />\r\n {/* Render child, if not defined render old style fix*/}\r\n <Button component=\"span\" variant={variant} size={size}>\r\n {children ?? (\r\n <>\r\n <FileUploadRounded />\r\n {label}\r\n </>\r\n )}\r\n </Button>\r\n </label>\r\n );\r\n};\r\n"],"names":["styled","toast","useId","_jsxs","_jsx","Button","_Fragment","FileUploadRounded"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('../../../_virtual/index4.js');
3
+ var index = require('../../../_virtual/index3.js');
4
4
  var index$1 = require('../../domelementtype/lib/index.js');
5
5
  var node = require('./node.js');
6
6
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('../../../_virtual/index8.js');
3
+ var index = require('../../../_virtual/index9.js');
4
4
  var stringify = require('./stringify.js');
5
5
  var traversal = require('./traversal.js');
6
6
  var manipulation = require('./manipulation.js');
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('../../../_virtual/index3.js');
3
+ var index = require('../../../_virtual/index4.js');
4
4
  var htmlToDom = require('./server/html-to-dom.js');
5
5
  var types = require('./types.js');
6
6
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('../../../_virtual/index9.js');
3
+ var index = require('../../../_virtual/index8.js');
4
4
  var index$1 = require('../../inline-style-parser/cjs/index.js');
5
5
 
6
6
  var hasRequiredCjs;
@@ -1,12 +1,16 @@
1
- import React from 'react';
1
+ import React from "react";
2
2
  interface FileUploadButtonProps {
3
3
  id?: string;
4
4
  label?: string;
5
5
  accept?: string;
6
6
  multiple?: boolean;
7
7
  onFileSelect?: (files: FileList | null) => void;
8
- variant?: 'primary' | 'secondary' | 'outline' | 'marked-read' | 'mark-read' | 'danger';
9
- size?: 'sm' | 'md' | 'lg';
8
+ variant?: "primary" | "secondary" | "outline" | "marked-read" | "mark-read" | "danger";
9
+ size?: "sm" | "md" | "lg";
10
+ onError?: (files: File[]) => void;
11
+ maxSizeBytes?: number;
12
+ sendToast?: boolean;
13
+ children?: React.ReactNode;
10
14
  }
11
15
  export declare const FileUploadButton: React.FC<FileUploadButtonProps>;
12
16
  export {};
@@ -1,14 +1,14 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { useId } from 'react';
3
3
  import { Button } from './Button.js';
4
4
  import { styled } from '@mui/material/styles';
5
5
  import { FileUploadRounded } from '@mui/icons-material';
6
6
  import { toast } from 'react-toastify';
7
7
 
8
- const HiddenInput = styled('input')({
9
- display: 'none',
8
+ const HiddenInput = styled("input")({
9
+ display: "none",
10
10
  });
11
- const FileUploadButton = ({ id, label = 'Upload File', accept, multiple = false, onFileSelect, variant = 'primary', size = 'md', }) => {
11
+ const FileUploadButton = ({ id, label = "Upload File", accept, multiple = false, onFileSelect, variant = "primary", size = "md", onError, maxSizeBytes = 25 * 1024 * 1024, sendToast = true, children, }) => {
12
12
  const handleFileChange = (event) => {
13
13
  const files = event.target.files;
14
14
  if (!files || files.length === 0) {
@@ -18,32 +18,43 @@ const FileUploadButton = ({ id, label = 'Upload File', accept, multiple = false,
18
18
  // If multiple, filter; if single, validate the first
19
19
  if (multiple) {
20
20
  const valid = [];
21
- for (const f of Array.from(files)) {
22
- if (f.size > (25 * 1024 * 1024))
23
- continue;
24
- valid.push(f);
21
+ const rejected = [];
22
+ for (const file of Array.from(files)) {
23
+ if (file.size > maxSizeBytes) {
24
+ rejected.push(file);
25
+ }
26
+ else {
27
+ valid.push(file);
28
+ }
29
+ }
30
+ if (rejected.length > 0) {
31
+ onError?.(rejected);
32
+ }
33
+ if (valid.length === 0) {
34
+ onFileSelect?.(null);
35
+ event.target.value = "";
36
+ return;
25
37
  }
26
38
  const dt = new DataTransfer();
27
39
  valid.forEach((f) => dt.items.add(f));
28
40
  onFileSelect?.(dt.files);
41
+ return;
29
42
  }
30
- else {
31
- const f = files[0];
32
- if (f.size > (25 * 1024 * 1024)) {
33
- // Notify user and abort selection
34
- // Example: toast.error('File exceeds 5MB');
35
- toast.error('File exceeds 25MB');
36
- onFileSelect?.(null);
37
- // Clear the input so user can reselect
38
- event.target.value = '';
39
- return;
43
+ const file = files[0];
44
+ if (file.size > maxSizeBytes) {
45
+ if (sendToast) {
46
+ toast.error("File exceeds 25MB");
40
47
  }
41
- onFileSelect?.(files);
48
+ onError?.([file]);
49
+ onFileSelect?.(null);
50
+ event.target.value = "";
51
+ return;
42
52
  }
53
+ onFileSelect?.(files);
43
54
  };
44
55
  const autoId = useId();
45
56
  const inputId = id || `file-upload-${autoId}`;
46
- return (jsxs("label", { htmlFor: inputId, children: [jsx(HiddenInput, { id: inputId, type: "file", accept: accept, multiple: multiple, onChange: handleFileChange }), jsxs(Button, { component: "span", variant: variant, size: size, children: [jsx(FileUploadRounded, {}), label] })] }));
57
+ return (jsxs("label", { htmlFor: inputId, children: [jsx(HiddenInput, { id: inputId, type: "file", accept: accept, multiple: multiple, onChange: handleFileChange }), jsx(Button, { component: "span", variant: variant, size: size, children: children ?? (jsxs(Fragment, { children: [jsx(FileUploadRounded, {}), label] })) })] }));
47
58
  };
48
59
 
49
60
  export { FileUploadButton };
@@ -1 +1 @@
1
- {"version":3,"file":"FileUploadButton.js","sources":["../../../../src/components/FileUploadButton.tsx"],"sourcesContent":["import React, { useId } from 'react';\r\nimport { Button } from './Button'; // Import your existing styled button component\r\nimport { styled } from '@mui/material/styles';\r\nimport { FileUploadRounded } from '@mui/icons-material';\r\nimport { toast } from 'react-toastify';\r\n\r\ninterface FileUploadButtonProps {\r\n id?: string;\r\n label?: string;\r\n accept?: string;\r\n multiple?: boolean;\r\n onFileSelect?: (files: FileList | null) => void;\r\n variant?: 'primary' | 'secondary' | 'outline' | 'marked-read' | 'mark-read' | 'danger';\r\n size?: 'sm' | 'md' | 'lg';\r\n}\r\n\r\nconst HiddenInput = styled('input')({\r\n display: 'none',\r\n});\r\n\r\nexport const FileUploadButton: React.FC<FileUploadButtonProps> = ({\r\n id,\r\n label = 'Upload File',\r\n accept,\r\n multiple = false,\r\n onFileSelect,\r\n variant = 'primary',\r\n size = 'md',\r\n}) => {\r\nconst handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = event.target.files;\r\n\r\n if (!files || files.length === 0) {\r\n onFileSelect?.(files);\r\n return;\r\n }\r\n\r\n // If multiple, filter; if single, validate the first\r\n if (multiple) {\r\n const valid: File[] = [];\r\n for (const f of Array.from(files)) {\r\n if ((25 * 1024 * 1024) && f.size > (25 * 1024 * 1024)) continue;\r\n valid.push(f);\r\n }\r\n const dt = new DataTransfer();\r\n valid.forEach((f) => dt.items.add(f));\r\n onFileSelect?.(dt.files);\r\n } else {\r\n const f = files[0];\r\n if ((25 * 1024 * 1024) && f.size > (25 * 1024 * 1024)) {\r\n // Notify user and abort selection\r\n // Example: toast.error('File exceeds 5MB');\r\n toast.error('File exceeds 25MB')\r\n onFileSelect?.(null);\r\n // Clear the input so user can reselect\r\n event.target.value = '';\r\n return;\r\n }\r\n onFileSelect?.(files);\r\n }\r\n };\r\n const autoId = useId(); \r\n const inputId = id || `file-upload-${autoId}`;\r\n return (\r\n <label htmlFor={inputId}>\r\n <HiddenInput\r\n id={inputId}\r\n type=\"file\"\r\n accept={accept}\r\n multiple={multiple}\r\n onChange={handleFileChange}\r\n />\r\n <Button\r\n component=\"span\"\r\n variant={variant}\r\n size={size}\r\n >\r\n <FileUploadRounded/>{label}\r\n </Button>\r\n </label>\r\n );\r\n};\r\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;AAgBA,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;AAClC,IAAA,OAAO,EAAE,MAAM;AAChB,CAAA,CAAC;AAEK,MAAM,gBAAgB,GAAoC,CAAC,EAChE,EAAE,EACF,KAAK,GAAG,aAAa,EACrB,MAAM,EACN,QAAQ,GAAG,KAAK,EAChB,YAAY,EACZ,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,IAAI,GACZ,KAAI;AACL,IAAA,MAAM,gBAAgB,GAAG,CAAC,KAA0C,KAAI;AACpE,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK;QAEhC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAChC,YAAA,YAAY,GAAG,KAAK,CAAC;YACrB;QACF;;QAGA,IAAI,QAAQ,EAAE;YACZ,MAAM,KAAK,GAAW,EAAE;YACxB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACjC,gBAAA,IAA0B,CAAC,CAAC,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;oBAAE;AACvD,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACf;AACA,YAAA,MAAM,EAAE,GAAG,IAAI,YAAY,EAAE;AAC7B,YAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrC,YAAA,YAAY,GAAG,EAAE,CAAC,KAAK,CAAC;QAC1B;aAAO;AACL,YAAA,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YAClB,IAA0B,CAAC,CAAC,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE;;;AAGrD,gBAAA,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC;AAChC,gBAAA,YAAY,GAAG,IAAI,CAAC;;AAEpB,gBAAA,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;gBACvB;YACF;AACA,YAAA,YAAY,GAAG,KAAK,CAAC;QACvB;AACF,IAAA,CAAC;AACD,IAAA,MAAM,MAAM,GAAG,KAAK,EAAE;AACtB,IAAA,MAAM,OAAO,GAAG,EAAE,IAAI,CAAA,YAAA,EAAe,MAAM,EAAE;IAC7C,QACEA,IAAA,CAAA,OAAA,EAAA,EAAO,OAAO,EAAE,OAAO,aACrBC,GAAA,CAAC,WAAW,EAAA,EACV,EAAE,EAAE,OAAO,EACX,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,gBAAgB,EAAA,CAC1B,EACFD,IAAA,CAAC,MAAM,EAAA,EACL,SAAS,EAAC,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EAAA,QAAA,EAAA,CAEVC,GAAA,CAAC,iBAAiB,EAAA,EAAA,CAAE,EAAC,KAAK,CAAA,EAAA,CACnB,CAAA,EAAA,CACH;AAEZ;;;;"}
1
+ {"version":3,"file":"FileUploadButton.js","sources":["../../../../src/components/FileUploadButton.tsx"],"sourcesContent":["import React, { useId } from \"react\";\r\nimport { Button } from \"./Button\"; // Import your existing styled button component\r\nimport { styled } from \"@mui/material/styles\";\r\nimport { FileUploadRounded } from \"@mui/icons-material\";\r\nimport { toast } from \"react-toastify\";\r\n\r\ninterface FileUploadButtonProps {\r\n id?: string;\r\n label?: string;\r\n accept?: string;\r\n multiple?: boolean;\r\n onFileSelect?: (files: FileList | null) => void;\r\n variant?:\r\n | \"primary\"\r\n | \"secondary\"\r\n | \"outline\"\r\n | \"marked-read\"\r\n | \"mark-read\"\r\n | \"danger\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n onError?: (files: File[]) => void;\r\n maxSizeBytes?: number;\r\n sendToast?: boolean;\r\n children?: React.ReactNode;\r\n}\r\n\r\nconst HiddenInput = styled(\"input\")({\r\n display: \"none\",\r\n});\r\n\r\nexport const FileUploadButton: React.FC<FileUploadButtonProps> = ({\r\n id,\r\n label = \"Upload File\",\r\n accept,\r\n multiple = false,\r\n onFileSelect,\r\n variant = \"primary\",\r\n size = \"md\",\r\n onError,\r\n maxSizeBytes = 25 * 1024 * 1024,\r\n sendToast = true,\r\n children,\r\n}) => {\r\n const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = event.target.files;\r\n\r\n if (!files || files.length === 0) {\r\n onFileSelect?.(files);\r\n return;\r\n }\r\n\r\n // If multiple, filter; if single, validate the first\r\n if (multiple) {\r\n const valid: File[] = [];\r\n const rejected: File[] = [];\r\n for (const file of Array.from(files)) {\r\n if (file.size > maxSizeBytes) {\r\n rejected.push(file);\r\n } else {\r\n valid.push(file);\r\n }\r\n }\r\n\r\n if (rejected.length > 0) {\r\n onError?.(rejected);\r\n }\r\n\r\n if (valid.length === 0) {\r\n onFileSelect?.(null);\r\n event.target.value = \"\";\r\n return;\r\n }\r\n\r\n const dt = new DataTransfer();\r\n valid.forEach((f) => dt.items.add(f));\r\n onFileSelect?.(dt.files);\r\n return;\r\n }\r\n\r\n const file = files[0];\r\n if (file.size > maxSizeBytes) {\r\n if (sendToast) {\r\n toast.error(\"File exceeds 25MB\");\r\n }\r\n onError?.([file]);\r\n onFileSelect?.(null);\r\n event.target.value = \"\";\r\n return;\r\n }\r\n onFileSelect?.(files);\r\n };\r\n const autoId = useId();\r\n const inputId = id || `file-upload-${autoId}`;\r\n return (\r\n <label htmlFor={inputId}>\r\n <HiddenInput\r\n id={inputId}\r\n type=\"file\"\r\n accept={accept}\r\n multiple={multiple}\r\n onChange={handleFileChange}\r\n />\r\n {/* Render child, if not defined render old style fix*/}\r\n <Button component=\"span\" variant={variant} size={size}>\r\n {children ?? (\r\n <>\r\n <FileUploadRounded />\r\n {label}\r\n </>\r\n )}\r\n </Button>\r\n </label>\r\n );\r\n};\r\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { __exports as lib } from '../../../_virtual/index4.js';
1
+ import { __exports as lib } from '../../../_virtual/index3.js';
2
2
  import { __require as requireLib$1 } from '../../domelementtype/lib/index.js';
3
3
  import { __require as requireNode } from './node.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { __exports as lib } from '../../../_virtual/index3.js';
1
+ import { __exports as lib } from '../../../_virtual/index4.js';
2
2
  import { __require as requireHtmlToDom } from './server/html-to-dom.js';
3
3
  import { __require as requireTypes } from './types.js';
4
4
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ece-docs-components",
3
- "version": "1.0.105",
3
+ "version": "1.0.106",
4
4
  "type": "module",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",