001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.juneau.bean.html5;
018
019import java.net.*;
020
021import org.apache.juneau.*;
022import org.apache.juneau.annotation.*;
023import org.apache.juneau.internal.*;
024
025/**
026 * DTO for an HTML <a class="doclink" href="https://www.w3.org/TR/html5/embedded-content-0.html#the-img-element">&lt;img&gt;</a>
027 * element.
028 *
029 * <p>
030 * The img element represents an image in the document. It is a void element that embeds an image
031 * into the page. The alt attribute is required for accessibility, providing alternative text
032 * for screen readers and when images cannot be displayed.
033 *
034 * <h5 class='section'>Examples:</h5>
035 * <p class='bcode w800'>
036 *    <jk>import static</jk> org.apache.juneau.bean.html5.HtmlBuilder.*;
037 * 
038 *    <jc>// Simple image with alt text</jc>
039 *    Img <jv>img1</jv> = <jsm>img</jsm>()
040 *       .src(<js>"photo.jpg"</js>)
041 *       .alt(<js>"A beautiful sunset over the mountains"</js>);
042 * 
043 *    <jc>// Image with dimensions and styling</jc>
044 *    Img <jv>img2</jv> = <jsm>img</jsm>()
045 *       .src(<js>"logo.png"</js>)
046 *       .alt(<js>"Company Logo"</js>)
047 *       .width(<js>"200"</js>)
048 *       .height(<js>"100"</js>)
049 *       ._class(<js>"logo"</js>);
050 * 
051 *    <jc>// Image with CORS and image map</jc>
052 *    Img <jv>img3</jv> = <jsm>img</jsm>()
053 *       .src(<js>"https://example.com/image.jpg"</js>)
054 *       .alt(<js>"Interactive image"</js>)
055 *       .crossorigin(<js>"anonymous"</js>)
056 *       .usemap(<js>"#imagemap"</js>);
057 * 
058 *    <jc>// Responsive image with multiple sources</jc>
059 *    Img <jv>img4</jv> = <jsm>img</jsm>()
060 *       .src(<js>"image-800w.jpg"</js>)
061 *       .alt(<js>"Responsive image"</js>)
062 *       .sizes(<js>"(max-width: 600px) 100vw, 50vw"</js>)
063 *       .srcset(<js>"image-400w.jpg 400w, image-800w.jpg 800w"</js>);
064 * </p>
065 *
066 * <p>
067 * The following convenience methods are provided for constructing instances of this bean:
068 * <ul class='javatree'>
069 *    <li class='jc'>{@link HtmlBuilder}
070 *    <ul class='javatree'>
071 *       <li class='jm'>{@link HtmlBuilder#img() img()}
072 *    </ul>
073 * </ul>
074 * </p>
075 *
076 * <h5 class='section'>See Also:</h5><ul>
077 *    <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/JuneauBeanHtml5">juneau-bean-html5</a>
078 * </ul>
079 */
080@Bean(typeName="img")
081public class Img extends HtmlElementVoid {
082
083   /**
084    * Creates an empty {@link Img} element.
085    */
086   public Img() {}
087
088   /**
089    * Creates an {@link Img} element with the specified {@link Img#src(Object)} attribute.
090    *
091    * @param src The {@link Img#src(Object)} attribute.
092    */
093   public Img(Object src) {
094      src(src);
095   }
096
097   /**
098    * <a class="doclink" href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-img-alt">alt</a> attribute.
099    *
100    * <p>
101    * Specifies alternative text for the image. This text is displayed when the image cannot be loaded
102    * and is used by screen readers for accessibility.
103    *
104    * <p>
105    * The alt text should be descriptive and convey the same information as the image.
106    *
107    * @param alt Alternative text for the image.
108    * @return This object.
109    */
110   public Img alt(String value) {
111      attr("alt", value);
112      return this;
113   }
114
115   /**
116    * <a class="doclink" href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-img-crossorigin">crossorigin</a>
117    * attribute.
118    *
119    * <p>
120    * Specifies how the element handles cross-origin requests for CORS (Cross-Origin Resource Sharing).
121    *
122    * <p>
123    * Possible values:
124    * <ul>
125    *    <li><js>"anonymous"</js> - Cross-origin requests are made without credentials</li>
126    *    <li><js>"use-credentials"</js> - Cross-origin requests include credentials</li>
127    * </ul>
128    *
129    * @param crossorigin How to handle cross-origin requests.
130    * @return This object.
131    */
132   public Img crossorigin(String value) {
133      attr("crossorigin", value);
134      return this;
135   }
136
137   /**
138    * <a class="doclink" href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-dim-height">height</a>
139    * attribute.
140    *
141    * <p>
142    * Vertical dimension.
143    *
144    * @param height
145    *    The new value for this attribute.
146    *    Typically a {@link Number} or {@link String}.
147    * @return This object.
148    */
149   public Img height(Object value) {
150      attr("height", value);
151      return this;
152   }
153
154   /**
155    * <a class="doclink" href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-img-ismap">ismap</a> attribute.
156    *
157    * <p>
158    * Whether the image is a server-side image map.
159    *
160    * <p>
161    * This attribute uses deminimized values:
162    * <ul>
163    *    <li><jk>false</jk> - Attribute is not added</li>
164    *    <li><jk>true</jk> - Attribute is added as <js>"ismap"</js></li>
165    *    <li>Other values - Passed through as-is</li>
166    * </ul>
167    *
168    * @param ismap
169    *    The new value for this attribute.
170    *    Typically a {@link Boolean} or {@link String}.
171    * @return This object.
172    */
173   public Img ismap(Object value) {
174      attr("ismap", deminimize(value, "ismap"));
175      return this;
176   }
177
178   /**
179    * <a class="doclink" href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-img-src">src</a> attribute.
180    *
181    * <p>
182    * Address of the resource.
183    *
184    * <p>
185    * The value can be of any of the following types: {@link URI}, {@link URL}, {@link String}.
186    * Strings must be valid URIs.
187    *
188    * <p>
189    * URIs defined by {@link UriResolver} can be used for values.
190    *
191    * @param src
192    *    The new value for this attribute.
193    *    Typically a {@link URL} or {@link String}.
194    * @return This object.
195    */
196   public Img src(Object value) {
197      attrUri("src", value);
198      return this;
199   }
200
201   /**
202    * <a class="doclink" href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-hyperlink-usemap">usemap</a>
203    * attribute.
204    *
205    * <p>
206    * Specifies the name of an image map to use with this image. The value should correspond to
207    * the name attribute of a map element that defines clickable areas on the image.
208    *
209    * <p>
210    * The value should start with "#" followed by the name of the map element.
211    *
212    * @param usemap The name of the image map to use (e.g., "#mymap").
213    * @return This object.
214    */
215   public Img usemap(String value) {
216      attr("usemap", value);
217      return this;
218   }
219
220   /**
221    * <a class="doclink" href="https://www.w3.org/TR/html5/embedded-content-0.html#attr-dim-width">width</a> attribute.
222    *
223    * <p>
224    * Horizontal dimension.
225    *
226    * @param width
227    *    The new value for this attribute.
228    *    Typically a {@link Number} or {@link String}.
229    * @return This object.
230    */
231   public Img width(Object value) {
232      attr("width", value);
233      return this;
234   }
235
236   //-----------------------------------------------------------------------------------------------------------------
237   // Overridden methods
238   //-----------------------------------------------------------------------------------------------------------------
239   @Override /* Overridden from HtmlElement */
240   public Img _class(String value) {  // NOSONAR - Intentional naming.
241      super._class(value);
242      return this;
243   }
244
245   @Override /* Overridden from HtmlElement */
246   public Img accesskey(String value) {
247      super.accesskey(value);
248      return this;
249   }
250
251   @Override /* Overridden from HtmlElement */
252   public Img contenteditable(Object value) {
253      super.contenteditable(value);
254      return this;
255   }
256
257   @Override /* Overridden from HtmlElement */
258   public Img dir(String value) {
259      super.dir(value);
260      return this;
261   }
262
263   @Override /* Overridden from HtmlElement */
264   public Img hidden(Object value) {
265      super.hidden(value);
266      return this;
267   }
268
269   @Override /* Overridden from HtmlElement */
270   public Img id(String value) {
271      super.id(value);
272      return this;
273   }
274
275   @Override /* Overridden from HtmlElement */
276   public Img lang(String value) {
277      super.lang(value);
278      return this;
279   }
280
281   @Override /* Overridden from HtmlElement */
282   public Img onabort(String value) {
283      super.onabort(value);
284      return this;
285   }
286
287   @Override /* Overridden from HtmlElement */
288   public Img onblur(String value) {
289      super.onblur(value);
290      return this;
291   }
292
293   @Override /* Overridden from HtmlElement */
294   public Img oncancel(String value) {
295      super.oncancel(value);
296      return this;
297   }
298
299   @Override /* Overridden from HtmlElement */
300   public Img oncanplay(String value) {
301      super.oncanplay(value);
302      return this;
303   }
304
305   @Override /* Overridden from HtmlElement */
306   public Img oncanplaythrough(String value) {
307      super.oncanplaythrough(value);
308      return this;
309   }
310
311   @Override /* Overridden from HtmlElement */
312   public Img onchange(String value) {
313      super.onchange(value);
314      return this;
315   }
316
317   @Override /* Overridden from HtmlElement */
318   public Img onclick(String value) {
319      super.onclick(value);
320      return this;
321   }
322
323   @Override /* Overridden from HtmlElement */
324   public Img oncuechange(String value) {
325      super.oncuechange(value);
326      return this;
327   }
328
329   @Override /* Overridden from HtmlElement */
330   public Img ondblclick(String value) {
331      super.ondblclick(value);
332      return this;
333   }
334
335   @Override /* Overridden from HtmlElement */
336   public Img ondurationchange(String value) {
337      super.ondurationchange(value);
338      return this;
339   }
340
341   @Override /* Overridden from HtmlElement */
342   public Img onemptied(String value) {
343      super.onemptied(value);
344      return this;
345   }
346
347   @Override /* Overridden from HtmlElement */
348   public Img onended(String value) {
349      super.onended(value);
350      return this;
351   }
352
353   @Override /* Overridden from HtmlElement */
354   public Img onerror(String value) {
355      super.onerror(value);
356      return this;
357   }
358
359   @Override /* Overridden from HtmlElement */
360   public Img onfocus(String value) {
361      super.onfocus(value);
362      return this;
363   }
364
365   @Override /* Overridden from HtmlElement */
366   public Img oninput(String value) {
367      super.oninput(value);
368      return this;
369   }
370
371   @Override /* Overridden from HtmlElement */
372   public Img oninvalid(String value) {
373      super.oninvalid(value);
374      return this;
375   }
376
377   @Override /* Overridden from HtmlElement */
378   public Img onkeydown(String value) {
379      super.onkeydown(value);
380      return this;
381   }
382
383   @Override /* Overridden from HtmlElement */
384   public Img onkeypress(String value) {
385      super.onkeypress(value);
386      return this;
387   }
388
389   @Override /* Overridden from HtmlElement */
390   public Img onkeyup(String value) {
391      super.onkeyup(value);
392      return this;
393   }
394
395   @Override /* Overridden from HtmlElement */
396   public Img onload(String value) {
397      super.onload(value);
398      return this;
399   }
400
401   @Override /* Overridden from HtmlElement */
402   public Img onloadeddata(String value) {
403      super.onloadeddata(value);
404      return this;
405   }
406
407   @Override /* Overridden from HtmlElement */
408   public Img onloadedmetadata(String value) {
409      super.onloadedmetadata(value);
410      return this;
411   }
412
413   @Override /* Overridden from HtmlElement */
414   public Img onloadstart(String value) {
415      super.onloadstart(value);
416      return this;
417   }
418
419   @Override /* Overridden from HtmlElement */
420   public Img onmousedown(String value) {
421      super.onmousedown(value);
422      return this;
423   }
424
425   @Override /* Overridden from HtmlElement */
426   public Img onmouseenter(String value) {
427      super.onmouseenter(value);
428      return this;
429   }
430
431   @Override /* Overridden from HtmlElement */
432   public Img onmouseleave(String value) {
433      super.onmouseleave(value);
434      return this;
435   }
436
437   @Override /* Overridden from HtmlElement */
438   public Img onmousemove(String value) {
439      super.onmousemove(value);
440      return this;
441   }
442
443   @Override /* Overridden from HtmlElement */
444   public Img onmouseout(String value) {
445      super.onmouseout(value);
446      return this;
447   }
448
449   @Override /* Overridden from HtmlElement */
450   public Img onmouseover(String value) {
451      super.onmouseover(value);
452      return this;
453   }
454
455   @Override /* Overridden from HtmlElement */
456   public Img onmouseup(String value) {
457      super.onmouseup(value);
458      return this;
459   }
460
461   @Override /* Overridden from HtmlElement */
462   public Img onmousewheel(String value) {
463      super.onmousewheel(value);
464      return this;
465   }
466
467   @Override /* Overridden from HtmlElement */
468   public Img onpause(String value) {
469      super.onpause(value);
470      return this;
471   }
472
473   @Override /* Overridden from HtmlElement */
474   public Img onplay(String value) {
475      super.onplay(value);
476      return this;
477   }
478
479   @Override /* Overridden from HtmlElement */
480   public Img onplaying(String value) {
481      super.onplaying(value);
482      return this;
483   }
484
485   @Override /* Overridden from HtmlElement */
486   public Img onprogress(String value) {
487      super.onprogress(value);
488      return this;
489   }
490
491   @Override /* Overridden from HtmlElement */
492   public Img onratechange(String value) {
493      super.onratechange(value);
494      return this;
495   }
496
497   @Override /* Overridden from HtmlElement */
498   public Img onreset(String value) {
499      super.onreset(value);
500      return this;
501   }
502
503   @Override /* Overridden from HtmlElement */
504   public Img onresize(String value) {
505      super.onresize(value);
506      return this;
507   }
508
509   @Override /* Overridden from HtmlElement */
510   public Img onscroll(String value) {
511      super.onscroll(value);
512      return this;
513   }
514
515   @Override /* Overridden from HtmlElement */
516   public Img onseeked(String value) {
517      super.onseeked(value);
518      return this;
519   }
520
521   @Override /* Overridden from HtmlElement */
522   public Img onseeking(String value) {
523      super.onseeking(value);
524      return this;
525   }
526
527   @Override /* Overridden from HtmlElement */
528   public Img onselect(String value) {
529      super.onselect(value);
530      return this;
531   }
532
533   @Override /* Overridden from HtmlElement */
534   public Img onshow(String value) {
535      super.onshow(value);
536      return this;
537   }
538
539   @Override /* Overridden from HtmlElement */
540   public Img onstalled(String value) {
541      super.onstalled(value);
542      return this;
543   }
544
545   @Override /* Overridden from HtmlElement */
546   public Img onsubmit(String value) {
547      super.onsubmit(value);
548      return this;
549   }
550
551   @Override /* Overridden from HtmlElement */
552   public Img onsuspend(String value) {
553      super.onsuspend(value);
554      return this;
555   }
556
557   @Override /* Overridden from HtmlElement */
558   public Img ontimeupdate(String value) {
559      super.ontimeupdate(value);
560      return this;
561   }
562
563   @Override /* Overridden from HtmlElement */
564   public Img ontoggle(String value) {
565      super.ontoggle(value);
566      return this;
567   }
568
569   @Override /* Overridden from HtmlElement */
570   public Img onvolumechange(String value) {
571      super.onvolumechange(value);
572      return this;
573   }
574
575   @Override /* Overridden from HtmlElement */
576   public Img onwaiting(String value) {
577      super.onwaiting(value);
578      return this;
579   }
580
581   @Override /* Overridden from HtmlElement */
582   public Img spellcheck(Object value) {
583      super.spellcheck(value);
584      return this;
585   }
586
587   @Override /* Overridden from HtmlElement */
588   public Img style(String value) {
589      super.style(value);
590      return this;
591   }
592
593   @Override /* Overridden from HtmlElement */
594   public Img tabindex(Object value) {
595      super.tabindex(value);
596      return this;
597   }
598
599   @Override /* Overridden from HtmlElement */
600   public Img title(String value) {
601      super.title(value);
602      return this;
603   }
604
605   @Override /* Overridden from HtmlElement */
606   public Img translate(Object value) {
607      super.translate(value);
608      return this;
609   }
610}