@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
@@ -948,13 +948,59 @@ I prefer
948
948
 
949
949
  ---
950
950
 
951
- ## Concorde
951
+ ## Alert messages
952
952
 
953
953
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/alert-messages/alert-messages.html
954
954
  - Doc ID: core/components/ui/alert-messages/alert-messages
955
- - Keywords: Concorde, supersoniks, core/components/ui/alert-messages/alert-messages, alert-messages, UI component, sonic-alert-messages, web component
955
+ - Keywords: Concorde, supersoniks, core/components/ui/alert-messages/alert-messages, alert-messages, Alert messages, UI component, sonic-alert-messages, web component, sonic-alert, messages, submitResultDataProvider, type="public", announce, dataProvider, type
956
956
 
957
+ Alert messages
957
958
 
959
+ sonic-alert-messages renders a vertical stack of sonic-alert items from a messages array on a linked data provider (typical pattern: submitResultDataProvider after a form submit). Only entries with type="public" are shown. Each alert gets announce so screen readers pick up feedback after the request.
960
+
961
+ With submit result
962
+
963
+ Bind dataProvider to the same publisher as submitResultDataProvider. API messages entries need type: public, plus content and optional status (warning · success · error · info).
964
+
965
+ Submit (empty fields → error messages)
966
+
967
+ Shared alert props
968
+
969
+ size · background and noIcon apply to every rendered sonic-alert in the list.
970
+
971
+ Load sample messages
972
+
973
+ Message shape
974
+
975
+ Example JSON on the result publisher (or API response merged into it):
976
+
977
+ {
978
+ "messages": [
979
+ {
980
+ "type": "public",
981
+ "content": "The product has been added to your cart",
982
+ "status": "success"
983
+ }
984
+ ]
985
+ }
986
+
987
+ API reference
988
+
989
+ | Attribute | Values | Description |
990
+ |----------|---------|-------------|
991
+ | dataProvider | publisher id | Source object; messages array is auto-filled via Subscriber |
992
+ | size | 2xs … 2xl (default md) | Passed to each sonic-alert |
993
+ | background | boolean | Tinted background on each alert |
994
+ | noIcon | boolean | Hides icons on each alert |
995
+ | messages | Message[] | Usually set by the publisher; each item uses content as alert text |
996
+
997
+ | Message field | Values | Description |
998
+ |---------------|---------|-------------|
999
+ | type | public | Required for the message to render |
1000
+ | content | string | Alert body (text on sonic-alert) |
1001
+ | status | warning · success · error · info | Alert status; defaults to default when omitted |
1002
+
1003
+ No slots — alerts are generated from messages.
958
1004
 
959
1005
  ---
960
1006
 
@@ -962,68 +1008,118 @@ I prefer
962
1008
 
963
1009
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/alert/alert.html
964
1010
  - Doc ID: core/components/ui/alert/alert
965
- - Keywords: Concorde, supersoniks, core/components/ui/alert/alert, alert, Alert, UI component, sonic-alert, web component
1011
+ - Keywords: Concorde, supersoniks, core/components/ui/alert/alert, alert, Alert, UI component, sonic-alert, web component, label, text, announce, status, default, role, aria-live
966
1012
 
967
1013
  Alert
968
1014
 
1015
+ Alerts surface important feedback inline—errors, confirmations, or contextual help. Use label / text for simple copy, or the default slot for rich content (links, buttons). Set announce when the message appears after an action so screen readers pick it up.
1016
+
1017
+ Basic example
1018
+
969
1019
  Status
970
1020
 
971
- This address is already in use.
972
- This address is already in use.
973
- This address is already in use.
974
- This address is already in use.
975
- This address is already in use.
1021
+ Color and icon follow status. With no status, behavior is default.
1022
+
1023
+ This address is already in use.
1024
+ This address is already in use.
1025
+ This address is already in use.
1026
+ This address is already in use.
1027
+ This address is already in use.
1028
+
1029
+ Accessibility (announce)
1030
+
1031
+ By default, an alert already in the DOM is not announced (no role / aria-live). Set announce when the message appears after user action (API response, validation, etc.): screen readers get role="alert" for error, otherwise role="status" and aria-live="polite".
1032
+
1033
+ sonic-alert-messages sets announce on every rendered alert.
1034
+
1035
+ Content and icon
1036
+
1037
+ label and text accept plain text only. The default slot is rendered after text. Use the icon slot to replace the default sonic-icon. noIcon hides the icon.
1038
+
1039
+ Custom icon slot
1040
+
1041
+ Project any markup into slot="icon" (emoji, image, custom component). Keep it decorative with aria-hidden="true" when the message text already conveys meaning.
1042
+
1043
+ 🎉
1044
+ You unlocked a new badge.
976
1045
 
977
1046
  Sizes
978
1047
 
979
- This address is already in use. Lorem ipsum dolor sit amet.
1048
+ This address is already in use. Lorem ipsum dolor sit amet.
980
1049
 
981
- This address is already in use. Lorem ipsum dolor sit amet.
1050
+ This address is already in use. Lorem ipsum dolor sit amet.
982
1051
 
983
- This address is already in use. Lorem ipsum dolor sit amet.
1052
+ This address is already in use. Lorem ipsum dolor sit amet.
984
1053
 
985
- This address is already in use. Lorem ipsum dolor sit amet.
1054
+ This address is already in use. Lorem ipsum dolor sit amet.
986
1055
 
987
- This address is already in use. Lorem ipsum dolor sit amet.
1056
+ This address is already in use. Lorem ipsum dolor sit amet.
988
1057
 
989
- This address is already in use. Lorem ipsum dolor sit amet.
1058
+ This address is already in use. Lorem ipsum dolor sit amet.
990
1059
 
991
- This address is already in use. Lorem ipsum dolor sit amet.
1060
+ This address is already in use. Lorem ipsum dolor sit amet.
992
1061
 
993
1062
  Alert with link
994
1063
 
995
- You have 2 unread messages
1064
+ Rich content in the slot (buttons, links).
1065
+
1066
+ You have 2 unread messages
996
1067
 
997
- See messages
998
- dismiss
1068
+ See messages
1069
+ Dismiss
999
1070
 
1000
1071
  Background
1001
1072
 
1002
- This address is already in use.
1073
+ Tinted background from the status color (color-mix on currentColor).
1003
1074
 
1004
- This address is already in use.
1075
+ This address is already in use.
1005
1076
 
1006
- This address is already in use.
1077
+ This address is already in use.
1007
1078
 
1008
- This address is already in use.
1079
+ This address is already in use.
1009
1080
 
1010
- This address is already in use.
1081
+ This address is already in use.
1082
+
1083
+ This address is already in use.
1011
1084
 
1012
1085
  Dismissible
1013
1086
 
1014
- This address is already in use.
1087
+ dismissible removes the alert from the DOM when the close control is clicked (i18n aria label). dismissible and background are independent: without background, close sits at the end of the row; with background, top-right.
1088
+
1089
+ This address is already in use.
1015
1090
 
1016
- This address is already in use.
1091
+ This address is already in use.
1017
1092
 
1018
- This address is already in use.
1093
+ This address is already in use.
1019
1094
 
1020
- This address is already in use.
1095
+ This address is already in use.
1021
1096
 
1022
- This address is already in use.
1097
+ This address is already in use.
1023
1098
 
1024
1099
  Dismiss forever
1025
1100
 
1026
- This address is already in use.
1101
+ With dismissForever, dismissal is stored in localStorage (key sonic-alert-dismissed). A stable id on the element is required; without id, a warning is logged and nothing is persisted.
1102
+
1103
+ This address is already in use.
1104
+
1105
+ API reference
1106
+
1107
+ | Attribute | Values | Description |
1108
+ |----------|---------|-------------|
1109
+ | status | default · info · success · warning · error | Color and default icon |
1110
+ | label | string | Title (plain text) |
1111
+ | text | string | Short body (plain text), rendered before the slot |
1112
+ | size | 2xs … 2xl | Corner radius and typography |
1113
+ | background | boolean | Tinted background (color-mix on status color) |
1114
+ | dismissible | boolean | Close control; removes the element from the DOM |
1115
+ | dismissForever | boolean | Persists dismissal in localStorage; requires id |
1116
+ | noIcon | boolean | Hides the icon (including custom icon slot content) |
1117
+ | announce | boolean | role="alert" / aria-live for dynamically injected content |
1118
+
1119
+ | Slot | Description |
1120
+ |------|-------------|
1121
+ | (default) | Message body (HTML, actions); rendered after text |
1122
+ | icon | Replaces the default sonic-icon |
1027
1123
 
1028
1124
  ---
1029
1125
 
@@ -1031,68 +1127,105 @@ Dismiss forever
1031
1127
 
1032
1128
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/badge/badge.html
1033
1129
  - Doc ID: core/components/ui/badge/badge
1034
- - Keywords: Concorde, supersoniks, core/components/ui/badge/badge, badge, Badge, UI component, sonic-badge, web component
1130
+ - Keywords: Concorde, supersoniks, core/components/ui/badge/badge, badge, Badge, UI component, sonic-badge, web component, sonic-button, type, variant, size, default, base-100, neutral, base-content, outline
1035
1131
 
1036
1132
  Badge
1037
1133
 
1134
+ Badges are compact, non-interactive labels for status, counts, or categories. They mirror sonic-button styling (type, variant, size) without focus rings or click handling—use a button when the control should be actionable.
1135
+
1038
1136
  Type
1039
1137
 
1040
- Default
1041
- Primary
1042
- Neutral
1043
- Warning
1044
- Info
1045
- Success
1046
- Danger
1047
- Contrast
1138
+ default — subtle background (base-100). neutral — dark fill (base-content) with light text, useful on light backgrounds.
1139
+
1140
+ Default
1141
+ Primary
1142
+ Neutral
1143
+ Warning
1144
+ Info
1145
+ Success
1146
+ Danger
1147
+
1148
+ Variant
1149
+
1150
+ Default variant is filled. outline — border and text in the type color. ghost — text only, no padding (except in forced-colors mode).
1048
1151
 
1049
1152
  Outline
1050
1153
 
1051
- Default
1052
- Primary
1053
- Neutral
1054
- Warning
1055
- Info
1056
- Success
1057
- Danger
1058
- Contrast
1154
+ Default
1155
+ Primary
1156
+ Neutral
1157
+ Warning
1158
+ Info
1159
+ Success
1160
+ Danger
1059
1161
 
1060
1162
  Ghost
1061
1163
 
1062
- Default
1063
- Primary
1064
- Neutral
1065
- Warning
1066
- Info
1067
- Success
1068
- Danger
1069
- Contrast
1164
+ Default
1165
+ Primary
1166
+ Neutral
1167
+ Warning
1168
+ Info
1169
+ Success
1170
+ Danger
1070
1171
 
1071
1172
  Size
1072
1173
 
1073
- 2Xs badge
1074
- Xs badge
1075
- Sm badge
1076
- Md badge
1077
- Lg badge
1078
- Xl badge
1079
- 2Xl badge
1174
+ Default size is md (omit the size attribute). Typography and padding follow sonic-button.
1175
+
1176
+ 2Xs
1177
+ Xs
1178
+ Sm
1179
+ Md
1180
+ Lg
1181
+ Xl
1182
+ 2Xl
1183
+
1184
+ Prefix and suffix slots
1185
+
1186
+ Icons or short text before / after the main label.
1187
+
1188
+ Info
1189
+
1190
+ Verified
1080
1191
 
1081
1192
  Empty badges
1082
1193
 
1194
+ Badge with no text (visual dot). min-width / min-height keep a readable shape.
1195
+
1083
1196
  Ellipsis
1084
1197
 
1085
- Lorem ipsum dolor sit consectetur adipiscing elit. Lorem ipsum dolor sit consectetur adipiscing elit.
1086
- Lorem ipsum dolor sit consectetur adipiscing elit. Lorem ipsum dolor sit consectetur adipiscing elit.
1198
+ With ellipsis, long labels truncate. The parent must constrain width (max-width, grid, etc.).
1199
+
1200
+ Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod.
1201
+
1202
+ Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod.
1087
1203
 
1088
1204
  Badge in button
1089
1205
 
1090
- Messages 5
1206
+ Count inside a button (slot="suffix") or a badge absolutely positioned on a button / icon.
1207
+
1208
+ Messages 5
1209
+
1210
+ My account
1211
+ 12
1091
1212
 
1092
- Mon compte
1093
- 12
1213
+ 33
1094
1214
 
1095
- 33
1215
+ API reference
1216
+
1217
+ | Attribute | Values | Description |
1218
+ |----------|---------|-------------|
1219
+ | type | default (default) · primary · neutral · warning · info · success · danger | Semantic color (--sc- tokens) |
1220
+ | variant | default (default) · outline · ghost | Filled, bordered, or text-only |
1221
+ | size | 2xs … 2xl (default md) | Typography and padding (aligned with sonic-button) |
1222
+ | ellipsis | boolean | Single-line truncation; parent must constrain width |
1223
+
1224
+ | Slot | Description |
1225
+ |------|-------------|
1226
+ | (default) | Main label |
1227
+ | prefix | Icon or short text before the label |
1228
+ | suffix | Icon or short text after the label |
1096
1229
 
1097
1230
  ---
1098
1231
 
@@ -1154,6 +1287,7 @@ Loading
1154
1287
  The length of the button depends on the size of its content
1155
1288
 
1156
1289
  Loading button
1290
+ 🚀 Loading with prefix 😂
1157
1291
 
1158
1292
  Swap
1159
1293
 
@@ -1203,11 +1337,54 @@ Custom styles & active states with tailwind
1203
1337
 
1204
1338
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/captcha/captcha.html
1205
1339
  - Doc ID: core/components/ui/captcha/captcha
1206
- - Keywords: Concorde, supersoniks, core/components/ui/captcha/captcha, captcha, Captcha, UI component, sonic-captcha, web component
1340
+ - Keywords: Concorde, supersoniks, core/components/ui/captcha/captcha, captcha, Captcha, UI component, sonic-captcha, web component, captchaToken, needsCaptchaValidation, formDataProvider, headersDataProvider, sonic-submit, key, generateEncryptedKey
1207
1341
 
1208
1342
  Captcha
1209
1343
 
1210
- Submit with captcha
1344
+ sonic-captcha embeds an ALTCHA widget and wires captchaToken / needsCaptchaValidation on the ancestor formDataProvider (or headersDataProvider). sonic-submit waits for a token before sending when validation is required. The widget loads only on HTTPS; on plain HTTP the host renders nothing.
1345
+
1346
+ > Live widget calls the Supersoniks challenge service — not part of docs mock API.
1347
+
1348
+ Basic example
1349
+
1350
+ Wrap the form scope and place sonic-submit in the default slot so the challenge appears above the action.
1351
+
1352
+ Submit with captcha
1353
+
1354
+ Encrypted site key
1355
+
1356
+ Optional key skips client-side key generation. When omitted, the component derives an encrypted key on connect (after generateEncryptedKey).
1357
+
1358
+ Complete the challenge above to enable submit
1359
+
1360
+ Form publisher fields
1361
+
1362
+ On connect (HTTPS only), needsCaptchaValidation is set to true and captchaToken is cleared. When the ALTCHA widget reaches verified, captchaToken is written on the form publisher and sonic-captcha-validate fires (detail.valid · detail.state · optional detail.token / detail.payload). sonic-submit still listens for requesttoken to refresh the token immediately before send.
1363
+
1364
+ {
1365
+ needsCaptchaValidation: true,
1366
+ captchaKey: "…",
1367
+ captchaToken: "…"
1368
+ }
1369
+
1370
+ API reference
1371
+
1372
+ | Attribute | Values | Description |
1373
+ |----------|---------|-------------|
1374
+ | formDataProvider | publisher id | Same as ancestor form scope; reads/writes needsCaptchaValidation · captchaKey · captchaToken |
1375
+ | key | string | ALTCHA site key; auto-generated when empty |
1376
+ | action | string | Optional action name forwarded to the widget |
1377
+ | zIndex | number (default 9999) | Stacking for the challenge overlay |
1378
+
1379
+ | Slot | Description |
1380
+ |------|-------------|
1381
+ | (default) | Form actions (typically sonic-submit and fields) rendered below the widget |
1382
+
1383
+ | Event | Description |
1384
+ |-------|-------------|
1385
+ | sonic-captcha-validate | Fired when state is verified · error or expired; detail.valid is true only for verified |
1386
+
1387
+ Related: Submit — needsCaptchaValidation and deferred send.
1211
1388
 
