@pure-ds/storybook 0.7.25 → 0.7.26

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 (68) hide show
  1. package/.storybook/preview.js +5 -4
  2. package/dist/pds-reference.json +2266 -1017
  3. package/package.json +2 -2
  4. package/public/assets/js/app.js +1 -1
  5. package/public/assets/js/pds-ask.js +6 -6
  6. package/public/assets/js/pds-manager.js +104 -29
  7. package/public/assets/pds/components/pds-calendar.js +91 -159
  8. package/public/assets/pds/components/pds-daterange.js +683 -0
  9. package/public/assets/pds/components/pds-form.js +123 -21
  10. package/public/assets/pds/components/pds-rating.js +648 -0
  11. package/public/assets/pds/components/pds-tags.js +802 -0
  12. package/public/assets/pds/core/pds-ask.js +6 -6
  13. package/public/assets/pds/core/pds-manager.js +104 -29
  14. package/public/assets/pds/custom-elements.json +1099 -74
  15. package/public/assets/pds/pds-css-complete.json +7 -2
  16. package/public/assets/pds/pds-runtime-config.json +1 -1
  17. package/public/assets/pds/pds.css-data.json +4 -4
  18. package/public/assets/pds/styles/pds-components.css +96 -24
  19. package/public/assets/pds/styles/pds-components.css.js +192 -48
  20. package/public/assets/pds/styles/pds-primitives.css +6 -3
  21. package/public/assets/pds/styles/pds-primitives.css.js +12 -6
  22. package/public/assets/pds/styles/pds-styles.css +104 -29
  23. package/public/assets/pds/styles/pds-styles.css.js +208 -58
  24. package/public/assets/pds/styles/pds-utilities.css +2 -2
  25. package/public/assets/pds/styles/pds-utilities.css.js +4 -4
  26. package/public/assets/pds/vscode-custom-data.json +97 -0
  27. package/src/js/common/ask.js +122 -12
  28. package/src/js/pds-core/pds-generator.js +103 -28
  29. package/src/js/pds-core/pds-ontology.js +2 -2
  30. package/stories/components/PdsCalendar.stories.js +650 -168
  31. package/stories/components/PdsDaterange.stories.js +85 -0
  32. package/stories/components/PdsForm.Basics.stories.js +16 -0
  33. package/stories/components/PdsForm.ConditionalAndCalculated.stories.js +16 -0
  34. package/stories/components/PdsForm.CustomContent.stories.js +10 -0
  35. package/stories/components/PdsForm.Dialogs.stories.js +7 -0
  36. package/stories/components/PdsForm.Layout.stories.js +16 -0
  37. package/stories/components/PdsForm.SelectionAndArrays.stories.js +12 -0
  38. package/stories/components/PdsForm.stories.js +179 -219
  39. package/stories/components/PdsIcon.stories.js +17 -7
  40. package/stories/components/PdsOmnibox.stories.js +1 -60
  41. package/stories/components/PdsRating.stories.js +126 -0
  42. package/stories/components/PdsTags.stories.js +224 -0
  43. package/stories/components/PdsToaster.stories.js +1 -1
  44. package/stories/components/omnibox-countries-api-settings.js +63 -0
  45. package/stories/foundations/Colors.stories.js +6 -1
  46. package/stories/foundations/HTMLDefaults.stories.js +6 -6
  47. package/stories/foundations/Icons.stories.js +4 -4
  48. package/stories/foundations/MeshGradients.stories.js +13 -3
  49. package/stories/foundations/SmartSurfaces.stories.js +43 -31
  50. package/stories/foundations/Typography.stories.js +30 -108
  51. package/stories/foundations/ZIndex.stories.js +3 -3
  52. package/stories/layout/LayoutOverview.stories.js +3 -3
  53. package/stories/layout/LayoutSystem.stories.js +24 -18
  54. package/stories/patterns/BorderEffects.stories.js +28 -16
  55. package/stories/patterns/InteractiveStates.stories.js +39 -24
  56. package/stories/patterns/Utilities.stories.js +45 -23
  57. package/stories/primitives/ArticleLayout.stories.js +176 -0
  58. package/stories/primitives/Badges.stories.js +24 -8
  59. package/stories/primitives/Buttons.stories.js +29 -9
  60. package/stories/primitives/Callouts.stories.js +8 -7
  61. package/stories/primitives/Cards.stories.js +4 -1
  62. package/stories/primitives/FormElements.stories.js +8 -2
  63. package/stories/primitives/HtmlFormElements.stories.js +8 -2
  64. package/stories/primitives/HtmlFormGroups.stories.js +5 -2
  65. package/stories/primitives/Media.stories.js +44 -30
  66. package/stories/primitives/Tables.stories.js +25 -7
  67. package/stories/utils/PdsAsk.stories.js +17 -5
  68. package/stories/utils/PdsObjectApi.stories.js +16 -4
