@deriv-com/dds-marketing 1.0.0 → 1.0.2

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 (131) hide show
  1. package/.llm/components/accordion.md +1 -1
  2. package/.llm/components/accordionitem.md +1 -1
  3. package/.llm/components/aspectratio.md +1 -1
  4. package/.llm/components/background.md +371 -0
  5. package/.llm/components/badge.md +1 -1
  6. package/.llm/components/bottomsheet.md +1 -1
  7. package/.llm/components/breadcrumb.md +1 -1
  8. package/.llm/components/breadcrumbitem.md +1 -1
  9. package/.llm/components/button.md +10 -6
  10. package/.llm/components/buttonicon.md +3 -3
  11. package/.llm/components/card.md +1 -1
  12. package/.llm/components/cardbody.md +1 -1
  13. package/.llm/components/cardbutton.md +1 -1
  14. package/.llm/components/checkbox.md +1 -1
  15. package/.llm/components/ctabanner.md +26 -1
  16. package/.llm/components/ctabannerslider.md +22 -1
  17. package/.llm/components/divider.md +1 -1
  18. package/.llm/components/dropdownmenu.md +2 -2
  19. package/.llm/components/faqaccordion.md +1 -1
  20. package/.llm/components/featurebullets.md +1 -1
  21. package/.llm/components/featurecards.md +1 -1
  22. package/.llm/components/featurescroll.md +1 -1
  23. package/.llm/components/featuresplit.md +1 -1
  24. package/.llm/components/filterchip.md +1 -1
  25. package/.llm/components/footer.md +1 -1
  26. package/.llm/components/footergroup.md +1 -1
  27. package/.llm/components/grid.md +1 -1
  28. package/.llm/components/icon.md +13 -3
  29. package/.llm/components/illustrationcard.md +236 -0
  30. package/.llm/components/illustrationscene.md +233 -0
  31. package/.llm/components/landinghero.md +25 -1
  32. package/.llm/components/link.md +4 -4
  33. package/.llm/components/logocolumns.md +1 -1
  34. package/.llm/components/logorows.md +1 -1
  35. package/.llm/components/menuitem.md +1 -1
  36. package/.llm/components/navbar.md +1 -1
  37. package/.llm/components/navbaritem.md +1 -1
  38. package/.llm/components/navbarmenu.md +1 -1
  39. package/.llm/components/navbarmenugroup.md +1 -1
  40. package/.llm/components/navbarpanel.md +1 -1
  41. package/.llm/components/navbarswitcher.md +1 -1
  42. package/.llm/components/navbarswitcheroption.md +1 -1
  43. package/.llm/components/option.md +1 -1
  44. package/.llm/components/pageheader.md +22 -1
  45. package/.llm/components/pagination.md +1 -1
  46. package/.llm/components/paginationdots.md +1 -1
  47. package/.llm/components/producthero.md +1 -1
  48. package/.llm/components/removablechip.md +1 -1
  49. package/.llm/components/row.md +1 -1
  50. package/.llm/components/scroller.md +1 -1
  51. package/.llm/components/searchinput.md +1 -1
  52. package/.llm/components/segmentedcontrol.md +1 -1
  53. package/.llm/components/segmentedcontrolitem.md +1 -1
  54. package/.llm/components/select.md +1 -1
  55. package/.llm/components/selectchip.md +1 -1
  56. package/.llm/components/spinner.md +1 -1
  57. package/.llm/components/stack.md +1 -1
  58. package/.llm/components/statusdot.md +1 -1
  59. package/.llm/components/subdomainnavbar.md +1 -1
  60. package/.llm/components/tab.md +3 -3
  61. package/.llm/components/table.md +1 -1
  62. package/.llm/components/tablebody.md +1 -1
  63. package/.llm/components/tablecell.md +1 -1
  64. package/.llm/components/tablehead.md +1 -1
  65. package/.llm/components/tableheadercell.md +1 -1
  66. package/.llm/components/tablerow.md +1 -1
  67. package/.llm/components/tablist.md +1 -1
  68. package/.llm/components/testimonialrow.md +1 -1
  69. package/.llm/components/testimonialslider.md +1 -1
  70. package/.llm/components/textarea.md +1 -1
  71. package/.llm/components/textinput.md +1 -1
  72. package/.llm/components/tooltip.md +1 -1
  73. package/.llm/components/typography.md +1 -1
  74. package/.llm/digest/background.md +52 -0
  75. package/.llm/digest/ctabanner.md +4 -0
  76. package/.llm/digest/ctabannerslider.md +3 -0
  77. package/.llm/digest/illustrationcard.md +46 -0
  78. package/.llm/digest/illustrationscene.md +51 -0
  79. package/.llm/digest/landinghero.md +7 -0
  80. package/.llm/digest/pageheader.md +3 -0
  81. package/.llm/index.md +7 -0
  82. package/.llm/rules.md +20 -10
  83. package/.llm/tokens.md +11 -0
  84. package/AGENTS.md +7 -5
  85. package/dist/components/blocks/cta-banner/CtaBanner.d.ts +1 -1
  86. package/dist/components/blocks/cta-banner/CtaBanner.js +3 -2
  87. package/dist/components/blocks/cta-banner/CtaBanner.types.d.ts +5 -0
  88. package/dist/components/blocks/cta-banner/cta-banner-impl.css +8 -0
  89. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.d.ts +1 -1
  90. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.js +5 -4
  91. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.d.ts +4 -0
  92. package/dist/components/blocks/cta-banner-slider/cta-banner-slider-impl.css +8 -0
  93. package/dist/components/blocks/landing-hero/LandingHero.d.ts +1 -1
  94. package/dist/components/blocks/landing-hero/LandingHero.js +4 -3
  95. package/dist/components/blocks/landing-hero/LandingHero.types.d.ts +7 -3
  96. package/dist/components/blocks/page-header/PageHeader.d.ts +1 -1
  97. package/dist/components/blocks/page-header/PageHeader.js +3 -2
  98. package/dist/components/blocks/page-header/PageHeader.types.d.ts +4 -0
  99. package/dist/components/blocks/page-header/page-header-impl.css +8 -0
  100. package/dist/components/core/background/Background.css +69 -0
  101. package/dist/components/core/background/Background.d.ts +21 -0
  102. package/dist/components/core/background/Background.js +36 -0
  103. package/dist/components/core/background/Background.types.d.ts +36 -0
  104. package/dist/components/core/background/Background.types.js +9 -0
  105. package/dist/components/core/background/background-impl.css +427 -0
  106. package/dist/components/core/background/halftone.d.ts +123 -0
  107. package/dist/components/core/background/halftone.js +682 -0
  108. package/dist/components/core/background/use-halftone.d.ts +15 -0
  109. package/dist/components/core/background/use-halftone.js +27 -0
  110. package/dist/components/core/background/use-offscreen.d.ts +10 -0
  111. package/dist/components/core/background/use-offscreen.js +30 -0
  112. package/dist/components/core/background/use-spotlight.d.ts +13 -0
  113. package/dist/components/core/background/use-spotlight.js +65 -0
  114. package/dist/components/core/illustration-card/IllustrationCard.css +40 -0
  115. package/dist/components/core/illustration-card/IllustrationCard.d.ts +22 -0
  116. package/dist/components/core/illustration-card/IllustrationCard.js +82 -0
  117. package/dist/components/core/illustration-card/IllustrationCard.types.d.ts +23 -0
  118. package/dist/components/core/illustration-card/IllustrationCard.types.js +8 -0
  119. package/dist/components/core/illustration-card/illustration-card-impl.css +27 -0
  120. package/dist/components/core/illustration-scene/IllustrationScene.css +44 -0
  121. package/dist/components/core/illustration-scene/IllustrationScene.d.ts +14 -0
  122. package/dist/components/core/illustration-scene/IllustrationScene.js +16 -0
  123. package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +33 -0
  124. package/dist/components/core/illustration-scene/IllustrationScene.types.js +8 -0
  125. package/dist/components/core/illustration-scene/illustration-scene-impl.css +40 -0
  126. package/dist/components/core/link/Link.js +5 -5
  127. package/dist/components/core/tab/Tab.types.d.ts +1 -1
  128. package/dist/components/index.d.ts +6 -0
  129. package/dist/components/index.js +6 -0
  130. package/dist/marketing.css +24 -0
  131. package/package.json +1 -1
