@limetech/lime-elements 37.11.3 → 37.11.4

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 (108) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/cjs/lime-elements.cjs.js +1 -1
  3. package/dist/cjs/limel-breadcrumbs_3.cjs.entry.js +14 -15
  4. package/dist/cjs/limel-breadcrumbs_3.cjs.entry.js.map +1 -1
  5. package/dist/cjs/{limel-file-dropzone.cjs.entry.js → limel-file-dropzone_2.cjs.entry.js} +97 -6
  6. package/dist/cjs/limel-file-dropzone_2.cjs.entry.js.map +1 -0
  7. package/dist/cjs/limel-file.cjs.entry.js +18 -115
  8. package/dist/cjs/limel-file.cjs.entry.js.map +1 -1
  9. package/dist/cjs/limel-picker.cjs.entry.js +218 -2
  10. package/dist/cjs/limel-picker.cjs.entry.js.map +1 -1
  11. package/dist/cjs/loader.cjs.js +1 -1
  12. package/dist/collection/components/file/file.css +1 -5
  13. package/dist/collection/components/file/file.js +18 -116
  14. package/dist/collection/components/file/file.js.map +1 -1
  15. package/dist/collection/components/menu/menu.js +14 -17
  16. package/dist/collection/components/menu/menu.js.map +1 -1
  17. package/dist/esm/{_arrayIncludesWith-8b8a8b46.js → _arrayIncludesWith-b9a433b0.js} +2 -2
  18. package/dist/esm/{_arrayIncludesWith-8b8a8b46.js.map → _arrayIncludesWith-b9a433b0.js.map} +1 -1
  19. package/dist/esm/{_baseForOwn-3dd6837f.js → _baseForOwn-c95521ce.js} +2 -2
  20. package/dist/esm/{_baseForOwn-3dd6837f.js.map → _baseForOwn-c95521ce.js.map} +1 -1
  21. package/dist/esm/{_baseIsEqual-633b7929.js → _baseIsEqual-69d97809.js} +2 -2
  22. package/dist/esm/{_baseIsEqual-633b7929.js.map → _baseIsEqual-69d97809.js.map} +1 -1
  23. package/dist/esm/{_baseIteratee-2b2723f9.js → _baseIteratee-11a1b266.js} +2 -2
  24. package/dist/esm/{_baseIteratee-2b2723f9.js.map → _baseIteratee-11a1b266.js.map} +1 -1
  25. package/dist/esm/{isEqual-d8fb9edc.js → isEqual-8daa0ea4.js} +2 -2
  26. package/dist/esm/{isEqual-d8fb9edc.js.map → isEqual-8daa0ea4.js.map} +1 -1
  27. package/dist/esm/lime-elements.js +1 -1
  28. package/dist/esm/limel-breadcrumbs_3.entry.js +14 -15
  29. package/dist/esm/limel-breadcrumbs_3.entry.js.map +1 -1
  30. package/dist/esm/limel-chip_2.entry.js +2 -2
  31. package/dist/esm/limel-dialog.entry.js +2 -2
  32. package/dist/esm/{limel-file-dropzone.entry.js → limel-file-dropzone_2.entry.js} +98 -8
  33. package/dist/esm/limel-file-dropzone_2.entry.js.map +1 -0
  34. package/dist/esm/limel-file.entry.js +19 -116
  35. package/dist/esm/limel-file.entry.js.map +1 -1
  36. package/dist/esm/limel-form.entry.js +6 -6
  37. package/dist/esm/limel-picker.entry.js +217 -1
  38. package/dist/esm/limel-picker.entry.js.map +1 -1
  39. package/dist/esm/limel-tab-bar.entry.js +3 -3
  40. package/dist/esm/limel-table.entry.js +4 -4
  41. package/dist/esm/loader.js +1 -1
  42. package/dist/esm/{pickBy-240917e2.js → pickBy-7e02d413.js} +3 -3
  43. package/dist/esm/{pickBy-240917e2.js.map → pickBy-7e02d413.js.map} +1 -1
  44. package/dist/lime-elements/lime-elements.esm.js +1 -1
  45. package/dist/lime-elements/lime-elements.esm.js.map +1 -1
  46. package/dist/lime-elements/p-042e5620.entry.js +16 -0
  47. package/dist/lime-elements/p-042e5620.entry.js.map +1 -0
  48. package/dist/lime-elements/p-160569a4.js +2 -0
  49. package/dist/lime-elements/{p-00064897.entry.js → p-1d7a37ce.entry.js} +5 -5
  50. package/dist/lime-elements/p-1d7a37ce.entry.js.map +1 -0
  51. package/dist/lime-elements/p-35859f0c.entry.js +2 -0
  52. package/dist/lime-elements/p-35859f0c.entry.js.map +1 -0
  53. package/dist/lime-elements/{p-cb91d37d.js → p-48ed11c0.js} +2 -2
  54. package/dist/lime-elements/{p-c5db5254.entry.js → p-6b4e5f5b.entry.js} +2 -2
  55. package/dist/lime-elements/p-6eb17fd8.js +2 -0
  56. package/dist/lime-elements/{p-aaf6dada.entry.js → p-6f76bc3c.entry.js} +2 -2
  57. package/dist/lime-elements/{p-ee405625.entry.js → p-7b48a33b.entry.js} +2 -2
  58. package/dist/lime-elements/{p-ce1c1f74.js → p-85f4296f.js} +2 -2
  59. package/dist/lime-elements/{p-b2439774.entry.js → p-91e67b12.entry.js} +2 -2
  60. package/dist/lime-elements/{p-2e9fe8fd.js → p-99f6893d.js} +2 -2
  61. package/dist/lime-elements/p-c5aff9c2.entry.js +2 -0
  62. package/dist/lime-elements/p-c5aff9c2.entry.js.map +1 -0
  63. package/dist/lime-elements/{p-f4d83226.js → p-cfef0bcd.js} +2 -2
  64. package/dist/lime-elements/{p-a20848fc.entry.js → p-fb44db4d.entry.js} +2 -2
  65. package/dist/lime-elements/{p-a20848fc.entry.js.map → p-fb44db4d.entry.js.map} +1 -1
  66. package/dist/types/components/file/file.d.ts +4 -22
  67. package/dist/types/components/menu/menu.d.ts +2 -4
  68. package/dist/types/components.d.ts +1 -1
  69. package/package.json +1 -1
  70. package/dist/cjs/files-dcef6c99.js +0 -44
  71. package/dist/cjs/files-dcef6c99.js.map +0 -1
  72. package/dist/cjs/index.es-75b5e7c4.js +0 -222
  73. package/dist/cjs/index.es-75b5e7c4.js.map +0 -1
  74. package/dist/cjs/limel-file-dropzone.cjs.entry.js.map +0 -1
  75. package/dist/cjs/limel-file-input.cjs.entry.js +0 -67
  76. package/dist/cjs/limel-file-input.cjs.entry.js.map +0 -1
  77. package/dist/esm/files-79d9caeb.js +0 -41
  78. package/dist/esm/files-79d9caeb.js.map +0 -1
  79. package/dist/esm/index.es-61c13ecf.js +0 -220
  80. package/dist/esm/index.es-61c13ecf.js.map +0 -1
  81. package/dist/esm/limel-file-dropzone.entry.js.map +0 -1
  82. package/dist/esm/limel-file-input.entry.js +0 -63
  83. package/dist/esm/limel-file-input.entry.js.map +0 -1
  84. package/dist/lime-elements/p-00064897.entry.js.map +0 -1
  85. package/dist/lime-elements/p-09cb3405.js +0 -2
  86. package/dist/lime-elements/p-09cb3405.js.map +0 -1
  87. package/dist/lime-elements/p-0c24c682.entry.js +0 -2
  88. package/dist/lime-elements/p-0c24c682.entry.js.map +0 -1
  89. package/dist/lime-elements/p-51ec4f02.js +0 -2
  90. package/dist/lime-elements/p-5def744e.js +0 -2
  91. package/dist/lime-elements/p-8d13a44f.entry.js +0 -2
  92. package/dist/lime-elements/p-8d13a44f.entry.js.map +0 -1
  93. package/dist/lime-elements/p-97107e34.js +0 -16
  94. package/dist/lime-elements/p-97107e34.js.map +0 -1
  95. package/dist/lime-elements/p-ec42b48f.entry.js +0 -2
  96. package/dist/lime-elements/p-ec42b48f.entry.js.map +0 -1
  97. package/dist/lime-elements/p-f358c948.entry.js +0 -2
  98. package/dist/lime-elements/p-f358c948.entry.js.map +0 -1
  99. /package/dist/lime-elements/{p-5def744e.js.map → p-160569a4.js.map} +0 -0
  100. /package/dist/lime-elements/{p-cb91d37d.js.map → p-48ed11c0.js.map} +0 -0
  101. /package/dist/lime-elements/{p-c5db5254.entry.js.map → p-6b4e5f5b.entry.js.map} +0 -0
  102. /package/dist/lime-elements/{p-51ec4f02.js.map → p-6eb17fd8.js.map} +0 -0
  103. /package/dist/lime-elements/{p-aaf6dada.entry.js.map → p-6f76bc3c.entry.js.map} +0 -0
  104. /package/dist/lime-elements/{p-ee405625.entry.js.map → p-7b48a33b.entry.js.map} +0 -0
  105. /package/dist/lime-elements/{p-ce1c1f74.js.map → p-85f4296f.js.map} +0 -0
  106. /package/dist/lime-elements/{p-b2439774.entry.js.map → p-91e67b12.entry.js.map} +0 -0
  107. /package/dist/lime-elements/{p-2e9fe8fd.js.map → p-99f6893d.js.map} +0 -0
  108. /package/dist/lime-elements/{p-f4d83226.js.map → p-cfef0bcd.js.map} +0 -0
