queen-mq 0.1.1 → 0.1.3

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 (149) hide show
  1. package/API.md +1226 -0
  2. package/AUTH.md +2044 -0
  3. package/LICENSE.md +202 -0
  4. package/PROGRAMMATIC_SERVER.md +190 -0
  5. package/README.md +303 -53
  6. package/WEBAPP.md +1889 -0
  7. package/assets/dashboard-01.png +0 -0
  8. package/assets/queen-logo-blue.svg +210 -0
  9. package/assets/queen-logo-cyan.svg +210 -0
  10. package/assets/queen-logo-indigo.svg +210 -0
  11. package/assets/queen-logo-orange.svg +210 -0
  12. package/assets/queen-logo-pink.svg +210 -0
  13. package/assets/queen-logo-purple.svg +210 -0
  14. package/assets/queen-logo-rose.svg +239 -0
  15. package/assets/queen-logo.svg +263 -0
  16. package/examples/batch-processing.js +58 -0
  17. package/examples/programmatic-server.js +58 -0
  18. package/examples/test-cache-multi-server.js +2 -2
  19. package/examples/test-connection-recovery.js +66 -0
  20. package/examples/test-dashboard-api.js +200 -0
  21. package/package.json +4 -2
  22. package/server.log +1 -0
  23. package/src/benchmark/consumer.js +207 -0
  24. package/src/benchmark/consumer_multi.js +216 -0
  25. package/src/benchmark/producer.js +75 -0
  26. package/src/benchmark/producer_multi.js +115 -0
  27. package/src/client/client.js +219 -17
  28. package/src/client/index.js +4 -3
  29. package/src/cluster-server.js +242 -0
  30. package/src/config.js +19 -5
  31. package/src/database/connection.js +42 -16
  32. package/src/database/poolManager.js +7 -0
  33. package/src/database/schema-v2.sql +194 -130
  34. package/src/managers/queueManagerOptimized.js +852 -933
  35. package/src/managers/systemEventManager.js +8 -3
  36. package/src/routes/messages.js +127 -57
  37. package/src/routes/pop.js +27 -43
  38. package/src/routes/resources.js +61 -27
  39. package/src/routes/status.js +1037 -0
  40. package/src/server.js +704 -642
  41. package/src/services/evictionService.js +57 -28
  42. package/src/services/retentionService.js +44 -11
  43. package/src/services/startupSync.js +1 -1
  44. package/src/test/advanced-pattern-tests.js +6 -6
  45. package/src/test/bus-mode-tests.js +24 -11
  46. package/src/test/core-tests.js +110 -0
  47. package/src/test/edge-case-tests.js +12 -5
  48. package/src/test/enterprise-tests.js +48 -15
  49. package/src/test/test-new.js +3 -1
  50. package/src/test/test.js +1 -1
  51. package/src/test/utils.js +1 -1
  52. package/src/test/window-buffer-test.js +114 -0
  53. package/src/utils/streaming.js +231 -0
  54. package/src/utils/uuid.js +2 -2
  55. package/src/websocket/wsServer.js +10 -3
  56. package/test-keepalive-v2.sh +22 -0
  57. package/webapp/COLOR_GUIDE.md +118 -0
  58. package/webapp/README.md +143 -0
  59. package/webapp/index.html +14 -0
  60. package/webapp/package-lock.json +3184 -0
  61. package/webapp/package.json +25 -0
  62. package/webapp/postcss.config.js +7 -0
  63. package/webapp/public/assets/queen-logo-blue.svg +210 -0
  64. package/webapp/public/assets/queen-logo-cyan.svg +210 -0
  65. package/webapp/public/assets/queen-logo-indigo.svg +210 -0
  66. package/webapp/public/assets/queen-logo-orange.svg +210 -0
  67. package/webapp/public/assets/queen-logo-pink.svg +210 -0
  68. package/webapp/public/assets/queen-logo-purple.svg +210 -0
  69. package/webapp/public/assets/queen-logo-rose.svg +239 -0
  70. package/webapp/public/assets/queen-logo.svg +263 -0
  71. package/webapp/src/App.vue +19 -0
  72. package/webapp/src/api/analytics.js +10 -0
  73. package/webapp/src/api/client.js +29 -0
  74. package/webapp/src/api/consumers.js +52 -0
  75. package/webapp/src/api/health.js +7 -0
  76. package/webapp/src/api/messages.js +26 -0
  77. package/webapp/src/api/queues.js +14 -0
  78. package/webapp/src/api/resources.js +8 -0
  79. package/webapp/src/assets/styles/main.css +357 -0
  80. package/webapp/src/components/analytics/AnalyticsFilters.vue +87 -0
  81. package/webapp/src/components/analytics/AnalyticsMetrics.vue +57 -0
  82. package/webapp/src/components/analytics/MessageDistributionChart.vue +111 -0
  83. package/webapp/src/components/analytics/MessageFlowChart.vue +173 -0
  84. package/webapp/src/components/analytics/TimeRangeSelector.vue +27 -0
  85. package/webapp/src/components/analytics/TopQueuesChart.vue +132 -0
  86. package/webapp/src/components/common/ConfirmDialog.vue +56 -0
  87. package/webapp/src/components/common/LoadingSpinner.vue +6 -0
  88. package/webapp/src/components/common/MetricCard.vue +43 -0
  89. package/webapp/src/components/common/StatusBadge.vue +45 -0
  90. package/webapp/src/components/dashboard/MessageStatusCard.vue +50 -0
  91. package/webapp/src/components/dashboard/PerformanceCard.vue +38 -0
  92. package/webapp/src/components/dashboard/ThroughputChart.vue +182 -0
  93. package/webapp/src/components/dashboard/TopQueuesTable.vue +53 -0
  94. package/webapp/src/components/layout/AppLayout.vue +110 -0
  95. package/webapp/src/components/layout/AppSidebar.vue +304 -0
  96. package/webapp/src/components/messages/MessageDetailPanel.vue +242 -0
  97. package/webapp/src/components/messages/MessageFilters.vue +101 -0
  98. package/webapp/src/components/queue-detail/PartitionList.vue +79 -0
  99. package/webapp/src/components/queue-detail/PushMessageModal.vue +175 -0
  100. package/webapp/src/components/queue-detail/QueueConfig.vue +63 -0
  101. package/webapp/src/components/queue-detail/QueueDetailHeader.vue +53 -0
  102. package/webapp/src/components/queue-detail/RecentMessages.vue +76 -0
  103. package/webapp/src/components/queues/CreateQueueModal.vue +193 -0
  104. package/webapp/src/components/queues/QueueFilters.vue +90 -0
  105. package/webapp/src/composables/useApi.js +34 -0
  106. package/webapp/src/composables/useTheme.js +36 -0
  107. package/webapp/src/main.js +11 -0
  108. package/webapp/src/router/index.js +42 -0
  109. package/webapp/src/utils/colors.js +96 -0
  110. package/webapp/src/utils/formatters.js +49 -0
  111. package/webapp/src/views/Analytics.vue +377 -0
  112. package/webapp/src/views/ConsumerGroups.vue +433 -0
  113. package/webapp/src/views/Dashboard.vue +418 -0
  114. package/webapp/src/views/Messages.vue +363 -0
  115. package/webapp/src/views/QueueDetail.vue +582 -0
  116. package/webapp/src/views/Queues.vue +496 -0
  117. package/webapp/tailwind.config.js +25 -0
  118. package/webapp/vite.config.js +10 -0
  119. package/dashboard/.vscode/extensions.json +0 -3
  120. package/dashboard/README.md +0 -5
  121. package/dashboard/index.html +0 -14
  122. package/dashboard/package-lock.json +0 -1458
  123. package/dashboard/package.json +0 -25
  124. package/dashboard/public/vite.svg +0 -1
  125. package/dashboard/src/App.vue +0 -29
  126. package/dashboard/src/assets/styles/main.css +0 -908
  127. package/dashboard/src/assets/vue.svg +0 -1
  128. package/dashboard/src/components/cards/MetricCard.vue +0 -298
  129. package/dashboard/src/components/charts/QueueDepthChart.vue +0 -276
  130. package/dashboard/src/components/charts/QueueLagChart.vue +0 -436
  131. package/dashboard/src/components/charts/ThroughputChart.vue +0 -302
  132. package/dashboard/src/components/common/ActivityFeed.vue +0 -251
  133. package/dashboard/src/components/layout/AppHeader.vue +0 -208
  134. package/dashboard/src/components/layout/AppLayout.vue +0 -88
  135. package/dashboard/src/components/layout/AppSidebar.vue +0 -261
  136. package/dashboard/src/main.js +0 -44
  137. package/dashboard/src/router.js +0 -54
  138. package/dashboard/src/services/api.js +0 -187
  139. package/dashboard/src/services/websocket.js +0 -167
  140. package/dashboard/src/utils/constants.js +0 -56
  141. package/dashboard/src/utils/helpers.js +0 -118
  142. package/dashboard/src/views/Analytics.vue +0 -912
  143. package/dashboard/src/views/Dashboard.vue +0 -906
  144. package/dashboard/src/views/Messages.vue +0 -437
  145. package/dashboard/src/views/QueueDetail.vue +0 -501
  146. package/dashboard/src/views/Queues.vue +0 -333
  147. package/dashboard/vite.config.js +0 -30
  148. package/src/client/queenClient.js +0 -513
  149. 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
+