noph-ui 0.18.1 → 0.18.3

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.
@@ -30,7 +30,7 @@
30
30
 
31
31
  const uid = $props.id()
32
32
  let defaultOptionsFilter = (option: AutoCompleteOption) => {
33
- return !value || option.label.includes(value)
33
+ return !value || option.label.toLocaleLowerCase().includes(value.toLocaleLowerCase())
34
34
  }
35
35
  let displayOptions = $derived(options.filter(optionsFilter || defaultOptionsFilter))
36
36
  let useVirtualList = $derived(displayOptions.length > 4000)
@@ -78,6 +78,10 @@
78
78
  return window
79
79
  }
80
80
 
81
+ const onScroll = () => {
82
+ refreshValues()
83
+ }
84
+
81
85
  $effect(() => {
82
86
  if (anchor && element) {
83
87
  if (style) {
@@ -89,13 +93,7 @@
89
93
  element?.style.setProperty(key, value)
90
94
  })
91
95
  }
92
- getScrollableParent(element).addEventListener(
93
- 'scroll',
94
- () => {
95
- refreshValues()
96
- },
97
- { passive: true },
98
- )
96
+ getScrollableParent(element).addEventListener('scroll', onScroll, { passive: true })
99
97
  if (
100
98
  'anchorName' in document.documentElement.style &&
101
99
  !anchor.style.getPropertyValue('anchor-name')
@@ -105,6 +103,11 @@
105
103
  anchor.style.setProperty('anchor-name', generatedId)
106
104
  }
107
105
  }
106
+ return () => {
107
+ if (element) {
108
+ getScrollableParent(element).removeEventListener('scroll', onScroll)
109
+ }
110
+ }
108
111
  })
109
112
  </script>
110
113
 
@@ -258,7 +258,7 @@
258
258
  endPressAnimation()
259
259
  }
260
260
 
261
- const addEvents = (el: HTMLElement) => {
261
+ const removeEvents = (el: HTMLElement) => {
262
262
  el.removeEventListener('click', handleClick)
263
263
  el.removeEventListener('contextmenu', handleContextmenu)
264
264
  el.removeEventListener('pointercancel', handlePointercancel)
@@ -266,6 +266,10 @@
266
266
  el.removeEventListener('pointerenter', handlePointerenter)
267
267
  el.removeEventListener('pointerleave', handlePointerleave)
268
268
  el.removeEventListener('pointerup', handlePointerup)
269
+ }
270
+
271
+ const addEvents = (el: HTMLElement) => {
272
+ removeEvents(el)
269
273
 
270
274
  el.addEventListener('click', handleClick)
271
275
  el.addEventListener('contextmenu', handleContextmenu)
@@ -285,6 +289,14 @@
285
289
  addEvents(element)
286
290
  }
287
291
  }
292
+ return () => {
293
+ if (forElement) {
294
+ removeEvents(forElement)
295
+ }
296
+ if (element) {
297
+ removeEvents(element)
298
+ }
299
+ }
288
300
  })
289
301
  </script>
290
302
 
@@ -102,11 +102,17 @@
102
102
  errorTextRaw = errorText
103
103
  selectElement?.setCustomValidity(error ? errorText : '')
104
104
  })
105
+ const onReset = () => {
106
+ errorRaw = error
107
+ }
105
108
  $effect(() => {
106
109
  if (selectElement) {
107
- selectElement.form?.addEventListener('reset', () => {
108
- errorRaw = error
109
- })
110
+ selectElement.form?.addEventListener('reset', onReset)
111
+ }
112
+ return () => {
113
+ if (selectElement) {
114
+ selectElement.form?.removeEventListener('reset', onReset)
115
+ }
110
116
  }
111
117
  })
112
118
  const handleOptionSelect = (event: Event, option: SelectOption) => {
@@ -60,39 +60,56 @@
60
60
  inputElement?.setCustomValidity(error ? errorText : '')
61
61
  })
62
62
 
63
+ const onReset = () => {
64
+ errorRaw = error
65
+ value = ''
66
+ }
67
+
68
+ const onInput = () => {
69
+ doValidity = true
70
+ }
71
+
72
+ const onInvalid = (event: Event) => {
73
+ event.preventDefault()
74
+ const { currentTarget } = event as Event & {
75
+ currentTarget: HTMLInputElement | HTMLTextAreaElement
76
+ }
77
+ errorRaw = true
78
+ if (errorText === '') {
79
+ errorTextRaw = currentTarget.validationMessage
80
+ }
81
+ if (focusOnInvalid && isFirstInvalidControlInForm(currentTarget.form, currentTarget)) {
82
+ currentTarget.focus()
83
+ }
84
+ }
85
+
86
+ const onBlur = () => {
87
+ queueMicrotask(() => {
88
+ if (doValidity && inputElement) {
89
+ focusOnInvalid = false
90
+ if (checkValidity()) {
91
+ errorRaw = error
92
+ errorTextRaw = errorText
93
+ }
94
+ focusOnInvalid = true
95
+ }
96
+ })
97
+ }
98
+
63
99
  $effect(() => {
64
100
  if (inputElement) {
65
- inputElement.form?.addEventListener('reset', () => {
66
- errorRaw = error
67
- value = ''
68
- })
69
- inputElement.addEventListener('input', () => {
70
- doValidity = true
71
- })
72
- inputElement.addEventListener('invalid', (event) => {
73
- event.preventDefault()
74
- const { currentTarget } = event as Event & {
75
- currentTarget: HTMLInputElement | HTMLTextAreaElement
76
- }
77
- errorRaw = true
78
- if (errorText === '') {
79
- errorTextRaw = currentTarget.validationMessage
80
- }
81
- if (focusOnInvalid && isFirstInvalidControlInForm(currentTarget.form, currentTarget)) {
82
- currentTarget.focus()
83
- }
84
- })
85
-
86
- inputElement.addEventListener('blur', () => {
87
- if (doValidity) {
88
- focusOnInvalid = false
89
- if (checkValidity()) {
90
- errorRaw = error
91
- errorTextRaw = errorText
92
- }
93
- focusOnInvalid = true
94
- }
95
- })
101
+ inputElement.form?.addEventListener('reset', onReset)
102
+ inputElement.addEventListener('input', onInput)
103
+ inputElement.addEventListener('invalid', onInvalid)
104
+ inputElement.addEventListener('blur', onBlur)
105
+ }
106
+ return () => {
107
+ if (inputElement) {
108
+ inputElement.removeEventListener('reset', onReset)
109
+ inputElement.removeEventListener('input', onInput)
110
+ inputElement.removeEventListener('invalid', onInvalid)
111
+ inputElement.removeEventListener('blur', onBlur)
112
+ }
96
113
  }
97
114
  })