@@ -1,12 +1,12 @@
1
- import { r as registerInstance, c as createEvent, h, H as Host } from './index-232e9616.js';
2
- import { c as createFileInfo, i as isTypeAccepted } from './files-79d9caeb.js';
3
- import { b as baseForOwn } from './_baseForOwn-3dd6837f.js';
1
+ import { r as registerInstance, c as createEvent, h, H as Host, g as getElement } from './index-232e9616.js';
2
+ import { g as getFileIcon, a as getFileExtensionTitle, b as getFileColor, c as getFileBackgroundColor } from './file-metadata-9a4780e2.js';
3
+ import { b as baseForOwn } from './_baseForOwn-c95521ce.js';
4
4
  import { b as isArrayLike } from './isArrayLike-385e0f31.js';
5
- import { b as baseIteratee } from './_baseIteratee-2b2723f9.js';
5
+ import { b as baseIteratee } from './_baseIteratee-11a1b266.js';
6
6
  import { i as isArray } from './isArray-80298bc7.js';
7
- import './file-metadata-9a4780e2.js';
7
+ import { c as createRandomString } from './random-string-812b1c35.js';
8
8
  import './get-icon-props-0b65f85e.js';
9
- import './_baseIsEqual-633b7929.js';
9
+ import './_baseIsEqual-69d97809.js';
10
10
  import './eq-c1c7f528.js';
11
11
  import './isObject-c74e273c.js';
12
12
  import './_getNative-93d6bfe9.js';
@@ -149,6 +149,42 @@ var partition = createAggregator(function(result, value, key) {
149
149
  result[key ? 0 : 1].push(value);
150
150
  }, function() { return [[], []]; });
151
151
 
152
+ function createFileInfo(file) {
153
+ const limeFile = {
154
+ id: crypto.randomUUID(),
155
+ filename: file.name,
156
+ contentType: file.type,
157
+ size: file.size,
158
+ fileContent: file,
159
+ };
160
+ limeFile.icon = {
161
+ name: getFileIcon(limeFile),
162
+ title: getFileExtensionTitle(limeFile),
163
+ color: getFileColor(limeFile),
164
+ backgroundColor: getFileBackgroundColor(limeFile),
165
+ };
166
+ return limeFile;
167
+ }
168
+ function isTypeAccepted(file, accept) {
169
+ if (accept === undefined || accept === '*') {
170
+ return true;
171
+ }
172
+ const acceptList = accept.split(',').map((raw) => raw.trim());
173
+ return acceptList.some((acceptedType) => {
174
+ if (acceptedType === file.contentType) {
175
+ return true;
176
+ }
177
+ if (acceptedType.endsWith('/*')) {
178
+ const baseType = acceptedType.split('/')[0];
179
+ return file.contentType.startsWith(`${baseType}/`);
180
+ }
181
+ if (acceptedType.startsWith('.')) {
182
+ const fileType = acceptedType.split('.')[1];
183
+ return file.contentType.endsWith(`/${fileType}`);
184
+ }
185
+ });
186
+ }
187
+
152
188
  const fileDropzoneCss = ":host(limel-file-dropzone){display:grid;position:relative}.has-file-to-drop{animation:display-drop-zone 0.6s ease forwards;box-sizing:border-box;isolation:isolate;z-index:1;position:absolute;inset:0.25rem;overflow:hidden;display:flex;justify-content:center;align-items:center;gap:0.5rem;color:rgb(var(--contrast-700));border:0.125rem dashed rgb(var(--color-cyan-light));border-radius:0.75rem}.text-helpertext{display:flex;flex-direction:column;justify-content:center;align-items:flex-start}.icon{width:clamp(2rem, 5vh, 7rem)}.text{font-size:clamp(1rem, 2vh, 1.75rem)}.helper-text{font-size:clamp(0.75rem, 1.5vh, 1rem)}@keyframes display-drop-zone{0%{background-color:rgb(var(--contrast-1100), 0);backdrop-filter:blur(0);-webkit-backdrop-filter:blur(0);scale:0.9;opacity:0}50%{scale:1;opacity:1}100%{background-color:rgb(var(--contrast-1100), 0.8);backdrop-filter:blur(0.25rem);-webkit-backdrop-filter:blur(0.25rem)}}";
153
189
 
