@digiko-npm/designsystem 0.8.3 → 0.9.1

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.
@@ -1,4 +1,4 @@
1
- /* @ds/designsystem v0.8.3 */
1
+ /* @ds/designsystem v0.9.1 */
2
2
  /* ==========================================================================
3
3
  @digiko-npm/designsystem
4
4
 
@@ -9479,6 +9479,628 @@ button.ds-tag:focus-visible {
9479
9479
  }
9480
9480
 
9481
9481
 
9482
+ /* ==========================================================================
9483
+ Component: Hero
9484
+ Full-width hero section with background image, gradient overlay,
9485
+ and optional frosted glass backdrop.
9486
+
9487
+ Intentionally uses theme-independent colors for text on photo backgrounds.
9488
+ The overlay uses color-mix() with --ds-color-bg for theme-aware darkening
9489
+ while title/subtitle stay white for readability on any photo.
9490
+
9491
+ Usage:
9492
+ <section class="ds-hero" style="background-image: url(...)">
9493
+ <div class="ds-hero__overlay"></div>
9494
+ <div class="ds-hero__content ds-container">
9495
+ <div class="ds-hero__backdrop">
9496
+ <h1 class="ds-hero__title ds-hero-title">Heading</h1>
9497
+ <p class="ds-hero__subtitle">Subheading</p>
9498
+ </div>
9499
+ </div>
9500
+ </section>
9501
+
9502
+ Variants:
9503
+ ds-hero--full Generous padding, auto height (no min-height)
9504
+ ds-hero__overlay--subtle Lighter overlay, photo shows through more
9505
+
9506
+ ARIA: role="banner" or within <header>. Background images are decorative
9507
+ — add meaningful content in the markup, not in CSS.
9508
+ ========================================================================== */
9509
+
9510
+ .ds-hero {
9511
+ position: relative;
9512
+ min-height: 28rem;
9513
+ display: flex;
9514
+ align-items: center;
9515
+ justify-content: center;
9516
+ text-align: center;
9517
+ background-size: cover;
9518
+ background-position: center;
9519
+ }
9520
+
9521
+ /* --- Full variant (generous padding, no min-height) --- */
9522
+ .ds-hero--full {
9523
+ min-height: auto;
9524
+ padding-block: var(--ds-space-16);
9525
+ }
9526
+
9527
+ @media (min-width: 768px) {
9528
+
9529
+ .ds-hero--full {
9530
+ padding-block: var(--ds-space-20);
9531
+ }
9532
+ }
9533
+
9534
+
9535
+ /* --- Gradient overlay (theme-aware darkening) --- */
9536
+ .ds-hero__overlay {
9537
+ position: absolute;
9538
+ inset: 0;
9539
+ background: linear-gradient(
9540
+ to bottom,
9541
+ color-mix(in srgb, var(--ds-color-bg) 70%, transparent),
9542
+ color-mix(in srgb, var(--ds-color-bg) 92%, transparent)
9543
+ );
9544
+ }
9545
+
9546
+ .ds-hero__overlay--subtle {
9547
+ background: linear-gradient(
9548
+ to bottom,
9549
+ color-mix(in srgb, var(--ds-color-bg) 20%, transparent),
9550
+ color-mix(in srgb, var(--ds-color-bg) 40%, transparent)
9551
+ );
9552
+ }
9553
+
9554
+ [data-theme="dark"] .ds-hero__overlay {
9555
+ background: linear-gradient(
9556
+ to bottom,
9557
+ color-mix(in srgb, var(--ds-color-bg) 80%, transparent),
9558
+ color-mix(in srgb, var(--ds-color-bg) 95%, transparent)
9559
+ );
9560
+ }
9561
+
9562
+ [data-theme="dark"] .ds-hero__overlay--subtle {
9563
+ background: linear-gradient(
9564
+ to bottom,
9565
+ color-mix(in srgb, var(--ds-color-bg) 30%, transparent),
9566
+ color-mix(in srgb, var(--ds-color-bg) 50%, transparent)
9567
+ );
9568
+ }
9569
+
9570
+ /* --- Content wrapper (above overlay) --- */
9571
+ .ds-hero__content {
9572
+ position: relative;
9573
+ z-index: 1;
9574
+ width: 100%;
9575
+ }
9576
+
9577
+ /* --- Frosted glass backdrop --- */
9578
+ .ds-hero__backdrop {
9579
+ display: block;
9580
+ padding: var(--ds-space-8);
9581
+ border-radius: var(--ds-radius-2xl);
9582
+ background: rgba(0, 0, 0, 0.35);
9583
+ backdrop-filter: blur(32px) saturate(1.6);
9584
+ -webkit-backdrop-filter: blur(32px) saturate(1.6);
9585
+ max-width: 40rem;
9586
+ margin-inline: auto;
9587
+ }
9588
+
9589
+ /* --- Title & subtitle (theme-independent white for photo readability) --- */
9590
+ .ds-hero__title {
9591
+ color: #fff;
9592
+ }
9593
+
9594
+ .ds-hero__subtitle {
9595
+ color: rgba(255, 255, 255, 0.85);
9596
+ }
9597
+
9598
+ /* ==========================================================================
9599
+ Component: Admin Layout
9600
+ Parent-driven sidebar + header + main content system for admin dashboards.
9601
+
9602
+ All width/offset decisions are controlled by a SINGLE class on .ds-admin:
9603
+ - .ds-admin--expanded → sidebar 16rem, offsets 16rem
9604
+ - .ds-admin--collapsed → sidebar 4rem, offsets 4rem
9605
+
9606
+ This guarantees sidebar, header, and main content transition in perfect sync.
9607
+
9608
+ Variants:
9609
+ ds-admin--expanded Sidebar open (16rem) — default on desktop
9610
+ ds-admin--collapsed Sidebar collapsed (4rem) — icons only
9611
+
9612
+ Usage:
9613
+ <div class="ds-admin ds-admin--expanded">
9614
+ <aside class="ds-admin__sidebar">
9615
+ <div class="ds-admin__sidebar-header">Logo</div>
9616
+ <nav class="ds-admin__nav">
9617
+ <a class="ds-admin__nav-item ds-admin__nav-item--active">
9618
+ <span class="ds-admin__nav-icon">...</span>
9619
+ <span class="ds-admin__nav-label">Dashboard</span>
9620
+ </a>
9621
+ <div class="ds-admin__subnav">
9622
+ <a class="ds-admin__subnav-item">Sub page</a>
9623
+ </div>
9624
+ </nav>
9625
+ <div class="ds-admin__sidebar-footer">
9626
+ <a class="ds-admin__footer-link">Settings</a>
9627
+ </div>
9628
+ </aside>
9629
+ <header class="ds-admin__header">
9630
+ <div class="ds-admin__header-inner">...</div>
9631
+ </header>
9632
+ <main class="ds-admin__main">
9633
+ <div class="ds-admin__content">...</div>
9634
+ </main>
9635
+ </div>
9636
+
9637
+ Mobile: Sidebar is hidden. Use ds-drawer for mobile menu.
9638
+ Toggle .ds-admin__overlay when mobile menu is open.
9639
+
9640
+ ARIA:
9641
+ - <aside> should have role="navigation" or aria-label="Admin navigation"
9642
+ - Active nav item: aria-current="page"
9643
+ - Mobile toggle: aria-expanded, aria-controls
9644
+ ========================================================================== */
9645
+
9646
+ /* --- Layout Variables --- */
9647
+ .ds-admin {
9648
+ --ds-admin-sidebar-w: 16rem;
9649
+ --ds-admin-sidebar-w-collapsed: 4rem;
9650
+ --ds-admin-header-h: var(--ds-size-4);
9651
+ }
9652
+
9653
+ /* ==========================================================================
9654
+ Sidebar
9655
+ ========================================================================== */
9656
+
9657
+ .ds-admin__sidebar {
9658
+ display: none;
9659
+ position: fixed;
9660
+ inset-block-start: 0;
9661
+ inset-inline-start: 0;
9662
+ z-index: var(--ds-z-dropdown);
9663
+ height: 100dvh;
9664
+ flex-direction: column;
9665
+ border-inline-end: 1px solid var(--ds-color-border);
9666
+ background-color: var(--ds-color-surface);
9667
+ transition: width var(--ds-duration-normal) var(--ds-ease-default);
9668
+ overflow: hidden;
9669
+ }
9670
+
9671
+ @media (min-width: 1024px) {
9672
+
9673
+ .ds-admin__sidebar {
9674
+ display: flex;
9675
+ }
9676
+
9677
+ .ds-admin--expanded .ds-admin__sidebar {
9678
+ width: var(--ds-admin-sidebar-w);
9679
+ }
9680
+
9681
+ .ds-admin--collapsed .ds-admin__sidebar {
9682
+ width: var(--ds-admin-sidebar-w-collapsed);
9683
+ }
9684
+
9685
+ /* Centered items in collapsed state */
9686
+ .ds-admin--collapsed .ds-admin__nav-item {
9687
+ justify-content: center;
9688
+ }
9689
+
9690
+ .ds-admin--collapsed .ds-admin__footer-link {
9691
+ justify-content: center;
9692
+ }
9693
+
9694
+ /* Hide labels in collapsed state */
9695
+ .ds-admin--collapsed .ds-admin__nav-label,
9696
+ .ds-admin--collapsed .ds-admin__sidebar-badge {
9697
+ display: none;
9698
+ }
9699
+
9700
+ /* Hide subnav in collapsed state */
9701
+ .ds-admin--collapsed .ds-admin__subnav {
9702
+ display: none;
9703
+ }
9704
+ }
9705
+
9706
+
9707
+ /* --- Sidebar Header (logo area) --- */
9708
+ .ds-admin__sidebar-header {
9709
+ display: flex;
9710
+ min-height: var(--ds-admin-header-h);
9711
+ align-items: center;
9712
+ gap: var(--ds-space-2);
9713
+ border-block-end: 1px solid var(--ds-color-border);
9714
+ padding: var(--ds-space-4);
9715
+ }
9716
+
9717
+ .ds-admin--collapsed .ds-admin__sidebar-header {
9718
+ justify-content: center;
9719
+ }
9720
+
9721
+ /* --- Sidebar Badge (env indicator, version, etc.) --- */
9722
+ .ds-admin__sidebar-badge {
9723
+ border-radius: var(--ds-radius-md);
9724
+ border: 1px solid var(--ds-color-border);
9725
+ background-color: var(--ds-color-bg-elevated);
9726
+ padding: var(--ds-space-0-5) var(--ds-space-1-5);
9727
+ font-size: var(--ds-text-xs);
9728
+ font-weight: var(--ds-weight-medium);
9729
+ color: var(--ds-color-text-secondary);
9730
+ }
9731
+
9732
+ /* --- Navigation Area --- */
9733
+ .ds-admin__nav {
9734
+ flex: 1;
9735
+ overflow-y: auto;
9736
+ padding: var(--ds-space-6) var(--ds-space-3);
9737
+ }
9738
+
9739
+ .ds-admin__nav > * + * {
9740
+ margin-block-start: var(--ds-space-1);
9741
+ }
9742
+
9743
+ /* --- Nav Item --- */
9744
+ .ds-admin__nav-item {
9745
+ display: flex;
9746
+ align-items: center;
9747
+ gap: var(--ds-space-3);
9748
+ border-radius: var(--ds-radius-xl);
9749
+ padding: var(--ds-space-2-5) var(--ds-space-3);
9750
+ color: var(--ds-color-text-secondary);
9751
+ transition:
9752
+ background-color var(--ds-duration-fast) var(--ds-ease-default),
9753
+ color var(--ds-duration-fast) var(--ds-ease-default);
9754
+ }
9755
+
9756
+ .ds-admin__nav-item:hover {
9757
+ background-color: var(--ds-color-surface-hover);
9758
+ color: var(--ds-color-text);
9759
+ }
9760
+
9761
+ .ds-admin__nav-item--active {
9762
+ background-color: var(--ds-color-bg-elevated);
9763
+ color: var(--ds-color-text);
9764
+ }
9765
+
9766
+ /* --- Nav Icon (fixed size prevents reflow on collapse) --- */
9767
+ .ds-admin__nav-icon {
9768
+ display: flex;
9769
+ align-items: center;
9770
+ justify-content: center;
9771
+ width: 20px;
9772
+ height: 20px;
9773
+ flex-shrink: 0;
9774
+ }
9775
+
9776
+ /* --- Nav Label --- */
9777
+ .ds-admin__nav-label {
9778
+ white-space: nowrap;
9779
+ font-size: var(--ds-text-sm);
9780
+ font-weight: var(--ds-weight-medium);
9781
+ }
9782
+
9783
+ /* --- Sub-Navigation (nested under a parent item) --- */
9784
+ .ds-admin__subnav {
9785
+ display: flex;
9786
+ flex-direction: column;
9787
+ gap: var(--ds-space-0-5);
9788
+ margin-inline-start: 1.75rem;
9789
+ padding-inline-start: var(--ds-space-3);
9790
+ padding-block: var(--ds-space-1);
9791
+ border-inline-start: 1px solid var(--ds-color-border);
9792
+ }
9793
+
9794
+ .ds-admin__subnav-item {
9795
+ display: block;
9796
+ padding: var(--ds-space-1-5) var(--ds-space-3);
9797
+ font-size: var(--ds-text-sm);
9798
+ font-weight: var(--ds-weight-medium);
9799
+ color: var(--ds-color-text-tertiary);
9800
+ border-radius: var(--ds-radius-lg);
9801
+ transition:
9802
+ background-color var(--ds-duration-fast) var(--ds-ease-default),
9803
+ color var(--ds-duration-fast) var(--ds-ease-default);
9804
+ }
9805
+
9806
+ .ds-admin__subnav-item:hover:not(.ds-admin__subnav-item--active) {
9807
+ background-color: var(--ds-color-surface-hover);
9808
+ color: var(--ds-color-text-secondary);
9809
+ }
9810
+
9811
+ .ds-admin__subnav-item--active {
9812
+ background-color: var(--ds-color-bg-elevated);
9813
+ color: var(--ds-color-text);
9814
+ }
9815
+
9816
+ /* --- Sidebar Footer --- */
9817
+ .ds-admin__sidebar-footer {
9818
+ border-block-start: 1px solid var(--ds-color-border);
9819
+ padding: var(--ds-space-3);
9820
+ }
9821
+
9822
+ .ds-admin__sidebar-footer > * + * {
9823
+ margin-block-start: var(--ds-space-1);
9824
+ }
9825
+
9826
+ /* --- Footer Link --- */
9827
+ .ds-admin__footer-link {
9828
+ display: flex;
9829
+ width: 100%;
9830
+ align-items: center;
9831
+ gap: var(--ds-space-3);
9832
+ border-radius: var(--ds-radius-xl);
9833
+ padding: var(--ds-space-2-5) var(--ds-space-3);
9834
+ color: var(--ds-color-text-secondary);
9835
+ transition:
9836
+ background-color var(--ds-duration-fast) var(--ds-ease-default),
9837
+ color var(--ds-duration-fast) var(--ds-ease-default);
9838
+ }
9839
+
9840
+ .ds-admin__footer-link:hover {
9841
+ background-color: var(--ds-color-surface-hover);
9842
+ color: var(--ds-color-text);
9843
+ }
9844
+
9845
+ /* ==========================================================================
9846
+ Header
9847
+ ========================================================================== */
9848
+
9849
+ .ds-admin__header {
9850
+ position: fixed;
9851
+ inset-inline: 0;
9852
+ inset-block-start: 0;
9853
+ z-index: 40;
9854
+ height: var(--ds-admin-header-h);
9855
+ border-block-end: 1px solid var(--ds-color-border);
9856
+ background-color: var(--ds-color-nav-bg);
9857
+ backdrop-filter: blur(20px) saturate(1.5);
9858
+ -webkit-backdrop-filter: blur(20px) saturate(1.5);
9859
+ }
9860
+
9861
+ .ds-admin__header-inner {
9862
+ display: flex;
9863
+ height: 100%;
9864
+ align-items: center;
9865
+ justify-content: space-between;
9866
+ padding-inline: var(--ds-space-6);
9867
+ margin-inline-start: 0;
9868
+ transition: margin-inline-start var(--ds-duration-normal) var(--ds-ease-default);
9869
+ }
9870
+
9871
+ /* Hide toggle on desktop */
9872
+ @media (min-width: 1024px) {
9873
+
9874
+ .ds-admin__header-toggle {
9875
+ display: none;
9876
+ }
9877
+
9878
+ .ds-admin--expanded .ds-admin__header-inner {
9879
+ margin-inline-start: var(--ds-admin-sidebar-w);
9880
+ }
9881
+
9882
+ .ds-admin--collapsed .ds-admin__header-inner {
9883
+ margin-inline-start: var(--ds-admin-sidebar-w-collapsed);
9884
+ }
9885
+ }
9886
+
9887
+
9888
+ /* ==========================================================================
9889
+ Main Content
9890
+ ========================================================================== */
9891
+
9892
+ .ds-admin__main {
9893
+ padding-block-start: var(--ds-admin-header-h);
9894
+ margin-inline-start: 0;
9895
+ transition: margin-inline-start var(--ds-duration-normal) var(--ds-ease-default);
9896
+ }
9897
+
9898
+ @media (min-width: 1024px) {
9899
+
9900
+ .ds-admin--expanded .ds-admin__main {
9901
+ margin-inline-start: var(--ds-admin-sidebar-w);
9902
+ }
9903
+
9904
+ .ds-admin--collapsed .ds-admin__main {
9905
+ margin-inline-start: var(--ds-admin-sidebar-w-collapsed);
9906
+ }
9907
+ }
9908
+
9909
+
9910
+ .ds-admin__content {
9911
+ min-height: 100dvh;
9912
+ padding: var(--ds-space-8) var(--ds-space-6);
9913
+ }
9914
+
9915
+ @media (min-width: 768px) {
9916
+
9917
+ .ds-admin__content {
9918
+ padding-inline: var(--ds-space-8);
9919
+ }
9920
+ }
9921
+
9922
+
9923
+ @media (min-width: 1024px) {
9924
+
9925
+ .ds-admin__content {
9926
+ padding-inline: var(--ds-space-12);
9927
+ }
9928
+ }
9929
+
9930
+
9931
+ .ds-admin__container {
9932
+ max-width: 80rem;
9933
+ margin-inline: auto;
9934
+ }
9935
+
9936
+ /* ==========================================================================
9937
+ Mobile Overlay
9938
+ ========================================================================== */
9939
+
9940
+ .ds-admin__overlay {
9941
+ position: fixed;
9942
+ inset: 0;
9943
+ z-index: var(--ds-z-overlay);
9944
+ background-color: var(--ds-color-overlay);
9945
+ }
9946
+
9947
+ @media (min-width: 1024px) {
9948
+
9949
+ .ds-admin__overlay {
9950
+ display: none;
9951
+ }
9952
+ }
9953
+
9954
+
9955
+ /* ==========================================================================
9956
+ Mobile Menu (fullscreen drawer, no animation — uses ds-drawer)
9957
+ ========================================================================== */
9958
+
9959
+ .ds-admin__mobile-menu {
9960
+ transition: none;
9961
+ }
9962
+
9963
+ .ds-admin__mobile-menu .ds-drawer__content {
9964
+ width: 100vw;
9965
+ max-width: 100vw;
9966
+ transition: none;
9967
+ }
9968
+
9969
+ .ds-admin__mobile-menu .ds-drawer__body {
9970
+ display: flex;
9971
+ flex-direction: column;
9972
+ }
9973
+
9974
+ @media (min-width: 1024px) {
9975
+
9976
+ .ds-admin__mobile-menu {
9977
+ display: none !important;
9978
+ }
9979
+ }
9980
+
9981
+
9982
+
9983
+ /* === Content — Rich text and prose === */
9984
+ /* ==========================================================================
9985
+ Component: Prose Block
9986
+ Full markdown-rendered content styling. Use for CMS output, blog posts,
9987
+ documentation, or any container with user-generated rich text.
9988
+
9989
+ Note: The lighter `.ds-prose` in base/typography.css handles simple
9990
+ inline rich text (p + p spacing, links, lists). This component is for
9991
+ comprehensive markdown rendering with headings, code blocks, blockquotes,
9992
+ images, and horizontal rules.
9993
+
9994
+ Usage:
9995
+ <div class="ds-prose-block">
9996
+ <h2>Title</h2>
9997
+ <p>Paragraph with <a href="#">link</a> and <code>code</code>.</p>
9998
+ <pre><code>code block</code></pre>
9999
+ <blockquote>Quote</blockquote>
10000
+ </div>
10001
+ ========================================================================== */
10002
+
10003
+ .ds-prose-block {
10004
+ line-height: var(--ds-leading-relaxed);
10005
+ }
10006
+
10007
+ .ds-prose-block :is(h1, h2, h3, h4, h5, h6) {
10008
+ font-family: var(--ds-font-display);
10009
+ font-weight: var(--ds-font-display-weight);
10010
+ letter-spacing: var(--ds-tracking-tight);
10011
+ color: var(--ds-color-text);
10012
+ margin-block-start: 1.5em;
10013
+ margin-block-end: 0.5em;
10014
+ }
10015
+
10016
+ .ds-prose-block :is(h1, h2, h3, h4, h5, h6):first-child {
10017
+ margin-block-start: 0;
10018
+ }
10019
+
10020
+ .ds-prose-block p {
10021
+ color: var(--ds-color-text-secondary);
10022
+ margin-block-end: 1em;
10023
+ }
10024
+
10025
+ .ds-prose-block p:last-child {
10026
+ margin-block-end: 0;
10027
+ }
10028
+
10029
+ .ds-prose-block a {
10030
+ color: var(--ds-color-interactive);
10031
+ text-decoration: none;
10032
+ }
10033
+
10034
+ .ds-prose-block a:hover {
10035
+ text-decoration: underline;
10036
+ }
10037
+
10038
+ .ds-prose-block strong {
10039
+ color: var(--ds-color-text);
10040
+ font-weight: var(--ds-weight-semibold);
10041
+ }
10042
+
10043
+ .ds-prose-block code {
10044
+ font-family: var(--ds-font-mono);
10045
+ font-size: var(--ds-text-sm);
10046
+ background-color: var(--ds-color-bg-elevated);
10047
+ padding: 0.125em 0.375em;
10048
+ border-radius: var(--ds-radius-sm);
10049
+ }
10050
+
10051
+ .ds-prose-block pre {
10052
+ background-color: var(--ds-color-bg-elevated);
10053
+ padding: var(--ds-space-4);
10054
+ border-radius: var(--ds-radius-lg);
10055
+ overflow-x: auto;
10056
+ margin-block-end: 1em;
10057
+ }
10058
+
10059
+ .ds-prose-block pre code {
10060
+ background: none;
10061
+ padding: 0;
10062
+ border-radius: 0;
10063
+ }
10064
+
10065
+ .ds-prose-block ul,
10066
+ .ds-prose-block ol {
10067
+ padding-inline-start: 1.5em;
10068
+ margin-block-end: 1em;
10069
+ color: var(--ds-color-text-secondary);
10070
+ }
10071
+
10072
+ .ds-prose-block li {
10073
+ margin-block-end: 0.25em;
10074
+ }
10075
+
10076
+ .ds-prose-block ul {
10077
+ list-style-type: disc;
10078
+ }
10079
+
10080
+ .ds-prose-block ol {
10081
+ list-style-type: decimal;
10082
+ }
10083
+
10084
+ .ds-prose-block blockquote {
10085
+ border-inline-start: 3px solid var(--ds-color-border);
10086
+ padding-inline-start: var(--ds-space-4);
10087
+ color: var(--ds-color-text-secondary);
10088
+ font-style: italic;
10089
+ margin-block-end: 1em;
10090
+ }
10091
+
10092
+ .ds-prose-block hr {
10093
+ border: none;
10094
+ border-block-start: 1px solid var(--ds-color-border);
10095
+ margin-block: var(--ds-space-6);
10096
+ }
10097
+
10098
+ .ds-prose-block img {
10099
+ max-width: 100%;
10100
+ border-radius: var(--ds-radius-lg);
10101
+ margin-block-end: 1em;
10102
+ }
10103
+
9482
10104
 
