@donotdev/ui 0.0.12 → 0.0.13

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 (29) hide show
  1. package/dist/components/common/FeatureCard.js +1 -1
  2. package/dist/components/common/RedirectOverlay.js +1 -1
  3. package/dist/components/cookie-consent/CookieConsent.js +3 -3
  4. package/dist/components/layout/GameContainer.d.ts +24 -8
  5. package/dist/components/layout/GameContainer.d.ts.map +1 -1
  6. package/dist/components/layout/GameContainer.js +21 -3
  7. package/dist/components/layout/GameFlow.d.ts.map +1 -1
  8. package/dist/components/layout/GameFlow.js +27 -11
  9. package/dist/components/layout/components/header/CacheSettings.js +1 -1
  10. package/dist/crud/components/EntityCardList.d.ts.map +1 -1
  11. package/dist/crud/components/EntityCardList.js +16 -10
  12. package/dist/crud/components/EntityDisplayRenderer.js +2 -2
  13. package/dist/crud/components/EntityFormRenderer.d.ts.map +1 -1
  14. package/dist/crud/components/EntityList.d.ts.map +1 -1
  15. package/dist/crud/components/EntityList.js +7 -9
  16. package/dist/crud/components/Form.js +1 -1
  17. package/dist/dndev.css +99 -39
  18. package/dist/index.js +4 -4
  19. package/dist/internal/common/RouteErrorFallback.js +3 -3
  20. package/dist/internal/devtools/components/ConfigTab.js +1 -1
  21. package/dist/internal/devtools/components/CookieTab.js +1 -1
  22. package/dist/internal/devtools/components/DesignTab.js +2 -2
  23. package/dist/internal/devtools/components/StoresTab.js +2 -2
  24. package/dist/internal/layout/zones/DnDevFooter.js +1 -1
  25. package/dist/internal/layout/zones/DnDevMergedBar.js +1 -1
  26. package/dist/routing/404.js +3 -3
  27. package/dist/routing/AuthGuardFallback.js +2 -2
  28. package/dist/styles/index.css +99 -39
  29. package/package.json +1 -1