@@ -133,7 +133,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
133
133
 
134
134
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
135
135
  Guidance only — cannot be checked automatically.
136
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
136
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
137
137
  Guidance only — cannot be checked automatically.
138
138
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
139
139
 
@@ -147,7 +147,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
147
147
 
148
148
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
149
149
  Guidance only — cannot be checked automatically.
150
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
150
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
151
151
  Guidance only — cannot be checked automatically.
152
152
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
153
153
 
@@ -128,7 +128,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
128
128
 
129
129
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
130
130
  Guidance only — cannot be checked automatically.
131
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
131
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
132
132
  Guidance only — cannot be checked automatically.
133
133
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
134
134
 
@@ -268,7 +268,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
268
268
 
269
269
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
270
270
  Guidance only — cannot be checked automatically.
271
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
271
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
272
272
  Guidance only — cannot be checked automatically.
273
273
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
274
274
 
@@ -153,7 +153,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
153
153
 
154
154
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
155
155
  Guidance only — cannot be checked automatically.
156
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
156
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
157
157
  Guidance only — cannot be checked automatically.
158
158
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
159
159
 
@@ -94,7 +94,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
94
94
 
95
95
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
96
96
  Guidance only — cannot be checked automatically.
97
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
97
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
98
98
  Guidance only — cannot be checked automatically.
