@supersoniks/concorde 5.0.4 → 5.0.5

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.
Files changed (208) hide show
  1. package/.agents/skills/concorde-component-docs/SKILL.md +194 -0
  2. package/.agents/skills/concorde-component-docs/template.md +45 -0
  3. package/ai/cursor/rules/concorde-theme.mdc +1 -1
  4. package/ai/cursor/rules/concorde.mdc +1 -1
  5. package/ai/skills/concorde/SKILL.md +1 -1
  6. package/ai/skills/concorde-theme/SKILL.md +21 -10
  7. package/build-infos.json +1 -1
  8. package/concorde-core.bundle.js +528 -534
  9. package/concorde-core.es.js +4257 -4212
  10. package/dist/concorde-core.bundle.js +528 -534
  11. package/dist/concorde-core.es.js +4257 -4212
  12. package/dist/docs-mock-api-sw.js +2 -0
  13. package/dist/docs-mock-api-sw.js.map +2 -2
  14. package/docs/assets/index-CD4WyL6o.css +1 -0
  15. package/docs/assets/{index-D8MVWqY6.js → index-wVZpLVYW.js} +1221 -1350
  16. package/docs/crawl/core/components/ui/alert/alert.html +172 -71
  17. package/docs/crawl/core/components/ui/alert-messages/alert-messages.html +113 -5
  18. package/docs/crawl/core/components/ui/badge/badge.html +157 -79
  19. package/docs/crawl/core/components/ui/button/button.html +1 -0
  20. package/docs/crawl/core/components/ui/captcha/captcha.html +90 -8
  21. package/docs/crawl/core/components/ui/card/card.html +222 -68
  22. package/docs/crawl/core/components/ui/divider/divider.html +117 -31
  23. package/docs/crawl/core/components/ui/form/fieldset/fieldset.html +232 -101
  24. package/docs/crawl/core/components/ui/form/form-actions/form-actions.html +95 -52
  25. package/docs/crawl/core/components/ui/form/form-layout/form-layout.html +97 -38
  26. package/docs/crawl/core/components/ui/form/input/input.html +3 -3
  27. package/docs/crawl/core/components/ui/form/textarea/textarea.html +3 -3
  28. package/docs/crawl/core/components/ui/group/group.html +60 -38
  29. package/docs/crawl/core/components/ui/icon/icon.html +136 -47
  30. package/docs/crawl/core/components/ui/image/image.html +244 -56
  31. package/docs/crawl/core/components/ui/link/link.html +67 -9
  32. package/docs/crawl/core/components/ui/loader/loader.html +97 -23
  33. package/docs/crawl/core/components/ui/menu/menu.html +162 -90
  34. package/docs/crawl/core/components/ui/modal/modal.html +275 -50
  35. package/docs/crawl/core/components/ui/pop/pop.html +260 -66
  36. package/docs/crawl/core/components/ui/progress/progress.html +103 -30
  37. package/docs/crawl/core/components/ui/table/table.html +303 -171
  38. package/docs/crawl/core/components/ui/theme/theme.html +131 -0
  39. package/docs/crawl/core/components/ui/toast/toast.html +170 -59
  40. package/docs/crawl/core/components/ui/tooltip/tooltip.html +90 -29
  41. package/docs/crawl/docs/_decorators/ancestor-attribute.html +3 -2
  42. package/docs/crawl/docs/_getting-started/concorde-outside.html +3 -3
  43. package/docs/crawl/docs/_getting-started/start.html +1 -1
  44. package/docs/crawl/docs/_getting-started/theming.html +311 -63
  45. package/docs/crawl/hubs/form-components.html +75 -53
  46. package/docs/crawl/index.html +7 -6
  47. package/docs/docs-mock-api-sw.js +2 -0
  48. package/docs/docs-mock-api-sw.js.map +2 -2
  49. package/docs/index.html +9 -7
  50. package/docs/llms-full.txt +1703 -456
  51. package/docs/llms.txt +25 -32
  52. package/docs/sitemap.xml +3 -0
  53. package/docs/src/core/components/functional/fetch/fetch.md +0 -0
  54. package/docs/src/core/components/functional/if/if.md +0 -0
  55. package/docs/src/core/components/functional/list/list.md +0 -0
  56. package/docs/src/core/components/functional/router/router.md +0 -0
  57. package/docs/src/core/components/functional/sdui/sdui.md +0 -0
  58. package/docs/src/core/components/functional/states/states.md +0 -0
  59. package/docs/src/core/components/functional/submit/submit.md +0 -0
  60. package/docs/src/core/components/ui/alert/alert.md +147 -72
  61. package/docs/src/core/components/ui/alert-messages/alert-messages.md +85 -0
  62. package/docs/src/core/components/ui/badge/badge.md +141 -80
  63. package/docs/src/core/components/ui/button/button.md +1 -0
  64. package/docs/src/core/components/ui/captcha/captcha.md +65 -6
  65. package/docs/src/core/components/ui/card/card.md +183 -65
  66. package/docs/src/core/components/ui/divider/divider.md +107 -13
  67. package/docs/src/core/components/ui/form/fieldset/fieldset.md +175 -99
  68. package/docs/src/core/components/ui/form/form-actions/form-actions.md +75 -52
  69. package/docs/src/core/components/ui/form/form-layout/form-layout.md +109 -34
  70. package/docs/src/core/components/ui/form/input/input.md +1 -1
  71. package/docs/src/core/components/ui/form/radio/radio.md +0 -0
  72. package/docs/src/core/components/ui/form/select/select.md +0 -0
  73. package/docs/src/core/components/ui/form/switch/switch.md +0 -0
  74. package/docs/src/core/components/ui/form/textarea/textarea.md +1 -1
  75. package/docs/src/core/components/ui/group/group.md +36 -36
  76. package/docs/src/core/components/ui/icon/icon.md +132 -43
  77. package/docs/src/core/components/ui/image/image.md +179 -53
  78. package/docs/src/core/components/ui/link/link.md +45 -7
  79. package/docs/src/core/components/ui/loader/loader.md +79 -22
  80. package/docs/src/core/components/ui/menu/menu.md +133 -92
  81. package/docs/src/core/components/ui/modal/modal.md +163 -47
  82. package/docs/src/core/components/ui/pop/pop.md +262 -64
  83. package/docs/src/core/components/ui/progress/progress.md +76 -30
  84. package/docs/src/core/components/ui/table/table.md +147 -171
  85. package/docs/src/core/components/ui/theme/theme.md +122 -0
  86. package/docs/src/core/components/ui/toast/toast.md +108 -58
  87. package/docs/src/core/components/ui/tooltip/tooltip.md +68 -26
  88. package/docs/src/docs/_core-concept/subscriber.md +0 -0
  89. package/docs/src/docs/_decorators/ancestor-attribute.md +3 -2
  90. package/docs/src/docs/_getting-started/concorde-outside.md +3 -3
  91. package/docs/src/docs/_getting-started/my-first-subscriber.md +0 -0
  92. package/docs/src/docs/_getting-started/pubsub.md +0 -0
  93. package/docs/src/docs/_getting-started/start.md +1 -1
  94. package/docs/src/docs/_getting-started/theming.md +223 -61
  95. package/docs/src/docs/search/docs-search.json +3083 -348
  96. package/docs/src/tsconfig.json +63 -3
  97. package/gitlab/job_tests.sh +0 -0
  98. package/index.html +4 -2
  99. package/package.json +7 -1
  100. package/public/docs-mock-api-sw.js +2 -0
  101. package/public/docs-mock-api-sw.js.map +2 -2
  102. package/scripts/post-build-docs.js +0 -0
  103. package/scripts/post-build.mjs +0 -0
  104. package/src/core/components/functional/fetch/fetch.md +0 -0
  105. package/src/core/components/functional/if/if.md +0 -0
  106. package/src/core/components/functional/list/list.demo.ts +0 -0
  107. package/src/core/components/functional/list/list.md +0 -0
  108. package/src/core/components/functional/router/router.md +0 -0
  109. package/src/core/components/functional/router/router.ts +0 -0
  110. package/src/core/components/functional/sdui/sdui.md +0 -0
  111. package/src/core/components/functional/states/states.md +0 -0
  112. package/src/core/components/functional/submit/submit.md +0 -0
  113. package/src/core/components/functional/subscriber/subscriber.ts +0 -0
  114. package/src/core/components/ui/_css/align.ts +1 -0
  115. package/src/core/components/ui/_css/size.ts +0 -0
  116. package/src/core/components/ui/_css/type.ts +86 -8
  117. package/src/core/components/ui/_i18n/ui-aria-labels.ts +8 -0
  118. package/src/core/components/ui/alert/alert.md +21 -2
  119. package/src/core/components/ui/alert-messages/alert-messages.md +85 -0
  120. package/src/core/components/ui/badge/badge.md +19 -6
  121. package/src/core/components/ui/badge/badge.ts +8 -9
  122. package/src/core/components/ui/button/button.ts +5 -15
  123. package/src/core/components/ui/captcha/altchaStyles.ts +0 -0
  124. package/src/core/components/ui/captcha/captcha.md +65 -6
  125. package/src/core/components/ui/card/card.md +73 -10
  126. package/src/core/components/ui/card/card.ts +24 -22
  127. package/src/core/components/ui/divider/divider.md +107 -13
  128. package/src/core/components/ui/divider/divider.ts +40 -33
  129. package/src/core/components/ui/form/fieldset/fieldset.md +175 -99
  130. package/src/core/components/ui/form/fieldset/fieldset.ts +15 -28
  131. package/src/core/components/ui/form/fieldset/legend.ts +13 -13
  132. package/src/core/components/ui/form/form-actions/form-actions.md +75 -52
  133. package/src/core/components/ui/form/form-actions/form-actions.ts +7 -5
  134. package/src/core/components/ui/form/form-layout/form-layout.md +109 -34
  135. package/src/core/components/ui/form/form-layout/form-layout.ts +27 -24
  136. package/src/core/components/ui/form/radio/radio.md +0 -0
  137. package/src/core/components/ui/form/select/select.md +0 -0
  138. package/src/core/components/ui/form/switch/switch.md +0 -0
  139. package/src/core/components/ui/form/textarea/textarea.ts +4 -3
  140. package/src/core/components/ui/group/group.md +36 -36
  141. package/src/core/components/ui/group/group.ts +5 -10
  142. package/src/core/components/ui/icon/icon.md +132 -43
  143. package/src/core/components/ui/image/image.md +35 -3
  144. package/src/core/components/ui/link/link.md +43 -5
  145. package/src/core/components/ui/loader/loader.md +79 -22
  146. package/src/core/components/ui/loader/loader.ts +67 -27
  147. package/src/core/components/ui/loader/styles/fixed.ts +6 -11
  148. package/src/core/components/ui/menu/menu.md +133 -92
  149. package/src/core/components/ui/menu/menu.ts +53 -58
  150. package/src/core/components/ui/modal/modal.md +163 -47
  151. package/src/core/components/ui/modal/modal.ts +2 -4
  152. package/src/core/components/ui/pop/pop.md +217 -123
  153. package/src/core/components/ui/pop/pop.ts +0 -1
  154. package/src/core/components/ui/progress/progress.md +76 -30
  155. package/src/core/components/ui/progress/progress.ts +25 -56
  156. package/src/core/components/ui/table/table-caption.ts +2 -2
  157. package/src/core/components/ui/table/table-tbody.ts +3 -3
  158. package/src/core/components/ui/table/table-td.ts +23 -18
  159. package/src/core/components/ui/table/table-th.ts +8 -8
  160. package/src/core/components/ui/table/table-tr.ts +4 -4
  161. package/src/core/components/ui/table/table.md +147 -171
  162. package/src/core/components/ui/table/table.ts +20 -19
  163. package/src/core/components/ui/theme/theme-collection/auto.ts +15 -0
  164. package/src/core/components/ui/theme/theme-collection/core-variables.ts +8 -31
  165. package/src/core/components/ui/theme/theme-collection/dark.ts +1 -7
  166. package/src/core/components/ui/theme/theme-collection/light.ts +30 -26
  167. package/src/core/components/ui/theme/theme.md +122 -0
  168. package/src/core/components/ui/theme/theme.ts +30 -7
  169. package/src/core/components/ui/toast/toast-item.ts +6 -9
  170. package/src/core/components/ui/toast/toast.md +108 -58
  171. package/src/core/components/ui/toast/types.ts +1 -1
  172. package/src/core/components/ui/tooltip/tooltip.md +68 -26
  173. package/src/core/mixins/Subscriber.ts +0 -0
  174. package/src/core/utils/DataBindObserver.ts +0 -0
  175. package/src/core/utils/Objects.ts +0 -0
  176. package/src/core/utils/route.ts +0 -0
  177. package/src/docs/_core-concept/subscriber.md +0 -0
  178. package/src/docs/_getting-started/my-first-subscriber.md +0 -0
  179. package/src/docs/_getting-started/pubsub.md +0 -0
  180. package/src/docs/_getting-started/start.md +1 -1
  181. package/src/docs/_getting-started/theming.md +223 -61
  182. package/src/docs/code.ts +125 -58
  183. package/src/docs/example/users.ts +0 -0
  184. package/src/docs/header/header.ts +62 -54
  185. package/src/docs/mock-api/router.ts +2 -0
  186. package/src/docs/navigation/navigation.ts +6 -3
  187. package/src/docs/search/docs-search.json +2504 -399
  188. package/src/docs/search/markdown-renderer.ts +6 -6
  189. package/src/docs/search/page.ts +0 -0
  190. package/src/docs/search/search.ts +4 -4
  191. package/src/docs/tailwind/css/tailwind.css +6 -5
  192. package/src/tsconfig.json +18 -0
  193. package/src/tsconfig.tsbuildinfo +1 -1
  194. package/tailwind.config.js +19 -0
  195. package/.github/workflows/ci.yml +0 -21
  196. package/.github-export-ignore +0 -30
  197. package/CONTRIBUTING.md +0 -59
  198. package/DEV.md +0 -54
  199. package/LICENSE +0 -21
  200. package/OPEN_SOURCE_CHECKPOINT.md +0 -133
  201. package/docs/assets/index-DiD0qYvE.css +0 -1
  202. package/docs/src/tsconfig.declarations.json +0 -22
  203. package/docs/src/tsconfig.emit.json +0 -23
  204. package/gitlab/job_github_mirror.sh +0 -39
  205. package/scripts/github-export.mjs +0 -150
  206. package/src/css.d.ts +0 -19
  207. package/src/tsconfig.declarations.json +0 -22
  208. package/src/tsconfig.emit.json +0 -23
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Icon — Concorde</title>
7
- <meta name="description" content="customIconDefaultPrefix=&quot;regular&quot;&gt;">
8
- <meta name="keywords" content="Concorde, supersoniks, core/components/ui/icon/icon, icon, Icon, UI component, sonic-icon, web component">
7
+ <meta name="description" content="sonic-icon renders inline SVG icons from the bundled core set or from CDN libraries. Set name (and library / prefix when needed); scale with size. Icons inherit currentColor and are aria-hidden by def">
8
+ <meta name="keywords" content="Concorde, supersoniks, core/components/ui/icon/icon, icon, Icon, UI component, sonic-icon, web component, name, library, prefix, size, currentColor, aria-hidden, icons.json">
9
9
  <meta name="concorde-doc-id" content="core/components/ui/icon/icon">
