x4js 2.3.27 → 2.3.29

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 (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/aicontext.md +412 -24
  4. package/package.json +8 -3
  5. package/src/components/autocomplete/autocomplete.ts +5 -1
  6. package/src/components/bargraph/bargraph.module.scss +44 -0
  7. package/src/components/bargraph/bargraph.ts +362 -0
  8. package/src/components/base.scss +71 -1
  9. package/src/components/boxes/boxes.ts +2 -2
  10. package/src/components/button/button.module.scss +4 -3
  11. package/src/components/calendar/calendar.module.scss +6 -5
  12. package/src/components/calendar/calendar.ts +14 -8
  13. package/src/components/canvas/canvas.ts +5 -4
  14. package/src/components/carousel/carousel.module.scss +165 -0
  15. package/src/components/carousel/carousel.ts +423 -0
  16. package/src/components/chart/chart.module.scss +8 -0
  17. package/src/components/chart/chart.ts +170 -12
  18. package/src/components/checkbox/checkbox.module.scss +67 -1
  19. package/src/components/checkbox/checkbox.ts +22 -6
  20. package/src/components/colorinput/colorinput.module.scss +1 -0
  21. package/src/components/combobox/combobox.module.scss +6 -2
  22. package/src/components/components.ts +3 -0
  23. package/src/components/gantt/gantt.module.scss +462 -0
  24. package/src/components/gantt/gantt.ts +1254 -0
  25. package/src/components/gridview/gridview.module.scss +6 -0
  26. package/src/components/input/input.module.scss +1 -1
  27. package/src/components/knob/knob.module.scss +113 -0
  28. package/src/components/knob/knob.ts +355 -0
  29. package/src/components/mapview/mapview.module.scss +177 -0
  30. package/src/components/mapview/mapview.ts +764 -0
  31. package/src/components/messages/messages.module.scss +9 -4
  32. package/src/components/planner/planner.module.scss +688 -0
  33. package/src/components/planner/planner.ts +1792 -0
  34. package/src/components/propgrid/progrid.module.scss +13 -5
  35. package/src/components/radio/radio.module.scss +58 -32
  36. package/src/components/radio/radio.ts +12 -1
  37. package/src/components/sizers/sizer.ts +17 -5
  38. package/src/components/slider/slider.module.scss +22 -20
  39. package/src/components/spreadsheet/spreadsheet.module.scss +6 -0
  40. package/src/components/switch/switch.module.scss +68 -44
  41. package/src/components/switch/switch.ts +6 -3
  42. package/src/components/tabs/tabs.module.scss +2 -0
  43. package/src/components/tabs/tabs.ts +1 -0
  44. package/src/components/tag/tag.module.scss +4 -4
  45. package/src/components/textarea/textarea.module.scss +9 -0
  46. package/src/components/textarea/textarea.ts +1 -0
  47. package/src/components/textedit/textedit.module.scss +5 -2
  48. package/src/components/themes.scss +20 -6
  49. package/src/components/treeview/treeview.module.scss +6 -1
  50. package/src/components/treeview/treeview.ts +1 -0
  51. package/src/components/video/video.module.scss +5 -2
  52. package/src/components/video/video.ts +14 -1
  53. package/src/core/core_i18n.ts +65 -0
  54. package/src/core/core_pdf.ts +17 -0
  55. package/src/core/core_react.ts +12 -18
  56. package/src/core/core_svg.ts +9 -6
  57. package/src/core/core_tools.ts +44 -0
  58. package/src/x4doc.ts +3 -0
@@ -46,7 +46,9 @@
46
46
 
47
47
  & .x4form {
48
48
  min-width: 400px;
49
- .x4icon {
49
+
50
+ // the icon of the box only, not those of its message
51
+ > .x4hbox > .x4icon {
50
52
  color: var( --msgbox-icon-color );
51
53
  height: 96px;
52
54
  }
@@ -57,7 +59,7 @@
57
59
  }
58
60
  }
59
61
 
60
- &.question .x4form .x4icon {
62
+ &.question .x4form > .x4hbox > .x4icon {
61
63
  color: var( --msgbox-question-icon-color );
62
64
  }
63
65
  }
@@ -68,7 +70,9 @@
68
70
 
69
71
  & .x4form {
70
72
  min-width: 400px;
71
- .x4icon {
73
+
74
+ // the icon of the box only, not those of its editor (the stars of a Rating...)
75
+ > .x4hbox > .x4icon {
72
76
  color: var( --msgbox-question-icon-color );
73
77
  height: 64px;
74
78
  }
@@ -141,7 +145,8 @@
141
145
  }
142
146
  }
143
147
 
144
- .x4icon {
148
+ // the spinner of the box only, not the icons of the lines of its log
149
+ > .x4hbox > .x4icon {
145
150
  height: 64px;
146
151
  animation: rotating 3s linear infinite;
147
152
  fill: var(--accent-background);
@@ -0,0 +1,688 @@
1
+ /**
2
+ * ___ ___ __
3
+ * \ \/ / / _
4
+ * \ / /_| |_
5
+ * / \____ _|
6
+ * /__/\__\ |_|
7
+ *
8
+ * @file planner.module.scss
9
+ * @author Etienne Cochard
10
+ *
11
+ * @copyright (c) 2026 R-libre ingenierie
12
+ *
13
+ * Use of this source code is governed by an MIT-style license
14
+ * that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
15
+ **/
16
+
17
+ :root {
18
+ --planner-background: var( --background-primary );
19
+ --planner-border: var( --border );
20
+ --planner-border-focus: var( --border-focus );
21
+
22
+ --planner-header-color: var( --text-ternary );
23
+ --planner-day-color: var( --text-primary ); // the number of a day, in the header
24
+ --planner-off-color: var( --text-secondary ); // the days off, in the header
25
+ --planner-today-background: var( --accent-background ); // the title of today: in the header, its number in the month
26
+ --planner-today-color: var( --accent-color );
27
+ --planner-today-column: var( --accent-background-light ); // behind today, at half of it
28
+
29
+ --planner-off-background: var( --background-ternary ); // the days off, the hours out of the working ones
30
+ --planner-line-color: var( --border-light ); // between the days, the hours off
31
+ --planner-step-color: var( --border-light ); // the steps between the working hours, at half of it
32
+ --planner-hour-line-color: var( --border ); // the working hours
33
+ --planner-hour-color: var( --text-secondary );
34
+ --planner-hour-color-work: var( --text-ternary );
35
+
36
+ --planner-edge-background: var( --color-primary-a90 ); // the marks of the events out of the view: the darkest blue, seen through (themes.scss: the dark theme has its own)
37
+ --planner-edge-color: var( --accent-color );
38
+ --planner-edge-shadow: 0 1px 2px rgba( 0, 0, 0, 0.25 );
39
+ --planner-edge-opacity: 0.6; // the events under them show through; 1 under the pointer
40
+
41
+ --planner-now-color: var( --accent-background ); // the line of now
42
+ --planner-now-tag: var( --accent-background ); // its time, in the hours
43
+ --planner-now-text: var( --accent-color );
44
+
45
+ --planner-event-background: var( --planner-background ); // under its tint: the grid does not show through
46
+ --planner-event-color: var( --accent-background ); // its border, its texts, its tint: its colour, or this one
47
+ --planner-event-tint: 0.12; // the opacity of its colour on its background
48
+ --planner-event-radius: 2px;
49
+ --planner-event-title: var( --text-primary ); // its texts: the ones of the theme, readable on any colour
50
+ --planner-event-text: var( --text-ternary ); // its times, its text
51
+ --planner-event-selected: var( --accent-background );
52
+
53
+ --planner-range-background: var( --accent-background-light );
54
+ --planner-range-border: var( --accent-background );
55
+
56
+ --planner-out-color: var( --text-secondary ); // the days of the month before and after it
57
+ --planner-more-color: var( --text-ternary );
58
+ }
59
+
60
+ .x4planner {
61
+ display: flex;
62
+ flex-direction: column;
63
+ overflow: hidden;
64
+ outline: none;
65
+ user-select: none;
66
+ border: 1px solid var( --planner-border );
67
+ background-color: var( --planner-background );
68
+
69
+ &:focus {
70
+ border-color: var( --planner-border-focus );
71
+ }
72
+
73
+ // disabled (inert: nothing reaches it): faded as a Box
74
+ &[disabled] {
75
+ opacity: var( --box-disabled-opacity );
76
+ }
77
+
78
+ // the days, over their columns: the name of the day, its number under it; today, its number in a round of the accent
79
+ > .head {
80
+ position: relative;
81
+ flex-shrink: 0;
82
+ height: 64px;
83
+ border-bottom: 1px solid var( --planner-hour-line-color );
84
+
85
+ .day {
86
+ position: absolute;
87
+ top: 0;
88
+ bottom: 0;
89
+ display: flex;
90
+ flex-direction: column;
91
+ align-items: center;
92
+ justify-content: center;
93
+ gap: 2px;
94
+ box-sizing: border-box;
95
+ overflow: hidden;
96
+ white-space: nowrap;
97
+ border-left: 1px solid var( --planner-line-color );
98
+
99
+ .name {
100
+ font-size: 0.7rem;
101
+ letter-spacing: 0.05em;
102
+ text-transform: uppercase;
103
+ color: var( --planner-header-color );
104
+ }
105
+
106
+ .num {
107
+ width: 34px;
108
+ height: 34px;
109
+ line-height: 34px;
110
+ border-radius: 50%;
111
+ text-align: center;
112
+ font-size: 1.3rem;
113
+ color: var( --planner-day-color );
114
+ }
115
+
116
+ &.off {
117
+ .name,
118
+ .num {
119
+ color: var( --planner-off-color );
120
+ }
121
+ }
122
+
123
+ // the tint of its column behind it (its own layer: its opacity is not the one of the texts)
124
+ &.today {
125
+ isolation: isolate;
126
+
127
+ &::before {
128
+ content: "";
129
+ position: absolute;
130
+ inset: 0;
131
+ z-index: -1;
132
+ background-color: var( --planner-today-column );
133
+ opacity: 0.5;
134
+ }
135
+
136
+ .name {
137
+ color: var( --planner-today-background );
138
+ }
139
+
140
+ .num {
141
+ color: var( --planner-today-color );
142
+ background-color: var( --planner-today-background );
143
+ }
144
+ }
145
+ }
146
+ }
147
+
148
+ // the events of whole days, under the days
149
+ > .band {
150
+ position: relative;
151
+ flex-shrink: 0;
152
+ border-bottom: 1px solid var( --planner-hour-line-color );
153
+
154
+ > .day {
155
+ position: absolute;
156
+ top: 0;
157
+ bottom: 0;
158
+ box-sizing: border-box;
159
+ border-left: 1px solid var( --planner-line-color );
160
+
161
+ &.off {
162
+ background-color: var( --planner-off-background );
163
+ }
164
+
165
+ // alone in it: its opacity is the one of its background
166
+ &.today {
167
+ background-color: var( --planner-today-column );
168
+ opacity: 0.5;
169
+ }
170
+ }
171
+
172
+ > .range {
173
+ top: 1px;
174
+ bottom: 1px;
175
+ }
176
+ }
177
+
178
+ > .body {
179
+ flex: 1;
180
+ min-height: 0;
181
+ overflow-x: hidden;
182
+ overflow-y: auto;
183
+ }
184
+
185
+ .canvas {
186
+ position: relative;
187
+
188
+ > .layer,
189
+ > .marks,
190
+ > .hours {
191
+ position: absolute;
192
+ inset: 0;
193
+ }
194
+
195
+ > .marks,
196
+ > .hours {
197
+ pointer-events: none;
198
+ }
199
+ }
200
+
201
+ // behind the events: a path for the days off and the hours out of the working ones, one for
202
+ // the lines of the steps and between the days, one for the lines of the working hours
203
+ .grid {
204
+ position: absolute;
205
+ left: 0;
206
+ top: 0;
207
+ pointer-events: none;
208
+
209
+ path {
210
+ fill: none;
211
+ stroke-width: 1;
212
+ shape-rendering: crispEdges;
213
+ }
214
+
215
+ .off {
216
+ fill: var( --planner-off-background );
217
+ }
218
+
219
+ .today {
220
+ fill: var( --planner-today-column );
221
+ fill-opacity: 0.5;
222
+ }
223
+
224
+ .step {
225
+ stroke: var( --planner-step-color );
226
+ stroke-opacity: 0.5;
227
+ }
228
+
229
+ .line {
230
+ stroke: var( --planner-line-color );
231
+ }
232
+
233
+ .hour {
234
+ stroke: var( --planner-hour-line-color );
235
+ }
236
+ }
237
+
238
+ .hours .hour {
239
+ position: absolute;
240
+ left: 0;
241
+ width: 44px;
242
+ text-align: right;
243
+ transform: translateY( -50% );
244
+ font-size: 0.72rem;
245
+ font-variant-numeric: tabular-nums;
246
+ color: var( --planner-hour-color );
247
+
248
+ &.work {
249
+ color: var( --planner-hour-color-work );
250
+ }
251
+
252
+ // under the time of now
253
+ &.covered {
254
+ visibility: hidden;
255
+ }
256
+ }
257
+
258
+ // the view of a day: its column is the view, no tint behind today
259
+ &.day-view {
260
+ > .head .day.today::before {
261
+ display: none;
262
+ }
263
+
264
+ > .band > .day.today {
265
+ background-color: transparent;
266
+ opacity: 1;
267
+ }
268
+
269
+ .grid .today {
270
+ fill: none;
271
+ }
272
+ }
273
+
274
+ // now: a line across the days, over the events; paler across today
275
+ .now {
276
+ position: absolute;
277
+ height: 1px;
278
+ z-index: 3;
279
+ pointer-events: none;
280
+ background-color: var( --planner-now-color );
281
+
282
+ &.today {
283
+ opacity: 0.2;
284
+ }
285
+ }
286
+
287
+ // the events out of the view: a mark at the top or the bottom of the view, in the middle of their day
288
+ .edge {
289
+ position: absolute;
290
+ z-index: 4;
291
+ width: 40px;
292
+ height: 18px;
293
+ line-height: 18px;
294
+ margin-left: -20px;
295
+ border-radius: 9px;
296
+ text-align: center;
297
+ font-size: 0.72rem;
298
+ font-weight: 600;
299
+ cursor: pointer;
300
+ color: var( --planner-edge-color );
301
+ background-color: var( --planner-edge-background );
302
+ box-shadow: var( --planner-edge-shadow );
303
+ opacity: var( --planner-edge-opacity );
304
+
305
+ &:hover {
306
+ opacity: 1;
307
+ }
308
+
309
+ // a tab on the edge of the view: its corners against it square
310
+ &.up {
311
+ border-top-left-radius: 0;
312
+ border-top-right-radius: 0;
313
+ }
314
+
315
+ // 2px less under its text: against the bottom of the view
316
+ &.down {
317
+ height: 16px;
318
+ margin-top: -16px;
319
+ border-bottom-left-radius: 0;
320
+ border-bottom-right-radius: 0;
321
+ }
322
+ }
323
+
324
+ // its time, in the hours on the left: a tag, its point on the line
325
+ .now-time {
326
+ position: absolute;
327
+ left: 4px;
328
+ width: 48px;
329
+ box-sizing: border-box;
330
+ transform: translateY( -50% );
331
+ padding: 1px 9px 1px 4px;
332
+ clip-path: polygon( 0 0, calc( 100% - 7px ) 0, 100% 50%, calc( 100% - 7px ) 100%, 0 100% );
333
+ text-align: right;
334
+ font-size: 0.7rem;
335
+ font-weight: 700;
336
+ font-variant-numeric: tabular-nums;
337
+ z-index: 3;
338
+ pointer-events: none;
339
+ color: var( --planner-now-text );
340
+ background-color: var( --planner-now-tag );
341
+ }
342
+
343
+ // the range selected: on a day, on days of the band
344
+ .marks > .range,
345
+ .band > .range {
346
+ position: absolute;
347
+ box-sizing: border-box;
348
+ border-radius: 4px;
349
+ pointer-events: none;
350
+ border: 1px solid var( --planner-range-border );
351
+ background-color: var( --planner-range-background );
352
+ }
353
+
354
+ .range-label {
355
+ position: absolute;
356
+ font-size: 0.8rem;
357
+ pointer-events: none;
358
+ }
359
+
360
+ // an event in its colour (the accent of the theme by default): its top border, its icon, and a tint
361
+ // of it on its background, drawn on a layer of its own (its opacity is not the one of the texts)
362
+ .event {
363
+ box-sizing: border-box;
364
+ overflow: hidden;
365
+ isolation: isolate;
366
+ font-size: 0.8rem;
367
+ line-height: 1.3;
368
+ color: var( --planner-event-title );
369
+ background-color: var( --planner-event-background );
370
+ border-top: 2px solid var( --planner-event-color );
371
+ border-radius: var( --planner-event-radius );
372
+
373
+ &::before {
374
+ content: "";
375
+ position: absolute;
376
+ inset: 0;
377
+ z-index: -1;
378
+ border-radius: inherit;
379
+ background-color: var( --planner-event-color );
380
+ opacity: var( --planner-event-tint );
381
+ }
382
+
383
+ &.colored {
384
+ --planner-event-color: var( --planner-color );
385
+ }
386
+
387
+ // its title, its icon on its right
388
+ .head {
389
+ display: flex;
390
+ align-items: center;
391
+ gap: 4px;
392
+ min-width: 0;
393
+ }
394
+
395
+ // a little transparent: softer on the tint
396
+ .title {
397
+ flex: 1;
398
+ min-width: 0;
399
+ font-weight: 600;
400
+ white-space: nowrap;
401
+ overflow: hidden;
402
+ text-overflow: ellipsis;
403
+ opacity: 0.85;
404
+ }
405
+
406
+ .icon {
407
+ width: 14px;
408
+ height: 14px;
409
+ min-width: 14px;
410
+ color: var( --planner-event-color );
411
+ fill: currentColor;
412
+ }
413
+
414
+ .time,
415
+ .text {
416
+ color: var( --planner-event-text );
417
+ }
418
+
419
+ .time {
420
+ white-space: nowrap;
421
+ }
422
+
423
+ // inside it: its outer edge is the one of the event, its radius too
424
+ &.selected {
425
+ outline: 2px solid var( --planner-event-selected );
426
+ outline-offset: -2px;
427
+ }
428
+
429
+ // moved, not copied: where it was
430
+ &.faded {
431
+ opacity: 0.35;
432
+ }
433
+
434
+ // where it goes, over the others
435
+ &.dragging {
436
+ z-index: 2;
437
+ opacity: 0.8;
438
+ pointer-events: none;
439
+ }
440
+ }
441
+
442
+ &:not( .readonly ) .event {
443
+ cursor: grab;
444
+ }
445
+
446
+ // in a day: its title, its times, its text on as many lines as it has room for
447
+ .layer > .event {
448
+ position: absolute;
449
+ display: flex;
450
+ flex-direction: column;
451
+ padding: 2px 6px;
452
+
453
+ .text {
454
+ margin-top: 4px;
455
+ min-height: 0;
456
+ overflow: hidden;
457
+ white-space: pre-line;
458
+ font-style: italic;
459
+ }
460
+
461
+ // on a small one: on one line, the times cut before the title
462
+ &.small {
463
+ flex-direction: row;
464
+ align-items: center;
465
+ gap: 6px;
466
+ padding: 0 6px;
467
+
468
+ .head {
469
+ flex-shrink: 0;
470
+ max-width: 100%;
471
+ }
472
+
473
+ .time {
474
+ min-width: 0;
475
+ overflow: hidden;
476
+ }
477
+
478
+ .text {
479
+ display: none;
480
+ }
481
+ }
482
+
483
+ // its top and its bottom, small enough on a small event to leave room to move it
484
+ .grip {
485
+ position: absolute;
486
+ left: 0;
487
+ right: 0;
488
+ height: min( 6px, 25% );
489
+ cursor: ns-resize;
490
+
491
+ &.start {
492
+ top: 0;
493
+ }
494
+
495
+ &.end {
496
+ bottom: 0;
497
+ }
498
+ }
499
+ }
500
+
501
+ // in the band: its title on one line, its left and right ends
502
+ .band > .event {
503
+ position: absolute;
504
+ display: flex;
505
+ align-items: center;
506
+ padding: 0 6px;
507
+
508
+ .head {
509
+ flex: 1;
510
+ }
511
+
512
+ .grip {
513
+ position: absolute;
514
+ top: 0;
515
+ bottom: 0;
516
+ width: 6px;
517
+ cursor: ew-resize;
518
+
519
+ &.start {
520
+ left: 0;
521
+ }
522
+
523
+ &.end {
524
+ right: 0;
525
+ }
526
+ }
527
+ }
528
+
529
+ // while an event is moved or stretched, a range selected: the cursor wherever the pointer is
530
+ &.moving,
531
+ &.moving * {
532
+ cursor: grabbing !important;
533
+ }
534
+
535
+ &.sizing .layer,
536
+ &.sizing .layer * {
537
+ cursor: ns-resize !important;
538
+ }
539
+
540
+ &.sizing .band,
541
+ &.sizing .band * {
542
+ cursor: ew-resize !important;
543
+ }
544
+
545
+ // the month: its weeks, the days off narrower
546
+ > .month {
547
+ flex: 1;
548
+ min-height: 0;
549
+ display: flex;
550
+ flex-direction: column;
551
+
552
+ > .names {
553
+ flex-shrink: 0;
554
+ display: grid;
555
+ grid-template-columns: var( --planner-cols );
556
+ height: 30px;
557
+ border-bottom: 1px solid var( --planner-hour-line-color );
558
+
559
+ .name {
560
+ display: flex;
561
+ align-items: center;
562
+ justify-content: center;
563
+ color: var( --planner-header-color );
564
+
565
+ &.off {
566
+ color: var( --planner-off-color );
567
+ }
568
+ }
569
+ }
570
+
571
+ > .cells {
572
+ position: relative;
573
+ flex: 1;
574
+ min-height: 0;
575
+ display: grid;
576
+ grid-template-columns: var( --planner-cols );
577
+ grid-template-rows: repeat( var( --planner-rows ), minmax( 0, 1fr ) );
578
+ }
579
+
580
+ .day {
581
+ display: flex;
582
+ flex-direction: column;
583
+ min-width: 0;
584
+ min-height: 0;
585
+ overflow: hidden;
586
+ padding: 2px 4px 4px;
587
+ border-right: 1px solid var( --planner-line-color );
588
+ border-bottom: 1px solid var( --planner-line-color );
589
+
590
+ &.off {
591
+ background-color: var( --planner-off-background );
592
+ }
593
+
594
+ &.out .num {
595
+ color: var( --planner-out-color );
596
+ }
597
+
598
+ // its number in a round of the accent
599
+ &.today .num {
600
+ align-self: flex-end;
601
+ width: 20px;
602
+ border-radius: 50%;
603
+ text-align: center;
604
+ color: var( --planner-today-color );
605
+ background-color: var( --planner-today-background );
606
+ }
607
+
608
+ &.range {
609
+ background-color: var( --planner-range-background );
610
+ }
611
+
612
+ // where the event moved goes
613
+ &.drop {
614
+ outline: 2px solid var( --planner-range-border );
615
+ outline-offset: -2px;
616
+ }
617
+
618
+ // as high as the round of today: the lists of the days start at the same height
619
+ .num {
620
+ flex-shrink: 0;
621
+ height: 20px;
622
+ line-height: 20px;
623
+ text-align: right;
624
+ font-size: 0.8rem;
625
+ color: var( --planner-header-color );
626
+ }
627
+
628
+ .list {
629
+ flex: 1;
630
+ min-height: 0;
631
+ overflow: hidden;
632
+ display: flex;
633
+ flex-direction: column;
634
+ gap: 2px;
635
+ }
636
+
637
+ .more {
638
+ flex-shrink: 0;
639
+ height: 18px;
640
+ font-size: 0.75rem;
641
+ cursor: pointer;
642
+ color: var( --planner-more-color );
643
+ }
644
+ }
645
+
646
+ // a line of 18px, its gap of 2px: MONTH_LINE in planner.ts; positioned, for its tint
647
+ .event {
648
+ position: relative;
649
+ flex-shrink: 0;
650
+ display: flex;
651
+ align-items: center;
652
+ gap: 4px;
653
+ height: 18px;
654
+ padding: 0 4px;
655
+ font-size: 0.75rem;
656
+
657
+ .time {
658
+ flex-shrink: 0;
659
+ }
660
+
661
+ .head {
662
+ flex: 1;
663
+ }
664
+
665
+ // the ghost, under the pointer
666
+ &.dragging {
667
+ position: absolute;
668
+ }
669
+ }
670
+ }
671
+
672
+ &.month {
673
+ > .head,
674
+ > .band,
675
+ > .body {
676
+ display: none;
677
+ }
678
+ }
679
+
680
+ // no sub grid: the lines of the hours alone
681
+ &.nosubgrid .grid .step {
682
+ display: none;
683
+ }
684
+
685
+ &:not( .month ) > .month {
686
+ display: none;
687
+ }
688
+ }