@roadlittledawn/docs-design-system-react 0.3.0 → 0.5.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/styles.css CHANGED
@@ -209,6 +209,42 @@
209
209
  --dds-collapser-icon-color: #6b7280; /* gray-500 */
210
210
  --dds-collapser-text: #374151; /* gray-700 */
211
211
  --dds-collapser-content-padding: 1rem; /* p-4 */
212
+
213
+ /* Tabs */
214
+ --dds-tabs-margin: 1rem 0;
215
+ --dds-tabs-border: #e5e7eb; /* gray-200 */
216
+ --dds-tabs-tab-padding: 0.75rem 1rem;
217
+ --dds-tabs-tab-bg: transparent;
218
+ --dds-tabs-tab-text: #6b7280; /* gray-500 */
219
+ --dds-tabs-tab-size: 0.875rem;
220
+ --dds-tabs-tab-text-hover: #374151; /* gray-700 */
221
+ --dds-tabs-tab-bg-hover: transparent;
222
+ --dds-tabs-tab-text-active: #111827; /* gray-900 */
223
+ --dds-tabs-tab-bg-active: transparent;
224
+ --dds-tabs-tab-border-active: #3b82f6; /* blue-500 */
225
+ --dds-tabs-panel-padding: 1.25rem 0;
226
+ --dds-tabs-panel-text: #111827; /* gray-900 */
227
+
228
+ /* Popover */
229
+ --dds-popover-bg: #ffffff;
230
+ --dds-popover-border: #e5e7eb; /* gray-200 */
231
+ --dds-popover-radius: 0.5rem; /* rounded-lg */
232
+ --dds-popover-shadow:
233
+ 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 10px 15px -3px rgba(0, 0, 0, 0.1),
234
+ 0 2px 4px -1px rgba(0, 0, 0, 0.06);
235
+ --dds-popover-text: #374151; /* gray-700 */
236
+ --dds-popover-title-color: #111827; /* gray-900 */
237
+ --dds-popover-eyebrow-color: #6b7280; /* gray-500 */
238
+ --dds-popover-link-color: #2563eb; /* blue-600 */
239
+ --dds-popover-link-color-hover: #1e40af; /* blue-800 */
240
+ --dds-popover-width-sm: 240px;
241
+ --dds-popover-width-md: 320px;
242
+ --dds-popover-width-lg: 480px;
243
+ --dds-popover-padding: 1rem;
244
+ --dds-popover-image-height: 120px;
245
+ --dds-popover-title-size: 0.9375rem; /* ~15px */
246
+ --dds-popover-text-size: 0.875rem; /* text-sm */
247
+ --dds-popover-eyebrow-size: 0.6875rem; /* ~11px */
212
248
  }
213
249
  /* ==========================================================================
214
250
  Dark Mode Tokens
@@ -297,6 +333,17 @@
297
333
  --dds-collapser-icon-color: #9ca3af; /* gray-400 */
298
334
  --dds-collapser-text: #e5e7eb; /* gray-200 */
299
335
 
336
+ /* Tabs */
337
+ --dds-tabs-border: #4b5563; /* gray-600 */
338
+ --dds-tabs-tab-bg: transparent;
339
+ --dds-tabs-tab-text: #9ca3af; /* gray-400 */
340
+ --dds-tabs-tab-text-hover: #e5e7eb; /* gray-200 */
341
+ --dds-tabs-tab-bg-hover: transparent;
342
+ --dds-tabs-tab-text-active: #f9fafb; /* gray-50 */
343
+ --dds-tabs-tab-bg-active: transparent;
344
+ --dds-tabs-tab-border-active: #60a5fa; /* blue-400 */
345
+ --dds-tabs-panel-text: #e5e7eb; /* gray-200 */
346
+
300
347
  /* CodeBlock */
301
348
  --dds-code-block-bg: #0a0a0a;
302
349
  --dds-code-block-border: #2e2e2e; /* hsla(0,0%,18%,1) */
@@ -339,6 +386,18 @@
339
386
  --dds-prism-keyword: #60a5fa; /* blue-400 */
340
387
  --dds-prism-function: #a78bfa; /* violet-400 */
341
388
  --dds-prism-regex: #fb923c; /* orange-400 */
389
+
390
+ /* Popover */
391
+ --dds-popover-bg: #1f2937; /* gray-800 */
392
+ --dds-popover-border: #4b5563; /* gray-600 */
393
+ --dds-popover-shadow:
394
+ 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 10px 15px -3px rgba(0, 0, 0, 0.4),
395
+ 0 2px 4px -1px rgba(0, 0, 0, 0.2);
396
+ --dds-popover-text: #e5e7eb; /* gray-200 */
397
+ --dds-popover-title-color: #f9fafb; /* gray-50 */
398
+ --dds-popover-eyebrow-color: #9ca3af; /* gray-400 */
399
+ --dds-popover-link-color: #60a5fa; /* blue-400 */
400
+ --dds-popover-link-color-hover: #93c5fd; /* blue-300 */
342
401
  }
