-
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
-- Copyright 2026 Shota FUJI
--
-- This source code and the design it expresses are licensed under
-- the Creative Commons Attribution 4.0 International License.
--
-- SPDX-License-Identifier: CC-BY-4.0
module Models.PWS01.Template exposing (template)
import Length exposing (toMM)
import Models.PWS01.Parameters exposing (LoopStyle(..), Parameters, canvasSizeDimension)
import Models.PWS01.Parameters.Key exposing (Key)
import Models.PWS01.Template.Cuts exposing (cuts)
import Models.PWS01.Template.InfoArea exposing (infoArea)
import String
import Svg exposing (..)
import Svg.Attributes exposing (..)
import Svg.Path exposing (LargeArcFlag(..), PathCommand(..), PointMode(..), SweepFlag(..))
import Template.Layout as Layout
import Template.Layout.Container as Container
import Template.Layout.Coordinate exposing (Request(..), SizeRequest, minSizeOf)
import Url exposing (Url)
template : Url -> Parameters -> Maybe Key -> List (Svg.Attribute msg) -> List (Svg.Svg msg)
template url params highlighting attrs =
let
( canvasWidth, canvasHeight ) =
canvasSizeDimension params.rendering.size
|> Tuple.mapBoth toMM toMM
margin =
toMM params.rendering.margin
gap =
toMM params.rendering.gap
info =
infoArea url params
cutsArea : SizeRequest
cutsArea =
let
infoSize =
minSizeOf info.size
in
{ width = AtLeast (canvasWidth - margin * 2 - gap)
, height = AtLeast (canvasHeight - margin * 2 - gap * 2 - infoSize.height)
}
in
cuts cutsArea params highlighting
|> List.map
(\cut ->
svg
(viewBox (String.join " " [ "0", "0", String.fromInt (ceiling canvasWidth), String.fromInt (ceiling canvasHeight) ])
:: class "print"
:: attrs
)
[ Container.rows
|> Container.sized (AtLeast 0) (AtLeast 0)
|> Container.gapped gap
|> Container.aligned Container.Center
|> Container.padded margin
|> Container.build
[ Container.columns
|> Container.padded (gap / 2)
|> Container.build [ cut ]
, info
]
|> Layout.render { width = canvasWidth, height = canvasHeight }
]
)