@carissa-io/theme-default 0.3.21 → 0.3.22

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.
package/DESIGN.md CHANGED
@@ -495,6 +495,24 @@ From [components-animate](components/components-animate): `Animate`. The entranc
495
495
  ## Sequence
496
496
  From [components-sequence](components/components-sequence): `Sequence`. The items come in 0.15s apart (`$motion-stagger`), stacked with 1rem between them; the motion itself is the Animate one, so the block is configured after it. No colour of its own. Under `prefers-reduced-motion` every item is shown at once.
497
497
 
498
+ ## Typewriter
499
+ From [components-typewriter](components/components-typewriter): `Typewriter`. The cursor is a 0.08em bar in `--c-text`, the colour of the text it follows (17.93:1 / 18.16:1 on the background), blinking once per four short tokens (1s; a blink of the short token alone would flicker). It stays solid while characters are typed. The typing speed is a prop. Under `prefers-reduced-motion` the final text shows at once and the cursor is not drawn.
500
+
501
+ ## Scramble
502
+ From [components-scramble](components/components-scramble): `Scramble`. Characters still decoding sit at 0.7 opacity and the settled text returns to full opacity over the short token on the shared easing. The text keeps `--c-text`; the contrast figures are those of the palette once it has settled. Under `prefers-reduced-motion` the final text shows at once.
503
+
504
+ ## Counter
505
+ From [components-counter](components/components-counter): `Counter`. A count lasts the long token (0.9s) on the decelerating `out` easing, read by the component through custom properties. Equal-width digits stay on so the figure does not jitter. No colour of its own: it inherits the text around it. The final value is the accessible text from the first render.
506
+
507
+ ## Highlight sweep
508
+ From [components-highlight-sweep](components/components-highlight-sweep): `HighlightSweep`. The marker is `--c-surface-active` behind the text (`--c-text` on it: 14.23:1 in light, 13.88:1 in dark; both AA, tested), 0.2em wider on each side, sweeping over the medium token on the shared easing. The gray marks without a hue; if the highlight carries meaning, say it in text or use `as="mark"`. Under `prefers-reduced-motion` the marker shows at its end state.
509
+
510
+ ## Ticker
511
+ From [components-ticker](components/components-ticker): `Ticker`. A constant-speed loop of 40s (a marquee is not an entrance, so it does not read the motion tokens) with 2rem between items. The pause control is a 2.75rem round button (the touch target of the theme): `--c-text` glyph on `--c-background`, a 1px `--c-muted` border (5.74:1 / 7.85:1 on the background) and a 2px `--c-focus` outline offset by 2px on keyboard focus. The text of the control comes from the app (`pause_label`, `play_label`). Under `prefers-reduced-motion` the ticker is a static list with no control.
512
+
513
+ ## Stagger list
514
+ From [components-stagger-list](components/components-stagger-list): `StaggerList`. Rows come in 0.15s apart (`$motion-stagger`) with 0.5rem between them; the motion of each row is the Animate one, so the block is configured after it. No colour of its own. Under `prefers-reduced-motion` every row is shown at once.
515
+
498
516
  ## Keyboard focus (all controls)
499
517
  One rule keeps the controls coherent: **an outlined control thickens its own border from 1px to 2px, black** (text fields,
500
518
  select, combobox, date picker, textarea, upload, empty checkbox, off switch, radio, secondary and ghost buttons); **a filled
package/README.md CHANGED
@@ -123,11 +123,11 @@ change.
123
123
  | `$focus-color` | `$black` | focus color |
124
124
  | `$focus-width` | `1px` | focus ring width |
125
125
  | `$transition-duration` | `0.2s` | color and border transitions |
