@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
@@ -2209,6 +2209,20 @@ em {
2209
2209
  padding-inline-start: var(--gap-md);
2210
2210
  }
2211
2211
 
2212
+ /* Bare mode - no visual chrome, used inside FloatingLabel or custom wrappers */
2213
+
2214
+ [data-bare] {
2215
+ border: none !important;
2216
+ box-shadow: none !important;
2217
+ background: transparent !important;
2218
+ }
2219
+
2220
+ [data-bare]:hover,[data-bare]:focus,[data-bare]:focus-visible {
2221
+ border-color: transparent !important;
2222
+ box-shadow: none !important;
2223
+ outline: none !important;
2224
+ }
2225
+
2212
2226
  /* Password strength bar height override */
2213
2227
 
2214
2228
  .dndev-password-strength-bar {
@@ -3310,6 +3324,7 @@ em {
3310
3324
 
3311
3325
  .dndev-collapsible-content[data-state='open'] {
3312
3326
  animation: slideDown var(--dur-normal) var(--ease-in-out);
3327
+ overflow: visible; /* Allow dropdowns/overlays to escape when open */
3313
3328
  }
3314
3329
 
3315
3330
  .dndev-collapsible-content[data-state='closed'] {
@@ -4440,8 +4455,181 @@ em {
4440
4455
  padding-block: var(--gap-lg);
4441
4456
  }
4442
4457
 
4458
+ /* packages/components/src/advanced/ImageGallery/ImageGallery.css */
4459
+
4460
+ .image-gallery {
4461
+ display: flex;
4462
+ flex-direction: column;
4463
+ gap: var(--gap-md);
4464
+ outline: none;
4465
+ }
4466
+
4467
+ .image-gallery:focus-visible {
4468
+ outline: 2px solid var(--primary);
4469
+ outline-offset: 2px;
4470
+ border-radius: var(--radius-lg);
4471
+ }
4472
+
4473
+ /* Empty state */
4474
+
4475
+ .image-gallery--empty {
4476
+ display: flex;
4477
+ align-items: center;
4478
+ justify-content: center;
4479
+ background-color: var(--muted);
4480
+ border-radius: var(--radius-lg);
4481
+ }
4482
+
4483
+ .image-gallery__placeholder {
4484
+ color: var(--muted-foreground);
4485
+ font-size: var(--font-size-sm);
4486
+ }
4487
+
4488
+ /* Main image container */
4489
+
4490
+ .image-gallery__main {
4491
+ position: relative;
4492
+ width: 100%;
4493
+ overflow: hidden;
4494
+ border-radius: var(--radius-surface);
4495
+ background-color: var(--muted);
4496
+ }
4497
+
4498
+ .image-gallery__main-image {
4499
+ width: 100%;
4500
+ height: 100%;
4501
+ -o-object-fit: cover;
4502
+ object-fit: cover;
4503
+ display: block;
4504
+ position: relative;
4505
+ }
4506
+
4507
+ /* Navigation arrows */
4508
+
4509
+ .image-gallery__nav {
4510
+ position: absolute;
4511
+ top: 50%;
4512
+ transform: translateY(-50%);
4513
+ display: flex;
4514
+ align-items: center;
4515
+ justify-content: center;
4516
+ width: 44px;
4517
+ height: 44px;
4518
+ border: none;
4519
+ border-radius: var(--radius-full);
4520
+ background-color: var(--background);
4521
+ color: var(--foreground);
4522
+ cursor: pointer;
4523
+ opacity: 0;
4524
+ transition:
4525
+ opacity 0.2s ease,
4526
+ background-color 0.2s ease;
4527
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
4528
+ z-index: 2;
4529
+ }
4530
+
4531
+ .image-gallery__main:hover .image-gallery__nav,
4532
+ .image-gallery:focus-within .image-gallery__nav {
4533
+ opacity: 1;
4534
+ }
4535
+
4536
+ .image-gallery__nav:hover {
4537
+ background-color: var(--primary);
4538
+ color: var(--primary-foreground);
4539
+ }
4540
+
4541
+ .image-gallery__nav:focus-visible {
4542
+ opacity: 1;
4543
+ outline: 2px solid var(--primary);
4544
+ outline-offset: 2px;
4545
+ }
4546
+
4547
+ .image-gallery__nav--prev {
4548
+ inset-inline-start: var(--gap-md);
4549
+ }
4550
+
4551
+ .image-gallery__nav--next {
4552
+ inset-inline-end: var(--gap-md);
4553
+ }
4554
+
4555
+ /* Thumbnails */
4556
+
4557
+ .image-gallery__thumbnails {
4558
+ display: flex;
4559
+ flex-wrap: wrap;
4560
+ gap: var(--gap-sm);
4561
+ }
4562
+
4563
+ .image-gallery__thumbnail {
4564
+ flex: 0 0 auto;
4565
+ width: 80px;
4566
+ height: 60px;
4567
+ padding: 0;
4568
+ border: 2px solid transparent;
4569
+ border-radius: var(--radius-surface);
4570
+ overflow: hidden;
4571
+ cursor: pointer;
4572
+ background: none;
4573
+ transition:
4574
+ border-color 0.2s ease,
4575
+ transform 0.2s ease;
4576
+ }
4577
+
4578
+ .image-gallery__thumbnail:hover {
4579
+ border-color: var(--muted-foreground);
4580
+ }
4581
+
4582
+ .image-gallery__thumbnail:focus-visible {
4583
+ outline: 2px solid var(--primary);
4584
+ outline-offset: 2px;
4585
+ }
4586
+
4587
+ .image-gallery__thumbnail--selected {
4588
+ border-color: var(--primary);
4589
+ }
4590
+
4591
+ .image-gallery__thumbnail-image {
4592
+ width: 100%;
4593
+ height: 100%;
4594
+ -o-object-fit: cover;
4595
+ object-fit: cover;
4596
+ display: block;
4597
+ }
4598
+
4599
+ /* Responsive adjustments */
4600
+
4601
+ @media (max-width: 640px) {
4602
+ .image-gallery__thumbnail {
4603
+ width: 60px;
4604
+ height: 45px;
4605
+ }
4606
+
4607
+ .image-gallery__nav {
4608
+ width: 36px;
4609
+ height: 36px;
4610
+ opacity: 0.8;
4611
+ }
4612
+
4613
+ .image-gallery__nav svg {
4614
+ width: 20px;
4615
+ height: 20px;
4616
+ }
4617
+ }
4618
+
4443
4619
  /* packages/components/src/atomic/Input/Input.css */
4444
4620
 
4621
+ /* Hide number input spinners - cleaner UI for price/range inputs */
4622
+
4623
+ input[type='number']::-webkit-inner-spin-button,
4624
+ input[type='number']::-webkit-outer-spin-button {
4625
+ -webkit-appearance: none;
4626
+ margin: 0;
4627
+ }
4628
+
4629
+ input[type='number'] {
4630
+ -moz-appearance: textfield;
4631
+ }
4632
+
4445
4633
  /* Input with leading icon (search, etc.) */
4446
4634
 
4447
4635
  .dndev-input-with-leading-icon {
@@ -4651,6 +4839,9 @@ em {
4651
4839
  background-color: transparent;
4652
4840
  transition: all var(--dur-normal) var(--ease-in-out);
4653
4841
  text-align: start;
4842
+ /* Flex-aware: allow fieldset to shrink in flex containers */
4843
+ min-width: 0;
4844
+ width: 100%;
4654
4845
  }
4655
4846
 
4656
4847
  .dndev-floating-fieldset:hover {
@@ -4659,7 +4850,6 @@ em {
4659
4850
 
4660
4851
  .dndev-floating-fieldset:focus-within {
4661
4852
  border-color: var(--ring);
4662
- box-shadow: 0 0 0 2px var(--ring);
4663
4853
  }
4664
4854
 
4665
4855
  .dndev-floating-fieldset[data-disabled='true'] {
@@ -4676,6 +4866,11 @@ em {
4676
4866
  font-weight: 500;
4677
4867
  line-height: 1;
4678
4868
  color: var(--foreground);
4869
+ /* Ellipsis by default */
4870
+ max-width: 100%;
4871
+ overflow: hidden;
4872
+ text-overflow: ellipsis;
4873
+ white-space: nowrap;
4679
4874
  }
4680
4875
 
4681
4876
  .dndev-floating-legend label {
@@ -4689,30 +4884,23 @@ em {
4689
4884
  color: var(--muted-foreground);
4690
4885
  }
4691
4886
 
4692
- .dndev-floating-legend[data-truncate='true'] {
4693
- max-width: calc(100% - var(--gap-md) * 2);
4694
- overflow: hidden;
4695
- text-overflow: ellipsis;
4696
- white-space: nowrap;
4697
- }
4698
-
4699
- /* Remove border from inner input since fieldset has it */
4887
+ /* Disable truncation when explicitly set to false */
4700
4888
 
4701
- .dndev-floating-fieldset .dndev-input {
4702
- border: none;
4703
- border-radius: var(--radius-interactive);
4704
- box-shadow: none;
4889
+ .dndev-floating-legend[data-truncate='false'] {
4890
+ max-width: none;
4891
+ overflow: visible;
4892
+ text-overflow: clip;
4893
+ white-space: normal;
4705
4894
  }
4706
4895
 
4707
- .dndev-floating-fieldset .dndev-input:hover {
4708
- border-color: transparent;
4709
- }
4896
+ /* Input inside fieldset uses bare mode via data-bare attribute (set by Input component) */
4710
4897
 
4711
- .dndev-floating-fieldset .dndev-input:focus,
4712
- .dndev-floating-fieldset .dndev-input:focus-visible {
4713
- border-color: transparent;
4898
+ /* This rule is kept for non-Input children that might need border removal */
4899
+
4900
+ .dndev-floating-fieldset > .dndev-input:not([data-bare]) {
4901
+ border: none;
4714
4902
  box-shadow: none;
4715
- outline: none;
4903
+ background: transparent;
4716
4904
  }
4717
4905
 
4718
4906
  /* packages/components/src/atomic/List/List.css */
@@ -5063,11 +5251,33 @@ em {
5063
5251
  /* packages/components/src/atomic/Pagination/Pagination.css */
5064
5252
 
5065
5253
  .dndev-pagination {
5254
+ display: flex;
5255
+ flex-direction: row;
5256
+ align-items: center;
5257
+ justify-content: space-between;
5258
+ gap: var(--gap-md);
5259
+ width: 100%;
5260
+ }
5261
+
5262
+ .dndev-pagination-info {
5263
+ display: none;
5264
+ }
5265
+
5266
+ .dndev-pagination-size {
5267
+ display: flex;
5268
+ align-items: center;
5269
+ }
5270
+
5271
+ .dndev-pagination-size-label {
5272
+ display: none;
5273
+ }
5274
+
5275
+ .dndev-pagination-nav {
5066
5276
  display: flex;
5067
5277
  align-items: center;
5068
5278
  justify-content: center;
5069
5279
  gap: var(--gap-sm);
5070
- flex-wrap: wrap;
5280
+ width: 100%;
5071
5281
  }
5072
5282
 
5073
5283
  .dndev-pagination-list {
@@ -5079,57 +5289,36 @@ em {
5079
5289
  margin: 0;
5080
5290
  }
5081
5291
 
5082
- .dndev-pagination-item {
5083
- display: flex;
5084
- align-items: center;
5085
- justify-content: center;
5086
- }
5087
-
5088
5292
  .dndev-pagination-button {
5089
- min-width: var(--touch-target);
5293
+ width: var(--touch-target);
5090
5294
  height: var(--touch-target);
5091
- display: flex;
5295
+ padding: 0;
5296
+ flex-shrink: 0;
5297
+ display: inline-flex;
5092
5298
  align-items: center;
5093
5299
  justify-content: center;
5094
- gap: var(--gap-sm);
5095
- border-radius: var(--radius-interactive);
5096
- font-weight: 500;
5097
- transition: var(--transition-fast);
5098
- cursor: pointer;
5099
- border: var(--border-hairline) solid var(--line-2);
5100
- background: transparent;
5101
- color: var(--foreground);
5102
- padding: var(--gap-sm) var(--gap-md);
5103
5300
  }
5104
5301
 
5105
- .dndev-pagination-button:hover:not(:disabled) {
5106
- background: var(--accent);
5107
- color: var(--accent-foreground);
5108
- }
5302
+ /* Desktop: Show all elements in one row */
5109
5303
 
5110
- .dndev-pagination-button:focus-visible {
5111
- outline: 2px solid var(--ring);
5112
- outline-offset: 2px;
5304
+ @media (min-width: 768px) {
5305
+ .dndev-pagination-info,
5306
+ .dndev-pagination-size {
5307
+ display: flex;
5308
+ align-items: center;
5309
+ white-space: nowrap;
5113
5310
  }
5114
5311
 
5115
- .dndev-pagination-button:disabled {
5116
- opacity: var(--opacity-muted);
5117
- cursor: not-allowed;
5312
+ .dndev-pagination-size-label {
5313
+ margin-right: var(--gap-sm);
5118
5314
  }
5119
5315
 
5120
- .dndev-pagination-button[aria-current='page'] {
5121
- background: var(--primary);
5122
- color: var(--primary-foreground);
5123
- border-color: var(--primary);
5316
+ .dndev-pagination-nav {
5317
+ justify-content: flex-end;
5318
+ width: auto;
5319
+ margin-left: auto;
5320
+ /* Push to right */
5124
5321
  }
5125
-
5126
- .dndev-pagination-ellipsis {
5127
- display: flex;
5128
- align-items: center;
5129
- justify-content: center;
5130
- width: var(--touch-target);
5131
- height: var(--touch-target);
5132
- color: var(--muted-foreground);
5133
5322
  }
5134
5323
 
5135
5324
  /* packages/components/src/atomic/Popover/Popover.css */
@@ -5860,8 +6049,12 @@ em {
5860
6049
 
5861
6050
  /* Adjust header padding when drag handle is present (sibling selector) */
5862
6051
 
5863
- .dndev-sheet-content[data-side='bottom'] .dndev-sheet-drag-handle ~ .dndev-sheet-header,
5864
- .dndev-sheet-content[data-side='top'] .dndev-sheet-drag-handle ~ .dndev-sheet-header {
6052
+ .dndev-sheet-content[data-side='bottom']
6053
+ .dndev-sheet-drag-handle
6054
+ ~ .dndev-sheet-header,
6055
+ .dndev-sheet-content[data-side='top']
6056
+ .dndev-sheet-drag-handle
6057
+ ~ .dndev-sheet-header {
5865
6058
  padding-top: 0;
5866
6059
  }
5867
6060
 
@@ -5919,12 +6112,9 @@ em {
5919
6112
  position: relative;
5920
6113
  margin-inline-start: auto;
5921
6114
  /* Push to end (RTL-aware: end = right in LTR, left in RTL) */
6115
+ margin-inline-end: var(--gap-sm);
6116
+ /* Spacing from edge - use margin not padding to keep icon centered */
5922
6117
  opacity: var(--opacity-muted);
5923
- /* No padding - tight spacing */
5924
- padding: 0;
5925
- /* RTL-aware: padding on logical end only */
5926
- padding-inline-end: var(--gap-md);
5927
- padding-inline-start: 0;
5928
6118
  }
5929
6119
 
5930
6120
  .dndev-sheet-close:hover {
@@ -6709,7 +6899,21 @@ em {
6709
6899
  }
6710
6900
 
6711
6901
  .dndev-table-header {
6712
- /* Base header styles */
6902
+ background-color: var(--accent);
6903
+ }
6904
+
6905
+ /* Filter row above header */
6906
+
6907
+ .dndev-table-filter-row {
6908
+ border: 1px solid var(--border);
6909
+ border-bottom: none;
6910
+ }
6911
+
6912
+ .dndev-table-filter-row .dndev-table-head {
6913
+ background-color: var(--muted);
6914
+ padding: var(--gap-xs);
6915
+ height: auto;
6916
+ min-height: auto;
6713
6917
  }
6714
6918
 
6715
6919
  .dndev-table-body {
@@ -6771,22 +6975,34 @@ em {
6771
6975
  padding-block: var(--gap-sm);
6772
6976
  }
6773
6977
 
6774
- .dndev-table-head[data-sortable='true'] {
6978
+ /* Header cells use accent foreground for contrast */
6979
+
6980
+ .dndev-table-header .dndev-table-head {
6981
+ color: var(--accent-foreground);
6982
+ }
6983
+
6984
+ [data-sortable='true']:is(.dndev-table-header .dndev-table-head) {
6775
6985
  cursor: pointer;
6776
6986
  }
6777
6987
 
6778
- .dndev-table-head[data-align='center'] {
6988
+ [data-align='center']:is(.dndev-table-header .dndev-table-head) {
6779
6989
  text-align: center;
6780
6990
  }
6781
6991
 
6782
- .dndev-table-head[data-align='end'] {
6992
+ [data-align='end']:is(.dndev-table-header .dndev-table-head) {
6783
6993
  text-align: end;
6784
6994
  }
6785
6995
 
6786
- .dndev-table-head[data-align='start'] {
6996
+ [data-align='start']:is(.dndev-table-header .dndev-table-head) {
6787
6997
  text-align: start;
6788
6998
  }
6789
6999
 
7000
+ /* Active filter indicator */
7001
+
7002
+ .dndev-table-filter-active {
7003
+ color: var(--primary);
7004
+ }
7005
+
6790
7006
  /* Table cell (td) styles */
6791
7007
 
6792
7008
  .dndev-table-cell {
@@ -6794,6 +7010,7 @@ em {
6794
7010
  padding-inline: var(--gap-md);
6795
7011
  padding-block: var(--gap-sm);
6796
7012
  min-height: var(--touch-target);
7013
+ line-height: 1.5; /* Ensure consistent line height for empty cells */
6797
7014
  }
6798
7015
 
6799
7016
  .dndev-table-cell[data-align='center'] {
@@ -6872,6 +7089,64 @@ em {
6872
7089
  padding-inline-start: calc(var(--gap-md) + var(--icon-md) + var(--gap-sm));
6873
7090
  }
6874
7091
 
7092
+ /* Skeleton rows - apply standard skeleton pulse animation to entire rows */
7093
+
7094
+ /* Keep existing background colors (zebra striping) - just add opacity pulse */
7095
+
7096
+ .dndev-table-body .dndev-table-row.dndev-skeleton-row {
7097
+ animation: dndev-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
7098
+ pointer-events: none;
7099
+
7100
+ /* Keep hover state but disabled (pointer-events: none prevents hover) */
7101
+ }
7102
+
7103
+ :is(.dndev-table-body .dndev-table-row.dndev-skeleton-row):hover {
7104
+ /* Inherit from parent .dndev-table-row hover styles */
7105
+ }
7106
+
7107
+ /* Even rows keep their var(--muted) background, just pulse */
7108
+
7109
+ .dndev-table-body .dndev-table-row.dndev-skeleton-row:nth-child(even) {
7110
+ animation: dndev-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
7111
+ }
7112
+
7113
+ :is(.dndev-table-body .dndev-table-row.dndev-skeleton-row:nth-child(even)):hover {
7114
+ /* Inherit from parent .dndev-table-row:nth-child(even) hover styles */
7115
+ }
7116
+
7117
+ /* Skeleton bars inside cells - adapt to row background for visibility */
7118
+
7119
+ /* Odd rows (transparent background): use default var(--muted) skeleton */
7120
+
7121
+ /* Even rows (var(--muted) background): use lighter skeleton for contrast */
7122
+
7123
+ .dndev-table-body .dndev-table-row.dndev-skeleton-row .dndev-skeleton {
7124
+ background-color: var(--muted);
7125
+ }
7126
+
7127
+ .dndev-table-body
7128
+ .dndev-table-row.dndev-skeleton-row:nth-child(even)
7129
+ .dndev-skeleton {
7130
+ /* Even rows have var(--muted) background, so skeleton should be lighter for contrast */
7131
+ background-color: color-mix(
7132
+ in oklab,
7133
+ var(--muted) 60%,
7134
+ var(--foreground) 40%
7135
+ );
7136
+ }
7137
+
7138
+ /* Use the same pulse animation as standard skeleton (from Skeleton.css) */
7139
+
7140
+ @keyframes dndev-pulse {
7141
+ 0%,
7142
+ 100% {
7143
+ opacity: 1;
7144
+ }
7145
+ 50% {
7146
+ opacity: var(--opacity-muted);
7147
+ }
7148
+ }
7149
+
6875
7150
  /* packages/components/src/atomic/Tabs/Tabs.css */
6876
7151
 
6877
7152
  /* Tabs list: use flexbox for natural wrapping, not grid */
@@ -7242,6 +7517,24 @@ em {
7242
7517
  font-size: var(--font-size-sm);
7243
7518
  }
7244
7519
 
7520
+ /* Font weight overrides (after level rules, so weight prop overrides level defaults) */
7521
+
7522
+ .dndev-text-base[data-font-weight='normal'] {
7523
+ font-weight: var(--font-weight-normal);
7524
+ }
7525
+
7526
+ .dndev-text-base[data-font-weight='medium'] {
7527
+ font-weight: var(--font-weight-medium);
7528
+ }
7529
+
7530
+ .dndev-text-base[data-font-weight='semibold'] {
7531
+ font-weight: var(--font-weight-semibold);
7532
+ }
7533
+
7534
+ .dndev-text-base[data-font-weight='bold'] {
7535
+ font-weight: var(--font-weight-bold);
7536
+ }
7537
+
7245
7538
  /* packages/components/src/atomic/Toaster/Toaster.css */
7246
7539
 
7247
7540
  .dndev-toast-viewport {
@@ -8811,6 +9104,7 @@ h4[data-variant='code'] {
8811
9104
  from {
8812
9105
  opacity: 1;
8813
9106
  }
9107
+
8814
9108
  to {
8815
9109
  opacity: 0;
8816
9110
  }
@@ -8820,6 +9114,7 @@ h4[data-variant='code'] {
8820
9114
  from {
8821
9115
  opacity: 0;
8822
9116
  }
9117
+
8823
9118
  to {
8824
9119
  opacity: 1;
8825
9120
  }
@@ -8832,6 +9127,7 @@ h4[data-variant='code'] {
8832
9127
  opacity: 1;
8833
9128
  transform: translateX(0);
8834
9129
  }
9130
+
8835
9131
  to {
8836
9132
  opacity: 0;
8837
9133
  transform: translateX(-100%);
@@ -8843,6 +9139,7 @@ h4[data-variant='code'] {
8843
9139
  opacity: 0;
8844
9140
  transform: translateX(100%);
8845
9141
  }
9142
+
8846
9143
  to {
8847
9144
  opacity: 1;
8848
9145
  transform: translateX(0);
@@ -8917,7 +9214,7 @@ main[role='main'][data-routing-animation='none'] {
8917
9214
 
8918
9215
  /* Tablet (768px - 1023px) */
8919
9216
 
8920
- @media (width >= 768px) and (width <= 1023px) {
9217
+ @media (width >=768px) and (width <=1023px) {
8921
9218
  main[role='main'][data-routing-animation='fade'] {
8922
9219
  animation: routeFadeIn
8923
9220
  var(--routing-tablet-duration, var(--routing-default-duration, 300ms))
@@ -8933,7 +9230,7 @@ main[role='main'][data-routing-animation='none'] {
8933
9230
 
8934
9231
  /* Desktop (1024px - 1439px) */
8935
9232
 
8936
- @media (width >= 1024px) and (width <= 1439px) {
9233
+ @media (width >=1024px) and (width <=1439px) {
8937
9234
  main[role='main'][data-routing-animation='fade'] {
8938
9235
  animation: routeFadeIn
8939
9236
  var(--routing-desktop-duration, var(--routing-default-duration, 300ms))
@@ -8949,7 +9246,7 @@ main[role='main'][data-routing-animation='none'] {
8949
9246
 
8950
9247
  /* Wide (>= 1440px) */
8951
9248
 
8952
- @media (width >= 1440px) {
9249
+ @media (width >=1440px) {
8953
9250
  main[role='main'][data-routing-animation='fade'] {
8954
9251
  animation: routeFadeIn
8955
9252
  var(--routing-wide-duration, var(--routing-default-duration, 300ms))
@@ -8982,7 +9279,7 @@ main[role='main'][data-routing-animation='none'] {
8982
9279
 
8983
9280
  /* Mobile/Tablet: Hide sidebars - WCAG & Lighthouse best practices */
8984
9281
 
8985
- @media (width <= 1023px) {
9282
+ @media (width <=1023px) {
8986
9283
  .dndev-layout aside[role='navigation'].sidebar,
8987
9284
  aside[role='navigation'].sidebar {
8988
9285
  display: none !important;
@@ -9012,59 +9309,55 @@ main[role='main'][data-routing-animation='none'] {
9012
9309
  );
9013
9310
  grid-template-columns: var(--sidebar-width) 1fr;
9014
9311
 
9015
- /* Mobile: No footer grid row - footer is inside main */
9016
- /* When mergedBar is shown, header is hidden but grid still needs space for mergedBar */
9312
+ /* Mobile: Grid scrolls instead of main - footer scrolls with content */
9017
9313
  }
9018
9314
 
9019
- @media (width <= 1023px) {
9315
+ @media (width <=1023px) {
9020
9316
 
9021
9317
  .dndev-layout {
9318
+ overflow-y: auto;
9319
+ overflow-x: hidden;
9320
+ /* Keep footer row - grid scrolls so footer scrolls with content */
9022
9321
  grid-template-areas:
9023
9322
  'header header'
9024
- 'sidebar main';
9025
- grid-template-rows: var(--header-height) 1fr;
9026
-
9027
- /* Presets with mergedBar: header is hidden, but grid still allocates space for mergedBar */
9028
- /* No extra padding needed - grid spacing is sufficient */
9323
+ 'sidebar main'
9324
+ 'footer footer';
9325
+ grid-template-rows: var(--header-height) min-content auto;
9029
9326
  }
9030
- .dndev-layout[data-layout='admin'],.dndev-layout[data-layout='moolti'],.dndev-layout[data-layout='game'],.dndev-layout[data-layout='docs'] {
9031
- /* Grid already accounts for header-height, mergedBar is fixed and doesn't need extra padding */
9032
- }
9033
9327
  }
9034
9328
 
9035
- /* Footer containers: show/hide based on breakpoint */
9329
+ /* Footer scroll mode - grid scrolls, footer scrolls with content (opt-in for desktop) */
9036
9330
 
9037
- .footer-mobile {
9038
- display: none;
9039
- /* No margin-top: auto - footer scrolls with content on mobile */
9040
- /* No flex-shrink: 0 - footer is in normal flow, not stuck at bottom */
9331
+ .dndev-layout[data-footer-mode='scroll'] {
9332
+ overflow-y: auto;
9333
+ overflow-x: hidden;
9334
+ grid-template-rows: var(--header-height) min-content auto;
9041
9335
  }
9042
9336
 
9043
- .footer-desktop {
9044
- display: contents; /* Children (footer element) participate in grid */
9337
+ .dndev-layout[data-footer-mode='scroll'] header[role='banner'] {
9338
+ position: sticky;
9339
+ top: 0;
9045
9340
  }
9046
9341
 
9047
- @media (width <= 1023px) {
9048
- .footer-mobile {
9049
- display: block;
9050
- }
9342
+ .dndev-layout[data-footer-mode='scroll'] main[role='main'] {
9343
+ overflow: visible;
9344
+ min-height: -moz-min-content;
9345
+ min-height: min-content;
9346
+ }
9051
9347
 
9052
- .footer-desktop {
9053
- display: none;
9054
- }
9348
+ .dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo'] {
9349
+ height: auto;
9350
+ }
9055
9351
 
9056
- /* Game: No mobile footer - navigation in MergedBar */
9057
- [data-layout='game'] .footer-mobile {
9058
- display: none;
9352
+ :is(.dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo']) > * {
9353
+ height: auto;
9354
+ min-height: var(--footer-height);
9059
9355
  }
9060
- }
9061
9356
 
9062
9357
  /* Presets with no footer at all */
9063
9358
 
9064
- [data-layout='moolti'] .footer-mobile,
9065
- [data-layout='moolti'] .footer-desktop,
9066
- [data-layout='plain'] .footer-mobile,
9067
- [data-layout='plain'] .footer-desktop {
9359
+ [data-layout='moolti'] footer[role='contentinfo'],
9360
+ [data-layout='plain'] footer[role='contentinfo'] {
9068
9361
  display: none;
9069
9362
  }
9070
9363
 
@@ -9102,8 +9395,18 @@ header[role='banner'] {
9102
9395
  /* Theme-aware styling - 100% controlled by theme system */
9103
9396
  background: var(--background);
9104
9397
  border-bottom: var(--border-hairline) solid var(--border);
9398
+
9399
+ /* Mobile: Sticky header (for presets that keep header visible) */
9105
9400
  }
9106
9401
 
9402
+ @media (width <=1023px) {
9403
+
9404
+ header[role='banner'] {
9405
+ position: sticky;
9406
+ top: 0;
9407
+ }
9408
+ }
9409
+
9107
9410
  .header-start {
9108
9411
  display: flex;
9109
9412
  align-items: center;
@@ -9157,19 +9460,20 @@ header[role='banner'] .header-center {
9157
9460
  aside[role='navigation'].sidebar {
9158
9461
  grid-area: sidebar;
9159
9462
  box-sizing: border-box;
9160
- min-width: calc(
9161
- var(--sidebar-resize-handle-width) + 48px
9162
- ); /* Min: 48px content + 6px handle = 54px */
9163
- max-width: calc(
9164
- var(--sidebar-resize-handle-width) + 400px
9165
- ); /* Max: 400px content + 6px handle = 406px */
9463
+ min-width: calc(var(--sidebar-resize-handle-width) + 48px);
9464
+ /* Min: 48px content + 6px handle = 54px */
9465
+ max-width: calc(var(--sidebar-resize-handle-width) + 400px);
9466
+ /* Max: 400px content + 6px handle = 406px */
9166
9467
  z-index: var(--z-sidebar);
9167
- overflow: none; /* No clipping needed - handle is in grid */
9468
+ overflow: none;
9469
+ /* No clipping needed - handle is in grid */
9168
9470
  contain: layout style;
9169
9471
  padding: 0;
9170
9472
  display: grid;
9171
- grid-template-columns: auto var(--sidebar-resize-handle-width); /* Content | Handle - column 1 width set inline */
9172
- grid-template-rows: auto 1fr auto; /* Top | Content | Bottom */
9473
+ grid-template-columns: auto var(--sidebar-resize-handle-width);
9474
+ /* Content | Handle - column 1 width set inline */
9475
+ grid-template-rows: auto 1fr auto;
9476
+ /* Top | Content | Bottom */
9173
9477
  height: 100%;
9174
9478
 
9175
9479
  /* Theme-aware styling - 100% controlled by theme system */
@@ -9224,7 +9528,8 @@ aside[role='navigation'].sidebar[data-dragging='true']
9224
9528
 
9225
9529
  @media (hover: none) {
9226
9530
  aside[role='navigation'].sidebar .dndev-sidebar-resize-handle {
9227
- width: calc(var(--sidebar-resize-handle-width) * 2); /* 12px for touch */
9531
+ width: calc(var(--sidebar-resize-handle-width) * 2);
9532
+ /* 12px for touch */
9228
9533
  }
9229
9534
  }
9230
9535
 
@@ -9293,7 +9598,8 @@ aside[role='navigation'].sidebar[data-dragging='true']
9293
9598
  .sidebar-content .dndev-interactive[data-role='menu-item'],.sidebar-content .dndev-interactive[data-role='nav-trigger'] {
9294
9599
  height: var(--touch-target);
9295
9600
  min-height: var(--touch-target);
9296
- padding-block: 0; /* No vertical padding - buttons fill exact 48px */
9601
+ padding-block: 0;
9602
+ /* No vertical padding - buttons fill exact 48px */
9297
9603
  }
9298
9604
 
9299
9605
  /* Other interactive elements (not menu items) - consistent padding */
@@ -9333,7 +9639,8 @@ aside.sidebar[role='navigation'] .sidebar-top,aside.sidebar[role='navigation'] .
9333
9639
  }
9334
9640
 
9335
9641
  aside.sidebar[role='navigation'] .sidebar-content {
9336
- overflow-x: hidden; /* Prevent horizontal scroll, allow vertical */
9642
+ overflow-x: hidden;
9643
+ /* Prevent horizontal scroll, allow vertical */
9337
9644
  }
9338
9645
 
9339
9646
  aside.sidebar[role='navigation'] .dndev-interactive {
@@ -9398,12 +9705,9 @@ aside.sidebar[role='navigation'][data-collapsed='true'] .app-branding {
9398
9705
  main[role='main'] {
9399
9706
  grid-area: main;
9400
9707
  overflow-y: auto;
9401
- /* Default: allow scrolling */
9402
9708
  overflow-x: hidden;
9403
- /* Prevent horizontal scroll from breakthrough components */
9404
9709
  display: flex;
9405
9710
  flex-direction: column;
9406
- /* No automatic padding; spacing handled by gaps */
9407
9711
  padding: 0;
9408
9712
  contain: layout style;
9409
9713
 
@@ -9412,19 +9716,18 @@ main[role='main'] {
9412
9716
 
9413
9717
  main[role='main'] > *:not(.breadcrumbs-container):first-of-type,main[role='main'] > .breadcrumbs-container + * {
9414
9718
  flex: 1 1 auto;
9415
- /* Page content grows */
9416
9719
  }
9417
9720
 
9418
- /* Desktop: Footer stays at bottom of viewport */
9721
+ /* Mobile: Grid scrolls, main doesn't */
9419
9722
 
9420
- @media (width > 1023px) {
9421
- main[role='main'] > *:last-child {
9422
- flex-shrink: 0;
9423
- /* Footer stays at bottom */
9424
- }
9425
- }
9723
+ @media (width <=1023px) {
9426
9724
 
9427
- /* Mobile: Footer scrolls with content (no flex-shrink needed) */
9725
+ main[role='main'] {
9726
+ overflow: visible;
9727
+ min-height: -moz-min-content;
9728
+ min-height: min-content;
9729
+ }
9730
+ }
9428
9731
 
9429
9732
  /* Footer: Full width by default, app presets start after sidebar */
9430
9733
 
@@ -9458,11 +9761,25 @@ footer[role='contentinfo'] > * {
9458
9761
  padding-inline-end: var(--content-padding);
9459
9762
  }
9460
9763
 
9764
+ /* Mobile: Allow footer to grow when content wraps */
9765
+
9766
+ @media (width <=1023px) {
9767
+
9768
+ footer[role='contentinfo'] {
9769
+ height: auto;
9770
+ }
9771
+
9772
+ footer[role='contentinfo'] > * {
9773
+ height: auto;
9774
+ min-height: var(--footer-height);
9775
+ }
9776
+ }
9777
+
9461
9778
  /* Footer text styles */
9462
9779
 
9463
9780
  footer[role='contentinfo'] .footer-copyright {
9464
9781
  color: var(--muted-foreground);
9465
- font-size: var(--font-size-sm);
9782
+ font-size: var(--font-size-xs);
9466
9783
  }
9467
9784
 
9468
9785
  footer[role='contentinfo'] a:not(.dndev-interactive) {
@@ -9532,7 +9849,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9532
9849
 
9533
9850
  /* Mobile (<1024px): Show merged-bar, hide zones */
9534
9851
 
9535
- @media (width <= 1023px) {
9852
+ @media (width <=1023px) {
9536
9853
  /* Presets with mergedBar: top (admin, moolti, game, docs) */
9537
9854
  [data-layout='admin'] .merged-bar[data-position='top'],
9538
9855
  [data-layout='moolti'] .merged-bar[data-position='top'],
@@ -9572,7 +9889,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9572
9889
 
9573
9890
  /* Desktop (>=1024px): Always hide merged-bar */
9574
9891
 
9575
- @media (width >= 1024px) {
9892
+ @media (width >=1024px) {
9576
9893
  .merged-bar {
9577
9894
  display: none !important;
9578
9895
  }
@@ -9596,7 +9913,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9596
9913
  /* Admin: Mobile/Tablet (<1024px) - only overrides */
9597
9914
  }
9598
9915
 
9599
- @media (width <= 1023px) {
9916
+ @media (width <=1023px) {
9600
9917
 
9601
9918
  [data-layout='admin'] {
9602
9919
  --sidebar-width: 0px;
@@ -9627,7 +9944,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9627
9944
 
9628
9945
  /* Moolti: Mobile/Tablet (<1024px) - only overrides */
9629
9946
 
9630
- @media (width <= 1023px) {
9947
+ @media (width <=1023px) {
9631
9948
 
9632
9949
  [data-layout='moolti'] {
9633
9950
  --header-height: 62px;
@@ -9654,7 +9971,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9654
9971
 
9655
9972
  /* Docs: Mobile/Tablet (<1024px) - only overrides */
9656
9973
 
9657
- @media (width <= 1023px) {
9974
+ @media (width <=1023px) {
9658
9975
 
9659
9976
  [data-layout='docs'] {
9660
9977
  --sidebar-width: 0px;
@@ -9680,7 +9997,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9680
9997
  /* Blog: Mobile/Tablet (<1024px) - only overrides */
9681
9998
  }
9682
9999
 
9683
- @media (width <= 1023px) {
10000
+ @media (width <=1023px) {
9684
10001
 
9685
10002
  [data-layout='blog'] {
9686
10003
  --header-height: 0px;
@@ -9730,7 +10047,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9730
10047
  /* Game: Mobile/Tablet (<1024px) - only overrides */
9731
10048
  }
9732
10049
 
9733
- @media (width <= 1023px) {
10050
+ @media (width <=1023px) {
9734
10051
 
9735
10052
  [data-layout='game'] {
9736
10053
  --footer-height: 0px;
@@ -9851,7 +10168,14 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9851
10168
  padding-top: var(--gap-lg);
9852
10169
  }
9853
10170
 
10171
+ /* First Section child gets gap-md spacing from top */
10172
+
10173
+ .dndev-container > .dndev-section-full-width:first-child {
10174
+ margin-top: var(--gap-md);
10175
+ }
10176
+
9854
10177
  .dndev-container {
10178
+
9855
10179
  min-height: 0;
9856
10180
  display: flex;
9857
10181
  flex-direction: column;
@@ -9886,7 +10210,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9886
10210
  --max-content-width: 100%;
9887
10211
  }
9888
10212
 
9889
- @media (width >= 1024px) {
10213
+ @media (width >=1024px) {
9890
10214
 
9891
10215
  .dndev-container[data-variant='standard'] {
9892
10216
  --max-content-width: 87.5rem;
@@ -9901,7 +10225,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9901
10225
  --max-content-width: 100%;
9902
10226
  }
9903
10227
 
9904
- @media (width >= 1024px) {
10228
+ @media (width >=1024px) {
9905
10229
 
9906
10230
  .dndev-container[data-variant='docs'] {
9907
10231
  --max-content-width: 56.25rem;