@knowark/componarkjs 1.14.0 → 1.14.2

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 (102) hide show
  1. package/README.md +57 -45
  2. package/lib/base/component/README.md +127 -0
  3. package/lib/base/component/component.js +127 -21
  4. package/lib/base/component/component.test.js +296 -3
  5. package/lib/base/component/index.js +3 -0
  6. package/lib/base/styles/index.js +4 -1
  7. package/lib/base/utils/define.js +2 -1
  8. package/lib/base/utils/format.js +12 -6
  9. package/lib/base/utils/helpers.js +31 -5
  10. package/lib/base/utils/index.js +1 -0
  11. package/lib/base/utils/slots.js +3 -2
  12. package/lib/base/utils/uuid.js +1 -1
  13. package/lib/components/audio/components/audio.js +17 -2
  14. package/lib/components/audio/index.js +1 -0
  15. package/lib/components/audio/styles/index.js +5 -1
  16. package/lib/components/camera/components/camera.js +10 -0
  17. package/lib/components/camera/index.js +1 -0
  18. package/lib/components/camera/styles/index.js +5 -1
  19. package/lib/components/capture/components/capture.js +18 -2
  20. package/lib/components/capture/index.js +1 -0
  21. package/lib/components/droparea/components/droparea-preview.js +58 -13
  22. package/lib/components/droparea/components/droparea-preview.test.js +82 -0
  23. package/lib/components/droparea/components/droparea.js +41 -2
  24. package/lib/components/droparea/index.js +1 -0
  25. package/lib/components/droparea/styles/index.js +5 -1
  26. package/lib/components/emit/components/emit.js +11 -1
  27. package/lib/components/emit/index.js +1 -0
  28. package/lib/components/index.js +2 -1
  29. package/lib/components/list/components/item.js +6 -0
  30. package/lib/components/list/components/list.js +18 -4
  31. package/lib/components/list/index.js +1 -0
  32. package/lib/components/paginator/components/paginator.js +34 -8
  33. package/lib/components/paginator/index.js +1 -0
  34. package/lib/components/paginator/styles/index.js +5 -1
  35. package/lib/components/spinner/components/spinner.js +10 -0
  36. package/lib/components/spinner/index.js +1 -0
  37. package/lib/components/spinner/styles/index.js +5 -1
  38. package/lib/components/splitview/components/splitview.detail.js +10 -1
  39. package/lib/components/splitview/components/splitview.js +18 -3
  40. package/lib/components/splitview/components/splitview.master.js +10 -0
  41. package/lib/components/splitview/index.js +1 -0
  42. package/lib/components/translate/components/translate.js +42 -11
  43. package/lib/components/translate/components/translate.test.js +169 -1
  44. package/lib/components/translate/index.js +1 -0
  45. package/lib/index.js +3 -0
  46. package/package.json +2 -1
  47. package/tsconfig.json +1 -1
  48. package/types/base/component/component.d.ts +43 -8
  49. package/types/base/component/component.d.ts.map +1 -1
  50. package/types/base/component/index.d.ts +4 -6
  51. package/types/base/component/index.d.ts.map +1 -1
  52. package/types/base/styles/index.d.ts +3 -2
  53. package/types/base/styles/index.d.ts.map +1 -1
  54. package/types/base/utils/define.d.ts +3 -2
  55. package/types/base/utils/define.d.ts.map +1 -1
  56. package/types/base/utils/format.d.ts +12 -6
  57. package/types/base/utils/format.d.ts.map +1 -1
  58. package/types/base/utils/helpers.d.ts +27 -7
  59. package/types/base/utils/helpers.d.ts.map +1 -1
  60. package/types/base/utils/slots.d.ts +8 -10
  61. package/types/base/utils/slots.d.ts.map +1 -1
  62. package/types/base/utils/uuid.d.ts +1 -1
  63. package/types/base/utils/uuid.d.ts.map +1 -1
  64. package/types/components/audio/components/audio.d.ts +23 -9
  65. package/types/components/audio/components/audio.d.ts.map +1 -1
  66. package/types/components/audio/styles/index.d.ts +3 -2
  67. package/types/components/audio/styles/index.d.ts.map +1 -1
  68. package/types/components/camera/components/camera.d.ts +11 -3
  69. package/types/components/camera/components/camera.d.ts.map +1 -1
  70. package/types/components/camera/styles/index.d.ts +3 -2
  71. package/types/components/camera/styles/index.d.ts.map +1 -1
  72. package/types/components/capture/components/capture.d.ts +23 -3
  73. package/types/components/capture/components/capture.d.ts.map +1 -1
  74. package/types/components/droparea/components/droparea-preview.d.ts +64 -11
  75. package/types/components/droparea/components/droparea-preview.d.ts.map +1 -1
  76. package/types/components/droparea/components/droparea.d.ts +58 -13
  77. package/types/components/droparea/components/droparea.d.ts.map +1 -1
  78. package/types/components/droparea/styles/index.d.ts +3 -2
  79. package/types/components/droparea/styles/index.d.ts.map +1 -1
  80. package/types/components/emit/components/emit.d.ts +15 -3
  81. package/types/components/emit/components/emit.d.ts.map +1 -1
  82. package/types/components/list/components/item.d.ts +8 -1
  83. package/types/components/list/components/item.d.ts.map +1 -1
  84. package/types/components/list/components/list.d.ts +23 -5
  85. package/types/components/list/components/list.d.ts.map +1 -1
  86. package/types/components/paginator/components/paginator.d.ts +32 -8
  87. package/types/components/paginator/components/paginator.d.ts.map +1 -1
  88. package/types/components/paginator/styles/index.d.ts +3 -2
  89. package/types/components/paginator/styles/index.d.ts.map +1 -1
  90. package/types/components/spinner/components/spinner.d.ts +14 -3
  91. package/types/components/spinner/components/spinner.d.ts.map +1 -1
  92. package/types/components/spinner/styles/index.d.ts +3 -2
  93. package/types/components/spinner/styles/index.d.ts.map +1 -1
  94. package/types/components/splitview/components/splitview.d.ts +22 -4
  95. package/types/components/splitview/components/splitview.d.ts.map +1 -1
  96. package/types/components/splitview/components/splitview.detail.d.ts +12 -2
  97. package/types/components/splitview/components/splitview.detail.d.ts.map +1 -1
  98. package/types/components/splitview/components/splitview.master.d.ts +12 -1
  99. package/types/components/splitview/components/splitview.master.d.ts.map +1 -1
  100. package/types/components/translate/components/translate.d.ts +44 -10
  101. package/types/components/translate/components/translate.d.ts.map +1 -1
  102. package/lib/base/component/README.rst +0 -113