9483
10105
  /* === Action — Trigger operations and commands === */
9484
10106
  /* ==========================================================================
@@ -10710,6 +11332,33 @@ tr:hover .ds-sortable__handle,
10710
11332
  }
10711
11333
 
10712
11334
 
11335
+ /* --- Responsive: Flex (extended) --- */
11336
+ @media (min-width: 640px) {
11337
+
11338
+ .ds-sm\:flex-none { flex: none; }
11339
+ .ds-sm\:items-center { align-items: center; }
11340
+ .ds-sm\:justify-between { justify-content: space-between; }
11341
+ .ds-sm\:gap-4 { gap: var(--ds-space-4); }
11342
+ .ds-sm\:gap-8 { gap: var(--ds-space-8); }
11343
+ .ds-sm\:inline { display: inline; }
11344
+ }
11345
+
11346
+
11347
+ @media (min-width: 768px) {
11348
+
11349
+ .ds-md\:grid-cols-5 { grid-template-columns: repeat(5, 1fr); }
11350
+ }
11351
+
11352
+
11353
+ @media (min-width: 1024px) /* --ds-breakpoint-lg */ {
11354
+
11355
+ .ds-lg\:flex-row { flex-direction: row; }
11356
+ .ds-lg\:gap-4 { gap: var(--ds-space-4); }
11357
+ .ds-lg\:gap-6 { gap: var(--ds-space-6); }
11358
+ .ds-lg\:gap-8 { gap: var(--ds-space-8); }
11359
+ }
11360
+
11361
+
10713
11362
  /* --- Aspect Ratio --- */
