@jjlmoya/utils-textiles 1.20.0 → 1.22.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/category/i18n/de.ts +76 -76
- package/src/category/i18n/en.ts +76 -76
- package/src/category/i18n/es.ts +76 -76
- package/src/category/i18n/fr.ts +76 -76
- package/src/category/i18n/id.ts +76 -76
- package/src/category/i18n/it.ts +76 -76
- package/src/category/i18n/ja.ts +76 -76
- package/src/category/i18n/ko.ts +76 -76
- package/src/category/i18n/nl.ts +76 -76
- package/src/category/i18n/pl.ts +76 -76
- package/src/category/i18n/pt.ts +76 -76
- package/src/category/i18n/ru.ts +76 -76
- package/src/category/i18n/sv.ts +76 -76
- package/src/category/i18n/zh.ts +76 -76
- package/src/category/index.ts +2 -0
- package/src/category/seo.astro +1 -1
- package/src/components/PreviewNavSidebar.astro +1 -1
- package/src/components/PreviewToolbar.astro +1 -1
- package/src/data.ts +1 -1
- package/src/entries.ts +4 -1
- package/src/env.d.ts +1 -1
- package/src/index.ts +1 -1
- package/src/layouts/PreviewLayout.astro +113 -113
- package/src/pages/index.astro +1 -1
- package/src/tests/faq_count.test.ts +19 -19
- package/src/tests/i18n_coverage.test.ts +4 -2
- package/src/tests/locale_spelling.test.ts +44 -0
- package/src/tests/mocks/astro_mock.js +1 -1
- package/src/tests/no_en_dash.test.ts +70 -70
- package/src/tests/no_h1_in_components.test.ts +1 -1
- package/src/tests/seo_length.test.ts +22 -22
- package/src/tests/seo_translation_completeness.test.ts +69 -0
- package/src/tests/spanish_leakage.test.ts +175 -153
- package/src/tests/tool_validation.test.ts +17 -17
- package/src/tool/burnTest/i18n/es.ts +211 -211
- package/src/tool/burnTest/i18n/fr.ts +211 -211
- package/src/tool/burnTest/i18n/ja.ts +211 -211
- package/src/tool/burnTest/i18n/ko.ts +211 -211
- package/src/tool/burnTest/i18n/pl.ts +211 -211
- package/src/tool/burnTest/i18n/ru.ts +211 -211
- package/src/tool/burnTest/i18n/sv.ts +211 -211
- package/src/tool/burnTest/i18n/zh.ts +211 -211
- package/src/tool/burnTest/seo.astro +15 -15
- package/src/tool/clothingSizeConverter/i18n/de.ts +348 -348
- package/src/tool/clothingSizeConverter/i18n/en.ts +348 -348
- package/src/tool/clothingSizeConverter/i18n/fr.ts +348 -348
- package/src/tool/clothingSizeConverter/i18n/ja.ts +348 -348
- package/src/tool/clothingSizeConverter/i18n/ko.ts +348 -348
- package/src/tool/clothingSizeConverter/i18n/nl.ts +348 -348
- package/src/tool/clothingSizeConverter/i18n/pl.ts +348 -348
- package/src/tool/clothingSizeConverter/i18n/ru.ts +348 -348
- package/src/tool/clothingSizeConverter/i18n/sv.ts +348 -348
- package/src/tool/clothingSizeConverter/i18n/tr.ts +348 -348
- package/src/tool/clothingSizeConverter/i18n/zh.ts +348 -348
- package/src/tool/clothingSizeConverter/seo.astro +15 -15
- package/src/tool/embroideryStitchPricingEstimator/bibliography.astro +6 -0
- package/src/tool/embroideryStitchPricingEstimator/bibliography.ts +12 -0
- package/src/tool/embroideryStitchPricingEstimator/component.astro +111 -0
- package/src/tool/embroideryStitchPricingEstimator/controller.ts +111 -0
- package/src/tool/embroideryStitchPricingEstimator/dom-views.ts +94 -0
- package/src/tool/embroideryStitchPricingEstimator/embroidery-stitch-count-pricing-estimator.css +438 -0
- package/src/tool/embroideryStitchPricingEstimator/entry.ts +29 -0
- package/src/tool/embroideryStitchPricingEstimator/evaluator.ts +22 -0
- package/src/tool/embroideryStitchPricingEstimator/i18n/de.ts +38 -0
- package/src/tool/embroideryStitchPricingEstimator/i18n/en.ts +194 -0
- package/src/tool/embroideryStitchPricingEstimator/i18n/es.ts +38 -0
- package/src/tool/embroideryStitchPricingEstimator/i18n/fr.ts +38 -0
- package/src/tool/embroideryStitchPricingEstimator/i18n/id.ts +38 -0
- package/src/tool/embroideryStitchPricingEstimator/i18n/it.ts +38 -0
- package/src/tool/embroideryStitchPricingEstimator/i18n/ja.ts +38 -0
- package/src/tool/embroideryStitchPricingEstimator/i18n/ko.ts +38 -0
- package/src/tool/embroideryStitchPricingEstimator/i18n/nl.ts +38 -0
- package/src/tool/embroideryStitchPricingEstimator/i18n/pl.ts +38 -0
- package/src/tool/embroideryStitchPricingEstimator/i18n/pt.ts +38 -0
- package/src/tool/embroideryStitchPricingEstimator/i18n/ru.ts +38 -0
- package/src/tool/embroideryStitchPricingEstimator/i18n/sv.ts +38 -0
- package/src/tool/embroideryStitchPricingEstimator/i18n/tr.ts +38 -0
- package/src/tool/embroideryStitchPricingEstimator/i18n/zh.ts +38 -0
- package/src/tool/embroideryStitchPricingEstimator/index.ts +11 -0
- package/src/tool/embroideryStitchPricingEstimator/logic.test.ts +40 -0
- package/src/tool/embroideryStitchPricingEstimator/logic.ts +86 -0
- package/src/tool/embroideryStitchPricingEstimator/seo.astro +15 -0
- package/src/tool/embroideryStitchPricingEstimator/storage.ts +20 -0
- package/src/tool/embroideryStitchPricingEstimator/ui.ts +53 -0
- package/src/tool/fabricProjectCalculator/i18n/de.ts +236 -236
- package/src/tool/fabricProjectCalculator/i18n/ja.ts +236 -236
- package/src/tool/fabricProjectCalculator/i18n/ko.ts +236 -236
- package/src/tool/fabricProjectCalculator/i18n/nl.ts +236 -236
- package/src/tool/fabricProjectCalculator/i18n/pl.ts +236 -236
- package/src/tool/fabricProjectCalculator/i18n/ru.ts +236 -236
- package/src/tool/fabricProjectCalculator/i18n/sv.ts +236 -236
- package/src/tool/fabricProjectCalculator/i18n/tr.ts +236 -236
- package/src/tool/fabricProjectCalculator/i18n/zh.ts +236 -236
- package/src/tool/fabricProjectCalculator/seo.astro +15 -15
- package/src/tool/fabricTruth/i18n/de.ts +268 -268
- package/src/tool/fabricTruth/i18n/en.ts +268 -268
- package/src/tool/fabricTruth/i18n/es.ts +302 -302
- package/src/tool/fabricTruth/i18n/fr.ts +268 -268
- package/src/tool/fabricTruth/i18n/id.ts +268 -268
- package/src/tool/fabricTruth/i18n/it.ts +268 -268
- package/src/tool/fabricTruth/i18n/ja.ts +268 -268
- package/src/tool/fabricTruth/i18n/ko.ts +268 -268
- package/src/tool/fabricTruth/i18n/nl.ts +268 -268
- package/src/tool/fabricTruth/i18n/pl.ts +268 -268
- package/src/tool/fabricTruth/i18n/pt.ts +268 -268
- package/src/tool/fabricTruth/i18n/ru.ts +268 -268
- package/src/tool/fabricTruth/i18n/sv.ts +268 -268
- package/src/tool/fabricTruth/i18n/tr.ts +268 -268
- package/src/tool/fabricTruth/i18n/zh.ts +272 -272
- package/src/tool/fabricTruth/seo.astro +15 -15
- package/src/tool/fiberPrep/i18n/de.ts +215 -215
- package/src/tool/fiberPrep/i18n/fr.ts +215 -215
- package/src/tool/fiberPrep/i18n/ja.ts +215 -215
- package/src/tool/fiberPrep/i18n/ko.ts +215 -215
- package/src/tool/fiberPrep/i18n/nl.ts +215 -215
- package/src/tool/fiberPrep/i18n/pl.ts +215 -215
- package/src/tool/fiberPrep/i18n/ru.ts +215 -215
- package/src/tool/fiberPrep/i18n/sv.ts +215 -215
- package/src/tool/fiberPrep/i18n/tr.ts +215 -215
- package/src/tool/fiberPrep/i18n/zh.ts +215 -215
- package/src/tool/fiberPrep/seo.astro +15 -15
- package/src/tool/knittingGauge/i18n/de.ts +224 -224
- package/src/tool/knittingGauge/i18n/ja.ts +224 -224
- package/src/tool/knittingGauge/i18n/ko.ts +224 -224
- package/src/tool/knittingGauge/i18n/pl.ts +224 -224
- package/src/tool/knittingGauge/i18n/ru.ts +224 -224
- package/src/tool/knittingGauge/i18n/tr.ts +224 -224
- package/src/tool/knittingGauge/i18n/zh.ts +224 -224
- package/src/tool/knittingGauge/seo.astro +15 -15
- package/src/tool/laundryGuide/i18n/de.ts +271 -271
- package/src/tool/laundryGuide/i18n/en.ts +271 -271
- package/src/tool/laundryGuide/i18n/es.ts +271 -271
- package/src/tool/laundryGuide/i18n/fr.ts +255 -255
- package/src/tool/laundryGuide/i18n/id.ts +271 -271
- package/src/tool/laundryGuide/i18n/it.ts +271 -271
- package/src/tool/laundryGuide/i18n/ja.ts +271 -271
- package/src/tool/laundryGuide/i18n/ko.ts +271 -271
- package/src/tool/laundryGuide/i18n/nl.ts +271 -271
- package/src/tool/laundryGuide/i18n/pl.ts +271 -271
- package/src/tool/laundryGuide/i18n/pt.ts +271 -271
- package/src/tool/laundryGuide/i18n/ru.ts +271 -271
- package/src/tool/laundryGuide/i18n/sv.ts +271 -271
- package/src/tool/laundryGuide/i18n/tr.ts +271 -271
- package/src/tool/laundryGuide/i18n/zh.ts +271 -271
- package/src/tool/laundryGuide/seo.astro +15 -15
- package/src/tool/needleConverter/i18n/de.ts +202 -202
- package/src/tool/needleConverter/i18n/es.ts +207 -207
- package/src/tool/needleConverter/i18n/fr.ts +207 -207
- package/src/tool/needleConverter/i18n/ja.ts +202 -202
- package/src/tool/needleConverter/i18n/ko.ts +202 -202
- package/src/tool/needleConverter/i18n/nl.ts +202 -202
- package/src/tool/needleConverter/i18n/pl.ts +202 -202
- package/src/tool/needleConverter/i18n/ru.ts +202 -202
- package/src/tool/needleConverter/i18n/sv.ts +202 -202
- package/src/tool/needleConverter/i18n/tr.ts +202 -202
- package/src/tool/needleConverter/i18n/zh.ts +202 -202
- package/src/tool/needleConverter/seo.astro +15 -15
- package/src/tool/sewingPatternScaler/component.astro +236 -236
- package/src/tool/sewingPatternScaler/i18n/fr.ts +170 -170
- package/src/tool/sewingPatternScaler/i18n/ja.ts +114 -114
- package/src/tool/sewingPatternScaler/i18n/ko.ts +114 -114
- package/src/tool/sewingPatternScaler/i18n/nl.ts +114 -114
- package/src/tool/sewingPatternScaler/i18n/pl.ts +114 -114
- package/src/tool/sewingPatternScaler/i18n/ru.ts +114 -114
- package/src/tool/sewingPatternScaler/i18n/sv.ts +114 -114
- package/src/tool/sewingPatternScaler/i18n/tr.ts +114 -114
- package/src/tool/sewingPatternScaler/i18n/zh.ts +114 -114
- package/src/tool/sewingPatternScaler/seo.astro +15 -15
- package/src/tool/shoeSizeConverter/i18n/fr.ts +183 -183
- package/src/tool/shoeSizeConverter/i18n/ja.ts +179 -179
- package/src/tool/shoeSizeConverter/i18n/ko.ts +179 -179
- package/src/tool/shoeSizeConverter/i18n/nl.ts +179 -179
- package/src/tool/shoeSizeConverter/i18n/pl.ts +179 -179
- package/src/tool/shoeSizeConverter/i18n/ru.ts +179 -179
- package/src/tool/shoeSizeConverter/i18n/sv.ts +179 -179
- package/src/tool/shoeSizeConverter/i18n/tr.ts +179 -179
- package/src/tool/shoeSizeConverter/i18n/zh.ts +179 -179
- package/src/tool/shoeSizeConverter/seo.astro +15 -15
- package/src/tool/stainChemistry/bibliography.ts +16 -16
- package/src/tool/stainChemistry/i18n/de.ts +286 -286
- package/src/tool/stainChemistry/i18n/en.ts +289 -289
- package/src/tool/stainChemistry/i18n/es.ts +286 -286
- package/src/tool/stainChemistry/i18n/fr.ts +296 -296
- package/src/tool/stainChemistry/i18n/id.ts +286 -286
- package/src/tool/stainChemistry/i18n/it.ts +286 -286
- package/src/tool/stainChemistry/i18n/ja.ts +286 -286
- package/src/tool/stainChemistry/i18n/ko.ts +283 -283
- package/src/tool/stainChemistry/i18n/nl.ts +286 -286
- package/src/tool/stainChemistry/i18n/pl.ts +286 -286
- package/src/tool/stainChemistry/i18n/pt.ts +286 -286
- package/src/tool/stainChemistry/i18n/ru.ts +286 -286
- package/src/tool/stainChemistry/i18n/sv.ts +286 -286
- package/src/tool/stainChemistry/i18n/tr.ts +286 -286
- package/src/tool/stainChemistry/i18n/zh.ts +281 -281
- package/src/tool/stainChemistry/seo.astro +15 -15
- package/src/tool/yarnCalculator/i18n/de.ts +296 -296
- package/src/tool/yarnCalculator/i18n/es.ts +296 -296
- package/src/tool/yarnCalculator/i18n/fr.ts +296 -296
- package/src/tool/yarnCalculator/i18n/ja.ts +296 -296
- package/src/tool/yarnCalculator/i18n/ko.ts +296 -296
- package/src/tool/yarnCalculator/i18n/nl.ts +296 -296
- package/src/tool/yarnCalculator/i18n/pl.ts +296 -296
- package/src/tool/yarnCalculator/i18n/ru.ts +296 -296
- package/src/tool/yarnCalculator/i18n/sv.ts +296 -296
- package/src/tool/yarnCalculator/i18n/tr.ts +296 -296
- package/src/tool/yarnCalculator/i18n/zh.ts +295 -295
- package/src/tool/yarnCalculator/seo.astro +15 -15
- package/src/tools.ts +2 -2
package/src/tool/embroideryStitchPricingEstimator/embroidery-stitch-count-pricing-estimator.css
ADDED
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
.embroider-tool {
|
|
2
|
+
--n-ink: #202a25;
|
|
3
|
+
--n-muted: #66736b;
|
|
4
|
+
--n-paper: #f4f1e9;
|
|
5
|
+
--n-card: #fffdf7;
|
|
6
|
+
--n-line: #d5d8cc;
|
|
7
|
+
--n-thread: #b14945;
|
|
8
|
+
--n-thread-soft: #f2d5ca;
|
|
9
|
+
--n-needle: #2f6d62;
|
|
10
|
+
--n-warn: #8c5c22;
|
|
11
|
+
--n-shadow: rgba(32, 42, 37, 0.12);
|
|
12
|
+
|
|
13
|
+
background: var(--n-paper);
|
|
14
|
+
border: 1px solid var(--n-line);
|
|
15
|
+
border-radius: 24px;
|
|
16
|
+
box-shadow: 0 18px 48px var(--n-shadow);
|
|
17
|
+
color: var(--n-ink);
|
|
18
|
+
margin: 2rem auto;
|
|
19
|
+
max-width: 1050px;
|
|
20
|
+
overflow: hidden;
|
|
21
|
+
padding: clamp(1rem, 3vw, 2rem);
|
|
22
|
+
width: min(100%, calc(100vw - 64px));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
body:has(.embroider-tool) {
|
|
26
|
+
overflow-x: hidden;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.theme-dark .embroider-tool {
|
|
30
|
+
--n-ink: #f1eee4;
|
|
31
|
+
--n-muted: #b5b9ae;
|
|
32
|
+
--n-paper: #191e1b;
|
|
33
|
+
--n-card: #232a25;
|
|
34
|
+
--n-line: #3f4b43;
|
|
35
|
+
--n-thread: #ed8d7f;
|
|
36
|
+
--n-thread-soft: #633b3a;
|
|
37
|
+
--n-needle: #78c2b0;
|
|
38
|
+
--n-warn: #f0b36e;
|
|
39
|
+
--n-shadow: rgba(0, 0, 0, 0.3);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.embroider-intro {
|
|
43
|
+
border-bottom: 1px solid var(--n-line);
|
|
44
|
+
margin-bottom: 1.25rem;
|
|
45
|
+
padding-bottom: 1rem;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.embroider-intro p {
|
|
49
|
+
color: var(--n-muted);
|
|
50
|
+
font-size: 1.05rem;
|
|
51
|
+
line-height: 1.55;
|
|
52
|
+
margin: 0.45rem 0 0;
|
|
53
|
+
max-width: 680px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.embroider-eyebrow {
|
|
57
|
+
color: var(--n-thread);
|
|
58
|
+
font-size: 0.72rem;
|
|
59
|
+
font-weight: 800;
|
|
60
|
+
letter-spacing: 0.13em;
|
|
61
|
+
text-transform: uppercase;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.embroider-workbench {
|
|
65
|
+
align-items: stretch;
|
|
66
|
+
display: grid;
|
|
67
|
+
gap: 1rem;
|
|
68
|
+
grid-template-columns: minmax(280px, 0.95fr) minmax(320px, 1.05fr);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.embroider-stage,
|
|
72
|
+
.embroider-controls,
|
|
73
|
+
.embroider-result,
|
|
74
|
+
.embroider-breakdown,
|
|
75
|
+
.embroider-explainer {
|
|
76
|
+
background: var(--n-card);
|
|
77
|
+
border: 1px solid var(--n-line);
|
|
78
|
+
border-radius: 16px;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.embroider-stage {
|
|
82
|
+
display: flex;
|
|
83
|
+
flex-direction: column;
|
|
84
|
+
min-height: 360px;
|
|
85
|
+
padding: 1rem;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.embroider-stage-header,
|
|
89
|
+
.embroider-control-heading,
|
|
90
|
+
.embroider-stage-caption,
|
|
91
|
+
.embroider-result,
|
|
92
|
+
.embroider-result-metrics,
|
|
93
|
+
.embroider-breakdown,
|
|
94
|
+
.embroider-explainer {
|
|
95
|
+
align-items: center;
|
|
96
|
+
display: flex;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.embroider-stage-header,
|
|
100
|
+
.embroider-control-heading {
|
|
101
|
+
justify-content: space-between;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.embroider-stage-header {
|
|
105
|
+
color: var(--n-muted);
|
|
106
|
+
font-size: 0.78rem;
|
|
107
|
+
letter-spacing: 0.03em;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.embroider-status {
|
|
111
|
+
border: 1px solid var(--n-needle);
|
|
112
|
+
border-radius: 999px;
|
|
113
|
+
color: var(--n-needle);
|
|
114
|
+
font-size: 0.65rem;
|
|
115
|
+
font-weight: 800;
|
|
116
|
+
letter-spacing: 0.08em;
|
|
117
|
+
padding: 0.25rem 0.5rem;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.embroider-status[data-status='attention'] {
|
|
121
|
+
border-color: var(--n-warn);
|
|
122
|
+
color: var(--n-warn);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.embroider-status[data-status='invalid'] {
|
|
126
|
+
border-color: var(--n-thread);
|
|
127
|
+
color: var(--n-thread);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.embroider-canvas {
|
|
131
|
+
background: var(--n-thread-soft);
|
|
132
|
+
border-radius: 12px;
|
|
133
|
+
height: auto;
|
|
134
|
+
margin: auto 0;
|
|
135
|
+
overflow: visible;
|
|
136
|
+
width: 100%;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.embroider-hoop-shadow {
|
|
140
|
+
fill: none;
|
|
141
|
+
stroke: var(--n-shadow);
|
|
142
|
+
stroke-width: 16;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.embroider-hoop {
|
|
146
|
+
fill: none;
|
|
147
|
+
stroke: var(--n-needle);
|
|
148
|
+
stroke-width: 5;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.embroider-cloth {
|
|
152
|
+
fill: var(--n-paper);
|
|
153
|
+
stroke: var(--n-line);
|
|
154
|
+
stroke-width: 2;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.embroider-thread {
|
|
158
|
+
fill: none;
|
|
159
|
+
stroke: var(--n-thread);
|
|
160
|
+
stroke-linecap: round;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.embroider-needle {
|
|
164
|
+
fill: var(--n-needle);
|
|
165
|
+
stroke: var(--n-card);
|
|
166
|
+
stroke-width: 3;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.embroider-stage-caption {
|
|
170
|
+
color: var(--n-muted);
|
|
171
|
+
font-size: 0.82rem;
|
|
172
|
+
gap: 0.6rem;
|
|
173
|
+
justify-content: space-between;
|
|
174
|
+
min-height: 1.4rem;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.embroider-notice {
|
|
178
|
+
color: var(--n-warn);
|
|
179
|
+
text-align: right;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.embroider-controls {
|
|
183
|
+
padding: 1rem;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.embroider-reset,
|
|
187
|
+
.embroider-copy {
|
|
188
|
+
background: transparent;
|
|
189
|
+
border: 1px solid var(--n-line);
|
|
190
|
+
border-radius: 8px;
|
|
191
|
+
color: var(--n-muted);
|
|
192
|
+
cursor: pointer;
|
|
193
|
+
font: inherit;
|
|
194
|
+
font-size: 0.78rem;
|
|
195
|
+
padding: 0.45rem 0.65rem;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.embroider-reset:hover,
|
|
199
|
+
.embroider-copy:hover {
|
|
200
|
+
border-color: var(--n-thread);
|
|
201
|
+
color: var(--n-thread);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.embroider-grid {
|
|
205
|
+
display: grid;
|
|
206
|
+
gap: 0.85rem;
|
|
207
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
208
|
+
margin-top: 1rem;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.embroider-field,
|
|
212
|
+
.embroider-select {
|
|
213
|
+
display: flex;
|
|
214
|
+
flex-direction: column;
|
|
215
|
+
gap: 0.35rem;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.embroider-field > span,
|
|
219
|
+
.embroider-field-label {
|
|
220
|
+
font-size: 0.78rem;
|
|
221
|
+
font-weight: 700;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.embroider-field small,
|
|
225
|
+
.embroider-select small {
|
|
226
|
+
color: var(--n-muted);
|
|
227
|
+
font-size: 0.68rem;
|
|
228
|
+
line-height: 1.3;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.embroider-input,
|
|
232
|
+
.embroider-select-trigger {
|
|
233
|
+
background: var(--n-paper);
|
|
234
|
+
border: 1px solid var(--n-line);
|
|
235
|
+
border-radius: 8px;
|
|
236
|
+
box-sizing: border-box;
|
|
237
|
+
color: var(--n-ink);
|
|
238
|
+
font: inherit;
|
|
239
|
+
min-height: 2.55rem;
|
|
240
|
+
padding: 0.55rem 0.65rem;
|
|
241
|
+
width: 100%;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.embroider-input:focus,
|
|
245
|
+
.embroider-select-trigger:focus,
|
|
246
|
+
.embroider-select-menu button:focus,
|
|
247
|
+
.embroider-reset:focus,
|
|
248
|
+
.embroider-copy:focus {
|
|
249
|
+
outline: 2px solid var(--n-thread);
|
|
250
|
+
outline-offset: 2px;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.embroider-select {
|
|
254
|
+
margin-top: 1rem;
|
|
255
|
+
position: relative;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
.embroider-select-trigger {
|
|
259
|
+
cursor: pointer;
|
|
260
|
+
text-align: left;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.embroider-select-trigger::after {
|
|
264
|
+
border-bottom: 1px solid var(--n-thread);
|
|
265
|
+
border-right: 1px solid var(--n-thread);
|
|
266
|
+
color: var(--n-thread);
|
|
267
|
+
content: '';
|
|
268
|
+
float: right;
|
|
269
|
+
height: 0.45rem;
|
|
270
|
+
margin: 0.1rem 0.25rem 0 0;
|
|
271
|
+
transform: rotate(45deg);
|
|
272
|
+
width: 0.45rem;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.embroider-select-menu {
|
|
276
|
+
background: var(--n-card);
|
|
277
|
+
border: 1px solid var(--n-line);
|
|
278
|
+
border-radius: 8px;
|
|
279
|
+
box-shadow: 0 10px 22px var(--n-shadow);
|
|
280
|
+
left: 0;
|
|
281
|
+
margin-top: 0.2rem;
|
|
282
|
+
padding: 0.3rem;
|
|
283
|
+
position: absolute;
|
|
284
|
+
right: 0;
|
|
285
|
+
top: 100%;
|
|
286
|
+
z-index: 2;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.embroider-select-menu[hidden] {
|
|
290
|
+
display: none;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
.embroider-select-menu button {
|
|
294
|
+
background: transparent;
|
|
295
|
+
border: 0;
|
|
296
|
+
border-radius: 6px;
|
|
297
|
+
color: var(--n-ink);
|
|
298
|
+
cursor: pointer;
|
|
299
|
+
display: block;
|
|
300
|
+
font: inherit;
|
|
301
|
+
padding: 0.6rem;
|
|
302
|
+
text-align: left;
|
|
303
|
+
width: 100%;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
.embroider-select-menu button:hover,
|
|
307
|
+
.embroider-select-menu button.is-selected {
|
|
308
|
+
background: var(--n-thread-soft);
|
|
309
|
+
color: var(--n-thread);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.embroider-result {
|
|
313
|
+
gap: 1rem;
|
|
314
|
+
justify-content: space-between;
|
|
315
|
+
margin-top: 1rem;
|
|
316
|
+
padding: 1rem 1.2rem;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
.embroider-result-main {
|
|
320
|
+
min-width: 8rem;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
.embroider-result-main strong {
|
|
324
|
+
display: block;
|
|
325
|
+
font-size: clamp(2rem, 5vw, 3.5rem);
|
|
326
|
+
line-height: 1;
|
|
327
|
+
margin: 0.25rem 0;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
.embroider-result-main > span:last-child {
|
|
331
|
+
color: var(--n-muted);
|
|
332
|
+
font-size: 0.75rem;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.embroider-result-metrics {
|
|
336
|
+
gap: clamp(1rem, 4vw, 3rem);
|
|
337
|
+
margin-left: auto;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
.embroider-result-metrics div,
|
|
341
|
+
.embroider-breakdown div {
|
|
342
|
+
display: flex;
|
|
343
|
+
flex-direction: column;
|
|
344
|
+
gap: 0.25rem;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.embroider-result-metrics span,
|
|
348
|
+
.embroider-breakdown span {
|
|
349
|
+
color: var(--n-muted);
|
|
350
|
+
font-size: 0.7rem;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
.embroider-result-metrics strong,
|
|
354
|
+
.embroider-breakdown strong {
|
|
355
|
+
font-size: 1rem;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
.embroider-copy {
|
|
359
|
+
white-space: nowrap;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
.embroider-breakdown {
|
|
363
|
+
flex-wrap: wrap;
|
|
364
|
+
gap: 1rem;
|
|
365
|
+
justify-content: space-between;
|
|
366
|
+
margin-top: 0.65rem;
|
|
367
|
+
padding: 0.8rem 1.2rem;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
.embroider-explainer {
|
|
371
|
+
align-items: stretch;
|
|
372
|
+
gap: 0;
|
|
373
|
+
margin-top: 1rem;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
.embroider-explainer div {
|
|
377
|
+
flex: 1;
|
|
378
|
+
padding: 0.9rem 1.1rem;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
.embroider-explainer div + div {
|
|
382
|
+
border-left: 1px solid var(--n-line);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
.embroider-explainer h3 {
|
|
386
|
+
font-size: 0.82rem;
|
|
387
|
+
margin: 0;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
.embroider-explainer p {
|
|
391
|
+
color: var(--n-muted);
|
|
392
|
+
font-size: 0.78rem;
|
|
393
|
+
line-height: 1.5;
|
|
394
|
+
margin: 0.4rem 0 0;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
@media (max-width: 720px) {
|
|
398
|
+
.embroider-tool {
|
|
399
|
+
margin-left: 0;
|
|
400
|
+
margin-right: 0;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
.embroider-workbench {
|
|
404
|
+
grid-template-columns: 1fr;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
.embroider-stage {
|
|
408
|
+
min-height: 0;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
.embroider-result {
|
|
412
|
+
align-items: flex-start;
|
|
413
|
+
flex-wrap: wrap;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
.embroider-result-metrics {
|
|
417
|
+
margin-left: 0;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
.embroider-copy {
|
|
421
|
+
margin-left: auto;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
@media (max-width: 460px) {
|
|
426
|
+
.embroider-grid {
|
|
427
|
+
grid-template-columns: 1fr;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
.embroider-explainer {
|
|
431
|
+
flex-direction: column;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
.embroider-explainer div + div {
|
|
435
|
+
border-left: 0;
|
|
436
|
+
border-top: 1px solid var(--n-line);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { TextilesToolEntry, ToolLocaleContent } from '../../types';
|
|
2
|
+
import type { EmbroideryStitchPricingEstimatorUI } from './ui';
|
|
3
|
+
|
|
4
|
+
export type EmbroideryStitchPricingEstimatorLocaleContent = ToolLocaleContent<EmbroideryStitchPricingEstimatorUI>;
|
|
5
|
+
|
|
6
|
+
export const embroideryStitchPricingEstimator: TextilesToolEntry<EmbroideryStitchPricingEstimatorUI> = {
|
|
7
|
+
id: 'embroidery-stitch-pricing-estimator',
|
|
8
|
+
icons: {
|
|
9
|
+
bg: 'mdi:needle',
|
|
10
|
+
fg: 'mdi:currency-usd',
|
|
11
|
+
},
|
|
12
|
+
i18n: {
|
|
13
|
+
de: () => import('./i18n/de').then((module) => module.content),
|
|
14
|
+
en: () => import('./i18n/en').then((module) => module.content),
|
|
15
|
+
es: () => import('./i18n/es').then((module) => module.content),
|
|
16
|
+
fr: () => import('./i18n/fr').then((module) => module.content),
|
|
17
|
+
id: () => import('./i18n/id').then((module) => module.content),
|
|
18
|
+
it: () => import('./i18n/it').then((module) => module.content),
|
|
19
|
+
ja: () => import('./i18n/ja').then((module) => module.content),
|
|
20
|
+
ko: () => import('./i18n/ko').then((module) => module.content),
|
|
21
|
+
nl: () => import('./i18n/nl').then((module) => module.content),
|
|
22
|
+
pl: () => import('./i18n/pl').then((module) => module.content),
|
|
23
|
+
pt: () => import('./i18n/pt').then((module) => module.content),
|
|
24
|
+
ru: () => import('./i18n/ru').then((module) => module.content),
|
|
25
|
+
sv: () => import('./i18n/sv').then((module) => module.content),
|
|
26
|
+
tr: () => import('./i18n/tr').then((module) => module.content),
|
|
27
|
+
zh: () => import('./i18n/zh').then((module) => module.content),
|
|
28
|
+
},
|
|
29
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { EmbroideryCalculation } from './logic';
|
|
2
|
+
|
|
3
|
+
export type EstimateStatus = 'ready' | 'attention' | 'invalid';
|
|
4
|
+
|
|
5
|
+
export interface EstimateEvaluation {
|
|
6
|
+
status: EstimateStatus;
|
|
7
|
+
message: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function evaluateEstimate(
|
|
11
|
+
calculation: EmbroideryCalculation | null,
|
|
12
|
+
labels: { invalid: string; highVolume: string; longRun: string },
|
|
13
|
+
): EstimateEvaluation {
|
|
14
|
+
if (!calculation) return { status: 'invalid', message: labels.invalid };
|
|
15
|
+
if (calculation.effectiveStitches > 1000000) {
|
|
16
|
+
return { status: 'attention', message: labels.highVolume };
|
|
17
|
+
}
|
|
18
|
+
if (calculation.totalMinutes > 120) {
|
|
19
|
+
return { status: 'attention', message: labels.longRun };
|
|
20
|
+
}
|
|
21
|
+
return { status: 'ready', message: '' };
|
|
22
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import { bibliography } from '../bibliography';
|
|
4
|
+
import type { EmbroideryStitchPricingEstimatorUI } from '../ui';
|
|
5
|
+
|
|
6
|
+
const slug = 'stickzahl-und-preis-kalkulator-stickerei';
|
|
7
|
+
const title = 'Kalkulator für Stickzahl und Preis';
|
|
8
|
+
const description = 'Schätze Stickzahl, Produktionszeit und einen Arbeitsgrundpreis anhand von Designgröße, Stichdichte, Farben, Geschwindigkeit und Stundenlohn.';
|
|
9
|
+
const faq = [
|
|
10
|
+
{ question: 'Wie funktioniert die Schätzung der Stickzahl?', answer: 'Der Rechner multipliziert die bestickte Fläche mit dem Quadrat der Stichdichte und wendet anschließend einen Faktor für die Stichart an. Das ergibt eine vergleichbare Arbeitsmenge, keine Vorhersage der Maschinendatei.' },
|
|
11
|
+
{ question: 'Warum verändert die Stichart die Schätzung?', answer: 'Laufstich, Satinstich, Füllstich und Tatami legen den Faden unterschiedlich ab. Ein transparenter relativer Faktor macht sichtbar, dass dichtere Flächen mehr Produktionsaufwand bedeuten.' },
|
|
12
|
+
{ question: 'Verändert die Farbanzahl die Stichzahl?', answer: 'Nein. Die Farbanzahl fügt nur Umrüstzeit hinzu. Für jeden Wechsel nach der ersten Farbe rechnet das Modell 1,75 Minuten als Planungsannahme.' },
|
|
13
|
+
{ question: 'Ist der berechnete Preis ein Angebot?', answer: 'Nein. Es ist eine Arbeitszeitschätzung mit dem eingegebenen Stundenlohn. Garn, Vlies, Digitalisierung, Einrichtung, Nacharbeit, Gemeinkosten, Steuer und Gewinn sind nicht enthalten.' },
|
|
14
|
+
];
|
|
15
|
+
const howTo = [
|
|
16
|
+
{ name: 'Design messen', text: 'Gib Breite und Höhe der fertigen Stickfläche in Zentimetern ein. Verwende die bestickte Fläche statt der gesamten Rahmengröße.' },
|
|
17
|
+
{ name: 'Stichplan beschreiben', text: 'Wähle die vorherrschende Stichart, gib die Dichte in Stichen pro Zentimeter ein und zähle die Garnfarben.' },
|
|
18
|
+
{ name: 'Produktionsannahmen eingeben', text: 'Gib Maschinengeschwindigkeit in Stichen pro Minute und deinen Arbeitslohn pro Stunde ein. Verwende eine einheitliche Währung.' },
|
|
19
|
+
{ name: 'Planungswert lesen', text: 'Vergleiche gleichwertige Stiche, Produktionszeit, Einrichtungszeit und Arbeitsgrundpreis vor der Digitalisierung oder Angebotserstellung.' },
|
|
20
|
+
];
|
|
21
|
+
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 } })) };
|
|
22
|
+
const howToSchema: WithContext<HowTo> = { '@context': 'https://schema.org', '@type': 'HowTo', name: title, description, step: howTo.map((step) => ({ '@type': 'HowToStep', name: step.name, text: step.text })) };
|
|
23
|
+
const appSchema: WithContext<SoftwareApplication> = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'BusinessApplication', operatingSystem: 'All', offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' }, inLanguage: 'de' };
|
|
24
|
+
const ui: EmbroideryStitchPricingEstimatorUI = {
|
|
25
|
+
intro: 'Forme deinen Stichplan im Stickrahmen und sieh den Produktionsaufwand und Arbeitswert.', stageLabel: 'Der Stickrahmen', controlsLabel: 'Stichplan erstellen', resultLabel: 'Arbeitsgrundpreis', widthLabel: 'Designbreite', heightLabel: 'Designhöhe', densityLabel: 'Stichdichte', stitchLabel: 'Vorherrschende Stichart', coloursLabel: 'Garnfarben', speedLabel: 'Maschinengeschwindigkeit', rateLabel: 'Stundenlohn', widthHint: 'bestickte Fläche in cm', heightHint: 'bestickte Fläche in cm', densityHint: 'Stiche pro cm', coloursHint: 'erste Farbe braucht keinen Wechsel', speedHint: 'Stiche pro Minute', rateHint: 'deine Währung pro Stunde', stitchRunning: 'Laufstich', stitchSatin: 'Satinstich', stitchFill: 'Füllstich', stitchTatami: 'Tatami Füllung', stitchRunningNote: 'Leichte Konturen und Schrift mit geringer Abdeckung.', stitchSatinNote: 'Glatte Säulen und Ränder mit konzentriertem Fadenweg.', stitchFillNote: 'Dichte Abdeckung mit mehr Garn und Produktionsaufwand.', stitchTatamiNote: 'Geschichtete Füllung mit dem höchsten Planungsfaktor.', selectStitch: 'Stichart wählen', emptyResult: 'Gib einen Stichplan ein, um den Rahmen zu aktivieren.', stitchesUnit: 'gleichwertige Stiche', minutesUnit: 'Minuten', hoursUnit: 'Stunden', priceUnit: 'Währungseinheiten', areaLabel: 'Bestickte Fläche', effectiveLabel: 'Gleichwertige Stiche', stitchTimeLabel: 'Stickzeit', productionLabel: 'Produktionszeit', setupLabel: 'Farbeneinrichtung', changesLabel: 'Farbwechsel', basePriceLabel: 'Arbeitsgrundpreis', estimateBadge: 'Schätzung bereit', attentionBadge: 'Größe prüfen', warningHighVolume: 'Große Stichmenge. Vor einem Angebot eine echte Maschinenprobe machen.', warningLongRun: 'Langer Produktionslauf. Rahmung, Fadenrisse und Fertigstellung separat prüfen.', invalidMessage: 'Verwende positive Werte für Größe, Dichte, Geschwindigkeit und Stundenlohn.', formulaTitle: 'Was wird gezählt', formulaText: 'Fläche mal Dichte zum Quadrat ergibt die Abdeckungsbasis. Der Stichfaktor macht daraus gleichwertige Stiche; jeder Farbwechsel nach der ersten Farbe fügt 1,75 Minuten hinzu.', noteTitle: 'Grenze der Planung', noteText: 'Dies ist ein transparenter Rechner, keine digitalisierte Maschinendatei und kein fertiges Angebot. Ergänze Material, Einrichtung, Fertigstellung, Gemeinkosten, Steuer und Marge selbst.', reset: 'Beispiel zurücksetzen', copied: 'Zusammenfassung kopiert', copySummary: 'Zusammenfassung kopieren', canvasAlt: 'Stickrahmen aus Stoff mit Fadenlinien für die aktuelle Dichte',
|
|
26
|
+
};
|
|
27
|
+
export const content: ToolLocaleContent<EmbroideryStitchPricingEstimatorUI> = { slug, title, description, ui, faq, bibliography, howTo, schemas: [faqSchema, howToSchema, appSchema], seo: [
|
|
28
|
+
{ type: 'title', text: 'Stickzahl und Arbeitsgrundpreis für Stickerei schätzen', level: 2 },
|
|
29
|
+
{ type: 'paragraph', html: 'Bei einem Stickdesign gibt es zwei Planungsfragen: Wie viel Fadenarbeit steckt im Motiv und wie lange sind Maschine und Bedienperson gebunden? Dieser Rechner hält beides sichtbar und verwandelt Fläche, Dichte, Stichart, Farben, Geschwindigkeit und Stundenlohn in einen vergleichbaren Planungswert.' },
|
|
30
|
+
{ type: 'title', text: 'Das Modell für die Stichzahl', level: 3 },
|
|
31
|
+
{ type: 'paragraph', html: 'Die Basis ist die bestickte Fläche multipliziert mit dem Quadrat der Dichte in Stichen pro Zentimeter. Ein relativer Faktor berücksichtigt die Stichfamilie: Laufstich ist leichter, Satin der Bezugspunkt, Füllung und Tatami sind zunehmend dichte Planungsfälle. Es handelt sich um gleichwertigen Arbeitsaufwand, nicht um die exakte Zahl aus einer Digitalisierungssoftware.' },
|
|
32
|
+
{ type: 'table', headers: ['Eingabe', 'Was sie verändert', 'Was sie nicht verspricht'], rows: [['Breite und Höhe', 'Abdeckungsfläche und Basisstichzahl', 'Den exakten Umriss einer digitalisierten Datei'], ['Dichte und Stichart', 'Gleichwertige Fadenarbeit und Maschinenzeit', 'Eine passende Qualitätseinstellung für jeden Stoff'], ['Farben', 'Wechselzeit nach der ersten Farbe', 'Die Zahl von Trims oder Fadenrissen'], ['Geschwindigkeit und Lohn', 'Produktionsdauer und Arbeitswert', 'Ein fertiges Kundenangebot']] },
|
|
33
|
+
{ type: 'title', text: 'Aus einer Schätzung einen verantwortlichen Preis machen', level: 3 },
|
|
34
|
+
{ type: 'paragraph', html: 'Der angezeigte Preis ist nur Arbeitszeit mal Stundenlohn. Ein echtes Angebot sollte Digitalisierung, Garn, Vlies, Einspannen, Maschineneinrichtung, Probestücke, Abschneiden, Nacharbeit, Fertigstellung, Gemeinkosten, Steuer und Gewinn enthalten. Halte diese Posten getrennt, damit eine kleine Stichzahl keine aufwendige Vorbereitung versteckt.' },
|
|
35
|
+
{ type: 'tip', title: 'Plan vor dem Angebot testen', html: 'Führe eine repräsentative Probe auf dem vorgesehenen Stoff und Vlies aus. Vergleiche Zeit und Fadenverhalten mit der Schätzung und passe deine lokalen Geschwindigkeits- und Einrichtungsannahmen an.' },
|
|
36
|
+
{ type: 'title', text: 'Die Produktionsaufteilung lesen', level: 3 },
|
|
37
|
+
{ type: 'list', items: ['Gleichwertige Stiche zeigen den Abdeckungsaufwand nach Anwendung des Stichfaktors.', 'Produktionszeit ist gleichwertige Stichzahl geteilt durch Maschinengeschwindigkeit.', 'Farbeneinrichtung fügt nach der ersten Farbe je Wechsel 1,75 Minuten hinzu.', 'Der Arbeitsgrundpreis ist die Gesamtzeit geteilt durch 60 und multipliziert mit dem Stundenlohn.'] },
|
|
38
|
+
] };
|