@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.
- package/dist/components/auth/AuthMenu.d.ts.map +1 -1
- package/dist/components/auth/AuthMenu.js +4 -4
- package/dist/components/common/FeatureCard.d.ts +7 -19
- package/dist/components/common/FeatureCard.d.ts.map +1 -1
- package/dist/components/common/FeatureCard.js +4 -28
- package/dist/components/common/TechBento.d.ts +15 -3
- package/dist/components/common/TechBento.d.ts.map +1 -1
- package/dist/components/common/TechBento.js +20 -2
- package/dist/dndev.css +258 -151
- package/dist/index.js +4 -4
- package/dist/internal/devtools/DebugTools.js +1 -1
- package/dist/internal/devtools/components/ConfigTab.d.ts.map +1 -1
- package/dist/internal/devtools/components/ConfigTab.js +8 -6
- package/dist/internal/devtools/components/DesignTab.d.ts.map +1 -1
- package/dist/internal/devtools/components/DesignTab.js +256 -45
- package/dist/internal/devtools/components/StoresTab.d.ts.map +1 -1
- package/dist/internal/initializers/BaseStoresInitializer.d.ts.map +1 -1
- package/dist/internal/initializers/BaseStoresInitializer.js +11 -1
- package/dist/internal/layout/components/AutoMetaTags.d.ts.map +1 -1
- package/dist/internal/layout/components/AutoMetaTags.js +6 -1
- package/dist/internal/layout/zones/DnDevFooter.js +2 -2
- package/dist/styles/index.css +258 -151
- package/dist/utils/assetResolver.d.ts.map +1 -1
- package/dist/utils/assetResolver.js +22 -11
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/tList.d.ts +30 -0
- package/dist/utils/tList.d.ts.map +1 -0
- package/dist/utils/tList.js +51 -0
- package/dist/vite-routing/AppRoutes.d.ts.map +1 -1
- 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,
|
|
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
|
|
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 (!
|
|
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
|
-
|
|
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 &&
|
|
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,
|
|
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
|
-
*
|
|
20
|
-
*
|
|
10
|
+
* Card content - string, string[], or ReactNode.
|
|
11
|
+
* For lists with icons, pass `<List icon={...} items={...} />` directly.
|
|
21
12
|
*/
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
|
|
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,
|
|
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":"
|
|
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,
|
|
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,
|
|
26
|
-
|
|
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: '
|
|
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
|
-
|
|
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,
|
|
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:
|
|
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
|
}
|