-
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
-- 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 Main exposing (main)
import Browser
import Browser.Navigation exposing (Key)
import Html exposing (hr, node, p)
import Html.Attributes exposing (attribute)
import Html.LivingStandard exposing (..)
import Json.Decode
import Parameters
import Parameters.App
import Preferences
import Preferences.App
import Template exposing (template)
import Url exposing (Url)
main : Program Flags Model Msg
main =
Browser.application
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
, onUrlRequest = UrlRequested
, onUrlChange = UrlChanged
}
-- FLAGS
type alias Flags =
{ preferences : Json.Decode.Value
}
-- MODEL
type alias Model =
{ url : Url
, key : Key
, parameters : Parameters.App.Model
, preferences : Preferences.App.Model
}
init : Flags -> Url -> Key -> ( Model, Cmd Msg )
init flags url key =
let
parameters =
Parameters.default
in
( { url = url
, key = key
, parameters = Parameters.App.init parameters
, preferences = Preferences.App.init flags.preferences
}
, Cmd.none
)
-- UPDATE
type Msg
= NoOp
| ParametersFormMsg Parameters.App.Msg
| PreferencesMsg Preferences.App.Msg
| UrlRequested Browser.UrlRequest
| UrlChanged Url
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
NoOp ->
( model, Cmd.none )
ParametersFormMsg subMsg ->
Parameters.App.update subMsg model.parameters
|> Tuple.mapFirst (\p -> { model | parameters = p })
|> Tuple.mapSecond (Cmd.map ParametersFormMsg)
PreferencesMsg subMsg ->
Preferences.App.update subMsg model.preferences
|> Tuple.mapFirst (\p -> { model | preferences = p })
|> Tuple.mapSecond (Cmd.map PreferencesMsg)
UrlRequested (Browser.Internal url) ->
( model, Browser.Navigation.replaceUrl model.key (Url.toString url) )
UrlRequested (Browser.External href) ->
( model, Browser.Navigation.load href )
UrlChanged url ->
( { model | url = url }, Cmd.none )
-- VIEW
view : Model -> Browser.Document Msg
view model =
{ title = ""
, body =
[ node "x-app-layout"
[]
[ node "x-preview"
[ slot "preview"
, attribute "print-theme"
(case model.parameters.parameters.rendering.colorSchema of
Parameters.BlackOnWhite ->
"black-on-white"
Parameters.WhiteOnBlack ->
"white-on-black"
)
, attribute "preview-theme"
(case model.preferences.preferences.previewTheme of
Preferences.SystemTheme ->
"system"
Preferences.PrintTheme ->
"print"
)
]
[ template model.parameters.parameters [] ]
, node "x-panel"
[ slot "parameters" ]
[ node "x-parameters"
[]
((Parameters.App.view
model.parameters
|> List.map (Html.map ParametersFormMsg)
)
++ hr [] []
:: (Preferences.App.panelItems model.preferences |> List.map (Html.map PreferencesMsg))
)
]
]
]
}
-- SUBSCRIPTIONS
subscriptions : Model -> Sub Msg
subscriptions _ =
Sub.none