queen-mq 0.1.1 → 0.1.2

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 (139) hide show
  1. package/API.md +1226 -0
  2. package/AUTH.md +2044 -0
  3. package/LICENSE.md +202 -0
  4. package/README.md +276 -53
  5. package/WEBAPP.md +1889 -0
  6. package/assets/dashboard-01.png +0 -0
  7. package/assets/queen-logo-blue.svg +210 -0
  8. package/assets/queen-logo-cyan.svg +210 -0
  9. package/assets/queen-logo-indigo.svg +210 -0
  10. package/assets/queen-logo-orange.svg +210 -0
  11. package/assets/queen-logo-pink.svg +210 -0
  12. package/assets/queen-logo-purple.svg +210 -0
  13. package/assets/queen-logo-rose.svg +239 -0
  14. package/assets/queen-logo.svg +263 -0
  15. package/examples/batch-processing.js +58 -0
  16. package/examples/test-dashboard-api.js +200 -0
  17. package/package.json +4 -2
  18. package/server.log +1 -0
  19. package/src/benchmark/consumer.js +207 -0
  20. package/src/benchmark/consumer_multi.js +216 -0
  21. package/src/benchmark/producer.js +75 -0
  22. package/src/benchmark/producer_multi.js +115 -0
  23. package/src/client/client.js +192 -16
  24. package/src/client/queenClient.js +5 -0
  25. package/src/cluster-server.js +242 -0
  26. package/src/config.js +19 -5
  27. package/src/database/connection.js +42 -16
  28. package/src/database/poolManager.js +7 -0
  29. package/src/database/schema-v2.sql +194 -130
  30. package/src/managers/queueManagerOptimized.js +823 -933
  31. package/src/managers/systemEventManager.js +8 -3
  32. package/src/routes/messages.js +127 -57
  33. package/src/routes/pop.js +27 -43
  34. package/src/routes/resources.js +61 -27
  35. package/src/routes/status.js +1037 -0
  36. package/src/server.js +308 -272
  37. package/src/services/evictionService.js +57 -28
  38. package/src/services/retentionService.js +44 -11
  39. package/src/test/advanced-pattern-tests.js +5 -5
  40. package/src/test/bus-mode-tests.js +24 -11
  41. package/src/test/edge-case-tests.js +12 -5
  42. package/src/test/enterprise-tests.js +48 -15
  43. package/src/test/utils.js +1 -1
  44. package/src/utils/streaming.js +231 -0
  45. package/src/utils/uuid.js +2 -2
  46. package/src/websocket/wsServer.js +10 -3
  47. package/test-keepalive-v2.sh +22 -0
  48. package/webapp/COLOR_GUIDE.md +118 -0
  49. package/webapp/README.md +143 -0
  50. package/webapp/index.html +14 -0
  51. package/webapp/package-lock.json +3184 -0
  52. package/webapp/package.json +25 -0
  53. package/webapp/postcss.config.js +7 -0
  54. package/webapp/public/assets/queen-logo-blue.svg +210 -0
  55. package/webapp/public/assets/queen-logo-cyan.svg +210 -0
  56. package/webapp/public/assets/queen-logo-indigo.svg +210 -0
  57. package/webapp/public/assets/queen-logo-orange.svg +210 -0
  58. package/webapp/public/assets/queen-logo-pink.svg +210 -0
  59. package/webapp/public/assets/queen-logo-purple.svg +210 -0
  60. package/webapp/public/assets/queen-logo-rose.svg +239 -0
  61. package/webapp/public/assets/queen-logo.svg +263 -0
  62. package/webapp/src/App.vue +19 -0
  63. package/webapp/src/api/analytics.js +10 -0
  64. package/webapp/src/api/client.js +29 -0
  65. package/webapp/src/api/consumers.js +52 -0
  66. package/webapp/src/api/health.js +7 -0
  67. package/webapp/src/api/messages.js +26 -0
  68. package/webapp/src/api/queues.js +14 -0
  69. package/webapp/src/api/resources.js +8 -0
  70. package/webapp/src/assets/styles/main.css +357 -0
  71. package/webapp/src/components/analytics/AnalyticsFilters.vue +87 -0
  72. package/webapp/src/components/analytics/AnalyticsMetrics.vue +57 -0
  73. package/webapp/src/components/analytics/MessageDistributionChart.vue +111 -0
  74. package/webapp/src/components/analytics/MessageFlowChart.vue +173 -0
  75. package/webapp/src/components/analytics/TimeRangeSelector.vue +27 -0
  76. package/webapp/src/components/analytics/TopQueuesChart.vue +132 -0
  77. package/webapp/src/components/common/ConfirmDialog.vue +56 -0
  78. package/webapp/src/components/common/LoadingSpinner.vue +6 -0
  79. package/webapp/src/components/common/MetricCard.vue +43 -0
  80. package/webapp/src/components/common/StatusBadge.vue +45 -0
  81. package/webapp/src/components/dashboard/MessageStatusCard.vue +50 -0
  82. package/webapp/src/components/dashboard/PerformanceCard.vue +38 -0
  83. package/webapp/src/components/dashboard/ThroughputChart.vue +182 -0
  84. package/webapp/src/components/dashboard/TopQueuesTable.vue +53 -0
  85. package/webapp/src/components/layout/AppLayout.vue +110 -0
  86. package/webapp/src/components/layout/AppSidebar.vue +304 -0
  87. package/webapp/src/components/messages/MessageDetailPanel.vue +242 -0
  88. package/webapp/src/components/messages/MessageFilters.vue +114 -0
  89. package/webapp/src/components/queue-detail/PartitionList.vue +79 -0
  90. package/webapp/src/components/queue-detail/PushMessageModal.vue +175 -0
  91. package/webapp/src/components/queue-detail/QueueConfig.vue +63 -0
  92. package/webapp/src/components/queue-detail/QueueDetailHeader.vue +53 -0
  93. package/webapp/src/components/queue-detail/RecentMessages.vue +76 -0
  94. package/webapp/src/components/queues/CreateQueueModal.vue +193 -0
  95. package/webapp/src/components/queues/QueueFilters.vue +90 -0
  96. package/webapp/src/composables/useApi.js +34 -0
  97. package/webapp/src/composables/useTheme.js +36 -0
  98. package/webapp/src/main.js +11 -0
  99. package/webapp/src/router/index.js +42 -0
  100. package/webapp/src/utils/colors.js +96 -0
  101. package/webapp/src/utils/formatters.js +49 -0
  102. package/webapp/src/views/Analytics.vue +377 -0
  103. package/webapp/src/views/ConsumerGroups.vue +433 -0
  104. package/webapp/src/views/Dashboard.vue +418 -0
  105. package/webapp/src/views/Messages.vue +361 -0
  106. package/webapp/src/views/QueueDetail.vue +582 -0
  107. package/webapp/src/views/Queues.vue +496 -0
  108. package/webapp/tailwind.config.js +25 -0
  109. package/webapp/vite.config.js +10 -0
  110. package/dashboard/.vscode/extensions.json +0 -3
  111. package/dashboard/README.md +0 -5
  112. package/dashboard/index.html +0 -14
  113. package/dashboard/package-lock.json +0 -1458
  114. package/dashboard/package.json +0 -25
  115. package/dashboard/public/vite.svg +0 -1
  116. package/dashboard/src/App.vue +0 -29
  117. package/dashboard/src/assets/styles/main.css +0 -908
  118. package/dashboard/src/assets/vue.svg +0 -1
  119. package/dashboard/src/components/cards/MetricCard.vue +0 -298
  120. package/dashboard/src/components/charts/QueueDepthChart.vue +0 -276
  121. package/dashboard/src/components/charts/QueueLagChart.vue +0 -436
  122. package/dashboard/src/components/charts/ThroughputChart.vue +0 -302
  123. package/dashboard/src/components/common/ActivityFeed.vue +0 -251
  124. package/dashboard/src/components/layout/AppHeader.vue +0 -208
  125. package/dashboard/src/components/layout/AppLayout.vue +0 -88
  126. package/dashboard/src/components/layout/AppSidebar.vue +0 -261
  127. package/dashboard/src/main.js +0 -44
  128. package/dashboard/src/router.js +0 -54
  129. package/dashboard/src/services/api.js +0 -187
  130. package/dashboard/src/services/websocket.js +0 -167
  131. package/dashboard/src/utils/constants.js +0 -56
  132. package/dashboard/src/utils/helpers.js +0 -118
  133. package/dashboard/src/views/Analytics.vue +0 -912
  134. package/dashboard/src/views/Dashboard.vue +0 -906
  135. package/dashboard/src/views/Messages.vue +0 -437
  136. package/dashboard/src/views/QueueDetail.vue +0 -501
  137. package/dashboard/src/views/Queues.vue +0 -333
  138. package/dashboard/vite.config.js +0 -30
  139. package/src/routes/analytics.js +0 -812