10
10
  <link rel="canonical" href="https://concorde.supersoniks.org/crawl/core/components/ui/icon/icon.html">
11
11
  </head>
@@ -15,117 +15,206 @@
15
15
  </header>
16
16
  <main>
17
17
  <article>
18
- <p class="doc-lead" id="doc-summary"><strong>Concorde UI component — Icon</strong>. customIconDefaultPrefix=&quot;regular&quot;&gt; <span>Doc ID: <code>core/components/ui/icon/icon</code>. Keywords: Concorde, supersoniks, core/components/ui/icon/icon, icon, Icon, UI component, sonic-icon, web component. URL: <a href="https://concorde.supersoniks.org/crawl/core/components/ui/icon/icon.html">https://concorde.supersoniks.org/crawl/core/components/ui/icon/icon.html</a>.</span></p>
18
+ <p class="doc-lead" id="doc-summary"><strong>Concorde UI component — Icon</strong>. sonic-icon renders inline SVG icons from the bundled core set or from CDN libraries. Set name (and library / prefix when needed); scale with size. Icons inherit currentColor and are aria-hidden by def <span>Doc ID: <code>core/components/ui/icon/icon</code>. Keywords: Concorde, supersoniks, core/components/ui/icon/icon, icon, Icon, UI component, sonic-icon, web component, name, library, prefix, size, currentColor, aria-hidden, icons.json. URL: <a href="https://concorde.supersoniks.org/crawl/core/components/ui/icon/icon.html">https://concorde.supersoniks.org/crawl/core/components/ui/icon/icon.html</a>.</span></p>
19
19
  <h1 id="icon">Icon</h1>
