beacon-ui 3.1.8 → 3.2.0

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/CHANGELOG.md CHANGED
@@ -5,6 +5,35 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [3.2.0] - 2025-01-02
9
+
10
+ ### Changed
11
+ - Simplified Card component usage examples for better developer experience
12
+ - Removed unnecessary wrapper divs from Card examples - Card's built-in flex layout handles spacing automatically
13
+ - Improved code examples to be cleaner and more minimal, following design system best practices
14
+ - Card examples now demonstrate cleaner, more maintainable code patterns
15
+
16
+ ### Fixed
17
+ - Fixed missing line-height in typography previews across Card component examples
18
+ - Fixed image constraints in Product Card Pattern example - removed fixed width/height props for better flexibility
19
+
20
+ ## [3.1.9] - 2025-12-29
21
+
22
+ ### Added
23
+ - Menu component now supports render props for full customization:
24
+ - `renderSwitch` - Customize or replace the Switch component with your own implementation
25
+ - `renderToggleButton` - Customize or replace the toggle button (menu/close icon) with your own component
26
+ - `renderButton` - Customize or replace the menu action button with your own component
27
+ - Menu component callback props for handling interactions:
28
+ - `onSwitchChange` - Callback when Switch value changes
29
+ - `onToggleButtonClick` - Callback when toggle button is clicked
30
+ - `onButtonClick` - Callback when menu action button is clicked
31
+ - Exported render prop types: `SwitchRenderProps`, `ToggleButtonRenderProps`, `MenuButtonRenderProps`
32
+
33
+ ### Changed
34
+ - Menu component now uses internal state management for Switch, allowing better control and customization
35
+ - Render props are optional - if not provided, Menu uses default components (backward compatible)
36
+
8
37
  ## [3.1.8] - 2025-12-29
9
38
 
10
39
  ### Fixed
package/README.md CHANGED
@@ -491,6 +491,31 @@ Components adapt seamlessly across breakpoints:
491
491
  - Tablet (max-width: 1024px)
492
492
  - Mobile (max-width: 768px)
493
493
 
494
+ ## Assets (Images)
495
+
496
+ The package includes static assets (images) for patterns, avatars, and previews. These are located in `assets/` directory.
497
+
498
+ ### Pattern Images (Card Component)
499
+
500
+ The Card component uses background pattern images. To use them:
501
+
502
+ 1. Copy pattern images from `node_modules/beacon-ui/assets/patterns/` to your `public/images/patterns/` directory
503
+ 2. The Card component will automatically reference them via `/images/patterns/` paths
504
+
505
+ ### Automatic Setup
506
+
507
+ Add a postinstall script to your `package.json`:
508
+
509
+ ```json
510
+ {
511
+ "scripts": {
512
+ "postinstall": "mkdir -p public/images/patterns public/images/avatars public/images/preview && cp -r node_modules/beacon-ui/assets/patterns/* public/images/patterns/ && cp -r node_modules/beacon-ui/assets/avatars/* public/images/avatars/ && cp -r node_modules/beacon-ui/assets/preview/* public/images/preview/"
513
+ }
514
+ }
515
+ ```
516
+
517
+ See `assets/README.md` for more details.
518
+
494
519
  ## Troubleshooting
495
520
 
496
521
  ### Components not styling correctly
