@donotdev/ui 0.0.3 → 0.0.4

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 (32) hide show
  1. package/dist/components/auth/AuthMenu.d.ts.map +1 -1
  2. package/dist/components/auth/AuthMenu.js +4 -4
  3. package/dist/components/common/FeatureCard.d.ts +7 -19
  4. package/dist/components/common/FeatureCard.d.ts.map +1 -1
  5. package/dist/components/common/FeatureCard.js +4 -28
  6. package/dist/components/common/TechBento.d.ts +15 -3
  7. package/dist/components/common/TechBento.d.ts.map +1 -1
  8. package/dist/components/common/TechBento.js +20 -2
  9. package/dist/dndev.css +258 -151
  10. package/dist/index.js +4 -4
  11. package/dist/internal/devtools/DebugTools.js +1 -1
  12. package/dist/internal/devtools/components/ConfigTab.d.ts.map +1 -1
  13. package/dist/internal/devtools/components/ConfigTab.js +8 -6
  14. package/dist/internal/devtools/components/DesignTab.d.ts.map +1 -1
  15. package/dist/internal/devtools/components/DesignTab.js +256 -45
  16. package/dist/internal/devtools/components/StoresTab.d.ts.map +1 -1
  17. package/dist/internal/initializers/BaseStoresInitializer.d.ts.map +1 -1
  18. package/dist/internal/initializers/BaseStoresInitializer.js +11 -1
  19. package/dist/internal/layout/components/AutoMetaTags.d.ts.map +1 -1
  20. package/dist/internal/layout/components/AutoMetaTags.js +6 -1
  21. package/dist/internal/layout/zones/DnDevFooter.js +2 -2
  22. package/dist/styles/index.css +258 -151
  23. package/dist/utils/assetResolver.d.ts.map +1 -1
  24. package/dist/utils/assetResolver.js +22 -11
  25. package/dist/utils/index.d.ts +1 -0
  26. package/dist/utils/index.d.ts.map +1 -1
  27. package/dist/utils/index.js +1 -0
  28. package/dist/utils/tList.d.ts +30 -0
  29. package/dist/utils/tList.d.ts.map +1 -0
  30. package/dist/utils/tList.js +51 -0
  31. package/dist/vite-routing/AppRoutes.d.ts.map +1 -1
  32. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"AuthMenu.d.ts","sourceRoot":"","sources":["../../../src/components/auth/AuthMenu.tsx"],"names":[],"mappings":"AA4EA,OAAO,KAAkC,MAAM,OAAO,CAAC;AAEvD,OAAO,EAML,OAAO,EACR,MAAM,sBAAsB,CAAC;AAc9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAqE3C;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;IAEjD,sBAAsB;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACpC;AAsBD,eAAO,MAAM,QAAQ,GAAI,+DAKtB,aAAa,mDAyOf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"AuthMenu.d.ts","sourceRoot":"","sources":["../../../src/components/auth/AuthMenu.tsx"],"names":[],"mappings":"AA4EA,OAAO,KAAkC,MAAM,OAAO,CAAC;AAEvD,OAAO,EAML,OAAO,EACR,MAAM,sBAAsB,CAAC;AAc9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAqE3C;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;IAEjD,sBAAsB;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACpC;AAsBD,eAAO,MAAM,QAAQ,GAAI,+DAKtB,aAAa,mDAwOf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -161,7 +161,7 @@ export const AuthMenu = ({ loginPath, display = DISPLAY.AUTO, 'no-tooltip': noTo
161
161
  // Get real auth state from the store (self-aware)
162
162
  const user = useAuthSafe('user');
163
163
  const signOut = useAuthSafe('signOut');
164
- const isDesktop = useBreakpoint('isDesktop');
164
+ const isLaptop = useBreakpoint('isLaptop');
165
165
  const navigationItems = useNavigationItems();
166
166
  const navigate = useNavigate();
167
167
  const profilePath = authConfig.profilePath;
@@ -207,7 +207,7 @@ export const AuthMenu = ({ loginPath, display = DISPLAY.AUTO, 'no-tooltip': noTo
207
207
  const menuItems = useMemo(() => {
208
208
  const items = [];
209
209
  // Mobile: Add disabled info item as first entry
210
- if (!isDesktop && user) {
210
+ if (!isLaptop && user) {
211
211
  items.push({
212
212
  // Use Text component as children instead of label
213
213
  children: (_jsx(Text, { variant: "muted", as: "span", children: `${getUserDisplayName()}${user.email ? `\n${user.email}` : ''}` })),
@@ -291,7 +291,7 @@ export const AuthMenu = ({ loginPath, display = DISPLAY.AUTO, 'no-tooltip': noTo
291
291
  deletion,
292
292
  t,
293
293
  navigationItems,
294
- isDesktop,
294
+ isLaptop,
295
295
  user,
296
296
  getUserDisplayName,
297
297
  navigate,
@@ -308,7 +308,7 @@ export const AuthMenu = ({ loginPath, display = DISPLAY.AUTO, 'no-tooltip': noTo
308
308
  if (!isAuthenticated) {
309
309
  return null;
310
310
  }
311
- return (_jsxs(_Fragment, { children: [_jsx(Suspense, { fallback: null, children: _jsx(ReauthDialog, { open: deletion.showPasswordDialog, isLoading: deletion.isDeleting, error: deletion.error, onReauth: (password) => deletion.confirmDelete(password), onCancel: deletion.cancel }) }), _jsx(Suspense, { fallback: null, children: _jsx(ConfirmDeleteDialog, { open: deletion.showConfirmDialog, isLoading: deletion.isDeleting, error: deletion.error, onConfirm: () => deletion.confirmDelete(), onCancel: deletion.cancel }) }), _jsx(DropdownMenu, { trigger: _jsx(Button, { variant: BUTTON_VARIANT.OUTLINE, icon: user ? (_jsx(Avatar, { src: user.photoURL ?? undefined, fallback: getUserInitials(), alt: getUserDisplayName(), style: { margin: '-4px 0' } })) : (UserCheck), display: display, "aria-label": t('auth.userMenu', { defaultValue: 'User menu' }), tooltip: !noTooltip && isDesktop && user
311
+ return (_jsxs(_Fragment, { children: [_jsx(Suspense, { fallback: null, children: _jsx(ReauthDialog, { open: deletion.showPasswordDialog, isLoading: deletion.isDeleting, error: deletion.error, onReauth: (password) => deletion.confirmDelete(password), onCancel: deletion.cancel }) }), _jsx(Suspense, { fallback: null, children: _jsx(ConfirmDeleteDialog, { open: deletion.showConfirmDialog, isLoading: deletion.isDeleting, error: deletion.error, onConfirm: () => deletion.confirmDelete(), onCancel: deletion.cancel }) }), _jsx(DropdownMenu, { trigger: _jsx(Button, { variant: BUTTON_VARIANT.OUTLINE, icon: user ? (_jsx(Avatar, { src: user.photoURL ?? undefined, fallback: getUserInitials(), alt: getUserDisplayName(), style: { margin: '-4px 0' } })) : (UserCheck), display: display, "aria-label": t('auth.userMenu', { defaultValue: 'User menu' }), tooltip: !noTooltip && isLaptop && user
312
312
  ? getUserTooltip()
313
313
  : !noTooltip
314
314
  ? t('auth.userMenu', { defaultValue: 'User menu' })
@@ -1,4 +1,4 @@
1
- import type { CardProps, CardVariant, GapVariant } from '@donotdev/components';
1
+ import type { CardProps, CardVariant, CardContent } from '@donotdev/components';
2
2
  import type { ReactNode } from 'react';
3
3
  export type FeatureCardVariant = CardVariant;
4
4
  export interface FeatureCardProps extends Omit<CardProps, 'content' | 'href' | 'title' | 'subtitle' | 'children'> {
@@ -6,25 +6,13 @@ export interface FeatureCardProps extends Omit<CardProps, 'content' | 'href' | '
6
6
  title: string | ReactNode;
7
7
  /** Subtitle (required) - 2 rows max with ellipsis */
8
8
  subtitle: string | ReactNode;
9
- /** Content as array (required) */
10
- content: (string | ReactNode)[];
11
- /** Route path - enables routing via Link */
12
- href?: string;
13
- /**
14
- * List density for content rendering (page-level preset)
15
- * @default 'default'
16
- */
17
- listDensity?: 'dense' | 'narrow' | 'default' | 'expressive';
18
9
  /**
19
- * Gap between list items (component-level override)
20
- * @default 'none'
10
+ * Card content - string, string[], or ReactNode.
11
+ * For lists with icons, pass `<List icon={...} items={...} />` directly.
21
12
  */
22
- listGap?: GapVariant;
23
- /**
24
- * Whether to show bullets in list
25
- * @default false
26
- */
27
- showBullets?: boolean;
13
+ content?: CardContent;
14
+ /** Route path - enables routing via Link */
15
+ href?: string;
28
16
  }
29
17
  /**
30
18
  * FeatureCard - Card wrapper with content array and routing
@@ -33,6 +21,6 @@ export interface FeatureCardProps extends Omit<CardProps, 'content' | 'href' | '
33
21
  * Uses Card component internally.
34
22
  * Routing via Link when href provided.
35
23
  */
36
- declare const FeatureCard: ({ icon, title, subtitle, content, href, variant, elevated, onClick, className, footer, style, listDensity, listGap, showBullets, ...cardProps }: FeatureCardProps) => import("react/jsx-runtime").JSX.Element;
24
+ declare const FeatureCard: ({ icon, title, subtitle, content, href, variant, elevated, onClick, className, footer, style, ...cardProps }: FeatureCardProps) => import("react/jsx-runtime").JSX.Element;
37
25
  export default FeatureCard;
38
26
  //# sourceMappingURL=FeatureCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FeatureCard.d.ts","sourceRoot":"","sources":["../../../src/components/common/FeatureCard.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,UAAU,EAEX,MAAM,sBAAsB,CAAC;AAK9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAE7C,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAC5C,SAAS,EACT,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CACvD;IACC,kDAAkD;IAClD,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,qDAAqD;IACrD,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,kCAAkC;IAClC,OAAO,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IAChC,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;IAC5D;;;OAGG;IACH,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;GAMG;AACH,QAAA,MAAM,WAAW,GAAI,iJAgBlB,gBAAgB,4CAyKlB,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"FeatureCard.d.ts","sourceRoot":"","sources":["../../../src/components/common/FeatureCard.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAE7C,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAC5C,SAAS,EACT,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CACvD;IACC,kDAAkD;IAClD,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,qDAAqD;IACrD,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,QAAA,MAAM,WAAW,GAAI,8GAalB,gBAAgB,4CAmIlB,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -12,8 +12,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
12
  * @since 0.0.1
13
13
  * @author AMBROISE PARK Consulting
14
14
  */
15
- import { Card, IconBox, Stack, List, Text } from '@donotdev/components';
16
- import { Check } from 'lucide-react';
15
+ import { Card, IconBox, Stack, Text, renderCardContent, } from '@donotdev/components';
17
16
  import { Link } from '../../routing';
18
17
  /**
19
18
  * FeatureCard - Card wrapper with content array and routing
@@ -22,31 +21,8 @@ import { Link } from '../../routing';
22
21
  * Uses Card component internally.
23
22
  * Routing via Link when href provided.
24
23
  */
25
- const FeatureCard = ({ icon, title, subtitle, content, href, variant, elevated, onClick, className, footer, style, listDensity = 'default', listGap = 'none', showBullets = false, ...cardProps }) => {
26
- // Convert content array to List component or plain text
27
- // Strip manual bullet characters (•) if present
28
- const cleanContent = content?.map((item) => {
29
- if (typeof item === 'string') {
30
- return item.replace(/^[\s•\-\*]+/, '').trim();
31
- }
32
- return item;
33
- }) || [];
34
- // Convert to ListItem objects with checkmark icons when showBullets is true
35
- const listItems = showBullets
36
- ? cleanContent.map((item) => {
37
- if (typeof item === 'string') {
38
- return {
39
- icon: _jsx(Check, { size: 16 }),
40
- content: item,
41
- };
42
- }
43
- // If already a ListItem or ReactNode, keep as is
44
- return item;
45
- })
46
- : cleanContent;
47
- // If single string item, render as plain text (not a list)
48
- // If multiple items or contains ReactNodes, use List component
49
- const contentNode = listItems && listItems.length > 0 ? (listItems.length === 1 && typeof listItems[0] === 'string' ? (_jsx("div", { className: "dndev-text-sm", children: listItems[0] })) : (_jsx(List, { items: listItems, density: listDensity, gap: listGap, style: { listStyle: 'none', paddingInlineStart: 0 } }))) : null;
24
+ const FeatureCard = ({ icon, title, subtitle, content, href, variant, elevated, onClick, className, footer, style, ...cardProps }) => {
25
+ const contentNode = renderCardContent(content);
50
26
  // Fixed height constants for consistent text sizing (2 rows each)
51
27
  const titleRowHeight = `calc(var(--font-size-lg) * var(--line-height) * 2 + var(--gap-md))`;
52
28
  const subtitleRowHeight = `calc(var(--font-size-base) * var(--line-height) * 2 + var(--gap-md))`;
@@ -76,7 +52,7 @@ const FeatureCard = ({ icon, title, subtitle, content, href, variant, elevated,
76
52
  ...lineClampStyle,
77
53
  fontSize: 'var(--font-size-base)',
78
54
  fontWeight: 600,
79
- color: 'inherit',
55
+ color: 'var(--muted-foreground)', // Muted for hierarchy
80
56
  margin: 0,
81
57
  };
82
58
  // Build title with icon if provided
@@ -1,4 +1,4 @@
1
- import type { BentoColumns, BentoGap, CardVariant } from '@donotdev/components';
1
+ import type { BentoColumns, BentoGap, CardVariant, ResponsiveCols } from '@donotdev/components';
2
2
  import { type TechKey } from '../../data/techLogos';
3
3
  export type TechBentoProps = {
4
4
  title?: string;
@@ -7,11 +7,23 @@ export type TechBentoProps = {
7
7
  size?: 'normal' | 'long' | 'high' | 'huge';
8
8
  variant?: CardVariant;
9
9
  }>;
10
- columns: BentoColumns;
10
+ /**
11
+ * Number of columns - fixed or responsive (same as Grid)
12
+ * - number: fixed columns (same on all breakpoints)
13
+ * - [mobile, tablet, laptop, desktop]: responsive columns per breakpoint
14
+ * @default 3
15
+ * @example 3 - always 3 columns
16
+ * @example [1, 1, 2, 3] - 1 col mobile/tablet, 2 laptop, 3 desktop
17
+ */
18
+ cols?: number | ResponsiveCols;
19
+ /**
20
+ * @deprecated Use `cols` prop instead. Kept for backward compatibility.
21
+ */
22
+ columns?: BentoColumns;
11
23
  gap?: BentoGap;
12
24
  separator?: boolean;
13
25
  className?: string;
14
26
  };
15
- export declare function TechBento({ title, techs, columns, gap, separator, className, }: TechBentoProps): import("react/jsx-runtime").JSX.Element;
27
+ export declare function TechBento({ title, techs, cols, columns, gap, separator, className, }: TechBentoProps): import("react/jsx-runtime").JSX.Element;
16
28
  export default TechBento;
17
29
  //# sourceMappingURL=TechBento.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TechBento.d.ts","sourceRoot":"","sources":["../../../src/components/common/TechBento.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,OAAO,CAAC;QACd,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;QAC3C,OAAO,CAAC,EAAE,WAAW,CAAC;KACvB,CAAC,CAAC;IACH,OAAO,EAAE,YAAY,CAAC;IACtB,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAwCF,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,KAAK,EACL,OAAO,EACP,GAAc,EACd,SAAiB,EACjB,SAAS,GACV,EAAE,cAAc,2CAmChB;AAED,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"TechBento.d.ts","sourceRoot":"","sources":["../../../src/components/common/TechBento.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,OAAO,CAAC;QACd,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;QAC3C,OAAO,CAAC,EAAE,WAAW,CAAC;KACvB,CAAC,CAAC;IACH;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IAC/B;;OAEG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAwCF,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,KAAK,EACL,IAAQ,EACR,OAAO,EACP,GAAc,EACd,SAAiB,EACjB,SAAS,GACV,EAAE,cAAc,2CAsDhB;AAED,eAAe,SAAS,CAAC"}
@@ -11,7 +11,25 @@ function TechCard({ techKey, variant, }) {
11
11
  const decodedSvg = decodeURIComponent(svgContent);
12
12
  return (_jsx(Card, { variant: variant, className: "dndev-tech-card", style: { '--tech-color': logo.color }, "data-hover": isHovered, onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), children: _jsxs(Stack, { direction: "column", align: "center", gap: "tight", children: [_jsx("div", { className: "dndev-tech-card-logo", "data-tech": techKey, dangerouslySetInnerHTML: { __html: decodedSvg } }), _jsx(Text, { as: "span", level: "small", children: logo.name })] }) }));
13
13
  }
14
- export function TechBento({ title, techs, columns, gap = 'medium', separator = false, className, }) {
14
+ export function TechBento({ title, techs, cols = 3, columns, gap = 'medium', separator = false, className, }) {
15
+ // Convert Grid's cols format to Bento's columns format
16
+ // Grid: [mobile, tablet, laptop, desktop]
17
+ // Bento: { mobile, tablet, desktop, wide }
18
+ const bentoColumns = columns
19
+ ? columns
20
+ : typeof cols === 'number'
21
+ ? {
22
+ mobile: cols,
23
+ tablet: cols,
24
+ desktop: cols,
25
+ wide: cols,
26
+ }
27
+ : {
28
+ mobile: cols[0],
29
+ tablet: cols[1],
30
+ desktop: cols[2], // Grid's laptop → Bento's desktop
31
+ wide: cols[3], // Grid's desktop → Bento's wide
32
+ };
15
33
  const getSpan = (size) => {
16
34
  if (size === 'long')
17
35
  return { cols: 2, rows: 1 };
@@ -28,7 +46,7 @@ export function TechBento({ title, techs, columns, gap = 'medium', separator = f
28
46
  content: _jsx(TechCard, { techKey: tech.name, variant: tech.variant }),
29
47
  span: getSpan(tech.size),
30
48
  }));
31
- const bento = (_jsx(Bento, { items: items, columns: columns, gap: gap, className: className, ariaLabel: "Technology stack" }));
49
+ const bento = (_jsx(Bento, { items: items, columns: bentoColumns, gap: gap, className: className, ariaLabel: "Technology stack" }));
32
50
  if (title) {
33
51
  return (_jsx(Section, { title: title, separator: separator, className: "dndev-tech-bento", children: _jsx("div", { className: "dndev-tech-bento-grid", children: bento }) }));
34
52
  }