@@ -1672,6 +1672,11 @@
1672
1672
  "description": "Button primitive component",
1673
1673
  "category": "Primitives"
1674
1674
  },
1675
+ {
1676
+ "name": "btn-danger",
1677
+ "description": "Button primitive component",
1678
+ "category": "Primitives"
1679
+ },
1675
1680
  {
1676
1681
  "name": "btn-sm",
1677
1682
  "description": "Button primitive component",
@@ -2292,9 +2297,9 @@
2292
2297
  ],
2293
2298
  "metadata": {
2294
2299
  "generator": "PDS CSS Data Generator",
2295
- "generatedAt": "2026-02-26T07:33:17.462Z",
2300
+ "generatedAt": "2026-03-03T08:40:38.831Z",
2296
2301
  "totalProperties": 169,
2297
- "totalClasses": 169,
2302
+ "totalClasses": 170,
2298
2303
  "totalAttributes": 5
2299
2304
  }
2300
2305
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "exportedAt": "2026-02-26T07:33:17.474Z",
2
+ "exportedAt": "2026-03-03T08:40:38.846Z",
3
3
  "staticRoot": "/assets/pds/",
4
4
  "presetId": "default",
5
5
  "preset": "Default",
@@ -2001,6 +2001,10 @@
2001
2001
  "name": "btn-outline",
2002
2002
  "description": "Button primitive component"
2003
2003
  },
2004
+ {
2005
+ "name": "btn-danger",
2006
+ "description": "Button primitive component"
2007
+ },
2004
2008
  {
2005
2009
  "name": "btn-sm",
2006
2010
  "description": "Button primitive component"
@@ -2192,10 +2196,6 @@
2192
2196
  {
2193
2197
  "name": "stack-md",
2194
2198
  "description": "Vertical flex layout with predefined gaps"
2195
- },
2196
- {
2197
- "name": "stack-lg",
2198
- "description": "Vertical flex layout with predefined gaps"
2199
2199
  }
2200
2200
  ],
2201
2201
  "pseudoElements": []
