@jjlmoya/utils-developer 1.3.0 → 1.5.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 +2 -1
- package/src/category/i18n/de.ts +34 -0
- package/src/category/i18n/id.ts +34 -0
- package/src/category/i18n/it.ts +34 -0
- package/src/category/i18n/ja.ts +34 -0
- package/src/category/i18n/ko.ts +34 -0
- package/src/category/i18n/nl.ts +34 -0
- package/src/category/i18n/pl.ts +34 -0
- package/src/category/i18n/pt.ts +34 -0
- package/src/category/i18n/ru.ts +34 -0
- package/src/category/i18n/sv.ts +34 -0
- package/src/category/i18n/tr.ts +34 -0
- package/src/category/i18n/zh.ts +34 -0
- package/src/category/index.ts +13 -1
- package/src/index.ts +12 -0
- package/src/tests/faq_count.test.ts +1 -1
- package/src/tests/i18n_coverage.test.ts +36 -0
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/slug_uniqueness.test.ts +81 -0
- package/src/tool/aspectRatio/i18n/de.ts +177 -0
- package/src/tool/aspectRatio/i18n/id.ts +177 -0
- package/src/tool/aspectRatio/i18n/it.ts +177 -0
- package/src/tool/aspectRatio/i18n/ja.ts +178 -0
- package/src/tool/aspectRatio/i18n/ko.ts +178 -0
- package/src/tool/aspectRatio/i18n/nl.ts +178 -0
- package/src/tool/aspectRatio/i18n/pl.ts +177 -0
- package/src/tool/aspectRatio/i18n/pt.ts +177 -0
- package/src/tool/aspectRatio/i18n/ru.ts +177 -0
- package/src/tool/aspectRatio/i18n/sv.ts +177 -0
- package/src/tool/aspectRatio/i18n/tr.ts +177 -0
- package/src/tool/aspectRatio/i18n/zh.ts +178 -0
- package/src/tool/aspectRatio/index.ts +15 -7
- package/src/tool/calculadoraTiempoDatos/i18n/de.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/id.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/it.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/ja.ts +151 -0
- package/src/tool/calculadoraTiempoDatos/i18n/ko.ts +151 -0
- package/src/tool/calculadoraTiempoDatos/i18n/nl.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/pl.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/pt.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/ru.ts +151 -0
- package/src/tool/calculadoraTiempoDatos/i18n/sv.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/tr.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/zh.ts +151 -0
- package/src/tool/calculadoraTiempoDatos/index.ts +15 -7
- package/src/tool/colorConverter/i18n/de.ts +126 -0
- package/src/tool/colorConverter/i18n/id.ts +126 -0
- package/src/tool/colorConverter/i18n/it.ts +126 -0
- package/src/tool/colorConverter/i18n/ja.ts +127 -0
- package/src/tool/colorConverter/i18n/ko.ts +127 -0
- package/src/tool/colorConverter/i18n/nl.ts +126 -0
- package/src/tool/colorConverter/i18n/pl.ts +126 -0
- package/src/tool/colorConverter/i18n/pt.ts +126 -0
- package/src/tool/colorConverter/i18n/ru.ts +126 -0
- package/src/tool/colorConverter/i18n/sv.ts +126 -0
- package/src/tool/colorConverter/i18n/tr.ts +126 -0
- package/src/tool/colorConverter/i18n/zh.ts +127 -0
- package/src/tool/colorConverter/index.ts +15 -7
- package/src/tool/conversorExcelCsvHtml/i18n/de.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/id.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/it.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/ja.ts +130 -0
- package/src/tool/conversorExcelCsvHtml/i18n/ko.ts +130 -0
- package/src/tool/conversorExcelCsvHtml/i18n/nl.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/pl.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/pt.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/ru.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/sv.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/tr.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/zh.ts +130 -0
- package/src/tool/conversorExcelCsvHtml/index.ts +15 -7
- package/src/tool/cronGenerator/i18n/de.ts +192 -0
- package/src/tool/cronGenerator/i18n/es.ts +2 -1
- package/src/tool/cronGenerator/i18n/fr.ts +2 -1
- package/src/tool/cronGenerator/i18n/id.ts +192 -0
- package/src/tool/cronGenerator/i18n/it.ts +192 -0
- package/src/tool/cronGenerator/i18n/ja.ts +192 -0
- package/src/tool/cronGenerator/i18n/ko.ts +192 -0
- package/src/tool/cronGenerator/i18n/nl.ts +192 -0
- package/src/tool/cronGenerator/i18n/pl.ts +192 -0
- package/src/tool/cronGenerator/i18n/pt.ts +192 -0
- package/src/tool/cronGenerator/i18n/ru.ts +192 -0
- package/src/tool/cronGenerator/i18n/sv.ts +192 -0
- package/src/tool/cronGenerator/i18n/tr.ts +192 -0
- package/src/tool/cronGenerator/i18n/zh.ts +192 -0
- package/src/tool/cronGenerator/index.ts +15 -7
- package/src/tool/cssSpecificityCalculator/i18n/de.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/id.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/it.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/ja.ts +169 -0
- package/src/tool/cssSpecificityCalculator/i18n/ko.ts +169 -0
- package/src/tool/cssSpecificityCalculator/i18n/nl.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/pl.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/pt.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/ru.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/sv.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/tr.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/zh.ts +169 -0
- package/src/tool/cssSpecificityCalculator/index.ts +15 -7
- package/src/tool/cssToInlineConverter/i18n/de.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/id.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/it.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/ja.ts +161 -0
- package/src/tool/cssToInlineConverter/i18n/ko.ts +161 -0
- package/src/tool/cssToInlineConverter/i18n/nl.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/pl.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/pt.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/ru.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/sv.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/tr.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/zh.ts +161 -0
- package/src/tool/cssToInlineConverter/index.ts +15 -7
- package/src/tool/duplicateCssRemover/i18n/de.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/id.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/it.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/ja.ts +168 -0
- package/src/tool/duplicateCssRemover/i18n/ko.ts +168 -0
- package/src/tool/duplicateCssRemover/i18n/nl.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/pl.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/pt.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/ru.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/sv.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/tr.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/zh.ts +168 -0
- package/src/tool/duplicateCssRemover/index.ts +15 -7
- package/src/tool/generadorSecurityTxt/i18n/de.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/id.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/it.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/ja.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/ko.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/nl.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/pl.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/pt.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/ru.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/sv.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/tr.ts +174 -0
- package/src/tool/generadorSecurityTxt/i18n/zh.ts +174 -0
- package/src/tool/generadorSecurityTxt/index.ts +15 -7
- package/src/tool/hashGenerator/i18n/de.ts +119 -0
- package/src/tool/hashGenerator/i18n/id.ts +119 -0
- package/src/tool/hashGenerator/i18n/it.ts +118 -0
- package/src/tool/hashGenerator/i18n/ja.ts +119 -0
- package/src/tool/hashGenerator/i18n/ko.ts +119 -0
- package/src/tool/hashGenerator/i18n/nl.ts +119 -0
- package/src/tool/hashGenerator/i18n/pl.ts +118 -0
- package/src/tool/hashGenerator/i18n/pt.ts +118 -0
- package/src/tool/hashGenerator/i18n/ru.ts +119 -0
- package/src/tool/hashGenerator/i18n/sv.ts +119 -0
- package/src/tool/hashGenerator/i18n/tr.ts +118 -0
- package/src/tool/hashGenerator/i18n/zh.ts +119 -0
- package/src/tool/hashGenerator/index.ts +15 -7
- package/src/tool/inspectorCertificadosSsl/i18n/de.ts +214 -0
- package/src/tool/inspectorCertificadosSsl/i18n/id.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/it.ts +214 -0
- package/src/tool/inspectorCertificadosSsl/i18n/ja.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/ko.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/nl.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/pl.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/pt.ts +214 -0
- package/src/tool/inspectorCertificadosSsl/i18n/ru.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/sv.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/tr.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/i18n/zh.ts +215 -0
- package/src/tool/inspectorCertificadosSsl/index.ts +24 -0
- package/src/tool/jsonFormatter/i18n/de.ts +157 -0
- package/src/tool/jsonFormatter/i18n/es.ts +2 -1
- package/src/tool/jsonFormatter/i18n/fr.ts +2 -1
- package/src/tool/jsonFormatter/i18n/id.ts +157 -0
- package/src/tool/jsonFormatter/i18n/it.ts +156 -0
- package/src/tool/jsonFormatter/i18n/ja.ts +157 -0
- package/src/tool/jsonFormatter/i18n/ko.ts +157 -0
- package/src/tool/jsonFormatter/i18n/nl.ts +157 -0
- package/src/tool/jsonFormatter/i18n/pl.ts +156 -0
- package/src/tool/jsonFormatter/i18n/pt.ts +156 -0
- package/src/tool/jsonFormatter/i18n/ru.ts +157 -0
- package/src/tool/jsonFormatter/i18n/sv.ts +157 -0
- package/src/tool/jsonFormatter/i18n/tr.ts +157 -0
- package/src/tool/jsonFormatter/i18n/zh.ts +157 -0
- package/src/tool/jsonFormatter/index.ts +15 -7
- package/src/tool/keycode/i18n/de.ts +161 -0
- package/src/tool/keycode/i18n/es.ts +2 -1
- package/src/tool/keycode/i18n/fr.ts +2 -1
- package/src/tool/keycode/i18n/id.ts +161 -0
- package/src/tool/keycode/i18n/it.ts +161 -0
- package/src/tool/keycode/i18n/ja.ts +161 -0
- package/src/tool/keycode/i18n/ko.ts +161 -0
- package/src/tool/keycode/i18n/nl.ts +161 -0
- package/src/tool/keycode/i18n/pl.ts +161 -0
- package/src/tool/keycode/i18n/pt.ts +160 -0
- package/src/tool/keycode/i18n/ru.ts +160 -0
- package/src/tool/keycode/i18n/sv.ts +160 -0
- package/src/tool/keycode/i18n/tr.ts +160 -0
- package/src/tool/keycode/i18n/zh.ts +161 -0
- package/src/tool/keycode/index.ts +15 -7
- package/src/tool/llmCostCalculator/i18n/de.ts +166 -0
- package/src/tool/llmCostCalculator/i18n/fr.ts +2 -1
- package/src/tool/llmCostCalculator/i18n/id.ts +166 -0
- package/src/tool/llmCostCalculator/i18n/it.ts +166 -0
- package/src/tool/llmCostCalculator/i18n/ja.ts +166 -0
- package/src/tool/llmCostCalculator/i18n/ko.ts +166 -0
- package/src/tool/llmCostCalculator/i18n/nl.ts +166 -0
- package/src/tool/llmCostCalculator/i18n/pl.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/pt.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/ru.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/sv.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/tr.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/zh.ts +166 -0
- package/src/tool/llmCostCalculator/index.ts +24 -0
- package/src/tool/mobileMockupGenerator/i18n/de.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/id.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/it.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/ja.ts +122 -0
- package/src/tool/mobileMockupGenerator/i18n/ko.ts +122 -0
- package/src/tool/mobileMockupGenerator/i18n/nl.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/pl.ts +31 -0
- package/src/tool/mobileMockupGenerator/i18n/pt.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/ru.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/sv.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/tr.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/zh.ts +122 -0
- package/src/tool/mobileMockupGenerator/index.ts +24 -0
- package/src/tool/musicalTypography/i18n/de.ts +179 -0
- package/src/tool/musicalTypography/i18n/id.ts +179 -0
- package/src/tool/musicalTypography/i18n/it.ts +179 -0
- package/src/tool/musicalTypography/i18n/ja.ts +180 -0
- package/src/tool/musicalTypography/i18n/ko.ts +180 -0
- package/src/tool/musicalTypography/i18n/nl.ts +179 -0
- package/src/tool/musicalTypography/i18n/pl.ts +179 -0
- package/src/tool/musicalTypography/i18n/pt.ts +101 -0
- package/src/tool/musicalTypography/i18n/ru.ts +47 -0
- package/src/tool/musicalTypography/i18n/sv.ts +29 -0
- package/src/tool/musicalTypography/i18n/tr.ts +29 -0
- package/src/tool/musicalTypography/i18n/zh.ts +30 -0
- package/src/tool/musicalTypography/index.ts +15 -7
- package/src/tool/placeholderGenerator/i18n/de.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/id.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/it.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/ja.ts +177 -0
- package/src/tool/placeholderGenerator/i18n/ko.ts +177 -0
- package/src/tool/placeholderGenerator/i18n/nl.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/pl.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/pt.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/ru.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/sv.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/tr.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/zh.ts +177 -0
- package/src/tool/placeholderGenerator/index.ts +24 -0
- package/src/tool/promptLibrary/i18n/de.ts +131 -0
- package/src/tool/promptLibrary/i18n/id.ts +131 -0
- package/src/tool/promptLibrary/i18n/it.ts +131 -0
- package/src/tool/promptLibrary/i18n/ja.ts +132 -0
- package/src/tool/promptLibrary/i18n/ko.ts +132 -0
- package/src/tool/promptLibrary/i18n/nl.ts +131 -0
- package/src/tool/promptLibrary/i18n/pl.ts +28 -0
- package/src/tool/promptLibrary/i18n/pt.ts +101 -0
- package/src/tool/promptLibrary/i18n/ru.ts +101 -0
- package/src/tool/promptLibrary/i18n/sv.ts +93 -0
- package/src/tool/promptLibrary/i18n/tr.ts +93 -0
- package/src/tool/promptLibrary/i18n/zh.ts +94 -0
- package/src/tool/promptLibrary/index.ts +24 -0
- package/src/tool/readabilityCalculator/i18n/de.ts +133 -0
- package/src/tool/readabilityCalculator/i18n/id.ts +133 -0
- package/src/tool/readabilityCalculator/i18n/it.ts +133 -0
- package/src/tool/readabilityCalculator/i18n/ja.ts +134 -0
- package/src/tool/readabilityCalculator/i18n/ko.ts +134 -0
- package/src/tool/readabilityCalculator/i18n/nl.ts +133 -0
- package/src/tool/readabilityCalculator/i18n/pl.ts +29 -0
- package/src/tool/readabilityCalculator/i18n/pt.ts +91 -0
- package/src/tool/readabilityCalculator/i18n/ru.ts +91 -0
- package/src/tool/readabilityCalculator/i18n/sv.ts +43 -0
- package/src/tool/readabilityCalculator/i18n/tr.ts +43 -0
- package/src/tool/readabilityCalculator/i18n/zh.ts +44 -0
- package/src/tool/readabilityCalculator/index.ts +24 -0
- package/src/tool/svgSanitizer/i18n/de.ts +125 -0
- package/src/tool/svgSanitizer/i18n/id.ts +125 -0
- package/src/tool/svgSanitizer/i18n/it.ts +125 -0
- package/src/tool/svgSanitizer/i18n/ja.ts +126 -0
- package/src/tool/svgSanitizer/i18n/ko.ts +126 -0
- package/src/tool/svgSanitizer/i18n/nl.ts +125 -0
- package/src/tool/svgSanitizer/i18n/pl.ts +125 -0
- package/src/tool/svgSanitizer/i18n/pt.ts +30 -0
- package/src/tool/svgSanitizer/i18n/ru.ts +126 -0
- package/src/tool/svgSanitizer/i18n/sv.ts +126 -0
- package/src/tool/svgSanitizer/i18n/tr.ts +126 -0
- package/src/tool/svgSanitizer/i18n/zh.ts +126 -0
- package/src/tool/svgSanitizer/index.ts +24 -0
- package/src/tool/svgToCss/i18n/de.ts +174 -0
- package/src/tool/svgToCss/i18n/id.ts +174 -0
- package/src/tool/svgToCss/i18n/it.ts +174 -0
- package/src/tool/svgToCss/i18n/ja.ts +175 -0
- package/src/tool/svgToCss/i18n/ko.ts +175 -0
- package/src/tool/svgToCss/i18n/nl.ts +174 -0
- package/src/tool/svgToCss/i18n/pl.ts +174 -0
- package/src/tool/svgToCss/i18n/pt.ts +174 -0
- package/src/tool/svgToCss/i18n/ru.ts +174 -0
- package/src/tool/svgToCss/i18n/sv.ts +174 -0
- package/src/tool/svgToCss/i18n/tr.ts +174 -0
- package/src/tool/svgToCss/i18n/zh.ts +175 -0
- package/src/tool/svgToCss/index.ts +15 -7
- package/src/tool/urlCleaner/i18n/de.ts +116 -0
- package/src/tool/urlCleaner/i18n/id.ts +116 -0
- package/src/tool/urlCleaner/i18n/it.ts +116 -0
- package/src/tool/urlCleaner/i18n/ja.ts +117 -0
- package/src/tool/urlCleaner/i18n/ko.ts +117 -0
- package/src/tool/urlCleaner/i18n/nl.ts +116 -0
- package/src/tool/urlCleaner/i18n/pl.ts +29 -0
- package/src/tool/urlCleaner/i18n/pt.ts +43 -0
- package/src/tool/urlCleaner/i18n/ru.ts +43 -0
- package/src/tool/urlCleaner/i18n/sv.ts +43 -0
- package/src/tool/urlCleaner/i18n/tr.ts +43 -0
- package/src/tool/urlCleaner/i18n/zh.ts +44 -0
- package/src/tool/urlCleaner/index.ts +24 -0
- package/src/tool/urlEncoderDecoder/i18n/de.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/id.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/it.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/ja.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/ko.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/nl.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/pl.ts +162 -0
- package/src/tool/urlEncoderDecoder/i18n/pt.ts +162 -0
- package/src/tool/urlEncoderDecoder/i18n/ru.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/sv.ts +163 -0
- package/src/tool/urlEncoderDecoder/i18n/tr.ts +162 -0
- package/src/tool/urlEncoderDecoder/i18n/zh.ts +163 -0
- package/src/tool/urlEncoderDecoder/index.ts +15 -7
- package/src/tool/utmGenerator/i18n/de.ts +118 -0
- package/src/tool/utmGenerator/i18n/id.ts +118 -0
- package/src/tool/utmGenerator/i18n/it.ts +118 -0
- package/src/tool/utmGenerator/i18n/ja.ts +118 -0
- package/src/tool/utmGenerator/i18n/ko.ts +118 -0
- package/src/tool/utmGenerator/i18n/nl.ts +118 -0
- package/src/tool/utmGenerator/i18n/pl.ts +117 -0
- package/src/tool/utmGenerator/i18n/pt.ts +118 -0
- package/src/tool/utmGenerator/i18n/ru.ts +118 -0
- package/src/tool/utmGenerator/i18n/sv.ts +118 -0
- package/src/tool/utmGenerator/i18n/tr.ts +117 -0
- package/src/tool/utmGenerator/i18n/zh.ts +118 -0
- package/src/tool/utmGenerator/index.ts +15 -7
- package/src/types.ts +1 -2
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { CssSpecificityCalculatorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'css-specificity-calculator';
|
|
6
|
+
const title = 'CSS 우선순위 계산기 온라인. 선택자 가중치 시각화 도구';
|
|
7
|
+
const description =
|
|
8
|
+
'CSS 선택자의 우선순위와 정확한 가중치를 계산합니다. 어떤 CSS 규칙이 캐스케이드에서 이기는지 시각적으로 확인하고 !important 남용을 방지하세요.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'CSS 우선순위란 무엇인가요?',
|
|
13
|
+
answer:
|
|
14
|
+
'CSS 우선순위(specificity)는 여러 규칙이 경쟁할 때 브라우저가 어떤 CSS 규칙을 요소에 적용할지 결정하는 알고리즘입니다. 세 열의 점수(A, B, C)로 표현되며 각각 ID, 클래스·속성·가상 클래스, 요소·가상 요소의 수를 나타냅니다.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: '클래스가 ID보다 우선순위가 높아질 수 있나요?',
|
|
18
|
+
answer:
|
|
19
|
+
'직접적으로는 불가능합니다. ID(1,0,0)는 클래스(0,N,0)가 아무리 많아도 항상 이깁니다. 우선순위 열 사이에는 자리 올림이 없기 때문입니다. 클래스 100개(0,100,0)도 ID 하나(1,0,0)를 이길 수 없습니다.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: '두 선택자의 우선순위가 같으면 어떻게 되나요?',
|
|
23
|
+
answer:
|
|
24
|
+
'두 선택자의 가중치가 완전히 같을 때는 CSS 파일에서 나중에 선언된 것이 적용됩니다. 이것이 자연스러운 캐스케이드 순서입니다. 이 계산기는 동점이 발생하면 시각적으로 알려줍니다.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: '!important 사용이 나쁜 관행으로 여겨지는 이유는 무엇인가요?',
|
|
28
|
+
answer:
|
|
29
|
+
'!important는 다른 모든 규칙을 강제로 무시하게 만들어 CSS의 자연스러운 캐스케이드를 깨뜨립니다. 규모가 큰 프로젝트에서 디버깅하기 어려운 문제를 일으킵니다. BEM 같은 방법론은 !important가 필요 없도록 우선순위를 평평하게 유지하는 것을 권장합니다.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: '첫 번째 선택자 입력',
|
|
36
|
+
text: '왼쪽 텍스트 필드에 선택자 A를 입력하세요. 예: #header .nav-item > a. ID, 클래스, 요소 카운터가 즉시 업데이트됩니다.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: '두 번째 선택자 입력',
|
|
40
|
+
text: '오른쪽 텍스트 필드에 선택자 B를 입력하세요. 예: ul li.active a:hover. 가중치가 실시간으로 변하는 것을 확인하세요.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: '결과 확인',
|
|
44
|
+
text: '이긴 선택자 블록이 초록색 배너로 강조 표시됩니다. 두 선택자가 동점이면 캐스케이드 순서가 우선순위를 결정한다는 메시지가 표시됩니다.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'FAQPage',
|
|
51
|
+
mainEntity: faqData.map((item) => ({
|
|
52
|
+
'@type': 'Question',
|
|
53
|
+
name: item.question,
|
|
54
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
55
|
+
})),
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
59
|
+
'@context': 'https://schema.org',
|
|
60
|
+
'@type': 'HowTo',
|
|
61
|
+
name: title,
|
|
62
|
+
description,
|
|
63
|
+
step: howToData.map((step, i) => ({
|
|
64
|
+
'@type': 'HowToStep',
|
|
65
|
+
position: i + 1,
|
|
66
|
+
name: step.name,
|
|
67
|
+
text: step.text,
|
|
68
|
+
})),
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
72
|
+
'@context': 'https://schema.org',
|
|
73
|
+
'@type': 'SoftwareApplication',
|
|
74
|
+
name: title,
|
|
75
|
+
description,
|
|
76
|
+
applicationCategory: 'UtilityApplication',
|
|
77
|
+
operatingSystem: 'All',
|
|
78
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
79
|
+
inLanguage: 'ko',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const ui: CssSpecificityCalculatorUI = {
|
|
83
|
+
labelA: '선택자 A',
|
|
84
|
+
labelB: '선택자 B',
|
|
85
|
+
placeholderA: '예: #header .nav-item > a',
|
|
86
|
+
placeholderB: '예: ul li.active a:hover',
|
|
87
|
+
cardIds: 'ID',
|
|
88
|
+
cardClasses: '클래스 / 가상',
|
|
89
|
+
cardElements: '요소',
|
|
90
|
+
bannerWinner: '이 선택자가 이겼습니다!',
|
|
91
|
+
msgTie: '두 선택자의 가중치가 같습니다. 같은 요소에 적용될 경우 CSS에서 <strong>나중에</strong> 작성된 쪽이 우선합니다.',
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
export const content: ToolLocaleContent<CssSpecificityCalculatorUI> = {
|
|
95
|
+
slug,
|
|
96
|
+
title,
|
|
97
|
+
description,
|
|
98
|
+
ui,
|
|
99
|
+
faqTitle: '자주 묻는 질문',
|
|
100
|
+
faq: faqData,
|
|
101
|
+
bibliographyTitle: '참고 자료 및 문서',
|
|
102
|
+
bibliography: [
|
|
103
|
+
{
|
|
104
|
+
name: 'MDN Web Docs: CSS 우선순위',
|
|
105
|
+
url: 'https://developer.mozilla.org/ko/docs/Web/CSS/Specificity',
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: 'W3C: Selectors Level 3 - 우선순위',
|
|
109
|
+
url: 'https://www.w3.org/TR/selectors-3/#specificity',
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
howTo: howToData,
|
|
113
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
|
+
seo: [
|
|
115
|
+
{
|
|
116
|
+
type: 'title',
|
|
117
|
+
text: 'CSS 우선순위란?',
|
|
118
|
+
level: 2,
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
type: 'paragraph',
|
|
122
|
+
html: 'CSS 우선순위는 브라우저가 특정 요소에 어떤 속성 값을 적용할지 결정하는 알고리즘입니다. 쉽게 말해 규칙이 "얼마나 구체적인지"를 브라우저에 알려주는 수학적 점수입니다.',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'paragraph',
|
|
126
|
+
html: '두 규칙의 우선순위가 다르면, 작성 순서와 관계없이 가중치가 높은 쪽이 이깁니다. 가중치가 같으면 소스 코드에서 나중에 선언된 것이 적용됩니다.',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
type: 'title',
|
|
130
|
+
text: 'CSS 우선순위 계산 방법',
|
|
131
|
+
level: 3,
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
type: 'paragraph',
|
|
135
|
+
html: '우선순위는 세 가지 범주를 기반으로 계산되어 <strong>(A, B, C)</strong>라는 세 열의 가중치로 표현됩니다:',
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
type: 'list',
|
|
139
|
+
items: [
|
|
140
|
+
'<strong>열 A (ID):</strong> 고유 식별자의 수를 셉니다. 예: <code>#header</code>는 열 A에서 1로 계산됩니다.',
|
|
141
|
+
'<strong>열 B (클래스, 속성, 가상 클래스):</strong> 모든 클래스(<code>.button</code>), 속성(<code>[type="text"]</code>), 가상 클래스(<code>:hover</code>)를 셉니다.',
|
|
142
|
+
'<strong>열 C (요소, 가상 요소):</strong> 모든 HTML 요소(<code>div</code>, <code>h1</code>)와 가상 요소(<code>::before</code>)를 셉니다.',
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'title',
|
|
147
|
+
text: '황금 규칙: 열 간 자리 올림은 없다',
|
|
148
|
+
level: 3,
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
type: 'tip',
|
|
152
|
+
html: '우선순위가 (0,50,0)인 규칙은 (1,0,0)인 규칙보다 <strong>절대로</strong> 강해질 수 없습니다. <strong>ID 하나가 클래스 수백 개를 이깁니다.</strong> 열은 서로 넘쳐흐르지 않습니다.',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'title',
|
|
156
|
+
text: '!important의 문제점과 BEM 아키텍처',
|
|
157
|
+
level: 3,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
type: 'paragraph',
|
|
161
|
+
html: '<code>!important</code>는 우선순위 규칙의 예외입니다. 사용하면 해당 선언이 다른 모든 규칙을 자동으로 덮어씁니다. 자연스러운 캐스케이드를 파괴하기 때문에 나쁜 관행으로 여겨집니다.',
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
type: 'paragraph',
|
|
165
|
+
html: '대규모 프로젝트에서 우선순위 충돌을 피하기 위해 <strong>BEM</strong>과 같은 방법론은 단일 깊이의 클래스 선택자만 사용하여 우선순위를 (0,1,0)으로 평평하게 유지하는 것을 권장합니다.',
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
};
|
|
169
|
+
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { CssSpecificityCalculatorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'css-specificiteit-calculator';
|
|
6
|
+
const title = 'CSS Specificiteitsrekenmachine Online. Selectorgewicht Visualiseren';
|
|
7
|
+
const description =
|
|
8
|
+
'Bereken de specificiteit en het exacte gewicht van elk CSS-selector. Een visuele tool om te begrijpen welke CSS-regel de cascade wint en het gebruik van !important te vermijden.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Wat is CSS-specificiteit?',
|
|
13
|
+
answer:
|
|
14
|
+
'Specificiteit is het algoritme dat browsers gebruiken om te beslissen welke CSS-regel op een element wordt toegepast wanneer meerdere regels concurreren. Het wordt weergegeven als een driekolomsscore (A, B, C) die respectievelijk ID\'s, klassen/attributen/pseudo-klassen en elementen/pseudo-elementen aangeeft.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Kan een klasse ooit een ID verslaan in specificiteit?',
|
|
18
|
+
answer:
|
|
19
|
+
'Niet direct. Een ID (1,0,0) verslaat altijd elk aantal klassen (0,N,0) omdat specificiteit geen doorloop heeft tussen kolommen. Honderd klassen (0,100,0) zullen nooit één enkel ID (1,0,0) verslaan.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Wat gebeurt er als twee selectors dezelfde specificiteit hebben?',
|
|
23
|
+
answer:
|
|
24
|
+
'Wanneer twee selectors exact hetzelfde gewicht hebben, wint degene die het laatst in het CSS-bestand is gedeclareerd. Dit staat bekend als de natuurlijke cascadevolgorde. Deze rekenmachine waarschuwt je visueel wanneer er een gelijkspel optreedt.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Waarom wordt het gebruik van !important als slechte praktijk beschouwd?',
|
|
28
|
+
answer:
|
|
29
|
+
'De !important-richtlijn doorbreekt de natuurlijke CSS-cascade door een declaratie te forceren boven elke andere regel. Dit leidt tot conflicten die moeilijk te debuggen zijn in grote projecten. Methodologieën zoals BEM pleiten voor het vlak houden van specificiteit om !important nooit nodig te hebben.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Voer de eerste selector in',
|
|
36
|
+
text: 'Typ selector A in het linker tekstveld, bijvoorbeeld: #header .nav-item > a. De tellers voor ID\'s, Klassen en Elementen worden direct bijgewerkt.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Voer de tweede selector in',
|
|
40
|
+
text: 'Typ selector B in het rechter tekstveld, bijvoorbeeld: ul li.active a:hover. Bekijk hoe de gewichten in realtime veranderen.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Lees het resultaat',
|
|
44
|
+
text: 'De rekenmachine markeert het winnende selectorblok met een groen banner. Als beide gelijkspelen, verschijnt er een bericht dat de cascadevolgorde als beslisser uitlegt.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'FAQPage',
|
|
51
|
+
mainEntity: faqData.map((item) => ({
|
|
52
|
+
'@type': 'Question',
|
|
53
|
+
name: item.question,
|
|
54
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
55
|
+
})),
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
59
|
+
'@context': 'https://schema.org',
|
|
60
|
+
'@type': 'HowTo',
|
|
61
|
+
name: title,
|
|
62
|
+
description,
|
|
63
|
+
step: howToData.map((step, i) => ({
|
|
64
|
+
'@type': 'HowToStep',
|
|
65
|
+
position: i + 1,
|
|
66
|
+
name: step.name,
|
|
67
|
+
text: step.text,
|
|
68
|
+
})),
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
72
|
+
'@context': 'https://schema.org',
|
|
73
|
+
'@type': 'SoftwareApplication',
|
|
74
|
+
name: title,
|
|
75
|
+
description,
|
|
76
|
+
applicationCategory: 'UtilityApplication',
|
|
77
|
+
operatingSystem: 'All',
|
|
78
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
79
|
+
inLanguage: 'nl',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const ui: CssSpecificityCalculatorUI = {
|
|
83
|
+
labelA: 'Selector A',
|
|
84
|
+
labelB: 'Selector B',
|
|
85
|
+
placeholderA: 'bijv. #header .nav-item > a',
|
|
86
|
+
placeholderB: 'bijv. ul li.active a:hover',
|
|
87
|
+
cardIds: 'ID\'s',
|
|
88
|
+
cardClasses: 'Klassen / Pseudo\'s',
|
|
89
|
+
cardElements: 'Elementen',
|
|
90
|
+
bannerWinner: 'Deze selector wint!',
|
|
91
|
+
msgTie: 'Beide selectors hebben hetzelfde gewicht. Als ze concurreren voor hetzelfde element, wint degene die <strong>als laatste</strong> in de CSS staat.',
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
export const content: ToolLocaleContent<CssSpecificityCalculatorUI> = {
|
|
95
|
+
slug,
|
|
96
|
+
title,
|
|
97
|
+
description,
|
|
98
|
+
ui,
|
|
99
|
+
faqTitle: 'Veelgestelde Vragen',
|
|
100
|
+
faq: faqData,
|
|
101
|
+
bibliographyTitle: 'Referenties en Documentatie',
|
|
102
|
+
bibliography: [
|
|
103
|
+
{
|
|
104
|
+
name: 'MDN Web Docs: CSS-specificiteit',
|
|
105
|
+
url: 'https://developer.mozilla.org/nl/docs/Web/CSS/Specificity',
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: 'W3C: Selectors Level 3 - Specificiteit',
|
|
109
|
+
url: 'https://www.w3.org/TR/selectors-3/#specificity',
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
howTo: howToData,
|
|
113
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
|
+
seo: [
|
|
115
|
+
{
|
|
116
|
+
type: 'title',
|
|
117
|
+
text: 'Wat is CSS-specificiteit?',
|
|
118
|
+
level: 2,
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
type: 'paragraph',
|
|
122
|
+
html: 'CSS-specificiteit is het algoritme waarmee browsers bepalen welke eigenschapswaarden op een bepaald element worden toegepast. Het is in feite een wiskundig getal dat de browser vertelt hoe "specifiek" een regel is.',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'paragraph',
|
|
126
|
+
html: 'Als twee regels verschillende specificiteitsniveaus hebben, wint degene met het hoogste gewicht, ongeacht de volgorde waarin ze zijn geschreven. Als beide hetzelfde gewicht hebben, wint de laatste die in de broncode is gedeclareerd.',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
type: 'title',
|
|
130
|
+
text: 'CSS-specificiteit berekenen',
|
|
131
|
+
level: 3,
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
type: 'paragraph',
|
|
135
|
+
html: 'Specificiteit wordt berekend op basis van drie categorieën die samen een driekolomsgewicht vormen, vaak uitgedrukt als <strong>(A, B, C)</strong>:',
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
type: 'list',
|
|
139
|
+
items: [
|
|
140
|
+
'<strong>Kolom A (ID\'s):</strong> Telt het aantal unieke identificatoren. Voorbeeld: <code>#header</code> telt als 1 in kolom A.',
|
|
141
|
+
'<strong>Kolom B (Klassen, Attributen en Pseudo-klassen):</strong> Telt alle klassen (<code>.button</code>), attributen (<code>[type="text"]</code>) en pseudo-klassen (<code>:hover</code>).',
|
|
142
|
+
'<strong>Kolom C (Elementen en Pseudo-elementen):</strong> Telt alle HTML-elementen (<code>div</code>, <code>h1</code>) en pseudo-elementen (<code>::before</code>).',
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'title',
|
|
147
|
+
text: 'De gouden regel: geen numerieke doorloop',
|
|
148
|
+
level: 3,
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
type: 'tip',
|
|
152
|
+
html: 'Een regel met specificiteit (0,50,0) zal <strong>nooit</strong> specifieker zijn dan een regel (1,0,0). <strong>Één enkel ID verslaat oneindig veel klassen.</strong> Kolommen lopen nooit in elkaar over.',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'title',
|
|
156
|
+
text: 'Het probleem met !important en BEM-architectuur',
|
|
157
|
+
level: 3,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
type: 'paragraph',
|
|
161
|
+
html: 'De <code>!important</code>-richtlijn is een uitzondering op de specificiteitsregels. Wanneer gebruikt, overschrijft die declaratie automatisch alles. Het wordt als slechte praktijk beschouwd omdat het de natuurlijke cascade vernietigt.',
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
type: 'paragraph',
|
|
165
|
+
html: 'Om specificiteitsoorlogen in grote projecten te vermijden, pleiten methodologieën zoals <strong>BEM</strong> voor het gebruik van uitsluitend één niveau van klasse-selectors, waardoor de specificiteit kunstmatig vlak op (0,1,0) wordt gehouden.',
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
};
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { CssSpecificityCalculatorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'kalkulator-specyficznosci-css';
|
|
6
|
+
const title = 'Kalkulator Specyficzności CSS Online. Wizualizator Wagi Selektora';
|
|
7
|
+
const description =
|
|
8
|
+
'Oblicz specyficzność i dokładną wagę dowolnego selektora CSS. Narzędzie wizualne, które pomoże zrozumieć, która reguła CSS wygrywa kaskadę i uniknąć używania !important.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Czym jest specyficzność CSS?',
|
|
13
|
+
answer:
|
|
14
|
+
'Specyficzność to algorytm, którego przeglądarki używają do rozstrzygania, która reguła CSS zostanie zastosowana do elementu, gdy rywalizuje kilka reguł naraz. Wyrażana jest jako trzycyfrowy wynik (A, B, C) oznaczający odpowiednio: identyfikatory, klasy/atrybuty/pseudoklasy oraz elementy/pseudoelementy.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Czy klasa może kiedykolwiek pokonać ID pod względem specyficzności?',
|
|
18
|
+
answer:
|
|
19
|
+
'Nie, bezpośrednio nie. ID (1,0,0) zawsze bije dowolną liczbę klas (0,N,0), bo specyficzność nie przenosi wartości między kolumnami. Sto klas (0,100,0) nigdy nie pokona jednego ID (1,0,0).',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Co się dzieje, gdy dwa selektory mają tę samą specyficzność?',
|
|
23
|
+
answer:
|
|
24
|
+
'Gdy dwa selektory mają dokładnie tę samą wagę, wygrywa ten zadeklarowany później w pliku CSS. Nazywa się to naturalnym porządkiem kaskady. Kalkulator wyświetli wizualne ostrzeżenie, gdy dojdzie do remisu.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Dlaczego używanie !important uchodzi za złą praktykę?',
|
|
28
|
+
answer:
|
|
29
|
+
'Dyrektywa !important zaburza naturalną kaskadę CSS, wymuszając daną deklarację ponad wszelkimi innymi regułami. Prowadzi to do konfliktów trudnych do debugowania w dużych projektach. Metodologie takie jak BEM zalecają utrzymywanie płaskiej specyficzności, by nigdy nie potrzebować !important.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Wpisz pierwszy selektor',
|
|
36
|
+
text: 'Wpisz Selektor A w lewym polu tekstowym, na przykład: #header .nav-item > a. Liczniki ID, Klas i Elementów zaktualizują się natychmiast.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Wpisz drugi selektor',
|
|
40
|
+
text: 'Wpisz Selektor B w prawym polu tekstowym, na przykład: ul li.active a:hover. Obserwuj, jak wagi zmieniają się w czasie rzeczywistym.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Odczytaj wynik',
|
|
44
|
+
text: 'Kalkulator podświetli zielonym banerem blok zwycięskiego selektora. W przypadku remisu pojawi się komunikat wyjaśniający, że decyduje porządek kaskady.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'FAQPage',
|
|
51
|
+
mainEntity: faqData.map((item) => ({
|
|
52
|
+
'@type': 'Question',
|
|
53
|
+
name: item.question,
|
|
54
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
55
|
+
})),
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
59
|
+
'@context': 'https://schema.org',
|
|
60
|
+
'@type': 'HowTo',
|
|
61
|
+
name: title,
|
|
62
|
+
description,
|
|
63
|
+
step: howToData.map((step, i) => ({
|
|
64
|
+
'@type': 'HowToStep',
|
|
65
|
+
position: i + 1,
|
|
66
|
+
name: step.name,
|
|
67
|
+
text: step.text,
|
|
68
|
+
})),
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
72
|
+
'@context': 'https://schema.org',
|
|
73
|
+
'@type': 'SoftwareApplication',
|
|
74
|
+
name: title,
|
|
75
|
+
description,
|
|
76
|
+
applicationCategory: 'UtilityApplication',
|
|
77
|
+
operatingSystem: 'All',
|
|
78
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
79
|
+
inLanguage: 'pl',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const ui: CssSpecificityCalculatorUI = {
|
|
83
|
+
labelA: 'Selektor A',
|
|
84
|
+
labelB: 'Selektor B',
|
|
85
|
+
placeholderA: 'np. #header .nav-item > a',
|
|
86
|
+
placeholderB: 'np. ul li.active a:hover',
|
|
87
|
+
cardIds: 'ID',
|
|
88
|
+
cardClasses: 'Klasy / Pseudo',
|
|
89
|
+
cardElements: 'Elementy',
|
|
90
|
+
bannerWinner: 'Ten selektor wygrywa!',
|
|
91
|
+
msgTie: 'Oba selektory mają tę samą wagę. Jeśli rywalizują o ten sam element, wygrywa ten napisany <strong>jako ostatni</strong> w CSS.',
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
export const content: ToolLocaleContent<CssSpecificityCalculatorUI> = {
|
|
95
|
+
slug,
|
|
96
|
+
title,
|
|
97
|
+
description,
|
|
98
|
+
ui,
|
|
99
|
+
faqTitle: 'Często zadawane pytania',
|
|
100
|
+
faq: faqData,
|
|
101
|
+
bibliographyTitle: 'Źródła i Dokumentacja',
|
|
102
|
+
bibliography: [
|
|
103
|
+
{
|
|
104
|
+
name: 'MDN Web Docs: Specyficzność CSS',
|
|
105
|
+
url: 'https://developer.mozilla.org/pl/docs/Web/CSS/Specificity',
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: 'W3C: Selectors Level 3 - Specyficzność',
|
|
109
|
+
url: 'https://www.w3.org/TR/selectors-3/#specificity',
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
howTo: howToData,
|
|
113
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
|
+
seo: [
|
|
115
|
+
{
|
|
116
|
+
type: 'title',
|
|
117
|
+
text: 'Czym jest specyficzność CSS?',
|
|
118
|
+
level: 2,
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
type: 'paragraph',
|
|
122
|
+
html: 'Specyficzność CSS to algorytm, według którego przeglądarki decydują, które wartości właściwości zastosować do danego elementu. To nic innego jak matematyczny wynik, który mówi przeglądarce, jak bardzo „szczegółowa" jest dana reguła.',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'paragraph',
|
|
126
|
+
html: 'Jeśli dwie reguły mają różne poziomy specyficzności, wygrywa ta o wyższej wadze — niezależnie od kolejności, w jakiej zostały napisane. Gdy obie mają tę samą wagę, decyduje ta zadeklarowana później w kodzie źródłowym.',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
type: 'title',
|
|
130
|
+
text: 'Jak oblicza się specyficzność CSS',
|
|
131
|
+
level: 3,
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
type: 'paragraph',
|
|
135
|
+
html: 'Specyficzność obliczana jest w oparciu o trzy kategorie, tworzące trzycyfrową wagę, często zapisywaną jako <strong>(A, B, C)</strong>:',
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
type: 'list',
|
|
139
|
+
items: [
|
|
140
|
+
'<strong>Kolumna A (ID):</strong> Liczy liczbę unikalnych identyfikatorów. Przykład: <code>#header</code> to 1 w kolumnie A.',
|
|
141
|
+
'<strong>Kolumna B (Klasy, Atrybuty i Pseudoklasy):</strong> Liczy wszystkie klasy (<code>.button</code>), atrybuty (<code>[type="text"]</code>) i pseudoklasy (<code>:hover</code>).',
|
|
142
|
+
'<strong>Kolumna C (Elementy i Pseudoelementy):</strong> Liczy wszystkie elementy HTML (<code>div</code>, <code>h1</code>) i pseudoelementy (<code>::before</code>).',
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'title',
|
|
147
|
+
text: 'Złota zasada: brak przeniesień między kolumnami',
|
|
148
|
+
level: 3,
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
type: 'tip',
|
|
152
|
+
html: 'Reguła o specyficzności (0,50,0) <strong>nigdy</strong> nie będzie bardziej szczegółowa niż reguła (1,0,0). <strong>Jeden ID bije nieskończoną liczbę klas.</strong> Kolumny nigdy nie przelewają się do siebie.',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'title',
|
|
156
|
+
text: 'Problem z !important i architektura BEM',
|
|
157
|
+
level: 3,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
type: 'paragraph',
|
|
161
|
+
html: 'Dyrektywa <code>!important</code> stanowi wyjątek od zasad specyficzności. Gdy zostanie użyta, dana deklaracja automatycznie nadpisuje każdą inną. Uchodzi za złą praktykę, bo niszczy naturalną kaskadę.',
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
type: 'paragraph',
|
|
165
|
+
html: 'Aby unikać wojen specyficzności w dużych projektach, metodologie takie jak <strong>BEM</strong> promują stosowanie wyłącznie jednopoziomowych selektorów klasowych, sztucznie utrzymując specyficzność na płaskim poziomie (0,1,0).',
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
};
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { CssSpecificityCalculatorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'calculadora-especificidade-css';
|
|
6
|
+
const title = 'Calculadora de Especificidade CSS Online. Visualizador de Peso de Seletores';
|
|
7
|
+
const description =
|
|
8
|
+
'Calcule a especificidade e o peso exato de qualquer seletor CSS. Ferramenta visual para entender qual regra CSS vence a cascata e evitar o uso de !important.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'O que é especificidade CSS?',
|
|
13
|
+
answer:
|
|
14
|
+
'A especificidade é o algoritmo que os browsers usam para decidir qual regra CSS aplicar a um elemento quando várias regras competem entre si. É representada como uma pontuação de três colunas (A, B, C) que indica, respetivamente, IDs, classes/atributos/pseudo-classes e elementos/pseudo-elementos.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Uma classe pode alguma vez superar um ID em especificidade?',
|
|
18
|
+
answer:
|
|
19
|
+
'Não diretamente. Um ID (1,0,0) bate sempre qualquer número de classes (0,N,0), porque a especificidade não tem transporte numérico entre colunas. Cem classes (0,100,0) nunca vão superar um único ID (1,0,0).',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'O que acontece quando dois seletores têm a mesma especificidade?',
|
|
23
|
+
answer:
|
|
24
|
+
'Quando dois seletores têm exatamente o mesmo peso, vence aquele que foi declarado por último no ficheiro CSS. A isso chama-se a ordem natural da cascata. Esta calculadora avisa-te visualmente quando ocorre um empate.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Por que usar !important é considerado má prática?',
|
|
28
|
+
answer:
|
|
29
|
+
'A diretiva !important quebra a cascata CSS natural ao forçar uma declaração sobre qualquer outra regra. Isso cria conflitos difíceis de depurar em projetos grandes. Metodologias como o BEM defendem manter a especificidade plana para nunca precisar de !important.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Escreve o primeiro seletor',
|
|
36
|
+
text: 'Escreve o Seletor A no campo de texto da esquerda, por exemplo: #header .nav-item > a. Os contadores de IDs, Classes e Elementos atualizam-se instantaneamente.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Escreve o segundo seletor',
|
|
40
|
+
text: 'Escreve o Seletor B no campo de texto da direita, por exemplo: ul li.active a:hover. Observa como os pesos mudam em tempo real.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Lê o resultado',
|
|
44
|
+
text: 'A calculadora realça com um banner verde o bloco do seletor vencedor. Se ambos empatarem, aparece uma mensagem a explicar que a ordem da cascata serve de desempate.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
49
|
+
'@context': 'https://schema.org',
|
|
50
|
+
'@type': 'FAQPage',
|
|
51
|
+
mainEntity: faqData.map((item) => ({
|
|
52
|
+
'@type': 'Question',
|
|
53
|
+
name: item.question,
|
|
54
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
55
|
+
})),
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
59
|
+
'@context': 'https://schema.org',
|
|
60
|
+
'@type': 'HowTo',
|
|
61
|
+
name: title,
|
|
62
|
+
description,
|
|
63
|
+
step: howToData.map((step, i) => ({
|
|
64
|
+
'@type': 'HowToStep',
|
|
65
|
+
position: i + 1,
|
|
66
|
+
name: step.name,
|
|
67
|
+
text: step.text,
|
|
68
|
+
})),
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
72
|
+
'@context': 'https://schema.org',
|
|
73
|
+
'@type': 'SoftwareApplication',
|
|
74
|
+
name: title,
|
|
75
|
+
description,
|
|
76
|
+
applicationCategory: 'UtilityApplication',
|
|
77
|
+
operatingSystem: 'All',
|
|
78
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
79
|
+
inLanguage: 'pt',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const ui: CssSpecificityCalculatorUI = {
|
|
83
|
+
labelA: 'Seletor A',
|
|
84
|
+
labelB: 'Seletor B',
|
|
85
|
+
placeholderA: 'ex. #header .nav-item > a',
|
|
86
|
+
placeholderB: 'ex. ul li.active a:hover',
|
|
87
|
+
cardIds: 'IDs',
|
|
88
|
+
cardClasses: 'Classes / Pseudos',
|
|
89
|
+
cardElements: 'Elementos',
|
|
90
|
+
bannerWinner: 'Este seletor vence!',
|
|
91
|
+
msgTie: 'Ambos os seletores têm o mesmo peso. Se competirem pelo mesmo elemento, vence o que estiver escrito <strong>por último</strong> no CSS.',
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
export const content: ToolLocaleContent<CssSpecificityCalculatorUI> = {
|
|
95
|
+
slug,
|
|
96
|
+
title,
|
|
97
|
+
description,
|
|
98
|
+
ui,
|
|
99
|
+
faqTitle: 'Perguntas Frequentes',
|
|
100
|
+
faq: faqData,
|
|
101
|
+
bibliographyTitle: 'Referências e Documentação',
|
|
102
|
+
bibliography: [
|
|
103
|
+
{
|
|
104
|
+
name: 'MDN Web Docs: Especificidade CSS',
|
|
105
|
+
url: 'https://developer.mozilla.org/pt/docs/Web/CSS/Specificity',
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: 'W3C: Selectors Level 3 - Especificidade',
|
|
109
|
+
url: 'https://www.w3.org/TR/selectors-3/#specificity',
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
howTo: howToData,
|
|
113
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
114
|
+
seo: [
|
|
115
|
+
{
|
|
116
|
+
type: 'title',
|
|
117
|
+
text: 'O que é a Especificidade CSS?',
|
|
118
|
+
level: 2,
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
type: 'paragraph',
|
|
122
|
+
html: 'A especificidade CSS é o algoritmo pelo qual os browsers decidem que valores de propriedades aplicar a um determinado elemento. É essencialmente uma pontuação matemática que diz ao browser "quão específica" é uma regra.',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'paragraph',
|
|
126
|
+
html: 'Se duas regras têm níveis de especificidade diferentes, vence a que tiver maior peso, independentemente da ordem em que foram escritas. Se tiverem o mesmo peso, vence a última declarada no código fonte.',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
type: 'title',
|
|
130
|
+
text: 'Como calcular a especificidade CSS',
|
|
131
|
+
level: 3,
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
type: 'paragraph',
|
|
135
|
+
html: 'A especificidade calcula-se com base em três categorias que formam um peso de três colunas, normalmente expresso como <strong>(A, B, C)</strong>:',
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
type: 'list',
|
|
139
|
+
items: [
|
|
140
|
+
'<strong>Coluna A (IDs):</strong> Conta o número de identificadores únicos. Exemplo: <code>#header</code> conta como 1 na coluna A.',
|
|
141
|
+
'<strong>Coluna B (Classes, Atributos e Pseudo-classes):</strong> Conta todas as classes (<code>.button</code>), atributos (<code>[type="text"]</code>) e pseudo-classes (<code>:hover</code>).',
|
|
142
|
+
'<strong>Coluna C (Elementos e Pseudo-elementos):</strong> Conta todos os elementos HTML (<code>div</code>, <code>h1</code>) e pseudo-elementos (<code>::before</code>).',
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'title',
|
|
147
|
+
text: 'A regra de ouro: sem transporte numérico',
|
|
148
|
+
level: 3,
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
type: 'tip',
|
|
152
|
+
html: 'Uma regra com especificidade (0,50,0) <strong>nunca</strong> será mais específica do que uma regra (1,0,0). <strong>Um único ID bate infinitas classes.</strong> As colunas nunca transbordam umas para as outras.',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'title',
|
|
156
|
+
text: 'O problema do !important e a arquitetura BEM',
|
|
157
|
+
level: 3,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
type: 'paragraph',
|
|
161
|
+
html: 'A diretiva <code>!important</code> é uma exceção às regras de especificidade. Quando usada, essa declaração sobrescreve automaticamente qualquer outra. Considera-se má prática porque destrói a cascata natural.',
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
type: 'paragraph',
|
|
165
|
+
html: 'Para evitar guerras de especificidade em projetos grandes, metodologias como o <strong>BEM</strong> defendem o uso exclusivo de seletores de classe com um único nível de profundidade, mantendo artificialmente a especificidade plana em (0,1,0).',
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
};
|