20
- <h2 id="custom">Custom</h2>
21
- <p >Icons located in the following folder : <span class="text-info">/svg/$prefix/$name.svg<span></p>
22
-
23
-
24
-
25
- <pre><code>&lt;sonic-scope customIconLibraryPath=&quot;/svg/$prefix/$name.svg&quot;
26
- customIconDefaultPrefix=&quot;regular&quot;&gt;
27
- &lt;div class=&quot;grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-8&quot;&gt;
28
- &lt;div class=&quot;text-center&quot;&gt;
29
- &lt;sonic-icon library=&quot;custom&quot; prefix=&quot;regular&quot; name=&quot;plane&quot;&gt;&lt;/sonic-icon&gt;
30
- &lt;br&gt;
31
- &lt;div class=&quot;text-xs mt-1&quot;&gt;regular&lt;/div&gt;
32
- &lt;/div&gt;
33
- &lt;div class=&quot;text-center&quot;&gt;
34
- &lt;sonic-icon library=&quot;custom&quot; prefix=&quot;solid&quot; name=&quot;plane&quot;&gt;&lt;/sonic-icon&gt;
35
- &lt;br&gt;
36
- &lt;div class=&quot;text-xs mt-1&quot;&gt;solid&lt;/div&gt;
37
- &lt;/div&gt;
38
- &lt;div class=&quot;text-center&quot;&gt;
39
- &lt;sonic-icon library=&quot;custom&quot; name=&quot;plane&quot;&gt;&lt;/sonic-icon&gt;
40
- &lt;br&gt;
41
- &lt;div class=&quot;text-xs mt-1&quot;&gt;default prefix&lt;/div&gt;
42
- &lt;/div&gt;
20
+ <p><strong><code>sonic-icon</code></strong> renders inline SVG icons from the <strong>bundled core set</strong> or from <strong>CDN libraries</strong>. Set <strong><code>name</code></strong> (and <strong><code>library</code></strong> / <strong><code>prefix</code></strong> when needed); scale with <strong><code>size</code></strong>. Icons inherit <strong><code>currentColor</code></strong> and are <strong><code>aria-hidden</code></strong> by default—keep visible text nearby or label the control that contains them.</p>
21
+ <h2 id="core-library">Core library</h2>
22
+ <p>Omit <strong><code>library</code></strong> to use the bundled set in <code>icons.json</code>. Available <strong><code>name</code></strong> values: <code>cancel</code> · <code>check</code> · <code>check-circled-outline</code> · <code>emoji-puzzled</code> · <code>info-empty</code> · <code>loader</code> · <code>minus-small</code> · <code>more-horiz</code> · <code>more-vert</code> · <code>nav-arrow-down</code> · <code>warning-circled-outline</code>.</p>
23
+ <pre><code>&lt;div class=&quot;grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-8&quot;&gt;
24
+ &lt;div class=&quot;text-center&quot;&gt;
25
+ &lt;sonic-icon name=&quot;cancel&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
26
+ &lt;div class=&quot;text-xs mt-1&quot;&gt;cancel&lt;/div&gt;
43
27
  &lt;/div&gt;
