@jsekulowicz/ds-components 0.9.13 → 0.11.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.
Files changed (32) hide show
  1. package/custom-elements.json +323 -10
  2. package/dist/define.d.ts +1 -0
  3. package/dist/define.d.ts.map +1 -1
  4. package/dist/define.js +1 -0
  5. package/dist/define.js.map +1 -1
  6. package/dist/molecules/dialog/dialog.styles.d.ts.map +1 -1
  7. package/dist/molecules/dialog/dialog.styles.js +64 -13
  8. package/dist/molecules/dialog/dialog.styles.js.map +1 -1
  9. package/dist/molecules/drawer/define.d.ts +8 -0
  10. package/dist/molecules/drawer/define.d.ts.map +1 -0
  11. package/dist/molecules/drawer/define.js +6 -0
  12. package/dist/molecules/drawer/define.js.map +1 -0
  13. package/dist/molecules/drawer/drawer.d.ts +37 -0
  14. package/dist/molecules/drawer/drawer.d.ts.map +1 -0
  15. package/dist/molecules/drawer/drawer.js +144 -0
  16. package/dist/molecules/drawer/drawer.js.map +1 -0
  17. package/dist/molecules/drawer/drawer.styles.d.ts +2 -0
  18. package/dist/molecules/drawer/drawer.styles.d.ts.map +1 -0
  19. package/dist/molecules/drawer/drawer.styles.js +165 -0
  20. package/dist/molecules/drawer/drawer.styles.js.map +1 -0
  21. package/dist/molecules/drawer/index.d.ts +2 -0
  22. package/dist/molecules/drawer/index.d.ts.map +1 -0
  23. package/dist/molecules/drawer/index.js +2 -0
  24. package/dist/molecules/drawer/index.js.map +1 -0
  25. package/dist/templates/page-shell/page-shell.d.ts +6 -5
  26. package/dist/templates/page-shell/page-shell.d.ts.map +1 -1
  27. package/dist/templates/page-shell/page-shell.js +40 -47
  28. package/dist/templates/page-shell/page-shell.js.map +1 -1
  29. package/dist/templates/page-shell/page-shell.styles.d.ts.map +1 -1
  30. package/dist/templates/page-shell/page-shell.styles.js +12 -73
  31. package/dist/templates/page-shell/page-shell.styles.js.map +1 -1
  32. package/package.json +8 -1
@@ -12289,7 +12289,7 @@
12289
12289
  {
12290
12290
  "kind": "variable",
12291
12291
  "name": "dialogStyles",
12292
- "default": "css` :host { display: contents; } dialog { padding: 0; border: 0; background: transparent; color: inherit; width: 100%; max-height: min(90vh, 720px); border-radius: var(--ds-radius-sm); box-shadow: var(--ds-shadow-md); overflow: visible; } :host([size='sm']) dialog { max-width: 400px; } :host([size='md']) dialog { max-width: 560px; } :host([size='lg']) dialog { max-width: 800px; } dialog::backdrop { background: rgb(15 23 42 / 0.55); backdrop-filter: blur(2px); } ds-card { height: 100%; } ds-card::part(card) { height: 100%; max-height: 100%; box-shadow: none; border-color: transparent; gap: var(--ds-space-3); } ds-card::part(body) { flex: 1; min-height: 0; overflow-x: clip; overflow-y: auto; padding-inline: var(--ds-space-2); margin-inline: calc(var(--ds-space-2) * -1); } .title-row { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--ds-space-3); } .title-text { margin: 0; flex: 1; font-family: var(--ds-font-display); font-size: var(--ds-font-size-xl); font-weight: var(--ds-font-weight-semibold); letter-spacing: var(--ds-letter-spacing-display); } /* Slotted heading tags (h1-h6, etc.) carry UA defaults that compound on top of .title-text — a bigger font-size and large vertical margins. Normalise them so 'Foo', '<h2 slot=\"title\">Foo</h2>' and '<span slot=\"title\">Foo</span>' all render identically. */ .title-text ::slotted(*) { font: inherit; margin: 0; letter-spacing: inherit; } /* Pull the close button up and to the right so it sits near the card's top-right corner instead of indented by ds-card's full ds-space-6 padding. Its own visual chrome (size, hover, focus ring, square shape) comes from ds-button. */ .close-btn { margin-block-start: calc(var(--ds-space-3) * -1); margin-inline-end: calc(var(--ds-space-3) * -1); } .footer { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--ds-space-2); } `"
12292
+ "default": "css` /* @property registration so the scroll-driven keyframes can interpolate these as colors. */ @property --ds-dialog-body-top-fade { syntax: '<color>'; inherits: false; initial-value: rgb(0 0 0); } @property --ds-dialog-body-bottom-fade { syntax: '<color>'; inherits: false; initial-value: rgb(0 0 0); } :host { display: contents; } dialog { padding: 0; border: 0; background: transparent; color: inherit; width: calc(100% - var(--ds-space-4)); max-height: min(90vh, 720px); border-radius: var(--ds-radius-sm); box-shadow: var(--ds-shadow-md); overflow: visible; } /* Scope to [open] so closed dialogs stay display:none per UA. */ dialog[open] { display: flex; flex-direction: column; } :host([size='sm']) dialog { max-width: 400px; } :host([size='md']) dialog { max-width: 560px; } :host([size='lg']) dialog { max-width: 800px; } dialog::backdrop { background: rgb(15 23 42 / 0.55); } ds-card { flex: 1; min-height: 0; min-width: 0; } ds-card::part(card) { /* Match the dialog's cap explicitly; percentage heights don't resolve reliably through ds-card's display:block host, so body scroll breaks when content overflows. */ max-height: min(90vh, 720px); box-shadow: none; border-color: transparent; gap: var(--ds-space-3); } ds-card::part(body) { flex: 1; min-height: 0; overflow-x: clip; overflow-y: auto; overscroll-behavior: contain; /* Inline padding + negative margin lets focus rings on full-width children paint outside the body's clip box. */ padding-inline: var(--ds-space-2); margin-inline: calc(var(--ds-space-2) * -1); /* Scrollbar hidden; overflow is signalled by the scroll-driven fade mask defined in the keyframes below. */ scrollbar-width: none; mask-image: linear-gradient( to bottom, var(--ds-dialog-body-top-fade, rgb(0 0 0)) 0, rgb(0 0 0) var(--ds-space-6), rgb(0 0 0) calc(100% - var(--ds-space-6)), var(--ds-dialog-body-bottom-fade, rgb(0 0 0)) 100% ); animation: ds-dialog-body-scroll-fade linear; animation-timeline: scroll(self); } ds-card::part(body)::-webkit-scrollbar { display: none; } /* Top fade hidden at scroll-top, bottom fade hidden at scroll-end. Near-instant flips at 0.001% / 99.999% keep the transitions binary instead of interpolating across the scroll range. */ @keyframes ds-dialog-body-scroll-fade { 0% { --ds-dialog-body-top-fade: rgb(0 0 0); --ds-dialog-body-bottom-fade: rgb(0 0 0 / 0); } 0.001%, 99.999% { --ds-dialog-body-top-fade: rgb(0 0 0 / 0); --ds-dialog-body-bottom-fade: rgb(0 0 0 / 0); } 100% { --ds-dialog-body-top-fade: rgb(0 0 0 / 0); --ds-dialog-body-bottom-fade: rgb(0 0 0); } } .title-row { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--ds-space-3); } .title-text { margin: 0; flex: 1; font-family: var(--ds-font-display); font-size: var(--ds-font-size-xl); font-weight: var(--ds-font-weight-semibold); letter-spacing: var(--ds-letter-spacing-display); } /* Normalise slotted headings (h1-h6) so UA defaults don't compound with .title-text styles. */ .title-text ::slotted(*) { font: inherit; margin: 0; letter-spacing: inherit; } /* Pull the close button toward the card's top-right corner; the card's own padding would otherwise indent it. */ .close-btn { margin-block-start: calc(var(--ds-space-3) * -1); margin-inline-end: calc(var(--ds-space-3) * -1); } .footer { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--ds-space-2); } `"
12293
12293
  }