@@ -1,6 +1,7 @@
1
1
  import { Component } from "#base/index.js"
2
2
 
3
3
  const tag = 'ark-capture'
4
+ /** Template-driven renderer component. */
4
5
  export class Capture extends Component {
5
6
  constructor () {
6
7
  super()
@@ -12,7 +13,8 @@ export class Capture extends Component {
12
13
  return ['receive']
13
14
  }
14
15
 
15
- /** @param {Object} context */
16
+ /** @param {object} context
17
+ * @returns {this} */
16
18
  init (context = {}) {
17
19
  const data = this._parseJSON(this._pop(':scope > data')?.textContent)
18
20
  this.source = /** @type {object} */ (
@@ -23,6 +25,7 @@ export class Capture extends Component {
23
25
  return super.init()
24
26
  }
25
27
 
28
+ /** @returns {this} */
26
29
  render () {
27
30
  const outputTemplate = this._pop(':scope > template')?.innerHTML
28
31
  this.template = (
@@ -36,11 +39,16 @@ export class Capture extends Component {
36
39
  return super.render()
37
40
  }
38
41
 
42
+ /** @param {{detail:any}} event */
39
43
  handle (event) {
40
44
  const source = event.detail
41
45
  this.init({ source }).render()
42
46
  }
43
47
 
48
+ /**
49
+ * @param {string} template
50
+ * @returns {(data: any) => string}
51
+ */
44
52
  _format (template) {
45
53
  let render = null
46
54
 
@@ -62,12 +70,20 @@ export class Capture extends Component {
62
70
  }
63
71
  }
64
72
 
73
+ /**
74
+ * @param {string} selector
75
+ * @returns {HTMLElement|null}
76
+ */
65
77
  _pop (selector) {
66
78
  const element = this.querySelector(selector)
67
79
  element?.remove()
68
- return element
80
+ return /** @type {HTMLElement|null} */ (element)
69
81
  }
70
82
 
83
+ /**
84
+ * @param {string|null} source
85
+ * @returns {object|null}
86
+ */
71
87
  _parseJSON (source) {
72
88
  if (!source) return null
73
89
 
@@ -1 +1,2 @@
1
+ /** Template capture component. */
1
2
  export { Capture } from './components/capture.js'
@@ -4,6 +4,9 @@ import './droparea.js'
4
4
  /** @import {Droparea} from './droparea.js' */
5
5
 
6
6
  const tag = 'ark-droparea-preview'
7
+ /**
8
+ * Renders file previews and drag-sort ordering.
9
+ */
7
10
 
8
11
  export class DropareaPreview extends Component {
9
12
  constructor () {
@@ -12,15 +15,19 @@ export class DropareaPreview extends Component {
12
15
  this._onDragEnd = this.handleDrop.bind(this)
13
16
  }
14
17
 
15
- init (_context = {}) {
18
+ /** @param {object} context
19
+ * @returns {this} */
20
+ init (context = {}) {
16
21
  return super.init()
17
22
  }
18
23
 
24
+ /** @returns {void} */
19
25
  disconnectedCallback () {
20
26
  this.revokeAllFiles()
21
27
  super.disconnectedCallback()
22
28
  }
23
29
 
30
+ /** @returns {this} */
24
31
  render () {
25
32
  this.content = /* html */ `
26
33
  <ul data-preview-list class="ark-droparea-preview__list drag-sort-enable"></ul>
@@ -28,6 +35,10 @@ export class DropareaPreview extends Component {
28
35
  return super.render()
29
36
  }
30
37
 
38
+ /**
39
+ * @param {File} file
40
+ * @returns {void}
41
+ */
31
42
  previewFile (file) {
32
43
  const blobUrl = this.getObjectURL(file)
33
44
  const fileType = file.type.split('/')[0]
@@ -58,6 +69,7 @@ export class DropareaPreview extends Component {
58
69
  }
59
70
  }
60
71
 
72
+ /** @returns {void} */
61
73
  toggleVisibility () {
62
74
  const previewZone = this.select('[data-preview-list]')
63
75
  this.files.length !== 0
@@ -67,6 +79,8 @@ export class DropareaPreview extends Component {
67
79
 
68
80
  /* DragSort Functionality */
69
81
 
82
+ /** @param {string} listClass
83
+ * @returns {void} */
70
84
  enableDragSort (listClass) {
71
85
  const sortableLists = this.getElementsByClassName(listClass)
72
86
  Array.prototype.map.call(sortableLists, (list) => {
@@ -74,56 +88,69 @@ export class DropareaPreview extends Component {
74
88
  })
75
89
  }
76
90
 
91
+ /** @param {HTMLUListElement} list
92
+ * @returns {void} */
77
93
  enableDragList (list) {
78
94
  Array.prototype.map.call(list.children, (item) => {
79
95
  this.enableDragItem(item)
80
96
  })
81
97
  }
82
98
 
99
+ /** @param {HTMLElement} item
100
+ * @returns {void} */
83
101
  enableDragItem (item) {
84
102
  if (item.hasAttribute('data-drag-enabled')) return
85
103
 
86
104
  item.setAttribute('data-drag-enabled', '')
87
- item.setAttribute('draggable', true)
105
+ item.setAttribute('draggable', 'true')
88
106
  item.addEventListener('drag', this.handleDrag.bind(this, item))
89
107
  item.addEventListener('dragend', this._onDragEnd, false)
90
108
  }
91
109
 
92
110
  /* istanbul ignore next */
111
+ /** @param {HTMLLIElement} item
112
+ * @param {DragEvent} event
113
+ * @returns {void} */
93
114
  handleDrag (item, event) {
94
115
  const selectedItem = item
95
- const list = selectedItem.parentNode
116
+ const list = /** @type {HTMLElement} */ (selectedItem.parentElement)
96
117
  const x = event.clientX
97
118
  const y = event.clientY
98
119
 
99
120
  selectedItem.classList.add('drag-sort-active')
100
- let swapItem =
101
- document.elementFromPoint(x, y) === null
102
- ? selectedItem
103
- : document.elementFromPoint(x, y)
104
- if (list === swapItem.parentNode) {
121
+ let swapItem = /** @type {ChildNode|null} */ (
122
+ document.elementFromPoint(x, y))
123
+ if (!swapItem) swapItem = selectedItem
124
+
125
+ if (list && swapItem && list === swapItem.parentNode) {
105
126
  swapItem = (
106
127
  swapItem !== selectedItem.nextSibling
107
128
  ? swapItem
108
129
  : swapItem.nextSibling)
109
- list.insertBefore(selectedItem, swapItem)
130
+ list.insertBefore(selectedItem, /** @type {ChildNode|null} */ (swapItem))
110
131
  }
111
132
  }
112
133
 
134
+ /** @param {DragEvent} event
135
+ * @returns {void} */
113
136
  handleDrop (event) {
114
- const droparea = event.target.closest('ark-droparea')
137
+ const target = /** @type {HTMLElement|null} */ (event.target)
138
+ if (!target) return
139
+ const droparea = /** @type {Droparea|null} */ (target.closest('ark-droparea'))
115
140
  if (!droparea) return
116
141
 
117
142
  droparea.preview.createNewFileList()
118
- event.target.classList.remove('drag-sort-active')
143
+ target.classList.remove('drag-sort-active')
119
144
  droparea.preview.dispatchAlterEvent()
120
145
  }
121
146
  /* ---------------------------------------------------- */
122
147
 
148
+ /** @returns {void} */
123
149
  dispatchAlterEvent () {
124
150
  this.emit('alter', this.mediaList)
125
151
  }
126
152
 
153
+ /** @returns {void} */
127
154
  createNewFileList () {
128
155
  const nodeList = this.querySelectorAll('li')
129
156
  const newList = []
@@ -134,10 +161,16 @@ export class DropareaPreview extends Component {
134
161
  this.droparea.fileList = newList
135
162
  }
136
163
 
164
+ /**
165
+ * @param {File} file
166
+ * @returns {boolean}
167
+ */
137
168
  fileExists (file) {
138
169
  return this.files.some((item) => item.name === file.name)
139
170
  }
140
171
 
172
+ /** @param {File} file
173
+ * @returns {string} */
141
174
  getObjectURL (file) {
142
175
  if (this._objectUrls.has(file)) return this._objectUrls.get(file)
143
176
 
@@ -146,6 +179,8 @@ export class DropareaPreview extends Component {
146
179
  return url
147
180
  }
148
181
 
182
+ /** @param {File} file
183
+ * @returns {void} */
149
184
  revokeFile (file) {
150
185
  const url = this._objectUrls.get(file)
151
186
  if (!url) return
@@ -154,6 +189,7 @@ export class DropareaPreview extends Component {
154
189
  URL.revokeObjectURL?.(url)
155
190
  }
156
191
 
192
+ /** @returns {void} */
157
193
  revokeAllFiles () {
158
194
  for (const url of this._objectUrls.values()) {
159
195
  URL.revokeObjectURL?.(url)
@@ -161,20 +197,25 @@ export class DropareaPreview extends Component {
161
197
  this._objectUrls.clear()
162
198
  }
163
199
 
200
+ /** @returns {void} */
164
201
  clearPreview () {
165
202
  const previewZone = this.select('[data-preview-list]')
166
203
  previewZone && (previewZone.textContent = '')
167
204
  this.toggleVisibility()
168
205
  }
169
206
 
207
+ /** @param {File} file
208
+ * @param {MouseEvent} event
209
+ * @returns {void} */
170
210
  removeFile (file, event) {
171
- const element = event.target
211
+ const element = /** @type {HTMLElement|null} */ (event.target)
212
+ if (!element) return
172
213
  const fileIndex = this.droparea.fileList.indexOf(file)
173
214
  if (fileIndex < 0) return
174
215
 
175
216
  this.revokeFile(file)
176
217
  this.droparea.fileList.splice(fileIndex, 1)
177
- element.parentNode.remove()
218
+ element.parentElement?.remove()
178
219
  this.selectAll('li').forEach((item, index) =>
179
220
  item.setAttribute('index', String(index))
180
221
  )
@@ -182,14 +223,18 @@ export class DropareaPreview extends Component {
182
223
  this.dispatchAlterEvent()
183
224
  }
184
225
 
226
+ /** @param {File} file
227
+ * @returns {number} */
185
228
  fileIndex (file) {
186
229
  return this.droparea.fileList.indexOf(file)
187
230
  }
188
231
 
232
+ /** @returns {Droparea} */
189
233
  get droparea () {
190
234
  return /** @type {Droparea} */ (this.closest('ark-droparea'))
191
235
  }
192
236
 
237
+ /** @returns {Array<{name:string,type:string,size:number,url:string}>} */
193
238
  get mediaList () {
194
239
  const mediaList = []
195
240
  this.droparea.fileList.map((file) => {
@@ -287,3 +287,85 @@ it('does nothing when revoking a file without an object URL', () => {
287
287
  preview.revokeFile(file)
288
288
  })
289
289
  })
290
+
291
+ it('renders a text preview in single mode and clears previous preview items', () => {
292
+ setup()
293
+ container.innerHTML = /* html */ `
294
+ <ark-droparea single></ark-droparea>
295
+ `
296
+ const droparea = container.querySelector('ark-droparea')
297
+ const dropZone = droparea.querySelector('.ark-droparea__form')
298
+ const firstFile = new File(['first'], 'first.txt', { type: 'text/plain' })
299
+ const secondFile = new File(['second'], 'second.txt', { type: 'text/plain' })
300
+
301
+ dropZone.dispatchEvent(createBubbledEvent('drop', {
302
+ dataTransfer: { files: [firstFile] }
303
+ }))
304
+
305
+ const firstPreviewItem = droparea.preview.querySelector('li')
306
+ assert.deepStrictEqual(firstPreviewItem.querySelector('p').textContent, 'first.txt')
307
+ assert.ok(firstPreviewItem.getAttribute('data').includes('mock://data/url/'))
308
+ assert.strictEqual(firstPreviewItem.getAttribute('index'), null)
309
+
310
+ dropZone.dispatchEvent(createBubbledEvent('drop', {
311
+ dataTransfer: { files: [secondFile] }
312
+ }))
313
+
314
+ const frames = droparea.preview.querySelectorAll('li')
315
+ assert.deepStrictEqual(frames.length, 1)
316
+ assert.deepStrictEqual(frames[0].querySelector('p').textContent, 'second.txt')
317
+ })
318
+
319
+ it('clearPreview tolerates missing preview list nodes', () => {
320
+ setup()
321
+ const preview = document.createElement('ark-droparea-preview')
322
+ const originalSelect = preview.select
323
+ preview.select = () => null
324
+ preview.toggleVisibility = () => {}
325
+
326
+ assert.doesNotThrow(() => {
327
+ preview.clearPreview()
328
+ })
329
+
330
+ preview.select = originalSelect
331
+ })
332
+
333
+ it('returns early when handleDrop receives a null target', () => {
334
+ setup()
335
+ const preview = document.createElement('ark-droparea-preview')
336
+
337
+ assert.doesNotThrow(() => {
338
+ preview.handleDrop({ target: null })
339
+ })
340
+ })
341
+
342
+ it('returns early when removeFile receives a null target', () => {
343
+ setup()
344
+ const preview = document.createElement('ark-droparea-preview')
345
+ const file = new File(['image'], 'Nully.png', { type: 'image/png' })
346
+
347
+ assert.doesNotThrow(() => {
348
+ preview.removeFile(file, { target: null })
349
+ })
350
+ })
351
+
352
+ it('revokeFile and revokeAllFiles tolerate missing revokeObjectURL', () => {
353
+ setup()
354
+ const preview = document.createElement('ark-droparea-preview')
355
+ const file = new File(['one'], 'one.txt', { type: 'text/plain' })
356
+ const secondFile = new File(['two'], 'two.txt', { type: 'text/plain' })
357
+ preview._objectUrls.set(file, 'mock://data/url/a')
358
+ preview._objectUrls.set(secondFile, 'mock://data/url/b')
359
+
360
+ const originalRevoke = global.URL.revokeObjectURL
361
+ global.URL.revokeObjectURL = undefined
362
+
363
+ try {
364
+ assert.doesNotThrow(() => {
365
+ preview.revokeFile(file)
366
+ preview.revokeAllFiles()
367
+ })
368
+ } finally {
369
+ global.URL.revokeObjectURL = originalRevoke
370
+ }
371
+ })
@@ -5,6 +5,11 @@ import './droparea-preview.js'
5
5
  /** @import {DropareaPreview} from './droparea-preview.js' */
6
6
 
7
7
  const tag = 'ark-droparea'
8
+ /**
9
+ * Drag-and-drop and file input area.
10
+ * Emits:
11
+ * - `alter` with current media list details.
12
+ */
8
13
 
9
14
  export class Droparea extends Component {
10
15
  constructor () {
@@ -13,6 +18,8 @@ export class Droparea extends Component {
13
18
  this._onOpenInput = this.openInput.bind(this)
14
19
  }
15
20
 
21
+ /** @param {object} context
22
+ * @returns {this} */
16
23
  init (context = {}) {
17
24
  this.fileList = []
18
25
  this.contextFiles = context.contextFiles || this.contextFiles || []
@@ -22,6 +29,7 @@ export class Droparea extends Component {
22
29
  return super.init()
23
30
  }
24
31
 
32
+ /** @returns {this} */
25
33
  render () {
26
34
  this._grabSlots()
27
35
  this.content = /* html */ `
@@ -43,10 +51,12 @@ export class Droparea extends Component {
43
51
  return super.render()
44
52
  }
45
53
 
54
+ /** @returns {string[]} */
46
55
  reflectedProperties () {
47
56
  return ['size', 'accept', 'maxSize', 'title']
48
57
  }
49
58
 
59
+ /** @returns {Promise<void>} */
50
60
  async load () {
51
61
  this._detachListeners()
52
62
 
@@ -72,11 +82,13 @@ export class Droparea extends Component {
72
82
  }
73
83
  }
74
84
 
85
+ /** @returns {void} */
75
86
  disconnectedCallback () {
76
87
  this._detachListeners()
77
88
  super.disconnectedCallback()
78
89
  }
79
90
 
91
+ /** @returns {void} */
80
92
  _detachListeners () {
81
93
  if (this.dragDropEvents) {
82
94
  this.dragDropEvents.forEach((eventName) => {
@@ -101,25 +113,35 @@ export class Droparea extends Component {
101
113
  this.openButton?.removeEventListener('click', this._onOpenInput)
102
114
  }
103
115
 
116
+ /** @param {Event} event
117
+ * @returns {void} */
104
118
  openInput (event) {
105
119
  event.stopPropagation()
106
120
  const input = this.select('[data-input]')
107
121
  input.click()
108
122
  }
109
123
 
124
+ /** @param {Event} event
125
+ * @returns {void} */
110
126
  preventDefaults (event) {
111
127
  event.preventDefault()
112
128
  event.stopPropagation()
113
129
  }
114
130
 
131
+ /** @param {Event} event
132
+ * @returns {void} */
115
133
  highlight (event) {
116
134
  this.dropZone.classList.add('highlight')
117
135
  }
118
136
 
137
+ /** @param {Event} event
138
+ * @returns {void} */
119
139
  unhighlight (event) {
120
140
  this.dropZone.classList.remove('highlight')
121
141
  }
122
142
 
143
+ /** @param {DragEvent} event
144
+ * @returns {void} */
123
145
  handleDrop (event) {
124
146
  event.stopPropagation()
125
147
  const data = event.dataTransfer
@@ -127,13 +149,17 @@ export class Droparea extends Component {
127
149
  this.handleFiles(files)
128
150
  }
129
151
 
152
+ /** @param {Event} event
153
+ * @returns {void} */
130
154
  onChange (event) {
131
155
  event.stopPropagation()
132
- const input = event.target
156
+ const input = /** @type {HTMLInputElement} */ (event.target)
133
157
  const files = input.files
134
158
  this.handleFiles(files)
135
159
  }
136
160
 
161
+ /** @param {FileList|File[]} files
162
+ * @returns {void} */
137
163
  handleFiles (files) {
138
164
  if (this.single) {
139
165
  files = [files[0]]
@@ -163,6 +189,10 @@ export class Droparea extends Component {
163
189
  this.preview.dispatchAlterEvent()
164
190
  }
165
191
 
192
+ /**
193
+ * @param {File[]|FileList} fileList
194
+ * @returns {boolean}
195
+ */
166
196
  validate (fileList) {
167
197
  if (!this.accept || this.accept.length === 0) return true
168
198
  const acceptList = this.accept.split(',').map(
@@ -186,15 +216,20 @@ export class Droparea extends Component {
186
216
  return true
187
217
  }
188
218
 
219
+ /** @param {File} file
220
+ * @returns {boolean} */
189
221
  maxSizeValidate (file) {
190
222
  return true
191
223
  }
192
224
 
225
+ /** @returns {void} */
193
226
  _grabSlots() {
194
227
  const [fileInput] = [this.slots.general].flat()
195
228
  this.fileInput = this.fileInput ?? fileInput
196
229
  }
197
230
 
231
+ /** @param {HTMLInputElement|undefined} element
232
+ * @returns {HTMLInputElement} */
198
233
  _buildFileInput (element) {
199
234
  const input = element ?? document.createElement('input')
200
235
  const attributes = [['class', `${tag}__input`],
@@ -203,14 +238,18 @@ export class Droparea extends Component {
203
238
  return input
204
239
  }
205
240
 
241
+ /** @returns {HTMLFormElement} */
206
242
  get dropZone () {
207
- return this.select('.ark-droparea__form')
243
+ return /** @type {HTMLFormElement} */ (
244
+ this.querySelector('.ark-droparea__form'))
208
245
  }
209
246
 
247
+ /** @returns {DropareaPreview} */
210
248
  get preview () {
211
249
  return /** @type {DropareaPreview} */ (this.select('ark-droparea-preview'))
212
250
  }
213
251
 
252
+ /** @returns {Array<{name:string,type:string,size:number,url:string}>} */
214
253
  get mediaList () {
215
254
  return this.preview.mediaList
216
255
  }
@@ -1 +1,2 @@
1
+ /** Drag-and-drop file input area components. */
1
2
  export { Droparea } from './components/droparea.js'
@@ -1,3 +1,7 @@
1
1
  // @ts-nocheck
2
2
  import styles from './ark.css.js'
3
- export default styles
3
+
4
+ /** @type {string} */
5
+ const stylesText = styles
6
+
7
+ export default stylesText
@@ -1,6 +1,9 @@
1
1
  import { Component } from "#base/index.js"
2
2
 
3
3
  const tag = 'ark-emit'
4
+ /**
5
+ * Declarative event forwarding component.
6
+ */
4
7
  export class Emit extends Component {
5
8
  constructor () {
6
9
  super()
@@ -15,6 +18,8 @@ export class Emit extends Component {
15
18
  return ['receive', 'dispatch', 'bind']
16
19
  }
17
20
 
21
+ /** @param {CustomEvent} event
22
+ * @returns {void} */
18
23
  handle (event) {
19
24
  const detail = Object.assign({}, event.detail)
20
25
 
@@ -27,19 +32,22 @@ export class Emit extends Component {
27
32
 
28
33
  Object.assign(detail, data)
29
34
 
30
- const value = event.target.value
35
+ const value = /** @type {HTMLInputElement|null} */ (event.target)?.value
31
36
  if (value) Object.assign(detail, { value })
32
37
 
33
38
  const type = this.dispatch || 'emit'
34
39
  this.emit(type, detail)
35
40
  }
36
41
 
42
+ /** @param {string} selector
43
+ * @returns {Element|null} */
37
44
  _pop (selector) {
38
45
  const element = this.querySelector(selector)
39
46
  element?.remove()
40
47
  return element
41
48
  }
42
49
 
50
+ /** @returns {any|null} */
43
51
  _resolveBoundData () {
44
52
  const element = this.closest(this.bind)
45
53
  if (!element) return null
@@ -52,6 +60,8 @@ export class Emit extends Component {
52
60
  }
53
61
  }
54
62
 
63
+ /** @param {string} source
64
+ * @returns {object|null} */
55
65
  _parseJSON (source) {
56
66
  try {
57
67
  return JSON.parse(source)
@@ -1 +1,2 @@
1
+ /** Event emitter bridge component. */
1
2
  export { Emit } from './components/emit.js'
@@ -1,3 +1,4 @@
1
+ /** Aggregated component exports. */
1
2
  export * from './audio/index.js'
2
3
  export * from './camera/index.js'
3
4
  export * from './capture/index.js'
@@ -6,4 +7,4 @@ export * from './list/index.js'
6
7
  export * from './paginator/index.js'
7
8
  export * from './spinner/index.js'
8
9
  export * from './splitview/index.js'
9
- export * from './translate/index.js'
10
+ export * from './translate/index.js'
@@ -1,7 +1,12 @@
1
1
  import { Component } from "#base/index.js"
2
2
 
3
3
  const tag = 'ark-list-item'
4
+ /**
5
+ * Single list item for list component.
6
+ */
4
7
  export class ListItem extends Component {
8
+ /** @param {object} context
9
+ * @returns {this} */
5
10
  init (context = {}) {
6
11
  this.index = context.index
7
12
  this.data = context.data || null
@@ -14,6 +19,7 @@ export class ListItem extends Component {
14
19
  return ['index']
15
20
  }
16
21
 
22
+ /** @returns {this} */
17
23
  render () {
18
24
  this.content = this.template(this.data)
19
25
  return super.render()