@@ -0,0 +1,24 @@
1
+ # Assets
2
+
3
+ This directory contains static assets (images) used by the Beacon UI components.
4
+
5
+ ## Structure
6
+
7
+ - **patterns/** - Background pattern images for Card component
8
+ - **avatars/** - Avatar placeholder images
9
+ - **preview/** - Preview/demo images for documentation examples
10
+
11
+ ## Usage
12
+
13
+ These assets are part of the `beacon-ui` package. For Next.js applications:
14
+
15
+ 1. The assets are automatically copied to `public/images/` during build via the `copy:assets` script
16
+ 2. Components reference them via `/images/patterns/`, `/images/avatars/`, `/images/preview/` paths
17
+ 3. For non-Next.js applications, copy these assets to your public/assets directory manually
18
+
19
+ ## Package Distribution
20
+
21
+ When the package is published, these assets are included in the npm package under `node_modules/beacon-ui/assets/`.
22
+
23
+ Consuming applications should copy these assets to their public directory. You can use the provided postinstall script or copy them manually.
24
+
@@ -0,0 +1,42 @@
1
+ # Avatar Images
2
+
3
+ This directory contains avatar images used in the design system.
4
+
5
+ ## Adding New Avatar Images
6
+
7
+ 1. Place your image file in this directory (supported formats: JPG, PNG, WebP)
8
+ 2. Update `src/utils/imagePaths.ts` to add your new image:
9
+
10
+ ```typescript
11
+ export const IMAGE_PATHS = {
12
+ avatars: {
13
+ default: "/images/avatars/avatar-female.png",
14
+ user1: "/images/avatars/user1.jpg", // Add your new image here
15
+ user2: "/images/avatars/user2.jpg",
16
+ },
17
+ };
18
+ ```
19
+
20
+ 3. Use the image in your code:
21
+
22
+ ```typescript
23
+ import { getAvatarImage } from "@/utils/imagePaths";
24
+
25
+ // Use the default image
26
+ const imageUrl = getAvatarImage("default");
27
+
28
+ // Or use a specific image
29
+ const imageUrl = getAvatarImage("user1");
30
+ ```
31
+
32
+ ## Image Guidelines
33
+
34
+ - Recommended size: 400x400px or larger (square aspect ratio)
35
+ - Formats: JPG, PNG, or WebP
36
+ - Keep file sizes reasonable for web performance
37
+ - Use consistent naming conventions (e.g., `avatar-default.jpg`, `user1.jpg`)
38
+
39
+ ## Current Images
40
+
41
+ - `avatar-default.jpg` - Default avatar image (add this file)
42
+
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,40 @@
1
+ # Pattern Images
2
+
3
+ This directory contains background pattern images used by the Card component.
4
+
5
+ ## Usage
6
+
7
+ These images are part of the `beacon-ui` package and are stored in `packages/beacon-ui/assets/patterns/`.
8
+
9
+ For the documentation site, they are automatically copied to `public/images/patterns/` during build via the `copy:assets` script.
10
+
11
+ For consuming applications:
12
+
13
+ 1. Copy the pattern images from `node_modules/beacon-ui/assets/patterns/` to your application's `public/images/patterns/` directory
14
+ 2. The Card component will automatically reference them via `/images/patterns/` paths
15
+
16
+ ## Pattern Files
17
+
18
+ - `Cube_pt.png` - Cubes pattern
19
+ - `Maths_pt.png` - Mathematics pattern
20
+ - `Dots_pt.png` - Dots pattern
21
+ - `Diagonal_pt.png` - Diagonal lines pattern
22
+ - `Smudge_pt.png` - Charcoal smudge pattern
23
+ - `Rough_Paper_pt.png` - Rough paper pattern
24
+ - `Denim_pt.png` - Denim pattern
25
+ - `Squares_pt.png` - Squares pattern
26
+ - `Mosaic_pt.png` - Mosaic pattern
27
+ - `Cotton_pt.png` - Cotton pattern
28
+
29
+ ## Automatic Setup (Optional)
30
+
31
+ You can add a postinstall script to your `package.json` to automatically copy these images:
32
+
33
+ ```json
34
+ {
35
+ "scripts": {
36
+ "postinstall": "mkdir -p public/images/patterns && cp -r node_modules/beacon-ui/assets/patterns/* public/images/patterns/"
37
+ }
38
+ }
39
+ ```
40
+
Binary file
Binary file
@@ -1,37 +1,19 @@
1
1
  import { ComponentPropsWithRef } from "react";
2
2
  import { type PatternType } from "../utils/patternPaths";
3
- export type CardType = "product" | "experience" | "info" | "generic";
4
- export type ProductCardSize = "full" | "half";
5
- export type ProductCardStatus = "default" | "highlighted";
6
- export type ExperienceCardType = "default" | "skills" | "contacts";
7
- export type GenericCardStatus = "default" | "highlighted" | "selected";
3
+ import type { CornerRadiusStep } from "./Button";
4
+ export type CardStatus = "default" | "highlighted" | "selected";
5
+ export type CardShadow = "0" | "50" | "100" | "200" | "300" | "400" | "500";
8
6
  export interface CardProps extends Omit<ComponentPropsWithRef<"div">, "slot"> {
9
- cardType: CardType;
10
- size?: ProductCardSize;
11
- status?: ProductCardStatus;
12
- hasImage?: boolean;
13
- imageAspectRatio?: "16x9" | "4x3";
14
- hasIdentifiers?: boolean;
15
- hasButton?: boolean;
16
- title?: string;
17
- description?: string;
18
- experienceType?: ExperienceCardType;
19
- positionName?: string;
20
- companyName?: string;
21
- year?: string;
22
- experienceDescription?: string;
23
- label?: string;
24
- details?: string;
25
- cardName?: string;
26
- cardDescription?: string;
27
- hasIcon?: boolean;
28
- genericStatus?: GenericCardStatus;
7
+ padding?: number;
8
+ height?: string;
9
+ status?: CardStatus;
10
+ shadow?: CardShadow;
11
+ cornerRadius?: CornerRadiusStep;
29
12
  showBgPattern?: boolean;
30
13
  patternType?: PatternType;
31
14
  showOverlay?: boolean;
32
- showShadow?: boolean;
33
15
  showBorder?: boolean;
34
- slot?: React.ReactNode;
16
+ children?: React.ReactNode;
35
17
  }
36
- export declare function Card({ cardType, size, status, hasImage, imageAspectRatio, hasIdentifiers, hasButton, title, description, experienceType, positionName, companyName, year, experienceDescription, label, details, cardName, cardDescription, hasIcon, genericStatus, showBgPattern, patternType, showOverlay, showShadow, showBorder, slot, className, style, ref, ...rest }: CardProps): import("react/jsx-runtime").JSX.Element;
18
+ export declare function Card({ padding, height, status, shadow, cornerRadius, showBgPattern, patternType, showOverlay, showBorder, children, className, style, ref, ...rest }: CardProps): import("react/jsx-runtime").JSX.Element;
37
19
  //# sourceMappingURL=Card.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../src/components/Card.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAW,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAGvD,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE3E,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,CAAC;AAGrE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AAC9C,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,aAAa,CAAC;AAG1D,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;AAGnE,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;AAEvE,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAC3E,QAAQ,EAAE,QAAQ,CAAC;IAEnB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAClC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB;AAED,wBAAgB,IAAI,CAAC,EACnB,QAAQ,EAER,IAAa,EACb,MAAkB,EAClB,QAAe,EACf,gBAAyB,EACzB,cAAqB,EACrB,SAAgB,EAChB,KAAuB,EACvB,WAAsI,EAEtI,cAA0B,EAC1B,YAA8B,EAC9B,WAA4B,EAC5B,IAAgB,EAChB,qBAA0C,EAC1C,KAAe,EACf,OAAmB,EAEnB,QAAsB,EACtB,eAAoC,EACpC,OAAc,EAEd,aAAyB,EACzB,aAAoB,EACpB,WAAqB,EACrB,WAAkB,EAClB,UAAiB,EACjB,UAAiB,EACjB,IAAI,EACJ,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,SAAS,2CAmyBX"}
1
+ {"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../src/components/Card.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAG9C,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAW5E,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAoBD,wBAAgB,IAAI,CAAC,EACnB,OAAa,EACb,MAAM,EACN,MAAkB,EAClB,MAAM,EACN,YAAgB,EAChB,aAAqB,EACrB,WAAqB,EACrB,WAAmB,EACnB,UAAiB,EACjB,QAAQ,EACR,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,SAAS,2CA0GX"}
@@ -1,519 +1,115 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { useThemeSafe } from "../providers/ThemeProvider";
4
- import { RightArrowIcon, ArrowDownFallSlotIcon } from "../icons";
4
+ import { ArrowDownFallSlotIcon } from "../icons";
5
5
  import { getPatternConfig } from "../utils/patternPaths";
6
- export function Card({ cardType,
7
- // ProductCard
8
- size = "full", status = "default", hasImage = true, imageAspectRatio = "16x9", hasIdentifiers = true, hasButton = true, title = "Product Title", description = "Add your products Details that description here. This paragraph is restricted only two lines even if content is large.",
9
- // ExperienceCard
10
- experienceType = "default", positionName = "Position Name", companyName = "Company Name", year = "2025-26", experienceDescription = "Long Description", label = "Label", details = "Details",
11
- // InfoCard
12
- cardName = "Card Name", cardDescription = "Card Description", hasIcon = true,
13
- // Generic Card
14
- genericStatus = "default", showBgPattern = true, patternType = "cubes", showOverlay = true, showShadow = true, showBorder = true, slot, className, style, ref, ...rest }) {
15
- useThemeSafe(); // Ensure theme context is available
16
- const renderProductCard = () => {
17
- const isFull = size === "full";
18
- const isHighlighted = status === "highlighted";
19
- const cardStyles = {
20
- position: "relative",
21
- overflow: "hidden",
22
- borderRadius: "var(--corner-radius-400)",
23
- backgroundColor: isHighlighted ? "var(--bg-page-primary)" : "var(--bg-page-tertiary)",
24
- display: "flex",
25
- flexDirection: isFull ? "row" : "column",
26
- gap: isFull ? "var(--spacing-500)" : "var(--spacing-200)",
27
- padding: isFull ? 0 : "var(--spacing-400)",
28
- width: isFull ? "100%" : "100%",
29
- maxWidth: isFull ? "600px" : "400px",
30
- minHeight: isFull ? "240px" : "auto",
31
- };
32
- const overlayStyles = {
33
- position: "absolute",
34
- inset: "-1px",
35
- background: `linear-gradient(to bottom, rgba(255,255,255,0) 26.827%, ${isHighlighted ? "var(--bg-page-primary)" : "var(--bg-page-secondary)"} 86.384%)`,
36
- pointerEvents: "none",
37
- };
38
- if (isFull) {
39
- return (_jsxs("div", { style: cardStyles, children: [showBgPattern && (_jsx("div", { style: {
40
- position: "absolute",
41
- aspectRatio: "64/64",
42
- inset: "-1px",
43
- overflow: "hidden",
44
- }, children: _jsx("div", { style: {
45
- position: "absolute",
46
- inset: "0 -322px -322px 0",
47
- backgroundImage: "url('data:image/svg+xml,%3Csvg width=\"210\" height=\"163\" xmlns=\"http://www.w3.org/2000/svg\"%3E%3Crect width=\"210\" height=\"163\" fill=\"%23d2d2d6\"/%3E%3C/svg%3E')",
48
- backgroundRepeat: "repeat",
49
- backgroundSize: "210px 163px",
50
- } }) })), showOverlay && _jsx("div", { style: overlayStyles }), hasImage && (_jsx("div", { style: {
51
- aspectRatio: imageAspectRatio === "16x9" ? "16/9" : "4/3",
52
- flex: "1 0 0",
53
- maxHeight: "240px",
54
- maxWidth: "300px",
55
- minHeight: "36px",
56
- minWidth: "48px",
57
- position: "relative",
58
- borderRadius: "0 var(--corner-radius-400) 0 0",
59
- overflow: "hidden",
60
- }, children: _jsx("div", { style: {
61
- position: "absolute",
62
- inset: 0,
63
- backgroundColor: "var(--bg-page-secondary)",
64
- borderRadius: "0 var(--corner-radius-400) 0 0",
65
- } }) })), _jsxs("div", { style: {
66
- display: "flex",
67
- flexDirection: "column",
68
- flex: "1 0 0",
69
- gap: "var(--spacing-500)",
70
- alignItems: "flex-start",
71
- minHeight: 0,
72
- minWidth: 0,
73
- padding: "0 0 var(--spacing-500) 0",
74
- position: "relative",
75
- }, children: [_jsxs("div", { style: {
76
- display: "flex",
77
- flexDirection: "column",
78
- gap: "var(--spacing-200)",
79
- alignItems: "flex-start",
80
- width: "100%",
81
- }, children: [_jsx("h4", { style: {
82
- fontFamily: "var(--font-secondary)",
83
- fontSize: "var(--heading-h4-text-size)",
84
- lineHeight: "var(--heading-h4-line-height)",
85
- fontWeight: "var(--font-weight-secondary-semibold)",
86
- color: "var(--fg-neutral)",
87
- margin: 0,
88
- textTransform: "capitalize",
89
- }, children: title }), _jsx("p", { style: {
90
- fontFamily: "var(--font-secondary)",
91
- fontSize: "var(--body-regular-text-size)",
92
- lineHeight: "var(--body-regular-line-height)",
93
- fontWeight: "var(--font-weight-secondary-regular)",
94
- color: "var(--fg-neutral-tertiary)",
95
- margin: 0,
96
- flex: "1 0 0",
97
- display: "-webkit-box",
98
- WebkitLineClamp: 2,
99
- WebkitBoxOrient: "vertical",
100
- overflow: "hidden",
101
- }, children: description })] }), hasIdentifiers && (_jsxs("div", { style: {
102
- display: "flex",
103
- gap: "var(--spacing-200)",
104
- alignItems: "flex-start",
105
- }, children: [_jsx("div", { style: {
106
- backgroundColor: "var(--bg-page-tertiary)",
107
- padding: "var(--spacing-100) var(--spacing-300)",
108
- borderRadius: "var(--corner-radius-full)",
109
- display: "flex",
110
- alignItems: "center",
111
- gap: "var(--spacing-100)",
112
- }, children: _jsx("span", { style: {
113
- fontFamily: "var(--font-secondary)",
114
- fontSize: "var(--body-extra-small-text-size)",
115
- lineHeight: "var(--body-extra-small-line-height)",
116
- color: "var(--fg-neutral-tertiary)",
117
- }, children: "Identifier" }) }), _jsx("div", { style: {
118
- backgroundColor: "var(--bg-page-tertiary)",
119
- padding: "var(--spacing-100) var(--spacing-300)",
120
- borderRadius: "var(--corner-radius-full)",
121
- display: "flex",
122
- alignItems: "center",
123
- gap: "var(--spacing-100)",
124
- }, children: _jsx("span", { style: {
125
- fontFamily: "var(--font-secondary)",
126
- fontSize: "var(--body-extra-small-text-size)",
127
- lineHeight: "var(--body-extra-small-line-height)",
128
- color: "var(--fg-neutral-tertiary)",
129
- }, children: "Tag" }) })] })), hasButton && (_jsxs("div", { style: {
130
- backgroundColor: "var(--bg-primary-tonal)",
131
- padding: "var(--spacing-300) var(--spacing-400)",
132
- borderRadius: "var(--corner-radius-200)",
133
- display: "flex",
134
- alignItems: "center",
135
- gap: "var(--spacing-200)",
136
- cursor: "pointer",
137
- }, children: [_jsx("span", { style: {
138
- fontFamily: "var(--font-secondary)",
139
- fontSize: "var(--body-small-text-size)",
140
- lineHeight: "var(--body-small-line-height)",
141
- fontWeight: "var(--font-weight-secondary-medium)",
142
- color: "var(--fg-primary-on-tonal)",
143
- }, children: "Button" }), _jsx(RightArrowIcon, { size: "xs" })] }))] })] }));
144
- }
145
- // Half size (vertical)
146
- return (_jsxs("div", { style: cardStyles, children: [showBgPattern && (_jsx("div", { style: {
147
- position: "absolute",
148
- aspectRatio: "64/64",
149
- inset: "-1px",
150
- overflow: "hidden",
151
- }, children: _jsx("div", { style: {
152
- position: "absolute",
153
- inset: "0 -322px -322px 0",
154
- backgroundImage: "url('data:image/svg+xml,%3Csvg width=\"210\" height=\"163\" xmlns=\"http://www.w3.org/2000/svg\"%3E%3Crect width=\"210\" height=\"163\" fill=\"%23d2d2d6\"/%3E%3C/svg%3E')",
155
- backgroundRepeat: "repeat",
156
- backgroundSize: "210px 163px",
157
- } }) })), showOverlay && _jsx("div", { style: overlayStyles }), _jsxs("div", { style: {
158
- display: "flex",
159
- flexDirection: "column",
160
- gap: "var(--spacing-200)",
161
- alignItems: "flex-start",
162
- width: "100%",
163
- position: "relative",
164
- }, children: [_jsx("h5", { style: {
165
- fontFamily: "var(--font-secondary)",
166
- fontSize: "var(--heading-h5-text-size)",
167
- lineHeight: "var(--heading-h5-line-height)",
168
- fontWeight: "var(--font-weight-secondary-semibold)",
169
- color: "var(--fg-neutral)",
170
- margin: 0,
171
- textTransform: "capitalize",
172
- }, children: title }), _jsx("p", { style: {
173
- fontFamily: "var(--font-secondary)",
174
- fontSize: "var(--body-regular-text-size)",
175
- lineHeight: "var(--body-regular-line-height)",
176
- fontWeight: "var(--font-weight-secondary-regular)",
177
- color: "var(--fg-neutral-tertiary)",
178
- margin: 0,
179
- display: "-webkit-box",
180
- WebkitLineClamp: 1,
181
- WebkitBoxOrient: "vertical",
182
- overflow: "hidden",
183
- }, children: description })] }), hasImage && (_jsx("div", { style: {
184
- aspectRatio: imageAspectRatio === "16x9" ? "320/180" : "4/3",
185
- minHeight: "27px",
186
- minWidth: "48px",
187
- position: "relative",
188
- borderRadius: "var(--corner-radius-400)",
189
- width: "100%",
190
- overflow: "hidden",
191
- }, children: _jsx("div", { style: {
192
- position: "absolute",
193
- inset: 0,
194
- backgroundColor: "var(--bg-page-secondary)",
195
- borderRadius: "var(--corner-radius-400)",
196
- } }) })), hasIdentifiers && (_jsxs("div", { style: {
197
- display: "flex",
198
- gap: "var(--spacing-200)",
199
- alignItems: "flex-start",
200
- position: "relative",
201
- }, children: [_jsx("div", { style: {
202
- backgroundColor: "var(--bg-page-tertiary)",
203
- padding: "var(--spacing-100) var(--spacing-300)",
204
- borderRadius: "var(--corner-radius-full)",
205
- display: "flex",
206
- alignItems: "center",
207
- gap: "var(--spacing-100)",
208
- }, children: _jsx("span", { style: {
209
- fontFamily: "var(--font-secondary)",
210
- fontSize: "var(--body-extra-small-text-size)",
211
- lineHeight: "var(--body-extra-small-line-height)",
212
- color: "var(--fg-neutral-tertiary)",
213
- }, children: "Identifier" }) }), _jsx("div", { style: {
214
- backgroundColor: "var(--bg-page-tertiary)",
215
- padding: "var(--spacing-100) var(--spacing-300)",
216
- borderRadius: "var(--corner-radius-full)",
217
- display: "flex",
218
- alignItems: "center",
219
- gap: "var(--spacing-100)",
220
- }, children: _jsx("span", { style: {
221
- fontFamily: "var(--font-secondary)",
222
- fontSize: "var(--body-extra-small-text-size)",
223
- lineHeight: "var(--body-extra-small-line-height)",
224
- color: "var(--fg-neutral-tertiary)",
225
- }, children: "Tag" }) })] })), hasButton && (_jsxs("div", { style: {
226
- backgroundColor: "var(--bg-primary-tonal)",
227
- padding: "var(--spacing-300) var(--spacing-400)",
228
- borderRadius: "var(--corner-radius-200)",
229
- display: "flex",
230
- alignItems: "center",
231
- gap: "var(--spacing-200)",
232
- cursor: "pointer",
233
- position: "relative",
234
- }, children: [_jsx("span", { style: {
235
- fontFamily: "var(--font-secondary)",
236
- fontSize: "var(--body-small-text-size)",
237
- lineHeight: "var(--body-small-line-height)",
238
- fontWeight: "var(--font-weight-secondary-medium)",
239
- color: "var(--fg-primary-on-tonal)",
240
- }, children: "Button" }), _jsx(RightArrowIcon, { size: "xs" })] }))] }));
6
+ const CORNER_RADIUS_MAP = {
7
+ 0: "var(--corner-radius-none)",
8
+ 1: "var(--corner-radius-100)",
9
+ 2: "var(--corner-radius-200)",
10
+ 3: "var(--corner-radius-300)",
11
+ 4: "var(--corner-radius-400)",
12
+ 5: "var(--corner-radius-full)",
13
+ };
14
+ function getSpacingToken(padding) {
15
+ if (padding === 0) {
16
+ return "var(--spacing-none)";
17
+ }
18
+ return `var(--spacing-${padding})`;
19
+ }
20
+ function getShadowToken(shadow) {
21
+ if (!shadow)
22
+ return undefined;
23
+ return `var(--drop-shadow-${shadow})`;
24
+ }
25
+ function getHeightValue(height) {
26
+ if (height === undefined)
27
+ return undefined;
28
+ // Allow strings like "200px", "100%", "auto", "fill", etc.
29
+ return height;
30
+ }
31
+ export function Card({ padding = 400, height, status = "default", shadow, cornerRadius = 4, showBgPattern = false, patternType = "cubes", showOverlay = false, showBorder = true, children, className, style, ref, ...rest }) {
32
+ useThemeSafe();
33
+ const isDefault = status === "default";
34
+ const isHighlighted = status === "highlighted";
35
+ const isSelected = status === "selected";
36
+ const heightValue = getHeightValue(height);
37
+ // Only apply overflow: auto for fixed heights (not "auto" or undefined)
38
+ const hasFixedHeight = heightValue && heightValue !== "auto";
39
+ const cardStyles = {
40
+ display: "flex",
41
+ flexDirection: "column",
42
+ gap: "var(--spacing-400)",
43
+ alignItems: "flex-start",
44
+ overflow: hasFixedHeight ? "auto" : "hidden",
45
+ padding: getSpacingToken(padding),
46
+ borderRadius: CORNER_RADIUS_MAP[cornerRadius],
47
+ position: "relative",
48
+ backgroundColor: isDefault ? "var(--bg-page-tertiary)" : "var(--bg-page-primary)",
49
+ ...(heightValue && { height: heightValue }),
50
+ ...(shadow && { boxShadow: getShadowToken(shadow) }),
51
+ ...style,
241
52
  };
242
- const renderExperienceCard = () => {
243
- const isDefault = experienceType === "default";
244
- const isSkills = experienceType === "skills";
245
- const isContacts = experienceType === "contacts";
246
- if (isDefault) {
247
- return (_jsxs("div", { style: {
248
- display: "flex",
249
- gap: "var(--spacing-500)",
250
- alignItems: "flex-start",
251
- width: "480px",
252
- position: "relative",
253
- }, children: [_jsx("div", { style: {
254
- minHeight: "48px",
255
- minWidth: "48px",
256
- width: "64px",
257
- height: "64px",
258
- borderRadius: "var(--corner-radius-200)",
259
- backgroundColor: "var(--bg-page-secondary)",
260
- flexShrink: 0,
261
- } }), _jsxs("div", { style: {
262
- display: "flex",
263
- flexDirection: "column",
264
- flex: "1 0 0",
265
- gap: "var(--spacing-300)",
266
- alignItems: "flex-start",
267
- maxWidth: "600px",
268
- minHeight: 0,
269
- minWidth: 0,
270
- }, children: [_jsxs("div", { style: {
271
- display: "flex",
272
- flexDirection: "column",
273
- gap: "var(--spacing-100)",
274
- alignItems: "flex-start",
275
- width: "100%",
276
- }, children: [_jsx("h6", { style: {
277
- fontFamily: "var(--font-secondary)",
278
- fontSize: "var(--heading-h6-text-size)",
279
- lineHeight: "var(--heading-h6-line-height)",
280
- fontWeight: "var(--font-weight-secondary-semibold)",
281
- color: "var(--fg-neutral)",
282
- margin: 0,
283
- textTransform: "capitalize",
284
- }, children: positionName }), _jsx("p", { style: {
285
- fontFamily: "var(--font-secondary)",
286
- fontSize: "var(--body-regular-text-size)",
287
- lineHeight: "var(--body-regular-line-height)",
288
- fontWeight: "var(--font-weight-secondary-medium)",
289
- color: "var(--fg-neutral-tertiary)",
290
- margin: 0,
291
- }, children: companyName }), _jsx("p", { style: {
292
- fontFamily: "var(--font-secondary)",
293
- fontSize: "var(--body-extra-small-text-size)",
294
- lineHeight: "var(--body-extra-small-line-height)",
295
- fontWeight: "var(--font-weight-secondary-regular)",
296
- color: "var(--fg-neutral-tertiary)",
297
- margin: 0,
298
- }, children: year })] }), _jsx("p", { style: {
299
- fontFamily: "var(--font-secondary)",
300
- fontSize: "var(--body-small-text-size)",
301
- lineHeight: "var(--body-small-line-height)",
302
- fontWeight: "var(--font-weight-secondary-regular)",
303
- color: "var(--fg-neutral-tertiary)",
304
- margin: 0,
305
- }, children: experienceDescription })] })] }));
53
+ if (showBorder) {
54
+ if (isSelected) {
55
+ cardStyles.border = "var(--border-width-25) solid var(--border-primary)";
306
56
  }
307
- if (isSkills) {
308
- return (_jsxs("div", { style: {
309
- display: "flex",
310
- gap: "var(--spacing-400)",
311
- alignItems: "center",
312
- backgroundColor: "var(--bg-page-secondary)",
313
- padding: "var(--spacing-200)",
314
- borderRadius: "var(--corner-radius-200)",
315
- width: "480px",
316
- position: "relative",
317
- }, children: [_jsx("div", { style: {
318
- minHeight: "32px",
319
- minWidth: "32px",
320
- width: "48px",
321
- height: "48px",
322
- borderRadius: "var(--corner-radius-200)",
323
- backgroundColor: "var(--bg-page-tertiary)",
324
- flexShrink: 0,
325
- } }), _jsx("p", { style: {
326
- fontFamily: "var(--font-secondary)",
327
- fontSize: "var(--body-regular-text-size)",
328
- lineHeight: "var(--body-regular-line-height)",
329
- fontWeight: "var(--font-weight-secondary-medium)",
330
- color: "var(--fg-neutral)",
331
- margin: 0,
332
- flex: "1 0 0",
333
- }, children: positionName })] }));
57
+ else {
58
+ cardStyles.border = "var(--border-width-25) solid var(--border-strong-200)";
334
59
  }
335
- // Contacts
336
- return (_jsxs("div", { style: {
337
- display: "flex",
338
- gap: "var(--spacing-400)",
339
- alignItems: "center",
340
- width: "480px",
341
- position: "relative",
342
- }, children: [_jsxs("div", { style: {
343
- display: "flex",
344
- flexDirection: "column",
345
- flex: "1 0 0",
346
- gap: "var(--spacing-100)",
347
- alignItems: "flex-start",
348
- maxWidth: "600px",
349
- minHeight: 0,
350
- minWidth: 0,
351
- }, children: [_jsx("p", { style: {
352
- fontFamily: "var(--font-secondary)",
353
- fontSize: "var(--body-regular-text-size)",
354
- lineHeight: "var(--body-regular-line-height)",
355
- fontWeight: "var(--font-weight-secondary-regular)",
356
- color: "var(--fg-neutral-tertiary)",
357
- margin: 0,
358
- }, children: label }), _jsx("p", { style: {
359
- fontFamily: "var(--font-secondary)",
360
- fontSize: "var(--body-medium-text-size)",
361
- lineHeight: "var(--body-medium-line-height)",
362
- fontWeight: "var(--font-weight-secondary-medium)",
363
- color: "var(--fg-neutral)",
364
- margin: 0,
365
- }, children: details })] }), _jsx("div", { style: {
366
- backgroundColor: "var(--bg-page-tertiary)",
367
- width: "48px",
368
- height: "48px",
369
- borderRadius: "var(--corner-radius-200)",
370
- display: "flex",
371
- alignItems: "center",
372
- justifyContent: "center",
373
- flexShrink: 0,
374
- }, children: _jsx("div", { style: {
375
- width: "24px",
376
- height: "24px",
377
- backgroundColor: "var(--fg-neutral)",
378
- borderRadius: "50%",
379
- } }) })] }));
380
- };
381
- const renderInfoCard = () => {
382
- return (_jsxs("div", { style: {
383
- display: "flex",
384
- gap: "var(--spacing-400)",
385
- alignItems: "flex-start",
386
- width: "480px",
387
- position: "relative",
388
- }, children: [hasIcon && (_jsx("div", { style: {
389
- backgroundColor: "var(--bg-primary-tonal)",
390
- width: "32px",
391
- height: "32px",
392
- borderRadius: "var(--corner-radius-200)",
393
- display: "flex",
394
- alignItems: "center",
395
- justifyContent: "center",
396
- flexShrink: 0,
397
- padding: "8px",
398
- }, children: _jsx("div", { style: {
399
- width: "16px",
400
- height: "16px",
401
- backgroundColor: "var(--fg-primary-on-tonal)",
402
- borderRadius: "50%",
403
- } }) })), _jsxs("div", { style: {
404
- display: "flex",
405
- flexDirection: "column",
406
- flex: "1 0 0",
407
- gap: "var(--spacing-300)",
408
- alignItems: "flex-start",
409
- maxWidth: "600px",
410
- minHeight: 0,
411
- minWidth: 0,
412
- }, children: [_jsx("p", { style: {
413
- fontFamily: "var(--font-secondary)",
414
- fontSize: "var(--body-regular-text-size)",
415
- lineHeight: "var(--body-regular-line-height)",
416
- fontWeight: "var(--font-weight-secondary-medium)",
417
- color: "var(--fg-neutral)",
418
- margin: 0,
419
- }, children: cardName }), _jsx("p", { style: {
420
- fontFamily: "var(--font-secondary)",
421
- fontSize: "var(--body-small-text-size)",
422
- lineHeight: "var(--body-small-line-height)",
423
- fontWeight: "var(--font-weight-secondary-regular)",
424
- color: "var(--fg-neutral-tertiary)",
425
- margin: 0,
426
- textAlign: "justify",
427
- }, children: cardDescription })] })] }));
428
- };
429
- const renderGenericCard = () => {
430
- const isDefault = genericStatus === "default";
431
- const isHighlighted = genericStatus === "highlighted";
432
- const isSelected = genericStatus === "selected";
433
- const cardStyles = {
434
- display: "flex",
435
- flexDirection: "column",
436
- gap: "var(--spacing-400)",
437
- alignItems: "flex-start",
438
- overflow: "hidden",
439
- padding: "var(--spacing-400)",
440
- borderRadius: "var(--corner-radius-400)",
441
- width: "400px",
442
- position: "relative",
443
- backgroundColor: isDefault ? "var(--bg-page-tertiary)" : "var(--bg-page-primary)",
444
- };
445
- if (showBorder) {
446
- if (isSelected) {
447
- cardStyles.border = "var(--border-width-25) solid var(--border-primary)";
448
- }
449
- else {
450
- cardStyles.border = "var(--border-width-25) solid var(--border-strong-200)";
451
- }
60
+ }
61
+ const overlayGradient = isDefault
62
+ ? "var(--bg-page-secondary)"
63
+ : "var(--bg-page-primary)";
64
+ // Build background layers using CSS multiple backgrounds
65
+ // CSS backgrounds stack: first listed = top layer, last listed = bottom layer
66
+ // We want: overlay (middle) first, pattern (bottom) last
67
+ // Content will naturally be on top since it's not a background
68
+ const backgroundLayers = [];
69
+ if (showOverlay) {
70
+ backgroundLayers.push(`linear-gradient(to bottom, rgba(255,255,255,0) 26.827%, ${overlayGradient} 86.384%)`);
71
+ }
72
+ if (showBgPattern) {
73
+ const patternConfig = getPatternConfig(patternType);
74
+ if (patternConfig.imageUrl) {
75
+ backgroundLayers.push(`url("${patternConfig.imageUrl}")`);
452
76
  }
453
- if (showShadow) {
454
- if (isHighlighted) {
455
- cardStyles.boxShadow =
456
- "0px 4px 6px -2px var(--shadow-subtle), 0px -4px 9px -6px var(--shadow-subtle)";
457
- }
458
- else {
459
- cardStyles.boxShadow =
460
- "0px 1px 4px -2px var(--shadow-subtle), 0px 1px 4px 0px var(--shadow-subtle)";
461
- }
77
+ }
78
+ // Apply background layers to card styles
79
+ if (backgroundLayers.length > 0) {
80
+ cardStyles.backgroundImage = backgroundLayers.join(", ");
81
+ if (showBgPattern && showOverlay) {
82
+ const patternConfig = getPatternConfig(patternType);
83
+ // First value applies to first background (overlay), second to pattern
84
+ cardStyles.backgroundRepeat = "no-repeat, repeat";
85
+ cardStyles.backgroundSize = patternConfig.backgroundSize
86
+ ? `100% 100%, ${patternConfig.backgroundSize}`
87
+ : "100% 100%, auto";
88
+ cardStyles.backgroundPosition = patternConfig.backgroundPosition
89
+ ? `center, ${patternConfig.backgroundPosition}`
90
+ : "center, top left";
462
91
  }
463
- const overlayGradient = isDefault
464
- ? "var(--bg-page-secondary)"
465
- : "var(--bg-page-primary)";
466
- return (_jsxs("div", { style: cardStyles, children: [showBgPattern && (() => {
467
- const patternConfig = getPatternConfig(patternType);
468
- if (!patternConfig.imageUrl)
469
- return null;
470
- return (_jsx("div", { style: {
471
- position: "absolute",
472
- aspectRatio: "64/64",
473
- inset: showBorder ? "-1px" : "0",
474
- overflow: "hidden",
475
- zIndex: 1,
476
- }, children: _jsx("div", { style: {
477
- position: "absolute",
478
- inset: patternConfig.inset || "0",
479
- backgroundImage: `url("${patternConfig.imageUrl}")`,
480
- backgroundRepeat: "repeat",
481
- backgroundSize: patternConfig.backgroundSize,
482
- backgroundPosition: patternConfig.backgroundPosition || "top left",
483
- } }) }));
484
- })(), showOverlay && (_jsx("div", { style: {
485
- position: "absolute",
486
- inset: showBorder ? "-1px" : "0",
487
- background: `linear-gradient(to bottom, rgba(255,255,255,0) 26.827%, ${overlayGradient} 86.384%)`,
488
- pointerEvents: "none",
489
- zIndex: 2,
490
- } })), slot || (_jsx("div", { style: {
491
- backgroundColor: "var(--bg-warning-tonal)",
492
- border: "var(--border-width-25) dashed var(--border-warning)",
493
- padding: "var(--spacing-200) 8px",
494
- borderRadius: "var(--corner-radius-100)",
495
- width: "100%",
496
- display: "flex",
497
- alignItems: "center",
498
- justifyContent: "center",
499
- minHeight: "32px",
500
- position: "relative",
501
- zIndex: 3,
502
- }, children: _jsx("div", { style: { color: "var(--fg-warning-on-tonal)" }, children: _jsx(ArrowDownFallSlotIcon, { size: "xs" }) }) }))] }));
503
- };
504
- const renderCard = () => {
505
- switch (cardType) {
506
- case "product":
507
- return renderProductCard();
508
- case "experience":
509
- return renderExperienceCard();
510
- case "info":
511
- return renderInfoCard();
512
- case "generic":
513
- return renderGenericCard();
514
- default:
515
- return null;
92
+ else if (showBgPattern) {
93
+ const patternConfig = getPatternConfig(patternType);
94
+ cardStyles.backgroundRepeat = "repeat";
95
+ cardStyles.backgroundSize = patternConfig.backgroundSize || "auto";
96
+ cardStyles.backgroundPosition = patternConfig.backgroundPosition || "top left";
516
97
  }
517
- };
518
- return (_jsx("div", { ref: ref, className: className, style: style, ...rest, children: renderCard() }));
98
+ else if (showOverlay) {
99
+ cardStyles.backgroundRepeat = "no-repeat";
100
+ cardStyles.backgroundSize = "100% 100%";
101
+ cardStyles.backgroundPosition = "center";
102
+ }
103
+ }
104
+ return (_jsx("div", { ref: ref, className: className, style: cardStyles, ...rest, children: children || (_jsx("div", { style: {
105
+ backgroundColor: "var(--bg-warning-tonal)",
106
+ border: "var(--border-width-25) dashed var(--border-warning)",
107
+ padding: "var(--spacing-200) 8px",
108
+ borderRadius: "var(--corner-radius-100)",
109
+ width: "100%",
110
+ display: "flex",
111
+ alignItems: "center",
112
+ justifyContent: "center",
113
+ minHeight: "32px",
114
+ }, children: _jsx("div", { style: { color: "var(--fg-warning-on-tonal)" }, children: _jsx(ArrowDownFallSlotIcon, { size: "xs" }) }) })) }));
519
115
  }
@@ -7,6 +7,17 @@ export interface MenuItem {
7
7
  selected?: boolean;
8
8
  onClick?: (item: MenuItem) => void;
9
9
  }
10
+ export interface SwitchRenderProps {
11
+ checked: boolean;
12
+ onChange: (checked: boolean) => void;
13
+ }
14
+ export interface ToggleButtonRenderProps {
15
+ isOpen: boolean;
16
+ onClick: () => void;
17
+ }
18
+ export interface MenuButtonRenderProps {
19
+ onClick: () => void;
20
+ }
10
21
  export interface MenuProps extends ComponentPropsWithRef<"div"> {
11
22
  variant?: MenuVariant;
12
23
  showMenu?: boolean;
@@ -18,7 +29,13 @@ export interface MenuProps extends ComponentPropsWithRef<"div"> {
18
29
  avatarImageUrl?: string;
19
30
  selectedItemId?: string;
20
31
  onItemClick?: (item: MenuItem) => void;
32
+ renderSwitch?: (props: SwitchRenderProps) => ReactNode;
33
+ renderToggleButton?: (props: ToggleButtonRenderProps) => ReactNode;
34
+ renderButton?: (props: MenuButtonRenderProps) => ReactNode;
35
+ onSwitchChange?: (checked: boolean) => void;
36
+ onToggleButtonClick?: () => void;
37
+ onButtonClick?: () => void;
21
38
  }
22
- export declare function Menu({ variant, showMenu, showButton, menuItems, headerTitle, headerSubtitle, showChevrons, avatarImageUrl, selectedItemId, onItemClick, className, style, ref, ...rest }: MenuProps): import("react/jsx-runtime").JSX.Element;
39
+ export declare function Menu({ variant, showMenu, showButton, menuItems, headerTitle, headerSubtitle, showChevrons, avatarImageUrl, selectedItemId, onItemClick, renderSwitch, renderToggleButton, renderButton, onSwitchChange, onToggleButtonClick, onButtonClick, className, style, ref, ...rest }: MenuProps): import("react/jsx-runtime").JSX.Element;
23
40
  export {};
24
41
  //# sourceMappingURL=Menu.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../src/components/Menu.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAW,qBAAqB,EAAY,SAAS,EAAE,MAAM,OAAO,CAAC;AAM5E,KAAK,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,eAAe,GAAG,aAAa,GAAG,eAAe,GAAG,YAAY,CAAC;AAEhH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,SAAU,SAAQ,qBAAqB,CAAC,KAAK,CAAC;IAC7D,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;CACxC;AAUD,wBAAgB,IAAI,CAAC,EACnB,OAAmB,EACnB,QAAe,EACf,UAAiB,EACjB,SAA8B,EAC9B,WAAqB,EACrB,cAA2B,EAC3B,YAAmB,EACnB,cAAc,EACd,cAAc,EACd,WAAW,EACX,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,SAAS,2CA2aX"}
1
+ {"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../src/components/Menu.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAW,qBAAqB,EAAoC,SAAS,EAAE,MAAM,OAAO,CAAC;AAMpG,KAAK,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,eAAe,GAAG,aAAa,GAAG,eAAe,GAAG,YAAY,CAAC;AAEhH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,SAAU,SAAQ,qBAAqB,CAAC,KAAK,CAAC;IAC7D,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,SAAS,CAAC;IACvD,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,SAAS,CAAC;IACnE,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,SAAS,CAAC;IAC3D,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B;AAUD,wBAAgB,IAAI,CAAC,EACnB,OAAmB,EACnB,QAAe,EACf,UAAiB,EACjB,SAA8B,EAC9B,WAAqB,EACrB,cAA2B,EAC3B,YAAmB,EACnB,cAAc,EACd,cAAc,EACd,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,SAAS,2CAieX"}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useMemo, useState } from "react";
3
+ import { useMemo, useState, useCallback, useEffect } from "react";
4
4
  import { CloseIcon, MenuIcon, DownloadIcon } from "../icons";
5
5
  import { Switch } from "./Switch";
6
6
  import { useThemeSafe } from "../providers/ThemeProvider";
@@ -12,10 +12,31 @@ const DEFAULT_MENU_ITEMS = [
12
12
  { id: "4", label: "Menu Item #4" },
13
13
  { id: "5", label: "Menu Item #5" },
14
14
  ];
15
- export function Menu({ variant = "desktop", showMenu = true, showButton = true, menuItems = DEFAULT_MENU_ITEMS, headerTitle = "Title", headerSubtitle = "Subtitle", showChevrons = true, avatarImageUrl, selectedItemId, onItemClick, className, style, ref, ...rest }) {
15
+ export function Menu({ variant = "desktop", showMenu = true, showButton = true, menuItems = DEFAULT_MENU_ITEMS, headerTitle = "Title", headerSubtitle = "Subtitle", showChevrons = true, avatarImageUrl, selectedItemId, onItemClick, renderSwitch, renderToggleButton, renderButton, onSwitchChange, onToggleButtonClick, onButtonClick, className, style, ref, ...rest }) {
16
16
  const themeContext = useThemeSafe();
17
17
  const theme = themeContext?.theme ?? "dark";
18
18
  const [hoveredItemId, setHoveredItemId] = useState(null);
19
+ const [switchChecked, setSwitchChecked] = useState(theme === "dark");
20
+ // Update switch checked state when theme changes
21
+ useEffect(() => {
22
+ setSwitchChecked(theme === "dark");
23
+ }, [theme]);
24
+ const handleSwitchChange = useCallback((checked) => {
25
+ setSwitchChecked(checked);
26
+ if (onSwitchChange) {
27
+ onSwitchChange(checked);
28
+ }
29
+ }, [onSwitchChange]);
30
+ const handleToggleButtonClick = useCallback(() => {
31
+ if (onToggleButtonClick) {
32
+ onToggleButtonClick();
33
+ }
34
+ }, [onToggleButtonClick]);
35
+ const handleButtonClick = useCallback(() => {
36
+ if (onButtonClick) {
37
+ onButtonClick();
38
+ }
39
+ }, [onButtonClick]);
19
40
  const containerStyles = useMemo(() => {
20
41
  const baseStyles = {
21
42
  display: "flex",
@@ -178,7 +199,7 @@ export function Menu({ variant = "desktop", showMenu = true, showButton = true,
178
199
  };
179
200
  }, []);
180
201
  if (variant === "close-menu") {
181
- return (_jsx("div", { ref: ref, className: className, style: { ...containerStyles, ...style }, ...rest, children: _jsx("button", { style: iconButtonStyles, children: _jsx("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", width: "32px", height: "32px" }, children: _jsx(CloseIcon, { size: 32 }) }) }) }));
202
+ return (_jsx("div", { ref: ref, className: className, style: { ...containerStyles, ...style }, ...rest, children: renderToggleButton ? (renderToggleButton({ isOpen: true, onClick: handleToggleButtonClick })) : (_jsx("button", { style: iconButtonStyles, onClick: handleToggleButtonClick, children: _jsx("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", width: "32px", height: "32px" }, children: _jsx(CloseIcon, { size: 32 }) }) })) }));
182
203
  }
183
204
  const isDesktop = variant === "desktop";
184
205
  const isTabletOpen = variant === "tablet-open";
@@ -257,7 +278,10 @@ export function Menu({ variant = "desktop", showMenu = true, showButton = true,
257
278
  fontWeight: "var(--font-weight-secondary-medium)",
258
279
  color: "var(--fg-neutral)",
259
280
  margin: 0,
260
- }, children: headerSubtitle })] }))] }), _jsxs("div", { style: footerStyles, children: [showButton && (_jsxs("div", { style: buttonStyles, children: [_jsx("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", width: "16px", height: "16px" }, children: _jsx(DownloadIcon, { size: 16 }) }), _jsx("span", { children: "Button" })] })), _jsx(Switch, { checked: theme === "dark", showIcons: true }), _jsx("button", { style: iconButtonStyles, children: _jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", width: "32px", height: "32px" }, children: [(isTabletOpen || isMobileOpen) && _jsx(CloseIcon, { size: 32 }), (isTabletClosed || isMobileClosed) && _jsx(MenuIcon, { size: 32 })] }) })] })] })), showMenuItems && (_jsx("div", { style: {
281
+ }, children: headerSubtitle })] }))] }), _jsxs("div", { style: footerStyles, children: [showButton && (renderButton ? (renderButton({ onClick: handleButtonClick })) : (_jsxs("div", { style: buttonStyles, onClick: handleButtonClick, children: [_jsx("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", width: "16px", height: "16px" }, children: _jsx(DownloadIcon, { size: 16 }) }), _jsx("span", { children: "Button" })] }))), renderSwitch ? (renderSwitch({ checked: switchChecked, onChange: handleSwitchChange })) : (_jsx(Switch, { checked: switchChecked, onChange: handleSwitchChange, showIcons: true })), renderToggleButton ? (renderToggleButton({
282
+ isOpen: isTabletOpen || isMobileOpen,
283
+ onClick: handleToggleButtonClick
284
+ })) : (_jsx("button", { style: iconButtonStyles, onClick: handleToggleButtonClick, children: _jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", width: "32px", height: "32px" }, children: [(isTabletOpen || isMobileOpen) && _jsx(CloseIcon, { size: 32 }), (isTabletClosed || isMobileClosed) && _jsx(MenuIcon, { size: 32 })] }) }))] })] })), showMenuItems && (_jsx("div", { style: {
261
285
  display: "flex",
262
286
  flexDirection: "column",
263
287
  gap: "var(--spacing-200)",
@@ -284,5 +308,5 @@ export function Menu({ variant = "desktop", showMenu = true, showButton = true,
284
308
  // Determine state for MenuItem component
285
309
  const itemState = isSelected ? "Active" : isHovered ? "Hovered" : "Default";
286
310
  return (_jsx(MenuItemComponent, { menuTitle: item.label, iconStart: true, iconStart1: item.icon || null, iconEnd: showChevrons, iconEnd1: null, state: itemState, onClick: handleClick, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave }, item.id));
287
- }) })), isDesktop && (_jsxs(_Fragment, { children: [showButton && (_jsx("div", { style: { display: "flex", flexDirection: "column", gap: "var(--spacing-400)", padding: "var(--spacing-400)", width: "100%" }, children: _jsxs("div", { style: buttonStyles, children: [_jsx("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", width: "16px", height: "16px" }, children: _jsx(DownloadIcon, { size: 16 }) }), _jsx("span", { children: "Button" })] }) })), _jsx("div", { style: footerStyles, children: _jsx(Switch, { checked: theme === "dark", showIcons: true }) })] }))] }));
311
+ }) })), isDesktop && (_jsxs(_Fragment, { children: [showButton && (_jsx("div", { style: { display: "flex", flexDirection: "column", gap: "var(--spacing-400)", padding: "var(--spacing-400)", width: "100%" }, children: renderButton ? (renderButton({ onClick: handleButtonClick })) : (_jsxs("div", { style: buttonStyles, onClick: handleButtonClick, children: [_jsx("div", { style: { display: "flex", alignItems: "center", justifyContent: "center", width: "16px", height: "16px" }, children: _jsx(DownloadIcon, { size: 16 }) }), _jsx("span", { children: "Button" })] })) })), _jsx("div", { style: footerStyles, children: renderSwitch ? (renderSwitch({ checked: switchChecked, onChange: handleSwitchChange })) : (_jsx(Switch, { checked: switchChecked, onChange: handleSwitchChange, showIcons: true })) })] }))] }));
288
312
  }
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@ export { Menu, type MenuItem as MenuItemData } from "./components/Menu";
9
9
  export { MenuItem, type MenuItemProps, type MenuItemState } from "./components/MenuItem";
10
10
  export { RadioButton } from "./components/RadioButton";
11
11
  export type { ButtonProps, ButtonVariant, ButtonSize, CornerRadiusStep, JustifyContent, ButtonState, ButtonColor } from "./components/Button";
12
- export type { CardProps, CardType, ProductCardSize, ProductCardStatus, ExperienceCardType, GenericCardStatus } from "./components/Card";
12
+ export type { CardProps, CardStatus, CardShadow } from "./components/Card";
13
13
  export type { CheckboxProps, CheckboxStatus } from "./components/Checkbox";
14
14
  export type { SwitchProps, SwitchStatus } from "./components/Switch";
15
15
  export type { InputProps, InputSize, InputStatus } from "./components/Input";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,KAAK,QAAQ,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC9I,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxI,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC3E,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACrE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7E,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC3G,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACxE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGpF,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGlF,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EACV,cAAc,EACd,aAAa,EACb,YAAY,EACZ,eAAe,EACf,eAAe,EACf,WAAW,GACZ,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,KAAK,QAAQ,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC9I,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC3E,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC3E,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACrE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7E,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC3G,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACxE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGpF,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGlF,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EACV,cAAc,EACd,aAAa,EACb,YAAY,EACZ,eAAe,EACf,eAAe,EACf,WAAW,GACZ,MAAM,gBAAgB,CAAC"}
@@ -12,8 +12,8 @@ export interface PatternConfig {
12
12
  }
13
13
  /**
14
14
  * Pattern configurations with image URLs and tiling settings
15
- * Note: These URLs are from Figma and expire after 7 days.
16
- * For production, download these images and store them in public/images/patterns/
15
+ * Images are stored in the package assets and copied to public/images/patterns/ during build
16
+ * They are referenced via /images/patterns/ paths in the consuming application
17
17
  */