12294
12294
  ],
12295
12295
  "exports": [
@@ -12530,6 +12530,295 @@
12530
12530
  }
12531
12531
  ]
12532
12532
  },
12533
+ {
12534
+ "kind": "javascript-module",
12535
+ "path": "src/molecules/drawer/define.ts",
12536
+ "declarations": [],
12537
+ "exports": [
12538
+ {
12539
+ "kind": "custom-element-definition",
12540
+ "name": "ds-drawer",
12541
+ "declaration": {
12542
+ "name": "DsDrawer",
12543
+ "module": "/src/molecules/drawer/drawer.js"
12544
+ }
12545
+ }
12546
+ ]
12547
+ },
12548
+ {
12549
+ "kind": "javascript-module",
12550
+ "path": "src/molecules/drawer/drawer.styles.ts",
12551
+ "declarations": [
12552
+ {
12553
+ "kind": "variable",
12554
+ "name": "drawerStyles",
12555
+ "default": "css` /* @property registration so the scroll-driven keyframes can interpolate these as colors. */ @property --ds-drawer-body-top-fade { syntax: '<color>'; inherits: false; initial-value: rgb(0 0 0); } @property --ds-drawer-body-bottom-fade { syntax: '<color>'; inherits: false; initial-value: rgb(0 0 0); } :host { display: contents; } dialog { padding: 0; border: 0; background: transparent; color: inherit; box-shadow: var(--ds-shadow-lg); overflow: visible; height: 100vh; height: 100dvh; max-height: 100%; /* allow-discrete lets display/overlay hold their open values for the slide-in / slide-out duration. */ transition: transform var(--ds-duration-slow) var(--ds-easing-standard), display var(--ds-duration-slow) allow-discrete, overlay var(--ds-duration-slow) allow-discrete; } /* Scope to [open] so closed dialogs stay display:none per UA. */ dialog[open] { display: flex; flex-direction: column; } :host([side='start']) dialog { margin: 0; margin-inline-end: auto; transform: translateX(-100%); } :host([side='end']) dialog { margin: 0; margin-inline-start: auto; transform: translateX(100%); } :host([side='start']) dialog[open], :host([side='end']) dialog[open] { transform: translateX(0); } @starting-style { :host([side='start']) dialog[open] { transform: translateX(-100%); } :host([side='end']) dialog[open] { transform: translateX(100%); } } :host([size='sm']) dialog { width: min(20rem, 90vw); } :host([size='md']) dialog { width: min(24rem, 90vw); } :host([size='lg']) dialog { width: min(28rem, 90vw); } dialog::backdrop { background: rgb(15 23 42 / 0.55); } ds-card { flex: 1; min-height: 0; min-width: 0; } ds-card::part(card) { /* Explicit cap; percentage heights don't resolve reliably through ds-card's display:block host. */ max-height: 100vh; max-height: 100dvh; box-shadow: none; border-color: transparent; border-radius: 0; gap: var(--ds-space-3); padding: var(--ds-drawer-card-padding, var(--ds-space-6)); } ds-card::part(body) { flex: 1; min-height: 0; overflow-x: clip; overflow-y: auto; overscroll-behavior: contain; /* Inline padding + negative margin lets focus rings on full-width children paint outside the body's clip box. */ padding-inline: var(--ds-space-2); margin-inline: calc(var(--ds-space-2) * -1); scrollbar-width: none; mask-image: linear-gradient( to bottom, var(--ds-drawer-body-top-fade, rgb(0 0 0)) 0, rgb(0 0 0) var(--ds-space-6), rgb(0 0 0) calc(100% - var(--ds-space-6)), var(--ds-drawer-body-bottom-fade, rgb(0 0 0)) 100% ); animation: ds-drawer-body-scroll-fade linear; animation-timeline: scroll(self); } ds-card::part(body)::-webkit-scrollbar { display: none; } @keyframes ds-drawer-body-scroll-fade { 0% { --ds-drawer-body-top-fade: rgb(0 0 0); --ds-drawer-body-bottom-fade: rgb(0 0 0 / 0); } 0.001%, 99.999% { --ds-drawer-body-top-fade: rgb(0 0 0 / 0); --ds-drawer-body-bottom-fade: rgb(0 0 0 / 0); } 100% { --ds-drawer-body-top-fade: rgb(0 0 0 / 0); --ds-drawer-body-bottom-fade: rgb(0 0 0); } } .title-row { display: flex; align-items: center; justify-content: space-between; gap: var(--ds-space-3); background: var(--ds-drawer-title-bg, transparent); color: var(--ds-drawer-title-fg, inherit); border-bottom: 1px solid var(--ds-drawer-title-border-color, transparent); padding: var(--ds-drawer-title-padding, 0); } .title-text { margin: 0; flex: 1; font-family: var(--ds-font-display); font-size: var(--ds-font-size-xl); font-weight: var(--ds-font-weight-semibold); letter-spacing: var(--ds-letter-spacing-display); } .title-text ::slotted(*) { font: inherit; margin: 0; letter-spacing: inherit; } .close-btn { margin-block-start: calc(var(--ds-space-3) * -1); margin-inline-end: calc(var(--ds-space-3) * -1); } .close-btn::part(button) { color: var(--ds-drawer-title-fg, inherit); } .footer { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--ds-space-2); } `"
12556
+ }
12557
+ ],
12558
+ "exports": [
12559
+ {
12560
+ "kind": "js",
12561
+ "name": "drawerStyles",
12562
+ "declaration": {
12563
+ "name": "drawerStyles",
12564
+ "module": "src/molecules/drawer/drawer.styles.ts"
12565
+ }
12566
+ }
12567
+ ]
12568
+ },
12569
+ {
12570
+ "kind": "javascript-module",
12571
+ "path": "src/molecules/drawer/drawer.ts",
12572
+ "declarations": [
12573
+ {
12574
+ "kind": "class",
12575
+ "description": "",
12576
+ "name": "DsDrawer",
12577
+ "cssParts": [
12578
+ {
12579
+ "description": "The native `<dialog>` element.",
12580
+ "name": "dialog"
12581
+ },
12582
+ {
12583
+ "description": "The inner `ds-card` container.",
12584
+ "name": "card"
12585
+ },
12586
+ {
12587
+ "description": "The scrolling body region (forwarded from `ds-card`).",
12588
+ "name": "body"
12589
+ },
12590
+ {
12591
+ "description": "The header close button.",
12592
+ "name": "close-button"
12593
+ }
12594
+ ],
12595
+ "slots": [
12596
+ {
12597
+ "description": "Heading content rendered in the header row.",
12598
+ "name": "title"
12599
+ },
12600
+ {
12601
+ "description": "Body content. Scrolls when it overflows.",
12602
+ "name": "default"
12603
+ },
12604
+ {
12605
+ "description": "Footer content, typically `<ds-button>` actions.",
12606
+ "name": "footer"
12607
+ }
12608
+ ],
12609
+ "members": [
12610
+ {
12611
+ "kind": "field",
12612
+ "name": "open",
12613
+ "type": {
12614
+ "text": "boolean"
12615
+ },
12616
+ "default": "false",
12617
+ "attribute": "open",
12618
+ "reflects": true
12619
+ },
12620
+ {
12621
+ "kind": "field",
12622
+ "name": "label",
12623
+ "type": {
12624
+ "text": "string"
12625
+ },
12626
+ "default": "''",
12627
+ "attribute": "label"
12628
+ },
12629
+ {
12630
+ "kind": "field",
12631
+ "name": "dismissible",
12632
+ "type": {
12633
+ "text": "boolean"
12634
+ },
12635
+ "default": "true",
12636
+ "attribute": "dismissible",
12637
+ "reflects": true
12638
+ },
12639
+ {
12640
+ "kind": "field",
12641
+ "name": "size",
12642
+ "type": {
12643
+ "text": "DrawerSize"
12644
+ },
12645
+ "default": "'sm'",
12646
+ "attribute": "size",
12647
+ "reflects": true
12648
+ },
12649
+ {
12650
+ "kind": "field",
12651
+ "name": "side",
12652
+ "type": {
12653
+ "text": "DrawerSide"
12654
+ },
12655
+ "default": "'start'",
12656
+ "attribute": "side",
12657
+ "reflects": true
12658
+ },
12659
+ {
12660
+ "kind": "field",
12661
+ "name": "_dialogEl",
12662
+ "type": {
12663
+ "text": "HTMLDialogElement | undefined"
12664
+ },
12665
+ "privacy": "private"
12666
+ },
12667
+ {
12668
+ "kind": "method",
12669
+ "name": "show",
12670
+ "return": {
12671
+ "type": {
12672
+ "text": "void"
12673
+ }
12674
+ }
12675
+ },
12676
+ {
12677
+ "kind": "method",
12678
+ "name": "close",
12679
+ "return": {
12680
+ "type": {
12681
+ "text": "void"
12682
+ }
12683
+ },
12684
+ "parameters": [
12685
+ {
12686
+ "name": "returnValue",
12687
+ "optional": true,
12688
+ "type": {
12689
+ "text": "string"
12690
+ }
12691
+ }
12692
+ ]
12693
+ },
12694
+ {
12695
+ "kind": "field",
12696
+ "name": "#onBackdropClick",
12697
+ "privacy": "private"
12698
+ },
12699
+ {
12700
+ "kind": "field",
12701
+ "name": "#onCancel",
12702
+ "privacy": "private"
12703
+ },
12704
+ {
12705
+ "kind": "field",
12706
+ "name": "#onNativeClose",
12707
+ "privacy": "private"
12708
+ },
12709
+ {
12710
+ "kind": "field",
12711
+ "name": "#onCloseButtonClick",
12712
+ "privacy": "private"
12713
+ }
12714
+ ],
12715
+ "events": [
12716
+ {
12717
+ "description": "Fires after the drawer opens.",
12718
+ "name": "ds-open"
12719
+ },
12720
+ {
12721
+ "description": "Fires after the drawer closes. Detail: `{ returnValue: string }`.",
12722
+ "name": "ds-close"
12723
+ },
12724
+ {
12725
+ "description": "Fires when the drawer is dismissed via Escape or backdrop click.",
12726
+ "name": "ds-cancel"
12727
+ }
12728
+ ],
12729
+ "attributes": [
12730
+ {
12731
+ "name": "open",
12732
+ "type": {
12733
+ "text": "boolean"
12734
+ },
12735
+ "default": "false",
12736
+ "fieldName": "open"
12737
+ },
12738
+ {
12739
+ "name": "label",
12740
+ "type": {
12741
+ "text": "string"
12742
+ },
12743
+ "default": "''",
12744
+ "fieldName": "label"
12745
+ },
12746
+ {
12747
+ "name": "dismissible",
12748
+ "type": {
12749
+ "text": "boolean"
12750
+ },
12751
+ "default": "true",
12752
+ "fieldName": "dismissible"
12753
+ },
12754
+ {
12755
+ "name": "size",
12756
+ "type": {
12757
+ "text": "DrawerSize"
12758
+ },
12759
+ "default": "'sm'",
12760
+ "fieldName": "size"
12761
+ },
12762
+ {
12763
+ "name": "side",
12764
+ "type": {
12765
+ "text": "DrawerSide"
12766
+ },
12767
+ "default": "'start'",
12768
+ "fieldName": "side"
12769
+ }
12770
+ ],
12771
+ "superclass": {
12772
+ "name": "DsElement",
12773
+ "package": "@jsekulowicz/ds-core"
12774
+ },
12775
+ "tagName": "ds-drawer",
12776
+ "customElement": true,
12777
+ "summary": "Edge-anchored modal panel built on the native `<dialog>` element. Slides in from the inline start or end with a sticky header (title + close) and a scrolling body."
12778
+ }
12779
+ ],
12780
+ "exports": [
12781
+ {
12782
+ "kind": "js",
12783
+ "name": "DsDrawer",
12784
+ "declaration": {
12785
+ "name": "DsDrawer",
12786
+ "module": "src/molecules/drawer/drawer.ts"
12787
+ }
12788
+ }
12789
+ ]
12790
+ },
12791
+ {
12792
+ "kind": "javascript-module",
12793
+ "path": "src/molecules/drawer/index.ts",
12794
+ "declarations": [],
12795
+ "exports": [
12796
+ {
12797
+ "kind": "js",
12798
+ "name": "DsDrawer",
12799
+ "declaration": {
12800
+ "name": "DsDrawer",
12801
+ "module": "./drawer.js"
12802
+ }
12803
+ },
12804
+ {
12805
+ "kind": "js",
12806
+ "name": "DrawerSize",
12807
+ "declaration": {
12808
+ "name": "DrawerSize",
12809
+ "module": "./drawer.js"
12810
+ }
12811
+ },
12812
+ {
12813
+ "kind": "js",
12814
+ "name": "DrawerSide",
12815
+ "declaration": {
12816
+ "name": "DrawerSide",
12817
+ "module": "./drawer.js"
12818
+ }
12819
+ }
12820
+ ]
12821
+ },
12533
12822
  {
12534
12823
  "kind": "javascript-module",
12535
12824
  "path": "src/molecules/menu-button/define.ts",
@@ -14462,7 +14751,7 @@
14462
14751
  {
14463
14752
  "kind": "variable",
14464
14753
  "name": "pageShellStyles",
14465
- "default": "css` :host { --ds-page-shell-max-width: 90rem; display: flex; flex-direction: column; position: relative; height: 100vh; height: 100dvh; overflow-x: clip; background: var(--ds-color-bg); color: var(--ds-color-fg); font-family: var(--ds-font-body); } header { position: sticky; top: 0; background: color-mix(in oklab, var(--ds-color-bg) 92%, transparent); backdrop-filter: blur(12px); z-index: var(--ds-z-index-sticky); } /* The header composes ds-top-bar; let the top-bar own height, padding, border-bottom, and layout. We just (a) make its background transparent so the sticky header's blurred bg shows through, and (b) constrain its inner brand + actions content to the same max-width as the shell-body below so the bar's brand left-aligns with the aside, and its actions right-align with the aside-end (or the right edge of main when no aside-end is slotted). */ .chrome { --ds-top-bar-bg: transparent; --ds-top-bar-content-max-width: var(--ds-page-shell-max-width); } /* Same treatment for a slotted ds-footer: cap its inner content to the shell-body's max-width so footer content aligns with the column above. Consumers who slot a non-ds-footer custom element can override the property themselves. */ ::slotted(ds-footer) { --ds-footer-content-max-width: var(--ds-page-shell-max-width); } footer { display: block; } .shell-body { flex: 1; width: 100%; max-width: var(--ds-page-shell-max-width); margin-inline: auto; display: grid; grid-template-columns: auto 1fr auto; min-height: 0; } :host([aside-empty]) .shell-body { grid-template-columns: 1fr auto; } :host([aside-end-empty]) .shell-body { grid-template-columns: auto 1fr; } :host([aside-empty][aside-end-empty]) .shell-body { grid-template-columns: 1fr; } aside { display: flex; overflow-x: clip; overflow-y: auto; overflow-clip-margin-inline: var(--ds-space-2); min-height: 0; scrollbar-color: var(--ds-color-fg-subtle) transparent; scrollbar-width: thin; /* No scrollbar-gutter reservation: the aside sits flush with its column edge so the consumer's <main> solely owns the gap. The scrollbar appears on demand when the aside genuinely overflows. */ } :host([aside-empty]) aside[part=\"aside\"], :host([aside-empty]) .mobile-backdrop { display: none; } :host([aside-end-empty]) aside[part=\"aside-end\"] { display: none; } main { padding: var(--ds-space-5); overflow-x: clip; overflow-y: auto; overflow-clip-margin-inline: var(--ds-space-2); min-width: 0; min-height: 0; scrollbar-color: var(--ds-color-fg-subtle) transparent; scrollbar-width: thin; /* Reserve scrollbar gutters on both inline sides so the inline-start and inline-end visible empty bands stay equal in width whether the vertical scrollbar is present or not. */ scrollbar-gutter: stable both-edges; } @media (max-width: ${belowDesktopBreakpoint}) { main { padding-block: var(--ds-space-4); padding-inline: var(--ds-space-4); } } .menu-toggle { display: none; } .menu-toggle::part(button), .drawer-close::part(button) { min-width: var(--ds-size-sm); width: var(--ds-size-sm); padding: 0; } :host([mobile-layout]) .menu-toggle { display: inline-flex; } .mobile-backdrop { display: none; } .drawer-header { display: none; } .drawer-brand { display: none; } .drawer-close { display: none; } :host([mobile-layout]) .shell-body { grid-template-columns: 1fr; } :host([mobile-layout]) aside[part=\"aside-end\"] { /* Secondary inline-end region is not surfaced in the mobile drawer in v1. Consumers can opt back in by overriding via ::part(aside-end). */ display: none; } :host([mobile-layout]) aside[part=\"aside\"] { position: absolute; top: 0; left: 0; width: 16rem; display: flex; flex-direction: column; height: 100%; background: var(--ds-color-bg); border-right: 0; z-index: var(--ds-z-index-modal); transform: translateX(-100%); transition: transform var(--ds-duration-slow) var(--ds-easing-standard); scrollbar-gutter: auto; overflow: hidden; box-sizing: border-box; } :host([mobile-layout][data-mobile-nav-open]) aside[part=\"aside\"] { transform: translateX(0); } :host([mobile-layout]) .drawer-header { display: flex; align-items: center; justify-content: space-between; gap: var(--ds-space-3); padding: var(--ds-space-2) var(--ds-space-4); } :host([mobile-layout]) .drawer-brand { display: inline-flex; align-items: center; flex: 1; min-width: 0; font-family: var(--ds-font-display); font-size: var(--ds-font-size-lg); letter-spacing: var(--ds-letter-spacing-display); } :host([mobile-layout]) slot[name='drawer-brand']::slotted(*) { max-width: 100%; } :host([mobile-layout]) .drawer-close { display: inline-flex; flex: 0 0 auto; margin: 0; } :host([mobile-layout]) aside[part=\"aside\"] ::slotted(ds-sidenav) { width: 100% !important; max-width: 100% !important; flex: 1 1 auto; min-width: 0; min-height: 0; height: auto !important; } :host([mobile-layout][data-mobile-nav-open]) .mobile-backdrop { display: block; position: absolute; inset: 0; border: 0; margin: 0; padding: 0; background: color-mix(in oklab, var(--ds-color-fg) 26%, transparent); z-index: var(--ds-z-index-overlay); } `"
14754
+ "default": "css` :host { --ds-page-shell-max-width: none; display: flex; flex-direction: column; position: relative; height: 100vh; height: 100dvh; overflow-x: clip; background: var(--ds-color-bg); color: var(--ds-color-fg); font-family: var(--ds-font-body); } header { position: sticky; top: 0; background: color-mix(in oklab, var(--ds-color-bg) 92%, transparent); backdrop-filter: blur(12px); z-index: var(--ds-z-index-sticky); } /* The header composes ds-top-bar; let the top-bar own height, padding, border-bottom, and layout. We just (a) make its background transparent so the sticky header's blurred bg shows through, and (b) constrain its inner brand + actions content to the same max-width as the shell-body below so the bar's brand left-aligns with the aside, and its actions right-align with the aside-end (or the right edge of main when no aside-end is slotted). */ .chrome { --ds-top-bar-bg: transparent; --ds-top-bar-content-max-width: var(--ds-page-shell-max-width); } /* Same treatment for a slotted ds-footer: cap its inner content to the shell-body's max-width so footer content aligns with the column above. Consumers who slot a non-ds-footer custom element can override the property themselves. */ ::slotted(ds-footer) { --ds-footer-content-max-width: var(--ds-page-shell-max-width); } footer { display: block; } .shell-body { flex: 1; width: 100%; max-width: var(--ds-page-shell-max-width); margin-inline: auto; display: grid; grid-template-columns: auto 1fr auto; min-height: 0; } :host([aside-empty]) .shell-body { grid-template-columns: 1fr auto; } :host([aside-end-empty]) .shell-body { grid-template-columns: auto 1fr; } :host([aside-empty][aside-end-empty]) .shell-body { grid-template-columns: 1fr; } aside { display: flex; overflow-x: clip; overflow-y: auto; overflow-clip-margin-inline: var(--ds-space-2); min-height: 0; scrollbar-color: var(--ds-color-fg-subtle) transparent; scrollbar-width: thin; /* No scrollbar-gutter reservation: the aside sits flush with its column edge so the consumer's <main> solely owns the gap. The scrollbar appears on demand when the aside genuinely overflows. */ } :host([aside-empty]) aside[part=\"aside\"], :host([aside-empty]) ds-drawer[part=\"aside\"] { display: none; } :host([aside-end-empty]) aside[part=\"aside-end\"] { display: none; } main { padding: var(--ds-space-5); overflow-x: clip; overflow-y: auto; overflow-clip-margin-inline: var(--ds-space-2); min-width: 0; min-height: 0; scrollbar-color: var(--ds-color-fg-subtle) transparent; scrollbar-width: thin; /* Reserve scrollbar gutters on both inline sides so the inline-start and inline-end visible empty bands stay equal in width whether the vertical scrollbar is present or not. */ scrollbar-gutter: stable both-edges; } @media (max-width: ${belowDesktopBreakpoint}) { main { padding-block: var(--ds-space-4); padding-inline: var(--ds-space-4); } } .menu-toggle { display: none; } .menu-toggle::part(button) { min-width: var(--ds-size-sm); width: var(--ds-size-sm); padding: 0; } :host([mobile-layout]) .menu-toggle { display: inline-flex; } :host([mobile-layout]) .shell-body { grid-template-columns: 1fr; } :host([mobile-layout]) aside[part=\"aside-end\"] { display: none; } :host([mobile-layout]) ds-drawer[part=\"aside\"] { /* Top-layer modal; don't reserve a grid column when closed. */ display: contents; --ds-drawer-card-padding: 0; --ds-drawer-title-padding: var(--ds-space-3) var(--ds-space-4); --ds-drawer-title-bg: var(--ds-page-shell-drawer-header-bg, transparent); --ds-drawer-title-fg: var(--ds-page-shell-drawer-header-fg, inherit); --ds-drawer-title-border-color: var(--ds-page-shell-drawer-header-border-color, transparent); } :host([mobile-layout]) ds-drawer[part=\"aside\"] ::slotted(ds-sidenav) { width: 100% !important; max-width: 100% !important; flex: 1 1 auto; min-width: 0; min-height: 0; height: auto !important; } `"
14466
14755
  }
14467
14756
  ],