10714
11363
  .ds-aspect-square { aspect-ratio: 1; }
10715
11364
  .ds-aspect-video { aspect-ratio: 16/9; }
@@ -10802,8 +11451,15 @@ tr:hover .ds-sortable__handle,
10802
11451
 
10803
11452
  .ds-mt-0\.5 { margin-block-start: var(--ds-space-0-5); }
10804
11453
  .ds-mt-3 { margin-block-start: var(--ds-space-3); }
11454
+ .ds-mt-10 { margin-block-start: var(--ds-space-10); }
11455
+ .ds-mt-12 { margin-block-start: var(--ds-space-12); }
11456
+ .ds-mt-16 { margin-block-start: var(--ds-space-16); }
10805
11457
  .ds-mb-0\.5 { margin-block-end: var(--ds-space-0-5); }
10806
11458
  .ds-mb-3 { margin-block-end: var(--ds-space-3); }
11459
+ .ds-mb-10 { margin-block-end: var(--ds-space-10); }
11460
+ .ds-mb-12 { margin-block-end: var(--ds-space-12); }
11461
+ .ds-mb-16 { margin-block-end: var(--ds-space-16); }
11462
+ .ds-mb-20 { margin-block-end: var(--ds-space-20); }
10807
11463
 
10808
11464
  /* --- Padding (granular) --- */
