@mlola-ui/tokens 1.0.10 → 1.0.12

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.
@@ -145,8 +145,39 @@
145
145
  gap: var(--ml-space-2);
146
146
  }
147
147
 
148
+ /* A list of benefits, each after a check. Pricing tiers and feature rows share it. */
149
+ .ml-check-list {
150
+ margin: 0;
151
+ padding: 0;
152
+ list-style: none;
153
+ display: grid;
154
+ gap: var(--ml-space-2);
155
+ }
156
+
157
+ .ml-check-list li {
158
+ display: flex;
159
+ align-items: flex-start;
160
+ gap: var(--ml-space-2);
161
+ font-size: var(--ml-type-base);
162
+ color: var(--ml-text-muted);
163
+ }
164
+
165
+ .ml-check-list li > svg {
166
+ flex: none;
167
+ margin-top: 0.2em;
168
+ color: var(--ml-success-text);
169
+ }
170
+
148
171
  .ml-section {
149
172
  padding-block: clamp(3.5rem,8vw,6.5rem);
173
+ /* A section is a grid or flex item in a page shell; without this, a wide
174
+ table inside it widens the whole page instead of scrolling in place. */
175
+ min-width: 0;
176
+ }
177
+
178
+ /* A section a link jumps to clears the sticky navigation bar. */
179
+ .ml-section[id] {
180
+ scroll-margin-block-start: calc(var(--ml-control-md) + var(--ml-space-6));
150
181
  }
151
182
 
152
183
  .ml-section-shell {
@@ -551,6 +582,12 @@
551
582
  color: var(--ml-text);
552
583
  }
553
584
 
585
+ /* The navigation, main and footer are grid items; they may be narrower than
586
+ their widest content (a table that scrolls), so the page never does. */
587
+ .ml-page-shell > * {
588
+ min-width: 0;
589
+ }
590
+
554
591
  /* components/accordion */
555
592
  .ml-accordion {
556
593
  width: 100%;
@@ -1409,15 +1446,41 @@
1409
1446
 
1410
1447
  .ml-breadcrumb-item {
1411
1448
  display: inline-flex;
1449
+ min-width: 0;
1412
1450
  align-items: center;
1413
1451
  gap: var(--ml-space-1-5);
1414
1452
  }
1415
1453
 
1454
+ /* Links, in-app buttons and the current page share one shape; a long title shortens instead of breaking the bar. */
1455
+ .ml-breadcrumb-link,
1456
+ .ml-breadcrumb-page {
1457
+ display: inline-flex;
1458
+ align-items: center;
1459
+ gap: var(--ml-space-1);
1460
+ min-width: 0;
1461
+ overflow: hidden;
1462
+ text-overflow: ellipsis;
1463
+ white-space: nowrap;
1464
+ }
1465
+
1416
1466
  .ml-breadcrumb-link {
1417
1467
  color: var(--ml-text-muted);
1418
1468
  text-decoration: none;
1419
1469
  }
1420
1470
 
1471
+ button.ml-breadcrumb-link {
1472
+ padding: 0;
1473
+ border: 0;
1474
+ border-radius: var(--ml-radius-xs);
1475
+ background: none;
1476
+ font: inherit;
1477
+ cursor: pointer;
1478
+ }
1479
+
1480
+ .ml-breadcrumb-icon {
1481
+ flex: none;
1482
+ }
1483
+
1421
1484
  .ml-breadcrumb-link:hover {
1422
1485
  color: var(--ml-text);
1423
1486
  }
@@ -1933,7 +1996,24 @@
1933
1996
  height: 100%;
1934
1997
  }
1935
1998
 
1936
- /* Arrows float over the edges and come forward when the reader is near. */
1999
+ /* With a pointer that hovers, the arrows sit in a gutter beside the slides,
2000
+ never over them. On touch the reader swipes, the arrows stay hidden until
2001
+ focused, and the slides keep the full width. */
2002
+ @media (hover: hover) and (pointer: fine) {
2003
+ .ml-carousel[data-arrows] .ml-carousel-viewport {
2004
+ padding-inline: calc(var(--ml-control-md) + var(--ml-space-3));
2005
+ }
2006
+
2007
+ .ml-carousel[data-arrows] .ml-carousel-arrow[data-side="previous"] {
2008
+ left: 0;
2009
+ }
2010
+
2011
+ .ml-carousel[data-arrows] .ml-carousel-arrow[data-side="next"] {
2012
+ right: 0;
2013
+ }
2014
+ }
2015
+
2016
+ /* The arrows come forward when the reader is near. */
1937
2017
  .ml-carousel-arrow {
1938
2018
  position: absolute;
1939
2019
  top: 50%;
@@ -2072,6 +2152,7 @@
2072
2152
  grid-template-columns: auto 1fr;
2073
2153
  gap: var(--ml-space-1-5) var(--ml-space-3);
2074
2154
  align-items: start;
2155
+ align-content: start;
2075
2156
  }
2076
2157
 
