@jjlmoya/utils-developer 1.11.0 → 1.13.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 (100) hide show
  1. package/package.json +7 -4
  2. package/scripts/postinstall.mjs +27 -0
  3. package/src/entries.ts +74 -0
  4. package/src/tool/aspectRatio/aspect-ratio-calculator.css +276 -0
  5. package/src/tool/aspectRatio/component.astro +0 -278
  6. package/src/tool/aspectRatio/entry.ts +30 -0
  7. package/src/tool/aspectRatio/index.ts +2 -32
  8. package/src/tool/calculadoraTiempoDatos/component.astro +0 -524
  9. package/src/tool/calculadoraTiempoDatos/data-time-calculator-web-speed-impact.css +522 -0
  10. package/src/tool/calculadoraTiempoDatos/entry.ts +29 -0
  11. package/src/tool/calculadoraTiempoDatos/index.ts +2 -31
  12. package/src/tool/colorConverter/color-converter-rgb-hex-hsl.css +262 -0
  13. package/src/tool/colorConverter/component.astro +0 -264
  14. package/src/tool/colorConverter/entry.ts +29 -0
  15. package/src/tool/colorConverter/index.ts +2 -31
  16. package/src/tool/conversorExcelCsvHtml/component.astro +0 -360
  17. package/src/tool/conversorExcelCsvHtml/entry.ts +29 -0
  18. package/src/tool/conversorExcelCsvHtml/excel-csv-html-table-converter.css +358 -0
  19. package/src/tool/conversorExcelCsvHtml/index.ts +2 -31
  20. package/src/tool/cronGenerator/component.astro +0 -317
  21. package/src/tool/cronGenerator/cron.css +315 -0
  22. package/src/tool/cronGenerator/entry.ts +30 -0
  23. package/src/tool/cronGenerator/index.ts +2 -32
  24. package/src/tool/cssSpecificityCalculator/component.astro +0 -205
  25. package/src/tool/cssSpecificityCalculator/css-specificity-calculator.css +203 -0
  26. package/src/tool/cssSpecificityCalculator/entry.ts +30 -0
  27. package/src/tool/cssSpecificityCalculator/index.ts +2 -32
  28. package/src/tool/cssToInlineConverter/component.astro +0 -150
  29. package/src/tool/cssToInlineConverter/css-to-inline-converter.css +148 -0
  30. package/src/tool/cssToInlineConverter/entry.ts +30 -0
  31. package/src/tool/cssToInlineConverter/index.ts +2 -32
  32. package/src/tool/duplicateCssRemover/component.astro +0 -197
  33. package/src/tool/duplicateCssRemover/duplicate-css-remover.css +195 -0
  34. package/src/tool/duplicateCssRemover/entry.ts +30 -0
  35. package/src/tool/duplicateCssRemover/index.ts +2 -32
  36. package/src/tool/generadorSecurityTxt/component.astro +0 -231
  37. package/src/tool/generadorSecurityTxt/entry.ts +29 -0
  38. package/src/tool/generadorSecurityTxt/index.ts +2 -31
  39. package/src/tool/generadorSecurityTxt/security-txt-generator-rfc-9116.css +229 -0
  40. package/src/tool/hashGenerator/component.astro +0 -229
  41. package/src/tool/hashGenerator/entry.ts +29 -0
  42. package/src/tool/hashGenerator/hash-generator.css +227 -0
  43. package/src/tool/hashGenerator/index.ts +2 -31
  44. package/src/tool/inspectorCertificadosSsl/component.astro +0 -261
  45. package/src/tool/inspectorCertificadosSsl/entry.ts +45 -0
  46. package/src/tool/inspectorCertificadosSsl/index.ts +2 -47
  47. package/src/tool/inspectorCertificadosSsl/ssl-tls-certificate-inspector.css +259 -0
  48. package/src/tool/jsonFormatter/component.astro +0 -346
  49. package/src/tool/jsonFormatter/entry.ts +30 -0
  50. package/src/tool/jsonFormatter/index.ts +2 -32
  51. package/src/tool/jsonFormatter/json-formatter.css +344 -0
  52. package/src/tool/keycode/component.astro +0 -298
  53. package/src/tool/keycode/entry.ts +30 -0
  54. package/src/tool/keycode/index.ts +2 -32
  55. package/src/tool/keycode/keycode.css +296 -0
  56. package/src/tool/llmCostCalculator/component.astro +0 -253
  57. package/src/tool/llmCostCalculator/entry.ts +46 -0
  58. package/src/tool/llmCostCalculator/index.ts +2 -48
  59. package/src/tool/llmCostCalculator/llm-cost-calculator.css +251 -0
  60. package/src/tool/mobileMockupGenerator/component.astro +0 -906
  61. package/src/tool/mobileMockupGenerator/entry.ts +45 -0
  62. package/src/tool/mobileMockupGenerator/index.ts +2 -47
  63. package/src/tool/mobileMockupGenerator/mobile-mockup-generator.css +904 -0
  64. package/src/tool/musicalTypography/component.astro +0 -291
  65. package/src/tool/musicalTypography/entry.ts +29 -0
  66. package/src/tool/musicalTypography/index.ts +2 -31
  67. package/src/tool/musicalTypography/musical-typography.css +289 -0
  68. package/src/tool/placeholderGenerator/component.astro +0 -255
  69. package/src/tool/placeholderGenerator/entry.ts +46 -0
  70. package/src/tool/placeholderGenerator/index.ts +2 -48
  71. package/src/tool/placeholderGenerator/placeholder-image-generator.css +253 -0
  72. package/src/tool/promptLibrary/component.astro +0 -689
  73. package/src/tool/promptLibrary/entry.ts +45 -0
  74. package/src/tool/promptLibrary/index.ts +2 -47
  75. package/src/tool/promptLibrary/prompt-library.css +687 -0
  76. package/src/tool/readabilityCalculator/component.astro +0 -322
  77. package/src/tool/readabilityCalculator/entry.ts +45 -0
  78. package/src/tool/readabilityCalculator/index.ts +2 -47
  79. package/src/tool/readabilityCalculator/visual-readability-calculator-wcag-apca.css +320 -0
  80. package/src/tool/svgSanitizer/component.astro +0 -289
  81. package/src/tool/svgSanitizer/entry.ts +45 -0
  82. package/src/tool/svgSanitizer/index.ts +2 -47
  83. package/src/tool/svgSanitizer/svg-sanitizer.css +287 -0
  84. package/src/tool/svgToCss/component.astro +0 -196
  85. package/src/tool/svgToCss/entry.ts +30 -0
  86. package/src/tool/svgToCss/index.ts +2 -32
  87. package/src/tool/svgToCss/svg-to-css-converter.css +194 -0
  88. package/src/tool/urlCleaner/component.astro +0 -282
  89. package/src/tool/urlCleaner/entry.ts +45 -0
  90. package/src/tool/urlCleaner/index.ts +2 -47
  91. package/src/tool/urlCleaner/url-tracking-cleaner.css +280 -0
  92. package/src/tool/urlEncoderDecoder/component.astro +0 -168
  93. package/src/tool/urlEncoderDecoder/entry.ts +30 -0
  94. package/src/tool/urlEncoderDecoder/index.ts +2 -32
  95. package/src/tool/urlEncoderDecoder/url-encoder-decoder.css +166 -0
  96. package/src/tool/utmGenerator/component.astro +0 -156
  97. package/src/tool/utmGenerator/entry.ts +29 -0
  98. package/src/tool/utmGenerator/index.ts +2 -31
  99. package/src/tool/utmGenerator/utm-generator.css +154 -0
  100. package/src/tools.ts +1 -1
