1414 * You should have received a copy of the GNU Lesser General Public License along with @cldn/components.
1515 * If not, see <https://www.gnu.org/licenses/>.
1616 */
17+ import { NodeComponent } from "./NodeComponent.js" ;
1718
1819/**
1920 * Non-readonly non-method keys
@@ -40,49 +41,36 @@ type ReadableKeys<T> = {
4041 * An {@link !Element} component
4142 * @typeParam T Component element type
4243 */
43- export abstract class BaseComponent < T extends Element > {
44- /**
45- * This component's element
46- */
47- public readonly element : T ;
48-
44+ export abstract class ElementComponent < T extends Element > extends NodeComponent < T > {
4945 /**
5046 * @param element Initial element for this component
5147 * @protected
5248 */
5349 protected constructor ( element : T ) {
54- this . element = element ;
55- }
56-
57- /**
58- * Insert component after the last child
59- */
60- public append ( ...components : BaseComponent < any > [ ] ) {
61- components . forEach ( ( component ) => this . element . appendChild ( component . element ) )
62- return this ;
50+ super ( element ) ;
6351 }
6452
6553 /**
6654 * Insert component before the first child
6755 */
68- public prepend ( ...components : BaseComponent < any > [ ] ) {
69- components . forEach ( ( component ) => this . element . prepend ( component . element ) )
56+ public prepend ( ...components : NodeComponent < any > [ ] ) {
57+ components . forEach ( ( component ) => this . node . prepend ( component . node ) )
7058 return this ;
7159 }
7260
7361 /**
7462 * Add classes
7563 */
7664 public class ( ...classes : string [ ] ) {
77- this . element . classList . add ( ...classes . flatMap ( c => c . split ( " " ) ) ) ;
65+ this . node . classList . add ( ...classes . flatMap ( c => c . split ( " " ) ) ) ;
7866 return this ;
7967 }
8068
8169 /**
8270 * Remove classes
8371 */
8472 public removeClass ( ...classes : string [ ] ) {
85- this . element . classList . remove ( ...classes . flatMap ( c => c . split ( " " ) ) ) ;
73+ this . node . classList . remove ( ...classes . flatMap ( c => c . split ( " " ) ) ) ;
8674 return this ;
8775 }
8876
@@ -91,7 +79,7 @@ export abstract class BaseComponent<T extends Element> {
9179 */
9280 public toggleClass ( ...classes : string [ ] ) {
9381 for ( const c of new Set ( classes . flatMap ( c => c . split ( " " ) ) ) )
94- this . element . classList . toggle ( c ) ;
82+ this . node . classList . toggle ( c ) ;
9583 return this ;
9684 }
9785
@@ -116,7 +104,7 @@ export abstract class BaseComponent<T extends Element> {
116104 * @returns true if component has all the specified classes
117105 */
118106 public hasClass ( ...classes : string [ ] ) {
119- return classes . every ( c => this . element . classList . contains ( c ) ) ;
107+ return classes . every ( c => this . node . classList . contains ( c ) ) ;
120108 }
121109
122110 /**
@@ -125,7 +113,7 @@ export abstract class BaseComponent<T extends Element> {
125113 * @param [value] attribute value
126114 */
127115 public attr ( name : string , value ?: string ) {
128- this . element . setAttribute ( name , value ?? "" ) ;
116+ this . node . setAttribute ( name , value ?? "" ) ;
129117 return this ;
130118 }
131119
@@ -134,23 +122,15 @@ export abstract class BaseComponent<T extends Element> {
134122 * @param name attribute name
135123 */
136124 public removeAttr ( name : string ) {
137- this . element . removeAttribute ( name ) ;
138- return this ;
139- }
140-
141- /**
142- * Set text content
143- */
144- public text ( text : string ) {
145- this . element . textContent = text ;
125+ this . node . removeAttribute ( name ) ;
146126 return this ;
147127 }
148128
149129 /**
150130 * Set inner HTML
151131 */
152132 public html ( html : string ) {
153- this . element . innerHTML = html ;
133+ this . node . innerHTML = html ;
154134 return this ;
155135 }
156136
@@ -160,7 +140,7 @@ export abstract class BaseComponent<T extends Element> {
160140 * @param value property value
161141 */
162142 public set < K extends WritableKeys < T > > ( name : K , value : T [ K ] ) {
163- this . element [ name ] = value ;
143+ this . node [ name ] = value ;
164144 return this ;
165145 }
166146
@@ -169,32 +149,28 @@ export abstract class BaseComponent<T extends Element> {
169149 * @param name property name
170150 */
171151 public get < K extends ReadableKeys < T > > ( name : K ) : T [ K ] {
172- return this . element [ name ] ;
152+ return this . node [ name ] ;
173153 }
174154
175155 /**
176156 * Remove the element
177157 */
178158 public remove ( ) : this {
179- this . element . remove ( ) ;
159+ this . node . remove ( ) ;
180160 return this ;
181161 }
182162
183- /**
184- * Add event listener
185- * @param type
186- * @param listener
187- * @param options
188- */
189- public on < K extends keyof ElementEventMap > ( type : K , listener : ( ev : ElementEventMap [ K ] , component : this) => any , options ?: boolean | AddEventListenerOptions ) {
190- this . element . addEventListener ( type , e => listener ( e , this ) , options ) ;
191- return this ;
163+ public override on < K extends keyof ElementEventMap > ( type : K , listener : ( ev : ElementEventMap [ K ] , component : this) => any ) : typeof this ;
164+ public override on < K extends keyof ElementEventMap > ( type : K , listener : ( ev : ElementEventMap [ K ] , component : this) => any , options : AddEventListenerOptions ) : typeof this ;
165+ public override on < K extends keyof ElementEventMap > ( type : K , listener : ( ev : ElementEventMap [ K ] , component : this) => any , useCapture : boolean ) : typeof this ;
166+ public override on < K extends keyof ElementEventMap > ( type : K , listener : ( ev : ElementEventMap [ K ] , component : this) => any , c ?: boolean | AddEventListenerOptions ) : typeof this {
167+ return super . on ( type as any , listener , c as any ) ;
192168 }
193169
194170 /**
195171 * Get this component's outer HTML
196172 */
197- public toString ( ) {
198- return this . element . outerHTML ;
173+ public override toString ( ) {
174+ return this . node . outerHTML ;
199175 }
200176}
0 commit comments