2077
2158
  .ml-checkbox-control {
@@ -3061,6 +3142,7 @@
3061
3142
  .ml-dropzone-root {
3062
3143
  display: grid;
3063
3144
  gap: var(--ml-space-2);
3145
+ align-content: start;
3064
3146
  }
3065
3147
 
3066
3148
  .ml-dropzone {
@@ -3299,6 +3381,8 @@
3299
3381
  grid-template-columns: minmax(0, 1fr);
3300
3382
  gap: var(--ml-space-1-5);
3301
3383
  width: 100%;
3384
+ /* In a form row taller than itself, a field keeps its own height instead of stretching its label and control apart. */
3385
+ align-content: start;
3302
3386
  }
3303
3387
 
3304
3388
  .ml-input,
@@ -3449,6 +3533,13 @@
3449
3533
  pointer-events: none;
3450
3534
  }
3451
3535
 
3536
+ /* A text affix ("https://", a domain, a unit) reads at the size of what is typed beside it. */
3537
+ .ml-input-leading,
3538
+ .ml-input-trailing {
3539
+ font-size: var(--ml-type-base);
3540
+ line-height: var(--ml-leading-snug);
3541
+ }
3542
+
3452
3543
  /* components/kbd */
3453
3544
  .ml-kbd {
3454
3545
  display: inline-grid;
@@ -3637,9 +3728,12 @@
3637
3728
  border-inline-start: var(--ml-border-width) solid var(--ml-border-subtle);
3638
3729
  }
3639
3730
 
3731
+ /* Square at any height: where touch sizing makes the field taller, the steps
3732
+ grow with it instead of stretching into tall slivers. */
3640
3733
  .ml-number-input-step {
3641
3734
  display: inline-grid;
3642
- width: var(--ml-control-md);
3735
+ min-width: var(--ml-control-md);
3736
+ aspect-ratio: 1;
3643
3737
  place-items: center;
3644
3738
  padding: 0;
3645
3739
  border: 0;
@@ -3937,6 +4031,7 @@
3937
4031
  display: grid;
3938
4032
  gap: var(--ml-space-2);
3939
4033
  width: 100%;
4034
+ align-content: start;
3940
4035
  }
3941
4036
 
3942
4037
  .ml-progress-root[data-tone="info"] {
@@ -4284,6 +4379,7 @@
4284
4379
  display: grid;
4285
4380
  gap: var(--ml-space-3);
4286
4381
  width: 100%;
4382
+ align-content: start;
4287
4383
  }
4288
4384
 
4289
4385
  .ml-radio-group[data-orientation="horizontal"] .ml-radio-group-items {
@@ -4305,6 +4401,7 @@
4305
4401
  .ml-radio-group-items {
4306
4402
  display: grid;
4307
4403
  gap: var(--ml-space-2-5);
4404
+ align-content: start;
4308
4405
  }
4309
4406
 
4310
4407
  /* components/rating */
@@ -4486,6 +4583,8 @@
4486
4583
  position: relative;
4487
4584
  display: grid;
4488
4585
  grid-template-columns: minmax(0, 1fr);
4586
+ /* In a form row taller than itself, the trigger keeps a field's height instead of stretching. */
4587
+ align-content: start;
4489
4588
  gap: var(--ml-space-1-5);
4490
4589
  width: 100%;
4491
4590
  min-width: 0;
@@ -4510,6 +4609,10 @@
4510
4609
  border: var(--ml-border-width) solid var(--ml-border);
4511
4610
  border-radius: var(--ml-radius-md);
4512
4611
  box-shadow: var(--ml-shadow-xs);
4612
+ /* The same type as a text field, so a select and an input sit level in a row. */
4613
+ font-family: var(--ml-font-sans);
4614
+ font-size: var(--ml-type-base);
4615
+ line-height: var(--ml-leading-snug);
4513
4616
  cursor: pointer;
4514
4617
  text-align: start;
4515
4618
  transition: border-color var(--ml-duration-fast),box-shadow var(--ml-duration-fast);
@@ -4991,6 +5094,7 @@
4991
5094
  display: grid;
4992
5095
  gap: var(--ml-space-2-5);
4993
5096
  width: 100%;
5097
+ align-content: start;
4994
5098
  }
4995
5099
 
4996
5100
  .ml-slider-header {
@@ -5339,6 +5443,9 @@ button.ml-stepper-target:focus-visible {
5339
5443
 
5340
5444
  /* components/table */
5341
5445
  .ml-table-container {
5446
+ /* The containing block for anything positioned inside, such as visually
5447
+ hidden cell text, so it scrolls with the table instead of widening the page. */
5448
+ position: relative;
5342
5449
  width: 100%;
5343
5450
  overflow-x: auto;
5344
5451
  border: var(--ml-border-width) solid var(--ml-border-subtle);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mlola-ui/tokens",
3
- "version": "1.0.10",
3
+ "version": "1.0.12",
4
4
  "description": "Stable CSS entry for the framework-free Mlola UI design system",
5
5
  "main": "tokens.css",
6
6
  "sideEffects": [