@jjlmoya/utils-developer 1.17.0 → 1.20.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 (60) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +7 -1
  4. package/src/index.ts +3 -0
  5. package/src/tests/locale_completeness.test.ts +2 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/calculadoraTiempoDatos/data-time-calculator-web-speed-impact.css +498 -499
  8. package/src/tool/cssBoxShadowGenerator/bibliography.astro +14 -0
  9. package/src/tool/cssBoxShadowGenerator/bibliography.ts +14 -0
  10. package/src/tool/cssBoxShadowGenerator/box-shadow-generator.css +376 -0
  11. package/src/tool/cssBoxShadowGenerator/component.astro +234 -0
  12. package/src/tool/cssBoxShadowGenerator/entry.ts +29 -0
  13. package/src/tool/cssBoxShadowGenerator/i18n/de.ts +69 -0
  14. package/src/tool/cssBoxShadowGenerator/i18n/en.ts +71 -0
  15. package/src/tool/cssBoxShadowGenerator/i18n/es.ts +69 -0
  16. package/src/tool/cssBoxShadowGenerator/i18n/fr.ts +69 -0
  17. package/src/tool/cssBoxShadowGenerator/i18n/id.ts +69 -0
  18. package/src/tool/cssBoxShadowGenerator/i18n/it.ts +69 -0
  19. package/src/tool/cssBoxShadowGenerator/i18n/ja.ts +69 -0
  20. package/src/tool/cssBoxShadowGenerator/i18n/ko.ts +69 -0
  21. package/src/tool/cssBoxShadowGenerator/i18n/nl.ts +69 -0
  22. package/src/tool/cssBoxShadowGenerator/i18n/pl.ts +69 -0
  23. package/src/tool/cssBoxShadowGenerator/i18n/pt.ts +69 -0
  24. package/src/tool/cssBoxShadowGenerator/i18n/ru.ts +69 -0
  25. package/src/tool/cssBoxShadowGenerator/i18n/sv.ts +69 -0
  26. package/src/tool/cssBoxShadowGenerator/i18n/tr.ts +69 -0
  27. package/src/tool/cssBoxShadowGenerator/i18n/zh.ts +69 -0
  28. package/src/tool/cssBoxShadowGenerator/index.ts +9 -0
  29. package/src/tool/cssBoxShadowGenerator/logic.ts +35 -0
  30. package/src/tool/cssBoxShadowGenerator/seo.astro +15 -0
  31. package/src/tool/cssBoxShadowGenerator/ui.ts +23 -0
  32. package/src/tool/visualCssGridFlexboxGenerator/bibliography.astro +14 -0
  33. package/src/tool/visualCssGridFlexboxGenerator/bibliography.ts +20 -0
  34. package/src/tool/visualCssGridFlexboxGenerator/canvas.ts +103 -0
  35. package/src/tool/visualCssGridFlexboxGenerator/component.astro +218 -0
  36. package/src/tool/visualCssGridFlexboxGenerator/entry.ts +30 -0
  37. package/src/tool/visualCssGridFlexboxGenerator/i18n/de.ts +110 -0
  38. package/src/tool/visualCssGridFlexboxGenerator/i18n/en.ts +256 -0
  39. package/src/tool/visualCssGridFlexboxGenerator/i18n/es.ts +110 -0
  40. package/src/tool/visualCssGridFlexboxGenerator/i18n/fr.ts +110 -0
  41. package/src/tool/visualCssGridFlexboxGenerator/i18n/id.ts +110 -0
  42. package/src/tool/visualCssGridFlexboxGenerator/i18n/it.ts +110 -0
  43. package/src/tool/visualCssGridFlexboxGenerator/i18n/ja.ts +110 -0
  44. package/src/tool/visualCssGridFlexboxGenerator/i18n/ko.ts +110 -0
  45. package/src/tool/visualCssGridFlexboxGenerator/i18n/nl.ts +110 -0
  46. package/src/tool/visualCssGridFlexboxGenerator/i18n/pl.ts +110 -0
  47. package/src/tool/visualCssGridFlexboxGenerator/i18n/pt.ts +110 -0
  48. package/src/tool/visualCssGridFlexboxGenerator/i18n/ru.ts +110 -0
  49. package/src/tool/visualCssGridFlexboxGenerator/i18n/sv.ts +110 -0
  50. package/src/tool/visualCssGridFlexboxGenerator/i18n/tr.ts +110 -0
  51. package/src/tool/visualCssGridFlexboxGenerator/i18n/zh.ts +110 -0
  52. package/src/tool/visualCssGridFlexboxGenerator/index.ts +11 -0
  53. package/src/tool/visualCssGridFlexboxGenerator/interactions.ts +45 -0
  54. package/src/tool/visualCssGridFlexboxGenerator/logic.ts +49 -0
  55. package/src/tool/visualCssGridFlexboxGenerator/presets.ts +63 -0
  56. package/src/tool/visualCssGridFlexboxGenerator/seo.astro +15 -0
  57. package/src/tool/visualCssGridFlexboxGenerator/ui.ts +58 -0
  58. package/src/tool/visualCssGridFlexboxGenerator/visual-css-grid-flexbox-generator.css +816 -0
  59. package/src/tool/visualCssGridFlexboxGenerator/workspace.ts +192 -0
  60. package/src/tools.ts +3 -1
