elm-ssr 0.1.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.
@@ -0,0 +1,706 @@
1
+ module ElmSsr.Html exposing
2
+ ( Node(..)
3
+ , Attribute(..)
4
+ , EventCapture(..)
5
+ , EventValue(..)
6
+ , text
7
+ , a, abbr, address, article, aside, audio, b, bdi, bdo, blockquote, br, button, canvas, caption, cite, code, col, colgroup, data, datalist, dd, del, details, dfn, dialog, div, dl, dt, em, embed, fieldset, figcaption, figure, footer, form, h1, h2, h3, h4, h5, h6, header, hr, i, iframe, img, input, ins, kbd, label, legend, li, link, main_, map, mark, math, menu, meta, meter, nav, noscript, object, ol, optgroup, option, output, p, param, picture, pre, progress, q, rb, rp, rt, rtc, ruby, s, samp, script, section, select, slot, small, source, span, strong, sub, summary, sup, svg, table, tbody, td, template, textarea, tfoot, th, thead, time, title, tr, track, u, ul, var, video, wbr
8
+ , element, voidElement
9
+ , mapNode, mapAttribute
10
+ , static, island, hasIsland, anyIsland
11
+ )
12
+
13
+ {-| The HTML AST and element vocabulary.
14
+
15
+ Attributes live in [`ElmSsr.Html.Attributes`](./Html/Attributes.elm) and event
16
+ handlers in [`ElmSsr.Html.Events`](./Html/Events.elm), mirroring `elm/html`.
17
+
18
+
19
+ # AST
20
+
21
+ @docs Node, Attribute, EventCapture, EventValue
22
+
23
+
24
+ # Text and elements
25
+
26
+ @docs text
27
+ @docs a, article, button, code, div, form, h1, h2, h3, header, input, label, li, link, main_, meta, nav, p, section, span, ul
28
+ @docs element, voidElement
29
+
30
+
31
+ # Mapping
32
+
33
+ @docs mapNode, mapAttribute
34
+
35
+
36
+ # Islands
37
+
38
+ @docs static, island, hasIsland, anyIsland
39
+
40
+ -}
41
+
42
+
43
+ type Node msg
44
+ = Element String (List (Attribute msg)) (List (Node msg))
45
+ | VoidElement String (List (Attribute msg))
46
+ | Text String
47
+
48
+
49
+ type Attribute msg
50
+ = Property String String
51
+ | EventHandler String EventCapture (EventValue -> msg)
52
+
53
+
54
+ type EventCapture
55
+ = NoEventData
56
+ | TargetValue
57
+
58
+
59
+ type EventValue
60
+ = NoValue
61
+ | StringValue String
62
+
63
+
64
+ text : String -> Node msg
65
+ text =
66
+ Text
67
+
68
+
69
+ mapNode : (a -> b) -> Node a -> Node b
70
+ mapNode fn node =
71
+ case node of
72
+ Element tag attributes children ->
73
+ Element tag (List.map (mapAttribute fn) attributes) (List.map (mapNode fn) children)
74
+
75
+ VoidElement tag attributes ->
76
+ VoidElement tag (List.map (mapAttribute fn) attributes)
77
+
78
+ Text content ->
79
+ Text content
80
+
81
+
82
+ mapAttribute : (a -> b) -> Attribute a -> Attribute b
83
+ mapAttribute fn attribute =
84
+ case attribute of
85
+ Property attributeName attributeValue ->
86
+ Property attributeName attributeValue
87
+
88
+ EventHandler eventName capture toMessage ->
89
+ EventHandler eventName capture (\eventValue -> fn (toMessage eventValue))
90
+
91
+
92
+ {-| Drop every event handler from a node tree, producing inert markup usable at
93
+ any message type. Used to render an island's initial view into an otherwise
94
+ static page; the island's own client runtime replaces that inert subtree when it
95
+ mounts.
96
+ -}
97
+ static : Node a -> Node b
98
+ static node =
99
+ case node of
100
+ Element tag attributes children ->
101
+ Element tag (List.filterMap staticAttribute attributes) (List.map static children)
102
+
103
+ VoidElement tag attributes ->
104
+ VoidElement tag (List.filterMap staticAttribute attributes)
105
+
106
+ Text content ->
107
+ Text content
108
+
109
+
110
+ staticAttribute : Attribute a -> Maybe (Attribute b)
111
+ staticAttribute attribute =
112
+ case attribute of
113
+ Property attributeName attributeValue ->
114
+ Just (Property attributeName attributeValue)
115
+
116
+ EventHandler _ _ _ ->
117
+ Nothing
118
+
119
+
120
+ {-| Check if a node is an island marker or contains any. -}
121
+ hasIsland : Node msg -> Bool
122
+ hasIsland node =
123
+ case node of
124
+ Element tag _ children ->
125
+ (tag == "elm-ssr-island") || List.any hasIsland children
126
+
127
+ VoidElement _ _ ->
128
+ False
129
+
130
+ Text _ ->
131
+ False
132
+
133
+
134
+ {-| Check if any node in a list contains an island marker. -}
135
+ anyIsland : List (Node msg) -> Bool
136
+ anyIsland =
137
+ List.any hasIsland
138
+
139
+
140
+ {-| Wrap a node as an interactive island: an `<elm-ssr-island>` marker carrying
141
+ the island name and its encoded props, with the node rendered inert inside it.
142
+ -}
143
+ island : String -> String -> Node a -> Node b
144
+ island name encodedProps node =
145
+ Element "elm-ssr-island"
146
+ [ Property "data-elmssr-island" name
147
+ , Property "data-elmssr-props" encodedProps
148
+ ]
149
+ [ static node ]
150
+
151
+
152
+ {-| Build an element with children. -}
153
+ element : String -> List (Attribute msg) -> List (Node msg) -> Node msg
154
+ element tag attributes children =
155
+ Element tag attributes children
156
+
157
+
158
+ {-| Build a void (childless) element such as `input` or `meta`. -}
159
+ voidElement : String -> List (Attribute msg) -> Node msg
160
+ voidElement tag attributes =
161
+ VoidElement tag attributes
162
+
163
+
164
+ a : List (Attribute msg) -> List (Node msg) -> Node msg
165
+ a =
166
+ element "a"
167
+
168
+
169
+ article : List (Attribute msg) -> List (Node msg) -> Node msg
170
+ article =
171
+ element "article"
172
+
173
+
174
+ button : List (Attribute msg) -> List (Node msg) -> Node msg
175
+ button =
176
+ element "button"
177
+
178
+
179
+ code : List (Attribute msg) -> List (Node msg) -> Node msg
180
+ code =
181
+ element "code"
182
+
183
+
184
+ div : List (Attribute msg) -> List (Node msg) -> Node msg
185
+ div =
186
+ element "div"
187
+
188
+
189
+ form : List (Attribute msg) -> List (Node msg) -> Node msg
190
+ form =
191
+ element "form"
192
+
193
+
194
+ h1 : List (Attribute msg) -> List (Node msg) -> Node msg
195
+ h1 =
196
+ element "h1"
197
+
198
+
199
+ h2 : List (Attribute msg) -> List (Node msg) -> Node msg
200
+ h2 =
201
+ element "h2"
202
+
203
+
204
+ h3 : List (Attribute msg) -> List (Node msg) -> Node msg
205
+ h3 =
206
+ element "h3"
207
+
208
+
209
+ header : List (Attribute msg) -> List (Node msg) -> Node msg
210
+ header =
211
+ element "header"
212
+
213
+
214
+ input : List (Attribute msg) -> Node msg
215
+ input =
216
+ voidElement "input"
217
+
218
+
219
+ label : List (Attribute msg) -> List (Node msg) -> Node msg
220
+ label =
221
+ element "label"
222
+
223
+
224
+ li : List (Attribute msg) -> List (Node msg) -> Node msg
225
+ li =
226
+ element "li"
227
+
228
+
229
+ link : List (Attribute msg) -> Node msg
230
+ link =
231
+ voidElement "link"
232
+
233
+
234
+ main_ : List (Attribute msg) -> List (Node msg) -> Node msg
235
+ main_ =
236
+ element "main"
237
+
238
+
239
+ meta : List (Attribute msg) -> Node msg
240
+ meta =
241
+ voidElement "meta"
242
+
243
+
244
+ nav : List (Attribute msg) -> List (Node msg) -> Node msg
245
+ nav =
246
+ element "nav"
247
+
248
+
249
+ p : List (Attribute msg) -> List (Node msg) -> Node msg
250
+ p =
251
+ element "p"
252
+
253
+
254
+ section : List (Attribute msg) -> List (Node msg) -> Node msg
255
+ section =
256
+ element "section"
257
+
258
+
259
+ span : List (Attribute msg) -> List (Node msg) -> Node msg
260
+ span =
261
+ element "span"
262
+
263
+
264
+ ul : List (Attribute msg) -> List (Node msg) -> Node msg
265
+ ul =
266
+ element "ul"
267
+
268
+
269
+ abbr : List (Attribute msg) -> List (Node msg) -> Node msg
270
+ abbr =
271
+ element "abbr"
272
+
273
+
274
+ address : List (Attribute msg) -> List (Node msg) -> Node msg
275
+ address =
276
+ element "address"
277
+
278
+
279
+ aside : List (Attribute msg) -> List (Node msg) -> Node msg
280
+ aside =
281
+ element "aside"
282
+
283
+
284
+ audio : List (Attribute msg) -> List (Node msg) -> Node msg
285
+ audio =
286
+ element "audio"
287
+
288
+
289
+ b : List (Attribute msg) -> List (Node msg) -> Node msg
290
+ b =
291
+ element "b"
292
+
293
+
294
+ bdi : List (Attribute msg) -> List (Node msg) -> Node msg
295
+ bdi =
296
+ element "bdi"
297
+
298
+
299
+ bdo : List (Attribute msg) -> List (Node msg) -> Node msg
300
+ bdo =
301
+ element "bdo"
302
+
303
+
304
+ blockquote : List (Attribute msg) -> List (Node msg) -> Node msg
305
+ blockquote =
306
+ element "blockquote"
307
+
308
+
309
+ br : List (Attribute msg) -> Node msg
310
+ br =
311
+ voidElement "br"
312
+
313
+
314
+ canvas : List (Attribute msg) -> List (Node msg) -> Node msg
315
+ canvas =
316
+ element "canvas"
317
+
318
+
319
+ caption : List (Attribute msg) -> List (Node msg) -> Node msg
320
+ caption =
321
+ element "caption"
322
+
323
+
324
+ cite : List (Attribute msg) -> List (Node msg) -> Node msg
325
+ cite =
326
+ element "cite"
327
+
328
+
329
+ col : List (Attribute msg) -> Node msg
330
+ col =
331
+ voidElement "col"
332
+
333
+
334
+ colgroup : List (Attribute msg) -> List (Node msg) -> Node msg
335
+ colgroup =
336
+ element "colgroup"
337
+
338
+
339
+ data : List (Attribute msg) -> List (Node msg) -> Node msg
340
+ data =
341
+ element "data"
342
+
343
+
344
+ datalist : List (Attribute msg) -> List (Node msg) -> Node msg
345
+ datalist =
346
+ element "datalist"
347
+
348
+
349
+ dd : List (Attribute msg) -> List (Node msg) -> Node msg
350
+ dd =
351
+ element "dd"
352
+
353
+
354
+ del : List (Attribute msg) -> List (Node msg) -> Node msg
355
+ del =
356
+ element "del"
357
+
358
+
359
+ details : List (Attribute msg) -> List (Node msg) -> Node msg
360
+ details =
361
+ element "details"
362
+
363
+
364
+ dfn : List (Attribute msg) -> List (Node msg) -> Node msg
365
+ dfn =
366
+ element "dfn"
367
+
368
+
369
+ dialog : List (Attribute msg) -> List (Node msg) -> Node msg
370
+ dialog =
371
+ element "dialog"
372
+
373
+
374
+ dl : List (Attribute msg) -> List (Node msg) -> Node msg
375
+ dl =
376
+ element "dl"
377
+
378
+
379
+ dt : List (Attribute msg) -> List (Node msg) -> Node msg
380
+ dt =
381
+ element "dt"
382
+
383
+
384
+ em : List (Attribute msg) -> List (Node msg) -> Node msg
385
+ em =
386
+ element "em"
387
+
388
+
389
+ embed : List (Attribute msg) -> Node msg
390
+ embed =
391
+ voidElement "embed"
392
+
393
+
394
+ title : List (Attribute msg) -> List (Node msg) -> Node msg
395
+ title =
396
+ element "title"
397
+
398
+
399
+ fieldset : List (Attribute msg) -> List (Node msg) -> Node msg
400
+ fieldset =
401
+ element "fieldset"
402
+
403
+
404
+ figcaption : List (Attribute msg) -> List (Node msg) -> Node msg
405
+ figcaption =
406
+ element "figcaption"
407
+
408
+
409
+ figure : List (Attribute msg) -> List (Node msg) -> Node msg
410
+ figure =
411
+ element "figure"
412
+
413
+
414
+ footer : List (Attribute msg) -> List (Node msg) -> Node msg
415
+ footer =
416
+ element "footer"
417
+
418
+
419
+ h4 : List (Attribute msg) -> List (Node msg) -> Node msg
420
+ h4 =
421
+ element "h4"
422
+
423
+
424
+ h5 : List (Attribute msg) -> List (Node msg) -> Node msg
425
+ h5 =
426
+ element "h5"
427
+
428
+
429
+ h6 : List (Attribute msg) -> List (Node msg) -> Node msg
430
+ h6 =
431
+ element "h6"
432
+
433
+
434
+ hr : List (Attribute msg) -> Node msg
435
+ hr =
436
+ voidElement "hr"
437
+
438
+
439
+ i : List (Attribute msg) -> List (Node msg) -> Node msg
440
+ i =
441
+ element "i"
442
+
443
+
444
+ iframe : List (Attribute msg) -> List (Node msg) -> Node msg
445
+ iframe =
446
+ element "iframe"
447
+
448
+
449
+ img : List (Attribute msg) -> Node msg
450
+ img =
451
+ voidElement "img"
452
+
453
+
454
+ ins : List (Attribute msg) -> List (Node msg) -> Node msg
455
+ ins =
456
+ element "ins"
457
+
458
+
459
+ kbd : List (Attribute msg) -> List (Node msg) -> Node msg
460
+ kbd =
461
+ element "kbd"
462
+
463
+
464
+ legend : List (Attribute msg) -> List (Node msg) -> Node msg
465
+ legend =
466
+ element "legend"
467
+
468
+
469
+ map : List (Attribute msg) -> List (Node msg) -> Node msg
470
+ map =
471
+ element "map"
472
+
473
+
474
+ mark : List (Attribute msg) -> List (Node msg) -> Node msg
475
+ mark =
476
+ element "mark"
477
+
478
+
479
+ math : List (Attribute msg) -> List (Node msg) -> Node msg
480
+ math =
481
+ element "math"
482
+
483
+
484
+ menu : List (Attribute msg) -> List (Node msg) -> Node msg
485
+ menu =
486
+ element "menu"
487
+
488
+
489
+ meter : List (Attribute msg) -> List (Node msg) -> Node msg
490
+ meter =
491
+ element "meter"
492
+
493
+
494
+ noscript : List (Attribute msg) -> List (Node msg) -> Node msg
495
+ noscript =
496
+ element "noscript"
497
+
498
+
499
+ object : List (Attribute msg) -> List (Node msg) -> Node msg
500
+ object =
501
+ element "object"
502
+
503
+
504
+ ol : List (Attribute msg) -> List (Node msg) -> Node msg
505
+ ol =
506
+ element "ol"
507
+
508
+
509
+ optgroup : List (Attribute msg) -> List (Node msg) -> Node msg
510
+ optgroup =
511
+ element "optgroup"
512
+
513
+
514
+ option : List (Attribute msg) -> List (Node msg) -> Node msg
515
+ option =
516
+ element "option"
517
+
518
+
519
+ output : List (Attribute msg) -> List (Node msg) -> Node msg
520
+ output =
521
+ element "output"
522
+
523
+
524
+ param : List (Attribute msg) -> Node msg
525
+ param =
526
+ voidElement "param"
527
+
528
+
529
+ picture : List (Attribute msg) -> List (Node msg) -> Node msg
530
+ picture =
531
+ element "picture"
532
+
533
+
534
+ pre : List (Attribute msg) -> List (Node msg) -> Node msg
535
+ pre =
536
+ element "pre"
537
+
538
+
539
+ progress : List (Attribute msg) -> List (Node msg) -> Node msg
540
+ progress =
541
+ element "progress"
542
+
543
+
544
+ q : List (Attribute msg) -> List (Node msg) -> Node msg
545
+ q =
546
+ element "q"
547
+
548
+
549
+ rb : List (Attribute msg) -> List (Node msg) -> Node msg
550
+ rb =
551
+ element "rb"
552
+
553
+
554
+ rp : List (Attribute msg) -> List (Node msg) -> Node msg
555
+ rp =
556
+ element "rp"
557
+
558
+
559
+ rt : List (Attribute msg) -> List (Node msg) -> Node msg
560
+ rt =
561
+ element "rt"
562
+
563
+
564
+ rtc : List (Attribute msg) -> List (Node msg) -> Node msg
565
+ rtc =
566
+ element "rtc"
567
+
568
+
569
+ ruby : List (Attribute msg) -> List (Node msg) -> Node msg
570
+ ruby =
571
+ element "ruby"
572
+
573
+
574
+ s : List (Attribute msg) -> List (Node msg) -> Node msg
575
+ s =
576
+ element "s"
577
+
578
+
579
+ samp : List (Attribute msg) -> List (Node msg) -> Node msg
580
+ samp =
581
+ element "samp"
582
+
583
+
584
+ script : List (Attribute msg) -> List (Node msg) -> Node msg
585
+ script =
586
+ element "script"
587
+
588
+
589
+ select : List (Attribute msg) -> List (Node msg) -> Node msg
590
+ select =
591
+ element "select"
592
+
593
+
594
+ slot : List (Attribute msg) -> List (Node msg) -> Node msg
595
+ slot =
596
+ element "slot"
597
+
598
+
599
+ small : List (Attribute msg) -> List (Node msg) -> Node msg
600
+ small =
601
+ element "small"
602
+
603
+
604
+ source : List (Attribute msg) -> Node msg
605
+ source =
606
+ voidElement "source"
607
+
608
+
609
+ strong : List (Attribute msg) -> List (Node msg) -> Node msg
610
+ strong =
611
+ element "strong"
612
+
613
+
614
+ sub : List (Attribute msg) -> List (Node msg) -> Node msg
615
+ sub =
616
+ element "sub"
617
+
618
+
619
+ summary : List (Attribute msg) -> List (Node msg) -> Node msg
620
+ summary =
621
+ element "summary"
622
+
623
+
624
+ sup : List (Attribute msg) -> List (Node msg) -> Node msg
625
+ sup =
626
+ element "sup"
627
+
628
+
629
+ svg : List (Attribute msg) -> List (Node msg) -> Node msg
630
+ svg =
631
+ element "svg"
632
+
633
+
634
+ table : List (Attribute msg) -> List (Node msg) -> Node msg
635
+ table =
636
+ element "table"
637
+
638
+
639
+ tbody : List (Attribute msg) -> List (Node msg) -> Node msg
640
+ tbody =
641
+ element "tbody"
642
+
643
+
644
+ td : List (Attribute msg) -> List (Node msg) -> Node msg
645
+ td =
646
+ element "td"
647
+
648
+
649
+ template : List (Attribute msg) -> List (Node msg) -> Node msg
650
+ template =
651
+ element "template"
652
+
653
+
654
+ textarea : List (Attribute msg) -> List (Node msg) -> Node msg
655
+ textarea =
656
+ element "textarea"
657
+
658
+
659
+ tfoot : List (Attribute msg) -> List (Node msg) -> Node msg
660
+ tfoot =
661
+ element "tfoot"
662
+
663
+
664
+ th : List (Attribute msg) -> List (Node msg) -> Node msg
665
+ th =
666
+ element "th"
667
+
668
+
669
+ thead : List (Attribute msg) -> List (Node msg) -> Node msg
670
+ thead =
671
+ element "thead"
672
+
673
+
674
+ time : List (Attribute msg) -> List (Node msg) -> Node msg
675
+ time =
676
+ element "time"
677
+
678
+
679
+ tr : List (Attribute msg) -> List (Node msg) -> Node msg
680
+ tr =
681
+ element "tr"
682
+
683
+
684
+ track : List (Attribute msg) -> Node msg
685
+ track =
686
+ voidElement "track"
687
+
688
+
689
+ u : List (Attribute msg) -> List (Node msg) -> Node msg
690
+ u =
691
+ element "u"
692
+
693
+
694
+ var : List (Attribute msg) -> List (Node msg) -> Node msg
695
+ var =
696
+ element "var"
697
+
698
+
699
+ video : List (Attribute msg) -> List (Node msg) -> Node msg
700
+ video =
701
+ element "video"
702
+
703
+
704
+ wbr : List (Attribute msg) -> Node msg
705
+ wbr =
706
+ voidElement "wbr"