@donotdev/ui 0.0.9 → 0.0.11

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 (134) hide show
  1. package/dist/crud/components/EntityCardList.d.ts +16 -0
  2. package/dist/crud/components/EntityCardList.d.ts.map +1 -0
  3. package/dist/crud/components/EntityCardList.js +175 -0
  4. package/dist/crud/components/EntityDisplayRenderer.d.ts +13 -21
  5. package/dist/crud/components/EntityDisplayRenderer.d.ts.map +1 -1
  6. package/dist/crud/components/EntityDisplayRenderer.js +138 -23
  7. package/dist/crud/components/EntityFormRenderer.d.ts +18 -0
  8. package/dist/crud/components/EntityFormRenderer.d.ts.map +1 -0
  9. package/dist/crud/components/EntityFormRenderer.js +275 -0
  10. package/dist/crud/components/EntityList.d.ts +14 -0
  11. package/dist/crud/components/EntityList.d.ts.map +1 -0
  12. package/dist/crud/components/EntityList.js +201 -0
  13. package/dist/crud/components/index.d.ts +7 -5
  14. package/dist/crud/components/index.d.ts.map +1 -1
  15. package/dist/crud/components/index.js +6 -5
  16. package/dist/dndev.css +467 -143
  17. package/dist/index.js +4 -64
  18. package/dist/internal/common/RouteErrorFallback.d.ts.map +1 -1
  19. package/dist/internal/common/RouteErrorFallback.js +1 -2
  20. package/dist/internal/layout/DnDevLayout.d.ts.map +1 -1
  21. package/dist/internal/layout/DnDevLayout.js +3 -2
  22. package/dist/internal/layout/components/AutoMetaTags.d.ts.map +1 -1
  23. package/dist/internal/layout/components/AutoMetaTags.js +36 -6
  24. package/dist/internal/layout/components/NextJsAutoMetaTags.d.ts.map +1 -1
  25. package/dist/internal/layout/components/NextJsAutoMetaTags.js +38 -10
  26. package/dist/internal/layout/components/footer/FooterBranding.d.ts +0 -2
  27. package/dist/internal/layout/components/footer/FooterBranding.d.ts.map +1 -1
  28. package/dist/internal/layout/components/footer/FooterBranding.js +4 -8
  29. package/dist/internal/layout/components/footer/FooterCopyright.d.ts +0 -2
  30. package/dist/internal/layout/components/footer/FooterCopyright.d.ts.map +1 -1
  31. package/dist/internal/layout/components/footer/FooterCopyright.js +2 -6
  32. package/dist/internal/layout/config/presets/moolti.js +2 -2
  33. package/dist/internal/layout/zones/DnDevFooter.d.ts.map +1 -1
  34. package/dist/internal/layout/zones/DnDevFooter.js +2 -2
  35. package/dist/routing/GoTo.d.ts +1 -1
  36. package/dist/routing/GoTo.d.ts.map +1 -1
  37. package/dist/routing/GoTo.js +1 -1
  38. package/dist/routing/hooks/hooks.next.js +1 -1
  39. package/dist/routing/hooks/hooks.vite.js +1 -1
  40. package/dist/routing/hooks/useFormNavigationBlocker.d.ts +14 -0
  41. package/dist/routing/hooks/useFormNavigationBlocker.d.ts.map +1 -0
  42. package/dist/routing/hooks/useFormNavigationBlocker.js +42 -0
  43. package/dist/routing/hooks/useNavigate.next.d.ts +1 -1
  44. package/dist/routing/hooks/useNavigate.next.d.ts.map +1 -1
  45. package/dist/routing/hooks/useNavigate.next.js +7 -1
  46. package/dist/routing/hooks/useNavigate.vite.d.ts +1 -1
  47. package/dist/routing/hooks/useNavigate.vite.d.ts.map +1 -1
  48. package/dist/routing/hooks/useNavigate.vite.js +7 -1
  49. package/dist/styles/index.css +467 -143
  50. package/dist/utils/index.d.ts +1 -0
  51. package/dist/utils/index.d.ts.map +1 -1
  52. package/dist/utils/index.js +1 -0
  53. package/dist/utils/useFormStoreSafe.d.ts +59 -0
  54. package/dist/utils/useFormStoreSafe.d.ts.map +1 -0
  55. package/dist/utils/useFormStoreSafe.js +115 -0
  56. package/package.json +12 -12
  57. package/dist/crud/components/DisplayFieldRenderer.d.ts +0 -26
  58. package/dist/crud/components/DisplayFieldRenderer.d.ts.map +0 -1
  59. package/dist/crud/components/DisplayFieldRenderer.js +0 -107
  60. package/dist/crud/components/fields/display/AvatarFieldDisplay.d.ts +0 -23
  61. package/dist/crud/components/fields/display/AvatarFieldDisplay.d.ts.map +0 -1
  62. package/dist/crud/components/fields/display/AvatarFieldDisplay.js +0 -38
  63. package/dist/crud/components/fields/display/BadgeFieldDisplay.d.ts +0 -21
  64. package/dist/crud/components/fields/display/BadgeFieldDisplay.d.ts.map +0 -1
  65. package/dist/crud/components/fields/display/BadgeFieldDisplay.js +0 -31
  66. package/dist/crud/components/fields/display/ButtonFieldDisplay.d.ts +0 -29
  67. package/dist/crud/components/fields/display/ButtonFieldDisplay.d.ts.map +0 -1
  68. package/dist/crud/components/fields/display/ButtonFieldDisplay.js +0 -12
  69. package/dist/crud/components/fields/display/CheckboxFieldDisplay.d.ts +0 -21
  70. package/dist/crud/components/fields/display/CheckboxFieldDisplay.d.ts.map +0 -1
  71. package/dist/crud/components/fields/display/CheckboxFieldDisplay.js +0 -27
  72. package/dist/crud/components/fields/display/DateFieldDisplay.d.ts +0 -24
  73. package/dist/crud/components/fields/display/DateFieldDisplay.d.ts.map +0 -1
  74. package/dist/crud/components/fields/display/DateFieldDisplay.js +0 -42
  75. package/dist/crud/components/fields/display/DropdownDisplay.d.ts +0 -21
  76. package/dist/crud/components/fields/display/DropdownDisplay.d.ts.map +0 -1
  77. package/dist/crud/components/fields/display/DropdownDisplay.js +0 -25
  78. package/dist/crud/components/fields/display/FileFieldDisplay.d.ts +0 -21
  79. package/dist/crud/components/fields/display/FileFieldDisplay.d.ts.map +0 -1
  80. package/dist/crud/components/fields/display/FileFieldDisplay.js +0 -25
  81. package/dist/crud/components/fields/display/GeoPointFieldDisplay.d.ts +0 -25
  82. package/dist/crud/components/fields/display/GeoPointFieldDisplay.d.ts.map +0 -1
  83. package/dist/crud/components/fields/display/GeoPointFieldDisplay.js +0 -25
  84. package/dist/crud/components/fields/display/HiddenFieldDisplay.d.ts +0 -30
  85. package/dist/crud/components/fields/display/HiddenFieldDisplay.d.ts.map +0 -1
  86. package/dist/crud/components/fields/display/HiddenFieldDisplay.js +0 -12
  87. package/dist/crud/components/fields/display/ImageFieldDisplay.d.ts +0 -24
  88. package/dist/crud/components/fields/display/ImageFieldDisplay.d.ts.map +0 -1
  89. package/dist/crud/components/fields/display/ImageFieldDisplay.js +0 -38
  90. package/dist/crud/components/fields/display/LinkFieldDisplay.d.ts +0 -22
  91. package/dist/crud/components/fields/display/LinkFieldDisplay.d.ts.map +0 -1
  92. package/dist/crud/components/fields/display/LinkFieldDisplay.js +0 -47
  93. package/dist/crud/components/fields/display/MapFieldDisplay.d.ts +0 -25
  94. package/dist/crud/components/fields/display/MapFieldDisplay.d.ts.map +0 -1
  95. package/dist/crud/components/fields/display/MapFieldDisplay.js +0 -25
  96. package/dist/crud/components/fields/display/MultiDropdownDisplay.d.ts +0 -22
  97. package/dist/crud/components/fields/display/MultiDropdownDisplay.d.ts.map +0 -1
  98. package/dist/crud/components/fields/display/MultiDropdownDisplay.js +0 -25
  99. package/dist/crud/components/fields/display/MultiInputTextFieldDisplay.d.ts +0 -22
  100. package/dist/crud/components/fields/display/MultiInputTextFieldDisplay.d.ts.map +0 -1
  101. package/dist/crud/components/fields/display/MultiInputTextFieldDisplay.js +0 -25
  102. package/dist/crud/components/fields/display/NumberFieldDisplay.d.ts +0 -24
  103. package/dist/crud/components/fields/display/NumberFieldDisplay.d.ts.map +0 -1
  104. package/dist/crud/components/fields/display/NumberFieldDisplay.js +0 -29
  105. package/dist/crud/components/fields/display/PasswordFieldDisplay.d.ts +0 -24
  106. package/dist/crud/components/fields/display/PasswordFieldDisplay.d.ts.map +0 -1
  107. package/dist/crud/components/fields/display/PasswordFieldDisplay.js +0 -31
  108. package/dist/crud/components/fields/display/PhoneNumberDisplay.d.ts +0 -22
  109. package/dist/crud/components/fields/display/PhoneNumberDisplay.d.ts.map +0 -1
  110. package/dist/crud/components/fields/display/PhoneNumberDisplay.js +0 -26
  111. package/dist/crud/components/fields/display/RadioFieldDisplay.d.ts +0 -22
  112. package/dist/crud/components/fields/display/RadioFieldDisplay.d.ts.map +0 -1
  113. package/dist/crud/components/fields/display/RadioFieldDisplay.js +0 -25
  114. package/dist/crud/components/fields/display/RangeFieldDisplay.d.ts +0 -22
  115. package/dist/crud/components/fields/display/RangeFieldDisplay.d.ts.map +0 -1
  116. package/dist/crud/components/fields/display/RangeFieldDisplay.js +0 -25
  117. package/dist/crud/components/fields/display/ReferenceFieldDisplay.d.ts +0 -22
  118. package/dist/crud/components/fields/display/ReferenceFieldDisplay.d.ts.map +0 -1
  119. package/dist/crud/components/fields/display/ReferenceFieldDisplay.js +0 -26
  120. package/dist/crud/components/fields/display/RichTextDisplay.d.ts +0 -25
  121. package/dist/crud/components/fields/display/RichTextDisplay.d.ts.map +0 -1
  122. package/dist/crud/components/fields/display/RichTextDisplay.js +0 -104
  123. package/dist/crud/components/fields/display/TextAreaDisplay.d.ts +0 -22
  124. package/dist/crud/components/fields/display/TextAreaDisplay.d.ts.map +0 -1
  125. package/dist/crud/components/fields/display/TextAreaDisplay.js +0 -25
  126. package/dist/crud/components/fields/display/TextFieldDisplay.d.ts +0 -42
  127. package/dist/crud/components/fields/display/TextFieldDisplay.d.ts.map +0 -1
  128. package/dist/crud/components/fields/display/TextFieldDisplay.js +0 -97
  129. package/dist/crud/components/fields/display/TimestampFieldDisplay.d.ts +0 -22
  130. package/dist/crud/components/fields/display/TimestampFieldDisplay.d.ts.map +0 -1
  131. package/dist/crud/components/fields/display/TimestampFieldDisplay.js +0 -33
  132. package/dist/crud/components/fields/display/index.d.ts +0 -32
  133. package/dist/crud/components/fields/display/index.d.ts.map +0 -1
  134. package/dist/crud/components/fields/display/index.js +0 -32