14468
14757
  "exports": [
@@ -14486,7 +14775,7 @@
14486
14775
  "name": "DsPageShell",
14487
14776
  "cssProperties": [
14488
14777
  {
14489
- "description": "Outer cap for the shell's content column. Header inner content and the aside + main row centre at this width and align vertically. Defaults to `90rem` (1440px). Header chrome remains full-bleed.",
14778
+ "description": "Outer cap for the shell's content column. Header inner content and the aside + main row centre at this width and align vertically. Defaults to `none`. Header chrome remains full-bleed.",
14490
14779
  "name": "--ds-page-shell-max-width"
14491
14780
  }
14492
14781
  ],
@@ -14496,7 +14785,7 @@
14496
14785
  "name": "brand"
14497
14786
  },
14498
14787
  {
14499
- "description": "Brand/logo shown at the start of the mobile navigation drawer.",
14788
+ "description": "Brand/logo shown in the mobile navigation drawer's title row. Falls back to the `brand` prop.",
14500
14789
  "name": "drawer-brand"
14501
14790
  },
14502
14791
  {
@@ -14504,7 +14793,7 @@
14504
14793
  "name": "header-actions"
14505
14794
  },
14506
14795
  {
14507
- "description": "Primary side navigation (inline-start). When empty, the column and hamburger toggle are not rendered.",
14796
+ "description": "Primary side navigation (inline-start). On mobile, rendered inside a `ds-drawer` opened by the hamburger toggle. When empty, the column and hamburger toggle are not rendered.",
14508
14797
  "name": "aside"
14509
14798
  },
