@donotdev/ui 0.0.15 → 0.0.16
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.
- package/dist/components/common/TechBento.d.ts.map +1 -1
- package/dist/components/common/TechBento.js +1 -1
- package/dist/components/layout/components/header/HeaderNavigation.d.ts.map +1 -1
- package/dist/components/layout/components/header/HeaderNavigation.js +2 -2
- package/dist/crud/components/CrudCardLink.d.ts.map +1 -1
- package/dist/crud/components/EntityCardList.d.ts.map +1 -1
- package/dist/crud/components/EntityCardList.js +8 -22
- package/dist/crud/components/EntityList.d.ts.map +1 -1
- package/dist/crud/components/EntityList.js +7 -43
- package/dist/dndev.css +86 -63
- package/dist/index.js +4 -4
- package/dist/internal/devtools/components/DesignTab.d.ts.map +1 -1
- package/dist/internal/layout/components/AutoMetaTags.d.ts.map +1 -1
- package/dist/internal/layout/components/AutoMetaTags.js +2 -9
- package/dist/internal/layout/components/FontPreloadLinks.d.ts.map +1 -1
- package/dist/internal/layout/components/FontPreloadLinks.js +1 -0
- package/dist/internal/layout/components/footer/useLegalLinks.d.ts.map +1 -1
- package/dist/routing/GoToInput.d.ts.map +1 -1
- package/dist/routing/GoToInput.js +2 -1
- package/dist/routing/Link.d.ts.map +1 -1
- package/dist/routing/useRouteDiscovery.d.ts.map +1 -1
- package/dist/styles/index.css +86 -63
- package/dist/utils/sanitizeSvg.d.ts.map +1 -1
- package/dist/utils/useFormStoreSafe.d.ts.map +1 -1
- package/dist/vite-routing/AppRoutes.d.ts.map +1 -1
- package/dist/vite-routing/AppRoutes.js +1 -1
- package/package.json +1 -1
- package/dist/routing/hooks/useFormNavigationBlocker.d.ts +0 -14
- package/dist/routing/hooks/useFormNavigationBlocker.d.ts.map +0 -1
- package/dist/routing/hooks/useFormNavigationBlocker.js +0 -42
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DesignTab.d.ts","sourceRoot":"","sources":["../../../../src/internal/devtools/components/DesignTab.tsx"],"names":[],"mappings":"AA+CA,eAAO,MAAM,SAAS,+
|
|
1
|
+
{"version":3,"file":"DesignTab.d.ts","sourceRoot":"","sources":["../../../../src/internal/devtools/components/DesignTab.tsx"],"names":[],"mappings":"AA+CA,eAAO,MAAM,SAAS,+CAizBrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutoMetaTags.d.ts","sourceRoot":"","sources":["../../../../src/internal/layout/components/AutoMetaTags.tsx"],"names":[],"mappings":"AA0DA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAyE3C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"AutoMetaTags.d.ts","sourceRoot":"","sources":["../../../../src/internal/layout/components/AutoMetaTags.tsx"],"names":[],"mappings":"AA0DA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAyE3C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,EAAE,aAyM1B,CAAC;AAEF;;;GAGG;AAEH,eAAe,YAAY,CAAC"}
|
|
@@ -130,7 +130,7 @@ export const AutoMetaTags = () => {
|
|
|
130
130
|
const metaData = useMemo(() => {
|
|
131
131
|
if (!seoConfig)
|
|
132
132
|
return null;
|
|
133
|
-
const { defaultNamespace = 'home', defaultImage
|
|
133
|
+
const { defaultNamespace = 'home', defaultImage } = seoConfig;
|
|
134
134
|
// Construct absolute URL for canonical link
|
|
135
135
|
const currentUrl = `${baseUrl}${location.pathname}`;
|
|
136
136
|
const ns = routeMeta.ns || defaultNamespace;
|
|
@@ -169,14 +169,7 @@ export const AutoMetaTags = () => {
|
|
|
169
169
|
publishDate: routeMeta.publishDate,
|
|
170
170
|
modifiedDate: routeMeta.modifiedDate,
|
|
171
171
|
};
|
|
172
|
-
}, [
|
|
173
|
-
location.pathname,
|
|
174
|
-
routeMeta,
|
|
175
|
-
siteName,
|
|
176
|
-
baseUrl,
|
|
177
|
-
seoConfig,
|
|
178
|
-
t,
|
|
179
|
-
]);
|
|
172
|
+
}, [location.pathname, routeMeta, siteName, baseUrl, seoConfig, t]);
|
|
180
173
|
// Return null if SEO is disabled — after all hooks have been called
|
|
181
174
|
if (!seoConfig || !metaData)
|
|
182
175
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FontPreloadLinks.d.ts","sourceRoot":"","sources":["../../../../src/internal/layout/components/FontPreloadLinks.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FontPreloadLinks.d.ts","sourceRoot":"","sources":["../../../../src/internal/layout/components/FontPreloadLinks.tsx"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AASvC;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,SAAS,CAAC,CAyB3D;AAED,eAAe,gBAAgB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// packages/ui/src/internal/layout/components/FontPreloadLinks.tsx
|
|
2
3
|
/**
|
|
3
4
|
* @fileoverview FontPreloadLinks - Server-only component for Next.js
|
|
4
5
|
* @description Reads public/dndev-font-preloads.json (written at build by FontPreloadWebpackPlugin) and renders preload link tags for Lighthouse-friendly LCP. Include in root layout so initial HTML contains the links.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLegalLinks.d.ts","sourceRoot":"","sources":["../../../../../src/internal/layout/components/footer/useLegalLinks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAQD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"useLegalLinks.d.ts","sourceRoot":"","sources":["../../../../../src/internal/layout/components/footer/useLegalLinks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAQD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GACxB,cAAc,WAAW,CAAC,QAAQ,CAAC,KAClC,eAAe,EAQjB,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,aAAa,iBAZV,WAAW,CAAC,QAAQ,CAAC,KAClC,eAAe,EAWwB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoToInput.d.ts","sourceRoot":"","sources":["../../src/routing/GoToInput.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GoToInput.d.ts","sourceRoot":"","sources":["../../src/routing/GoToInput.tsx"],"names":[],"mappings":"AAgCA,QAAA,MAAM,SAAS,+CAwEd,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -17,7 +17,8 @@ import { useTranslation } from '@donotdev/core';
|
|
|
17
17
|
* Navigation input - typeable search that syncs with command dialog
|
|
18
18
|
*/
|
|
19
19
|
/** Detect macOS/iOS for keyboard shortcut label (defaults to ⌘K during SSR) */
|
|
20
|
-
const isMac = typeof navigator !== 'undefined' &&
|
|
20
|
+
const isMac = typeof navigator !== 'undefined' &&
|
|
21
|
+
/Mac|iPhone|iPad/.test(navigator.userAgent);
|
|
21
22
|
const GoToInput = () => {
|
|
22
23
|
const { t } = useTranslation('dndev');
|
|
23
24
|
const [value, setValue] = useState('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/routing/Link.tsx"],"names":[],"mappings":"AAaA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,aAAa,EAElB,KAAK,oBAAoB,EAC1B,MAAM,OAAO,CAAC;AASf;;;;;;GAMG;AACH,MAAM,WAAW,SAAU,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,EAAE,aAAa,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/routing/Link.tsx"],"names":[],"mappings":"AAaA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,aAAa,EAElB,KAAK,oBAAoB,EAC1B,MAAM,OAAO,CAAC;AASf;;;;;;GAMG;AACH,MAAM,WAAW,SAAU,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,EAAE,aAAa,CAAC,SAAS,CAuIzC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRouteDiscovery.d.ts","sourceRoot":"","sources":["../../src/routing/useRouteDiscovery.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"useRouteDiscovery.d.ts","sourceRoot":"","sources":["../../src/routing/useRouteDiscovery.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAEV,eAAe,IAAI,mBAAmB,EACvC,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,gCAAgC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,IAAI,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACnB,qCAAqC;IACrC,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,EAAE,CA2BhD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,mBAAmB,IAAI,UAAU,EAAE,CAoBlD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,6BAA6B,IAAI,eAAe,EAAE,CAcjE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,gBAK3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,gBAAgB;;;;;;SAQ/B"}
|
package/dist/styles/index.css
CHANGED
|
@@ -3418,80 +3418,120 @@ em {
|
|
|
3418
3418
|
|
|
3419
3419
|
/* packages/components/src/atomic/Combobox/Combobox.css */
|
|
3420
3420
|
|
|
3421
|
-
|
|
3422
|
-
|
|
3423
|
-
|
|
3424
|
-
align-items: center;
|
|
3425
|
-
width: 100%;
|
|
3426
|
-
text-align: start;
|
|
3427
|
-
}
|
|
3421
|
+
/* ──────────────────────────────────────────────────
|
|
3422
|
+
Trailing icon group — flex row inside the input area
|
|
3423
|
+
────────────────────────────────────────────────── */
|
|
3428
3424
|
|
|
3429
|
-
.dndev-combobox-
|
|
3425
|
+
.dndev-combobox-trailing {
|
|
3426
|
+
position: absolute;
|
|
3427
|
+
inset-inline-end: var(--gap-sm);
|
|
3428
|
+
top: 0;
|
|
3429
|
+
height: 100%;
|
|
3430
3430
|
display: flex;
|
|
3431
|
-
justify-content: space-between;
|
|
3432
3431
|
align-items: center;
|
|
3433
|
-
|
|
3432
|
+
gap: var(--gap-tight, 4px);
|
|
3433
|
+
z-index: 1;
|
|
3434
|
+
pointer-events: none; /* pass clicks through to input by default */
|
|
3434
3435
|
}
|
|
3435
3436
|
|
|
3436
|
-
.
|
|
3437
|
-
|
|
3438
|
-
}
|
|
3437
|
+
/* Input padding: reserve space for trailing content.
|
|
3438
|
+
--combobox-pad-end is set as an inline CSS variable on .dndev-combobox-wrapper. */
|
|
3439
3439
|
|
|
3440
|
-
.dndev-combobox-
|
|
3441
|
-
|
|
3442
|
-
align-items: center;
|
|
3443
|
-
gap: var(--gap-tight);
|
|
3444
|
-
margin-inline-start: auto;
|
|
3440
|
+
.dndev-combobox-wrapper .dndev-input {
|
|
3441
|
+
padding-inline-end: var(--combobox-pad-end);
|
|
3445
3442
|
}
|
|
3446
3443
|
|
|
3447
|
-
|
|
3444
|
+
/* Action buttons (create "+", clear "X") */
|
|
3445
|
+
|
|
3446
|
+
.dndev-combobox-action-btn {
|
|
3447
|
+
all: unset;
|
|
3448
3448
|
display: flex;
|
|
3449
3449
|
align-items: center;
|
|
3450
3450
|
justify-content: center;
|
|
3451
|
+
width: var(--icon-md);
|
|
3452
|
+
height: var(--icon-md);
|
|
3453
|
+
border-radius: var(--radius-interactive, var(--radius-sm, 4px));
|
|
3451
3454
|
cursor: pointer;
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
|
|
3455
|
+
pointer-events: auto; /* re-enable clicks on buttons */
|
|
3456
|
+
color: var(--muted-foreground);
|
|
3457
|
+
opacity: var(--opacity-muted, 0.5);
|
|
3458
|
+
transition:
|
|
3459
|
+
opacity var(--dur-fast) var(--ease-in-out),
|
|
3460
|
+
background-color var(--dur-fast) var(--ease-in-out);
|
|
3457
3461
|
}
|
|
3458
3462
|
|
|
3459
|
-
.dndev-combobox-
|
|
3460
|
-
|
|
3463
|
+
.dndev-combobox-action-btn:hover {
|
|
3464
|
+
opacity: 1;
|
|
3465
|
+
background-color: var(--accent, rgba(0, 0, 0, 0.06));
|
|
3466
|
+
}
|
|
3467
|
+
|
|
3468
|
+
.dndev-combobox-action-btn:focus-visible {
|
|
3461
3469
|
opacity: 1;
|
|
3462
3470
|
outline: none;
|
|
3471
|
+
box-shadow:
|
|
3472
|
+
0 0 0 2px var(--ring),
|
|
3473
|
+
0 0 0 4px rgb(from var(--ring) r g b / 0.2);
|
|
3463
3474
|
}
|
|
3464
3475
|
|
|
3465
|
-
.dndev-combobox-
|
|
3466
|
-
|
|
3467
|
-
|
|
3476
|
+
.dndev-combobox-action-btn:active {
|
|
3477
|
+
opacity: 0.8;
|
|
3478
|
+
}
|
|
3479
|
+
|
|
3480
|
+
.dndev-combobox-action-btn svg {
|
|
3481
|
+
width: var(--size-icon-sm, 16px);
|
|
3482
|
+
height: var(--size-icon-sm, 16px);
|
|
3483
|
+
}
|
|
3484
|
+
|
|
3485
|
+
/* Create button accent color */
|
|
3486
|
+
|
|
3487
|
+
.dndev-combobox-action-btn--create {
|
|
3488
|
+
color: var(--primary);
|
|
3489
|
+
}
|
|
3490
|
+
|
|
3491
|
+
/* Clear button */
|
|
3492
|
+
|
|
3493
|
+
.dndev-combobox-action-btn--clear {
|
|
3494
|
+
color: var(--muted-foreground);
|
|
3468
3495
|
}
|
|
3469
3496
|
|
|
3497
|
+
/* Chevron indicator (non-interactive, just visual) */
|
|
3498
|
+
|
|
3470
3499
|
.dndev-combobox-chevron {
|
|
3471
3500
|
width: var(--icon-md);
|
|
3472
3501
|
height: var(--icon-md);
|
|
3502
|
+
display: flex;
|
|
3503
|
+
align-items: center;
|
|
3504
|
+
justify-content: center;
|
|
3505
|
+
color: var(--muted-foreground);
|
|
3473
3506
|
opacity: var(--opacity-muted);
|
|
3507
|
+
pointer-events: none;
|
|
3508
|
+
}
|
|
3509
|
+
|
|
3510
|
+
.dndev-combobox-chevron svg {
|
|
3511
|
+
width: var(--icon-md);
|
|
3512
|
+
height: var(--icon-md);
|
|
3474
3513
|
transition: transform var(--dur-fast) var(--ease-in-out);
|
|
3475
3514
|
}
|
|
3476
3515
|
|
|
3477
|
-
|
|
3516
|
+
.dndev-combobox-open .dndev-combobox-chevron svg {
|
|
3478
3517
|
transform: rotate(180deg);
|
|
3479
3518
|
}
|
|
3480
3519
|
|
|
3481
|
-
|
|
3520
|
+
/* Spinner replaces chevron */
|
|
3521
|
+
|
|
3522
|
+
.dndev-combobox-spinner {
|
|
3482
3523
|
display: flex;
|
|
3483
3524
|
align-items: center;
|
|
3484
|
-
|
|
3485
|
-
}
|
|
3486
|
-
|
|
3487
|
-
.dndev-combobox-loading-spinner {
|
|
3525
|
+
justify-content: center;
|
|
3488
3526
|
width: var(--icon-md);
|
|
3489
3527
|
height: var(--icon-md);
|
|
3490
|
-
|
|
3491
|
-
border: 2px solid currentColor;
|
|
3492
|
-
border-top-color: transparent;
|
|
3528
|
+
pointer-events: none;
|
|
3493
3529
|
}
|
|
3494
3530
|
|
|
3531
|
+
/* ──────────────────────────────────────────────────
|
|
3532
|
+
Dropdown content
|
|
3533
|
+
────────────────────────────────────────────────── */
|
|
3534
|
+
|
|
3495
3535
|
.dndev-combobox-content {
|
|
3496
3536
|
width: var(--radix-popover-trigger-width);
|
|
3497
3537
|
min-width: var(--radix-popover-trigger-width);
|
|
@@ -3501,15 +3541,6 @@ em {
|
|
|
3501
3541
|
padding: 0;
|
|
3502
3542
|
}
|
|
3503
3543
|
|
|
3504
|
-
.dndev-combobox-search-container {
|
|
3505
|
-
padding: var(--gap-sm);
|
|
3506
|
-
border-bottom: var(--border-width) solid var(--line-2);
|
|
3507
|
-
}
|
|
3508
|
-
|
|
3509
|
-
.dndev-combobox-search-input {
|
|
3510
|
-
width: 100%;
|
|
3511
|
-
}
|
|
3512
|
-
|
|
3513
3544
|
.dndev-combobox-option {
|
|
3514
3545
|
all: unset;
|
|
3515
3546
|
display: flex;
|
|
@@ -3580,20 +3611,6 @@ em {
|
|
|
3580
3611
|
flex-shrink: 0;
|
|
3581
3612
|
}
|
|
3582
3613
|
|
|
3583
|
-
.dndev-combobox-create-btn:hover {
|
|
3584
|
-
opacity: 0.8;
|
|
3585
|
-
}
|
|
3586
|
-
|
|
3587
|
-
.dndev-combobox-open .dndev-input-with-trailing-icon .dndev-input-icon svg,
|
|
3588
|
-
.dndev-combobox-open .dndev-input-with-trailing-icon .dndev-input-icon > * {
|
|
3589
|
-
transform: rotate(180deg);
|
|
3590
|
-
}
|
|
3591
|
-
|
|
3592
|
-
.dndev-input-with-trailing-icon .dndev-input-icon svg,
|
|
3593
|
-
.dndev-input-with-trailing-icon .dndev-input-icon > * {
|
|
3594
|
-
transition: transform var(--dur-fast) var(--ease-in-out);
|
|
3595
|
-
}
|
|
3596
|
-
|
|
3597
3614
|
/* packages/components/src/atomic/DualCard/DualCard.css */
|
|
3598
3615
|
|
|
3599
3616
|
.dndev-dual-card {
|
|
@@ -9494,7 +9511,10 @@ main[role='main'][data-routing-animation='none'] {
|
|
|
9494
9511
|
max-height: none;
|
|
9495
9512
|
overflow-y: visible;
|
|
9496
9513
|
overflow-x: hidden;
|
|
9497
|
-
grid-template-rows: var(--header-height) minmax(
|
|
9514
|
+
grid-template-rows: var(--header-height) minmax(
|
|
9515
|
+
calc(100dvh - var(--header-height)),
|
|
9516
|
+
auto
|
|
9517
|
+
) auto;
|
|
9498
9518
|
}
|
|
9499
9519
|
|
|
9500
9520
|
.dndev-layout[data-footer-mode='scroll'] header[role='banner'] {
|
|
@@ -9535,7 +9555,10 @@ main[role='main'][data-routing-animation='none'] {
|
|
|
9535
9555
|
max-height: none;
|
|
9536
9556
|
overflow-y: visible;
|
|
9537
9557
|
overflow-x: hidden;
|
|
9538
|
-
grid-template-rows: var(--header-height) minmax(
|
|
9558
|
+
grid-template-rows: var(--header-height) minmax(
|
|
9559
|
+
calc(100dvh - var(--header-height)),
|
|
9560
|
+
auto
|
|
9561
|
+
) auto;
|
|
9539
9562
|
}
|
|
9540
9563
|
|
|
9541
9564
|
.dndev-layout header[role='banner'] {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitizeSvg.d.ts","sourceRoot":"","sources":["../../src/utils/sanitizeSvg.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sanitizeSvg.d.ts","sourceRoot":"","sources":["../../src/utils/sanitizeSvg.ts"],"names":[],"mappings":"AAiCA;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormStoreSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useFormStoreSafe.ts"],"names":[],"mappings":"AAwBA;;;GAGG;AACH,QAAA,MAAM,yBAAyB;;;;;;;;;;mCAYP,MAAM,YAAY,OAAO;;oCAElB,MAAM,EAAE;;;;;;CAO7B,CAAC;AAEX,sFAAsF;AACtF,KAAK,aAAa,GAAG,OAAO,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"useFormStoreSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useFormStoreSafe.ts"],"names":[],"mappings":"AAwBA;;;GAGG;AACH,QAAA,MAAM,yBAAyB;;;;;;;;;;mCAYP,MAAM,YAAY,OAAO;;oCAElB,MAAM,EAAE;;;;;;CAO7B,CAAC;AAEX,sFAAsF;AACtF,KAAK,aAAa,GAAG,OAAO,yBAAyB,CAAC;AAUtD;;GAEG;AACH,eAAO,MAAM,oBAAoB,SAAyC,CAAC;AAE3E;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,CAAC,GAAG,CAAC,CAK5E;yBALe,gBAAgB;wBAaA,OAAO,yBAAyB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppRoutes.d.ts","sourceRoot":"","sources":["../../src/vite-routing/AppRoutes.tsx"],"names":[],"mappings":"AAoDA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAM7D,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,OAAO,CAAC;AAGhE,yEAAyE;AACzE,KAAK,oBAAoB,
|
|
1
|
+
{"version":3,"file":"AppRoutes.d.ts","sourceRoot":"","sources":["../../src/vite-routing/AppRoutes.tsx"],"names":[],"mappings":"AAoDA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAM7D,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,OAAO,CAAC;AAGhE,yEAAyE;AACzE,KAAK,oBAAoB,GACrB,CAAC,MAAM,OAAO,CAAC;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,CAAC,CAAC,GAC3C,MAAM,CAAC;AA6FX;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;CAChC;AAED,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,oBAAoB,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,UAAU,sBAAsB;IAC9B,4CAA4C;IAC5C,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,yCA8D9D"}
|
|
@@ -81,7 +81,7 @@ function NotFoundPage() {
|
|
|
81
81
|
* <LazyRoute component={route.component} path={route.path} />
|
|
82
82
|
* ```
|
|
83
83
|
*/
|
|
84
|
-
const LazyRoute = ({ component, path }) => {
|
|
84
|
+
const LazyRoute = ({ component, path, }) => {
|
|
85
85
|
if (!lazyComponentCache.has(path)) {
|
|
86
86
|
lazyComponentCache.set(path, lazy(component));
|
|
87
87
|
}
|
package/package.json
CHANGED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hook to block React Router navigation when forms are dirty.
|
|
3
|
-
* Uses FormStore as single source of truth.
|
|
4
|
-
* Safe - gracefully degrades if CRUD package not installed.
|
|
5
|
-
*
|
|
6
|
-
* @example
|
|
7
|
-
* ```tsx
|
|
8
|
-
* // In your app root/layout
|
|
9
|
-
* useFormNavigationBlocker();
|
|
10
|
-
* ```
|
|
11
|
-
*/
|
|
12
|
-
export declare function useFormNavigationBlocker(): void;
|
|
13
|
-
export default useFormNavigationBlocker;
|
|
14
|
-
//# sourceMappingURL=useFormNavigationBlocker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useFormNavigationBlocker.d.ts","sourceRoot":"","sources":["../../../src/routing/hooks/useFormNavigationBlocker.ts"],"names":[],"mappings":"AAqBA;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAmB/C;AAED,eAAe,wBAAwB,CAAC"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
// packages/ui/src/routing/hooks/useFormNavigationBlocker.ts
|
|
3
|
-
/**
|
|
4
|
-
* @fileoverview Form Navigation Blocker Hook
|
|
5
|
-
* @description React Router integration for blocking navigation when forms are dirty.
|
|
6
|
-
* Uses FormStore as single source of truth. Safe - works if CRUD package not installed.
|
|
7
|
-
*
|
|
8
|
-
* @version 0.0.1
|
|
9
|
-
* @since 0.0.1
|
|
10
|
-
* @author AMBROISE PARK Consulting
|
|
11
|
-
*/
|
|
12
|
-
import { useBlocker } from 'react-router-dom';
|
|
13
|
-
import { useEffect } from 'react';
|
|
14
|
-
import { useHasDirtyFormsSafe, checkFormNavigationSafe, } from '../../utils/useFormStoreSafe';
|
|
15
|
-
/**
|
|
16
|
-
* Hook to block React Router navigation when forms are dirty.
|
|
17
|
-
* Uses FormStore as single source of truth.
|
|
18
|
-
* Safe - gracefully degrades if CRUD package not installed.
|
|
19
|
-
*
|
|
20
|
-
* @example
|
|
21
|
-
* ```tsx
|
|
22
|
-
* // In your app root/layout
|
|
23
|
-
* useFormNavigationBlocker();
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
export function useFormNavigationBlocker() {
|
|
27
|
-
const hasDirtyForms = useHasDirtyFormsSafe();
|
|
28
|
-
const blocker = useBlocker(({ currentLocation, nextLocation }) => hasDirtyForms && currentLocation.pathname !== nextLocation.pathname);
|
|
29
|
-
useEffect(() => {
|
|
30
|
-
if (blocker.state === 'blocked') {
|
|
31
|
-
checkFormNavigationSafe().then((proceed) => {
|
|
32
|
-
if (proceed) {
|
|
33
|
-
blocker.proceed();
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
blocker.reset();
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
}, [blocker]);
|
|
41
|
-
}
|
|
42
|
-
export default useFormNavigationBlocker;
|