package/dist/dndev.css CHANGED
@@ -2213,6 +2213,20 @@ em {
2213
2213
  padding-inline-start: var(--gap-md);
2214
2214
  }
2215
2215
 
2216
+ /* Bare mode - no visual chrome, used inside FloatingLabel or custom wrappers */
2217
+
2218
+ [data-bare] {
2219
+ border: none !important;
2220
+ box-shadow: none !important;
2221
+ background: transparent !important;
2222
+ }
2223
+
2224
+ [data-bare]:hover,[data-bare]:focus,[data-bare]:focus-visible {
2225
+ border-color: transparent !important;
2226
+ box-shadow: none !important;
2227
+ outline: none !important;
2228
+ }
2229
+
2216
2230
  /* Password strength bar height override */
2217
2231
 
2218
2232
  .dndev-password-strength-bar {
@@ -3314,6 +3328,7 @@ em {
3314
3328
 
3315
3329
  .dndev-collapsible-content[data-state='open'] {
3316
3330
  animation: slideDown var(--dur-normal) var(--ease-in-out);
3331
+ overflow: visible; /* Allow dropdowns/overlays to escape when open */
3317
3332
  }
3318
3333
 
3319
3334
  .dndev-collapsible-content[data-state='closed'] {
@@ -4444,8 +4459,181 @@ em {
4444
4459
  padding-block: var(--gap-lg);
4445
4460
  }
4446
4461
 
4462
+ /* packages/components/src/advanced/ImageGallery/ImageGallery.css */
4463
+
4464
+ .image-gallery {
4465
+ display: flex;
4466
+ flex-direction: column;
4467
+ gap: var(--gap-md);
4468
+ outline: none;
4469
+ }
4470
+
4471
+ .image-gallery:focus-visible {
4472
+ outline: 2px solid var(--primary);
4473
+ outline-offset: 2px;
4474
+ border-radius: var(--radius-lg);
4475
+ }
4476
+
4477
+ /* Empty state */
4478
+
4479
+ .image-gallery--empty {
4480
+ display: flex;
4481
+ align-items: center;
4482
+ justify-content: center;
4483
+ background-color: var(--muted);
4484
+ border-radius: var(--radius-lg);
4485
+ }
4486
+
4487
+ .image-gallery__placeholder {
4488
+ color: var(--muted-foreground);
4489
+ font-size: var(--font-size-sm);
4490
+ }
4491
+
4492
+ /* Main image container */
4493
+
4494
+ .image-gallery__main {
4495
+ position: relative;
4496
+ width: 100%;
4497
+ overflow: hidden;
4498
+ border-radius: var(--radius-surface);
4499
+ background-color: var(--muted);
4500
+ }
4501
+
4502
+ .image-gallery__main-image {
4503
+ width: 100%;
4504
+ height: 100%;
4505
+ -o-object-fit: cover;
4506
+ object-fit: cover;
4507
+ display: block;
4508
+ position: relative;
4509
+ }
4510
+
4511
+ /* Navigation arrows */
4512
+
4513
+ .image-gallery__nav {
4514
+ position: absolute;
4515
+ top: 50%;
4516
+ transform: translateY(-50%);
4517
+ display: flex;
4518
+ align-items: center;
4519
+ justify-content: center;
4520
+ width: 44px;
4521
+ height: 44px;
4522
+ border: none;
4523
+ border-radius: var(--radius-full);
4524
+ background-color: var(--background);
4525
+ color: var(--foreground);
4526
+ cursor: pointer;
4527
+ opacity: 0;
4528
+ transition:
4529
+ opacity 0.2s ease,
4530
+ background-color 0.2s ease;
4531
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
4532
+ z-index: 2;
4533
+ }
4534
+
4535
+ .image-gallery__main:hover .image-gallery__nav,
4536
+ .image-gallery:focus-within .image-gallery__nav {
4537
+ opacity: 1;
4538
+ }
4539
+
4540
+ .image-gallery__nav:hover {
4541
+ background-color: var(--primary);
4542
+ color: var(--primary-foreground);
4543
+ }
4544
+
4545
+ .image-gallery__nav:focus-visible {
4546
+ opacity: 1;
4547
+ outline: 2px solid var(--primary);
4548
+ outline-offset: 2px;
4549
+ }
4550
+
4551
+ .image-gallery__nav--prev {
4552
+ inset-inline-start: var(--gap-md);
4553
+ }
4554
+
4555
+ .image-gallery__nav--next {
4556
+ inset-inline-end: var(--gap-md);
4557
+ }
4558
+
4559
+ /* Thumbnails */
4560
+
4561
+ .image-gallery__thumbnails {
4562
+ display: flex;
4563
+ flex-wrap: wrap;
4564
+ gap: var(--gap-sm);
4565
+ }
4566
+
4567
+ .image-gallery__thumbnail {
4568
+ flex: 0 0 auto;
4569
+ width: 80px;
4570
+ height: 60px;
4571
+ padding: 0;
4572
+ border: 2px solid transparent;
4573
+ border-radius: var(--radius-surface);
4574
+ overflow: hidden;
4575
+ cursor: pointer;
4576
+ background: none;
4577
+ transition:
4578
+ border-color 0.2s ease,
4579
+ transform 0.2s ease;
4580
+ }
4581
+
4582
+ .image-gallery__thumbnail:hover {
4583
+ border-color: var(--muted-foreground);
4584
+ }
4585
+
4586
+ .image-gallery__thumbnail:focus-visible {
4587
+ outline: 2px solid var(--primary);
4588
+ outline-offset: 2px;
4589
+ }
4590
+
4591
+ .image-gallery__thumbnail--selected {
4592
+ border-color: var(--primary);
4593
+ }
4594
+
4595
+ .image-gallery__thumbnail-image {
4596
+ width: 100%;
4597
+ height: 100%;
4598
+ -o-object-fit: cover;
4599
+ object-fit: cover;
4600
+ display: block;
4601
+ }
4602
+
4603
+ /* Responsive adjustments */
4604
+
4605
+ @media (max-width: 640px) {
4606
+ .image-gallery__thumbnail {
4607
+ width: 60px;
4608
+ height: 45px;
4609
+ }
4610
+
4611
+ .image-gallery__nav {
4612
+ width: 36px;
4613
+ height: 36px;
4614
+ opacity: 0.8;
4615
+ }
4616
+
4617
+ .image-gallery__nav svg {
4618
+ width: 20px;
4619
+ height: 20px;
4620
+ }
4621
+ }
4622
+
4447
4623
  /* packages/components/src/atomic/Input/Input.css */
4448
4624
 
4625
+ /* Hide number input spinners - cleaner UI for price/range inputs */
4626
+
4627
+ input[type='number']::-webkit-inner-spin-button,
4628
+ input[type='number']::-webkit-outer-spin-button {
4629
+ -webkit-appearance: none;
4630
+ margin: 0;
4631
+ }
4632
+
4633
+ input[type='number'] {
4634
+ -moz-appearance: textfield;
4635
+ }
4636
+
4449
4637
  /* Input with leading icon (search, etc.) */
4450
4638
 
4451
4639
  .dndev-input-with-leading-icon {
@@ -4655,6 +4843,9 @@ em {
4655
4843
  background-color: transparent;
4656
4844
  transition: all var(--dur-normal) var(--ease-in-out);
4657
4845
  text-align: start;
4846
+ /* Flex-aware: allow fieldset to shrink in flex containers */
4847
+ min-width: 0;
4848
+ width: 100%;
4658
4849
  }
4659
4850
 
4660
4851
  .dndev-floating-fieldset:hover {
@@ -4663,7 +4854,6 @@ em {
4663
4854
 
4664
4855
  .dndev-floating-fieldset:focus-within {
4665
4856
  border-color: var(--ring);
4666
- box-shadow: 0 0 0 2px var(--ring);
4667
4857
  }
4668
4858
 
4669
4859
  .dndev-floating-fieldset[data-disabled='true'] {
@@ -4680,6 +4870,11 @@ em {
4680
4870
  font-weight: 500;
4681
4871
  line-height: 1;
4682
4872
  color: var(--foreground);
4873
+ /* Ellipsis by default */
4874
+ max-width: 100%;
4875
+ overflow: hidden;
4876
+ text-overflow: ellipsis;
4877
+ white-space: nowrap;
4683
4878
  }
4684
4879
 
4685
4880
  .dndev-floating-legend label {
@@ -4693,30 +4888,23 @@ em {
4693
4888
  color: var(--muted-foreground);
4694
4889
  }
4695
4890
 
4696
- .dndev-floating-legend[data-truncate='true'] {
4697
- max-width: calc(100% - var(--gap-md) * 2);
4698
- overflow: hidden;
4699
- text-overflow: ellipsis;
4700
- white-space: nowrap;
4701
- }
4702
-
4703
- /* Remove border from inner input since fieldset has it */
4891
+ /* Disable truncation when explicitly set to false */
4704
4892
 
4705
- .dndev-floating-fieldset .dndev-input {
4706
- border: none;
4707
- border-radius: var(--radius-interactive);
4708
- box-shadow: none;
4893
+ .dndev-floating-legend[data-truncate='false'] {
4894
+ max-width: none;
4895
+ overflow: visible;
4896
+ text-overflow: clip;
4897
+ white-space: normal;
4709
4898
  }
4710
4899
 
4711
- .dndev-floating-fieldset .dndev-input:hover {
4712
- border-color: transparent;
4713
- }
4900
+ /* Input inside fieldset uses bare mode via data-bare attribute (set by Input component) */
4714
4901
 
4715
- .dndev-floating-fieldset .dndev-input:focus,
4716
- .dndev-floating-fieldset .dndev-input:focus-visible {
4717
- border-color: transparent;
4902
+ /* This rule is kept for non-Input children that might need border removal */
4903
+
4904
+ .dndev-floating-fieldset > .dndev-input:not([data-bare]) {
4905
+ border: none;
4718
4906
  box-shadow: none;
4719
- outline: none;
4907
+ background: transparent;
4720
4908
  }
4721
4909
 
4722
4910
  /* packages/components/src/atomic/List/List.css */
@@ -5067,11 +5255,33 @@ em {
5067
5255
  /* packages/components/src/atomic/Pagination/Pagination.css */
5068
5256
 
5069
5257
  .dndev-pagination {
5258
+ display: flex;
5259
+ flex-direction: row;
5260
+ align-items: center;
5261
+ justify-content: space-between;
5262
+ gap: var(--gap-md);
5263
+ width: 100%;
5264
+ }
5265
+
5266
+ .dndev-pagination-info {
5267
+ display: none;
5268
+ }
5269
+
5270
+ .dndev-pagination-size {
5271
+ display: flex;
5272
+ align-items: center;
5273
+ }
5274
+
5275
+ .dndev-pagination-size-label {
5276
+ display: none;
5277
+ }
5278
+
5279
+ .dndev-pagination-nav {
5070
5280
  display: flex;
5071
5281
  align-items: center;
5072
5282
  justify-content: center;
5073
5283
  gap: var(--gap-sm);
5074
- flex-wrap: wrap;
5284
+ width: 100%;
5075
5285
  }
5076
5286
 
5077
5287
  .dndev-pagination-list {
@@ -5083,57 +5293,36 @@ em {
5083
5293
  margin: 0;
5084
5294
  }
5085
5295
 
5086
- .dndev-pagination-item {
5087
- display: flex;
5088
- align-items: center;
5089
- justify-content: center;
5090
- }
5091
-
5092
5296
  .dndev-pagination-button {
5093
- min-width: var(--touch-target);
5297
+ width: var(--touch-target);
5094
5298
  height: var(--touch-target);
5095
- display: flex;
5299
+ padding: 0;
5300
+ flex-shrink: 0;
5301
+ display: inline-flex;
5096
5302
  align-items: center;
5097
5303
  justify-content: center;
5098
- gap: var(--gap-sm);
5099
- border-radius: var(--radius-interactive);
5100
- font-weight: 500;
5101
- transition: var(--transition-fast);
5102
- cursor: pointer;
5103
- border: var(--border-hairline) solid var(--line-2);
5104
- background: transparent;
5105
- color: var(--foreground);
5106
- padding: var(--gap-sm) var(--gap-md);
5107
5304
  }
5108
5305
 
5109
- .dndev-pagination-button:hover:not(:disabled) {
5110
- background: var(--accent);
5111
- color: var(--accent-foreground);
5112
- }
5306
+ /* Desktop: Show all elements in one row */
5113
5307
 
5114
- .dndev-pagination-button:focus-visible {
5115
- outline: 2px solid var(--ring);
5116
- outline-offset: 2px;
5308
+ @media (min-width: 768px) {
5309
+ .dndev-pagination-info,
5310
+ .dndev-pagination-size {
5311
+ display: flex;
5312
+ align-items: center;
5313
+ white-space: nowrap;
5117
5314
  }
5118
5315
 
5119
- .dndev-pagination-button:disabled {
5120
- opacity: var(--opacity-muted);
5121
- cursor: not-allowed;
5316
+ .dndev-pagination-size-label {
5317
+ margin-right: var(--gap-sm);
5122
5318
  }
5123
5319
 
5124
- .dndev-pagination-button[aria-current='page'] {
5125
- background: var(--primary);
5126
- color: var(--primary-foreground);
5127
- border-color: var(--primary);
5320
+ .dndev-pagination-nav {
5321
+ justify-content: flex-end;
5322
+ width: auto;
5323
+ margin-left: auto;
5324
+ /* Push to right */
5128
5325
  }
5129
-
5130
- .dndev-pagination-ellipsis {
5131
- display: flex;
5132
- align-items: center;
5133
- justify-content: center;
5134
- width: var(--touch-target);
5135
- height: var(--touch-target);
5136
- color: var(--muted-foreground);
5137
5326
  }
5138
5327
 
5139
5328
  /* packages/components/src/atomic/Popover/Popover.css */
@@ -5864,8 +6053,12 @@ em {
5864
6053
 
5865
6054
  /* Adjust header padding when drag handle is present (sibling selector) */
5866
6055
 
5867
- .dndev-sheet-content[data-side='bottom'] .dndev-sheet-drag-handle ~ .dndev-sheet-header,
5868
- .dndev-sheet-content[data-side='top'] .dndev-sheet-drag-handle ~ .dndev-sheet-header {
6056
+ .dndev-sheet-content[data-side='bottom']
6057
+ .dndev-sheet-drag-handle
6058
+ ~ .dndev-sheet-header,
6059
+ .dndev-sheet-content[data-side='top']
6060
+ .dndev-sheet-drag-handle
6061
+ ~ .dndev-sheet-header {
5869
6062
  padding-top: 0;
5870
6063
  }
5871
6064
 
@@ -5923,12 +6116,9 @@ em {
5923
6116
  position: relative;
5924
6117
  margin-inline-start: auto;
5925
6118
  /* Push to end (RTL-aware: end = right in LTR, left in RTL) */
6119
+ margin-inline-end: var(--gap-sm);
6120
+ /* Spacing from edge - use margin not padding to keep icon centered */
5926
6121
  opacity: var(--opacity-muted);
5927
- /* No padding - tight spacing */
5928
- padding: 0;
5929
- /* RTL-aware: padding on logical end only */
5930
- padding-inline-end: var(--gap-md);
5931
- padding-inline-start: 0;
5932
6122
  }
5933
6123
 
5934
6124
  .dndev-sheet-close:hover {
@@ -6713,7 +6903,21 @@ em {
6713
6903
  }
6714
6904
 
6715
6905
  .dndev-table-header {
6716
- /* Base header styles */
6906
+ background-color: var(--accent);
6907
+ }
6908
+
6909
+ /* Filter row above header */
6910
+
6911
+ .dndev-table-filter-row {
6912
+ border: 1px solid var(--border);
6913
+ border-bottom: none;
6914
+ }
6915
+
6916
+ .dndev-table-filter-row .dndev-table-head {
6917
+ background-color: var(--muted);
6918
+ padding: var(--gap-xs);
6919
+ height: auto;
6920
+ min-height: auto;
6717
6921
  }
6718
6922
 
6719
6923
  .dndev-table-body {
@@ -6775,22 +6979,34 @@ em {
6775
6979
  padding-block: var(--gap-sm);
6776
6980
  }
6777
6981
 
6778
- .dndev-table-head[data-sortable='true'] {
6982
+ /* Header cells use accent foreground for contrast */
6983
+
6984
+ .dndev-table-header .dndev-table-head {
6985
+ color: var(--accent-foreground);
6986
+ }
6987
+
6988
+ [data-sortable='true']:is(.dndev-table-header .dndev-table-head) {
6779
6989
  cursor: pointer;
6780
6990
  }
6781
6991
 
6782
- .dndev-table-head[data-align='center'] {
6992
+ [data-align='center']:is(.dndev-table-header .dndev-table-head) {
6783
6993
  text-align: center;
6784
6994
  }
6785
6995
 
6786
- .dndev-table-head[data-align='end'] {
6996
+ [data-align='end']:is(.dndev-table-header .dndev-table-head) {
6787
6997
  text-align: end;
6788
6998
  }
6789
6999
 
6790
- .dndev-table-head[data-align='start'] {
7000
+ [data-align='start']:is(.dndev-table-header .dndev-table-head) {
6791
7001
  text-align: start;
6792
7002
  }
6793
7003
 
7004
+ /* Active filter indicator */
7005
+
7006
+ .dndev-table-filter-active {
7007
+ color: var(--primary);
7008
+ }
7009
+
6794
7010
  /* Table cell (td) styles */
6795
7011
 
6796
7012
  .dndev-table-cell {
@@ -6798,6 +7014,7 @@ em {
6798
7014
  padding-inline: var(--gap-md);
6799
7015
  padding-block: var(--gap-sm);
6800
7016
  min-height: var(--touch-target);
7017
+ line-height: 1.5; /* Ensure consistent line height for empty cells */
6801
7018
  }
6802
7019
 
6803
7020
  .dndev-table-cell[data-align='center'] {
@@ -6876,6 +7093,64 @@ em {
6876
7093
  padding-inline-start: calc(var(--gap-md) + var(--icon-md) + var(--gap-sm));
6877
7094
  }
6878
7095
 
7096
+ /* Skeleton rows - apply standard skeleton pulse animation to entire rows */
7097
+
7098
+ /* Keep existing background colors (zebra striping) - just add opacity pulse */
7099
+
7100
+ .dndev-table-body .dndev-table-row.dndev-skeleton-row {
7101
+ animation: dndev-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
7102
+ pointer-events: none;
7103
+
7104
+ /* Keep hover state but disabled (pointer-events: none prevents hover) */
7105
+ }
7106
+
7107
+ :is(.dndev-table-body .dndev-table-row.dndev-skeleton-row):hover {
7108
+ /* Inherit from parent .dndev-table-row hover styles */
7109
+ }
7110
+
7111
+ /* Even rows keep their var(--muted) background, just pulse */
7112
+
7113
+ .dndev-table-body .dndev-table-row.dndev-skeleton-row:nth-child(even) {
7114
+ animation: dndev-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
7115
+ }
7116
+
7117
+ :is(.dndev-table-body .dndev-table-row.dndev-skeleton-row:nth-child(even)):hover {
7118
+ /* Inherit from parent .dndev-table-row:nth-child(even) hover styles */
7119
+ }
7120
+
7121
+ /* Skeleton bars inside cells - adapt to row background for visibility */
7122
+
7123
+ /* Odd rows (transparent background): use default var(--muted) skeleton */
7124
+
7125
+ /* Even rows (var(--muted) background): use lighter skeleton for contrast */
7126
+
7127
+ .dndev-table-body .dndev-table-row.dndev-skeleton-row .dndev-skeleton {
7128
+ background-color: var(--muted);
7129
+ }
7130
+
7131
+ .dndev-table-body
7132
+ .dndev-table-row.dndev-skeleton-row:nth-child(even)
7133
+ .dndev-skeleton {
7134
+ /* Even rows have var(--muted) background, so skeleton should be lighter for contrast */
7135
+ background-color: color-mix(
7136
+ in oklab,
7137
+ var(--muted) 60%,
7138
+ var(--foreground) 40%
7139
+ );
7140
+ }
7141
+
7142
+ /* Use the same pulse animation as standard skeleton (from Skeleton.css) */
7143
+
7144
+ @keyframes dndev-pulse {
7145
+ 0%,
7146
+ 100% {
7147
+ opacity: 1;
7148
+ }
7149
+ 50% {
7150
+ opacity: var(--opacity-muted);
7151
+ }
7152
+ }
7153
+
6879
7154
  /* packages/components/src/atomic/Tabs/Tabs.css */
6880
7155
 
6881
7156
  /* Tabs list: use flexbox for natural wrapping, not grid */
@@ -7246,6 +7521,24 @@ em {
7246
7521
  font-size: var(--font-size-sm);
7247
7522
  }
7248
7523
 
7524
+ /* Font weight overrides (after level rules, so weight prop overrides level defaults) */
7525
+
7526
+ .dndev-text-base[data-font-weight='normal'] {
7527
+ font-weight: var(--font-weight-normal);
7528
+ }
7529
+
7530
+ .dndev-text-base[data-font-weight='medium'] {
7531
+ font-weight: var(--font-weight-medium);
7532
+ }
7533
+
7534
+ .dndev-text-base[data-font-weight='semibold'] {
7535
+ font-weight: var(--font-weight-semibold);
7536
+ }
7537
+
7538
+ .dndev-text-base[data-font-weight='bold'] {
7539
+ font-weight: var(--font-weight-bold);
7540
+ }
7541
+
7249
7542
  /* packages/components/src/atomic/Toaster/Toaster.css */
7250
7543
 
7251
7544
  .dndev-toast-viewport {
@@ -8815,6 +9108,7 @@ h4[data-variant='code'] {
8815
9108
  from {
8816
9109
  opacity: 1;
8817
9110
  }
9111
+
8818
9112
  to {
8819
9113
  opacity: 0;
8820
9114
  }
@@ -8824,6 +9118,7 @@ h4[data-variant='code'] {
8824
9118
  from {
8825
9119
  opacity: 0;
8826
9120
  }
9121
+
8827
9122
  to {
8828
9123
  opacity: 1;
8829
9124
  }
@@ -8836,6 +9131,7 @@ h4[data-variant='code'] {
8836
9131
  opacity: 1;
8837
9132
  transform: translateX(0);
8838
9133
  }
9134
+
8839
9135
  to {
8840
9136
  opacity: 0;
8841
9137
  transform: translateX(-100%);
@@ -8847,6 +9143,7 @@ h4[data-variant='code'] {
8847
9143
  opacity: 0;
8848
9144
  transform: translateX(100%);
8849
9145
  }
9146
+
8850
9147
  to {
8851
9148
  opacity: 1;
8852
9149
  transform: translateX(0);
@@ -8921,7 +9218,7 @@ main[role='main'][data-routing-animation='none'] {
8921
9218
 
8922
9219
  /* Tablet (768px - 1023px) */
8923
9220
 
8924
- @media (width >= 768px) and (width <= 1023px) {
9221
+ @media (width >=768px) and (width <=1023px) {
8925
9222
  main[role='main'][data-routing-animation='fade'] {
8926
9223
  animation: routeFadeIn
8927
9224
  var(--routing-tablet-duration, var(--routing-default-duration, 300ms))
@@ -8937,7 +9234,7 @@ main[role='main'][data-routing-animation='none'] {
8937
9234
 
8938
9235
  /* Desktop (1024px - 1439px) */
8939
9236
 
8940
- @media (width >= 1024px) and (width <= 1439px) {
9237
+ @media (width >=1024px) and (width <=1439px) {
8941
9238
  main[role='main'][data-routing-animation='fade'] {
8942
9239
  animation: routeFadeIn
8943
9240
  var(--routing-desktop-duration, var(--routing-default-duration, 300ms))
@@ -8953,7 +9250,7 @@ main[role='main'][data-routing-animation='none'] {
8953
9250
 
8954
9251
  /* Wide (>= 1440px) */
8955
9252
 
8956
- @media (width >= 1440px) {
9253
+ @media (width >=1440px) {
8957
9254
  main[role='main'][data-routing-animation='fade'] {
8958
9255
  animation: routeFadeIn
8959
9256
  var(--routing-wide-duration, var(--routing-default-duration, 300ms))
@@ -8986,7 +9283,7 @@ main[role='main'][data-routing-animation='none'] {
8986
9283
 
8987
9284
  /* Mobile/Tablet: Hide sidebars - WCAG & Lighthouse best practices */
8988
9285
 
8989
- @media (width <= 1023px) {
9286
+ @media (width <=1023px) {
8990
9287
  .dndev-layout aside[role='navigation'].sidebar,
8991
9288
  aside[role='navigation'].sidebar {
8992
9289
  display: none !important;
@@ -9016,59 +9313,55 @@ main[role='main'][data-routing-animation='none'] {
9016
9313
  );
9017
9314
  grid-template-columns: var(--sidebar-width) 1fr;
9018
9315
 
9019
- /* Mobile: No footer grid row - footer is inside main */
9020
- /* When mergedBar is shown, header is hidden but grid still needs space for mergedBar */
9316
+ /* Mobile: Grid scrolls instead of main - footer scrolls with content */
9021
9317
  }
9022
9318
 
9023
- @media (width <= 1023px) {
9319
+ @media (width <=1023px) {
9024
9320
 
9025
9321
  .dndev-layout {
9322
+ overflow-y: auto;
9323
+ overflow-x: hidden;
9324
+ /* Keep footer row - grid scrolls so footer scrolls with content */
9026
9325
  grid-template-areas:
9027
9326
  'header header'
9028
- 'sidebar main';
9029
- grid-template-rows: var(--header-height) 1fr;
9030
-
9031
- /* Presets with mergedBar: header is hidden, but grid still allocates space for mergedBar */
9032
- /* No extra padding needed - grid spacing is sufficient */
9327
+ 'sidebar main'
9328
+ 'footer footer';
9329
+ grid-template-rows: var(--header-height) min-content auto;
9033
9330
  }
9034
- .dndev-layout[data-layout='admin'],.dndev-layout[data-layout='moolti'],.dndev-layout[data-layout='game'],.dndev-layout[data-layout='docs'] {
9035
- /* Grid already accounts for header-height, mergedBar is fixed and doesn't need extra padding */
9036
- }
9037
9331
  }
9038
9332
 
9039
- /* Footer containers: show/hide based on breakpoint */
9333
+ /* Footer scroll mode - grid scrolls, footer scrolls with content (opt-in for desktop) */
9040
9334
 
9041
- .footer-mobile {
9042
- display: none;
9043
- /* No margin-top: auto - footer scrolls with content on mobile */
9044
- /* No flex-shrink: 0 - footer is in normal flow, not stuck at bottom */
9335
+ .dndev-layout[data-footer-mode='scroll'] {
9336
+ overflow-y: auto;
9337
+ overflow-x: hidden;
9338
+ grid-template-rows: var(--header-height) min-content auto;
9045
9339
  }
9046
9340
 
9047
- .footer-desktop {
9048
- display: contents; /* Children (footer element) participate in grid */
9341
+ .dndev-layout[data-footer-mode='scroll'] header[role='banner'] {
9342
+ position: sticky;
9343
+ top: 0;
9049
9344
  }
9050
9345
 
9051
- @media (width <= 1023px) {
9052
- .footer-mobile {
9053
- display: block;
9054
- }
9346
+ .dndev-layout[data-footer-mode='scroll'] main[role='main'] {
9347
+ overflow: visible;
9348
+ min-height: -moz-min-content;
9349
+ min-height: min-content;
9350
+ }
9055
9351
 
9056
- .footer-desktop {
9057
- display: none;
9058
- }
9352
+ .dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo'] {
9353
+ height: auto;
9354
+ }
9059
9355
 
9060
- /* Game: No mobile footer - navigation in MergedBar */
9061
- [data-layout='game'] .footer-mobile {
9062
- display: none;
9356
+ :is(.dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo']) > * {
9357
+ height: auto;
9358
+ min-height: var(--footer-height);
9063
9359
  }
9064
- }
9065
9360
 
9066
9361
  /* Presets with no footer at all */
9067
9362
 
9068
- [data-layout='moolti'] .footer-mobile,
9069
- [data-layout='moolti'] .footer-desktop,
9070
- [data-layout='plain'] .footer-mobile,
9071
- [data-layout='plain'] .footer-desktop {
9363
+ [data-layout='moolti'] footer[role='contentinfo'],
9364
+ [data-layout='plain'] footer[role='contentinfo'] {
9072
9365
  display: none;
9073
9366
  }
9074
9367
 
@@ -9106,8 +9399,18 @@ header[role='banner'] {
9106
9399
  /* Theme-aware styling - 100% controlled by theme system */
9107
9400
  background: var(--background);
9108
9401
  border-bottom: var(--border-hairline) solid var(--border);
9402
+
9403
+ /* Mobile: Sticky header (for presets that keep header visible) */
9109
9404
  }
9110
9405
 
9406
+ @media (width <=1023px) {
9407
+
9408
+ header[role='banner'] {
9409
+ position: sticky;
9410
+ top: 0;
9411
+ }
9412
+ }
9413
+
9111
9414
  .header-start {
9112
9415
  display: flex;
9113
9416
  align-items: center;
@@ -9161,19 +9464,20 @@ header[role='banner'] .header-center {
9161
9464
  aside[role='navigation'].sidebar {
9162
9465
  grid-area: sidebar;
9163
9466
  box-sizing: border-box;
9164
- min-width: calc(
9165
- var(--sidebar-resize-handle-width) + 48px
9166
- ); /* Min: 48px content + 6px handle = 54px */
9167
- max-width: calc(
9168
- var(--sidebar-resize-handle-width) + 400px
9169
- ); /* Max: 400px content + 6px handle = 406px */
9467
+ min-width: calc(var(--sidebar-resize-handle-width) + 48px);
9468
+ /* Min: 48px content + 6px handle = 54px */
9469
+ max-width: calc(var(--sidebar-resize-handle-width) + 400px);
9470
+ /* Max: 400px content + 6px handle = 406px */
9170
9471
  z-index: var(--z-sidebar);
9171
- overflow: none; /* No clipping needed - handle is in grid */
9472
+ overflow: none;
9473
+ /* No clipping needed - handle is in grid */
9172
9474
  contain: layout style;
9173
9475
  padding: 0;
9174
9476
  display: grid;
9175
- grid-template-columns: auto var(--sidebar-resize-handle-width); /* Content | Handle - column 1 width set inline */
9176
- grid-template-rows: auto 1fr auto; /* Top | Content | Bottom */
9477
+ grid-template-columns: auto var(--sidebar-resize-handle-width);
9478
+ /* Content | Handle - column 1 width set inline */
9479
+ grid-template-rows: auto 1fr auto;
9480
+ /* Top | Content | Bottom */
9177
9481
  height: 100%;
9178
9482
 
9179
9483
  /* Theme-aware styling - 100% controlled by theme system */
@@ -9228,7 +9532,8 @@ aside[role='navigation'].sidebar[data-dragging='true']
9228
9532
 
9229
9533
  @media (hover: none) {
9230
9534
  aside[role='navigation'].sidebar .dndev-sidebar-resize-handle {
9231
- width: calc(var(--sidebar-resize-handle-width) * 2); /* 12px for touch */
9535
+ width: calc(var(--sidebar-resize-handle-width) * 2);
9536
+ /* 12px for touch */
9232
9537
  }
9233
9538
  }
9234
9539
 
@@ -9297,7 +9602,8 @@ aside[role='navigation'].sidebar[data-dragging='true']
9297
9602
  .sidebar-content .dndev-interactive[data-role='menu-item'],.sidebar-content .dndev-interactive[data-role='nav-trigger'] {
9298
9603
  height: var(--touch-target);
9299
9604
  min-height: var(--touch-target);
9300
- padding-block: 0; /* No vertical padding - buttons fill exact 48px */
9605
+ padding-block: 0;
9606
+ /* No vertical padding - buttons fill exact 48px */
9301
9607
  }
9302
9608
 
9303
9609
  /* Other interactive elements (not menu items) - consistent padding */
@@ -9337,7 +9643,8 @@ aside.sidebar[role='navigation'] .sidebar-top,aside.sidebar[role='navigation'] .
9337
9643
  }
9338
9644
 
9339
9645
  aside.sidebar[role='navigation'] .sidebar-content {
9340
- overflow-x: hidden; /* Prevent horizontal scroll, allow vertical */
9646
+ overflow-x: hidden;
9647
+ /* Prevent horizontal scroll, allow vertical */
9341
9648
  }
9342
9649
 
9343
9650
  aside.sidebar[role='navigation'] .dndev-interactive {
@@ -9402,12 +9709,9 @@ aside.sidebar[role='navigation'][data-collapsed='true'] .app-branding {
9402
9709
  main[role='main'] {
9403
9710
  grid-area: main;
9404
9711
  overflow-y: auto;
9405
- /* Default: allow scrolling */
9406
9712
  overflow-x: hidden;
9407
- /* Prevent horizontal scroll from breakthrough components */
9408
9713
  display: flex;
9409
9714
  flex-direction: column;
9410
- /* No automatic padding; spacing handled by gaps */
9411
9715
  padding: 0;
9412
9716
  contain: layout style;
9413
9717
 
@@ -9416,19 +9720,18 @@ main[role='main'] {
9416
9720
 
9417
9721
  main[role='main'] > *:not(.breadcrumbs-container):first-of-type,main[role='main'] > .breadcrumbs-container + * {
9418
9722
  flex: 1 1 auto;
9419
- /* Page content grows */
9420
9723
  }
9421
9724
 
9422
- /* Desktop: Footer stays at bottom of viewport */
9725
+ /* Mobile: Grid scrolls, main doesn't */
9423
9726
 
9424
- @media (width > 1023px) {
9425
- main[role='main'] > *:last-child {
9426
- flex-shrink: 0;
9427
- /* Footer stays at bottom */
9428
- }
9429
- }
9727
+ @media (width <=1023px) {
9430
9728
 
9431
- /* Mobile: Footer scrolls with content (no flex-shrink needed) */
9729
+ main[role='main'] {
9730
+ overflow: visible;
9731
+ min-height: -moz-min-content;
9732
+ min-height: min-content;
9733
+ }
9734
+ }
9432
9735
 
9433
9736
  /* Footer: Full width by default, app presets start after sidebar */
9434
9737
 
@@ -9462,11 +9765,25 @@ footer[role='contentinfo'] > * {
9462
9765
  padding-inline-end: var(--content-padding);
9463
9766
  }
9464
9767
 
9768
+ /* Mobile: Allow footer to grow when content wraps */
9769
+
9770
+ @media (width <=1023px) {
9771
+
9772
+ footer[role='contentinfo'] {
9773
+ height: auto;
9774
+ }
9775
+
9776
+ footer[role='contentinfo'] > * {
9777
+ height: auto;
9778
+ min-height: var(--footer-height);
9779
+ }
9780
+ }
9781
+
9465
9782
  /* Footer text styles */
9466
9783
 
9467
9784
  footer[role='contentinfo'] .footer-copyright {
9468
9785
  color: var(--muted-foreground);
9469
- font-size: var(--font-size-sm);
9786
+ font-size: var(--font-size-xs);
9470
9787
  }
9471
9788
 
9472
9789
  footer[role='contentinfo'] a:not(.dndev-interactive) {
@@ -9536,7 +9853,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9536
9853
 
9537
9854
  /* Mobile (<1024px): Show merged-bar, hide zones */
9538
9855
 
9539
- @media (width <= 1023px) {
9856
+ @media (width <=1023px) {
9540
9857
  /* Presets with mergedBar: top (admin, moolti, game, docs) */
9541
9858
  [data-layout='admin'] .merged-bar[data-position='top'],
9542
9859
  [data-layout='moolti'] .merged-bar[data-position='top'],
@@ -9576,7 +9893,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9576
9893
 
9577
9894
  /* Desktop (>=1024px): Always hide merged-bar */
9578
9895
 
9579
- @media (width >= 1024px) {
9896
+ @media (width >=1024px) {
9580
9897
  .merged-bar {
9581
9898
  display: none !important;
9582
9899
  }
@@ -9600,7 +9917,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9600
9917
  /* Admin: Mobile/Tablet (<1024px) - only overrides */
9601
9918
  }
9602
9919
 
9603
- @media (width <= 1023px) {
9920
+ @media (width <=1023px) {
9604
9921
 
9605
9922
  [data-layout='admin'] {
9606
9923
  --sidebar-width: 0px;
@@ -9631,7 +9948,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9631
9948
 
9632
9949
  /* Moolti: Mobile/Tablet (<1024px) - only overrides */
9633
9950
 
9634
- @media (width <= 1023px) {
9951
+ @media (width <=1023px) {
9635
9952
 
9636
9953
  [data-layout='moolti'] {
9637
9954
  --header-height: 62px;
@@ -9658,7 +9975,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9658
9975
 
9659
9976
  /* Docs: Mobile/Tablet (<1024px) - only overrides */
9660
9977
 
9661
- @media (width <= 1023px) {
9978
+ @media (width <=1023px) {
9662
9979
 
9663
9980
  [data-layout='docs'] {
9664
9981
  --sidebar-width: 0px;
@@ -9684,7 +10001,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9684
10001
  /* Blog: Mobile/Tablet (<1024px) - only overrides */
9685
10002
  }
9686
10003
 
9687
- @media (width <= 1023px) {
10004
+ @media (width <=1023px) {
9688
10005
 
9689
10006
  [data-layout='blog'] {
9690
10007
  --header-height: 0px;
@@ -9734,7 +10051,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9734
10051
  /* Game: Mobile/Tablet (<1024px) - only overrides */
9735
10052
  }
9736
10053
 
9737
- @media (width <= 1023px) {
10054
+ @media (width <=1023px) {
9738
10055
 
9739
10056
  [data-layout='game'] {
9740
10057
  --footer-height: 0px;
@@ -9855,7 +10172,14 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9855
10172
  padding-top: var(--gap-lg);
9856
10173
  }
9857
10174
 
10175
+ /* First Section child gets gap-md spacing from top */
10176
+
10177
+ .dndev-container > .dndev-section-full-width:first-child {
10178
+ margin-top: var(--gap-md);
10179
+ }
10180
+
9858
10181
  .dndev-container {
10182
+
9859
10183
  min-height: 0;
9860
10184
  display: flex;
9861
10185
  flex-direction: column;
@@ -9890,7 +10214,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9890
10214
  --max-content-width: 100%;
9891
10215
  }
9892
10216
 
9893
- @media (width >= 1024px) {
10217
+ @media (width >=1024px) {
9894
10218
 
9895
10219
  .dndev-container[data-variant='standard'] {
9896
10220
  --max-content-width: 87.5rem;
@@ -9905,7 +10229,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9905
10229
  --max-content-width: 100%;
9906
10230
  }
9907
10231
 
9908
- @media (width >= 1024px) {
10232
+ @media (width >=1024px) {
9909
10233
 
9910
10234
  .dndev-container[data-variant='docs'] {
9911
10235
  --max-content-width: 56.25rem;