44
- &lt;/sonic-scope&gt;
28
+ &lt;div class=&quot;text-center&quot;&gt;
29
+ &lt;sonic-icon name=&quot;check&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
30
+ &lt;div class=&quot;text-xs mt-1&quot;&gt;check&lt;/div&gt;
31
+ &lt;/div&gt;
32
+ &lt;div class=&quot;text-center&quot;&gt;
33
+ &lt;sonic-icon name=&quot;check-circled-outline&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
34
+ &lt;div class=&quot;text-xs mt-1&quot;&gt;check-circled-outline&lt;/div&gt;
35
+ &lt;/div&gt;
36
+ &lt;div class=&quot;text-center&quot;&gt;
37
+ &lt;sonic-icon name=&quot;emoji-puzzled&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
38
+ &lt;div class=&quot;text-xs mt-1&quot;&gt;emoji-puzzled&lt;/div&gt;
39
+ &lt;/div&gt;
40
+ &lt;div class=&quot;text-center&quot;&gt;
41
+ &lt;sonic-icon name=&quot;info-empty&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
42
+ &lt;div class=&quot;text-xs mt-1&quot;&gt;info-empty&lt;/div&gt;
43
+ &lt;/div&gt;
44
+ &lt;div class=&quot;text-center&quot;&gt;
45
+ &lt;sonic-icon name=&quot;loader&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
46
+ &lt;div class=&quot;text-xs mt-1&quot;&gt;loader&lt;/div&gt;
47
+ &lt;/div&gt;
48
+ &lt;div class=&quot;text-center&quot;&gt;
49
+ &lt;sonic-icon name=&quot;minus-small&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
50
+ &lt;div class=&quot;text-xs mt-1&quot;&gt;minus-small&lt;/div&gt;
51
+ &lt;/div&gt;
52
+ &lt;div class=&quot;text-center&quot;&gt;
53
+ &lt;sonic-icon name=&quot;more-horiz&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
54
+ &lt;div class=&quot;text-xs mt-1&quot;&gt;more-horiz&lt;/div&gt;
55
+ &lt;/div&gt;
56
+ &lt;div class=&quot;text-center&quot;&gt;
57
+ &lt;sonic-icon name=&quot;more-vert&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
58
+ &lt;div class=&quot;text-xs mt-1&quot;&gt;more-vert&lt;/div&gt;
59
+ &lt;/div&gt;
60
+ &lt;div class=&quot;text-center&quot;&gt;
61
+ &lt;sonic-icon name=&quot;nav-arrow-down&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
62
+ &lt;div class=&quot;text-xs mt-1&quot;&gt;nav-arrow-down&lt;/div&gt;
63
+ &lt;/div&gt;
64
+ &lt;div class=&quot;text-center&quot;&gt;
65
+ &lt;sonic-icon name=&quot;warning-circled-outline&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
66
+ &lt;div class=&quot;text-xs mt-1&quot;&gt;warning-circled-outline&lt;/div&gt;
67
+ &lt;/div&gt;
68
+ &lt;/div&gt;
45
69
  </code></pre>
46
- <h2 id="external">External</h2>
70
+ <h2 id="external-libraries">External libraries</h2>
71
+ <p>Set <strong><code>library</code></strong> to load SVGs from a built-in CDN template. <strong><code>prefix</code></strong> falls back to each library’s default when omitted (<code>outline</code> for <strong><code>heroicons</code></strong>, <strong><code>regular</code></strong> for <strong><code>fontAwesome</code></strong> and <strong><code>material</code></strong>, and so on).</p>
47
72
  <pre><code>&lt;div class=&quot;grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-8&quot;&gt;
48
73
  &lt;sonic-link href=&quot;https://heroicons.com/&quot; target=&quot;_blank&quot; class=&quot;text-center underline&quot;&gt;
49
74
  &lt;sonic-icon library=&quot;heroicons&quot; prefix=&quot;outline&quot; name=&quot;academic-cap&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
50
- &lt;br&gt;
75
+ &lt;br /&gt;
51
76
  &lt;div class=&quot;text-xs mt-1&quot;&gt;heroicons&lt;/div&gt;
52
77
  &lt;/sonic-link&gt;
53
78
  &lt;sonic-link href=&quot;https://iconoir.com/&quot; target=&quot;_blank&quot; class=&quot;text-center underline&quot;&gt;
54
- &lt;sonic-icon library=&quot;iconoir&quot; name=&quot;2x2-cell&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
55
- &lt;br&gt;
79
+ &lt;sonic-icon library=&quot;iconoir&quot; name=&quot;2x2-cell&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
80
+ &lt;br /&gt;
56
81
  &lt;div class=&quot;text-xs mt-1&quot;&gt;iconoir&lt;/div&gt;
57
82
  &lt;/sonic-link&gt;
58
83
  &lt;sonic-link href=&quot;https://materialdesignicons.com/&quot; target=&quot;_blank&quot; class=&quot;text-center underline&quot;&gt;
59
84
  &lt;sonic-icon library=&quot;material&quot; prefix=&quot;outline&quot; name=&quot;email&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
60
- &lt;br&gt;
85
+ &lt;br /&gt;
61
86
  &lt;div class=&quot;text-xs mt-1&quot;&gt;material design&lt;/div&gt;
62
87
  &lt;/sonic-link&gt;
63
88
  &lt;sonic-link href=&quot;https://fontawesome.com/search?o=r&amp;m=free&amp;s=regular&quot; target=&quot;_blank&quot; class=&quot;text-center underline&quot;&gt;
64
89
  &lt;sonic-icon library=&quot;fontAwesome&quot; prefix=&quot;regular&quot; name=&quot;user&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
65
- &lt;br&gt;
90
+ &lt;br /&gt;
66
91
  &lt;div class=&quot;text-xs mt-1&quot;&gt;fontAwesome regular&lt;/div&gt;
67
92
  &lt;/sonic-link&gt;
68
93
  &lt;sonic-link href=&quot;https://fontawesome.com/search?o=r&amp;m=free&amp;s=solid&quot; target=&quot;_blank&quot; class=&quot;text-center underline&quot;&gt;
69
94
  &lt;sonic-icon library=&quot;fontAwesome&quot; prefix=&quot;solid&quot; name=&quot;book&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
70
- &lt;br&gt;
95
+ &lt;br /&gt;
71
96
  &lt;div class=&quot;text-xs mt-1&quot;&gt;fontAwesome solid&lt;/div&gt;
72
97
  &lt;/sonic-link&gt;
73
98
  &lt;sonic-link href=&quot;https://feathericons.com/&quot; target=&quot;_blank&quot; class=&quot;text-center underline&quot;&gt;
74
- &lt;sonic-icon library=&quot;feathers&quot; name=&quot;activity&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
75
- &lt;br&gt;
99
+ &lt;sonic-icon library=&quot;feathers&quot; name=&quot;activity&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
100
+ &lt;br /&gt;
76
101
  &lt;div class=&quot;text-xs mt-1&quot;&gt;feathers&lt;/div&gt;
77
102
  &lt;/sonic-link&gt;
78
103
  &lt;sonic-link href=&quot;https://lucide.dev/&quot; target=&quot;_blank&quot; class=&quot;text-center underline&quot;&gt;
79
- &lt;sonic-icon library=&quot;lucide&quot; name=&quot;album&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
80
- &lt;br&gt;
104
+ &lt;sonic-icon library=&quot;lucide&quot; name=&quot;album&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
105
+ &lt;br /&gt;
81
106
  &lt;div class=&quot;text-xs mt-1&quot;&gt;lucide&lt;/div&gt;
82
107
  &lt;/sonic-link&gt;
83
108
  &lt;/div&gt;
84
109
  </code></pre>