99
99
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
100
100
 
@@ -117,7 +117,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
117
117
 
118
118
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
119
119
  Guidance only — cannot be checked automatically.
120
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
120
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
121
121
  Guidance only — cannot be checked automatically.
122
122
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
123
123
 
@@ -81,7 +81,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
81
81
 
82
82
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
83
83
  Guidance only — cannot be checked automatically.
84
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
84
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
85
85
  Guidance only — cannot be checked automatically.
86
86
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
87
87
 
@@ -169,7 +169,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
169
169
 
170
170
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
171
171
  Guidance only — cannot be checked automatically.
172
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
172
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
173
173
  Guidance only — cannot be checked automatically.
174
174
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
175
175
 
@@ -39,7 +39,7 @@ Tab renders 7 elements. A token binding names the part it applies to.
39
39
 
40
40
  It takes the same ink as the label and changes with it, so a current tab is current in both. The size is Icon's: the tab hands it `sm` and an Icon arriving already sized is unwrapped rather than obeyed.
41
41
 
42
- Solid when current and regular otherwise, which this component cannot do for you — a Quill glyph's weight is fixed at the import. That is the package's `icon-solid-marks-selection` rule, and it is a rule rather than an axis for exactly that reason. Rendered only when `icon` is set.
42
+ Solid when current and regular otherwise, which this component cannot do for you — a Quill glyph's weight is fixed at the import. That is the package's `icon-weight-within-a-set` rule — the tabs are the set — and it is a rule rather than an axis for exactly that reason. Rendered only when `icon` is set.
43
43
  - `label` — `<span>`, class `dds-tab__label`. The words, and where selection is actually carried. The ink steps from `fg.muted` to `fg.default` and the weight from `font.body.md` to `font.label.md` — 400 to 600.
44
44
 
45
45
  Product steps 400 to 500, because Product's type set has a medium. This one does not: Marketing has one weight per role and `label` is 600 throughout, so the step here is the larger of the two. It is the same decision — the current tab is heavier — landing on the only weight the package owns.
@@ -94,7 +94,7 @@ Never for: A sentence. The strip is scanned across, and a tab as wide as a claus
94
94
  Accepts: QuillSystemIcon
95
95
  Use when: The tabs are things a mark tells apart faster than a word does — a platform, a market class. Pass the glyph; the tab draws it at its own step.
96
96
 
97
- Solid when the tab is current and regular otherwise, which is the package's `icon-solid-marks-selection` rule. Nothing here can enforce it: a Quill glyph's weight is chosen at the import, so a page that wants the swap passes a different glyph per state
97
+ Solid when the tab is current and regular otherwise, which is the package's `icon-weight-within-a-set` rule. Nothing here can enforce it: a Quill glyph's weight is chosen at the import, so a page that wants the swap passes a different glyph per state
98
98
  Never for: Carrying the label. A tab whose meaning is a shape is a tab a screen reader reads as nothing, and the words are what the strip is scanned by
99
99
 
100
100
  ### badge — `node` **Required when content=badge.**
@@ -150,7 +150,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
150
150
 
151
151
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
152
152
  Guidance only — cannot be checked automatically.
153
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
153
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
154
154
  Guidance only — cannot be checked automatically.
155
155
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
156
156
 
@@ -162,7 +162,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
162
162
 
163
163
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
164
164
  Guidance only — cannot be checked automatically.
165
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
165
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
166
166
  Guidance only — cannot be checked automatically.
167
167
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
168
168
 
@@ -73,7 +73,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
73
73
 
74
74
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
75
75
  Guidance only — cannot be checked automatically.
76
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
76
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
77
77
  Guidance only — cannot be checked automatically.
78
78
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
79
79
 
@@ -99,7 +99,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
99
99
 
100
100
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
101
101
  Guidance only — cannot be checked automatically.
102
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
102
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
103
103
  Guidance only — cannot be checked automatically.
104
104
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
105
105
 
@@ -83,7 +83,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
83
83
 
84
84
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
85
85
  Guidance only — cannot be checked automatically.
86
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
86
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
87
87
  Guidance only — cannot be checked automatically.
88
88
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
89
89
 
@@ -143,7 +143,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
143
143
 
144
144
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
145
145
  Guidance only — cannot be checked automatically.
146
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
146
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
147
147
  Guidance only — cannot be checked automatically.
148
148
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
149
149
 
@@ -99,7 +99,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
99
99
 
100
100
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
101
101
  Guidance only — cannot be checked automatically.
102
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
102
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
103
103
  Guidance only — cannot be checked automatically.
104
104
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
105
105
 
@@ -96,7 +96,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
96
96
 
