-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
-
88
-
89
-
90
-
91
-
92
-
93
-
94
-
95
-
96
-
97
-
98
-
99
-
100
-
101
-
102
-
103
-
104
-
105
-
106
-
107
-
108
-
109
-
110
-
111
-
112
-
113
-
114
-
115
-
116
-
117
-
118
-
119
-
120
-
121
-
122
-
123
-
124
-
125
-
126
-
127
-
128
-
129
-
130
-
131
-
132
-
133
-
134
-
135
-
136
-
137
-
138
-
139
-
140
-
141
-
142
-
143
-
144
-
145
-
146
-
147
-
148
-
149
-
150
-
151
-
152
-
153
-
154
-
155
-
156
-
157
-
158
-
159
-
160
-
161
-
162
-
163
-
164
-
165
-
166
-
167
-
168
-
169
-
170
-
171
-
172
-
173
-
174
-
175
-
176
-
177
-
178
-
179
-
180
-
181
-
182
-
183
-
184
-
185
-
186
-
187
-
188
-
189
-
190
-
191
-
192
-
193
-
194
-
195
-
196
-
197
-
198
-
199
-
200
-
201
-
202
-
203
-
204
-
205
-
206
-
207
-
208
-
209
-
210
-
211
-
212
-
213
-
214
-
215
-
216
-
217
-
218
-
219
-
220
-
221
-
222
-
223
-
224
-
225
-
226
-
227
-
228
-
229
-
230
-
231
-
232
-
233
-
234
-
235
-
236
-
237
-
238
-
239
-
240
-
241
-
242
-
243
-
244
-
245
-
246
-
247
-
248
-
249
-
250
-
251
-
252
-
253
-
254
-
255
-
256
-
257
-
258
-
259
-
260
-
261
-
262
-
263
-
264
-
265
-
266
-
267
-
268
-
269
-
270
-
271
-
272
-- Copyright 2026 Shota FUJI
--
-- This Source Code Form is subject to the terms of the Mozilla Public
-- License, v. 2.0. If a copy of the MPL was not distributed with this
-- file, You can obtain one at https://mozilla.org/MPL/2.0/.
--
-- SPDX-License-Identifier: MPL-2.0
module Template.InfoArea exposing (infoArea)
import Length exposing (toMM)
import Parameters exposing (Parameters)
import QRCode
import Svg exposing (..)
import Svg.Attributes as Attrs exposing (..)
import Svg.Path as Path exposing (..)
import Template.Layout.Container as Container exposing (aligned, columns, gapped, noGrow, padded, rows, withOutline)
import Template.Layout.Coordinate exposing (Request(..))
import Template.Layout.Item exposing (Item)
import Url exposing (Url)
infoArea : Url -> Parameters -> Item msg
infoArea url params =
rows
|> withOutline
{ color = "currentColor"
, width = 0.2
, radius = 0.3
}
|> Container.build
[ columns
|> Container.build
([ rows
|> Container.build
[ columns
|> gapped 5
|> aligned Container.End
|> padded 2
|> Container.build
[ scaleChcker |> noGrow
, legends params |> noGrow
, legal
]
]
|> Just
, if params.rendering.qrCode then
qrCode url
else
Nothing
]
|> List.filterMap identity
)
]
scaleChcker : Item msg
scaleChcker =
{ size = { width = Exactly 10, height = Exactly 10 }
, element =
\p _ ->
let
x : Float -> String
x n =
String.fromFloat (p.x + n)
y : Float -> String
y n =
String.fromFloat (p.y + n)
in
g
[]
[ g
[ stroke "currentColor", strokeWidth "0.2" ]
[ line
[ x1 (x 0), y1 (y 8), x2 (x 0), y2 (y 10) ]
[]
, line
[ x1 (x 0), y1 (y 9), x2 (x 10), y2 (y 9) ]
[]
, line
[ x1 (x 10), y1 (y 8), x2 (x 10), y2 (y 10) ]
[]
]
, text_
[ Attrs.x (x 5)
, Attrs.y (y 7)
, fontSize "3"
, fontWeight "100"
, textAnchor "middle"
, fill "currentColor"
]
[ text "10mm" ]
]
}
legal : Item msg
legal =
rows
|> gapped 0.5
|> aligned Container.End
|> Container.build
[ Item
{ width = Exactly 33.2, height = Exactly 2 }
(\p size ->
text_
[ x (String.fromFloat p.x)
, y (String.fromFloat p.y)
, fontSize (String.fromFloat size.height)
, fontWeight "100"
, textAnchor "left"
, dominantBaseline "hanging"
, fill "currentColor"
]
[ text "© Shota FUJI, licensed under CC BY 4.0" ]
)
, Item
{ width = Exactly 61, height = Exactly 2 }
(\p size ->
text_
[ x (String.fromFloat p.x)
, y (String.fromFloat p.y)
, fontSize (String.fromFloat size.height)
, fontWeight "100"
, textAnchor "left"
, dominantBaseline "hanging"
, fill "currentColor"
]
[ text "Barlow font © 2017 The Barlow Project Authors, SIL Open Font License 1.1" ]
)
]
legends : Parameters -> Item msg
legends params =
rows
|> gapped 2
|> aligned Container.Start
|> Container.build
[ columns
|> gapped 2
|> aligned Container.Center
|> Container.build
[ Item
{ width = Exactly 8, height = Exactly 5 }
(\p size ->
Svg.path
[ Path.d
[ MoveTo Absolute ( p.x, p.y + size.height / 2 )
, HorizontalLineTo Relative size.width
]
, stroke "currentColor"
, strokeWidth (params.rendering.lineWidth |> toMM |> String.fromFloat)
]
[]
)
, Item
{ width = Exactly 12, height = Exactly 4 }
(\p size ->
text_
[ x (String.fromFloat p.x)
, y (String.fromFloat p.y)
, fontSize (String.fromFloat size.height)
, fontWeight "100"
, textAnchor "left"
, dominantBaseline "hanging"
, fill "currentColor"
]
[ text "Cut line" ]
)
]
, columns
|> gapped 2
|> aligned Container.Center
|> Container.build
[ Item
{ width = Exactly 8, height = Exactly 5 }
(\p size ->
rect
[ x (String.fromFloat p.x)
, y (String.fromFloat p.y)
, width (String.fromFloat size.width)
, height (String.fromFloat size.height)
, stroke "currentColor"
, strokeWidth "0.2"
, fill "url(#SkivingPattern)"
]
[]
)
, Item
{ width = Exactly 21, height = Exactly 4 }
(\p size ->
text_
[ x (String.fromFloat p.x)
, y (String.fromFloat p.y)
, fontSize (String.fromFloat size.height)
, fontWeight "100"
, textAnchor "left"
, dominantBaseline "hanging"
, fill "currentColor"
]
[ text "Skiving area" ]
)
]
, columns
|> gapped 2
|> aligned Container.Center
|> Container.build
[ Item
{ width = Exactly 8, height = Exactly 5 }
(\p size ->
g
[ fill "none"
, stroke "currentColor"
, strokeWidth "0.1"
]
[ Svg.path
[ Path.d
[ MoveTo Absolute ( p.x + (size.width - size.height) / 2, p.y + size.height / 2 )
, HorizontalLineTo Relative size.height
]
]
[]
, Svg.path
[ Path.d
[ MoveTo Absolute ( p.x + size.width / 2, p.y )
, VerticalLineTo Relative size.height
]
]
[]
]
)
, Item
{ width = Exactly 12, height = Exactly 4 }
(\p size ->
text_
[ x (String.fromFloat p.x)
, y (String.fromFloat p.y)
, fontSize (String.fromFloat size.height)
, fontWeight "100"
, textAnchor "left"
, dominantBaseline "hanging"
, fill "currentColor"
]
[ text "Hole center" ]
)
]
]
qrCode : Url -> Maybe (Item msg)
qrCode url =
QRCode.fromString (Url.toString url)
|> Result.toMaybe
|> Maybe.map
(\pixels ->
Item
{ width = Exactly 50, height = Exactly 50 }
(\p size ->
QRCode.toSvg
[ width (String.fromFloat size.width)
, height (String.fromFloat size.height)
, x (String.fromFloat p.x)
, y (String.fromFloat p.y)
, stroke "currentColor"
]
pixels
)
)