10809
11465
  .ds-p-0\.5 { padding: var(--ds-space-0-5); }
@@ -10840,7 +11496,21 @@ tr:hover .ds-sortable__handle,
10840
11496
  .ds-space-y-6 > * + * { margin-block-start: var(--ds-space-6); }
10841
11497
  .ds-space-y-8 > * + * { margin-block-start: var(--ds-space-8); }
10842
11498
 
11499
+ /* --- Space-Y (fractional) --- */
11500
+ .ds-space-y-1\.5 > * + * { margin-block-start: var(--ds-space-1-5); }
11501
+
10843
11502
  /* --- Responsive: Padding --- */
11503
+ @media (min-width: 640px) {
11504
+
11505
+ .ds-sm\:p-6 { padding: var(--ds-space-6); }
11506
+ .ds-sm\:px-0 { padding-inline: var(--ds-space-0); }
11507
+ .ds-sm\:px-3 { padding-inline: var(--ds-space-3); }
11508
+ .ds-sm\:px-4 { padding-inline: var(--ds-space-4); }
11509
+ .ds-sm\:px-6 { padding-inline: var(--ds-space-6); }
11510
+ .ds-sm\:py-3 { padding-block: var(--ds-space-3); }
11511
+ }
11512
+
11513
+
10844
11514
  @media (min-width: 768px) {
10845
11515
 
10846
11516
  .ds-md\:px-4 { padding-inline: var(--ds-space-4); }
@@ -10862,6 +11532,80 @@ tr:hover .ds-sortable__handle,
10862
11532
  }
