sir-trevor-rails 0.1.3

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.
Files changed (50) hide show
  1. data/.gitignore +1 -0
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +101 -0
  4. data/MIT-LICENCE +20 -0
  5. data/README.md +120 -0
  6. data/Rakefile +10 -0
  7. data/app/assets/images/sir-trevor/icons/block_editor_blockquote.png +0 -0
  8. data/app/assets/images/sir-trevor/icons/block_editor_embed.png +0 -0
  9. data/app/assets/images/sir-trevor/icons/block_editor_image.png +0 -0
  10. data/app/assets/images/sir-trevor/icons/block_editor_list.png +0 -0
  11. data/app/assets/images/sir-trevor/icons/block_editor_text.png +0 -0
  12. data/app/assets/images/sir-trevor/icons/block_editor_tweet.png +0 -0
  13. data/app/assets/images/sir-trevor/icons/block_editor_video.png +0 -0
  14. data/app/assets/images/sir-trevor/icons/close.gif +0 -0
  15. data/app/assets/images/sir-trevor/icons/handle.gif +0 -0
  16. data/app/assets/images/sir-trevor/icons/new_image.png +0 -0
  17. data/app/assets/images/sir-trevor/icons/new_tweet.png +0 -0
  18. data/app/assets/images/sir-trevor/icons/new_video.png +0 -0
  19. data/app/assets/images/sir-trevor/icons/quote.png +0 -0
  20. data/app/assets/images/sir-trevor/placeholders/placeholder.jpg +0 -0
  21. data/app/assets/images/sir-trevor/placeholders/post_placeholder.jpg +0 -0
  22. data/app/assets/images/sir-trevor/placeholders/thumbnail_placeholder.jpg +0 -0
  23. data/app/assets/javascript/sir-trevor.js +2 -0
  24. data/app/assets/javascript/sir-trevor/libs/underscore.js +32 -0
  25. data/app/assets/javascript/sir-trevor/sir-trevor.js +2363 -0
  26. data/app/assets/stylesheets/sir-trevor.css +4 -0
  27. data/app/assets/stylesheets/sir-trevor/icons.css.erb +47 -0
  28. data/app/assets/stylesheets/sir-trevor/sir-trevor.css +551 -0
  29. data/app/views/sir-trevor/blocks/_gallery_block.html.erb +6 -0
  30. data/app/views/sir-trevor/blocks/_image_block.html.erb +3 -0
  31. data/app/views/sir-trevor/blocks/_quote_block.html.erb +4 -0
  32. data/app/views/sir-trevor/blocks/_text_block.html.erb +3 -0
  33. data/app/views/sir-trevor/blocks/_tweet_block.html.erb +6 -0
  34. data/app/views/sir-trevor/blocks/_ul_block.html.erb +3 -0
  35. data/app/views/sir-trevor/blocks/_video_block.html.erb +7 -0
  36. data/config/initializers/validators.rb +10 -0
  37. data/lib/generators/sir_trevor/block/block_generator.rb +37 -0
  38. data/lib/generators/sir_trevor/block/templates/_block.css.erb +7 -0
  39. data/lib/generators/sir_trevor/block/templates/_block.html.erb +3 -0
  40. data/lib/generators/sir_trevor/block/templates/_block.js +122 -0
  41. data/lib/generators/sir_trevor/block/templates/_block.png +0 -0
  42. data/lib/generators/sir_trevor/views/views_generator.rb +17 -0
  43. data/lib/sir-trevor-rails.rb +19 -0
  44. data/lib/sir-trevor/engine.rb +29 -0
  45. data/lib/sir-trevor/helpers/form_builder.rb +11 -0
  46. data/lib/sir-trevor/helpers/form_helper.rb +29 -0
  47. data/lib/sir-trevor/helpers/view_helper.rb +78 -0
  48. data/lib/sir-trevor/version.rb +3 -0
  49. data/sir-trevor-rails.gemspec +29 -0
  50. metadata +174 -0