1212
1389
  ---
1213
1390
 
@@ -1215,49 +1392,118 @@ Captcha
1215
1392
 
1216
1393
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/card/card.html
1217
1394
  - Doc ID: core/components/ui/card/card
1218
- - Keywords: Concorde, supersoniks, core/components/ui/card/card, card, Card, UI component, sonic-card, web component
1395
+ - Keywords: Concorde, supersoniks, core/components/ui/card/card, card, Card, UI component, sonic-card, web component, type, shadow, lg, sonic-card-header, sonic-card-main, sonic-card-footer, base, default, light
1219
1396
 
1220
1397
  Card
1221
1398
 
1399
+ Cards group related content on a padded surface with radius, theme type colors, and elevation. Default shadow is lg. Compose sonic-card-header / sonic-card-main / sonic-card-footer, or place any markup in the default slot.
1400
+
1401
+ Basic example
1402
+
1403
+ Related content on a raised surface.
1404
+
1222
1405
  Type
1223
1406
 
1224
- Base
1225
- Light
1226
- Primary
1227
- Warning
1228
- Danger
1229
- Success
1230
- Info
1231
- Neutral
1232
- Invert
1407
+ Default type is base. default and light share the same surface tokens.
1408
+
1409
+ Base
1410
+ Light
1411
+ Default
1412
+ Primary
1413
+ Info
1414
+ Success
1415
+ Warning
1416
+ Danger
1417
+ Neutral
1418
+ Invert
1419
+
1420
+ Shadow
1421
+
1422
+ Set shadow to control elevation. Default is lg.
1423
+
1424
+ None
1425
+ Small
1426
+ Medium
1427
+ Large
1233
1428
 
1234
1429
  Header
1235
1430
 
1236
- Description rendu via le composant : "sonic-card-header-description"
1431
+ Quick titles with label and description, or full control through the default slot. slot="suffix" aligns badges or actions on the right; suffix content does not shrink when the title wraps.
1432
+
1433
+ label and description accept HTML (rendered as markup). Prefer plain text when possible; use sonic-card-header-description or the default slot for structured content.
1434
+
1435
+ Body content goes in the card slot or in sonic-card-main .
1237
1436
 
1238
- Suffix
1437
+ Choose what we email you about.
1239
1438
 
1240
- Header custom
1241
- Tout le contenu excepté l'icône ✈ passe par le slot du header
1242
- ✈
1439
+ 3 new
1440
+
1441
+ Custom header
1442
+
1443
+ Use the header slot when attributes are not enough.
1243
1444
 
1244
1445
  Main
1245
1446
 
1246
- Main area
1247
- Lorem ipsum dolor sit, amet consectetur adipisicing elit. Iure id dolor debitis deleniti eligendi natus dolorem a commodi sunt dicta? Ipsa asperiores magni consequuntur dolor voluptatibus. Maxime, nemo? Facere, odio.
1447
+ Optional wrapper for the primary content area (typography, media, forms).
1448
+
1449
+ Improved performance on large lists and fixed an issue with keyboard navigation in menus.
1450
+
1451
+ See the changelog for details.
1248
1452
 
1249
1453
  Footer
1250
1454
 
1251
- Footer area
1252
- Debitis deleniti eligendi natus dolorem aufdh.
1455
+ Optional footer for actions, metadata, or secondary text.
1456
+
1457
+ This project and all of its data will be removed permanently.
1458
+
1459
+ Cancel
1460
+ Delete
1461
+
1462
+ Full example
1463
+
1464
+ Header, media, body, and footer together.
1465
+
1466
+ Nonstop flight with flexible dates. Prices shown include taxes and fees.
1467
+
1468
+ From $249
1469
+ Book
1253
1470
 
1254
- 🛫 ✈ ✈ ✈ ✈ ✈ 🛬
1471
+ API reference
1255
1472
 
1256
- Example of use
1473
+ sonic-card
1257
1474
 
1258
- Main - Lorem ipsum dolor sit, amet consectetur adipisicing elit. Iure id dolor debitis deleniti eligendi natus dolorem a commodi sunt dicta? Ipsa asperiores magni consequuntur dolor voluptatibus. Maxime, nemo? Facere, odio.
1475
+ | Attribute | Values | Description |
1476
+ |----------|---------|-------------|
1477
+ | type | base (default) · light · invert · default · primary · warning · danger · success · info · neutral | Semantic background and text (default and light share the same surface) |
1478
+ | shadow | none · sm · md · lg (default lg) | Elevation on the card surface |
1259
1479
 
1260
- Footer - Amet consectetur adipisicing
1480
+ | Slot | Description |
1481
+ |------|-------------|
1482
+ | (default) | Free-form content (header, main, footer, or direct markup) |
1483
+
1484
+ sonic-card-header
1485
+
1486
+ | Attribute | Values | Description |
1487
+ |----------|---------|-------------|
1488
+ | label | HTML | Title (rendered as markup) |
1489
+ | description | HTML | Subtitle below the title |
1490
+
1491
+ | Slot | Description |
1492
+ |------|-------------|
1493
+ | (default) | Custom title / description when attributes are not enough |
1494
+ | suffix | Actions or badges aligned on the right (does not shrink) |
1495
+
1496
+ sonic-card-header-description
1497
+
1498
+ | Slot | Description |
1499
+ |------|-------------|
1500
+ | (default) | Subtitle text; styled below the title when slotted in sonic-card-header |
1501
+
1502
+ sonic-card-main · sonic-card-footer
1503
+
1504
+ | Slot | Description |
1505
+ |------|-------------|
1506
+ | (default) | Primary content (main) or actions / metadata (footer) |
1261
1507
 
1262
1508
  ---
1263
1509
 
@@ -1265,19 +1511,72 @@ Example of use
1265
1511
 
1266
1512
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/divider/divider.html
1267
1513
  - Doc ID: core/components/ui/divider/divider
1268
- - Keywords: Concorde, supersoniks, core/components/ui/divider/divider, divider, Divider, UI component, sonic-divider, web component
1514
+ - Keywords: Concorde, supersoniks, core/components/ui/divider/divider, divider, Divider, UI component, sonic-divider, web component, sonic-menu, label, align, center, lineStyle, solid, size, 0.5rem
1269
1515
 
1270
1516
  Divider
1271
1517
 
1272
- Default
1518
+ sonic-divider draws a horizontal or vertical rule with optional centered label copy. Use it to separate sections in forms, cards, and sonic-menu. Set label for simple HTML captions or use the default slot for richer markup; default align is center and default lineStyle is solid.
1273
1519
 
1274
- Align
1520
+ Basic example
1521
+
1522
+ A bare divider is a full-width line with vertical margin. Omit size to use the host default spacing (0.5rem block margin).
1523
+
1524
+ Label and align
1525
+
1526
+ label renders inside the line (HTML via the same pipeline as other form labels). align controls which side(s) of the line remain visible: left drops the leading segment, right drops the trailing segment, center keeps both.
1275
1527
 
1276
1528
  Size
1277
1529
 
1278
- Custom
1530
+ size adjusts block margin and label font size. Values follow the shared Concorde scale (2xs … 2xl).
1531
+
1532
+ Line style
1533
+
1534
+ lineStyle sets the stroke of the rule (solid · dashed · dotted). In HTML use the reflected attribute linestyle (case-insensitive).
1535
+
1536
+ Vertical and margin
1537
+
1538
+ Set vertical for a column rule (for example between toolbar actions). noMargin removes host margin when a parent layout already provides spacing.
1539
+
1540
+ Before
1541
+
1542
+ After
1543
+
1544
+ Default slot
1545
+
1546
+ Slotted content replaces or augments label. Useful for badges, icons, or mixed markup in menus.
1547
+
1548
+ Section title
1549
+ +25
1550
+
1551
+ Inside typed cards
1552
+
1553
+ On sonic-card with semantic type (primary · warning · danger · info · success), the rule uses the card’s text color at reduced opacity so it stays visible on tinted surfaces. label and slotted captions use the same foreground color as surrounding copy.
1554
+
1555
+ This action cannot be undone.
1556
+
1557
+ Project files
1558
+ Shared links
1559
+
1560
+ Maintenance is scheduled for tonight.
1561
+
1562
+ Expected downtime: about 15 minutes.
1279
1563
 
1280
- Lorem ipsum dolor sit amet +25
1564
+ API reference
1565
+
1566
+ | Attribute | Values | Description |
1567
+ |----------|---------|-------------|
1568
+ | label | string (HTML) | Caption centered on the rule; combined with default-slot content when both are set |
1569
+ | align | left · center · right (default center) | Hides the leading or trailing line segment for left/right alignment |
1570
+ | size | 2xs · xs · sm · md · lg · xl · 2xl · inherit | Vertical margin and label font-size; omit for host defaults |
1571
+ | lineStyle | solid · dashed · dotted (default solid) | Stroke style of the rule (HTML attribute linestyle) |
1572
+ | vertical | boolean | Renders a vertical rule; swap block/inline margins |
1573
+ | noMargin | boolean | Sets host margin to 0 |
1574
+
1575
+ | Slot | Description |
1576
+ |------|-------------|
1577
+ | (default) | Label markup when label is insufficient or empty |
1578
+
1579
+ The inner flex container exposes part="divider" for theme overrides.
1281
1580
 
1282
1581
  ---
1283
1582
 
