@uibit/sentiment-selector 0.1.1 → 0.2.0
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/README.md +1 -1
- package/custom-elements.json +2 -0
- package/dist/frameworks/angular/index.ts +83 -74
- package/dist/frameworks/astro/index.d.ts +8 -1
- package/dist/frameworks/preact/index.d.ts +4 -0
- package/dist/frameworks/react/index.ts +127 -0
- package/dist/frameworks/solid/index.d.ts +2 -2
- package/dist/frameworks/stencil/index.d.ts +4 -0
- package/dist/frameworks/svelte/index.svelte +51 -19
- package/dist/frameworks/vue/index.ts +104 -26
- package/dist/sentiment-selector.d.ts +3 -0
- package/dist/sentiment-selector.d.ts.map +1 -1
- package/dist/sentiment-selector.js.map +1 -1
- package/package.json +3 -3
- package/dist/frameworks/react/index.d.ts +0 -22
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@uibit/sentiment-selector)
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
[Interactive Demonstration](https://rawlings.github.io/uibit/sentiment-
|
|
6
|
+
[Interactive Demonstration](https://rawlings.github.io/uibit/components/sentiment-selector)
|
|
7
7
|
|
|
8
8
|
## Installation
|
|
9
9
|
|
package/custom-elements.json
CHANGED
|
@@ -142,6 +142,7 @@
|
|
|
142
142
|
"type": {
|
|
143
143
|
"text": "string"
|
|
144
144
|
},
|
|
145
|
+
"description": "The selected rating value.",
|
|
145
146
|
"attribute": "value",
|
|
146
147
|
"reflects": true
|
|
147
148
|
},
|
|
@@ -447,6 +448,7 @@
|
|
|
447
448
|
"type": {
|
|
448
449
|
"text": "string"
|
|
449
450
|
},
|
|
451
|
+
"description": "The selected rating value.",
|
|
450
452
|
"fieldName": "value"
|
|
451
453
|
},
|
|
452
454
|
{
|
|
@@ -1,84 +1,93 @@
|
|
|
1
|
-
import { Component, ChangeDetectionStrategy, ElementRef, input, effect, output, booleanAttribute, numberAttribute, forwardRef } from '@angular/core';
|
|
1
|
+
import { Component, ChangeDetectionStrategy, ElementRef, model, input, effect, output, booleanAttribute, numberAttribute, forwardRef } from '@angular/core';
|
|
2
2
|
import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';
|
|
3
3
|
import '@uibit/sentiment-selector';
|
|
4
4
|
import type { SentimentSelector as HTMLElementClass } from '@uibit/sentiment-selector';
|
|
5
|
-
|
|
6
5
|
@Component({
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
6
|
+
selector: 'uibit-sentiment-selector',
|
|
7
|
+
template: '<ng-content></ng-content>',
|
|
8
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
9
|
+
standalone: true,
|
|
10
|
+
providers: [
|
|
11
|
+
{
|
|
12
|
+
provide: NG_VALUE_ACCESSOR,
|
|
13
|
+
useExisting: forwardRef(()=>NgxSentimentSelector),
|
|
14
|
+
multi: true
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
host: {
|
|
18
|
+
'(sentiment-change)': 'sentimentChange.emit($event); value.set($event.detail?.value !== undefined ? $event.detail.value : $event.target.value); handleInput($event)',
|
|
19
|
+
'(sentiment-submit)': 'sentimentSubmit.emit($event); value.set($event.detail?.value !== undefined ? $event.detail.value : $event.target.value); handleInput($event)'
|
|
16
20
|
}
|
|
17
|
-
],
|
|
18
|
-
host: {
|
|
19
|
-
'(sentiment-change)': 'sentimentChange.emit($event); handleInput()',
|
|
20
|
-
'(sentiment-submit)': 'sentimentSubmit.emit($event); handleInput()',
|
|
21
|
-
'(blur)': 'handleBlur()',
|
|
22
|
-
'(change)': 'handleInput()',
|
|
23
|
-
'(input)': 'handleInput()'
|
|
24
|
-
}
|
|
25
21
|
})
|
|
26
22
|
export class NgxSentimentSelector implements ControlValueAccessor {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
23
|
+
constructor(private el: ElementRef<HTMLElementClass>){
|
|
24
|
+
effect(()=>{
|
|
25
|
+
if (this.el.nativeElement) {
|
|
26
|
+
this.el.nativeElement.value = this.value();
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
effect(()=>{
|
|
30
|
+
if (this.el.nativeElement) {
|
|
31
|
+
this.el.nativeElement.showLabel = this.showLabel();
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
effect(()=>{
|
|
35
|
+
if (this.el.nativeElement) {
|
|
36
|
+
this.el.nativeElement.valueAsNumber = this.valueAsNumber();
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
effect(()=>{
|
|
40
|
+
if (this.el.nativeElement) {
|
|
41
|
+
this.el.nativeElement.locale = this.locale();
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
readonly value = model<string>(undefined);
|
|
46
|
+
readonly showLabel = input<boolean, any>(true, {
|
|
47
|
+
transform: booleanAttribute
|
|
42
48
|
});
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
this.el.nativeElement.locale = this.locale();
|
|
46
|
-
}
|
|
49
|
+
readonly valueAsNumber = input<number | undefined, any>(undefined, {
|
|
50
|
+
transform: numberAttribute
|
|
47
51
|
});
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
52
|
+
readonly locale = input<string>('');
|
|
53
|
+
readonly sentimentChange = output<CustomEvent<{
|
|
54
|
+
value: number;
|
|
55
|
+
label: string;
|
|
56
|
+
}>>();
|
|
57
|
+
readonly sentimentSubmit = output<CustomEvent<{
|
|
58
|
+
value: number;
|
|
59
|
+
label: string;
|
|
60
|
+
}>>();
|
|
61
|
+
private _onChange: (value: any) => void = ()=>{};
|
|
62
|
+
private _onTouched: () => void = ()=>{};
|
|
63
|
+
writeValue(value: any): void {
|
|
64
|
+
if (value !== undefined) {
|
|
65
|
+
this.value.set(value);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
registerOnChange(fn: any): void {
|
|
69
|
+
this._onChange = fn;
|
|
70
|
+
}
|
|
71
|
+
registerOnTouched(fn: any): void {
|
|
72
|
+
this._onTouched = fn;
|
|
73
|
+
}
|
|
74
|
+
setDisabledState(isDisabled: boolean): void {
|
|
75
|
+
const el = this.el.nativeElement;
|
|
76
|
+
if ('disabled' in el) {
|
|
77
|
+
(el as any).disabled = isDisabled;
|
|
78
|
+
}
|
|
79
|
+
if (isDisabled) {
|
|
80
|
+
el.setAttribute('disabled', '');
|
|
81
|
+
} else {
|
|
82
|
+
el.removeAttribute('disabled');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
handleInput(event: any) {
|
|
86
|
+
const val = event.target.value;
|
|
87
|
+
this.value.set(val);
|
|
88
|
+
this._onChange(val);
|
|
89
|
+
}
|
|
90
|
+
handleBlur() {
|
|
91
|
+
this._onTouched();
|
|
92
|
+
}
|
|
84
93
|
}
|
|
@@ -4,7 +4,14 @@ import '@uibit/sentiment-selector';
|
|
|
4
4
|
declare global {
|
|
5
5
|
namespace astroHTML.JSX {
|
|
6
6
|
interface IntrinsicElements {
|
|
7
|
-
'uibit-sentiment-selector': Partial<HTMLElementClass> & astroHTML.JSX.HTMLAttributes
|
|
7
|
+
'uibit-sentiment-selector': Partial<HTMLElementClass> & astroHTML.JSX.HTMLAttributes & {
|
|
8
|
+
value?: string;
|
|
9
|
+
showLabel?: boolean;
|
|
10
|
+
valueAsNumber?: number | undefined;
|
|
11
|
+
locale?: string;
|
|
12
|
+
"on:sentiment-change"?: (event: CustomEvent<{ value: number, label: string }>) => void;
|
|
13
|
+
"on:sentiment-submit"?: (event: CustomEvent<{ value: number, label: string }>) => void;
|
|
14
|
+
};
|
|
8
15
|
}
|
|
9
16
|
}
|
|
10
17
|
}
|
|
@@ -10,6 +10,10 @@ declare module 'preact' {
|
|
|
10
10
|
showLabel?: boolean;
|
|
11
11
|
valueAsNumber?: number | undefined;
|
|
12
12
|
locale?: string;
|
|
13
|
+
onSentimentChange?: (event: CustomEvent<{ value: number, label: string }>) => void;
|
|
14
|
+
"on:sentiment-change"?: (event: CustomEvent<{ value: number, label: string }>) => void;
|
|
15
|
+
onSentimentSubmit?: (event: CustomEvent<{ value: number, label: string }>) => void;
|
|
16
|
+
"on:sentiment-submit"?: (event: CustomEvent<{ value: number, label: string }>) => void;
|
|
13
17
|
};
|
|
14
18
|
}
|
|
15
19
|
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import React, { useRef, useEffect, useLayoutEffect, useImperativeHandle } from 'react';
|
|
2
|
+
import type { SentimentSelector as HTMLElementClass } from '@uibit/sentiment-selector';
|
|
3
|
+
import '@uibit/sentiment-selector';
|
|
4
|
+
const useTypeOfLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;
|
|
5
|
+
export interface SentimentSelectorProps extends Omit<React.HTMLAttributes<HTMLElementClass>, 'value' | 'showLabel' | 'valueAsNumber' | 'locale' | 'onSentimentChange' | 'onSentimentSubmit'> {
|
|
6
|
+
children?: React.ReactNode;
|
|
7
|
+
value?: string;
|
|
8
|
+
showLabel?: boolean;
|
|
9
|
+
valueAsNumber?: number | undefined;
|
|
10
|
+
locale?: string;
|
|
11
|
+
onSentimentChange?: (event: CustomEvent<{
|
|
12
|
+
value: number;
|
|
13
|
+
label: string;
|
|
14
|
+
}>) => void;
|
|
15
|
+
onSentimentSubmit?: (event: CustomEvent<{
|
|
16
|
+
value: number;
|
|
17
|
+
label: string;
|
|
18
|
+
}>) => void;
|
|
19
|
+
}
|
|
20
|
+
export const SentimentSelector = ({ ref, children, ...props }: SentimentSelectorProps & {
|
|
21
|
+
ref?: React.Ref<HTMLElementClass>;
|
|
22
|
+
})=>{
|
|
23
|
+
const innerRef = useRef<HTMLElementClass>(null);
|
|
24
|
+
const propsRef = useRef(props);
|
|
25
|
+
propsRef.current = props;
|
|
26
|
+
useImperativeHandle(ref, ()=>innerRef.current!);
|
|
27
|
+
useTypeOfLayoutEffect(()=>{
|
|
28
|
+
const element = innerRef.current;
|
|
29
|
+
if (element && props.value !== undefined) {
|
|
30
|
+
(element as any).value = props.value;
|
|
31
|
+
}
|
|
32
|
+
}, [
|
|
33
|
+
props.value
|
|
34
|
+
]);
|
|
35
|
+
useTypeOfLayoutEffect(()=>{
|
|
36
|
+
const element = innerRef.current;
|
|
37
|
+
if (element && props.showLabel !== undefined) {
|
|
38
|
+
(element as any).showLabel = props.showLabel;
|
|
39
|
+
}
|
|
40
|
+
}, [
|
|
41
|
+
props.showLabel
|
|
42
|
+
]);
|
|
43
|
+
useTypeOfLayoutEffect(()=>{
|
|
44
|
+
const element = innerRef.current;
|
|
45
|
+
if (element && props.valueAsNumber !== undefined) {
|
|
46
|
+
(element as any).valueAsNumber = props.valueAsNumber;
|
|
47
|
+
}
|
|
48
|
+
}, [
|
|
49
|
+
props.valueAsNumber
|
|
50
|
+
]);
|
|
51
|
+
useTypeOfLayoutEffect(()=>{
|
|
52
|
+
const element = innerRef.current;
|
|
53
|
+
if (element && props.locale !== undefined) {
|
|
54
|
+
(element as any).locale = props.locale;
|
|
55
|
+
}
|
|
56
|
+
}, [
|
|
57
|
+
props.locale
|
|
58
|
+
]);
|
|
59
|
+
useTypeOfLayoutEffect(()=>{
|
|
60
|
+
const element = innerRef.current;
|
|
61
|
+
if (!element) return;
|
|
62
|
+
const handleEvent = (event: Event)=>{
|
|
63
|
+
if (propsRef.current.onSentimentChange) {
|
|
64
|
+
propsRef.current.onSentimentChange(event as any);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
element.addEventListener('sentiment-change', handleEvent);
|
|
68
|
+
return ()=>{
|
|
69
|
+
element.removeEventListener('sentiment-change', handleEvent);
|
|
70
|
+
};
|
|
71
|
+
}, []);
|
|
72
|
+
useTypeOfLayoutEffect(()=>{
|
|
73
|
+
const element = innerRef.current;
|
|
74
|
+
if (!element) return;
|
|
75
|
+
const handleEvent = (event: Event)=>{
|
|
76
|
+
if (propsRef.current.onSentimentSubmit) {
|
|
77
|
+
propsRef.current.onSentimentSubmit(event as any);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
element.addEventListener('sentiment-submit', handleEvent);
|
|
81
|
+
return ()=>{
|
|
82
|
+
element.removeEventListener('sentiment-submit', handleEvent);
|
|
83
|
+
};
|
|
84
|
+
}, []);
|
|
85
|
+
const domProps = {
|
|
86
|
+
...props
|
|
87
|
+
};
|
|
88
|
+
const customPropNames = [
|
|
89
|
+
'value',
|
|
90
|
+
'showLabel',
|
|
91
|
+
'valueAsNumber',
|
|
92
|
+
'locale',
|
|
93
|
+
'onSentimentChange',
|
|
94
|
+
'onSentimentSubmit'
|
|
95
|
+
];
|
|
96
|
+
for (const key of customPropNames){
|
|
97
|
+
delete (domProps as any)[key];
|
|
98
|
+
}
|
|
99
|
+
return React.createElement('uibit-sentiment-selector', {
|
|
100
|
+
ref: innerRef,
|
|
101
|
+
...domProps
|
|
102
|
+
}, children);
|
|
103
|
+
};
|
|
104
|
+
declare global {
|
|
105
|
+
namespace React {
|
|
106
|
+
namespace JSX {
|
|
107
|
+
interface IntrinsicElements {
|
|
108
|
+
'uibit-sentiment-selector': React.ClassAttributes<HTMLElementClass> & React.HTMLAttributes<HTMLElementClass> & {
|
|
109
|
+
children?: React.ReactNode;
|
|
110
|
+
class?: string;
|
|
111
|
+
value?: string;
|
|
112
|
+
showLabel?: boolean;
|
|
113
|
+
valueAsNumber?: number | undefined;
|
|
114
|
+
locale?: string;
|
|
115
|
+
onSentimentChange?: (event: CustomEvent<{
|
|
116
|
+
value: number;
|
|
117
|
+
label: string;
|
|
118
|
+
}>) => void;
|
|
119
|
+
onSentimentSubmit?: (event: CustomEvent<{
|
|
120
|
+
value: number;
|
|
121
|
+
label: string;
|
|
122
|
+
}>) => void;
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -10,8 +10,8 @@ declare module 'solid-js' {
|
|
|
10
10
|
showLabel?: boolean;
|
|
11
11
|
valueAsNumber?: number | undefined;
|
|
12
12
|
locale?: string;
|
|
13
|
-
"on:sentiment-change"?: (event: CustomEvent) => void;
|
|
14
|
-
"on:sentiment-submit"?: (event: CustomEvent) => void;
|
|
13
|
+
"on:sentiment-change"?: (event: CustomEvent<{ value: number, label: string }>) => void;
|
|
14
|
+
"on:sentiment-submit"?: (event: CustomEvent<{ value: number, label: string }>) => void;
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
17
|
}
|
|
@@ -9,6 +9,10 @@ declare module '@stencil/core' {
|
|
|
9
9
|
showLabel?: boolean;
|
|
10
10
|
valueAsNumber?: number | undefined;
|
|
11
11
|
locale?: string;
|
|
12
|
+
onSentimentChange?: (event: CustomEvent<{ value: number, label: string }>) => void;
|
|
13
|
+
"on:sentiment-change"?: (event: CustomEvent<{ value: number, label: string }>) => void;
|
|
14
|
+
onSentimentSubmit?: (event: CustomEvent<{ value: number, label: string }>) => void;
|
|
15
|
+
"on:sentiment-submit"?: (event: CustomEvent<{ value: number, label: string }>) => void;
|
|
12
16
|
};
|
|
13
17
|
}
|
|
14
18
|
}
|
|
@@ -1,42 +1,74 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import '@uibit/sentiment-selector';
|
|
3
3
|
import type { SentimentSelector as HTMLElementClass } from '@uibit/sentiment-selector';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
value =
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
|
|
5
|
+
let {
|
|
6
|
+
value = $bindable(),
|
|
7
|
+
showLabel = $bindable(),
|
|
8
|
+
valueAsNumber = $bindable(),
|
|
9
|
+
locale = $bindable(),
|
|
10
|
+
children,
|
|
11
|
+
...restProps
|
|
11
12
|
} = $props<{
|
|
12
|
-
children?:
|
|
13
|
+
children?: import('svelte').Snippet;
|
|
13
14
|
value?: string;
|
|
14
15
|
showLabel?: boolean;
|
|
15
16
|
valueAsNumber?: number | undefined;
|
|
16
17
|
locale?: string;
|
|
17
|
-
|
|
18
|
+
|
|
19
|
+
[key: string]: any;
|
|
18
20
|
}>();
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if (elementRef && value !== undefined) {
|
|
21
|
+
|
|
22
|
+
let elementRef: HTMLElementClass | null = $state(null);
|
|
23
|
+
|
|
24
|
+
$effect(() => {
|
|
25
|
+
if (elementRef && value !== undefined && elementRef.value !== value) {
|
|
24
26
|
elementRef.value = value;
|
|
25
27
|
}
|
|
26
|
-
if (elementRef && showLabel !== undefined) {
|
|
28
|
+
if (elementRef && showLabel !== undefined && elementRef.showLabel !== showLabel) {
|
|
27
29
|
elementRef.showLabel = showLabel;
|
|
28
30
|
}
|
|
29
|
-
if (elementRef && valueAsNumber !== undefined) {
|
|
31
|
+
if (elementRef && valueAsNumber !== undefined && elementRef.valueAsNumber !== valueAsNumber) {
|
|
30
32
|
elementRef.valueAsNumber = valueAsNumber;
|
|
31
33
|
}
|
|
32
|
-
if (elementRef && locale !== undefined) {
|
|
34
|
+
if (elementRef && locale !== undefined && elementRef.locale !== locale) {
|
|
33
35
|
elementRef.locale = locale;
|
|
34
36
|
}
|
|
35
37
|
});
|
|
36
|
-
|
|
38
|
+
|
|
39
|
+
$effect(() => {
|
|
40
|
+
const element = elementRef;
|
|
41
|
+
if (!element) return;
|
|
42
|
+
|
|
43
|
+
const handleEvent = () => {
|
|
44
|
+
if (value !== element.value) {
|
|
45
|
+
value = element.value as any;
|
|
46
|
+
}
|
|
47
|
+
if (showLabel !== element.showLabel) {
|
|
48
|
+
showLabel = element.showLabel as any;
|
|
49
|
+
}
|
|
50
|
+
if (valueAsNumber !== element.valueAsNumber) {
|
|
51
|
+
valueAsNumber = element.valueAsNumber as any;
|
|
52
|
+
}
|
|
53
|
+
if (locale !== element.locale) {
|
|
54
|
+
locale = element.locale as any;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const events = ['change', 'input', 'sentiment-change', 'sentiment-submit'];
|
|
59
|
+
for (const event of events) {
|
|
60
|
+
element.addEventListener(event, handleEvent);
|
|
61
|
+
}
|
|
62
|
+
return () => {
|
|
63
|
+
for (const event of events) {
|
|
64
|
+
element.removeEventListener(event, handleEvent);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
|
|
37
69
|
</script>
|
|
38
70
|
|
|
39
|
-
<uibit-sentiment-selector bind:this={elementRef} {
|
|
71
|
+
<uibit-sentiment-selector bind:this={elementRef} {...restProps}>
|
|
40
72
|
|
|
41
73
|
{#if children}
|
|
42
74
|
{@render children()}
|
|
@@ -1,30 +1,108 @@
|
|
|
1
|
-
import { defineComponent, h } from 'vue';
|
|
1
|
+
import { defineComponent, h, ref, watch } from 'vue';
|
|
2
2
|
import type { SentimentSelector as HTMLElementClass } from '@uibit/sentiment-selector';
|
|
3
3
|
import '@uibit/sentiment-selector';
|
|
4
|
-
|
|
5
4
|
export const SentimentSelector = defineComponent({
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
5
|
+
name: 'SentimentSelector',
|
|
6
|
+
props: {
|
|
7
|
+
value: {
|
|
8
|
+
type: [
|
|
9
|
+
String,
|
|
10
|
+
Number,
|
|
11
|
+
Boolean,
|
|
12
|
+
Array,
|
|
13
|
+
Object
|
|
14
|
+
] as any
|
|
15
|
+
},
|
|
16
|
+
showLabel: {
|
|
17
|
+
type: [
|
|
18
|
+
String,
|
|
19
|
+
Number,
|
|
20
|
+
Boolean,
|
|
21
|
+
Array,
|
|
22
|
+
Object
|
|
23
|
+
] as any
|
|
24
|
+
},
|
|
25
|
+
valueAsNumber: {
|
|
26
|
+
type: [
|
|
27
|
+
String,
|
|
28
|
+
Number,
|
|
29
|
+
Boolean,
|
|
30
|
+
Array,
|
|
31
|
+
Object
|
|
32
|
+
] as any
|
|
33
|
+
},
|
|
34
|
+
locale: {
|
|
35
|
+
type: [
|
|
36
|
+
String,
|
|
37
|
+
Number,
|
|
38
|
+
Boolean,
|
|
39
|
+
Array,
|
|
40
|
+
Object
|
|
41
|
+
] as any
|
|
42
|
+
},
|
|
43
|
+
modelValue: {
|
|
44
|
+
type: [
|
|
45
|
+
String,
|
|
46
|
+
Number,
|
|
47
|
+
Boolean,
|
|
48
|
+
Array,
|
|
49
|
+
Object
|
|
50
|
+
] as any
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
emits: [
|
|
54
|
+
'sentiment-change',
|
|
55
|
+
'sentiment-submit',
|
|
56
|
+
'update:modelValue'
|
|
57
|
+
],
|
|
58
|
+
setup (props, { slots, emit }) {
|
|
59
|
+
const elementRef = ref<HTMLElementClass | null>(null);
|
|
60
|
+
if (true) {
|
|
61
|
+
watch(()=>props.modelValue, (newVal)=>{
|
|
62
|
+
if (elementRef.value && newVal !== undefined && elementRef.value.value !== newVal) {
|
|
63
|
+
elementRef.value.value = newVal;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
watch(()=>props.value, (newVal)=>{
|
|
67
|
+
if (elementRef.value && newVal !== undefined && elementRef.value.value !== newVal) {
|
|
68
|
+
elementRef.value.value = newVal;
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
watch(()=>props.showLabel, (newVal)=>{
|
|
73
|
+
if (elementRef.value && newVal !== undefined) {
|
|
74
|
+
(elementRef.value as any).showLabel = newVal;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
watch(()=>props.valueAsNumber, (newVal)=>{
|
|
78
|
+
if (elementRef.value && newVal !== undefined) {
|
|
79
|
+
(elementRef.value as any).valueAsNumber = newVal;
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
watch(()=>props.locale, (newVal)=>{
|
|
83
|
+
if (elementRef.value && newVal !== undefined) {
|
|
84
|
+
(elementRef.value as any).locale = newVal;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
return ()=>{
|
|
88
|
+
const eventListeners: Record<string, any> = {};
|
|
89
|
+
eventListeners['onSentiment-change'] = (event: Event)=>{
|
|
90
|
+
emit('sentiment-change', event);
|
|
91
|
+
emit('update:modelValue', (event.target as any).value);
|
|
92
|
+
};
|
|
93
|
+
eventListeners['onSentiment-submit'] = (event: Event)=>{
|
|
94
|
+
emit('sentiment-submit', event);
|
|
95
|
+
emit('update:modelValue', (event.target as any).value);
|
|
96
|
+
};
|
|
97
|
+
const mergedProps = {
|
|
98
|
+
...props,
|
|
99
|
+
...eventListeners,
|
|
100
|
+
ref: elementRef
|
|
101
|
+
};
|
|
102
|
+
if (true && props.modelValue !== undefined) {
|
|
103
|
+
(mergedProps as any).value = props.modelValue;
|
|
104
|
+
}
|
|
105
|
+
return h('uibit-sentiment-selector', mergedProps, slots.default?.());
|
|
106
|
+
};
|
|
107
|
+
}
|
|
30
108
|
});
|
|
@@ -40,6 +40,9 @@ declare const SentimentSelector_base: import("@uibit/form-internals").Constructo
|
|
|
40
40
|
export declare class SentimentSelector extends SentimentSelector_base {
|
|
41
41
|
static styles: import("lit").CSSResult;
|
|
42
42
|
private options;
|
|
43
|
+
/**
|
|
44
|
+
* The selected rating value.
|
|
45
|
+
*/
|
|
43
46
|
value: string;
|
|
44
47
|
/** Show the label text for the selected option below the track. */
|
|
45
48
|
showLabel: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentiment-selector.d.ts","sourceRoot":"","sources":["../src/sentiment-selector.ts"],"names":[],"mappings":"AACA,OAAO,EAA2C,YAAY,EAAuB,MAAM,aAAa,CAAC;AAczG,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;;AAUD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uEA+BuE;AACvE,qBACa,iBAAkB,SAAQ,sBAAiC;IACtE,MAAM,CAAC,MAAM,0BAAU;IAEd,OAAO,CAAC,OAAO,CAAsC;
|
|
1
|
+
{"version":3,"file":"sentiment-selector.d.ts","sourceRoot":"","sources":["../src/sentiment-selector.ts"],"names":[],"mappings":"AACA,OAAO,EAA2C,YAAY,EAAuB,MAAM,aAAa,CAAC;AAczG,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;;AAUD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uEA+BuE;AACvE,qBACa,iBAAkB,SAAQ,sBAAiC;IACtE,MAAM,CAAC,MAAM,0BAAU;IAEd,OAAO,CAAC,OAAO,CAAsC;IAE9D;;OAEG;IACgD,KAAK,EAAE,MAAM,CAAC;IAEjE,mEAAmE;IACb,SAAS,UAAQ;IAE9D,OAAO,CAAC,WAAW,CAAC,CAAS;IAEtC,IAAI,aAAa,IAAI,MAAM,GAAG,SAAS,CAEtC;IAED,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAE7C;IAED,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,aAAa;IAYrB,YAAY,SAEX;IAED,OAAO,CAAC,UAAU;IAmBlB,MAAM,oCA0BL;CACF;eAEc,iBAAiB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentiment-selector.js","sourceRoot":"","sources":["../src/sentiment-selector.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAuB,MAAM,aAAa,CAAC;AACzG,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,cAAc,GAAmC;IACrD,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC;IACxB,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC;CACzB,CAAC;AACF,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAQlC,MAAM,eAAe,GAAsB;IACzC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"sentiment-selector.js","sourceRoot":"","sources":["../src/sentiment-selector.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uibit/sentiment-selector",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Micro-feedback widget with a sliding row of expressive emoji options. Selecting an option triggers a spring-curve scale animation, grays out alternatives, and fires scored events instantly on release.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"import": "./dist/index.js"
|
|
12
12
|
},
|
|
13
13
|
"./custom-elements.json": "./custom-elements.json",
|
|
14
|
-
"./react": "./dist/frameworks/react/index.
|
|
14
|
+
"./react": "./dist/frameworks/react/index.ts",
|
|
15
15
|
"./vue": "./dist/frameworks/vue/index.ts",
|
|
16
16
|
"./svelte": "./dist/frameworks/svelte/index.svelte",
|
|
17
17
|
"./angular": "./dist/frameworks/angular/index.ts",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"@types/node": "^20.19.43",
|
|
55
55
|
"lit": "^3.3.3",
|
|
56
56
|
"typescript": "7.0.2",
|
|
57
|
-
"@uibit/codegen": "0.
|
|
57
|
+
"@uibit/codegen": "0.2.0"
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
60
|
"lit": "^3.0.0",
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { HTMLAttributes, ClassAttributes } from 'react';
|
|
2
|
-
import type { SentimentSelector as HTMLElementClass } from '@uibit/sentiment-selector';
|
|
3
|
-
import '@uibit/sentiment-selector';
|
|
4
|
-
|
|
5
|
-
declare global {
|
|
6
|
-
namespace React {
|
|
7
|
-
namespace JSX {
|
|
8
|
-
interface IntrinsicElements {
|
|
9
|
-
'uibit-sentiment-selector': ClassAttributes<HTMLElementClass> & HTMLAttributes<HTMLElementClass> & {
|
|
10
|
-
children?: React.ReactNode;
|
|
11
|
-
class?: string;
|
|
12
|
-
value?: string;
|
|
13
|
-
showLabel?: boolean;
|
|
14
|
-
valueAsNumber?: number | undefined;
|
|
15
|
-
locale?: string;
|
|
16
|
-
onSentimentChange?: (event: any) => void;
|
|
17
|
-
onSentimentSubmit?: (event: any) => void;
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|