154
190
  const FileDropzone = class {
@@ -211,6 +247,60 @@ const FileDropzone = class {
211
247
  };
212
248
  FileDropzone.style = fileDropzoneCss;
213
249
 
214
- export { FileDropzone as limel_file_dropzone };
250
+ const FileInput = class {
251
+ constructor(hostRef) {
252
+ registerInstance(this, hostRef);
253
+ this.filesSelected = createEvent(this, "filesSelected", 7);
254
+ this.fileInputId = createRandomString();
255
+ this.handleClick = (event) => {
256
+ if (this.disabled) {
257
+ event.stopPropagation();
258
+ event.preventDefault();
259
+ return;
260
+ }
261
+ this.triggerFileDialog();
262
+ event.stopPropagation();
263
+ };
264
+ this.handleKeyUp = (event) => {
265
+ event.stopPropagation();
266
+ event.preventDefault();
267
+ if (event.code === 'Enter') {
268
+ this.triggerFileDialog();
269
+ }
270
+ };
271
+ this.handleFileChange = (event) => {
272
+ const files = Array.from(this.fileInput.files);
273
+ if (files.length > 0) {
274
+ event.stopPropagation();
275
+ this.filesSelected.emit(files.map(createFileInfo));
276
+ this.fileInput.value = '';
277
+ }
278
+ };
279
+ this.accept = '*';
280
+ this.disabled = false;
281
+ this.multiple = false;
282
+ }
283
+ componentDidLoad() {
284
+ this.fileInput = this.element.shadowRoot.getElementById(this.fileInputId);
285
+ }
286
+ render() {
287
+ return (h(Host, { onClick: this.handleClick, onKeyUp: this.handleKeyUp, onKeyDown: this.handleKeyDown }, h("input", { hidden: true, id: this.fileInputId, onChange: this.handleFileChange, type: "file", accept: this.accept, disabled: this.disabled, multiple: this.multiple }), h("slot", null)));
288
+ }
289
+ handleKeyDown(event) {
290
+ if (event.code === 'Tab' ||
291
+ event.code === 'Backspace' ||
292
+ event.code === 'Enter') {
293
+ return;
294
+ }
295
+ event.preventDefault();
296
+ event.stopPropagation();
297
+ }
298
+ triggerFileDialog() {
299
+ this.fileInput.click();
300
+ }
301
+ get element() { return getElement(this); }
302
+ };
303
+
304
+ export { FileDropzone as limel_file_dropzone, FileInput as limel_file_input };
215
305
 
216
- //# sourceMappingURL=limel-file-dropzone.entry.js.map
306
+ //# sourceMappingURL=limel-file-dropzone_2.entry.js.map
@@ -0,0 +1 @@
1
+ {"file":"limel-file-dropzone.limel-file-input.entry.js","mappings":"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","names":[],"sources":["./node_modules/lodash-es/_arrayAggregator.js","./node_modules/lodash-es/_createBaseEach.js","./node_modules/lodash-es/_baseEach.js","./node_modules/lodash-es/_baseAggregator.js","./node_modules/lodash-es/_createAggregator.js","./node_modules/lodash-es/partition.js","./src/util/files.ts","./src/components/file-dropzone/file-dropzone.scss?tag=limel-file-dropzone&encapsulation=shadow","./src/components/file-dropzone/file-dropzone.tsx","./src/components/file-input/file-input.tsx"],"sourcesContent":["/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n}\n\nexport default arrayAggregator;\n","import isArrayLike from './isArrayLike.js';\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nexport default createBaseEach;\n","import baseForOwn from './_baseForOwn.js';\nimport createBaseEach from './_createBaseEach.js';\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nexport default baseEach;\n","import baseEach from './_baseEach.js';\n\n/**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n}\n\nexport default baseAggregator;\n","import arrayAggregator from './_arrayAggregator.js';\nimport baseAggregator from './_baseAggregator.js';\nimport baseIteratee from './_baseIteratee.js';\nimport isArray from './isArray.js';\n\n/**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\nfunction createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, baseIteratee(iteratee, 2), accumulator);\n };\n}\n\nexport default createAggregator;\n","import createAggregator from './_createAggregator.js';\n\n/**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, the second of which\n * contains elements `predicate` returns falsey for. The predicate is\n * invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true },\n * { 'user': 'pebbles', 'age': 1, 'active': false }\n * ];\n *\n * _.partition(users, function(o) { return o.active; });\n * // => objects for [['fred'], ['barney', 'pebbles']]\n *\n * // The `_.matches` iteratee shorthand.\n * _.partition(users, { 'age': 1, 'active': false });\n * // => objects for [['pebbles'], ['barney', 'fred']]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.partition(users, ['active', false]);\n * // => objects for [['barney', 'pebbles'], ['fred']]\n *\n * // The `_.property` iteratee shorthand.\n * _.partition(users, 'active');\n * // => objects for [['fred'], ['barney', 'pebbles']]\n */\nvar partition = createAggregator(function(result, value, key) {\n result[key ? 0 : 1].push(value);\n}, function() { return [[], []]; });\n\nexport default partition;\n","import { FileInfo } from '../global/shared-types/file.types';\nimport {\n getFileBackgroundColor,\n getFileColor,\n getFileExtensionTitle,\n getFileIcon,\n} from './file-metadata';\n\nexport function createFileInfo(file: File): FileInfo {\n const limeFile: FileInfo = {\n id: crypto.randomUUID(),\n filename: file.name,\n contentType: file.type,\n size: file.size,\n fileContent: file,\n };\n limeFile.icon = {\n name: getFileIcon(limeFile),\n title: getFileExtensionTitle(limeFile),\n color: getFileColor(limeFile),\n backgroundColor: getFileBackgroundColor(limeFile),\n };\n\n return limeFile;\n}\n\nexport function isTypeAccepted(file: FileInfo, accept?: string): boolean {\n if (accept === undefined || accept === '*') {\n return true;\n }\n\n const acceptList = accept.split(',').map((raw) => raw.trim());\n\n return acceptList.some((acceptedType: string) => {\n if (acceptedType === file.contentType) {\n return true;\n }\n\n if (acceptedType.endsWith('/*')) {\n const baseType = acceptedType.split('/')[0];\n\n return file.contentType.startsWith(`${baseType}/`);\n }\n\n if (acceptedType.startsWith('.')) {\n const fileType = acceptedType.split('.')[1];\n\n return file.contentType.endsWith(`/${fileType}`);\n }\n });\n}\n",":host(limel-file-dropzone) {\n display: grid;\n position: relative;\n}\n\n.has-file-to-drop {\n animation: display-drop-zone 0.6s ease forwards;\n\n box-sizing: border-box;\n isolation: isolate;\n z-index: 1;\n position: absolute;\n inset: 0.25rem;\n\n overflow: hidden;\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 0.5rem;\n\n color: rgb(var(--contrast-700));\n\n border: 0.125rem dashed rgb(var(--color-cyan-light));\n border-radius: 0.75rem;\n}\n\n.text-helpertext {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: flex-start;\n}\n\n.icon {\n width: clamp(2rem, 5vh, 7rem);\n}\n\n.text {\n font-size: clamp(1rem, 2vh, 1.75rem);\n}\n\n.helper-text {\n font-size: clamp(0.75rem, 1.5vh, 1rem);\n}\n\n@keyframes display-drop-zone {\n 0% {\n background-color: rgb(var(--contrast-1100), 0);\n backdrop-filter: blur(0);\n -webkit-backdrop-filter: blur(0);\n scale: 0.9;\n opacity: 0;\n }\n\n 50% {\n scale: 1;\n opacity: 1;\n }\n\n 100% {\n background-color: rgb(var(--contrast-1100), 0.8);\n backdrop-filter: blur(0.25rem);\n -webkit-backdrop-filter: blur(0.25rem);\n }\n}\n","import {\n Component,\n h,\n Event,\n EventEmitter,\n Host,\n Prop,\n State,\n} from '@stencil/core';\nimport { FileInfo } from '../../global/shared-types/file.types';\nimport { createFileInfo, isTypeAccepted } from '../../util/files';\nimport { partition } from 'lodash-es';\n\n/**\n * This component enables you to seamlessly convert any region of the user interface into\n * a file dropzone area, just by wrapping it inside the `limel-file-dropzone`.\n *\n * The file dropzone can then be used to allow end-users to upload files\n * by dragging and dropping them into the specified area, for example to trigger an upload process.\n *\n * After receiving the files, the component emits a `filesSelected` event. For unsupported\n * files (specified with the `accept` prop) a `filesRejected` event will be emitted.\n *\n * The event detail would be an array of `FileInfo` objects,\n * each representing a file dropped into the dropzone.\n *\n * @exampleComponent limel-example-file-dropzone\n * @exampleComponent limel-example-file-dropzone-type-filtering\n * @private\n */\n@Component({\n tag: 'limel-file-dropzone',\n shadow: true,\n styleUrl: 'file-dropzone.scss',\n})\nexport class FileDropzone {\n /**\n * Specifies the types of files that the dropzone will accept. By default, all file types are accepted.\n *\n * For media files, formats can be specified using: `audio/*`, `video/*`, `image/*`.\n * Unique file type specifiers can also be used, for example: `.jpg`, `.pdf`.\n * A comma-separated list of file extensions or MIME types is also acceptable, e.g., `image/png, image/jpeg` or\n * `.png, .jpg, .jpeg`.\n *\n * @see [HTML attribute: accept](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/accept) for more\n * details.\n */\n @Prop({ reflect: true })\n public accept: string = '*';\n\n /**\n * Set to `true` to disable the file dropzone.\n */\n @Prop()\n public disabled: boolean = false;\n\n /**\n * Is displayed when the user is dragging a file over the dropzone.\n * A suitable text could for instance be \"Drop your files here\".\n */\n @Prop()\n public text: string;\n\n /**\n * Is displayed to provide supplementary information to the end users,\n * for instance, which filetypes or file sizes are accepted.\n */\n @Prop()\n public helperText?: string = '';\n\n /**\n * Sets to true when there is a file to drop\n */\n @State()\n private hasFileToDrop: boolean = false;\n\n /**\n * Emitted when files are selected\n */\n @Event()\n filesSelected: EventEmitter<FileInfo[]>;\n\n /**\n * Emitted when files are selected but do not conform with the `accept` property specifications.\n * This can happen when the file types or formats of the selected files are not among the ones allowed by the dropzone,\n * as defined by the `accept` property.\n *\n * @see `accept` for details on how to specify acceptable file types.\n */\n @Event()\n filesRejected: EventEmitter<FileInfo[]>;\n\n public render() {\n return (\n <Host\n onDrop={this.handleDrop}\n onDragOver={this.handleDragOver}\n onDragLeave={this.handleDragLeave}\n >\n <slot />\n {this.renderOnDragLayout()}\n </Host>\n );\n }\n\n private renderOnDragLayout = () => {\n if (this.disabled || !this.hasFileToDrop) {\n return;\n }\n\n return (\n <div class=\"has-file-to-drop\">\n <limel-icon class=\"icon\" name=\"upload_2\" />\n <div class=\"text-helpertext\">\n {this.renderText()}\n {this.renderHelperText()}\n </div>\n </div>\n );\n };\n\n private renderText = () => {\n if (!this.text) {\n return;\n }\n\n return <span class=\"text\">{this.text}</span>;\n };\n\n private renderHelperText = () => {\n if (!this.helperText) {\n return;\n }\n\n return <span class=\"helper-text\">{this.helperText}</span>;\n };\n\n private handleDrop = (event: DragEvent) => {\n event.stopPropagation();\n event.preventDefault();\n this.hasFileToDrop = false;\n\n if (this.disabled) {\n return;\n }\n\n const files: File[] = Array.from(event.dataTransfer.files);\n const fileInfos: FileInfo[] = files.map(createFileInfo);\n\n const [acceptedFileInfos, rejectedFileInfos] = partition(\n fileInfos,\n (file) => isTypeAccepted(file, this.accept),\n );\n\n if (acceptedFileInfos.length > 0) {\n this.filesSelected.emit(acceptedFileInfos);\n }\n\n if (rejectedFileInfos.length > 0) {\n this.filesRejected.emit(rejectedFileInfos);\n }\n };\n\n private handleDragOver = (event: DragEvent) => {\n this.hasFileToDrop = true;\n event.preventDefault();\n };\n\n private handleDragLeave = (event: DragEvent) => {\n this.hasFileToDrop = false;\n event.preventDefault();\n };\n}\n","import {\n h,\n Event,\n EventEmitter,\n Host,\n Component,\n Element,\n Prop,\n} from '@stencil/core';\nimport { createRandomString } from '../../util/random-string';\nimport { FileInfo } from '../../global/shared-types/file.types';\nimport { createFileInfo } from '../../util/files';\n\n/**\n * This component enables you to seamlessly transform any other clickable component that\n * generates a `click` event into a file input selector.\n *\n * To use it, just wrap any clickable component inside the `limel-file-input` component.\n * Upon reception of the `click` event this component will open the native file selection\n * dialog.\n *\n * After receiving the files, the component emits a `filesSelected` event.\n *\n * The event detail would be an array of `FileInfo` objects,\n * each representing a file dropped into the dropzone.\n *\n * @exampleComponent limel-example-file-input\n * @exampleComponent limel-example-file-input-type-filtering\n * @private\n */\n@Component({\n tag: 'limel-file-input',\n shadow: true,\n})\nexport class FileInput {\n /**\n * Specifies the types of files that the dropzone will accept. By default, all file types are accepted.\n *\n * For media files, formats can be specified using: `audio/*`, `video/*`, `image/*`.\n * Unique file type specifiers can also be used, for example: `.jpg`, `.pdf`.\n * A comma-separated list of file extensions or MIME types is also acceptable, e.g., `image/png, image/jpeg` or\n * `.png, .jpg, .jpeg`.\n *\n * @see [HTML attribute: accept](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/accept) for more\n * details.\n */\n @Prop({ reflect: true })\n public accept: string = '*';\n\n /**\n * Set to `true` to disable file input selection.\n */\n @Prop({ reflect: true })\n public disabled: boolean = false;\n\n /**\n * Set to `true` to enable selection of multiple files\n */\n @Prop({ reflect: true })\n public multiple: boolean = false;\n\n /**\n * Emitted when files are selected\n */\n @Event()\n filesSelected: EventEmitter<FileInfo[]>;\n\n @Element()\n private element: HTMLLimelFileElement;\n\n private fileInput: HTMLInputElement;\n private fileInputId = createRandomString();\n\n public componentDidLoad() {\n this.fileInput = this.element.shadowRoot.getElementById(\n this.fileInputId,\n ) as HTMLInputElement;\n }\n\n public render() {\n return (\n <Host\n onClick={this.handleClick}\n onKeyUp={this.handleKeyUp}\n onKeyDown={this.handleKeyDown}\n >\n <input\n hidden={true}\n id={this.fileInputId}\n onChange={this.handleFileChange}\n type=\"file\"\n accept={this.accept}\n disabled={this.disabled}\n multiple={this.multiple}\n />\n <slot />\n </Host>\n );\n }\n\n private handleClick = (event: Event) => {\n if (this.disabled) {\n event.stopPropagation();\n event.preventDefault();\n\n return;\n }\n\n this.triggerFileDialog();\n\n event.stopPropagation();\n };\n\n private handleKeyUp = (event: KeyboardEvent) => {\n event.stopPropagation();\n event.preventDefault();\n\n if (event.code === 'Enter') {\n this.triggerFileDialog();\n }\n };\n\n private handleKeyDown(event: KeyboardEvent) {\n if (\n event.code === 'Tab' ||\n event.code === 'Backspace' ||\n event.code === 'Enter'\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n }\n\n private triggerFileDialog() {\n this.fileInput.click();\n }\n\n private handleFileChange = (event: Event) => {\n const files = Array.from(this.fileInput.files);\n if (files.length > 0) {\n event.stopPropagation();\n this.filesSelected.emit(files.map(createFileInfo));\n this.fileInput.value = '';\n }\n };\n}\n"],"version":3}
@@ -1,17 +1,10 @@
1
- import { r as registerInstance, c as createEvent, h, g as getElement } from './index-232e9616.js';
1
+ import { r as registerInstance, c as createEvent, h } from './index-232e9616.js';
2
2
  import { t as translate } from './translations-dea847ae.js';
3
- import { c as createRandomString } from './random-string-812b1c35.js';
4
3
  import { g as getFileIcon, a as getFileExtensionTitle, b as getFileColor, c as getFileBackgroundColor } from './file-metadata-9a4780e2.js';
5
- import { M as MDCTextField } from './component-58f68f3e.js';
6
4
  import './get-icon-props-0b65f85e.js';
7
- import './component-8b6ce3e9.js';
8
- import './component-f972b8db.js';
9
- import './ponyfill-30263d5e.js';
10
- import './component-fc0a08f6.js';
11
5
 
12
- const fileCss = ":host{--icon-background-color:rgb(var(--contrast-400));--icon-color:rgb(var(--contrast-1100))}";
6
+ const fileCss = "";
13
7
 
14
- const CHIP_SET_TAG_NAME = 'limel-chip-set';
15
8
  const DEFAULT_FILE_CHIP = {
16
9
  id: null,
17
10
  text: null,
@@ -22,26 +15,20 @@ const File = class {
22
15
  registerInstance(this, hostRef);
23
16
  this.change = createEvent(this, "change", 7);
24
17
  this.interact = createEvent(this, "interact", 7);
25
- this.fileInputId = createRandomString();
26
- this.handleDragEnter = (event) => {
27
- this.isDraggingOverDropZone = true;
18
+ this.handleNewFiles = (event) => {
28
19
  this.preventAndStop(event);
20
+ this.change.emit(event.detail[0]);
29
21
  };
30
- this.handleDragLeave = () => {
31
- this.isDraggingOverDropZone = false;
22
+ this.handleChipSetChange = (event) => {
23
+ event.stopPropagation();
24
+ const file = !event.detail.length ? event.detail[0] : null;
25
+ if (!file) {
26
+ this.change.emit(file);
27
+ }
32
28
  };
33
- this.handleFileDrop = (event) => {
29
+ this.handleChipInteract = (event) => {
34
30
  this.preventAndStop(event);
35
- this.isDraggingOverDropZone = false;
36
- const dataTransfer = event.dataTransfer;
37
- this.handleFile(dataTransfer.files[0]);
38
- };
39
- this.handleClick = (event) => {
40
- if (event && 'Lime' in event && event.Lime.chip) {
41
- // This is a click on a chip, so we don't need to do anything here.
42
- return;
43
- }
44
- this.handleFileSelection(event);
31
+ this.interact.emit(event.detail.id);
45
32
  };
46
33
  this.value = undefined;
47
34
  this.label = undefined;
@@ -51,45 +38,11 @@ const File = class {
51
38
  this.invalid = false;
52
39
  this.accept = '*';
53
40
  this.language = 'en';
54
- this.isDraggingOverDropZone = false;
55
- this.handleFileSelection = this.handleFileSelection.bind(this);
56
- this.handleFileChange = this.handleFileChange.bind(this);
57
- this.handleChipSetChange = this.handleChipSetChange.bind(this);
58
- this.handleFileDrop = this.handleFileDrop.bind(this);
59
- this.handleKeyDown = this.handleKeyDown.bind(this);
60
- this.handleKeyUp = this.handleKeyUp.bind(this);
61
- this.handleChipInteract = this.handleChipInteract.bind(this);
62
- }
63
- connectedCallback() {
64
- this.initialize();
65
- }
66
- componentDidLoad() {
67
- this.fileInput = this.element.shadowRoot.getElementById(this.fileInputId);
68
- this.chipSet = this.element.shadowRoot.querySelector(CHIP_SET_TAG_NAME);
69
- this.initialize();
70
- }
71
- initialize() {
72
- if (!this.chipSet) {
73
- return;
74
- }
75
- this.mdcTextField = new MDCTextField(this.chipSet.shadowRoot.querySelector('.mdc-text-field'));
76
- }
77
- disconnectedCallback() {
78
- if (this.mdcTextField) {
79
- this.mdcTextField.destroy();
80
- }
81
41
  }
82
42
  render() {
83
- return [
84
- h("input", { hidden: true, id: this.fileInputId, onChange: this.handleFileChange, type: "file", accept: this.accept, disabled: this.disabled || this.readonly }),
85
- h("limel-chip-set", { class: {
86
- 'is-file-picker': true,
87
- 'shows-dropzone': true,
88
- 'highlight-dropzone': this.isDraggingOverDropZone,
89
- }, disabled: this.disabled, readonly: this.readonly, invalid: this.invalid, label: this.label, leadingIcon: "upload_to_cloud", language: this.language, onChange: this.handleChipSetChange, onClick: this.handleClick, onInteract: this.handleChipInteract, onKeyDown: this.handleKeyDown, onKeyUp: this.handleKeyUp, required: this.required, type: "input", value: this.chipArray, title: this.getTranslation('drag-and-drop-tips'), onDragEnter: this.handleDragEnter, onDragOver: this.preventAndStop, onDragLeave: this.handleDragLeave, onDrop: this.handleFileDrop }),
90
- ];
43
+ return (h("limel-file-dropzone", { disabled: this.disabled || this.readonly || !!this.value, accept: this.accept, onFilesSelected: this.handleNewFiles }, this.renderChipset()));
91
44
  }
92
- get chipArray() {
45
+ getChipArray() {
93
46
  if (!this.value) {
94
47
  return [];
95
48
  }
@@ -102,61 +55,12 @@ const File = class {
102
55
  }, href: this.value.href }),
103
56
  ];
104
57
  }
105
- handleKeyDown(event) {
106
- if (event.code === 'Tab' ||
107
- event.code === 'Backspace' ||
108
- event.code === 'Enter') {
109
- return;
110
- }
111
- event.preventDefault();
112
- event.stopPropagation();
113
- }
114
- handleKeyUp(event) {
115
- if (event.code === 'Enter' && !this.value) {
116
- this.fileInput.click();
58
+ renderChipset() {
59
+ const chipset = (h("limel-chip-set", { disabled: this.disabled, readonly: this.readonly, invalid: this.invalid, label: this.label, leadingIcon: "upload_to_cloud", language: this.language, onChange: this.handleChipSetChange, onInteract: this.handleChipInteract, required: this.required, type: "input", value: this.getChipArray(), title: this.getTranslation('drag-and-drop-tips') }));
60
+ if (this.value) {
61
+ return chipset;
117
62
  }
118
- }
119
- handleFileSelection(event) {
120
- event.stopPropagation();
121
- event.preventDefault();
122
- if (!this.value) {
123
- this.fileInput.click();
124
- }
125
- }
126
- handleFileChange(event) {
127
- if (this.fileInput.files.length > 0) {
128
- event.stopPropagation();
129
- this.handleFile(this.fileInput.files[0]);
130
- }
131
- }
132
- handleFile(file) {
133
- const limeFile = {
134
- id: createRandomString(),
135
- filename: file.name,
136
- contentType: file.type,
137
- size: file.size,
138
- fileContent: file,
139
- };
140
- this.change.emit(limeFile);
141
- this.chipSet.blur();
142
- this.mdcTextField.valid = true;
143
- }
144
- handleChipSetChange(event) {
145
- event.stopPropagation();
146
- const file = !event.detail.length ? event.detail[0] : null;
147
- this.chipSet.blur();
148
- if (!file) {
149
- this.fileInput.value = '';
150
- this.change.emit(file);
151
- if (this.required) {
152
- this.mdcTextField.valid = false;
153
- }
154
- }
155
- }
156
- handleChipInteract(event) {
157
- event.stopPropagation();
158
- event.preventDefault();
159
- this.interact.emit(event.detail.id);
63
+ return (h("limel-file-input", { accept: this.accept, disabled: this.disabled || this.readonly }, chipset));
160
64
  }
161
65
  preventAndStop(event) {
162
66
  event.stopPropagation();
@@ -165,7 +69,6 @@ const File = class {
165
69
  getTranslation(key) {
166
70
  return translate.get(`file.${key}`, this.language);
167
71
  }
168
- get element() { return getElement(this); }
169
72
  };
170
73
  File.style = fileCss;
171
74
 
@@ -1 +1 @@
1
- {"file":"limel-file.entry.js","mappings":"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","names":[],"sources":["./src/components/file/file.scss?tag=limel-file&encapsulation=shadow","./src/components/file/file.tsx"],"sourcesContent":["/**\n * @prop --icon-background-color: Background color of the icon. Defaults to `--contrast-400`.\n * @prop --icon-color: Color of the icon. Defaults to `--contrast-1100`.\n */\n\n:host {\n --icon-background-color: rgb(var(--contrast-400));\n --icon-color: rgb(var(--contrast-1100));\n}\n","import translate from '../../global/translations';\nimport { Chip } from '../chip-set/chip.types';\nimport { Languages } from '../date-picker/date.types';\nimport { MDCTextField } from '@material/textfield';\nimport {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Prop,\n State,\n} from '@stencil/core';\nimport { createRandomString } from '../../util/random-string';\nimport {\n getFileBackgroundColor,\n getFileColor,\n getFileExtensionTitle,\n getFileIcon,\n} from '../../util/file-metadata';\nimport { FileInfo } from '../../global/shared-types/file.types';\n\nconst CHIP_SET_TAG_NAME = 'limel-chip-set';\nconst DEFAULT_FILE_CHIP: Chip = {\n id: null,\n text: null,\n removable: true,\n};\n\n/**\n * This component lets end-users select a *single* file from their device\n * storage. Regardless of the user's device or operating system, this component\n * opens up a file picker dialog that allows the user to choose a file.\n *\n * ## Using correct labels\n *\n * This file picker can be used in different contexts. The component's distinct\n * visual design including the upload icon hints end-users that this is not a\n * normal input field like other fields in the form for example.\n *\n * :::important\n * you need to use a descriptive `label` that clarifies the\n * functionality of the file picker, and/or provides users with clear\n * instructions.\n *\n * Depending on the context, you may need to avoid labels such as:\n * - File\n * - Document\n *\n * and instead consider using labels like:\n * - Attach a file\n * - Upload a file\n * - Choose a document\n * - Choose a file\n *\n * and similar phrases...\n * :::\n *\n * @exampleComponent limel-example-file\n * @exampleComponent limel-example-file-custom-icon\n * @exampleComponent limel-example-file-accepted-types\n * @exampleComponent limel-example-file-composite\n */\n@Component({\n tag: 'limel-file',\n shadow: true,\n styleUrl: 'file.scss',\n})\nexport class File {\n /**\n * The selected file.\n */\n @Prop()\n public value: FileInfo;\n\n /**\n * The input label.\n */\n @Prop({ reflect: true })\n public label: string;\n\n /**\n * Set to `true` to indicate that the field is required.\n */\n @Prop({ reflect: true })\n public required: boolean = false;\n\n /**\n * True if the input should be disabled\n */\n @Prop({ reflect: true })\n public disabled: boolean = false;\n\n /**\n * Set to `true` to disable adding and removing files, but allow interaction\n * with any already existing file.\n */\n @Prop({ reflect: true })\n public readonly: boolean = false;\n\n /**\n * Set to `true` to indicate that the current value of the chosen file is\n * invalid.\n */\n @Prop({ reflect: true })\n public invalid = false;\n\n /**\n * The [accepted file types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#unique_file_type_specifiers)\n */\n @Prop({ reflect: true })\n public accept: string = '*';\n\n /**\n * Defines the localisation for translations.\n */\n @Prop()\n public language: Languages = 'en';\n\n /**\n * Dispatched when a file is selected/deselected\n */\n @Event()\n private change: EventEmitter<FileInfo>;\n\n /**\n * Dispatched when clicking on a chip\n */\n @Event()\n private interact: EventEmitter<number | string>;\n\n @Element()\n private element: HTMLLimelFileElement;\n\n @State()\n private isDraggingOverDropZone = false;\n\n private fileInput: HTMLInputElement;\n private fileInputId = createRandomString();\n private chipSet;\n private mdcTextField;\n\n constructor() {\n this.handleFileSelection = this.handleFileSelection.bind(this);\n this.handleFileChange = this.handleFileChange.bind(this);\n this.handleChipSetChange = this.handleChipSetChange.bind(this);\n this.handleFileDrop = this.handleFileDrop.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleKeyUp = this.handleKeyUp.bind(this);\n this.handleChipInteract = this.handleChipInteract.bind(this);\n }\n\n public connectedCallback() {\n this.initialize();\n }\n\n public componentDidLoad() {\n this.fileInput = this.element.shadowRoot.getElementById(\n this.fileInputId,\n ) as HTMLInputElement;\n this.chipSet = this.element.shadowRoot.querySelector(CHIP_SET_TAG_NAME);\n this.initialize();\n }\n\n private initialize() {\n if (!this.chipSet) {\n return;\n }\n\n this.mdcTextField = new MDCTextField(\n this.chipSet.shadowRoot.querySelector('.mdc-text-field'),\n );\n }\n\n public disconnectedCallback() {\n if (this.mdcTextField) {\n this.mdcTextField.destroy();\n }\n }\n\n public render() {\n return [\n <input\n hidden={true}\n id={this.fileInputId}\n onChange={this.handleFileChange}\n type=\"file\"\n accept={this.accept}\n disabled={this.disabled || this.readonly}\n />,\n <limel-chip-set\n class={{\n 'is-file-picker': true,\n 'shows-dropzone': true,\n 'highlight-dropzone': this.isDraggingOverDropZone,\n }}\n disabled={this.disabled}\n readonly={this.readonly}\n invalid={this.invalid}\n label={this.label}\n leadingIcon=\"upload_to_cloud\"\n language={this.language}\n onChange={this.handleChipSetChange}\n onClick={this.handleClick}\n onInteract={this.handleChipInteract}\n onKeyDown={this.handleKeyDown}\n onKeyUp={this.handleKeyUp}\n required={this.required}\n type=\"input\"\n value={this.chipArray}\n title={this.getTranslation('drag-and-drop-tips')}\n onDragEnter={this.handleDragEnter}\n onDragOver={this.preventAndStop}\n onDragLeave={this.handleDragLeave}\n onDrop={this.handleFileDrop}\n />,\n ];\n }\n\n private handleDragEnter = (event: DragEvent) => {\n this.isDraggingOverDropZone = true;\n this.preventAndStop(event);\n };\n\n private handleDragLeave = () => {\n this.isDraggingOverDropZone = false;\n };\n\n private handleFileDrop = (event: DragEvent) => {\n this.preventAndStop(event);\n this.isDraggingOverDropZone = false;\n const dataTransfer = event.dataTransfer;\n this.handleFile(dataTransfer.files[0]);\n };\n\n private get chipArray() {\n if (!this.value) {\n return [];\n }\n\n return [\n {\n ...DEFAULT_FILE_CHIP,\n text: this.value.filename,\n id: this.value.id,\n icon: {\n name: getFileIcon(this.value),\n title: getFileExtensionTitle(this.value),\n color: getFileColor(this.value),\n backgroundColor: getFileBackgroundColor(this.value),\n },\n href: this.value.href,\n },\n ];\n }\n\n private handleKeyDown(event: KeyboardEvent) {\n if (\n event.code === 'Tab' ||\n event.code === 'Backspace' ||\n event.code === 'Enter'\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n }\n\n private handleKeyUp(event: KeyboardEvent) {\n if (event.code === 'Enter' && !this.value) {\n this.fileInput.click();\n }\n }\n\n private handleClick = (event: Event) => {\n if (event && 'Lime' in event && (event.Lime as any).chip) {\n // This is a click on a chip, so we don't need to do anything here.\n return;\n }\n\n this.handleFileSelection(event);\n };\n\n private handleFileSelection(event: Event) {\n event.stopPropagation();\n event.preventDefault();\n if (!this.value) {\n this.fileInput.click();\n }\n }\n\n private handleFileChange(event: Event) {\n if (this.fileInput.files.length > 0) {\n event.stopPropagation();\n this.handleFile(this.fileInput.files[0]);\n }\n }\n\n private handleFile(file) {\n const limeFile: FileInfo = {\n id: createRandomString(),\n filename: file.name,\n contentType: file.type,\n size: file.size,\n fileContent: file,\n };\n this.change.emit(limeFile);\n this.chipSet.blur();\n this.mdcTextField.valid = true;\n }\n\n private handleChipSetChange(event: CustomEvent) {\n event.stopPropagation();\n const file = !event.detail.length ? event.detail[0] : null;\n this.chipSet.blur();\n if (!file) {\n this.fileInput.value = '';\n this.change.emit(file);\n if (this.required) {\n this.mdcTextField.valid = false;\n }\n }\n }\n\n private handleChipInteract(event: CustomEvent<Chip>) {\n event.stopPropagation();\n event.preventDefault();\n this.interact.emit(event.detail.id);\n }\n\n private preventAndStop(event: Event) {\n event.stopPropagation();\n event.preventDefault();\n }\n\n private getTranslation(key: string) {\n return translate.get(`file.${key}`, this.language);\n }\n}\n"],"version":3}
1
+ {"file":"limel-file.entry.js","mappings":"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","names":[],"sources":["./src/components/file/file.scss?tag=limel-file&encapsulation=shadow","./src/components/file/file.tsx"],"sourcesContent":["/**\n * @prop --icon-background-color: Background color of the icon. Defaults to `--contrast-400`.\n * @prop --icon-color: Color of the icon. Defaults to `--contrast-1100`.\n */\n","import translate from '../../global/translations';\nimport { Chip } from '../chip-set/chip.types';\nimport { Languages } from '../date-picker/date.types';\nimport { Component, Event, EventEmitter, h, Prop } from '@stencil/core';\nimport {\n getFileBackgroundColor,\n getFileColor,\n getFileExtensionTitle,\n getFileIcon,\n} from '../../util/file-metadata';\nimport { FileInfo } from '../../global/shared-types/file.types';\n\nconst DEFAULT_FILE_CHIP: Chip = {\n id: null,\n text: null,\n removable: true,\n};\n\n/**\n * This component lets end-users select a *single* file from their device\n * storage. Regardless of the user's device or operating system, this component\n * opens up a file picker dialog that allows the user to choose a file.\n *\n * ## Using correct labels\n *\n * This file picker can be used in different contexts. The component's distinct\n * visual design including the upload icon hints end-users that this is not a\n * normal input field like other fields in the form for example.\n *\n * :::important\n * you need to use a descriptive `label` that clarifies the\n * functionality of the file picker, and/or provides users with clear\n * instructions.\n *\n * Depending on the context, you may need to avoid labels such as:\n * - File\n * - Document\n *\n * and instead consider using labels like:\n * - Attach a file\n * - Upload a file\n * - Choose a document\n * - Choose a file\n *\n * and similar phrases...\n * :::\n *\n * @exampleComponent limel-example-file\n * @exampleComponent limel-example-file-custom-icon\n * @exampleComponent limel-example-file-accepted-types\n * @exampleComponent limel-example-file-composite\n */\n@Component({\n tag: 'limel-file',\n shadow: true,\n styleUrl: 'file.scss',\n})\nexport class File {\n /**\n * The selected file.\n */\n @Prop()\n public value: FileInfo;\n\n /**\n * The input label.\n */\n @Prop({ reflect: true })\n public label: string;\n\n /**\n * Set to `true` to indicate that the field is required.\n */\n @Prop({ reflect: true })\n public required: boolean = false;\n\n /**\n * True if the input should be disabled\n */\n @Prop({ reflect: true })\n public disabled: boolean = false;\n\n /**\n * Set to `true` to disable adding and removing files, but allow interaction\n * with any already existing file.\n */\n @Prop({ reflect: true })\n public readonly: boolean = false;\n\n /**\n * Set to `true` to indicate that the current value of the chosen file is\n * invalid.\n */\n @Prop({ reflect: true })\n public invalid = false;\n\n /**\n * The [accepted file types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#unique_file_type_specifiers)\n */\n @Prop({ reflect: true })\n public accept: string = '*';\n\n /**\n * Defines the localisation for translations.\n */\n @Prop()\n public language: Languages = 'en';\n\n /**\n * Dispatched when a file is selected/deselected\n */\n @Event()\n private change: EventEmitter<FileInfo>;\n\n /**\n * Dispatched when clicking on a chip\n */\n @Event()\n private interact: EventEmitter<number | string>;\n\n public render() {\n return (\n <limel-file-dropzone\n disabled={this.disabled || this.readonly || !!this.value}\n accept={this.accept}\n onFilesSelected={this.handleNewFiles}\n >\n {this.renderChipset()}\n </limel-file-dropzone>\n );\n }\n\n private handleNewFiles = (event: CustomEvent<FileInfo[]>) => {\n this.preventAndStop(event);\n this.change.emit(event.detail[0]);\n };\n\n private getChipArray(): Chip[] {\n if (!this.value) {\n return [];\n }\n\n return [\n {\n ...DEFAULT_FILE_CHIP,\n text: this.value.filename,\n id: this.value.id,\n icon: {\n name: getFileIcon(this.value),\n title: getFileExtensionTitle(this.value),\n color: getFileColor(this.value),\n backgroundColor: getFileBackgroundColor(this.value),\n },\n href: this.value.href,\n },\n ];\n }\n\n private renderChipset() {\n const chipset = (\n <limel-chip-set\n disabled={this.disabled}\n readonly={this.readonly}\n invalid={this.invalid}\n label={this.label}\n leadingIcon=\"upload_to_cloud\"\n language={this.language}\n onChange={this.handleChipSetChange}\n onInteract={this.handleChipInteract}\n required={this.required}\n type=\"input\"\n value={this.getChipArray()}\n title={this.getTranslation('drag-and-drop-tips')}\n />\n );\n\n if (this.value) {\n return chipset;\n }\n\n return (\n <limel-file-input\n accept={this.accept}\n disabled={this.disabled || this.readonly}\n >\n {chipset}\n </limel-file-input>\n );\n }\n\n private handleChipSetChange = (event: CustomEvent) => {\n event.stopPropagation();\n const file = !event.detail.length ? event.detail[0] : null;\n if (!file) {\n this.change.emit(file);\n }\n };\n\n private handleChipInteract = (event: CustomEvent<Chip>) => {\n this.preventAndStop(event);\n this.interact.emit(event.detail.id);\n };\n\n private preventAndStop(event: Event) {\n event.stopPropagation();\n event.preventDefault();\n }\n\n private getTranslation(key: string) {\n return translate.get(`file.${key}`, this.language);\n }\n}\n"],"version":3}
@@ -1,17 +1,17 @@
1
1
  import { r as registerInstance, c as createEvent, h as h$1, g as getElement } from './index-232e9616.js';
2
2
  import { c as createCommonjsModule, a as commonjsGlobal } from './_commonjsHelpers-5ec8f9b7.js';
3
- import { g as getTag$1, m as mapToArray$1, k as keys$5, a as isBuffer, c as isTypedArray$1, i as isArguments$3, d as isPrototype$1, e as baseKeys$1, f as Set$2, s as setToArray$1, h as SetCache$1, j as cacheHas$1 } from './_baseIsEqual-633b7929.js';
3
+ import { g as getTag$1, m as mapToArray$1, k as keys$5, i as isBuffer, a as isTypedArray$1, c as isArguments$3, d as isPrototype$1, e as baseKeys$1, S as Set$2, s as setToArray$1, f as SetCache$1, h as cacheHas$1 } from './_baseIsEqual-69d97809.js';
4
4
  import { i as isArray$4 } from './isArray-80298bc7.js';
5
5
  import { b as isArrayLike$1 } from './isArrayLike-385e0f31.js';
6
- import { t as toString$3, b as baseIteratee$1, g as get$3 } from './_baseIteratee-2b2723f9.js';
7
- import { g as getPrototype$1, p as pickBy, h as has$1, n as negate } from './pickBy-240917e2.js';
8
- import { i as isEqual$1 } from './isEqual-d8fb9edc.js';
6
+ import { t as toString$3, b as baseIteratee$1, g as get$3 } from './_baseIteratee-11a1b266.js';
7
+ import { g as getPrototype$1, p as pickBy, h as has$1, n as negate } from './pickBy-7e02d413.js';
8
+ import { i as isEqual$1 } from './isEqual-8daa0ea4.js';
9
9
  import { a as arrayMap$1 } from './identity-87aa3962.js';
10
10
  import { b as baseAssignValue$1 } from './_assignValue-fb2bf80a.js';
11
- import { b as baseForOwn$1 } from './_baseForOwn-3dd6837f.js';
11
+ import { b as baseForOwn$1 } from './_baseForOwn-c95521ce.js';
12
12
  import { b as baseGetTag$1 } from './isObject-c74e273c.js';
13
13
  import { i as isObjectLike$1 } from './isObjectLike-38996507.js';
14
- import { a as arrayIncludes$1, b as arrayIncludesWith$1, c as baseRest$1, d as baseFlatten$1, i as isArrayLikeObject$1 } from './_arrayIncludesWith-8b8a8b46.js';
14
+ import { a as arrayIncludes$1, b as arrayIncludesWith$1, c as baseRest$1, d as baseFlatten$1, i as isArrayLikeObject$1 } from './_arrayIncludesWith-b9a433b0.js';
15
15
  import { m as moment } from './moment-be8ab0fa.js';
16
16
  import { i as isMultiple } from './multiple-4beb2761.js';
17
17
  import { c as createRandomString } from './random-string-812b1c35.js';