@@ -104,7 +104,7 @@ export const RouteErrorFallback = ({ error, resetError, componentStack, eventId,
104
104
  width: '2.5rem',
105
105
  height: '2.5rem',
106
106
  color: 'var(--destructive)',
107
- }, "aria-hidden": "true" }) }), _jsxs(Stack, { gap: "medium", children: [_jsx("h1", { className: "dndev-text-base", "data-level": "h1", style: {
107
+ }, "aria-hidden": "true" }) }), _jsxs(Stack, { children: [_jsx("h1", { className: "dndev-text-base", "data-level": "h1", style: {
108
108
  fontSize: 'var(--font-size-2xl)',
109
109
  fontWeight: 'var(--font-weight-bold)',
110
110
  margin: 0,
@@ -119,7 +119,7 @@ export const RouteErrorFallback = ({ error, resetError, componentStack, eventId,
119
119
  fontSize: 'var(--font-size-xs)',
120
120
  fontFamily: 'var(--font-mono)',
121
121
  color: 'var(--foreground)',
122
- }, children: [t('routeError.errorId', 'Error ID'), ": ", eventId] })), isDevelopment && errorMessage && (_jsxs(Card, { variant: CARD_VARIANT.MUTED, className: "dndev-w-full", children: [_jsxs(Stack, { direction: "row", align: "center", justify: "between", gap: "medium", children: [_jsx("span", { className: "dndev-text-base", style: {
122
+ }, children: [t('routeError.errorId', 'Error ID'), ": ", eventId] })), isDevelopment && errorMessage && (_jsxs(Card, { variant: CARD_VARIANT.MUTED, className: "dndev-w-full", children: [_jsxs(Stack, { direction: "row", align: "center", justify: "between", children: [_jsx("span", { className: "dndev-text-base", style: {
123
123
  fontSize: 'var(--font-size-sm)',
124
124
  fontWeight: 'var(--font-weight-semibold)',
125
125
  color: 'var(--destructive)',
@@ -133,7 +133,7 @@ export const RouteErrorFallback = ({ error, resetError, componentStack, eventId,
133
133
  color: 'var(--foreground)',
134
134
  margin: 0,
135
135
  marginTop: 'var(--gap-sm)',
136
- }, children: errorMessage })] })), _jsxs(Stack, { gap: "medium", className: "dndev-w-full", children: [_jsx(Button, { variant: BUTTON_VARIANT.DESTRUCTIVE, icon: RotateCw, onClick: handleRetry, fullWidth: true, children: t('routeError.tryAgain', 'Try Again') }), _jsxs(Stack, { direction: "row", gap: "medium", justify: "center", children: [_jsx(Link, { path: "/", children: _jsx(Button, { variant: BUTTON_VARIANT.DEFAULT, icon: Home, fullWidth: true, children: t('routeError.goHome', 'Go Home') }) }), _jsx(Button, { variant: BUTTON_VARIANT.OUTLINE, icon: ArrowLeft, onClick: handleGoBack, fullWidth: true, children: t('routeError.goBack', 'Go Back') })] })] }), _jsx("p", { className: "dndev-text-base", style: {
136
+ }, children: errorMessage })] })), _jsxs(Stack, { className: "dndev-w-full", children: [_jsx(Button, { variant: BUTTON_VARIANT.DESTRUCTIVE, icon: RotateCw, onClick: handleRetry, fullWidth: true, children: t('routeError.tryAgain', 'Try Again') }), _jsxs(Stack, { direction: "row", justify: "center", children: [_jsx(Link, { path: "/", children: _jsx(Button, { variant: BUTTON_VARIANT.DEFAULT, icon: Home, fullWidth: true, children: t('routeError.goHome', 'Go Home') }) }), _jsx(Button, { variant: BUTTON_VARIANT.OUTLINE, icon: ArrowLeft, onClick: handleGoBack, fullWidth: true, children: t('routeError.goBack', 'Go Back') })] })] }), _jsx("p", { className: "dndev-text-base", style: {
137
137
  fontSize: 'var(--font-size-sm)',
138
138
  color: 'var(--muted-foreground)',
139
139
  margin: 0,
@@ -57,5 +57,5 @@ export const ConfigTab = () => {
57
57
  label: _jsx(Text, { className: "dndev-font-mono dndev-text-xs", children: key }),
58
58
  value: _jsx(MaskedValue, { keyName: key, value: String(value) }),
59
59
  }));
60
- return (_jsxs(Stack, { gap: "medium", style: { padding: 'var(--gap-md)' }, children: [_jsx(Card, { title: "Framework", subtitle: source.source, children: _jsx(DescriptionList, { items: frameworkItems }) }), summaryItems.length > 0 && (_jsx(Card, { title: "Discovery", children: _jsx(DescriptionList, { items: summaryItems }) })), envItems.length > 0 && (_jsx(Card, { title: "Environment", subtitle: `${envItems.length} variables`, children: _jsx(DescriptionList, { items: envItems }) }))] }));
60
+ return (_jsxs(Stack, { style: { padding: 'var(--gap-md)' }, children: [_jsx(Card, { title: "Framework", subtitle: source.source, children: _jsx(DescriptionList, { items: frameworkItems }) }), summaryItems.length > 0 && (_jsx(Card, { title: "Discovery", children: _jsx(DescriptionList, { items: summaryItems }) })), envItems.length > 0 && (_jsx(Card, { title: "Environment", subtitle: `${envItems.length} variables`, children: _jsx(DescriptionList, { items: envItems }) }))] }));
61
61
  };
@@ -144,7 +144,7 @@ export const CookieTab = () => {
144
144
  categories,
145
145
  timestamp,
146
146
  version,
147
- }), variant: BUTTON_VARIANT.GHOST, onCopy: () => toast('success', 'Consent state copied') })] }), children: _jsx(DescriptionList, { items: consentStateItems }) }), _jsx(Card, { title: _jsxs(Stack, { direction: "row", align: "center", justify: "between", className: "dndev-w-full", children: [_jsx("span", { children: "Categories" }), _jsx(CopyToClipboard, { text: formatJSON(categories), variant: BUTTON_VARIANT.GHOST, onCopy: () => toast('success', 'Categories copied') })] }), children: _jsx(DescriptionList, { items: categoryItems }) }), _jsx(Card, { title: _jsxs(Stack, { direction: "row", align: "center", justify: "between", className: "dndev-w-full", children: [_jsx("span", { children: "Cookie Value" }), _jsxs(Stack, { direction: "row", gap: "tight", children: [_jsx(CopyToClipboard, { text: cookieValue || 'null', variant: BUTTON_VARIANT.GHOST, onCopy: () => toast('success', 'Cookie value copied') }), _jsx(Button, { onClick: handleClearCookie, icon: Trash2, variant: BUTTON_VARIANT.GHOST, title: "Clear Cookie", children: "Clear" })] })] }), children: _jsx("pre", { className: "dndev-overflow-y-auto dndev-font-mono dndev-text-xs dndev-max-h-60", children: cookieValue || 'No cookie found' }) }), _jsx(Card, { title: _jsxs(Stack, { direction: "row", align: "center", justify: "between", className: "dndev-w-full", children: [_jsx("span", { children: "DOM Elements" }), _jsx(CopyToClipboard, { text: formatJSON(domInfo), variant: BUTTON_VARIANT.GHOST, onCopy: () => toast('success', 'DOM info copied') })] }), children: _jsxs(Stack, { gap: "medium", children: [_jsxs("div", { children: [_jsx(Label, { className: "dndev-font-semibold", children: "Cookie Banner:" }), _jsxs(Stack, { gap: "tight", className: "dndev-ml-md", children: [_jsxs(Text, { children: ["Exists: ", domInfo.cookieBanner?.exists ? '✅' : '❌'] }), _jsxs(Text, { children: ["Visible: ", domInfo.cookieBanner?.visible ? '✅' : '❌'] }), _jsxs(Text, { children: ["z-index: ", domInfo.cookieBanner?.zIndex || 'N/A'] }), _jsxs(Text, { children: ["Position: ", domInfo.cookieBanner?.position || 'N/A'] })] })] }), _jsxs("div", { children: [_jsx(Label, { className: "dndev-font-semibold", children: "Dialogs:" }), _jsxs(Stack, { gap: "tight", className: "dndev-ml-md", children: [_jsxs(Text, { children: ["Count: ", domInfo.dialogs?.count || 0] }), _jsxs(Text, { children: ["Open: ", domInfo.dialogs?.open || 0] })] })] }), _jsxs("div", { children: [_jsx(Label, { className: "dndev-font-semibold", children: "Overlays:" }), _jsxs(Stack, { gap: "tight", className: "dndev-ml-md", children: [_jsxs(Text, { children: ["Count: ", domInfo.overlays?.count || 0] }), _jsxs(Text, { children: ["Visible: ", domInfo.overlays?.visible || 0] })] })] }), _jsxs("div", { children: [_jsx(Label, { className: "dndev-font-semibold", children: "Portals:" }), _jsx(Stack, { gap: "tight", className: "dndev-ml-md", children: _jsxs(Text, { children: ["Count: ", domInfo.portals?.count || 0] }) })] })] }) }), _jsx(Card, { title: _jsxs(Stack, { direction: "row", align: "center", justify: "between", className: "dndev-w-full", children: [_jsx("span", { children: "Z-Index Stacking" }), _jsx(CopyToClipboard, { text: formatJSON(zIndexInfo), variant: BUTTON_VARIANT.GHOST, onCopy: () => toast('success', 'Z-index info copied') })] }), children: _jsxs(Stack, { gap: "medium", children: [_jsxs("div", { children: [_jsx(Label, { className: "dndev-font-semibold", children: "CSS Variables:" }), _jsx(Stack, { gap: "tight", className: "dndev-ml-md dndev-font-mono dndev-text-sm", children: Object.entries(zIndexInfo.cssVariables || {}).map(([key, value]) => (_jsxs(Text, { children: [key, ": ", String(value) || 'not set'] }, key))) })] }), _jsxs("div", { children: [_jsx(Label, { className: "dndev-font-semibold", children: "Computed Values:" }), _jsx(Stack, { gap: "tight", className: "dndev-ml-md dndev-font-mono dndev-text-sm", children: Object.entries(zIndexInfo.computed || {}).map(([key, value]) => (_jsxs(Text, { children: [key, ": ", String(value)] }, key))) })] })] }) }), _jsx(Card, { title: _jsxs(Stack, { direction: "row", align: "center", justify: "between", className: "dndev-w-full", children: [_jsx("span", { children: "Full Store State" }), _jsx(CopyToClipboard, { text: formatJSON({
147
+ }), variant: BUTTON_VARIANT.GHOST, onCopy: () => toast('success', 'Consent state copied') })] }), children: _jsx(DescriptionList, { items: consentStateItems }) }), _jsx(Card, { title: _jsxs(Stack, { direction: "row", align: "center", justify: "between", className: "dndev-w-full", children: [_jsx("span", { children: "Categories" }), _jsx(CopyToClipboard, { text: formatJSON(categories), variant: BUTTON_VARIANT.GHOST, onCopy: () => toast('success', 'Categories copied') })] }), children: _jsx(DescriptionList, { items: categoryItems }) }), _jsx(Card, { title: _jsxs(Stack, { direction: "row", align: "center", justify: "between", className: "dndev-w-full", children: [_jsx("span", { children: "Cookie Value" }), _jsxs(Stack, { direction: "row", gap: "tight", children: [_jsx(CopyToClipboard, { text: cookieValue || 'null', variant: BUTTON_VARIANT.GHOST, onCopy: () => toast('success', 'Cookie value copied') }), _jsx(Button, { onClick: handleClearCookie, icon: Trash2, variant: BUTTON_VARIANT.GHOST, title: "Clear Cookie", children: "Clear" })] })] }), children: _jsx("pre", { className: "dndev-overflow-y-auto dndev-font-mono dndev-text-xs dndev-max-h-60", children: cookieValue || 'No cookie found' }) }), _jsx(Card, { title: _jsxs(Stack, { direction: "row", align: "center", justify: "between", className: "dndev-w-full", children: [_jsx("span", { children: "DOM Elements" }), _jsx(CopyToClipboard, { text: formatJSON(domInfo), variant: BUTTON_VARIANT.GHOST, onCopy: () => toast('success', 'DOM info copied') })] }), children: _jsxs(Stack, { children: [_jsxs("div", { children: [_jsx(Label, { className: "dndev-font-semibold", children: "Cookie Banner:" }), _jsxs(Stack, { gap: "tight", className: "dndev-ml-md", children: [_jsxs(Text, { children: ["Exists: ", domInfo.cookieBanner?.exists ? '✅' : '❌'] }), _jsxs(Text, { children: ["Visible: ", domInfo.cookieBanner?.visible ? '✅' : '❌'] }), _jsxs(Text, { children: ["z-index: ", domInfo.cookieBanner?.zIndex || 'N/A'] }), _jsxs(Text, { children: ["Position: ", domInfo.cookieBanner?.position || 'N/A'] })] })] }), _jsxs("div", { children: [_jsx(Label, { className: "dndev-font-semibold", children: "Dialogs:" }), _jsxs(Stack, { gap: "tight", className: "dndev-ml-md", children: [_jsxs(Text, { children: ["Count: ", domInfo.dialogs?.count || 0] }), _jsxs(Text, { children: ["Open: ", domInfo.dialogs?.open || 0] })] })] }), _jsxs("div", { children: [_jsx(Label, { className: "dndev-font-semibold", children: "Overlays:" }), _jsxs(Stack, { gap: "tight", className: "dndev-ml-md", children: [_jsxs(Text, { children: ["Count: ", domInfo.overlays?.count || 0] }), _jsxs(Text, { children: ["Visible: ", domInfo.overlays?.visible || 0] })] })] }), _jsxs("div", { children: [_jsx(Label, { className: "dndev-font-semibold", children: "Portals:" }), _jsx(Stack, { gap: "tight", className: "dndev-ml-md", children: _jsxs(Text, { children: ["Count: ", domInfo.portals?.count || 0] }) })] })] }) }), _jsx(Card, { title: _jsxs(Stack, { direction: "row", align: "center", justify: "between", className: "dndev-w-full", children: [_jsx("span", { children: "Z-Index Stacking" }), _jsx(CopyToClipboard, { text: formatJSON(zIndexInfo), variant: BUTTON_VARIANT.GHOST, onCopy: () => toast('success', 'Z-index info copied') })] }), children: _jsxs(Stack, { children: [_jsxs("div", { children: [_jsx(Label, { className: "dndev-font-semibold", children: "CSS Variables:" }), _jsx(Stack, { gap: "tight", className: "dndev-ml-md dndev-font-mono dndev-text-sm", children: Object.entries(zIndexInfo.cssVariables || {}).map(([key, value]) => (_jsxs(Text, { children: [key, ": ", String(value) || 'not set'] }, key))) })] }), _jsxs("div", { children: [_jsx(Label, { className: "dndev-font-semibold", children: "Computed Values:" }), _jsx(Stack, { gap: "tight", className: "dndev-ml-md dndev-font-mono dndev-text-sm", children: Object.entries(zIndexInfo.computed || {}).map(([key, value]) => (_jsxs(Text, { children: [key, ": ", String(value)] }, key))) })] })] }) }), _jsx(Card, { title: _jsxs(Stack, { direction: "row", align: "center", justify: "between", className: "dndev-w-full", children: [_jsx("span", { children: "Full Store State" }), _jsx(CopyToClipboard, { text: formatJSON({
148
148
  hasConsented,
149
149
  categories,
150
150
  timestamp,
@@ -359,11 +359,11 @@ export const DesignTab = () => {
359
359
  colorRatio.secondary <= 40 &&
360
360
  colorRatio.accent >= 5 &&
361
361
  colorRatio.accent <= 20;
362
- return (_jsxs(Stack, { gap: "medium", style: { padding: 'var(--gap-md)' }, children: [_jsx(Accordion, { type: "single", collapsible: true, items: [
362
+ return (_jsxs(Stack, { style: { padding: 'var(--gap-md)' }, children: [_jsx(Accordion, { type: "single", collapsible: true, items: [
363
363
  {
364
364
  value: 'theme',
365
365
  trigger: _jsx("span", { children: "Theme Info" }),
366
- content: (_jsxs(Stack, { gap: "medium", children: [_jsx(Card, { title: "Theme", subtitle: currentTheme, children: _jsx(DescriptionList, { items: themeItems }) }), _jsx(Card, { title: "CSS Variables", subtitle: `${Object.keys(cssVars).length} variables`, children: _jsx(ScrollArea, { className: "dndev-max-h-48", children: _jsx(Stack, { gap: "tight", children: Object.entries(cssVars).map(([name, value]) => (_jsxs(Stack, { direction: "row", align: "center", justify: "between", gap: "tight", children: [_jsx(Text, { className: "dndev-font-mono dndev-text-xs", children: name }), _jsxs(Stack, { direction: "row", align: "center", gap: "tight", children: [_jsx("div", { style: {
366
+ content: (_jsxs(Stack, { children: [_jsx(Card, { title: "Theme", subtitle: currentTheme, children: _jsx(DescriptionList, { items: themeItems }) }), _jsx(Card, { title: "CSS Variables", subtitle: `${Object.keys(cssVars).length} variables`, children: _jsx(ScrollArea, { className: "dndev-max-h-48", children: _jsx(Stack, { gap: "tight", children: Object.entries(cssVars).map(([name, value]) => (_jsxs(Stack, { direction: "row", align: "center", justify: "between", gap: "tight", children: [_jsx(Text, { className: "dndev-font-mono dndev-text-xs", children: name }), _jsxs(Stack, { direction: "row", align: "center", gap: "tight", children: [_jsx("div", { style: {
367
367
  width: '1rem',
368
368
  height: '1rem',
369
369
  backgroundColor: `var(${name})`,
@@ -59,9 +59,9 @@ export const StoresTab = () => {
59
59
  }, [refreshStores]);
60
60
  const getDisplayName = (name) => STORE_NAMES[name] || name.replace(/-store$/, '').replace(/-/g, ' ');
61
61
  if (storeNames.length === 0) {
62
- return (_jsx(Stack, { gap: "medium", style: { padding: 'var(--gap-md)' }, children: _jsx(Card, { title: "Stores", subtitle: "No stores registered", children: _jsx(Text, { className: "dndev-text-muted-foreground", children: "globalThis._DNDEV_STORES_ is empty or not initialized." }) }) }));
62
+ return (_jsx(Stack, { style: { padding: 'var(--gap-md)' }, children: _jsx(Card, { title: "Stores", subtitle: "No stores registered", children: _jsx(Text, { className: "dndev-text-muted-foreground", children: "globalThis._DNDEV_STORES_ is empty or not initialized." }) }) }));
63
63
  }
64
- return (_jsx(Stack, { gap: "medium", style: { padding: 'var(--gap-md)' }, children: _jsx(Card, { title: _jsxs(Stack, { direction: "row", align: "center", justify: "between", className: "dndev-w-full", children: [_jsx("span", { children: "Stores" }), _jsxs(Stack, { direction: "row", align: "center", gap: "tight", children: [_jsx(Badge, { variant: BADGE_VARIANT.SECONDARY, children: storeNames.length }), _jsx(Button, { variant: BUTTON_VARIANT.GHOST, icon: RefreshCw, onClick: refreshStores, title: "Refresh stores" })] })] }), children: _jsx(Accordion, { type: "single", collapsible: true, items: storeNames.map((name) => {
64
+ return (_jsx(Stack, { style: { padding: 'var(--gap-md)' }, children: _jsx(Card, { title: _jsxs(Stack, { direction: "row", align: "center", justify: "between", className: "dndev-w-full", children: [_jsx("span", { children: "Stores" }), _jsxs(Stack, { direction: "row", align: "center", gap: "tight", children: [_jsx(Badge, { variant: BADGE_VARIANT.SECONDARY, children: storeNames.length }), _jsx(Button, { variant: BUTTON_VARIANT.GHOST, icon: RefreshCw, onClick: refreshStores, title: "Refresh stores" })] })] }), children: _jsx(Accordion, { type: "single", collapsible: true, items: storeNames.map((name) => {
65
65
  const state = storeStates[name];
66
66
  const hasError = state?._error;
67
67
  return {
@@ -49,7 +49,7 @@ function DnDevFooterComponent({ app = {} }) {
49
49
  : copyrightConfig;
50
50
  // Desktop/Wide: 2-zone layout [Copyright] | [Links + DoNotDev]
51
51
  if (isLaptopOrDesktop) {
52
- return (_jsx("footer", { role: "contentinfo", className: "footer", children: _jsxs(Stack, { direction: "row", align: "center", justify: "between", gap: "none", children: [showCopyright && (_jsx("div", { className: "dndev-flex dndev-justify-start", children: _jsx("span", { className: "footer-copyright", children: copyrightText }) })), _jsx("div", { className: "dndev-flex dndev-justify-end", children: _jsxs(Stack, { direction: "row", gap: "medium", align: "center", children: [links.map((link) => (_jsx(Link, { path: link.path, style: { fontSize: 'var(--font-size-xs)' }, children: maybeTranslate(t, link.label) }, link.path))), _jsx(FooterBranding, {})] }) })] }) }));
52
+ return (_jsx("footer", { role: "contentinfo", className: "footer", children: _jsxs(Stack, { direction: "row", align: "center", justify: "between", gap: "none", children: [showCopyright && (_jsx("div", { className: "dndev-flex dndev-justify-start", children: _jsx("span", { className: "footer-copyright", children: copyrightText }) })), _jsx("div", { className: "dndev-flex dndev-justify-end", children: _jsxs(Stack, { direction: "row", align: "center", children: [links.map((link) => (_jsx(Link, { path: link.path, style: { fontSize: 'var(--font-size-xs)' }, children: maybeTranslate(t, link.label) }, link.path))), _jsx(FooterBranding, {})] }) })] }) }));
53
53
  }
54
54
  // Mobile/Tablet: stacked layout
55
55
  return (_jsx("footer", { role: "contentinfo", className: "footer", children: _jsxs(Stack, { align: "center", gap: "tight", children: [showCopyright && (_jsx("span", { className: "footer-copyright", children: copyrightText })), _jsxs(Stack, { direction: "row", wrap: "wrap", gap: "tight", justify: "center", align: "center", children: [links.map((link) => (_jsx(Link, { path: link.path, style: { fontSize: 'var(--font-size-xs)' }, children: maybeTranslate(t, link.label) }, link.path))), _jsx(FooterBranding, {})] })] }) }));
@@ -36,7 +36,7 @@ function DnDevMergedBarComponent({ position, height, trigger, top, content, bott
36
36
  setOpen(false);
37
37
  }, [location.pathname]);
38
38
  // Build sheet content
39
- const sheetNode = (_jsxs(Stack, { direction: "column", gap: "medium", className: "merged-bar-sheet-content", children: [top && (_jsxs(_Fragment, { children: [top, _jsx(Separator, { variant: SEPARATOR_VARIANT.MUTED })] })), content && _jsx("div", { className: "merged-bar-sheet-scroll", children: content }), bottom && (_jsxs(_Fragment, { children: [_jsx(Separator, { variant: SEPARATOR_VARIANT.MUTED }), bottom] }))] }));
39
+ const sheetNode = (_jsxs(Stack, { direction: "column", className: "merged-bar-sheet-content", children: [top && (_jsxs(_Fragment, { children: [top, _jsx(Separator, { variant: SEPARATOR_VARIANT.MUTED })] })), content && _jsx("div", { className: "merged-bar-sheet-scroll", children: content }), bottom && (_jsxs(_Fragment, { children: [_jsx(Separator, { variant: SEPARATOR_VARIANT.MUTED }), bottom] }))] }));
40
40
  const triggerButton = (_jsx(Button, { variant: BUTTON_VARIANT.GHOST, icon: Icon, "aria-label": "Open navigation" }));
41
41
  return (_jsx("div", { className: "merged-bar", "data-position": position, children: _jsxs(Stack, { direction: "row", align: "center", justify: "between", className: "merged-bar-trigger", children: [trigger, _jsx(Sheet, { trigger: triggerButton, side: sheetSide, open: open, onOpenChange: setOpen, title: t('sheet.navigation', { defaultValue: 'Navigation' }), children: sheetNode })] }) }));
42
42
  }
@@ -64,7 +64,7 @@ export default function NotFoundPage() {
64
64
  const handleBack = () => {
65
65
  navigate('back');
66
66
  };
67
- return (_jsx(PageContainer, { variant: "docs", centered: true, children: _jsxs(Stack, { gap: "large", align: "center", justify: "center", children: [_jsxs(Stack, { gap: "medium", align: "center", children: [_jsx(Text, { level: "h1", style: {
67
+ return (_jsx(PageContainer, { variant: "docs", centered: true, children: _jsxs(Stack, { gap: "large", align: "center", justify: "center", children: [_jsxs(Stack, { align: "center", children: [_jsx(Text, { level: "h1", style: {
68
68
  fontSize: 'clamp(4rem, 12vw, 8rem)',
69
69
  fontWeight: 'var(--font-weight-bold)',
70
70
  lineHeight: 1,
@@ -95,10 +95,10 @@ export default function NotFoundPage() {
95
95
  overflow: 'hidden',
96
96
  textOverflow: 'ellipsis',
97
97
  border: '1px solid var(--border-hairline)',
98
- }, children: location.pathname }))] }), suggestedRoutes.length > 0 && (_jsxs(Stack, { gap: "medium", align: "center", children: [_jsx("p", { className: "dndev-text-base", style: {
98
+ }, children: location.pathname }))] }), suggestedRoutes.length > 0 && (_jsxs(Stack, { align: "center", children: [_jsx("p", { className: "dndev-text-base", style: {
99
99
  fontSize: 'var(--font-size-md)',
100
100
  fontWeight: 'var(--font-weight-semibold)',
101
101
  margin: 0,
102
102
  color: 'var(--muted-foreground)',
103
- }, children: t('errors.notFound.suggestions', 'You might be looking for:') }), _jsx(Stack, { direction: "row", wrap: "wrap", justify: "center", gap: "tight", children: suggestedRoutes.map((route) => (_jsx(Link, { path: route.path, replace: true, children: _jsx(Button, { variant: BUTTON_VARIANT.OUTLINE, icon: _jsx(Icon, { icon: route.icon, fallback: LinkIcon }), "aria-label": t('errors.notFound.navigateTo', `Navigate to ${route.label}`, { label: route.label }), children: route.label }) }, route.path))) })] })), _jsxs(Stack, { direction: "row", wrap: "wrap", justify: "center", gap: "medium", children: [_jsx(Link, { path: "/", replace: true, children: _jsx(Button, { variant: BUTTON_VARIANT.DEFAULT, icon: Home, "aria-label": t('errors.notFound.goHome', 'Go to home page'), children: t('errors.notFound.goHome', 'Go Home') }) }), _jsx(Button, { variant: BUTTON_VARIANT.OUTLINE, icon: ArrowLeft, onClick: handleBack, "aria-label": t('errors.notFound.goBack', 'Go back to previous page'), children: t('errors.notFound.goBack', 'Go Back') })] })] }) }));
103
+ }, children: t('errors.notFound.suggestions', 'You might be looking for:') }), _jsx(Stack, { direction: "row", wrap: "wrap", justify: "center", gap: "tight", children: suggestedRoutes.map((route) => (_jsx(Link, { path: route.path, replace: true, children: _jsx(Button, { variant: BUTTON_VARIANT.OUTLINE, icon: _jsx(Icon, { icon: route.icon, fallback: LinkIcon }), "aria-label": t('errors.notFound.navigateTo', `Navigate to ${route.label}`, { label: route.label }), children: route.label }) }, route.path))) })] })), _jsxs(Stack, { direction: "row", wrap: "wrap", justify: "center", children: [_jsx(Link, { path: "/", replace: true, children: _jsx(Button, { variant: BUTTON_VARIANT.DEFAULT, icon: Home, "aria-label": t('errors.notFound.goHome', 'Go to home page'), children: t('errors.notFound.goHome', 'Go Home') }) }), _jsx(Button, { variant: BUTTON_VARIANT.OUTLINE, icon: ArrowLeft, onClick: handleBack, "aria-label": t('errors.notFound.goBack', 'Go back to previous page'), children: t('errors.notFound.goBack', 'Go Back') })] })] }) }));
104
104
  }
@@ -50,14 +50,14 @@ export function AuthGuardFallback({ title, description, showBackButton = true, o
50
50
  maxWidth: '28rem',
51
51
  border: 'none',
52
52
  boxShadow: 'var(--shadow-xl)',
53
- }, title: _jsxs(Stack, { gap: "medium", children: [_jsx(Stack, { justify: "center", children: _jsx("div", { style: {
53
+ }, title: _jsxs(Stack, { children: [_jsx(Stack, { justify: "center", children: _jsx("div", { style: {
54
54
  borderRadius: '9999px',
55
55
  backgroundColor: 'color-mix(in oklab, var(--primary) 10%, transparent)',
56
56
  padding: 'var(--gap-md)',
57
57
  }, children: _jsx(Lock, { className: "dndev-size-touch", style: { color: 'var(--primary)' } }) }) }), _jsx("div", { style: {
58
58
  fontSize: 'var(--font-size-2xl)',
59
59
  fontWeight: 700,
60
- }, children: t('auth.fallback.title', 'Authentication Required') }), _jsx("p", { style: { color: 'var(--muted-foreground)' }, children: t('auth.fallback.description', 'Please sign in to access this page') })] }), children: _jsxs(Stack, { gap: "medium", children: [_jsxs(Stack, { gap: "large", children: [_jsx("div", { children: _jsx("p", { style: {
60
+ }, children: t('auth.fallback.title', 'Authentication Required') }), _jsx("p", { style: { color: 'var(--muted-foreground)' }, children: t('auth.fallback.description', 'Please sign in to access this page') })] }), children: _jsxs(Stack, { children: [_jsxs(Stack, { gap: "large", children: [_jsx("div", { children: _jsx("p", { style: {
61
61
  fontSize: 'var(--font-size-sm)',
62
62
  color: 'var(--muted-foreground)',
63
63
  }, children: t('auth.fallback.chooseProvider') }) }), _jsx(Suspense, { fallback: _jsx("div", { children: "Loading providers..." }), children: _jsx(MultipleAuthProviders, { layout: "vertical", spacing: "tight", fullWidth: true, ariaLabel: t('auth.fallback.authOptions') }) })] }), showBackButton && (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx("div", { children: _jsx(Button, { onClick: handleBack, className: "dndev-gap-sm", icon: ArrowLeft, children: t('common.back') }) })] })), _jsxs(Stack, { gap: "tight", style: {
@@ -3143,7 +3143,6 @@ em {
3143
3143
  flex-direction: row;
3144
3144
  gap: var(--gap-md);
3145
3145
  justify-content: center;
3146
-
3147
3146
  }
3148
3147
 
3149
3148
  .dndev-cta-actions .dndev-interactive {
@@ -7531,6 +7530,10 @@ input[type='number'] {
7531
7530
  font-weight: var(--font-weight-bold);
7532
7531
  }
7533
7532
 
7533
+ .dndev-text-base[data-italic] {
7534
+ font-style: italic;
7535
+ }
7536
+
7534
7537
  /* packages/components/src/atomic/Toaster/Toaster.css */
7535
7538
 
7536
7539
  .dndev-toast-viewport {
@@ -7730,8 +7733,9 @@ input[type='number'] {
7730
7733
 
7731
7734
  .dndev-toggle-group {
7732
7735
  display: inline-flex;
7736
+ flex-wrap: wrap;
7733
7737
  align-items: center;
7734
- gap: 0;
7738
+ gap: var(--gap-sm);
7735
7739
  padding: 0.125rem;
7736
7740
  border-radius: var(--radius-interactive);
7737
7741
  background-color: var(--muted);
@@ -7927,12 +7931,16 @@ input[type='number'] {
7927
7931
 
7928
7932
  .dndev-video-dialog {
7929
7933
  max-width: 90vw;
7930
- max-height: 90vh;
7931
7934
  }
7932
7935
 
7933
7936
  .dndev-video-dialog .dndev-modal-body {
7934
7937
  padding: 0;
7938
+ overflow: hidden;
7939
+ }
7940
+
7941
+ .dndev-video-dialog .dndev-video-frame {
7935
7942
  aspect-ratio: 16/9;
7943
+ max-height: calc(90vh - 5rem);
7936
7944
  }
7937
7945
 
7938
7946
  /* 6. Animation keyframes */
@@ -9076,6 +9084,8 @@ h4[data-variant='code'] {
9076
9084
  /* Narrow content (mobile-first PWA, app-like single column) - single source of truth */
9077
9085
  --narrow-content-max: 37.5rem;
9078
9086
  /* 600px */
9087
+ --narrow-form-max: 30rem;
9088
+ /* 480px - inner form/input width within narrow layout */
9079
9089
 
9080
9090
  /* Content Area Calculations */
9081
9091
  /* Header content area (excludes sidebar on some presets) */
@@ -9186,7 +9196,8 @@ main[role='main'][data-routing-animation='fade'] {
9186
9196
  /* Slide animation - keyframes handle opacity 0→1 */
9187
9197
 
9188
9198
  main[role='main'][data-routing-animation='slide'] {
9189
- animation: routeSlideIn var(--routing-default-duration, 300ms) ease-in forwards;
9199
+ animation: routeSlideIn var(--routing-default-duration, 300ms) ease-in
9200
+ forwards;
9190
9201
  }
9191
9202
 
9192
9203
  /* No animation - already visible by default, explicit for clarity */
@@ -9200,11 +9211,15 @@ main[role='main'][data-routing-animation='none'] {
9200
9211
 
9201
9212
  @media (width < 768px) {
9202
9213
  main[role='main'][data-routing-animation='fade'] {
9203
- animation: routeFadeIn var(--routing-mobile-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9214
+ animation: routeFadeIn
9215
+ var(--routing-mobile-duration, var(--routing-default-duration, 300ms))
9216
+ ease-in forwards;
9204
9217
  }
9205
9218
 
9206
9219
  main[role='main'][data-routing-animation='slide'] {
9207
- animation: routeSlideIn var(--routing-mobile-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9220
+ animation: routeSlideIn
9221
+ var(--routing-mobile-duration, var(--routing-default-duration, 300ms))
9222
+ ease-in forwards;
9208
9223
  }
9209
9224
  }
9210
9225
 
@@ -9212,11 +9227,15 @@ main[role='main'][data-routing-animation='none'] {
9212
9227
 
9213
9228
  @media (width >=768px) and (width <=1023px) {
9214
9229
  main[role='main'][data-routing-animation='fade'] {
9215
- animation: routeFadeIn var(--routing-tablet-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9230
+ animation: routeFadeIn
9231
+ var(--routing-tablet-duration, var(--routing-default-duration, 300ms))
9232
+ ease-in forwards;
9216
9233
  }
9217
9234
 
9218
9235
  main[role='main'][data-routing-animation='slide'] {
9219
- animation: routeSlideIn var(--routing-tablet-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9236
+ animation: routeSlideIn
9237
+ var(--routing-tablet-duration, var(--routing-default-duration, 300ms))
9238
+ ease-in forwards;
9220
9239
  }
9221
9240
  }
9222
9241
 
@@ -9224,11 +9243,15 @@ main[role='main'][data-routing-animation='none'] {
9224
9243
 
9225
9244
  @media (width >=1024px) and (width <=1439px) {
9226
9245
  main[role='main'][data-routing-animation='fade'] {
9227
- animation: routeFadeIn var(--routing-desktop-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9246
+ animation: routeFadeIn
9247
+ var(--routing-desktop-duration, var(--routing-default-duration, 300ms))
9248
+ ease-in forwards;
9228
9249
  }
9229
9250
 
9230
9251
  main[role='main'][data-routing-animation='slide'] {
9231
- animation: routeSlideIn var(--routing-desktop-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9252
+ animation: routeSlideIn
9253
+ var(--routing-desktop-duration, var(--routing-default-duration, 300ms))
9254
+ ease-in forwards;
9232
9255
  }
9233
9256
  }
9234
9257
 
@@ -9236,11 +9259,15 @@ main[role='main'][data-routing-animation='none'] {
9236
9259
 
9237
9260
  @media (width >=1440px) {
9238
9261
  main[role='main'][data-routing-animation='fade'] {
9239
- animation: routeFadeIn var(--routing-wide-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9262
+ animation: routeFadeIn
9263
+ var(--routing-wide-duration, var(--routing-default-duration, 300ms))
9264
+ ease-in forwards;
9240
9265
  }
9241
9266
 
9242
9267
  main[role='main'][data-routing-animation='slide'] {
9243
- animation: routeSlideIn var(--routing-wide-duration, var(--routing-default-duration, 300ms)) ease-in forwards;
9268
+ animation: routeSlideIn
9269
+ var(--routing-wide-duration, var(--routing-default-duration, 300ms))
9270
+ ease-in forwards;
9244
9271
  }
9245
9272
  }
9246
9273
 
@@ -9264,7 +9291,6 @@ main[role='main'][data-routing-animation='none'] {
9264
9291
  /* Mobile/Tablet: Hide sidebars - WCAG & Lighthouse best practices */
9265
9292
 
9266
9293
  @media (width <=1023px) {
9267
-
9268
9294
  .dndev-layout aside[role='navigation'].sidebar,
9269
9295
  aside[role='navigation'].sidebar {
9270
9296
  display: none !important;
@@ -9288,8 +9314,10 @@ main[role='main'][data-routing-animation='none'] {
9288
9314
  'header header'
9289
9315
  'sidebar main'
9290
9316
  'footer footer';
9291
- grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height),
9292
- auto);
9317
+ grid-template-rows: var(--header-height) 1fr minmax(
9318
+ var(--footer-height),
9319
+ auto
9320
+ );
9293
9321
  grid-template-columns: var(--sidebar-width) 1fr;
9294
9322
  }
9295
9323
 
@@ -9303,7 +9331,10 @@ main[role='main'][data-routing-animation='none'] {
9303
9331
  grid-template-rows: var(--header-height) 1fr auto;
9304
9332
  }
9305
9333
 
9306
- .dndev-layout[data-footer-mode='scroll'] header[role='banner'] { position: sticky; top: 0; }
9334
+ .dndev-layout[data-footer-mode='scroll'] header[role='banner'] {
9335
+ position: sticky;
9336
+ top: 0;
9337
+ }
9307
9338
 
9308
9339
  .dndev-layout[data-footer-mode='scroll'] aside.sidebar[role='navigation'] {
9309
9340
  position: sticky;
@@ -9312,14 +9343,20 @@ main[role='main'][data-routing-animation='none'] {
9312
9343
  align-self: start;
9313
9344
  }
9314
9345
 
9315
- .dndev-layout[data-footer-mode='scroll'] main[role='main'] { overflow-y: visible; overflow-x: hidden; }
9346
+ .dndev-layout[data-footer-mode='scroll'] main[role='main'] {
9347
+ overflow-y: visible;
9348
+ overflow-x: hidden;
9349
+ }
9316
9350
 
9317
9351
  .dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo'] {
9318
9352
  grid-column: 2 / -1;
9319
9353
  height: auto;
9320
9354
  }
9321
9355
 
9322
- :is(.dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo']) > * { height: auto; min-height: var(--footer-height); }
9356
+ :is(.dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo']) > * {
9357
+ height: auto;
9358
+ min-height: var(--footer-height);
9359
+ }
9323
9360
 
9324
9361
  /* Mobile: footer scroll mode ON by default (same rules) */
9325
9362
 
@@ -9330,15 +9367,24 @@ main[role='main'][data-routing-animation='none'] {
9330
9367
  grid-template-rows: var(--header-height) 1fr auto;
9331
9368
  }
9332
9369
 
9333
- .dndev-layout header[role='banner'] { position: sticky; top: 0; }
9370
+ .dndev-layout header[role='banner'] {
9371
+ position: sticky;
9372
+ top: 0;
9373
+ }
9334
9374
 
9335
- .dndev-layout main[role='main'] { overflow-y: visible; overflow-x: hidden; }
9375
+ .dndev-layout main[role='main'] {
9376
+ overflow-y: visible;
9377
+ overflow-x: hidden;
9378
+ }
9336
9379
 
9337
9380
  .dndev-layout footer[role='contentinfo'] {
9338
9381
  height: auto;
9339
9382
  }
9340
9383
 
9341
- :is(.dndev-layout footer[role='contentinfo']) > * { height: auto; min-height: var(--footer-height); }
9384
+ :is(.dndev-layout footer[role='contentinfo']) > * {
9385
+ height: auto;
9386
+ min-height: var(--footer-height);
9387
+ }
9342
9388
  }
9343
9389
 
9344
9390
  /* Presets with no footer at all */
@@ -9506,7 +9552,8 @@ aside[role='navigation'].sidebar .dndev-sidebar-resize-handle:focus-visible {
9506
9552
 
9507
9553
  /* Active drag state */
9508
9554
 
9509
- aside[role='navigation'].sidebar[data-dragging='true'] .dndev-sidebar-resize-handle {
9555
+ aside[role='navigation'].sidebar[data-dragging='true']
9556
+ .dndev-sidebar-resize-handle {
9510
9557
  background: var(--primary);
9511
9558
  }
9512
9559
 
@@ -9522,7 +9569,10 @@ aside[role='navigation'].sidebar[data-dragging='true'] .dndev-sidebar-resize-han
9522
9569
  /* Landing: AUTO display mode - compact below wide breakpoint (< 1440px) */
9523
9570
 
9524
9571
  @media (width < 1440px) {
9525
- [data-layout='landing'] header[role='banner'] [data-display='auto'] .dndev-interactive-label {
9572
+ [data-layout='landing']
9573
+ header[role='banner']
9574
+ [data-display='auto']
9575
+ .dndev-interactive-label {
9526
9576
  display: none;
9527
9577
  }
9528
9578
  }
@@ -9695,7 +9745,6 @@ main[role='main'] {
9695
9745
  contain: layout style;
9696
9746
 
9697
9747
  /* First child after breadcrumbs grows to fill space */
9698
-
9699
9748
  }
9700
9749
 
9701
9750
  main[role='main'] > *:not(.breadcrumbs-container):first-of-type,main[role='main'] > .breadcrumbs-container + * {
@@ -9823,7 +9872,6 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9823
9872
  /* Mobile (<1024px): Show merged-bar, hide zones */
9824
9873
 
9825
9874
  @media (width <=1023px) {
9826
-
9827
9875
  /* Presets with mergedBar: top (admin, moolti, game, docs) */
9828
9876
  [data-layout='admin'] .merged-bar[data-position='top'],
9829
9877
  [data-layout='moolti'] .merged-bar[data-position='top'],
@@ -10246,10 +10294,10 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10246
10294
 
10247
10295
  /* Breakthrough pattern: only applies inside PageContainer */
10248
10296
 
10249
- .dndev-container>.dndev-section-full-width,
10250
- .dndev-container>.dndev-cta,
10251
- .dndev-container>.dndev-hero-section,
10252
- .dndev-container>.dndev-tech-bento {
10297
+ .dndev-container > .dndev-section-full-width,
10298
+ .dndev-container > .dndev-cta,
10299
+ .dndev-container > .dndev-hero-section,
10300
+ .dndev-container > .dndev-tech-bento {
10253
10301
  /* Break out of PageContainer padding and max-width constraint */
10254
10302
  /* Account for sidebar: --sidebar-width is 0px for presets without sidebar */
10255
10303
  width: calc(100dvw - var(--sidebar-width));
@@ -10290,7 +10338,16 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10290
10338
  width: 100%;
10291
10339
  }
10292
10340
 
10293
- /* ScrollArea wrapper */
10341
+ /* Scroll wrapper - stretches to full width so scrollbar is at viewport edge */
10342
+
10343
+ .dndev-game-container__scroll-wrapper {
10344
+ flex: 1 1 0;
10345
+ min-height: 0;
10346
+ width: 100%;
10347
+ align-self: stretch;
10348
+ }
10349
+
10350
+ /* ScrollArea - fills wrapper */
10294
10351
 
10295
10352
  .dndev-game-container__scroll {
10296
10353
  width: 100%;
@@ -10329,20 +10386,16 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10329
10386
  justify-content: space-between;
10330
10387
  }
10331
10388
 
10332
- /* Narrow content wrapper - constrained by --narrow-content-max (mobile-first PWA) */
10389
+ /* Narrow content wrapper - constrained by --narrow-content-max, centered inside scroll */
10390
+
10391
+ /* height: 100% fills the scroll viewport so children can use percentage heights.
10392
+ Content taller than viewport still scrolls — overflow propagates to the scroll container. */
10333
10393
 
10334
10394
  .dndev-game-container__content-narrow {
10335
10395
  width: 100%;
10336
10396
  max-width: var(--narrow-content-max);
10337
10397
  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%;
10398
+ height: 100%;
10346
10399
  }
10347
10400
 
10348
10401
  /* CTA Zone - Fixed at bottom; safe area for notched devices */
@@ -10357,6 +10410,13 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10357
10410
 
10358
10411
  /* CTA Button */
10359
10412
 
10413
+ .dndev-game-container__cta-buttons {
10414
+ display: grid;
10415
+ grid-template-columns: repeat(auto-fit, minmax(0, 1fr));
10416
+ gap: var(--gap-sm);
10417
+ width: 100%;
10418
+ }
10419
+
10360
10420
  .dndev-game-container__cta-button {
10361
10421
  height: var(--touch-target);
10362
10422
  width: 100%;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@donotdev/ui",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "license": "SEE LICENSE IN LICENSE.md",