10863
11533
 
10864
11534
 
11535
+ /* ==========================================================================
11536
+ Utilities: Sizing
11537
+ Width, height, min/max constraints.
11538
+ Extends the base sizing in layout.css with the full spacing scale.
11539
+ ========================================================================== */
11540
+
11541
+ /* --- Width (values not already in layout.css) --- */
11542
+ .ds-w-0 { width: var(--ds-space-0); }
11543
+ .ds-w-1 { width: var(--ds-space-1); }
11544
+ .ds-w-1\.5 { width: var(--ds-space-1-5); }
11545
+ .ds-w-2 { width: var(--ds-space-2); }
11546
+ .ds-w-3\.5 { width: 0.875rem; }
11547
+ .ds-w-6 { width: var(--ds-space-6); }
11548
+ .ds-w-12 { width: var(--ds-space-12); }
11549
+ .ds-w-16 { width: var(--ds-space-16); }
11550
+ .ds-w-20 { width: var(--ds-space-20); }
11551
+ .ds-w-24 { width: var(--ds-space-24); }
11552
+ .ds-w-28 { width: 7rem; }
11553
+ .ds-w-32 { width: var(--ds-space-32); }
11554
+ .ds-w-48 { width: 12rem; }
11555
+ .ds-w-56 { width: 14rem; }
11556
+ .ds-w-64 { width: 16rem; }
11557
+ .ds-w-80 { width: 20rem; }
11558
+ .ds-w-96 { width: 24rem; }
11559
+ .ds-w-auto { width: auto; }
11560
+ .ds-w-screen { width: 100vw; }
11561
+
11562
+ /* --- Height (values not already in layout.css) --- */
11563
+ .ds-h-0 { height: var(--ds-space-0); }
11564
+ .ds-h-0\.5 { height: var(--ds-space-0-5); }
11565
+ .ds-h-1 { height: var(--ds-space-1); }
11566
+ .ds-h-1\.5 { height: var(--ds-space-1-5); }
11567
+ .ds-h-2 { height: var(--ds-space-2); }
11568
+ .ds-h-3\.5 { height: 0.875rem; }
11569
+ .ds-h-6 { height: var(--ds-space-6); }
11570
+ .ds-h-12 { height: var(--ds-space-12); }
11571
+ .ds-h-14 { height: 3.5rem; }
11572
+ .ds-h-20 { height: var(--ds-space-20); }
11573
+ .ds-h-24 { height: var(--ds-space-24); }
11574
+ .ds-h-28 { height: 7rem; }
11575
+ .ds-h-32 { height: var(--ds-space-32); }
11576
+ .ds-h-48 { height: 12rem; }
11577
+ .ds-h-64 { height: 16rem; }
11578
+ .ds-h-96 { height: 24rem; }
11579
+ .ds-h-auto { height: auto; }
11580
+ .ds-h-px { height: 1px; }
11581
+
11582
+ /* --- Max Width (extended) --- */
11583
+ .ds-max-w-4xl { max-width: 56rem; }
11584
+ .ds-max-w-5xl { max-width: 64rem; }
11585
+ .ds-max-w-6xl { max-width: 72rem; }
11586
+ .ds-max-w-7xl { max-width: 80rem; }
11587
+ .ds-max-w-full { max-width: 100%; }
11588
+
11589
+ /* --- Max Height --- */
11590
+ .ds-max-h-64 { max-height: 16rem; }
11591
+ .ds-max-h-80 { max-height: 20rem; }
11592
+ .ds-max-h-96 { max-height: 24rem; }
11593
+ .ds-max-h-screen { max-height: 100dvh; }
11594
+
11595
+ /* --- Responsive: Sizing --- */
11596
+ @media (min-width: 640px) {
11597
+
11598
+ .ds-sm\:w-12 { width: var(--ds-space-12); }
11599
+ .ds-sm\:w-16 { width: var(--ds-space-16); }
11600
+ .ds-sm\:w-32 { width: var(--ds-space-32); }
11601
+ .ds-sm\:w-64 { width: 16rem; }
11602
+ .ds-sm\:w-96 { width: 24rem; }
11603
+ .ds-sm\:w-auto { width: auto; }
11604
+ .ds-sm\:h-12 { height: var(--ds-space-12); }
11605
+ .ds-sm\:h-32 { height: var(--ds-space-32); }
11606
+ }
11607
+
11608
+
10865
11609
  /* ==========================================================================
10866
11610
  Utilities: Text, Visual & style helpers
10867
11611
  ========================================================================== */