@@ -117,261 +117,6 @@ const t = (ui ?? {}) as PlaceholderGeneratorUI;
117
117
  </div>
118
118
  </section>
119
119
 
120
- <style>
121
- .pg-root {
122
- --pg-primary: #eab308;
123
- --pg-primary-dark: #ca8a04;
124
- --pg-card-bg: #fff;
125
- --pg-bg: #f8fafc;
126
- --pg-text: #1e293b;
127
- --pg-text-muted: #64748b;
128
- --pg-border: #e2e8f0;
129
- --pg-input-bg: #f1f5f9;
130
- --pg-input-text: #1e293b;
131
- --pg-btn-bg: #111827;
132
- --pg-btn-hover: #000;
133
-
134
- max-width: 1100px;
135
- margin: 2rem auto;
136
- color: var(--pg-text);
137
- }
138
-
139
- :global(.theme-dark) .pg-root {
140
- --pg-card-bg: #1e293b;
141
- --pg-bg: #0f172a;
142
- --pg-text: #f1f5f9;
143
- --pg-text-muted: #94a3b8;
144
- --pg-border: #334155;
145
- --pg-input-bg: #0f172a;
146
- --pg-input-text: #e2e8f0;
147
- --pg-btn-bg: #f1f5f9;
148
- --pg-btn-hover: #fff;
149
- }
150
-
151
- .pg-card {
152
- background: var(--pg-card-bg);
153
- border: 1px solid var(--pg-border);
154
- border-radius: 1.25rem;
155
- box-shadow: 0 4px 24px rgba(0, 0, 0, 0.06);
156
- overflow: hidden;
157
- }
158
-
159
- .pg-body {
160
- display: grid;
161
- grid-template-columns: 300px 1fr;
162
- min-height: 560px;
163
- }
164
-
165
- @media (max-width: 860px) {
166
- .pg-body {
167
- grid-template-columns: 1fr;
168
- }
169
-
170
- .pg-controls {
171
- border-right: none;
172
- border-bottom: 1px solid var(--pg-border);
173
- }
174
- }
175
-
176
- .pg-controls {
177
- border-right: 1px solid var(--pg-border);
178
- padding: 1.25rem;
179
- display: flex;
180
- flex-direction: column;
181
- gap: 1rem;
182
- overflow-y: auto;
183
- background: var(--pg-bg);
184
- }
185
-
186
- .pg-control-group {
187
- display: flex;
188
- flex-direction: column;
189
- gap: 0.375rem;
190
- }
191
-
192
- .pg-label {
193
- font-size: 0.8rem;
194
- font-weight: 600;
195
- color: var(--pg-text-muted);
196
- text-transform: uppercase;
197
- letter-spacing: 0.05em;
198
- }
199
-
200
- .pg-input,
201
- .pg-select {
202
- width: 100%;
203
- padding: 0.6rem 0.875rem;
204
- border-radius: 0.625rem;
205
- border: 1px solid var(--pg-border);
206
- background: var(--pg-card-bg);
207
- font-size: 0.875rem;
208
- color: var(--pg-input-text);
209
- outline: none;
210
- transition: border-color 0.2s;
211
- }
212
-
213
- .pg-input:focus,
214
- .pg-select:focus {
215
- border-color: var(--pg-primary);
216
- box-shadow: 0 0 0 3px rgba(234, 179, 8, 0.15);
217
- }
218
-
219
- .pg-dims-group,
220
- .pg-colors-group,
221
- .pg-typo-group {
222
- display: grid;
223
- grid-template-columns: 1fr 1fr;
224
- gap: 0.75rem;
225
- }
226
-
227
- .pg-presets-row {
228
- display: flex;
229
- flex-wrap: wrap;
230
- gap: 0.375rem;
231
- }
232
-
233
- .pg-preset-pill {
234
- background: var(--pg-input-bg);
235
- border: 1px solid var(--pg-border);
236
- color: var(--pg-text-muted);
237
- padding: 0.3rem 0.6rem;
238
- border-radius: 50px;
239
- font-size: 0.75rem;
240
- font-weight: 600;
241
- cursor: pointer;
242
- transition: all 0.2s;
243
- }
244
-
245
- .pg-preset-pill:hover,
246
- :global(.pg-preset-pill.active) {
247
- background: var(--pg-primary);
248
- border-color: var(--pg-primary-dark);
249
- color: #fff;
250
- }
251
-
252
- .pg-radio-pill {
253
- position: relative;
254
- cursor: pointer;
255
- }
256
-
257
- .pg-radio-pill input {
258
- position: absolute;
259
- opacity: 0;
260
- width: 0;
261
- height: 0;
262
- }
263
-
264
- .pg-radio-pill span {
265
- display: inline-block;
266
- background: var(--pg-input-bg);
267
- border: 1px solid var(--pg-border);
268
- color: var(--pg-text-muted);
269
- padding: 0.3rem 0.6rem;
270
- border-radius: 50px;
271
- font-size: 0.75rem;
272
- font-weight: 600;
273
- transition: all 0.2s;
274
- }
275
-
276
- .pg-radio-pill input:checked + span {
277
- background: var(--pg-primary);
278
- border-color: var(--pg-primary-dark);
279
- color: #fff;
280
- }
281
-
282
- .pg-color-wrapper {
283
- display: flex;
284
- align-items: center;
285
- border: 1px solid var(--pg-border);
286
- border-radius: 0.625rem;
287
- overflow: hidden;
288
- background: var(--pg-card-bg);
289
- }
290
-
291
- .pg-color-wrapper input[type="color"] {
292
- -webkit-appearance: none;
293
- appearance: none;
294
- border: none;
295
- width: 38px;
296
- height: 38px;
297
- padding: 0;
298
- margin: 0;
299
- cursor: pointer;
300
- background: transparent;
301
- flex-shrink: 0;
302
- }
303
-
304
- .pg-color-wrapper input[type="color"]::-webkit-color-swatch-wrapper {
305
- padding: 0;
306
- }
307
-
308
- .pg-color-wrapper input[type="color"]::-webkit-color-swatch {
309
- border: none;
310
- border-right: 1px solid var(--pg-border);
311
- }
312
-
313
- .pg-color-text {
314
- border: none;
315
- padding: 0.5rem 0.625rem;
316
- text-transform: uppercase;
317
- font-weight: 600;
318
- font-size: 0.8rem;
319
- color: var(--pg-input-text);
320
- background: transparent;
321
- flex: 1;
322
- outline: none;
323
- width: 0;
324
- }
325
-
326
- .pg-download-btn {
327
- background: var(--pg-btn-bg);
328
- color: var(--pg-card-bg);
329
- padding: 0.75rem 1.25rem;
330
- border-radius: 0.75rem;
331
- border: none;
332
- font-size: 0.9rem;
333
- font-weight: 700;
334
- cursor: pointer;
335
- display: flex;
336
- align-items: center;
337
- justify-content: center;
338
- gap: 0.5rem;
339
- transition:
340
- background 0.2s,
341
- transform 0.1s;
342
- margin-top: 0.25rem;
343
- }
344
-
345
- .pg-download-btn:hover {
346
- background: var(--pg-btn-hover);
347
- }
348
-
349
- .pg-download-btn:active {
350
- transform: scale(0.98);
351
- }
352
-
353
- .pg-preview {
354
- display: flex;
355
- align-items: center;
356
- justify-content: center;
357
- padding: 2rem;
358
- background: var(--pg-bg);
359
- background-image: radial-gradient(var(--pg-border) 1px, transparent 1px);
360
- background-size: 24px 24px;
361
- }
362
-
363
- #p-image-preview {
364
- max-width: 100%;
365
- height: auto;
366
- object-fit: contain;
367
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);
368
- border-radius: 8px;
369
- }
370
-
371
- canvas {
372
- display: none;
373
- }
374
- </style>
375
120
 
