@donotdev/ui 0.0.10 → 0.0.12

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 (109) hide show
  1. package/dist/components/layout/GameContainer.d.ts +3 -1
  2. package/dist/components/layout/GameContainer.d.ts.map +1 -1
  3. package/dist/components/layout/GameContainer.js +3 -2
  4. package/dist/components/layout/PageContainer.d.ts +1 -1
  5. package/dist/components/layout/PageContainer.d.ts.map +1 -1
  6. package/dist/crud/components/EntityCardList.d.ts +16 -0
  7. package/dist/crud/components/EntityCardList.d.ts.map +1 -0
  8. package/dist/crud/components/EntityCardList.js +175 -0
  9. package/dist/crud/components/EntityDisplayRenderer.d.ts +13 -21
  10. package/dist/crud/components/EntityDisplayRenderer.d.ts.map +1 -1
  11. package/dist/crud/components/EntityDisplayRenderer.js +138 -23
  12. package/dist/crud/components/EntityFormRenderer.d.ts +18 -0
  13. package/dist/crud/components/EntityFormRenderer.d.ts.map +1 -0
  14. package/dist/crud/components/EntityFormRenderer.js +286 -0
  15. package/dist/crud/components/EntityList.d.ts +14 -0
  16. package/dist/crud/components/EntityList.d.ts.map +1 -0
  17. package/dist/crud/components/EntityList.js +203 -0
  18. package/dist/crud/components/index.d.ts +7 -5
  19. package/dist/crud/components/index.d.ts.map +1 -1
  20. package/dist/crud/components/index.js +6 -5
  21. package/dist/dndev.css +287 -123
  22. package/dist/index.js +4 -64
  23. package/dist/internal/layout/components/AutoMetaTags.d.ts.map +1 -1
  24. package/dist/internal/layout/components/AutoMetaTags.js +36 -6
  25. package/dist/internal/layout/components/NextJsAutoMetaTags.d.ts.map +1 -1
  26. package/dist/internal/layout/components/NextJsAutoMetaTags.js +38 -10
  27. package/dist/internal/layout/components/footer/FooterBranding.js +2 -2
  28. package/dist/internal/layout/config/presets/game.d.ts.map +1 -1
  29. package/dist/internal/layout/config/presets/game.js +10 -5
  30. package/dist/styles/index.css +287 -123
  31. package/package.json +13 -13
  32. package/dist/crud/components/DisplayFieldRenderer.d.ts +0 -26
  33. package/dist/crud/components/DisplayFieldRenderer.d.ts.map +0 -1
  34. package/dist/crud/components/DisplayFieldRenderer.js +0 -107
  35. package/dist/crud/components/fields/display/AvatarFieldDisplay.d.ts +0 -23
  36. package/dist/crud/components/fields/display/AvatarFieldDisplay.d.ts.map +0 -1
  37. package/dist/crud/components/fields/display/AvatarFieldDisplay.js +0 -38
  38. package/dist/crud/components/fields/display/BadgeFieldDisplay.d.ts +0 -21
  39. package/dist/crud/components/fields/display/BadgeFieldDisplay.d.ts.map +0 -1
  40. package/dist/crud/components/fields/display/BadgeFieldDisplay.js +0 -31
  41. package/dist/crud/components/fields/display/ButtonFieldDisplay.d.ts +0 -29
  42. package/dist/crud/components/fields/display/ButtonFieldDisplay.d.ts.map +0 -1
  43. package/dist/crud/components/fields/display/ButtonFieldDisplay.js +0 -12
  44. package/dist/crud/components/fields/display/CheckboxFieldDisplay.d.ts +0 -21
  45. package/dist/crud/components/fields/display/CheckboxFieldDisplay.d.ts.map +0 -1
  46. package/dist/crud/components/fields/display/CheckboxFieldDisplay.js +0 -27
  47. package/dist/crud/components/fields/display/DateFieldDisplay.d.ts +0 -24
  48. package/dist/crud/components/fields/display/DateFieldDisplay.d.ts.map +0 -1
  49. package/dist/crud/components/fields/display/DateFieldDisplay.js +0 -41
  50. package/dist/crud/components/fields/display/DropdownDisplay.d.ts +0 -21
  51. package/dist/crud/components/fields/display/DropdownDisplay.d.ts.map +0 -1
  52. package/dist/crud/components/fields/display/DropdownDisplay.js +0 -25
  53. package/dist/crud/components/fields/display/FileFieldDisplay.d.ts +0 -21
  54. package/dist/crud/components/fields/display/FileFieldDisplay.d.ts.map +0 -1
  55. package/dist/crud/components/fields/display/FileFieldDisplay.js +0 -25
  56. package/dist/crud/components/fields/display/GeoPointFieldDisplay.d.ts +0 -25
  57. package/dist/crud/components/fields/display/GeoPointFieldDisplay.d.ts.map +0 -1
  58. package/dist/crud/components/fields/display/GeoPointFieldDisplay.js +0 -25
  59. package/dist/crud/components/fields/display/HiddenFieldDisplay.d.ts +0 -30
  60. package/dist/crud/components/fields/display/HiddenFieldDisplay.d.ts.map +0 -1
  61. package/dist/crud/components/fields/display/HiddenFieldDisplay.js +0 -12
  62. package/dist/crud/components/fields/display/ImageFieldDisplay.d.ts +0 -24
  63. package/dist/crud/components/fields/display/ImageFieldDisplay.d.ts.map +0 -1
  64. package/dist/crud/components/fields/display/ImageFieldDisplay.js +0 -38
  65. package/dist/crud/components/fields/display/LinkFieldDisplay.d.ts +0 -22
  66. package/dist/crud/components/fields/display/LinkFieldDisplay.d.ts.map +0 -1
  67. package/dist/crud/components/fields/display/LinkFieldDisplay.js +0 -48
  68. package/dist/crud/components/fields/display/MapFieldDisplay.d.ts +0 -25
  69. package/dist/crud/components/fields/display/MapFieldDisplay.d.ts.map +0 -1
  70. package/dist/crud/components/fields/display/MapFieldDisplay.js +0 -25
  71. package/dist/crud/components/fields/display/MultiDropdownDisplay.d.ts +0 -22
  72. package/dist/crud/components/fields/display/MultiDropdownDisplay.d.ts.map +0 -1
  73. package/dist/crud/components/fields/display/MultiDropdownDisplay.js +0 -25
  74. package/dist/crud/components/fields/display/MultiInputTextFieldDisplay.d.ts +0 -22
  75. package/dist/crud/components/fields/display/MultiInputTextFieldDisplay.d.ts.map +0 -1
  76. package/dist/crud/components/fields/display/MultiInputTextFieldDisplay.js +0 -25
  77. package/dist/crud/components/fields/display/NumberFieldDisplay.d.ts +0 -24
  78. package/dist/crud/components/fields/display/NumberFieldDisplay.d.ts.map +0 -1
  79. package/dist/crud/components/fields/display/NumberFieldDisplay.js +0 -28
  80. package/dist/crud/components/fields/display/PasswordFieldDisplay.d.ts +0 -24
  81. package/dist/crud/components/fields/display/PasswordFieldDisplay.d.ts.map +0 -1
  82. package/dist/crud/components/fields/display/PasswordFieldDisplay.js +0 -31
  83. package/dist/crud/components/fields/display/PhoneNumberDisplay.d.ts +0 -22
  84. package/dist/crud/components/fields/display/PhoneNumberDisplay.d.ts.map +0 -1
  85. package/dist/crud/components/fields/display/PhoneNumberDisplay.js +0 -25
  86. package/dist/crud/components/fields/display/RadioFieldDisplay.d.ts +0 -22
  87. package/dist/crud/components/fields/display/RadioFieldDisplay.d.ts.map +0 -1
  88. package/dist/crud/components/fields/display/RadioFieldDisplay.js +0 -25
  89. package/dist/crud/components/fields/display/RangeFieldDisplay.d.ts +0 -22
  90. package/dist/crud/components/fields/display/RangeFieldDisplay.d.ts.map +0 -1
  91. package/dist/crud/components/fields/display/RangeFieldDisplay.js +0 -25
  92. package/dist/crud/components/fields/display/ReferenceFieldDisplay.d.ts +0 -22
  93. package/dist/crud/components/fields/display/ReferenceFieldDisplay.d.ts.map +0 -1
  94. package/dist/crud/components/fields/display/ReferenceFieldDisplay.js +0 -26
  95. package/dist/crud/components/fields/display/RichTextDisplay.d.ts +0 -25
  96. package/dist/crud/components/fields/display/RichTextDisplay.d.ts.map +0 -1
  97. package/dist/crud/components/fields/display/RichTextDisplay.js +0 -104
  98. package/dist/crud/components/fields/display/TextAreaDisplay.d.ts +0 -22
  99. package/dist/crud/components/fields/display/TextAreaDisplay.d.ts.map +0 -1
  100. package/dist/crud/components/fields/display/TextAreaDisplay.js +0 -25
  101. package/dist/crud/components/fields/display/TextFieldDisplay.d.ts +0 -42
  102. package/dist/crud/components/fields/display/TextFieldDisplay.d.ts.map +0 -1
  103. package/dist/crud/components/fields/display/TextFieldDisplay.js +0 -97
  104. package/dist/crud/components/fields/display/TimestampFieldDisplay.d.ts +0 -22
  105. package/dist/crud/components/fields/display/TimestampFieldDisplay.d.ts.map +0 -1
  106. package/dist/crud/components/fields/display/TimestampFieldDisplay.js +0 -33
  107. package/dist/crud/components/fields/display/index.d.ts +0 -32
  108. package/dist/crud/components/fields/display/index.d.ts.map +0 -1
  109. package/dist/crud/components/fields/display/index.js +0 -32