110
+ <h2 id="custom-library">Custom library</h2>
111
+ <p>Use <strong><code>library=&quot;custom&quot;</code></strong> with SVG files on your origin. On an ancestor (for example <strong><code>sonic-scope</code></strong> or <strong><code>sonic-code</code></strong>), set <strong><code>customIconLibraryPath</code></strong> to a URL template with <strong><code>$prefix</code></strong> and <strong><code>$name</code></strong> placeholders, and optionally <strong><code>customIconDefaultPrefix</code></strong> when <strong><code>prefix</code></strong> is omitted.</p>
112
+ <pre><code>&lt;sonic-scope
113
+ customIconLibraryPath=&quot;/svg/$prefix/$name.svg&quot;
114
+ customIconDefaultPrefix=&quot;regular&quot;
115
+ &gt;
116
+ &lt;div class=&quot;grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-8&quot;&gt;
117
+ &lt;div class=&quot;text-center&quot;&gt;
118
+ &lt;sonic-icon library=&quot;custom&quot; prefix=&quot;regular&quot; name=&quot;plane&quot;&gt;&lt;/sonic-icon&gt;
119
+ &lt;br /&gt;
120
+ &lt;div class=&quot;text-xs mt-1&quot;&gt;regular&lt;/div&gt;
121
+ &lt;/div&gt;
122
+ &lt;div class=&quot;text-center&quot;&gt;
123
+ &lt;sonic-icon library=&quot;custom&quot; prefix=&quot;solid&quot; name=&quot;plane&quot;&gt;&lt;/sonic-icon&gt;
124
+ &lt;br /&gt;
125
+ &lt;div class=&quot;text-xs mt-1&quot;&gt;solid&lt;/div&gt;
126
+ &lt;/div&gt;
127
+ &lt;div class=&quot;text-center&quot;&gt;
128
+ &lt;sonic-icon library=&quot;custom&quot; name=&quot;plane&quot;&gt;&lt;/sonic-icon&gt;
129
+ &lt;br /&gt;
130
+ &lt;div class=&quot;text-xs mt-1&quot;&gt;default prefix&lt;/div&gt;
131
+ &lt;/div&gt;
132
+ &lt;/div&gt;
133
+ &lt;/sonic-scope&gt;
134
+ </code></pre>
85
135
  <h2 id="size">Size</h2>
86
- <pre><code>&lt;div class=&quot;grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-8&quot;&gt;
136
+ <p>Omit <strong><code>size</code></strong> for the default scale (<code>1em</code> height). Larger steps use <strong><code>3xl</code></strong>.</p>
137
+ <pre><code>&lt;div class=&quot;grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-8&quot;&gt;
87
138
  &lt;div class=&quot;text-center&quot;&gt;
88
139
  &lt;sonic-icon library=&quot;heroicons&quot; prefix=&quot;outline&quot; name=&quot;academic-cap&quot; size=&quot;2xs&quot;&gt;&lt;/sonic-icon&gt;
89
- &lt;br&gt;
140
+ &lt;br /&gt;
90
141
  &lt;div class=&quot;text-xs mt-1&quot;&gt;2xs&lt;/div&gt;
91
142
  &lt;/div&gt;
92
143
  &lt;div class=&quot;text-center&quot;&gt;
93
144
  &lt;sonic-icon library=&quot;heroicons&quot; prefix=&quot;outline&quot; name=&quot;academic-cap&quot; size=&quot;xs&quot;&gt;&lt;/sonic-icon&gt;
94
- &lt;br&gt;
145
+ &lt;br /&gt;
95
146
  &lt;div class=&quot;text-xs mt-1&quot;&gt;xs&lt;/div&gt;
96
147
  &lt;/div&gt;
97
148
  &lt;div class=&quot;text-center&quot;&gt;
98
149
  &lt;sonic-icon library=&quot;heroicons&quot; prefix=&quot;outline&quot; name=&quot;academic-cap&quot; size=&quot;sm&quot;&gt;&lt;/sonic-icon&gt;
99
- &lt;br&gt;
150
+ &lt;br /&gt;
100
151
  &lt;div class=&quot;text-xs mt-1&quot;&gt;sm&lt;/div&gt;
101
152
  &lt;/div&gt;
102
153
  &lt;div class=&quot;text-center&quot;&gt;
103
154
  &lt;sonic-icon library=&quot;heroicons&quot; prefix=&quot;outline&quot; name=&quot;academic-cap&quot;&gt;&lt;/sonic-icon&gt;
104
- &lt;br&gt;
155
+ &lt;br /&gt;
105
156
  &lt;div class=&quot;text-xs mt-1&quot;&gt;default&lt;/div&gt;
106
157
  &lt;/div&gt;
107
158
  &lt;div class=&quot;text-center&quot;&gt;
108
159
  &lt;sonic-icon library=&quot;heroicons&quot; prefix=&quot;outline&quot; name=&quot;academic-cap&quot; size=&quot;lg&quot;&gt;&lt;/sonic-icon&gt;
109
- &lt;br&gt;
160
+ &lt;br /&gt;
110
161
  &lt;div class=&quot;text-xs mt-1&quot;&gt;lg&lt;/div&gt;
111
162
  &lt;/div&gt;
112
163
  &lt;div class=&quot;text-center&quot;&gt;
113
164
  &lt;sonic-icon library=&quot;heroicons&quot; prefix=&quot;outline&quot; name=&quot;academic-cap&quot; size=&quot;xl&quot;&gt;&lt;/sonic-icon&gt;
114
- &lt;br&gt;
165
+ &lt;br /&gt;
115
166
  &lt;div class=&quot;text-xs mt-1&quot;&gt;xl&lt;/div&gt;
116
167
  &lt;/div&gt;
117
168
  &lt;div class=&quot;text-center&quot;&gt;
118
169
  &lt;sonic-icon library=&quot;heroicons&quot; prefix=&quot;outline&quot; name=&quot;academic-cap&quot; size=&quot;2xl&quot;&gt;&lt;/sonic-icon&gt;
119
- &lt;br&gt;
170
+ &lt;br /&gt;
120
171
  &lt;div class=&quot;text-xs mt-1&quot;&gt;2xl&lt;/div&gt;
121
172
  &lt;/div&gt;
122
173
  &lt;div class=&quot;text-center&quot;&gt;
123
174
  &lt;sonic-icon library=&quot;heroicons&quot; prefix=&quot;outline&quot; name=&quot;academic-cap&quot; size=&quot;3xl&quot;&gt;&lt;/sonic-icon&gt;
124
- &lt;br&gt;
175
+ &lt;br /&gt;
125
176
  &lt;div class=&quot;text-xs mt-1&quot;&gt;3xl&lt;/div&gt;
126
177
  &lt;/div&gt;
127
178
  &lt;/div&gt;
128
179
  </code></pre>