@@ -0,0 +1,69 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { CssBoxShadowGeneratorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'css-box-schaduw-generator';
7
+ const title = 'CSS Box Shadow Generator';
8
+ const description = 'Ontwerp gelaagde CSS-schaduwen visueel met live voorbeeld, schuifregelaars, kleurkiezers en presets. Kopieer schone native CSS direct.';
9
+
10
+ const howTo = [
11
+ { name: 'Kies een preset of begin vanaf nul', text: 'Kies uit de presets Card, Float, Inset, Glow of Layered, of pas de standaard schaduw aan met de schuifregelaars.' },
12
+ { name: 'Voeg lagen toe en stapel ze', text: 'Klik + om lagen toe te voegen (tot 5). Selecteer elke laag om offset, blur, spread, kleur en dekking te bewerken.' },
13
+ { name: 'Schakel inset en achtergrond', text: 'Vink inset aan voor binnenste schaduwen. Wijzig de achtergrondkleur van het voorbeeld.' },
14
+ { name: 'Kopieer de CSS', text: 'Wanneer het voorbeeld overeenkomt met je ontwerp, kopieer de gegenereerde CSS en plak deze in je stylesheet.' },
15
+ ];
16
+
17
+ const faq = [
18
+ { question: 'Kan ik meerdere schaduwen op een element gebruiken?', answer: 'Ja. CSS staat komma-gescheiden box-shadow waarden toe. Deze tool laat je tot 5 lagen stapelen met onafhankelijke bediening.' },
19
+ { question: 'Wat doet een negatieve spread waarde?', answer: 'Negatieve spread verkleint de schaduw naar binnen voor het vervagen. Handig voor subtiele zwevende effecten.' },
20
+ { question: 'Waarvoor dient de inset optie?', answer: 'Inset schaduwen worden binnen de elementrand weergegeven en creëren een verzonken look. Ideaal voor formuliervelden en ingedrukte kaarten.' },
21
+ { question: 'Heeft de gegenereerde CSS framework-afhankelijkheden?', answer: 'Nee. Het resultaat is pure native CSS. Gebruik het in elk project met standaard CSS.' },
22
+ ];
23
+
24
+ const ui: CssBoxShadowGeneratorUI = {
25
+ offsetXLabel: 'Offset X',
26
+ offsetYLabel: 'Offset Y',
27
+ blurLabel: 'Vervaging',
28
+ spreadLabel: 'Spreiding',
29
+ opacityLabel: 'Dekking',
30
+ insetLabel: 'Binnen',
31
+ addLayer: 'Laag toevoegen',
32
+ removeLayer: 'Laag verwijderen',
33
+ resetAll: 'Herstellen',
34
+ codeTitle: 'Gegenereerde CSS',
35
+ copyCode: 'CSS kopiëren',
36
+ copied: 'Gekopieerd!',
37
+ previewLabel: 'Voorbeeld',
38
+ presetCard: 'Card',
39
+ presetFloat: 'Float',
40
+ presetInset: 'Inset',
41
+ presetGlow: 'Glow',
42
+ presetLayered: 'Lagen',
43
+ presetsLabel: 'Presets',
44
+ layerPrefix: 'Laag',
45
+ bgColorLabel: 'Achtergrond',
46
+ };
47
+
48
+ const faqSchema: WithContext<FAQPage> = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
49
+ const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: title, description, step: howTo.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })) };
50
+ const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'DeveloperApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' } };
51
+
52
+ export const content: ToolLocaleContent<CssBoxShadowGeneratorUI> = {
53
+ slug, title, description, ui,
54
+ faqTitle: 'CSS Box-Shadow Generator FAQ',
55
+ faq,
56
+ bibliographyTitle: 'CSS Box-Shadow Referenties',
57
+ bibliography,
58
+ howTo,
59
+ schemas: [appSchema, faqSchema, howToSchema],
60
+ seo: [
61
+ { type: 'title', text: 'Ontwerp CSS-schaduwen visueel in plaats van waarden te raden', level: 2 },
62
+ { type: 'paragraph', html: '<strong>box-shadow</strong> handmatig aanpassen is vervelend. Deze visuele generator laat je meerdere schaduwen stapelen, live bekijken en productieklaar CSS kopiëren.' },
63
+ { type: 'stats', columns: 3, items: [{ value: '5', label: 'Schaduwlagen per element', icon: 'mdi:layers' }, { value: 'Live', label: 'Voorbeeld bij elke wijziging', icon: 'mdi:eye' }, { value: '5', label: 'Snelle presets', icon: 'mdi:star' }] },
64
+ { type: 'title', text: 'Stapel meerdere schaduwen voor realistische diepte', level: 3 },
65
+ { type: 'paragraph', html: 'Echte schaduwen zijn zelden uniform. Een strakke schaduw dicht bij het element stapelen met een zachtere, bredere creëert natuurlijke diepte. Gebruik <strong>+</strong> om lagen toe te voegen.' },
66
+ { type: 'table', headers: ['Bediening', 'CSS-waarde', 'Effect'], rows: [['Offset X', '1e lengte', 'Horizontale verplaatsing.'], ['Offset Y', '2e lengte', 'Verticale verplaatsing.'], ['Vervaging', '3e lengte', 'Blur-radius.'], ['Spreiding', '4e lengte', 'Vergroot of verkleint de schaduw.'], ['Kleur & Dekking', 'rgba()', 'Schaduwkleur met onafhankelijke dekking.'], ['Binnen', 'inset', 'Schaduw binnen de elementrand.']] },
67
+ { type: 'summary', title: 'Aanbevolen workflow', items: ['Begin met een preset.', 'Voeg lagen toe voor realistische diepte.', 'Gebruik negatieve spread voor zwevende kaarten.', 'Kopieer de CSS en plak deze.'] },
68
+ ],
69
+ };
@@ -0,0 +1,69 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { CssBoxShadowGeneratorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'generator-cieni-css';
7
+ const title = 'CSS Box Shadow Generator';
8
+ const description = 'Projektuj warstwowe cienie CSS wizualnie z podglądem na żywo, suwakami, wybierakami kolorów i presetami. Kopiuj czysty natywny CSS natychmiast.';
9
+
10
+ const howTo = [
11
+ { name: 'Wybierz preset lub zacznij od zera', text: 'Wybierz spośród presetów Card, Float, Inset, Glow lub Layered albo dostosuj domyślny cień suwakami.' },
12
+ { name: 'Dodawaj i układaj warstwy', text: 'Kliknij +, aby dodać warstwy (do 5). Wybierz każdą warstwę, aby edytować offset, blur, spread, kolor i przezroczystość.' },
13
+ { name: 'Przełącz inset i tło', text: 'Zaznacz inset dla cieni wewnętrznych. Zmień kolor tła podglądu.' },
14
+ { name: 'Kopiuj CSS', text: 'Gdy podgląd pasuje do twojego projektu, skopiuj wygenerowany CSS i wklej do arkusza stylów.' },
15
+ ];
16
+
17
+ const faq = [
18
+ { question: 'Czy mogę użyć wielu cieni na jednym elemencie?', answer: 'Tak. CSS pozwala na wartości box-shadow oddzielone przecinkami. To narzędzie umożliwia układanie do 5 warstw z niezależnymi kontrolkami.' },
19
+ { question: 'Co robi ujemna wartość spread?', answer: 'Ujemny spread zmniejsza cień do wewnątrz przed rozmyciem. Przydatne do subtelnych efektów unoszenia.' },
20
+ { question: 'Do czego służy opcja inset?', answer: 'Cienie inset są renderowane wewnątrz krawędzi elementu, tworząc efekt wklęsłości. Idealne do pól formularzy i wciśniętych kart.' },
21
+ { question: 'Czy wygenerowany CSS ma zależności od frameworków?', answer: 'Nie. Wynik to czysty natywny CSS. Używaj w każdym projekcie ze standardowym CSS.' },
22
+ ];
23
+
24
+ const ui: CssBoxShadowGeneratorUI = {
25
+ offsetXLabel: 'Offset X',
26
+ offsetYLabel: 'Offset Y',
27
+ blurLabel: 'Rozmycie',
28
+ spreadLabel: 'Rozprz.',
29
+ opacityLabel: 'Przezrocz.',
30
+ insetLabel: 'Wewn.',
31
+ addLayer: 'Dodaj warstwę',
32
+ removeLayer: 'Usuń warstwę',
33
+ resetAll: 'Resetuj',
34
+ codeTitle: 'Wygenerowany CSS',
35
+ copyCode: 'Kopiuj CSS',
36
+ copied: 'Skopiowano!',
37
+ previewLabel: 'Podgląd',
38
+ presetCard: 'Card',
39
+ presetFloat: 'Float',
40
+ presetInset: 'Inset',
41
+ presetGlow: 'Glow',
42
+ presetLayered: 'Warstwy',
43
+ presetsLabel: 'Presety',
44
+ layerPrefix: 'Warstwa',
45
+ bgColorLabel: 'Tło',
46
+ };
47
+
48
+ const faqSchema: WithContext<FAQPage> = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
49
+ const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: title, description, step: howTo.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })) };
50
+ const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'DeveloperApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' } };
51
+
52
+ export const content: ToolLocaleContent<CssBoxShadowGeneratorUI> = {
53
+ slug, title, description, ui,
54
+ faqTitle: 'FAQ Generatora Cieni CSS',
55
+ faq,
56
+ bibliographyTitle: 'Referencje Box Shadow CSS',
57
+ bibliography,
58
+ howTo,
59
+ schemas: [appSchema, faqSchema, howToSchema],
60
+ seo: [
61
+ { type: 'title', text: 'Projektuj cienie CSS wizualnie zamiast zgadywać wartości', level: 2 },
62
+ { type: 'paragraph', html: 'Ręczne dostosowywanie <strong>box-shadow</strong> jest uciążliwe. Ten wizualny generator pozwala układać wiele cieni, podglądać je na żywo i kopiować gotowy CSS.' },
63
+ { type: 'stats', columns: 3, items: [{ value: '5', label: 'Warstw cienia na element', icon: 'mdi:layers' }, { value: 'Na żywo', label: 'Podgląd przy każdej zmianie', icon: 'mdi:eye' }, { value: '5', label: 'Szybkie presety', icon: 'mdi:star' }] },
64
+ { type: 'title', text: 'Układaj wiele cieni dla realistycznej głębi', level: 3 },
65
+ { type: 'paragraph', html: 'Prawdziwe cienie rzadko są jednolitym rozmyciem. Nakładanie ciasnego cienia blisko elementu z bardziej miękkim, szerszym tworzy naturalną głębię. Użyj <strong>+</strong> do dodawania warstw.' },
66
+ { type: 'table', headers: ['Kontrolka', 'Wartość CSS', 'Efekt'], rows: [['Offset X', '1. długość', 'Przesunięcie poziome.'], ['Offset Y', '2. długość', 'Przesunięcie pionowe.'], ['Rozmycie', '3. długość', 'Promień rozmycia.'], ['Rozprz.', '4. długość', 'Powiększa lub zmniejsza cień.'], ['Kolor i przezrocz.', 'rgba()', 'Kolor cienia z niezależną przezroczystością.'], ['Wewn.', 'inset', 'Cień wewnątrz krawędzi elementu.']] },
67
+ { type: 'summary', title: 'Zalecany workflow', items: ['Zacznij od presetu.', 'Dodaj warstwy dla realistycznej głębi.', 'Użyj ujemnego spread dla efektu unoszenia karty.', 'Skopiuj wygenerowany CSS i wklej.'] },
68
+ ],
69
+ };
@@ -0,0 +1,69 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { CssBoxShadowGeneratorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'gerador-sombras-css';
7
+ const title = 'CSS Box Shadow Generator';
8
+ const description = 'Crie sombras CSS em camadas visualmente com pré-visualização ao vivo, sliders, seletores de cor e presets. Copie CSS nativo limpo instantaneamente.';
9
+
10
+ const howTo = [
11
+ { name: 'Escolha um preset ou comece do zero', text: 'Selecione entre os presets Card, Float, Inset, Glow ou Layered, ou ajuste a sombra padrão com os sliders.' },
12
+ { name: 'Adicione e empilhe camadas', text: 'Clique + para adicionar camadas (até 5). Selecione cada camada para editar offset, blur, spread, cor e opacidade.' },
13
+ { name: 'Alterne inset e cor de fundo', text: 'Marque inset para sombras internas. Altere a cor de fundo da pré-visualização.' },
14
+ { name: 'Copie o CSS', text: 'Quando a pré-visualização corresponder ao seu design, copie o CSS gerado e cole na sua folha de estilo.' },
15
+ ];
16
+
17
+ const faq = [
18
+ { question: 'Posso usar várias sombras em um elemento?', answer: 'Sim. CSS permite valores box-shadow separados por vírgula. Esta ferramenta permite empilhar até 5 camadas com controles independentes.' },
19
+ { question: 'O que faz um valor spread negativo?', answer: 'Spread negativo encolhe a sombra para dentro antes do desfoque. Útil para efeitos flutuantes sutis.' },
20
+ { question: 'Para que serve a opção inset?', answer: 'Sombras inset são renderizadas dentro da borda do elemento, criando um efeito afundado. Ideal para inputs e cartões pressionados.' },
21
+ { question: 'O CSS gerado tem dependências de framework?', answer: 'Não. O resultado é CSS nativo puro. Use em qualquer projeto com CSS padrão.' },
22
+ ];
23
+
24
+ const ui: CssBoxShadowGeneratorUI = {
25
+ offsetXLabel: 'Offset X',
26
+ offsetYLabel: 'Offset Y',
27
+ blurLabel: 'Desfoque',
28
+ spreadLabel: 'Expansão',
29
+ opacityLabel: 'Opacidade',
30
+ insetLabel: 'Interno',
31
+ addLayer: 'Adicionar camada',
32
+ removeLayer: 'Remover camada',
33
+ resetAll: 'Restaurar',
34
+ codeTitle: 'CSS Gerado',
35
+ copyCode: 'Copiar CSS',
36
+ copied: 'Copiado!',
37
+ previewLabel: 'Pré-visualização',
38
+ presetCard: 'Card',
39
+ presetFloat: 'Float',
40
+ presetInset: 'Inset',
41
+ presetGlow: 'Glow',
42
+ presetLayered: 'Camadas',
43
+ presetsLabel: 'Presets',
44
+ layerPrefix: 'Camada',
45
+ bgColorLabel: 'Fundo',
46
+ };
47
+
48
+ const faqSchema: WithContext<FAQPage> = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
49
+ const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: title, description, step: howTo.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })) };
50
+ const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'DeveloperApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' } };
51
+
52
+ export const content: ToolLocaleContent<CssBoxShadowGeneratorUI> = {
53
+ slug, title, description, ui,
54
+ faqTitle: 'FAQ do Gerador de Sombras CSS',
55
+ faq,
56
+ bibliographyTitle: 'Referências Box Shadow CSS',
57
+ bibliography,
58
+ howTo,
59
+ schemas: [appSchema, faqSchema, howToSchema],
60
+ seo: [
61
+ { type: 'title', text: 'Crie sombras CSS visualmente em vez de adivinhar valores', level: 2 },
62
+ { type: 'paragraph', html: 'Ajustar <strong>box-shadow</strong> manualmente é tedioso. Este gerador visual permite empilhar múltiplas sombras, visualizá-las ao vivo e copiar CSS pronto para produção.' },
63
+ { type: 'stats', columns: 3, items: [{ value: '5', label: 'Camadas de sombra por elemento', icon: 'mdi:layers' }, { value: 'Ao vivo', label: 'Pré-visualização a cada mudança', icon: 'mdi:eye' }, { value: '5', label: 'Presets rápidos', icon: 'mdi:star' }] },
64
+ { type: 'title', text: 'Empilhe múltiplas sombras para profundidade realista', level: 3 },
65
+ { type: 'paragraph', html: 'Sombras reais raramente são um blur uniforme. Empilhar uma sombra apertada perto do elemento com uma mais suave e ampla cria profundidade natural. Use <strong>+</strong> para adicionar camadas.' },
66
+ { type: 'table', headers: ['Controle', 'Valor CSS', 'Efeito'], rows: [['Offset X', '1º comprimento', 'Deslocamento horizontal.'], ['Offset Y', '2º comprimento', 'Deslocamento vertical.'], ['Desfoque', '3º comprimento', 'Raio de blur.'], ['Expansão', '4º comprimento', 'Expande ou encolhe a sombra.'], ['Cor e Opacidade', 'rgba()', 'Cor da sombra com opacidade independente.'], ['Interno', 'inset', 'Sombra dentro da borda do elemento.']] },
67
+ { type: 'summary', title: 'Workflow recomendado', items: ['Comece com um preset.', 'Adicione camadas para profundidade realista.', 'Use spread negativo para efeito de card flutuante.', 'Copie o CSS gerado e cole.'] },
68
+ ],
69
+ };
@@ -0,0 +1,69 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { CssBoxShadowGeneratorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'generator-tenei-css';
7
+ const title = 'CSS Box Shadow Generator';
8
+ const description = 'Проектируйте многослойные тени CSS визуально с живым предпросмотром, ползунками, выбором цвета и пресетами. Копируйте чистый нативный CSS мгновенно.';
9
+
10
+ const howTo = [
11
+ { name: 'Выберите пресет или начните с нуля', text: 'Выберите из пресетов Card, Float, Inset, Glow или Layered либо настройте тень по умолчанию ползунками.' },
12
+ { name: 'Добавляйте и наслаивайте слои', text: 'Нажмите +, чтобы добавить слои (до 5). Выберите слой для редактирования offset, blur, spread, цвета и прозрачности.' },
13
+ { name: 'Включите inset и измените фон', text: 'Отметьте inset для внутренних теней. Измените цвет фона предпросмотра.' },
14
+ { name: 'Копируйте CSS', text: 'Когда предпросмотр совпадает с вашим дизайном, скопируйте сгенерированный CSS и вставьте в таблицу стилей.' },
15
+ ];
16
+
17
+ const faq = [
18
+ { question: 'Можно ли использовать несколько теней на одном элементе?', answer: 'Да. CSS позволяет значения box-shadow через запятую. Этот инструмент позволяет накладывать до 5 слоёв с независимыми настройками.' },
19
+ { question: 'Что делает отрицательное значение spread?', answer: 'Отрицательный spread сжимает тень внутрь перед размытием. Полезно для тонких эффектов парения.' },
20
+ { question: 'Для чего нужна опция inset?', answer: 'Тени inset отображаются внутри границы элемента, создавая вдавленный вид. Идеально для полей форм и нажатых карточек.' },
21
+ { question: 'Есть ли у сгенерированного CSS зависимости от фреймворков?', answer: 'Нет. Результат - чистый нативный CSS. Используйте в любом проекте со стандартным CSS.' },
22
+ ];
23
+
24
+ const ui: CssBoxShadowGeneratorUI = {
25
+ offsetXLabel: 'Смещ. X',
26
+ offsetYLabel: 'Смещ. Y',
27
+ blurLabel: 'Размытие',
28
+ spreadLabel: 'Размах',
29
+ opacityLabel: 'Прозрач.',
30
+ insetLabel: 'Внутр.',
31
+ addLayer: 'Добавить слой',
32
+ removeLayer: 'Удалить слой',
33
+ resetAll: 'Сбросить',
34
+ codeTitle: 'Сгенерированный CSS',
35
+ copyCode: 'Копировать CSS',
36
+ copied: 'Скопировано!',
37
+ previewLabel: 'Предпросмотр',
38
+ presetCard: 'Card',
39
+ presetFloat: 'Float',
40
+ presetInset: 'Inset',
41
+ presetGlow: 'Glow',
42
+ presetLayered: 'Слои',
43
+ presetsLabel: 'Пресеты',
44
+ layerPrefix: 'Слой',
45
+ bgColorLabel: 'Фон',
46
+ };
47
+
48
+ const faqSchema: WithContext<FAQPage> = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
49
+ const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: title, description, step: howTo.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })) };
50
+ const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'DeveloperApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' } };
51
+
52
+ export const content: ToolLocaleContent<CssBoxShadowGeneratorUI> = {
53
+ slug, title, description, ui,
54
+ faqTitle: 'FAQ Генератора Теней CSS',
55
+ faq,
56
+ bibliographyTitle: 'Ссылки по Box Shadow CSS',
57
+ bibliography,
58
+ howTo,
59
+ schemas: [appSchema, faqSchema, howToSchema],
60
+ seo: [
61
+ { type: 'title', text: 'Проектируйте тени CSS визуально, а не угадывайте значения', level: 2 },
62
+ { type: 'paragraph', html: 'Ручная настройка <strong>box-shadow</strong> утомительна. Этот визуальный генератор позволяет накладывать несколько теней, смотреть их вживую и копировать готовый CSS.' },
63
+ { type: 'stats', columns: 3, items: [{ value: '5', label: 'Слоёв тени на элемент', icon: 'mdi:layers' }, { value: 'Live', label: 'Предпросмотр при каждом изменении', icon: 'mdi:eye' }, { value: '5', label: 'Быстрых пресетов', icon: 'mdi:star' }] },
64
+ { type: 'title', text: 'Накладывайте несколько теней для реалистичной глубины', level: 3 },
65
+ { type: 'paragraph', html: 'Реальные тени редко бывают равномерным размытием. Наложение плотной тени близко к элементу с более мягкой и широкой создаёт естественную глубину. Используйте <strong>+</strong> для добавления слоёв.' },
66
+ { type: 'table', headers: ['Элемент', 'Значение CSS', 'Эффект'], rows: [['Смещ. X', '1-я длина', 'Горизонтальное смещение.'], ['Смещ. Y', '2-я длина', 'Вертикальное смещение.'], ['Размытие', '3-я длина', 'Радиус размытия.'], ['Размах', '4-я длина', 'Увеличивает или уменьшает тень.'], ['Цвет и прозрач.', 'rgba()', 'Цвет тени с независимой прозрачностью.'], ['Внутр.', 'inset', 'Тень внутри границы элемента.']] },
67
+ { type: 'summary', title: 'Рекомендуемый рабочий процесс', items: ['Начните с пресета.', 'Добавьте слои для реалистичной глубины.', 'Используйте отрицательный spread для эффекта парящей карточки.', 'Скопируйте сгенерированный CSS и вставьте.'] },
68
+ ],
69
+ };
@@ -0,0 +1,69 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { CssBoxShadowGeneratorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'css-boxskugga-generator';
7
+ const title = 'CSS Box Shadow Generator';
8
+ const description = 'Designa skiktade CSS-skuggor visuellt med live-förhandsvisning, reglage, färgväljare och förinställningar. Kopiera ren native CSS direkt.';
9
+
10
+ const howTo = [
11
+ { name: 'Välj en förinställning eller börja från grunden', text: 'Välj bland förinställningarna Card, Float, Inset, Glow eller Layered, eller justera standardskuggan med reglagen.' },
12
+ { name: 'Lägg till och stapla lager', text: 'Klicka + för att lägga till lager (upp till 5). Välj varje lager för att redigera offset, blur, spread, färg och opacitet.' },
13
+ { name: 'Växla inset och bakgrund', text: 'Markera inset för inre skuggor. Ändra bakgrundsfärgen för förhandsvisningen.' },
14
+ { name: 'Kopiera CSS:en', text: 'När förhandsvisningen matchar din design, kopiera den genererade CSS:en och klistra in i din stilmall.' },
15
+ ];
16
+
17
+ const faq = [
18
+ { question: 'Kan jag använda flera skuggor på ett element?', answer: 'Ja. CSS tillåter kommaseparerade box-shadow-värden. Det här verktyget låter dig stapla upp till 5 lager med oberoende kontroller.' },
19
+ { question: 'Vad gör ett negativt spread-värde?', answer: 'Negativ spread krymper skuggan inåt före oskärpan. Användbart för subtila svävande effekter.' },
20
+ { question: 'Vad är inset-alternativet till för?', answer: 'Inset-skuggor renderas innanför elementkanten och skapar ett försänkt utseende. Idealisk för formulärfält och intryckta kort.' },
21
+ { question: 'Har den genererade CSS:en ramverksberoenden?', answer: 'Nej. Resultatet är ren native CSS. Använd i alla projekt med standard-CSS.' },
22
+ ];
23
+
24
+ const ui: CssBoxShadowGeneratorUI = {
25
+ offsetXLabel: 'Offset X',
26
+ offsetYLabel: 'Offset Y',
27
+ blurLabel: 'Oskärpa',
28
+ spreadLabel: 'Spridning',
29
+ opacityLabel: 'Opacitet',
30
+ insetLabel: 'Inre',
31
+ addLayer: 'Lägg till lager',
32
+ removeLayer: 'Ta bort lager',
33
+ resetAll: 'Återställ',
34
+ codeTitle: 'Genererad CSS',
35
+ copyCode: 'Kopiera CSS',
36
+ copied: 'Kopierat!',
37
+ previewLabel: 'Förhandsvisning',
38
+ presetCard: 'Card',
39
+ presetFloat: 'Float',
40
+ presetInset: 'Inset',
41
+ presetGlow: 'Glow',
42
+ presetLayered: 'Lager',
43
+ presetsLabel: 'Förval',
44
+ layerPrefix: 'Lager',
45
+ bgColorLabel: 'Bakgrund',
46
+ };
47
+
48
+ const faqSchema: WithContext<FAQPage> = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
49
+ const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: title, description, step: howTo.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })) };
50
+ const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'DeveloperApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' } };
51
+
52
+ export const content: ToolLocaleContent<CssBoxShadowGeneratorUI> = {
53
+ slug, title, description, ui,
54
+ faqTitle: 'CSS Box-Shadow Generator FAQ',
55
+ faq,
56
+ bibliographyTitle: 'CSS Box-Shadow Referenser',
57
+ bibliography,
58
+ howTo,
59
+ schemas: [appSchema, faqSchema, howToSchema],
60
+ seo: [
61
+ { type: 'title', text: 'Designa CSS-skuggor visuellt istället för att gissa värden', level: 2 },
62
+ { type: 'paragraph', html: 'Att justera <strong>box-shadow</strong> för hand är tråkigt. Denna visuella generator låter dig stapla flera skuggor, se dem live och kopiera produktionsklar CSS.' },
63
+ { type: 'stats', columns: 3, items: [{ value: '5', label: 'Skugglager per element', icon: 'mdi:layers' }, { value: 'Live', label: 'Förhandsvisning vid varje ändring', icon: 'mdi:eye' }, { value: '5', label: 'Snabba förval', icon: 'mdi:star' }] },
64
+ { type: 'title', text: 'Stapla flera skuggor för realistiskt djup', level: 3 },
65
+ { type: 'paragraph', html: 'Verkliga skuggor är sällan enhetlig oskärpa. Att stapla en tight skugga nära elementet med en mjukare, bredare skapar naturligt djup. Använd <strong>+</strong> för att lägga till lager.' },
66
+ { type: 'table', headers: ['Kontroll', 'CSS-värde', 'Effekt'], rows: [['Offset X', '1:a längd', 'Horisontell förskjutning.'], ['Offset Y', '2:a längd', 'Vertikal förskjutning.'], ['Oskärpa', '3:e längd', 'Oskärperadie.'], ['Spridning', '4:e längd', 'Expanderar eller krymper skuggan.'], ['Färg & Opacitet', 'rgba()', 'Skuggfärg med oberoende opacitet.'], ['Inre', 'inset', 'Skugga innanför elementkanten.']] },
67
+ { type: 'summary', title: 'Rekommenderat arbetsflöde', items: ['Börja med en förinställning.', 'Lägg till lager för realistiskt djup.', 'Använd negativ spread för svävande kort.', 'Kopiera CSS:en och klistra in.'] },
68
+ ],
69
+ };
@@ -0,0 +1,69 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { CssBoxShadowGeneratorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'css-golge-olusturucu';
7
+ const title = 'CSS Box Shadow Generator';
8
+ const description = 'Katmanlı CSS gölgelerini canlı önizleme, kaydırıcılar, renk seçiciler ve hazır ayarlarla görsel olarak tasarlayın. Temiz native CSS\'i anında kopyalayın.';
9
+
10
+ const howTo = [
11
+ { name: 'Hazır ayar seçin veya sıfırdan başlayın', text: 'Card, Float, Inset, Glow veya Layered hazır ayarlarından seçim yapın veya varsayılan gölgeyi kaydırıcılarla ayarlayın.' },
12
+ { name: 'Katman ekleyin ve istifleyin', text: 'Katman eklemek için + tuşuna basın (5\'e kadar). Her katmanı seçerek offset, blur, spread, renk ve opaklığı düzenleyin.' },
13
+ { name: 'Inset ve arka planı değiştirin', text: 'İç gölgeler için inset\'i işaretleyin. Önizleme arka plan rengini değiştirin.' },
14
+ { name: 'CSS\'i kopyalayın', text: 'Önizleme tasarımınızla eşleştiğinde, oluşturulan CSS\'i kopyalayın ve stil sayfanıza yapıştırın.' },
15
+ ];
16
+
17
+ const faq = [
18
+ { question: 'Bir öğede birden fazla gölge kullanabilir miyim?', answer: 'Evet. CSS virgülle ayrılmış box-shadow değerlerine izin verir. Bu araç, bağımsız kontrollere sahip 5\'e kadar katman istiflemenizi sağlar.' },
19
+ { question: 'Negatif spread değeri ne yapar?', answer: 'Negatif spread, bulanıklaştırmadan önce gölgeyi içe doğru küçültür. İnce yüzen efektler için kullanışlıdır.' },
20
+ { question: 'Inset seçeneği ne işe yarar?', answer: 'Inset gölgeler öğe kenarının içinde işlenir ve çökük bir görünüm oluşturur. Form alanları ve basılı kartlar için idealdir.' },
21
+ { question: 'Oluşturulan CSS\'in framework bağımlılığı var mı?', answer: 'Hayır. Sonuç saf native CSS\'tir. Standart CSS kullanan her projede kullanın.' },
22
+ ];
23
+
24
+ const ui: CssBoxShadowGeneratorUI = {
25
+ offsetXLabel: 'Ofset X',
26
+ offsetYLabel: 'Ofset Y',
27
+ blurLabel: 'Bulanıklık',
28
+ spreadLabel: 'Yayılma',
29
+ opacityLabel: 'Opaklık',
30
+ insetLabel: 'İç',
31
+ addLayer: 'Katman ekle',
32
+ removeLayer: 'Katman kaldır',
33
+ resetAll: 'Sıfırla',
34
+ codeTitle: 'Oluşturulan CSS',
35
+ copyCode: 'CSS kopyala',
36
+ copied: 'Kopyalandı!',
37
+ previewLabel: 'Önizleme',
38
+ presetCard: 'Card',
39
+ presetFloat: 'Float',
40
+ presetInset: 'Inset',
41
+ presetGlow: 'Glow',
42
+ presetLayered: 'Katmanlı',
43
+ presetsLabel: 'Hazır Ayar',
44
+ layerPrefix: 'Katman',
45
+ bgColorLabel: 'Arka Plan',
46
+ };
47
+
48
+ const faqSchema: WithContext<FAQPage> = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
49
+ const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: title, description, step: howTo.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })) };
50
+ const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'DeveloperApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' } };
51
+
52
+ export const content: ToolLocaleContent<CssBoxShadowGeneratorUI> = {
53
+ slug, title, description, ui,
54
+ faqTitle: 'CSS Box-Shadow Oluşturucu SSS',
55
+ faq,
56
+ bibliographyTitle: 'CSS Box-Shadow Referansları',
57
+ bibliography,
58
+ howTo,
59
+ schemas: [appSchema, faqSchema, howToSchema],
60
+ seo: [
61
+ { type: 'title', text: 'CSS gölgelerini değerleri tahmin etmek yerine görsel olarak tasarlayın', level: 2 },
62
+ { type: 'paragraph', html: '<strong>box-shadow</strong>\'u elle ayarlamak sıkıcıdır. Bu görsel oluşturucu, birden fazla gölgeyi istiflemenizi, canlı görmenizi ve üretime hazır CSS kopyalamanızı sağlar.' },
63
+ { type: 'stats', columns: 3, items: [{ value: '5', label: 'Öğe başına gölge katmanı', icon: 'mdi:layers' }, { value: 'Canlı', label: 'Her değişiklikte önizleme', icon: 'mdi:eye' }, { value: '5', label: 'Hızlı hazır ayarlar', icon: 'mdi:star' }] },
64
+ { type: 'title', text: 'Gerçekçi derinlik için birden fazla gölge istifleyin', level: 3 },
65
+ { type: 'paragraph', html: 'Gerçek gölgeler nadiren tekdüze bulanıklıktır. Öğeye yakın sıkı bir gölgeyi daha yumuşak, daha geniş bir gölgeyle istiflemek doğal derinlik oluşturur. Katman eklemek için <strong>+</strong> kullanın.' },
66
+ { type: 'table', headers: ['Kontrol', 'CSS Değeri', 'Etki'], rows: [['Ofset X', '1. uzunluk', 'Yatay kaydırma.'], ['Ofset Y', '2. uzunluk', 'Dikey kaydırma.'], ['Bulanıklık', '3. uzunluk', 'Bulanıklık yarıçapı.'], ['Yayılma', '4. uzunluk', 'Gölgeyi büyütür veya küçültür.'], ['Renk & Opaklık', 'rgba()', 'Bağımsız opaklıklı gölge rengi.'], ['İç', 'inset', 'Öğe kenarının içinde gölge.']] },
67
+ { type: 'summary', title: 'Önerilen İş Akışı', items: ['Bir hazır ayarla başlayın.', 'Gerçekçi derinlik için katman ekleyin.', 'Yüzen kart efekti için negatif spread kullanın.', 'Oluşturulan CSS\'i kopyalayıp yapıştırın.'] },
68
+ ],
69
+ };
@@ -0,0 +1,69 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { CssBoxShadowGeneratorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'css-box-shadow-generator';
7
+ const title = 'CSS Box Shadow Generator';
8
+ const description = '通过实时预览、滑块、颜色选择器和预设,可视化设计分层CSS阴影。即时复制干净的纯CSS。';
9
+
10
+ const howTo = [
11
+ { name: '选择预设或从头开始', text: '从Card、Float、Inset、Glow或Layered预设中选择,或用滑块调整默认阴影。' },
12
+ { name: '添加并堆叠图层', text: '点击+添加图层(最多5个)。选择每个图层编辑其偏移、模糊、扩散、颜色和不透明度。' },
13
+ { name: '切换内阴影和背景', text: '勾选inset启用内阴影。更改预览背景颜色。' },
14
+ { name: '复制CSS', text: '当预览与设计匹配时,复制生成的CSS并粘贴到样式表中。' },
15
+ ];
16
+
17
+ const faq = [
18
+ { question: '可以在一个元素上使用多个阴影吗?', answer: '可以。CSS支持逗号分隔的box-shadow值。此工具可让您堆叠最多5个图层,每个图层有独立控件。' },
19
+ { question: '负的spread值有什么作用?', answer: '负spread在模糊之前将阴影向内收缩。适用于微妙的悬浮效果。' },
20
+ { question: 'inset选项有什么用途?', answer: 'inset阴影渲染在元素边框内部,创建凹陷外观。非常适合表单输入和按下的卡片。' },
21
+ { question: '生成的CSS有框架依赖吗?', answer: '没有。结果是纯原生CSS。可在任何使用标准CSS的项目中使用。' },
22
+ ];
23
+
24
+ const ui: CssBoxShadowGeneratorUI = {
25
+ offsetXLabel: 'X偏移',
26
+ offsetYLabel: 'Y偏移',
27
+ blurLabel: '模糊',
28
+ spreadLabel: '扩散',
29
+ opacityLabel: '不透明度',
30
+ insetLabel: '内阴影',
31
+ addLayer: '添加图层',
32
+ removeLayer: '删除图层',
33
+ resetAll: '重置',
34
+ codeTitle: '生成的CSS',
35
+ copyCode: '复制CSS',
36
+ copied: '已复制!',
37
+ previewLabel: '预览',
38
+ presetCard: 'Card',
39
+ presetFloat: 'Float',
40
+ presetInset: 'Inset',
41
+ presetGlow: 'Glow',
42
+ presetLayered: '图层',
43
+ presetsLabel: '预设',
44
+ layerPrefix: '图层',
45
+ bgColorLabel: '背景',
46
+ };
47
+
48
+ const faqSchema: WithContext<FAQPage> = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
49
+ const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: title, description, step: howTo.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })) };
50
+ const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'DeveloperApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' } };
51
+
52
+ export const content: ToolLocaleContent<CssBoxShadowGeneratorUI> = {
53
+ slug, title, description, ui,
54
+ faqTitle: 'CSS盒阴影生成器常见问题',
55
+ faq,
56
+ bibliographyTitle: 'CSS Box-Shadow 参考资料',
57
+ bibliography,
58
+ howTo,
59
+ schemas: [appSchema, faqSchema, howToSchema],
60
+ seo: [
61
+ { type: 'title', text: '可视化设计CSS阴影,无需猜测数值', level: 2 },
62
+ { type: 'paragraph', html: '手动调整<strong>box-shadow</strong>很繁琐。这个可视化生成器让您可以堆叠多个阴影,实时查看并复制生产就绪的CSS。' },
63
+ { type: 'stats', columns: 3, items: [{ value: '5', label: '每个元素的阴影图层', icon: 'mdi:layers' }, { value: '实时', label: '每次更改时预览更新', icon: 'mdi:eye' }, { value: '5', label: '快速预设', icon: 'mdi:star' }] },
64
+ { type: 'title', text: '堆叠多个阴影实现逼真深度', level: 3 },
65
+ { type: 'paragraph', html: '真实阴影很少是均匀模糊的。将紧贴元素的紧密阴影与更柔和、更宽的阴影堆叠在一起,创造自然深度。使用<strong>+</strong>添加图层。' },
66
+ { type: 'table', headers: ['控件', 'CSS值', '效果'], rows: [['X偏移', '第一个长度', '水平位移。'], ['Y偏移', '第二个长度', '垂直位移。'], ['模糊', '第三个长度', '模糊半径。'], ['扩散', '第四个长度', '扩大或缩小阴影。'], ['颜色和不透明度', 'rgba()', '带独立不透明度的阴影颜色。'], ['内阴影', 'inset', '在元素边框内渲染阴影。']] },
67
+ { type: 'summary', title: '推荐工作流程', items: ['从预设开始。', '添加图层实现逼真深度。', '使用负spread实现悬浮卡片效果。', '复制生成的CSS并粘贴。'] },
68
+ ],
69
+ };
@@ -0,0 +1,9 @@
1
+ import type { ToolDefinition } from '../../types';
2
+ import { cssBoxShadowGenerator } from './entry';
3
+ export * from './entry';
4
+ export const CSS_BOX_SHADOW_GENERATOR_TOOL: ToolDefinition = {
5
+ entry: cssBoxShadowGenerator,
6
+ Component: () => import('./component.astro'),
7
+ SEOComponent: () => import('./seo.astro'),
8
+ BibliographyComponent: () => import('./bibliography.astro'),
9
+ };
@@ -0,0 +1,35 @@
1
+ export interface ShadowLayer {
2
+ offsetX: number;
3
+ offsetY: number;
4
+ blur: number;
5
+ spread: number;
6
+ color: string;
7
+ opacity: number;
8
+ inset: boolean;
9
+ }
10
+
11
+ export function buildShadowCss(layers: ShadowLayer[]): string {
12
+ if (layers.length === 0) return 'box-shadow: none;';
13
+
14
+ const parts = layers.map((l) => {
15
+ const rr = parseInt(l.color.slice(1, 3), 16) || 0;
16
+ const gg = parseInt(l.color.slice(3, 5), 16) || 0;
17
+ const bb = parseInt(l.color.slice(5, 7), 16) || 0;
18
+ const inset = l.inset ? 'inset ' : '';
19
+ return `${inset}${l.offsetX}px ${l.offsetY}px ${l.blur}px ${l.spread}px rgba(${rr}, ${gg}, ${bb}, ${l.opacity})`;
20
+ });
21
+
22
+ const value = parts.join(', ');
23
+ return `box-shadow: ${value};`;
24
+ }
25
+
26
+ export function buildShadowValue(layers: ShadowLayer[]): string {
27
+ const parts = layers.map((l) => {
28
+ const rr = parseInt(l.color.slice(1, 3), 16) || 0;
29
+ const gg = parseInt(l.color.slice(3, 5), 16) || 0;
30
+ const bb = parseInt(l.color.slice(5, 7), 16) || 0;
31
+ const inset = l.inset ? 'inset ' : '';
32
+ return `${inset}${l.offsetX}px ${l.offsetY}px ${l.blur}px ${l.spread}px rgba(${rr}, ${gg}, ${bb}, ${l.opacity})`;
33
+ });
34
+ return parts.join(', ');
35
+ }
@@ -0,0 +1,15 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { cssBoxShadowGenerator } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await cssBoxShadowGenerator.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -0,0 +1,23 @@
1
+ export interface CssBoxShadowGeneratorUI extends Record<string, string> {
2
+ offsetXLabel: string;
3
+ offsetYLabel: string;
4
+ blurLabel: string;
5
+ spreadLabel: string;
6
+ opacityLabel: string;
7
+ insetLabel: string;
8
+ addLayer: string;
9
+ removeLayer: string;
10
+ resetAll: string;
11
+ codeTitle: string;
12
+ copyCode: string;
13
+ copied: string;
14
+ previewLabel: string;
15
+ presetCard: string;
16
+ presetFloat: string;
17
+ presetInset: string;
18
+ presetGlow: string;
19
+ presetLayered: string;
20
+ presetsLabel: string;
21
+ layerPrefix: string;
22
+ bgColorLabel: string;
23
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import { visualCssGridFlexboxGenerator } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const content = await visualCssGridFlexboxGenerator.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SharedBibliography links={content.bibliography} />}
@@ -0,0 +1,20 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: 'MDN Web Docs: Basic concepts of flexbox',
6
+ url: 'https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_flexible_box_layout/Basic_concepts_of_flexbox',
7
+ },
8
+ {
9
+ name: 'MDN Web Docs: Basic concepts of grid layout',
10
+ url: 'https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout/Basic_concepts_of_grid_layout',
11
+ },
12
+ {
13
+ name: 'CSS-Tricks: A Complete Guide to Flexbox',
14
+ url: 'https://css-tricks.com/snippets/css/a-guide-to-flexbox/',
15
+ },
16
+ {
17
+ name: 'CSS-Tricks: A Complete Guide to CSS Grid',
18
+ url: 'https://css-tricks.com/snippets/css/complete-guide-grid/',
19
+ },
20
+ ];