97
97
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
98
98
  Guidance only — cannot be checked automatically.
99
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
99
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
100
100
  Guidance only — cannot be checked automatically.
101
101
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
102
102
 
@@ -122,7 +122,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
122
122
 
123
123
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
124
124
  Guidance only — cannot be checked automatically.
125
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
125
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
126
126
  Guidance only — cannot be checked automatically.
127
127
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
128
128
 
@@ -116,7 +116,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
116
116
 
117
117
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
118
118
  Guidance only — cannot be checked automatically.
119
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
119
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
120
120
  Guidance only — cannot be checked automatically.
121
121
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
122
122
 
@@ -173,7 +173,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
173
173
 
174
174
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
175
175
  Guidance only — cannot be checked automatically.
176
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
176
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
177
177
  Guidance only — cannot be checked automatically.
178
178
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
179
179
 
@@ -226,7 +226,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
226
226
 
227
227
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
228
228
  Guidance only — cannot be checked automatically.
229
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
229
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
230
230
  Guidance only — cannot be checked automatically.
231
231
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
232
232
 
@@ -117,7 +117,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
117
117
 
118
118
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
119
119
  Guidance only — cannot be checked automatically.
120
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
120
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
121
121
  Guidance only — cannot be checked automatically.
122
122
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
123
123
 
@@ -90,7 +90,7 @@ This is the phone's breakpoint, size.breakpoint.md, and not the wider one that d
90
90
 
91
91
  What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
92
92
  Guidance only — cannot be checked automatically.
93
- - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
93
+ - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
94
94
  Guidance only — cannot be checked automatically.
95
95
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
96
96
 