180
+ <h2 id="accessibility">Accessibility</h2>
181
+ <p>On connect, the host sets <strong><code>aria-hidden=&quot;true&quot;</code></strong>. Treat icons as decorative unless the surrounding control already has an accessible name. Do not rely on <strong><code>sonic-icon</code></strong> alone for meaning—use visible text or <strong><code>aria-label</code></strong> on the parent button / link.</p>
182
+ <pre><code>&lt;sonic-button type=&quot;neutral&quot; variant=&quot;outline&quot; shape=&quot;circle&quot; aria-label=&quot;User profile&quot;&gt;
183
+ &lt;sonic-icon library=&quot;iconoir&quot; name=&quot;user&quot;&gt;&lt;/sonic-icon&gt;
184
+ &lt;/sonic-button&gt;
185
+ </code></pre>
186
+ <h2 id="api-reference">API reference</h2>
187
+ <table>
188
+ <thead>
189
+ <tr>
190
+ <th>Attribute</th>
191
+ <th>Values</th>
192
+ <th>Description</th>
193
+ </tr>
194
+ </thead>
195
+ <tbody><tr>
196
+ <td><code>name</code></td>
197
+ <td>string</td>
198
+ <td>Icon id in the core bundle or in the remote library</td>
199
+ </tr>
200
+ <tr>
201
+ <td><code>library</code></td>
202
+ <td><code>heroicons</code> · <code>iconoir</code> · <code>feathers</code> · <code>lucide</code> · <code>material</code> · <code>fontAwesome</code> · <code>custom</code></td>
203
+ <td>CDN or custom template; omit for bundled core icons</td>
204
+ </tr>
205
+ <tr>
206
+ <td><code>prefix</code></td>
207
+ <td>string</td>
208
+ <td>Library-specific variant; defaults per library when empty</td>
209
+ </tr>
210
+ <tr>
211
+ <td><code>size</code></td>
212
+ <td><code>2xs</code> · <code>xs</code> · <code>sm</code> · <code>lg</code> · <code>xl</code> · <code>2xl</code> · <code>3xl</code> (default <code>md</code>)</td>
213
+ <td><code>em</code>-based SVG scale on the host</td>
214
+ </tr>
215
+ </tbody></table>
216
+ <p>Ancestor attributes (for <strong><code>library=&quot;custom&quot;</code></strong> only): <strong><code>customIconLibraryPath</code></strong> (URL template with <strong><code>$prefix</code></strong> and <strong><code>$name</code></strong>) and <strong><code>customIconDefaultPrefix</code></strong>. May be set on <strong><code>sonic-scope</code></strong>, theme roots, or globally in the document.</p>
217
+ <p>No slots — the component inlines fetched or bundled SVG markup.</p>
129
218
 
130
219
  </article>
131
220
  </main>
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Image — Concorde</title>
7
- <meta name="description" content="src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;">
8
- <meta name="keywords" content="Concorde, supersoniks, core/components/ui/image/image, image, Image, UI component, sonic-image, web component">
7
+ <meta name="description" content="sonic-image wraps a responsive &lt;img&gt; with aspect ratio, object-fit: cover, optional rounded corners, and load transitions. The host shows a placeholder background (--sc-placeholder-bg) until the asset">
8
+ <meta name="keywords" content="Concorde, supersoniks, core/components/ui/image/image, image, Image, UI component, sonic-image, web component, , object-fit: cover, --sc-placeholder-bg, loading, lazy, loading=&quot;eager&quot;, rounded, --sc-rounded">
9
9
  <meta name="concorde-doc-id" content="core/components/ui/image/image">
10
10
  <link rel="canonical" href="https://concorde.supersoniks.org/crawl/core/components/ui/image/image.html">
11
11
  </head>
@@ -15,94 +15,282 @@
15
15
  </header>
16
16
  <main>
17
17
  <article>
18
- <p class="doc-lead" id="doc-summary"><strong>Concorde UI component — Image</strong>. src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot; <span>Doc ID: <code>core/components/ui/image/image</code>. Keywords: Concorde, supersoniks, core/components/ui/image/image, image, Image, UI component, sonic-image, web component. URL: <a href="https://concorde.supersoniks.org/crawl/core/components/ui/image/image.html">https://concorde.supersoniks.org/crawl/core/components/ui/image/image.html</a>.</span></p>
18
+ <p class="doc-lead" id="doc-summary"><strong>Concorde UI component — Image</strong>. sonic-image wraps a responsive &lt;img&gt; with aspect ratio, object-fit: cover, optional rounded corners, and load transitions. The host shows a placeholder background (--sc-placeholder-bg) until the asset <span>Doc ID: <code>core/components/ui/image/image</code>. Keywords: Concorde, supersoniks, core/components/ui/image/image, image, Image, UI component, sonic-image, web component, , object-fit: cover, --sc-placeholder-bg, loading, lazy, loading=&quot;eager&quot;, rounded, --sc-rounded. URL: <a href="https://concorde.supersoniks.org/crawl/core/components/ui/image/image.html">https://concorde.supersoniks.org/crawl/core/components/ui/image/image.html</a>.</span></p>
19
19
  <h1 id="image">Image</h1>
20
+ <p><strong><code>sonic-image</code></strong> wraps a responsive <strong><code>&lt;img&gt;</code></strong> with aspect ratio, <code>object-fit: cover</code>, optional rounded corners, and load transitions. The host shows a placeholder background (<code>--sc-placeholder-bg</code>) until the asset loads. Default <strong><code>loading</code></strong> is <code>lazy</code>; use <strong><code>loading=&quot;eager&quot;</code></strong> for above-the-fold heroes.</p>
20
21
  <h2 id="rounded">Rounded</h2>
21
- <pre><code>&lt;div class=&quot;grid gap-8 grid-cols-3 items-center&quot;&gt;
22
- &lt;sonic-image
23
- src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
24
- ratio=&quot;1/1&quot;
25
- &gt;
26
- &lt;/sonic-image&gt;
27
- &lt;sonic-image
28
- rounded=&quot;sm&quot;
29
- ratio=&quot;1/1&quot;
30
- src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
31
- &gt;
32
- &lt;/sonic-image&gt;
33
- &lt;sonic-image
34
- rounded
35
- ratio=&quot;1/1&quot;
36
- src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
37
- &gt;
38
- &lt;/sonic-image&gt;
39
- &lt;sonic-image
40
- rounded=&quot;md&quot;
41
- ratio=&quot;1/1&quot;
42
- src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
43
- &gt;
44
- &lt;/sonic-image&gt;
45
- &lt;sonic-image
46
- rounded=&quot;lg&quot;
47
- ratio=&quot;1/1&quot;
48
- src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
49
- &gt;
50
- &lt;/sonic-image&gt;
51
- &lt;sonic-image
52
- rounded=&quot;full&quot;
53
- ratio=&quot;1/1&quot;
54
- src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
55
- &gt;
56
- &lt;/sonic-image&gt;
22
+ <p>Omit <code>rounded</code> for square corners. Boolean <strong><code>rounded</code></strong> uses the theme token <code>--sc-rounded</code>. Sizes: <strong><code>sm</code></strong>, <strong><code>md</code></strong>, <strong><code>lg</code></strong>, <strong><code>xl</code></strong>, <strong><code>full</code></strong> (circle — pair with <code>ratio=&quot;1/1&quot;</code>), <strong><code>none</code></strong> (explicit reset).</p>
23
+ <pre><code>&lt;div class=&quot;grid gap-6 grid-cols-3 lg:grid-cols-4 items-end text-center text-xs &quot;&gt;
24
+ &lt;div&gt;
25
+ &lt;sonic-image
26
+ ratio=&quot;1/1&quot;
27
+ src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
28
+ &gt;&lt;/sonic-image&gt;
29
+ &lt;p class=&quot;mt-2&quot;&gt;default&lt;/p&gt;
30
+ &lt;/div&gt;
31
+ &lt;div&gt;
32
+ &lt;sonic-image
33
+ rounded=&quot;sm&quot;
34
+ ratio=&quot;1/1&quot;
35
+ src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
36
+ &gt;&lt;/sonic-image&gt;
37
+ &lt;p class=&quot;mt-2&quot;&gt;sm&lt;/p&gt;
38
+ &lt;/div&gt;
39
+ &lt;div&gt;
40
+ &lt;sonic-image
41
+ rounded
42
+ ratio=&quot;1/1&quot;
43
+ src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
44
+ &gt;&lt;/sonic-image&gt;
45
+ &lt;p class=&quot;mt-2&quot;&gt;rounded&lt;/p&gt;
46
+ &lt;/div&gt;
47
+ &lt;div&gt;
48
+ &lt;sonic-image
49
+ rounded=&quot;md&quot;
50
+ ratio=&quot;1/1&quot;
51
+ src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
52
+ &gt;&lt;/sonic-image&gt;
53
+ &lt;p class=&quot;mt-2&quot;&gt;md&lt;/p&gt;
54
+ &lt;/div&gt;
55
+ &lt;div&gt;
56
+ &lt;sonic-image
57
+ rounded=&quot;lg&quot;
58
+ ratio=&quot;1/1&quot;
59
+ src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
60
+ &gt;&lt;/sonic-image&gt;
61
+ &lt;p class=&quot;mt-2&quot;&gt;lg&lt;/p&gt;
62
+ &lt;/div&gt;
63
+ &lt;div&gt;
64
+ &lt;sonic-image
65
+ rounded=&quot;xl&quot;
66
+ ratio=&quot;1/1&quot;
67
+ src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
68
+ &gt;&lt;/sonic-image&gt;
69
+ &lt;p class=&quot;mt-2&quot;&gt;xl&lt;/p&gt;
70
+ &lt;/div&gt;
71
+ &lt;div &gt;
72
+ &lt;div &gt;
73
+ &lt;sonic-image
74
+ rounded=&quot;full&quot;
75
+ ratio=&quot;1/1&quot;
76
+ src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
77
+ &gt;&lt;/sonic-image&gt;
78
+ &lt;p class=&quot;mt-2&quot;&gt;full&lt;/p&gt;
79
+ &lt;/div&gt;
80
+ &lt;/div&gt;
57
81
  &lt;/div&gt;