343
402
  /* Auto dark mode — follows OS preference, opt-out with .dds-light */
344
403
  @media (prefers-color-scheme: dark) {
@@ -422,6 +481,17 @@
422
481
  --dds-collapser-icon-color: #9ca3af;
423
482
  --dds-collapser-text: #e5e7eb;
424
483
 
484
+ /* Tabs */
485
+ --dds-tabs-border: #4b5563;
486
+ --dds-tabs-tab-bg: transparent;
487
+ --dds-tabs-tab-text: #9ca3af;
488
+ --dds-tabs-tab-text-hover: #e5e7eb;
489
+ --dds-tabs-tab-bg-hover: transparent;
490
+ --dds-tabs-tab-text-active: #f9fafb;
491
+ --dds-tabs-tab-bg-active: transparent;
492
+ --dds-tabs-tab-border-active: #60a5fa;
493
+ --dds-tabs-panel-text: #e5e7eb;
494
+
425
495
  /* CodeBlock */
426
496
  --dds-code-block-bg: #0a0a0a;
427
497
  --dds-code-block-border: #262626;
@@ -464,6 +534,18 @@
464
534
  --dds-prism-keyword: #60a5fa;
465
535
  --dds-prism-function: #a78bfa;
466
536
  --dds-prism-regex: #fb923c;
537
+
538
+ /* Popover */
539
+ --dds-popover-bg: #1f2937;
540
+ --dds-popover-border: #4b5563;
541
+ --dds-popover-shadow:
542
+ 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 10px 15px -3px rgba(0, 0, 0, 0.4),
543
+ 0 2px 4px -1px rgba(0, 0, 0, 0.2);
544
+ --dds-popover-text: #e5e7eb;
545
+ --dds-popover-title-color: #f9fafb;
546
+ --dds-popover-eyebrow-color: #9ca3af;
547
+ --dds-popover-link-color: #60a5fa;
548
+ --dds-popover-link-color-hover: #93c5fd;
467
549
  }
468
550
  }
469
551
  /* Explicit dark mode via data attribute (overrides OS preference) */
@@ -589,6 +671,18 @@
589
671
  --dds-prism-keyword: #60a5fa;
590
672
  --dds-prism-function: #a78bfa;
591
673
  --dds-prism-regex: #fb923c;
674
+
675
+ /* Popover */
676
+ --dds-popover-bg: #1f2937;
677
+ --dds-popover-border: #4b5563;
678
+ --dds-popover-shadow:
679
+ 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 10px 15px -3px rgba(0, 0, 0, 0.4),
680
+ 0 2px 4px -1px rgba(0, 0, 0, 0.2);
681
+ --dds-popover-text: #e5e7eb;
682
+ --dds-popover-title-color: #f9fafb;
683
+ --dds-popover-eyebrow-color: #9ca3af;
684
+ --dds-popover-link-color: #60a5fa;
685
+ --dds-popover-link-color-hover: #93c5fd;
592
686
  }
593
687
  /* Import PrismJS theme */
594
688
  /**
@@ -1279,6 +1373,50 @@ a.no-text-decoration {
1279
1373
  .dds-code-block-content .token.variable {
1280
1374
  color: var(--dds-prism-regex);
1281
1375
  }
1376
+ .dds-tabs {
1377
+ margin: var(--dds-tabs-margin);
1378
+ }
1379
+ .dds-tabs-list {
1380
+ display: flex;
1381
+ gap: 0;
1382
+ border-bottom: 1px solid var(--dds-tabs-border);
1383
+ overflow-x: auto;
1384
+ overflow-y: hidden;
1385
+ -webkit-overflow-scrolling: touch;
1386
+ scrollbar-width: none;
1387
+ -ms-overflow-style: none;
1388
+ }
1389
+ .dds-tabs-list::-webkit-scrollbar {
1390
+ display: none;
1391
+ }
1392
+ .dds-tab {
1393
+ padding: var(--dds-tabs-tab-padding);
1394
+ background-color: var(--dds-tabs-tab-bg);
1395
+ border: none;
1396
+ border-bottom: 2px solid transparent;
1397
+ color: var(--dds-tabs-tab-text);
1398
+ font-size: var(--dds-tabs-tab-size);
1399
+ font-weight: var(--dds-font-medium);
1400
+ cursor: pointer;
1401
+ white-space: nowrap;
1402
+ transition: var(--dds-transition-colors);
1403
+ }
1404
+ .dds-tab:hover {
1405
+ color: var(--dds-tabs-tab-text-hover);
1406
+ background-color: var(--dds-tabs-tab-bg-hover);
1407
+ }
1408
+ .dds-tab-active {
1409
+ color: var(--dds-tabs-tab-text-active);
1410
+ background-color: var(--dds-tabs-tab-bg-active);
1411
+ border-bottom-color: var(--dds-tabs-tab-border-active);
1412
+ }
1413
+ .dds-tab-active:hover {
1414
+ background-color: var(--dds-tabs-tab-bg-active);
1415
+ }
1416
+ .dds-tab-panel {
1417
+ padding: var(--dds-tabs-panel-padding);
1418
+ color: var(--dds-tabs-panel-text);
1419
+ }
1282
1420
  .dds-typography {
1283
1421
  color: var(--dds-heading-color);
1284
1422
  }
@@ -1328,4 +1466,226 @@ a.no-text-decoration {
1328
1466
  margin-bottom: 0.25rem; /* mb-1 */
