winduum 3.0.0-next.3 → 3.0.0-next.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "winduum",
3
- "version": "3.0.0-next.3",
3
+ "version": "3.0.0-next.4",
4
4
  "type": "module",
5
5
  "types": "types/index.d.ts",
6
6
  "main": "plugin/index.cjs",
@@ -2,12 +2,21 @@
2
2
  * @param {HTMLElement} element
3
3
  * @param {object} options
4
4
  * @param {number} [options.direction=1]
5
- * @param {number} [options.distance]
6
- * @param {'left' | 'top'} [options.position='left']
5
+ * @param {boolean} [options.vertical=false]
7
6
  * @param {number} [options.ratio=0.85]
8
7
  * @returns void
9
8
  */
10
- export const scrollBy = (element, { direction = 1, distance, position = 'left', ratio = 0.85 }) => {
9
+ export const scrollBy = (element, { direction = 1, vertical = false, ratio = 0.85 }) => {
10
+ const { distance, position } = vertical
11
+ ? {
12
+ distance: element.clientHeight * ratio,
13
+ position: 'top',
14
+ }
15
+ : {
16
+ distance: element.clientWidth * ratio,
17
+ position: 'left',
18
+ }
19
+
11
20
  element.scrollBy({
12
21
  [position]: (distance ?? element.clientWidth * ratio) * direction,
13
22
  })
@@ -18,15 +27,21 @@ export const scrollBy = (element, { direction = 1, distance, position = 'left',
18
27
  * @param {object} options
19
28
  * @param {HTMLButtonElement | null} [options.prevElement]
20
29
  * @param {HTMLButtonElement | null} [options.nextElement]
21
- * @param {boolean} [options.scrollStart]
22
- * @param {boolean} [options.scrollEnd]
23
- * @param {boolean} [options.scrollNone]
30
+ * @param {boolean} vertical
24
31
  * @returns void
25
32
  */
26
- export const toggleScrollState = (element, { prevElement, nextElement, scrollStart, scrollEnd, scrollNone }) => {
27
- scrollStart ??= element.scrollLeft <= 0
28
- scrollEnd ??= element.scrollLeft >= element.scrollWidth - element.clientWidth
29
- scrollNone ??= !(element.scrollWidth - element.clientWidth)
33
+ export const toggleScrollState = (element, { prevElement, nextElement, vertical = false }) => {
34
+ const { scrollStart, scrollEnd, scrollNone } = vertical
35
+ ? {
36
+ scrollStart: element.scrollTop <= 0,
37
+ scrollEnd: element.scrollTop >= element.scrollHeight - element.clientHeight,
38
+ scrollNone: !(element.scrollHeight - element.clientHeight),
39
+ }
40
+ : {
41
+ scrollStart: element.scrollLeft <= 0,
42
+ scrollEnd: element.scrollLeft >= element.scrollWidth - element.clientWidth,
43
+ scrollNone: !(element.scrollWidth - element.clientWidth),
44
+ }
30
45
 
31
46
  if (prevElement) prevElement.disabled = scrollStart
32
47
  if (nextElement) nextElement.disabled = scrollEnd
@@ -5,3 +5,7 @@ document.documentElement.addEventListener('click', ({ target }) => {
5
5
  target?.close()
6
6
  }
7
7
  })
8
+
9
+ new ResizeObserver(() => {
10
+ document.documentElement.style.setProperty('--default-scrollbar-width', `${Math.max(0, window.innerWidth - document.body.clientWidth)}px`)
11
+ }).observe(document.body)
@@ -82,8 +82,7 @@ export const drawerObserver = (element, placement) => {
82
82
  }, {
83
83
  root: element,
84
84
  threshold: [visibleThreshold, 1],
85
- },
86
- )
85
+ })
87
86
  }
88
87
 
89
88
  /**
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @param {Event | SubmitEvent} event
2
+ * @param {SubmitEvent & { target: HTMLFormElement }} event
3
3
  * @param {import("./").ValidateFormOptions} options
4
4
  * @returns void
5
5
  */
@@ -23,7 +23,7 @@ export const validateForm = (event, options = {}) => {
23
23
  event.target.querySelector(':invalid').scrollIntoView(options.scrollOptions)
24
24
  event.target.querySelector(':invalid').focus()
25
25
  }
26
- else {
26
+ else if (options.submitterLoadingAttribute) {
27
27
  event?.submitter?.setAttribute(options.submitterLoadingAttribute, '')
28
28
  }
29
29
  }
@@ -58,9 +58,10 @@ export const validateField = (element, options = {}) => {
58
58
  ...options,
59
59
  }
60
60
 
61
- if (!element.querySelector(options.selector)) return
61
+ const validationElement = /** @type {HTMLInputElement} */ (element.querySelector(options.selector))
62
+
63
+ if (!validationElement) return
62
64
 
63
- const validationElement = element.querySelector(options.selector)
64
65
  const validationMessage = options.validationMessage ?? validationElement.dataset.validationMessage ?? validationElement.validationMessage
65
66
  const infoParentElement = validationElement?.closest(options.infoParentSelector)
66
67
  const endParentElement = validationElement.closest(options.endParentSelector)
@@ -9,6 +9,12 @@
9
9
  visibility: hidden;
10
10
  opacity: 0%;
11
11
 
12
+ :where(:root, :host):has(dialog[open]) & {
13
+ button {
14
+ display: none;
15
+ }
16
+ }
17
+
12
18
  .flex-col-reverse & {
13
19
  justify-content: flex-end;
14
20
  }
@@ -9,6 +9,7 @@ export const closeToast = async (element, options = {}) => {
9
9
  options = {
10
10
  closedAttribute: 'data-closed',
11
11
  heightProperty: '--x-toast-block-size',
12
+ remove: true,
12
13
  ...options,
13
14
  }
14
15
 
@@ -10,3 +10,21 @@ export const closeToaster = (element, options = {}) => {
10
10
  closeToast(toast, options),
11
11
  )
12
12
  }
13
+
14
+ /**
15
+ * @returns MutationObserver
16
+ */
17
+ export const toasterObserver = () => {
18
+ return new MutationObserver((mutations) => {
19
+ for (const { target } of mutations) {
20
+ if (target.children.length > 0) {
21
+ if (!target.matches(':popover-open')) {
22
+ target?.showPopover?.()
23
+ }
24
+ }
25
+ else {
26
+ target?.hidePopover?.()
27
+ }
28
+ }
29
+ })
30
+ }