@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
@@ -3140,9 +3140,10 @@ em {
3140
3140
 
3141
3141
  .dndev-cta-actions {
3142
3142
  display: flex;
3143
- flex-direction: column;
3143
+ flex-direction: row;
3144
3144
  gap: var(--gap-md);
3145
3145
  justify-content: center;
3146
+
3146
3147
  }
3147
3148
 
3148
3149
  .dndev-cta-actions .dndev-interactive {
@@ -3175,13 +3176,6 @@ em {
3175
3176
  border-color: var(--foreground);
3176
3177
  }
3177
3178
 
3178
- @media (width >= 768px) {
3179
-
3180
- .dndev-cta-actions {
3181
- flex-direction: row;
3182
- }
3183
- }
3184
-
3185
3179
  /* packages/components/src/atomic/Card/Card.css */
3186
3180
 
3187
3181
  /* Card layout - grid with gap */
@@ -3631,12 +3625,10 @@ em {
3631
3625
  /* Code-specific overrides: background color, text color, and layout */
3632
3626
  display: flex;
3633
3627
  flex-direction: column;
3634
- background: var(
3635
- --muted
3636
- ); /* Override surface gradient with code-specific dark background */
3637
- color: var(
3638
- --muted-foreground
3639
- ); /* Override surface text color for dark background */
3628
+ background: var(--muted);
3629
+ /* Override surface gradient with code-specific dark background */
3630
+ color: var(--muted-foreground);
3631
+ /* Override surface text color for dark background */
3640
3632
  overflow: hidden;
3641
3633
  font-family: var(--font-mono);
3642
3634
  font-size: var(--font-size-sm);
@@ -3710,8 +3702,6 @@ em {
3710
3702
  white-space: pre;
3711
3703
  overflow-x: auto;
3712
3704
  overflow-y: visible;
3713
- min-width: -moz-min-content;
3714
- min-width: min-content;
3715
3705
  }
3716
3706
 
3717
3707
  .dndev-code-pre[data-compact='true'] {
@@ -3728,16 +3718,19 @@ em {
3728
3718
  user-select: none;
3729
3719
  padding-inline-end: var(--gap-md);
3730
3720
  text-align: end;
3731
- font-size: inherit; /* Match parent code font-size */
3721
+ font-size: inherit;
3722
+ /* Match parent code font-size */
3732
3723
  opacity: var(--opacity-muted);
3733
3724
  width: 3rem;
3734
3725
  flex-shrink: 0;
3735
3726
  color: var(--muted-foreground);
3736
- line-height: 1.5; /* Consistent line height */
3727
+ line-height: 1.5;
3728
+ /* Consistent line height */
3737
3729
  }
3738
3730
 
3739
3731
  .dndev-code-line-number {
3740
- line-height: inherit; /* Inherit from parent */
3732
+ line-height: inherit;
3733
+ /* Inherit from parent */
3741
3734
  }
3742
3735
 
3743
3736
  .dndev-code-code {
@@ -3745,8 +3738,10 @@ em {
3745
3738
  min-width: 0;
3746
3739
  text-align: start;
3747
3740
  display: block;
3748
- line-height: 1.5; /* Match line numbers */
3749
- font-size: var(--font-size-sm); /* Explicit match with line numbers */
3741
+ line-height: 1.5;
3742
+ /* Match line numbers */
3743
+ font-size: var(--font-size-sm);
3744
+ /* Explicit match with line numbers */
3750
3745
  }
3751
3746
 
3752
3747
  /* Ensure shiki-generated code respects line-height AND font-size */
@@ -3754,7 +3749,8 @@ em {
3754
3749
  .dndev-code-code pre,
3755
3750
  .dndev-code-code code {
3756
3751
  line-height: inherit;
3757
- font-size: inherit; /* Match parent font-size */
3752
+ font-size: inherit;
3753
+ /* Match parent font-size */
3758
3754
  }
3759
3755
 
3760
3756
  /* packages/components/src/atomic/Command/Command.css */
@@ -4455,6 +4451,167 @@ em {
4455
4451
  padding-block: var(--gap-lg);
4456
4452
  }
4457
4453
 
4454
+ /* packages/components/src/advanced/ImageGallery/ImageGallery.css */
4455
+
4456
+ .image-gallery {
4457
+ display: flex;
4458
+ flex-direction: column;
4459
+ gap: var(--gap-md);
4460
+ outline: none;
4461
+ }
4462
+
4463
+ .image-gallery:focus-visible {
4464
+ outline: 2px solid var(--primary);
4465
+ outline-offset: 2px;
4466
+ border-radius: var(--radius-lg);
4467
+ }
4468
+
4469
+ /* Empty state */
4470
+
4471
+ .image-gallery--empty {
4472
+ display: flex;
4473
+ align-items: center;
4474
+ justify-content: center;
4475
+ background-color: var(--muted);
4476
+ border-radius: var(--radius-lg);
4477
+ }
4478
+
4479
+ .image-gallery__placeholder {
4480
+ color: var(--muted-foreground);
4481
+ font-size: var(--font-size-sm);
4482
+ }
4483
+
4484
+ /* Main image container */
4485
+
4486
+ .image-gallery__main {
4487
+ position: relative;
4488
+ width: 100%;
4489
+ overflow: hidden;
4490
+ border-radius: var(--radius-surface);
4491
+ background-color: var(--muted);
4492
+ }
4493
+
4494
+ .image-gallery__main-image {
4495
+ width: 100%;
4496
+ height: 100%;
4497
+ -o-object-fit: cover;
4498
+ object-fit: cover;
4499
+ display: block;
4500
+ position: relative;
4501
+ }
4502
+
4503
+ /* Navigation arrows */
4504
+
4505
+ .image-gallery__nav {
4506
+ position: absolute;
4507
+ top: 50%;
4508
+ transform: translateY(-50%);
4509
+ display: flex;
4510
+ align-items: center;
4511
+ justify-content: center;
4512
+ width: 44px;
4513
+ height: 44px;
4514
+ border: none;
4515
+ border-radius: var(--radius-full);
4516
+ background-color: var(--background);
4517
+ color: var(--foreground);
4518
+ cursor: pointer;
4519
+ opacity: 0;
4520
+ transition:
4521
+ opacity 0.2s ease,
4522
+ background-color 0.2s ease;
4523
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
4524
+ z-index: 2;
4525
+ }
4526
+
4527
+ .image-gallery__main:hover .image-gallery__nav,
4528
+ .image-gallery:focus-within .image-gallery__nav {
4529
+ opacity: 1;
4530
+ }
4531
+
4532
+ .image-gallery__nav:hover {
4533
+ background-color: var(--primary);
4534
+ color: var(--primary-foreground);
4535
+ }
4536
+
4537
+ .image-gallery__nav:focus-visible {
4538
+ opacity: 1;
4539
+ outline: 2px solid var(--primary);
4540
+ outline-offset: 2px;
4541
+ }
4542
+
4543
+ .image-gallery__nav--prev {
4544
+ inset-inline-start: var(--gap-md);
4545
+ }
4546
+
4547
+ .image-gallery__nav--next {
4548
+ inset-inline-end: var(--gap-md);
4549
+ }
4550
+
4551
+ /* Thumbnails */
4552
+
4553
+ .image-gallery__thumbnails {
4554
+ display: flex;
4555
+ flex-wrap: wrap;
4556
+ gap: var(--gap-sm);
4557
+ }
4558
+
4559
+ .image-gallery__thumbnail {
4560
+ flex: 0 0 auto;
4561
+ width: 80px;
4562
+ height: 60px;
4563
+ padding: 0;
4564
+ border: 2px solid transparent;
4565
+ border-radius: var(--radius-surface);
4566
+ overflow: hidden;
4567
+ cursor: pointer;
4568
+ background: none;
4569
+ transition:
4570
+ border-color 0.2s ease,
4571
+ transform 0.2s ease;
4572
+ }
4573
+
4574
+ .image-gallery__thumbnail:hover {
4575
+ border-color: var(--muted-foreground);
4576
+ }
4577
+
4578
+ .image-gallery__thumbnail:focus-visible {
4579
+ outline: 2px solid var(--primary);
4580
+ outline-offset: 2px;
4581
+ }
4582
+
4583
+ .image-gallery__thumbnail--selected {
4584
+ border-color: var(--primary);
4585
+ }
4586
+
4587
+ .image-gallery__thumbnail-image {
4588
+ width: 100%;
4589
+ height: 100%;
4590
+ -o-object-fit: cover;
4591
+ object-fit: cover;
4592
+ display: block;
4593
+ }
4594
+
4595
+ /* Responsive adjustments */
4596
+
4597
+ @media (max-width: 640px) {
4598
+ .image-gallery__thumbnail {
4599
+ width: 60px;
4600
+ height: 45px;
4601
+ }
4602
+
4603
+ .image-gallery__nav {
4604
+ width: 36px;
4605
+ height: 36px;
4606
+ opacity: 0.8;
4607
+ }
4608
+
4609
+ .image-gallery__nav svg {
4610
+ width: 20px;
4611
+ height: 20px;
4612
+ }
4613
+ }
4614
+
4458
4615
  /* packages/components/src/atomic/Input/Input.css */
4459
4616
 
4460
4617
  /* Hide number input spinners - cleaner UI for price/range inputs */
@@ -7356,6 +7513,24 @@ input[type='number'] {
7356
7513
  font-size: var(--font-size-sm);
7357
7514
  }
7358
7515
 
7516
+ /* Font weight overrides (after level rules, so weight prop overrides level defaults) */
7517
+
7518
+ .dndev-text-base[data-font-weight='normal'] {
7519
+ font-weight: var(--font-weight-normal);
7520
+ }
7521
+
7522
+ .dndev-text-base[data-font-weight='medium'] {
7523
+ font-weight: var(--font-weight-medium);
7524
+ }
7525
+
7526
+ .dndev-text-base[data-font-weight='semibold'] {
7527
+ font-weight: var(--font-weight-semibold);
7528
+ }
7529
+
7530
+ .dndev-text-base[data-font-weight='bold'] {
7531
+ font-weight: var(--font-weight-bold);
7532
+ }
7533
+
7359
7534
  /* packages/components/src/atomic/Toaster/Toaster.css */
7360
7535
 
7361
7536
  .dndev-toast-viewport {
@@ -8894,9 +9069,14 @@ h4[data-variant='code'] {
8894
9069
  --sidebar-resize-handle-width: 6px;
8895
9070
 
8896
9071
  /* Content width - max constraint only, grid handles sidebar space */
8897
- /* PageContainer sets --max-content-width, main's 1fr handles available space */
9072
+ /* PageContainer sets --max-content-width per variant, components use --content-width */
9073
+ --max-content-width: 100%;
8898
9074
  --content-width: var(--max-content-width, 100%);
8899
9075
 
9076
+ /* Narrow content (mobile-first PWA, app-like single column) - single source of truth */
9077
+ --narrow-content-max: 37.5rem;
9078
+ /* 600px */
9079
+
8900
9080
  /* Content Area Calculations */
8901
9081
  /* Header content area (excludes sidebar on some presets) */
8902
9082
  --header-content-width: 100%;
@@ -9006,8 +9186,7 @@ main[role='main'][data-routing-animation='fade'] {
9006
9186
  /* Slide animation - keyframes handle opacity 0→1 */
9007
9187
 
9008
9188
  main[role='main'][data-routing-animation='slide'] {
9009
- animation: routeSlideIn var(--routing-default-duration, 300ms) ease-in
9010
- forwards;
9189
+ animation: routeSlideIn var(--routing-default-duration, 300ms) ease-in forwards;
9011
9190
  }
9012
9191
 
9013
9192
  /* No animation - already visible by default, explicit for clarity */
@@ -9021,15 +9200,11 @@ main[role='main'][data-routing-animation='none'] {
9021
9200
 
9022
9201
  @media (width < 768px) {
9023
9202
  main[role='main'][data-routing-animation='fade'] {
9024
- animation: routeFadeIn
9025
- var(--routing-mobile-duration, var(--routing-default-duration, 300ms))
9026
- ease-in forwards;
9203
+ animation: routeFadeIn var(--routing-mobile-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9027
9204
  }
9028
9205
 
9029
9206
  main[role='main'][data-routing-animation='slide'] {
9030
- animation: routeSlideIn
9031
- var(--routing-mobile-duration, var(--routing-default-duration, 300ms))
9032
- ease-in forwards;
9207
+ animation: routeSlideIn var(--routing-mobile-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9033
9208
  }
9034
9209
  }
9035
9210
 
@@ -9037,15 +9212,11 @@ main[role='main'][data-routing-animation='none'] {
9037
9212
 
9038
9213
  @media (width >=768px) and (width <=1023px) {
9039
9214
  main[role='main'][data-routing-animation='fade'] {
9040
- animation: routeFadeIn
9041
- var(--routing-tablet-duration, var(--routing-default-duration, 300ms))
9042
- ease-in forwards;
9215
+ animation: routeFadeIn var(--routing-tablet-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9043
9216
  }
9044
9217
 
9045
9218
  main[role='main'][data-routing-animation='slide'] {
9046
- animation: routeSlideIn
9047
- var(--routing-tablet-duration, var(--routing-default-duration, 300ms))
9048
- ease-in forwards;
9219
+ animation: routeSlideIn var(--routing-tablet-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9049
9220
  }
9050
9221
  }
9051
9222
 
@@ -9053,15 +9224,11 @@ main[role='main'][data-routing-animation='none'] {
9053
9224
 
9054
9225
  @media (width >=1024px) and (width <=1439px) {
9055
9226
  main[role='main'][data-routing-animation='fade'] {
9056
- animation: routeFadeIn
9057
- var(--routing-desktop-duration, var(--routing-default-duration, 300ms))
9058
- ease-in forwards;
9227
+ animation: routeFadeIn var(--routing-desktop-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9059
9228
  }
9060
9229
 
9061
9230
  main[role='main'][data-routing-animation='slide'] {
9062
- animation: routeSlideIn
9063
- var(--routing-desktop-duration, var(--routing-default-duration, 300ms))
9064
- ease-in forwards;
9231
+ animation: routeSlideIn var(--routing-desktop-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9065
9232
  }
9066
9233
  }
9067
9234
 
@@ -9069,15 +9236,11 @@ main[role='main'][data-routing-animation='none'] {
9069
9236
 
9070
9237
  @media (width >=1440px) {
9071
9238
  main[role='main'][data-routing-animation='fade'] {
9072
- animation: routeFadeIn
9073
- var(--routing-wide-duration, var(--routing-default-duration, 300ms))
9074
- ease-in forwards;
9239
+ animation: routeFadeIn var(--routing-wide-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9075
9240
  }
9076
9241
 
9077
9242
  main[role='main'][data-routing-animation='slide'] {
9078
- animation: routeSlideIn
9079
- var(--routing-wide-duration, var(--routing-default-duration, 300ms))
9080
- ease-in forwards;
9243
+ animation: routeSlideIn var(--routing-wide-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9081
9244
  }
9082
9245
  }
9083
9246
 
@@ -9101,6 +9264,7 @@ main[role='main'][data-routing-animation='none'] {
9101
9264
  /* Mobile/Tablet: Hide sidebars - WCAG & Lighthouse best practices */
9102
9265
 
9103
9266
  @media (width <=1023px) {
9267
+
9104
9268
  .dndev-layout aside[role='navigation'].sidebar,
9105
9269
  aside[role='navigation'].sidebar {
9106
9270
  display: none !important;
@@ -9124,57 +9288,59 @@ main[role='main'][data-routing-animation='none'] {
9124
9288
  'header header'
9125
9289
  'sidebar main'
9126
9290
  'footer footer';
9127
- grid-template-rows: var(--header-height) 1fr minmax(
9128
- var(--footer-height),
9129
- auto
9130
- );
9291
+ grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height),
9292
+ auto);
9131
9293
  grid-template-columns: var(--sidebar-width) 1fr;
9132
-
9133
- /* Mobile: Grid scrolls instead of main - footer scrolls with content */
9134
9294
  }
9135
9295
 
9136
- @media (width <=1023px) {
9137
-
9138
- .dndev-layout {
9139
- overflow-y: auto;
9140
- overflow-x: hidden;
9141
- /* Keep footer row - grid scrolls so footer scrolls with content */
9142
- grid-template-areas:
9143
- 'header header'
9144
- 'sidebar main'
9145
- 'footer footer';
9146
- grid-template-rows: var(--header-height) min-content auto;
9147
- }
9148
- }
9296
+ /* Footer scroll mode: grid scrolls, footer scrolls with content */
9149
9297
 
9150
- /* Footer scroll mode - grid scrolls, footer scrolls with content (opt-in for desktop) */
9298
+ /* Desktop: opt-in via data-footer-mode="scroll" */
9151
9299
 
9152
9300
  .dndev-layout[data-footer-mode='scroll'] {
9153
9301
  overflow-y: auto;
9154
9302
  overflow-x: hidden;
9155
- grid-template-rows: var(--header-height) min-content auto;
9303
+ grid-template-rows: var(--header-height) 1fr auto;
9156
9304
  }
9157
9305
 
9158
- .dndev-layout[data-footer-mode='scroll'] header[role='banner'] {
9159
- position: sticky;
9160
- top: 0;
9161
- }
9306
+ .dndev-layout[data-footer-mode='scroll'] header[role='banner'] { position: sticky; top: 0; }
9162
9307
 
9163
- .dndev-layout[data-footer-mode='scroll'] main[role='main'] {
9164
- overflow: visible;
9165
- min-height: -moz-min-content;
9166
- min-height: min-content;
9167
- }
9308
+ .dndev-layout[data-footer-mode='scroll'] aside.sidebar[role='navigation'] {
9309
+ position: sticky;
9310
+ top: var(--header-height);
9311
+ height: calc(100dvh - var(--header-height));
9312
+ align-self: start;
9313
+ }
9168
9314
 
9169
- .dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo'] {
9170
- height: auto;
9171
- }
9315
+ .dndev-layout[data-footer-mode='scroll'] main[role='main'] { overflow-y: visible; overflow-x: hidden; }
9172
9316
 
9173
- :is(.dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo']) > * {
9317
+ .dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo'] {
9318
+ grid-column: 2 / -1;
9174
9319
  height: auto;
9175
- min-height: var(--footer-height);
9176
9320
  }
9177
9321
 
9322
+ :is(.dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo']) > * { height: auto; min-height: var(--footer-height); }
9323
+
9324
+ /* Mobile: footer scroll mode ON by default (same rules) */
9325
+
9326
+ @media (width <=1023px) {
9327
+ .dndev-layout {
9328
+ overflow-y: auto;
9329
+ overflow-x: hidden;
9330
+ grid-template-rows: var(--header-height) 1fr auto;
9331
+ }
9332
+
9333
+ .dndev-layout header[role='banner'] { position: sticky; top: 0; }
9334
+
9335
+ .dndev-layout main[role='main'] { overflow-y: visible; overflow-x: hidden; }
9336
+
9337
+ .dndev-layout footer[role='contentinfo'] {
9338
+ height: auto;
9339
+ }
9340
+
9341
+ :is(.dndev-layout footer[role='contentinfo']) > * { height: auto; min-height: var(--footer-height); }
9342
+ }
9343
+
9178
9344
  /* Presets with no footer at all */
9179
9345
 
9180
9346
  [data-layout='moolti'] footer[role='contentinfo'],
@@ -9340,8 +9506,7 @@ aside[role='navigation'].sidebar .dndev-sidebar-resize-handle:focus-visible {
9340
9506
 
9341
9507
  /* Active drag state */
9342
9508
 
9343
- aside[role='navigation'].sidebar[data-dragging='true']
9344
- .dndev-sidebar-resize-handle {
9509
+ aside[role='navigation'].sidebar[data-dragging='true'] .dndev-sidebar-resize-handle {
9345
9510
  background: var(--primary);
9346
9511
  }
9347
9512
 
@@ -9357,10 +9522,7 @@ aside[role='navigation'].sidebar[data-dragging='true']
9357
9522
  /* Landing: AUTO display mode - compact below wide breakpoint (< 1440px) */
9358
9523
 
9359
9524
  @media (width < 1440px) {
9360
- [data-layout='landing']
9361
- header[role='banner']
9362
- [data-display='auto']
9363
- .dndev-interactive-label {
9525
+ [data-layout='landing'] header[role='banner'] [data-display='auto'] .dndev-interactive-label {
9364
9526
  display: none;
9365
9527
  }
9366
9528
  }
@@ -9533,23 +9695,13 @@ main[role='main'] {
9533
9695
  contain: layout style;
9534
9696
 
9535
9697
  /* First child after breadcrumbs grows to fill space */
9698
+
9536
9699
  }
9537
9700
 
9538
9701
  main[role='main'] > *:not(.breadcrumbs-container):first-of-type,main[role='main'] > .breadcrumbs-container + * {
9539
9702
  flex: 1 1 auto;
9540
9703
  }
9541
9704
 
9542
- /* Mobile: Grid scrolls, main doesn't */
9543
-
9544
- @media (width <=1023px) {
9545
-
9546
- main[role='main'] {
9547
- overflow: visible;
9548
- min-height: -moz-min-content;
9549
- min-height: min-content;
9550
- }
9551
- }
9552
-
9553
9705
  /* Footer: Full width by default, app presets start after sidebar */
9554
9706
 
9555
9707
  /* box-sizing: border-box ensures borders are included in height */
@@ -9671,6 +9823,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9671
9823
  /* Mobile (<1024px): Show merged-bar, hide zones */
9672
9824
 
9673
9825
  @media (width <=1023px) {
9826
+
9674
9827
  /* Presets with mergedBar: top (admin, moolti, game, docs) */
9675
9828
  [data-layout='admin'] .merged-bar[data-position='top'],
9676
9829
  [data-layout='moolti'] .merged-bar[data-position='top'],
@@ -10028,32 +10181,26 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10028
10181
  /* Standard width - responsive */
10029
10182
 
10030
10183
  .dndev-container[data-variant='standard'] {
10031
- --max-content-width: 100%;
10184
+ --max-content-width: min(87.5rem, 100%);
10185
+ max-width: var(--content-width);
10186
+ /* 1480px max, but never exceeds container width */
10032
10187
  }
10033
10188
 
10034
- @media (width >=1024px) {
10035
-
10036
- .dndev-container[data-variant='standard'] {
10037
- --max-content-width: 87.5rem;
10038
- /* 1480px */
10039
- /* Padding stays: part of centering space when max-width applies */
10040
- }
10041
- }
10042
-
10043
10189
  /* Docs width - responsive */
10044
10190
 
10045
10191
  .dndev-container[data-variant='docs'] {
10046
- --max-content-width: 100%;
10192
+ --max-content-width: min(56.25rem, 100%);
10193
+ max-width: var(--content-width);
10194
+ /* 900px max, but never exceeds container width */
10047
10195
  }
10048
10196
 
10049
- @media (width >=1024px) {
10197
+ /* Narrow width - mobile-first single column (PWA, app-like on every device) */
10050
10198
 
10051
- .dndev-container[data-variant='docs'] {
10052
- --max-content-width: 56.25rem;
10053
- /* 900px */
10054
- /* Padding stays: always prevents edge touching */
10199
+ .dndev-container[data-variant='narrow'] {
10200
+ --max-content-width: min(var(--narrow-content-max), 100%);
10201
+ max-width: var(--content-width);
10202
+ /* 600px max, but never exceeds container width */
10055
10203
  }
10056
- }
10057
10204
 
10058
10205
  /* Fixed frame - fills parent exactly, prevents parent scroll */
10059
10206
 
@@ -10099,10 +10246,10 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10099
10246
 
10100
10247
  /* Breakthrough pattern: only applies inside PageContainer */
10101
10248
 
10102
- .dndev-container > .dndev-section-full-width,
10103
- .dndev-container > .dndev-cta,
10104
- .dndev-container > .dndev-hero-section,
10105
- .dndev-container > .dndev-tech-bento {
10249
+ .dndev-container>.dndev-section-full-width,
10250
+ .dndev-container>.dndev-cta,
10251
+ .dndev-container>.dndev-hero-section,
10252
+ .dndev-container>.dndev-tech-bento {
10106
10253
  /* Break out of PageContainer padding and max-width constraint */
10107
10254
  /* Account for sidebar: --sidebar-width is 0px for presets without sidebar */
10108
10255
  width: calc(100dvw - var(--sidebar-width));
@@ -10182,12 +10329,29 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10182
10329
  justify-content: space-between;
10183
10330
  }
10184
10331
 
10185
- /* CTA Zone - Fixed at bottom */
10332
+ /* Narrow content wrapper - constrained by --narrow-content-max (mobile-first PWA) */
10333
+
10334
+ .dndev-game-container__content-narrow {
10335
+ width: 100%;
10336
+ max-width: var(--narrow-content-max);
10337
+ margin-inline: auto;
10338
+ min-height: 0;
10339
+ flex: 1 1 auto;
10340
+ display: flex;
10341
+ flex-direction: column;
10342
+ }
10343
+
10344
+ .dndev-game-container__content-narrow .dndev-game-container__scroll {
10345
+ width: 100%;
10346
+ }
10347
+
10348
+ /* CTA Zone - Fixed at bottom; safe area for notched devices */
10186
10349
 
10187
10350
  .dndev-game-container__cta {
10188
10351
  display: flex;
10189
10352
  flex-direction: column;
10190
10353
  padding-top: var(--gap-md);
10354
+ padding-bottom: env(safe-area-inset-bottom);
10191
10355
  border-top: 2px solid var(--border);
10192
10356
  }
10193
10357
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@donotdev/ui",
3
- "version": "0.0.10",
3
+ "version": "0.0.12",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -49,22 +49,22 @@
49
49
  "dependencies": {
50
50
  "@hookform/resolvers": "^5.2.2",
51
51
  "react-helmet-async": "^2.0.5",
52
- "react-hook-form": "^7.71.0"
52
+ "react-hook-form": "^7.71.1"
53
53
  },
54
54
  "peerDependencies": {
55
- "@donotdev/adv-comps": "^0.0.8",
56
- "@donotdev/auth": "^0.0.5",
55
+ "@donotdev/adv-comps": "^0.0.9",
56
+ "@donotdev/auth": "^0.0.6",
57
57
  "@donotdev/billing": "^0.0.5",
58
- "@donotdev/components": "^0.0.13",
59
- "@donotdev/core": "^0.0.17",
60
- "@donotdev/crud": "^0.0.8",
61
- "@donotdev/firebase": "^0.0.6",
58
+ "@donotdev/components": "^0.0.15",
59
+ "@donotdev/core": "^0.0.20",
60
+ "@donotdev/crud": "^0.0.11",
61
+ "@donotdev/firebase": "^0.0.9",
62
62
  "@donotdev/oauth": "^0.0.5",
63
- "firebase": "^12.5.0",
64
- "lucide-react": "^0.562.0",
65
- "react": "^19.2.3",
66
- "react-dom": "^19.2.3",
67
- "react-router-dom": "^7.1.3",
63
+ "firebase": "^12.8.0",
64
+ "lucide-react": "^0.563.0",
65
+ "react": "^19.2.4",
66
+ "react-dom": "^19.2.4",
67
+ "react-router-dom": "^7.13.0",
68
68
  "valibot": "^1.2.0"
69
69
  },
70
70
  "peerDependenciesMeta": {
@@ -1,26 +0,0 @@
1
- import type { EntityField, FieldType, ValueTypeForField } from '@donotdev/core';
2
- import type { ReactElement } from 'react';
3
- interface DisplayFieldRendererBaseProps<T extends FieldType = FieldType> {
4
- /** Field identifier */
5
- name: string;
6
- /** Field configuration */
7
- config: EntityField<T>;
8
- /** Translation function */
9
- t: (key: string, options?: Record<string, any>) => string;
10
- /** Field value to display */
11
- value: ValueTypeForField<T>;
12
- /** Additional CSS classes */
13
- className?: string;
14
- }
15
- export type DisplayFieldRendererProps<T extends FieldType> = DisplayFieldRendererBaseProps<T>;
16
- /**
17
- * DisplayFieldRenderer selects and renders the appropriate display component
18
- * based on the field type for read-only display mode.
19
- *
20
- * @version 0.0.1
21
- * @since 0.0.1
22
- * @author AMBROISE PARK Consulting
23
- */
24
- export declare function DisplayFieldRenderer<T extends FieldType>({ name, config, t, value, className, }: DisplayFieldRendererProps<T>): ReactElement;
25
- export default DisplayFieldRenderer;
26
- //# sourceMappingURL=DisplayFieldRenderer.d.ts.map