@@ -922,7 +922,7 @@ button, .btn, input[type="submit"], input[type="button"], input[type="reset"] {
922
922
  border-color: var(--color-border);
923
923
 
924
924
  /* Only apply generic hover to non-variant buttons */
925
- &:hover:not(.btn-primary):not(.btn-secondary):not(.btn-outline) {
925
+ &:hover:not(.btn-primary):not(.btn-secondary):not(.btn-outline):not(.btn-danger) {
926
926
  background-color: var(--color-surface-elevated);
927
927
  }
928
928
 
@@ -1010,6 +1010,56 @@ button, .btn, input[type="submit"], input[type="button"], input[type="reset"] {
1010
1010
  }
1011
1011
  }
1012
1012
 
1013
+ .btn-danger {
1014
+ background-color: var(--color-danger-600);
1015
+ color: white;
1016
+ border-color: var(--color-danger-600);
1017
+
1018
+ &:hover {
1019
+ background-color: color-mix(in oklab, var(--color-danger-600) 90%, black 10%);
1020
+ border-color: color-mix(in oklab, var(--color-danger-600) 90%, black 10%);
1021
+ color: white;
1022
+ }
1023
+
1024
+ &:active {
1025
+ background-color: color-mix(in oklab, var(--color-danger-600) 80%, black 20%);
1026
+ border-color: color-mix(in oklab, var(--color-danger-600) 80%, black 20%);
1027
+ color: white;
1028
+ }
1029
+ }
1030
+
1031
+ .btn-danger.btn-outline {
1032
+ background-color: transparent;
1033
+ color: var(--color-danger-600);
1034
+ border-color: var(--color-danger-600);
1035
+
1036
+ &:hover {
1037
+ background-color: var(--color-danger-600);
1038
+ border-color: var(--color-danger-600);
1039
+ color: white;
1040
+
1041
+ pds-icon {
1042
+ color: white;
1043
+ }
1044
+ }
1045
+
1046
+ &:active {
1047
+ background-color: color-mix(in oklab, var(--color-danger-600) 80%, black 20%);
1048
+ border-color: color-mix(in oklab, var(--color-danger-600) 80%, black 20%);
1049
+ color: white;
1050
+
1051
+ pds-icon {
1052
+ color: white;
1053
+ }
1054
+ }
1055
+
1056
+ &:disabled {
1057
+ background-color: transparent;
1058
+ color: var(--color-input-disabled-text);
1059
+ border-color: var(--color-input-disabled-bg);
1060
+ }
1061
+ }
1062
+
1013
1063
  .btn-sm {
1014
1064
  padding: calc(max(calc(var(--spacing-1) * 1), var(--spacing-2)) * 0.85) calc(var(--spacing-6) * 0.8);
1015
1065
  font-size: var(--font-size-sm);
@@ -1472,6 +1522,17 @@ dialog {
1472
1522
  overflow: hidden; /* Prevent dialog itself from scrolling - let .dialog-body handle it */
1473
1523
  }
1474
1524
 
1525
+ /*
1526
+ * Overlay safety valve:
1527
+ * Some controls (e.g. pds-daterange panel, data-dropdown menus) need to escape
1528
+ * the dialog bounds. Scope overflow visibility to custom dialogs that contain
1529
+ * those controls instead of enabling it for all dialogs.
1530
+ */
1531
+ dialog.dialog-custom:has(pds-daterange),
1532
+ dialog.dialog-custom:has([data-dropdown]) {
1533
+ overflow: visible;
1534
+ }
1535
+
1475
1536
  /* Form structure - use flexbox instead of contents */
1476
1537
  dialog form {
1477
1538
  display: flex;
@@ -1481,11 +1542,6 @@ dialog form {
1481
1542
  margin: 0;
1482
1543
  }
1483
1544
 
1484
- /* Dialog fields - to open pds-form subforms */
1485
- .dialog-field {
1486
- margin-top: var(--spacing-3);
1487
- }
1488
-
1489
1545
  /* Dialog header */
1490
1546
  dialog {
1491
1547
  header,
@@ -1540,7 +1596,20 @@ dialog {
1540
1596
  min-height: 0; /* Critical: allow flex child to shrink and scroll */
1541
1597
  padding: var(--spacing-3) var(--spacing-6);
1542
1598
  overflow-y: auto;
1543
- overflow-x: hidden;
1599
+ overflow-x: visible;
1600
+ }
1601
+
1602
+ /* Allow overlay menus (e.g. data-dropdown) to escape dialog-body clipping while open */
1603
+ article:has([data-dropdown] > :last-child[aria-hidden="false"]),
1604
+ form > article:has([data-dropdown] > :last-child[aria-hidden="false"]),
1605
+ .dialog-body:has([data-dropdown] > :last-child[aria-hidden="false"]) {
1606
+ overflow: visible;
1607
+ }
1608
+
1609
+ article:has(pds-daterange),
1610
+ form > article:has(pds-daterange),
1611
+ .dialog-body:has(pds-daterange) {
1612
+ overflow: visible;
1544
1613
  }
1545
1614
 
1546
1615
  /* Dialog footer - actions */
@@ -1566,23 +1635,14 @@ dialog.dialog-full { width: calc(100vw - var(--spacing-8)); max-width: calc(100v
1566
1635
  /* Mobile responsiveness - maximize on mobile */
1567
1636
  @media (max-width: 639px) {
1568
1637
  dialog,
1638
+ dialog.dialog-sm,
1639
+ dialog.dialog-lg,
1640
+ dialog.dialog-xl,
1641
+ dialog.dialog-full,
1569
1642
  dialog.dialog-no-scale-animation,
1570
1643
  dialog.dialog-no-scale-animation[open] {
1571
- left: 0 !important;
1572
- top: 0 !important;
1573
- }
1574
-
1575
- dialog.dialog-no-scale-animation,
1576
- dialog.dialog-no-scale-animation[open] {
1577
- transform: none !important;
1578
- }
1579
-
1580
- dialog[open] {
1581
- left: 0 !important;
1582
- top: 0 !important;
1583
- }
1584
-
1585
- dialog {
1644
+ left: 0;
1645
+ top: 0;
1586
1646
  max-width: 100vw;
1587
1647
  width: 100vw;
1588
1648
  height: 100dvh;
@@ -1590,9 +1650,21 @@ dialog.dialog-full { width: calc(100vw - var(--spacing-8)); max-width: calc(100v
1590
1650
  --dialog-max-height: 100dvh; /* Override custom maxHeight on mobile */
1591
1651
  border-radius: 0;
1592
1652
  margin: 0;
1653
+ }
1654
+
1655
+ dialog,
1656
+ dialog.dialog-sm,
1657
+ dialog.dialog-lg,
1658
+ dialog.dialog-xl,
1659
+ dialog.dialog-full {
1593
1660
  transform: scale(0.98);
1594
1661
  }
1595
- dialog[open] {
1662
+
1663
+ dialog[open],
1664
+ dialog.dialog-sm[open],
1665
+ dialog.dialog-lg[open],
1666
+ dialog.dialog-xl[open],
1667
+ dialog.dialog-full[open] {
1596
1668
  transform: scale(1);
1597
1669
  animation: pds-dialog-enter-mobile var(--transition-normal) ease;
1598
1670
  }
@@ -1673,7 +1745,7 @@ html:has(dialog[open]:modal) {
1673
1745
  display: flex;
1674
1746
  align-items: center;
1675
1747
  gap: var(--spacing-2);
1676
- border-radius: inherit;
1748
+ border-radius: var(--radius-md);
1677
1749
  transition: background-color var(--transition-fast), box-shadow var(--transition-fast);
1678
1750
 
1679
1751
  &::-webkit-details-marker {
@@ -926,7 +926,7 @@ button, .btn, input[type="submit"], input[type="button"], input[type="reset"] {
926
926
  border-color: var(--color-border);
927
927
 
928
928
  /* Only apply generic hover to non-variant buttons */
929
- &:hover:not(.btn-primary):not(.btn-secondary):not(.btn-outline) {
929
+ &:hover:not(.btn-primary):not(.btn-secondary):not(.btn-outline):not(.btn-danger) {
930
930
  background-color: var(--color-surface-elevated);
931
931
  }
932
932
 
@@ -1014,6 +1014,56 @@ button, .btn, input[type="submit"], input[type="button"], input[type="reset"] {
1014
1014
  }
1015
1015
  }
1016
1016
 
1017
+ .btn-danger {
1018
+ background-color: var(--color-danger-600);
1019
+ color: white;
1020
+ border-color: var(--color-danger-600);
1021
+
1022
+ &:hover {
1023
+ background-color: color-mix(in oklab, var(--color-danger-600) 90%, black 10%);
1024
+ border-color: color-mix(in oklab, var(--color-danger-600) 90%, black 10%);
1025
+ color: white;
1026
+ }
1027
+
1028
+ &:active {
1029
+ background-color: color-mix(in oklab, var(--color-danger-600) 80%, black 20%);
1030
+ border-color: color-mix(in oklab, var(--color-danger-600) 80%, black 20%);
1031
+ color: white;
1032
+ }
1033
+ }
1034
+
1035
+ .btn-danger.btn-outline {
1036
+ background-color: transparent;
1037
+ color: var(--color-danger-600);
1038
+ border-color: var(--color-danger-600);
1039
+
1040
+ &:hover {
1041
+ background-color: var(--color-danger-600);
1042
+ border-color: var(--color-danger-600);
1043
+ color: white;
1044
+
1045
+ pds-icon {
1046
+ color: white;
1047
+ }
1048
+ }
1049
+
1050
+ &:active {
1051
+ background-color: color-mix(in oklab, var(--color-danger-600) 80%, black 20%);
1052
+ border-color: color-mix(in oklab, var(--color-danger-600) 80%, black 20%);
1053
+ color: white;
1054
+
1055
+ pds-icon {
1056
+ color: white;
1057
+ }
1058
+ }
1059
+
1060
+ &:disabled {
1061
+ background-color: transparent;
1062
+ color: var(--color-input-disabled-text);
1063
+ border-color: var(--color-input-disabled-bg);
1064
+ }
1065
+ }
1066
+
1017
1067
  .btn-sm {
1018
1068
  padding: calc(max(calc(var(--spacing-1) * 1), var(--spacing-2)) * 0.85) calc(var(--spacing-6) * 0.8);
1019
1069
  font-size: var(--font-size-sm);
@@ -1476,6 +1526,17 @@ dialog {
1476
1526
  overflow: hidden; /* Prevent dialog itself from scrolling - let .dialog-body handle it */
1477
1527
  }
1478
1528
 
1529
+ /*
1530
+ * Overlay safety valve:
1531
+ * Some controls (e.g. pds-daterange panel, data-dropdown menus) need to escape
1532
+ * the dialog bounds. Scope overflow visibility to custom dialogs that contain
1533
+ * those controls instead of enabling it for all dialogs.
1534
+ */
1535
+ dialog.dialog-custom:has(pds-daterange),
1536
+ dialog.dialog-custom:has([data-dropdown]) {
1537
+ overflow: visible;
1538
+ }
1539
+
1479
1540
  /* Form structure - use flexbox instead of contents */
1480
1541
  dialog form {
1481
1542
  display: flex;
@@ -1485,11 +1546,6 @@ dialog form {
1485
1546
  margin: 0;
1486
1547
  }
1487
1548
 
1488
- /* Dialog fields - to open pds-form subforms */
1489
- .dialog-field {
1490
- margin-top: var(--spacing-3);
1491
- }
1492
-
1493
1549
  /* Dialog header */
1494
1550
  dialog {
1495
1551
  header,
@@ -1544,7 +1600,20 @@ dialog {
1544
1600
  min-height: 0; /* Critical: allow flex child to shrink and scroll */
1545
1601
  padding: var(--spacing-3) var(--spacing-6);
1546
1602
  overflow-y: auto;
1547
- overflow-x: hidden;
1603
+ overflow-x: visible;
1604
+ }
1605
+
1606
+ /* Allow overlay menus (e.g. data-dropdown) to escape dialog-body clipping while open */
1607
+ article:has([data-dropdown] > :last-child[aria-hidden="false"]),
1608
+ form > article:has([data-dropdown] > :last-child[aria-hidden="false"]),
1609
+ .dialog-body:has([data-dropdown] > :last-child[aria-hidden="false"]) {
1610
+ overflow: visible;
1611
+ }
1612
+
1613
+ article:has(pds-daterange),
1614
+ form > article:has(pds-daterange),
1615
+ .dialog-body:has(pds-daterange) {
1616
+ overflow: visible;
1548
1617
  }
1549
1618
 
1550
1619
  /* Dialog footer - actions */
@@ -1570,23 +1639,14 @@ dialog.dialog-full { width: calc(100vw - var(--spacing-8)); max-width: calc(100v
1570
1639
  /* Mobile responsiveness - maximize on mobile */
1571
1640
  @media (max-width: 639px) {
1572
1641
  dialog,
1642
+ dialog.dialog-sm,
1643
+ dialog.dialog-lg,
1644
+ dialog.dialog-xl,
1645
+ dialog.dialog-full,
1573
1646
  dialog.dialog-no-scale-animation,
1574
1647
  dialog.dialog-no-scale-animation[open] {
1575
- left: 0 !important;
1576
- top: 0 !important;
1577
- }
1578
-
1579
- dialog.dialog-no-scale-animation,
1580
- dialog.dialog-no-scale-animation[open] {
1581
- transform: none !important;
1582
- }
1583
-
1584
- dialog[open] {
1585
- left: 0 !important;
1586
- top: 0 !important;
1587
- }
1588
-
1589
- dialog {
1648
+ left: 0;
1649
+ top: 0;
1590
1650
  max-width: 100vw;
1591
1651
  width: 100vw;
1592
1652
  height: 100dvh;
@@ -1594,9 +1654,21 @@ dialog.dialog-full { width: calc(100vw - var(--spacing-8)); max-width: calc(100v
1594
1654
  --dialog-max-height: 100dvh; /* Override custom maxHeight on mobile */
1595
1655
  border-radius: 0;
1596
1656
  margin: 0;
1657
+ }
1658
+
1659
+ dialog,
1660
+ dialog.dialog-sm,
1661
+ dialog.dialog-lg,
1662
+ dialog.dialog-xl,
1663
+ dialog.dialog-full {
1597
1664
  transform: scale(0.98);
1598
1665
  }
1599
- dialog[open] {
1666
+
1667
+ dialog[open],
1668
+ dialog.dialog-sm[open],
1669
+ dialog.dialog-lg[open],
1670
+ dialog.dialog-xl[open],
1671
+ dialog.dialog-full[open] {
1600
1672
  transform: scale(1);
1601
1673
  animation: pds-dialog-enter-mobile var(--transition-normal) ease;
1602
1674
  }
@@ -1677,7 +1749,7 @@ html:has(dialog[open]:modal) {
1677
1749
  display: flex;
1678
1750
  align-items: center;
1679
1751
  gap: var(--spacing-2);
1680
- border-radius: inherit;
1752
+ border-radius: var(--radius-md);
1681
1753
  transition: background-color var(--transition-fast), box-shadow var(--transition-fast);
1682
1754
 
1683
1755
  &::-webkit-details-marker {
@@ -3069,7 +3141,7 @@ button, .btn, input[type="submit"], input[type="button"], input[type="reset"] {
3069
3141
  border-color: var(--color-border);
3070
3142
 
3071
3143
  /* Only apply generic hover to non-variant buttons */
3072
- &:hover:not(.btn-primary):not(.btn-secondary):not(.btn-outline) {
3144
+ &:hover:not(.btn-primary):not(.btn-secondary):not(.btn-outline):not(.btn-danger) {
3073
3145
  background-color: var(--color-surface-elevated);
3074
3146
  }
3075
3147
 
@@ -3157,6 +3229,56 @@ button, .btn, input[type="submit"], input[type="button"], input[type="reset"] {
3157
3229
  }
3158
3230
  }
3159
3231
 
3232
+ .btn-danger {
3233
+ background-color: var(--color-danger-600);
3234
+ color: white;
3235
+ border-color: var(--color-danger-600);
3236
+
3237
+ &:hover {
3238
+ background-color: color-mix(in oklab, var(--color-danger-600) 90%, black 10%);
3239
+ border-color: color-mix(in oklab, var(--color-danger-600) 90%, black 10%);
3240
+ color: white;
3241
+ }
3242
+
3243
+ &:active {
3244
+ background-color: color-mix(in oklab, var(--color-danger-600) 80%, black 20%);
3245
+ border-color: color-mix(in oklab, var(--color-danger-600) 80%, black 20%);
3246
+ color: white;
3247
+ }
3248
+ }
3249
+
3250
+ .btn-danger.btn-outline {
3251
+ background-color: transparent;
3252
+ color: var(--color-danger-600);
3253
+ border-color: var(--color-danger-600);
3254
+
3255
+ &:hover {
3256
+ background-color: var(--color-danger-600);
3257
+ border-color: var(--color-danger-600);
3258
+ color: white;
3259
+
3260
+ pds-icon {
3261
+ color: white;
3262
+ }
3263
+ }
3264
+
3265
+ &:active {
3266
+ background-color: color-mix(in oklab, var(--color-danger-600) 80%, black 20%);
3267
+ border-color: color-mix(in oklab, var(--color-danger-600) 80%, black 20%);
3268
+ color: white;
3269
+
3270
+ pds-icon {
3271
+ color: white;
3272
+ }
3273
+ }
3274
+
3275
+ &:disabled {
3276
+ background-color: transparent;
3277
+ color: var(--color-input-disabled-text);
3278
+ border-color: var(--color-input-disabled-bg);
3279
+ }
3280
+ }
3281
+
3160
3282
  .btn-sm {
3161
3283
  padding: calc(max(calc(var(--spacing-1) * 1), var(--spacing-2)) * 0.85) calc(var(--spacing-6) * 0.8);
3162
3284
  font-size: var(--font-size-sm);
@@ -3619,6 +3741,17 @@ dialog {
3619
3741
  overflow: hidden; /* Prevent dialog itself from scrolling - let .dialog-body handle it */
3620
3742
  }
3621
3743
 
3744
+ /*
3745
+ * Overlay safety valve:
3746
+ * Some controls (e.g. pds-daterange panel, data-dropdown menus) need to escape
3747
+ * the dialog bounds. Scope overflow visibility to custom dialogs that contain
3748
+ * those controls instead of enabling it for all dialogs.
3749
+ */
3750
+ dialog.dialog-custom:has(pds-daterange),
3751
+ dialog.dialog-custom:has([data-dropdown]) {
3752
+ overflow: visible;
3753
+ }
3754
+
3622
3755
  /* Form structure - use flexbox instead of contents */
3623
3756
  dialog form {
3624
3757
  display: flex;
@@ -3628,11 +3761,6 @@ dialog form {
3628
3761
  margin: 0;
3629
3762
  }
3630
3763
 
3631
- /* Dialog fields - to open pds-form subforms */
3632
- .dialog-field {
3633
- margin-top: var(--spacing-3);
3634
- }
3635
-
3636
3764
  /* Dialog header */
3637
3765
  dialog {
3638
3766
  header,
@@ -3687,7 +3815,20 @@ dialog {
3687
3815
  min-height: 0; /* Critical: allow flex child to shrink and scroll */
3688
3816
  padding: var(--spacing-3) var(--spacing-6);
3689
3817
  overflow-y: auto;
3690
- overflow-x: hidden;
3818
+ overflow-x: visible;
3819
+ }
3820
+
3821
+ /* Allow overlay menus (e.g. data-dropdown) to escape dialog-body clipping while open */
3822
+ article:has([data-dropdown] > :last-child[aria-hidden="false"]),
3823
+ form > article:has([data-dropdown] > :last-child[aria-hidden="false"]),
3824
+ .dialog-body:has([data-dropdown] > :last-child[aria-hidden="false"]) {
3825
+ overflow: visible;
3826
+ }
3827
+
3828
+ article:has(pds-daterange),
3829
+ form > article:has(pds-daterange),
3830
+ .dialog-body:has(pds-daterange) {
3831
+ overflow: visible;
3691
3832
  }
3692
3833
 
3693
3834
  /* Dialog footer - actions */
@@ -3713,23 +3854,14 @@ dialog.dialog-full { width: calc(100vw - var(--spacing-8)); max-width: calc(100v
3713
3854
  /* Mobile responsiveness - maximize on mobile */
3714
3855
  @media (max-width: 639px) {
3715
3856
  dialog,
3857
+ dialog.dialog-sm,
3858
+ dialog.dialog-lg,
3859
+ dialog.dialog-xl,
3860
+ dialog.dialog-full,
3716
3861
  dialog.dialog-no-scale-animation,
3717
3862
  dialog.dialog-no-scale-animation[open] {
3718
- left: 0 !important;
3719
- top: 0 !important;
3720
- }
3721
-
3722
- dialog.dialog-no-scale-animation,
3723
- dialog.dialog-no-scale-animation[open] {
3724
- transform: none !important;
3725
- }
3726
-
3727
- dialog[open] {
3728
- left: 0 !important;
3729
- top: 0 !important;
3730
- }
3731
-
3732
- dialog {
3863
+ left: 0;
3864
+ top: 0;
3733
3865
  max-width: 100vw;
3734
3866
  width: 100vw;
3735
3867
  height: 100dvh;
@@ -3737,9 +3869,21 @@ dialog.dialog-full { width: calc(100vw - var(--spacing-8)); max-width: calc(100v
3737
3869
  --dialog-max-height: 100dvh; /* Override custom maxHeight on mobile */
3738
3870
  border-radius: 0;
3739
3871
  margin: 0;
3872
+ }
3873
+
3874
+ dialog,
3875
+ dialog.dialog-sm,
3876
+ dialog.dialog-lg,
3877
+ dialog.dialog-xl,
3878
+ dialog.dialog-full {
3740
3879
  transform: scale(0.98);
3741
3880
  }
3742
- dialog[open] {
3881
+
3882
+ dialog[open],
3883
+ dialog.dialog-sm[open],
3884
+ dialog.dialog-lg[open],
3885
+ dialog.dialog-xl[open],
3886
+ dialog.dialog-full[open] {
3743
3887
  transform: scale(1);
3744
3888
  animation: pds-dialog-enter-mobile var(--transition-normal) ease;
3745
3889
  }
@@ -3820,7 +3964,7 @@ html:has(dialog[open]:modal) {
3820
3964
  display: flex;
3821
3965
  align-items: center;
3822
3966
  gap: var(--spacing-2);
3823
- border-radius: inherit;
3967
+ border-radius: var(--radius-md);
3824
3968
  transition: background-color var(--transition-fast), box-shadow var(--transition-fast);
3825
3969
 
3826
3970
  &::-webkit-details-marker {
@@ -319,12 +319,15 @@
319
319
  }
320
320
 
321
321
  /* Media primitives */
322
- :where(img, video) {
323
- max-width: 100%;
324
- height: auto;
322
+ :where(img, video) {
325
323
  border-radius: var(--radius-sm);
326
324
  }
327
325
 
326
+ :where(img:not([height]):not([width]), video:not([height]):not([width])) {
327
+ height: auto;
328
+ max-width: 100%;
329
+ }
330
+
328
331
  :where(figure) {
329
332
  margin: 0 0 var(--spacing-6) 0;
330
333
  }
@@ -323,12 +323,15 @@ primitives.replaceSync(`@layer primitives {
323
323
  }
324
324
 
325
325
  /* Media primitives */
326
- :where(img, video) {
327
- max-width: 100%;
328
- height: auto;
326
+ :where(img, video) {
329
327
  border-radius: var(--radius-sm);
330
328
  }
331
329
 
330
+ :where(img:not([height]):not([width]), video:not([height]):not([width])) {
331
+ height: auto;
332
+ max-width: 100%;
333
+ }
334
+
332
335
  :where(figure) {
333
336
  margin: 0 0 var(--spacing-6) 0;
334
337
  }
@@ -669,12 +672,15 @@ export const primitivesCSS = `@layer primitives {
669
672
  }
670
673
 
671
674
  /* Media primitives */
672
- :where(img, video) {
673
- max-width: 100%;
674
- height: auto;
675
+ :where(img, video) {
675
676
  border-radius: var(--radius-sm);
676
677
  }
677
678
 
679
+ :where(img:not([height]):not([width]), video:not([height]):not([width])) {
680
+ height: auto;
681
+ max-width: 100%;
682
+ }
683
+
678
684
  :where(figure) {
679
685
  margin: 0 0 var(--spacing-6) 0;
680
686
  }