@@ -11021,6 +11765,13 @@ tr:hover .ds-sortable__handle,
11021
11765
  overflow: hidden;
11022
11766
  }
11023
11767
 
11768
+ .ds-line-clamp-1 {
11769
+ display: -webkit-box;
11770
+ -webkit-line-clamp: 1;
11771
+ -webkit-box-orient: vertical;
11772
+ overflow: hidden;
11773
+ }
11774
+
11024
11775
  .ds-line-clamp-3 {
11025
11776
  display: -webkit-box;
11026
11777
  -webkit-line-clamp: 3;
@@ -11028,6 +11779,12 @@ tr:hover .ds-sortable__handle,
11028
11779
  overflow: hidden;
11029
11780
  }
11030
11781
 
11782
+ /* --- Text Extras --- */
11783
+ .ds-line-through { text-decoration: line-through; }
11784
+ .ds-break-all { word-break: break-all; }
11785
+ .ds-list-disc { list-style-type: disc; }
11786
+ .ds-list-inside { list-style-position: inside; }
11787
+
11031
11788
  /* --- Font Family --- */
11032
11789
  .ds-font-mono { font-family: var(--ds-font-mono); }
11033
11790
  .ds-font-sans { font-family: var(--ds-font-sans); }
@@ -11038,6 +11795,7 @@ tr:hover .ds-sortable__handle,
11038
11795
  .ds-border-b { border-block-end: 1px solid var(--ds-color-border); }