58
82
  </code></pre>
59
- <h2 id="ratio">Ratio</h2>
83
+ <h2 id="aspect-ratio">Aspect ratio</h2>
84
+ <p><strong><code>ratio</code></strong> sets CSS <code>aspect-ratio</code> on the image (default <strong><code>auto</code></strong>). The image still fills the host width (<code>width: 100%</code>).</p>
60
85
  <pre><code>&lt;div class=&quot;grid gap-8 grid-cols-2 items-center&quot;&gt;
61
86
  &lt;sonic-image
62
87
  src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
63
- &gt;
64
- &lt;/sonic-image&gt;
88
+ &gt;&lt;/sonic-image&gt;
65
89
  &lt;sonic-image
66
90
  ratio=&quot;16/9&quot;
67
91
  src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
68
- &gt;
69
- &lt;/sonic-image&gt;
92
+ &gt;&lt;/sonic-image&gt;
70
93
  &lt;sonic-image
71
94
  ratio=&quot;1/1&quot;
72
95
  src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
73
- &gt;
74
- &lt;/sonic-image&gt;
96
+ &gt;&lt;/sonic-image&gt;
75
97
  &lt;sonic-image
76
98
  ratio=&quot;2/3&quot;
77
99
  src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
78
- &gt;
79
- &lt;/sonic-image&gt;
100
+ &gt;&lt;/sonic-image&gt;
80
101
  &lt;/div&gt;
81
102
  </code></pre>
82
103
  <h2 id="object-position">Object position</h2>
104
+ <p><strong><code>objectPosition</code></strong> maps to CSS <code>object-position</code> (default <strong><code>center center</code></strong>). Useful on wide crops when the subject sits off-center.</p>
83
105
  <pre><code>&lt;div class=&quot;grid gap-8 grid-cols-2 items-center&quot;&gt;
84
106
  &lt;sonic-image
85
- src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
86
107
  ratio=&quot;11/4&quot;
87
- &gt;
88
- &lt;/sonic-image&gt;
108
+ src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
109
+ &gt;&lt;/sonic-image&gt;
89
110
  &lt;sonic-image
90
111
  objectPosition=&quot;center top&quot;
91
- src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
92
112
  ratio=&quot;11/4&quot;
93
- &gt;
94
- &lt;/sonic-image&gt;
113
+ src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
114
+ &gt;&lt;/sonic-image&gt;
95
115
  &lt;/div&gt;
96
116
  </code></pre>
97
117
  <h2 id="cover">Cover</h2>
98
- <pre><code>&lt;div class=&quot;h-96 relative&quot;&gt;
118
+ <p><strong><code>cover</code></strong> stretches the image to fill a <strong>positioned</strong> parent (<code>position: relative</code> + fixed height or inset). Aspect ratio on the host is ignored while <code>cover</code> is set.</p>
119
+ <pre><code>&lt;div class=&quot;h-96 relative rounded-lg overflow-hidden&quot;&gt;
99
120
  &lt;sonic-image
100
121
  cover
101
122
  src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
