@mlola-ui/engine 1.0.11 → 1.0.13

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.
@@ -341,7 +341,7 @@
341
341
  },
342
342
  {
343
343
  "name": "ml-page-shell",
344
- "note": "A full page: header, main and footer stacked on the page background."
344
+ "note": "The navigation, main and footer are grid items; they may be narrower than their widest content (a table that scrolls), so the page never does."
345
345
  },
346
346
  {
347
347
  "name": "ml-person",
@@ -131,7 +131,7 @@ component, so a page built from them themes with the rest.
131
131
 
132
132
  - `.ml-check-list` — A list of benefits, each after a check. Pricing tiers and feature rows share it.
133
133
  - `.ml-link` — A glyph inside a link flows with the text instead of breaking the line.
134
- - `.ml-page-shell` — A full page: header, main and footer stacked on the page background.
134
+ - `.ml-page-shell` — The navigation, main and footer are grid items; they may be narrower than their widest content (a table that scrolls), so the page never does.
135
135
  - `.ml-section` — A section a link jumps to clears the sticky navigation bar.
136
136
 
137
137
  ## Elements and their attributes
@@ -168,6 +168,7 @@ correct. This table is read out of the stylesheet, so it is never stale.
168
168
  | `.ml-calendar-day` | `data-unreachable` | _presence only_ |
169
169
  | `.ml-card` | `data-interactive` | _presence only_ |
170
170
  | `.ml-card` | `data-variant` | `elevated`, `glass`, `specular` |
171
+ | `.ml-carousel` | `data-arrows` | _presence only_ |
171
172
  | `.ml-carousel` | `data-playing` | _presence only_ |
172
173
  | `.ml-carousel-arrow` | `data-side` | `next`, `previous` |
173
174
  | `.ml-carousel-dot` | `aria-current` | `true` |
@@ -1431,14 +1431,14 @@
1431
1431
  {
1432
1432
  "path": "empty-cart.svg",
1433
1433
  "role": "source",
1434
- "bytes": 4968,
1435
- "integrity": "sha256-D0zyZvimuFagUT0ChqyBNp2hsCjAZ4Pv7RW6cJ37gcE="
1434
+ "bytes": 4982,
1435
+ "integrity": "sha256-8m4Z0HWSI7KRjDc6MSHRrCI1HwbiyynBmoxgCyo2DDw="
1436
1436
  },
1437
1437
  {
1438
1438
  "path": "empty-cart.tsx",
1439
1439
  "role": "react",
1440
- "bytes": 5920,
1441
- "integrity": "sha256-fapGlGqTLVX54EYazXYKN+vxVbbYN9RP3t4qDLnN1/g="
1440
+ "bytes": 5934,
1441
+ "integrity": "sha256-CFip8M6D6RJdYVGIwQ6H3HwWek/dHTq9ON98SeHjS4Q="
1442
1442
  }
1443
1443
  ],
1444
1444
  "themeable": true,
@@ -1617,7 +1617,7 @@
1617
1617
  "id": "inventory",
1618
1618
  "kind": "2d",
1619
1619
  "title": "Inventory",
1620
- "summary": "Shelved parcels with labels, counted slots and an active stock marker.",
1620
+ "summary": "An open shelf of labeled parcels, one empty slot and a tag marking the stock that is ready.",
1621
1621
  "tags": [
1622
1622
  "inventory",
1623
1623
  "warehouse",
@@ -1627,14 +1627,14 @@
1627
1627
  {
1628
1628
  "path": "inventory.svg",
1629
1629
  "role": "source",
1630
- "bytes": 4558,
1631
- "integrity": "sha256-lpe+xybY6if62AE7jyrc531zeQuQiZWvB6bZ8LNSAuE="
1630
+ "bytes": 9461,
1631
+ "integrity": "sha256-PrHqQsxeEtVKhftidsFZpr2XMIWx2oMgKhsd0dGKXSQ="
1632
1632
  },
1633
1633
  {
1634
1634
  "path": "inventory.tsx",
1635
1635
  "role": "react",
1636
- "bytes": 5532,
1637
- "integrity": "sha256-si0HLYrwRJ07wZH2lNuvUhxhhNGFtihT8S21fClz4sY="
1636
+ "bytes": 10590,
1637
+ "integrity": "sha256-WH+stRnsQsNF8bWuVpZAoqkjthF3JNM/FEQ3aw2G6Lg="
1638
1638
  }
1639
1639
  ],
