@ansh-ui/vue 0.2.0 → 0.3.0
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/dist/{chunk-B6OXKW5Q.js → chunk-AL4PPK25.js} +5 -2
- package/dist/chunk-AL4PPK25.js.map +1 -0
- package/dist/{chunk-5BQEZYG6.cjs → chunk-FK536ZUI.cjs} +15 -15
- package/dist/{chunk-5BQEZYG6.cjs.map → chunk-FK536ZUI.cjs.map} +1 -1
- package/dist/{chunk-TMG3M6TK.js → chunk-G2OX2NH2.js} +3 -3
- package/dist/chunk-G2OX2NH2.js.map +1 -0
- package/dist/{chunk-2VSROZ2N.js → chunk-HIVA75XC.js} +3 -3
- package/dist/{chunk-2VSROZ2N.js.map → chunk-HIVA75XC.js.map} +1 -1
- package/dist/{chunk-KCA7RNJ4.cjs → chunk-IHH6KMBY.cjs} +239 -5
- package/dist/chunk-IHH6KMBY.cjs.map +1 -0
- package/dist/{chunk-IOXGBPOV.cjs → chunk-IK3E4MPB.cjs} +3 -3
- package/dist/chunk-IK3E4MPB.cjs.map +1 -0
- package/dist/{chunk-SOYRICHU.js → chunk-LRTNIUAG.js} +3 -3
- package/dist/chunk-LRTNIUAG.js.map +1 -0
- package/dist/{chunk-EISHOEB6.cjs → chunk-MWGVDY6K.cjs} +3 -3
- package/dist/chunk-MWGVDY6K.cjs.map +1 -0
- package/dist/{chunk-T425FIC7.js → chunk-NKRPZTQA.js} +238 -5
- package/dist/chunk-NKRPZTQA.js.map +1 -0
- package/dist/{chunk-JQ4YLXXM.cjs → chunk-PNR4RQ4T.cjs} +5 -2
- package/dist/chunk-PNR4RQ4T.cjs.map +1 -0
- package/dist/data.d.cts +15 -14
- package/dist/data.d.ts +15 -14
- package/dist/form.cjs +36 -36
- package/dist/form.d.cts +32 -31
- package/dist/form.d.ts +32 -31
- package/dist/form.js +1 -1
- package/dist/index.cjs +159 -131
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +33 -8
- package/dist/index.d.ts +33 -8
- package/dist/index.js +27 -11
- package/dist/index.js.map +1 -1
- package/dist/layout.cjs +13 -13
- package/dist/layout.d.cts +24 -15
- package/dist/layout.d.ts +24 -15
- package/dist/layout.js +1 -1
- package/dist/motion.d.cts +14 -13
- package/dist/motion.d.ts +14 -13
- package/dist/navigation.cjs +13 -9
- package/dist/navigation.d.cts +124 -3
- package/dist/navigation.d.ts +124 -3
- package/dist/navigation.js +2 -2
- package/dist/overlay.cjs +14 -14
- package/dist/overlay.d.cts +9 -8
- package/dist/overlay.d.ts +9 -8
- package/dist/overlay.js +2 -2
- package/dist/{position-Cn7qP1pn.d.cts → position-CiY171HP.d.cts} +2 -1
- package/dist/{position-Cn7qP1pn.d.ts → position-CiY171HP.d.ts} +2 -1
- package/dist/primitives.cjs +6 -6
- package/dist/primitives.d.cts +6 -5
- package/dist/primitives.d.ts +6 -5
- package/dist/primitives.js +1 -1
- package/dist/{sidebar-CTZ-Ckko.d.ts → sidebar-B9zDHMbn.d.cts} +5 -4
- package/dist/{sidebar-CQqEmpid.d.cts → sidebar-DMrKHqZ5.d.ts} +5 -4
- package/dist/styles.css +464 -0
- package/dist/{utils-IKPG3zcC.d.cts → utils-D4XwXDeX.d.cts} +2 -1
- package/dist/{utils-IKPG3zcC.d.ts → utils-D4XwXDeX.d.ts} +2 -1
- package/package.json +3 -3
- package/dist/chunk-B6OXKW5Q.js.map +0 -1
- package/dist/chunk-EISHOEB6.cjs.map +0 -1
- package/dist/chunk-IOXGBPOV.cjs.map +0 -1
- package/dist/chunk-JQ4YLXXM.cjs.map +0 -1
- package/dist/chunk-KCA7RNJ4.cjs.map +0 -1
- package/dist/chunk-SOYRICHU.js.map +0 -1
- package/dist/chunk-T425FIC7.js.map +0 -1
- package/dist/chunk-TMG3M6TK.js.map +0 -1
package/dist/styles.css
CHANGED
|
@@ -1312,6 +1312,353 @@
|
|
|
1312
1312
|
}
|
|
1313
1313
|
}
|
|
1314
1314
|
|
|
1315
|
+
/* ==========================================================================
|
|
1316
|
+
Motion UI — presentation components with motion of their own.
|
|
1317
|
+
|
|
1318
|
+
Split out of `components.css`, which is already ~830 lines. Everything here targets a plain
|
|
1319
|
+
`ansh-*` class or a `data-*` attribute and contains nothing React-specific, so it is shared
|
|
1320
|
+
verbatim with `@ansh-ui/vue`'s build the same way every other stylesheet in this directory is.
|
|
1321
|
+
========================================================================== */
|
|
1322
|
+
|
|
1323
|
+
/* --- Rotating headline word ---------------------------------------------- */
|
|
1324
|
+
|
|
1325
|
+
/*
|
|
1326
|
+
* Deliberately NOT `overflow: hidden` on this element. An inline-level box with clipped overflow
|
|
1327
|
+
* is baseline-aligned by its bottom margin edge rather than by its text, which drops the rotating
|
|
1328
|
+
* word below the line of the sentence containing it. The clipping happens on `__clip` instead,
|
|
1329
|
+
* which is absolutely positioned and so takes no part in baseline alignment.
|
|
1330
|
+
*/
|
|
1331
|
+
.ansh-rotate {
|
|
1332
|
+
position: relative;
|
|
1333
|
+
display: inline-block;
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1336
|
+
/*
|
|
1337
|
+
* The width and baseline holder, in normal flow. `visibility: hidden` rather than `display: none`
|
|
1338
|
+
* — a display-none element contributes no size, which would defeat the point of measuring the
|
|
1339
|
+
* longest word.
|
|
1340
|
+
*/
|
|
1341
|
+
.ansh-rotate__sizer {
|
|
1342
|
+
display: grid;
|
|
1343
|
+
grid-template-areas: 'word';
|
|
1344
|
+
visibility: hidden;
|
|
1345
|
+
pointer-events: none;
|
|
1346
|
+
}
|
|
1347
|
+
|
|
1348
|
+
.ansh-rotate__ghost {
|
|
1349
|
+
grid-area: word;
|
|
1350
|
+
white-space: nowrap;
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1353
|
+
.ansh-rotate__clip {
|
|
1354
|
+
position: absolute;
|
|
1355
|
+
inset: 0;
|
|
1356
|
+
overflow: hidden;
|
|
1357
|
+
}
|
|
1358
|
+
|
|
1359
|
+
.ansh-rotate__word {
|
|
1360
|
+
display: inline-block;
|
|
1361
|
+
white-space: nowrap;
|
|
1362
|
+
will-change: transform, opacity;
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
|
+
.ansh-rotate[data-animation='slide'] .ansh-rotate__word {
|
|
1366
|
+
animation: ansh-rotate-slide var(--ansh-duration-slow, 420ms) var(--ansh-ease-emphasized) both;
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
.ansh-rotate[data-animation='fade'] .ansh-rotate__word {
|
|
1370
|
+
animation: ansh-rotate-fade var(--ansh-duration-slow, 420ms) var(--ansh-ease-standard) both;
|
|
1371
|
+
}
|
|
1372
|
+
|
|
1373
|
+
.ansh-rotate[data-animation='flip'] .ansh-rotate__word {
|
|
1374
|
+
animation: ansh-rotate-flip var(--ansh-duration-slow, 420ms) var(--ansh-ease-emphasized) both;
|
|
1375
|
+
transform-origin: 50% 0;
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1378
|
+
@keyframes ansh-rotate-slide {
|
|
1379
|
+
from {
|
|
1380
|
+
transform: translateY(100%);
|
|
1381
|
+
opacity: 0;
|
|
1382
|
+
}
|
|
1383
|
+
to {
|
|
1384
|
+
transform: translateY(0);
|
|
1385
|
+
opacity: 1;
|
|
1386
|
+
}
|
|
1387
|
+
}
|
|
1388
|
+
|
|
1389
|
+
@keyframes ansh-rotate-fade {
|
|
1390
|
+
from {
|
|
1391
|
+
opacity: 0;
|
|
1392
|
+
}
|
|
1393
|
+
to {
|
|
1394
|
+
opacity: 1;
|
|
1395
|
+
}
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
@keyframes ansh-rotate-flip {
|
|
1399
|
+
from {
|
|
1400
|
+
transform: rotateX(-90deg);
|
|
1401
|
+
opacity: 0;
|
|
1402
|
+
}
|
|
1403
|
+
to {
|
|
1404
|
+
transform: rotateX(0);
|
|
1405
|
+
opacity: 1;
|
|
1406
|
+
}
|
|
1407
|
+
}
|
|
1408
|
+
|
|
1409
|
+
/* --- Before/after comparison --------------------------------------------- */
|
|
1410
|
+
|
|
1411
|
+
.ansh-compare {
|
|
1412
|
+
position: relative;
|
|
1413
|
+
overflow: hidden;
|
|
1414
|
+
border-radius: var(--ansh-radius-lg);
|
|
1415
|
+
/* Without this a drag that starts on the surface scrolls the page on touch instead of moving
|
|
1416
|
+
the divider — the single most common defect in comparison sliders on mobile. */
|
|
1417
|
+
touch-action: none;
|
|
1418
|
+
user-select: none;
|
|
1419
|
+
}
|
|
1420
|
+
|
|
1421
|
+
.ansh-compare__layer {
|
|
1422
|
+
position: absolute;
|
|
1423
|
+
inset: 0;
|
|
1424
|
+
}
|
|
1425
|
+
|
|
1426
|
+
.ansh-compare__layer > * {
|
|
1427
|
+
width: 100%;
|
|
1428
|
+
height: 100%;
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
/*
|
|
1432
|
+
* The revealed layer sits above and is clipped. Clipping rather than resizing is what keeps its
|
|
1433
|
+
* contents from reflowing as the handle moves.
|
|
1434
|
+
*/
|
|
1435
|
+
.ansh-compare__layer--before {
|
|
1436
|
+
z-index: 1;
|
|
1437
|
+
}
|
|
1438
|
+
|
|
1439
|
+
.ansh-compare__handle {
|
|
1440
|
+
position: absolute;
|
|
1441
|
+
top: 0;
|
|
1442
|
+
bottom: 0;
|
|
1443
|
+
z-index: 2;
|
|
1444
|
+
width: 2px;
|
|
1445
|
+
margin-left: -1px;
|
|
1446
|
+
background: var(--ansh-content-primary);
|
|
1447
|
+
cursor: ew-resize;
|
|
1448
|
+
touch-action: none;
|
|
1449
|
+
}
|
|
1450
|
+
|
|
1451
|
+
.ansh-compare__handle:focus-visible {
|
|
1452
|
+
outline: 2px solid var(--ansh-border-focus);
|
|
1453
|
+
outline-offset: 2px;
|
|
1454
|
+
}
|
|
1455
|
+
|
|
1456
|
+
.ansh-compare__grip {
|
|
1457
|
+
position: absolute;
|
|
1458
|
+
top: 50%;
|
|
1459
|
+
left: 50%;
|
|
1460
|
+
width: 2.25rem;
|
|
1461
|
+
height: 2.25rem;
|
|
1462
|
+
transform: translate(-50%, -50%);
|
|
1463
|
+
border-radius: var(--ansh-radius-full);
|
|
1464
|
+
background: var(--ansh-content-primary);
|
|
1465
|
+
box-shadow: var(--ansh-shadow-lg);
|
|
1466
|
+
}
|
|
1467
|
+
|
|
1468
|
+
/* The double chevron, drawn with borders so no icon asset or SVG is needed. */
|
|
1469
|
+
.ansh-compare__grip::before,
|
|
1470
|
+
.ansh-compare__grip::after {
|
|
1471
|
+
content: '';
|
|
1472
|
+
position: absolute;
|
|
1473
|
+
top: 50%;
|
|
1474
|
+
width: 0.4rem;
|
|
1475
|
+
height: 0.4rem;
|
|
1476
|
+
border-top: 2px solid var(--ansh-surface-canvas);
|
|
1477
|
+
border-right: 2px solid var(--ansh-surface-canvas);
|
|
1478
|
+
}
|
|
1479
|
+
|
|
1480
|
+
.ansh-compare__grip::before {
|
|
1481
|
+
left: 30%;
|
|
1482
|
+
transform: translate(0, -50%) rotate(-135deg);
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
.ansh-compare__grip::after {
|
|
1486
|
+
right: 30%;
|
|
1487
|
+
transform: translate(0, -50%) rotate(45deg);
|
|
1488
|
+
}
|
|
1489
|
+
|
|
1490
|
+
.ansh-compare[data-dragging] {
|
|
1491
|
+
cursor: ew-resize;
|
|
1492
|
+
}
|
|
1493
|
+
|
|
1494
|
+
/* --- Device / browser mockup --------------------------------------------- */
|
|
1495
|
+
|
|
1496
|
+
.ansh-mock {
|
|
1497
|
+
display: flex;
|
|
1498
|
+
flex-direction: column;
|
|
1499
|
+
overflow: hidden;
|
|
1500
|
+
background: var(--ansh-surface-raised);
|
|
1501
|
+
border: 1px solid var(--ansh-border-default);
|
|
1502
|
+
box-shadow: var(--ansh-shadow-lg);
|
|
1503
|
+
}
|
|
1504
|
+
|
|
1505
|
+
.ansh-mock--browser,
|
|
1506
|
+
.ansh-mock--window {
|
|
1507
|
+
border-radius: var(--ansh-radius-lg);
|
|
1508
|
+
}
|
|
1509
|
+
|
|
1510
|
+
.ansh-mock__chrome {
|
|
1511
|
+
display: flex;
|
|
1512
|
+
align-items: center;
|
|
1513
|
+
gap: var(--ansh-space-3);
|
|
1514
|
+
padding: var(--ansh-space-3) var(--ansh-space-4);
|
|
1515
|
+
background: var(--ansh-surface-sunken);
|
|
1516
|
+
border-bottom: 1px solid var(--ansh-border-subtle);
|
|
1517
|
+
}
|
|
1518
|
+
|
|
1519
|
+
.ansh-mock__dots {
|
|
1520
|
+
display: flex;
|
|
1521
|
+
gap: var(--ansh-space-2);
|
|
1522
|
+
flex-shrink: 0;
|
|
1523
|
+
}
|
|
1524
|
+
|
|
1525
|
+
.ansh-mock__dots i {
|
|
1526
|
+
width: 0.7rem;
|
|
1527
|
+
height: 0.7rem;
|
|
1528
|
+
border-radius: var(--ansh-radius-full);
|
|
1529
|
+
background: var(--ansh-border-strong);
|
|
1530
|
+
}
|
|
1531
|
+
|
|
1532
|
+
.ansh-mock__url,
|
|
1533
|
+
.ansh-mock__title {
|
|
1534
|
+
flex: 1;
|
|
1535
|
+
min-width: 0;
|
|
1536
|
+
overflow: hidden;
|
|
1537
|
+
text-overflow: ellipsis;
|
|
1538
|
+
white-space: nowrap;
|
|
1539
|
+
font-size: var(--ansh-text-xs);
|
|
1540
|
+
color: var(--ansh-content-tertiary);
|
|
1541
|
+
}
|
|
1542
|
+
|
|
1543
|
+
.ansh-mock__url {
|
|
1544
|
+
padding: var(--ansh-space-1) var(--ansh-space-3);
|
|
1545
|
+
border-radius: var(--ansh-radius-full);
|
|
1546
|
+
background: var(--ansh-surface-raised);
|
|
1547
|
+
font-family: var(--ansh-font-mono);
|
|
1548
|
+
}
|
|
1549
|
+
|
|
1550
|
+
.ansh-mock__title {
|
|
1551
|
+
text-align: center;
|
|
1552
|
+
}
|
|
1553
|
+
|
|
1554
|
+
.ansh-mock__screen {
|
|
1555
|
+
flex: 1;
|
|
1556
|
+
min-height: 0;
|
|
1557
|
+
overflow: hidden;
|
|
1558
|
+
background: var(--ansh-surface-canvas);
|
|
1559
|
+
}
|
|
1560
|
+
|
|
1561
|
+
/* The phone frame: a thick bezel and a notch, no chrome bar. */
|
|
1562
|
+
.ansh-mock--phone {
|
|
1563
|
+
border-radius: 2.25rem;
|
|
1564
|
+
border-width: 0.6rem;
|
|
1565
|
+
border-color: var(--ansh-content-primary);
|
|
1566
|
+
padding: 0;
|
|
1567
|
+
position: relative;
|
|
1568
|
+
}
|
|
1569
|
+
|
|
1570
|
+
.ansh-mock--phone .ansh-mock__screen {
|
|
1571
|
+
border-radius: 1.7rem;
|
|
1572
|
+
}
|
|
1573
|
+
|
|
1574
|
+
.ansh-mock__notch {
|
|
1575
|
+
position: absolute;
|
|
1576
|
+
top: 0;
|
|
1577
|
+
left: 50%;
|
|
1578
|
+
transform: translateX(-50%);
|
|
1579
|
+
z-index: 2;
|
|
1580
|
+
width: 38%;
|
|
1581
|
+
height: 1.1rem;
|
|
1582
|
+
border-radius: 0 0 var(--ansh-radius-lg) var(--ansh-radius-lg);
|
|
1583
|
+
background: var(--ansh-content-primary);
|
|
1584
|
+
}
|
|
1585
|
+
|
|
1586
|
+
/* --- Card stack ----------------------------------------------------------- */
|
|
1587
|
+
|
|
1588
|
+
.ansh-stack {
|
|
1589
|
+
display: flex;
|
|
1590
|
+
flex-direction: column;
|
|
1591
|
+
gap: var(--ansh-space-4);
|
|
1592
|
+
}
|
|
1593
|
+
|
|
1594
|
+
.ansh-stack__deck {
|
|
1595
|
+
position: relative;
|
|
1596
|
+
display: grid;
|
|
1597
|
+
/* One cell: every card stacks in it, and the tallest card sets the height so the deck does not
|
|
1598
|
+
resize as cards advance. */
|
|
1599
|
+
grid-template-areas: 'card';
|
|
1600
|
+
isolation: isolate;
|
|
1601
|
+
}
|
|
1602
|
+
|
|
1603
|
+
.ansh-stack__card {
|
|
1604
|
+
grid-area: card;
|
|
1605
|
+
transition:
|
|
1606
|
+
transform var(--ansh-duration-slow, 420ms) var(--ansh-ease-emphasized),
|
|
1607
|
+
opacity var(--ansh-duration-slow, 420ms) var(--ansh-ease-standard);
|
|
1608
|
+
will-change: transform, opacity;
|
|
1609
|
+
}
|
|
1610
|
+
|
|
1611
|
+
.ansh-stack__controls {
|
|
1612
|
+
display: flex;
|
|
1613
|
+
align-items: center;
|
|
1614
|
+
justify-content: center;
|
|
1615
|
+
gap: var(--ansh-space-3);
|
|
1616
|
+
}
|
|
1617
|
+
|
|
1618
|
+
.ansh-stack__button {
|
|
1619
|
+
display: grid;
|
|
1620
|
+
place-items: center;
|
|
1621
|
+
width: 2rem;
|
|
1622
|
+
height: 2rem;
|
|
1623
|
+
border-radius: var(--ansh-radius-full);
|
|
1624
|
+
border: 1px solid var(--ansh-border-default);
|
|
1625
|
+
background: var(--ansh-surface-raised);
|
|
1626
|
+
color: var(--ansh-content-secondary);
|
|
1627
|
+
font: inherit;
|
|
1628
|
+
font-size: var(--ansh-text-lg);
|
|
1629
|
+
line-height: 1;
|
|
1630
|
+
cursor: pointer;
|
|
1631
|
+
}
|
|
1632
|
+
|
|
1633
|
+
.ansh-stack__button:hover {
|
|
1634
|
+
border-color: var(--ansh-border-strong);
|
|
1635
|
+
color: var(--ansh-content-primary);
|
|
1636
|
+
}
|
|
1637
|
+
|
|
1638
|
+
.ansh-stack__count {
|
|
1639
|
+
font-family: var(--ansh-font-mono);
|
|
1640
|
+
font-size: var(--ansh-text-xs);
|
|
1641
|
+
color: var(--ansh-content-tertiary);
|
|
1642
|
+
min-width: 3.5rem;
|
|
1643
|
+
text-align: center;
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1646
|
+
/*
|
|
1647
|
+
* Reduced motion. The library's kernel handles JS-driven motion, but these components animate in
|
|
1648
|
+
* CSS, so they need their own guard — `@ansh-ui/tokens` neutralises durations globally, and this
|
|
1649
|
+
* additionally removes the transform travel so cards and words change in place rather than
|
|
1650
|
+
* snapping across a distance in 0.01ms.
|
|
1651
|
+
*/
|
|
1652
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1653
|
+
.ansh-rotate__word {
|
|
1654
|
+
animation: none !important;
|
|
1655
|
+
}
|
|
1656
|
+
|
|
1657
|
+
.ansh-stack__card {
|
|
1658
|
+
transition: none !important;
|
|
1659
|
+
}
|
|
1660
|
+
}
|
|
1661
|
+
|
|
1315
1662
|
/* ==========================================================================
|
|
1316
1663
|
Forms
|
|
1317
1664
|
========================================================================== */
|
|
@@ -5381,6 +5728,123 @@ button.ansh-stepper__button:hover {
|
|
|
5381
5728
|
text-underline-offset: 2px;
|
|
5382
5729
|
}
|
|
5383
5730
|
|
|
5731
|
+
/* --- Carousel ------------------------------------------------------------- */
|
|
5732
|
+
|
|
5733
|
+
.ansh-carousel {
|
|
5734
|
+
position: relative;
|
|
5735
|
+
display: flex;
|
|
5736
|
+
flex-direction: column;
|
|
5737
|
+
gap: var(--ansh-space-3);
|
|
5738
|
+
}
|
|
5739
|
+
|
|
5740
|
+
.ansh-carousel__viewport {
|
|
5741
|
+
position: relative;
|
|
5742
|
+
overflow: hidden;
|
|
5743
|
+
border-radius: var(--ansh-radius-lg);
|
|
5744
|
+
/* Without this a horizontal drag scrolls the page on touch instead of moving the track — the
|
|
5745
|
+
same defect the comparison slider guards against. */
|
|
5746
|
+
touch-action: pan-y;
|
|
5747
|
+
}
|
|
5748
|
+
|
|
5749
|
+
.ansh-carousel__track {
|
|
5750
|
+
display: flex;
|
|
5751
|
+
transition: transform var(--ansh-duration-slow, 420ms) var(--ansh-ease-emphasized);
|
|
5752
|
+
will-change: transform;
|
|
5753
|
+
}
|
|
5754
|
+
|
|
5755
|
+
.ansh-carousel__slide {
|
|
5756
|
+
/* `flex: 0 0 100%` rather than `width: 100%`: flex items shrink by default, so eight slides in a
|
|
5757
|
+
row would each collapse to an eighth of the viewport instead of queueing beside it. */
|
|
5758
|
+
flex: 0 0 100%;
|
|
5759
|
+
min-width: 0;
|
|
5760
|
+
}
|
|
5761
|
+
|
|
5762
|
+
.ansh-carousel__viewport[data-dragging] {
|
|
5763
|
+
cursor: grabbing;
|
|
5764
|
+
}
|
|
5765
|
+
|
|
5766
|
+
.ansh-carousel__arrow {
|
|
5767
|
+
position: absolute;
|
|
5768
|
+
top: calc(50% - 1.25rem);
|
|
5769
|
+
display: grid;
|
|
5770
|
+
place-items: center;
|
|
5771
|
+
width: 2.5rem;
|
|
5772
|
+
height: 2.5rem;
|
|
5773
|
+
border-radius: var(--ansh-radius-full);
|
|
5774
|
+
border: 1px solid var(--ansh-border-default);
|
|
5775
|
+
background: var(--ansh-surface-overlay);
|
|
5776
|
+
color: var(--ansh-content-primary);
|
|
5777
|
+
font: inherit;
|
|
5778
|
+
font-size: var(--ansh-text-xl);
|
|
5779
|
+
line-height: 1;
|
|
5780
|
+
cursor: pointer;
|
|
5781
|
+
}
|
|
5782
|
+
|
|
5783
|
+
.ansh-carousel__arrow:hover:not(:disabled) {
|
|
5784
|
+
border-color: var(--ansh-border-strong);
|
|
5785
|
+
}
|
|
5786
|
+
|
|
5787
|
+
.ansh-carousel__arrow:disabled {
|
|
5788
|
+
opacity: 0.4;
|
|
5789
|
+
cursor: default;
|
|
5790
|
+
}
|
|
5791
|
+
|
|
5792
|
+
.ansh-carousel__arrow--prev {
|
|
5793
|
+
left: var(--ansh-space-3);
|
|
5794
|
+
}
|
|
5795
|
+
|
|
5796
|
+
.ansh-carousel__arrow--next {
|
|
5797
|
+
right: var(--ansh-space-3);
|
|
5798
|
+
}
|
|
5799
|
+
|
|
5800
|
+
.ansh-carousel__controls {
|
|
5801
|
+
display: flex;
|
|
5802
|
+
align-items: center;
|
|
5803
|
+
justify-content: center;
|
|
5804
|
+
gap: var(--ansh-space-3);
|
|
5805
|
+
}
|
|
5806
|
+
|
|
5807
|
+
.ansh-carousel__dots {
|
|
5808
|
+
display: flex;
|
|
5809
|
+
gap: var(--ansh-space-2);
|
|
5810
|
+
}
|
|
5811
|
+
|
|
5812
|
+
.ansh-carousel__dot {
|
|
5813
|
+
width: 0.5rem;
|
|
5814
|
+
height: 0.5rem;
|
|
5815
|
+
padding: 0;
|
|
5816
|
+
border: 0;
|
|
5817
|
+
border-radius: var(--ansh-radius-full);
|
|
5818
|
+
background: var(--ansh-border-strong);
|
|
5819
|
+
cursor: pointer;
|
|
5820
|
+
transition: background-color var(--ansh-duration-fast) var(--ansh-ease-standard);
|
|
5821
|
+
}
|
|
5822
|
+
|
|
5823
|
+
.ansh-carousel__dot[aria-current] {
|
|
5824
|
+
background: var(--ansh-accent-default);
|
|
5825
|
+
}
|
|
5826
|
+
|
|
5827
|
+
.ansh-carousel__pause {
|
|
5828
|
+
display: grid;
|
|
5829
|
+
place-items: center;
|
|
5830
|
+
min-width: 1.75rem;
|
|
5831
|
+
height: 1.75rem;
|
|
5832
|
+
padding: 0 var(--ansh-space-2);
|
|
5833
|
+
border-radius: var(--ansh-radius-full);
|
|
5834
|
+
border: 1px solid var(--ansh-border-default);
|
|
5835
|
+
background: transparent;
|
|
5836
|
+
color: var(--ansh-content-secondary);
|
|
5837
|
+
font: inherit;
|
|
5838
|
+
font-size: var(--ansh-text-xs);
|
|
5839
|
+
cursor: pointer;
|
|
5840
|
+
}
|
|
5841
|
+
|
|
5842
|
+
@media (prefers-reduced-motion: reduce) {
|
|
5843
|
+
.ansh-carousel__track {
|
|
5844
|
+
transition: none !important;
|
|
5845
|
+
}
|
|
5846
|
+
}
|
|
5847
|
+
|
|
5384
5848
|
/* ==========================================================================
|
|
5385
5849
|
Feedback — alerts, banners, callouts
|
|
5386
5850
|
========================================================================== */
|
|
@@ -43,4 +43,5 @@ declare function cx(...parts: Array<string | false | null | undefined>): string;
|
|
|
43
43
|
*/
|
|
44
44
|
declare function useId(prefix?: string): string;
|
|
45
45
|
|
|
46
|
-
export {
|
|
46
|
+
export { cx as c, resolveSlotContent as r, useId as u };
|
|
47
|
+
export type { ReadonlyRef as R, SlotContent as S };
|
|
@@ -43,4 +43,5 @@ declare function cx(...parts: Array<string | false | null | undefined>): string;
|
|
|
43
43
|
*/
|
|
44
44
|
declare function useId(prefix?: string): string;
|
|
45
45
|
|
|
46
|
-
export {
|
|
46
|
+
export { cx as c, resolveSlotContent as r, useId as u };
|
|
47
|
+
export type { ReadonlyRef as R, SlotContent as S };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ansh-ui/vue",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Ansh for Vue 3 and Nuxt — premium animated components and motion composables.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -74,8 +74,8 @@
|
|
|
74
74
|
"./package.json": "./package.json"
|
|
75
75
|
},
|
|
76
76
|
"dependencies": {
|
|
77
|
-
"@ansh-ui/core": "0.
|
|
78
|
-
"@ansh-ui/tokens": "0.
|
|
77
|
+
"@ansh-ui/core": "0.3.0",
|
|
78
|
+
"@ansh-ui/tokens": "0.3.0"
|
|
79
79
|
},
|
|
80
80
|
"peerDependencies": {
|
|
81
81
|
"vue": "^3.4.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout/index.ts","../src/components/layout/resizable.ts"],"names":["defineComponent","ref","h"],"mappings":"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","file":"chunk-B6OXKW5Q.js","sourcesContent":["import { type CSSProperties, type PropType, defineComponent, h, ref } from 'vue'\nimport { type SlotContent, cx, resolveSlotContent } from '../../primitives/utils'\n\n/**\n * Layout primitives — the Vue counterpart of `@ansh-ui/react`'s layout components.\n *\n * These exist because every application rebuilds them, badly. The rebuilt versions hardcode gaps in\n * pixels, so they don't respond to a density setting; they use margins, so they collapse\n * unpredictably; and they don't handle the RTL case.\n *\n * Everything here takes a **token key**, not a raw value: `:gap=\"4\"` means `--ansh-space-4`, so a\n * layout is guaranteed to sit on the spacing scale. Passing an arbitrary string is still possible for\n * the genuine one-off, but the type nudges toward the scale first.\n *\n * Every component here declares only its own props and renders with `inheritAttrs: false` plus a\n * manual `class`/`style`/rest spread, so native attributes not declared as props (`id`, `data-*`, a\n * `@click` listener) fall through onto the rendered element automatically — the same convention\n * `Input` and `PopoverContent` use elsewhere in this package.\n */\n\n/** A key into the spacing scale, or a raw CSS length for the rare exception. */\nexport type SpaceToken =\n 0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16 | 20 | 24 | (string & {})\n\n/**\n * A CSS `align-items`/`justify-content` value, typed as a plain string rather than\n * `CSSProperties['alignItems']`/`['justifyContent']`.\n *\n * The indexed-access csstype type is structurally correct but not **portable**: embedding it in an\n * exported component's props makes TypeScript's declaration emitter need to name an internal\n * `csstype` package type by its pnpm store path, which a consumer's project can't resolve and fails\n * the build with TS2742 (\"cannot be named without a reference to .pnpm/csstype@.../csstype\"). A\n * plain string loses autocomplete for the handful of valid values; the runtime behaviour — the\n * string flows straight into the style property — is identical.\n */\ntype FlexAlign = string\n\nfunction space(value: SpaceToken | undefined): string | undefined {\n if (value === undefined) return undefined\n if (typeof value === 'string') return value\n return `var(--ansh-space-${value})`\n}\n\n/** Split `attrs` into the pieces every component here re-merges by hand. */\nfunction splitAttrs(attrs: Record<string, unknown>): {\n class: string\n style: unknown\n rest: Record<string, unknown>\n} {\n const { class: attrClass, style: attrStyle, ...rest } = attrs\n return { class: (attrClass as string | undefined) ?? '', style: attrStyle, rest }\n}\n\n// --- Stack ------------------------------------------------------------------\n\nexport interface StackProps {\n as?: string\n /** Default `'vertical'` — the direction that needs a helper more often. */\n direction?: 'horizontal' | 'vertical'\n gap?: SpaceToken\n align?: FlexAlign\n justify?: FlexAlign\n wrap?: boolean\n /** Grow to fill the cross axis. */\n stretch?: boolean\n /** Insert a hairline divider between children. */\n divide?: boolean\n}\n\nfunction stackProps() {\n return {\n as: { type: String, default: 'div' },\n gap: { type: [Number, String] as PropType<SpaceToken>, default: 4 },\n align: { type: String as PropType<FlexAlign>, default: undefined },\n justify: { type: String as PropType<FlexAlign>, default: undefined },\n wrap: { type: Boolean, default: false },\n stretch: { type: Boolean, default: false },\n divide: { type: Boolean, default: false },\n }\n}\n\nfunction stackStyle(\n direction: 'horizontal' | 'vertical',\n props: {\n gap: SpaceToken\n align?: FlexAlign\n justify?: FlexAlign\n wrap: boolean\n stretch: boolean\n },\n): CSSProperties {\n return {\n display: 'flex',\n flexDirection: direction === 'horizontal' ? 'row' : 'column',\n gap: space(props.gap),\n // Cast at the point of use, not in the public prop type — see the `FlexAlign` doc comment.\n alignItems: (props.align ??\n (props.stretch ? 'stretch' : undefined)) as CSSProperties['alignItems'],\n justifyContent: props.justify as CSSProperties['justifyContent'],\n flexWrap: props.wrap ? 'wrap' : undefined,\n }\n}\n\n/**\n * One-dimensional flex layout.\n *\n * ```vue\n * <Stack direction=\"horizontal\" :gap=\"3\" align=\"center\">\n * <Avatar :src=\"user.avatar\" :name=\"user.name\" />\n * <Stack :gap=\"0.5\">\n * <strong>{{ user.name }}</strong>\n * <Text tone=\"secondary\">{{ user.email }}</Text>\n * </Stack>\n * </Stack>\n * ```\n */\nexport const Stack = defineComponent({\n name: 'AnshStack',\n inheritAttrs: false,\n props: {\n ...stackProps(),\n direction: { type: String as PropType<'horizontal' | 'vertical'>, default: 'vertical' },\n },\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: cx('ansh-stack', props.divide && 'ansh-stack--divide', attrClass),\n 'data-direction': props.direction,\n style: [stackStyle(props.direction, props), attrStyle],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n\n/** Horizontal `Stack`, for readability at call sites. */\nexport const HStack = defineComponent({\n name: 'AnshHStack',\n inheritAttrs: false,\n props: stackProps(),\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: cx('ansh-stack', props.divide && 'ansh-stack--divide', attrClass),\n 'data-direction': 'horizontal',\n style: [stackStyle('horizontal', props), attrStyle],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n\n/** Vertical `Stack`, for symmetry with `HStack`. */\nexport const VStack = defineComponent({\n name: 'AnshVStack',\n inheritAttrs: false,\n props: stackProps(),\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: cx('ansh-stack', props.divide && 'ansh-stack--divide', attrClass),\n 'data-direction': 'vertical',\n style: [stackStyle('vertical', props), attrStyle],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n\n// --- Grid ---------------------------------------------------------------------\n\nexport interface GridProps {\n as?: string\n /** Fixed column count, or `'auto'` for a responsive `auto-fill` track. */\n columns?: number | 'auto'\n /** Minimum column width when `columns=\"auto\"`. Default `'16rem'`. */\n minColumnWidth?: string\n gap?: SpaceToken\n /** Row gap, when it should differ from the column gap. */\n rowGap?: SpaceToken\n align?: FlexAlign\n}\n\n/**\n * Two-dimensional layout.\n *\n * `columns=\"auto\"` uses `repeat(auto-fill, minmax(min(N, 100%), 1fr))`. The inner `min()` is what\n * stops the grid overflowing on a phone: without it, a 16rem minimum on a 15rem-wide viewport\n * produces a track wider than the screen and a horizontal scrollbar.\n */\nexport const Grid = defineComponent({\n name: 'AnshGrid',\n inheritAttrs: false,\n props: {\n as: { type: String, default: 'div' },\n columns: { type: [Number, String] as PropType<number | 'auto'>, default: 'auto' },\n minColumnWidth: { type: String, default: '16rem' },\n gap: { type: [Number, String] as PropType<SpaceToken>, default: 4 },\n rowGap: { type: [Number, String] as PropType<SpaceToken>, default: undefined },\n align: { type: String as PropType<FlexAlign>, default: undefined },\n },\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: cx('ansh-grid', attrClass),\n style: [\n {\n display: 'grid',\n gridTemplateColumns:\n props.columns === 'auto'\n ? `repeat(auto-fill, minmax(min(${props.minColumnWidth}, 100%), 1fr))`\n : `repeat(${props.columns}, minmax(0, 1fr))`,\n gap: space(props.gap),\n rowGap: space(props.rowGap),\n alignItems: props.align,\n },\n attrStyle,\n ],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n\nexport interface GridItemProps {\n as?: string\n /** Columns to span. `'full'` spans the whole row. */\n span?: number | 'full'\n rowSpan?: number\n}\n\nexport const GridItem = defineComponent({\n name: 'AnshGridItem',\n inheritAttrs: false,\n props: {\n as: { type: String, default: 'div' },\n span: { type: [Number, String] as PropType<number | 'full'>, default: undefined },\n rowSpan: { type: Number, default: undefined },\n },\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: attrClass,\n style: [\n {\n gridColumn:\n props.span === 'full'\n ? '1 / -1'\n : props.span\n ? `span ${props.span} / span ${props.span}`\n : undefined,\n gridRow: props.rowSpan ? `span ${props.rowSpan} / span ${props.rowSpan}` : undefined,\n // `minWidth: 0` on every grid child. Without it a child containing a long unbroken\n // string or a table refuses to shrink below its content width and blows out the track.\n minWidth: 0,\n },\n attrStyle,\n ],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n\n// --- Container ------------------------------------------------------------\n\nexport interface ContainerProps {\n as?: string\n /** Max content width. Default `'lg'` (72rem). */\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full'\n /** Horizontal padding. Default `6`. */\n padding?: SpaceToken\n}\n\nconst CONTAINER_WIDTH = {\n sm: '40rem',\n md: '56rem',\n lg: '72rem',\n xl: '90rem',\n full: '100%',\n} as const\n\n/** Centred, width-constrained page content. */\nexport const Container = defineComponent({\n name: 'AnshContainer',\n inheritAttrs: false,\n props: {\n as: { type: String, default: 'div' },\n size: { type: String as PropType<'sm' | 'md' | 'lg' | 'xl' | 'full'>, default: 'lg' },\n padding: { type: [Number, String] as PropType<SpaceToken>, default: 6 },\n },\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: cx('ansh-container', attrClass),\n style: [\n {\n width: '100%',\n maxWidth: CONTAINER_WIDTH[props.size],\n marginInline: 'auto',\n paddingInline: space(props.padding),\n },\n attrStyle,\n ],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n\n// --- Divider --------------------------------------------------------------\n\nexport interface DividerProps {\n orientation?: 'horizontal' | 'vertical'\n /** Optional label rendered in the middle of the rule. */\n label?: SlotContent\n}\n\n/**\n * A rule.\n *\n * With a label it becomes a labelled separator — the \"or continue with\" divider on a sign-in form.\n * `role=\"separator\"` is set only when there's no label; with one, it's a heading-like element and\n * announcing it as a separator loses the text.\n *\n * Renders a plain `<div>` regardless of what `as` a caller might pass, matching\n * `@ansh-ui/react`'s `Divider` — which declares `as` on its props type via `BaseProps` but never\n * actually reads it, always rendering a literal `<div>`. Not declaring `as` here reproduces that\n * quirk exactly: an `as` attribute would simply fall through as an inert HTML attribute, same as it\n * does in React.\n */\nexport const Divider = defineComponent({\n name: 'AnshDivider',\n inheritAttrs: false,\n props: {\n orientation: { type: String as PropType<'horizontal' | 'vertical'>, default: 'horizontal' },\n label: { type: [String, Object, Function] as PropType<SlotContent>, default: undefined },\n },\n setup(props, { attrs }) {\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n\n if (props.label !== undefined) {\n return h(\n 'div',\n {\n class: cx('ansh-divider', 'ansh-divider--labelled', attrClass),\n style: attrStyle,\n ...rest,\n },\n [\n h('span', { class: 'ansh-divider__line' }),\n h('span', { class: 'ansh-divider__label' }, [resolveSlotContent(props.label)]),\n h('span', { class: 'ansh-divider__line' }),\n ],\n )\n }\n\n return h('div', {\n role: 'separator',\n 'aria-orientation': props.orientation,\n class: cx('ansh-divider', `ansh-divider--${props.orientation}`, attrClass),\n style: attrStyle,\n ...rest,\n })\n }\n },\n})\n\n// --- Spacer -----------------------------------------------------------------\n\nexport interface SpacerProps {\n size?: SpaceToken\n /** Grow to absorb free space in a flex container. */\n grow?: boolean\n}\n\n/** Explicit empty space. `grow` pushes siblings apart in a flex row. */\nexport const Spacer = defineComponent({\n name: 'AnshSpacer',\n props: {\n size: { type: [Number, String] as PropType<SpaceToken>, default: undefined },\n grow: { type: Boolean, default: false },\n },\n setup(props) {\n return () =>\n h('span', {\n 'aria-hidden': 'true',\n style: {\n display: 'block',\n flexGrow: props.grow ? 1 : 0,\n flexShrink: 0,\n ...(props.size !== undefined\n ? { width: space(props.size), height: space(props.size) }\n : null),\n },\n })\n },\n})\n\n// --- Center -----------------------------------------------------------------\n\nexport interface CenterProps {\n as?: string\n}\n\n/** Centre a child on both axes. */\nexport const Center = defineComponent({\n name: 'AnshCenter',\n inheritAttrs: false,\n props: {\n as: { type: String, default: 'div' },\n },\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: attrClass,\n style: [{ display: 'grid', placeItems: 'center' }, attrStyle],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n\n// --- AspectRatio ------------------------------------------------------------\n\nexport interface AspectRatioProps {\n as?: string\n /** Width ÷ height. `16 / 9` reads better than `1.777`. Default `16 / 9`. */\n ratio?: number\n}\n\n/**\n * Reserve space at a fixed aspect ratio.\n *\n * Uses the `aspect-ratio` property rather than the padding-top hack. The reserved space is what\n * matters: an image that loads without it shifts everything below, which is a Cumulative Layout\n * Shift penalty and the most common cause of a failing Core Web Vitals score.\n */\nexport const AspectRatio = defineComponent({\n name: 'AnshAspectRatio',\n inheritAttrs: false,\n props: {\n as: { type: String, default: 'div' },\n ratio: { type: Number, default: 16 / 9 },\n },\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: cx('ansh-aspect', attrClass),\n style: [{ aspectRatio: String(props.ratio) }, attrStyle],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n\n// --- ScrollArea ---------------------------------------------------------------\n\nexport interface ScrollAreaProps {\n as?: string\n /** Max height before scrolling starts. */\n maxHeight?: string\n axis?: 'y' | 'x' | 'both'\n /** Fade the content at the scrollable edges. Default `true`. */\n fade?: boolean\n}\n\n/**\n * A scroll container with styled scrollbars and edge fades.\n *\n * The native scrollbar is kept — a JavaScript-rendered one breaks keyboard scrolling, mobile\n * momentum, and the OS \"scroll bar is always visible\" accessibility setting. It is only *styled*,\n * via `scrollbar-width`/`scrollbar-color` with a `::-webkit-scrollbar` fallback.\n *\n * The edge fade is a mask that appears only when there is more content in that direction. It is\n * driven by `animation-timeline: scroll()` where supported, so it costs nothing on the main thread\n * and degrades to no fade where it isn't.\n */\nexport const ScrollArea = defineComponent({\n name: 'AnshScrollArea',\n inheritAttrs: false,\n props: {\n as: { type: String, default: 'div' },\n maxHeight: { type: String, default: undefined },\n axis: { type: String as PropType<'y' | 'x' | 'both'>, default: 'y' },\n fade: { type: Boolean, default: true },\n },\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: cx('ansh-scroll', props.fade && 'ansh-scroll--fade', attrClass),\n 'data-axis': props.axis,\n style: [\n {\n maxHeight: props.maxHeight,\n overflowY: props.axis === 'x' ? 'hidden' : 'auto',\n overflowX: props.axis === 'y' ? 'hidden' : 'auto',\n },\n attrStyle,\n ],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n","import { Comment, type PropType, Text, type VNode, defineComponent, h, ref } from 'vue'\nimport { cx } from '../../primitives/utils'\nimport { useControllableState } from '../../primitives/use-controllable-state'\n\n/**\n * A two-pane split with a draggable divider — the Vue counterpart of `@ansh-ui/react`'s `Resizable`.\n *\n * The layout every IDE, mail client and admin console needs, and the one most often shipped as\n * mouse-only. The handle here is a real `role=\"separator\"` with `aria-valuenow`, and arrow keys move\n * it in 2% steps — WAI-ARIA calls this a window splitter and it is a documented pattern, not an\n * invention.\n *\n * Sizes are percentages rather than pixels so the split survives a window resize proportionally.\n * Dragging writes to a CSS custom property directly, bypassing Vue's renderer: a re-render per\n * pointer move makes the drag feel heavy on a complex page, and the value is only committed to state\n * on release.\n *\n * `size`/`update:size` follow this package's controlled-prop convention (see `Popover`'s\n * `open`/`update:open`), so `v-model:size` works for the controlled case; `onSizeChange` from the\n * React version becomes the `update:size` emit.\n */\n\nexport interface ResizableProps {\n direction?: 'horizontal' | 'vertical'\n /** First pane's size as a percentage, `0`–`100`. Default `50`. */\n defaultSize?: number\n size?: number\n /** Clamp, as percentages. Defaults `10` and `90`. */\n minSize?: number\n maxSize?: number\n /** Snap points in percent, e.g. `[25, 50, 75]`. Within 3% the handle snaps. */\n snapPoints?: readonly number[]\n /** Accessible name for the handle — \"Resize sidebar\", not \"Resize\". */\n label?: string\n}\n\n/** Drop whitespace-only text nodes and `v-if=\"false\"` comment placeholders from a slot's output. */\nfunction normalizeChildren(nodes: VNode[] | undefined): VNode[] {\n return (nodes ?? []).filter((node) => {\n if (node.type === Comment) return false\n if (node.type === Text && typeof node.children === 'string' && node.children.trim() === '') {\n return false\n }\n return true\n })\n}\n\nexport const Resizable = defineComponent({\n name: 'AnshResizable',\n inheritAttrs: false,\n props: {\n direction: { type: String as PropType<'horizontal' | 'vertical'>, default: 'horizontal' },\n defaultSize: { type: Number, default: 50 },\n size: { type: Number, default: undefined },\n minSize: { type: Number, default: 10 },\n maxSize: { type: Number, default: 90 },\n snapPoints: { type: Array as PropType<readonly number[]>, default: undefined },\n label: { type: String, default: 'Resize panes' },\n },\n emits: ['update:size'],\n setup(props, { attrs, slots, emit, expose }) {\n const [value, setValue] = useControllableState<number>(\n () => props.size,\n props.defaultSize,\n (next) => emit('update:size', next),\n )\n\n const containerRef = ref<HTMLDivElement | null>(null)\n const dragging = ref(false)\n\n expose({\n get element() {\n return containerRef.value\n },\n })\n\n const clamp = (next: number): number => {\n let result = Math.min(Math.max(next, props.minSize), props.maxSize)\n if (props.snapPoints) {\n for (const point of props.snapPoints) {\n if (Math.abs(result - point) < 3) {\n result = point\n break\n }\n }\n }\n return result\n }\n\n const onPointerdown = (event: PointerEvent): void => {\n const container = containerRef.value\n if (!container) return\n\n // Pointer capture keeps events coming to the handle even when the pointer outruns it, which\n // it will — a fast drag easily leaves the 8px handle behind and the drag would otherwise stop\n // dead mid-gesture.\n ;(event.currentTarget as HTMLElement).setPointerCapture(event.pointerId)\n dragging.value = true\n\n let latest = value.value\n\n const onMove = (moveEvent: PointerEvent): void => {\n const rect = container.getBoundingClientRect()\n const fraction =\n props.direction === 'horizontal'\n ? (moveEvent.clientX - rect.left) / rect.width\n : (moveEvent.clientY - rect.top) / rect.height\n\n latest = clamp(fraction * 100)\n // Written straight to the DOM. Vue state is updated once, on release.\n container.style.setProperty('--ansh-split', `${latest}%`)\n }\n\n const onUp = (): void => {\n dragging.value = false\n setValue(latest)\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n window.removeEventListener('pointercancel', onUp)\n }\n\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n window.addEventListener('pointercancel', onUp)\n }\n\n const onKeydown = (event: KeyboardEvent): void => {\n const step = event.shiftKey ? 10 : 2\n const forward = props.direction === 'horizontal' ? 'ArrowRight' : 'ArrowDown'\n const backward = props.direction === 'horizontal' ? 'ArrowLeft' : 'ArrowUp'\n\n let next: number | null = null\n if (event.key === forward) next = value.value + step\n else if (event.key === backward) next = value.value - step\n else if (event.key === 'Home') next = props.minSize\n else if (event.key === 'End') next = props.maxSize\n // Enter toggles between collapsed and the midpoint — the shortcut people expect from a\n // collapsible sidebar, and the only way to fully collapse without a mouse.\n else if (event.key === 'Enter') next = value.value <= props.minSize + 1 ? 50 : props.minSize\n\n if (next === null) return\n event.preventDefault()\n setValue(clamp(next))\n }\n\n return () => {\n const { class: attrClass, ...restAttrs } = attrs as Record<string, unknown>\n const panes = normalizeChildren(slots.default?.())\n\n return h(\n 'div',\n {\n ref: containerRef,\n class: cx(\n 'ansh-split',\n `ansh-split--${props.direction}`,\n dragging.value && 'ansh-split--dragging',\n attrClass as string,\n ),\n // Reactive on every render, mirroring the React version's `style` prop — kept in sync\n // outside a drag, when the pointer handler above is the one writing it directly.\n style: { ['--ansh-split' as string]: `${value.value}%` },\n ...restAttrs,\n },\n [\n h('div', { class: 'ansh-split__pane' }, [panes[0]]),\n\n h(\n 'div',\n {\n role: 'separator',\n tabindex: 0,\n 'aria-label': props.label,\n 'aria-orientation': props.direction === 'horizontal' ? 'vertical' : 'horizontal',\n 'aria-valuenow': Math.round(value.value),\n 'aria-valuemin': props.minSize,\n 'aria-valuemax': props.maxSize,\n class: 'ansh-split__handle ansh-focusable',\n onPointerdown,\n onKeydown,\n // Double-click resets to centre. Undocumented in the UI but universally expected, and\n // harmless to discover by accident.\n onDblclick: () => setValue(50),\n },\n [h('span', { class: 'ansh-split__grip', 'aria-hidden': 'true' })],\n ),\n\n h('div', { class: 'ansh-split__pane' }, [panes[1]]),\n ],\n )\n }\n },\n})\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/primitives/focus.ts"],"names":["watch","getCurrentScope","onScopeDispose"],"mappings":"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","file":"chunk-EISHOEB6.cjs","sourcesContent":["import { type Ref, getCurrentScope, onScopeDispose, watch } from 'vue'\nimport { type ReadonlyRef } from './utils'\n\n/**\n * Focus management for overlay surfaces — the Vue counterpart of `@ansh-ui/react`'s `focus.ts`.\n *\n * Three separate concerns that are usually conflated:\n *\n * 1. **Finding what can be focused.** Harder than it looks — `disabled`, `hidden`, `inert`,\n * zero-size elements and negative tabindex all disqualify a node, and CSS-hidden ancestors\n * disqualify their whole subtree.\n * 2. **Trapping.** Tab must cycle within the surface. Required by WCAG 2.4.3 for modals.\n * 3. **Restoring.** Focus must return to the trigger on close, or a keyboard user is dumped at the\n * top of the document and has to navigate all the way back.\n */\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',')\n\nfunction isVisible(element: HTMLElement): boolean {\n if (element.hasAttribute('inert')) return false\n if (element.offsetParent !== null) return true\n const rect = element.getBoundingClientRect()\n return rect.width > 0 || rect.height > 0\n}\n\n/** Every tabbable descendant, in tab order. */\nexport function getTabbable(container: HTMLElement | null | undefined): HTMLElement[] {\n if (!container) return []\n const nodes = Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR))\n return nodes.filter((node) => {\n if (node.getAttribute('aria-hidden') === 'true') return false\n if (node.closest('[inert]')) return false\n return isVisible(node)\n })\n}\n\n/**\n * Trap Tab within a container while `active`.\n *\n * Implemented on `keydown` at the container rather than with sentinel elements at either end. The\n * sentinel approach adds two focusable nodes to the accessibility tree that screen readers can land\n * on and announce as blank; intercepting the key does not.\n */\nexport function useFocusTrap(\n target: Ref<HTMLElement | null | undefined>,\n active: ReadonlyRef<boolean>,\n): void {\n let detach: (() => void) | null = null\n\n const attach = (): void => {\n const container = target.value\n if (!container || detach) return\n\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Tab') return\n\n const tabbable = getTabbable(container)\n if (tabbable.length === 0) {\n event.preventDefault()\n return\n }\n\n const first = tabbable[0]!\n const last = tabbable[tabbable.length - 1]!\n const activeElement = document.activeElement as HTMLElement | null\n\n if (event.shiftKey && (activeElement === first || activeElement === container)) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && activeElement === last) {\n event.preventDefault()\n first.focus()\n }\n }\n\n container.addEventListener('keydown', onKeyDown)\n detach = () => {\n container.removeEventListener('keydown', onKeyDown)\n detach = null\n }\n }\n\n watch([active, target], () => (active.value ? attach() : detach?.()), {\n immediate: true,\n flush: 'post',\n })\n\n if (getCurrentScope()) onScopeDispose(() => detach?.())\n}\n\n/**\n * Restore focus to whatever was focused before `active` became true.\n *\n * The element is captured on activation, not on mount, because a component can be mounted long\n * before it opens.\n */\nexport function useFocusRestore(active: ReadonlyRef<boolean>): void {\n let previous: HTMLElement | null = null\n\n watch(\n active,\n (isActive) => {\n if (isActive) {\n previous = document.activeElement as HTMLElement | null\n return\n }\n // Guard against restoring to a node that has since been removed from the document —\n // focusing a detached element silently moves focus to `<body>`, losing the user's place.\n if (previous && previous.isConnected) previous.focus?.({ preventScroll: true })\n previous = null\n },\n { flush: 'post' },\n )\n}\n\n/**\n * Move focus into a surface when it opens.\n *\n * Prefers an explicitly marked element, then the first tabbable one, then the container itself. The\n * container fallback matters for a dialog whose only content is text: focus must land inside it so a\n * screen reader announces the dialog rather than continuing from the page behind.\n */\nexport function useAutoFocus(\n target: Ref<HTMLElement | null | undefined>,\n active: ReadonlyRef<boolean>,\n initialFocus?: Ref<HTMLElement | null | undefined>,\n): void {\n let frame: number | null = null\n\n watch(\n [active, target],\n () => {\n if (frame !== null) cancelAnimationFrame(frame)\n if (!active.value) return\n const container = target.value\n if (!container) return\n\n // After paint: the surface may still be animating in, and focusing a node with\n // `visibility: hidden` is a no-op that silently leaves focus on the body.\n frame = requestAnimationFrame(() => {\n frame = null\n const explicit = initialFocus?.value\n if (explicit?.isConnected) {\n explicit.focus({ preventScroll: true })\n return\n }\n const target2 = getTabbable(container)[0] ?? container\n target2.focus({ preventScroll: true })\n })\n },\n { immediate: true, flush: 'post' },\n )\n\n if (getCurrentScope()) {\n onScopeDispose(() => {\n if (frame !== null) cancelAnimationFrame(frame)\n })\n }\n}\n\n/**\n * Roving tabindex for a composite widget (toolbar, tab list, menu).\n *\n * The ARIA authoring practice: a composite has exactly **one** tab stop, and arrow keys move within\n * it. Returns a keydown handler to bind on the composite's container.\n */\nexport function useRovingFocus(options: {\n /** Items in DOM order. */\n items: Ref<Array<HTMLElement | null>>\n /** Index that currently owns the tab stop. */\n active: () => number\n onActiveChange: (index: number) => void\n orientation?: 'horizontal' | 'vertical' | 'both'\n loop?: boolean\n}): (event: KeyboardEvent) => void {\n const { items, active, onActiveChange, orientation = 'horizontal', loop = true } = options\n\n return (event: KeyboardEvent) => {\n const nodes = items.value.filter((item): item is HTMLElement => item !== null)\n if (nodes.length === 0) return\n\n const horizontal = orientation === 'horizontal' || orientation === 'both'\n const vertical = orientation === 'vertical' || orientation === 'both'\n\n let next = active()\n switch (event.key) {\n case 'ArrowRight':\n if (!horizontal) return\n next = active() + 1\n break\n case 'ArrowLeft':\n if (!horizontal) return\n next = active() - 1\n break\n case 'ArrowDown':\n if (!vertical) return\n next = active() + 1\n break\n case 'ArrowUp':\n if (!vertical) return\n next = active() - 1\n break\n case 'Home':\n next = 0\n break\n case 'End':\n next = nodes.length - 1\n break\n default:\n return\n }\n\n event.preventDefault()\n\n if (next < 0) next = loop ? nodes.length - 1 : 0\n if (next >= nodes.length) next = loop ? 0 : nodes.length - 1\n\n onActiveChange(next)\n nodes[next]?.focus()\n }\n}\n"]}
|