@jjlmoya/utils-diy 1.1.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 +60 -0
- package/src/category/i18n/en.ts +110 -0
- package/src/category/i18n/es.ts +110 -0
- package/src/category/i18n/fr.ts +101 -0
- package/src/category/index.ts +25 -0
- package/src/category/seo.astro +15 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +11 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +57 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +146 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +4 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/locale_completeness.test.ts +42 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/seo_length.test.ts +22 -0
- package/src/tests/title_quality.test.ts +55 -0
- package/src/tests/tool_validation.test.ts +17 -0
- package/src/tool/balusterCalculator/bibliography.astro +14 -0
- package/src/tool/balusterCalculator/component.astro +605 -0
- package/src/tool/balusterCalculator/i18n/en.ts +264 -0
- package/src/tool/balusterCalculator/i18n/es.ts +264 -0
- package/src/tool/balusterCalculator/i18n/fr.ts +264 -0
- package/src/tool/balusterCalculator/index.ts +33 -0
- package/src/tool/balusterCalculator/seo.astro +15 -0
- package/src/tool/balusterCalculator/ui.ts +15 -0
- package/src/tool/clayCalculator/bibliography.astro +14 -0
- package/src/tool/clayCalculator/component.astro +731 -0
- package/src/tool/clayCalculator/i18n/en.ts +183 -0
- package/src/tool/clayCalculator/i18n/es.ts +183 -0
- package/src/tool/clayCalculator/i18n/fr.ts +183 -0
- package/src/tool/clayCalculator/index.ts +33 -0
- package/src/tool/clayCalculator/seo.astro +15 -0
- package/src/tool/clayCalculator/ui.ts +19 -0
- package/src/tool/concreteCalculator/bibliography.astro +13 -0
- package/src/tool/concreteCalculator/component.astro +1089 -0
- package/src/tool/concreteCalculator/i18n/en.ts +201 -0
- package/src/tool/concreteCalculator/i18n/es.ts +201 -0
- package/src/tool/concreteCalculator/i18n/fr.ts +201 -0
- package/src/tool/concreteCalculator/index.ts +28 -0
- package/src/tool/concreteCalculator/seo.astro +14 -0
- package/src/tool/concreteCalculator/ui.ts +35 -0
- package/src/tool/cutOptimizer/bibliography.astro +13 -0
- package/src/tool/cutOptimizer/component.astro +825 -0
- package/src/tool/cutOptimizer/i18n/en.ts +178 -0
- package/src/tool/cutOptimizer/i18n/es.ts +178 -0
- package/src/tool/cutOptimizer/i18n/fr.ts +178 -0
- package/src/tool/cutOptimizer/index.ts +28 -0
- package/src/tool/cutOptimizer/optimizer.ts +199 -0
- package/src/tool/cutOptimizer/seo.astro +14 -0
- package/src/tool/cutOptimizer/ui.ts +25 -0
- package/src/tool/drillCalculator/bibliography.astro +13 -0
- package/src/tool/drillCalculator/component.astro +1210 -0
- package/src/tool/drillCalculator/engine.ts +63 -0
- package/src/tool/drillCalculator/i18n/en.ts +137 -0
- package/src/tool/drillCalculator/i18n/es.ts +137 -0
- package/src/tool/drillCalculator/i18n/fr.ts +137 -0
- package/src/tool/drillCalculator/index.ts +28 -0
- package/src/tool/drillCalculator/seo.astro +14 -0
- package/src/tool/drillCalculator/ui.ts +41 -0
- package/src/tool/drillSharpener/bibliography.astro +13 -0
- package/src/tool/drillSharpener/component.astro +712 -0
- package/src/tool/drillSharpener/engine.ts +42 -0
- package/src/tool/drillSharpener/i18n/en.ts +121 -0
- package/src/tool/drillSharpener/i18n/es.ts +121 -0
- package/src/tool/drillSharpener/i18n/fr.ts +121 -0
- package/src/tool/drillSharpener/index.ts +31 -0
- package/src/tool/drillSharpener/seo.astro +14 -0
- package/src/tool/drillSharpener/ui.ts +53 -0
- package/src/tool/epoxyCalculator/bibliography.astro +14 -0
- package/src/tool/epoxyCalculator/component.astro +888 -0
- package/src/tool/epoxyCalculator/i18n/en.ts +195 -0
- package/src/tool/epoxyCalculator/i18n/es.ts +195 -0
- package/src/tool/epoxyCalculator/i18n/fr.ts +195 -0
- package/src/tool/epoxyCalculator/index.ts +33 -0
- package/src/tool/epoxyCalculator/seo.astro +15 -0
- package/src/tool/epoxyCalculator/ui.ts +22 -0
- package/src/tool/furnitureFit/bibliography.astro +13 -0
- package/src/tool/furnitureFit/component.astro +552 -0
- package/src/tool/furnitureFit/engine.ts +51 -0
- package/src/tool/furnitureFit/i18n/en.ts +152 -0
- package/src/tool/furnitureFit/i18n/es.ts +152 -0
- package/src/tool/furnitureFit/i18n/fr.ts +152 -0
- package/src/tool/furnitureFit/index.ts +28 -0
- package/src/tool/furnitureFit/seo.astro +14 -0
- package/src/tool/furnitureFit/ui.ts +21 -0
- package/src/tool/mortarCalculator/bibliography.astro +13 -0
- package/src/tool/mortarCalculator/component.astro +1139 -0
- package/src/tool/mortarCalculator/i18n/en.ts +219 -0
- package/src/tool/mortarCalculator/i18n/es.ts +205 -0
- package/src/tool/mortarCalculator/i18n/fr.ts +220 -0
- package/src/tool/mortarCalculator/index.ts +24 -0
- package/src/tool/mortarCalculator/seo.astro +14 -0
- package/src/tool/mortarCalculator/ui.ts +37 -0
- package/src/tool/passepartoutCalculator/bibliography.astro +13 -0
- package/src/tool/passepartoutCalculator/component.astro +741 -0
- package/src/tool/passepartoutCalculator/i18n/en.ts +178 -0
- package/src/tool/passepartoutCalculator/i18n/es.ts +178 -0
- package/src/tool/passepartoutCalculator/i18n/fr.ts +178 -0
- package/src/tool/passepartoutCalculator/index.ts +28 -0
- package/src/tool/passepartoutCalculator/seo.astro +14 -0
- package/src/tool/passepartoutCalculator/ui.ts +17 -0
- package/src/tool/stairCalculator/bibliography.astro +52 -0
- package/src/tool/stairCalculator/component.astro +766 -0
- package/src/tool/stairCalculator/engine.ts +128 -0
- package/src/tool/stairCalculator/i18n/en.ts +149 -0
- package/src/tool/stairCalculator/i18n/es.ts +149 -0
- package/src/tool/stairCalculator/i18n/fr.ts +149 -0
- package/src/tool/stairCalculator/index.ts +31 -0
- package/src/tool/stairCalculator/seo.astro +211 -0
- package/src/tool/stairCalculator/ui.ts +109 -0
- package/src/tool/thermalExpansionCalculator/bibliography.astro +13 -0
- package/src/tool/thermalExpansionCalculator/component.astro +771 -0
- package/src/tool/thermalExpansionCalculator/engine.ts +23 -0
- package/src/tool/thermalExpansionCalculator/i18n/en.ts +174 -0
- package/src/tool/thermalExpansionCalculator/i18n/es.ts +174 -0
- package/src/tool/thermalExpansionCalculator/i18n/fr.ts +174 -0
- package/src/tool/thermalExpansionCalculator/index.ts +28 -0
- package/src/tool/thermalExpansionCalculator/seo.astro +14 -0
- package/src/tool/thermalExpansionCalculator/ui.ts +41 -0
- package/src/tool/voltageDropCalculator/bibliography.astro +13 -0
- package/src/tool/voltageDropCalculator/component.astro +1022 -0
- package/src/tool/voltageDropCalculator/i18n/en.ts +155 -0
- package/src/tool/voltageDropCalculator/i18n/es.ts +155 -0
- package/src/tool/voltageDropCalculator/i18n/fr.ts +148 -0
- package/src/tool/voltageDropCalculator/index.ts +28 -0
- package/src/tool/voltageDropCalculator/seo.astro +14 -0
- package/src/tool/voltageDropCalculator/ui.ts +22 -0
- package/src/tools.ts +16 -0
- package/src/types.ts +72 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { PassepartoutCalculatorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'passepartout-calculator';
|
|
6
|
+
const title = 'Passepartout Calculator: Mat Board Margins with Optical Center Correction';
|
|
7
|
+
const description =
|
|
8
|
+
'Calculate exact mat board margins for professional picture framing with bottom weighting optical correction. Gallery-quality proportions for photos and artwork.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'What is bottom weighting in picture framing?',
|
|
13
|
+
answer:
|
|
14
|
+
"Bottom weighting is a professional framing technique where the bottom margin is made slightly wider than the top. This corrects an optical illusion: when a piece is framed with perfectly equal margins, the artwork appears to 'sink' visually. The extra bottom margin lifts the piece optically so it appears perfectly centered.",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'What mat board material should I use for conservation framing?',
|
|
18
|
+
answer:
|
|
19
|
+
'Always use acid-free or pH-neutral mat board (alpha-cellulose or cotton rag). Cheap wood-pulp boards contain lignin which releases acids over time, causing yellowing and foxing that permanently damages artwork. Look for "Museum Quality" or "Conservation Grade" labels.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'How do I choose the mat board color?',
|
|
23
|
+
answer:
|
|
24
|
+
'Off-white or soft cream are the safe professional standards — they do not compete with the artwork. A dark mat can emphasize highlights in photography. Colored mats should be used carefully and only to complement specific tones in the piece, never to overpower it.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'What is the ideal mat margin width?',
|
|
28
|
+
answer:
|
|
29
|
+
"The professional standard is between 5 and 8 cm (2-3 inches). A margin that is too narrow makes the artwork feel 'suffocated'. A wider margin gives even small pieces a heroic, gallery-like presence.",
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Measure the artwork',
|
|
36
|
+
text: 'Measure the exact width and height of the paper or canvas you are framing. Subtract a few millimetres if you want the mat to overlap the image slightly.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Measure the frame interior',
|
|
40
|
+
text: 'Take the internal dimensions of the frame or rebate where the mat board will sit.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Enable optical correction',
|
|
44
|
+
text: 'Check the bottom weighting option in the calculator if you want the bottom margin to be automatically wider for a professional finish.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Cut the mat board',
|
|
48
|
+
text: 'Use the resulting measurements to cut the window and exterior of the mat, ideally with a 45-degree bevel cutter for a clean chamfered edge.',
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faqData.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'HowTo',
|
|
65
|
+
name: title,
|
|
66
|
+
description,
|
|
67
|
+
step: howToData.map((step, i) => ({
|
|
68
|
+
'@type': 'HowToStep',
|
|
69
|
+
position: i + 1,
|
|
70
|
+
name: step.name,
|
|
71
|
+
text: step.text,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
76
|
+
'@context': 'https://schema.org',
|
|
77
|
+
'@type': 'SoftwareApplication',
|
|
78
|
+
name: title,
|
|
79
|
+
description,
|
|
80
|
+
applicationCategory: 'UtilityApplication',
|
|
81
|
+
operatingSystem: 'All',
|
|
82
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
83
|
+
inLanguage: 'en',
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const content: ToolLocaleContent<PassepartoutCalculatorUI> = {
|
|
87
|
+
slug,
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
faqTitle: 'Frequently Asked Questions',
|
|
91
|
+
faq: faqData,
|
|
92
|
+
bibliographyTitle: 'Technical References',
|
|
93
|
+
bibliography: [
|
|
94
|
+
{
|
|
95
|
+
name: 'ISO 9706: Permanence of Paper for Documents',
|
|
96
|
+
url: 'https://www.iso.org/standard/22495.html',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'PPFA: Professional Picture Framers Association',
|
|
100
|
+
url: 'https://ppfa.com/',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'Fine Art Trade Guild: Framing Standards',
|
|
104
|
+
url: 'https://www.fineart.co.uk/',
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
howTo: howToData,
|
|
108
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
109
|
+
seo: [
|
|
110
|
+
{
|
|
111
|
+
type: 'title',
|
|
112
|
+
text: 'The Science of Perfect Picture Framing',
|
|
113
|
+
level: 2,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
type: 'paragraph',
|
|
117
|
+
html: 'A <strong>passepartout</strong> (or mat board) is not merely decorative cardboard — it is the breathing space that allows your artwork to exist independently from its frame. This calculator gives you the exact dimensions to cut your mat, ensuring the artwork is optically centred or balanced within the frame to professional gallery standards.',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'title',
|
|
121
|
+
text: 'Why Bottom Weighting Works',
|
|
122
|
+
level: 3,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'card',
|
|
126
|
+
icon: 'mdi:eye-outline',
|
|
127
|
+
title: 'The optical center illusion',
|
|
128
|
+
html: '<p>The human eye perceives the geometric vertical center of a rectangle as being slightly lower than it actually is. Artwork framed with perfectly equal top and bottom margins appears to be "falling" or sinking.</p><p><strong>Bottom weighting</strong> corrects this by making the bottom margin 5-15% wider than the top. The artwork is lifted optically and appears perfectly centered — a technique used in every professional gallery worldwide.</p>',
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
type: 'title',
|
|
132
|
+
text: 'Conservation Mat Board: Why Materials Matter',
|
|
133
|
+
level: 3,
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
type: 'card',
|
|
137
|
+
icon: 'mdi:palette-swatch-outline',
|
|
138
|
+
title: 'Conservation board versus standard mat board',
|
|
139
|
+
html: '<p>Standard wood-pulp mat boards contain lignin, which breaks down over time releasing acetic acid. This causes the characteristic brown foxing and yellowing that permanently destroys artwork. <strong>Conservation-grade mat board</strong> (alpha-cellulose or cotton rag) is pH-neutral and buffers against external acids, protecting artwork for decades.</p>',
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
type: 'title',
|
|
143
|
+
text: 'Professional Measuring Tips',
|
|
144
|
+
level: 3,
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: 'paragraph',
|
|
148
|
+
html: '<strong>Measure the rebate, not the face:</strong> If you already have the frame, measure the inner rebate from the back, not the front glass opening. The mat must fit the rebate precisely.',
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
type: 'paragraph',
|
|
152
|
+
html: '<strong>The safety overlap:</strong> The mat window should be slightly smaller than the artwork (approximately 5mm per side) so the image cannot slip through the opening.',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'card',
|
|
156
|
+
icon: 'mdi:ruler',
|
|
157
|
+
title: 'The golden rule of matting',
|
|
158
|
+
html: '<p>Never use less than 5cm (2 inches) of margin if you want the artwork to breathe. Generous margins signal quality and elevate even modest pieces to gallery status. A wide white mat transforms a small watercolour into a museum exhibit.</p>',
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
ui: {
|
|
162
|
+
sectionTitle: 'Dimensions',
|
|
163
|
+
sectionDesc: 'Enter measurements in centimetres.',
|
|
164
|
+
frameSizeTitle: 'Frame Size',
|
|
165
|
+
artSizeTitle: 'Artwork Size',
|
|
166
|
+
labelWidth: 'Width (cm)',
|
|
167
|
+
labelHeight: 'Height (cm)',
|
|
168
|
+
labelBottomWeighting: 'Bottom Weighting',
|
|
169
|
+
descBottomWeighting: 'Adds extra bottom margin for visual balance',
|
|
170
|
+
labelOffset: 'Offset (%)',
|
|
171
|
+
errorMsg: 'Artwork dimensions must be smaller than the frame.',
|
|
172
|
+
labelTop: 'Top',
|
|
173
|
+
labelBottom: 'Bottom',
|
|
174
|
+
labelLeft: 'Left',
|
|
175
|
+
labelRight: 'Right',
|
|
176
|
+
artPlaceholder: 'Your Artwork',
|
|
177
|
+
},
|
|
178
|
+
};
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { PassepartoutCalculatorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'calculadora-passepartout';
|
|
6
|
+
const title = 'Calculadora Passepartout: Márgenes con Corrección Óptica para Enmarcado';
|
|
7
|
+
const description =
|
|
8
|
+
'Herramienta para calcular márgenes de passepartout con corrección óptica (bottom weighting). Enmarca tus fotografías y arte con proporciones de galería.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: '¿Qué es la corrección de centro óptico (Bottom Weighting)?',
|
|
13
|
+
answer:
|
|
14
|
+
"Es un principio de diseño gráfico y enmarcado donde el margen inferior se hace ligeramente más ancho que los demás. Esto corrige la ilusión óptica que hace que el centro geométrico parezca estar 'caído' cuando se mira una obra colgada.",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: '¿De qué material debe ser el passepartout?',
|
|
18
|
+
answer:
|
|
19
|
+
'Para conservación artística, debe ser cartón libre de ácido o de pH neutro (alfa-celulosa o algodón). Los cartones baratos amarillean con el tiempo y pueden dañar la obra debido a la lignina.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: '¿Cómo elijo el color del margen?',
|
|
23
|
+
answer:
|
|
24
|
+
'El blanco roto o crema suave son los estándares que no distraen de la obra. Un margen oscuro puede resaltar los blancos de una fotografía, mientras que un margen de color debe usarse con cuidado para no competir con los tonos de la pieza.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: '¿Cuál es el ancho de margen ideal?',
|
|
28
|
+
answer:
|
|
29
|
+
'Un estándar profesional es entre 5 y 8 cm. Si el margen es demasiado estrecho, la obra parece "asfixiada". Si es muy ancho, puede dar un aire heroico y minimalista a obras pequeñas.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Medir la obra de arte',
|
|
36
|
+
text: 'Mide el ancho y alto exacto del papel o lienzo que vas a enmarcar. Descuenta unos milímetros si quieres que el passepartout monte un poco sobre la imagen.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Medir el interior del marco',
|
|
40
|
+
text: 'Toma las dimensiones internas del marco o rebaje donde encajará el cartón del passepartout.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Activar corrección óptica',
|
|
44
|
+
text: 'Marca la opción en nuestra calculadora si quieres que el margen inferior sea automáticamente mayor para un acabado profesional.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Cortar el cartón',
|
|
48
|
+
text: 'Usa las medidas resultantes para cortar el hueco (ventana) y el exterior del cartón, preferiblemente con un cúter de 45 grados para un bisel limpio.',
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faqData.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'HowTo',
|
|
65
|
+
name: title,
|
|
66
|
+
description,
|
|
67
|
+
step: howToData.map((step, i) => ({
|
|
68
|
+
'@type': 'HowToStep',
|
|
69
|
+
position: i + 1,
|
|
70
|
+
name: step.name,
|
|
71
|
+
text: step.text,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
76
|
+
'@context': 'https://schema.org',
|
|
77
|
+
'@type': 'SoftwareApplication',
|
|
78
|
+
name: title,
|
|
79
|
+
description,
|
|
80
|
+
applicationCategory: 'UtilityApplication',
|
|
81
|
+
operatingSystem: 'All',
|
|
82
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
83
|
+
inLanguage: 'es',
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const content: ToolLocaleContent<PassepartoutCalculatorUI> = {
|
|
87
|
+
slug,
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
faqTitle: 'Preguntas Frecuentes',
|
|
91
|
+
faq: faqData,
|
|
92
|
+
bibliographyTitle: 'Referencias Técnicas',
|
|
93
|
+
bibliography: [
|
|
94
|
+
{
|
|
95
|
+
name: 'ISO 9706: Papel permanente para documentos',
|
|
96
|
+
url: 'https://www.iso.org/standard/22495.html',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'PPFA: Professional Picture Framers Association',
|
|
100
|
+
url: 'https://ppfa.com/',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'Fine Art Trade Guild: Framing Standards',
|
|
104
|
+
url: 'https://www.fineart.co.uk/',
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
howTo: howToData,
|
|
108
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
109
|
+
seo: [
|
|
110
|
+
{
|
|
111
|
+
type: 'title',
|
|
112
|
+
text: 'La Ciencia del Enmarcado Perfecto',
|
|
113
|
+
level: 2,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
type: 'paragraph',
|
|
117
|
+
html: 'Un <strong>Passepartout</strong> (o marialuisa) no es solo un cartón decorativo; es el pulmón que permite respirar a tu obra de arte. Esta calculadora te ayuda a determinar las dimensiones exactas para cortar tu cartón, asegurando que la obra quede perfectamente centrada o equilibrada ópticamente dentro del marco.',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'title',
|
|
121
|
+
text: '¿Por qué el "Peso Inferior" o Bottom Weighting?',
|
|
122
|
+
level: 3,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'card',
|
|
126
|
+
icon: 'mdi:eye-outline',
|
|
127
|
+
title: 'La ilusión óptica del centro geométrico',
|
|
128
|
+
html: '<p>El ojo humano tiende a percibir el centro vertical geométrico como si estuviera ligeramente más bajo de lo que realmente está. Si enmarcas una obra exactamente en el centro, parecerá que se está "cayendo".</p><p>El <strong>Bottom Weighting</strong> (peso inferior) corrige esta ilusión óptica dejando un margen inferior ligeramente mayor, elevando la obra visualmente para que parezca perfectamente centrada.</p>',
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
type: 'title',
|
|
132
|
+
text: 'Materiales de Conservación para Passepartout',
|
|
133
|
+
level: 3,
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
type: 'card',
|
|
137
|
+
icon: 'mdi:palette-swatch-outline',
|
|
138
|
+
title: 'El cartón sin ácido para conservación',
|
|
139
|
+
html: '<p>Al elegir tu cartón, busca siempre términos como <strong>"Acid-Free"</strong> (libre de ácido) o <strong>"Museum Quality"</strong>. Los cartones baratos de pulpa de madera pueden amarillear con el tiempo y liberar ácidos que quemarán tu obra de arte (foxing), arruinándola irreversiblemente.</p>',
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
type: 'title',
|
|
143
|
+
text: 'Consejos de Medición Profesional',
|
|
144
|
+
level: 3,
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: 'paragraph',
|
|
148
|
+
html: '<strong>Mide la Ventana, no el Exterior:</strong> Si ya tienes el marco, mide el hueco interior (el "rebajo") por la parte trasera, no por el frente del cristal.',
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
type: 'paragraph',
|
|
152
|
+
html: '<strong>La Solapa de Seguridad:</strong> La ventana del passepartout debe ser un poco más pequeña que la obra (aprox. 5mm por lado) para que la imagen no se "cuele" por el agujero.',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'card',
|
|
156
|
+
icon: 'mdi:ruler',
|
|
157
|
+
title: 'Regla de Oro del enmarcado',
|
|
158
|
+
html: '<p>Nunca dejes menos de 5cm de margen si quieres que la obra respire. Los márgenes generosos denotan elegancia y valor. Un margen ancho convierte una pequeña acuarela en una pieza de museo.</p>',
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
ui: {
|
|
162
|
+
sectionTitle: 'Dimensiones',
|
|
163
|
+
sectionDesc: 'Introduce las medidas en centímetros.',
|
|
164
|
+
frameSizeTitle: 'Tamaño del Marco',
|
|
165
|
+
artSizeTitle: 'Tamaño de la Obra',
|
|
166
|
+
labelWidth: 'Ancho (cm)',
|
|
167
|
+
labelHeight: 'Alto (cm)',
|
|
168
|
+
labelBottomWeighting: 'Bottom Weighting',
|
|
169
|
+
descBottomWeighting: 'Aplica más margen inferior para equilibrio visual',
|
|
170
|
+
labelOffset: 'Desplazamiento (%)',
|
|
171
|
+
errorMsg: 'El tamaño de la obra debe ser menor que el marco.',
|
|
172
|
+
labelTop: 'Superior',
|
|
173
|
+
labelBottom: 'Inferior',
|
|
174
|
+
labelLeft: 'Izq',
|
|
175
|
+
labelRight: 'Der',
|
|
176
|
+
artPlaceholder: 'Tu Obra',
|
|
177
|
+
},
|
|
178
|
+
};
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { PassepartoutCalculatorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'calculateur-passe-partout';
|
|
6
|
+
const title = 'Calculateur Passepartout: Marges avec Correction Optique pour Encadrement';
|
|
7
|
+
const description =
|
|
8
|
+
"Calculez les marges exactes de passe-partout avec correction optique (pondération basse). Proportions galerie pour l'encadrement professionnel de photos et oeuvres d'art.";
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Qu\'est-ce que la pondération basse (Bottom Weighting) en encadrement?',
|
|
13
|
+
answer:
|
|
14
|
+
"La pondération basse est une technique professionnelle d'encadrement où la marge inférieure est légèrement plus large que la marge supérieure. Elle corrige une illusion d'optique: lorsqu'une oeuvre est encadrée avec des marges parfaitement égales, elle semble visuellement 'tomber'. La marge inférieure plus large compense cet effet et donne l'impression d'un centrage parfait.",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Quel carton choisir pour un passe-partout de conservation?',
|
|
18
|
+
answer:
|
|
19
|
+
"Utilisez toujours un carton sans acide ou à pH neutre (alpha-cellulose ou chiffon de coton). Les cartons bon marché à base de pâte de bois contiennent de la lignine qui libère des acides avec le temps, provoquant le jaunissement et les piqûres (foxing) qui endommagent irrémédiablement l'oeuvre. Cherchez les mentions \"Acid-Free\" ou \"Museum Quality\".",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Comment choisir la couleur du passe-partout?',
|
|
23
|
+
answer:
|
|
24
|
+
"Le blanc cassé ou le crème doux sont les standards professionnels qui ne concurrencent pas l'oeuvre. Un passe-partout sombre peut mettre en valeur les blancs d'une photographie. Un passe-partout coloré doit être utilisé avec parcimonie pour complémenter les tons de la pièce sans les dominer.",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Quelle est la largeur de marge idéale?',
|
|
28
|
+
answer:
|
|
29
|
+
"Le standard professionnel est entre 5 et 8 cm. Une marge trop étroite donne une impression d'étouffement. Une marge plus large donne même aux petits formats une présence monumentale et élégante.",
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: "Mesurer l'oeuvre",
|
|
36
|
+
text: "Mesurez la largeur et la hauteur exactes du papier ou de la toile à encadrer. Soustrayez quelques millimètres si vous souhaitez que le passe-partout chevauche légèrement l'image.",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Mesurer le feuillure du cadre',
|
|
40
|
+
text: "Prenez les dimensions internes de la feuillure du cadre où le carton du passe-partout viendra s'insérer.",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Activer la correction optique',
|
|
44
|
+
text: "Cochez l'option dans notre calculateur si vous souhaitez que la marge inférieure soit automatiquement plus large pour un rendu professionnel.",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Couper le carton',
|
|
48
|
+
text: "Utilisez les mesures obtenues pour découper la fenêtre et l'extérieur du carton, idéalement avec un cutter biseau 45 degrés pour un chanfrein net.",
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faqData.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'HowTo',
|
|
65
|
+
name: title,
|
|
66
|
+
description,
|
|
67
|
+
step: howToData.map((step, i) => ({
|
|
68
|
+
'@type': 'HowToStep',
|
|
69
|
+
position: i + 1,
|
|
70
|
+
name: step.name,
|
|
71
|
+
text: step.text,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
76
|
+
'@context': 'https://schema.org',
|
|
77
|
+
'@type': 'SoftwareApplication',
|
|
78
|
+
name: title,
|
|
79
|
+
description,
|
|
80
|
+
applicationCategory: 'UtilityApplication',
|
|
81
|
+
operatingSystem: 'All',
|
|
82
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
83
|
+
inLanguage: 'fr',
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const content: ToolLocaleContent<PassepartoutCalculatorUI> = {
|
|
87
|
+
slug,
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
faqTitle: 'Questions Fréquentes',
|
|
91
|
+
faq: faqData,
|
|
92
|
+
bibliographyTitle: 'Références Techniques',
|
|
93
|
+
bibliography: [
|
|
94
|
+
{
|
|
95
|
+
name: 'ISO 9706: Permanence du papier pour documents',
|
|
96
|
+
url: 'https://www.iso.org/standard/22495.html',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'PPFA: Professional Picture Framers Association',
|
|
100
|
+
url: 'https://ppfa.com/',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'Fine Art Trade Guild: Normes d\'encadrement',
|
|
104
|
+
url: 'https://www.fineart.co.uk/',
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
howTo: howToData,
|
|
108
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
109
|
+
seo: [
|
|
110
|
+
{
|
|
111
|
+
type: 'title',
|
|
112
|
+
text: "La Science de l'Encadrement Parfait",
|
|
113
|
+
level: 2,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
type: 'paragraph',
|
|
117
|
+
html: "Un <strong>passe-partout</strong> (ou marie-louise) n'est pas qu'un carton décoratif: c'est l'espace respiratoire qui permet à votre oeuvre d'exister indépendamment de son cadre. Ce calculateur vous donne les dimensions exactes pour découper votre carton, garantissant que l'oeuvre soit centrée optiquement selon les standards des galeries professionnelles.",
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'title',
|
|
121
|
+
text: 'Pourquoi la Pondération Basse fonctionne',
|
|
122
|
+
level: 3,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'card',
|
|
126
|
+
icon: 'mdi:eye-outline',
|
|
127
|
+
title: "L'illusion du centre optique",
|
|
128
|
+
html: "<p>L'oeil humain perçoit le centre géométrique vertical d'un rectangle comme étant légèrement plus bas qu'il ne l'est réellement. Une oeuvre encadrée avec des marges exactement égales semble 'tomber' ou s'enfoncer visuellement.</p><p>La <strong>pondération basse</strong> corrige cela en rendant la marge inférieure 5 à 15% plus large que la supérieure. L'oeuvre est rehaussée optiquement et semble parfaitement centrée, une technique utilisée dans toutes les galeries professionnelles.</p>",
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
type: 'title',
|
|
132
|
+
text: 'Le Carton de Conservation: Pourquoi les Matériaux Comptent',
|
|
133
|
+
level: 3,
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
type: 'card',
|
|
137
|
+
icon: 'mdi:palette-swatch-outline',
|
|
138
|
+
title: 'Carton sans acide contre carton standard',
|
|
139
|
+
html: "<p>Les cartons à base de pâte de bois contiennent de la lignine qui se dégrade en libérant de l'acide acétique. Cela provoque le jaunissement et les piqûres (foxing) caractéristiques qui détruisent définitivement les oeuvres. Le <strong>carton de conservation</strong> (alpha-cellulose ou chiffon de coton) est à pH neutre et protège l'oeuvre pendant des décennies.</p>",
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
type: 'title',
|
|
143
|
+
text: 'Conseils de Mesure Professionnels',
|
|
144
|
+
level: 3,
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: 'paragraph',
|
|
148
|
+
html: "<strong>Mesurez la feuillure, pas la face:</strong> Si vous avez déjà le cadre, mesurez la feuillure intérieure par l'arrière, pas l'ouverture du verre par l'avant. Le carton doit s'insérer précisément dans la feuillure.",
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
type: 'paragraph',
|
|
152
|
+
html: "<strong>Le chevauchement de sécurité:</strong> La fenêtre du passe-partout doit être légèrement plus petite que l'oeuvre (environ 5mm par côté) pour que l'image ne puisse pas glisser par l'ouverture.",
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'card',
|
|
156
|
+
icon: 'mdi:ruler',
|
|
157
|
+
title: "La règle d'or de l'encadrement",
|
|
158
|
+
html: "<p>Ne jamais laisser moins de 5cm de marge si vous voulez que l'oeuvre respire. Des marges généreuses signalent la qualité et élèvent même les petits formats au rang d'oeuvres de musée.</p>",
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
ui: {
|
|
162
|
+
sectionTitle: 'Dimensions',
|
|
163
|
+
sectionDesc: 'Entrez les mesures en centimètres.',
|
|
164
|
+
frameSizeTitle: 'Taille du Cadre',
|
|
165
|
+
artSizeTitle: "Taille de l'Oeuvre",
|
|
166
|
+
labelWidth: 'Largeur (cm)',
|
|
167
|
+
labelHeight: 'Hauteur (cm)',
|
|
168
|
+
labelBottomWeighting: 'Pondération Basse',
|
|
169
|
+
descBottomWeighting: 'Marge inférieure plus large pour équilibre visuel',
|
|
170
|
+
labelOffset: 'Décalage (%)',
|
|
171
|
+
errorMsg: "Les dimensions de l'oeuvre doivent être inférieures à celles du cadre.",
|
|
172
|
+
labelTop: 'Haut',
|
|
173
|
+
labelBottom: 'Bas',
|
|
174
|
+
labelLeft: 'G.',
|
|
175
|
+
labelRight: 'D.',
|
|
176
|
+
artPlaceholder: 'Votre Oeuvre',
|
|
177
|
+
},
|
|
178
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import PassepartoutCalculatorComponent from './component.astro';
|
|
2
|
+
import PassepartoutCalculatorSEO from './seo.astro';
|
|
3
|
+
import PassepartoutCalculatorBibliography from './bibliography.astro';
|
|
4
|
+
import type { DiyToolEntry, ToolDefinition } from '../../types';
|
|
5
|
+
import type { PassepartoutCalculatorUI } from './ui';
|
|
6
|
+
|
|
7
|
+
export {
|
|
8
|
+
PassepartoutCalculatorComponent,
|
|
9
|
+
PassepartoutCalculatorSEO,
|
|
10
|
+
PassepartoutCalculatorBibliography,
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const es = async () => (await import('./i18n/es')).content;
|
|
14
|
+
const en = async () => (await import('./i18n/en')).content;
|
|
15
|
+
const fr = async () => (await import('./i18n/fr')).content;
|
|
16
|
+
|
|
17
|
+
export const passepartoutCalculator: DiyToolEntry<PassepartoutCalculatorUI> = {
|
|
18
|
+
id: 'passepartout-calculator',
|
|
19
|
+
icons: { bg: 'mdi:image-frame', fg: 'mdi:ruler' },
|
|
20
|
+
i18n: { es, en, fr },
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const PASSEPARTOUT_CALCULATOR_TOOL: ToolDefinition = {
|
|
24
|
+
entry: passepartoutCalculator,
|
|
25
|
+
Component: PassepartoutCalculatorComponent,
|
|
26
|
+
SEOComponent: PassepartoutCalculatorSEO,
|
|
27
|
+
BibliographyComponent: PassepartoutCalculatorBibliography,
|
|
28
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { passepartoutCalculator } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
const { locale = 'es' } = Astro.props;
|
|
10
|
+
const content = await passepartoutCalculator.i18n[locale]?.();
|
|
11
|
+
if (!content) return null;
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
<SEORenderer content={{ locale: locale as string, sections: content.seo }} />
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface PassepartoutCalculatorUI extends Record<string, string> {
|
|
2
|
+
sectionTitle: string;
|
|
3
|
+
sectionDesc: string;
|
|
4
|
+
frameSizeTitle: string;
|
|
5
|
+
artSizeTitle: string;
|
|
6
|
+
labelWidth: string;
|
|
7
|
+
labelHeight: string;
|
|
8
|
+
labelBottomWeighting: string;
|
|
9
|
+
descBottomWeighting: string;
|
|
10
|
+
labelOffset: string;
|
|
11
|
+
errorMsg: string;
|
|
12
|
+
labelTop: string;
|
|
13
|
+
labelBottom: string;
|
|
14
|
+
labelLeft: string;
|
|
15
|
+
labelRight: string;
|
|
16
|
+
artPlaceholder: string;
|
|
17
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
---
|
|
3
|
+
|
|
4
|
+
<div class="sc-bibliography">
|
|
5
|
+
<h3>Referencias y Normativa</h3>
|
|
6
|
+
<ul>
|
|
7
|
+
<li>
|
|
8
|
+
<a href="https://www.codigotecnico.org/" target="_blank" rel="noopener noreferrer">
|
|
9
|
+
Normativa de Seguridad en Escaleras (CTE España)
|
|
10
|
+
</a>
|
|
11
|
+
</li>
|
|
12
|
+
<li>
|
|
13
|
+
<a href="https://es.wikipedia.org/wiki/Escalera" target="_blank" rel="noopener noreferrer">
|
|
14
|
+
Ergonomía de la Escalera - Wikipedia
|
|
15
|
+
</a>
|
|
16
|
+
</li>
|
|
17
|
+
<li>
|
|
18
|
+
<a href="https://www.idae.es/" target="_blank" rel="noopener noreferrer">
|
|
19
|
+
Instituto para la Diversificación y Ahorro de la Energía (IDAE)
|
|
20
|
+
</a>
|
|
21
|
+
</li>
|
|
22
|
+
</ul>
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
<style>
|
|
26
|
+
.sc-bibliography {
|
|
27
|
+
max-width: 900px;
|
|
28
|
+
margin: 2rem auto;
|
|
29
|
+
padding: 1.5rem;
|
|
30
|
+
}
|
|
31
|
+
.sc-bibliography h3 {
|
|
32
|
+
font-size: 1.25rem;
|
|
33
|
+
font-weight: 700;
|
|
34
|
+
margin-bottom: 1rem;
|
|
35
|
+
color: #1e293b;
|
|
36
|
+
}
|
|
37
|
+
.sc-bibliography ul {
|
|
38
|
+
list-style: none;
|
|
39
|
+
padding: 0;
|
|
40
|
+
}
|
|
41
|
+
.sc-bibliography li {
|
|
42
|
+
margin-bottom: 0.75rem;
|
|
43
|
+
}
|
|
44
|
+
.sc-bibliography a {
|
|
45
|
+
color: #4f46e5;
|
|
46
|
+
text-decoration: none;
|
|
47
|
+
font-weight: 600;
|
|
48
|
+
}
|
|
49
|
+
.sc-bibliography a:hover {
|
|
50
|
+
text-decoration: underline;
|
|
51
|
+
}
|
|
52
|
+
</style>
|