123
+ &gt;&lt;/sonic-image&gt;
124
+ &lt;/div&gt;
125
+ </code></pre>
126
+ <h2 id="load-transition">Load transition</h2>
127
+ <p>Set <strong><code>transition</code></strong> to <strong><code>fade</code></strong> (default when the attribute is present) or <strong><code>fade-scale-out</code></strong>. The image stays at <code>opacity: 0</code> until the browser fires <strong><code>load</code></strong>, then the <strong><code>loaded</code></strong> class runs the animation. Changing <code>src</code> on an existing element does not replay the effect — mount a new <code>sonic-image</code> when you need another entrance (galleries, infinite scroll).</p>
128
+ <p>Click <strong>Add image</strong> to append small thumbnails and replay the transition. <strong>Clear</strong> resets the row.</p>
129
+ <pre><code>&lt;div class=&quot;flex flex-wrap gap-2 mb-4&quot;&gt;
130
+ &lt;sonic-button
131
+ size=&quot;sm&quot;
132
+ onclick=&quot;(function () {
133
+ var host = document.getElementById(&#39;sonic-image-transition-host&#39;);
134
+ var img = document.createElement(&#39;sonic-image&#39;);
135
+ img.transition = &#39;fade&#39;;
136
+ img.ratio = &#39;1/1&#39;;
137
+ img.rounded = &#39;md&#39;;
138
+ img.loading = &#39;eager&#39;;
139
+ img.style.width = &#39;8rem&#39;;
140
+ img.src = &#39;https://picsum.photos/seed/&#39; + Date.now() + &#39;/120/120&#39;;
141
+ host.appendChild(img);
142
+ })()&quot;
143
+ &gt;
144
+ Add image (fade)
145
+ &lt;/sonic-button&gt;
146
+ &lt;sonic-button
147
+ size=&quot;sm&quot;
148
+ variant=&quot;outline&quot;
149
+ onclick=&quot;(function () {
150
+ var host = document.getElementById(&#39;sonic-image-transition-host&#39;);
151
+ var img = document.createElement(&#39;sonic-image&#39;);
152
+ img.transition = &#39;fade-scale-out&#39;;
153
+ img.ratio = &#39;1/1&#39;;
154
+ img.rounded = &#39;md&#39;;
155
+ img.loading = &#39;eager&#39;;
156
+ img.style.width = &#39;8rem&#39;;
157
+ img.src = &#39;https://picsum.photos/seed/&#39; + Date.now() + &#39;/120/120&#39;;
158
+ host.appendChild(img);
159
+ })()&quot;
102
160
  &gt;
103
- &lt;/sonic-image&gt;
161
+ Add image (fade-scale-out)
162
+ &lt;/sonic-button&gt;
163
+ &lt;sonic-button
164
+ size=&quot;sm&quot;
165
+ variant=&quot;ghost&quot;
166
+ onclick=&quot;document.getElementById(&#39;sonic-image-transition-host&#39;).replaceChildren()&quot;
167
+ &gt;
168
+ Clear
169
+ &lt;/sonic-button&gt;
104
170
  &lt;/div&gt;
171
+ &lt;div id=&quot;sonic-image-transition-host&quot; class=&quot;flex flex-wrap gap-2 min-h-[5rem]&quot;&gt;&lt;/div&gt;
172
+ </code></pre>
173
+ <h2 id="accessibility-and-parts">Accessibility and parts</h2>
174
+ <p>Always set meaningful <strong><code>alt</code></strong> text (empty string only for decorative images). </p>
175
+ <pre><code>&lt;sonic-image
176
+ rounded=&quot;md&quot;
177
+ ratio=&quot;16/9&quot;
178
+ alt=&quot;Concorde aircraft in flight&quot;
179
+ src=&quot;https://thegoodlife.fr/wp-content/uploads/sites/2/2022/03/compagnies-aeriennes-nostalgie-coeur-insert-03-dr.jpg&quot;
180
+ &gt;&lt;/sonic-image&gt;
105
181
  </code></pre>
182
+ <h2 id="api-reference">API reference</h2>
183
+ <table>
184
+ <thead>
185
+ <tr>
186
+ <th>Attribute</th>
187
+ <th>Values</th>
188
+ <th>Description</th>
189
+ </tr>
190
+ </thead>
191
+ <tbody><tr>
192
+ <td><code>src</code></td>
193
+ <td>URL</td>
194
+ <td>Image URL passed to <code>&lt;img src&gt;</code></td>
195
+ </tr>
196
+ <tr>
197
+ <td><code>alt</code></td>
198
+ <td>string</td>
199
+ <td>Accessible description; use <code>&quot;&quot;</code> only for decorative images</td>
200
+ </tr>
201
+ <tr>
202
+ <td><code>loading</code></td>
203
+ <td><code>lazy</code> (default), <code>eager</code></td>
204
+ <td>Native lazy loading</td>
205
+ </tr>
206
+ <tr>
207
+ <td><code>ratio</code></td>
208
+ <td>CSS ratio, <code>auto</code> (default)</td>
209
+ <td>Host <code>aspect-ratio</code> on the image (ignored when <code>cover</code> is set)</td>
210
+ </tr>
211
+ <tr>
212
+ <td><code>rounded</code></td>
213
+ <td><code>none</code> (default), boolean, <code>base</code>, <code>sm</code>, <code>md</code>, <code>lg</code>, <code>xl</code>, <code>full</code></td>
214
+ <td>Corner radius from theme tokens; <code>full</code> is a circle (often with <code>ratio=&quot;1/1&quot;</code>)</td>
215
+ </tr>
216
+ <tr>
217
+ <td><code>objectPosition</code></td>
218
+ <td>CSS position</td>
219
+ <td>Maps to <code>object-position</code> (default <code>center center</code>)</td>
220
+ </tr>
221
+ <tr>
222
+ <td><code>imageRendering</code></td>
223
+ <td>CSS value</td>
224
+ <td>Maps to <code>image-rendering</code> (default <code>auto</code>)</td>
225
+ </tr>
226
+ <tr>
227
+ <td><code>cover</code></td>
228
+ <td>boolean</td>
229
+ <td>Absolutely fills a positioned parent; host aspect ratio is ignored</td>
230
+ </tr>
231
+ <tr>
232
+ <td><code>transition</code></td>
233
+ <td><code>fade</code>, <code>fade-scale-out</code></td>
234
+ <td>Opacity (and scale) animation after <code>load</code>; remount to replay on <code>src</code> change</td>
235
+ </tr>
236
+ </tbody></table>
237
+ <p>No slots — content is driven entirely by attributes on the inner <code>&lt;img&gt;</code>.</p>
238
+ <h2 id="api-reference-1">API reference</h2>
239
+ <table>
240
+ <thead>
241
+ <tr>
242
+ <th>Attribute</th>
243
+ <th>Values</th>
244
+ <th>Description</th>
245
+ </tr>
246
+ </thead>
247
+ <tbody><tr>
248
+ <td><code>src</code></td>
249
+ <td>URL</td>
250
+ <td>Image URL passed to <code>&lt;img src&gt;</code></td>
251
+ </tr>
252
+ <tr>
253
+ <td><code>alt</code></td>
254
+ <td>string</td>
255
+ <td>Accessible description; use <code>&quot;&quot;</code> only for decorative images</td>
256
+ </tr>
257
+ <tr>
258
+ <td><code>loading</code></td>
259
+ <td><code>lazy</code> (default), <code>eager</code></td>
260
+ <td>Native lazy loading</td>
261
+ </tr>
262
+ <tr>
263
+ <td><code>ratio</code></td>
264
+ <td>CSS ratio, <code>auto</code> (default)</td>
265
+ <td>Host <code>aspect-ratio</code> on the image (ignored when <code>cover</code> is set)</td>
266
+ </tr>
267
+ <tr>
268
+ <td><code>rounded</code></td>
269
+ <td><code>none</code> (default), boolean, <code>base</code>, <code>sm</code>, <code>md</code>, <code>lg</code>, <code>xl</code>, <code>full</code></td>
270
+ <td>Corner radius from theme tokens; <code>full</code> is a circle (often with <code>ratio=&quot;1/1&quot;</code>)</td>
271
+ </tr>
272
+ <tr>
273
+ <td><code>objectPosition</code></td>
274
+ <td>CSS position</td>
275
+ <td>Maps to <code>object-position</code> (default <code>center center</code>)</td>
276
+ </tr>
277
+ <tr>
278
+ <td><code>imageRendering</code></td>
279
+ <td>CSS value</td>
280
+ <td>Maps to <code>image-rendering</code> (default <code>auto</code>)</td>
281
+ </tr>
282
+ <tr>
283
+ <td><code>cover</code></td>
284
+ <td>boolean</td>
285
+ <td>Absolutely fills a positioned parent; host aspect ratio is ignored</td>
286
+ </tr>
287
+ <tr>
288
+ <td><code>transition</code></td>
289
+ <td><code>fade</code>, <code>fade-scale-out</code></td>
290
+ <td>Opacity (and scale) animation after <code>load</code>; remount to replay on <code>src</code> change</td>
291
+ </tr>
292
+ </tbody></table>
293
+ <p>No slots — content is driven entirely by attributes on the inner <code>&lt;img&gt;</code>.</p>
106
294
 
107
295
  </article>
108
296
  </main>