11039
11796
  .ds-border-l { border-inline-start: 1px solid var(--ds-color-border); }
11040
11797
  .ds-border-r { border-inline-end: 1px solid var(--ds-color-border); }
11798
+ .ds-border-y { border-block-start: 1px solid var(--ds-color-border); border-block-end: 1px solid var(--ds-color-border); }
11041
11799
  .ds-border-none { border: none; }
11042
11800
 
11043
11801
  /* --- Border Color --- */
@@ -11058,8 +11816,15 @@ tr:hover .ds-sortable__handle,
11058
11816
  .ds-rounded-lg { border-radius: var(--ds-radius-lg); }
11059
11817
  .ds-rounded-xl { border-radius: var(--ds-radius-xl); }
11060
11818
  .ds-rounded-2xl { border-radius: var(--ds-radius-2xl); }
11819
+ .ds-rounded-3xl { border-radius: 1.5rem; }
11061
11820
  .ds-rounded-full { border-radius: var(--ds-radius-full); }
11062
11821
 
11822
+ /* --- Border Radius (directional) --- */
11823
+ .ds-rounded-t { border-start-start-radius: var(--ds-radius-md); border-start-end-radius: var(--ds-radius-md); }
11824
+ .ds-rounded-b { border-end-start-radius: var(--ds-radius-md); border-end-end-radius: var(--ds-radius-md); }
11825
+ .ds-rounded-t-2xl { border-start-start-radius: var(--ds-radius-2xl); border-start-end-radius: var(--ds-radius-2xl); }
11826
+ .ds-rounded-b-2xl { border-end-start-radius: var(--ds-radius-2xl); border-end-end-radius: var(--ds-radius-2xl); }
11827
+
11063
11828
  /* --- Shadow --- */
11064
11829
  .ds-shadow-sm { box-shadow: var(--ds-shadow-sm); }
11065
11830
  .ds-shadow { box-shadow: var(--ds-shadow-md); }
@@ -11068,7 +11833,11 @@ tr:hover .ds-sortable__handle,
11068
11833
 
11069
11834
  /* --- Opacity --- */
11070
11835
  .ds-opacity-0 { opacity: 0; }
11836
+ .ds-opacity-25 { opacity: 0.25; }
11071
11837
  .ds-opacity-50 { opacity: 0.5; }
11838
+ .ds-opacity-60 { opacity: 0.6; }
11839
+ .ds-opacity-70 { opacity: 0.7; }
11840
+ .ds-opacity-75 { opacity: 0.75; }
11072
11841
  .ds-opacity-100 { opacity: 1; }
11073
11842
 
11074
11843
  /* --- Cursor --- */
@@ -11082,6 +11851,7 @@ tr:hover .ds-sortable__handle,
11082
11851
  .ds-pointer-events-none { pointer-events: none; }
11083
11852
  .ds-select-none { user-select: none; }
11084
11853
  .ds-whitespace-nowrap { white-space: nowrap; }
11854
+ .ds-whitespace-pre-wrap { white-space: pre-wrap; }
11085
11855
 
11086
11856
  /* --- Backdrop --- */
11087
11857
  .ds-backdrop-blur {
@@ -11089,6 +11859,14 @@ tr:hover .ds-sortable__handle,
11089
11859
  -webkit-backdrop-filter: blur(20px) saturate(1.5);
11090
11860
  }
11091
11861
 
11862
+ .ds-backdrop-blur-sm {
11863
+ backdrop-filter: blur(4px);
11864
+ -webkit-backdrop-filter: blur(4px);
11865
+ }
11866
+
11867
+ /* --- Outline --- */
11868
+ .ds-outline-none { outline: none; }
11869
+
11092
11870
  /* --- Transform --- */
11093
11871
  .-ds-translate-y-1\/2 { transform: translateY(-50%); }
11094
11872
  .-ds-translate-x-1\/2 { transform: translateX(-50%); }
@@ -11119,6 +11897,17 @@ tr:hover .ds-sortable__handle,
11119
11897
  transition: transform var(--ds-duration-normal) var(--ds-ease-default);
11120
11898
  }
11121
11899
 