1640
1640
  "themeable": true,
@@ -1869,7 +1869,7 @@
1869
1869
  "id": "offline",
1870
1870
  "kind": "2d",
1871
1871
  "title": "Offline",
1872
- "summary": "A small wireless router and a disconnected cable. Connection paused, ready to reconnect.",
1872
+ "summary": "A wireless router that has lost its signal and a disconnected cable. Connection paused, ready to reconnect.",
1873
1873
  "tags": [
1874
1874
  "error",
1875
1875
  "network",
@@ -1879,14 +1879,14 @@
1879
1879
  {
1880
1880
  "path": "offline.svg",
1881
1881
  "role": "source",
1882
- "bytes": 4202,
1883
- "integrity": "sha256-2sWn+8fJD4xEyp/D+Po2wAIUJVufv9EGmu4cQYmFCRg="
1882
+ "bytes": 4560,
1883
+ "integrity": "sha256-q0ZZ4EKo8a+56sIAtcGyjni7yVhxyD6yMYwSlDaWqRQ="
1884
1884
  },
1885
1885
  {
1886
1886
  "path": "offline.tsx",
1887
1887
  "role": "react",
1888
- "bytes": 5132,
1889
- "integrity": "sha256-4fui9gRQW3U+pMsibh1vg8b3jmHvnpxQRXqmAiSNA04="
1888
+ "bytes": 5517,
1889
+ "integrity": "sha256-G1ys9dW4cJg6CjD3Gj1aJ2InQus4zYClR45jExmITSg="
1890
1890
  }
1891
1891
  ],
1892
1892
  "themeable": true,
@@ -2897,14 +2897,14 @@
2897
2897
  {
2898
2898
  "path": "measuring-tape.glb",
2899
2899
  "role": "source",
2900
- "bytes": 592628,
2901
- "integrity": "sha256-gjp8OVIjpEbmo0zeegc7p9W+gkYGeNqwETxuBfE43Js="
2900
+ "bytes": 445392,
2901
+ "integrity": "sha256-VsiwX1rsnRBGeE28vd1LuoqIZSF5OVqvDjy9fgwbLNk="
2902
2902
  },
2903
2903
  {
2904
2904
  "path": "measuring-tape-poster.webp",
2905
2905
  "role": "poster",
2906
- "bytes": 16086,
2907
- "integrity": "sha256-Ygzmwy/ttH5//dWsBUTsR+4XGQlD/YpodjI6y9caXuo="
2906
+ "bytes": 18308,
2907
+ "integrity": "sha256-Nmmtp3upafknGSg3V57I1GEBf+yMRCBVBmIsSGXKlks="
2908
2908
  }
2909
2909
  ],
2910
2910
  "themeable": true,
@@ -3209,14 +3209,14 @@
3209
3209
  {
3210
3210
  "path": "task-lamp.glb",
3211
3211
  "role": "source",
3212
- "bytes": 283168,
3213
- "integrity": "sha256-hAolZPXrmhkMW0DjUx/aB4iXTEBm3YFDnoTzOqsMtMc="
3212
+ "bytes": 283120,
3213
+ "integrity": "sha256-mQVMpISa78gjVjYSbzsY9IOzZjTQVwl2n/YrCCdVOf0="
3214
3214
  },
3215
3215
  {
3216
3216
  "path": "task-lamp-poster.webp",
3217
3217
  "role": "poster",
3218
- "bytes": 16676,
3219
- "integrity": "sha256-KczARj6DGDO6U9YrYZ5LLTKCHK922mbXLvJtcmeMEfQ="
3218
+ "bytes": 17958,
3219
+ "integrity": "sha256-IQot+k4DZEqTkOknca5ZxH4dqPjpE4xyeJWxGANl6yM="
3220
3220
  }
3221
3221
  ],
3222
3222
  "themeable": true,
@@ -114,6 +114,7 @@
114
114
  ]
115
115
  },
116
116
  "ml-carousel": {
117
+ "data-arrows": [],
117
118
  "data-playing": []
118
119
  },
