-
Notifications
You must be signed in to change notification settings - Fork 0
/
html.cljc
102 lines (86 loc) · 2.97 KB
/
html.cljc
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
(ns dgknght.app-lib.html
(:refer-clojure :exclude [comment])
(:require [clojure.string :as string]
[dgknght.app-lib.core :as lib]))
(defn raw-string
[& s]
[:span {:dangerouslySetInnerHTML {:__html (apply str s)}}])
(defn special-char
[k]
(raw-string "&" (name k) ";"))
(defn comment
[text]
(raw-string "<!-- " text " -->"))
(defn space
"Renders an HTML non-breakable space."
[]
(special-char :nbsp))
(defn google-g
([] (google-g {}))
([options]
[:svg {:version "1.1"
:xmlns "http://www.w3.org/2000/svg"
:width (get-in options [:width] "24px")
:height (get-in options [:height] "24px")
:viewBox "0 0 48 48"}
[:g
[:path {:fill "#EA4335" :d "M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z"}]
[:path {:fill "#4285F4" :d "M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z"}]
[:path {:fill "#FBBC05" :d "M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z"}]
[:path {:fill "#34A853" :d "M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z"}]
[:path {:fill "none" :d "M0 0h48v48H0z"}]]]))
(defn google-signin-link
([] (google-signin-link {}))
([{:keys [href]
:or {href "/auth/google/start"}
:as options}]
[:a.btn.btn-light {:href href}
(google-g options)
" Sign In With Google"]))
(def conj-to-vec
(lib/fscalar (fnil conj [])))
(defmulti ^:private add-to-class
(fn [cls _value]
(cond
(string? cls) :string
(sequential? cls) :sequence)))
(defmethod add-to-class :sequence
[cls value]
(if (sequential? value)
(concat cls value)
(conj cls value)))
(defmethod add-to-class :string
[cls value]
(string/join " "
(add-to-class (string/split cls #"\s+")
value)))
(defn add-class
[[tag & body :as elem] css-class]
(if (map? (get-in elem [1]))
(update-in elem [1 :class] (fnil add-to-class []) css-class)
(apply vector tag {:class [css-class]} body)))
(defn add-classes
[[tag & body :as elem] & k]
(if (map? (get-in elem [1]))
(update-in elem [1 :class] (fnil add-to-class []) (flatten k))
(apply vector tag {:class k} body)))
(defmulti ^:private remove-from-class
(fn
[cls _]
(cond
(string? cls) :string
(sequential? cls) :sequence)))
(defmethod remove-from-class :string
[cls value]
(string/join " "
(remove-from-class (string/split cls #"\s+")
value)))
(defmethod remove-from-class :sequence
[cls value]
(remove #(= value %)
cls))
(defn remove-class
[elem css-class]
(if (map? (get-in elem [1]))
(lib/update-in-if elem [1 :class] remove-from-class css-class)
elem))