@donotdev/ui 0.0.15 → 0.0.17

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 (30) hide show
  1. package/dist/components/common/TechBento.d.ts.map +1 -1
  2. package/dist/components/common/TechBento.js +1 -1
  3. package/dist/components/layout/components/header/HeaderNavigation.d.ts.map +1 -1
  4. package/dist/components/layout/components/header/HeaderNavigation.js +2 -2
  5. package/dist/crud/components/CrudCardLink.d.ts.map +1 -1
  6. package/dist/crud/components/EntityCardList.d.ts.map +1 -1
  7. package/dist/crud/components/EntityCardList.js +8 -22
  8. package/dist/crud/components/EntityList.d.ts.map +1 -1
  9. package/dist/crud/components/EntityList.js +7 -43
  10. package/dist/dndev.css +86 -63
  11. package/dist/index.js +4 -4
  12. package/dist/internal/devtools/components/DesignTab.d.ts.map +1 -1
  13. package/dist/internal/layout/components/AutoMetaTags.d.ts.map +1 -1
  14. package/dist/internal/layout/components/AutoMetaTags.js +2 -9
  15. package/dist/internal/layout/components/FontPreloadLinks.d.ts.map +1 -1
  16. package/dist/internal/layout/components/FontPreloadLinks.js +1 -0
  17. package/dist/internal/layout/components/footer/useLegalLinks.d.ts.map +1 -1
  18. package/dist/routing/GoToInput.d.ts.map +1 -1
  19. package/dist/routing/GoToInput.js +2 -1
  20. package/dist/routing/Link.d.ts.map +1 -1
  21. package/dist/routing/useRouteDiscovery.d.ts.map +1 -1
  22. package/dist/styles/index.css +86 -63
  23. package/dist/utils/sanitizeSvg.d.ts.map +1 -1
  24. package/dist/utils/useFormStoreSafe.d.ts.map +1 -1
  25. package/dist/vite-routing/AppRoutes.d.ts.map +1 -1
  26. package/dist/vite-routing/AppRoutes.js +1 -1
  27. package/package.json +11 -11
  28. package/dist/routing/hooks/useFormNavigationBlocker.d.ts +0 -14
  29. package/dist/routing/hooks/useFormNavigationBlocker.d.ts.map +0 -1
  30. 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,+CA4yBrB,CAAC"}
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,aAmN1B,CAAC;AAEF;;;GAGG;AAEH,eAAe,YAAY,CAAC"}
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, } = seoConfig;
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":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AASvC;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,SAAS,CAAC,CA6B3D;AAED,eAAe,gBAAgB,CAAC"}
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,GAAI,cAAc,WAAW,CAAC,QAAQ,CAAC,KAAG,eAAe,EAQlF,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,aAAa,iBAXkB,WAAW,CAAC,QAAQ,CAAC,KAAG,eAAe,EAWzC,CAAC"}
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":"AA+BA,QAAA,MAAM,SAAS,+CAwEd,CAAC;AAEF,eAAe,SAAS,CAAC"}
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' && /Mac|iPhone|iPad/.test(navigator.userAgent);
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,CAwIzC,CAAC"}
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,EAAsB,eAAe,IAAI,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAIjG,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"}
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"}
@@ -3418,80 +3418,120 @@ em {
3418
3418
 
3419
3419
  /* packages/components/src/atomic/Combobox/Combobox.css */
3420
3420
 
3421
- .dndev-combobox-trigger {
3422
- display: flex;
3423
- justify-content: space-between;
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-trigger button {
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
- width: 100%;
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
- .dndev-combobox-placeholder {
3437
- opacity: var(--opacity-muted);
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-trigger-icons {
3441
- display: flex;
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
- .dndev-combobox-clear {
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
- opacity: var(--opacity-muted);
3453
- transition: opacity var(--dur-fast) var(--ease-in-out);
3454
- -webkit-user-select: none;
3455
- -moz-user-select: none;
3456
- user-select: none;
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-clear:hover,
3460
- .dndev-combobox-clear:focus {
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-clear svg {
3466
- width: var(--icon-sm);
3467
- height: var(--icon-sm);
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
- [data-state='open'] .dndev-combobox-chevron {
3516
+ .dndev-combobox-open .dndev-combobox-chevron svg {
3478
3517
  transform: rotate(180deg);
3479
3518
  }
3480
3519
 
3481
- .dndev-combobox-loading-container {
3520
+ /* Spinner replaces chevron */
3521
+
3522
+ .dndev-combobox-spinner {
3482
3523
  display: flex;
3483
3524
  align-items: center;
3484
- gap: var(--gap-sm);
3485
- }
3486
-
3487
- .dndev-combobox-loading-spinner {
3525
+ justify-content: center;
3488
3526
  width: var(--icon-md);
3489
3527
  height: var(--icon-md);
3490
- border-radius: var(--radius-full);
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(calc(100dvh - var(--header-height)), auto) auto;
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(calc(100dvh - var(--header-height)), auto) auto;
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":"AA+BA;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO/C"}
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;AAQtD;;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
+ {"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,GAAG,CAAC,MAAM,OAAO,CAAC;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,CAAC,CAAC,GAAG,MAAM,CAAC;AA+EjF;;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"}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@donotdev/ui",
3
- "version": "0.0.15",
3
+ "version": "0.0.17",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -49,21 +49,21 @@
49
49
  "dependencies": {
50
50
  "@fontsource/inter": "^5.2.8",
51
51
  "@fontsource/playfair-display": "^5.2.8",
52
- "@fontsource/roboto": "^5.2.9",
52
+ "@fontsource/roboto": "^5.2.10",
53
53
  "@fontsource/space-grotesk": "^5.2.10",
54
54
  "@hookform/resolvers": "^5.2.2",
55
55
  "react-helmet-async": "^2.0.5",
56
- "react-hook-form": "^7.71.1"
56
+ "react-hook-form": "^7.71.2"
57
57
  },
58
58
  "peerDependencies": {
59
- "@donotdev/adv-comps": "^0.0.13",
60
- "@donotdev/auth": "^0.0.9",
61
- "@donotdev/billing": "^0.0.8",
62
- "@donotdev/components": "^0.0.19",
63
- "@donotdev/core": "^0.0.25",
64
- "@donotdev/crud": "^0.0.16",
65
- "@donotdev/firebase": "^0.0.12",
66
- "@donotdev/oauth": "^0.0.8",
59
+ "@donotdev/adv-comps": "^0.0.15",
60
+ "@donotdev/auth": "^0.0.11",
61
+ "@donotdev/billing": "^0.0.10",
62
+ "@donotdev/components": "^0.0.21",
63
+ "@donotdev/core": "^0.0.27",
64
+ "@donotdev/crud": "^0.0.18",
65
+ "@donotdev/firebase": "^0.0.14",
66
+ "@donotdev/oauth": "^0.0.10",
67
67
  "firebase": "^12.9.0",
68
68
  "lucide-react": "^0.574.0",
69
69
  "react": "^19.2.4",
@@ -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;