119
120
  "ml-carousel-arrow": {
@@ -170,6 +170,9 @@
170
170
 
171
171
  .ml-section {
172
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;
173
176
  }
174
177
 
175
178
  /* A section a link jumps to clears the sticky navigation bar. */
@@ -579,6 +582,12 @@
579
582
  color: var(--ml-text);
580
583
  }
581
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
+
582
591
  /* components/accordion */
583
592
  .ml-accordion {
584
593
  width: 100%;
@@ -1437,15 +1446,41 @@
1437
1446
 
1438
1447
  .ml-breadcrumb-item {
1439
1448
  display: inline-flex;
1449
+ min-width: 0;
1440
1450
  align-items: center;
1441
1451
  gap: var(--ml-space-1-5);
1442
1452
  }
1443
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
+
1444
1466
  .ml-breadcrumb-link {
1445
1467
  color: var(--ml-text-muted);
1446
1468
  text-decoration: none;
1447
1469
  }
1448
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
+
1449
1484
  .ml-breadcrumb-link:hover {
1450
1485
  color: var(--ml-text);
1451
1486
  }
@@ -1961,7 +1996,24 @@
1961
1996
  height: 100%;
1962
1997
  }
1963
1998
 
1964
- /* 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. */
1965
2017
  .ml-carousel-arrow {
1966
2018
  position: absolute;
1967
2019
  top: 50%;
@@ -2100,6 +2152,7 @@
2100
2152
  grid-template-columns: auto 1fr;
2101
2153
  gap: var(--ml-space-1-5) var(--ml-space-3);
2102
2154
  align-items: start;
2155
+ align-content: start;
2103
2156
  }
2104
2157
 
2105
2158
  .ml-checkbox-control {
@@ -3089,6 +3142,7 @@
3089
3142
  .ml-dropzone-root {
3090
3143
  display: grid;
3091
3144
  gap: var(--ml-space-2);
3145
+ align-content: start;
3092
3146
  }
3093
3147
 
3094
3148
  .ml-dropzone {
@@ -3327,6 +3381,8 @@
3327
3381
  grid-template-columns: minmax(0, 1fr);
3328
3382
  gap: var(--ml-space-1-5);
3329
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;
3330
3386
  }
3331
3387
 
3332
3388
  .ml-input,
@@ -3672,9 +3728,12 @@
3672
3728
  border-inline-start: var(--ml-border-width) solid var(--ml-border-subtle);
3673
3729
  }
3674
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. */
3675
3733
  .ml-number-input-step {
3676
3734
  display: inline-grid;
3677
- width: var(--ml-control-md);
3735
+ min-width: var(--ml-control-md);
3736
+ aspect-ratio: 1;
3678
3737
  place-items: center;
3679
3738
  padding: 0;
3680
3739
  border: 0;
@@ -3972,6 +4031,7 @@
3972
4031
  display: grid;
3973
4032
  gap: var(--ml-space-2);
3974
4033
  width: 100%;
4034
+ align-content: start;
3975
4035
  }
3976
4036
 
3977
4037
  .ml-progress-root[data-tone="info"] {
@@ -4319,6 +4379,7 @@
4319
4379
  display: grid;
4320
4380
  gap: var(--ml-space-3);
4321
4381
  width: 100%;
4382
+ align-content: start;
4322
4383
  }
4323
4384
 
4324
4385
  .ml-radio-group[data-orientation="horizontal"] .ml-radio-group-items {
@@ -4340,6 +4401,7 @@
4340
4401
  .ml-radio-group-items {
4341
4402
  display: grid;
4342
4403
  gap: var(--ml-space-2-5);
4404
+ align-content: start;
4343
4405
  }
4344
4406
 
4345
4407
  /* components/rating */
@@ -5032,6 +5094,7 @@
5032
5094
  display: grid;
5033
5095
  gap: var(--ml-space-2-5);
5034
5096
  width: 100%;
5097
+ align-content: start;
5035
5098
  }
5036
5099
 