14510
14799
  {
@@ -14548,6 +14837,15 @@
14548
14837
  "default": "'Secondary navigation'",
14549
14838
  "attribute": "end-label"
14550
14839
  },
14840
+ {
14841
+ "kind": "field",
14842
+ "name": "_mobileLayout",
14843
+ "type": {
14844
+ "text": "boolean"
14845
+ },
14846
+ "privacy": "private",
14847
+ "default": "false"
14848
+ },
14551
14849
  {
14552
14850
  "kind": "field",
14553
14851
  "name": "_mobileNavOpen",
@@ -14612,11 +14910,6 @@
14612
14910
  "name": "#syncLayout",
14613
14911
  "privacy": "private"
14614
14912
  },
14615
- {
14616
- "kind": "field",
14617
- "name": "#onDocumentKeydown",
14618
- "privacy": "private"
14619
- },
14620
14913
  {
14621
14914
  "kind": "field",
14622
14915
  "name": "#setMobileNav",
@@ -14651,6 +14944,26 @@
14651
14944
  "kind": "field",
14652
14945
  "name": "#onFooterSlotChange",
14653
14946
  "privacy": "private"
14947
+ },
14948
+ {
14949
+ "kind": "method",
14950
+ "name": "#renderDesktopAside",
14951
+ "privacy": "private",
14952
+ "return": {
14953
+ "type": {
14954
+ "text": "TemplateResult"
14955
+ }
14956
+ }
14957
+ },
14958
+ {
14959
+ "kind": "method",
14960
+ "name": "#renderMobileAside",
14961
+ "privacy": "private",
14962
+ "return": {
14963
+ "type": {
14964
+ "text": "TemplateResult"
14965
+ }
14966
+ }
14654
14967
  }
