@jjlmoya/utils-diy 1.9.0 → 1.11.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 (28) hide show
  1. package/package.json +5 -3
  2. package/scripts/postinstall.mjs +27 -0
  3. package/src/tool/balusterCalculator/baluster-calculator.css +320 -0
  4. package/src/tool/balusterCalculator/component.astro +0 -322
  5. package/src/tool/clayCalculator/clay-shrinkage-calculator.css +530 -0
  6. package/src/tool/clayCalculator/component.astro +0 -532
  7. package/src/tool/concreteCalculator/component.astro +0 -705
  8. package/src/tool/concreteCalculator/concrete-mortar-calculator.css +703 -0
  9. package/src/tool/cutOptimizer/component.astro +0 -477
  10. package/src/tool/cutOptimizer/cut-optimizer.css +475 -0
  11. package/src/tool/drillCalculator/component.astro +0 -815
  12. package/src/tool/drillCalculator/drill-rpm-calculator.css +813 -0
  13. package/src/tool/drillSharpener/component.astro +0 -393
  14. package/src/tool/drillSharpener/drill-sharpening-master.css +391 -0
  15. package/src/tool/epoxyCalculator/component.astro +0 -571
  16. package/src/tool/epoxyCalculator/epoxy-resin-calculator.css +569 -0
  17. package/src/tool/furnitureFit/component.astro +0 -345
  18. package/src/tool/furnitureFit/furniture-fit-calculator.css +343 -0
  19. package/src/tool/mortarCalculator/component.astro +0 -620
  20. package/src/tool/mortarCalculator/lime-mortar-calculator.css +618 -0
  21. package/src/tool/passepartoutCalculator/component.astro +0 -518
  22. package/src/tool/passepartoutCalculator/passepartout-calculator.css +516 -0
  23. package/src/tool/stairCalculator/component.astro +0 -480
  24. package/src/tool/stairCalculator/stair-calculator.css +478 -0
  25. package/src/tool/thermalExpansionCalculator/component.astro +0 -490
  26. package/src/tool/thermalExpansionCalculator/thermal-expansion-calculator.css +488 -0
  27. package/src/tool/voltageDropCalculator/component.astro +0 -729
  28. package/src/tool/voltageDropCalculator/voltage-drop-calculator.css +727 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-diy",
3
- "version": "1.9.0",
3
+ "version": "1.11.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -10,7 +10,8 @@
10
10
  "./entries": "./src/entries.ts"
11
11
  },
12
12
  "files": [
13
- "src"
13
+ "src",
14
+ "scripts"
14
15
  ],
15
16
  "publishConfig": {
16
17
  "access": "public"
@@ -29,7 +30,8 @@
29
30
  "postversion": "git push && git push --tags",
30
31
  "patch": "npm version patch",
31
32
  "minor": "npm version minor",
32
- "major": "npm version major"
33
+ "major": "npm version major",
34
+ "postinstall": "node scripts/postinstall.mjs"
33
35
  },
