mlola-ui 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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mlola-ui",
3
- "version": "1.0.11",
3
+ "version": "1.0.13",
4
4
  "description": "Source-copy CLI that writes framework-free Mlola UI items into your project",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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` |
@@ -433,14 +433,14 @@
433
433
  {
434
434
  "path": "empty-cart.svg",
435
435
  "role": "source",
436
- "bytes": 4968,
437
- "integrity": "sha256-D0zyZvimuFagUT0ChqyBNp2hsCjAZ4Pv7RW6cJ37gcE="
436
+ "bytes": 4982,
437
+ "integrity": "sha256-8m4Z0HWSI7KRjDc6MSHRrCI1HwbiyynBmoxgCyo2DDw="
438
438
  },
439
439
  {
440
440
  "path": "empty-cart.tsx",
441
441
  "role": "react",
442
- "bytes": 5920,
443
- "integrity": "sha256-fapGlGqTLVX54EYazXYKN+vxVbbYN9RP3t4qDLnN1/g="
442
+ "bytes": 5934,
443
+ "integrity": "sha256-CFip8M6D6RJdYVGIwQ6H3HwWek/dHTq9ON98SeHjS4Q="
444
444
  }
445
445
  ]
446
446
  },
@@ -604,7 +604,7 @@
604
604
  "id": "inventory",
605
605
  "kind": "2d",
606
606
  "title": "Inventory",
607
- "summary": "Shelved parcels with labels, counted slots and an active stock marker.",
607
+ "summary": "An open shelf of labeled parcels, one empty slot and a tag marking the stock that is ready.",
608
608
  "tags": [
609
609
  "inventory",
610
610
  "warehouse",
@@ -615,14 +615,14 @@
615
615
  {
616
616
  "path": "inventory.svg",
617
617
  "role": "source",
618
- "bytes": 4558,
619
- "integrity": "sha256-lpe+xybY6if62AE7jyrc531zeQuQiZWvB6bZ8LNSAuE="
618
+ "bytes": 9461,
619
+ "integrity": "sha256-PrHqQsxeEtVKhftidsFZpr2XMIWx2oMgKhsd0dGKXSQ="
620
620
  },
621
621
  {
622
622
  "path": "inventory.tsx",
623
623
  "role": "react",
624
- "bytes": 5532,
625
- "integrity": "sha256-si0HLYrwRJ07wZH2lNuvUhxhhNGFtihT8S21fClz4sY="
624
+ "bytes": 10590,
625
+ "integrity": "sha256-WH+stRnsQsNF8bWuVpZAoqkjthF3JNM/FEQ3aw2G6Lg="
626
626
  }
627
627
  ]
628
628
  },
@@ -838,7 +838,7 @@
838
838
  "id": "offline",
839
839
  "kind": "2d",
840
840
  "title": "Offline",
841
- "summary": "A small wireless router and a disconnected cable. Connection paused, ready to reconnect.",
841
+ "summary": "A wireless router that has lost its signal and a disconnected cable. Connection paused, ready to reconnect.",
842
842
  "tags": [
843
843
  "error",
844
844
  "network",
@@ -849,14 +849,14 @@
849
849
  {
850
850
  "path": "offline.svg",
851
851
  "role": "source",
852
- "bytes": 4202,
853
- "integrity": "sha256-2sWn+8fJD4xEyp/D+Po2wAIUJVufv9EGmu4cQYmFCRg="
852
+ "bytes": 4560,
853
+ "integrity": "sha256-q0ZZ4EKo8a+56sIAtcGyjni7yVhxyD6yMYwSlDaWqRQ="
854
854
  },
855
855
  {
856
856
  "path": "offline.tsx",
857
857
  "role": "react",
858
- "bytes": 5132,
859
- "integrity": "sha256-4fui9gRQW3U+pMsibh1vg8b3jmHvnpxQRXqmAiSNA04="
858
+ "bytes": 5517,
859
+ "integrity": "sha256-G1ys9dW4cJg6CjD3Gj1aJ2InQus4zYClR45jExmITSg="
860
860
  }
861
861
  ]
862
862
  },
@@ -1707,14 +1707,14 @@
1707
1707
  {
1708
1708
  "path": "measuring-tape.glb",
1709
1709
  "role": "source",
1710
- "bytes": 592628,
1711
- "integrity": "sha256-gjp8OVIjpEbmo0zeegc7p9W+gkYGeNqwETxuBfE43Js="
1710
+ "bytes": 445392,
1711
+ "integrity": "sha256-VsiwX1rsnRBGeE28vd1LuoqIZSF5OVqvDjy9fgwbLNk="
1712
1712
  },
1713
1713
  {
1714
1714
  "path": "measuring-tape-poster.webp",
1715
1715
  "role": "poster",
1716
- "bytes": 16086,
1717
- "integrity": "sha256-Ygzmwy/ttH5//dWsBUTsR+4XGQlD/YpodjI6y9caXuo="
1716
+ "bytes": 18308,
1717
+ "integrity": "sha256-Nmmtp3upafknGSg3V57I1GEBf+yMRCBVBmIsSGXKlks="
1718
1718
  }
1719
1719
  ]
1720
1720
  },
@@ -1941,14 +1941,14 @@
1941
1941
  {
1942
1942
  "path": "task-lamp.glb",
1943
1943
  "role": "source",
1944
- "bytes": 283168,
1945
- "integrity": "sha256-hAolZPXrmhkMW0DjUx/aB4iXTEBm3YFDnoTzOqsMtMc="
1944
+ "bytes": 283120,
1945
+ "integrity": "sha256-mQVMpISa78gjVjYSbzsY9IOzZjTQVwl2n/YrCCdVOf0="
1946
1946
  },
1947
1947
  {
1948
1948
  "path": "task-lamp-poster.webp",
1949
1949
  "role": "poster",
1950
- "bytes": 16676,
1951
- "integrity": "sha256-KczARj6DGDO6U9YrYZ5LLTKCHK922mbXLvJtcmeMEfQ="
1950
+ "bytes": 17958,
1951
+ "integrity": "sha256-IQot+k4DZEqTkOknca5ZxH4dqPjpE4xyeJWxGANl6yM="
1952
1952
  }
1953
1953
  ]
1954
1954
  },
@@ -92,7 +92,6 @@
92
92
  "features",
93
93
  "contact",
94
94
  "welcome",
95
- "not-found",
96
95
  "release-notes"
97
96
  ],
98
97
  "templates": [
@@ -1254,17 +1253,6 @@
1254
1253
  "onboarding"
1255
1254
  ]
1256
1255
  },
1257
- {
1258
- "name": "not-found",
1259
- "type": "registry:page",
1260
- "title": "Not Found",
1261
- "description": "A not-found page with search, the usual destinations and a way back",
1262
- "category": "application",
1263
- "tags": [
1264
- "page",
1265
- "errors"
1266
- ]
1267
- },
1268
1256
  {
1269
1257
  "name": "release-notes",
1270
1258
  "type": "registry:page",
@@ -42,6 +42,7 @@
42
42
  "ml-brand-name",
43
43
  "ml-breadcrumb",
44
44
  "ml-breadcrumb-ellipsis",
45
+ "ml-breadcrumb-icon",
45
46
  "ml-breadcrumb-item",
46
47
  "ml-breadcrumb-link",
47
48
  "ml-breadcrumb-list",
@@ -580,6 +581,7 @@
580
581
  ]
581
582
  },
582
583
  "ml-carousel": {
584
+ "data-arrows": [],
583
585
  "data-playing": []
584
586
  },
585
587
  "ml-carousel-arrow": {
@@ -232,6 +232,10 @@
232
232
  "class": "ml-breadcrumb-page",
233
233
  "attributes": {}
234
234
  },
235
+ {
236
+ "class": "ml-breadcrumb-icon",
237
+ "attributes": {}
238
+ },
235
239
  {
236
240
  "class": "ml-breadcrumb-separator",
237
241
  "attributes": {}
@@ -362,11 +366,12 @@
362
366
  "carousel": {
363
367
  "needs": "script",
364
368
  "react": "import { Carousel } from \"@/components/ui/carousel\";\n\nconst slides = [\"Plan\", \"Build\", \"Ship\"].map((title) => (\n <div key={title} className=\"ml-card\" data-variant=\"elevated\">\n <div className=\"ml-card-content\">{title}</div>\n </div>\n));\n\nexport default function Example() {\n return <Carousel label=\"Release stages\" items={slides} itemLabels={[\"Plan\", \"Build\", \"Ship\"]} />;\n}",
365
- "html": "<div class=\"ml-carousel\" role=\"group\" aria-roledescription=\"carousel\" aria-label=\"Release stages\" style=\"--ml-carousel-per-view:1;--ml-carousel-peek:0px;--ml-carousel-min:0px;--ml-carousel-autoplay:0ms\">\n <div class=\"ml-carousel-viewport\">\n <div class=\"ml-carousel-track\" tabindex=\"0\" aria-label=\"Release stages, use the arrow keys\">\n <div class=\"ml-carousel-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"1 of 3: Plan\" data-current=\"true\">\n <div class=\"ml-card\" data-variant=\"elevated\"><div class=\"ml-card-content\">Plan</div></div>\n </div>\n <div class=\"ml-carousel-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"2 of 3: Build\">\n <div class=\"ml-card\" data-variant=\"elevated\"><div class=\"ml-card-content\">Build</div></div>\n </div>\n <div class=\"ml-carousel-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"3 of 3: Ship\">\n <div class=\"ml-card\" data-variant=\"elevated\"><div class=\"ml-card-content\">Ship</div></div>\n </div>\n </div>\n <button class=\"ml-carousel-arrow\" type=\"button\" data-side=\"previous\" aria-label=\"Previous slide\"><svg class=\"mlola-glyph\" width=\"1.1em\" height=\"1.1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"m15 18-6-6 6-6\" pathLength=\"1\"></path></svg></button>\n <button class=\"ml-carousel-arrow\" type=\"button\" data-side=\"next\" aria-label=\"Next slide\"><svg class=\"mlola-glyph\" width=\"1.1em\" height=\"1.1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"m9 18 6-6-6-6\" pathLength=\"1\"></path></svg></button>\n </div>\n <div class=\"ml-carousel-dots\" role=\"group\" aria-label=\"Choose release stages\">\n <button class=\"ml-carousel-dot\" type=\"button\" data-hit=\"expand\" aria-current=\"true\" aria-label=\"Plan\" tabindex=\"0\"></button>\n <button class=\"ml-carousel-dot\" type=\"button\" data-hit=\"expand\" aria-label=\"Build\" tabindex=\"-1\"></button>\n <button class=\"ml-carousel-dot\" type=\"button\" data-hit=\"expand\" aria-label=\"Ship\" tabindex=\"-1\"></button>\n </div>\n</div>",
369
+ "html": "<div class=\"ml-carousel\" role=\"group\" aria-roledescription=\"carousel\" aria-label=\"Release stages\" data-arrows=\"true\" style=\"--ml-carousel-per-view:1;--ml-carousel-peek:0px;--ml-carousel-min:0px;--ml-carousel-autoplay:0ms\">\n <div class=\"ml-carousel-viewport\">\n <div class=\"ml-carousel-track\" tabindex=\"0\" aria-label=\"Release stages, use the arrow keys\">\n <div class=\"ml-carousel-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"1 of 3: Plan\" data-current=\"true\">\n <div class=\"ml-card\" data-variant=\"elevated\"><div class=\"ml-card-content\">Plan</div></div>\n </div>\n <div class=\"ml-carousel-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"2 of 3: Build\">\n <div class=\"ml-card\" data-variant=\"elevated\"><div class=\"ml-card-content\">Build</div></div>\n </div>\n <div class=\"ml-carousel-slide\" role=\"group\" aria-roledescription=\"slide\" aria-label=\"3 of 3: Ship\">\n <div class=\"ml-card\" data-variant=\"elevated\"><div class=\"ml-card-content\">Ship</div></div>\n </div>\n </div>\n <button class=\"ml-carousel-arrow\" type=\"button\" data-side=\"previous\" aria-label=\"Previous slide\"><svg class=\"mlola-glyph\" width=\"1.1em\" height=\"1.1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"m15 18-6-6 6-6\" pathLength=\"1\"></path></svg></button>\n <button class=\"ml-carousel-arrow\" type=\"button\" data-side=\"next\" aria-label=\"Next slide\"><svg class=\"mlola-glyph\" width=\"1.1em\" height=\"1.1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"m9 18 6-6-6-6\" pathLength=\"1\"></path></svg></button>\n </div>\n <div class=\"ml-carousel-dots\" role=\"group\" aria-label=\"Choose release stages\">\n <button class=\"ml-carousel-dot\" type=\"button\" data-hit=\"expand\" aria-current=\"true\" aria-label=\"Plan\" tabindex=\"0\"></button>\n <button class=\"ml-carousel-dot\" type=\"button\" data-hit=\"expand\" aria-label=\"Build\" tabindex=\"-1\"></button>\n <button class=\"ml-carousel-dot\" type=\"button\" data-hit=\"expand\" aria-label=\"Ship\" tabindex=\"-1\"></button>\n </div>\n</div>",
366
370
  "elements": [
367
371
  {
368
372
  "class": "ml-carousel",
369
373
  "attributes": {
374
+ "data-arrows": [],
370
375
  "data-playing": []
371
376
  }
372
377
  },
@@ -2,7 +2,7 @@
2
2
  "$schema": "./schema/registry-index.schema.json",
3
3
  "schemaVersion": 2,
4
4
  "name": "mlola-ui",
5
- "version": "1.0.11",
5
+ "version": "1.0.13",
6
6
  "homepage": "https://ui.mlola.com",
7
7
  "themeContract": {
8
8
  "attribute": "data-theme",
@@ -177,8 +177,8 @@
177
177
  },
178
178
  "registryDependencies": [],
179
179
  "engineDependencies": {
180
- "@mlola-ui/behavior": "^1.0.11",
181
- "@mlola-ui/icons": "^1.0.11"
180
+ "@mlola-ui/behavior": "^1.0.13",
181
+ "@mlola-ui/icons": "^1.0.13"
182
182
  },
183
183
  "options": [
184
184
  {
@@ -239,7 +239,7 @@
239
239
  },
240
240
  "registryDependencies": [],
241
241
  "engineDependencies": {
242
- "@mlola-ui/icons": "^1.0.11"
242
+ "@mlola-ui/icons": "^1.0.13"
243
243
  },
244
244
  "options": [
245
245
  {
@@ -393,7 +393,7 @@
393
393
  },
394
394
  "registryDependencies": [],
395
395
  "engineDependencies": {
396
- "@mlola-ui/icons": "^1.0.11"
396
+ "@mlola-ui/icons": "^1.0.13"
397
397
  },
398
398
  "options": [
399
399
  {
@@ -485,7 +485,7 @@
485
485
  },
486
486
  "registryDependencies": [],
487
487
  "engineDependencies": {
488
- "@mlola-ui/icons": "^1.0.11"
488
+ "@mlola-ui/icons": "^1.0.13"
489
489
  },
490
490
  "options": [],
491
491
  "variants": [],
@@ -501,7 +501,7 @@
501
501
  "path": "packages/components/breadcrumb/breadcrumb.tsx",
502
502
  "target": "{{aliases.components}}/breadcrumb.tsx",
503
503
  "type": "registry:ui",
504
- "integrity": "sha256-Mt9mvmwwDgdp5/+mj5byIrh8+hicsp7R6UcvUlK0yog="
504
+ "integrity": "sha256-mxQpach2kFayT8H1vMt5252LQLxVV+sohdVXDhPuKoU="
505
505
  }
506
506
  ],
507
507
  "themeContract": {
@@ -538,7 +538,7 @@
538
538
  "spinner"
539
539
  ],
540
540
  "engineDependencies": {
541
- "@mlola-ui/motion": "^1.0.11"
541
+ "@mlola-ui/motion": "^1.0.13"
542
542
  },
543
543
  "options": [
544
544
  {
@@ -693,8 +693,8 @@
693
693
  },
694
694
  "registryDependencies": [],
695
695
  "engineDependencies": {
696
- "@mlola-ui/behavior": "^1.0.11",
697
- "@mlola-ui/icons": "^1.0.11"
696
+ "@mlola-ui/behavior": "^1.0.13",
697
+ "@mlola-ui/icons": "^1.0.13"
698
698
  },
699
699
  "options": [
700
700
  {
@@ -721,7 +721,7 @@
721
721
  "path": "packages/components/carousel/carousel.tsx",
722
722
  "target": "{{aliases.components}}/carousel.tsx",
723
723
  "type": "registry:ui",
724
- "integrity": "sha256-pamugpB6Ujt9Ylxd37jNF/ZwSb8iRkW/MoYe12nY3i4="
724
+ "integrity": "sha256-Gsw0LhQsOuvdQN/F2KDGVC/gJq53+ifLs19u95RWCoU="
725
725
  }
726
726
  ],
727
727
  "themeContract": {
@@ -756,7 +756,7 @@
756
756
  },
757
757
  "registryDependencies": [],
758
758
  "engineDependencies": {
759
- "@mlola-ui/icons": "^1.0.11"
759
+ "@mlola-ui/icons": "^1.0.13"
760
760
  },
761
761
  "options": [],
762
762
  "variants": [],
@@ -811,7 +811,7 @@
811
811
  "modal"
812
812
  ],
813
813
  "engineDependencies": {
814
- "@mlola-ui/icons": "^1.0.11"
814
+ "@mlola-ui/icons": "^1.0.13"
815
815
  },
816
816
  "options": [],
817
817
  "variants": [],
@@ -874,8 +874,8 @@
874
874
  },
875
875
  "registryDependencies": [],
876
876
  "engineDependencies": {
877
- "@mlola-ui/behavior": "^1.0.11",
878
- "@mlola-ui/icons": "^1.0.11"
877
+ "@mlola-ui/behavior": "^1.0.13",
878
+ "@mlola-ui/icons": "^1.0.13"
879
879
  },
880
880
  "options": [
881
881
  {
@@ -939,7 +939,7 @@
939
939
  "input"
940
940
  ],
941
941
  "engineDependencies": {
942
- "@mlola-ui/icons": "^1.0.11"
942
+ "@mlola-ui/icons": "^1.0.13"
943
943
  },
944
944
  "options": [],
945
945
  "variants": [],
@@ -1163,8 +1163,8 @@
1163
1163
  },
1164
1164
  "registryDependencies": [],
1165
1165
  "engineDependencies": {
1166
- "@mlola-ui/behavior": "^1.0.11",
1167
- "@mlola-ui/icons": "^1.0.11"
1166
+ "@mlola-ui/behavior": "^1.0.13",
1167
+ "@mlola-ui/icons": "^1.0.13"
1168
1168
  },
1169
1169
  "options": [
1170
1170
  {
@@ -1302,7 +1302,7 @@
1302
1302
  },
1303
1303
  "registryDependencies": [],
1304
1304
  "engineDependencies": {
1305
- "@mlola-ui/icons": "^1.0.11"
1305
+ "@mlola-ui/icons": "^1.0.13"
1306
1306
  },
1307
1307
  "options": [],
1308
1308
  "variants": [],
@@ -1353,7 +1353,7 @@
1353
1353
  },
1354
1354
  "registryDependencies": [],
1355
1355
  "engineDependencies": {
1356
- "@mlola-ui/behavior": "^1.0.11"
1356
+ "@mlola-ui/behavior": "^1.0.13"
1357
1357
  },
1358
1358
  "options": [
1359
1359
  {
@@ -1385,7 +1385,7 @@
1385
1385
  "path": "packages/components/_internal/anchor.ts",
1386
1386
  "target": "{{aliases.components}}/_internal/anchor.ts",
1387
1387
  "type": "registry:ui",
1388
- "integrity": "sha256-OPm/4Jf4UUo8IG+/4TAKpGDHtYpvxvGwyq3/RSZQIGc="
1388
+ "integrity": "sha256-/yW3RVjoY6QfTWnUYSeZ9rFkC9W4WGB1qop8Jp/H1r8="
1389
1389
  },
1390
1390
  {
1391
1391
  "path": "packages/components/_internal/floating.ts",
@@ -1722,7 +1722,7 @@
1722
1722
  },
1723
1723
  "registryDependencies": [],
1724
1724
  "engineDependencies": {
1725
- "@mlola-ui/behavior": "^1.0.11"
1725
+ "@mlola-ui/behavior": "^1.0.13"
1726
1726
  },
1727
1727
  "options": [],
1728
1728
  "variants": [],
@@ -1773,8 +1773,8 @@
1773
1773
  },
1774
1774
  "registryDependencies": [],
1775
1775
  "engineDependencies": {
1776
- "@mlola-ui/behavior": "^1.0.11",
1777
- "@mlola-ui/icons": "^1.0.11"
1776
+ "@mlola-ui/behavior": "^1.0.13",
1777
+ "@mlola-ui/icons": "^1.0.13"
1778
1778
  },
1779
1779
  "options": [
1780
1780
  {
@@ -1798,7 +1798,7 @@
1798
1798
  "path": "packages/components/_internal/anchor.ts",
1799
1799
  "target": "{{aliases.components}}/_internal/anchor.ts",
1800
1800
  "type": "registry:ui",
1801
- "integrity": "sha256-OPm/4Jf4UUo8IG+/4TAKpGDHtYpvxvGwyq3/RSZQIGc="
1801
+ "integrity": "sha256-/yW3RVjoY6QfTWnUYSeZ9rFkC9W4WGB1qop8Jp/H1r8="
1802
1802
  },
1803
1803
  {
1804
1804
  "path": "packages/components/_internal/floating.ts",
@@ -1851,8 +1851,8 @@
1851
1851
  },
1852
1852
  "registryDependencies": [],
1853
1853
  "engineDependencies": {
1854
- "@mlola-ui/behavior": "^1.0.11",
1855
- "@mlola-ui/icons": "^1.0.11"
1854
+ "@mlola-ui/behavior": "^1.0.13",
1855
+ "@mlola-ui/icons": "^1.0.13"
1856
1856
  },
1857
1857
  "options": [
1858
1858
  {
@@ -1984,7 +1984,7 @@
1984
1984
  },
1985
1985
  "registryDependencies": [],
1986
1986
  "engineDependencies": {
1987
- "@mlola-ui/behavior": "^1.0.11"
1987
+ "@mlola-ui/behavior": "^1.0.13"
1988
1988
  },
1989
1989
  "options": [
1990
1990
  {
@@ -2129,7 +2129,7 @@
2129
2129
  },
2130
2130
  "registryDependencies": [],
2131
2131
  "engineDependencies": {
2132
- "@mlola-ui/behavior": "^1.0.11"
2132
+ "@mlola-ui/behavior": "^1.0.13"
2133
2133
  },
2134
2134
  "options": [
2135
2135
  {
@@ -2255,7 +2255,7 @@
2255
2255
  },
2256
2256
  "registryDependencies": [],
2257
2257
  "engineDependencies": {
2258
- "@mlola-ui/icons": "^1.0.11"
2258
+ "@mlola-ui/icons": "^1.0.13"
2259
2259
  },
2260
2260
  "options": [
2261
2261
  {
@@ -2341,7 +2341,7 @@
2341
2341
  "spinner"
2342
2342
  ],
2343
2343
  "engineDependencies": {
2344
- "@mlola-ui/icons": "^1.0.11"
2344
+ "@mlola-ui/icons": "^1.0.13"
2345
2345
  },
2346
2346
  "options": [
2347
2347
  {
@@ -2483,7 +2483,9 @@
2483
2483
  "isDefault": false
2484
2484
  },
2485
2485
  "registryDependencies": [],
2486
- "engineDependencies": {},
2486
+ "engineDependencies": {
2487
+ "@mlola-ui/behavior": "^1.0.13"
2488
+ },
2487
2489
  "options": [
2488
2490
  {
2489
2491
  "component": "Tooltip",
@@ -2500,6 +2502,12 @@
2500
2502
  "variants": [],
2501
2503
  "sizes": [],
2502
2504
  "files": [
2505
+ {
2506
+ "path": "packages/components/_internal/anchor.ts",
2507
+ "target": "{{aliases.components}}/_internal/anchor.ts",
2508
+ "type": "registry:ui",
2509
+ "integrity": "sha256-/yW3RVjoY6QfTWnUYSeZ9rFkC9W4WGB1qop8Jp/H1r8="
2510
+ },
2503
2511
  {
2504
2512
  "path": "packages/components/_internal/react.ts",
2505
2513
  "target": "{{aliases.components}}/_internal/react.ts",
@@ -2510,7 +2518,7 @@
2510
2518
  "path": "packages/components/tooltip/tooltip.tsx",
2511
2519
  "target": "{{aliases.components}}/tooltip.tsx",
2512
2520
  "type": "registry:ui",
2513
- "integrity": "sha256-NbaOUmlUbBlUIdovchrWwH2QqzuvXB97DjnJnrHf4Gc="
2521
+ "integrity": "sha256-hplqwWF/ZqQQ9oyoErrOA3VjkRCDCbqwt5xgZOdsFcA="
2514
2522
  }
2515
2523
  ],
2516
2524
  "themeContract": {
@@ -2615,7 +2623,7 @@
2615
2623
  },
2616
2624
  "registryDependencies": [],
2617
2625
  "engineDependencies": {
2618
- "@mlola-ui/icons": "^1.0.11"
2626
+ "@mlola-ui/icons": "^1.0.13"
2619
2627
  },
2620
2628
  "options": [
2621
2629
  {
@@ -2687,7 +2695,7 @@
2687
2695
  "popover"
2688
2696
  ],
2689
2697
  "engineDependencies": {
2690
- "@mlola-ui/icons": "^1.0.11"
2698
+ "@mlola-ui/icons": "^1.0.13"
2691
2699
  },
2692
2700
  "options": [
2693
2701
  {
@@ -2757,7 +2765,7 @@
2757
2765
  "popover"
2758
2766
  ],
2759
2767
  "engineDependencies": {
2760
- "@mlola-ui/icons": "^1.0.11"
2768
+ "@mlola-ui/icons": "^1.0.13"
2761
2769
  },
2762
2770
  "options": [],
2763
2771
  "variants": [],
@@ -2955,7 +2963,7 @@
2955
2963
  "input"
2956
2964
  ],
2957
2965
  "engineDependencies": {
2958
- "@mlola-ui/icons": "^1.0.11"
2966
+ "@mlola-ui/icons": "^1.0.13"
2959
2967
  },
2960
2968
  "options": [
2961
2969
  {
@@ -3032,7 +3040,7 @@
3032
3040
  "input"
3033
3041
  ],
3034
3042
  "engineDependencies": {
3035
- "@mlola-ui/icons": "^1.0.11"
3043
+ "@mlola-ui/icons": "^1.0.13"
3036
3044
  },
3037
3045
  "options": [],
3038
3046
  "variants": [],
@@ -3087,7 +3095,7 @@
3087
3095
  "input"
3088
3096
  ],
3089
3097
  "engineDependencies": {
3090
- "@mlola-ui/icons": "^1.0.11"
3098
+ "@mlola-ui/icons": "^1.0.13"
3091
3099
  },
3092
3100
  "options": [],
3093
3101
  "variants": [],
@@ -3150,7 +3158,7 @@
3150
3158
  "popover"
3151
3159
  ],
3152
3160
  "engineDependencies": {
3153
- "@mlola-ui/icons": "^1.0.11"
3161
+ "@mlola-ui/icons": "^1.0.13"
3154
3162
  },
3155
3163
  "options": [
3156
3164
  {
@@ -3220,7 +3228,7 @@
3220
3228
  },
3221
3229
  "registryDependencies": [],
3222
3230
  "engineDependencies": {
3223
- "@mlola-ui/icons": "^1.0.11"
3231
+ "@mlola-ui/icons": "^1.0.13"
3224
3232
  },
3225
3233
  "options": [
3226
3234
  {
@@ -3339,8 +3347,8 @@
3339
3347
  },
3340
3348
  "registryDependencies": [],
3341
3349
  "engineDependencies": {
3342
- "@mlola-ui/behavior": "^1.0.11",
3343
- "@mlola-ui/icons": "^1.0.11"
3350
+ "@mlola-ui/behavior": "^1.0.13",
3351
+ "@mlola-ui/icons": "^1.0.13"
3344
3352
  },
3345
3353
  "options": [],
3346
3354
  "variants": [],
@@ -3350,7 +3358,7 @@
3350
3358
  "path": "packages/components/_internal/anchor.ts",
3351
3359
  "target": "{{aliases.components}}/_internal/anchor.ts",
3352
3360
  "type": "registry:ui",
3353
- "integrity": "sha256-OPm/4Jf4UUo8IG+/4TAKpGDHtYpvxvGwyq3/RSZQIGc="
3361
+ "integrity": "sha256-/yW3RVjoY6QfTWnUYSeZ9rFkC9W4WGB1qop8Jp/H1r8="
3354
3362
  },
3355
3363
  {
3356
3364
  "path": "packages/components/_internal/floating.ts",
@@ -3404,7 +3412,7 @@
3404
3412
  },
3405
3413
  "registryDependencies": [],
3406
3414
  "engineDependencies": {
3407
- "@mlola-ui/behavior": "^1.0.11"
3415
+ "@mlola-ui/behavior": "^1.0.13"
3408
3416
  },
3409
3417
  "options": [
3410
3418
  {
@@ -3436,7 +3444,7 @@
3436
3444
  "path": "packages/components/_internal/anchor.ts",
3437
3445
  "target": "{{aliases.components}}/_internal/anchor.ts",
3438
3446
  "type": "registry:ui",
3439
- "integrity": "sha256-OPm/4Jf4UUo8IG+/4TAKpGDHtYpvxvGwyq3/RSZQIGc="
3447
+ "integrity": "sha256-/yW3RVjoY6QfTWnUYSeZ9rFkC9W4WGB1qop8Jp/H1r8="
3440
3448
  },
3441
3449
  {
3442
3450
  "path": "packages/components/_internal/floating.ts",
@@ -3491,8 +3499,8 @@
3491
3499
  },
3492
3500
  "registryDependencies": [],
3493
3501
  "engineDependencies": {
3494
- "@mlola-ui/behavior": "^1.0.11",
3495
- "@mlola-ui/icons": "^1.0.11"
3502
+ "@mlola-ui/behavior": "^1.0.13",
3503
+ "@mlola-ui/icons": "^1.0.13"
3496
3504
  },
3497
3505
  "options": [],
3498
3506
  "variants": [],
@@ -3502,7 +3510,7 @@
3502
3510
  "path": "packages/components/_internal/anchor.ts",
3503
3511
  "target": "{{aliases.components}}/_internal/anchor.ts",
3504
3512
  "type": "registry:ui",
3505
- "integrity": "sha256-OPm/4Jf4UUo8IG+/4TAKpGDHtYpvxvGwyq3/RSZQIGc="
3513
+ "integrity": "sha256-/yW3RVjoY6QfTWnUYSeZ9rFkC9W4WGB1qop8Jp/H1r8="
3506
3514
  },
3507
3515
  {
3508
3516
  "path": "packages/components/_internal/floating.ts",
@@ -3560,7 +3568,7 @@
3560
3568
  "sheet"
3561
3569
  ],
3562
3570
  "engineDependencies": {
3563
- "@mlola-ui/icons": "^1.0.11"
3571
+ "@mlola-ui/icons": "^1.0.13"
3564
3572
  },
3565
3573
  "options": [],
3566
3574
  "variants": [],
@@ -3677,7 +3685,7 @@
3677
3685
  "button"
3678
3686
  ],
3679
3687
  "engineDependencies": {
3680
- "@mlola-ui/icons": "^1.0.11"
3688
+ "@mlola-ui/icons": "^1.0.13"
3681
3689
  },
3682
3690
  "options": [
3683
3691
  {
@@ -3772,8 +3780,8 @@
3772
3780
  "input"
3773
3781
  ],
3774
3782
  "engineDependencies": {
3775
- "@mlola-ui/behavior": "^1.0.11",
3776
- "@mlola-ui/icons": "^1.0.11"
3783
+ "@mlola-ui/behavior": "^1.0.13",
3784
+ "@mlola-ui/icons": "^1.0.13"
3777
3785
  },
3778
3786
  "options": [
3779
3787
  {
@@ -2,4 +2,4 @@
2
2
  * Where a floating layer goes next to its anchor. The math is shared with the
3
3
  * framework-free runtime, so it lives in @mlola-ui/behavior/logic.
4
4
  */
5
- export { placeFloating, type Align, type Placement, type Rect, type Side } from "@mlola-ui/behavior/logic";
5
+ export { fitTooltip, placeFloating, type Align, type Placement, type Rect, type Side } from "@mlola-ui/behavior/logic";
@@ -4,7 +4,15 @@ import * as React from "react";
4
4
  import { cx } from "../_internal/react";
5
5
  import { IconChevronRight } from "@mlola-ui/icons";
6
6
 
7
- export type BreadcrumbItemType = { label: string; href?: string };
7
+ export type BreadcrumbItemType = {
8
+ label: string;
9
+ /** A link to the page. */
10
+ href?: string;
11
+ /** In-app navigation without a URL; the item becomes a button. */
12
+ onSelect?: () => void;
13
+ /** A decorative mark before the label, such as a page's icon. */
14
+ icon?: React.ReactNode;
15
+ };
8
16
  type BreadcrumbProps = { items: BreadcrumbItemType[]; separator?: React.ReactNode; className?: string };
9
17
 
10
18
  const BreadcrumbList = React.forwardRef<HTMLOListElement, React.OlHTMLAttributes<HTMLOListElement>>(
@@ -29,6 +37,8 @@ function BreadcrumbEllipsis({ className }: { className?: string }) {
29
37
  return <span aria-hidden="true" className={cx("ml-breadcrumb-ellipsis", className)}>…</span>;
30
38
  }
31
39
 
40
+ const icon = (item: BreadcrumbItemType) => (item.icon ? <span aria-hidden="true" className="ml-breadcrumb-icon">{item.icon}</span> : null);
41
+
32
42
  export function Breadcrumb({ items, separator, className }: BreadcrumbProps) {
33
43
  const last = items.length - 1;
34
44
  const collapse = items.length > 3;
@@ -46,9 +56,13 @@ export function Breadcrumb({ items, separator, className }: BreadcrumbProps) {
46
56
  </BreadcrumbItem>
47
57
  ) : null}
48
58
  <BreadcrumbItem data-collapsible={middle && collapse ? "" : undefined}>
49
- {current || !item.href
50
- ? <BreadcrumbPage>{item.label}</BreadcrumbPage>
51
- : <BreadcrumbLink href={item.href}>{item.label}</BreadcrumbLink>}
59
+ {current || (!item.href && !item.onSelect) ? (
60
+ <BreadcrumbPage>{icon(item)}{item.label}</BreadcrumbPage>
61
+ ) : item.href ? (
62
+ <BreadcrumbLink href={item.href}>{icon(item)}{item.label}</BreadcrumbLink>
63
+ ) : (
64
+ <button type="button" className="ml-breadcrumb-link" data-hit="expand" onClick={item.onSelect}>{icon(item)}{item.label}</button>
65
+ )}
52
66
  {!current ? <BreadcrumbSeparator>{separator}</BreadcrumbSeparator> : null}
53
67
  </BreadcrumbItem>
54
68
  </React.Fragment>
@@ -180,6 +180,7 @@ export function Carousel({
180
180
  aria-roledescription="carousel"
181
181
  aria-label={label}
182
182
  data-playing={playing || undefined}
183
+ data-arrows={(arrows && positions > 1) || undefined}
183
184
  style={{ ...style, "--ml-carousel-per-view": view, "--ml-carousel-peek": peek ?? "0px", "--ml-carousel-min": minSlideWidth ?? "0px", "--ml-carousel-autoplay": `${autoplay ?? 0}ms` } as React.CSSProperties}
184
185
  onPointerEnter={() => setPaused(true)}
185
186
  onPointerLeave={() => setPaused(false)}
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import * as React from "react";
4
+ import { fitTooltip, type Side } from "../_internal/anchor";
4
5
  import { cx } from "../_internal/react";
5
6
 
6
7
  export type TooltipPlacement = "top" | "bottom" | "left" | "right";
@@ -14,6 +15,10 @@ interface TooltipProps {
14
15
 
15
16
  function Tooltip({ content, placement = "top", delay = 200, children, className }: TooltipProps) {
16
17
  const [open, setOpen] = React.useState(false);
18
+ // Where it actually opens: the asked side, flipped or slid to stay on screen.
19
+ const [fit, setFit] = React.useState<{ side: Side; shift: number }>({ side: placement, shift: 0 });
20
+ const root = React.useRef<HTMLSpanElement>(null);
21
+ const tip = React.useRef<HTMLSpanElement>(null);
17
22
  const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);
18
23
  const id = React.useId();
19
24
  const clear = () => {
@@ -29,6 +34,17 @@ function Tooltip({ content, placement = "top", delay = 200, children, className
29
34
  setOpen(false);
30
35
  };
31
36
  React.useEffect(() => clear, []);
37
+ React.useLayoutEffect(() => {
38
+ const anchor = root.current?.firstElementChild ?? root.current;
39
+ if (!open || !anchor || !tip.current) {
40
+ setFit({ side: placement, shift: 0 });
41
+ return;
42
+ }
43
+ const a = anchor.getBoundingClientRect();
44
+ // Layout size, not the painted box: the pop-in animation starts scaled down.
45
+ const t = { width: tip.current.offsetWidth, height: tip.current.offsetHeight };
46
+ setFit(fitTooltip({ x: a.left, y: a.top, width: a.width, height: a.height }, t, { width: document.documentElement.clientWidth, height: window.innerHeight }, placement));
47
+ }, [open, placement]);
32
48
  React.useEffect(() => {
33
49
  if (!open) return;
34
50
  const onKeyDown = (event: KeyboardEvent) => {
@@ -55,10 +71,18 @@ function Tooltip({ content, placement = "top", delay = 200, children, className
55
71
  : childProps["aria-describedby"],
56
72
  } as Record<string, unknown>);
57
73
  return (
58
- <span className="ml-tooltip-root" onMouseEnter={clear} onMouseLeave={hide}>
74
+ <span ref={root} className="ml-tooltip-root" onMouseEnter={clear} onMouseLeave={hide}>
59
75
  {trigger}
60
76
  {open ? (
61
- <span id={id} role="tooltip" data-side={placement} data-state="open" className={cx("ml-tooltip", className)}>
77
+ <span
78
+ ref={tip}
79
+ id={id}
80
+ role="tooltip"
81
+ data-side={fit.side}
82
+ data-state="open"
83
+ className={cx("ml-tooltip", className)}
84
+ style={{ "--ml-tooltip-shift": `${fit.shift}px` } as React.CSSProperties}
85
+ >
62
86
  {content}
63
87
  <span aria-hidden="true" className="ml-tooltip-arrow" />
64
88
  </span>
@@ -1,5 +1,5 @@
1
1
  {
2
- "packages/components/_internal/anchor.ts": "sha256-OPm/4Jf4UUo8IG+/4TAKpGDHtYpvxvGwyq3/RSZQIGc=",
2
+ "packages/components/_internal/anchor.ts": "sha256-/yW3RVjoY6QfTWnUYSeZ9rFkC9W4WGB1qop8Jp/H1r8=",
3
3
  "packages/components/_internal/clipboard.ts": "sha256-0y5p88CTXWuOrUYlC5J4XP1VCrOwkx9jYWVHmD2LouQ=",
4
4
  "packages/components/_internal/dialog.ts": "sha256-796y3oNOVWarLvICTdi+d0/2axqSrzLVJiyBeh9X7bU=",
5
5
  "packages/components/_internal/floating.ts": "sha256-+WxgC4CtAlSr2qA1EkoDTgto535XLIPsvtOfdOK6CHk=",
@@ -13,12 +13,12 @@
13
13
  "packages/components/app-shell/app-shell.tsx": "sha256-XAq82XOTH3ZR+hxTkYFu8P7Ih2aI6ERy/TpXc2VMUwM=",
14
14
  "packages/components/avatar/avatar.tsx": "sha256-EjqC8ytKqRtsTVdK6vncaDfhO/i7ICe+jwaYCg5bjIw=",
15
15
  "packages/components/badge/badge.tsx": "sha256-flEH8S2jZ/64n3Y/ROhC9+9rvF7wXaN0xLcMMwqNOVQ=",
16
- "packages/components/breadcrumb/breadcrumb.tsx": "sha256-Mt9mvmwwDgdp5/+mj5byIrh8+hicsp7R6UcvUlK0yog=",
16
+ "packages/components/breadcrumb/breadcrumb.tsx": "sha256-mxQpach2kFayT8H1vMt5252LQLxVV+sohdVXDhPuKoU=",
17
17
  "packages/components/button/button.tsx": "sha256-sXVANbGeFSYPHpiWuPvHHqMoPjG0zl0HSsKEdTgl5ME=",
18
18
  "packages/components/calendar/calendar.tsx": "sha256-rWiS4YAueZfVoo6j5Fi3uN7A+yApe5U6HMm1woTVjys=",
19
19
  "packages/components/calendar/dates.ts": "sha256-mygYkoC70av2ZQ0vkxf885trwW97Wd10I4dptYQe+4A=",
20
20
  "packages/components/card/card.tsx": "sha256-aMKbv5DWYYWq7GZAFR9O1fuYE0H61WCjkvEbRMOd894=",
21
- "packages/components/carousel/carousel.tsx": "sha256-pamugpB6Ujt9Ylxd37jNF/ZwSb8iRkW/MoYe12nY3i4=",
21
+ "packages/components/carousel/carousel.tsx": "sha256-Gsw0LhQsOuvdQN/F2KDGVC/gJq53+ifLs19u95RWCoU=",
22
22
  "packages/components/checkbox/checkbox.tsx": "sha256-hz4YbGwOxv/aJpJHrLXR4MKSWJGyjzoJEIGvdhyML9M=",
23
23
  "packages/components/color-picker/color-picker.tsx": "sha256-E+QB6MbSxg+3AZX3A7bOkst4arxgpmFL2ZmochoWCl8=",
24
24
  "packages/components/color-picker/color.ts": "sha256-YqSgYjzn7XfPWAHuyzbwOhbg/ScaSfB7V73e9w+OjJs=",
@@ -64,7 +64,7 @@
64
64
  "packages/components/timeline/timeline.tsx": "sha256-nVg7lBcAUAzqEb0YrHagJXSaHE2aWWE9bUbQMWQY6PU=",
65
65
  "packages/components/toast/toast.tsx": "sha256-f0DwN0XuV46fSsQf3i9RJcfQbAs2mSz7A8UJoIIICHg=",
66
66
  "packages/components/toggle/toggle.tsx": "sha256-8qPHeSliHNdzQS7OLJ47BrvRR75MYyUGJlK4s21XS/U=",
67
- "packages/components/tooltip/tooltip.tsx": "sha256-NbaOUmlUbBlUIdovchrWwH2QqzuvXB97DjnJnrHf4Gc=",
67
+ "packages/components/tooltip/tooltip.tsx": "sha256-hplqwWF/ZqQQ9oyoErrOA3VjkRCDCbqwt5xgZOdsFcA=",
68
68
  "packages/components/tour/tour.tsx": "sha256-mrAE8aVDBVIibGvQah9Gh3mzIiWDFxB6aObzqFo5xXU=",
69
69
  "packages/components/virtual-list/virtual-list.tsx": "sha256-raGEFn4HlAOIohqZcy0DgptsnUIPS/6bWLYeTe+M9E8=",
70
70
  "packages/components/virtual-list/virtual.ts": "sha256-PyDIj3C2Vwb1i4ZssxSlYjgKmZPBIFLZFNq8YCW2Z78="