376
121
  <script>
377
122
  const widthInput = document.getElementById('p-width') as HTMLInputElement;
@@ -0,0 +1,46 @@
1
+ import type { DeveloperToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ import type { PlaceholderGeneratorUI } from './ui';
4
+
5
+ export type PlaceholderGeneratorLocaleContent = ToolLocaleContent<PlaceholderGeneratorUI>;
6
+
7
+ import { content as es } from './i18n/es';
8
+ import { content as en } from './i18n/en';
9
+ import { content as fr } from './i18n/fr';
10
+ import { content as de } from './i18n/de';
11
+ import { content as id } from './i18n/id';
12
+ import { content as it } from './i18n/it';
13
+ import { content as ja } from './i18n/ja';
14
+ import { content as ko } from './i18n/ko';
15
+ import { content as nl } from './i18n/nl';
16
+ import { content as pl } from './i18n/pl';
17
+ import { content as pt } from './i18n/pt';
18
+ import { content as ru } from './i18n/ru';
19
+ import { content as sv } from './i18n/sv';
20
+ import { content as tr } from './i18n/tr';
21
+ import { content as zh } from './i18n/zh';
22
+
23
+ export const placeholderGenerator: DeveloperToolEntry<PlaceholderGeneratorUI> = {
24
+ id: 'placeholder-generator',
25
+ icons: {
26
+ bg: 'mdi:image-outline',
27
+ fg: 'mdi:image-size-select-actual',
28
+ },
29
+ i18n: {
30
+ es: async () => es,
31
+ en: async () => en,
32
+ fr: async () => fr,
33
+ de: async () => de,
34
+ id: async () => id,
35
+ it: async () => it,
36
+ ja: async () => ja,
37
+ ko: async () => ko,
38
+ nl: async () => nl,
39
+ pl: async () => pl,
40
+ pt: async () => pt,
41
+ ru: async () => ru,
42
+ sv: async () => sv,
43
+ tr: async () => tr,
44
+ zh: async () => zh,
45
+ },
46
+ };
@@ -1,51 +1,5 @@
1
- import type { DeveloperToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
-
3
- import type { PlaceholderGeneratorUI } from './ui';
4
-
5
- export type PlaceholderGeneratorLocaleContent = ToolLocaleContent<PlaceholderGeneratorUI>;
6
-
7
- import { content as es } from './i18n/es';
8
- import { content as en } from './i18n/en';
9
- import { content as fr } from './i18n/fr';
10
- import { content as de } from './i18n/de';
11
- import { content as id } from './i18n/id';
12
- import { content as it } from './i18n/it';
13
- import { content as ja } from './i18n/ja';
14
- import { content as ko } from './i18n/ko';
15
- import { content as nl } from './i18n/nl';
16
- import { content as pl } from './i18n/pl';
17
- import { content as pt } from './i18n/pt';
18
- import { content as ru } from './i18n/ru';
19
- import { content as sv } from './i18n/sv';
20
- import { content as tr } from './i18n/tr';
21
- import { content as zh } from './i18n/zh';
22
-
23
- export const placeholderGenerator: DeveloperToolEntry<PlaceholderGeneratorUI> = {
24
- id: 'placeholder-generator',
25
- icons: {
26
- bg: 'mdi:image-outline',
27
- fg: 'mdi:image-size-select-actual',
28
- },
29
- i18n: {
30
- es: async () => es,
31
- en: async () => en,
32
- fr: async () => fr,
33
- de: async () => de,
34
- id: async () => id,
35
- it: async () => it,
36
- ja: async () => ja,
37
- ko: async () => ko,
38
- nl: async () => nl,
39
- pl: async () => pl,
40
- pt: async () => pt,
41
- ru: async () => ru,
42
- sv: async () => sv,
43
- tr: async () => tr,
44
- zh: async () => zh,
45
- },
46
- };
47
-
48
-
1
+ import { placeholderGenerator } from './entry';
2
+ export * from './entry';
49
3
  export const PLACEHOLDER_GENERATOR_TOOL: ToolDefinition = {
50
4
  entry: placeholderGenerator,
51
5
  Component: () => import('./component.astro'),
@@ -0,0 +1,253 @@
1
+ .pg-root {
2
+ --pg-primary: #eab308;
3
+ --pg-primary-dark: #ca8a04;
4
+ --pg-card-bg: #fff;
5
+ --pg-bg: #f8fafc;
6
+ --pg-text: #1e293b;
7
+ --pg-text-muted: #64748b;
8
+ --pg-border: #e2e8f0;
9
+ --pg-input-bg: #f1f5f9;
10
+ --pg-input-text: #1e293b;
11
+ --pg-btn-bg: #111827;
12
+ --pg-btn-hover: #000;
13
+
14
+ max-width: 1100px;
15
+ margin: 2rem auto;
16
+ color: var(--pg-text);
17
+ }
18
+
19
+ :global(.theme-dark) .pg-root {
20
+ --pg-card-bg: #1e293b;
21
+ --pg-bg: #0f172a;
22
+ --pg-text: #f1f5f9;
23
+ --pg-text-muted: #94a3b8;
24
+ --pg-border: #334155;
25
+ --pg-input-bg: #0f172a;
26
+ --pg-input-text: #e2e8f0;
27
+ --pg-btn-bg: #f1f5f9;
28
+ --pg-btn-hover: #fff;
29
+ }
30
+
31
+ .pg-card {
32
+ background: var(--pg-card-bg);
33
+ border: 1px solid var(--pg-border);
34
+ border-radius: 1.25rem;
35
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.06);
36
+ overflow: hidden;
37
+ }
38
+
39
+ .pg-body {
40
+ display: grid;
41
+ grid-template-columns: 300px 1fr;
42
+ min-height: 560px;
43
+ }
44
+
45
+ @media (max-width: 860px) {
46
+ .pg-body {
47
+ grid-template-columns: 1fr;
48
+ }
49
+
50
+ .pg-controls {
51
+ border-right: none;
52
+ border-bottom: 1px solid var(--pg-border);
53
+ }
54
+ }
55
+
56
+ .pg-controls {
57
+ border-right: 1px solid var(--pg-border);
58
+ padding: 1.25rem;
59
+ display: flex;
60
+ flex-direction: column;
61
+ gap: 1rem;
62
+ overflow-y: auto;
63
+ background: var(--pg-bg);
64
+ }
65
+
66
+ .pg-control-group {
67
+ display: flex;
68
+ flex-direction: column;
69
+ gap: 0.375rem;
70
+ }
71
+
72
+ .pg-label {
73
+ font-size: 0.8rem;
74
+ font-weight: 600;
75
+ color: var(--pg-text-muted);
76
+ text-transform: uppercase;
77
+ letter-spacing: 0.05em;
78
+ }
79
+
80
+ .pg-input,
81
+ .pg-select {
82
+ width: 100%;
83
+ padding: 0.6rem 0.875rem;
84
+ border-radius: 0.625rem;
85
+ border: 1px solid var(--pg-border);
86
+ background: var(--pg-card-bg);
87
+ font-size: 0.875rem;
88
+ color: var(--pg-input-text);
89
+ outline: none;
90
+ transition: border-color 0.2s;
91
+ }
92
+
93
+ .pg-input:focus,
94
+ .pg-select:focus {
95
+ border-color: var(--pg-primary);
96
+ box-shadow: 0 0 0 3px rgba(234, 179, 8, 0.15);
97
+ }
98
+
99
+ .pg-dims-group,
100
+ .pg-colors-group,
101
+ .pg-typo-group {
102
+ display: grid;
103
+ grid-template-columns: 1fr 1fr;
104
+ gap: 0.75rem;
105
+ }
106
+
107
+ .pg-presets-row {
108
+ display: flex;
109
+ flex-wrap: wrap;
110
+ gap: 0.375rem;
111
+ }
112
+
113
+ .pg-preset-pill {
114
+ background: var(--pg-input-bg);
115
+ border: 1px solid var(--pg-border);
116
+ color: var(--pg-text-muted);
117
+ padding: 0.3rem 0.6rem;
118
+ border-radius: 50px;
119
+ font-size: 0.75rem;
120
+ font-weight: 600;
121
+ cursor: pointer;
122
+ transition: all 0.2s;
123
+ }
124
+
125
+ .pg-preset-pill:hover,
126
+ :global(.pg-preset-pill.active) {
127
+ background: var(--pg-primary);
128
+ border-color: var(--pg-primary-dark);
129
+ color: #fff;
130
+ }
131
+
132
+ .pg-radio-pill {
133
+ position: relative;
134
+ cursor: pointer;
135
+ }
136
+
137
+ .pg-radio-pill input {
138
+ position: absolute;
139
+ opacity: 0;
140
+ width: 0;
141
+ height: 0;
142
+ }
143
+
144
+ .pg-radio-pill span {
145
+ display: inline-block;
146
+ background: var(--pg-input-bg);
147
+ border: 1px solid var(--pg-border);
148
+ color: var(--pg-text-muted);
149
+ padding: 0.3rem 0.6rem;
150
+ border-radius: 50px;
151
+ font-size: 0.75rem;
152
+ font-weight: 600;
153
+ transition: all 0.2s;
154
+ }
155
+
156
+ .pg-radio-pill input:checked + span {
157
+ background: var(--pg-primary);
158
+ border-color: var(--pg-primary-dark);
159
+ color: #fff;
160
+ }
161
+
162
+ .pg-color-wrapper {
163
+ display: flex;
164
+ align-items: center;
165
+ border: 1px solid var(--pg-border);
166
+ border-radius: 0.625rem;
167
+ overflow: hidden;
168
+ background: var(--pg-card-bg);
169
+ }
170
+
171
+ .pg-color-wrapper input[type="color"] {
172
+ -webkit-appearance: none;
173
+ appearance: none;
174
+ border: none;
175
+ width: 38px;
176
+ height: 38px;
177
+ padding: 0;
178
+ margin: 0;
179
+ cursor: pointer;
180
+ background: transparent;
181
+ flex-shrink: 0;
182
+ }
183
+
184
+ .pg-color-wrapper input[type="color"]::-webkit-color-swatch-wrapper {
185
+ padding: 0;
186
+ }
187
+
188
+ .pg-color-wrapper input[type="color"]::-webkit-color-swatch {
189
+ border: none;
190
+ border-right: 1px solid var(--pg-border);
191
+ }
192
+
193
+ .pg-color-text {
194
+ border: none;
195
+ padding: 0.5rem 0.625rem;
196
+ text-transform: uppercase;
197
+ font-weight: 600;
198
+ font-size: 0.8rem;
199
+ color: var(--pg-input-text);
200
+ background: transparent;
201
+ flex: 1;
202
+ outline: none;
203
+ width: 0;
204
+ }
205
+
206
+ .pg-download-btn {
207
+ background: var(--pg-btn-bg);
208
+ color: var(--pg-card-bg);
209
+ padding: 0.75rem 1.25rem;
210
+ border-radius: 0.75rem;
211
+ border: none;
212
+ font-size: 0.9rem;
213
+ font-weight: 700;
214
+ cursor: pointer;
215
+ display: flex;
216
+ align-items: center;
217
+ justify-content: center;
218
+ gap: 0.5rem;
219
+ transition:
220
+ background 0.2s,
221
+ transform 0.1s;
222
+ margin-top: 0.25rem;
223
+ }
224
+
225
+ .pg-download-btn:hover {
226
+ background: var(--pg-btn-hover);
227
+ }
228
+
229
+ .pg-download-btn:active {
230
+ transform: scale(0.98);
231
+ }
232
+
233
+ .pg-preview {
234
+ display: flex;
235
+ align-items: center;
236
+ justify-content: center;
237
+ padding: 2rem;
238
+ background: var(--pg-bg);
239
+ background-image: radial-gradient(var(--pg-border) 1px, transparent 1px);
240
+ background-size: 24px 24px;
241
+ }
242
+
243
+ #p-image-preview {
244
+ max-width: 100%;
245
+ height: auto;
246
+ object-fit: contain;
247
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);
248
+ border-radius: 8px;
249
+ }
250
+
251
+ canvas {
252
+ display: none;
253
+ }