@@ -1336,98 +1635,212 @@ Checked blacklistFlags values are sent to the mock API (?blacklistFlags=racist,s
1336
1635
 
1337
1636
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/form/fieldset/fieldset.html
1338
1637
  - Doc ID: core/components/ui/form/fieldset/fieldset
1339
- - Keywords: Concorde, supersoniks, core/components/ui/form/fieldset/fieldset, fieldset, Fieldset, UI component, form, sonic-fieldset, web component
1638
+ - Keywords: Concorde, supersoniks, core/components/ui/form/fieldset/fieldset, fieldset, Fieldset, UI component, form, sonic-fieldset, web component, , sonic-legend, label, description, iconName, variant, default, sonic-form-layout, ghost
1340
1639
 
1341
1640
  Fieldset
1342
1641
 
1642
+ sonic-fieldset groups related form controls with a bordered container and an accessible semantics layer. Put fields in the default slot; add a title with sonic-legend or the shorthand label / description / iconName attributes. Default variant is default. Pair the body with sonic-form-layout for responsive columns.
1643
+
1644
+ Basic example
1645
+
1343
1646
  Variant
1344
1647
 
1345
- Default
1648
+ ghost and shadow use a transparent border; shadow also applies --sc-shadow-lg.
1346
1649
 
1347
- Ghost
1650
+ Tight layout
1348
1651
 
1349
- Shadow
1652
+ Set tight to remove horizontal padding and side borders (flat strip inside a parent).
1350
1653
 
1351
1654
  Legend
1352
1655
 
1353
- Custom legend via slot
1656
+ Use sonic-legend for the group title. Set label and description for simple copy, or use the default slot for custom markup. Add secondary text with sonic-legend-description. Place actions in slot="suffix" on the legend.
1657
+
1658
+ Attribute values on sonic-legend are rendered as HTML—use only trusted content.
1659
+
1660
+ Custom title in the default slot
1661
+ Description via sonic-legend-description
1662
+
1663
+ Shorthand legend on the fieldset
1664
+
1665
+ When label is set on sonic-fieldset, the component renders sonic-legend for you. Pass description iconName iconLibrary and iconPrefix the same way. Do not combine shorthand label with a separate slotted sonic-legend—you will get two legends.
1666
+
1667
+ Legend actions
1668
+
1669
+ Use slot="suffix" on sonic-legend for menus or icon buttons aligned to the end of the legend row.
1670
+
1671
+ Legal notice
1672
+ Terms of use
1673
+
1674
+ Form association and disabled state
1675
+
1676
+ Associating a distant form
1677
+
1678
+ Set form on sonic-fieldset to the id of a elsewhere in the page (same as the native form attribute on ). Named fields in the fieldset then belong to that form for submit and constraint validation—for example a toolbar form and a field group rendered lower on the layout.
1679
+
1680
+ Save billing
1681
+
1682
+ Disabling a group
1683
+
1684
+ Set disabled on sonic-fieldset to disable the inner and every control in the group (same as a native fieldset). Use it for read-only steps or sections gated by permissions.
1354
1685
 
1355
- Description via composant : sonic-legend-description
1686
+ Accessibility
1356
1687
 
1357
- Short hand
1688
+ The inner carries grouping semantics. disabled is applied on that element so nested controls are disabled in the usual way. sonic-legend renders a native for the group label.
1358
1689
 
1359
- Example of use
1690
+ API reference
1360
1691
 
1361
- Informations personnelles
1362
- Description du fieldset lorem ipsum dolor
1692
+ sonic-fieldset
1363
1693
 
1364
- Mentions légales
1365
- Conditions générales d'utilisation
1694
+ | Attribute | Values | Description |
1695
+ |----------|---------|-------------|
1696
+ | variant | default · ghost · shadow (default default) | Border and shadow treatment |
1697
+ | tight | boolean | Removes horizontal padding and side borders |
1698
+ | label | string | Shorthand legend title; renders sonic-legend when set |
1699
+ | description | string | Shorthand legend description (HTML) |
1700
+ | iconName | string | Shorthand legend icon name |
1701
+ | iconLibrary | string | Shorthand legend icon library |
1702
+ | iconPrefix | string | Shorthand legend icon prefix |
1703
+ | disabled | boolean | Disables the native and its controls |
1704
+ | form | string | id of an associated form |
1705
+ | dataProvider | string | Subscriber key; can autofill properties that match publisher fields (e.g. label) |
1366
1706
 
1367
- - Sélectionner -
1368
- Je préfère ne pas le dire
1369
- Homme
1370
- Femme
1707
+ | Slot | Description |
1708
+ |------|-------------|
1709
+ | (default) | Legend (optional) and field group content in visual order |
1371
1710
 
1372
- Coordonnées
1711
+ sonic-legend
1373
1712
 
1374
- S'inscrire
1713
+ | Attribute | Values | Description |
1714
+ |----------|---------|-------------|
1715
+ | label | string | Title HTML when not using the default slot |
1716
+ | description | string | Description HTML (wrapped in sonic-legend-description) |
1717
+ | iconName | string | Leading sonic-icon name |
1718
+ | iconLibrary | string | Icon library |
1719
+ | iconPrefix | string | Icon prefix |
1720
+ | forceAutoFill | boolean | Allows Subscriber autofill to override attribute-backed label / description |
1375
1721
 
1376
- Continuer sans m'inscrire
1722
+ | Slot | Description |
1723
+ |------|-------------|
1724
+ | (default) | Legend title and description components |
1725
+ | suffix | Trailing actions (menus, icon buttons) |
1377
1726
 
1378
- Submitted informations...
1727
+ sonic-legend-description
1728
+
1729
+ Muted description line below the legend title. No attributes—project content through the default slot.
1379
1730
 
1380
1731
  ---
1381
1732
 
1382
- ## Form-actions
1733
+ ## Form actions
1383
1734
 
1384
1735
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/form/form-actions/form-actions.html
1385
1736
  - Doc ID: core/components/ui/form/form-actions/form-actions
1386
- - Keywords: Concorde, supersoniks, core/components/ui/form/form-actions/form-actions, form-actions, Form-actions, UI component, form, sonic-form-actions, web component
1737
+ - Keywords: Concorde, supersoniks, core/components/ui/form/form-actions/form-actions, form-actions, Form actions, UI component, form, sonic-form-actions, web component, sonic-form-layout, direction, row, justify, flex-start, alignItems, center, justify-content
1387
1738
 
1388
- Form-actions
1739
+ Form actions
1389
1740
 
1390
- Left by default
1741
+ sonic-form-actions lays out submit / cancel and other form footer controls in a wrapping flex row with a small fixed gap. Place it inside sonic-form-layout (full-width row) or any block that should end with actions. Defaults: direction row · justify flex-start · alignItems center.
1391
1742
 
1392
- Submit
1393
- Cancel
1743
+ Basic example
1394
1744
 
1395
- Justify
1745
+ With no attributes, actions align to the start of the row (typical for left-to-right forms).
1396
1746
 
1397
- Submit
1398
- Cancel
1747
+ Submit
1748
+ Cancel
1399
1749
 
1400
- Direction
1750
+ Justify content
1751
+
1752
+ justify maps to CSS justify-content. Use flex-end for dialog-style footers or center for balanced toolbars.
1753
+
1754
+ Submit
1755
+ Cancel
1756
+
1757
+ Flex direction
1758
+
1759
+ direction maps to flex-direction. row-reverse swaps visual order while keeping DOM order (focus order unchanged).
1760
+
1761
+ Submit
1762
+ Cancel
1763
+
1764
+ Mixed controls
1765
+
1766
+ Combine sonic-button with sonic-divider vertical or other slotted content. Default alignItems center keeps unlike heights aligned on the cross axis.
1401
1767
 
1402
- Submit
1403
- Cancel
1768
+ Left seats
1404
1769
 
1405
- Center
1770
+ Right seats
1406
1771
 
1407
- Left seats
1772
+ API reference
1408
1773
 
1409
- Right seats
1774
+ | Attribute | Values | Description |
1775
+ |----------|---------|-------------|
1776
+ | direction | row (default) · column · row-reverse · column-reverse | Main-axis layout of slotted controls |
1777
+ | justify | CSS justify-content (default flex-start) | Distribution along the main axis |
1778
+ | alignItems | CSS align-items (default center) | Cross-axis alignment when items differ in height |
1779
+
1780
+ The component exposes a single unnamed slot; there are no named slots. Slotted nodes use the host’s flex gap (0.3rem) and flex-wrap.
1781
+
1782
+ | Slot | Description |
1783
+ |------|-------------|
1784
+ | (default) | Footer actions (sonic-button and related controls) |
1410
1785
 
1411
1786
  ---
1412
1787
 
1413
- ## Form-layout
1788
+ ## Form layout
1414
1789
 
1415
1790
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/form/form-layout/form-layout.html
1416
1791
  - Doc ID: core/components/ui/form/form-layout/form-layout
1417
- - Keywords: Concorde, supersoniks, core/components/ui/form/form-layout/form-layout, form-layout, Form-layout, UI component, form, sonic-form-layout, web component
1792
+ - Keywords: Concorde, supersoniks, core/components/ui/form/form-layout/form-layout, form-layout, Form layout, UI component, form, sonic-form-layout, web component, sonic-input, sonic-select, sonic-input-autocomplete, sonic-form-actions, sonic-fieldset, offsetWidth
1793
+
1794
+ Form layout
1795
+
1796
+ sonic-form-layout arranges slotted form controls in a responsive CSS grid with consistent vertical spacing. Pair sonic-input · sonic-select and sonic-input-autocomplete fields side by side when the host is wider than 440px; textareas, toggles, dividers, and sonic-form-actions span the full width. Wrap a form or sonic-fieldset body—no attributes are required.
1797
+
1798
+ Basic example
1799
+
1800
+ Typical registration-style form: short fields flow in two columns on wide layouts; long or grouped blocks stay full width.
1801
+
1802
+ — Select —
1803
+ Prefer not to say
1804
+ Male
1805
+ Female
1806
+
1807
+ Enable optional feature
1808
+ Subscribe to newsletter
1418
1809
 
1419
- Form-layout
1810
+ I accept the
1811
+ terms and conditions
1420
1812
 
1421
- - Sélectionner -
1422
- Je préfère ne pas le dire
1423
- Homme
1424
- Femme
1813
+ Submit
1425
1814
 
1426
- Activer une superbe option
1427
- Inscription à la newsletter
1428
- J'ai lu et accepte les Conditions générales de ventes
1815
+ Responsive columns
1429
1816
 
1430
- Valider
1817
+ When the host offsetWidth is greater than 440px, the grid uses two equal columns with slightly larger gap (1.75rem). Below that breakpoint, fields stack in a single column (1.5rem gap).
1818
+
1819
+ If the slot contains exactly one direct sonic-input, sonic-select, or sonic-input-autocomplete, the layout stays one column even above the breakpoint so a lone field does not sit in half an empty row.
1820
+
1821
+ Narrow host (single column)
1822
+
1823
+ Wide host (two columns for inputs)
1824
+
1825
+ Full-width slotted blocks
1826
+
1827
+ Everything except sonic-input, sonic-select, sonic-input-autocomplete, and slotted elements with class form-item-container is assigned grid-column: 1 / -1. Use this for sonic-textarea, sonic-checkbox, sonic-switch, sonic-form-actions, sonic-divider, and similar blocks.
1828
+
1829
+ Slotted sonic-divider sets --sc-divider-my: 0 so divider spacing matches the grid rhythm. Slotted sonic-submit uses display: contents so submit controls participate in the grid without an extra wrapper box.
1830
+
1831
+ Send
1832
+
1833
+ Custom column wrapper
1834
+
1835
+ Add class form-item-container on a slotted wrapper (for example a div) when a field is not a direct sonic-input / sonic-select / sonic-input-autocomplete but should still share the two-column flow with short inputs.
1836
+
1837
+ API reference
1838
+
1839
+ No public attributes — layout follows slotted children and host width.
1840
+
1841
+ | Slot | Description |
1842
+ |------|-------------|
1843
+ | (default) | Form fields and blocks in visual order; column vs full-width rules apply per slotted tag or form-item-container class |
1431
1844
 
1432
1845
  ---
1433
1846
 
@@ -1469,7 +1882,7 @@ data-keyboard-nav sur le champ et les items (flèches haut / bas).
1469
1882
 
1470
1883
  Input
1471
1884
 
1472
- Native attibutes list
1885
+ Native attributes list
1473
1886
 
1474
1887
  Label
1475
1888
 
@@ -1640,7 +2053,7 @@ Same mock filter as Checkbox; switches can enable several flags (comma-separated
1640
2053
 
1641
2054
  Textarea
1642
2055
 
1643
- Native attibutes list
2056
+ Native attributes list
1644
2057
 
1645
2058
  Label
1646
2059
 
@@ -1662,47 +2075,91 @@ Size
1662
2075
 
1663
2076
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/group/group.html
1664
2077
  - Doc ID: core/components/ui/group/group
1665
- - Keywords: Concorde, supersoniks, core/components/ui/group/group, group, Group, UI component, sonic-group, web component
2078
+ - Keywords: Concorde, supersoniks, core/components/ui/group/group, group, Group, UI component, sonic-group, web component, sonic-button, sonic-input, sonic-select, label, description, radio, name, formDataProvider
1666
2079
 
1667
2080
  Group
1668
2081
 
2082
+ sonic-group lays out slotted sonic-button · sonic-input and sonic-select controls in a single horizontal row with shared corner radius (first / middle / last items). Optional label and description follow form field styling. Use it for button groups, radio rows, or input + action toolbars.
2083
+
1669
2084
  Radio group
1670
2085
 
2086
+ Pair with sonic-button radio and a shared name; ancestor formDataProvider stores the selected value.
2087
+
1671
2088
  😎 Standard
1672
2089
  ⭐ Premium
1673
2090
  💎 Diamond
1674
2091
 
1675
2092
  Button group
1676
2093
 
1677
- 🗼Air France
2094
+ Adjacent link or action buttons without merging into one control.
2095
+
2096
+ 🗼 Air France
1678
2097
  🌴 Air Tahiti
1679
2098
  💣 Air Corsica
1680
2099
 
1681
2100
  Input actions prefix
1682
2101
 
2102
+ Action control before the field. label or description on sonic-group annotate the row.
2103
+
1683
2104
  Input actions suffix
1684
2105
 
2106
+ Field first, action after (submit, validate, etc.).
2107
+
2108
+ API reference
2109
+
2110
+ | Attribute | Values | Description |
2111
+ |----------|---------|-------------|
2112
+ | label | string (HTML) | Label above the row; slot="label" overrides / extends |
2113
+ | description | string (HTML) | Help text below the row; slot="description" overrides / extends |
2114
+ | alignItems | CSS align-items (default center) | Cross-axis alignment of the main flex row |
2115
+
2116
+ | Slot | Description |
2117
+ |------|-------------|
2118
+ | (default) | sonic-button · sonic-input · sonic-select in visual order |
2119
+ | label | Custom label markup |
2120
+ | description | Custom description markup |
2121
+
1685
2122
  ---
1686
2123
 
1687
2124
  ## Icon
1688
2125
 
1689
2126
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/icon/icon.html
1690
2127
  - Doc ID: core/components/ui/icon/icon
1691
- - Keywords: Concorde, supersoniks, core/components/ui/icon/icon, icon, Icon, UI component, sonic-icon, web component
2128
+ - 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
1692
2129
 
1693
2130
  Icon
1694
2131
 
1695
- Custom
2132
+ 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 default—keep visible text nearby or label the control that contains them.
1696
2133
 
1697
- Icons located in the following folder : /svg/$prefix/$name.svg
2134
+ Core library
1698
2135
 
1699
- regular
2136
+ Omit library to use the bundled set in icons.json. Available name values: cancel · check · check-circled-outline · emoji-puzzled · info-empty · loader · minus-small · more-horiz · more-vert · nav-arrow-down · warning-circled-outline.
1700
2137
 
1701
- solid
2138
+ cancel
1702
2139
 
1703
- default prefix
2140
+ check
2141
+
2142
+ check-circled-outline
2143
+
2144
+ emoji-puzzled
2145
+
2146
+ info-empty
2147
+
2148
+ loader
2149
+
2150
+ minus-small
2151
+
2152
+ more-horiz
1704
2153
 
1705
- External
2154
+ more-vert
2155
+
2156
+ nav-arrow-down
2157
+
2158
+ warning-circled-outline
2159
+
2160
+ External libraries
2161
+
2162
+ Set library to load SVGs from a built-in CDN template. prefix falls back to each library’s default when omitted (outline for heroicons, regular for fontAwesome and material, and so on).
1706
2163
 
1707
2164
  heroicons
1708
2165
 
@@ -1718,8 +2175,20 @@ External
1718
2175
 
1719
2176
  lucide
1720
2177
 
2178
+ Custom library
2179
+
2180
+ Use library="custom" with SVG files on your origin. On an ancestor (for example sonic-scope or sonic-code), set customIconLibraryPath to a URL template with $prefix and $name placeholders, and optionally customIconDefaultPrefix when prefix is omitted.
2181
+
2182
+ regular
2183
+
2184
+ solid
2185
+
2186
+ default prefix
2187
+
1721
2188
  Size
1722
2189
 
2190
+ Omit size for the default scale (1em height). Larger steps use 3xl.
2191
+
1723
2192
  2xs
1724
2193
 
1725
2194
  xs
@@ -1736,87 +2205,250 @@ Size
1736
2205
 
1737
2206
  3xl
1738
2207
 
2208
+ Accessibility
2209
+
2210
+ On connect, the host sets aria-hidden="true". Treat icons as decorative unless the surrounding control already has an accessible name. Do not rely on sonic-icon alone for meaning—use visible text or aria-label on the parent button / link.
2211
+
2212
+ API reference
2213
+
2214
+ | Attribute | Values | Description |
2215
+ |----------|---------|-------------|
2216
+ | name | string | Icon id in the core bundle or in the remote library |
2217
+ | library | heroicons · iconoir · feathers · lucide · material · fontAwesome · custom | CDN or custom template; omit for bundled core icons |
2218
+ | prefix | string | Library-specific variant; defaults per library when empty |
2219
+ | size | 2xs · xs · sm · lg · xl · 2xl · 3xl (default md) | em-based SVG scale on the host |
2220
+
2221
+ Ancestor attributes (for library="custom" only): customIconLibraryPath (URL template with $prefix and $name) and customIconDefaultPrefix. May be set on sonic-scope, theme roots, or globally in the document.
2222
+
2223
+ No slots — the component inlines fetched or bundled SVG markup.
2224
+
1739
2225
  ---
1740
2226
 
1741
2227
  ## Image
1742
2228
 
1743
2229
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/image/image.html
1744
2230
  - Doc ID: core/components/ui/image/image
1745
- - Keywords: Concorde, supersoniks, core/components/ui/image/image, image, Image, UI component, sonic-image, web component
2231
+ - 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="eager", rounded, --sc-rounded
1746
2232
 
1747
2233
  Image
1748
2234
 
2235
+ sonic-image wraps a responsive with aspect ratio, object-fit: cover, optional rounded corners, and load transitions. The host shows a placeholder background (--sc-placeholder-bg) until the asset loads. Default loading is lazy; use loading="eager" for above-the-fold heroes.
2236
+
1749
2237
  Rounded
1750
2238
 
1751
- Ratio
2239
+ Omit rounded for square corners. Boolean rounded uses the theme token --sc-rounded. Sizes: sm, md, lg, xl, full (circle — pair with ratio="1/1"), none (explicit reset).
2240
+
2241
+ default
2242
+
2243
+ sm
2244
+
2245
+ rounded
2246
+
2247
+ md
2248
+
2249
+ lg
2250
+
2251
+ xl
2252
+
2253
+ full
2254
+
2255
+ Aspect ratio
2256
+
2257
+ ratio sets CSS aspect-ratio on the image (default auto). The image still fills the host width (width: 100%).
1752
2258
 
1753
2259
  Object position
1754
2260
 
2261
+ objectPosition maps to CSS object-position (default center center). Useful on wide crops when the subject sits off-center.
2262
+
1755
2263
  Cover
1756
2264
 
2265
+ cover stretches the image to fill a positioned parent (position: relative + fixed height or inset). Aspect ratio on the host is ignored while cover is set.
2266
+
2267
+ Load transition
2268
+
2269
+ Set transition to fade (default when the attribute is present) or fade-scale-out. The image stays at opacity: 0 until the browser fires load, then the loaded class runs the animation. Changing src on an existing element does not replay the effect — mount a new sonic-image when you need another entrance (galleries, infinite scroll).
2270
+
2271
+ Click Add image to append small thumbnails and replay the transition. Clear resets the row.
2272
+
2273
+ Add image (fade)
2274
+
2275
+ Add image (fade-scale-out)
2276
+
2277
+ Clear
2278
+
2279
+ Accessibility and parts
2280
+
2281
+ Always set meaningful alt text (empty string only for decorative images).
2282
+
2283
+ API reference
2284
+
2285
+ | Attribute | Values | Description |
2286
+ |----------|---------|-------------|
2287
+ | src | URL | Image URL passed to |
2288
+ | alt | string | Accessible description; use "" only for decorative images |
2289
+ | loading | lazy (default), eager | Native lazy loading |
2290
+ | ratio | CSS ratio, auto (default) | Host aspect-ratio on the image (ignored when cover is set) |
2291
+ | rounded | none (default), boolean, base, sm, md, lg, xl, full | Corner radius from theme tokens; full is a circle (often with ratio="1/1") |
2292
+ | objectPosition | CSS position | Maps to object-position (default center center) |
2293
+ | imageRendering | CSS value | Maps to image-rendering (default auto) |
2294
+ | cover | boolean | Absolutely fills a positioned parent; host aspect ratio is ignored |
2295
+ | transition | fade, fade-scale-out | Opacity (and scale) animation after load; remount to replay on src change |
2296
+
2297
+ No slots — content is driven entirely by attributes on the inner .
2298
+
2299
+ API reference
2300
+
2301
+ | Attribute | Values | Description |
2302
+ |----------|---------|-------------|
2303
+ | src | URL | Image URL passed to |
2304
+ | alt | string | Accessible description; use "" only for decorative images |
2305
+ | loading | lazy (default), eager | Native lazy loading |
2306
+ | ratio | CSS ratio, auto (default) | Host aspect-ratio on the image (ignored when cover is set) |
2307
+ | rounded | none (default), boolean, base, sm, md, lg, xl, full | Corner radius from theme tokens; full is a circle (often with ratio="1/1") |
2308
+ | objectPosition | CSS position | Maps to object-position (default center center) |
2309
+ | imageRendering | CSS value | Maps to image-rendering (default auto) |
2310
+ | cover | boolean | Absolutely fills a positioned parent; host aspect ratio is ignored |
2311
+ | transition | fade, fade-scale-out | Opacity (and scale) animation after load; remount to replay on src change |
2312
+
2313
+ No slots — content is driven entirely by attributes on the inner .
2314
+
1757
2315
  ---
1758
2316
 
1759
2317
  ## Link
1760
2318
 
1761
2319
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/link/link.html
1762
2320
  - Doc ID: core/components/ui/link/link
1763
- - Keywords: Concorde, supersoniks, core/components/ui/link/link, link, Link, UI component, sonic-link, web component
2321
+ - Keywords: Concorde, supersoniks, core/components/ui/link/link, link, Link, UI component, sonic-link, web component, href, pushstate, autoActive, active, target="_blank", rel="noopener noreferrer", partial
1764
2322
 
1765
2323
  Link
1766
2324
 
1767
- Href
2325
+ Links navigate with inherited typography: internal routes, anchors, or external URLs. The default slot is the anchor label. For in-app routing, pair href with pushstate; use autoActive to reflect the current URL on the host (active).
1768
2326
 
1769
- Basic link with href attibute
2327
+ Basic example
2328
+
2329
+ Basic link with href attribute
1770
2330
 
1771
2331
  Target
1772
2332
 
1773
- Link with target attibute
2333
+ target="blank" opens a new browsing context and sets rel="noopener noreferrer".
2334
+
2335
+ Link with target attribute
2336
+
2337
+ Pushstate
2338
+
2339
+ Set pushstate on same-origin href values to intercept clicks and navigate through Concorde’s client router without a full reload.
2340
+
2341
+ Client navigation (pushstate)
1774
2342
 
1775
2343
  AutoActive
1776
2344
 
2345
+ Default autoActive is partial: the host gets active when the current URL starts with href. Style with [&[active]]: utilities or host selectors.
2346
+
1777
2347
  autoActive partial (default)
1778
2348
 
1779
- AutoActive Strict vs partial
2349
+ AutoActive strict vs partial
2350
+
2351
+ strict requires pathname, search, and hash to match. strict-path-only matches pathname and hash but ignores search.
1780
2352
 
1781
2353
  autoActive strict
1782
- autoActive strict
2354
+ autoActive strict (long href)
2355
+ autoActive strict-path-only
1783
2356
 
1784
2357
  AutoActive disabled
1785
2358
 
1786
2359
  autoActive disabled
1787
2360
 
2361
+ Accessibility
2362
+
2363
+ The inner uses focus-visible outline styling. Set data-aria-label when the slot text is not sufficient on its own.
2364
+
2365
+ API reference
2366
+
2367
+ | Attribute | Values | Description |
2368
+ |----------|---------|-------------|
2369
+ | href | URL | Link target; without href, only the slot is rendered (no ) |
2370
+ | target | e.g. blank | Navigation target; blank adds rel="noopener noreferrer" |
2371
+ | pushstate | boolean | Intercepts click for Concorde client navigation without reload |
2372
+ | autoActive | partial (default) · strict · strict-path-only · disabled | When the host gets the active attribute (same-origin href only) |
2373
+ | data-aria-label | string | Accessible aria-label when the slot text is not enough |
2374
+
2375
+ | Slot | Description |
2376
+ |------|-------------|
2377
+ | (default) | Link content (text, icons) |
2378
+
1788
2379
  ---
1789
2380
 
1790
2381
  ## Loader
1791
2382
 
1792
- - URL: https://concorde.supersoniks.org/crawl/core/components/ui/loader/loader.html
1793
- - Doc ID: core/components/ui/loader/loader
1794
- - Keywords: Concorde, supersoniks, core/components/ui/loader/loader, loader, Loader, UI component, sonic-loader, web component
2383
+ - URL: https://concorde.supersoniks.org/crawl/core/components/ui/loader/loader.html
2384
+ - Doc ID: core/components/ui/loader/loader
2385
+ - Keywords: Concorde, supersoniks, core/components/ui/loader/loader, loader, Loader, UI component, sonic-loader, web component, mode, fixed, inline, noDelay, sonic-fetch, sonic-list, currentColor
2386
+
2387
+ Loader
2388
+
2389
+ sonic-loader shows a loading animation in the page or as a viewport overlay. Default mode is fixed (centered overlay). Use inline inside lists and fetch placeholders. Pair noDelay when the spinner should appear without the default fade-in wait. For sonic-fetch / sonic-list, set the parent loader attribute instead of embedding a tag manually.
2390
+
2391
+ Basic example
2392
+
2393
+ Inline loaders fit content areas; they use the theme primary color unless currentColor is set.
2394
+
2395
+ Mode
2396
+
2397
+ inline — ellipsis animation in the document flow. fixed — centered overlay (position: fixed); default when the tag is omitted.
2398
+
2399
+ Use the checkbox below to toggle a fixed loader over the page (default mode on sonic-loader).
2400
+
2401
+ Inline alignment and color
2402
+
2403
+ align only affects mode="inline": left · center (default) · right. Set currentColor so dots follow the host color (for example on a purple parent).
2404
+
2405
+ noDelay
2406
+
2407
+ By default mode="fixed" waits briefly before fading in. mode="inline" already skips that wait. Set noDelay on fixed (or pass noDelay: true to Loader.show()) to appear immediately.
2408
+
2409
+ Accessibility (announce)
2410
+
2411
+ The animation is aria-hidden by default so screen readers are not spammed on every fetch. Set announce when the loader is injected after user action (for example a global overlay): the host gets role="status", aria-live="polite", and a localized aria-label (“Loading” / “Chargement en cours”, …). For in-button loading, prefer sonic-button loading and aria-busy on the control—not on the loader.
2412
+
2413
+ Show and hide programmatically
2414
+
2415
+ Import Loader and call Loader.show() / Loader.hide(). hide() is reference-counted: call it once per show(). With no container, the loader is appended to the theme pop container and mode is always fixed. Pass container and mode: "inline" to mount an inline instance in a specific element.
2416
+
2417
+ import { Loader } from "@supersoniks/concorde/core/components/ui/loader/loader";
2418
+
2419
+ Loader.show({
2420
+ mode: "fixed",
2421
+ noDelay: false,
2422
+ announce: true,
2423
+ container: document.querySelector("#foo"),
2424
+ });
1795
2425
 
1796
- Loader
2426
+ Loader.hide();
1797
2427
 
1798
- Inline mode
2428
+ Composition
1799
2429
 
1800
- CurrentColor
2430
+ sonic-button loading shows an icon spinner and sets aria-busy on the button. sonic-fetch and sonic-list render sonic-loader when their loader attribute is set: true or an empty string maps to fixed; otherwise use inline or fixed.
1801
2431
 
1802
- Align
2432
+ Save changes
1803
2433
 
1804
- Fixed mode
2434
+ API reference
1805
2435
 
1806
- Loading button
2436
+ | Attribute | Values | Description |
2437
+ |----------|---------|-------------|
2438
+ | mode | inline · fixed (default fixed) | Layout: in-flow ellipsis vs viewport-centered overlay |
2439
+ | noDelay | boolean | Skips the initial fade-in delay before the animation appears |
2440
+ | announce | boolean | role="status" and aria-live="polite" with localized loading label when the loader should be announced |
2441
+ | align | left · center · right | Horizontal alignment for mode="inline" only (attribute selector; default centered) |
2442
+ | currentColor | boolean | Uses currentColor for dot fill instead of --sc-primary |
1807
2443
 
1808
- A loading button
2444
+ This component has no slots. The animation markup is internal.
1809
2445
 
1810
- Hide / show programmatically
2446
+ Static methods
1811
2447
 
1812
- import {Loader} from "@supersoniks/concorde/core/components/ui/loader/loader";
1813
- // Show
1814
- Loader.show({
1815
- mode:"fixed" // optional : fixed | inline
1816
- container : document.querySelector('#foo') // optional, default : parent sonic-theme || document.body
1817
- });
1818
- // Hide
1819
- Loader.hide();
2448
+ | Method | Description |
2449
+ |--------|-------------|
2450
+ | Loader.show(conf?) | Mounts the shared loader instance. conf.mode, conf.noDelay, conf.announce, optional conf.container. Without container, uses the theme pop container and forces fixed. |
2451
+ | Loader.hide() | Decrements the show counter and removes the instance from the DOM when it reaches zero. |
1820
2452
 
1821
2453
  ---
1822
2454
 
@@ -1824,12 +2456,24 @@ import {Loader} from "@supersoniks/concorde/core/components/ui/loader/loader";
1824
2456
 
1825
2457
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/menu/menu.html
1826
2458
  - Doc ID: core/components/ui/menu/menu
1827
- - Keywords: Concorde, supersoniks, core/components/ui/menu/menu, menu, Menu, UI component, sonic-menu, web component
2459
+ - Keywords: Concorde, supersoniks, core/components/ui/menu/menu, menu, Menu, UI component, sonic-menu, web component, direction, sonic-menu-item, variant, shape, sonic-divider, more, href, pushstate, autoActive
1828
2460
 
1829
2461
  Menu
1830
2462
 
2463
+ sonic-menu lays out navigation or actions as a direction row or column of sonic-menu-item entries (ghost variant and block shape by default), optional sonic-divider separators, and overflow content in the more slot (popover “…” trigger). Set href / pushstate / autoActive on each sonic-menu-item—same API as sonic-button—not on the menu host.
2464
+
2465
+ Basic example
2466
+
2467
+ Home
2468
+
2469
+ Profile
2470
+
2471
+ Log out
2472
+
1831
2473
  Direction
1832
2474
 
2475
+ Default direction is column. Use row for horizontal toolbars or tabs.
2476
+
1833
2477
  Row
1834
2478
 
1835
2479
  Profile
@@ -1852,7 +2496,9 @@ Direction
1852
2496
 
1853
2497
  Size
1854
2498
 
1855
- XS
2499
+ size on the menu propagates to items and the more trigger when they omit their own size.
2500
+
2501
+ XS
1856
2502
 
1857
2503
  Profile
1858
2504
 
@@ -1860,7 +2506,7 @@ Size
1860
2506
 
1861
2507
  Orders
1862
2508
 
1863
- Small
2509
+ Small
1864
2510
 
1865
2511
  Profile
1866
2512
 
@@ -1868,7 +2514,7 @@ Size
1868
2514
 
1869
2515
  Orders
1870
2516
 
1871
- Medium
2517
+ Medium
1872
2518
 
1873
2519
  Profile
1874
2520
 
@@ -1876,7 +2522,7 @@ Size
1876
2522
 
1877
2523
  Orders
1878
2524
 
1879
- Large
2525
+ Large
1880
2526
 
1881
2527
  Profile
1882
2528
 
@@ -1884,7 +2530,7 @@ Size
1884
2530
 
1885
2531
  Orders
1886
2532
 
1887
- XL
2533
+ XL
1888
2534
 
1889
2535
  Profile
1890
2536
 
@@ -1894,30 +2540,36 @@ Size
1894
2540
 
1895
2541
  Shadow
1896
2542
 
1897
- None
2543
+ Optional shadow wraps the menu surface (no shadow when omitted).
1898
2544
 
1899
- Small
2545
+ None
1900
2546
 
1901
- Medium
2547
+ Small
1902
2548
 
1903
- Large
2549
+ Medium
2550
+
2551
+ Large
1904
2552
 
1905
2553
  Align
1906
2554
 
1907
- Home
2555
+ align propagates to items except square / circle shape.
1908
2556
 
1909
- Profile
2557
+ Home
1910
2558
 
1911
- Home
2559
+ Profile
1912
2560
 
1913
- Profile
2561
+ Home
1914
2562
 
1915
- Home
2563
+ Profile
1916
2564
 
1917
- Profile
2565
+ Home
2566
+
2567
+ Profile
1918
2568
 
1919
2569
  More
1920
2570
 
2571
+ Assign nodes to slot="more" to show the overflow popover. The trigger appears only when the slot has content. Icon orientation follows direction (vertical ellipsis in a row menu).
2572
+
1921
2573
  Home
1922
2574
 
1923
2575
  Profile
@@ -1934,6 +2586,8 @@ More
1934
2586
 
1935
2587
  Scrollable
1936
2588
 
2589
+ With scrollable, the main slot scrolls with edge fade masks; drag-to-scroll works on pointer devices. When exactly one item is active, the menu scrolls it into view.
2590
+
1937
2591
  Home
1938
2592
 
1939
2593
  Profile
@@ -1968,74 +2622,189 @@ Scrollable
1968
2622
 
1969
2623
  Log out
1970
2624
 
2625
+ API reference
2626
+
2627
+ | Attribute | Values | Description |
2628
+ |----------|---------|-------------|
2629
+ | direction | column (default) · row | Vertical list or horizontal bar |
2630
+ | align | left (default) · center · right | Alignment propagated to items (except square / circle shape) |
2631
+ | size | xs · sm · md · lg · xl | Propagated to items and the more trigger when unset on the item |
2632
+ | shadow | sm · md · lg | Shadow around the menu; omitted for none |
2633
+ | minWidth | CSS length | Minimum width of the container (default 0) |
2634
+ | scrollable | boolean | Scroll with edge fade; auto-scroll when a single item is active |
2635
+ | moreShape | circle (default) · square | Shape of the more slot trigger button |
2636
+
2637
+ | Slot | Description |
2638
+ |------|-------------|
2639
+ | (default) | Visible items: sonic-menu-item, sonic-divider, nested sonic-menu |
2640
+ | more | Popover content for the “…” control; shown only when the slot has assigned nodes |
2641
+
2642
+ sonic-menu-item extends sonic-button (defaults: variant="ghost", shape="block"). Use the button docs for type, variant, href, pushstate, autoActive, and item slots.
2643
+
1971
2644
  ---
1972
2645
 
1973
- ## Concorde
2646
+ ## Modal
1974
2647
 
1975
2648
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/modal/modal.html
1976
2649
  - Doc ID: core/components/ui/modal/modal
1977
- - Keywords: Concorde, supersoniks, core/components/ui/modal/modal, modal, UI component, sonic-modal, web component
2650
+ - Keywords: Concorde, supersoniks, core/components/ui/modal/modal, modal, Modal, UI component, sonic-modal, web component, , sonic-modal-title, sonic-modal-subtitle, sonic-modal-content, sonic-modal-actions, show(), hideModal, hide(), forceAction
1978
2651
 
1979
2652
  Modal
1980
2653
 
1981
- Simple modal
2654
+ sonic-modal presents focused content in a overlay with backdrop, enter/exit animation, and a built-in close control. Compose sonic-modal-title / sonic-modal-subtitle / sonic-modal-content / sonic-modal-actions, or use the default slot. Call show() on the element to open; use hideModal on action buttons or hide() from script. Set forceAction when dismissal must go through explicit actions only. Imperative dialogs: Modal.create() (also window.SonicModal).
2655
+
2656
+ Basic example
2657
+
2658
+ Click the trigger to open. sonic-modal-actions lays out footer buttons; hideModal closes the modal on click. Scope form state with formDataProvider on sonic-modal-actions so child sonic-button elements share one publisher.
1982
2659
 
1983
- Lorem ipsum dolor sit amet +33
1984
- Donec sed vestibulum augue.
2660
+ Open modal
1985
2661
 
1986
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eget quam eu mi luctus faucibus.
2662
+ Export ready
2663
+ New
1987
2664
 
1988
- Click don't close
2665
+ Your report finished processing.
1989
2666
 
1990
- Confirm
2667
+ Download the CSV now or review the summary in your dashboard before sharing.
1991
2668
 
1992
- Long text
2669
+ Save draft
1993
2670
 
1994
- Long text
2671
+ Download
1995
2672
 
1996
- Infos et tarifs
2673
+ Scrollable content
1997
2674
 
1998
- Horaires d’ouverture
1999
- Du mercredi au samedi de 13h30 à 19h et le dimanche de 13h30 à 18h
2000
- + horaires spécifiques pour événements ou festivals 
2675
+ Long copy scrolls inside the dialog. Default maxHeight is 90vh. Default align is left.
2001
2676
 
2002
- Billetterie 
2003
- La participation à certains événements et activités est soumise à un système de billetterie avec achats ou
2004
- réservations disponibles en ligne ou au guichet.  
2677
+ Venue details
2005
2678
 
2006
- Les tarifs (Tarif plein / Tarif Réduit / Tarif Spécifique) sont indiqués pour chaque événement et peuvent
2007
- varier selon la nature de l’événement. Les tarifs sont identiques en ligne et au guichet. Il est néanmoins
2008
- conseillé de réserver les billets en avance pour s’assurer une place.
2679
+ Hours and tickets
2009
2680
 
2010
- L’accès au Skatepark, Fablab et Halle C sont soumis à adhésions. Les adhésions sont gratuites et
2011
- nominatives. Elle donnent accès aux espaces dans la limite des places disponibles.
2681
+ Opening hours
2682
+ Wednesday–Saturday, 1:30 p.m.–7:00 p.m.; Sunday, 1:30 p.m.–6:00 p.m.
2012
2683
 
2013
- + d’infos billetterie@laconditionpublique.com +33 (0)328334833 
2684
+ Ticketing
2685
+ Some events require online or box-office reservations. Prices vary by event; booking ahead is recommended when capacity is limited.
2014
2686
 
2015
- Accès 14, place Faidherbe 59100 Roubaix Métro / Tram : Arrêt
2016
- Eurotéléport, Ligne 2 Bus / V’Lille : Arrêt Condition Publique 
2687
+ Contact
2688
+ tickets@example.com · +33 3 28 33 48 33
2017
2689
 
2018
- Accès handicapés : nous contacter avant votre venue au 03 28 33 48 33 ou par mail
2019
- billetterie@laconditionpublique.com
2690
+ Access
2691
+ 14 Place Faidherbe, 59100 Roubaix
2692
+ Metro line 2, Eurotéléport stop
2020
2693
 
2021
2694
  Force action
2022
2695
 
2023
- Force action to close
2696
+ With forceAction, backdrop click, Escape, and the default close button are disabled. Provide sonic-modal-actions (or sonic-modal-close) so users can finish the flow.
2024
2697
 
2025
- Do you want some cookies ?
2698
+ Cookie consent
2026
2699
 
2027
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eget quam eu mi luctus faucibus.
2700
+ Allow analytics cookies?
2028
2701
 
2029
- Nope
2030
- Hell yes !
2702
+ We use cookies to measure traffic and improve the product. You can change this later in settings.
2703
+
2704
+ Decline
2705
+ Accept
2031
2706
 
2032
2707
  Custom dimensions
2033
2708
 
2034
- Custom width
2709
+ Set width / height / maxWidth / maxHeight (CSS lengths). On narrow viewports the panel becomes a bottom sheet. Use rounded="none" for edge-to-edge media.
2710
+
2711
+ Image preview
2035
2712
 
2036
2713
  Fullscreen
2037
2714
 
2038
- Fullscreen
2715
+ fullscreen fills the viewport and hides the backdrop.
2716
+
2717
+ Fullscreen
2718
+
2719
+ Programmatic creation
2720
+
2721
+ Use Modal.create(options) when there is no modal in the template—for confirmations, toasts that need a follow-up, or one-off flows from script. The modal is appended to the nearest sonic-theme pop container (same as declarative modals), opened automatically, and returns the sonic-modal instance. Set removeOnHide: true to detach it from the DOM after close. In the browser, window.SonicModal is the same class after the module loads.
2722
+
2723
+ Pass title / subtitle / content / actions as HTML strings (or Lit template results from application code). Put hideModal on action buttons in the actions string so clicks close the dialog.
2724
+
2725
+ Open programmatic modal
2726
+
2727
+ import { Modal } from "@supersoniks/concorde/core/components/ui/modal/modal";
2728
+
2729
+ const modal = Modal.create({
2730
+ title: "Delete project?",
2731
+ subtitle: "This cannot be undone.",
2732
+ content: " All files in Acme HQ will be removed. ",
2733
+ actions:
2734
+ Cancel
2735
+ Delete
2736
+ ,
2737
+ removeOnHide: true,
2738
+ forceAction: false,
2739
+ maxWidth: "min(100vw, 28rem)",
2740
+ });
2741
+
2742
+ modal.addEventListener("hidden", () => {
2743
+ console.log("Modal removed from the DOM");
2744
+ });
2745
+
2746
+ // Or close from script: await modal.hide(); await modal.dispose();
2747
+
2748
+ API reference
2749
+
2750
+ sonic-modal
2751
+
2752
+ | Attribute | Values | Description |
2753
+ |----------|---------|-------------|
2754
+ | align | left (default) · center · right | Align title and slotted content |
2755
+ | maxWidth | CSS length (default min(100vw, 40rem)) | Dialog max width |
2756
+ | maxHeight | CSS length (default 90vh) | Scrollable body max height |
2757
+ | width | CSS length (default 100%) | Dialog width |
2758
+ | height | CSS length (default fit-content) | Dialog height |
2759
+ | paddingX · paddingY | CSS length | Override content padding (--sc-modal-px / --sc-modal-py) |
2760
+ | zIndex | CSS number | Stacking order (default 990) |
2761
+ | effect | slide (default) · fade · none | Open/close animation |
2762
+ | fullscreen | boolean | Full viewport; no backdrop |
2763
+ | forceAction | boolean | Disable overlay, Escape, and default close button |
2764
+ | noCloseButton | boolean | Hide built-in close when not forceAction |
2765
+ | closeButtonType | sonic-button type | Style of built-in close |
2766
+ | visible | boolean | When toggled, opens or closes the dialog |
2767
+ | removeOnHide | boolean | Remove element from DOM after close |
2768
+ | removeHashOnHide | boolean | Clear URL hash on close |
2769
+ | closeOnLocationChange | boolean | Close when app location changes |
2770
+ | resetDataProviderOnHide | string | Reset named formDataProvider on close |
2771
+ | rounded | none | Square dialog corners (useful for full-bleed media) |
2772
+
2773
+ | Slot | Description |
2774
+ |------|-------------|
2775
+ | (default) | Additional markup alongside structured children |
2776
+
2777
+ | Event | Description |
2778
+ |-------|-------------|
2779
+ | show | Fired when open animation completes |
2780
+ | hide | Fired when close starts |
2781
+ | hidden | Fired when close finishes |
2782
+
2783
+ Methods: show() · hide() · dispose() (hide and remove). Static Modal.create(options) appends a modal to the theme pop container and opens it. options / styleSheet are JavaScript-only.
2784
+
2785
+ sonic-modal-title · sonic-modal-subtitle · sonic-modal-content
2786
+
2787
+ | Slot | Description |
2788
+ |------|-------------|
2789
+ | (default) | Title, subtitle, or main body content |
2790
+
2791
+ sonic-modal-actions
2792
+
2793
+ | Slot | Description |
2794
+ |------|-------------|
2795
+ | (default) | Footer actions (typically sonic-button) |
2796
+
2797
+ Put hideModal on a sonic-button to close the parent modal on click. Ancestor formDataProvider on this element is inherited by child form controls.
2798
+
2799
+ sonic-modal-close
2800
+
2801
+ Rendered automatically unless forceAction or noCloseButton is set. Calls hide() on the parent modal.
2802
+
2803
+ | Attribute | Values | Description |
2804
+ |----------|---------|-------------|
2805
+ | type | sonic-button type | Close button color |
2806
+ | reset | string | Passed to inner sonic-button reset |
2807
+ | translation | UI label object | Overrides default close aria-label |
2039
2808
 
2040
2809
  ---
2041
2810
 
@@ -2043,103 +2812,237 @@ Fullscreen
2043
2812
 
2044
2813
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/pop/pop.html
2045
2814
  - Doc ID: core/components/ui/pop/pop
2046
- - Keywords: Concorde, supersoniks, core/components/ui/pop/pop, pop, Pop, UI component, sonic-pop, web component
2815
+ - Keywords: Concorde, supersoniks, core/components/ui/pop/pop, pop, Pop, UI component, sonic-pop, web component, slot="content", manual, placement, bottom, top, left, right, -start
2047
2816
 
2048
2817
  Pop
2049
2818
 
2819
+ sonic-pop anchors floating panels to a trigger: put the control in the default slot and the panel in slot="content" (menus, forms, custom markup). Click toggles open/closed unless manual is set; default placement is bottom (start-aligned). Position updates while open and flips inside the viewport when space is tight.
2820
+
2821
+ Basic example
2822
+
2823
+ Notifications
2824
+
2825
+ Notifications
2826
+
2827
+ Settings
2828
+
2050
2829
  Placement
2051
2830
 
2052
- Left
2831
+ Use top · bottom · left · right for the main axis. Add -start · -center · -end to align along the trigger edge. With no align suffix, content aligns to start. Legacy space syntax (placement="bottom center") still works but is deprecated—prefer bottom-center.
2832
+
2833
+ Left
2834
+
2835
+ Notifications
2836
+
2837
+ Right
2838
+
2839
+ Notifications
2840
+
2841
+ Top
2842
+
2843
+ Notifications
2844
+
2845
+ Bottom
2846
+
2847
+ Notifications
2848
+
2849
+ Center-aligned sides
2850
+
2851
+ Bottom center
2053
2852
 
2054
- Notifications
2853
+ Notifications
2055
2854
 
2056
- Right
2855
+ Top center
2057
2856
 
2058
- Notifications
2857
+ Notifications
2059
2858
 
2060
- Top
2859
+ Left center
2061
2860
 
2062
- Notifications
2861
+ Notifications
2063
2862
 
2064
- Bottom
2863
+ Right center
2065
2864
 
2066
- Notifications
2865
+ Notifications
2067
2866
 
2068
2867
  Shadow
2069
2868
 
2070
- None
2869
+ Default shadow is lg. The shadow applies to the floating content panel.
2071
2870
 
2072
- Notifications
2871
+ None
2073
2872
 
2074
- Small
2873
+ Notifications
2075
2874
 
2076
- Notifications
2875
+ Small
2077
2876
 
2078
- Medium
2877
+ Notifications
2079
2878
 
2080
- Notifications
2879
+ Medium
2081
2880
 
2082
- Large
2881
+ Notifications
2882
+
2883
+ Large
2884
+
2885
+ Notifications
2886
+
2887
+ Inline
2888
+
2889
+ By default the host is middle-aligned with siblings. Set inline to baseline-align the trigger inside running text.
2083
2890
 
2084
- Notifications
2891
+ The Concorde flew from Paris to
2085
2892
 
2086
- noToggle
2893
+ New York
2087
2894
 
2088
- No toggle on click
2895
+ See flights
2896
+ Book a seat
2089
2897
 
2090
- Notifications
2898
+ in about 3.5 hours.
2091
2899
 
2092
- Default toggle on click
2900
+ No toggle
2093
2901
 
2094
- Notifications
2902
+ With noToggle, a click on the trigger still opens the pop but does not close it when it is already open. Use hide() or an outside click to dismiss.
2095
2903
 
2096
- manual
2904
+ No toggle on click
2097
2905
 
2098
- Manual doesn't open on click
2906
+ Notifications
2099
2907
 
2100
- Hourra !
2908
+ Default toggle on click
2909
+
2910
+ Notifications
2911
+
2912
+ Manual control
2913
+
2914
+ Set manual to disable built-in click and keyboard toggle on the trigger. Call show() and hide() on the element instead. The pop dispatches show when it opens and hide when it closes.
2915
+
2916
+ Click Click to open pop to open the panel programmatically.
2917
+
2918
+ Manual trigger
2919
+
2920
+ It worked!
2101
2921
 
2102
2922
  Click to open pop
2103
2923
 
2924
+ Keep open on select
2925
+
2926
+ By default, a click inside content closes the pop (same as an outside click). Set data-on-select="keep" on the panel or a descendant to keep it open while selecting checkboxes, toggles, or menu items.
2927
+
2928
+ Closes on select
2929
+
2930
+ Option A
2931
+ Option B
2932
+
2933
+ Stays open on select
2934
+
2935
+ Option A
2936
+ Option B
2937
+
2938
+ Keyboard and dismissal
2939
+
2940
+ ArrowDown on the trigger opens the pop when it is closed. Escape closes the most recently opened pop (capture phase, before ancestors such as sonic-modal) and returns focus to that trigger. Multiple pops on the page stack in open order for Escape.
2941
+
2942
+ Focus me — ArrowDown opens, Escape closes
2943
+
2944
+ First item
2945
+ Second item
2946
+
2947
+ API reference
2948
+
2949
+ | Attribute | Values | Description |
2950
+ |----------|---------|-------------|
2951
+ | placement | bottom (default) · top · left · right · top-start · top-center · top-end · bottom-start · bottom-center · bottom-end · left-start · left-center · left-end · right-start · right-center · right-end | Side and alignment relative to the trigger; repositions while open and flips within the viewport |
2952
+ | shadow | none · sm · md · lg (default lg) | Box shadow on the content panel |
2953
+ | inline | boolean | Baseline-align the host for inline triggers |
2954
+ | noToggle | boolean | When open, trigger click does not close the pop |
2955
+ | manual | boolean | Disable default trigger toggle; use show() / hide() |
2956
+
2957
+ | Slot | Description |
2958
+ |------|-------------|
2959
+ | (default) | Trigger; listens for click and keydown (ArrowDown opens when closed) unless manual |
2960
+ | content | Floating panel; receives focus tabindex="0" while open |
2961
+
2962
+ Methods: show() · hide() on the host element.
2963
+
2964
+ Events: show · hide (non-bubbling CustomEvent).
2965
+
2966
+ Content attribute: data-on-select="keep" on content or descendants prevents close-on-click inside the panel.
2967
+
2104
2968
  ---
2105
2969
 
2106
- ## Progress bar
2970
+ ## Progress
2107
2971
 
2108
2972
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/progress/progress.html
2109
2973
  - Doc ID: core/components/ui/progress/progress
2110
- - Keywords: Concorde, supersoniks, core/components/ui/progress/progress, progress, Progress bar, UI component, sonic-progress, web component
2974
+ - Keywords: Concorde, supersoniks, core/components/ui/progress/progress, progress, Progress, UI component, sonic-progress, web component, value, max, , remaining, invert, sonic-card, to **, ** (default
2111
2975
 
2112
- Progress bar
2976
+ Progress
2113
2977
 
2114
- Displays an indicator showing the completion progress of a task.
2978
+ Shows task completion on a value / max scale via a native bar. Omit value for an indeterminate loading animation. Put primary copy in the default slot and optional secondary text in remaining; set invert when the bar sits on a colored surface such as sonic-card.
2115
2979
 
2116
- Indeterminate
2980
+ Basic example
2117
2981
 
2118
- Remaining
2982
+ Set value from 0 to max (default 100). Label text uses the type color.
2119
2983
 
2120
- 80% Used 20% left
2984
+ 50%
2121
2985
 
2122
- Sizes
2986
+ Indeterminate
2123
2987
 
2124
- 25%
2125
- 25%
2126
- 25%
2127
- 25%
2128
- 25%
2129
- 25%
2130
- 25%
2988
+ With no value, the bar animates until progress is known.
2131
2989
 
2132
2990
  Type
2133
2991
 
2134
- 50%
2135
- 50%
2136
- 50%
2137
- 50%
2138
- 50%
2992
+ Semantic color follows type. With no type, behavior is default.
2993
+
2994
+ 50%
2995
+ 50%
2996
+ 50%
2997
+ 50%
2998
+ 50%
2999
+ 50%
3000
+ 50%
3001
+
3002
+ Size
3003
+
3004
+ Bar height scales with typography via size. With no size, font size matches md (1rem).
3005
+
3006
+ 25%
3007
+ 25%
3008
+ 25%
3009
+ 25%
3010
+ 25%
3011
+ 25%
3012
+ 25%
3013
+
3014
+ Default and remaining slots
3015
+
3016
+ The default slot is the main label (left). remaining is right-aligned with lighter weight—use it for “left to complete” copy.
3017
+
3018
+ 80% Used 20% left
2139
3019
 
2140
3020
  Invert
2141
3021
 
2142
- 50%
3022
+ On tinted backgrounds, invert adjusts track and fill tokens so the bar stays readable (pair with matching type on sonic-card or similar).
3023
+
3024
+ 50%
3025
+
3026
+ 50%
3027
+
3028
+ 50%
3029
+
3030
+ 50%
3031
+
3032
+ API reference
3033
+
3034
+ | Attribute | Values | Description |
3035
+ |----------|---------|-------------|
3036
+ | value | number | Completion amount; omit for indeterminate state |
3037
+ | max | number (default 100) | Upper bound for value |
3038
+ | type | default (default) · primary · neutral · warning · info · success · danger | Semantic bar and label color |
3039
+ | size | 2xs · xs · sm · md · lg · xl · 2xl · inherit | Typography scale (bar height follows em) |
3040
+ | invert | boolean | High-contrast tokens on colored backgrounds |
3041
+
3042
+ | Slot | Description |
3043
+ |------|-------------|
3044
+ | (default) | Primary label below the bar (left) |
3045
+ | remaining | Secondary label below the bar (right) |
2143
3046
 
2144
3047
  ---
2145
3048
 
@@ -2147,11 +3050,15 @@ Invert
2147
3050
 
2148
3051
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/table/table.html
2149
3052
  - Doc ID: core/components/ui/table/table
2150
- - Keywords: Concorde, supersoniks, core/components/ui/table/table, table, Table, UI component, sonic-table, web component
3053
+ - Keywords: Concorde, supersoniks, core/components/ui/table/table, table, Table, UI component, sonic-table, web component, sonic-tr, sonic-th, sonic-td, size, maxHeight, sonic-thead, sonic-tbody, sonic-list
2151
3054
 
2152
3055
  Table
2153
3056
 
2154
- Basic usage
3057
+ sonic-table lays out tabular data with composable sonic-tr / sonic-th / sonic-td children. The root applies shared typography via size, scrolls horizontally when content overflows, and optionally caps height with maxHeight. Pair with sonic-thead and sonic-tbody for structure and with sonic-list to render fetched rows.
3058
+
3059
+ Basic example
3060
+
3061
+ A header row plus body rows is enough for static tables; sonic-thead / sonic-tbody are optional for simple layouts.
2155
3062
 
2156
3063
  Id
2157
3064
  Name
@@ -2169,7 +3076,9 @@ Basic usage
2169
3076
  Emma Wong
2170
3077
  emma.wong@reqres.in
2171
3078
 
2172
- List / fetch
3079
+ List and fetch
3080
+
3081
+ Place sonic-list inside sonic-tbody so each item template renders a sonic-tr. sonic-list sets row metadata (even / odd / last) on sonic-tr for striping and borders.
2173
3082
 
2174
3083
  Id
2175
3084
  Name
@@ -2179,6 +3088,8 @@ List / fetch
2179
3088
 
2180
3089
  Size
2181
3090
 
3091
+ Default font size is md (omit size). Sizes follow the shared scale (2xs … 2xl).
3092
+
2182
3093
  2xs
2183
3094
 
2184
3095
  xs
@@ -2197,6 +3108,8 @@ Size
2197
3108
 
2198
3109
  Bordered
2199
3110
 
3111
+ Set bordered on sonic-table for an outer frame and horizontal rules between rows.
3112
+
2200
3113
  Id
2201
3114
  Name
2202
3115
  Email
@@ -2213,7 +3126,9 @@ Bordered
2213
3126
  Emma Wong
2214
3127
  emma.wong@reqres.in
2215
3128
 
2216
- MaxHeight
3129
+ Max height
3130
+
3131
+ maxHeight applies to the scroll container (for example 8rem), so the body scrolls vertically while the table can still scroll horizontally.
2217
3132
 
2218
3133
  Id
2219
3134
  Name
@@ -2223,36 +3138,34 @@ MaxHeight
2223
3138
 
2224
3139
  Type
2225
3140
 
2226
- Values available : primary, info, success, warning, danger
3141
+ Set type on sonic-th / sonic-td / sonic-tr for semantic text color (primary · info · success · warning · danger · neutral · default).
3142
+
3143
+ Attribute type set on
3144
+ sonic-th
2227
3145
 
2228
- Attribute type set on
2229
- sonic-th
3146
+ Attribute type set on
3147
+ sonic-td
2230
3148
 
2231
- Attribute type set on
2232
- sonic-td
3149
+ Attribute type set on
3150
+ sonic-tr
2233
3151
 
2234
- Attribute type set on
2235
- sonic-tr
3152
+ Colspan and rowspan
2236
3153
 
2237
- Colspan / rowspan
3154
+ Use colSpan and rowSpan on sonic-th or sonic-td (maps to colspan / rowspan on the cell).
2238
3155
 
2239
- colspan : 2
3156
+ colspan: 2
2240
3157
  cell
2241
3158
 
2242
3159
  cell
2243
3160
  cell
2244
- rowspan : 2
3161
+ rowspan: 2
2245
3162
 
2246
3163
  cell
2247
3164
  cell
2248
3165
 
2249
- Cell style attributes
3166
+ Cell alignment and width
2250
3167
 
2251
- The following attributes will be used to set the style of the component :
2252
- - align
2253
- - minWidth
2254
- - maxWidth
2255
- - width
3168
+ align sets horizontal alignment (left · center · right). minWidth / maxWidth / width set inline dimensions on the cell. vAlign is available on sonic-td only.
2256
3169
 
2257
3170
  align
2258
3171
  minWidth
@@ -2271,12 +3184,12 @@ The following attributes will be used to set the style of the component :
2271
3184
 
2272
3185
  right
2273
3186
  20rem
2274
- 5rem - Lorem ipsum dolor
2275
- 15rem - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam porta sollicitudin mollis. Curabitur sit amet nibh diam. Vivamus a pharetra mauris.
3187
+ 5rem — Lorem ipsum dolor
3188
+ 15rem — Lorem ipsum dolor sit amet, consectetur adipiscing elit.
2276
3189
 
2277
- Responsive
3190
+ Responsive layout
2278
3191
 
2279
- Every table is responsive by default
3192
+ Tables scroll horizontally by default when columns exceed the viewport. Use minWidth on wide columns to preserve readable line length.
2280
3193
 
2281
3194
  Id
2282
3195
  Name
@@ -2285,9 +3198,11 @@ Every table is responsive by default
2285
3198
 
2286
3199
  $lastname ">
2287
3200
 
2288
- hasellus suscipit vulputate lacus, in tempor turpis aliquam vel. Nunc eleifend, velit id ultrices elementum, ipsum felis porttitor dui, id laoreet diam nulla sed urna.
3201
+ Phasellus suscipit vulputate lacus, in tempor turpis aliquam vel. Nunc eleifend, velit id ultrices elementum, ipsum felis porttitor dui, id laoreet diam nulla sed urna.
2289
3202
 
2290
- Sticky header
3203
+ Sticky header and caption
3204
+
3205
+ sonic-th uses position: sticky with top: 0 inside the table. For page-level sticky headers, set noCustomScroll on sonic-table and position sonic-thead (for example class="sticky top-16"). Add sonic-caption for a table title below the grid.
2291
3206
 
2292
3207
  Company
2293
3208
  Contact
@@ -2306,18 +3221,6 @@ Sticky header
2306
3221
  3
2307
3222
  40€
2308
3223
 
2309
- Ernst Handel
2310
- Roland Mendel
2311
- Austria
2312
- 4
2313
- 40€
2314
-
2315
- Island Trading
2316
- Helen Bennett
2317
- UK
2318
- 1
2319
- 40€
2320
-
2321
3224
  Laughing Bacchus Winecellars
2322
3225
  Yoshi Tannamuri
2323
3226
  Canada
@@ -2330,42 +3233,165 @@ Sticky header
2330
3233
  20
2331
3234
  40€
2332
3235
 
2333
- Alfreds Futterkiste
2334
- Maria Anders
2335
- Germany
2336
- 2
2337
- 40€
3236
+ Table caption
2338
3237
 
2339
- Centro comercial Moctezuma
2340
- no information yet
2341
- 3
2342
- 40€
3238
+ API reference
2343
3239
 
2344
- Ernst Handel
2345
- Roland Mendel
2346
- Austria
2347
- 4
2348
- 40€
3240
+ sonic-table
2349
3241
 
2350
- Island Trading
2351
- Helen Bennett
2352
- UK
2353
- 1
2354
- 40€
3242
+ | Attribute | Values | Description |
3243
+ |----------|---------|-------------|
3244
+ | size | 2xs · xs · sm · md · lg · xl · 2xl · inherit (default md) | Scales table font size via shared size tokens |
3245
+ | bordered | boolean | Outer border and row dividers |
3246
+ | noCustomScroll | boolean | Disables custom scrollbar styling on the horizontal scroll container |
3247
+ | rounded | boolean | Reflected on the host; no default table styles |
3248
+ | maxHeight | CSS length | Max height on the scroll container; enables vertical scrolling |
2355
3249
 
2356
- Laughing Bacchus Winecellars
2357
- Yoshi Tannamuri
2358
- Canada
2359
- 0
2360
- 40€
3250
+ | Slot | Description |
3251
+ |------|-------------|
3252
+ | (default) | Table sections and rows (sonic-thead, sonic-tbody, sonic-tr, …) |
2361
3253
 
2362
- Magazzini Alimentari Riuniti
2363
- Giovanni Rovelli
2364
- Italy
2365
- 20
2366
- 40€
3254
+ sonic-thead · sonic-tbody · sonic-tfoot
3255
+
3256
+ | Slot | Description |
3257
+ |------|-------------|
3258
+ | (default) | Row elements (sonic-tr) |
3259
+
3260
+ sonic-tbody wraps slotted rows in a native and applies zebra / hover backgrounds to sonic-tr children.
3261
+
3262
+ sonic-caption
3263
+
3264
+ | Slot | Description |
3265
+ |------|-------------|
3266
+ | (default) | Caption text rendered as table-caption |
3267
+
3268
+ sonic-tr
3269
+
3270
+ | Attribute | Values | Description |
3271
+ |----------|---------|-------------|
3272
+ | type | default · primary · info · success · warning · danger · neutral | Semantic text color for the row |
3273
+ | even | boolean | Striping background; usually set by sonic-list metadata |
3274
+ | odd | boolean | Alternate striping background; usually set by sonic-list |
3275
+ | last | boolean | Removes bottom cell border on the last row when bordered |
3276
+
3277
+ | Slot | Description |
3278
+ |------|-------------|
3279
+ | (default) | Header or data cells (sonic-th / sonic-td) |
3280
+
3281
+ sonic-th
3282
+
3283
+ | Attribute | Values | Description |
3284
+ |----------|---------|-------------|
3285
+ | type | default · primary · info · success · warning · danger · neutral | Semantic text color |
3286
+ | align | left · center · right | Horizontal text alignment |
3287
+ | colSpan | number | Column span |
3288
+ | rowSpan | number | Row span |
3289
+ | minWidth | CSS length | Minimum cell width |
3290
+ | maxWidth | CSS length | Maximum cell width |
3291
+ | width | CSS length | Cell width |
3292
+ | noBorder | boolean | Removes the bottom border under the header cell |
3293
+
3294
+ | Slot | Description |
3295
+ |------|-------------|
3296
+ | (default) | Header label content |
3297
+
3298
+ sonic-td
3299
+
3300
+ | Attribute | Values | Description |
3301
+ |----------|---------|-------------|
3302
+ | type | default · primary · info · success · warning · danger · neutral | Semantic text color |
3303
+ | align | left · center · right | Horizontal text alignment |
3304
+ | vAlign | CSS vertical-align value | Vertical alignment |
3305
+ | colSpan | number | Column span |
3306
+ | rowSpan | number | Row span |
3307
+ | minWidth | CSS length | Minimum cell width |
3308
+ | maxWidth | CSS length | Maximum cell width |
3309
+ | width | CSS length | Cell width |
3310
+
3311
+ | Slot | Description |
3312
+ |------|-------------|
3313
+ | (default) | Cell content |
3314
+
3315
+ ---
3316
+
3317
+ ## Theme
3318
+
3319
+ - URL: https://concorde.supersoniks.org/crawl/core/components/ui/theme/theme.html
3320
+ - Doc ID: core/components/ui/theme/theme
3321
+ - Keywords: Concorde, supersoniks, core/components/ui/theme/theme, theme, Theme, UI component, sonic-theme, web component, --sc-*, theme="custom", light, dark, auto, color, font, bg-base
3322
+
3323
+ Theme
3324
+
3325
+ sonic-theme wraps a Concorde UI: it registers --sc- design tokens and provides the default slot for your app. With no theme attribute (or theme="custom"), only shared primitives and your overrides apply—built-in light / dark / auto palettes are opt-in. Set color and font when the host should carry base text and typography; add Tailwind bg-base and block (or min-h-screen) on the tag for a full surface fill. Popovers, modals, and toasts mount under the nearest connected theme (see Pop container). Import @supersoniks/concorde/theme once at the app entry. For the full public token list and brand overrides, see Customization.
3326
+
3327
+ Basic example
3328
+
3329
+ Wrap interactive components so tokens and overlays resolve from one root.
3330
+
3331
+ Save changes
3332
+
3333
+ Theme mode
3334
+
3335
+ Default: omit theme or set theme="custom". The host loads core tokens (--sc-rounded, shadows, form defaults, …) and any --sc- you set; it does not apply the built-in light or dark palette.
3336
+
3337
+ Set theme to light or dark for Concorde’s preset palettes. Set theme="auto" to follow prefers-color-scheme (light palette until the OS prefers dark).
2367
3338
 
2368
- table caption
3339
+ theme="light"
3340
+
3341
+ Primary
3342
+ Success
3343
+ Danger
3344
+
3345
+ theme="dark"
3346
+
3347
+ Primary
3348
+ Success
3349
+ Danger
3350
+
3351
+ Presentation
3352
+
3353
+ color sets text from --sc-base-content. font applies --sc-font-family-base, --sc-font-weight-base, and --sc-font-style-base. For the page or shell background, use bg-base on sonic-theme (maps to --sc-base in Tailwind) with block so the host paints the surface. Components keep their own fallbacks when color / font are omitted.
3354
+
3355
+ Body copy inherits base content color and font from the theme host.
3356
+
3357
+ Custom tokens
3358
+
3359
+ Override primitives on sonic-theme (or :root / a project stylesheet). Derived radii, shadows, and control rounding are computed from tokens such as --sc-rounded—avoid copying long lists of internal variables unless you have a specific need.
3360
+
3361
+ Brand primary
3362
+
3363
+ Pop container
3364
+
3365
+ Theme.getPopContainer() returns the last connected sonic-theme, or document.body if none is connected. When a theme disconnects, the previous connected instance is adopted. Imperative Modal.create() and declarative sonic-modal use the same container.
3366
+
3367
+ Open modal
3368
+
3369
+ Mounted on theme
3370
+
3371
+ This dialog is appended under the nearest sonic-theme pop container.
3372
+
3373
+ Close
3374
+
3375
+ Embedded iframes
3376
+
3377
+ On connect, the theme publishes resolved --sc- values and linked font stylesheet URLs (Google Fonts / Adobe Fonts) to the sonic-theme data channel and postMessages them to same-page iframes. Iframes can request a refresh by posting { type: "GetSonicTheme" }.
3378
+
3379
+ // Inside the iframe — ask the parent theme to rebroadcast tokens
3380
+ window.parent.postMessage({ type: "GetSonicTheme" }, "");
3381
+
3382
+ API reference
3383
+
3384
+ | Attribute | Values | Description |
3385
+ |----------|---------|-------------|
3386
+ | theme | omitted · custom (default) · light · dark · auto | Omitted or custom: core tokens and your --sc- only. light / dark: fixed presets. auto: presets follow prefers-color-scheme |
3387
+ | color | boolean | Host text color uses --sc-base-content |
3388
+ | font | boolean | Host font uses --sc-font-family-base and related base weight/style tokens |
3389
+
3390
+ | Slot | Description |
3391
+ |------|-------------|
3392
+ | (default) | Application markup and Concorde components |
3393
+
3394
+ Surface background: Tailwind bg-base on sonic-theme (requires Concorde Tailwind color base → --sc-base).
2369
3395
 
2370
3396
  ---
2371
3397
 
@@ -2373,17 +3399,21 @@ Sticky header
2373
3399
 
2374
3400
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/toast/toast.html
2375
3401
  - Doc ID: core/components/ui/toast/toast
2376
- - Keywords: Concorde, supersoniks, core/components/ui/toast/toast, toast, Toast, UI component, sonic-toast, web component, success, error, warning, info, preserve: true, dismissForever: true, id, ghost: true
3402
+ - Keywords: Concorde, supersoniks, core/components/ui/toast/toast, toast, Toast, UI component, sonic-toast, web component, SonicToast.add(), SonicToast, label, preserve, text, status
2377
3403
 
2378
3404
  Toast
2379
3405
 
2380
- Utilisation de base
3406
+ Toasts surface short-lived feedback in a fixed stack (bottom-right in the main window). Queue messages with SonicToast.add() on the global SonicToast class—the host sonic-toast is created automatically. Prefer label for a heading; use preserve or interactive text when the user must read or act before dismiss.
3407
+
3408
+ Basic example
3409
+
3410
+ Click the button to show a toast.
2381
3411
 
2382
- Afficher un toast
3412
+ Show toast
2383
3413
 
2384
- Statut
3414
+ Status
2385
3415
 
2386
- Les statuts disponibles sont : success, error, warning, info ou vide (par défaut).
3416
+ status drives color, icon, and live-region behavior. Omit status or pass an empty string for a neutral toast.
2387
3417
 
2388
3418
  Default
2389
3419
 
@@ -2395,69 +3425,105 @@ Les statuts disponibles sont : success, error, warning, info ou vide (par défau
2395
3425
 
2396
3426
  Info
2397
3427
 
2398
- Avec titre
3428
+ Label
3429
+
3430
+ Set label for a bold title above text. title still works but is deprecated—use label in new code.
2399
3431
 
2400
- Toast avec titre
3432
+ Toast with label
2401
3433
 
2402
- Toast d'erreur avec titre
3434
+ Error with label
2403
3435
 
2404
- Avec contenu HTML
3436
+ HTML in text
2405
3437
 
2406
- Le contenu du toast peut contenir du HTML.
3438
+ text (and label) can include HTML strings. Links and controls in text automatically enable preserve so the toast does not auto-hide while the user interacts.
2407
3439
 
2408
- HTML et un lien cliquable ', status: 'info' })">
2409
- Toast avec HTML
3440
+ HTML and an action link ', status: 'info' })"
3441
+ >
3442
+ Toast with HTML
2410
3443
 
2411
- Persistance
3444
+ Preserve
2412
3445
 
2413
- Par défaut, les toasts disparaissent automatiquement. Avec preserve: true, le toast reste affiché jusqu'à ce qu'il soit fermé manuellement.
3446
+ Without preserve, toasts auto-hide after about six seconds (timer pauses on hover or focus). Set preserve to keep the toast until the user closes it.
2414
3447
 
2415
- Toast persistant
3448
+ Persistent toast
2416
3449
 
2417
- Masquer définitivement
3450
+ Dismiss forever
2418
3451
 
2419
- Avec dismissForever: true et un id, le toast peut être masqué définitivement. Une fois fermé, il ne réapparaîtra plus même après rechargement de la page.
3452
+ With dismissForever and a stable id, closing the toast stores dismissal in localStorage—SonicToast.add skips it on later visits. Duplicate payloads (same fields, ignoring id) are not queued twice.
2420
3453
 
2421
- Toast avec dismiss forever
3454
+ Dismiss forever
2422
3455
 
2423
- Fantôme
3456
+ Ghost
2424
3457
 
2425
- Avec ghost: true, le toast devient semi-transparent et non-interactif.
3458
+ ghost renders a semi-transparent, non-interactive toast—useful for loading or background states. SonicToast.removeAll leaves ghost toasts in place.
2426
3459
 
2427
- Toast ghost
3460
+ Ghost toast
2428
3461
 
2429
- Méthodes de suppression
3462
+ Dismissal
2430
3463
 
2431
- Tout supprimer
3464
+ Use static helpers to clear the stack from app logic (for example after navigation).
2432
3465
 
2433
- Supprime tous les toasts sauf ceux marqués comme ghost.
3466
+ Remove all
2434
3467
 
2435
- Ajouter toast 1
2436
- Ajouter toast 2
2437
- Ajouter toast 3
2438
- Supprimer tous
3468
+ Removes every toast except ghost items.
2439
3469
 
2440
- Supprimer par statut
3470
+ Add toast 1
3471
+ Add toast 2
3472
+ Add toast 3
3473
+ Remove all
2441
3474
 
2442
- Supprime tous les toasts d'un statut spécifique.
3475
+ Remove by status
2443
3476
 
2444
3477
  Success
2445
3478
  Error
2446
3479
  Warning
2447
- Supprimer success
2448
- Supprimer error
3480
+ Remove success
3481
+ Remove error
3482
+
3483
+ Remove temporary items
2449
3484
 
2450
- Supprimer les éléments temporaires
3485
+ Removes toasts that are not preserve.
2451
3486
 
2452
- Supprime tous les toasts qui ne sont pas marqués comme preserve.
3487
+ Temporary
2453
3488
 
2454
- Temporaire
2455
- Persistant
2456
- Supprimer temporaires
3489
+ Persistent
2457
3490
 
2458
- Exemple complet
3491
+ Remove temporary
2459
3492
 
2460
- Toast complet
3493
+ Combined options
3494
+
3495
+ Full example
3496
+
3497
+ Accessibility
3498
+
3499
+ Each toast uses role="alert" for error and role="status" otherwise (with aria-live="polite" when applicable). Status icons are decorative (aria-hidden). The close control has an i18n aria-label. When there is no label, a truncated string aria-label may be derived from plain text.
3500
+
3501
+ API reference
3502
+
3503
+ Options passed to SonicToast.add(conf):
3504
+
3505
+ | Option | Values | Description |
3506
+ |----------|---------|-------------|
3507
+ | text | string · Lit template | Main body; HTML strings are supported |
3508
+ | label | string · Lit template | Optional heading above text |
3509
+ | title | string · Lit template | Deprecated alias for label |
3510
+ | status | success · error · warning · info · (empty) | Semantic styling and live region behavior |
3511
+ | id | string · number | Stable id for deduplication and dismissForever (defaults to timestamp) |
3512
+ | preserve | boolean | Skip auto-hide; forced when text contains interactive markup |
3513
+ | ghost | boolean | Semi-transparent and non-interactive; kept by removeAll |
3514
+ | dismissForever | boolean | Persist dismissal in localStorage when closed (requires stable id) |
3515
+ | styleSheet | modal style input | Extra adopted styles on the toast item shadow root |
3516
+ | useSlot | boolean | Legacy: project text into the light DOM slot |
3517
+
3518
+ | Method | Description |
3519
+ |--------|-------------|
3520
+ | SonicToast.add(conf) | Append a toast; returns the config or null if skipped (dismissed forever or duplicate) |
3521
+ | SonicToast.removeAll() | Remove all non-ghost toasts |
3522
+ | SonicToast.removeItemsByStatus(status) | Remove toasts matching status |
3523
+ | SonicToast.removeItemById(id) | Remove a single toast by id |
3524
+ | SonicToast.removeTemporaryItems() | Remove toasts without preserve |
3525
+
3526
+ sonic-toast is mounted automatically; sonic-toast-item is internal. In iframes, toasts can delegate to the parent window via postMessage.
2461
3527
 
2462
3528
  ---
2463
3529
 
@@ -2465,25 +3531,29 @@ Exemple complet
2465
3531
 
2466
3532
  - URL: https://concorde.supersoniks.org/crawl/core/components/ui/tooltip/tooltip.html
2467
3533
  - Doc ID: core/components/ui/tooltip/tooltip
2468
- - Keywords: Concorde, supersoniks, core/components/ui/tooltip/tooltip, tooltip, Tooltip, UI component, sonic-tooltip, web component
3534
+ - Keywords: Concorde, supersoniks, core/components/ui/tooltip/tooltip, tooltip, Tooltip, UI component, sonic-tooltip, web component, label, placement, top, disabled, bottom, left, right, -start
2469
3535
 
2470
3536
  Tooltip
2471
3537
 
2472
- hover me
3538
+ Tooltip shows a short label on hover (and on focus when the trigger can receive focus). Wrap the trigger in the default slot—buttons, icons, or plain text. Default placement is top (center-aligned). An empty label hides the bubble the same way as disabled.
3539
+
3540
+ Basic example
3541
+
3542
+ Hover me
2473
3543
 
2474
3544
  Placement
2475
3545
 
2476
- By default, tooltip is centered next to its content
3546
+ Use top · bottom · left · right for the main axis. Add -start or -end to align the bubble along the anchor edge.
2477
3547
 
2478
- Top
3548
+ Top
2479
3549
 
2480
- Bottom
3550
+ Bottom
2481
3551
 
2482
- Right
3552
+ Right
2483
3553
 
2484
- Left
3554
+ Left
2485
3555
 
2486
- More placement
3556
+ Aligned placements
2487
3557
 
2488
3558
  Top start
2489
3559
 
@@ -2501,14 +3571,39 @@ More placement
2501
3571
 
2502
3572
  Left end
2503
3573
 
3574
+ Label formatting
3575
+
3576
+ label supports line breaks (\n in markup or multiline text). Lines are trimmed;   is normalized to spaces. white-space: pre-line preserves breaks in the bubble (max width 18rem).
3577
+
3578
+ Multiline label
3579
+
2504
3580
  Focusable
2505
3581
 
2506
- Focus or hover non interactive element
3582
+ On non-interactive triggers, set focusable so the host gets tabindex="0" and the tooltip opens on keyboard focus as well as hover.
3583
+
3584
+ Focus or hover this text
2507
3585
 
2508
3586
  Disabled
2509
3587
 
2510
3588
  Tooltip disabled
2511
3589
 
3590
+ Accessibility
3591
+
3592
+ The bubble uses popover="hint" (non-modal, no pointer capture). Prefer focusable when the slotted content is not already focusable. When the Popover API is unavailable, the host falls back to the native title attribute with a single-line label. Opacity transitions respect prefers-reduced-motion.
3593
+
3594
+ API reference
3595
+
3596
+ | Attribute | Values | Description |
3597
+ |----------|---------|-------------|
3598
+ | label | string | Tooltip copy; whitespace-only values suppress the bubble |
3599
+ | placement | top (default) · bottom · left · right · top-start · top-end · bottom-start · bottom-end · left-start · left-end · right-start · right-end | Position relative to the trigger; repositions while open |
3600
+ | disabled | boolean | Suppress show/hide; sets tabindex="-1" on the host |
3601
+ | focusable | boolean | Add tabindex="0" on the host for keyboard access |
3602
+
3603
+ | Slot | Description |
3604
+ |------|-------------|
3605
+ | (default) | Trigger content (hover target) |
3606
+
2512
3607
  ---
2513
3608
 
2514
3609
  ## Data flow
@@ -2808,8 +3903,9 @@ Behavior
2808
3903
  - By default (dynamic: false), the value is read once at connect time and is not updated afterward
2809
3904
  - With { dynamic: true }, the property stays in sync when:
2810
3905
  - an ancestor changes the attribute value
2811
- - a closer ancestor gains the attribute (that value wins)
2812
- - the nearest ancestor loses the attribute (falls back to the next one up, or null)
3906
+ - a closer ancestor gains / loses the attribute (fallback / null)
3907
+ - the component is reparented (no extra opt-in) — parent childList only reacts if this node moves
3908
+ - Observers are shared (one per ancestor attribute / one per parent) so large lists of sonic-icon stay cheap on Firefox.
2813
3909
  - When dynamic is enabled, updates also propagate to @subscribe / @bind paths that depend on the decorated property (e.g. ${dataProvider})
2814
3910
 
2815
3911
  Dynamic mode
@@ -4612,8 +5708,8 @@ In the HTML of a JS or TS component or in the HTML of the web page containing th
4612
5708
 
4613
5709
  Installation
4614
5710
 
4615
- For almost all new projects, use create-concorde-ts-starter .
4616
- You get Vite + TypeScript + Lit + Tailwind, an example component, npx concorde enable-short-paths ready to run, and yarn ai:sync for AI agent skills ( AGENTS.md , Cursor / JetBrains rules) without extra setup.
5711
+ For almost all new projects, use create-concorde-ts-starter
5712
+ You get Vite + TypeScript + Lit + Tailwind, an example component, npx concorde enable-short-paths ready to run, and yarn ai:sync for AI agent skills ( AGENTS.md , Cursor / JetBrains rules) without extra setup.
4617
5713
 
4618
5714
  Starter
4619
5715
 
@@ -5076,7 +6172,7 @@ Introduction
5076
6172
  What is Concorde?
5077
6173
 
5078
6174
  Based on lit.dev, Concorde is a collection of web components for shared apps and websites.
5079
- Build UIs without tying components to a specific host stack, while keeping visual consistency through a small set of CSS variables.
6175
+ Build UIs without tying components to a specific host stack, while keeping visual consistency through the smallest set of CSS variables needed to define a theme.
5080
6176
 
5081
6177
  Why and use case
5082
6178
 
@@ -5117,91 +6213,242 @@ The starter runs yarn ai:sync for you. Details: AI agents (skills). Manual Vite
5117
6213
 
5118
6214
  ---
5119
6215
 
5120
- ## Adding styles
6216
+ ## Customization
5121
6217
 
5122
6218
  - URL: https://concorde.supersoniks.org/crawl/docs/_getting-started/theming.html
5123
6219
  - Doc ID: docs/_getting-started/theming
5124
- - Keywords: Concorde, supersoniks, docs/_getting-started/theming, theming, Adding styles, guide, , size, {reflect: true}, :host(), :host([type='primary']){...}, inline, block, display, contents
5125
-
5126
- Adding styles
5127
-
5128
- Normal Behavior
5129
-
5130
- No style crosses the shadow root of a component, except for inheritable properties (which have the "inherit" property possible) and CSS variables.
5131
- Properties integrated via a "slot" remain stylizable in a conventional way.
5132
-
5133
- - During creation / from the inside:
5134
- - We edit the static "styles" property of the lit component, which can also reference shared and dynamic styles.
5135
- These styles are scoped and do not impact the outside.
5136
- - We use CSS variables as the value of properties intended to be customized from the outside.
5137
- For each variable, we define a default value to have a simple but consistent base style.
5138
- - We only rewrite inheritable properties with hard values if they are truly specific to the component.
5139
- - The tag as a direct child can be used as a last resort, especially if there is a need for particularly dynamic customization. Performance is reduced.
5140
- - During use / from the outside:
5141
- We define values for inheritable CSS properties (e.g., font-\, color...) using tools like Tailwind.
5142
- We modify the value of CSS variables used by the component.
5143
-
5144
- Choosing Style Presets via Reactive Properties:
5145
-
5146
- The declaration of reactive properties is useful for selecting a particular configuration that mostly affects a set of properties.
5147
-
5148
- For example, a size property (xs, sm, md, xl) will affect margins, font, line heights to align them with the corresponding CSS vars, which can be customized using the methods mentioned earlier if necessary.
6220
+ - Keywords: Concorde, supersoniks, docs/_getting-started/theming, theming, Customization, guide, , :root, theme="custom", --sc-*, theme="light", "dark", "auto", auto, prefers-color-scheme
6221
+
6222
+ Customization
6223
+
6224
+ Theme-first customization
6225
+
6226
+ Concorde components ship with default styles (fallback values in each component and in ).
6227
+ You do not need to define any CSS variables to get a usable UI.
6228
+
6229
+ To align the kit with your brand, override only the essential theme tokens on , on :root, or in a project stylesheet.
6230
+ Concorde derives radius steps, button/input rounding, shadows, and most per-component layout from these primitives—do not copy long lists of derived variables unless you have a specific need.
6231
+
6232
+ import "@supersoniks/concorde/theme";
6233
+
6234
+ | Attribute | Effect |
6235
+ |-----------|--------|
6236
+ | (omit) \| theme="custom" | Default: core tokens + your --sc-; no built-in light/dark palette |
6237
+ | theme="light" \| "dark" \| "auto" | Opt-in presets; auto follows prefers-color-scheme |
6238
+ | class="bg-base block" (Tailwind) | Page/surface background (--sc-base) |
6239
+ | color | Text color (--sc-base-content) |
6240
+ | font | Base font family/weight (--sc-font-family-base, etc.) |
6241
+
6242
+ Popovers, modals, and toasts mount under the nearest .
6243
+
6244
+ Customization example
6245
+
6246
+ Example (full brand override on or :root). Set every essential token below; derived radii and shadows still come from the theme engine—only --sc-rounded is listed here.
6247
+
6248
+ sonic-theme {
6249
+ / Semantic fills /
6250
+ --sc-primary: #353429;
6251
+ --sc-secondary: #f43f5e;
6252
+ --sc-info: #7c3aed;
6253
+ --sc-danger: #d71839;
6254
+ --sc-warning: #f97316;
6255
+ --sc-success: #10b981;
6256
+ --sc-contrast: #111;
6257
+
6258
+ / Text/icons on semantic fills /
6259
+ --sc-primary-content: #fff;
6260
+ --sc-secondary-content: #fff;
6261
+ --sc-info-content: #fff;
6262
+ --sc-danger-content: #fff;
6263
+ --sc-warning-content: #fff;
6264
+ --sc-success-content: #fff;
6265
+ --sc-contrast-content: #fff;
6266
+
6267
+ / Neutral fills /
6268
+ --sc-base: #fff;
6269
+ --sc-base-50: #f6f6f5;
6270
+ --sc-base-100: #ededec;
6271
+ --sc-base-200: #d7d7d4;
6272
+ --sc-base-300: #c8c7c4;
6273
+ --sc-base-400: #a8a7a2;
6274
+ --sc-base-500: #94938c;
6275
+ --sc-base-600: #76756c;
6276
+ --sc-base-700: #59584e;
6277
+ --sc-base-800: #47463b;
6278
+ --sc-base-900: #353429;
6279
+
6280
+ / Text/icons on neutral surfaces /
6281
+ --sc-base-content: var(--sc-base-900);
6282
+
6283
+ / Typography /
6284
+ --sc-font-family-base: "Oswald", system-ui, -apple-system, "Segoe UI", Roboto,
6285
+ "Helvetica Neue", Arial, sans-serif;
6286
+ --sc-headings-font-family: "alternate-gothic-compressed", system-ui, sans-serif;
6287
+ --sc-headings-line-height: 1.1;
6288
+ --sc-headings-font-weight: bold;
6289
+ --sc-headings-text-transform: none;
6290
+
6291
+ / Shape (primitive only) /
6292
+ --sc-rounded: 0;
6293
+
6294
+ / Forms /
6295
+ --sc-border-width: 0.2rem;
6296
+ --sc-form-height: 2em;
6297
+ --sc-input-bg: var(--sc-base);
6298
+ --sc-input-color: var(--sc-base-content);
6299
+ --sc-input-border-color: var(--sc-input-color);
6300
+ --sc-input-active-bg: var(--sc-primary);
6301
+ --sc-input-active-color: var(--sc-primary-content);
6302
+ --sc-input-active-border-color: var(--sc-primary);
6303
+ }
5149
6304
 
5150
- It is recommended to use the {reflect: true} property for reactive properties that have an associated style on the :host(). For example: :host([type='primary']){...}
6305
+ Palette generator: concordecolors
5151
6306
 
5152
- ☢️ Caution: Passing class names via reactive properties / HTML attributes of the component should be avoided as it can quickly lead to difficult-to-manage situations.
6307
+ Without these overrides, components keep Concorde’s per-component fallbacks. Built-in light/dark palettes apply only when you set theme="light", theme="dark", or theme="auto".
5153
6308
 
5154
- CSS "display" Property
6309
+ What we intentionally avoid: large public --sc-alert- / --sc-badge- APIs or ::part() styling hooks on most components. Prefer attributes (type, status, size, …) and the theme tokens above.
5155
6310
 
5156
- By default, the display property is inline.
5157
- Therefore, be careful to define it according to the needs, as one might mistakenly expect it to be block as with a regular .
6311
+ Only essential CSS variables (public theme API)
5158
6312
 
5159
- ☢️ Caution: Defining the display property as contents may seem attractive at first, but:
6313
+ These are the smallest set we recommend customizing. Everything else should stay internal to the theme or to components (--sc private variables, attributes like type, size, variant).
5160
6314
 
5161
- - It almost always leads to the creation of wrappers to style the content (instead of using :host).
5162
- - It is no longer possible to directly add classes to the component or style it from the outside.
5163
- Ultimately, the amount of code to write increases significantly.
6315
+ Surfaces and foreground
5164
6316
 
5165
- TAILWIND Functional Classes
6317
+ Tokens without a -content suffix are fill / background colors.
6318
+ Tokens with -content are text and icons on top of the matching fill (solid buttons, badges, alerts, etc.).
5166
6319
 
5167
- tailwind has been integrated into Concorde and is available in scoped components (with Shadow DOM).
5168
- To use it, you need to import the following:
6320
+ Neutral fills
5169
6321
 
5170
- import { tailwind } from "@supersoniks/concorde/la-billetterie/ui/theme/theme";
6322
+ | Variable | Role |
6323
+ |----------|------|
6324
+ | --sc-base | Main surface / page background |
6325
+ | --sc-base-50 … --sc-base-900 | Neutral scale (borders, subtle backgrounds, muted UI) |
5171
6326
 
5172
- Then include the tailwind style in the static styles property of the component:
6327
+ Neutral foreground
5173
6328
 
5174
- static styles = [tailwind];
6329
+ | Variable | Role |
6330
+ |----------|------|
6331
+ | --sc-base-content | Default body text and icons on neutral surfaces |
5175
6332
 
5176
- Finally, use it in the HTML within the render function:
6333
+ Semantic fills
5177
6334
 
5178
- A paragraph with margin
6335
+ | Variable | Role |
6336
+ |----------|------|
6337
+ | --sc-primary | Primary actions, links, emphasis |
6338
+ | --sc-secondary | Secondary brand accent (when used) |
6339
+ | --sc-info, --sc-success, --sc-warning, --sc-danger | Status and feedback |
6340
+ | --sc-contrast | High-contrast fills (e.g. on media) |
5179
6341
 
5180
- The colors from Concorde's theme are referenced in Tailwind's theme.
6342
+ Semantic foreground
5181
6343
 
5182
- Operation without Shadow DOM
6344
+ | Variable | Role |
6345
+ |----------|------|
6346
+ | --sc-primary-content, --sc-secondary-content, … | Text/icons on the matching semantic fill (--sc-primary, etc.) |
5183
6347
 
5184
- Usefulness
6348
+ Shape
5185
6349
 
5186
- This operation is particularly useful when it comes to adding behavior to a simple existing element.
5187
- It may also become necessary to establish compatibility with a traditional JS library.
6350
+ | Variable | Role |
6351
+ |----------|------|
6352
+ | --sc-rounded | Single primitive corner radius; the theme computes --sc-rounded-sm, --sc-btn-rounded, --sc-input-rounded, etc. |
5188
6353
 
5189
- For example, with a text input:
6354
+ Typography
5190
6355
 
5191
- - Trigger automatic data or filter update when typing text.
5192
- - Automatic formatting.
5193
- - Constraints that cannot be handled by native methods.
6356
+ | Variable | Role |
6357
+ |----------|------|
6358
+ | --sc-font-family-base | Body UI text |
6359
+ | --sc-font-weight-base, --sc-font-style-base | Optional |
6360
+ | --sc-headings-font-family, --sc-headings-line-height, --sc-headings-font-weight, --sc-headings-text-transform | Headings (modal titles, etc.) |
5194
6361
 
5195
- Consequences
6362
+ Forms (only if you customize inputs globally)
5196
6363
 
5197
- If there is no shadow DOM (see the noShadowDom property of Subscriber):
6364
+ Interactive controls expose a few extra theme-level tokens; prefer these over styling individual inputs from outside.
5198
6365
 
5199
- - Styling using the static "styles" property of the lit component will not be applied.
5200
- - The element and its content can be styled in a traditional manner.
6366
+ | Variable | Role |
6367
+ |----------|------|
6368
+ | --sc-border-width | Default border thickness |
6369
+ | --sc-form-height | Control height |
6370
+ | --sc-input-bg, --sc-input-color, --sc-input-border-color | Default field chrome |
6371
+ | --sc-input-active-bg, --sc-input-active-color, --sc-input-active-border-color | Focus/active state |
5201
6372
 
5202
- For example, the components queue, list, and fetch do not have a shadow DOM.
6373
+ ---
5203
6374
 
5204
- ℹ️ Note: Specifically in this case, it may be useful to set the display property to contents.
6375
+ Tailwind in new components ?
6376
+
6377
+ Set tailwind.config.js to match concorde style token in your custom component.
6378
+
6379
+ ...
6380
+ theme: {
6381
+ borderRadius: {
6382
+ DEFAULT: "var(--sc-rounded)",
6383
+ none: "0",
6384
+ sm: "var(--sc-rounded-sm)",
6385
+ md: "var(--sc-rounded-md)",
6386
+ lg: "var(--sc-rounded-lg)",
6387
+ xl: "var(--sc-rounded-xl)",
6388
+ full: "9999px",
6389
+ },
6390
+ boxShadow: {
6391
+ DEFAULT: "var(--sc-shadow)",
6392
+ none: "none",
6393
+ sm: "var(--sc-shadow-sm)",
6394
+ md: "var(--sc-shadow-md)",
6395
+ lg: "var(--sc-shadow-lg)",
6396
+ xl: "var(--sc-shadow-xl)",
6397
+ },
6398
+ colors: {
6399
+ transparent: "transparent",
6400
+ current: "currentColor",
6401
+ content: "var(--sc-base-content)",
6402
+ base: "var(--sc-base)",
6403
+ neutral: {
6404
+ 0: "var(--sc-base)",
6405
+ 50: "var(--sc-base-50)",
6406
+ 100: "var(--sc-base-100)",
6407
+ 200: "var(--sc-base-200)",
6408
+ 300: "var(--sc-base-300)",
6409
+ 400: "var(--sc-base-400)",
6410
+ 500: "var(--sc-base-500)",
6411
+ 600: "var(--sc-base-600)",
6412
+ 700: "var(--sc-base-700)",
6413
+ 800: "var(--sc-base-800)",
6414
+ 900: "var(--sc-base-900)",
6415
+ content: "var(--sc-base)",
6416
+ },
6417
+ primary: {
6418
+ DEFAULT: "var(--sc-primary)",
6419
+ content: "var(--sc-primary-content)",
6420
+ },
6421
+ success: {
6422
+ DEFAULT: "var(--sc-success)",
6423
+ content: "var(--sc-success-content)",
6424
+ },
6425
+ danger: {
6426
+ DEFAULT: "var(--sc-danger)",
6427
+ content: "var(--sc-danger-content)",
6428
+ },
6429
+ warning: {
6430
+ DEFAULT: "var(--sc-warning)",
6431
+ content: "var(--sc-warning-content)",
6432
+ },
6433
+ info: {
6434
+ DEFAULT: "var(--sc-info)",
6435
+ content: "var(--sc-info-content)",
6436
+ },
6437
+ contrast: {
6438
+ DEFAULT: "var(--sc-contrast)",
6439
+ content: "var(--sc-contrast-content)",
6440
+ },
6441
+ },
6442
+ extend: {
6443
+ borderWidth: {
6444
+ DEFAULT: "var(--sc-border-width)",
6445
+ },
6446
+ fontFamily: {
6447
+ headings: ["var(--sc-headings-font-family, var(--sc-font-family-base, sans-serif))"],
6448
+ body: ["var(--sc-font-family-base)"],
6449
+ monospace: ["var(--sc-font-family-monospace, monospace)"],
6450
+ }
6451
+ }
5205
6452
 
5206
6453
  ---
5207
6454