18
18
  export declare const PATTERN_CONFIGS: Record<PatternType, PatternConfig>;
19
19
  /**
@@ -5,8 +5,8 @@
5
5
  */
6
6
  /**
7
7
  * Pattern configurations with image URLs and tiling settings
8
- * Note: These URLs are from Figma and expire after 7 days.
9
- * For production, download these images and store them in public/images/patterns/
8
+ * Images are stored in the package assets and copied to public/images/patterns/ during build
9
+ * They are referenced via /images/patterns/ paths in the consuming application
10
10
  */
11
11
  export const PATTERN_CONFIGS = {
12
12
  default: {
@@ -14,60 +14,60 @@ export const PATTERN_CONFIGS = {
14
14
  backgroundSize: "128px 128px",
15
15
  },
16
16
  cubes: {
17
- imageUrl: "https://www.figma.com/api/mcp/asset/3594165a-11de-4be4-818c-90c23daf0172",
17
+ imageUrl: "/images/patterns/Cube_pt.png",
18
18
  backgroundSize: "33.5px 50px",
19
19
  backgroundPosition: "top left",
20
20
  },
21
21
  mathematics: {
22
- imageUrl: "https://www.figma.com/api/mcp/asset/db1da532-dc86-42e2-8edb-cebd1f4583d9",
22
+ imageUrl: "/images/patterns/Maths_pt.png",
23
23
  backgroundSize: "64px 128px",
24
24
  backgroundPosition: "top left",
25
25
  inset: "0 -322px -322px 0",
26
26
  },
27
27
  dots: {
28
- imageUrl: "https://www.figma.com/api/mcp/asset/c320aab8-9413-4f04-b5d9-5dab473bf72c",
28
+ imageUrl: "/images/patterns/Dots_pt.png",
29
29
  backgroundSize: "186px 186px",
30
30
  backgroundPosition: "top left",
31
31
  inset: "0 -322px -322px 0",
32
32
  },
33
33
  diagonal: {
34
- imageUrl: "https://www.figma.com/api/mcp/asset/63f95452-d091-48c8-9315-17b2db88811f",
34
+ imageUrl: "/images/patterns/Diagonal_pt.png",
35
35
  backgroundSize: "7px 7px",
36
36
  backgroundPosition: "top left",
37
37
  inset: "0 -322px -322px 0",
38
38
  },
39
39
  smudge: {
40
- imageUrl: "https://www.figma.com/api/mcp/asset/953c58bc-519e-453a-801e-aa7771123bf0",
40
+ imageUrl: "/images/patterns/Smudge_pt.png",
41
41
  backgroundSize: "200px 200px",
42
42
  backgroundPosition: "top left",
43
43
  inset: "0 -322px -322px 0",
44
44
  },
45
45
  paper: {
46
- imageUrl: "https://www.figma.com/api/mcp/asset/6cac21b4-e9cb-4b07-9655-9da328879b35",
46
+ imageUrl: "/images/patterns/Rough_Paper_pt.png",
47
47
  backgroundSize: "158px 158px",
48
48
  backgroundPosition: "top left",
49
49
  inset: "0 -322px -322px 0",
50
50
  },
51
51
  denim: {
52
- imageUrl: "https://www.figma.com/api/mcp/asset/df4b639a-4aa8-47b3-a356-1704c5d0e8ca",
52
+ imageUrl: "/images/patterns/Denim_pt.png",
53
53
  backgroundSize: "210px 163px",
54
54
  backgroundPosition: "top left",
55
55
  inset: "0 -322px -322px 0",
56
56
  },
57
57
  squares: {
58
- imageUrl: "https://www.figma.com/api/mcp/asset/7d44ab02-5237-4466-9957-80d02eac70a8",
58
+ imageUrl: "/images/patterns/Squares_pt.png",
59
59
  backgroundSize: "32px 32px",
60
60
  backgroundPosition: "top left",
61
61
  inset: "0 -322px -322px 0",
62
62
  },
63
63
  mosaic: {
64
- imageUrl: "https://www.figma.com/api/mcp/asset/d78c45bb-6e59-4444-a78b-740387c8d790",
64
+ imageUrl: "/images/patterns/Mosaic_pt.png",
65
65
  backgroundSize: "355px 288px",
66
66
  backgroundPosition: "top left",
67
67
  inset: "0 -322px -322px 0",
68
68
  },
69
69
  cotton: {
70
- imageUrl: "https://www.figma.com/api/mcp/asset/9010e582-f104-4247-9a42-450d3c28fa71",
70
+ imageUrl: "/images/patterns/Cotton_pt.png",
71
71
  backgroundSize: "157.5px 157.5px",
72
72
  backgroundPosition: "top left",
73
73
  inset: "0 -322px -322px 0",
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "beacon-ui",
3
- "version": "3.1.8",
3
+ "version": "3.2.0",
4
4
  "description": "Beacon Design System - Components and tokens",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "files": [
8
8
  "dist",
9
9
  "tokens",
10
+ "assets",
10
11
  "README.md",
11
12
  "CHANGELOG.md"
12
13
  ],