@jjlmoya/utils-developer 1.18.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.
- package/package.json +1 -1
- package/src/entries.ts +4 -1
- package/src/index.ts +1 -0
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/cssBoxShadowGenerator/bibliography.astro +14 -0
- package/src/tool/cssBoxShadowGenerator/bibliography.ts +14 -0
- package/src/tool/cssBoxShadowGenerator/box-shadow-generator.css +376 -0
- package/src/tool/cssBoxShadowGenerator/component.astro +234 -0
- package/src/tool/cssBoxShadowGenerator/entry.ts +29 -0
- package/src/tool/cssBoxShadowGenerator/i18n/de.ts +69 -0
- package/src/tool/cssBoxShadowGenerator/i18n/en.ts +71 -0
- package/src/tool/cssBoxShadowGenerator/i18n/es.ts +69 -0
- package/src/tool/cssBoxShadowGenerator/i18n/fr.ts +69 -0
- package/src/tool/cssBoxShadowGenerator/i18n/id.ts +69 -0
- package/src/tool/cssBoxShadowGenerator/i18n/it.ts +69 -0
- package/src/tool/cssBoxShadowGenerator/i18n/ja.ts +69 -0
- package/src/tool/cssBoxShadowGenerator/i18n/ko.ts +69 -0
- package/src/tool/cssBoxShadowGenerator/i18n/nl.ts +69 -0
- package/src/tool/cssBoxShadowGenerator/i18n/pl.ts +69 -0
- package/src/tool/cssBoxShadowGenerator/i18n/pt.ts +69 -0
- package/src/tool/cssBoxShadowGenerator/i18n/ru.ts +69 -0
- package/src/tool/cssBoxShadowGenerator/i18n/sv.ts +69 -0
- package/src/tool/cssBoxShadowGenerator/i18n/tr.ts +69 -0
- package/src/tool/cssBoxShadowGenerator/i18n/zh.ts +69 -0
- package/src/tool/cssBoxShadowGenerator/index.ts +9 -0
- package/src/tool/cssBoxShadowGenerator/logic.ts +35 -0
- package/src/tool/cssBoxShadowGenerator/seo.astro +15 -0
- package/src/tool/cssBoxShadowGenerator/ui.ts +23 -0
- package/src/tools.ts +2 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { DeveloperToolEntry, ToolLocaleContent } from '../../types';
|
|
2
|
+
import type { CssBoxShadowGeneratorUI } from './ui';
|
|
3
|
+
|
|
4
|
+
export type CssBoxShadowGeneratorLocaleContent = ToolLocaleContent<CssBoxShadowGeneratorUI>;
|
|
5
|
+
|
|
6
|
+
export const cssBoxShadowGenerator: DeveloperToolEntry<CssBoxShadowGeneratorUI> = {
|
|
7
|
+
id: 'css-box-shadow-generator',
|
|
8
|
+
icons: {
|
|
9
|
+
bg: 'mdi:cube-outline',
|
|
10
|
+
fg: 'mdi:blur',
|
|
11
|
+
},
|
|
12
|
+
i18n: {
|
|
13
|
+
de: async () => (await import('./i18n/de')).content,
|
|
14
|
+
en: async () => (await import('./i18n/en')).content,
|
|
15
|
+
es: async () => (await import('./i18n/es')).content,
|
|
16
|
+
fr: async () => (await import('./i18n/fr')).content,
|
|
17
|
+
id: async () => (await import('./i18n/id')).content,
|
|
18
|
+
it: async () => (await import('./i18n/it')).content,
|
|
19
|
+
ja: async () => (await import('./i18n/ja')).content,
|
|
20
|
+
ko: async () => (await import('./i18n/ko')).content,
|
|
21
|
+
nl: async () => (await import('./i18n/nl')).content,
|
|
22
|
+
pl: async () => (await import('./i18n/pl')).content,
|
|
23
|
+
pt: async () => (await import('./i18n/pt')).content,
|
|
24
|
+
ru: async () => (await import('./i18n/ru')).content,
|
|
25
|
+
sv: async () => (await import('./i18n/sv')).content,
|
|
26
|
+
tr: async () => (await import('./i18n/tr')).content,
|
|
27
|
+
zh: async () => (await import('./i18n/zh')).content,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
@@ -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-boxschatten-generator';
|
|
7
|
+
const title = 'CSS Box Shadow Generator';
|
|
8
|
+
const description = 'Gestalte geschichtete CSS-Schatten visuell mit Live-Vorschau, Schiebereglern, Farbwählern und Presets. Kopiere sauberes natives CSS sofort.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{ name: 'Preset wählen oder von Grund auf starten', text: 'Wähle aus den Presets Card, Float, Inset, Glow oder Layered, oder passe den Standardschatten mit den Reglern an.' },
|
|
12
|
+
{ name: 'Schattenebenen hinzufügen und stapeln', text: 'Klicke + für weitere Ebenen (bis zu 5). Wähle jede Ebene aus, um Offset, Blur, Spread, Farbe und Deckkraft zu bearbeiten.' },
|
|
13
|
+
{ name: 'Inset und Hintergrund umschalten', text: 'Aktiviere die Inset-Checkbox für innere Schatten. Ändere die Hintergrundfarbe der Vorschau.' },
|
|
14
|
+
{ name: 'CSS kopieren', text: 'Wenn die Vorschau deinem Design entspricht, kopiere das generierte CSS und füge es in dein Stylesheet ein.' },
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
const faq = [
|
|
18
|
+
{ question: 'Kann ich mehrere Schatten auf ein Element anwenden?', answer: 'Ja. CSS erlaubt kommagetrennte box-shadow-Werte. Dieses Tool lässt dich bis zu 5 Ebenen stapeln, jede mit unabhängigen Steuerelementen.' },
|
|
19
|
+
{ question: 'Was bewirkt ein negativer Spread-Wert?', answer: 'Ein negativer Spread verkleinert den Schatten nach innen vor dem Weichzeichnen. Nützlich für subtile schwebende Effekte.' },
|
|
20
|
+
{ question: 'Wofür ist die Inset-Option?', answer: 'Inset-Schatten werden innerhalb des Elementrands gerendert und erzeugen einen vertieften Look. Ideal für Formulareingaben und gedrückte Karten.' },
|
|
21
|
+
{ question: 'Hat das generierte CSS Framework-Abhängigkeiten?', answer: 'Nein. Das Ergebnis ist reines natives CSS. Verwende es in jedem Projekt mit Standard-CSS.' },
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const ui: CssBoxShadowGeneratorUI = {
|
|
25
|
+
offsetXLabel: 'Offset X',
|
|
26
|
+
offsetYLabel: 'Offset Y',
|
|
27
|
+
blurLabel: 'Weichzeichner',
|
|
28
|
+
spreadLabel: 'Ausbreitung',
|
|
29
|
+
opacityLabel: 'Deckkraft',
|
|
30
|
+
insetLabel: 'Innen',
|
|
31
|
+
addLayer: 'Ebene hinzu',
|
|
32
|
+
removeLayer: 'Ebene entfernen',
|
|
33
|
+
resetAll: 'Zurücksetzen',
|
|
34
|
+
codeTitle: 'Generiertes CSS',
|
|
35
|
+
copyCode: 'CSS kopieren',
|
|
36
|
+
copied: 'Kopiert!',
|
|
37
|
+
previewLabel: 'Vorschau',
|
|
38
|
+
presetCard: 'Card',
|
|
39
|
+
presetFloat: 'Float',
|
|
40
|
+
presetInset: 'Inset',
|
|
41
|
+
presetGlow: 'Glow',
|
|
42
|
+
presetLayered: 'Ebenen',
|
|
43
|
+
presetsLabel: 'Presets',
|
|
44
|
+
layerPrefix: 'Ebene',
|
|
45
|
+
bgColorLabel: 'Hintergrund',
|
|
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 Referenzen',
|
|
57
|
+
bibliography,
|
|
58
|
+
howTo,
|
|
59
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
60
|
+
seo: [
|
|
61
|
+
{ type: 'title', text: 'Gestalte CSS-Schatten visuell statt Werte zu raten', level: 2 },
|
|
62
|
+
{ type: 'paragraph', html: '<strong>box-shadow</strong> von Hand anzupassen ist mühsam. Offset X, Offset Y, Blur, Spread, Farbe, Deckkraft und Inset interagieren subtil. Dieser Generator lässt dich mehrere Schatten stapeln, live ansehen und produktionsreifes CSS kopieren.' },
|
|
63
|
+
{ type: 'stats', columns: 3, items: [{ value: '5', label: 'Schattenebenen pro Element', icon: 'mdi:layers' }, { value: 'Live', label: 'Vorschau bei jeder Änderung', icon: 'mdi:eye' }, { value: '5', label: 'Schnellstart-Presets', icon: 'mdi:star' }] },
|
|
64
|
+
{ type: 'title', text: 'Mehrere Schatten für realistische Tiefe stapeln', level: 3 },
|
|
65
|
+
{ type: 'paragraph', html: 'Echte Schatten sind selten ein einheitlicher Blur. Einen engen Schatten nah am Element mit einem weicheren, breiteren zu stapeln erzeugt natürliche Tiefe. Nutze <strong>+</strong> zum Hinzufügen.' },
|
|
66
|
+
{ type: 'table', headers: ['Steuerung', 'CSS-Wert', 'Effekt'], rows: [['Offset X', 'Erste Länge', 'Horizontale Verschiebung.'], ['Offset Y', 'Zweite Länge', 'Vertikale Verschiebung.'], ['Weichzeichner', 'Dritte Länge', 'Blur-Radius. Größer = weicher.'], ['Ausbreitung', 'Vierte Länge', 'Vergrößert oder verkleinert den Schatten.'], ['Farbe & Deckkraft', 'rgba()', 'Schattenfarbe mit unabhängiger Deckkraft.'], ['Innen', 'inset', 'Rendert den Schatten innerhalb des Elements.']] },
|
|
67
|
+
{ type: 'summary', title: 'Empfohlener Workflow', items: ['Starte mit einem Preset.', 'Füge Ebenen für realistische Tiefe hinzu.', 'Nutze negativen Spread für schwebende Karten.', 'Kopiere das CSS und füge es ein.'] },
|
|
68
|
+
],
|
|
69
|
+
};
|
|
@@ -0,0 +1,71 @@
|
|
|
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 = 'Design layered CSS box shadows visually with live preview, sliders, color pickers and presets. Copy clean native CSS instantly.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{ name: 'Pick a preset or start from scratch', text: 'Choose from card, float, inset, glow, or layered presets, or adjust the default shadow with the sliders.' },
|
|
12
|
+
{ name: 'Add and layer shadows', text: 'Click + to add more shadow layers (up to 5). Select each layer to edit its offset, blur, spread, color and opacity independently.' },
|
|
13
|
+
{ name: 'Toggle inset and background', text: 'Enable the inset checkbox for inner shadows. Change the preview background color to match your design.' },
|
|
14
|
+
{ name: 'Copy the CSS', text: 'When the preview matches your design, copy the generated box-shadow CSS and paste it into your stylesheet.' },
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
const faq = [
|
|
18
|
+
{ question: 'Can I use multiple shadows on one element?', answer: 'Yes. CSS supports comma-separated box-shadow values. This tool lets you stack up to 5 layers, each with independent controls. Select a layer tab to edit it.' },
|
|
19
|
+
{ question: 'What does a negative spread value do?', answer: 'A negative spread shrinks the shadow inward before blurring, making it appear smaller than the element. This is useful for subtle floating effects where the shadow sits close to the edges.' },
|
|
20
|
+
{ question: 'Why use the inset option?', answer: 'Inset shadows render inside the element border, creating a pressed or recessed look. They are ideal for form inputs, sunken cards, and depth illusions on flat surfaces.' },
|
|
21
|
+
{ question: 'Is the generated CSS framework-independent?', answer: 'Yes. The output is pure native CSS box-shadow syntax. Use it in any project that supports standard CSS.' },
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const ui: CssBoxShadowGeneratorUI = {
|
|
25
|
+
offsetXLabel: 'Offset X',
|
|
26
|
+
offsetYLabel: 'Offset Y',
|
|
27
|
+
blurLabel: 'Blur',
|
|
28
|
+
spreadLabel: 'Spread',
|
|
29
|
+
opacityLabel: 'Opacity',
|
|
30
|
+
insetLabel: 'Color & Inset',
|
|
31
|
+
addLayer: 'Add layer',
|
|
32
|
+
removeLayer: 'Remove layer',
|
|
33
|
+
resetAll: 'Reset',
|
|
34
|
+
codeTitle: 'Generated CSS',
|
|
35
|
+
copyCode: 'Copy CSS',
|
|
36
|
+
copied: 'Copied!',
|
|
37
|
+
previewLabel: 'Layers',
|
|
38
|
+
presetCard: 'Card',
|
|
39
|
+
presetFloat: 'Float',
|
|
40
|
+
presetInset: 'Inset',
|
|
41
|
+
presetGlow: 'Glow',
|
|
42
|
+
presetLayered: 'Layered',
|
|
43
|
+
presetsLabel: 'Presets',
|
|
44
|
+
layerPrefix: 'Layer',
|
|
45
|
+
bgColorLabel: 'BG Color',
|
|
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 References',
|
|
57
|
+
bibliography,
|
|
58
|
+
howTo,
|
|
59
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
60
|
+
seo: [
|
|
61
|
+
{ type: 'title', text: 'Design box shadows visually instead of guessing values', level: 2 },
|
|
62
|
+
{ type: 'paragraph', html: 'Tweaking <strong>box-shadow</strong> by hand is tedious. Offset X, offset Y, blur radius, spread radius, color, opacity and inset all interact in subtle ways. This visual generator lets you stack multiple shadows, preview them live, and copy production-ready CSS.' },
|
|
63
|
+
{ type: 'stats', columns: 3, items: [{ value: '5', label: 'Shadow layers per element', icon: 'mdi:layers' }, { value: 'Live', label: 'Preview updates on every slider move', icon: 'mdi:eye' }, { value: '5', label: 'Quick-start presets', icon: 'mdi:star' }] },
|
|
64
|
+
{ type: 'title', text: 'Layer multiple shadows for realistic depth', level: 3 },
|
|
65
|
+
{ type: 'paragraph', html: 'Real-world shadows are rarely a single uniform blur. Layering a tight shadow close to the element with a softer, wider shadow farther away creates natural depth. Use the <strong>+</strong> button to add layers and the layer tabs to switch between them.' },
|
|
66
|
+
{ type: 'title', text: 'Understanding each control', level: 3 },
|
|
67
|
+
{ type: 'table', headers: ['Control', 'CSS value', 'Effect'], rows: [['Offset X', 'First length', 'Horizontal displacement. Positive moves shadow right.'], ['Offset Y', 'Second length', 'Vertical displacement. Positive moves shadow down.'], ['Blur', 'Third length', 'Blur radius. Larger creates softer, wider shadows.'], ['Spread', 'Fourth length', 'Expands or shrinks the shadow. Negative shrinks.'], ['Color & Opacity', 'rgba()', 'Shadow color with independent opacity control.'], ['Inset', 'inset keyword', 'Renders the shadow inside the element border.']] },
|
|
68
|
+
{ type: 'tip', title: 'Use a subtle background grid', html: 'The preview area shows a dotted grid so you can see how shadows extend beyond the element. Use negative spread values for shadows that sit tighter than the element itself.' },
|
|
69
|
+
{ type: 'summary', title: 'Best practice workflow', items: ['Start with a preset that matches your design direction.', 'Add layers to build realistic depth (tight shadow + soft shadow + ambient).', 'Use a negative spread on the soft shadow for a floating card effect.', 'Copy the generated CSS and paste it into your stylesheet.'] },
|
|
70
|
+
],
|
|
71
|
+
};
|
|
@@ -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 = 'generador-sombras-css';
|
|
7
|
+
const title = 'CSS Box Shadow Generator';
|
|
8
|
+
const description = 'Diseña sombras CSS por capas visualmente con previsualización en vivo, sliders, selectores de color y presets. Copia CSS nativo limpio al instante.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{ name: 'Elige un preset o empieza desde cero', text: 'Selecciona entre los presets Card, Float, Inset, Glow o Layered, o ajusta la sombra por defecto con los sliders.' },
|
|
12
|
+
{ name: 'Añade y combina capas de sombra', text: 'Pulsa + para añadir más capas (hasta 5). Selecciona cada capa para editar su offset, blur, spread, color y opacidad.' },
|
|
13
|
+
{ name: 'Alterna inset y color de fondo', text: 'Activa el checkbox inset para sombras interiores. Cambia el color de fondo de la previsualización.' },
|
|
14
|
+
{ name: 'Copia el CSS', text: 'Cuando la previsualización coincida con tu diseño, copia el CSS generado y pégalo en tu stylesheet.' },
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
const faq = [
|
|
18
|
+
{ question: '¿Puedo usar múltiples sombras en un elemento?', answer: 'Sí. CSS permite valores box-shadow separados por comas. Esta herramienta te deja apilar hasta 5 capas, cada una con controles independientes.' },
|
|
19
|
+
{ question: '¿Qué hace un valor de spread negativo?', answer: 'Un spread negativo encoge la sombra hacia dentro antes de difuminar, haciendo que parezca más pequeña que el elemento. Ideal para efectos flotantes sutiles.' },
|
|
20
|
+
{ question: '¿Para qué sirve la opción inset?', answer: 'Las sombras inset se renderizan dentro del borde del elemento, creando un efecto hundido. Son ideales para inputs de formulario y tarjetas presionadas.' },
|
|
21
|
+
{ question: '¿El CSS generado tiene dependencias de framework?', answer: 'No. El resultado es CSS nativo puro. Úsalo en cualquier proyecto que soporte CSS estándar.' },
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const ui: CssBoxShadowGeneratorUI = {
|
|
25
|
+
offsetXLabel: 'Offset X',
|
|
26
|
+
offsetYLabel: 'Offset Y',
|
|
27
|
+
blurLabel: 'Desenfoque',
|
|
28
|
+
spreadLabel: 'Expansión',
|
|
29
|
+
opacityLabel: 'Opacidad',
|
|
30
|
+
insetLabel: 'Interior',
|
|
31
|
+
addLayer: 'Añadir capa',
|
|
32
|
+
removeLayer: 'Quitar capa',
|
|
33
|
+
resetAll: 'Restablecer',
|
|
34
|
+
codeTitle: 'CSS Generado',
|
|
35
|
+
copyCode: 'Copiar CSS',
|
|
36
|
+
copied: '¡Copiado!',
|
|
37
|
+
previewLabel: 'Previsualización',
|
|
38
|
+
presetCard: 'Card',
|
|
39
|
+
presetFloat: 'Float',
|
|
40
|
+
presetInset: 'Inset',
|
|
41
|
+
presetGlow: 'Glow',
|
|
42
|
+
presetLayered: 'Capas',
|
|
43
|
+
presetsLabel: 'Presets',
|
|
44
|
+
layerPrefix: 'Capa',
|
|
45
|
+
bgColorLabel: 'Fondo',
|
|
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 del Generador de Sombras CSS',
|
|
55
|
+
faq,
|
|
56
|
+
bibliographyTitle: 'Referencias de Box Shadow CSS',
|
|
57
|
+
bibliography,
|
|
58
|
+
howTo,
|
|
59
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
60
|
+
seo: [
|
|
61
|
+
{ type: 'title', text: 'Diseña sombras CSS visualmente en vez de adivinar valores', level: 2 },
|
|
62
|
+
{ type: 'paragraph', html: 'Ajustar <strong>box-shadow</strong> a mano es tedioso. Offset X, offset Y, blur, spread, color, opacidad e inset interactúan de formas sutiles. Este generador visual te permite apilar múltiples sombras, previsualizarlas en vivo y copiar CSS listo para producción.' },
|
|
63
|
+
{ type: 'stats', columns: 3, items: [{ value: '5', label: 'Capas de sombra por elemento', icon: 'mdi:layers' }, { value: 'En vivo', label: 'Previsualización con cada cambio', icon: 'mdi:eye' }, { value: '5', label: 'Presets rápidos', icon: 'mdi:star' }] },
|
|
64
|
+
{ type: 'title', text: 'Apila múltiples sombras para profundidad realista', level: 3 },
|
|
65
|
+
{ type: 'paragraph', html: 'Las sombras del mundo real rara vez son un blur uniforme. Apilar una sombra ajustada cerca del elemento con otra más suave y amplia crea profundidad natural. Usa el botón <strong>+</strong> para añadir capas y las pestañas para cambiar entre ellas.' },
|
|
66
|
+
{ type: 'table', headers: ['Control', 'Valor CSS', 'Efecto'], rows: [['Offset X', 'Primera longitud', 'Desplazamiento horizontal. Positivo mueve la sombra a la derecha.'], ['Offset Y', 'Segunda longitud', 'Desplazamiento vertical. Positivo mueve la sombra hacia abajo.'], ['Desenfoque', 'Tercera longitud', 'Radio de blur. Más grande crea sombras más suaves.'], ['Expansión', 'Cuarta longitud', 'Expande o encoge la sombra. Negativo encoge.'], ['Color y Opacidad', 'rgba()', 'Color de sombra con control de opacidad independiente.'], ['Interior', 'inset', 'Renderiza la sombra dentro del borde del elemento.']] },
|
|
67
|
+
{ type: 'summary', title: 'Flujo de trabajo recomendado', items: ['Empieza con un preset que coincida con tu dirección de diseño.', 'Añade capas para construir profundidad realista.', 'Usa spread negativo en la sombra suave para un efecto de tarjeta flotante.', 'Copia el CSS generado y pégalo en tu stylesheet.'] },
|
|
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 = 'generateur-ombres-css';
|
|
7
|
+
const title = 'CSS Box Shadow Generator';
|
|
8
|
+
const description = 'Concevez des ombres CSS en couches visuellement avec aperçu en direct, curseurs, sélecteurs de couleur et presets. Copiez du CSS natif propre instantanément.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{ name: 'Choisissez un preset ou partez de zéro', text: 'Sélectionnez parmi les presets Card, Float, Inset, Glow ou Layered, ou ajustez l\'ombre par défaut avec les curseurs.' },
|
|
12
|
+
{ name: 'Ajoutez et superposez des couches', text: 'Cliquez + pour ajouter des couches (jusqu\'à 5). Sélectionnez chaque couche pour modifier son offset, blur, spread, couleur et opacité.' },
|
|
13
|
+
{ name: 'Activez inset et changez l\'arrière-plan', text: 'Cochez inset pour les ombres intérieures. Modifiez la couleur de fond de l\'aperçu.' },
|
|
14
|
+
{ name: 'Copiez le CSS', text: 'Quand l\'aperçu correspond à votre design, copiez le CSS généré et collez-le dans votre feuille de style.' },
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
const faq = [
|
|
18
|
+
{ question: 'Puis-je utiliser plusieurs ombres sur un élément ?', answer: 'Oui. CSS permet des valeurs box-shadow séparées par des virgules. Cet outil vous permet d\'empiler jusqu\'à 5 couches avec des contrôles indépendants.' },
|
|
19
|
+
{ question: 'Que fait une valeur de spread négative ?', answer: 'Un spread négatif rétrécit l\'ombre vers l\'intérieur avant le flou. Utile pour des effets flottants subtils.' },
|
|
20
|
+
{ question: 'À quoi sert l\'option inset ?', answer: 'Les ombres inset sont rendues à l\'intérieur de la bordure, créant un effet enfoncé. Idéal pour les champs de formulaire et les cartes pressées.' },
|
|
21
|
+
{ question: 'Le CSS généré a-t-il des dépendances de framework ?', answer: 'Non. Le résultat est du CSS natif pur. Utilisez-le dans tout projet avec du CSS standard.' },
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const ui: CssBoxShadowGeneratorUI = {
|
|
25
|
+
offsetXLabel: 'Offset X',
|
|
26
|
+
offsetYLabel: 'Offset Y',
|
|
27
|
+
blurLabel: 'Flou',
|
|
28
|
+
spreadLabel: 'Expansion',
|
|
29
|
+
opacityLabel: 'Opacité',
|
|
30
|
+
insetLabel: 'Intérieur',
|
|
31
|
+
addLayer: 'Ajouter couche',
|
|
32
|
+
removeLayer: 'Retirer couche',
|
|
33
|
+
resetAll: 'Réinitialiser',
|
|
34
|
+
codeTitle: 'CSS Généré',
|
|
35
|
+
copyCode: 'Copier CSS',
|
|
36
|
+
copied: 'Copié !',
|
|
37
|
+
previewLabel: 'Aperçu',
|
|
38
|
+
presetCard: 'Card',
|
|
39
|
+
presetFloat: 'Float',
|
|
40
|
+
presetInset: 'Inset',
|
|
41
|
+
presetGlow: 'Glow',
|
|
42
|
+
presetLayered: 'Couches',
|
|
43
|
+
presetsLabel: 'Presets',
|
|
44
|
+
layerPrefix: 'Couche',
|
|
45
|
+
bgColorLabel: 'Fond',
|
|
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 du Générateur d\'Ombres CSS',
|
|
55
|
+
faq,
|
|
56
|
+
bibliographyTitle: 'Références Box Shadow CSS',
|
|
57
|
+
bibliography,
|
|
58
|
+
howTo,
|
|
59
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
60
|
+
seo: [
|
|
61
|
+
{ type: 'title', text: 'Concevez des ombres CSS visuellement au lieu de deviner les valeurs', level: 2 },
|
|
62
|
+
{ type: 'paragraph', html: 'Ajuster <strong>box-shadow</strong> à la main est fastidieux. Ce générateur visuel vous permet d\'empiler plusieurs ombres, de les prévisualiser en direct et de copier du CSS prêt pour la production.' },
|
|
63
|
+
{ type: 'stats', columns: 3, items: [{ value: '5', label: 'Couches d\'ombre par élément', icon: 'mdi:layers' }, { value: 'Direct', label: 'Aperçu à chaque modification', icon: 'mdi:eye' }, { value: '5', label: 'Presets rapides', icon: 'mdi:star' }] },
|
|
64
|
+
{ type: 'title', text: 'Superposez plusieurs ombres pour une profondeur réaliste', level: 3 },
|
|
65
|
+
{ type: 'paragraph', html: 'Les ombres réelles sont rarement un flou uniforme. Superposer une ombre serrée près de l\'élément avec une ombre plus douce et large crée une profondeur naturelle. Utilisez <strong>+</strong> pour ajouter des couches.' },
|
|
66
|
+
{ type: 'table', headers: ['Contrôle', 'Valeur CSS', 'Effet'], rows: [['Offset X', '1re longueur', 'Déplacement horizontal.'], ['Offset Y', '2e longueur', 'Déplacement vertical.'], ['Flou', '3e longueur', 'Rayon de flou.'], ['Expansion', '4e longueur', 'Agrandit ou réduit l\'ombre.'], ['Couleur & Opacité', 'rgba()', 'Couleur avec opacité indépendante.'], ['Intérieur', 'inset', 'Ombre à l\'intérieur de l\'élément.']] },
|
|
67
|
+
{ type: 'summary', title: 'Workflow recommandé', items: ['Commencez par un preset.', 'Ajoutez des couches pour une profondeur réaliste.', 'Utilisez un spread négatif pour un effet de carte flottante.', 'Copiez le CSS généré et collez-le.'] },
|
|
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-bayangan-css';
|
|
7
|
+
const title = 'CSS Box Shadow Generator';
|
|
8
|
+
const description = 'Desain bayangan CSS berlapis secara visual dengan pratinjau langsung, slider, pemilih warna, dan preset. Salin CSS native bersih secara instan.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{ name: 'Pilih preset atau mulai dari awal', text: 'Pilih dari preset Card, Float, Inset, Glow, atau Layered, atau sesuaikan bayangan default dengan slider.' },
|
|
12
|
+
{ name: 'Tambahkan dan tumpuk lapisan', text: 'Klik + untuk menambah lapisan (hingga 5). Pilih setiap lapisan untuk mengedit offset, blur, spread, warna, dan opasitas.' },
|
|
13
|
+
{ name: 'Aktifkan inset dan ubah latar', text: 'Centang inset untuk bayangan dalam. Ubah warna latar pratinjau.' },
|
|
14
|
+
{ name: 'Salin CSS', text: 'Saat pratinjau sesuai dengan desain Anda, salin CSS yang dihasilkan dan tempel ke stylesheet Anda.' },
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
const faq = [
|
|
18
|
+
{ question: 'Bisakah saya menggunakan beberapa bayangan pada satu elemen?', answer: 'Ya. CSS mengizinkan nilai box-shadow yang dipisahkan koma. Alat ini memungkinkan Anda menumpuk hingga 5 lapisan dengan kontrol independen.' },
|
|
19
|
+
{ question: 'Apa yang dilakukan nilai spread negatif?', answer: 'Spread negatif mengecilkan bayangan ke dalam sebelum diburamkan. Berguna untuk efek mengambang yang halus.' },
|
|
20
|
+
{ question: 'Untuk apa opsi inset?', answer: 'Bayangan inset dirender di dalam batas elemen, menciptakan tampilan cekung. Ideal untuk input formulir dan kartu yang ditekan.' },
|
|
21
|
+
{ question: 'Apakah CSS yang dihasilkan memiliki ketergantungan framework?', answer: 'Tidak. Hasilnya adalah CSS native murni. Gunakan di proyek apa pun dengan CSS standar.' },
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const ui: CssBoxShadowGeneratorUI = {
|
|
25
|
+
offsetXLabel: 'Offset X',
|
|
26
|
+
offsetYLabel: 'Offset Y',
|
|
27
|
+
blurLabel: 'Blur',
|
|
28
|
+
spreadLabel: 'Sebaran',
|
|
29
|
+
opacityLabel: 'Opasitas',
|
|
30
|
+
insetLabel: 'Dalam',
|
|
31
|
+
addLayer: 'Tambah lapisan',
|
|
32
|
+
removeLayer: 'Hapus lapisan',
|
|
33
|
+
resetAll: 'Reset',
|
|
34
|
+
codeTitle: 'CSS Dihasilkan',
|
|
35
|
+
copyCode: 'Salin CSS',
|
|
36
|
+
copied: 'Tersalin!',
|
|
37
|
+
previewLabel: 'Pratinjau',
|
|
38
|
+
presetCard: 'Card',
|
|
39
|
+
presetFloat: 'Float',
|
|
40
|
+
presetInset: 'Inset',
|
|
41
|
+
presetGlow: 'Glow',
|
|
42
|
+
presetLayered: 'Lapisan',
|
|
43
|
+
presetsLabel: 'Preset',
|
|
44
|
+
layerPrefix: 'Lapisan',
|
|
45
|
+
bgColorLabel: 'Latar',
|
|
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 Generator Bayangan CSS',
|
|
55
|
+
faq,
|
|
56
|
+
bibliographyTitle: 'Referensi Box Shadow CSS',
|
|
57
|
+
bibliography,
|
|
58
|
+
howTo,
|
|
59
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
60
|
+
seo: [
|
|
61
|
+
{ type: 'title', text: 'Desain bayangan CSS secara visual daripada menebak nilai', level: 2 },
|
|
62
|
+
{ type: 'paragraph', html: 'Menyesuaikan <strong>box-shadow</strong> secara manual itu membosankan. Generator visual ini memungkinkan Anda menumpuk beberapa bayangan, melihatnya langsung, dan menyalin CSS siap produksi.' },
|
|
63
|
+
{ type: 'stats', columns: 3, items: [{ value: '5', label: 'Lapisan bayangan per elemen', icon: 'mdi:layers' }, { value: 'Live', label: 'Pratinjau setiap perubahan', icon: 'mdi:eye' }, { value: '5', label: 'Preset cepat', icon: 'mdi:star' }] },
|
|
64
|
+
{ type: 'title', text: 'Tumpuk beberapa bayangan untuk kedalaman realistis', level: 3 },
|
|
65
|
+
{ type: 'paragraph', html: 'Bayangan nyata jarang berupa blur seragam. Menumpuk bayangan ketat dekat elemen dengan yang lebih lembut dan lebar menciptakan kedalaman alami. Gunakan <strong>+</strong> untuk menambah lapisan.' },
|
|
66
|
+
{ type: 'table', headers: ['Kontrol', 'Nilai CSS', 'Efek'], rows: [['Offset X', 'Panjang ke-1', 'Pergeseran horizontal.'], ['Offset Y', 'Panjang ke-2', 'Pergeseran vertikal.'], ['Blur', 'Panjang ke-3', 'Radius blur.'], ['Sebaran', 'Panjang ke-4', 'Memperbesar atau mengecilkan bayangan.'], ['Warna & Opasitas', 'rgba()', 'Warna bayangan dengan opasitas independen.'], ['Dalam', 'inset', 'Bayangan di dalam batas elemen.']] },
|
|
67
|
+
{ type: 'summary', title: 'Alur kerja yang direkomendasikan', items: ['Mulai dengan preset.', 'Tambahkan lapisan untuk kedalaman realistis.', 'Gunakan spread negatif untuk efek kartu mengambang.', 'Salin CSS yang dihasilkan dan tempel.'] },
|
|
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 = 'generatore-ombre-css';
|
|
7
|
+
const title = 'CSS Box Shadow Generator';
|
|
8
|
+
const description = 'Progetta ombre CSS a strati visivamente con anteprima in tempo reale, slider, selettori di colore e preset. Copia CSS nativo pulito all\'istante.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{ name: 'Scegli un preset o parti da zero', text: 'Seleziona tra i preset Card, Float, Inset, Glow o Layered, o regola l\'ombra predefinita con gli slider.' },
|
|
12
|
+
{ name: 'Aggiungi e sovrapponi strati', text: 'Clicca + per aggiungere strati (fino a 5). Seleziona ogni strato per modificarne offset, blur, spread, colore e opacità.' },
|
|
13
|
+
{ name: 'Attiva inset e cambia lo sfondo', text: 'Spunta inset per ombre interne. Cambia il colore di sfondo dell\'anteprima.' },
|
|
14
|
+
{ name: 'Copia il CSS', text: 'Quando l\'anteprima corrisponde al tuo design, copia il CSS generato e incollalo nel tuo foglio di stile.' },
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
const faq = [
|
|
18
|
+
{ question: 'Posso usare più ombre su un elemento?', answer: 'Sì. CSS permette valori box-shadow separati da virgole. Questo strumento ti permette di impilare fino a 5 strati con controlli indipendenti.' },
|
|
19
|
+
{ question: 'Cosa fa un valore spread negativo?', answer: 'Uno spread negativo restringe l\'ombra verso l\'interno prima della sfocatura. Utile per effetti fluttuanti sottili.' },
|
|
20
|
+
{ question: 'A cosa serve l\'opzione inset?', answer: 'Le ombre inset vengono renderizzate all\'interno del bordo, creando un effetto incassato. Ideale per input e card premute.' },
|
|
21
|
+
{ question: 'Il CSS generato ha dipendenze da framework?', answer: 'No. Il risultato è CSS nativo puro. Usalo in qualsiasi progetto con CSS standard.' },
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const ui: CssBoxShadowGeneratorUI = {
|
|
25
|
+
offsetXLabel: 'Offset X',
|
|
26
|
+
offsetYLabel: 'Offset Y',
|
|
27
|
+
blurLabel: 'Sfocatura',
|
|
28
|
+
spreadLabel: 'Espansione',
|
|
29
|
+
opacityLabel: 'Opacità',
|
|
30
|
+
insetLabel: 'Interno',
|
|
31
|
+
addLayer: 'Aggiungi strato',
|
|
32
|
+
removeLayer: 'Rimuovi strato',
|
|
33
|
+
resetAll: 'Ripristina',
|
|
34
|
+
codeTitle: 'CSS Generato',
|
|
35
|
+
copyCode: 'Copia CSS',
|
|
36
|
+
copied: 'Copiato!',
|
|
37
|
+
previewLabel: 'Anteprima',
|
|
38
|
+
presetCard: 'Card',
|
|
39
|
+
presetFloat: 'Float',
|
|
40
|
+
presetInset: 'Inset',
|
|
41
|
+
presetGlow: 'Glow',
|
|
42
|
+
presetLayered: 'Strati',
|
|
43
|
+
presetsLabel: 'Preset',
|
|
44
|
+
layerPrefix: 'Strato',
|
|
45
|
+
bgColorLabel: 'Sfondo',
|
|
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 Generatore di Ombre CSS',
|
|
55
|
+
faq,
|
|
56
|
+
bibliographyTitle: 'Riferimenti Box Shadow CSS',
|
|
57
|
+
bibliography,
|
|
58
|
+
howTo,
|
|
59
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
60
|
+
seo: [
|
|
61
|
+
{ type: 'title', text: 'Progetta ombre CSS visivamente invece di indovinare i valori', level: 2 },
|
|
62
|
+
{ type: 'paragraph', html: 'Regolare <strong>box-shadow</strong> a mano è noioso. Questo generatore ti permette di impilare più ombre, vederle in diretta e copiare CSS pronto per la produzione.' },
|
|
63
|
+
{ type: 'stats', columns: 3, items: [{ value: '5', label: 'Strati ombra per elemento', icon: 'mdi:layers' }, { value: 'Live', label: 'Anteprima ad ogni modifica', icon: 'mdi:eye' }, { value: '5', label: 'Preset rapidi', icon: 'mdi:star' }] },
|
|
64
|
+
{ type: 'title', text: 'Sovrapponi più ombre per profondità realistica', level: 3 },
|
|
65
|
+
{ type: 'paragraph', html: 'Le ombre reali non sono mai un blur uniforme. Sovrapporre un\'ombra stretta vicino all\'elemento con una più morbida e ampia crea profondità naturale. Usa <strong>+</strong> per aggiungere strati.' },
|
|
66
|
+
{ type: 'table', headers: ['Controllo', 'Valore CSS', 'Effetto'], rows: [['Offset X', '1a lunghezza', 'Spostamento orizzontale.'], ['Offset Y', '2a lunghezza', 'Spostamento verticale.'], ['Sfocatura', '3a lunghezza', 'Raggio di blur.'], ['Espansione', '4a lunghezza', 'Allarga o restringe l\'ombra.'], ['Colore & Opacità', 'rgba()', 'Colore ombra con opacità indipendente.'], ['Interno', 'inset', 'Ombra dentro il bordo dell\'elemento.']] },
|
|
67
|
+
{ type: 'summary', title: 'Workflow consigliato', items: ['Inizia con un preset.', 'Aggiungi strati per profondità realistica.', 'Usa spread negativo per effetto card fluttuante.', 'Copia il CSS e incollalo.'] },
|
|
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: '1つの要素に複数の影を使えますか?', answer: 'はい。CSSはカンマ区切りのbox-shadow値をサポートしています。このツールでは独立したコントロールで最大5つのレイヤーを重ねられます。' },
|
|
19
|
+
{ question: '負のスプレッド値は何をしますか?', answer: '負のスプレッドはぼかしの前に影を内側に縮めます。微妙な浮遊効果に便利です。' },
|
|
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ボックスシャドウジェネレーター FAQ',
|
|
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', '1番目の長さ', '水平方向の変位。'], ['オフセットY', '2番目の長さ', '垂直方向の変位。'], ['ぼかし', '3番目の長さ', 'ぼかしの半径。'], ['スプレッド', '4番目の長さ', '影を拡大または縮小。'], ['色と不透明度', 'rgba()', '独立した不透明度の影の色。'], ['内側', 'inset', '要素の境界内に影を描画。']] },
|
|
67
|
+
{ type: 'summary', title: '推奨ワークフロー', items: ['プリセットから始める。', 'レイヤーを追加してリアルな奥行きを。', '浮遊カード効果には負のスプレッドを使用。', '生成された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-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: 'Inset 및 배경 전환', text: '내부 그림자를 위해 inset을 체크하세요. 미리보기 배경색을 변경하세요.' },
|
|
14
|
+
{ name: 'CSS 복사', text: '미리보기가 디자인과 일치하면 생성된 CSS를 복사하여 스타일시트에 붙여넣으세요.' },
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
const faq = [
|
|
18
|
+
{ question: '하나의 요소에 여러 그림자를 사용할 수 있나요?', answer: '예. CSS는 쉼표로 구분된 box-shadow 값을 지원합니다. 이 도구를 사용하면 독립적인 컨트롤로 최대 5개의 레이어를 쌓을 수 있습니다.' },
|
|
19
|
+
{ question: '음수 스프레드 값은 무엇을 하나요?', answer: '음수 스프레드는 블러 전에 그림자를 안쪽으로 축소합니다. 미묘한 떠 있는 효과에 유용합니다.' },
|
|
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 박스 섀도우 생성기 FAQ',
|
|
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: ['프리셋으로 시작하세요.', '현실적인 깊이를 위해 레이어를 추가하세요.', '떠 있는 카드 효과에 음수 스프레드를 사용하세요.', '생성된 CSS를 복사하여 붙여넣으세요.'] },
|
|
68
|
+
],
|
|
69
|
+
};
|