@@ -0,0 +1,4 @@
1
+ /*
2
+ *= require ./sir-trevor/sir-trevor
3
+ *= require ./sir-trevor/icons
4
+ */
@@ -0,0 +1,47 @@
1
+ /* All icons */
2
+
3
+ .sir-trevor .dropzone.image-block p,
4
+ .sir-trevor .dropzone.gallery-block p {
5
+ background: url(<%= asset_path 'sir-trevor/icons/new_image.png' %>) no-repeat 0 0;
6
+ }
7
+
8
+ .sir-trevor .sir-trevor-block .delete {
9
+ background-image: url(<%= asset_path 'sir-trevor/icons/close.gif' %>);
10
+ }
11
+
12
+ .sir-trevor .sir-trevor-block .handle {
13
+ background-image: url(<%= asset_path 'sir-trevor/icons/handle.gif' %>);
14
+ }
15
+
16
+ .sir-trevor .dropzone.tweet-block p {
17
+ background-image: url(<%= asset_path 'sir-trevor/icons/new_tweet.png' %>);
18
+ }
19
+
20
+ .sir-trevor .dropzone.video-block p {
21
+ background-image: url(<%= asset_path 'sir-trevor/icons/new_video.png' %>);
22
+ }
23
+
24
+ .sir-trevor .sir-trevor-marker .buttons a.new-block-quote {
25
+ background-image: url(<%= asset_path 'sir-trevor/icons/block_editor_blockquote.png' %>);
26
+ }
27
+
28
+ .sir-trevor .sir-trevor-marker .buttons a.new-image,
29
+ .sir-trevor .sir-trevor-marker .buttons a.new-gallery {
30
+ background-image: url(<%= asset_path 'sir-trevor/icons/block_editor_image.png' %>);
31
+ }
32
+
33
+ .sir-trevor .sir-trevor-marker .buttons a.new-text {
34
+ background-image: url(<%= asset_path 'sir-trevor/icons/block_editor_text.png' %>);
35
+ }
36
+
37
+ .sir-trevor .sir-trevor-marker .buttons a.new-list {
38
+ background-image: url(<%= asset_path 'sir-trevor/icons/block_editor_list.png' %>);
39
+ }
40
+
41
+ .sir-trevor .sir-trevor-marker .buttons a.new-tweet {
42
+ background-image: url(<%= asset_path 'sir-trevor/icons/block_editor_tweet.png' %>);
43
+ }
44
+
45
+ .sir-trevor .sir-trevor-marker .buttons a.new-video {
46
+ background-image: url(<%= asset_path 'sir-trevor/icons/block_editor_video.png' %>);
47
+ }
@@ -0,0 +1,551 @@
1
+ /* Basic Sir Trevor styles */
2
+ body { margin: 0; font-size: 1em; line-height: 1.4; }
3
+
4
+ .sir-trevor {
5
+ padding: 0;
6
+ z-index: 1;
7
+ }
8
+
9
+ .sir-trevor-blocks {
10
+ padding: 40px 0;
11
+ position: relative;
12
+ }
13
+
14
+ /* Typography reset */
15
+ .sir-trevor { font-size: 100%; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
16
+ .sir-trevor , .sir-trevor button, .sir-trevor input, .sir-trevor select, .sir-trevor textarea, .sir-trevor blockquote { font-family: "Helvetica Neue", 'Arial', sans-serif; color: #222; }
17
+ /* Generics */
18
+ .sir-trevor .hidden { display: none !important; visibility: hidden; }
19
+
20
+ .sir-trevor * {
21
+ -webkit-box-sizing: border-box;
22
+ -moz-box-sizing: border-box;
23
+ -ms-box-sizing: border-box;
24
+ box-sizing: border-box;
25
+ }
26
+
27
+ /* Formatting Control Bar */
28
+
29
+ .sir-trevor .sir-trevor-formatting-control {
30
+ background: #e9e9e9;
31
+ border: 1px solid #dadada;
32
+ padding: 11px 0;
33
+ text-align: center;
34
+ position: absolute;
35
+ width: 100%;
36
+ z-index: 102;
37
+ display: box;
38
+ box-sizing: border-box;
39
+ margin: -44px 0 0 0;
40
+ top: 0;
41
+ }
42
+
43
+ .sir-trevor-formatting-control .format-button {
44
+ min-width: 25px;
45
+ padding: 2px 4px;
46
+ border-radius: 4px;
47
+ color: white;
48
+ border: 1px solid #9A9A9A;
49
+ background: #B2B2B2;
50
+ text-align: center;
51
+ margin: 0 10px 0 0;
52
+ cursor: pointer;
53
+ }
54
+
55
+ .sir-trevor-formatting-control .format-button:hover {
56
+ background: #606060;
57
+ border: 1px solid #606060;
58
+ }
59
+
60
+ /* Marker */
61
+
62
+ .sir-trevor .sir-trevor-marker {
63
+ display: block;
64
+ cursor: pointer;
65
+ background: #F5F297;
66
+ border: 1px dotted #DAC962;
67
+ height: 46px;
68
+ text-align: center;
69
+ vertical-align: top;
70
+ color: #9B8816;
71
+ position: absolute;
72
+ width: 100%;
73
+ margin-top: -44px;
74
+ z-index: 101;
75
+ }
76
+
77
+ .sir-trevor .sir-trevor-marker p {
78
+ display: inline-block;
79
+ line-height: 36px;
80
+ font-size: 10px;
81
+ font-weight: bold;
82
+ margin: 0;
83
+ padding: 0 16px 0 0;
84
+ color: #9B8816;
85
+ }
86
+
87
+ .sir-trevor .sir-trevor-marker .buttons {
88
+ height: 46px;
89
+ display: inline-block;
90
+ }
91
+
92
+ .sir-trevor .sir-trevor-marker .buttons a {
93
+ padding: 27px 13px 8px;
94
+ margin: 0;
95
+ border-left: 1px dotted #DAC962;
96
+ color: #AF9B24;
97
+ height: 45px;
98
+ font-size: 8px;
99
+ display: inline-block;
100
+ text-decoration: none;
101
+ background-repeat: no-repeat;
102
+ background-position: center 9px;
103
+ }
104
+
105
+ /* Button graphics */
106
+
107
+ .sir-trevor .sir-trevor-marker .buttons a.new-block-quote {
108
+ background-image: url(images/sir-trevor/icons/block_editor_blockquote.png);
109
+ }
110
+
111
+ .sir-trevor .sir-trevor-marker .buttons a.new-image,
112
+ .sir-trevor .sir-trevor-marker .buttons a.new-gallery {
113
+ background-image: url(images/sir-trevor/icons/block_editor_image.png);
114
+ }
115
+
116
+ .sir-trevor .sir-trevor-marker .buttons a.new-text {
117
+ background-image: url(images/sir-trevor/icons/block_editor_text.png);
118
+ }
119
+
120
+ .sir-trevor .sir-trevor-marker .buttons a.new-list {
121
+ background-image: url(images/sir-trevor/icons/block_editor_list.png);
122
+ }
123
+
124
+ .sir-trevor .sir-trevor-marker .buttons a.new-tweet {
125
+ background-image: url(images/sir-trevor/icons/block_editor_tweet.png);
126
+ }
127
+
128
+ .sir-trevor .sir-trevor-marker .buttons a.new-video {
129
+ background-image: url(images/sir-trevor/icons/block_editor_video.png);
130
+ }
131
+
132
+ .sir-trevor .sir-trevor-marker .buttons a:last-child {
133
+ border-right: 1px dotted #DAC962;
134
+ }
135
+
136
+ .sir-trevor .sir-trevor-marker .buttons a:hover {
137
+
138
+ }
139
+
140
+ /* Blocks */
141
+
142
+ .sir-trevor .sir-trevor-block {
143
+ position: relative;
144
+ margin: 0 0 40px 0;
145
+ font-size: 14px;
146
+ overflow: hidden;
147
+ }
148
+
149
+ /* Dragging */
150
+
151
+ .sir-trevor .sir-trevor-block.dragging {
152
+ opacity: 0.5;
153
+ background: #fff;
154
+ }
155
+
156
+ /* Block editor */
157
+
158
+ .sir-trevor .sir-trevor-block .block-editor {
159
+ padding: 15px 20px 15px 40px;
160
+ border: 1px solid transparent;
161
+ }
162
+
163
+ .sir-trevor .sir-trevor-block.active .block-editor {
164
+ border: 1px solid #E9E9E9;
165
+ }
166
+
167
+ /* Dropzone */
168
+
169
+ .sir-trevor-block .dropzone {
170
+ background-color: #E9E9E9;
171
+ border: 1px dotted #B3B3B3;
172
+ padding: 20px;
173
+ text-align: center;
174
+ margin: 0 40px;
175
+ }
176
+
177
+ .sir-trevor-block .dropzone.dragOver {
178
+ background: #F5F297;
179
+ }
180
+
181
+ .sir-trevor .sir-trevor-block .dropzone p {
182
+ font-size: 20px;
183
+ line-height: 50px;
184
+ display: inline-block;
185
+ color: #666;
186
+ }
187
+
188
+
189
+ .sir-trevor-block .dropzone input[type="file"] {
190
+ position: absolute;
191
+ z-index: 50;
192
+ opacity: 0;
193
+ cursor: pointer;
194
+ left: 0;
195
+ width: 100%;
196
+ text-align: center;
197
+ }
198
+
199
+ .sir-trevor-block .dropzone button {
200
+ background: #5F5F5F;
201
+ border-radius: 4px;
202
+ border: none;
203
+ padding: 4px 16px;
204
+ color: white;
205
+ cursor: pointer;
206
+ position: relative;
207
+ z-index: 10;
208
+ }
209
+
210
+ .sir-trevor .sir-trevor-block .dropzone label { width: 50%; display: inline; font-weight: normal; color: #666; }
211
+ .sir-trevor .sir-trevor-block .dropzone input[type=text] { width: 50%; display: inline-block; margin-right: 0 }
212
+
213
+ /* Generic block styles */
214
+
215
+ .sir-trevor .sir-trevor-ready .sir-trevor-block.loading {
216
+ opacity: 0.6;
217
+ }
218
+
219
+ .sir-trevor-block.loading .spinner {
220
+ width: 32px;
221
+ height: 32px;
222
+ top: 50%; left: 50%;
223
+ margin: -16px 0 0 -16px;
224
+ position: absolute!important;
225
+ }
226
+
227
+ .sir-trevor-block [contenteditable=true] {
228
+ border: 1px solid transparent;
229
+ padding: 5px;
230
+ }
231
+ .sir-trevor-block [contenteditable=true]:focus,
232
+ .sir-trevor-block input:focus,
233
+ .sir-trevor-block textarea:focus {
234
+ outline: 0px solid transparent;
235
+ }
236
+
237
+ .sir-trevor-block [contenteditable=true].si-trevor-error {
238
+ border: 1px solid #990000;
239
+ }
240
+
241
+ .sir-trevor-block h1,
242
+ .sir-trevor-block h2,
243
+ .sir-trevor-block h3,
244
+ .sir-trevor-block h4,
245
+ .sir-trevor-block h5,
246
+ .sir-trevor-block h6 {
247
+ margin: 0 0 10px 0; padding: 0;
248
+ }
249
+
250
+ .sir-trevor ul,
251
+ .sir-trevor ol {
252
+ margin: 0 0 10px 20px;
253
+ padding: 0;
254
+ }
255
+
256
+ .sir-trevor li {
257
+ margin: 0 0 2px 0;
258
+ }
259
+
260
+ .sir-trevor-block p {
261
+ margin: 0 0 10px 0;
262
+ }
263
+
264
+ .sir-trevor-block time {
265
+ font-size: 10px;
266
+ display: block;
267
+ }
268
+
269
+ .sir-trevor-block a {
270
+ color: #222;
271
+ }
272
+
273
+ /* Text Block */
274
+
275
+ .sir-trevor-block .text-block,
276
+ .sir-trevor-block textarea {
277
+ min-height: 75px;
278
+ margin-bottom: 0;
279
+ }
280
+
281
+ /* Generic label / form elements */
282
+
283
+ .sir-trevor .sir-trevor-block label {
284
+ display: block;
285
+ margin: 10px 0 5px 0;
286
+ display: block;
287
+ padding-right: 8px;
288
+ font-size: 12px;
289
+ font-weight: bold;
290
+ }
291
+
292
+ .sir-trevor .sir-trevor-block input[type=text],
293
+ .sir-trevor .sir-trevor-block select,
294
+ .sir-trevor .sir-trevor-block textarea,
295
+ .sir-trevor .sir-trevor-block pre {
296
+ border: 1px solid #E9E9E9;
297
+ padding: 8px;
298
+ width: 100%;
299
+ display: box;
300
+ -webkit-box-sizing: border-box;
301
+ -moz-box-sizing: border-box;
302
+ -ms-box-sizing: border-box;
303
+ box-sizing: border-box;
304
+ margin-right: 10px;
305
+ font-size: 12px;
306
+ }
307
+
308
+ .sir-trevor .sir-trevor-block textarea,
309
+ .sir-trevor .sir-trevor-block pre {
310
+ border: 1px solid transparent;
311
+ font-size: 14px;
312
+ white-space: pre-wrap;
313
+ word-wrap: break-word;
314
+ }
315
+
316
+ .sir-trevor .sir-trevor-block input[type=text].sir-trevor-error,
317
+ .sir-trevor .sir-trevor-block select.sir-trevor-error,
318
+ .sir-trevor .sir-trevor-block textarea.sir-trevor-error {
319
+ border: 1px solid #990000;
320
+ }
321
+
322
+ /* Block quote */
323
+
324
+ .sir-trevor .sir-trevor-block .block-editor.block-quote-block {
325
+ padding-left: 60px;
326
+ }
327
+
328
+ .sir-trevor .sir-trevor-block blockquote {
329
+ padding: 5px; margin: 0;
330
+ font-size: 14px;
331
+ font-style: none;
332
+ }
333
+
334
+ /* Tweet block */
335
+
336
+ .sir-trevor .sir-trevor-block .tweet-block {}
337
+
338
+ .sir-trevor .sir-trevor-block .tweet-block .tweet {
339
+ padding: 20px;
340
+ }
341
+
342
+ .tweet-block .tweet p {
343
+ margin: 0 0 10px 0;
344
+ }
345
+
346
+ .sir-trevor .dropzone.tweet-block p {
347
+ padding-left: 70px;
348
+ line-height: 50px;
349
+ background: url(images/sir-trevor/icons/new_tweet.png) no-repeat 0 0;
350
+ }
351
+
352
+ /* Markdown Block */
353
+
354
+ .sir-trevor .expanding-textarea {
355
+ position: relative;
356
+ min-height: 75px;
357
+ }
358
+
359
+ .sir-trevor .expanding-textarea pre {
360
+ margin: 0; padding: 0;
361
+ }
362
+
363
+ .sir-trevor .expanding-textarea.active > textarea {
364
+ overflow: hidden;
365
+ position: absolute;
366
+ top: 0;
367
+ left: 0;
368
+ height: 100%;
369
+ resize: none;
370
+ }
371
+
372
+ .sir-trevor .expanding-textarea > pre {
373
+ display: none;
374
+ }
375
+
376
+ .sir-trevor .expanding-textarea.active > pre {
377
+ display: block;
378
+ visibility: hidden;
379
+ }
380
+
381
+ /*
382
+ Image block
383
+ */
384
+
385
+ .sir-trevor .dropzone.image-block p,
386
+ .sir-trevor .dropzone.gallery-block p {
387
+ padding-left: 70px;
388
+ line-height: 50px;
389
+ background: url(images/sir-trevor/icons/new_image.png) no-repeat 0 0;
390
+ }
391
+
392
+ .sir-trevor .image-block img {
393
+ width: 100%;
394
+ height: auto;
395
+ }
396
+
397
+ /* Video */
398
+
399
+ .sir-trevor .dropzone.video-block p,
400
+ .sir-trevor .dropzone.video-block p {
401
+ padding-left: 230px;
402
+ line-height: 50px;
403
+ background: url(images/sir-trevor/icons/new_video.png) no-repeat 0 0;
404
+ }
405
+
406
+ /* Gallery items */
407
+
408
+ .sir-trevor .sir-trevor-block.active .gallery-block.block-editor {
409
+ border: 1px solid transparent;
410
+ border-left: 0;
411
+ }
412
+
413
+ .sir-trevor .gallery-items {
414
+ overflow: hidden;
415
+ }
416
+
417
+ .sir-trevor .gallery-items ul {
418
+ margin: 0; padding: 0;
419
+ }
420
+
421
+ .sir-trevor .gallery-items ul li {
422
+ margin: 0 10px 10px 0;
423
+ list-style: none;
424
+ width: 50px; height: 50px;
425
+ display: block;
426
+ overflow: hidden;
427
+ border: 1px solid #E9E9E9;
428
+ float: left;
429
+ padding: 5px;
430
+ cursor: move;
431
+ position: relative;
432
+ }
433
+
434
+ .sir-trevor .gallery-items ul li img {
435
+ width: auto; height: 100%;
436
+ }
437
+
438
+ .sir-trevor .gallery-items ul li.dragover {
439
+ border: 1px solid #222;
440
+ background: #F5F297;
441
+ }
442
+
443
+ .sir-trevor .gallery-items ul li.dragging {
444
+ opacity: 0.2;
445
+ }
446
+
447
+
448
+ .sir-trevor .gallery-items ul li .delete {
449
+ top: 0;
450
+ right: 0;
451
+ }
452
+
453
+
454
+ /* Handle and delete */
455
+
456
+ .sir-trevor .sir-trevor-block .handle {
457
+ width: 10px;
458
+ height: 100%;
459
+ cursor: move;
460
+ position: absolute;
461
+ left: 0;
462
+ top: 0;
463
+ display: none;
464
+ background: #606060 url(images/sir-trevor/icons/handle.gif) repeat-y;
465
+ }
466
+
467
+ .sir-trevor .sir-trevor-block .delete {
468
+ width: 15px; height: 15px;
469
+ border: 1px solid #B3B3B3;
470
+ position: absolute;
471
+ top: 5px; right : 5px;
472
+ cursor: pointer;
473
+ display: none;
474
+ background: #fff url(images/sir-trevor/icons/close.gif) no-repeat;
475
+ }
476
+
477
+ .sir-trevor .sir-trevor-block.active .handle,
478
+ .sir-trevor .sir-trevor-block.active .delete {
479
+ display: block;
480
+ }
481
+
482
+
483
+ /* Validation tooltip */
484
+
485
+ .sir-trevor .error-marker {
486
+ position: absolute;
487
+ content: "!";
488
+ background: #B94A48;
489
+ color: #fff;
490
+ padding: 1px 4px 2px;
491
+ border-radius: 3px;
492
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
493
+ font-size: 11px;
494
+ z-index: 1001;
495
+ font-weight: bold;
496
+ margin-left: -10px;
497
+ margin-top: 7px;
498
+ }
499
+
500
+ /* errors */
501
+
502
+ .sir-trevor-errors {
503
+ font-size: 14px;
504
+ padding: 15px 40px;
505
+ color: #B94A48;
506
+ background-color: #F2DEDE;
507
+ }
508
+
509
+ .sir-trevor-errors p {
510
+ font-weight: bold;
511
+ margin: 0;
512
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
513
+ }
514
+
515
+ .sir-trevor-errors ul {
516
+ margin-bottom: 0;
517
+ }
518
+
519
+ .sir-trevor-errors li {
520
+ margin: 0; padding: 0;
521
+ }
522
+
523
+ /* Generic fade-in ready function */
524
+ .sir-trevor .sir-trevor-block,
525
+ .sir-trevor .sir-trevor-marker,
526
+ .sir-trevor .sir-trevor-formatting-control {
527
+ opacity: 0;
528
+ -webkit-transition: opacity 0.3s ease;
529
+ -moz-transition: opacity 0.3s ease;
530
+ -ms-transition: opacity 0.3s ease;
531
+ -o-transition: opacity 0.3s ease;
532
+ transition: opacity 0.3s ease;
533
+ }
534
+ .sir-trevor .sir-trevor-ready .sir-trevor-item-ready {
535
+ opacity: 1;
536
+ }
537
+
538
+ .media {margin:10px;}
539
+ .media, .bd {overflow:hidden; _overflow:visible; zoom:1;}
540
+ .media .img {float:left; margin-right: 20px;}
541
+ .media .img img{display:block;}
542
+ .media .imgExt{float:right; margin-left: 20px;}
543
+
544
+ .sir-trevor .extended_input {
545
+ position: relative;
546
+ }
547
+
548
+ .sir-trevor .extended_input .count {
549
+ font-size: 11px;
550
+ margin: 0 0 0 5px;
551
+ }