@@ -0,0 +1,52 @@
1
+ <!-- GENERATED from background.contract.json. Do not edit. -->
2
+
3
+ # Background
4
+
5
+ A ground a section or a block sits on, painted with a pattern rather than a flat fill — a halftone, an aurora, a rule grid or rings. …
6
+
7
+ `import { Background } from '@deriv-com/dds-marketing'`
8
+
9
+ ## Reach for it when
10
+
11
+ - A band that has to stand apart from the page around it with more than a change of fill — the opening of a landing page, a call to action, a section that closes a long page …
12
+ - A dark band that would otherwise be a flat slab. The glow gives it a centre for the eye, which is where the band's heading or its action should sit
13
+ - A light page that wants one moment of brand colour without a coral block: the dots carry the colour at a fraction of the area a fill would
14
+
15
+ ## Something else, when
16
+
17
+ - The band only needs separating from the page around it → **nothing in this system does this**
18
+ - The ground is a picture or a video → **AspectRatio**
19
+
20
+ ## Never
21
+
22
+ - Carrying meaning. The pattern is hidden from assistive technology and reads differently on every screen size, so nothing a reader needs may depend on it — not a highlight, not a direction, not a state
23
+ - Behind long reading. Dots behind a paragraph are texture under every word, and the brightest of them sit exactly where the eye is reading; put prose on a plain ground and keep this for the band that opens or closes it
24
+ - Two in a row. Adjacent patterned bands lose the edge between them, and the reader sees one long busy surface rather than two sections
25
+ - A card, a panel or any surface smaller than a band. At a few hundred pixels the glow has nowhere to fall off to, and the dots read as noise rather than light
26
+
27
+ ## Props
28
+
29
+ - **tone** `enum` · default "dark" — Which ground the dots are drawn on. It sets the flat colour under the pattern, the dots' ink — coral on the dark and light grounds, white on the coral one — and the ink of what sits on it
30
+ - `dark` — The default, and the band the pattern was drawn for: coral dots glowing on color.bg.brand-strong, which is dark in both modes. …
31
+ - `light` — Coral dots on the page's own ground, for a light page that wants one moment of brand colour without a solid coral band. …
32
+ - `brand` — White dots on the coral brand fill, for a call to action standing on it. …
33
+ - never: Matching the page's colour mode. Dark is dark in both modes — a band that should invert with the theme is a plain section on color.bg.page, not this
34
+ - **pattern** `enum` · default "halftone" — Which pattern is drawn. The halftone is the default and the one that moves most; the aurora drifts slowly; the grid and the rings are the quietest, their lines rising and spreading at a band's pace. …
35
+ - `halftone` — A grid of dots across the whole band that grow towards a soft glow and settle to a fine screen away from it. The default, and the one that moves most
36
+ - `aurora` — Broad soft pools of the brand's colour rising from the band's foot and drifting slowly into one another — light as colour rather than as points. Drawn by the stylesheet: no canvas. …
37
+ - `grid` — A fine rule grid of hairlines, fading in towards the band's foot — the grid PageHeader paints, offered for any band. Drawn by the stylesheet: no canvas. …
38
+ - `rings` — Hairline circles spreading out from the middle of the band's foot, fading in towards it, at size.rings.pitch. Drawn by the stylesheet: no canvas. …
39
+ - never: Choosing per breakpoint. A pattern is the band's identity; one that changed between a phone and a desk would be two bands
40
+ - **animated** `boolean` · default true — On by default: every pattern moves slowly at rest, whether or not anybody is pointing at it — the halftone's glow and the aurora's pools drift along the band's foot, the grid's rules rise and the rings spread outward, each over motion.duration.drift. …
41
+ - never: Holding still for readers who asked for less motion. Every pattern already holds still for them, whatever this says; this is the page's choice, not the reader's
42
+ - **interactive** `boolean` · default true — On by default: the pattern answers a pointer over the band. …
43
+ - never: Guiding the reader to something. The glow follows the pointer rather than leading it, holds still on touch screens and for readers who asked for less motion, and so can point at nothing anybody can rely on
44
+
45
+ ## Inside it
46
+
47
+ - 1 component is refused inside it; the list and the reasons are in the long document.
48
+ - Renders 3 parts: root, canvas, content.
49
+
50
+ ---
51
+
52
+ The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/background.md`.
@@ -33,6 +33,10 @@ A full-bleed coral band carrying one short promotion and the action it asks for
33
33
  - never: A paragraph. A banner is read at a glance, on the way down a page; copy a reader has to work through is copy they scroll past
34
34
  - **actions** `node` · optional — The one action the message asks for, or two at most. …
35
35
  - never: A third action, or a primary Button: coral on the coral ground is a button nobody can see
36
+ - **background** `enum` · optional — The band is the page's one standout moment and wants more than a flat fill. Leave it out and the band is its flat ground, as it always was
37
+ - `halftone` — A halftone drawn behind the band's content: white dots on the band's own coral, following the pointer over the band. …
38
+ - `grid` — A fine rule grid behind the band's content: white hairlines on the coral, fading in towards the foot, brightening in a soft circle around the pointer. …
39
+ - never: More than one band on a page. The pattern is what makes a band the one a reader remembers, and two of them make neither
36
40
 
37
41
  ## Inside it
38
42
 
@@ -34,6 +34,9 @@ CtaBanner's layout with a slider in it: the same full-bleed coral band, rotating
34
34
  - **label** `string` · default "Promotions" — The name the banner is announced by — a region a screen reader can jump to and skip. Name what it holds, not that it is a banner: 'Promotions', 'Offers'. Translate it with the page
35
35
  - **controlsLabel** `string` · default "Slides" — The name the dots are announced by, as a group inside the banner. Its own name rather than the banner's, so a screen reader moving into the dots hears what they are rather than 'Promotions' a second time. …
36
36
  - **slideLabel** `string` · default "Slide" — The word each dot is announced by, before its number — 'Slide 2'. Translate it with the page, as controlsLabel is; a page that translates only the group's name still has every dot announced in English
37
+ - **background** `enum` · optional — The band is the page's one standout promotion and wants more than a flat fill. Leave it out and the band is its flat coral, as it always was
38
+ - `grid` — A fine rule grid behind the slides: white hairlines on the coral, fading in towards the foot, brightening in a soft circle around the pointer. …
39
+ - never: More than one patterned band on a page. The pattern is what makes a band the one a reader remembers, and two of them make neither
37
40
 
38
41
  ## Inside it
39
42
 
@@ -0,0 +1,46 @@
1
+ <!-- GENERATED from illustrationcard.contract.json. Do not edit. -->
2
+
3
+ # IllustrationCard
4
+
5
+ A pane of glass holding a piece of product information — a market's price, a balance, a status — in one of three shapes, used as a picture: laid over a photograph or a piece of art, or standing on its own as the image a section shows beside its words. …
6
+
7
+ `import { IllustrationCard } from '@deriv-com/dds-marketing'`
8
+
9
+ ## Reach for it when
10
+
11
+ - Product information laid over a photograph or a piece of art — a market's price and status over a picture of a trader, a balance over a device
12
+ - A standalone image of the product beside a section's words, where a screenshot would be too literal: the pane is the picture the section shows
13
+ - Several such pictures across a site that have to agree in shape and surface without each page deciding
14
+
15
+ ## Something else, when
16
+
17
+ - A section has content to present — features, benefits, steps, a list → **FeatureCards**
18
+ - The content is something a reader acts on — a link, a form, a set of options → **Card**
19
+ - There is only a photograph → **AspectRatio**
20
+
21
+ ## Never
22
+
23
+ - A section's content. Headings, descriptions, features and lists belong in the section's own blocks and type; a pane of them reads as a picture, and a reader skims past what the page meant them to read
24
+ - A container for anything other than product information — a quote, a call to action, a form, navigation. It is an illustration of the product and nothing else
25
+ - Live readings presented as a picture. What the pane shows is illustrative — a price, a status drawn to explain — and a reader takes a number in it at face value; anything relied on belongs in the page's text
26
+ - Any other shape. The three ratios are the whole of the choice, so every picture on a site agrees; one that needed a fourth is a different component
27
+ - A real interface a reader is meant to operate. The pane makes everything in it inert — a button in it is a picture of a button — so anything a reader must press belongs outside it, in the section's own actions
28
+
29
+ ## Props
30
+
31
+ - **ratio** `enum` · default "landscape" — The panel's shape. One of three, so panels across a site agree
32
+ - `landscape` — Four by three, and the default. For a panel beside words in a wide section
33
+ - `square` — One by one. For a grid of panels, or a column no wider than it is tall
34
+ - `upright` — Three by four. For a phone, or a narrow column beside a tall run of words
35
+ - never: Fitting a particular piece of UI. The shape is a decision about the layout; the UI is laid out for it
36
+ - **label** `string` · required — Always. What the picture shows, in a sentence — "Trade ticket: buy Gold to rise over 5 minutes, staking 10 USD". The pane is one image to assistive technology and this is its whole description; nothing inside it is read out on its own
37
+ - never: A title or a caption the page shows. It is never drawn; a heading the reader sees belongs to the section beside the picture
38
+
39
+ ## Inside it
40
+
41
+ - 2 components are refused inside it; the list and the reasons are in the long document.
42
+ - Renders 2 parts: root, content.
43
+
44
+ ---
45
+
46
+ The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/illustrationcard.md`.
@@ -0,0 +1,51 @@
1
+ <!-- GENERATED from illustrationscene.contract.json. Do not edit. -->
2
+
3
+ # IllustrationScene
4
+
5
+ A photograph with an IllustrationCard laid over it — the product shown in the hands of the people who use it: a trade ticket over a trader on the move, a balance over someone at a desk. …
6
+
7
+ `import { IllustrationScene } from '@deriv-com/dds-marketing'`
8
+
9
+ ## Reach for it when
10
+
11
+ - Product information shown over a photograph — a trade ticket, a balance, a market's status — where the photograph sets the scene and the card says what the product does …
12
+ - A hero or a feature section needs a picture of the product in use rather than a screenshot or a photograph alone
13
+
14
+ ## Something else, when
15
+
16
+ - The card stands on its own, with no photograph behind it → **IllustrationCard**
17
+ - There is only a photograph → **AspectRatio**
18
+
19
+ ## Never
20
+
21
+ - A section's content. Like the card it holds, the scene is a picture of the product, and what a section says belongs in its own blocks
22
+ - More than one card over one photograph. A second card is a second picture competing for the same eye; two scenes side by side say two things clearly
23
+ - A photograph whose subject sits where the card goes. The card covers the middle of the frame, or one side of it with `placement`; choose or crop the photograph so the person or the object stays clear of it
24
+
25
+ ## Props
26
+
27
+ - **ratio** `enum` · default "square" — The scene's shape. One of three, the same three IllustrationCard takes, so scenes and cards across a site agree
28
+ - `landscape` — Four by three. A scene beside words in a wide section; the card takes a little under half the width
29
+ - `square` — One by one, and the default — the shape most such scenes are drawn in. The card takes a little over half the width
30
+ - `upright` — Three by four. A scene on a phone or in a narrow column; the card takes most of the width
31
+ - never: Fitting a particular photograph. The shape is a decision about the layout; the photograph is chosen or cropped for it
32
+ - **placement** `enum` · default "center" — Where the card sits over the photograph, so the subject of the photograph stays clear of it
33
+ - `center` — The default: the card in the middle of the frame. For a photograph whose subject frames the middle — a person looking down at what the card shows
34
+ - `start` — The card towards the start edge, for a photograph whose subject is at the end
35
+ - `end` — The card towards the end edge, for a photograph whose subject is at the start
36
+ - never: Anything but keeping the photograph's subject clear. The card's size is fixed by the shape; placement moves it and nothing else
37
+ - **src** `string` · required — Always. The photograph the scene is set in
38
+ - never: A data URI holding a photograph. A scene's photograph is the heaviest thing on its page and belongs in a file the browser can cache
39
+ - **alt** `string` · default "" — Empty by default, because the card's `label` describes the whole picture and the photograph is decoration. Write one only where the photograph says something the label does not
40
+ - never: Repeating the card's label. A screen reader would hear the picture described twice
41
+
42
+ ## Inside it
43
+
44
+ - Takes only IllustrationCard.
45
+ - At least 1, at most 1 — fewer is not this component and more is a different one.
46
+ - 2 components are refused inside it; the list and the reasons are in the long document.
47
+ - Renders 2 parts: root, image.
48
+
49
+ ---
50
+
51
+ The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/illustrationscene.md`.
@@ -42,6 +42,13 @@ The band that opens a main landing page: the one thing the page is about, said o
42
42
  - never: The background. A photograph filling the band is `backgroundImage`; this sits in front of it and is placed against the band's edge
43
43
  - **backgroundImage** `string` · optional — A photograph filling the whole band. It is shown as it is — nothing is painted over it, so choose one already dark enough that the title reads on it
44
44
  - never: A flat colour, or a bright photograph. The band already paints its ground, and nothing here darkens an image on the page's behalf — a pale one leaves the claim unreadable
45
+ - **background** `enum` · optional — The band is the page's one standout moment and wants more than a flat fill. Leave it out and the band is its flat ground, as it always was
46
+ - `halftone` — A halftone drawn behind the band's content: coral dots blending to white at the glow's heart, on the band's own dark ground, following the pointer over the band. …
47
+ - never: More than one band on a page. The pattern is what makes a band the one a reader remembers, and two of them make neither
48
+
49
+ ## The type refuses
50
+
51
+ - background="halftone" with backgroundImage="*" — Two grounds on one band: the photograph would paint over the pattern, or the pattern over the photograph. A hero is a picture or a pattern, never both
45
52
 
46
53
  ## Inside it
47
54
 
@@ -38,6 +38,9 @@ The band that opens a company or a legal page: the page's name, a line saying wh
38
38
  - never: A paragraph. It is held to a readable measure and set at body size; past a couple of sentences a reader scrolls rather than reads, and the actions go under the fold
39
39
  - **actions** `node` · optional — The one or two things the page wants a reader to do. Composed by the page rather than described to this component, so a call to action is the same Button here as anywhere else on the site
40
40
  - never: A row of destinations. Three or more controls under a title is a menu, and a reader who has to choose between five things chooses none
41
+ - **background** `enum` · optional — The band is the page's one standout moment and wants more than a flat fill. Leave it out and the band is its flat ground, as it always was
42
+ - `halftone` — A halftone drawn behind the band's content: coral dots blending to white at the glow's heart, on the band's own dark ground, following the pointer over the band. …
43
+ - never: More than one band on a page. The pattern is what makes a band the one a reader remembers, and two of them make neither
41
44
 
42
45
  ## Inside it
43
46
 
package/.llm/index.md CHANGED
@@ -9,6 +9,8 @@ need — loading all of them dilutes the relevant one.
9
9
  Paths here are from the package root, so they resolve whether this file is read in place
10
10
  or its content handed over on its own.
11
11
 
12
+ Sections: Core (54) · Layout (5) · Blocks (14)
13
+
12
14
 
13
15
  ## Core
14
16
 
@@ -19,6 +21,7 @@ Domain-neutral building blocks.
19
21
  | Component | Use when | Not for |
20
22
  |---|---|---|
21
23
  | AccordionItem | One row inside an Accordion — every row of a set is one of these · A single disclosure with no set around it: one topic whose detail is worth offering and not worth showing. The row is whole on its own, and it keeps its own open state when nothing is injecting one | The heading goes somewhere rather than opening something → `CardButton` |
24
+ | Background | A band that has to stand apart from the page around it with more than a change of fill — the opening of a landing page, a call to action, a section that closes a long page · A dark band that would otherwise be a flat slab. The glow gives it a centre for the eye, which is where the band's heading or its action should sit · A light page that wants one moment of brand colour without a coral block: the dots carry the colour at a fraction of the area a fill would | The band only needs separating from the page around it → nothing here · The ground is a picture or a video → `AspectRatio` |
22
25
  | Badge | One of a set is the one the page wants read first — the plan most people choose, the market most people start with · Something is new or has changed, and saying so is worth a word rather than a sentence · A number the page is promoting is worth marking as a saving rather than left in the copy — a percentage off, a period free | What it says is a state the reader's account is in → nothing here · The words are the point rather than the mark → `CardBody` |
23
26
  | Breadcrumb | The page sits inside a section hierarchy, and the levels above it are places the visitor can navigate to — a product page inside a markets section, a blog post inside a category · A visitor who arrived by search, social link or campaign URL needs to learn where they landed and how the site is organised around them | The visitor is moving through the stages of a sign-up or onboarding flow rather than standing in a hierarchy → nothing here · There is exactly one place to go back to, and it is the previous page rather than a parent section → nothing here |
24
27
  | BreadcrumbItem | Rendering one level of a Breadcrumb — every level in a trail is one of these · The level needs a short name the visitor recognises as a place: the section name, not a sentence about it | The destination is somewhere the visitor goes to act rather than a level they climb back to → nothing here |
@@ -32,6 +35,8 @@ Domain-neutral building blocks.
32
35
  | DropdownMenu | A set of destinations too long for the navigation bar and too short to be a page of its own — languages, regions, the parts of a long index · The set is short enough to read at a glance, where a visitor is choosing rather than searching | The set reports a choice the visitor should find marked when they return → nothing here · The destinations belong in the page's navigation → nothing here · It is one destination rather than one of a set → nothing here · The set is long enough that a visitor would rather type than read → nothing here |
33
36
  | FooterGroup | A set of a footer's destinations belong under one word — Markets, Support, Legal · The footer has enough links that a reader scanning it needs sets rather than a list | The destinations are the ones a visitor most likely wants → `Navbar` · The group is a named set inside a navigation panel → `NavbarMenuGroup` · There is one link rather than a set → `Link` |
34
37
  | Icon | A glyph stands beside words to speed recognition — a mark on a feature card, a chevron on a row, a separator in a trail · A page is composing something a component offers a slot for, and the slot takes a mark rather than a component that draws one | The mark identifies a company or a product — a payment method, an app store, a social network → `Logo` *(not built yet)* · The artwork is a scene rather than a symbol → `Illustration` *(not built yet)* |
38
+ | IllustrationCard | Product information laid over a photograph or a piece of art — a market's price and status over a picture of a trader, a balance over a device · A standalone image of the product beside a section's words, where a screenshot would be too literal: the pane is the picture the section shows · Several such pictures across a site that have to agree in shape and surface without each page deciding | A section has content to present — features, benefits, steps, a list → `FeatureCards` · The content is something a reader acts on — a link, a form, a set of options → `Card` · There is only a photograph → `AspectRatio` |
39
+ | IllustrationScene | Product information shown over a photograph — a trade ticket, a balance, a market's status — where the photograph sets the scene and the card says what the product does · A hero or a feature section needs a picture of the product in use rather than a screenshot or a photograph alone | The card stands on its own, with no photograph behind it → `IllustrationCard` · There is only a photograph → `AspectRatio` |
35
40
  | Link | A term inside running copy has a page of its own — a market named in a paragraph, a fee mentioned in a sentence, a product referred to in passing · The page must offer a destination without pushing it: terms, a full fee schedule, a regulatory notice. A pill would give it the weight of the thing the page is actually asking for · A second destination beside the call to action, where a second pill would be two things asking to be pressed and a reader would have to choose between them before reading either | The destination is the step the page was built to produce → `Button` · Pressing it does something on this page rather than going somewhere → nothing here · The whole card or panel is the target rather than some words in it → `CardButton` |
36
41
  | MenuItem | A row in a menu of destinations — a language, a region, a page number an index skipped · A set short enough to read at a glance, where a reader is choosing rather than searching | The row reports a choice the reader should find marked when they return → nothing here · The destination belongs in the page's navigation → nothing here · It is one action rather than one of a set → nothing here |
37
42
  | NavbarItem | A section of the site, in a Navbar — the ordinary case and what this is for · A destination that leaves the site, which it marks as a change of context rather than leaving the reader to find out · The same destination inside the panel a narrow bar collapses into: a page writes its navigation once, and what changes with the width is how it is drawn | The destination opens a panel of further destinations rather than going somewhere → `NavbarMenu` · The destination is a phrase inside a sentence, or a call to action beneath a paragraph → `Link` · The item is one of a set of alternatives rather than a place → `Tab` |
@@ -78,6 +83,7 @@ Domain-neutral building blocks.
78
83
  ## Layout
79
84
 
80
85
  Arrange other components and decide no appearance of their own.
86
+
81
87
  | Component | Use when | Not for |
82
88
  |---|---|---|
83
89
  | AspectRatio | A picture whose proportions have to match the ones beside it — a row of cards, a grid of markets, a set of logos. One shape asked for once is what keeps a row from settling on whichever image is tallest · Room that must be reserved before the thing filling it arrives — art loaded late, an embed, anything fetched. The box is the right height from the first paint, so the page under it never moves · An embed that brings its own proportion and no height — a video, a map, a third-party frame. The ratio is the only way to give it one without guessing a pixel measure that is wrong at some width | The picture is the media region of a card → `CardBody` · The thing inside has a size of its own and should keep it → nothing here · The shape changes with the viewport → nothing here |
@@ -89,6 +95,7 @@ Arrange other components and decide no appearance of their own.
89
95
  ## Blocks
90
96
 
91
97
  The sections a page is built from, and the rhythm between them.
98
+
92
99
  | Component | Use when | Not for |
93
100
  |---|---|---|
94
101
  | CtaBanner | A short, high-contrast promotion with one clear action — open an account, start trading, download the app · The band that closes a page, or breaks a long one, on the action the page exists to produce | Two or three promotions to rotate between → `CtaBannerSlider` · The band that opens the page → `LandingHero` · A message that needs a picture beside it → `FeatureSplit` |