@@ -4,16 +4,16 @@ import {
44 component ,
55 computed ,
66 fromDOM ,
7- fromEvents ,
87 getProperty ,
8+ on ,
99 setAttribute ,
1010 setProperty ,
1111 setStyle ,
1212 setText ,
1313} from '../../..'
1414
1515export type FormGaugeProps = {
16- readonly value : number
16+ value : number
1717}
1818
1919export type FormGaugeThreshold = {
@@ -24,29 +24,11 @@ export type FormGaugeThreshold = {
2424
2525export default component (
2626 'form-gauge' ,
27- {
28- value : fromEvents < number > (
29- 'button' ,
30- {
31- click : ( { target, value } ) =>
32- value + ( target . classList . contains ( 'decrement' ) ? - 1 : 1 ) ,
33- keydown : ( { event, value } ) => {
34- const { key } = event as KeyboardEvent
35- if ( [ 'ArrowUp' , 'ArrowDown' , '-' , '+' ] . includes ( key ) ) {
36- event . stopPropagation ( )
37- event . preventDefault ( )
38- return (
39- value +
40- ( key === 'ArrowDown' || key === '-' ? - 1 : 1 )
41- )
42- }
43- } ,
44- } ,
45- fromDOM ( { progress : getProperty ( 'value' ) } , asInteger ( ) ) ,
46- ) ,
47- } ,
48- ( el , { first } ) => {
49- const max = el . querySelector ( 'progress' ) ?. max ?? 100
27+ { value : asInteger ( fromDOM ( { progress : getProperty ( 'value' ) } , 0 ) ) } ,
28+ ( el , { first, useElement } ) => {
29+ const max =
30+ useElement ( 'progress' , 'Add a native <progress> element.' ) . max ??
31+ 100
5032 const thresholds : FormGaugeThreshold [ ] = ( ( ) => {
5133 const attr = el . getAttribute ( 'thresholds' )
5234 if ( ! attr ) return [ ]
@@ -58,9 +40,7 @@ export default component(
5840 } ) ( )
5941 const qualification = computed (
6042 ( ) =>
61- thresholds . find (
62- threshold => el . getSignal ( 'value' ) . get ( ) >= threshold . min ,
63- ) || {
43+ thresholds . find ( threshold => el . value >= threshold . min ) || {
6444 label : '' ,
6545 color : 'var(--color-primary)' ,
6646 } ,
@@ -78,14 +58,31 @@ export default component(
7858 ( ) => `${ ( 240 * el . value ) / max } deg` ,
7959 ) ,
8060 setStyle ( '--form-gauge-color' , ( ) => qualification . get ( ) . color ) ,
81- first (
82- 'small' ,
83- setText ( ( ) => qualification . get ( ) . label ) ,
84- ) ,
61+ first ( 'small' , [ setText ( ( ) => qualification . get ( ) . label ) ] ) ,
8562
86- // Enable/disable buttons based on value
87- first ( 'button.increment' , setProperty ( 'disabled' , ( ) => el . value >= max ) ) ,
88- first ( 'button.decrement' , setProperty ( 'disabled' , ( ) => el . value <= 0 ) )
63+ // Event handlers on buttons and their disabled state
64+ first ( 'button.increment' , [
65+ setProperty ( 'disabled' , ( ) => el . value >= max ) ,
66+ on ( 'click' , ( { event } ) => {
67+ el . value += event . shiftKey ? 10 : 1
68+ } ) ,
69+ ] ) ,
70+ first ( 'button.decrement' , [
71+ setProperty ( 'disabled' , ( ) => el . value <= 0 ) ,
72+ on ( 'click' , ( { event } ) => {
73+ el . value -= event . shiftKey ? 10 : 1
74+ } ) ,
75+ ] ) ,
76+ on ( 'keydown' , ( { event } ) => {
77+ const { key, shiftKey } = event
78+ if ( ( key === 'ArrowLeft' || key === '-' ) && el . value > 0 )
79+ el . value -= shiftKey ? 10 : 1
80+ else if (
81+ ( key === 'ArrowRight' || key === '+' ) &&
82+ el . value < max
83+ )
84+ el . value += shiftKey ? 10 : 1
85+ } ) ,
8986 ]
9087 } ,
9188)
0 commit comments