98
115
  </script>
@@ -110,7 +127,7 @@
110
127
  bind:clientWidth
111
128
  bind:clientHeight
112
129
  role="button"
113
- tabindex="0"
130
+ tabindex="-1"
114
131
  onfocus={() => {
115
132
  inputElement?.focus()
116
133
  }}
@@ -41,6 +41,24 @@
41
41
  return event.pointerType === 'touch'
42
42
  }
43
43
 
44
+ const onPointerenter = (event: PointerEvent) => {
45
+ if (!isTouch(event)) {
46
+ element?.showPopover()
47
+ }
48
+ }
49
+
50
+ const onPointerleave = (event: PointerEvent) => {
51
+ if (!isTouch(event)) {
52
+ element?.hidePopover()
53
+ }
54
+ }
55
+
56
+ const onPointerup = (event: PointerEvent) => {
57
+ if (!isTouch(event)) {
58
+ element?.hidePopover()
59
+ }
60
+ }
61
+
44
62
  $effect(() => {
45
63
  if (anchor && element) {
46
64
  if ('anchorName' in document.documentElement.style) {
@@ -51,22 +69,17 @@
51
69
  anchor.style.setProperty('anchor-name', generatedId)
52
70
  }
53
71
  }
54
- anchor.addEventListener('pointerenter', (event: PointerEvent) => {
55
- if (!isTouch(event)) {
56
- element?.showPopover()
57
- }
58
- })
59
- anchor.addEventListener('pointerleave', (event: PointerEvent) => {
60
- if (!isTouch(event)) {
61
- element?.hidePopover()
62
- }
63
- })
72
+ anchor.addEventListener('pointerenter', onPointerenter)
73
+ anchor.addEventListener('pointerleave', onPointerleave)
64
74
  if (!keepTooltipOnClick) {
65
- anchor.addEventListener('pointerup', (event: PointerEvent) => {
66
- if (!isTouch(event)) {
67
- element?.hidePopover()
68
- }
69
- })
75
+ anchor.addEventListener('pointerup', onPointerup)
76
+ }
77
+ }
78
+ return () => {
79
+ if (anchor) {
80
+ anchor.removeEventListener('pointerenter', onPointerenter)
81
+ anchor.removeEventListener('pointerleave', onPointerleave)
82
+ anchor.removeEventListener('pointerup', onPointerup)
70
83
  }
71
84
  }
72
85
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "noph-ui",
3
- "version": "0.18.1",
3
+ "version": "0.18.3",
4
4
  "license": "MIT",
5
5
  "homepage": "https://noph.dev",
6
6
  "repository": {
@@ -55,25 +55,25 @@
55
55
  "devDependencies": {
56
56
  "@eslint/js": "^9.29.0",
57
57
  "@material/material-color-utilities": "^0.3.0",
58
- "@playwright/test": "^1.53.0",
58
+ "@playwright/test": "^1.53.1",
59
59
  "@sveltejs/adapter-vercel": "^5.7.2",
60
- "@sveltejs/kit": "^2.21.5",
60
+ "@sveltejs/kit": "^2.22.0",
61
61
  "@sveltejs/package": "^2.3.11",
62
62
  "@sveltejs/vite-plugin-svelte": "^5.1.0",
63
63
  "@types/eslint": "^9.6.1",
64
64
  "eslint": "^9.29.0",
65
65
  "eslint-config-prettier": "^10.1.5",
66
- "eslint-plugin-svelte": "^3.9.2",
66
+ "eslint-plugin-svelte": "^3.9.3",
67
67
  "globals": "^16.2.0",
68
- "prettier": "^3.5.3",
68
+ "prettier": "^3.6.0",
69
69
  "prettier-plugin-svelte": "^3.4.0",
70
70
  "publint": "^0.3.12",
71
- "svelte": "^5.34.3",
72
- "svelte-check": "^4.2.1",
71
+ "svelte": "^5.34.7",
72
+ "svelte-check": "^4.2.2",
73
73
  "typescript": "^5.8.3",
74
- "typescript-eslint": "^8.34.1",
74
+ "typescript-eslint": "^8.35.0",
75
75
  "vite": "^6.3.5",
76
- "vitest": "^3.2.3"
76
+ "vitest": "^3.2.4"
77
77
  },
78
78
  "svelte": "./dist/index.js",
79
79
  "types": "./dist/index.d.ts",