1329
1467
  vertical-align: middle;
1330
1468
  }
1469
+ /* ==========================================================================
1470
+ Popover Component
1471
+ Uses the native Popover API for top-layer rendering.
1472
+ Positioning is handled via inline styles set by JS (getBoundingClientRect).
1473
+ ========================================================================== */
1474
+ /* Trigger */
1475
+ .dds-popover-trigger {
1476
+ display: inline;
1477
+ cursor: default;
1478
+ text-decoration-line: underline;
1479
+ text-decoration-style: dotted;
1480
+ text-decoration-color: currentColor;
1481
+ text-underline-offset: 3px;
1482
+ border-radius: 2px;
1483
+ outline-offset: 2px;
1484
+ }
1485
+ .dds-popover-trigger:focus-visible {
1486
+ outline: 2px solid var(--dds-link-color);
1487
+ }
1488
+ /* ==========================================================================
1489
+ Popover panel — rendered in the top layer via Popover API
1490
+ ========================================================================== */
1491
+ .dds-popover {
1492
+ /* Reset browser popover defaults */
1493
+ margin: 0;
1494
+ padding: 0;
1495
+ border: none;
1496
+ overflow: visible;
1497
+ inset: unset; /* we set top/left via JS */
1498
+
1499
+ /* Layout */
1500
+ position: fixed;
1501
+ width: var(--dds-popover-width-md);
1502
+ max-width: calc(100vw - 16px);
1503
+
1504
+ /* Appearance */
1505
+ background: var(--dds-popover-bg);
1506
+ border: 1px solid var(--dds-popover-border);
1507
+ border-radius: var(--dds-popover-radius);
1508
+ box-shadow: var(--dds-popover-shadow);
1509
+ color: var(--dds-popover-text);
1510
+ font-size: var(--dds-popover-text-size);
1511
+ line-height: var(--dds-line-height-relaxed);
1512
+
1513
+ /* Hidden by default (Popover API manages this, but we set it for fallback) */
1514
+ display: none;
1515
+ }
1516
+ /* Popover API open state */
1517
+ .dds-popover:popover-open {
1518
+ display: block;
1519
+ }
1520
+ /* ==========================================================================
1521
+ Entry / exit animations
1522
+ ========================================================================== */
1523
+ @keyframes dds-popover-in-bottom {
1524
+ from {
1525
+ opacity: 0;
1526
+ transform: translateY(-6px);
1527
+ }
1528
+ to {
1529
+ opacity: 1;
1530
+ transform: translateY(0);
1531
+ }
1532
+ }
1533
+ @keyframes dds-popover-in-top {
1534
+ from {
1535
+ opacity: 0;
1536
+ transform: translateY(6px);
1537
+ }
1538
+ to {
1539
+ opacity: 1;
1540
+ transform: translateY(0);
1541
+ }
1542
+ }
1543
+ .dds-popover:popover-open {
1544
+ animation: dds-popover-in-bottom 150ms ease forwards;
1545
+ }
1546
+ .dds-popover:popover-open[data-placement="top"] {
1547
+ animation: dds-popover-in-top 150ms ease forwards;
1548
+ }
1549
+ /* @starting-style enables the entry animation when the element first enters the top layer */
1550
+ @starting-style {
1551
+ .dds-popover:popover-open {
1552
+ opacity: 0;
1553
+ transform: translateY(-6px);
1554
+ }
1555
+
1556
+ .dds-popover:popover-open[data-placement="top"] {
1557
+ opacity: 0;
1558
+ transform: translateY(6px);
1559
+ }
1560
+ }
1561
+ /* ==========================================================================
1562
+ Size variants
1563
+ ========================================================================== */
1564
+ .dds-popover-sm {
1565
+ width: var(--dds-popover-width-sm);
1566
+ }
1567
+ .dds-popover-md {
1568
+ width: var(--dds-popover-width-md);
1569
+ }
1570
+ .dds-popover-lg {
1571
+ width: var(--dds-popover-width-lg);
1572
+ }
1573
+ /* ==========================================================================
1574
+ Shared inner elements
1575
+ ========================================================================== */
1576
+ .dds-popover-eyebrow {
1577
+ display: block;
1578
+ font-size: var(--dds-popover-eyebrow-size);
1579
+ font-weight: var(--dds-font-semibold);
1580
+ letter-spacing: 0.08em;
1581
+ text-transform: uppercase;
1582
+ color: var(--dds-popover-eyebrow-color);
1583
+ margin-bottom: 0.25rem;
1584
+ }
1585
+ .dds-popover-title {
1586
+ margin: 0 0 0.5rem;
1587
+ font-size: var(--dds-popover-title-size);
1588
+ font-weight: var(--dds-font-semibold);
1589
+ color: var(--dds-popover-title-color);
1590
+ line-height: var(--dds-line-height-tight);
1591
+ }
1592
+ .dds-popover-title dfn {
1593
+ font-style: normal;
1594
+ }
1595
+ .dds-popover-body {
1596
+ color: var(--dds-popover-text);
1597
+ font-size: var(--dds-popover-text-size);
1598
+ line-height: var(--dds-line-height-relaxed);
1599
+ }
1600
+ .dds-popover-body p {
1601
+ margin: 0;
1602
+ }
1603
+ .dds-popover-body a {
1604
+ color: var(--dds-popover-link-color);
1605
+ }
1606
+ .dds-popover-body a:hover {
1607
+ color: var(--dds-popover-link-color-hover);
1608
+ }
1609
+ /* ==========================================================================
1610
+ Glossary template
1611
+ ========================================================================== */
1612
+ .dds-popover-glossary {
1613
+ padding: var(--dds-popover-padding);
1614
+ }
1615
+ /* ==========================================================================
1616
+ Preview template
1617
+ ========================================================================== */
1618
+ .dds-popover-preview {
1619
+ /* no padding at top — image goes edge-to-edge */
1620
+ }
1621
+ .dds-popover-preview-image-wrap {
1622
+ width: 100%;
1623
+ height: var(--dds-popover-image-height);
1624
+ overflow: hidden;
1625
+ border-radius: var(--dds-popover-radius) var(--dds-popover-radius) 0 0;
1626
+ background: var(--dds-popover-border);
1627
+ }
1628
+ .dds-popover-preview-image {
1629
+ width: 100%;
1630
+ height: 100%;
1631
+ object-fit: cover;
1632
+ display: block;
1633
+ }
1634
+ .dds-popover-preview-body {
1635
+ padding: var(--dds-popover-padding);
1636
+ }
1637
+ .dds-popover-preview-link {
1638
+ display: inline-block;
1639
+ margin-top: 0.5rem;
1640
+ font-size: var(--dds-popover-text-size);
1641
+ font-weight: var(--dds-font-medium);
1642
+ color: var(--dds-popover-link-color);
1643
+ text-decoration: none;
1644
+ }
1645
+ .dds-popover-preview-link:hover {
1646
+ color: var(--dds-popover-link-color-hover);
1647
+ text-decoration: underline;
1648
+ }
1649
+ /* ==========================================================================
1650
+ Mobile — bottom sheet on small screens
1651
+ At ≤ 640px the popover slides up from the bottom of the viewport
1652
+ regardless of JS-computed position.
1653
+ ========================================================================== */
1654
+ @media (max-width: 640px) {
1655
+ .dds-popover:popover-open {
1656
+ /* Override JS-set position — anchor to bottom of viewport */
1657
+ top: auto !important;
1658
+ left: 0 !important;
1659
+ bottom: 0;
1660
+ width: 100% !important;
1661
+ max-width: 100%;
1662
+ border-radius: var(--dds-popover-radius) var(--dds-popover-radius) 0 0;
1663
+ border-left: none;
1664
+ border-right: none;
1665
+ border-bottom: none;
1666
+ animation: dds-popover-sheet-in 200ms ease forwards;
1667
+ }
1668
+
1669
+ .dds-popover-preview-image-wrap {
1670
+ border-radius: var(--dds-popover-radius) var(--dds-popover-radius) 0 0;
1671
+ }
1672
+ }
1673
+ @keyframes dds-popover-sheet-in {
1674
+ from {
1675
+ opacity: 0;
1676
+ transform: translateY(100%);
1677
+ }
1678
+ to {
1679
+ opacity: 1;
1680
+ transform: translateY(0);
1681
+ }
1682
+ }
1683
+ @starting-style {
1684
+ @media (max-width: 640px) {
1685
+ .dds-popover:popover-open {
1686
+ opacity: 0;
1687
+ transform: translateY(100%);
1688
+ }
1689
+ }
1690
+ }
1331
1691
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roadlittledawn/docs-design-system-react",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "license": "MIT",
5
5
  "description": "React components for documentation design system",
6
6
  "repository": {