mood-blobs 0.1.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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +124 -0
  3. package/dist/cjs/animations.js +109 -0
  4. package/dist/cjs/components/MoodBlob.js +33 -0
  5. package/dist/cjs/components/moods/Angry.js +12 -0
  6. package/dist/cjs/components/moods/Cool.js +12 -0
  7. package/dist/cjs/components/moods/Disgusted.js +12 -0
  8. package/dist/cjs/components/moods/Excited.js +12 -0
  9. package/dist/cjs/components/moods/Happy.js +12 -0
  10. package/dist/cjs/components/moods/Love.js +12 -0
  11. package/dist/cjs/components/moods/Nervous.js +12 -0
  12. package/dist/cjs/components/moods/Sad.js +12 -0
  13. package/dist/cjs/components/moods/Sleepy.js +12 -0
  14. package/dist/cjs/components/moods/Surprised.js +12 -0
  15. package/dist/cjs/components/moods/index.js +35 -0
  16. package/dist/cjs/constants.js +34 -0
  17. package/dist/cjs/index.js +8 -0
  18. package/dist/cjs/types.js +2 -0
  19. package/dist/esm/animations.js +106 -0
  20. package/dist/esm/components/MoodBlob.js +29 -0
  21. package/dist/esm/components/moods/Angry.js +8 -0
  22. package/dist/esm/components/moods/Cool.js +8 -0
  23. package/dist/esm/components/moods/Disgusted.js +8 -0
  24. package/dist/esm/components/moods/Excited.js +8 -0
  25. package/dist/esm/components/moods/Happy.js +8 -0
  26. package/dist/esm/components/moods/Love.js +8 -0
  27. package/dist/esm/components/moods/Nervous.js +8 -0
  28. package/dist/esm/components/moods/Sad.js +8 -0
  29. package/dist/esm/components/moods/Sleepy.js +8 -0
  30. package/dist/esm/components/moods/Surprised.js +8 -0
  31. package/dist/esm/components/moods/index.js +23 -0
  32. package/dist/esm/constants.js +31 -0
  33. package/dist/esm/index.js +2 -0
  34. package/dist/esm/types.js +1 -0
  35. package/dist/types/animations.d.ts +1 -0
  36. package/dist/types/components/MoodBlob.d.ts +3 -0
  37. package/dist/types/components/moods/Angry.d.ts +3 -0
  38. package/dist/types/components/moods/Cool.d.ts +3 -0
  39. package/dist/types/components/moods/Disgusted.d.ts +3 -0
  40. package/dist/types/components/moods/Excited.d.ts +3 -0
  41. package/dist/types/components/moods/Happy.d.ts +3 -0
  42. package/dist/types/components/moods/Love.d.ts +3 -0
  43. package/dist/types/components/moods/Nervous.d.ts +3 -0
  44. package/dist/types/components/moods/Sad.d.ts +3 -0
  45. package/dist/types/components/moods/Sleepy.d.ts +3 -0
  46. package/dist/types/components/moods/Surprised.d.ts +3 -0
  47. package/dist/types/components/moods/index.d.ts +14 -0
  48. package/dist/types/constants.d.ts +4 -0
  49. package/dist/types/index.d.ts +3 -0
  50. package/dist/types/types.d.ts +19 -0
  51. package/package.json +31 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Arnaud Manaranche
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,124 @@
1
+ # mood-blobs
2
+
3
+ ![screenshot](screenshot.png)
4
+
5
+ Expressive SVG blob components representing different moods for React.
6
+
7
+ ```tsx
8
+ <MoodBlob mood="happy" size="m" />
9
+ <MoodBlob mood="angry" size="l" color="#FF6B6B" />
10
+ ```
11
+
12
+ ## Features
13
+
14
+ - 10 hand-crafted moods with unique blob shapes and expressive faces
15
+ - Fully typed with TypeScript
16
+ - Zero dependencies (besides React)
17
+ - Scales to any size via SVG
18
+ - Customizable colors
19
+
20
+ ## Moods
21
+
22
+ `happy` · `sad` · `angry` · `surprised` · `nervous` · `cool` · `love` · `disgusted` · `sleepy` · `excited`
23
+
24
+ ## Installation
25
+
26
+ ```bash
27
+ npm install mood-blobs
28
+ ```
29
+
30
+ Requires `react >= 17` as a peer dependency.
31
+
32
+ ## Usage
33
+
34
+ ```tsx
35
+ import { MoodBlob } from 'mood-blobs';
36
+
37
+ // Basic
38
+ <MoodBlob mood="happy" />
39
+
40
+ // With size
41
+ <MoodBlob mood="sad" size="l" />
42
+
43
+ // With custom color
44
+ <MoodBlob mood="angry" size="m" color="#FF6B6B" />
45
+
46
+ // With className / style
47
+ <MoodBlob
48
+ mood="excited"
49
+ size="xl"
50
+ style={{ filter: 'drop-shadow(0 4px 12px rgba(0,0,0,0.15))' }}
51
+ />
52
+ ```
53
+
54
+ ## Props
55
+
56
+ | Prop | Type | Default | Description |
57
+ |-------------|-----------------|--------------|------------------------------------------|
58
+ | `mood` | `Mood` | **required** | The emotional expression to render |
59
+ | `size` | `Size` | `"m"` | `xs`=80px · `s`=120px · `m`=160px · `l`=220px · `xl`=300px |
60
+ | `color` | `string` | mood default | Any valid CSS color string |
61
+ | `className` | `string` | — | Added to the root `<svg>` element |
62
+ | `style` | `CSSProperties` | — | Inline styles on the root `<svg>` |
63
+
64
+ ## Default colors
65
+
66
+ ```ts
67
+ happy: '#FFD93D' // bright yellow
68
+ sad: '#74B9FF' // sky blue
69
+ angry: '#FF6B6B' // coral red
70
+ surprised: '#A29BFE' // lavender
71
+ nervous: '#55EFC4' // mint
72
+ cool: '#636E72' // slate gray
73
+ love: '#FD79A8' // pink
74
+ disgusted: '#6C5CE7' // purple
75
+ sleepy: '#B2BEC3' // light gray-blue
76
+ excited: '#FDCB6E' // warm orange
77
+ ```
78
+
79
+ ## Project structure
80
+
81
+ ```
82
+ mood-blobs/
83
+ ├── src/ # Library source (the npm package)
84
+ │ ├── index.ts
85
+ │ ├── types.ts
86
+ │ ├── constants.ts
87
+ │ └── components/
88
+ │ ├── MoodBlob.tsx
89
+ │ └── moods/ # One file per mood
90
+ │ ├── Happy.tsx
91
+ │ ├── Sad.tsx
92
+ │ ├── Angry.tsx
93
+ │ ├── Surprised.tsx
94
+ │ ├── Nervous.tsx
95
+ │ ├── Cool.tsx
96
+ │ ├── Love.tsx
97
+ │ ├── Disgusted.tsx
98
+ │ ├── Sleepy.tsx
99
+ │ └── Excited.tsx
100
+ ├── website/ # Static documentation site
101
+ │ ├── index.html
102
+ │ └── styles.css
103
+ └── README.md
104
+ ```
105
+
106
+ ## Running the demo
107
+
108
+ ```bash
109
+ npm install
110
+ npm run demo
111
+ ```
112
+
113
+ ## Building the library
114
+
115
+ ```bash
116
+ npm install
117
+ npm run build
118
+ ```
119
+
120
+ This outputs CommonJS and ESM builds to `dist/`.
121
+
122
+ ## License
123
+
124
+ MIT
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KEYFRAMES_CSS = void 0;
4
+ exports.KEYFRAMES_CSS = `
5
+ @keyframes mb-happy-bounce {
6
+ 0% { transform: translateY(0) scaleX(1) scaleY(1); }
7
+ 20% { transform: translateY(-30%) scaleX(0.9) scaleY(1.1); }
8
+ 40% { transform: translateY(0) scaleX(1.15) scaleY(0.85); }
9
+ 55% { transform: translateY(-15%) scaleX(0.95) scaleY(1.05); }
10
+ 70% { transform: translateY(0) scaleX(1.05) scaleY(0.95); }
11
+ 85% { transform: translateY(-5%) scaleX(1) scaleY(1); }
12
+ 100% { transform: translateY(0) scaleX(1) scaleY(1); }
13
+ }
14
+
15
+ @keyframes mb-sad-slump {
16
+ 0% { transform: translateY(0) scaleX(1) scaleY(1); }
17
+ 30% { transform: translateY(15%) scaleX(1.1) scaleY(0.85); }
18
+ 50% { transform: translateY(20%) scaleX(1.15) scaleY(0.8); }
19
+ 65% { transform: translateY(10%) scaleX(1.05) scaleY(0.9); }
20
+ 80% { transform: translateY(5%) scaleX(1.02) scaleY(0.97); }
21
+ 100% { transform: translateY(0) scaleX(1) scaleY(1); }
22
+ }
23
+
24
+ @keyframes mb-angry-shake {
25
+ 0% { transform: translateX(0) rotate(0deg) scale(1); }
26
+ 10% { transform: translateX(-8%) rotate(-3deg) scale(1.05); }
27
+ 20% { transform: translateX(8%) rotate(3deg) scale(1.05); }
28
+ 30% { transform: translateX(-8%) rotate(-3deg) scale(1.05); }
29
+ 40% { transform: translateX(8%) rotate(3deg) scale(1.05); }
30
+ 50% { transform: translateX(-6%) rotate(-2deg) scale(1.02); }
31
+ 60% { transform: translateX(6%) rotate(2deg) scale(1.02); }
32
+ 70% { transform: translateX(-4%) rotate(-1deg) scale(1); }
33
+ 80% { transform: translateX(4%) rotate(1deg) scale(1); }
34
+ 90% { transform: translateX(-2%) rotate(0deg) scale(1); }
35
+ 100% { transform: translateX(0) rotate(0deg) scale(1); }
36
+ }
37
+
38
+ @keyframes mb-surprised-pop {
39
+ 0% { transform: scale(1); }
40
+ 15% { transform: scale(0.85); }
41
+ 35% { transform: scale(1.3); }
42
+ 55% { transform: scale(0.95); }
43
+ 70% { transform: scale(1.05); }
44
+ 85% { transform: scale(0.98); }
45
+ 100% { transform: scale(1); }
46
+ }
47
+
48
+ @keyframes mb-nervous-jitter {
49
+ 0% { transform: translate(0, 0) rotate(0deg); }
50
+ 10% { transform: translate(-3%, 2%) rotate(-1deg); }
51
+ 20% { transform: translate(3%, -2%) rotate(1deg); }
52
+ 30% { transform: translate(-2%, -3%) rotate(-1.5deg); }
53
+ 40% { transform: translate(2%, 3%) rotate(1deg); }
54
+ 50% { transform: translate(-3%, -1%) rotate(-0.5deg); }
55
+ 60% { transform: translate(3%, 1%) rotate(1.5deg); }
56
+ 70% { transform: translate(-1%, 2%) rotate(-1deg); }
57
+ 80% { transform: translate(1%, -2%) rotate(0.5deg); }
58
+ 90% { transform: translate(-2%, 1%) rotate(-0.5deg); }
59
+ 100% { transform: translate(0, 0) rotate(0deg); }
60
+ }
61
+
62
+ @keyframes mb-cool-swagger {
63
+ 0% { transform: translateX(0) rotate(0deg); }
64
+ 25% { transform: translateX(-8%) rotate(-4deg); }
65
+ 50% { transform: translateX(0) rotate(0deg); }
66
+ 75% { transform: translateX(8%) rotate(4deg); }
67
+ 100% { transform: translateX(0) rotate(0deg); }
68
+ }
69
+
70
+ @keyframes mb-love-pulse {
71
+ 0% { transform: scale(1); }
72
+ 15% { transform: scale(1.15); }
73
+ 30% { transform: scale(1); }
74
+ 45% { transform: scale(1.2); }
75
+ 60% { transform: scale(1); }
76
+ 80% { transform: scale(1.02); }
77
+ 100% { transform: scale(1); }
78
+ }
79
+
80
+ @keyframes mb-disgusted-recoil {
81
+ 0% { transform: translate(0, 0) rotate(0deg); }
82
+ 20% { transform: translate(-15%, -10%) rotate(-8deg); }
83
+ 40% { transform: translate(-10%, -5%) rotate(-5deg); }
84
+ 55% { transform: translate(-5%, 0) rotate(-2deg) scaleX(1.05); }
85
+ 65% { transform: translate(3%, 2%) rotate(2deg); }
86
+ 75% { transform: translate(-2%, -1%) rotate(-1deg); }
87
+ 85% { transform: translate(1%, 0) rotate(0.5deg); }
88
+ 100% { transform: translate(0, 0) rotate(0deg); }
89
+ }
90
+
91
+ @keyframes mb-sleepy-nod {
92
+ 0% { transform: translateY(0) rotate(0deg); }
93
+ 30% { transform: translateY(10%) rotate(10deg); }
94
+ 60% { transform: translateY(15%) rotate(15deg); }
95
+ 80% { transform: translateY(8%) rotate(8deg); }
96
+ 100% { transform: translateY(0) rotate(0deg); }
97
+ }
98
+
99
+ @keyframes mb-excited-burst {
100
+ 0% { transform: translateY(0) rotate(0deg) scale(1); }
101
+ 15% { transform: translateY(-25%) rotate(8deg) scale(1.1); }
102
+ 30% { transform: translateY(0) rotate(-4deg) scale(0.95); }
103
+ 45% { transform: translateY(-18%) rotate(6deg) scale(1.08); }
104
+ 60% { transform: translateY(0) rotate(-3deg) scale(0.97); }
105
+ 75% { transform: translateY(-10%) rotate(4deg) scale(1.04); }
106
+ 88% { transform: translateY(0) rotate(-2deg) scale(0.99); }
107
+ 100% { transform: translateY(0) rotate(0deg) scale(1); }
108
+ }
109
+ `;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MoodBlob = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const constants_1 = require("../constants");
7
+ const animations_1 = require("../animations");
8
+ const moods_1 = require("./moods");
9
+ let stylesInjected = false;
10
+ const MoodBlob = ({ mood, size = 'm', color, className, style, onClick, }) => {
11
+ const [isAnimating, setIsAnimating] = (0, react_1.useState)(false);
12
+ (0, react_1.useEffect)(() => {
13
+ if (typeof document === 'undefined' || stylesInjected)
14
+ return;
15
+ stylesInjected = true;
16
+ const el = document.createElement('style');
17
+ el.setAttribute('data-mood-blobs', '');
18
+ el.textContent = animations_1.KEYFRAMES_CSS;
19
+ document.head.appendChild(el);
20
+ }, []);
21
+ const handleClick = (e) => {
22
+ if (!isAnimating) {
23
+ setIsAnimating(true);
24
+ setTimeout(() => setIsAnimating(false), constants_1.ANIMATION_DURATIONS[mood]);
25
+ }
26
+ onClick === null || onClick === void 0 ? void 0 : onClick(e);
27
+ };
28
+ const pixelSize = constants_1.SIZES[size];
29
+ const blobColor = color !== null && color !== void 0 ? color : constants_1.DEFAULT_COLORS[mood];
30
+ const MoodComponent = moods_1.moods[mood];
31
+ return ((0, jsx_runtime_1.jsx)(MoodComponent, { color: blobColor, size: pixelSize, className: className, style: style, isAnimating: isAnimating, onClick: handleClick }));
32
+ };
33
+ exports.MoodBlob = MoodBlob;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Angry = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const Angry = ({ color, size, className, style, isAnimating, onClick }) => ((0, jsx_runtime_1.jsxs)("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
6
+ cursor: 'pointer',
7
+ transformOrigin: '50% 50%',
8
+ overflow: 'visible',
9
+ animation: isAnimating ? 'mb-angry-shake 600ms linear both' : undefined,
10
+ ...(style !== null && style !== void 0 ? style : {}),
11
+ }, children: [(0, jsx_runtime_1.jsx)("path", { d: "M 100 26 C 136 22 174 46 178 82 C 182 118 162 158 128 172 C 116 178 100 180 82 172 C 46 156 20 114 20 78 C 20 44 64 30 100 26 Z", fill: color }), (0, jsx_runtime_1.jsx)("path", { d: "M 50 70 L 86 84", stroke: "#1a1a1a", strokeWidth: "7.5", strokeLinecap: "round" }), (0, jsx_runtime_1.jsx)("path", { d: "M 114 84 L 150 70", stroke: "#1a1a1a", strokeWidth: "7.5", strokeLinecap: "round" }), (0, jsx_runtime_1.jsx)("path", { d: "M 54 94 L 88 90", stroke: "#1a1a1a", strokeWidth: "7", strokeLinecap: "round" }), (0, jsx_runtime_1.jsx)("path", { d: "M 112 90 L 146 94", stroke: "#1a1a1a", strokeWidth: "7", strokeLinecap: "round" }), (0, jsx_runtime_1.jsx)("path", { d: "M 68 138 Q 100 122 132 138", stroke: "#1a1a1a", strokeWidth: "7", strokeLinecap: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("path", { d: "M 91 56 L 88 44", stroke: "#1a1a1a", strokeWidth: "4", strokeLinecap: "round", opacity: "0.65" }), (0, jsx_runtime_1.jsx)("path", { d: "M 109 56 L 112 44", stroke: "#1a1a1a", strokeWidth: "4", strokeLinecap: "round", opacity: "0.65" })] }));
12
+ exports.Angry = Angry;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Cool = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const Cool = ({ color, size, className, style, isAnimating, onClick }) => ((0, jsx_runtime_1.jsxs)("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
6
+ cursor: 'pointer',
7
+ transformOrigin: '50% 50%',
8
+ overflow: 'visible',
9
+ animation: isAnimating ? 'mb-cool-swagger 900ms ease-in-out both' : undefined,
10
+ ...(style !== null && style !== void 0 ? style : {}),
11
+ }, children: [(0, jsx_runtime_1.jsx)("path", { d: "M 100 22 C 140 18 180 52 182 92 C 184 134 158 174 118 184 C 108 188 92 188 82 184 C 42 174 16 134 18 92 C 20 52 60 26 100 22 Z", fill: color }), (0, jsx_runtime_1.jsx)("rect", { x: "44", y: "78", width: "50", height: "30", rx: "10", fill: "#1a1a1a" }), (0, jsx_runtime_1.jsx)("rect", { x: "106", y: "78", width: "50", height: "30", rx: "10", fill: "#1a1a1a" }), (0, jsx_runtime_1.jsx)("line", { x1: "94", y1: "93", x2: "106", y2: "93", stroke: "#1a1a1a", strokeWidth: "4" }), (0, jsx_runtime_1.jsx)("line", { x1: "44", y1: "93", x2: "30", y2: "89", stroke: "#1a1a1a", strokeWidth: "4", strokeLinecap: "round" }), (0, jsx_runtime_1.jsx)("line", { x1: "156", y1: "93", x2: "170", y2: "89", stroke: "#1a1a1a", strokeWidth: "4", strokeLinecap: "round" }), (0, jsx_runtime_1.jsx)("line", { x1: "52", y1: "84", x2: "58", y2: "90", stroke: "white", strokeWidth: "3", strokeLinecap: "round", opacity: "0.45" }), (0, jsx_runtime_1.jsx)("line", { x1: "114", y1: "84", x2: "120", y2: "90", stroke: "white", strokeWidth: "3", strokeLinecap: "round", opacity: "0.45" }), (0, jsx_runtime_1.jsx)("path", { d: "M 78 132 Q 108 150 128 132", stroke: "#1a1a1a", strokeWidth: "6", strokeLinecap: "round", fill: "none" })] }));
12
+ exports.Cool = Cool;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Disgusted = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const Disgusted = ({ color, size, className, style, isAnimating, onClick }) => ((0, jsx_runtime_1.jsxs)("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
6
+ cursor: 'pointer',
7
+ transformOrigin: '50% 50%',
8
+ overflow: 'visible',
9
+ animation: isAnimating ? 'mb-disgusted-recoil 700ms ease-out both' : undefined,
10
+ ...(style !== null && style !== void 0 ? style : {}),
11
+ }, children: [(0, jsx_runtime_1.jsx)("path", { d: "M 104 22 C 140 16 180 44 182 82 C 184 122 162 164 126 178 C 114 184 86 182 70 172 C 34 152 16 110 20 72 C 24 34 68 28 104 22 Z", fill: color }), (0, jsx_runtime_1.jsx)("path", { d: "M 52 62 Q 70 54 88 62", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("path", { d: "M 112 76 Q 128 72 146 76", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("circle", { cx: "70", cy: "86", r: "10", fill: "#1a1a1a" }), (0, jsx_runtime_1.jsx)("circle", { cx: "74", cy: "82", r: "3.5", fill: "white" }), (0, jsx_runtime_1.jsx)("path", { d: "M 114 90 Q 129 80 144 90", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("path", { d: "M 64 128 Q 76 116 88 130 Q 100 116 112 130 Q 124 116 136 128", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("ellipse", { cx: "100", cy: "140", rx: "14", ry: "10", fill: "#FF8FAB" }), (0, jsx_runtime_1.jsx)("line", { x1: "100", y1: "132", x2: "100", y2: "140", stroke: "#E05C8A", strokeWidth: "2", opacity: "0.5" })] }));
12
+ exports.Disgusted = Disgusted;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Excited = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const Excited = ({ color, size, className, style, isAnimating, onClick }) => ((0, jsx_runtime_1.jsxs)("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
6
+ cursor: 'pointer',
7
+ transformOrigin: '50% 50%',
8
+ overflow: 'visible',
9
+ animation: isAnimating ? 'mb-excited-burst 700ms cubic-bezier(0.36,0.07,0.19,0.97) both' : undefined,
10
+ ...(style !== null && style !== void 0 ? style : {}),
11
+ }, children: [(0, jsx_runtime_1.jsx)("path", { d: "M 100 14 C 140 10 182 42 186 82 C 190 124 168 166 132 180 C 118 188 82 188 68 180 C 32 166 10 124 14 82 C 18 42 60 18 100 14 Z", fill: color }), (0, jsx_runtime_1.jsx)("path", { d: "M 72 70 L 75.5 81 L 87 81 L 77.5 88 L 81 99 L 72 92 L 63 99 L 66.5 88 L 57 81 L 68.5 81 Z", fill: "#1a1a1a" }), (0, jsx_runtime_1.jsx)("path", { d: "M 128 70 L 131.5 81 L 143 81 L 133.5 88 L 137 99 L 128 92 L 119 99 L 122.5 88 L 113 81 L 124.5 81 Z", fill: "#1a1a1a" }), (0, jsx_runtime_1.jsx)("path", { d: "M 52 124 Q 100 170 148 124 Z", fill: "#1a1a1a" }), (0, jsx_runtime_1.jsx)("line", { x1: "58", y1: "130", x2: "142", y2: "130", stroke: "white", strokeWidth: "10", strokeLinecap: "round" }), (0, jsx_runtime_1.jsx)("path", { d: "M 30 56 L 32 44 L 34 56 L 46 58 L 34 60 L 32 72 L 30 60 L 18 58 Z", fill: "white", opacity: "0.8" }), (0, jsx_runtime_1.jsx)("path", { d: "M 170 42 L 172 32 L 174 42 L 184 44 L 174 46 L 172 56 L 170 46 L 160 44 Z", fill: "white", opacity: "0.7" })] }));
12
+ exports.Excited = Excited;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Happy = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const Happy = ({ color, size, className, style, isAnimating, onClick }) => ((0, jsx_runtime_1.jsxs)("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
6
+ cursor: 'pointer',
7
+ transformOrigin: '50% 50%',
8
+ overflow: 'visible',
9
+ animation: isAnimating ? 'mb-happy-bounce 650ms cubic-bezier(0.36,0.07,0.19,0.97) both' : undefined,
10
+ ...(style !== null && style !== void 0 ? style : {}),
11
+ }, children: [(0, jsx_runtime_1.jsx)("path", { d: "M 100 18 C 142 16 182 56 182 100 C 182 144 143 184 100 184 C 57 184 18 144 18 100 C 18 56 58 20 100 18 Z", fill: color }), (0, jsx_runtime_1.jsx)("ellipse", { cx: "57", cy: "118", rx: "17", ry: "12", fill: "#FF8FAB", opacity: "0.45" }), (0, jsx_runtime_1.jsx)("ellipse", { cx: "143", cy: "118", rx: "17", ry: "12", fill: "#FF8FAB", opacity: "0.45" }), (0, jsx_runtime_1.jsx)("path", { d: "M 58 92 Q 72 76 86 92", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("path", { d: "M 114 92 Q 128 76 142 92", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("path", { d: "M 62 118 Q 100 155 138 118", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" })] }));
12
+ exports.Happy = Happy;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Love = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const Love = ({ color, size, className, style, isAnimating, onClick }) => ((0, jsx_runtime_1.jsxs)("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
6
+ cursor: 'pointer',
7
+ transformOrigin: '50% 50%',
8
+ overflow: 'visible',
9
+ animation: isAnimating ? 'mb-love-pulse 850ms ease-in-out both' : undefined,
10
+ ...(style !== null && style !== void 0 ? style : {}),
11
+ }, children: [(0, jsx_runtime_1.jsx)("path", { d: "M 100 30 C 100 18 118 12 134 20 C 158 32 178 62 178 96 C 178 136 152 172 120 184 C 110 190 90 190 80 184 C 48 172 22 136 22 96 C 22 62 42 32 66 20 C 82 12 100 18 100 30 Z", fill: color }), (0, jsx_runtime_1.jsx)("path", { d: "M 72 98 C 58 92 52 80 56 70 C 58 64 66 62 72 68 C 78 62 86 64 88 70 C 92 80 86 92 72 98 Z", fill: "#FF4081" }), (0, jsx_runtime_1.jsx)("circle", { cx: "65", cy: "70", r: "2.5", fill: "white", opacity: "0.6" }), (0, jsx_runtime_1.jsx)("path", { d: "M 128 98 C 114 92 108 80 112 70 C 114 64 122 62 128 68 C 134 62 142 64 144 70 C 148 80 142 92 128 98 Z", fill: "#FF4081" }), (0, jsx_runtime_1.jsx)("circle", { cx: "121", cy: "70", r: "2.5", fill: "white", opacity: "0.6" }), (0, jsx_runtime_1.jsx)("path", { d: "M 64 130 Q 100 158 136 130", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("path", { d: "M 158 54 C 158 50 154 48 152 52 C 150 48 146 50 146 54 C 146 58 152 64 158 68 C 164 64 170 58 170 54 C 170 50 166 48 164 52 C 162 48 158 50 158 54 Z", fill: "#FF4081", opacity: "0.7" }), (0, jsx_runtime_1.jsx)("path", { d: "M 42 60 C 42 57 39 55 37 58 C 35 55 32 57 32 60 C 32 63 37 68 42 72 C 47 68 52 63 52 60 C 52 57 49 55 47 58 C 45 55 42 57 42 60 Z", fill: "#FF4081", opacity: "0.55" })] }));
12
+ exports.Love = Love;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Nervous = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const Nervous = ({ color, size, className, style, isAnimating, onClick }) => ((0, jsx_runtime_1.jsxs)("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
6
+ cursor: 'pointer',
7
+ transformOrigin: '50% 50%',
8
+ overflow: 'visible',
9
+ animation: isAnimating ? 'mb-nervous-jitter 750ms linear both' : undefined,
10
+ ...(style !== null && style !== void 0 ? style : {}),
11
+ }, children: [(0, jsx_runtime_1.jsx)("path", { d: "M 100 20 C 132 14 174 38 180 78 C 186 118 166 162 128 178 C 116 184 84 184 72 178 C 34 162 14 118 20 78 C 26 38 68 26 100 20 Z", fill: color }), (0, jsx_runtime_1.jsx)("path", { d: "M 55 68 Q 72 62 89 70", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("path", { d: "M 111 70 Q 128 62 145 68", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("circle", { cx: "72", cy: "92", r: "11", fill: "#1a1a1a" }), (0, jsx_runtime_1.jsx)("circle", { cx: "76", cy: "88", r: "3.5", fill: "white" }), (0, jsx_runtime_1.jsx)("circle", { cx: "128", cy: "92", r: "11", fill: "#1a1a1a" }), (0, jsx_runtime_1.jsx)("circle", { cx: "132", cy: "88", r: "3.5", fill: "white" }), (0, jsx_runtime_1.jsx)("path", { d: "M 66 132 C 78 124 88 142 100 132 C 112 122 122 140 134 132", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("path", { d: "M 158 62 C 163 54 172 62 168 70 C 165 76 157 76 154 70 C 152 64 156 56 158 62 Z", fill: "#74B9FF", opacity: "0.85" })] }));
12
+ exports.Nervous = Nervous;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Sad = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const Sad = ({ color, size, className, style, isAnimating, onClick }) => ((0, jsx_runtime_1.jsxs)("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
6
+ cursor: 'pointer',
7
+ transformOrigin: '50% 50%',
8
+ overflow: 'visible',
9
+ animation: isAnimating ? 'mb-sad-slump 900ms ease-in-out both' : undefined,
10
+ ...(style !== null && style !== void 0 ? style : {}),
11
+ }, children: [(0, jsx_runtime_1.jsx)("path", { d: "M 100 24 C 138 20 174 54 176 94 C 178 134 156 174 116 188 C 106 192 94 192 84 188 C 44 174 22 134 24 94 C 26 54 62 28 100 24 Z", fill: color }), (0, jsx_runtime_1.jsx)("path", { d: "M 57 68 Q 72 78 87 70", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("path", { d: "M 113 70 Q 128 78 143 68", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("circle", { cx: "72", cy: "94", r: "9", fill: "#1a1a1a" }), (0, jsx_runtime_1.jsx)("circle", { cx: "76", cy: "90", r: "3", fill: "white" }), (0, jsx_runtime_1.jsx)("circle", { cx: "128", cy: "94", r: "9", fill: "#1a1a1a" }), (0, jsx_runtime_1.jsx)("circle", { cx: "132", cy: "90", r: "3", fill: "white" }), (0, jsx_runtime_1.jsx)("path", { d: "M 68 104 C 65 112 63 118 66 122 C 68 126 72 124 72 120 C 72 116 70 110 68 104 Z", fill: "#74B9FF", opacity: "0.8" }), (0, jsx_runtime_1.jsx)("path", { d: "M 130 104 C 127 112 125 118 128 122 C 130 126 134 124 134 120 C 134 116 132 110 130 104 Z", fill: "#74B9FF", opacity: "0.8" }), (0, jsx_runtime_1.jsx)("path", { d: "M 68 140 Q 100 124 132 140", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" })] }));
12
+ exports.Sad = Sad;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Sleepy = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const Sleepy = ({ color, size, className, style, isAnimating, onClick }) => ((0, jsx_runtime_1.jsxs)("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
6
+ cursor: 'pointer',
7
+ transformOrigin: '50% 50%',
8
+ overflow: 'visible',
9
+ animation: isAnimating ? 'mb-sleepy-nod 1100ms ease-in-out both' : undefined,
10
+ ...(style !== null && style !== void 0 ? style : {}),
11
+ }, children: [(0, jsx_runtime_1.jsx)("path", { d: "M 100 24 C 134 20 172 48 177 86 C 182 128 162 168 128 180 C 114 186 82 186 66 176 C 30 156 16 110 20 70 C 24 34 66 28 100 24 Z", fill: color }), (0, jsx_runtime_1.jsx)("line", { x1: "56", y1: "90", x2: "86", y2: "90", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round" }), (0, jsx_runtime_1.jsx)("path", { d: "M 56 90 Q 71 106 86 90", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("line", { x1: "114", y1: "90", x2: "144", y2: "90", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round" }), (0, jsx_runtime_1.jsx)("path", { d: "M 114 90 Q 129 106 144 90", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("ellipse", { cx: "100", cy: "140", rx: "10", ry: "13", fill: "#1a1a1a" }), (0, jsx_runtime_1.jsx)("ellipse", { cx: "100", cy: "144", rx: "6", ry: "8", fill: "#7B1818" }), (0, jsx_runtime_1.jsx)("text", { x: "150", y: "62", fontSize: "22", fontWeight: "bold", fill: "#1a1a1a", opacity: "0.55", fontFamily: "sans-serif", children: "z" }), (0, jsx_runtime_1.jsx)("text", { x: "163", y: "46", fontSize: "16", fontWeight: "bold", fill: "#1a1a1a", opacity: "0.38", fontFamily: "sans-serif", children: "z" }), (0, jsx_runtime_1.jsx)("text", { x: "172", y: "33", fontSize: "11", fontWeight: "bold", fill: "#1a1a1a", opacity: "0.22", fontFamily: "sans-serif", children: "z" })] }));
12
+ exports.Sleepy = Sleepy;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Surprised = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const Surprised = ({ color, size, className, style, isAnimating, onClick }) => ((0, jsx_runtime_1.jsxs)("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
6
+ cursor: 'pointer',
7
+ transformOrigin: '50% 50%',
8
+ overflow: 'visible',
9
+ animation: isAnimating ? 'mb-surprised-pop 550ms cubic-bezier(0.36,0.07,0.19,0.97) both' : undefined,
10
+ ...(style !== null && style !== void 0 ? style : {}),
11
+ }, children: [(0, jsx_runtime_1.jsx)("path", { d: "M 100 12 C 138 10 178 44 182 86 C 186 130 164 176 122 190 C 112 194 88 194 78 190 C 36 176 14 130 18 86 C 22 44 62 14 100 12 Z", fill: color }), (0, jsx_runtime_1.jsx)("path", { d: "M 52 60 Q 72 50 92 58", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("path", { d: "M 108 58 Q 128 50 148 60", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), (0, jsx_runtime_1.jsx)("circle", { cx: "72", cy: "92", r: "17", fill: "#1a1a1a" }), (0, jsx_runtime_1.jsx)("circle", { cx: "79", cy: "86", r: "5.5", fill: "white" }), (0, jsx_runtime_1.jsx)("circle", { cx: "128", cy: "92", r: "17", fill: "#1a1a1a" }), (0, jsx_runtime_1.jsx)("circle", { cx: "135", cy: "86", r: "5.5", fill: "white" }), (0, jsx_runtime_1.jsx)("ellipse", { cx: "100", cy: "148", rx: "20", ry: "24", fill: "#1a1a1a" }), (0, jsx_runtime_1.jsx)("ellipse", { cx: "100", cy: "152", rx: "13", ry: "16", fill: "#7B1818" })] }));
12
+ exports.Surprised = Surprised;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Excited = exports.Sleepy = exports.Disgusted = exports.Love = exports.Cool = exports.Nervous = exports.Surprised = exports.Angry = exports.Sad = exports.Happy = exports.moods = void 0;
4
+ const Happy_1 = require("./Happy");
5
+ Object.defineProperty(exports, "Happy", { enumerable: true, get: function () { return Happy_1.Happy; } });
6
+ const Sad_1 = require("./Sad");
7
+ Object.defineProperty(exports, "Sad", { enumerable: true, get: function () { return Sad_1.Sad; } });
8
+ const Angry_1 = require("./Angry");
9
+ Object.defineProperty(exports, "Angry", { enumerable: true, get: function () { return Angry_1.Angry; } });
10
+ const Surprised_1 = require("./Surprised");
11
+ Object.defineProperty(exports, "Surprised", { enumerable: true, get: function () { return Surprised_1.Surprised; } });
12
+ const Nervous_1 = require("./Nervous");
13
+ Object.defineProperty(exports, "Nervous", { enumerable: true, get: function () { return Nervous_1.Nervous; } });
14
+ const Cool_1 = require("./Cool");
15
+ Object.defineProperty(exports, "Cool", { enumerable: true, get: function () { return Cool_1.Cool; } });
16
+ const Love_1 = require("./Love");
17
+ Object.defineProperty(exports, "Love", { enumerable: true, get: function () { return Love_1.Love; } });
18
+ const Disgusted_1 = require("./Disgusted");
19
+ Object.defineProperty(exports, "Disgusted", { enumerable: true, get: function () { return Disgusted_1.Disgusted; } });
20
+ const Sleepy_1 = require("./Sleepy");
21
+ Object.defineProperty(exports, "Sleepy", { enumerable: true, get: function () { return Sleepy_1.Sleepy; } });
22
+ const Excited_1 = require("./Excited");
23
+ Object.defineProperty(exports, "Excited", { enumerable: true, get: function () { return Excited_1.Excited; } });
24
+ exports.moods = {
25
+ happy: Happy_1.Happy,
26
+ sad: Sad_1.Sad,
27
+ angry: Angry_1.Angry,
28
+ surprised: Surprised_1.Surprised,
29
+ nervous: Nervous_1.Nervous,
30
+ cool: Cool_1.Cool,
31
+ love: Love_1.Love,
32
+ disgusted: Disgusted_1.Disgusted,
33
+ sleepy: Sleepy_1.Sleepy,
34
+ excited: Excited_1.Excited,
35
+ };
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ANIMATION_DURATIONS = exports.DEFAULT_COLORS = exports.SIZES = void 0;
4
+ exports.SIZES = {
5
+ xs: 80,
6
+ s: 120,
7
+ m: 160,
8
+ l: 220,
9
+ xl: 300,
10
+ };
11
+ exports.DEFAULT_COLORS = {
12
+ happy: '#FFD93D',
13
+ sad: '#74B9FF',
14
+ angry: '#FF6B6B',
15
+ surprised: '#A29BFE',
16
+ nervous: '#55EFC4',
17
+ cool: '#636E72',
18
+ love: '#FD79A8',
19
+ disgusted: '#6C5CE7',
20
+ sleepy: '#B2BEC3',
21
+ excited: '#FDCB6E',
22
+ };
23
+ exports.ANIMATION_DURATIONS = {
24
+ happy: 650,
25
+ sad: 900,
26
+ angry: 600,
27
+ surprised: 550,
28
+ nervous: 750,
29
+ cool: 900,
30
+ love: 850,
31
+ disgusted: 700,
32
+ sleepy: 1100,
33
+ excited: 700,
34
+ };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SIZES = exports.DEFAULT_COLORS = exports.MoodBlob = void 0;
4
+ var MoodBlob_1 = require("./components/MoodBlob");
5
+ Object.defineProperty(exports, "MoodBlob", { enumerable: true, get: function () { return MoodBlob_1.MoodBlob; } });
6
+ var constants_1 = require("./constants");
7
+ Object.defineProperty(exports, "DEFAULT_COLORS", { enumerable: true, get: function () { return constants_1.DEFAULT_COLORS; } });
8
+ Object.defineProperty(exports, "SIZES", { enumerable: true, get: function () { return constants_1.SIZES; } });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,106 @@
1
+ export const KEYFRAMES_CSS = `
2
+ @keyframes mb-happy-bounce {
3
+ 0% { transform: translateY(0) scaleX(1) scaleY(1); }
4
+ 20% { transform: translateY(-30%) scaleX(0.9) scaleY(1.1); }
5
+ 40% { transform: translateY(0) scaleX(1.15) scaleY(0.85); }
6
+ 55% { transform: translateY(-15%) scaleX(0.95) scaleY(1.05); }
7
+ 70% { transform: translateY(0) scaleX(1.05) scaleY(0.95); }
8
+ 85% { transform: translateY(-5%) scaleX(1) scaleY(1); }
9
+ 100% { transform: translateY(0) scaleX(1) scaleY(1); }
10
+ }
11
+
12
+ @keyframes mb-sad-slump {
13
+ 0% { transform: translateY(0) scaleX(1) scaleY(1); }
14
+ 30% { transform: translateY(15%) scaleX(1.1) scaleY(0.85); }
15
+ 50% { transform: translateY(20%) scaleX(1.15) scaleY(0.8); }
16
+ 65% { transform: translateY(10%) scaleX(1.05) scaleY(0.9); }
17
+ 80% { transform: translateY(5%) scaleX(1.02) scaleY(0.97); }
18
+ 100% { transform: translateY(0) scaleX(1) scaleY(1); }
19
+ }
20
+
21
+ @keyframes mb-angry-shake {
22
+ 0% { transform: translateX(0) rotate(0deg) scale(1); }
23
+ 10% { transform: translateX(-8%) rotate(-3deg) scale(1.05); }
24
+ 20% { transform: translateX(8%) rotate(3deg) scale(1.05); }
25
+ 30% { transform: translateX(-8%) rotate(-3deg) scale(1.05); }
26
+ 40% { transform: translateX(8%) rotate(3deg) scale(1.05); }
27
+ 50% { transform: translateX(-6%) rotate(-2deg) scale(1.02); }
28
+ 60% { transform: translateX(6%) rotate(2deg) scale(1.02); }
29
+ 70% { transform: translateX(-4%) rotate(-1deg) scale(1); }
30
+ 80% { transform: translateX(4%) rotate(1deg) scale(1); }
31
+ 90% { transform: translateX(-2%) rotate(0deg) scale(1); }
32
+ 100% { transform: translateX(0) rotate(0deg) scale(1); }
33
+ }
34
+
35
+ @keyframes mb-surprised-pop {
36
+ 0% { transform: scale(1); }
37
+ 15% { transform: scale(0.85); }
38
+ 35% { transform: scale(1.3); }
39
+ 55% { transform: scale(0.95); }
40
+ 70% { transform: scale(1.05); }
41
+ 85% { transform: scale(0.98); }
42
+ 100% { transform: scale(1); }
43
+ }
44
+
45
+ @keyframes mb-nervous-jitter {
46
+ 0% { transform: translate(0, 0) rotate(0deg); }
47
+ 10% { transform: translate(-3%, 2%) rotate(-1deg); }
48
+ 20% { transform: translate(3%, -2%) rotate(1deg); }
49
+ 30% { transform: translate(-2%, -3%) rotate(-1.5deg); }
50
+ 40% { transform: translate(2%, 3%) rotate(1deg); }
51
+ 50% { transform: translate(-3%, -1%) rotate(-0.5deg); }
52
+ 60% { transform: translate(3%, 1%) rotate(1.5deg); }
53
+ 70% { transform: translate(-1%, 2%) rotate(-1deg); }
54
+ 80% { transform: translate(1%, -2%) rotate(0.5deg); }
55
+ 90% { transform: translate(-2%, 1%) rotate(-0.5deg); }
56
+ 100% { transform: translate(0, 0) rotate(0deg); }
57
+ }
58
+
59
+ @keyframes mb-cool-swagger {
60
+ 0% { transform: translateX(0) rotate(0deg); }
61
+ 25% { transform: translateX(-8%) rotate(-4deg); }
62
+ 50% { transform: translateX(0) rotate(0deg); }
63
+ 75% { transform: translateX(8%) rotate(4deg); }
64
+ 100% { transform: translateX(0) rotate(0deg); }
65
+ }
66
+
67
+ @keyframes mb-love-pulse {
68
+ 0% { transform: scale(1); }
69
+ 15% { transform: scale(1.15); }
70
+ 30% { transform: scale(1); }
71
+ 45% { transform: scale(1.2); }
72
+ 60% { transform: scale(1); }
73
+ 80% { transform: scale(1.02); }
74
+ 100% { transform: scale(1); }
75
+ }
76
+
77
+ @keyframes mb-disgusted-recoil {
78
+ 0% { transform: translate(0, 0) rotate(0deg); }
79
+ 20% { transform: translate(-15%, -10%) rotate(-8deg); }
80
+ 40% { transform: translate(-10%, -5%) rotate(-5deg); }
81
+ 55% { transform: translate(-5%, 0) rotate(-2deg) scaleX(1.05); }
82
+ 65% { transform: translate(3%, 2%) rotate(2deg); }
83
+ 75% { transform: translate(-2%, -1%) rotate(-1deg); }
84
+ 85% { transform: translate(1%, 0) rotate(0.5deg); }
85
+ 100% { transform: translate(0, 0) rotate(0deg); }
86
+ }
87
+
88
+ @keyframes mb-sleepy-nod {
89
+ 0% { transform: translateY(0) rotate(0deg); }
90
+ 30% { transform: translateY(10%) rotate(10deg); }
91
+ 60% { transform: translateY(15%) rotate(15deg); }
92
+ 80% { transform: translateY(8%) rotate(8deg); }
93
+ 100% { transform: translateY(0) rotate(0deg); }
94
+ }
95
+
96
+ @keyframes mb-excited-burst {
97
+ 0% { transform: translateY(0) rotate(0deg) scale(1); }
98
+ 15% { transform: translateY(-25%) rotate(8deg) scale(1.1); }
99
+ 30% { transform: translateY(0) rotate(-4deg) scale(0.95); }
100
+ 45% { transform: translateY(-18%) rotate(6deg) scale(1.08); }
101
+ 60% { transform: translateY(0) rotate(-3deg) scale(0.97); }
102
+ 75% { transform: translateY(-10%) rotate(4deg) scale(1.04); }
103
+ 88% { transform: translateY(0) rotate(-2deg) scale(0.99); }
104
+ 100% { transform: translateY(0) rotate(0deg) scale(1); }
105
+ }
106
+ `;
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { SIZES, DEFAULT_COLORS, ANIMATION_DURATIONS } from '../constants';
4
+ import { KEYFRAMES_CSS } from '../animations';
5
+ import { moods } from './moods';
6
+ let stylesInjected = false;
7
+ export const MoodBlob = ({ mood, size = 'm', color, className, style, onClick, }) => {
8
+ const [isAnimating, setIsAnimating] = useState(false);
9
+ useEffect(() => {
10
+ if (typeof document === 'undefined' || stylesInjected)
11
+ return;
12
+ stylesInjected = true;
13
+ const el = document.createElement('style');
14
+ el.setAttribute('data-mood-blobs', '');
15
+ el.textContent = KEYFRAMES_CSS;
16
+ document.head.appendChild(el);
17
+ }, []);
18
+ const handleClick = (e) => {
19
+ if (!isAnimating) {
20
+ setIsAnimating(true);
21
+ setTimeout(() => setIsAnimating(false), ANIMATION_DURATIONS[mood]);
22
+ }
23
+ onClick === null || onClick === void 0 ? void 0 : onClick(e);
24
+ };
25
+ const pixelSize = SIZES[size];
26
+ const blobColor = color !== null && color !== void 0 ? color : DEFAULT_COLORS[mood];
27
+ const MoodComponent = moods[mood];
28
+ return (_jsx(MoodComponent, { color: blobColor, size: pixelSize, className: className, style: style, isAnimating: isAnimating, onClick: handleClick }));
29
+ };
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const Angry = ({ color, size, className, style, isAnimating, onClick }) => (_jsxs("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
3
+ cursor: 'pointer',
4
+ transformOrigin: '50% 50%',
5
+ overflow: 'visible',
6
+ animation: isAnimating ? 'mb-angry-shake 600ms linear both' : undefined,
7
+ ...(style !== null && style !== void 0 ? style : {}),
8
+ }, children: [_jsx("path", { d: "M 100 26 C 136 22 174 46 178 82 C 182 118 162 158 128 172 C 116 178 100 180 82 172 C 46 156 20 114 20 78 C 20 44 64 30 100 26 Z", fill: color }), _jsx("path", { d: "M 50 70 L 86 84", stroke: "#1a1a1a", strokeWidth: "7.5", strokeLinecap: "round" }), _jsx("path", { d: "M 114 84 L 150 70", stroke: "#1a1a1a", strokeWidth: "7.5", strokeLinecap: "round" }), _jsx("path", { d: "M 54 94 L 88 90", stroke: "#1a1a1a", strokeWidth: "7", strokeLinecap: "round" }), _jsx("path", { d: "M 112 90 L 146 94", stroke: "#1a1a1a", strokeWidth: "7", strokeLinecap: "round" }), _jsx("path", { d: "M 68 138 Q 100 122 132 138", stroke: "#1a1a1a", strokeWidth: "7", strokeLinecap: "round", fill: "none" }), _jsx("path", { d: "M 91 56 L 88 44", stroke: "#1a1a1a", strokeWidth: "4", strokeLinecap: "round", opacity: "0.65" }), _jsx("path", { d: "M 109 56 L 112 44", stroke: "#1a1a1a", strokeWidth: "4", strokeLinecap: "round", opacity: "0.65" })] }));
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const Cool = ({ color, size, className, style, isAnimating, onClick }) => (_jsxs("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
3
+ cursor: 'pointer',
4
+ transformOrigin: '50% 50%',
5
+ overflow: 'visible',
6
+ animation: isAnimating ? 'mb-cool-swagger 900ms ease-in-out both' : undefined,
7
+ ...(style !== null && style !== void 0 ? style : {}),
8
+ }, children: [_jsx("path", { d: "M 100 22 C 140 18 180 52 182 92 C 184 134 158 174 118 184 C 108 188 92 188 82 184 C 42 174 16 134 18 92 C 20 52 60 26 100 22 Z", fill: color }), _jsx("rect", { x: "44", y: "78", width: "50", height: "30", rx: "10", fill: "#1a1a1a" }), _jsx("rect", { x: "106", y: "78", width: "50", height: "30", rx: "10", fill: "#1a1a1a" }), _jsx("line", { x1: "94", y1: "93", x2: "106", y2: "93", stroke: "#1a1a1a", strokeWidth: "4" }), _jsx("line", { x1: "44", y1: "93", x2: "30", y2: "89", stroke: "#1a1a1a", strokeWidth: "4", strokeLinecap: "round" }), _jsx("line", { x1: "156", y1: "93", x2: "170", y2: "89", stroke: "#1a1a1a", strokeWidth: "4", strokeLinecap: "round" }), _jsx("line", { x1: "52", y1: "84", x2: "58", y2: "90", stroke: "white", strokeWidth: "3", strokeLinecap: "round", opacity: "0.45" }), _jsx("line", { x1: "114", y1: "84", x2: "120", y2: "90", stroke: "white", strokeWidth: "3", strokeLinecap: "round", opacity: "0.45" }), _jsx("path", { d: "M 78 132 Q 108 150 128 132", stroke: "#1a1a1a", strokeWidth: "6", strokeLinecap: "round", fill: "none" })] }));
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const Disgusted = ({ color, size, className, style, isAnimating, onClick }) => (_jsxs("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
3
+ cursor: 'pointer',
4
+ transformOrigin: '50% 50%',
5
+ overflow: 'visible',
6
+ animation: isAnimating ? 'mb-disgusted-recoil 700ms ease-out both' : undefined,
7
+ ...(style !== null && style !== void 0 ? style : {}),
8
+ }, children: [_jsx("path", { d: "M 104 22 C 140 16 180 44 182 82 C 184 122 162 164 126 178 C 114 184 86 182 70 172 C 34 152 16 110 20 72 C 24 34 68 28 104 22 Z", fill: color }), _jsx("path", { d: "M 52 62 Q 70 54 88 62", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), _jsx("path", { d: "M 112 76 Q 128 72 146 76", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), _jsx("circle", { cx: "70", cy: "86", r: "10", fill: "#1a1a1a" }), _jsx("circle", { cx: "74", cy: "82", r: "3.5", fill: "white" }), _jsx("path", { d: "M 114 90 Q 129 80 144 90", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" }), _jsx("path", { d: "M 64 128 Q 76 116 88 130 Q 100 116 112 130 Q 124 116 136 128", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }), _jsx("ellipse", { cx: "100", cy: "140", rx: "14", ry: "10", fill: "#FF8FAB" }), _jsx("line", { x1: "100", y1: "132", x2: "100", y2: "140", stroke: "#E05C8A", strokeWidth: "2", opacity: "0.5" })] }));
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const Excited = ({ color, size, className, style, isAnimating, onClick }) => (_jsxs("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
3
+ cursor: 'pointer',
4
+ transformOrigin: '50% 50%',
5
+ overflow: 'visible',
6
+ animation: isAnimating ? 'mb-excited-burst 700ms cubic-bezier(0.36,0.07,0.19,0.97) both' : undefined,
7
+ ...(style !== null && style !== void 0 ? style : {}),
8
+ }, children: [_jsx("path", { d: "M 100 14 C 140 10 182 42 186 82 C 190 124 168 166 132 180 C 118 188 82 188 68 180 C 32 166 10 124 14 82 C 18 42 60 18 100 14 Z", fill: color }), _jsx("path", { d: "M 72 70 L 75.5 81 L 87 81 L 77.5 88 L 81 99 L 72 92 L 63 99 L 66.5 88 L 57 81 L 68.5 81 Z", fill: "#1a1a1a" }), _jsx("path", { d: "M 128 70 L 131.5 81 L 143 81 L 133.5 88 L 137 99 L 128 92 L 119 99 L 122.5 88 L 113 81 L 124.5 81 Z", fill: "#1a1a1a" }), _jsx("path", { d: "M 52 124 Q 100 170 148 124 Z", fill: "#1a1a1a" }), _jsx("line", { x1: "58", y1: "130", x2: "142", y2: "130", stroke: "white", strokeWidth: "10", strokeLinecap: "round" }), _jsx("path", { d: "M 30 56 L 32 44 L 34 56 L 46 58 L 34 60 L 32 72 L 30 60 L 18 58 Z", fill: "white", opacity: "0.8" }), _jsx("path", { d: "M 170 42 L 172 32 L 174 42 L 184 44 L 174 46 L 172 56 L 170 46 L 160 44 Z", fill: "white", opacity: "0.7" })] }));
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const Happy = ({ color, size, className, style, isAnimating, onClick }) => (_jsxs("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
3
+ cursor: 'pointer',
4
+ transformOrigin: '50% 50%',
5
+ overflow: 'visible',
6
+ animation: isAnimating ? 'mb-happy-bounce 650ms cubic-bezier(0.36,0.07,0.19,0.97) both' : undefined,
7
+ ...(style !== null && style !== void 0 ? style : {}),
8
+ }, children: [_jsx("path", { d: "M 100 18 C 142 16 182 56 182 100 C 182 144 143 184 100 184 C 57 184 18 144 18 100 C 18 56 58 20 100 18 Z", fill: color }), _jsx("ellipse", { cx: "57", cy: "118", rx: "17", ry: "12", fill: "#FF8FAB", opacity: "0.45" }), _jsx("ellipse", { cx: "143", cy: "118", rx: "17", ry: "12", fill: "#FF8FAB", opacity: "0.45" }), _jsx("path", { d: "M 58 92 Q 72 76 86 92", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" }), _jsx("path", { d: "M 114 92 Q 128 76 142 92", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" }), _jsx("path", { d: "M 62 118 Q 100 155 138 118", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" })] }));
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const Love = ({ color, size, className, style, isAnimating, onClick }) => (_jsxs("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
3
+ cursor: 'pointer',
4
+ transformOrigin: '50% 50%',
5
+ overflow: 'visible',
6
+ animation: isAnimating ? 'mb-love-pulse 850ms ease-in-out both' : undefined,
7
+ ...(style !== null && style !== void 0 ? style : {}),
8
+ }, children: [_jsx("path", { d: "M 100 30 C 100 18 118 12 134 20 C 158 32 178 62 178 96 C 178 136 152 172 120 184 C 110 190 90 190 80 184 C 48 172 22 136 22 96 C 22 62 42 32 66 20 C 82 12 100 18 100 30 Z", fill: color }), _jsx("path", { d: "M 72 98 C 58 92 52 80 56 70 C 58 64 66 62 72 68 C 78 62 86 64 88 70 C 92 80 86 92 72 98 Z", fill: "#FF4081" }), _jsx("circle", { cx: "65", cy: "70", r: "2.5", fill: "white", opacity: "0.6" }), _jsx("path", { d: "M 128 98 C 114 92 108 80 112 70 C 114 64 122 62 128 68 C 134 62 142 64 144 70 C 148 80 142 92 128 98 Z", fill: "#FF4081" }), _jsx("circle", { cx: "121", cy: "70", r: "2.5", fill: "white", opacity: "0.6" }), _jsx("path", { d: "M 64 130 Q 100 158 136 130", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" }), _jsx("path", { d: "M 158 54 C 158 50 154 48 152 52 C 150 48 146 50 146 54 C 146 58 152 64 158 68 C 164 64 170 58 170 54 C 170 50 166 48 164 52 C 162 48 158 50 158 54 Z", fill: "#FF4081", opacity: "0.7" }), _jsx("path", { d: "M 42 60 C 42 57 39 55 37 58 C 35 55 32 57 32 60 C 32 63 37 68 42 72 C 47 68 52 63 52 60 C 52 57 49 55 47 58 C 45 55 42 57 42 60 Z", fill: "#FF4081", opacity: "0.55" })] }));
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const Nervous = ({ color, size, className, style, isAnimating, onClick }) => (_jsxs("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
3
+ cursor: 'pointer',
4
+ transformOrigin: '50% 50%',
5
+ overflow: 'visible',
6
+ animation: isAnimating ? 'mb-nervous-jitter 750ms linear both' : undefined,
7
+ ...(style !== null && style !== void 0 ? style : {}),
8
+ }, children: [_jsx("path", { d: "M 100 20 C 132 14 174 38 180 78 C 186 118 166 162 128 178 C 116 184 84 184 72 178 C 34 162 14 118 20 78 C 26 38 68 26 100 20 Z", fill: color }), _jsx("path", { d: "M 55 68 Q 72 62 89 70", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), _jsx("path", { d: "M 111 70 Q 128 62 145 68", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), _jsx("circle", { cx: "72", cy: "92", r: "11", fill: "#1a1a1a" }), _jsx("circle", { cx: "76", cy: "88", r: "3.5", fill: "white" }), _jsx("circle", { cx: "128", cy: "92", r: "11", fill: "#1a1a1a" }), _jsx("circle", { cx: "132", cy: "88", r: "3.5", fill: "white" }), _jsx("path", { d: "M 66 132 C 78 124 88 142 100 132 C 112 122 122 140 134 132", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }), _jsx("path", { d: "M 158 62 C 163 54 172 62 168 70 C 165 76 157 76 154 70 C 152 64 156 56 158 62 Z", fill: "#74B9FF", opacity: "0.85" })] }));
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const Sad = ({ color, size, className, style, isAnimating, onClick }) => (_jsxs("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
3
+ cursor: 'pointer',
4
+ transformOrigin: '50% 50%',
5
+ overflow: 'visible',
6
+ animation: isAnimating ? 'mb-sad-slump 900ms ease-in-out both' : undefined,
7
+ ...(style !== null && style !== void 0 ? style : {}),
8
+ }, children: [_jsx("path", { d: "M 100 24 C 138 20 174 54 176 94 C 178 134 156 174 116 188 C 106 192 94 192 84 188 C 44 174 22 134 24 94 C 26 54 62 28 100 24 Z", fill: color }), _jsx("path", { d: "M 57 68 Q 72 78 87 70", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), _jsx("path", { d: "M 113 70 Q 128 78 143 68", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), _jsx("circle", { cx: "72", cy: "94", r: "9", fill: "#1a1a1a" }), _jsx("circle", { cx: "76", cy: "90", r: "3", fill: "white" }), _jsx("circle", { cx: "128", cy: "94", r: "9", fill: "#1a1a1a" }), _jsx("circle", { cx: "132", cy: "90", r: "3", fill: "white" }), _jsx("path", { d: "M 68 104 C 65 112 63 118 66 122 C 68 126 72 124 72 120 C 72 116 70 110 68 104 Z", fill: "#74B9FF", opacity: "0.8" }), _jsx("path", { d: "M 130 104 C 127 112 125 118 128 122 C 130 126 134 124 134 120 C 134 116 132 110 130 104 Z", fill: "#74B9FF", opacity: "0.8" }), _jsx("path", { d: "M 68 140 Q 100 124 132 140", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" })] }));
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const Sleepy = ({ color, size, className, style, isAnimating, onClick }) => (_jsxs("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
3
+ cursor: 'pointer',
4
+ transformOrigin: '50% 50%',
5
+ overflow: 'visible',
6
+ animation: isAnimating ? 'mb-sleepy-nod 1100ms ease-in-out both' : undefined,
7
+ ...(style !== null && style !== void 0 ? style : {}),
8
+ }, children: [_jsx("path", { d: "M 100 24 C 134 20 172 48 177 86 C 182 128 162 168 128 180 C 114 186 82 186 66 176 C 30 156 16 110 20 70 C 24 34 66 28 100 24 Z", fill: color }), _jsx("line", { x1: "56", y1: "90", x2: "86", y2: "90", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round" }), _jsx("path", { d: "M 56 90 Q 71 106 86 90", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" }), _jsx("line", { x1: "114", y1: "90", x2: "144", y2: "90", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round" }), _jsx("path", { d: "M 114 90 Q 129 106 144 90", stroke: "#1a1a1a", strokeWidth: "6.5", strokeLinecap: "round", fill: "none" }), _jsx("ellipse", { cx: "100", cy: "140", rx: "10", ry: "13", fill: "#1a1a1a" }), _jsx("ellipse", { cx: "100", cy: "144", rx: "6", ry: "8", fill: "#7B1818" }), _jsx("text", { x: "150", y: "62", fontSize: "22", fontWeight: "bold", fill: "#1a1a1a", opacity: "0.55", fontFamily: "sans-serif", children: "z" }), _jsx("text", { x: "163", y: "46", fontSize: "16", fontWeight: "bold", fill: "#1a1a1a", opacity: "0.38", fontFamily: "sans-serif", children: "z" }), _jsx("text", { x: "172", y: "33", fontSize: "11", fontWeight: "bold", fill: "#1a1a1a", opacity: "0.22", fontFamily: "sans-serif", children: "z" })] }));
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const Surprised = ({ color, size, className, style, isAnimating, onClick }) => (_jsxs("svg", { width: size, height: size, viewBox: "0 0 200 200", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, onClick: onClick, style: {
3
+ cursor: 'pointer',
4
+ transformOrigin: '50% 50%',
5
+ overflow: 'visible',
6
+ animation: isAnimating ? 'mb-surprised-pop 550ms cubic-bezier(0.36,0.07,0.19,0.97) both' : undefined,
7
+ ...(style !== null && style !== void 0 ? style : {}),
8
+ }, children: [_jsx("path", { d: "M 100 12 C 138 10 178 44 182 86 C 186 130 164 176 122 190 C 112 194 88 194 78 190 C 36 176 14 130 18 86 C 22 44 62 14 100 12 Z", fill: color }), _jsx("path", { d: "M 52 60 Q 72 50 92 58", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), _jsx("path", { d: "M 108 58 Q 128 50 148 60", stroke: "#1a1a1a", strokeWidth: "5.5", strokeLinecap: "round", fill: "none" }), _jsx("circle", { cx: "72", cy: "92", r: "17", fill: "#1a1a1a" }), _jsx("circle", { cx: "79", cy: "86", r: "5.5", fill: "white" }), _jsx("circle", { cx: "128", cy: "92", r: "17", fill: "#1a1a1a" }), _jsx("circle", { cx: "135", cy: "86", r: "5.5", fill: "white" }), _jsx("ellipse", { cx: "100", cy: "148", rx: "20", ry: "24", fill: "#1a1a1a" }), _jsx("ellipse", { cx: "100", cy: "152", rx: "13", ry: "16", fill: "#7B1818" })] }));
@@ -0,0 +1,23 @@
1
+ import { Happy } from './Happy';
2
+ import { Sad } from './Sad';
3
+ import { Angry } from './Angry';
4
+ import { Surprised } from './Surprised';
5
+ import { Nervous } from './Nervous';
6
+ import { Cool } from './Cool';
7
+ import { Love } from './Love';
8
+ import { Disgusted } from './Disgusted';
9
+ import { Sleepy } from './Sleepy';
10
+ import { Excited } from './Excited';
11
+ export const moods = {
12
+ happy: Happy,
13
+ sad: Sad,
14
+ angry: Angry,
15
+ surprised: Surprised,
16
+ nervous: Nervous,
17
+ cool: Cool,
18
+ love: Love,
19
+ disgusted: Disgusted,
20
+ sleepy: Sleepy,
21
+ excited: Excited,
22
+ };
23
+ export { Happy, Sad, Angry, Surprised, Nervous, Cool, Love, Disgusted, Sleepy, Excited, };
@@ -0,0 +1,31 @@
1
+ export const SIZES = {
2
+ xs: 80,
3
+ s: 120,
4
+ m: 160,
5
+ l: 220,
6
+ xl: 300,
7
+ };
8
+ export const DEFAULT_COLORS = {
9
+ happy: '#FFD93D',
10
+ sad: '#74B9FF',
11
+ angry: '#FF6B6B',
12
+ surprised: '#A29BFE',
13
+ nervous: '#55EFC4',
14
+ cool: '#636E72',
15
+ love: '#FD79A8',
16
+ disgusted: '#6C5CE7',
17
+ sleepy: '#B2BEC3',
18
+ excited: '#FDCB6E',
19
+ };
20
+ export const ANIMATION_DURATIONS = {
21
+ happy: 650,
22
+ sad: 900,
23
+ angry: 600,
24
+ surprised: 550,
25
+ nervous: 750,
26
+ cool: 900,
27
+ love: 850,
28
+ disgusted: 700,
29
+ sleepy: 1100,
30
+ excited: 700,
31
+ };
@@ -0,0 +1,2 @@
1
+ export { MoodBlob } from './components/MoodBlob';
2
+ export { DEFAULT_COLORS, SIZES } from './constants';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export declare const KEYFRAMES_CSS: string;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { MoodBlobProps } from '../types';
3
+ export declare const MoodBlob: React.FC<MoodBlobProps>;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { MoodComponentProps } from '../../types';
3
+ export declare const Angry: React.FC<MoodComponentProps>;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { MoodComponentProps } from '../../types';
3
+ export declare const Cool: React.FC<MoodComponentProps>;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { MoodComponentProps } from '../../types';
3
+ export declare const Disgusted: React.FC<MoodComponentProps>;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { MoodComponentProps } from '../../types';
3
+ export declare const Excited: React.FC<MoodComponentProps>;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { MoodComponentProps } from '../../types';
3
+ export declare const Happy: React.FC<MoodComponentProps>;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { MoodComponentProps } from '../../types';
3
+ export declare const Love: React.FC<MoodComponentProps>;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { MoodComponentProps } from '../../types';
3
+ export declare const Nervous: React.FC<MoodComponentProps>;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { MoodComponentProps } from '../../types';
3
+ export declare const Sad: React.FC<MoodComponentProps>;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { MoodComponentProps } from '../../types';
3
+ export declare const Sleepy: React.FC<MoodComponentProps>;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { MoodComponentProps } from '../../types';
3
+ export declare const Surprised: React.FC<MoodComponentProps>;
@@ -0,0 +1,14 @@
1
+ import { FC } from 'react';
2
+ import { Mood, MoodComponentProps } from '../../types';
3
+ import { Happy } from './Happy';
4
+ import { Sad } from './Sad';
5
+ import { Angry } from './Angry';
6
+ import { Surprised } from './Surprised';
7
+ import { Nervous } from './Nervous';
8
+ import { Cool } from './Cool';
9
+ import { Love } from './Love';
10
+ import { Disgusted } from './Disgusted';
11
+ import { Sleepy } from './Sleepy';
12
+ import { Excited } from './Excited';
13
+ export declare const moods: Record<Mood, FC<MoodComponentProps>>;
14
+ export { Happy, Sad, Angry, Surprised, Nervous, Cool, Love, Disgusted, Sleepy, Excited, };
@@ -0,0 +1,4 @@
1
+ import { Mood, Size } from './types';
2
+ export declare const SIZES: Record<Size, number>;
3
+ export declare const DEFAULT_COLORS: Record<Mood, string>;
4
+ export declare const ANIMATION_DURATIONS: Record<Mood, number>;
@@ -0,0 +1,3 @@
1
+ export { MoodBlob } from './components/MoodBlob';
2
+ export type { MoodBlobProps, Mood, Size } from './types';
3
+ export { DEFAULT_COLORS, SIZES } from './constants';
@@ -0,0 +1,19 @@
1
+ import { CSSProperties, MouseEventHandler } from 'react';
2
+ export type Mood = 'happy' | 'sad' | 'angry' | 'surprised' | 'nervous' | 'cool' | 'love' | 'disgusted' | 'sleepy' | 'excited';
3
+ export type Size = 'xs' | 's' | 'm' | 'l' | 'xl';
4
+ export interface MoodBlobProps {
5
+ mood: Mood;
6
+ size?: Size;
7
+ color?: string;
8
+ className?: string;
9
+ style?: CSSProperties;
10
+ onClick?: MouseEventHandler<SVGSVGElement>;
11
+ }
12
+ export interface MoodComponentProps {
13
+ color: string;
14
+ size: number;
15
+ className?: string;
16
+ style?: CSSProperties;
17
+ isAnimating: boolean;
18
+ onClick: MouseEventHandler<SVGSVGElement>;
19
+ }
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "mood-blobs",
3
+ "version": "0.1.0",
4
+ "description": "Expressive SVG blob components representing different moods for React",
5
+ "main": "dist/cjs/index.js",
6
+ "module": "dist/esm/index.js",
7
+ "types": "dist/types/index.d.ts",
8
+ "files": ["dist"],
9
+ "sideEffects": false,
10
+ "scripts": {
11
+ "build": "tsc -p tsconfig.json && tsc -p tsconfig.esm.json",
12
+ "build:watch": "tsc -p tsconfig.json --watch",
13
+ "type-check": "tsc --noEmit",
14
+ "demo": "npx serve website"
15
+ },
16
+ "peerDependencies": {
17
+ "react": ">=17.0.0",
18
+ "react-dom": ">=17.0.0"
19
+ },
20
+ "devDependencies": {
21
+ "@types/react": "^18.3.0",
22
+ "@types/react-dom": "^18.3.0",
23
+ "typescript": "^5.4.0"
24
+ },
25
+ "keywords": ["react", "svg", "blob", "mood", "emotion", "animation", "components", "ui"],
26
+ "license": "MIT",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/arnaudmanaranche/mood-blobs"
30
+ }
31
+ }