11900
+ /* --- Duration --- */
11901
+ .ds-duration-fast { transition-duration: var(--ds-duration-fast); }
11902
+ .ds-duration-normal { transition-duration: var(--ds-duration-normal); }
11903
+ .ds-duration-slow { transition-duration: var(--ds-duration-slow); }
11904
+ .ds-duration-slower { transition-duration: var(--ds-duration-slower); }
11905
+
11906
+ /* --- Easing --- */
11907
+ .ds-ease-default { transition-timing-function: var(--ds-ease-default); }
11908
+ .ds-ease-out { transition-timing-function: var(--ds-ease-out); }
11909
+ .ds-ease-out-expo { transition-timing-function: var(--ds-ease-out-expo); }
11910
+
11122
11911
  /* --- Animations --- */
11123
11912
  @keyframes ds-fade-in {
11124
11913
  from { opacity: 0; }
@@ -11310,6 +12099,81 @@ tr:hover .ds-sortable__handle,
11310
12099
  color: var(--ds-color-text);
11311
12100
  }
11312
12101
 
12102
+ /* ==========================================================================
12103
+ Utilities: State Variants
12104
+ Hover, focus, active, focus-within, placeholder, and group-hover
12105
+ modifiers for DS utility classes.
12106
+ ========================================================================== */
12107
+
12108
+ /* --- Group Marker (enables group-hover on descendants) ---
12109
+ Supports both .group and .ds-group for compatibility. */
12110
+ .ds-group { /* marker — no styles */ }
12111
+
12112
+ /* --- Hover: Background --- */
12113
+ .hover\:ds-bg-base:hover { background-color: var(--ds-color-bg); }
12114
+ .hover\:ds-bg-elevated:hover { background-color: var(--ds-color-bg-elevated); }
12115
+ .hover\:ds-bg-muted:hover { background-color: var(--ds-color-bg-muted); }
12116
+ .hover\:ds-bg-subtle:hover { background-color: var(--ds-color-bg-subtle); }
12117
+ .hover\:ds-bg-surface:hover { background-color: var(--ds-color-surface); }
12118
+ .hover\:ds-bg-inverted:hover { background-color: var(--ds-color-inverted); }
12119
+ .hover\:ds-bg-info:hover { background-color: var(--ds-color-info); }
12120
+
12121
+ /* --- Hover: Text --- */
12122
+ .hover\:ds-text-primary:hover { color: var(--ds-color-text); }
12123
+ .hover\:ds-text-secondary:hover { color: var(--ds-color-text-secondary); }
12124
+ .hover\:ds-text-interactive:hover { color: var(--ds-color-interactive); }
12125
+
12126
+ /* --- Hover: Border --- */
12127
+ .hover\:ds-border-hover:hover { border-color: var(--ds-color-border-hover); }
12128
+ .hover\:ds-border-interactive:hover { border-color: var(--ds-color-interactive); }
12129
+
12130
+ /* --- Hover: Decoration --- */
12131
+ .hover\:ds-underline:hover { text-decoration: underline; text-underline-offset: 2px; }
12132
+
12133
+ /* --- Focus --- */
12134
+ .focus\:ds-outline-none:focus { outline: none; }
12135
+ .focus\:ds-ring-0:focus { box-shadow: none; }
12136
+ .focus\:ds-ring-2:focus { box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-color-interactive); }
12137
+
12138
+ /* --- Focus-Within --- */
12139
+ .focus-within\:ds-border-interactive:focus-within { border-color: var(--ds-color-interactive); }
12140
+
12141
+ /* --- Active --- */
12142
+ .active\:ds-bg-elevated:active { background-color: var(--ds-color-bg-elevated); }
12143
+ .active\:ds-text-secondary:active { color: var(--ds-color-text-secondary); }
12144
+
12145
+ /* --- Placeholder --- */
12146
+ .placeholder\:ds-text-tertiary::placeholder { color: var(--ds-color-text-tertiary); }
12147
+
12148
+ /* --- Group Hover (descendants of .group or .ds-group on hover) --- */
12149
+ .group:hover > .group-hover\:ds-text-interactive,
12150
+ .group:hover .group-hover\:ds-text-interactive,
12151
+ .ds-group:hover > .group-hover\:ds-text-interactive,
12152
+ .ds-group:hover .group-hover\:ds-text-interactive {
12153
+ color: var(--ds-color-interactive);
12154
+ }
12155
+
12156
+ .group:hover > .group-hover\:ds-scale-110,
12157
+ .group:hover .group-hover\:ds-scale-110,
12158
+ .ds-group:hover > .group-hover\:ds-scale-110,
12159
+ .ds-group:hover .group-hover\:ds-scale-110 {
12160
+ transform: scale(1.1);
12161
+ }
12162
+
12163
+ .group:hover > .group-hover\:ds-translate-x-1,
12164
+ .group:hover .group-hover\:ds-translate-x-1,
12165
+ .ds-group:hover > .group-hover\:ds-translate-x-1,
12166
+ .ds-group:hover .group-hover\:ds-translate-x-1 {
12167
+ transform: translateX(0.25rem);
12168
+ }
12169
+
12170
+ .group:hover > .group-hover\:ds-opacity-100,
12171
+ .group:hover .group-hover\:ds-opacity-100,
12172
+ .ds-group:hover > .group-hover\:ds-opacity-100,
12173
+ .ds-group:hover .group-hover\:ds-opacity-100 {
12174
+ opacity: 1;
12175
+ }
12176
+
11313
12177
  /* ==========================================================================
11314
12178
  Utilities: Accessibility
11315
12179
  Screen-reader helpers, skip links, focus utilities, and motion control.