@@ -0,0 +1,210 @@
1
+ <svg viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+
3
+ <!-- Decorative sparkles -->
4
+ <g id="sparkles">
5
+ <circle cx="25" cy="30" r="1" fill="url(#sparkleGradient)" opacity="0.8">
6
+ <animate attributeName="opacity" values="0.8;0.3;0.8" dur="3s" repeatCount="indefinite"/>
7
+ </circle>
8
+ <circle cx="95" cy="35" r="1.5" fill="url(#sparkleGradient)" opacity="0.6">
9
+ <animate attributeName="opacity" values="0.6;1;0.6" dur="2.5s" repeatCount="indefinite"/>
10
+ </circle>
11
+ <circle cx="90" cy="85" r="1" fill="url(#sparkleGradient)" opacity="0.7">
12
+ <animate attributeName="opacity" values="0.7;0.4;0.7" dur="2s" repeatCount="indefinite"/>
13
+ </circle>
14
+ <circle cx="30" cy="90" r="1.2" fill="url(#sparkleGradient)" opacity="0.5">
15
+ <animate attributeName="opacity" values="0.5;0.9;0.5" dur="2.8s" repeatCount="indefinite"/>
16
+ </circle>
17
+ </g>
18
+
19
+ <!-- Queue lines flowing -->
20
+ <g id="queue-lines">
21
+ <g opacity="0.8">
22
+ <rect x="15" y="65" width="20" height="3" rx="1.5" fill="url(#queueGradient1)">
23
+ <animate attributeName="x" values="15;20;15" dur="4s" repeatCount="indefinite"/>
24
+ </rect>
25
+ <rect x="18" y="72" width="15" height="3" rx="1.5" fill="url(#queueGradient2)">
26
+ <animate attributeName="x" values="18;23;18" dur="3.5s" repeatCount="indefinite"/>
27
+ </rect>
28
+ <rect x="12" y="79" width="25" height="3" rx="1.5" fill="url(#queueGradient3)">
29
+ <animate attributeName="x" values="12;17;12" dur="4.5s" repeatCount="indefinite"/>
30
+ </rect>
31
+ </g>
32
+ <g opacity="0.8">
33
+ <rect x="85" y="65" width="20" height="3" rx="1.5" fill="url(#queueGradient1)">
34
+ <animate attributeName="x" values="85;80;85" dur="4s" repeatCount="indefinite"/>
35
+ </rect>
36
+ <rect x="87" y="72" width="15" height="3" rx="1.5" fill="url(#queueGradient2)">
37
+ <animate attributeName="x" values="87;82;87" dur="3.5s" repeatCount="indefinite"/>
38
+ </rect>
39
+ <rect x="83" y="79" width="25" height="3" rx="1.5" fill="url(#queueGradient3)">
40
+ <animate attributeName="x" values="83;78;83" dur="4.5s" repeatCount="indefinite"/>
41
+ </rect>
42
+ </g>
43
+ </g>
44
+
45
+ <!-- Main duck -->
46
+ <g id="queen-duck" transform="translate(60, 60)">
47
+ <ellipse cx="0" cy="35" rx="25" ry="8" fill="#000000" opacity="0.15"/>
48
+ <path d="M -20 5 Q -25 15 -22 28 Q -18 38 -5 40 L 5 40 Q 18 38 22 28 Q 25 15 20 5 Q 15 -2 8 -3 L -8 -3 Q -15 -2 -20 5 Z"
49
+ fill="url(#bodyGradient)" stroke="url(#bodyStroke)" stroke-width="1.5"/>
50
+ <ellipse cx="0" cy="15" rx="12" ry="15" fill="url(#chestHighlight)" opacity="0.6"/>
51
+ <path d="M -18 8 Q -23 12 -22 20 Q -20 25 -15 22 Q -12 18 -13 12 Z"
52
+ fill="url(#wingGradient)" stroke="url(#wingStroke)" stroke-width="0.8" opacity="0.9"/>
53
+ <path d="M 18 8 Q 23 12 22 20 Q 20 25 15 22 Q 12 18 13 12 Z"
54
+ fill="url(#wingGradient)" stroke="url(#wingStroke)" stroke-width="0.8" opacity="0.9"/>
55
+ <path d="M -5 -3 Q -6 -8 -5 -12 L 5 -12 Q 6 -8 5 -3" fill="url(#neckGradient)" stroke="none"/>
56
+ <ellipse cx="0" cy="-18" rx="12" ry="13" fill="url(#headGradient)" stroke="url(#headStroke)" stroke-width="1.2"/>
57
+ <ellipse cx="-2" cy="-20" rx="6" ry="7" fill="url(#headHighlight)" opacity="0.5"/>
58
+ <path d="M 8 -18 Q 14 -18 15 -17 Q 15 -15 14 -14 Q 13 -13 8 -14 Z"
59
+ fill="url(#beakGradient)" stroke="#FCD34D" stroke-width="0.8"/>
60
+ <ellipse cx="4" cy="-19" rx="3" ry="3.5" fill="white"/>
61
+ <ellipse cx="4.5" cy="-19" rx="2" ry="2.5" fill="url(#eyeGradient)"/>
62
+ <circle cx="5" cy="-19.5" r="1" fill="#1F2937"/>
63
+ <circle cx="5.5" cy="-20" r="0.4" fill="white"/>
64
+ <path d="M 6 -22 L 7 -23.5 M 7 -21.5 L 8.5 -22.5 M 7.5 -21 L 9 -21.5"
65
+ stroke="#1F2937" stroke-width="0.4" fill="none" stroke-linecap="round"/>
66
+ <ellipse cx="1" cy="-15" rx="2.5" ry="1.5" fill="#FFB6C1" opacity="0.4"/>
67
+
68
+ <g id="crown" transform="translate(0, -32)">
69
+ <ellipse cx="0" cy="2" rx="12" ry="3" fill="#000000" opacity="0.1"/>
70
+ <path d="M -12 0 L -10 -8 L -6 -3 L -3 -10 L 0 -5 L 3 -10 L 6 -3 L 10 -8 L 12 0 Q 10 2 0 2 Q -10 2 -12 0 Z"
71
+ fill="url(#crownGradient)" stroke="url(#crownStroke)" stroke-width="1.2" stroke-linejoin="round"/>
72
+ <path d="M -10 0 L -8 -6 L -5 -2 L -2 -8 L 0 -4 L 2 -8 L 5 -2 L 8 -6 L 10 0"
73
+ fill="none" stroke="#FEF3C7" stroke-width="0.5" opacity="0.6"/>
74
+ <circle cx="0" cy="-2" r="2.5" fill="url(#centerJewelGradient)" stroke="#f97316" stroke-width="0.5"/>
75
+ <circle cx="0" cy="-2" r="1.5" fill="url(#jewelSparkle)" opacity="0.8"/>
76
+ <circle cx="-6" cy="-1" r="1.8" fill="url(#leftJewelGradient)" stroke="#fb923c" stroke-width="0.4"/>
77
+ <circle cx="6" cy="-1" r="1.8" fill="url(#rightJewelGradient)" stroke="#ea580c" stroke-width="0.4"/>
78
+ <circle cx="-3" cy="-4" r="1" fill="#fdba74" opacity="0.9"/>
79
+ <circle cx="3" cy="-4" r="1" fill="#fdba74" opacity="0.9"/>
80
+ <circle cx="0" cy="-10" r="1.2" fill="#FEF3C7"/>
81
+ <circle cx="-6" cy="-8" r="1" fill="#FEF3C7"/>
82
+ <circle cx="6" cy="-8" r="1" fill="#FEF3C7"/>
83
+ </g>
84
+
85
+ <g id="tail" transform="translate(-22, 25)">
86
+ <path d="M 0 0 Q -3 3 -2 7 Q -1 9 1 8 Q 2 5 0 0" fill="url(#tailGradient)" opacity="0.8"/>
87
+ <path d="M 2 -1 Q -1 2 0 6 Q 1 8 3 7 Q 4 4 2 -1" fill="url(#tailGradient)" opacity="0.7"/>
88
+ <path d="M 4 -2 Q 1 1 2 5 Q 3 7 5 6 Q 6 3 4 -2" fill="url(#tailGradient)" opacity="0.6"/>
89
+ </g>
90
+ </g>
91
+
92
+ <defs>
93
+ <radialGradient id="sparkleGradient">
94
+ <stop offset="0%" style="stop-color:#fb923c;stop-opacity:1" />
95
+ <stop offset="100%" style="stop-color:#fdba74;stop-opacity:0" />
96
+ </radialGradient>
97
+
98
+ <linearGradient id="queueGradient1" x1="0%" y1="0%" x2="100%" y2="0%">
99
+ <stop offset="0%" style="stop-color:#f97316;stop-opacity:0.3" />
100
+ <stop offset="50%" style="stop-color:#f97316;stop-opacity:1" />
101
+ <stop offset="100%" style="stop-color:#f97316;stop-opacity:0.3" />
102
+ </linearGradient>
103
+
104
+ <linearGradient id="queueGradient2" x1="0%" y1="0%" x2="100%" y2="0%">
105
+ <stop offset="0%" style="stop-color:#3B82F6;stop-opacity:0.3" />
106
+ <stop offset="50%" style="stop-color:#3B82F6;stop-opacity:1" />
107
+ <stop offset="100%" style="stop-color:#3B82F6;stop-opacity:0.3" />
108
+ </linearGradient>
109
+
110
+ <linearGradient id="queueGradient3" x1="0%" y1="0%" x2="100%" y2="0%">
111
+ <stop offset="0%" style="stop-color:#F59E0B;stop-opacity:0.3" />
112
+ <stop offset="50%" style="stop-color:#F59E0B;stop-opacity:1" />
113
+ <stop offset="100%" style="stop-color:#F59E0B;stop-opacity:0.3" />
114
+ </linearGradient>
115
+
116
+ <radialGradient id="bodyGradient" cx="50%" cy="30%">
117
+ <stop offset="0%" style="stop-color:#fed7aa;stop-opacity:1" />
118
+ <stop offset="70%" style="stop-color:#fdba74;stop-opacity:1" />
119
+ <stop offset="100%" style="stop-color:#f97316;stop-opacity:1" />
120
+ </radialGradient>
121
+
122
+ <linearGradient id="bodyStroke" x1="0%" y1="0%" x2="0%" y2="100%">
123
+ <stop offset="0%" style="stop-color:#fb923c;stop-opacity:1" />
124
+ <stop offset="100%" style="stop-color:#ea580c;stop-opacity:1" />
125
+ </linearGradient>
126
+
127
+ <radialGradient id="chestHighlight">
128
+ <stop offset="0%" style="stop-color:#FFFFFF;stop-opacity:0.8" />
129
+ <stop offset="100%" style="stop-color:#fff7ed;stop-opacity:0.2" />
130
+ </radialGradient>
131
+
132
+ <linearGradient id="wingGradient" x1="0%" y1="0%" x2="100%" y2="100%">
133
+ <stop offset="0%" style="stop-color:#fdba74;stop-opacity:1" />
134
+ <stop offset="100%" style="stop-color:#ea580c;stop-opacity:1" />
135
+ </linearGradient>
136
+
137
+ <linearGradient id="wingStroke">
138
+ <stop offset="0%" style="stop-color:#f97316;stop-opacity:1" />
139
+ <stop offset="100%" style="stop-color:#c2410c;stop-opacity:1" />
140
+ </linearGradient>
141
+
142
+ <linearGradient id="neckGradient" x1="0%" y1="100%" x2="0%" y2="0%">
143
+ <stop offset="0%" style="stop-color:#fdba74;stop-opacity:1" />
144
+ <stop offset="100%" style="stop-color:#fed7aa;stop-opacity:1" />
145
+ </linearGradient>
146
+
147
+ <radialGradient id="headGradient" cx="40%" cy="40%">
148
+ <stop offset="0%" style="stop-color:#ffedd5;stop-opacity:1" />
149
+ <stop offset="60%" style="stop-color:#fed7aa;stop-opacity:1" />
150
+ <stop offset="100%" style="stop-color:#fb923c;stop-opacity:1" />
151
+ </radialGradient>
152
+
153
+ <linearGradient id="headStroke">
154
+ <stop offset="0%" style="stop-color:#fb923c;stop-opacity:1" />
155
+ <stop offset="100%" style="stop-color:#f97316;stop-opacity:1" />
156
+ </linearGradient>
157
+
158
+ <radialGradient id="headHighlight">
159
+ <stop offset="0%" style="stop-color:#FFFFFF;stop-opacity:1" />
160
+ <stop offset="100%" style="stop-color:#fff7ed;stop-opacity:0" />
161
+ </radialGradient>
162
+
163
+ <linearGradient id="beakGradient" x1="0%" y1="0%" x2="100%" y2="0%">
164
+ <stop offset="0%" style="stop-color:#FDE68A;stop-opacity:1" />
165
+ <stop offset="100%" style="stop-color:#FCD34D;stop-opacity:1" />
166
+ </linearGradient>
167
+
168
+ <radialGradient id="eyeGradient">
169
+ <stop offset="0%" style="stop-color:#92400E;stop-opacity:1" />
170
+ <stop offset="100%" style="stop-color:#451A03;stop-opacity:1" />
171
+ </radialGradient>
172
+
173
+ <linearGradient id="crownGradient" x1="0%" y1="100%" x2="0%" y2="0%">
174
+ <stop offset="0%" style="stop-color:#FDE68A;stop-opacity:1" />
175
+ <stop offset="50%" style="stop-color:#FCD34D;stop-opacity:1" />
176
+ <stop offset="100%" style="stop-color:#FEF3C7;stop-opacity:1" />
177
+ </linearGradient>
178
+
179
+ <linearGradient id="crownStroke">
180
+ <stop offset="0%" style="stop-color:#FCD34D;stop-opacity:1" />
181
+ <stop offset="100%" style="stop-color:#FBBF24;stop-opacity:1" />
182
+ </linearGradient>
183
+
184
+ <radialGradient id="centerJewelGradient">
185
+ <stop offset="0%" style="stop-color:#ffedd5;stop-opacity:1" />
186
+ <stop offset="100%" style="stop-color:#f97316;stop-opacity:1" />
187
+ </radialGradient>
188
+
189
+ <radialGradient id="leftJewelGradient">
190
+ <stop offset="0%" style="stop-color:#fed7aa;stop-opacity:1" />
191
+ <stop offset="100%" style="stop-color:#ea580c;stop-opacity:1" />
192
+ </radialGradient>
193
+
194
+ <radialGradient id="rightJewelGradient">
195
+ <stop offset="0%" style="stop-color:#ffedd5;stop-opacity:1" />
196
+ <stop offset="100%" style="stop-color:#c2410c;stop-opacity:1" />
197
+ </radialGradient>
198
+
199
+ <radialGradient id="jewelSparkle">
200
+ <stop offset="0%" style="stop-color:#FFFFFF;stop-opacity:1" />
201
+ <stop offset="100%" style="stop-color:#FFFFFF;stop-opacity:0" />
202
+ </radialGradient>
203
+
204
+ <linearGradient id="tailGradient" x1="0%" y1="0%" x2="100%" y2="100%">
205
+ <stop offset="0%" style="stop-color:#fb923c;stop-opacity:1" />
206
+ <stop offset="100%" style="stop-color:#ea580c;stop-opacity:1" />
207
+ </linearGradient>
208
+ </defs>
209
+ </svg>
210
+
@@ -0,0 +1,210 @@
1
+ <svg viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+
3
+ <!-- Decorative sparkles -->
4
+ <g id="sparkles">
5
+ <circle cx="25" cy="30" r="1" fill="url(#sparkleGradient)" opacity="0.8">
6
+ <animate attributeName="opacity" values="0.8;0.3;0.8" dur="3s" repeatCount="indefinite"/>
7
+ </circle>
8
+ <circle cx="95" cy="35" r="1.5" fill="url(#sparkleGradient)" opacity="0.6">
9
+ <animate attributeName="opacity" values="0.6;1;0.6" dur="2.5s" repeatCount="indefinite"/>
10
+ </circle>
11
+ <circle cx="90" cy="85" r="1" fill="url(#sparkleGradient)" opacity="0.7">
12
+ <animate attributeName="opacity" values="0.7;0.4;0.7" dur="2s" repeatCount="indefinite"/>
13
+ </circle>
14
+ <circle cx="30" cy="90" r="1.2" fill="url(#sparkleGradient)" opacity="0.5">
15
+ <animate attributeName="opacity" values="0.5;0.9;0.5" dur="2.8s" repeatCount="indefinite"/>
16
+ </circle>
17
+ </g>
18
+
19
+ <!-- Queue lines -->
20
+ <g id="queue-lines">
21
+ <g opacity="0.8">
22
+ <rect x="15" y="65" width="20" height="3" rx="1.5" fill="url(#queueGradient1)">
23
+ <animate attributeName="x" values="15;20;15" dur="4s" repeatCount="indefinite"/>
24
+ </rect>
25
+ <rect x="18" y="72" width="15" height="3" rx="1.5" fill="url(#queueGradient2)">
26
+ <animate attributeName="x" values="18;23;18" dur="3.5s" repeatCount="indefinite"/>
27
+ </rect>
28
+ <rect x="12" y="79" width="25" height="3" rx="1.5" fill="url(#queueGradient3)">
29
+ <animate attributeName="x" values="12;17;12" dur="4.5s" repeatCount="indefinite"/>
30
+ </rect>
31
+ </g>
32
+ <g opacity="0.8">
33
+ <rect x="85" y="65" width="20" height="3" rx="1.5" fill="url(#queueGradient1)">
34
+ <animate attributeName="x" values="85;80;85" dur="4s" repeatCount="indefinite"/>
35
+ </rect>
36
+ <rect x="87" y="72" width="15" height="3" rx="1.5" fill="url(#queueGradient2)">
37
+ <animate attributeName="x" values="87;82;87" dur="3.5s" repeatCount="indefinite"/>
38
+ </rect>
39
+ <rect x="83" y="79" width="25" height="3" rx="1.5" fill="url(#queueGradient3)">
40
+ <animate attributeName="x" values="83;78;83" dur="4.5s" repeatCount="indefinite"/>
41
+ </rect>
42
+ </g>
43
+ </g>
44
+
45
+ <!-- Main duck -->
46
+ <g id="queen-duck" transform="translate(60, 60)">
47
+ <ellipse cx="0" cy="35" rx="25" ry="8" fill="#000000" opacity="0.15"/>
48
+ <path d="M -20 5 Q -25 15 -22 28 Q -18 38 -5 40 L 5 40 Q 18 38 22 28 Q 25 15 20 5 Q 15 -2 8 -3 L -8 -3 Q -15 -2 -20 5 Z"
49
+ fill="url(#bodyGradient)" stroke="url(#bodyStroke)" stroke-width="1.5"/>
50
+ <ellipse cx="0" cy="15" rx="12" ry="15" fill="url(#chestHighlight)" opacity="0.6"/>
51
+ <path d="M -18 8 Q -23 12 -22 20 Q -20 25 -15 22 Q -12 18 -13 12 Z"
52
+ fill="url(#wingGradient)" stroke="url(#wingStroke)" stroke-width="0.8" opacity="0.9"/>
53
+ <path d="M 18 8 Q 23 12 22 20 Q 20 25 15 22 Q 12 18 13 12 Z"
54
+ fill="url(#wingGradient)" stroke="url(#wingStroke)" stroke-width="0.8" opacity="0.9"/>
55
+ <path d="M -5 -3 Q -6 -8 -5 -12 L 5 -12 Q 6 -8 5 -3" fill="url(#neckGradient)" stroke="none"/>
56
+ <ellipse cx="0" cy="-18" rx="12" ry="13" fill="url(#headGradient)" stroke="url(#headStroke)" stroke-width="1.2"/>
57
+ <ellipse cx="-2" cy="-20" rx="6" ry="7" fill="url(#headHighlight)" opacity="0.5"/>
58
+ <path d="M 8 -18 Q 14 -18 15 -17 Q 15 -15 14 -14 Q 13 -13 8 -14 Z"
59
+ fill="url(#beakGradient)" stroke="#FCD34D" stroke-width="0.8"/>
60
+ <ellipse cx="4" cy="-19" rx="3" ry="3.5" fill="white"/>
61
+ <ellipse cx="4.5" cy="-19" rx="2" ry="2.5" fill="url(#eyeGradient)"/>
62
+ <circle cx="5" cy="-19.5" r="1" fill="#1F2937"/>
63
+ <circle cx="5.5" cy="-20" r="0.4" fill="white"/>
64
+ <path d="M 6 -22 L 7 -23.5 M 7 -21.5 L 8.5 -22.5 M 7.5 -21 L 9 -21.5"
65
+ stroke="#1F2937" stroke-width="0.4" fill="none" stroke-linecap="round"/>
66
+ <ellipse cx="1" cy="-15" rx="2.5" ry="1.5" fill="#FFB6C1" opacity="0.4"/>
67
+
68
+ <g id="crown" transform="translate(0, -32)">
69
+ <ellipse cx="0" cy="2" rx="12" ry="3" fill="#000000" opacity="0.1"/>
70
+ <path d="M -12 0 L -10 -8 L -6 -3 L -3 -10 L 0 -5 L 3 -10 L 6 -3 L 10 -8 L 12 0 Q 10 2 0 2 Q -10 2 -12 0 Z"
71
+ fill="url(#crownGradient)" stroke="url(#crownStroke)" stroke-width="1.2" stroke-linejoin="round"/>
72
+ <path d="M -10 0 L -8 -6 L -5 -2 L -2 -8 L 0 -4 L 2 -8 L 5 -2 L 8 -6 L 10 0"
73
+ fill="none" stroke="#FEF3C7" stroke-width="0.5" opacity="0.6"/>
74
+ <circle cx="0" cy="-2" r="2.5" fill="url(#centerJewelGradient)" stroke="#ec4899" stroke-width="0.5"/>
75
+ <circle cx="0" cy="-2" r="1.5" fill="url(#jewelSparkle)" opacity="0.8"/>
76
+ <circle cx="-6" cy="-1" r="1.8" fill="url(#leftJewelGradient)" stroke="#f472b6" stroke-width="0.4"/>
77
+ <circle cx="6" cy="-1" r="1.8" fill="url(#rightJewelGradient)" stroke="#db2777" stroke-width="0.4"/>
78
+ <circle cx="-3" cy="-4" r="1" fill="#f9a8d4" opacity="0.9"/>
79
+ <circle cx="3" cy="-4" r="1" fill="#f9a8d4" opacity="0.9"/>
80
+ <circle cx="0" cy="-10" r="1.2" fill="#FEF3C7"/>
81
+ <circle cx="-6" cy="-8" r="1" fill="#FEF3C7"/>
82
+ <circle cx="6" cy="-8" r="1" fill="#FEF3C7"/>
83
+ </g>
84
+
85
+ <g id="tail" transform="translate(-22, 25)">
86
+ <path d="M 0 0 Q -3 3 -2 7 Q -1 9 1 8 Q 2 5 0 0" fill="url(#tailGradient)" opacity="0.8"/>
87
+ <path d="M 2 -1 Q -1 2 0 6 Q 1 8 3 7 Q 4 4 2 -1" fill="url(#tailGradient)" opacity="0.7"/>
88
+ <path d="M 4 -2 Q 1 1 2 5 Q 3 7 5 6 Q 6 3 4 -2" fill="url(#tailGradient)" opacity="0.6"/>
89
+ </g>
90
+ </g>
91
+
92
+ <defs>
93
+ <radialGradient id="sparkleGradient">
94
+ <stop offset="0%" style="stop-color:#f472b6;stop-opacity:1" />
95
+ <stop offset="100%" style="stop-color:#f9a8d4;stop-opacity:0" />
96
+ </radialGradient>
97
+
98
+ <linearGradient id="queueGradient1" x1="0%" y1="0%" x2="100%" y2="0%">
99
+ <stop offset="0%" style="stop-color:#ec4899;stop-opacity:0.3" />
100
+ <stop offset="50%" style="stop-color:#ec4899;stop-opacity:1" />
101
+ <stop offset="100%" style="stop-color:#ec4899;stop-opacity:0.3" />
102
+ </linearGradient>
103
+
104
+ <linearGradient id="queueGradient2" x1="0%" y1="0%" x2="100%" y2="0%">
105
+ <stop offset="0%" style="stop-color:#3B82F6;stop-opacity:0.3" />
106
+ <stop offset="50%" style="stop-color:#3B82F6;stop-opacity:1" />
107
+ <stop offset="100%" style="stop-color:#3B82F6;stop-opacity:0.3" />
108
+ </linearGradient>
109
+
110
+ <linearGradient id="queueGradient3" x1="0%" y1="0%" x2="100%" y2="0%">
111
+ <stop offset="0%" style="stop-color:#F59E0B;stop-opacity:0.3" />
112
+ <stop offset="50%" style="stop-color:#F59E0B;stop-opacity:1" />
113
+ <stop offset="100%" style="stop-color:#F59E0B;stop-opacity:0.3" />
114
+ </linearGradient>
115
+
116
+ <radialGradient id="bodyGradient" cx="50%" cy="30%">
117
+ <stop offset="0%" style="stop-color:#fbcfe8;stop-opacity:1" />
118
+ <stop offset="70%" style="stop-color:#f9a8d4;stop-opacity:1" />
119
+ <stop offset="100%" style="stop-color:#ec4899;stop-opacity:1" />
120
+ </radialGradient>
121
+
122
+ <linearGradient id="bodyStroke" x1="0%" y1="0%" x2="0%" y2="100%">
123
+ <stop offset="0%" style="stop-color:#f472b6;stop-opacity:1" />
124
+ <stop offset="100%" style="stop-color:#db2777;stop-opacity:1" />
125
+ </linearGradient>
126
+
127
+ <radialGradient id="chestHighlight">
128
+ <stop offset="0%" style="stop-color:#FFFFFF;stop-opacity:0.8" />
129
+ <stop offset="100%" style="stop-color:#fdf2f8;stop-opacity:0.2" />
130
+ </radialGradient>
131
+
132
+ <linearGradient id="wingGradient" x1="0%" y1="0%" x2="100%" y2="100%">
133
+ <stop offset="0%" style="stop-color:#f9a8d4;stop-opacity:1" />
134
+ <stop offset="100%" style="stop-color:#db2777;stop-opacity:1" />
135
+ </linearGradient>
136
+
137
+ <linearGradient id="wingStroke">
138
+ <stop offset="0%" style="stop-color:#ec4899;stop-opacity:1" />
139
+ <stop offset="100%" style="stop-color:#be185d;stop-opacity:1" />
140
+ </linearGradient>
141
+
142
+ <linearGradient id="neckGradient" x1="0%" y1="100%" x2="0%" y2="0%">
143
+ <stop offset="0%" style="stop-color:#f9a8d4;stop-opacity:1" />
144
+ <stop offset="100%" style="stop-color:#fbcfe8;stop-opacity:1" />
145
+ </linearGradient>
146
+
147
+ <radialGradient id="headGradient" cx="40%" cy="40%">
148
+ <stop offset="0%" style="stop-color:#fce7f3;stop-opacity:1" />
149
+ <stop offset="60%" style="stop-color:#fbcfe8;stop-opacity:1" />
150
+ <stop offset="100%" style="stop-color:#f472b6;stop-opacity:1" />
151
+ </radialGradient>
152
+
153
+ <linearGradient id="headStroke">
154
+ <stop offset="0%" style="stop-color:#f472b6;stop-opacity:1" />
155
+ <stop offset="100%" style="stop-color:#ec4899;stop-opacity:1" />
156
+ </linearGradient>
157
+
158
+ <radialGradient id="headHighlight">
159
+ <stop offset="0%" style="stop-color:#FFFFFF;stop-opacity:1" />
160
+ <stop offset="100%" style="stop-color:#fdf2f8;stop-opacity:0" />
161
+ </radialGradient>
162
+
163
+ <linearGradient id="beakGradient" x1="0%" y1="0%" x2="100%" y2="0%">
164
+ <stop offset="0%" style="stop-color:#FDE68A;stop-opacity:1" />
165
+ <stop offset="100%" style="stop-color:#FCD34D;stop-opacity:1" />
166
+ </linearGradient>
167
+
168
+ <radialGradient id="eyeGradient">
169
+ <stop offset="0%" style="stop-color:#92400E;stop-opacity:1" />
170
+ <stop offset="100%" style="stop-color:#451A03;stop-opacity:1" />
171
+ </radialGradient>
172
+
173
+ <linearGradient id="crownGradient" x1="0%" y1="100%" x2="0%" y2="0%">
174
+ <stop offset="0%" style="stop-color:#FDE68A;stop-opacity:1" />
175
+ <stop offset="50%" style="stop-color:#FCD34D;stop-opacity:1" />
176
+ <stop offset="100%" style="stop-color:#FEF3C7;stop-opacity:1" />
177
+ </linearGradient>
178
+
179
+ <linearGradient id="crownStroke">
180
+ <stop offset="0%" style="stop-color:#FCD34D;stop-opacity:1" />
181
+ <stop offset="100%" style="stop-color:#FBBF24;stop-opacity:1" />
182
+ </linearGradient>
183
+
184
+ <radialGradient id="centerJewelGradient">
185
+ <stop offset="0%" style="stop-color:#fce7f3;stop-opacity:1" />
186
+ <stop offset="100%" style="stop-color:#ec4899;stop-opacity:1" />
187
+ </radialGradient>
188
+
189
+ <radialGradient id="leftJewelGradient">
190
+ <stop offset="0%" style="stop-color:#fbcfe8;stop-opacity:1" />
191
+ <stop offset="100%" style="stop-color:#db2777;stop-opacity:1" />
192
+ </radialGradient>
193
+
194
+ <radialGradient id="rightJewelGradient">
195
+ <stop offset="0%" style="stop-color:#fce7f3;stop-opacity:1" />
196
+ <stop offset="100%" style="stop-color:#be185d;stop-opacity:1" />
197
+ </radialGradient>
198
+
199
+ <radialGradient id="jewelSparkle">
200
+ <stop offset="0%" style="stop-color:#FFFFFF;stop-opacity:1" />
201
+ <stop offset="100%" style="stop-color:#FFFFFF;stop-opacity:0" />
202
+ </radialGradient>
203
+
204
+ <linearGradient id="tailGradient" x1="0%" y1="0%" x2="100%" y2="100%">
205
+ <stop offset="0%" style="stop-color:#f472b6;stop-opacity:1" />
206
+ <stop offset="100%" style="stop-color:#db2777;stop-opacity:1" />
207
+ </linearGradient>
208
+ </defs>
209
+ </svg>
210
+
@@ -0,0 +1,210 @@
1
+ <svg viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+
3
+ <!-- Decorative sparkles -->
4
+ <g id="sparkles">
5
+ <circle cx="25" cy="30" r="1" fill="url(#sparkleGradient)" opacity="0.8">
6
+ <animate attributeName="opacity" values="0.8;0.3;0.8" dur="3s" repeatCount="indefinite"/>
7
+ </circle>
8
+ <circle cx="95" cy="35" r="1.5" fill="url(#sparkleGradient)" opacity="0.6">
9
+ <animate attributeName="opacity" values="0.6;1;0.6" dur="2.5s" repeatCount="indefinite"/>
10
+ </circle>
11
+ <circle cx="90" cy="85" r="1" fill="url(#sparkleGradient)" opacity="0.7">
12
+ <animate attributeName="opacity" values="0.7;0.4;0.7" dur="2s" repeatCount="indefinite"/>
13
+ </circle>
14
+ <circle cx="30" cy="90" r="1.2" fill="url(#sparkleGradient)" opacity="0.5">
15
+ <animate attributeName="opacity" values="0.5;0.9;0.5" dur="2.8s" repeatCount="indefinite"/>
16
+ </circle>
17
+ </g>
18
+
19
+ <!-- Queue lines -->
20
+ <g id="queue-lines">
21
+ <g opacity="0.8">
22
+ <rect x="15" y="65" width="20" height="3" rx="1.5" fill="url(#queueGradient1)">
23
+ <animate attributeName="x" values="15;20;15" dur="4s" repeatCount="indefinite"/>
24
+ </rect>
25
+ <rect x="18" y="72" width="15" height="3" rx="1.5" fill="url(#queueGradient2)">
26
+ <animate attributeName="x" values="18;23;18" dur="3.5s" repeatCount="indefinite"/>
27
+ </rect>
28
+ <rect x="12" y="79" width="25" height="3" rx="1.5" fill="url(#queueGradient3)">
29
+ <animate attributeName="x" values="12;17;12" dur="4.5s" repeatCount="indefinite"/>
30
+ </rect>
31
+ </g>
32
+ <g opacity="0.8">
33
+ <rect x="85" y="65" width="20" height="3" rx="1.5" fill="url(#queueGradient1)">
34
+ <animate attributeName="x" values="85;80;85" dur="4s" repeatCount="indefinite"/>
35
+ </rect>
36
+ <rect x="87" y="72" width="15" height="3" rx="1.5" fill="url(#queueGradient2)">
37
+ <animate attributeName="x" values="87;82;87" dur="3.5s" repeatCount="indefinite"/>
38
+ </rect>
39
+ <rect x="83" y="79" width="25" height="3" rx="1.5" fill="url(#queueGradient3)">
40
+ <animate attributeName="x" values="83;78;83" dur="4.5s" repeatCount="indefinite"/>
41
+ </rect>
42
+ </g>
43
+ </g>
44
+
45
+ <!-- Main duck -->
46
+ <g id="queen-duck" transform="translate(60, 60)">
47
+ <ellipse cx="0" cy="35" rx="25" ry="8" fill="#000000" opacity="0.15"/>
48
+ <path d="M -20 5 Q -25 15 -22 28 Q -18 38 -5 40 L 5 40 Q 18 38 22 28 Q 25 15 20 5 Q 15 -2 8 -3 L -8 -3 Q -15 -2 -20 5 Z"
49
+ fill="url(#bodyGradient)" stroke="url(#bodyStroke)" stroke-width="1.5"/>
50
+ <ellipse cx="0" cy="15" rx="12" ry="15" fill="url(#chestHighlight)" opacity="0.6"/>
51
+ <path d="M -18 8 Q -23 12 -22 20 Q -20 25 -15 22 Q -12 18 -13 12 Z"
52
+ fill="url(#wingGradient)" stroke="url(#wingStroke)" stroke-width="0.8" opacity="0.9"/>
53
+ <path d="M 18 8 Q 23 12 22 20 Q 20 25 15 22 Q 12 18 13 12 Z"
54
+ fill="url(#wingGradient)" stroke="url(#wingStroke)" stroke-width="0.8" opacity="0.9"/>
55
+ <path d="M -5 -3 Q -6 -8 -5 -12 L 5 -12 Q 6 -8 5 -3" fill="url(#neckGradient)" stroke="none"/>
56
+ <ellipse cx="0" cy="-18" rx="12" ry="13" fill="url(#headGradient)" stroke="url(#headStroke)" stroke-width="1.2"/>
57
+ <ellipse cx="-2" cy="-20" rx="6" ry="7" fill="url(#headHighlight)" opacity="0.5"/>
58
+ <path d="M 8 -18 Q 14 -18 15 -17 Q 15 -15 14 -14 Q 13 -13 8 -14 Z"
59
+ fill="url(#beakGradient)" stroke="#FCD34D" stroke-width="0.8"/>
60
+ <ellipse cx="4" cy="-19" rx="3" ry="3.5" fill="white"/>
61
+ <ellipse cx="4.5" cy="-19" rx="2" ry="2.5" fill="url(#eyeGradient)"/>
62
+ <circle cx="5" cy="-19.5" r="1" fill="#1F2937"/>
63
+ <circle cx="5.5" cy="-20" r="0.4" fill="white"/>
64
+ <path d="M 6 -22 L 7 -23.5 M 7 -21.5 L 8.5 -22.5 M 7.5 -21 L 9 -21.5"
65
+ stroke="#1F2937" stroke-width="0.4" fill="none" stroke-linecap="round"/>
66
+ <ellipse cx="1" cy="-15" rx="2.5" ry="1.5" fill="#FFB6C1" opacity="0.4"/>
67
+
68
+ <g id="crown" transform="translate(0, -32)">
69
+ <ellipse cx="0" cy="2" rx="12" ry="3" fill="#000000" opacity="0.1"/>
70
+ <path d="M -12 0 L -10 -8 L -6 -3 L -3 -10 L 0 -5 L 3 -10 L 6 -3 L 10 -8 L 12 0 Q 10 2 0 2 Q -10 2 -12 0 Z"
71
+ fill="url(#crownGradient)" stroke="url(#crownStroke)" stroke-width="1.2" stroke-linejoin="round"/>
72
+ <path d="M -10 0 L -8 -6 L -5 -2 L -2 -8 L 0 -4 L 2 -8 L 5 -2 L 8 -6 L 10 0"
73
+ fill="none" stroke="#FEF3C7" stroke-width="0.5" opacity="0.6"/>
74
+ <circle cx="0" cy="-2" r="2.5" fill="url(#centerJewelGradient)" stroke="#a855f7" stroke-width="0.5"/>
75
+ <circle cx="0" cy="-2" r="1.5" fill="url(#jewelSparkle)" opacity="0.8"/>
76
+ <circle cx="-6" cy="-1" r="1.8" fill="url(#leftJewelGradient)" stroke="#c084fc" stroke-width="0.4"/>
77
+ <circle cx="6" cy="-1" r="1.8" fill="url(#rightJewelGradient)" stroke="#9333ea" stroke-width="0.4"/>
78
+ <circle cx="-3" cy="-4" r="1" fill="#d8b4fe" opacity="0.9"/>
79
+ <circle cx="3" cy="-4" r="1" fill="#d8b4fe" opacity="0.9"/>
80
+ <circle cx="0" cy="-10" r="1.2" fill="#FEF3C7"/>
81
+ <circle cx="-6" cy="-8" r="1" fill="#FEF3C7"/>
82
+ <circle cx="6" cy="-8" r="1" fill="#FEF3C7"/>
83
+ </g>
84
+
85
+ <g id="tail" transform="translate(-22, 25)">
86
+ <path d="M 0 0 Q -3 3 -2 7 Q -1 9 1 8 Q 2 5 0 0" fill="url(#tailGradient)" opacity="0.8"/>
87
+ <path d="M 2 -1 Q -1 2 0 6 Q 1 8 3 7 Q 4 4 2 -1" fill="url(#tailGradient)" opacity="0.7"/>
88
+ <path d="M 4 -2 Q 1 1 2 5 Q 3 7 5 6 Q 6 3 4 -2" fill="url(#tailGradient)" opacity="0.6"/>
89
+ </g>
90
+ </g>
91
+
92
+ <defs>
93
+ <radialGradient id="sparkleGradient">
94
+ <stop offset="0%" style="stop-color:#c084fc;stop-opacity:1" />
95
+ <stop offset="100%" style="stop-color:#d8b4fe;stop-opacity:0" />
96
+ </radialGradient>
97
+
98
+ <linearGradient id="queueGradient1" x1="0%" y1="0%" x2="100%" y2="0%">
99
+ <stop offset="0%" style="stop-color:#a855f7;stop-opacity:0.3" />
100
+ <stop offset="50%" style="stop-color:#a855f7;stop-opacity:1" />
101
+ <stop offset="100%" style="stop-color:#a855f7;stop-opacity:0.3" />
102
+ </linearGradient>
103
+
104
+ <linearGradient id="queueGradient2" x1="0%" y1="0%" x2="100%" y2="0%">
105
+ <stop offset="0%" style="stop-color:#3B82F6;stop-opacity:0.3" />
106
+ <stop offset="50%" style="stop-color:#3B82F6;stop-opacity:1" />
107
+ <stop offset="100%" style="stop-color:#3B82F6;stop-opacity:0.3" />
108
+ </linearGradient>
109
+
110
+ <linearGradient id="queueGradient3" x1="0%" y1="0%" x2="100%" y2="0%">
111
+ <stop offset="0%" style="stop-color:#F59E0B;stop-opacity:0.3" />
112
+ <stop offset="50%" style="stop-color:#F59E0B;stop-opacity:1" />
113
+ <stop offset="100%" style="stop-color:#F59E0B;stop-opacity:0.3" />
114
+ </linearGradient>
115
+
116
+ <radialGradient id="bodyGradient" cx="50%" cy="30%">
117
+ <stop offset="0%" style="stop-color:#e9d5ff;stop-opacity:1" />
118
+ <stop offset="70%" style="stop-color:#d8b4fe;stop-opacity:1" />
119
+ <stop offset="100%" style="stop-color:#a855f7;stop-opacity:1" />
120
+ </radialGradient>
121
+
122
+ <linearGradient id="bodyStroke" x1="0%" y1="0%" x2="0%" y2="100%">
123
+ <stop offset="0%" style="stop-color:#c084fc;stop-opacity:1" />
124
+ <stop offset="100%" style="stop-color:#9333ea;stop-opacity:1" />
125
+ </linearGradient>
126
+
127
+ <radialGradient id="chestHighlight">
128
+ <stop offset="0%" style="stop-color:#FFFFFF;stop-opacity:0.8" />
129
+ <stop offset="100%" style="stop-color:#faf5ff;stop-opacity:0.2" />
130
+ </radialGradient>
131
+
132
+ <linearGradient id="wingGradient" x1="0%" y1="0%" x2="100%" y2="100%">
133
+ <stop offset="0%" style="stop-color:#d8b4fe;stop-opacity:1" />
134
+ <stop offset="100%" style="stop-color:#9333ea;stop-opacity:1" />
135
+ </linearGradient>
136
+
137
+ <linearGradient id="wingStroke">
138
+ <stop offset="0%" style="stop-color:#a855f7;stop-opacity:1" />
139
+ <stop offset="100%" style="stop-color:#7e22ce;stop-opacity:1" />
140
+ </linearGradient>
141
+
142
+ <linearGradient id="neckGradient" x1="0%" y1="100%" x2="0%" y2="0%">
143
+ <stop offset="0%" style="stop-color:#d8b4fe;stop-opacity:1" />
144
+ <stop offset="100%" style="stop-color:#e9d5ff;stop-opacity:1" />
145
+ </linearGradient>
146
+
147
+ <radialGradient id="headGradient" cx="40%" cy="40%">
148
+ <stop offset="0%" style="stop-color:#f3e8ff;stop-opacity:1" />
149
+ <stop offset="60%" style="stop-color:#e9d5ff;stop-opacity:1" />
150
+ <stop offset="100%" style="stop-color:#c084fc;stop-opacity:1" />
151
+ </radialGradient>
152
+
153
+ <linearGradient id="headStroke">
154
+ <stop offset="0%" style="stop-color:#c084fc;stop-opacity:1" />
155
+ <stop offset="100%" style="stop-color:#a855f7;stop-opacity:1" />
156
+ </linearGradient>
157
+
158
+ <radialGradient id="headHighlight">
159
+ <stop offset="0%" style="stop-color:#FFFFFF;stop-opacity:1" />
160
+ <stop offset="100%" style="stop-color:#faf5ff;stop-opacity:0" />
161
+ </radialGradient>
162
+
163
+ <linearGradient id="beakGradient" x1="0%" y1="0%" x2="100%" y2="0%">
164
+ <stop offset="0%" style="stop-color:#FDE68A;stop-opacity:1" />
165
+ <stop offset="100%" style="stop-color:#FCD34D;stop-opacity:1" />
166
+ </linearGradient>
167
+
168
+ <radialGradient id="eyeGradient">
169
+ <stop offset="0%" style="stop-color:#92400E;stop-opacity:1" />
170
+ <stop offset="100%" style="stop-color:#451A03;stop-opacity:1" />
171
+ </radialGradient>
172
+
173
+ <linearGradient id="crownGradient" x1="0%" y1="100%" x2="0%" y2="0%">
174
+ <stop offset="0%" style="stop-color:#FDE68A;stop-opacity:1" />
175
+ <stop offset="50%" style="stop-color:#FCD34D;stop-opacity:1" />
176
+ <stop offset="100%" style="stop-color:#FEF3C7;stop-opacity:1" />
177
+ </linearGradient>
178
+
179
+ <linearGradient id="crownStroke">
180
+ <stop offset="0%" style="stop-color:#FCD34D;stop-opacity:1" />
181
+ <stop offset="100%" style="stop-color:#FBBF24;stop-opacity:1" />
182
+ </linearGradient>
183
+
184
+ <radialGradient id="centerJewelGradient">
185
+ <stop offset="0%" style="stop-color:#f3e8ff;stop-opacity:1" />
186
+ <stop offset="100%" style="stop-color:#a855f7;stop-opacity:1" />
187
+ </radialGradient>
188
+
189
+ <radialGradient id="leftJewelGradient">
190
+ <stop offset="0%" style="stop-color:#e9d5ff;stop-opacity:1" />
191
+ <stop offset="100%" style="stop-color:#9333ea;stop-opacity:1" />
192
+ </radialGradient>
193
+
194
+ <radialGradient id="rightJewelGradient">
195
+ <stop offset="0%" style="stop-color:#f3e8ff;stop-opacity:1" />
196
+ <stop offset="100%" style="stop-color:#7e22ce;stop-opacity:1" />
197
+ </radialGradient>
198
+
199
+ <radialGradient id="jewelSparkle">
200
+ <stop offset="0%" style="stop-color:#FFFFFF;stop-opacity:1" />
201
+ <stop offset="100%" style="stop-color:#FFFFFF;stop-opacity:0" />
202
+ </radialGradient>
203
+
204
+ <linearGradient id="tailGradient" x1="0%" y1="0%" x2="100%" y2="100%">
205
+ <stop offset="0%" style="stop-color:#c084fc;stop-opacity:1" />
206
+ <stop offset="100%" style="stop-color:#9333ea;stop-opacity:1" />
207
+ </linearGradient>
208
+ </defs>
209
+ </svg>
210
+