14655
14968
  ],
14656
14969
  "attributes": [
package/dist/define.d.ts CHANGED
@@ -20,6 +20,7 @@ import './atoms/nav-item/define.js';
20
20
  import './atoms/menu/define.js';
21
21
  import './molecules/card/define.js';
22
22
  import './molecules/dialog/define.js';
23
+ import './molecules/drawer/define.js';
23
24
  import './molecules/toast/define.js';
24
25
  import './molecules/color-picker/define.js';
25
26
  import './molecules/menu-button/define.js';
@@ -1 +1 @@
1
- {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAC;AAClC,OAAO,2BAA2B,CAAC;AACnC,OAAO,yBAAyB,CAAC;AACjC,OAAO,4BAA4B,CAAC;AACpC,OAAO,2BAA2B,CAAC;AACnC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,yBAAyB,CAAC;AACjC,OAAO,+BAA+B,CAAC;AACvC,OAAO,0BAA0B,CAAC;AAClC,OAAO,qCAAqC,CAAC;AAC7C,OAAO,wBAAwB,CAAC;AAChC,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,wBAAwB,CAAC;AAChC,OAAO,4BAA4B,CAAC;AACpC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,oCAAoC,CAAC;AAC5C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,iCAAiC,CAAC;AACzC,OAAO,6BAA6B,CAAC;AACrC,OAAO,4BAA4B,CAAC;AACpC,OAAO,+BAA+B,CAAC;AACvC,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,iCAAiC,CAAC"}
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAC;AAClC,OAAO,2BAA2B,CAAC;AACnC,OAAO,yBAAyB,CAAC;AACjC,OAAO,4BAA4B,CAAC;AACpC,OAAO,2BAA2B,CAAC;AACnC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,yBAAyB,CAAC;AACjC,OAAO,+BAA+B,CAAC;AACvC,OAAO,0BAA0B,CAAC;AAClC,OAAO,qCAAqC,CAAC;AAC7C,OAAO,wBAAwB,CAAC;AAChC,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,wBAAwB,CAAC;AAChC,OAAO,4BAA4B,CAAC;AACpC,OAAO,8BAA8B,CAAC;AACtC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,oCAAoC,CAAC;AAC5C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,iCAAiC,CAAC;AACzC,OAAO,6BAA6B,CAAC;AACrC,OAAO,4BAA4B,CAAC;AACpC,OAAO,+BAA+B,CAAC;AACvC,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,iCAAiC,CAAC"}
package/dist/define.js CHANGED
@@ -20,6 +20,7 @@ import './atoms/nav-item/define.js';
20
20
  import './atoms/menu/define.js';
21
21
  import './molecules/card/define.js';
22
22
  import './molecules/dialog/define.js';
23
+ import './molecules/drawer/define.js';
23
24
  import './molecules/toast/define.js';
24
25
  import './molecules/color-picker/define.js';
25
26
  import './molecules/menu-button/define.js';
@@ -1 +1 @@
1
- {"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAC;AAClC,OAAO,2BAA2B,CAAC;AACnC,OAAO,yBAAyB,CAAC;AACjC,OAAO,4BAA4B,CAAC;AACpC,OAAO,2BAA2B,CAAC;AACnC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,yBAAyB,CAAC;AACjC,OAAO,+BAA+B,CAAC;AACvC,OAAO,0BAA0B,CAAC;AAClC,OAAO,qCAAqC,CAAC;AAC7C,OAAO,wBAAwB,CAAC;AAChC,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,wBAAwB,CAAC;AAChC,OAAO,4BAA4B,CAAC;AACpC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,oCAAoC,CAAC;AAC5C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,iCAAiC,CAAC;AACzC,OAAO,6BAA6B,CAAC;AACrC,OAAO,4BAA4B,CAAC;AACpC,OAAO,+BAA+B,CAAC;AACvC,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,iCAAiC,CAAC"}
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA,OAAO,0BAA0B,CAAC;AAClC,OAAO,2BAA2B,CAAC;AACnC,OAAO,yBAAyB,CAAC;AACjC,OAAO,4BAA4B,CAAC;AACpC,OAAO,2BAA2B,CAAC;AACnC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AAChC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,yBAAyB,CAAC;AACjC,OAAO,+BAA+B,CAAC;AACvC,OAAO,0BAA0B,CAAC;AAClC,OAAO,qCAAqC,CAAC;AAC7C,OAAO,wBAAwB,CAAC;AAChC,OAAO,yBAAyB,CAAC;AACjC,OAAO,8BAA8B,CAAC;AACtC,OAAO,4BAA4B,CAAC;AACpC,OAAO,wBAAwB,CAAC;AAChC,OAAO,4BAA4B,CAAC;AACpC,OAAO,8BAA8B,CAAC;AACtC,OAAO,8BAA8B,CAAC;AACtC,OAAO,6BAA6B,CAAC;AACrC,OAAO,oCAAoC,CAAC;AAC5C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,iCAAiC,CAAC;AACzC,OAAO,6BAA6B,CAAC;AACrC,OAAO,4BAA4B,CAAC;AACpC,OAAO,+BAA+B,CAAC;AACvC,OAAO,+BAA+B,CAAC;AACvC,OAAO,8BAA8B,CAAC;AACtC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,iCAAiC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.styles.d.ts","sourceRoot":"","sources":["../../../src/molecules/dialog/dialog.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,yBAmFxB,CAAC"}
1
+ {"version":3,"file":"dialog.styles.d.ts","sourceRoot":"","sources":["../../../src/molecules/dialog/dialog.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,yBAsIxB,CAAC"}
@@ -1,5 +1,17 @@
1
1
  import { css } from 'lit';
2
2
  export const dialogStyles = css `
3
+ /* @property registration so the scroll-driven keyframes can
4
+ interpolate these as colors. */
5
+ @property --ds-dialog-body-top-fade {
6
+ syntax: '<color>';
7
+ inherits: false;
8
+ initial-value: rgb(0 0 0);
9
+ }
10
+ @property --ds-dialog-body-bottom-fade {
11
+ syntax: '<color>';
12
+ inherits: false;
13
+ initial-value: rgb(0 0 0);
14
+ }
3
15
  :host {
4
16
  display: contents;
5
17
  }
@@ -8,12 +20,17 @@ export const dialogStyles = css `
8
20
  border: 0;
9
21
  background: transparent;
10
22
  color: inherit;
11
- width: 100%;
23
+ width: calc(100% - var(--ds-space-4));
12
24
  max-height: min(90vh, 720px);
13
25
  border-radius: var(--ds-radius-sm);
14
26
  box-shadow: var(--ds-shadow-md);
15
27
  overflow: visible;
16
28
  }
29
+ /* Scope to [open] so closed dialogs stay display:none per UA. */
30
+ dialog[open] {
31
+ display: flex;
32
+ flex-direction: column;
33
+ }
17
34
  :host([size='sm']) dialog {
18
35
  max-width: 400px;
19
36
  }
@@ -25,14 +42,17 @@ export const dialogStyles = css `
25
42
  }
26
43
  dialog::backdrop {
27
44
  background: rgb(15 23 42 / 0.55);
28
- backdrop-filter: blur(2px);
29
45
  }
30
46
  ds-card {
31
- height: 100%;
47
+ flex: 1;
48
+ min-height: 0;
49
+ min-width: 0;
32
50
  }
33
51
  ds-card::part(card) {
34
- height: 100%;
35
- max-height: 100%;
52
+ /* Match the dialog's cap explicitly; percentage heights don't
53
+ resolve reliably through ds-card's display:block host, so body
54
+ scroll breaks when content overflows. */
55
+ max-height: min(90vh, 720px);
36
56
  box-shadow: none;
37
57
  border-color: transparent;
38
58
  gap: var(--ds-space-3);
@@ -42,8 +62,43 @@ export const dialogStyles = css `
42
62
  min-height: 0;
43
63
  overflow-x: clip;
44
64
  overflow-y: auto;
65
+ overscroll-behavior: contain;
66
+ /* Inline padding + negative margin lets focus rings on full-width
67
+ children paint outside the body's clip box. */
45
68
  padding-inline: var(--ds-space-2);
46
69
  margin-inline: calc(var(--ds-space-2) * -1);
70
+ /* Scrollbar hidden; overflow is signalled by the scroll-driven
71
+ fade mask defined in the keyframes below. */
72
+ scrollbar-width: none;
73
+ mask-image: linear-gradient(
74
+ to bottom,
75
+ var(--ds-dialog-body-top-fade, rgb(0 0 0)) 0,
76
+ rgb(0 0 0) var(--ds-space-6),
77
+ rgb(0 0 0) calc(100% - var(--ds-space-6)),
78
+ var(--ds-dialog-body-bottom-fade, rgb(0 0 0)) 100%
79
+ );
80
+ animation: ds-dialog-body-scroll-fade linear;
81
+ animation-timeline: scroll(self);
82
+ }
83
+ ds-card::part(body)::-webkit-scrollbar {
84
+ display: none;
85
+ }
86
+ /* Top fade hidden at scroll-top, bottom fade hidden at scroll-end.
87
+ Near-instant flips at 0.001% / 99.999% keep the transitions
88
+ binary instead of interpolating across the scroll range. */
89
+ @keyframes ds-dialog-body-scroll-fade {
90
+ 0% {
91
+ --ds-dialog-body-top-fade: rgb(0 0 0);
92
+ --ds-dialog-body-bottom-fade: rgb(0 0 0 / 0);
93
+ }
94
+ 0.001%, 99.999% {
95
+ --ds-dialog-body-top-fade: rgb(0 0 0 / 0);
96
+ --ds-dialog-body-bottom-fade: rgb(0 0 0 / 0);
97
+ }
98
+ 100% {
99
+ --ds-dialog-body-top-fade: rgb(0 0 0 / 0);
100
+ --ds-dialog-body-bottom-fade: rgb(0 0 0);
101
+ }
47
102
  }
48
103
  .title-row {
49
104
  display: flex;
@@ -59,19 +114,15 @@ export const dialogStyles = css `
59
114
  font-weight: var(--ds-font-weight-semibold);
60
115
  letter-spacing: var(--ds-letter-spacing-display);
61
116
  }
62
- /* Slotted heading tags (h1-h6, etc.) carry UA defaults that
63
- compound on top of .title-text a bigger font-size and large
64
- vertical margins. Normalise them so 'Foo', '<h2 slot="title">Foo</h2>'
65
- and '<span slot="title">Foo</span>' all render identically. */
117
+ /* Normalise slotted headings (h1-h6) so UA defaults don't compound
118
+ with .title-text styles. */
66
119
  .title-text ::slotted(*) {
67
120
  font: inherit;
68
121
  margin: 0;
69
122
  letter-spacing: inherit;
70
123
  }
71
- /* Pull the close button up and to the right so it sits near the
72
- card's top-right corner instead of indented by ds-card's full
73
- ds-space-6 padding. Its own visual chrome (size, hover, focus
74
- ring, square shape) comes from ds-button. */
124
+ /* Pull the close button toward the card's top-right corner; the
125
+ card's own padding would otherwise indent it. */
75
126
  .close-btn {
76
127
  margin-block-start: calc(var(--ds-space-3) * -1);
77
128
  margin-inline-end: calc(var(--ds-space-3) * -1);
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.styles.js","sourceRoot":"","sources":["../../../src/molecules/dialog/dialog.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmF9B,CAAC"}
1
+ {"version":3,"file":"dialog.styles.js","sourceRoot":"","sources":["../../../src/molecules/dialog/dialog.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsI9B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { DsDrawer } from './drawer.js';
2
+ import '../card/define.js';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'ds-drawer': DsDrawer;
6
+ }
7
+ }
8
+ //# sourceMappingURL=define.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../../src/molecules/drawer/define.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,mBAAmB,CAAC;AAM3B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,QAAQ,CAAC;KACvB;CACF"}
@@ -0,0 +1,6 @@
1
+ import { DsDrawer } from './drawer.js';
2
+ import '../card/define.js';
3
+ if (!customElements.get('ds-drawer')) {
4
+ customElements.define('ds-drawer', DsDrawer);
5
+ }
6
+ //# sourceMappingURL=define.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../../../src/molecules/drawer/define.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,mBAAmB,CAAC;AAE3B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;IACrC,cAAc,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { type PropertyValues, type TemplateResult } from 'lit';
2
+ import { DsElement } from '@jsekulowicz/ds-core';
3
+ import '../card/define.js';
4
+ import '../../atoms/button/define.js';
5
+ import '../../atoms/icon/icons/x-mark.js';
6
+ export type DrawerSize = 'sm' | 'md' | 'lg';
7
+ export type DrawerSide = 'start' | 'end';
8
+ /**
9
+ * @tag ds-drawer
10
+ * @summary Edge-anchored modal panel built on the native `<dialog>` element. Slides in from the inline start or end with a sticky header (title + close) and a scrolling body.
11
+ * @slot title - Heading content rendered in the header row.
12
+ * @slot default - Body content. Scrolls when it overflows.
13
+ * @slot footer - Footer content, typically `<ds-button>` actions.
14
+ * @csspart dialog - The native `<dialog>` element.
15
+ * @csspart card - The inner `ds-card` container.
16
+ * @csspart body - The scrolling body region (forwarded from `ds-card`).
17
+ * @csspart close-button - The header close button.
18
+ * @event ds-open - Fires after the drawer opens.
19
+ * @event ds-close - Fires after the drawer closes. Detail: `{ returnValue: string }`.
20
+ * @event ds-cancel - Fires when the drawer is dismissed via Escape or backdrop click.
21
+ */
22
+ export declare class DsDrawer extends DsElement {
23
+ #private;
24
+ static styles: import("lit").CSSResult[];
25
+ open: boolean;
26
+ label: string;
27
+ dismissible: boolean;
28
+ size: DrawerSize;
29
+ side: DrawerSide;
30
+ private _dialogEl?;
31
+ show(): void;
32
+ close(returnValue?: string): void;
33
+ updated(changed: PropertyValues): void;
34
+ disconnectedCallback(): void;
35
+ render(): TemplateResult;
36
+ }
37
+ //# sourceMappingURL=drawer.d.ts.map