126
- | `$motion-duration-short` | `0.25s` | quick entrances and small moves |
127
- | `$motion-duration-medium` | `0.5s` | the default entrance (`animate`) |
128
- | `$motion-duration-long` | `0.9s` | counts, reveals and other slow moves |
126
+ | `$motion-duration-short` | `0.25s` | quick entrances and small moves (`scramble` settle, four of them make the `typewriter` cursor blink) |
127
+ | `$motion-duration-medium` | `0.5s` | the default entrance (`animate`) and the `highlight-sweep` |
128
+ | `$motion-duration-long` | `0.9s` | counts (`counter`), reveals and other slow moves |
129
129
  | `$motion-easing` | `cubic-bezier(0.16, 1, 0.3, 1)` | the one decelerating easing of the motion components |
130
- | `$motion-stagger` | `0.15s` | gap between the items of a `sequence` |
130
+ | `$motion-stagger` | `0.15s` | gap between the items of a `sequence` or a `stagger-list` |
131
131
  | `$label-font-size` | `0.6875rem` | field label size |
132
132
  | `$label-font-weight` | `700` | field label weight |
133
133
  | `$label-letter-spacing` | `0.1em` | field label tracking |
@@ -174,7 +174,7 @@ it: check the names against the theme's `scss/_tokens.scss` before you switch.
174
174
 
175
175
  ## What it configures
176
176
  `components-input`, `-button`, `-checkbox`, `-switch`, `-radio-group`, `-slider`, `-popover`, `-listbox`, `-select`,
177
- `-combobox`, `-upload`, `-calendar`, `-date-picker`, `-search`, `-typography`, `-card`, `-alert`, `-spinner`, `-modal`, `-toast`, `-divider`, `-badge`, `-tag`, `-link`, `-avatar`, `-skeleton`, `-progress`, `-tooltip`, `-prose`, `-tabs`, `-accordion`, `-breadcrumb`, `-pagination`, `-stepper`, `-sidebar`, `-navbar`, `-drawer`, `-menu`, `-table`, `-list`, `-description-list`, `-stat`, `-empty-state`, `-timeline`, `-tree`, `-code`, `-field`, `-number-input`, `-otp-input`, `-phone`, `-tag-input`, `-time-picker`, `-date-range`, `-rating`, `-color-picker`, `-async-autocomplete`, `-section`, `-faq`, `-carousel`, `-visually-hidden`, `-live-region`, `-theme-switch`, `-icon`, `-ai-label`, `-thinking-indicator`, `-streaming-text`, `-message`, `-message-list`, `-prompt-input`, `-suggested-prompts`, `-message-actions`, `-animate` and `-sequence`. `components-email`, `-password`, `-url` and `-textarea`
177
+ `-combobox`, `-upload`, `-calendar`, `-date-picker`, `-search`, `-typography`, `-card`, `-alert`, `-spinner`, `-modal`, `-toast`, `-divider`, `-badge`, `-tag`, `-link`, `-avatar`, `-skeleton`, `-progress`, `-tooltip`, `-prose`, `-tabs`, `-accordion`, `-breadcrumb`, `-pagination`, `-stepper`, `-sidebar`, `-navbar`, `-drawer`, `-menu`, `-table`, `-list`, `-description-list`, `-stat`, `-empty-state`, `-timeline`, `-tree`, `-code`, `-field`, `-number-input`, `-otp-input`, `-phone`, `-tag-input`, `-time-picker`, `-date-range`, `-rating`, `-color-picker`, `-async-autocomplete`, `-section`, `-faq`, `-carousel`, `-visually-hidden`, `-live-region`, `-theme-switch`, `-icon`, `-ai-label`, `-thinking-indicator`, `-streaming-text`, `-message`, `-message-list`, `-prompt-input`, `-suggested-prompts`, `-message-actions`, `-animate`, `-sequence`, `-typewriter`, `-scramble`, `-counter`, `-highlight-sweep`, `-ticker` and `-stagger-list`. `components-email`, `-password`, `-url` and `-textarea`
178
178
  are styled through the input.
179
179
 
180
180
  The checkbox's mixed state (`indeterminate`, from the next `components-checkbox` release, class `c-checkbox--indeterminate`) is the checked box with a 10px dash in `--c-on-primary`; on an older checkbox the rule is simply unused.
