|
1 | 1 |
|
2 | 2 | {} (:package |respo-message) |
3 | | - :configs $ {} (:init-fn |respo-message.main/main!) (:reload-fn |respo-message.main/reload!) (:version |0.0.8) |
| 3 | + :configs $ {} (:init-fn |respo-message.main/main!) (:reload-fn |respo-message.main/reload!) (:version |0.0.9) |
4 | 4 | :modules $ [] |lilac/ |respo.calcit/ |memof/ |respo-ui.calcit/ |
5 | 5 | :entries $ {} |
6 | 6 | :files $ {} |
7 | 7 | |respo-message.action $ %{} :FileEntry |
8 | 8 | :defs $ {} |
9 | | - |clear $ %{} :CodeEntry (:doc |) |
| 9 | + |clear $ %{} :CodeEntry (:doc "|Action tag for clearing all messages. Use it with dispatch! to remove all displayed messages at once.") |
10 | 10 | :code $ quote |
11 | 11 | def clear $ gen-tag "\"message/clear" |
12 | | - |create $ %{} :CodeEntry (:doc |) |
| 12 | + :examples $ [] |
| 13 | + quote $ dispatch! action/clear nil |
| 14 | + |create $ %{} :CodeEntry (:doc "|Action tag for creating a new message. Use it with dispatch! to display a toast message.") |
13 | 15 | :code $ quote |
14 | 16 | def create $ gen-tag "\"message/create" |
15 | | - |dict $ %{} :CodeEntry (:doc |) |
| 17 | + :examples $ [] |
| 18 | + quote $ dispatch! action/create |
| 19 | + {} (:text "|Hello world!") (:token |msg-1) |
| 20 | + quote $ dispatch! action/create |
| 21 | + {} (:text "|Operation completed") |
| 22 | + :style $ {} |
| 23 | + :background-color $ hsl 120 80 60 |
| 24 | + |dict $ %{} :CodeEntry (:doc "|Dictionary of all message action tags. Useful for pattern matching and validation.") |
16 | 25 | :code $ quote |
17 | 26 | def dict $ {} (:create create) (:remove-one remove-one) (:clear clear) |
| 27 | + :examples $ [] |
| 28 | + quote $ get action/dict :create |
| 29 | + quote $ keys action/dict |
18 | 30 | |gen-tag $ %{} :CodeEntry (:doc |) |
19 | 31 | :code $ quote |
20 | 32 | defn gen-tag (x) |
21 | 33 | turn-tag $ str x "\"_GEN_" 0 |
22 | | - |message-action? $ %{} :CodeEntry (:doc |) |
| 34 | + :examples $ [] |
| 35 | + |message-action? $ %{} :CodeEntry (:doc "|Predicate function to check if an operation is a message action. Returns true for create, clear, and remove-one actions.") |
23 | 36 | :code $ quote |
24 | 37 | defn message-action? (op) |
25 | 38 | includes? (#{} clear create remove-one) op |
26 | | - |remove-one $ %{} :CodeEntry (:doc |) |
| 39 | + :examples $ [] |
| 40 | + quote $ action/message-action? action/create |
| 41 | + quote $ action/message-action? :unknown-action |
| 42 | + |remove-one $ %{} :CodeEntry (:doc "|Action tag for removing a specific message. Messages can be identified by :id or :token field.") |
27 | 43 | :code $ quote |
28 | 44 | def remove-one $ gen-tag "\"message/remove-one" |
| 45 | + :examples $ [] |
| 46 | + quote $ dispatch! action/remove-one |
| 47 | + {} $ :token |msg-1 |
| 48 | + quote $ dispatch! action/remove-one |
| 49 | + {} $ :id |some-id |
29 | 50 | :ns $ %{} :CodeEntry (:doc |) |
30 | 51 | :code $ quote (ns respo-message.action) |
| 52 | + :examples $ [] |
31 | 53 | |respo-message.comp.container $ %{} :FileEntry |
32 | 54 | :defs $ {} |
33 | 55 | |comp-container $ %{} :CodeEntry (:doc |) |
|
61 | 83 | {} $ :bottom? false |
62 | 84 | fn (info d!) (d! action/remove-one info) |
63 | 85 | when config/dev? $ comp-inspect "\"messages" (:messages store) nil |
| 86 | + :examples $ [] |
64 | 87 | :ns $ %{} :CodeEntry (:doc |) |
65 | 88 | :code $ quote |
66 | 89 | ns respo-message.comp.container $ :require |
|
75 | 98 | respo-message.action :as action |
76 | 99 | respo.comp.inspect :refer $ comp-inspect |
77 | 100 | respo-message.config :as config |
| 101 | + :examples $ [] |
78 | 102 | |respo-message.comp.message $ %{} :FileEntry |
79 | 103 | :defs $ {} |
80 | 104 | |comp-message $ %{} :CodeEntry (:doc |) |
|
102 | 126 | :time $ :time message |
103 | 127 | , d! |
104 | 128 | <> (:text message) nil |
| 129 | + :examples $ [] |
105 | 130 | |css-message $ %{} :CodeEntry (:doc |) |
106 | 131 | :code $ quote |
107 | 132 | defstyle css-message $ {} |
|
121 | 146 | :cursor :pointer |
122 | 147 | :transition-duration |400ms |
123 | 148 | :box-shadow $ str "\"0px 0px 4px " (hsl 0 0 10 0.1) |
| 149 | + :examples $ [] |
124 | 150 | |effect-fade $ %{} :CodeEntry (:doc |) |
125 | 151 | :code $ quote |
126 | 152 | defeffect effect-fade (message idx bottom?) (action el *local) |
|
149 | 175 | js/setTimeout |
150 | 176 | fn () $ .!remove cloned |
151 | 177 | , 400 |
| 178 | + :examples $ [] |
152 | 179 | :ns $ %{} :CodeEntry (:doc |) |
153 | 180 | :code $ quote |
154 | 181 | ns respo-message.comp.message $ :require |
|
157 | 184 | respo.util.format :refer $ hsl |
158 | 185 | respo-message.schema :as schema |
159 | 186 | respo.css :refer $ defstyle |
| 187 | + :examples $ [] |
160 | 188 | |respo-message.comp.messages $ %{} :FileEntry |
161 | 189 | :defs $ {} |
162 | | - |comp-messages $ %{} :CodeEntry (:doc |) |
| 190 | + |comp-messages $ %{} :CodeEntry (:doc "|Respo component that renders a list of toast messages. Pass messages map, options (with :bottom? flag for positioning), and on-remove! callback. Messages are auto-sorted by time (newest first) and rendered at fixed position (top-right or bottom-right).") |
163 | 191 | :code $ quote |
164 | 192 | defcomp comp-messages (messages options on-remove!) |
165 | 193 | list-> |
|
175 | 203 | - (:time m) (:time message) |
176 | 204 | map-indexed $ fn (idx message) |
177 | 205 | [] (:id message) (comp-message idx message options on-remove!) |
| 206 | + :examples $ [] |
| 207 | + quote $ comp-messages (:messages store) |
| 208 | + {} $ :bottom? true |
| 209 | + fn (info d!) (d! action/remove-one info) |
| 210 | + quote $ comp-messages (:messages store) |
| 211 | + {} $ :bottom? false |
| 212 | + fn (info d!) (d! action/remove-one info) |
178 | 213 | :ns $ %{} :CodeEntry (:doc |) |
179 | 214 | :code $ quote |
180 | 215 | ns respo-message.comp.messages $ :require |
181 | 216 | respo.core :refer $ defcomp list-> div span <> |
182 | 217 | respo-message.comp.message :refer $ comp-message |
| 218 | + :examples $ [] |
183 | 219 | |respo-message.config $ %{} :FileEntry |
184 | 220 | :defs $ {} |
185 | 221 | |cdn? $ %{} :CodeEntry (:doc |) |
|
189 | 225 | , false |
190 | 226 | (exists? js/process) (= "\"true" js/process.env.cdn) |
191 | 227 | true false |
| 228 | + :examples $ [] |
192 | 229 | |dev? $ %{} :CodeEntry (:doc |) |
193 | 230 | :code $ quote |
194 | 231 | def dev? $ let |
|
198 | 235 | , debug? |
199 | 236 | (exists? js/process) (not= "\"true" js/process.env.release) |
200 | 237 | :else true |
| 238 | + :examples $ [] |
201 | 239 | |site $ %{} :CodeEntry (:doc |) |
202 | 240 | :code $ quote |
203 | 241 | def site $ {} (:dev-ui "\"http://localhost:8100/main-fonts.css") (:release-ui "\"http://cdn.tiye.me/favored-fonts/main-fonts.css") (:cdn-url "\"http://cdn.tiye.me/respo-message/") (:title "\"Message") (:icon "\"http://cdn.tiye.me/logo/respo.png") (:storage-key "\"respo-message") |
| 242 | + :examples $ [] |
204 | 243 | :ns $ %{} :CodeEntry (:doc |) |
205 | 244 | :code $ quote (ns respo-message.config) |
| 245 | + :examples $ [] |
206 | 246 | |respo-message.main $ %{} :FileEntry |
207 | 247 | :defs $ {} |
208 | 248 | |*store $ %{} :CodeEntry (:doc |) |
209 | 249 | :code $ quote (defatom *store schema/store) |
| 250 | + :examples $ [] |
210 | 251 | |dispatch! $ %{} :CodeEntry (:doc |) |
211 | 252 | :code $ quote |
212 | 253 | defn dispatch! (op) |
|
223 | 264 | :states cursor s |
224 | 265 | update-states store cursor s |
225 | 266 | _ $ do (eprintln "\"Unhandled operation:" op) store |
| 267 | + :examples $ [] |
226 | 268 | |main! $ %{} :CodeEntry (:doc |) |
227 | 269 | :code $ quote |
228 | 270 | defn main! () |
|
233 | 275 | dispatch! $ :: action/create |
234 | 276 | {} $ :text (lorem-ipsum/loremIpsum) |
235 | 277 | println "|app started!" |
| 278 | + :examples $ [] |
236 | 279 | |mount-target $ %{} :CodeEntry (:doc |) |
237 | 280 | :code $ quote |
238 | 281 | def mount-target $ js/document.querySelector |.app |
| 282 | + :examples $ [] |
239 | 283 | |reload! $ %{} :CodeEntry (:doc |) |
240 | 284 | :code $ quote |
241 | 285 | defn reload! () (clear-cache!) (render-app! render!) (println "|Code update.") |
242 | 286 | dispatch! $ :: action/create |
243 | 287 | {} $ :text (lorem-ipsum/loremIpsum) |
| 288 | + :examples $ [] |
244 | 289 | |render-app! $ %{} :CodeEntry (:doc |) |
245 | 290 | :code $ quote |
246 | 291 | defn render-app! (renderer) |
247 | 292 | renderer mount-target (comp-container @*store) dispatch! |
| 293 | + :examples $ [] |
248 | 294 | :ns $ %{} :CodeEntry (:doc |) |
249 | 295 | :code $ quote |
250 | 296 | ns respo-message.main $ :require |
|
257 | 303 | respo-message.updater :refer $ update-messages |
258 | 304 | respo-message.action :as action |
259 | 305 | respo-message.config :as config |
| 306 | + :examples $ [] |
260 | 307 | |respo-message.schema $ %{} :FileEntry |
261 | 308 | :defs $ {} |
262 | | - |message $ %{} :CodeEntry (:doc |) |
| 309 | + |message $ %{} :CodeEntry (:doc "|Schema definition for a message object. Contains :id (auto-generated), :token (optional user-defined), :text (message content), :time (creation timestamp), and :style (custom CSS styles).") |
263 | 310 | :code $ quote |
264 | 311 | def message $ {} (:id nil) (:token nil) (:text "\"") (:time 0) |
265 | 312 | :style $ {} |
266 | | - |store $ %{} :CodeEntry (:doc |) |
| 313 | + :examples $ [] |
| 314 | + quote $ merge schema/message |
| 315 | + {} (:text |Hello) (:token |msg-1) |
| 316 | + quote $ merge schema/message |
| 317 | + {} (:text "|Error occurred") |
| 318 | + :style $ {} |
| 319 | + :background-color $ hsl 0 80 60 |
| 320 | + |store $ %{} :CodeEntry (:doc "|Schema definition for the message store. Contains :messages (hashmap of messages by id) and :states (component states storage).") |
267 | 321 | :code $ quote |
268 | 322 | def store $ {} |
269 | 323 | :messages $ {} |
270 | 324 | :states $ {} |
| 325 | + :examples $ [] |
| 326 | + quote $ schema/store |
| 327 | + quote $ merge schema/store |
| 328 | + {} $ :messages |
| 329 | + {} $ |msg-1 |
| 330 | + {} $ :text |Hello |
271 | 331 | :ns $ %{} :CodeEntry (:doc |) |
272 | 332 | :code $ quote (ns respo-message.schema) |
| 333 | + :examples $ [] |
273 | 334 | |respo-message.updater $ %{} :FileEntry |
274 | 335 | :defs $ {} |
275 | | - |update-messages $ %{} :CodeEntry (:doc |) |
| 336 | + |update-messages $ %{} :CodeEntry (:doc "|Updater function that processes message actions and updates the messages state. Handles create, clear, and remove-one operations. Should be called from your main updater when action/message-action? returns true.") |
276 | 337 | :code $ quote |
277 | 338 | defn update-messages (messages op op-data op-id op-time) |
278 | 339 | cond |
|
290 | 351 | pairs-map |
291 | 352 | dissoc messages $ :id op-data |
292 | 353 | true messages |
| 354 | + :examples $ [] |
| 355 | + quote $ update-messages ({}) action/create |
| 356 | + {} $ :text |Hello |
| 357 | + , |id-1 1234567890 |
| 358 | + quote $ update-messages existing-messages action/clear nil |id-2 1234567891 |
293 | 359 | :ns $ %{} :CodeEntry (:doc |) |
294 | 360 | :code $ quote |
295 | 361 | ns respo-message.updater $ :require (respo-message.schema :as schema) (respo-message.action :as action) |
| 362 | + :examples $ [] |
0 commit comments