5037
5100
  .ml-slider-header {
@@ -5380,6 +5443,9 @@ button.ml-stepper-target:focus-visible {
5380
5443
 
5381
5444
  /* components/table */
5382
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;
5383
5449
  width: 100%;
5384
5450
  overflow-x: auto;
5385
5451
  border: var(--ml-border-width) solid var(--ml-border-subtle);
@@ -6466,8 +6532,12 @@ button.ml-stepper-target:focus-visible {
6466
6532
  font-size: var(--ml-type-xs);
6467
6533
  font-weight: 500;
6468
6534
  line-height: 1.4;
6469
- white-space: nowrap;
6535
+ /* One line when it fits; a long tip wraps within the window instead of running past it. */
6536
+ width: max-content;
6537
+ max-width: min(20rem, calc(100vw - 2 * var(--ml-space-2)));
6538
+ white-space: normal;
6470
6539
  pointer-events: none;
6540
+ /* Placement uses `translate`, so the pop-in's transform adds to it instead of replacing it mid-animation. */
6471
6541
  animation: ml-pop-in var(--ml-duration-fast) var(--ml-ease-spring);
6472
6542
  }
6473
6543
 
@@ -6475,25 +6545,25 @@ button.ml-stepper-target:focus-visible {
6475
6545
  .ml-tooltip:not([data-side]) {
6476
6546
  bottom: calc(100% + var(--ml-space-2));
6477
6547
  left: 50%;
6478
- transform: translateX(-50%);
6548
+ translate: calc(-50% + var(--ml-tooltip-shift, 0px)) 0;
6479
6549
  }
6480
6550
 
6481
6551
  .ml-tooltip[data-side="bottom"] {
6482
6552
  top: calc(100% + var(--ml-space-2));
6483
6553
  left: 50%;
6484
- transform: translateX(-50%);
6554
+ translate: calc(-50% + var(--ml-tooltip-shift, 0px)) 0;
6485
6555
  }
6486
6556
 
6487
6557
  .ml-tooltip[data-side="left"] {
6488
6558
  right: calc(100% + var(--ml-space-2));
6489
6559
  top: 50%;
6490
- transform: translateY(-50%);
6560
+ translate: 0 calc(-50% + var(--ml-tooltip-shift, 0px));
6491
6561
  }
6492
6562
 
6493
6563
  .ml-tooltip[data-side="right"] {
6494
6564
  left: calc(100% + var(--ml-space-2));
6495
6565
  top: 50%;
6496
- transform: translateY(-50%);
6566
+ translate: 0 calc(-50% + var(--ml-tooltip-shift, 0px));
6497
6567
  }
6498
6568
 
6499
6569
  .ml-tooltip-arrow {
@@ -6508,13 +6578,26 @@ button.ml-stepper-target:focus-visible {
6508
6578
  .ml-tooltip:not([data-side]) .ml-tooltip-arrow {
6509
6579
  bottom: -.2rem;
6510
6580
  left: 50%;
6511
- margin-left: calc(var(--ml-space-1) * -1);
6581
+ margin-left: calc(var(--ml-space-1) * -1 - var(--ml-tooltip-shift, 0px));
6512
6582
  }
6513
6583
 
6514
6584
  .ml-tooltip[data-side="bottom"] .ml-tooltip-arrow {
6515
6585
  top: -.2rem;
6516
6586
  left: 50%;
6517
- margin-left: calc(var(--ml-space-1) * -1);
6587
+ margin-left: calc(var(--ml-space-1) * -1 - var(--ml-tooltip-shift, 0px));
6588
+ }
6589
+
6590
+ /* The arrow slides back by the tooltip's shift, so it keeps pointing at the trigger. */
6591
+ .ml-tooltip[data-side="left"] .ml-tooltip-arrow {
6592
+ right: -.2rem;
6593
+ top: 50%;
6594
+ margin-top: calc(var(--ml-space-1) * -1 - var(--ml-tooltip-shift, 0px));
6595
+ }
6596
+
6597
+ .ml-tooltip[data-side="right"] .ml-tooltip-arrow {
6598
+ left: -.2rem;
6599
+ top: 50%;
6600
+ margin-top: calc(var(--ml-space-1) * -1 - var(--ml-tooltip-shift, 0px));
6518
6601
  }
6519
6602
 
6520
6603
  /* components/tour */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mlola-ui/engine",
3
- "version": "1.0.11",
3
+ "version": "1.0.13",
4
4
  "description": "Framework-free CSS, spring easings, and the machine-readable contract for Mlola UI",
5
5
  "type": "module",
6
6
  "sideEffects": [