package/dist/index.css CHANGED
@@ -5981,3 +5981,308 @@ button.c-theme-switch:focus-visible {
5981
5981
  .c-sequence__item {
5982
5982
  --c-animate-delay: calc(var(--c-sequence-index, 0) * var(--c-sequence-stagger, 0.15s));
5983
5983
  }
5984
+
5985
+ @keyframes c-typewriter-blink {
5986
+ 0%, 49% {
5987
+ opacity: 1;
5988
+ }
5989
+ 50%, 100% {
5990
+ opacity: 0;
5991
+ }
5992
+ }
5993
+ .c-typewriter__sr {
5994
+ position: absolute;
5995
+ width: 1px;
5996
+ height: 1px;
5997
+ margin: -1px;
5998
+ padding: 0;
5999
+ overflow: hidden;
6000
+ clip-path: inset(50%);
6001
+ white-space: nowrap;
6002
+ border: 0;
6003
+ }
6004
+
6005
+ .c-typewriter__text {
6006
+ white-space: pre-wrap;
6007
+ }
6008
+
6009
+ .c-typewriter__cursor {
6010
+ display: inline-block;
6011
+ width: 0.08em;
6012
+ height: 1em;
6013
+ margin-inline-start: 0.1em;
6014
+ vertical-align: text-bottom;
6015
+ background: var(--c-text);
6016
+ animation: c-typewriter-blink 1s steps(1, end) infinite;
6017
+ }
6018
+ .c-typewriter__cursor--active {
6019
+ animation: none;
6020
+ }
6021
+
6022
+ @media (prefers-reduced-motion: reduce) {
6023
+ .c-typewriter__cursor {
6024
+ animation: none;
6025
+ }
6026
+ }
6027
+ .c-scramble__sr {
6028
+ position: absolute;
6029
+ width: 1px;
6030
+ height: 1px;
6031
+ margin: -1px;
6032
+ padding: 0;
6033
+ overflow: hidden;
6034
+ clip-path: inset(50%);
6035
+ white-space: nowrap;
6036
+ border: 0;
6037
+ }
6038
+
6039
+ .c-scramble__text {
6040
+ white-space: pre-wrap;
6041
+ font-variant-numeric: tabular-nums;
6042
+ transition: opacity 0.25s cubic-bezier(0.16, 1, 0.3, 1);
6043
+ }
6044
+
6045
+ .c-scramble--scrambling .c-scramble__text {
6046
+ opacity: 0.7;
6047
+ }
6048
+
6049
+ @media (prefers-reduced-motion: reduce) {
6050
+ .c-scramble__text {
6051
+ opacity: 1;
6052
+ transition: none;
6053
+ }
6054
+ }
6055
+ .c-counter {
6056
+ --c-counter-duration: 0.9s;
6057
+ --c-counter-easing: out;
6058
+ position: relative;
6059
+ font-variant-numeric: tabular-nums;
6060
+ }
6061
+
6062
+ .c-counter__text {
6063
+ position: absolute;
6064
+ width: 1px;
6065
+ height: 1px;
6066
+ padding: 0;
6067
+ margin: -1px;
6068
+ overflow: hidden;
6069
+ clip-path: inset(50%);
6070
+ white-space: nowrap;
6071
+ border: 0;
6072
+ }
6073
+
6074
+ @keyframes c-highlight-sweep {
6075
+ from {
6076
+ background-size: 0% 100%;
6077
+ }
6078
+ to {
6079
+ background-size: 100% 100%;
6080
+ }
6081
+ }
6082
+ .c-highlight-sweep {
6083
+ padding-inline: 0.2em;
6084
+ background-image: linear-gradient(var(--c-surface-active), var(--c-surface-active));
6085
+ background-repeat: no-repeat;
6086
+ background-position: left bottom;
6087
+ background-size: 0% 100%;
6088
+ -webkit-box-decoration-break: clone;
6089
+ box-decoration-break: clone;
6090
+ }
6091
+
6092
+ .c-highlight-sweep--rtl {
6093
+ background-position: right bottom;
6094
+ }
6095
+
6096
+ .c-highlight-sweep[data-state=active] {
6097
+ background-size: 100% 100%;
6098
+ animation-name: c-highlight-sweep;
6099
+ animation-duration: var(--c-highlight-sweep-duration, 0.5s);
6100
+ animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
6101
+ animation-delay: var(--c-highlight-sweep-delay, 0s);
6102
+ animation-fill-mode: backwards;
6103
+ }
6104
+
6105
+ @media (prefers-reduced-motion: reduce) {
6106
+ .c-highlight-sweep,
6107
+ .c-highlight-sweep[data-state] {
6108
+ background-size: 100% 100%;
6109
+ animation: none;
6110
+ }
6111
+ }
6112
+ @keyframes c-ticker-x {
6113
+ from {
6114
+ transform: translateX(0);
6115
+ }
6116
+ to {
6117
+ transform: translateX(-50%);
6118
+ }
6119
+ }
6120
+ @keyframes c-ticker-y {
6121
+ from {
6122
+ transform: translateY(0);
6123
+ }
6124
+ to {
6125
+ transform: translateY(-50%);
6126
+ }
6127
+ }
6128
+ .c-ticker {
6129
+ position: relative;
6130
+ display: flex;
6131
+ align-items: center;
6132
+ gap: 2rem;
6133
+ }
6134
+
6135
+ .c-ticker__viewport {
6136
+ flex: 1;
6137
+ min-width: 0;
6138
+ overflow: hidden;
6139
+ }
6140
+
6141
+ .c-ticker__track {
6142
+ display: flex;
6143
+ width: max-content;
6144
+ animation-duration: var(--c-ticker-duration, 40s);
6145
+ animation-timing-function: linear;
6146
+ animation-iteration-count: infinite;
6147
+ }
6148
+
6149
+ .c-ticker__list {
6150
+ display: flex;
6151
+ flex: none;
6152
+ gap: var(--c-ticker-gap, 2rem);
6153
+ min-width: 100vw;
6154
+ padding: 0 var(--c-ticker-gap, 2rem) 0 0;
6155
+ margin: 0;
6156
+ list-style: none;
6157
+ }
6158
+
6159
+ .c-ticker__item {
6160
+ flex: none;
6161
+ }
6162
+
6163
+ .c-ticker--horizontal .c-ticker__track {
6164
+ animation-name: c-ticker-x;
6165
+ }
6166
+
6167
+ .c-ticker--right .c-ticker__track,
6168
+ .c-ticker--down .c-ticker__track {
6169
+ animation-direction: reverse;
6170
+ }
6171
+
6172
+ .c-ticker--vertical .c-ticker__viewport {
6173
+ height: 12rem;
6174
+ }
6175
+ .c-ticker--vertical .c-ticker__track {
6176
+ flex-direction: column;
6177
+ width: auto;
6178
+ animation-name: c-ticker-y;
6179
+ }
6180
+ .c-ticker--vertical .c-ticker__list {
6181
+ flex-direction: column;
6182
+ min-width: 0;
6183
+ min-height: 12rem;
6184
+ padding: 0 0 var(--c-ticker-gap, 2rem) 0;
6185
+ }
6186
+
6187
+ .c-ticker[data-state=paused] .c-ticker__track,
6188
+ .c-ticker[data-state=idle] .c-ticker__track,
6189
+ .c-ticker__viewport:focus-within .c-ticker__track,
6190
+ .c-ticker--pause-on-hover .c-ticker__viewport:hover .c-ticker__track {
6191
+ animation-play-state: paused;
6192
+ }
6193
+
6194
+ .c-ticker[data-state=static] .c-ticker__track {
6195
+ width: auto;
6196
+ animation: none;
6197
+ }
6198
+ .c-ticker[data-state=static] .c-ticker__list {
6199
+ flex: 0 1 auto;
6200
+ flex-wrap: wrap;
6201
+ min-width: 0;
6202
+ min-height: 0;
6203
+ padding: 0;
6204
+ }
6205
+ .c-ticker[data-state=static] .c-ticker__viewport {
6206
+ height: auto;
6207
+ mask-image: none;
6208
+ }
6209
+
6210
+ .c-ticker__toggle {
6211
+ position: relative;
6212
+ box-sizing: border-box;
6213
+ flex: none;
6214
+ width: 2.75rem;
6215
+ height: 2.75rem;
6216
+ padding: 0;
6217
+ color: var(--c-text);
6218
+ cursor: pointer;
6219
+ background: var(--c-background);
6220
+ border: 1px solid var(--c-muted);
6221
+ border-radius: 50%;
6222
+ }
6223
+ .c-ticker__toggle::before {
6224
+ position: absolute;
6225
+ top: 50%;
6226
+ left: 50%;
6227
+ content: "";
6228
+ }
6229
+ .c-ticker__toggle:focus-visible {
6230
+ outline: 2px solid var(--c-focus);
6231
+ outline-offset: 2px;
6232
+ }
6233
+
6234
+ .c-ticker__toggle--playing::before {
6235
+ width: 0.5rem;
6236
+ height: 0.75rem;
6237
+ border-right: 0.1875rem solid currentcolor;
6238
+ border-left: 0.1875rem solid currentcolor;
6239
+ transform: translate(-50%, -50%);
6240
+ }
6241
+
6242
+ .c-ticker__toggle--paused::before {
6243
+ border-top: 0.375rem solid transparent;
6244
+ border-bottom: 0.375rem solid transparent;
6245
+ border-left: 0.625rem solid currentcolor;
6246
+ transform: translate(-35%, -50%);
6247
+ }
6248
+
6249
+ @media (prefers-reduced-motion: reduce) {
6250
+ .c-ticker__track {
6251
+ width: auto;
6252
+ animation: none;
6253
+ }
6254
+ .c-ticker__list--copy,
6255
+ .c-ticker__toggle {
6256
+ display: none;
6257
+ }
6258
+ .c-ticker__list {
6259
+ flex: 0 1 auto;
6260
+ flex-wrap: wrap;
6261
+ min-width: 0;
6262
+ min-height: 0;
6263
+ padding: 0;
6264
+ }
6265
+ }
6266
+ .c-stagger-list {
6267
+ display: flex;
6268
+ flex-direction: column;
6269
+ gap: 0.5rem;
6270
+ padding: 0;
6271
+ margin: 0;
6272
+ list-style: none;
6273
+ }
6274
+
6275
+ .c-stagger-list__item {
6276
+ --c-animate-delay: calc(
6277
+ var(--c-stagger-list-delay, 0s) + var(--c-stagger-list-index, 0) *
6278
+ var(--c-stagger-list-stagger, 0.15s)
6279
+ );
6280
+ }
6281
+
6282
+ @media (prefers-reduced-motion: reduce) {
6283
+ .c-stagger-list__item {
6284
+ opacity: 1;
6285
+ transform: none;
6286
+ animation: none;
6287
+ }
6288
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carissa-io/theme-default",
3
- "version": "0.3.21",
3
+ "version": "0.3.22",
4
4
  "description": "Carissa UI: the default theme (Swiss minimalism) as SCSS variable overrides of the Carissa components, with a compiled CSS build",
5
5
  "type": "module",
6
6
  "style": "dist/index.css",
@@ -110,7 +110,13 @@
110
110
  "@carissa-io/components-suggested-prompts": "^0.1.0",
111
111
  "@carissa-io/components-message-actions": "^0.1.0",
112
112
  "@carissa-io/components-animate": "^0.1.0",
113
- "@carissa-io/components-sequence": "^0.1.0"
113
+ "@carissa-io/components-sequence": "^0.1.0",
114
+ "@carissa-io/components-typewriter": "^0.1.0",
115
+ "@carissa-io/components-scramble": "^0.1.0",
116
+ "@carissa-io/components-counter": "^0.1.0",
117
+ "@carissa-io/components-highlight-sweep": "^0.1.0",
118
+ "@carissa-io/components-ticker": "^0.1.0",
119
+ "@carissa-io/components-stagger-list": "^0.1.0"
114
120
  },
115
121
  "peerDependenciesMeta": {
116
122
  "@carissa-io/components-input": {
@@ -343,6 +349,24 @@
343
349
  },
344
350
  "@carissa-io/components-sequence": {
345
351
  "optional": true
352
+ },
353
+ "@carissa-io/components-typewriter": {
354
+ "optional": true
355
+ },
356
+ "@carissa-io/components-scramble": {
357
+ "optional": true
358
+ },
359
+ "@carissa-io/components-counter": {
360
+ "optional": true
361
+ },
362
+ "@carissa-io/components-highlight-sweep": {
363
+ "optional": true
364
+ },
365
+ "@carissa-io/components-ticker": {
366
+ "optional": true
367
+ },
368
+ "@carissa-io/components-stagger-list": {
369
+ "optional": true
346
370
  }
347
371
  },
348
372
  "devDependencies": {
@@ -362,6 +386,7 @@
362
386
  "@carissa-io/components-code": "^0.1.0",
363
387
  "@carissa-io/components-color-picker": "^0.1.0",
364
388
  "@carissa-io/components-combobox": "^0.1.1",
389
+ "@carissa-io/components-counter": "^0.1.0",
365
390
  "@carissa-io/components-date-picker": "^0.1.1",
366
391
  "@carissa-io/components-date-range": "^0.1.0",
367
392
  "@carissa-io/components-description-list": "^0.1.0",
@@ -370,6 +395,7 @@
370
395
  "@carissa-io/components-empty-state": "^0.1.0",
371
396
  "@carissa-io/components-faq": "^0.1.0",
372
397
  "@carissa-io/components-field": "^0.1.0",
398
+ "@carissa-io/components-highlight-sweep": "^0.1.0",
373
399
  "@carissa-io/components-icon": "^0.1.0",
374
400
  "@carissa-io/components-input": "^0.2.1",
375
401
  "@carissa-io/components-link": "^0.1.0",
@@ -392,6 +418,7 @@
392
418
  "@carissa-io/components-prose": "^0.1.0",
393
419
  "@carissa-io/components-radio-group": "^0.1.1",
394
420
  "@carissa-io/components-rating": "^0.1.0",
421
+ "@carissa-io/components-scramble": "^0.1.0",
395
422
  "@carissa-io/components-search": "^0.1.1",
396
423
  "@carissa-io/components-section": "^0.1.0",
397
424
  "@carissa-io/components-select": "^0.1.1",
@@ -400,6 +427,7 @@
400
427
  "@carissa-io/components-skeleton": "^0.1.0",
401
428
  "@carissa-io/components-slider": "^0.1.1",
402
429
  "@carissa-io/components-spinner": "^0.1.0",
430
+ "@carissa-io/components-stagger-list": "^0.1.0",
403
431
  "@carissa-io/components-stat": "^0.1.0",
404
432
  "@carissa-io/components-stepper": "^0.1.0",
405
433
  "@carissa-io/components-streaming-text": "^0.1.0",
@@ -412,11 +440,13 @@
412
440
  "@carissa-io/components-textarea": "^0.1.1",
413
441
  "@carissa-io/components-theme-switch": "^0.1.0",
414
442
  "@carissa-io/components-thinking-indicator": "^0.1.0",
443
+ "@carissa-io/components-ticker": "^0.1.0",
415
444
  "@carissa-io/components-time-picker": "^0.1.0",
416
445
  "@carissa-io/components-timeline": "^0.1.0",
417
446
  "@carissa-io/components-toast": "^0.1.0",
418
447
  "@carissa-io/components-tooltip": "^0.1.0",
419
448
  "@carissa-io/components-tree": "^0.1.0",
449
+ "@carissa-io/components-typewriter": "^0.1.0",
420
450
  "@carissa-io/components-typography": "^0.1.0",
421
451
  "@carissa-io/components-upload": "^0.1.1",
422
452
  "@carissa-io/components-visually-hidden": "^0.1.0",
package/scss/index.scss CHANGED
@@ -1881,3 +1881,56 @@
1881
1881
  $c-sequence-direction: column,
1882
1882
  $c-sequence-gap: 1rem
1883
1883
  );
1884
+
1885
+ // Typewriter: the cursor is a thin bar in the text colour (the text it follows), blinking once per four short tokens (a blink of the
1886
+ // short token alone would flicker). The typing speed is a prop. No other colour; under prefers-reduced-motion the cursor is not drawn.
1887
+ @use '@carissa-io/components-typewriter/scss' as typewriter with (
1888
+ $c-typewriter-cursor-width: 0.08em,
1889
+ $c-typewriter-cursor-color: $var-text,
1890
+ $c-typewriter-cursor-blink: $motion-duration-short * 4
1891
+ );
1892
+
1893
+ // Scramble: the characters that have not settled yet are dimmed to 0.7 and the settled text returns to full opacity over the short
1894
+ // token on the shared easing. The text keeps --c-text, so the contrast of the settled text is the palette's.
1895
+ @use '@carissa-io/components-scramble/scss' as scramble with (
1896
+ $c-scramble-scrambled-opacity: 0.7,
1897
+ $c-scramble-transition: $motion-duration-short,
1898
+ $c-scramble-easing: $motion-easing
1899
+ );
1900
+
1901
+ // Counter: a count lasts the long token on the shared decelerating easing (the component reads both through custom properties).
1902
+ // Equal-width digits stay on so the number does not jitter. No colour: the figure inherits the text around it.
1903
+ @use '@carissa-io/components-counter/scss' as counter with (
1904
+ $c-counter-duration: $motion-duration-long,
1905
+ $c-counter-easing: out
1906
+ );
1907
+
1908
+ // Highlight sweep: the marker is the --c-surface-active gray behind the text (the text keeps --c-text on it, see the contrast
1909
+ // test), and it sweeps over the medium token on the shared easing. Under prefers-reduced-motion it shows at its end state.
1910
+ @use '@carissa-io/components-highlight-sweep/scss' as highlight-sweep with (
1911
+ $c-highlight-sweep-color: $var-surface-active,
1912
+ $c-highlight-sweep-duration: $motion-duration-medium,
1913
+ $c-highlight-sweep-easing: $motion-easing,
1914
+ $c-highlight-sweep-padding-inline: 0.2em
1915
+ );
1916
+
1917
+ // Ticker: a long constant-speed loop (it keeps its own 40s, a marquee is not an entrance), 2rem between items. The pause control
1918
+ // is a 2.75rem round button like the theme's other controls: --c-text glyph, 1px --c-muted border, and the --c-focus outline.
1919
+ @use '@carissa-io/components-ticker/scss' as ticker with (
1920
+ $c-ticker-duration: 40s,
1921
+ $c-ticker-easing: linear,
1922
+ $c-ticker-gap: 2rem,
1923
+ $c-ticker-toggle-size: $min-height,
1924
+ $c-ticker-toggle-color: $var-text,
1925
+ $c-ticker-toggle-background: $var-background,
1926
+ $c-ticker-toggle-border-color: $var-muted,
1927
+ $c-ticker-toggle-icon-size: 0.5rem,
1928
+ $c-ticker-toggle-focus-outline: 2px solid $var-focus
1929
+ );
1930
+
1931
+ // Stagger list: the rows come in $motion-stagger apart, stacked with 0.5rem between them. The motion of each row (duration,
1932
+ // distance, easing) is the Animate one above, so this block comes after it. No colours.
1933
+ @use '@carissa-io/components-stagger-list/scss' as stagger-list with (
1934
+ $c-stagger-list-stagger: $motion-stagger,
1935
+ $c-stagger-list-gap: 0.5rem
1936
+ );