package/dist/dndev.css CHANGED
@@ -3144,9 +3144,10 @@ em {
3144
3144
 
3145
3145
  .dndev-cta-actions {
3146
3146
  display: flex;
3147
- flex-direction: column;
3147
+ flex-direction: row;
3148
3148
  gap: var(--gap-md);
3149
3149
  justify-content: center;
3150
+
3150
3151
  }
3151
3152
 
3152
3153
  .dndev-cta-actions .dndev-interactive {
@@ -3179,13 +3180,6 @@ em {
3179
3180
  border-color: var(--foreground);
3180
3181
  }
3181
3182
 
3182
- @media (width >= 768px) {
3183
-
3184
- .dndev-cta-actions {
3185
- flex-direction: row;
3186
- }
3187
- }
3188
-
3189
3183
  /* packages/components/src/atomic/Card/Card.css */
3190
3184
 
3191
3185
  /* Card layout - grid with gap */
@@ -3635,12 +3629,10 @@ em {
3635
3629
  /* Code-specific overrides: background color, text color, and layout */
3636
3630
  display: flex;
3637
3631
  flex-direction: column;
3638
- background: var(
3639
- --muted
3640
- ); /* Override surface gradient with code-specific dark background */
3641
- color: var(
3642
- --muted-foreground
3643
- ); /* Override surface text color for dark background */
3632
+ background: var(--muted);
3633
+ /* Override surface gradient with code-specific dark background */
3634
+ color: var(--muted-foreground);
3635
+ /* Override surface text color for dark background */
3644
3636
  overflow: hidden;
3645
3637
  font-family: var(--font-mono);
3646
3638
  font-size: var(--font-size-sm);
@@ -3714,8 +3706,6 @@ em {
3714
3706
  white-space: pre;
3715
3707
  overflow-x: auto;
3716
3708
  overflow-y: visible;
3717
- min-width: -moz-min-content;
3718
- min-width: min-content;
3719
3709
  }
3720
3710
 
3721
3711
  .dndev-code-pre[data-compact='true'] {
@@ -3732,16 +3722,19 @@ em {
3732
3722
  user-select: none;
3733
3723
  padding-inline-end: var(--gap-md);
3734
3724
  text-align: end;
3735
- font-size: inherit; /* Match parent code font-size */
3725
+ font-size: inherit;
3726
+ /* Match parent code font-size */
3736
3727
  opacity: var(--opacity-muted);
3737
3728
  width: 3rem;
3738
3729
  flex-shrink: 0;
3739
3730
  color: var(--muted-foreground);
3740
- line-height: 1.5; /* Consistent line height */
3731
+ line-height: 1.5;
3732
+ /* Consistent line height */
3741
3733
  }
3742
3734
 
3743
3735
  .dndev-code-line-number {
3744
- line-height: inherit; /* Inherit from parent */
3736
+ line-height: inherit;
3737
+ /* Inherit from parent */
3745
3738
  }
3746
3739
 
3747
3740
  .dndev-code-code {
@@ -3749,8 +3742,10 @@ em {
3749
3742
  min-width: 0;
3750
3743
  text-align: start;
3751
3744
  display: block;
3752
- line-height: 1.5; /* Match line numbers */
3753
- font-size: var(--font-size-sm); /* Explicit match with line numbers */
3745
+ line-height: 1.5;
3746
+ /* Match line numbers */
3747
+ font-size: var(--font-size-sm);
3748
+ /* Explicit match with line numbers */
3754
3749
  }
3755
3750
 
3756
3751
  /* Ensure shiki-generated code respects line-height AND font-size */
@@ -3758,7 +3753,8 @@ em {
3758
3753
  .dndev-code-code pre,
3759
3754
  .dndev-code-code code {
3760
3755
  line-height: inherit;
3761
- font-size: inherit; /* Match parent font-size */
3756
+ font-size: inherit;
3757
+ /* Match parent font-size */
3762
3758
  }
3763
3759
 
3764
3760
  /* packages/components/src/atomic/Command/Command.css */
@@ -4459,6 +4455,167 @@ em {
4459
4455
  padding-block: var(--gap-lg);
4460
4456
  }
4461
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
+
4462
4619
  /* packages/components/src/atomic/Input/Input.css */
4463
4620
 
4464
4621
  /* Hide number input spinners - cleaner UI for price/range inputs */
@@ -7360,6 +7517,24 @@ input[type='number'] {
7360
7517
  font-size: var(--font-size-sm);
7361
7518
  }
7362
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
+
7363
7538
  /* packages/components/src/atomic/Toaster/Toaster.css */
7364
7539
 
7365
7540
  .dndev-toast-viewport {
@@ -8898,9 +9073,14 @@ h4[data-variant='code'] {
8898
9073
  --sidebar-resize-handle-width: 6px;
8899
9074
 
8900
9075
  /* Content width - max constraint only, grid handles sidebar space */
8901
- /* PageContainer sets --max-content-width, main's 1fr handles available space */
9076
+ /* PageContainer sets --max-content-width per variant, components use --content-width */
9077
+ --max-content-width: 100%;
8902
9078
  --content-width: var(--max-content-width, 100%);
8903
9079
 
9080
+ /* Narrow content (mobile-first PWA, app-like single column) - single source of truth */
9081
+ --narrow-content-max: 37.5rem;
9082
+ /* 600px */
9083
+
8904
9084
  /* Content Area Calculations */
8905
9085
  /* Header content area (excludes sidebar on some presets) */
8906
9086
  --header-content-width: 100%;
@@ -9010,8 +9190,7 @@ main[role='main'][data-routing-animation='fade'] {
9010
9190
  /* Slide animation - keyframes handle opacity 0→1 */
9011
9191
 
9012
9192
  main[role='main'][data-routing-animation='slide'] {
9013
- animation: routeSlideIn var(--routing-default-duration, 300ms) ease-in
9014
- forwards;
9193
+ animation: routeSlideIn var(--routing-default-duration, 300ms) ease-in forwards;
9015
9194
  }
9016
9195
 
9017
9196
  /* No animation - already visible by default, explicit for clarity */
@@ -9025,15 +9204,11 @@ main[role='main'][data-routing-animation='none'] {
9025
9204
 
9026
9205
  @media (width < 768px) {
9027
9206
  main[role='main'][data-routing-animation='fade'] {
9028
- animation: routeFadeIn
9029
- var(--routing-mobile-duration, var(--routing-default-duration, 300ms))
9030
- ease-in forwards;
9207
+ animation: routeFadeIn var(--routing-mobile-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9031
9208
  }
9032
9209
 
9033
9210
  main[role='main'][data-routing-animation='slide'] {
9034
- animation: routeSlideIn
9035
- var(--routing-mobile-duration, var(--routing-default-duration, 300ms))
9036
- ease-in forwards;
9211
+ animation: routeSlideIn var(--routing-mobile-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9037
9212
  }
9038
9213
  }
9039
9214
 
@@ -9041,15 +9216,11 @@ main[role='main'][data-routing-animation='none'] {
9041
9216
 
9042
9217
  @media (width >=768px) and (width <=1023px) {
9043
9218
  main[role='main'][data-routing-animation='fade'] {
9044
- animation: routeFadeIn
9045
- var(--routing-tablet-duration, var(--routing-default-duration, 300ms))
9046
- ease-in forwards;
9219
+ animation: routeFadeIn var(--routing-tablet-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9047
9220
  }
9048
9221
 
9049
9222
  main[role='main'][data-routing-animation='slide'] {
9050
- animation: routeSlideIn
9051
- var(--routing-tablet-duration, var(--routing-default-duration, 300ms))
9052
- ease-in forwards;
9223
+ animation: routeSlideIn var(--routing-tablet-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9053
9224
  }
9054
9225
  }
9055
9226
 
@@ -9057,15 +9228,11 @@ main[role='main'][data-routing-animation='none'] {
9057
9228
 
9058
9229
  @media (width >=1024px) and (width <=1439px) {
9059
9230
  main[role='main'][data-routing-animation='fade'] {
9060
- animation: routeFadeIn
9061
- var(--routing-desktop-duration, var(--routing-default-duration, 300ms))
9062
- ease-in forwards;
9231
+ animation: routeFadeIn var(--routing-desktop-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9063
9232
  }
9064
9233
 
9065
9234
  main[role='main'][data-routing-animation='slide'] {
9066
- animation: routeSlideIn
9067
- var(--routing-desktop-duration, var(--routing-default-duration, 300ms))
9068
- ease-in forwards;
9235
+ animation: routeSlideIn var(--routing-desktop-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9069
9236
  }
9070
9237
  }
9071
9238
 
@@ -9073,15 +9240,11 @@ main[role='main'][data-routing-animation='none'] {
9073
9240
 
9074
9241
  @media (width >=1440px) {
9075
9242
  main[role='main'][data-routing-animation='fade'] {
9076
- animation: routeFadeIn
9077
- var(--routing-wide-duration, var(--routing-default-duration, 300ms))
9078
- ease-in forwards;
9243
+ animation: routeFadeIn var(--routing-wide-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9079
9244
  }
9080
9245
 
9081
9246
  main[role='main'][data-routing-animation='slide'] {
9082
- animation: routeSlideIn
9083
- var(--routing-wide-duration, var(--routing-default-duration, 300ms))
9084
- ease-in forwards;
9247
+ animation: routeSlideIn var(--routing-wide-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9085
9248
  }
9086
9249
  }
9087
9250
 
@@ -9105,6 +9268,7 @@ main[role='main'][data-routing-animation='none'] {
9105
9268
  /* Mobile/Tablet: Hide sidebars - WCAG & Lighthouse best practices */
9106
9269
 
9107
9270
  @media (width <=1023px) {
9271
+
9108
9272
  .dndev-layout aside[role='navigation'].sidebar,
9109
9273
  aside[role='navigation'].sidebar {
9110
9274
  display: none !important;
@@ -9128,57 +9292,59 @@ main[role='main'][data-routing-animation='none'] {
9128
9292
  'header header'
9129
9293
  'sidebar main'
9130
9294
  'footer footer';
9131
- grid-template-rows: var(--header-height) 1fr minmax(
9132
- var(--footer-height),
9133
- auto
9134
- );
9295
+ grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height),
9296
+ auto);
9135
9297
  grid-template-columns: var(--sidebar-width) 1fr;
9136
-
9137
- /* Mobile: Grid scrolls instead of main - footer scrolls with content */
9138
9298
  }
9139
9299
 
9140
- @media (width <=1023px) {
9141
-
9142
- .dndev-layout {
9143
- overflow-y: auto;
9144
- overflow-x: hidden;
9145
- /* Keep footer row - grid scrolls so footer scrolls with content */
9146
- grid-template-areas:
9147
- 'header header'
9148
- 'sidebar main'
9149
- 'footer footer';
9150
- grid-template-rows: var(--header-height) min-content auto;
9151
- }
9152
- }
9300
+ /* Footer scroll mode: grid scrolls, footer scrolls with content */
9153
9301
 
9154
- /* Footer scroll mode - grid scrolls, footer scrolls with content (opt-in for desktop) */
9302
+ /* Desktop: opt-in via data-footer-mode="scroll" */
9155
9303
 
9156
9304
  .dndev-layout[data-footer-mode='scroll'] {
9157
9305
  overflow-y: auto;
9158
9306
  overflow-x: hidden;
9159
- grid-template-rows: var(--header-height) min-content auto;
9307
+ grid-template-rows: var(--header-height) 1fr auto;
9160
9308
  }
9161
9309
 
9162
- .dndev-layout[data-footer-mode='scroll'] header[role='banner'] {
9163
- position: sticky;
9164
- top: 0;
9165
- }
9310
+ .dndev-layout[data-footer-mode='scroll'] header[role='banner'] { position: sticky; top: 0; }
9166
9311
 
9167
- .dndev-layout[data-footer-mode='scroll'] main[role='main'] {
9168
- overflow: visible;
9169
- min-height: -moz-min-content;
9170
- min-height: min-content;
9171
- }
9312
+ .dndev-layout[data-footer-mode='scroll'] aside.sidebar[role='navigation'] {
9313
+ position: sticky;
9314
+ top: var(--header-height);
9315
+ height: calc(100dvh - var(--header-height));
9316
+ align-self: start;
9317
+ }
9172
9318
 
9173
- .dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo'] {
9174
- height: auto;
9175
- }
9319
+ .dndev-layout[data-footer-mode='scroll'] main[role='main'] { overflow-y: visible; overflow-x: hidden; }
9176
9320
 
9177
- :is(.dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo']) > * {
9321
+ .dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo'] {
9322
+ grid-column: 2 / -1;
9178
9323
  height: auto;
9179
- min-height: var(--footer-height);
9180
9324
  }
9181
9325
 
9326
+ :is(.dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo']) > * { height: auto; min-height: var(--footer-height); }
9327
+
9328
+ /* Mobile: footer scroll mode ON by default (same rules) */
9329
+
9330
+ @media (width <=1023px) {
9331
+ .dndev-layout {
9332
+ overflow-y: auto;
9333
+ overflow-x: hidden;
9334
+ grid-template-rows: var(--header-height) 1fr auto;
9335
+ }
9336
+
9337
+ .dndev-layout header[role='banner'] { position: sticky; top: 0; }
9338
+
9339
+ .dndev-layout main[role='main'] { overflow-y: visible; overflow-x: hidden; }
9340
+
9341
+ .dndev-layout footer[role='contentinfo'] {
9342
+ height: auto;
9343
+ }
9344
+
9345
+ :is(.dndev-layout footer[role='contentinfo']) > * { height: auto; min-height: var(--footer-height); }
9346
+ }
9347
+
9182
9348
  /* Presets with no footer at all */
9183
9349
 
9184
9350
  [data-layout='moolti'] footer[role='contentinfo'],
@@ -9344,8 +9510,7 @@ aside[role='navigation'].sidebar .dndev-sidebar-resize-handle:focus-visible {
9344
9510
 
9345
9511
  /* Active drag state */
9346
9512
 
9347
- aside[role='navigation'].sidebar[data-dragging='true']
9348
- .dndev-sidebar-resize-handle {
9513
+ aside[role='navigation'].sidebar[data-dragging='true'] .dndev-sidebar-resize-handle {
9349
9514
  background: var(--primary);
9350
9515
  }
9351
9516
 
@@ -9361,10 +9526,7 @@ aside[role='navigation'].sidebar[data-dragging='true']
9361
9526
  /* Landing: AUTO display mode - compact below wide breakpoint (< 1440px) */
9362
9527
 
9363
9528
  @media (width < 1440px) {
9364
- [data-layout='landing']
9365
- header[role='banner']
9366
- [data-display='auto']
9367
- .dndev-interactive-label {
9529
+ [data-layout='landing'] header[role='banner'] [data-display='auto'] .dndev-interactive-label {
9368
9530
  display: none;
9369
9531
  }
9370
9532
  }
@@ -9537,23 +9699,13 @@ main[role='main'] {
9537
9699
  contain: layout style;
9538
9700
 
9539
9701
  /* First child after breadcrumbs grows to fill space */
9702
+
9540
9703
  }
9541
9704
 
9542
9705
  main[role='main'] > *:not(.breadcrumbs-container):first-of-type,main[role='main'] > .breadcrumbs-container + * {
9543
9706
  flex: 1 1 auto;
9544
9707
  }
9545
9708
 
9546
- /* Mobile: Grid scrolls, main doesn't */
9547
-
9548
- @media (width <=1023px) {
9549
-
9550
- main[role='main'] {
9551
- overflow: visible;
9552
- min-height: -moz-min-content;
9553
- min-height: min-content;
9554
- }
9555
- }
9556
-
9557
9709
  /* Footer: Full width by default, app presets start after sidebar */
9558
9710
 
9559
9711
  /* box-sizing: border-box ensures borders are included in height */
@@ -9675,6 +9827,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9675
9827
  /* Mobile (<1024px): Show merged-bar, hide zones */
9676
9828
 
9677
9829
  @media (width <=1023px) {
9830
+
9678
9831
  /* Presets with mergedBar: top (admin, moolti, game, docs) */
9679
9832
  [data-layout='admin'] .merged-bar[data-position='top'],
9680
9833
  [data-layout='moolti'] .merged-bar[data-position='top'],
@@ -10032,32 +10185,26 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10032
10185
  /* Standard width - responsive */
10033
10186
 
10034
10187
  .dndev-container[data-variant='standard'] {
10035
- --max-content-width: 100%;
10188
+ --max-content-width: min(87.5rem, 100%);
10189
+ max-width: var(--content-width);
10190
+ /* 1480px max, but never exceeds container width */
10036
10191
  }
10037
10192
 
10038
- @media (width >=1024px) {
10039
-
10040
- .dndev-container[data-variant='standard'] {
10041
- --max-content-width: 87.5rem;
10042
- /* 1480px */
10043
- /* Padding stays: part of centering space when max-width applies */
10044
- }
10045
- }
10046
-
10047
10193
  /* Docs width - responsive */
10048
10194
 
10049
10195
  .dndev-container[data-variant='docs'] {
10050
- --max-content-width: 100%;
10196
+ --max-content-width: min(56.25rem, 100%);
10197
+ max-width: var(--content-width);
10198
+ /* 900px max, but never exceeds container width */
10051
10199
  }
10052
10200
 
10053
- @media (width >=1024px) {
10201
+ /* Narrow width - mobile-first single column (PWA, app-like on every device) */
10054
10202
 
10055
- .dndev-container[data-variant='docs'] {
10056
- --max-content-width: 56.25rem;
10057
- /* 900px */
10058
- /* Padding stays: always prevents edge touching */
10203
+ .dndev-container[data-variant='narrow'] {
10204
+ --max-content-width: min(var(--narrow-content-max), 100%);
10205
+ max-width: var(--content-width);
10206
+ /* 600px max, but never exceeds container width */
10059
10207
  }
10060
- }
10061
10208
 
10062
10209
  /* Fixed frame - fills parent exactly, prevents parent scroll */
10063
10210
 
@@ -10103,10 +10250,10 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10103
10250
 
10104
10251
  /* Breakthrough pattern: only applies inside PageContainer */
10105
10252
 
10106
- .dndev-container > .dndev-section-full-width,
10107
- .dndev-container > .dndev-cta,
10108
- .dndev-container > .dndev-hero-section,
10109
- .dndev-container > .dndev-tech-bento {
10253
+ .dndev-container>.dndev-section-full-width,
10254
+ .dndev-container>.dndev-cta,
10255
+ .dndev-container>.dndev-hero-section,
10256
+ .dndev-container>.dndev-tech-bento {
10110
10257
  /* Break out of PageContainer padding and max-width constraint */
10111
10258
  /* Account for sidebar: --sidebar-width is 0px for presets without sidebar */
10112
10259
  width: calc(100dvw - var(--sidebar-width));
@@ -10186,12 +10333,29 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10186
10333
  justify-content: space-between;
10187
10334
  }
10188
10335
 
10189
- /* CTA Zone - Fixed at bottom */
10336
+ /* Narrow content wrapper - constrained by --narrow-content-max (mobile-first PWA) */
10337
+
10338
+ .dndev-game-container__content-narrow {
10339
+ width: 100%;
10340
+ max-width: var(--narrow-content-max);
10341
+ margin-inline: auto;
10342
+ min-height: 0;
10343
+ flex: 1 1 auto;
10344
+ display: flex;
10345
+ flex-direction: column;
10346
+ }
10347
+
10348
+ .dndev-game-container__content-narrow .dndev-game-container__scroll {
10349
+ width: 100%;
10350
+ }
10351
+
10352
+ /* CTA Zone - Fixed at bottom; safe area for notched devices */
10190
10353
 
10191
10354
  .dndev-game-container__cta {
10192
10355
  display: flex;
10193
10356
  flex-direction: column;
10194
10357
  padding-top: var(--gap-md);
10358
+ padding-bottom: env(safe-area-inset-bottom);
10195
10359
  border-top: 2px solid var(--border);
10196
10360
  }
10197
10361