34
36
  "lint-staged": {
35
37
  "*.{ts,tsx,astro}": [
@@ -0,0 +1,27 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, readdirSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+
5
+ const libDir = dirname(fileURLToPath(import.meta.url));
6
+ const toolsDir = join(libDir, '../src/tool');
7
+
8
+ const inNodeModules = libDir.includes('node_modules');
9
+ if (!inNodeModules) process.exit(0);
10
+
11
+ const projectRoot = join(libDir, '../../../..');
12
+ const categoryKey = JSON.parse(readFileSync(join(libDir, '../package.json'), 'utf8')).name.replace('@jjlmoya/utils-', '');
13
+ const destDir = join(projectRoot, `public/styles/lib/${categoryKey}`);
14
+
15
+ mkdirSync(destDir, { recursive: true });
16
+
17
+ const tools = readdirSync(toolsDir, { withFileTypes: true }).filter(d => d.isDirectory());
18
+ for (const tool of tools) {
19
+ const toolDir = join(toolsDir, tool.name);
20
+ let files;
21
+ try { files = readdirSync(toolDir).filter(f => f.endsWith('.css')); }
22
+ catch { continue; }
23
+ for (const file of files) {
24
+ writeFileSync(join(destDir, file), readFileSync(join(toolDir, file)));
25
+ console.log(`[@jjlmoya/utils-${categoryKey}] copied ${file}`);
26
+ }
27
+ }
@@ -0,0 +1,320 @@
1
+ .bc-root {
2
+ width: 100%;
3
+ max-width: 56rem;
4
+ margin: 0 auto;
5
+ padding: 1rem;
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: 2rem;
9
+ }
10
+
11
+ .bc-input-panel {
12
+ background: #fff;
13
+ border-radius: 1.5rem;
14
+ padding: 1.5rem;
15
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.08);
16
+ border: 1px solid #f1f5f9;
17
+ }
18
+
19
+ .bc-panel-header {
20
+ display: flex;
21
+ align-items: center;
22
+ gap: 0.75rem;
23
+ margin-bottom: 1.5rem;
24
+ }
25
+
26
+ .bc-panel-icon {
27
+ padding: 0.75rem;
28
+ background: #dbeafe;
29
+ border-radius: 0.75rem;
30
+ color: #2563eb;
31
+ font-size: 1.5rem;
32
+ display: flex;
33
+ flex-shrink: 0;
34
+ }
35
+
36
+ .bc-icon {
37
+ width: 1.5rem;
38
+ height: 1.5rem;
39
+ }
40
+
41
+ .bc-panel-title {
42
+ font-size: 1.25rem;
43
+ font-weight: 700;
44
+ color: #1e293b;
45
+ margin: 0;
46
+ }
47
+
48
+ .bc-panel-desc {
49
+ font-size: 0.875rem;
50
+ color: #94a3b8;
51
+ margin: 0;
52
+ }
53
+
54
+ .bc-inputs-grid {
55
+ display: grid;
56
+ grid-template-columns: 1fr;
57
+ gap: 1.5rem;
58
+ }
59
+
60
+ @media (min-width: 768px) {
61
+ .bc-inputs-grid {
62
+ grid-template-columns: 1fr 1fr 1fr;
63
+ }
64
+ }
65
+
66
+ .bc-input-group {
67
+ display: flex;
68
+ flex-direction: column;
69
+ gap: 0.5rem;
70
+ }
71
+
72
+ .bc-label {
73
+ display: block;
74
+ font-size: 0.875rem;
75
+ font-weight: 500;
76
+ color: #374151;
77
+ }
78
+
79
+ .bc-input-wrapper {
80
+ position: relative;
81
+ }
82
+
83
+ .bc-input {
84
+ display: block;
85
+ width: 100%;
86
+ padding: 0.75rem 2.5rem 0.75rem 1rem;
87
+ border-radius: 0.75rem;
88
+ background: #f8fafc;
89
+ border: 1px solid transparent;
90
+ color: #1e293b;
91
+ font-size: 1rem;
92
+ outline: none;
93
+ transition: border-color 0.2s, box-shadow 0.2s;
94
+ box-sizing: border-box;
95
+ }
96
+
97
+ .bc-input:focus {
98
+ border-color: #3b82f6;
99
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.15);
100
+ }
101
+
102
+ .bc-unit-label {
103
+ position: absolute;
104
+ right: 1rem;
105
+ top: 50%;
106
+ transform: translateY(-50%);
107
+ color: #94a3b8;
108
+ font-size: 0.875rem;
109
+ pointer-events: none;
110
+ }
111
+
112
+ .bc-unit-switcher {
113
+ display: flex;
114
+ justify-content: flex-end;
115
+ margin-top: 1.5rem;
116
+ }
117
+
118
+ .bc-unit-toggle {
119
+ display: inline-flex;
120
+ background: #f1f5f9;
121
+ padding: 0.25rem;
122
+ border-radius: 0.5rem;
123
+ gap: 0.25rem;
124
+ }
125
+
126
+ .bc-unit-btn {
127
+ padding: 0.375rem 1rem;
128
+ border-radius: 0.375rem;
129
+ border: none;
130
+ font-size: 0.875rem;
131
+ font-weight: 500;
132
+ cursor: pointer;
133
+ transition: all 0.2s;
134
+ color: #64748b;
135
+ background: transparent;
136
+ }
137
+
138
+ [data-bc-unit][data-bc-active='true'] {
139
+ background: #fff;
140
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
141
+ color: #1e293b;
142
+ }
143
+
144
+ .bc-blueprint {
145
+ background: #1e3a8a;
146
+ border-radius: 1.5rem;
147
+ padding: 0.25rem;
148
+ box-shadow: 0 12px 40px rgba(30, 58, 138, 0.3);
149
+ overflow: hidden;
150
+ border: 4px solid rgba(255, 255, 255, 0.1);
151
+ position: relative;
152
+ }
153
+
154
+ .bc-blueprint-grid {
155
+ position: absolute;
156
+ inset: 0;
157
+ opacity: 0.1;
158
+ background-image: linear-gradient(#fff 1px, transparent 1px), linear-gradient(90deg, #fff 1px, transparent 1px);
159
+ background-size: 20px 20px;
160
+ pointer-events: none;
161
+ }
162
+
163
+ .bc-blueprint-inner {
164
+ position: relative;
165
+ padding: 1.5rem;
166
+ color: #bfdbfe;
167
+ }
168
+
169
+ @media (min-width: 768px) {
170
+ .bc-blueprint-inner {
171
+ padding: 2.5rem;
172
+ }
173
+ }
174
+
175
+ .bc-bp-header {
176
+ display: flex;
177
+ justify-content: space-between;
178
+ align-items: flex-start;
179
+ margin-bottom: 2rem;
180
+ padding-bottom: 1rem;
181
+ border-bottom: 1px solid rgba(255, 255, 255, 0.2);
182
+ }
183
+
184
+ .bc-bp-plan-title {
185
+ font-size: 1.25rem;
186
+ letter-spacing: 0.1em;
187
+ text-transform: uppercase;
188
+ color: #fff;
189
+ margin: 0 0 0.25rem;
190
+ }
191
+
192
+ .bc-bp-ref {
193
+ font-size: 0.75rem;
194
+ opacity: 0.6;
195
+ margin: 0;
196
+ }
197
+
198
+ .bc-bp-count-block {
199
+ text-align: right;
200
+ }
201
+
202
+ .bc-bp-count {
203
+ font-size: 1.875rem;
204
+ font-weight: 700;
205
+ color: #fff;
206
+ margin: 0 0 0.25rem;
207
+ line-height: 1;
208
+ }
209
+
210
+ .bc-bp-count-label {
211
+ font-size: 0.625rem;
212
+ opacity: 0.6;
213
+ text-transform: uppercase;
214
+ letter-spacing: 0.1em;
215
+ margin: 0;
216
+ }
217
+
218
+ .bc-bp-stats {
219
+ display: grid;
220
+ grid-template-columns: 1fr 1fr;
221
+ gap: 1rem;
222
+ margin-bottom: 2rem;
223
+ }
224
+
225
+ @media (min-width: 768px) {
226
+ .bc-bp-stats {
227
+ grid-template-columns: 1fr 1fr 1fr 1fr;
228
+ }
229
+ }
230
+
231
+ .bc-stat-card {
232
+ background: rgba(255, 255, 255, 0.05);
233
+ backdrop-filter: blur(4px);
234
+ padding: 0.75rem;
235
+ border-radius: 0.375rem;
236
+ border: 1px solid rgba(255, 255, 255, 0.1);
237
+ }
238
+
239
+ .bc-stat-label {
240
+ display: block;
241
+ font-size: 0.625rem;
242
+ opacity: 0.5;
243
+ text-transform: uppercase;
244
+ letter-spacing: 0.05em;
245
+ margin-bottom: 0.25rem;
246
+ }
247
+
248
+ .bc-stat-value {
249
+ font-size: 1.125rem;
250
+ font-weight: 700;
251
+ color: #fff;
252
+ }
253
+
254
+ .bc-visualizer {
255
+ width: 100%;
256
+ height: 12rem;
257
+ border: 1px dashed rgba(255, 255, 255, 0.3);
258
+ border-radius: 0.375rem;
259
+ background: rgba(23, 37, 84, 0.5);
260
+ overflow: hidden;
261
+ position: relative;
262
+ }
263
+
264
+ @media (min-width: 768px) {
265
+ .bc-visualizer {
266
+ height: 16rem;
267
+ }
268
+ }
269
+
270
+ .bc-svg {
271
+ width: 100%;
272
+ height: 100%;
273
+ }
274
+
275
+ .bc-disclaimer {
276
+ text-align: center;
277
+ font-size: 0.75rem;
278
+ opacity: 0.4;
279
+ margin-top: 1rem;
280
+ margin-bottom: 0;
281
+ }
282
+
283
+ .theme-dark .bc-input-panel {
284
+ background: #18181b;
285
+ border-color: rgba(51, 65, 85, 0.4);
286
+ }
287
+
288
+ .theme-dark .bc-panel-icon {
289
+ background: rgba(30, 58, 138, 0.3);
290
+ }
291
+
292
+ .theme-dark .bc-panel-title {
293
+ color: #f1f5f9;
294
+ }
295
+
296
+ .theme-dark .bc-label {
297
+ color: #94a3b8;
298
+ }
299
+
300
+ .theme-dark .bc-input {
301
+ background: #27272a;
302
+ color: #f1f5f9;
303
+ }
304
+
305
+ .theme-dark .bc-input:focus {
306
+ border-color: #3b82f6;
307
+ }
308
+
309
+ .theme-dark .bc-unit-toggle {
310
+ background: #27272a;
311
+ }
312
+
313
+ .theme-dark [data-bc-unit][data-bc-active='true'] {
314
+ background: #3f3f46;
315
+ color: #f1f5f9;
316
+ }
317
+
318
+ .theme-dark .bc-blueprint {
319
+ background: #0f172a;
320
+ }
@@ -281,325 +281,3 @@ const t = (ui ?? {}) as BalusterCalculatorUI;
281
281
  init();
282
282
  </script>
283
283
 
284
- <style>
285
- .bc-root {
286
- width: 100%;
287
- max-width: 56rem;
288
- margin: 0 auto;
289
- padding: 1rem;
290
- display: flex;
291
- flex-direction: column;
292
- gap: 2rem;
293
- }
294
-
295
- .bc-input-panel {
296
- background: #fff;
297
- border-radius: 1.5rem;
298
- padding: 1.5rem;
299
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.08);
300
- border: 1px solid #f1f5f9;
301
- }
302
-
303
- .bc-panel-header {
304
- display: flex;
305
- align-items: center;
306
- gap: 0.75rem;
307
- margin-bottom: 1.5rem;
308
- }
309
-
310
- .bc-panel-icon {
311
- padding: 0.75rem;
312
- background: #dbeafe;
313
- border-radius: 0.75rem;
314
- color: #2563eb;
315
- font-size: 1.5rem;
316
- display: flex;
317
- flex-shrink: 0;
318
- }
319
-
320
- .bc-icon {
321
- width: 1.5rem;
322
- height: 1.5rem;
323
- }
324
-
325
- .bc-panel-title {
326
- font-size: 1.25rem;
327
- font-weight: 700;
328
- color: #1e293b;
329
- margin: 0;
330
- }
331
-
332
- .bc-panel-desc {
333
- font-size: 0.875rem;
334
- color: #94a3b8;
335
- margin: 0;
336
- }
337
-
338
- .bc-inputs-grid {
339
- display: grid;
340
- grid-template-columns: 1fr;
341
- gap: 1.5rem;
342
- }
343
-
344
- @media (min-width: 768px) {
345
- .bc-inputs-grid {
346
- grid-template-columns: 1fr 1fr 1fr;
347
- }
348
- }
349
-
350
- .bc-input-group {
351
- display: flex;
352
- flex-direction: column;
353
- gap: 0.5rem;
354
- }
355
-
356
- .bc-label {
357
- display: block;
358
- font-size: 0.875rem;
359
- font-weight: 500;
360
- color: #374151;
361
- }
362
-
363
- .bc-input-wrapper {
364
- position: relative;
365
- }
366
-
367
- .bc-input {
368
- display: block;
369
- width: 100%;
370
- padding: 0.75rem 2.5rem 0.75rem 1rem;
371
- border-radius: 0.75rem;
372
- background: #f8fafc;
373
- border: 1px solid transparent;
374
- color: #1e293b;
375
- font-size: 1rem;
376
- outline: none;
377
- transition: border-color 0.2s, box-shadow 0.2s;
378
- box-sizing: border-box;
379
- }
380
-
381
- .bc-input:focus {
382
- border-color: #3b82f6;
383
- box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.15);
384
- }
385
-
386
- .bc-unit-label {
387
- position: absolute;
388
- right: 1rem;
389
- top: 50%;
390
- transform: translateY(-50%);
391
- color: #94a3b8;
392
- font-size: 0.875rem;
393
- pointer-events: none;
394
- }
395
-
396
- .bc-unit-switcher {
397
- display: flex;
398
- justify-content: flex-end;
399
- margin-top: 1.5rem;
400
- }
401
-
402
- .bc-unit-toggle {
403
- display: inline-flex;
404
- background: #f1f5f9;
405
- padding: 0.25rem;
406
- border-radius: 0.5rem;
407
- gap: 0.25rem;
408
- }
409
-
410
- .bc-unit-btn {
411
- padding: 0.375rem 1rem;
412
- border-radius: 0.375rem;
413
- border: none;
414
- font-size: 0.875rem;
415
- font-weight: 500;
416
- cursor: pointer;
417
- transition: all 0.2s;
418
- color: #64748b;
419
- background: transparent;
420
- }
421
-
422
- [data-bc-unit][data-bc-active='true'] {
423
- background: #fff;
424
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
425
- color: #1e293b;
426
- }
427
-
428
- .bc-blueprint {
429
- background: #1e3a8a;
430
- border-radius: 1.5rem;
431
- padding: 0.25rem;
432
- box-shadow: 0 12px 40px rgba(30, 58, 138, 0.3);
433
- overflow: hidden;
434
- border: 4px solid rgba(255, 255, 255, 0.1);
435
- position: relative;
436
- }
437
-
438
- .bc-blueprint-grid {
439
- position: absolute;
440
- inset: 0;
441
- opacity: 0.1;
442
- background-image: linear-gradient(#fff 1px, transparent 1px), linear-gradient(90deg, #fff 1px, transparent 1px);
443
- background-size: 20px 20px;
444
- pointer-events: none;
445
- }
446
-
447
- .bc-blueprint-inner {
448
- position: relative;
449
- padding: 1.5rem;
450
- color: #bfdbfe;
451
- }
452
-
453
- @media (min-width: 768px) {
454
- .bc-blueprint-inner {
455
- padding: 2.5rem;
456
- }
457
- }
458
-
459
- .bc-bp-header {
460
- display: flex;
461
- justify-content: space-between;
462
- align-items: flex-start;
463
- margin-bottom: 2rem;
464
- padding-bottom: 1rem;
465
- border-bottom: 1px solid rgba(255, 255, 255, 0.2);
466
- }
467
-
468
- .bc-bp-plan-title {
469
- font-size: 1.25rem;
470
- letter-spacing: 0.1em;
471
- text-transform: uppercase;
472
- color: #fff;
473
- margin: 0 0 0.25rem;
474
- }
475
-
476
- .bc-bp-ref {
477
- font-size: 0.75rem;
478
- opacity: 0.6;
479
- margin: 0;
480
- }
481
-
482
- .bc-bp-count-block {
483
- text-align: right;
484
- }
485
-
486
- .bc-bp-count {
487
- font-size: 1.875rem;
488
- font-weight: 700;
489
- color: #fff;
490
- margin: 0 0 0.25rem;
491
- line-height: 1;
492
- }
493
-
494
- .bc-bp-count-label {
495
- font-size: 0.625rem;
496
- opacity: 0.6;
497
- text-transform: uppercase;
498
- letter-spacing: 0.1em;
499
- margin: 0;
500
- }
501
-
502
- .bc-bp-stats {
503
- display: grid;
504
- grid-template-columns: 1fr 1fr;
505
- gap: 1rem;
506
- margin-bottom: 2rem;
507
- }
508
-
509
- @media (min-width: 768px) {
510
- .bc-bp-stats {
511
- grid-template-columns: 1fr 1fr 1fr 1fr;
512
- }
513
- }
514
-
515
- .bc-stat-card {
516
- background: rgba(255, 255, 255, 0.05);
517
- backdrop-filter: blur(4px);
518
- padding: 0.75rem;
519
- border-radius: 0.375rem;
520
- border: 1px solid rgba(255, 255, 255, 0.1);
521
- }
522
-
523
- .bc-stat-label {
524
- display: block;
525
- font-size: 0.625rem;
526
- opacity: 0.5;
527
- text-transform: uppercase;
528
- letter-spacing: 0.05em;
529
- margin-bottom: 0.25rem;
530
- }
531
-
532
- .bc-stat-value {
533
- font-size: 1.125rem;
534
- font-weight: 700;
535
- color: #fff;
536
- }
537
-
538
- .bc-visualizer {
539
- width: 100%;
540
- height: 12rem;
541
- border: 1px dashed rgba(255, 255, 255, 0.3);
542
- border-radius: 0.375rem;
543
- background: rgba(23, 37, 84, 0.5);
544
- overflow: hidden;
545
- position: relative;
546
- }
547
-
548
- @media (min-width: 768px) {
549
- .bc-visualizer {
550
- height: 16rem;
551
- }
552
- }
553
-
554
- .bc-svg {
555
- width: 100%;
556
- height: 100%;
557
- }
558
-
559
- .bc-disclaimer {
560
- text-align: center;
561
- font-size: 0.75rem;
562
- opacity: 0.4;
563
- margin-top: 1rem;
564
- margin-bottom: 0;
565
- }
566
-
567
- :global(.theme-dark) .bc-input-panel {
568
- background: #18181b;
569
- border-color: rgba(51, 65, 85, 0.4);
570
- }
571
-
572
- :global(.theme-dark) .bc-panel-icon {
573
- background: rgba(30, 58, 138, 0.3);
574
- }
575
-
576
- :global(.theme-dark) .bc-panel-title {
577
- color: #f1f5f9;
578
- }
579
-
580
- :global(.theme-dark) .bc-label {
581
- color: #94a3b8;
582
- }
583
-
584
- :global(.theme-dark) .bc-input {
585
- background: #27272a;
586
- color: #f1f5f9;
587
- }
588
-
589
- :global(.theme-dark) .bc-input:focus {
590
- border-color: #3b82f6;
591
- }
592
-
593
- :global(.theme-dark) .bc-unit-toggle {
594
- background: #27272a;
595
- }
596
-
597
- :global(.theme-dark) [data-bc-unit][data-bc-active='true'] {
598
- background: #3f3f46;
599
- color: #f1f5f9;
600
- }
601
-
602
- :global(.theme-dark) .bc-blueprint {
603
- background: #0f172a;
604
- }
605
- </style>