@donotdev/ui 0.0.11 → 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.
@@ -1 +1 @@
1
- {"version":3,"file":"game.d.ts","sourceRoot":"","sources":["../../../../../src/internal/layout/config/presets/game.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AASnD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,EAAE,YAkCxB,CAAC"}
1
+ {"version":3,"file":"game.d.ts","sourceRoot":"","sources":["../../../../../src/internal/layout/config/presets/game.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAYnD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,EAAE,YAwCxB,CAAC"}
@@ -13,6 +13,9 @@ import { DISPLAY } from '@donotdev/components';
13
13
  import { LanguageSelector } from '@donotdev/core';
14
14
  import { AuthHeader } from '../../../../components/auth';
15
15
  import { GameTitle, ThemeToggle, } from '../../../../components/layout/components';
16
+ import { FooterCopyright } from '../../components/footer/FooterCopyright';
17
+ import { FooterLegalLinks } from '../../components/footer/FooterLegalLinks';
18
+ import { DEFAULT_SLOTS } from '../defaults';
16
19
  /**
17
20
  * Game preset - mobile gaming layout
18
21
  *
@@ -37,12 +40,14 @@ export const gamePreset = {
37
40
  mergedBar: {
38
41
  position: 'top',
39
42
  // Desktop → Mobile mapping:
40
- trigger: () => _jsx(GameTitle, {}), // header.center → trigger (GameTitle, since header.start is null)
41
- top: () => _jsx(GameTitle, {}), // header.center → top (GameTitle)
42
- content: () => null, // No sidebar content is null
43
- bottom: () => (
44
- // header.end → bottom (Auth, Language, Theme)
43
+ trigger: () => _jsx(GameTitle, {}), // header.center → trigger
44
+ top: () => (
45
+ // header.endtop (Auth, Language, Theme)
45
46
  _jsxs(_Fragment, { children: [_jsx(AuthHeader, { display: DISPLAY.AUTO }), _jsx(LanguageSelector, { display: DISPLAY.AUTO }), _jsx(ThemeToggle, { display: DISPLAY.AUTO })] })),
47
+ content: DEFAULT_SLOTS.sidebar.content, // Navigation menu
48
+ bottom: () => (
49
+ // Footer content: copyright + legal links (includes branding)
50
+ _jsxs(_Fragment, { children: [_jsx(FooterCopyright, {}), _jsx(FooterLegalLinks, {})] })),
46
51
  },
47
52
  },
48
53
  };
@@ -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 */
@@ -9073,9 +9069,14 @@ h4[data-variant='code'] {
9073
9069
  --sidebar-resize-handle-width: 6px;
9074
9070
 
9075
9071
  /* Content width - max constraint only, grid handles sidebar space */
9076
- /* 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%;
9077
9074
  --content-width: var(--max-content-width, 100%);
9078
9075
 
9076
+ /* Narrow content (mobile-first PWA, app-like single column) - single source of truth */
9077
+ --narrow-content-max: 37.5rem;
9078
+ /* 600px */
9079
+
9079
9080
  /* Content Area Calculations */
9080
9081
  /* Header content area (excludes sidebar on some presets) */
9081
9082
  --header-content-width: 100%;
@@ -9185,8 +9186,7 @@ main[role='main'][data-routing-animation='fade'] {
9185
9186
  /* Slide animation - keyframes handle opacity 0→1 */
9186
9187
 
9187
9188
  main[role='main'][data-routing-animation='slide'] {
9188
- animation: routeSlideIn var(--routing-default-duration, 300ms) ease-in
9189
- forwards;
9189
+ animation: routeSlideIn var(--routing-default-duration, 300ms) ease-in forwards;
9190
9190
  }
9191
9191
 
9192
9192
  /* No animation - already visible by default, explicit for clarity */
@@ -9200,15 +9200,11 @@ main[role='main'][data-routing-animation='none'] {
9200
9200
 
9201
9201
  @media (width < 768px) {
9202
9202
  main[role='main'][data-routing-animation='fade'] {
9203
- animation: routeFadeIn
9204
- var(--routing-mobile-duration, var(--routing-default-duration, 300ms))
9205
- ease-in forwards;
9203
+ animation: routeFadeIn var(--routing-mobile-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9206
9204
  }
9207
9205
 
9208
9206
  main[role='main'][data-routing-animation='slide'] {
9209
- animation: routeSlideIn
9210
- var(--routing-mobile-duration, var(--routing-default-duration, 300ms))
9211
- ease-in forwards;
9207
+ animation: routeSlideIn var(--routing-mobile-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9212
9208
  }
9213
9209
  }
9214
9210
 
@@ -9216,15 +9212,11 @@ main[role='main'][data-routing-animation='none'] {
9216
9212
 
9217
9213
  @media (width >=768px) and (width <=1023px) {
9218
9214
  main[role='main'][data-routing-animation='fade'] {
9219
- animation: routeFadeIn
9220
- var(--routing-tablet-duration, var(--routing-default-duration, 300ms))
9221
- ease-in forwards;
9215
+ animation: routeFadeIn var(--routing-tablet-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9222
9216
  }
9223
9217
 
9224
9218
  main[role='main'][data-routing-animation='slide'] {
9225
- animation: routeSlideIn
9226
- var(--routing-tablet-duration, var(--routing-default-duration, 300ms))
9227
- ease-in forwards;
9219
+ animation: routeSlideIn var(--routing-tablet-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9228
9220
  }
9229
9221
  }
9230
9222
 
@@ -9232,15 +9224,11 @@ main[role='main'][data-routing-animation='none'] {
9232
9224
 
9233
9225
  @media (width >=1024px) and (width <=1439px) {
9234
9226
  main[role='main'][data-routing-animation='fade'] {
9235
- animation: routeFadeIn
9236
- var(--routing-desktop-duration, var(--routing-default-duration, 300ms))
9237
- ease-in forwards;
9227
+ animation: routeFadeIn var(--routing-desktop-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9238
9228
  }
9239
9229
 
9240
9230
  main[role='main'][data-routing-animation='slide'] {
9241
- animation: routeSlideIn
9242
- var(--routing-desktop-duration, var(--routing-default-duration, 300ms))
9243
- ease-in forwards;
9231
+ animation: routeSlideIn var(--routing-desktop-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9244
9232
  }
9245
9233
  }
9246
9234
 
@@ -9248,15 +9236,11 @@ main[role='main'][data-routing-animation='none'] {
9248
9236
 
9249
9237
  @media (width >=1440px) {
9250
9238
  main[role='main'][data-routing-animation='fade'] {
9251
- animation: routeFadeIn
9252
- var(--routing-wide-duration, var(--routing-default-duration, 300ms))
9253
- ease-in forwards;
9239
+ animation: routeFadeIn var(--routing-wide-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9254
9240
  }
9255
9241
 
9256
9242
  main[role='main'][data-routing-animation='slide'] {
9257
- animation: routeSlideIn
9258
- var(--routing-wide-duration, var(--routing-default-duration, 300ms))
9259
- ease-in forwards;
9243
+ animation: routeSlideIn var(--routing-wide-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9260
9244
  }
9261
9245
  }
9262
9246
 
@@ -9280,6 +9264,7 @@ main[role='main'][data-routing-animation='none'] {
9280
9264
  /* Mobile/Tablet: Hide sidebars - WCAG & Lighthouse best practices */
9281
9265
 
9282
9266
  @media (width <=1023px) {
9267
+
9283
9268
  .dndev-layout aside[role='navigation'].sidebar,
9284
9269
  aside[role='navigation'].sidebar {
9285
9270
  display: none !important;
@@ -9303,57 +9288,59 @@ main[role='main'][data-routing-animation='none'] {
9303
9288
  'header header'
9304
9289
  'sidebar main'
9305
9290
  'footer footer';
9306
- grid-template-rows: var(--header-height) 1fr minmax(
9307
- var(--footer-height),
9308
- auto
9309
- );
9291
+ grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height),
9292
+ auto);
9310
9293
  grid-template-columns: var(--sidebar-width) 1fr;
9311
-
9312
- /* Mobile: Grid scrolls instead of main - footer scrolls with content */
9313
9294
  }
9314
9295
 
9315
- @media (width <=1023px) {
9296
+ /* Footer scroll mode: grid scrolls, footer scrolls with content */
9316
9297
 
9317
- .dndev-layout {
9318
- overflow-y: auto;
9319
- overflow-x: hidden;
9320
- /* Keep footer row - grid scrolls so footer scrolls with content */
9321
- grid-template-areas:
9322
- 'header header'
9323
- 'sidebar main'
9324
- 'footer footer';
9325
- grid-template-rows: var(--header-height) min-content auto;
9326
- }
9327
- }
9328
-
9329
- /* Footer scroll mode - grid scrolls, footer scrolls with content (opt-in for desktop) */
9298
+ /* Desktop: opt-in via data-footer-mode="scroll" */
9330
9299
 
9331
9300
  .dndev-layout[data-footer-mode='scroll'] {
9332
9301
  overflow-y: auto;
9333
9302
  overflow-x: hidden;
9334
- grid-template-rows: var(--header-height) min-content auto;
9303
+ grid-template-rows: var(--header-height) 1fr auto;
9335
9304
  }
9336
9305
 
9337
- .dndev-layout[data-footer-mode='scroll'] header[role='banner'] {
9338
- position: sticky;
9339
- top: 0;
9340
- }
9306
+ .dndev-layout[data-footer-mode='scroll'] header[role='banner'] { position: sticky; top: 0; }
9341
9307
 
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
- }
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
+ }
9347
9314
 
9348
- .dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo'] {
9349
- height: auto;
9350
- }
9315
+ .dndev-layout[data-footer-mode='scroll'] main[role='main'] { overflow-y: visible; overflow-x: hidden; }
9351
9316
 
9352
- :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;
9353
9319
  height: auto;
9354
- min-height: var(--footer-height);
9355
9320
  }
9356
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
+
9357
9344
  /* Presets with no footer at all */
9358
9345
 
9359
9346
  [data-layout='moolti'] footer[role='contentinfo'],
@@ -9519,8 +9506,7 @@ aside[role='navigation'].sidebar .dndev-sidebar-resize-handle:focus-visible {
9519
9506
 
9520
9507
  /* Active drag state */
9521
9508
 
9522
- aside[role='navigation'].sidebar[data-dragging='true']
9523
- .dndev-sidebar-resize-handle {
9509
+ aside[role='navigation'].sidebar[data-dragging='true'] .dndev-sidebar-resize-handle {
9524
9510
  background: var(--primary);
9525
9511
  }
9526
9512
 
@@ -9536,10 +9522,7 @@ aside[role='navigation'].sidebar[data-dragging='true']
9536
9522
  /* Landing: AUTO display mode - compact below wide breakpoint (< 1440px) */
9537
9523
 
9538
9524
  @media (width < 1440px) {
9539
- [data-layout='landing']
9540
- header[role='banner']
9541
- [data-display='auto']
9542
- .dndev-interactive-label {
9525
+ [data-layout='landing'] header[role='banner'] [data-display='auto'] .dndev-interactive-label {
9543
9526
  display: none;
9544
9527
  }
9545
9528
  }
@@ -9712,23 +9695,13 @@ main[role='main'] {
9712
9695
  contain: layout style;
9713
9696
 
9714
9697
  /* First child after breadcrumbs grows to fill space */
9698
+
9715
9699
  }
9716
9700
 
9717
9701
  main[role='main'] > *:not(.breadcrumbs-container):first-of-type,main[role='main'] > .breadcrumbs-container + * {
9718
9702
  flex: 1 1 auto;
9719
9703
  }
9720
9704
 
9721
- /* Mobile: Grid scrolls, main doesn't */
9722
-
9723
- @media (width <=1023px) {
9724
-
9725
- main[role='main'] {
9726
- overflow: visible;
9727
- min-height: -moz-min-content;
9728
- min-height: min-content;
9729
- }
9730
- }
9731
-
9732
9705
  /* Footer: Full width by default, app presets start after sidebar */
9733
9706
 
9734
9707
  /* box-sizing: border-box ensures borders are included in height */
@@ -9850,6 +9823,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9850
9823
  /* Mobile (<1024px): Show merged-bar, hide zones */
9851
9824
 
9852
9825
  @media (width <=1023px) {
9826
+
9853
9827
  /* Presets with mergedBar: top (admin, moolti, game, docs) */
9854
9828
  [data-layout='admin'] .merged-bar[data-position='top'],
9855
9829
  [data-layout='moolti'] .merged-bar[data-position='top'],
@@ -10207,32 +10181,26 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10207
10181
  /* Standard width - responsive */
10208
10182
 
10209
10183
  .dndev-container[data-variant='standard'] {
10210
- --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 */
10211
10187
  }
10212
10188
 
10213
- @media (width >=1024px) {
10214
-
10215
- .dndev-container[data-variant='standard'] {
10216
- --max-content-width: 87.5rem;
10217
- /* 1480px */
10218
- /* Padding stays: part of centering space when max-width applies */
10219
- }
10220
- }
10221
-
10222
10189
  /* Docs width - responsive */
10223
10190
 
10224
10191
  .dndev-container[data-variant='docs'] {
10225
- --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 */
10226
10195
  }
10227
10196
 
10228
- @media (width >=1024px) {
10197
+ /* Narrow width - mobile-first single column (PWA, app-like on every device) */
10229
10198
 
10230
- .dndev-container[data-variant='docs'] {
10231
- --max-content-width: 56.25rem;
10232
- /* 900px */
10233
- /* 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 */
10234
10203
  }
10235
- }
10236
10204
 
10237
10205
  /* Fixed frame - fills parent exactly, prevents parent scroll */
10238
10206
 
@@ -10278,10 +10246,10 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10278
10246
 
10279
10247
  /* Breakthrough pattern: only applies inside PageContainer */
10280
10248
 
10281
- .dndev-container > .dndev-section-full-width,
10282
- .dndev-container > .dndev-cta,
10283
- .dndev-container > .dndev-hero-section,
10284
- .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 {
10285
10253
  /* Break out of PageContainer padding and max-width constraint */
10286
10254
  /* Account for sidebar: --sidebar-width is 0px for presets without sidebar */
10287
10255
  width: calc(100dvw - var(--sidebar-width));
@@ -10361,12 +10329,29 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10361
10329
  justify-content: space-between;
10362
10330
  }
10363
10331
 
10364
- /* 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 */
10365
10349
 
10366
10350
  .dndev-game-container__cta {
10367
10351
  display: flex;
10368
10352
  flex-direction: column;
10369
10353
  padding-top: var(--gap-md);
10354
+ padding-bottom: env(safe-area-inset-bottom);
10370
10355
  border-top: 2px solid var(--border);
10371
10356
  }
10372
10357
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@donotdev/ui",
3
- "version": "0.0.11",
3
+ "version": "0.0.12",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -53,12 +53,12 @@
53
53
  },
54
54
  "peerDependencies": {
55
55
  "@donotdev/adv-comps": "^0.0.9",
56
- "@donotdev/auth": "^0.0.5",
56
+ "@donotdev/auth": "^0.0.6",
57
57
  "@donotdev/billing": "^0.0.5",
58
58
  "@donotdev/components": "^0.0.15",
59
- "@donotdev/core": "^0.0.19",
60
- "@donotdev/crud": "^0.0.10",
61
- "@donotdev/firebase": "^0.0.8",
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
63
  "firebase": "^12.8.0",
64
64
  "lucide-react": "^0.563.0",