noph-ui 0.10.11 → 0.10.13
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/dist/button/Button.svelte +1 -2
- package/dist/button/IconButton.svelte +13 -11
- package/dist/card/Card.svelte +21 -12
- package/dist/list/Item.svelte +29 -11
- package/dist/menu/Menu.svelte +1 -2
- package/dist/select/Select.svelte +12 -15
- package/dist/snackbar/Snackbar.svelte +12 -11
- package/dist/tooltip/Tooltip.svelte +1 -2
- package/package.json +4 -4
- package/dist/utils.d.ts +0 -2
- package/dist/utils.js +0 -7
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import Ripple from '../ripple/Ripple.svelte'
|
|
3
3
|
import Tooltip from '../tooltip/Tooltip.svelte'
|
|
4
|
-
import { generateUUIDv4 } from '../utils.js'
|
|
5
4
|
import type { HTMLAnchorAttributes, HTMLButtonAttributes } from 'svelte/elements'
|
|
6
5
|
import type { ButtonProps } from './types.ts'
|
|
7
6
|
|
|
@@ -17,7 +16,7 @@
|
|
|
17
16
|
...attributes
|
|
18
17
|
}: ButtonProps = $props()
|
|
19
18
|
|
|
20
|
-
let tooltipId = $state(title ?
|
|
19
|
+
let tooltipId = $state(title ? crypto.randomUUID() : '')
|
|
21
20
|
|
|
22
21
|
const isButton = (obj: unknown): obj is HTMLButtonAttributes => {
|
|
23
22
|
return (obj as HTMLAnchorAttributes).href === undefined
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import Ripple from '../ripple/Ripple.svelte'
|
|
3
3
|
import Tooltip from '../tooltip/Tooltip.svelte'
|
|
4
|
-
import { generateUUIDv4 } from '../utils.js'
|
|
5
4
|
import type { IconButtonProps } from './types.ts'
|
|
6
|
-
import type {
|
|
5
|
+
import type {
|
|
6
|
+
HTMLAnchorAttributes,
|
|
7
|
+
HTMLButtonAttributes,
|
|
8
|
+
MouseEventHandler,
|
|
9
|
+
} from 'svelte/elements'
|
|
7
10
|
|
|
8
11
|
let {
|
|
9
12
|
variant = 'text',
|
|
@@ -15,10 +18,11 @@
|
|
|
15
18
|
selected = false,
|
|
16
19
|
selectedIcon,
|
|
17
20
|
keepTooltipOnClick,
|
|
21
|
+
onclick,
|
|
18
22
|
...attributes
|
|
19
23
|
}: IconButtonProps = $props()
|
|
20
24
|
|
|
21
|
-
let tooltipId = $state(title ?
|
|
25
|
+
let tooltipId = $state(title ? crypto.randomUUID() : '')
|
|
22
26
|
let selectedState = $state(!toggle || selected)
|
|
23
27
|
let touchEl: HTMLSpanElement | undefined = $state()
|
|
24
28
|
|
|
@@ -28,14 +32,6 @@
|
|
|
28
32
|
const isLink = (obj: unknown): obj is HTMLAnchorAttributes => {
|
|
29
33
|
return (obj as HTMLAnchorAttributes).href !== undefined
|
|
30
34
|
}
|
|
31
|
-
|
|
32
|
-
$effect(() => {
|
|
33
|
-
if (toggle) {
|
|
34
|
-
element?.addEventListener('click', () => {
|
|
35
|
-
selectedState = !selectedState
|
|
36
|
-
})
|
|
37
|
-
}
|
|
38
|
-
})
|
|
39
35
|
</script>
|
|
40
36
|
|
|
41
37
|
{#snippet content()}
|
|
@@ -58,6 +54,12 @@
|
|
|
58
54
|
{...attributes as HTMLButtonAttributes}
|
|
59
55
|
{disabled}
|
|
60
56
|
bind:this={element}
|
|
57
|
+
onclick={(event) => {
|
|
58
|
+
if (toggle) {
|
|
59
|
+
selectedState = !selectedState
|
|
60
|
+
}
|
|
61
|
+
;(onclick as MouseEventHandler<HTMLButtonElement>)?.(event)
|
|
62
|
+
}}
|
|
61
63
|
class={[
|
|
62
64
|
'np-icon-button',
|
|
63
65
|
disabled ? `${variant}-disabled disabled` : `${variant} enabled`,
|
package/dist/card/Card.svelte
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import Ripple from '../ripple/Ripple.svelte'
|
|
3
|
+
import type { FocusEventHandler } from 'svelte/elements'
|
|
3
4
|
import type { CardProps } from './types.ts'
|
|
4
5
|
|
|
5
6
|
let {
|
|
@@ -12,6 +13,8 @@
|
|
|
12
13
|
supportingText,
|
|
13
14
|
action,
|
|
14
15
|
children,
|
|
16
|
+
onblur,
|
|
17
|
+
onfocus,
|
|
15
18
|
...attributes
|
|
16
19
|
}: CardProps = $props()
|
|
17
20
|
|
|
@@ -28,16 +31,6 @@
|
|
|
28
31
|
})
|
|
29
32
|
}
|
|
30
33
|
})
|
|
31
|
-
$effect(() => {
|
|
32
|
-
if (element) {
|
|
33
|
-
element.addEventListener('focus', () => {
|
|
34
|
-
focused = true
|
|
35
|
-
})
|
|
36
|
-
element.addEventListener('blur', () => {
|
|
37
|
-
focused = false
|
|
38
|
-
})
|
|
39
|
-
}
|
|
40
|
-
})
|
|
41
34
|
</script>
|
|
42
35
|
|
|
43
36
|
{#snippet content()}
|
|
@@ -77,6 +70,12 @@
|
|
|
77
70
|
{...attributes}
|
|
78
71
|
bind:this={element}
|
|
79
72
|
aria-disabled={disabled}
|
|
73
|
+
onfocus={(event) => {
|
|
74
|
+
;(onfocus as FocusEventHandler<HTMLDivElement>)?.(event)
|
|
75
|
+
}}
|
|
76
|
+
onblur={(event) => {
|
|
77
|
+
;(onblur as FocusEventHandler<HTMLDivElement>)?.(event)
|
|
78
|
+
}}
|
|
80
79
|
class={[
|
|
81
80
|
'np-card-container',
|
|
82
81
|
`np-card-${variant}`,
|
|
@@ -91,6 +90,14 @@
|
|
|
91
90
|
aria-disabled={disabled}
|
|
92
91
|
{...attributes}
|
|
93
92
|
bind:this={element}
|
|
93
|
+
onfocus={(event) => {
|
|
94
|
+
focused = true
|
|
95
|
+
;(onfocus as FocusEventHandler<HTMLButtonElement>)?.(event)
|
|
96
|
+
}}
|
|
97
|
+
onblur={(event) => {
|
|
98
|
+
focused = false
|
|
99
|
+
;(onblur as FocusEventHandler<HTMLButtonElement>)?.(event)
|
|
100
|
+
}}
|
|
94
101
|
{disabled}
|
|
95
102
|
class={[
|
|
96
103
|
'np-card-container',
|
|
@@ -108,11 +115,13 @@
|
|
|
108
115
|
aria-disabled={disabled}
|
|
109
116
|
tabindex={disabled ? -1 : undefined}
|
|
110
117
|
role="link"
|
|
111
|
-
|
|
118
|
+
onfocus={(event) => {
|
|
112
119
|
focused = true
|
|
120
|
+
;(onfocus as FocusEventHandler<HTMLAnchorElement>)?.(event)
|
|
113
121
|
}}
|
|
114
|
-
|
|
122
|
+
onblur={(event) => {
|
|
115
123
|
focused = false
|
|
124
|
+
;(onblur as FocusEventHandler<HTMLAnchorElement>)?.(event)
|
|
116
125
|
}}
|
|
117
126
|
class={[
|
|
118
127
|
'np-card-container',
|
package/dist/list/Item.svelte
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import Ripple from '../ripple/Ripple.svelte'
|
|
3
|
+
import type { FocusEventHandler } from 'svelte/elements'
|
|
3
4
|
import type { ItemProps } from './types.ts'
|
|
4
5
|
|
|
5
6
|
let {
|
|
@@ -8,22 +9,14 @@
|
|
|
8
9
|
end,
|
|
9
10
|
children,
|
|
10
11
|
supportingText,
|
|
12
|
+
onblur,
|
|
13
|
+
onfocus,
|
|
11
14
|
disabled = false,
|
|
12
15
|
...attributes
|
|
13
16
|
}: ItemProps = $props()
|
|
14
17
|
|
|
15
18
|
let focused = $state(false)
|
|
16
19
|
let element: HTMLButtonElement | HTMLAnchorElement | undefined = $state()
|
|
17
|
-
$effect(() => {
|
|
18
|
-
if (element) {
|
|
19
|
-
element.addEventListener('focus', () => {
|
|
20
|
-
focused = true
|
|
21
|
-
})
|
|
22
|
-
element.addEventListener('blur', () => {
|
|
23
|
-
focused = false
|
|
24
|
-
})
|
|
25
|
-
}
|
|
26
|
-
})
|
|
27
20
|
</script>
|
|
28
21
|
|
|
29
22
|
{#snippet content()}
|
|
@@ -60,12 +53,29 @@
|
|
|
60
53
|
{@render content()}
|
|
61
54
|
</div>
|
|
62
55
|
{:else if attributes.variant === 'text' || attributes.variant === undefined}
|
|
63
|
-
<div
|
|
56
|
+
<div
|
|
57
|
+
{...attributes}
|
|
58
|
+
onfocus={(event) => {
|
|
59
|
+
;(onfocus as FocusEventHandler<HTMLDivElement>)?.(event)
|
|
60
|
+
}}
|
|
61
|
+
onblur={(event) => {
|
|
62
|
+
;(onblur as FocusEventHandler<HTMLDivElement>)?.(event)
|
|
63
|
+
}}
|
|
64
|
+
class={['np-item', selected && 'selected', attributes.class]}
|
|
65
|
+
>
|
|
64
66
|
{@render content()}
|
|
65
67
|
</div>
|
|
66
68
|
{:else if attributes.variant === 'button'}
|
|
67
69
|
<button
|
|
68
70
|
{...attributes}
|
|
71
|
+
onfocus={(event) => {
|
|
72
|
+
focused = true
|
|
73
|
+
;(onfocus as FocusEventHandler<HTMLButtonElement>)?.(event)
|
|
74
|
+
}}
|
|
75
|
+
onblur={(event) => {
|
|
76
|
+
focused = false
|
|
77
|
+
;(onblur as FocusEventHandler<HTMLButtonElement>)?.(event)
|
|
78
|
+
}}
|
|
69
79
|
class={['np-item', selected && 'selected', attributes.class]}
|
|
70
80
|
bind:this={element}
|
|
71
81
|
>{@render content()}
|
|
@@ -73,6 +83,14 @@
|
|
|
73
83
|
{:else if attributes.variant === 'link'}
|
|
74
84
|
<a
|
|
75
85
|
{...attributes}
|
|
86
|
+
onfocus={(event) => {
|
|
87
|
+
focused = true
|
|
88
|
+
;(onfocus as FocusEventHandler<HTMLAnchorElement>)?.(event)
|
|
89
|
+
}}
|
|
90
|
+
onblur={(event) => {
|
|
91
|
+
focused = false
|
|
92
|
+
;(onblur as FocusEventHandler<HTMLAnchorElement>)?.(event)
|
|
93
|
+
}}
|
|
76
94
|
class={['np-item', selected && 'selected', attributes.class]}
|
|
77
95
|
bind:this={element}>{@render content()}</a
|
|
78
96
|
>
|
package/dist/menu/Menu.svelte
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { generateUUIDv4 } from '../utils.js'
|
|
3
2
|
import type { MenuProps } from './types.ts'
|
|
4
3
|
|
|
5
4
|
let {
|
|
@@ -75,7 +74,7 @@
|
|
|
75
74
|
{ passive: true },
|
|
76
75
|
)
|
|
77
76
|
} else if (!anchor.style.getPropertyValue('anchor-name')) {
|
|
78
|
-
const generatedId = `--${
|
|
77
|
+
const generatedId = `--${crypto.randomUUID()}`
|
|
79
78
|
element.style.setProperty('position-anchor', generatedId)
|
|
80
79
|
anchor.style.setProperty('anchor-name', generatedId)
|
|
81
80
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import Menu from '../menu/Menu.svelte'
|
|
3
3
|
import { isFirstInvalidControlInForm } from '../text-field/report-validity.js'
|
|
4
|
-
import { generateUUIDv4 } from '../utils.js'
|
|
5
4
|
import type { SelectProps } from './types.ts'
|
|
6
5
|
import Item from '../list/Item.svelte'
|
|
7
6
|
import { tick } from 'svelte'
|
|
@@ -35,7 +34,7 @@
|
|
|
35
34
|
let selectElement: HTMLSelectElement | undefined = $state()
|
|
36
35
|
let menuElement: HTMLDivElement | undefined = $state()
|
|
37
36
|
let field: HTMLDivElement | undefined = $state()
|
|
38
|
-
let menuId = $state(`--select-${
|
|
37
|
+
let menuId = $state(`--select-${crypto.randomUUID()}`)
|
|
39
38
|
let menuOpen = $state(false)
|
|
40
39
|
let selectedLabel = $derived.by<string>(() => {
|
|
41
40
|
return options.find((option) => option.value === value)?.label || ''
|
|
@@ -51,19 +50,6 @@
|
|
|
51
50
|
selectElement.form?.addEventListener('reset', () => {
|
|
52
51
|
errorRaw = error
|
|
53
52
|
})
|
|
54
|
-
selectElement.addEventListener('invalid', (event) => {
|
|
55
|
-
event.preventDefault()
|
|
56
|
-
const { currentTarget } = event as Event & {
|
|
57
|
-
currentTarget: HTMLInputElement | HTMLTextAreaElement
|
|
58
|
-
}
|
|
59
|
-
errorRaw = true
|
|
60
|
-
if (errorText === '') {
|
|
61
|
-
errorTextRaw = currentTarget.validationMessage
|
|
62
|
-
}
|
|
63
|
-
if (isFirstInvalidControlInForm(currentTarget.form, currentTarget)) {
|
|
64
|
-
currentTarget.focus()
|
|
65
|
-
}
|
|
66
|
-
})
|
|
67
53
|
}
|
|
68
54
|
})
|
|
69
55
|
</script>
|
|
@@ -167,6 +153,17 @@
|
|
|
167
153
|
{form}
|
|
168
154
|
{onchange}
|
|
169
155
|
{oninput}
|
|
156
|
+
oninvalid={(event) => {
|
|
157
|
+
event.preventDefault()
|
|
158
|
+
const { currentTarget } = event
|
|
159
|
+
errorRaw = true
|
|
160
|
+
if (errorText === '') {
|
|
161
|
+
errorTextRaw = currentTarget.validationMessage
|
|
162
|
+
}
|
|
163
|
+
if (isFirstInvalidControlInForm(currentTarget.form, currentTarget)) {
|
|
164
|
+
currentTarget.focus()
|
|
165
|
+
}
|
|
166
|
+
}}
|
|
170
167
|
bind:value
|
|
171
168
|
bind:this={selectElement}
|
|
172
169
|
>
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
},
|
|
15
15
|
showPopover = $bindable(),
|
|
16
16
|
hidePopover = $bindable(),
|
|
17
|
+
onbeforetoggle,
|
|
17
18
|
timeout = 3000,
|
|
18
19
|
element = $bindable(),
|
|
19
20
|
popover = 'auto',
|
|
@@ -30,9 +31,15 @@
|
|
|
30
31
|
hidePopover = () => {
|
|
31
32
|
element?.hidePopover()
|
|
32
33
|
}
|
|
34
|
+
</script>
|
|
33
35
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
+
<div
|
|
37
|
+
{...attributes}
|
|
38
|
+
{popover}
|
|
39
|
+
class={['np-snackbar', attributes.class]}
|
|
40
|
+
bind:this={element}
|
|
41
|
+
onbeforetoggle={(event) => {
|
|
42
|
+
let { newState } = event
|
|
36
43
|
if (newState === 'closed') {
|
|
37
44
|
clearTimeout(timeoutId)
|
|
38
45
|
}
|
|
@@ -41,15 +48,9 @@
|
|
|
41
48
|
element?.hidePopover()
|
|
42
49
|
}, timeout)
|
|
43
50
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
element.addEventListener('beforetoggle', toggleHandler)
|
|
48
|
-
}
|
|
49
|
-
})
|
|
50
|
-
</script>
|
|
51
|
-
|
|
52
|
-
<div {...attributes} {popover} class={['np-snackbar', attributes.class]} bind:this={element}>
|
|
51
|
+
onbeforetoggle?.(event)
|
|
52
|
+
}}
|
|
53
|
+
>
|
|
53
54
|
<div class="np-snackbar-inner">
|
|
54
55
|
<div class="np-snackbar-label-container">
|
|
55
56
|
<div class="np-snackbar-label">{label}</div>
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { generateUUIDv4 } from '../utils.js'
|
|
3
2
|
import type { TooltipProps } from './types.ts'
|
|
4
3
|
|
|
5
4
|
let {
|
|
@@ -46,7 +45,7 @@
|
|
|
46
45
|
if (anchor && element) {
|
|
47
46
|
if ('anchorName' in document.documentElement.style) {
|
|
48
47
|
const anchorName = anchor.style.getPropertyValue('anchor-name')
|
|
49
|
-
const generatedId = anchorName || `--${
|
|
48
|
+
const generatedId = anchorName || `--${crypto.randomUUID()}`
|
|
50
49
|
element.style.setProperty('position-anchor', generatedId)
|
|
51
50
|
if (!anchorName) {
|
|
52
51
|
anchor.style.setProperty('anchor-name', generatedId)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "noph-ui",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.13",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"homepage": "https://noph.dev",
|
|
6
6
|
"repository": {
|
|
@@ -59,17 +59,17 @@
|
|
|
59
59
|
"@sveltejs/package": "^2.3.9",
|
|
60
60
|
"@sveltejs/vite-plugin-svelte": "^5.0.3",
|
|
61
61
|
"@types/eslint": "^9.6.1",
|
|
62
|
-
"eslint": "^9.
|
|
62
|
+
"eslint": "^9.19.0",
|
|
63
63
|
"eslint-config-prettier": "^10.0.1",
|
|
64
64
|
"eslint-plugin-svelte": "^2.46.1",
|
|
65
65
|
"globals": "^15.14.0",
|
|
66
66
|
"prettier": "^3.4.2",
|
|
67
67
|
"prettier-plugin-svelte": "^3.3.3",
|
|
68
68
|
"publint": "^0.3.2",
|
|
69
|
-
"svelte": "^5.19.
|
|
69
|
+
"svelte": "^5.19.3",
|
|
70
70
|
"svelte-check": "^4.1.4",
|
|
71
71
|
"typescript": "^5.7.3",
|
|
72
|
-
"typescript-eslint": "^8.
|
|
72
|
+
"typescript-eslint": "^8.22.0",
|
|
73
73
|
"vite": "^6.0.11",
|
|
74
74
|
"vitest": "^3.0.4"
|
|
75
75
|
},
|
package/dist/utils.d.ts
DELETED
package/dist/utils.js
DELETED