vis-rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.gitmodules +3 -0
  4. data/.project +11 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +202 -0
  7. data/README.md +29 -0
  8. data/Rakefile +1 -0
  9. data/lib/vis/rails/engine.rb +6 -0
  10. data/lib/vis/rails/version.rb +5 -0
  11. data/lib/vis/rails.rb +7 -0
  12. data/vendor/assets/javascripts/vis.js +1 -0
  13. data/vendor/assets/stylesheets/vis.css +3 -0
  14. data/vendor/assets/vis/DataSet.js +936 -0
  15. data/vendor/assets/vis/DataView.js +281 -0
  16. data/vendor/assets/vis/EventBus.js +89 -0
  17. data/vendor/assets/vis/events.js +116 -0
  18. data/vendor/assets/vis/graph/ClusterMixin.js +1019 -0
  19. data/vendor/assets/vis/graph/Edge.js +620 -0
  20. data/vendor/assets/vis/graph/Graph.js +2111 -0
  21. data/vendor/assets/vis/graph/Groups.js +80 -0
  22. data/vendor/assets/vis/graph/Images.js +41 -0
  23. data/vendor/assets/vis/graph/NavigationMixin.js +245 -0
  24. data/vendor/assets/vis/graph/Node.js +978 -0
  25. data/vendor/assets/vis/graph/Popup.js +105 -0
  26. data/vendor/assets/vis/graph/SectorsMixin.js +547 -0
  27. data/vendor/assets/vis/graph/SelectionMixin.js +515 -0
  28. data/vendor/assets/vis/graph/dotparser.js +829 -0
  29. data/vendor/assets/vis/graph/img/downarrow.png +0 -0
  30. data/vendor/assets/vis/graph/img/leftarrow.png +0 -0
  31. data/vendor/assets/vis/graph/img/minus.png +0 -0
  32. data/vendor/assets/vis/graph/img/plus.png +0 -0
  33. data/vendor/assets/vis/graph/img/rightarrow.png +0 -0
  34. data/vendor/assets/vis/graph/img/uparrow.png +0 -0
  35. data/vendor/assets/vis/graph/img/zoomExtends.png +0 -0
  36. data/vendor/assets/vis/graph/shapes.js +225 -0
  37. data/vendor/assets/vis/module/exports.js +68 -0
  38. data/vendor/assets/vis/module/header.js +24 -0
  39. data/vendor/assets/vis/module/imports.js +32 -0
  40. data/vendor/assets/vis/shim.js +252 -0
  41. data/vendor/assets/vis/timeline/Controller.js +172 -0
  42. data/vendor/assets/vis/timeline/Range.js +553 -0
  43. data/vendor/assets/vis/timeline/Stack.js +192 -0
  44. data/vendor/assets/vis/timeline/TimeStep.js +449 -0
  45. data/vendor/assets/vis/timeline/Timeline.js +476 -0
  46. data/vendor/assets/vis/timeline/component/Component.js +148 -0
  47. data/vendor/assets/vis/timeline/component/ContentPanel.js +113 -0
  48. data/vendor/assets/vis/timeline/component/CurrentTime.js +101 -0
  49. data/vendor/assets/vis/timeline/component/CustomTime.js +255 -0
  50. data/vendor/assets/vis/timeline/component/Group.js +129 -0
  51. data/vendor/assets/vis/timeline/component/GroupSet.js +546 -0
  52. data/vendor/assets/vis/timeline/component/ItemSet.js +612 -0
  53. data/vendor/assets/vis/timeline/component/Panel.js +112 -0
  54. data/vendor/assets/vis/timeline/component/RootPanel.js +215 -0
  55. data/vendor/assets/vis/timeline/component/TimeAxis.js +522 -0
  56. data/vendor/assets/vis/timeline/component/css/currenttime.css +5 -0
  57. data/vendor/assets/vis/timeline/component/css/customtime.css +6 -0
  58. data/vendor/assets/vis/timeline/component/css/groupset.css +59 -0
  59. data/vendor/assets/vis/timeline/component/css/item.css +93 -0
  60. data/vendor/assets/vis/timeline/component/css/itemset.css +17 -0
  61. data/vendor/assets/vis/timeline/component/css/panel.css +14 -0
  62. data/vendor/assets/vis/timeline/component/css/timeaxis.css +41 -0
  63. data/vendor/assets/vis/timeline/component/css/timeline.css +2 -0
  64. data/vendor/assets/vis/timeline/component/item/Item.js +81 -0
  65. data/vendor/assets/vis/timeline/component/item/ItemBox.js +302 -0
  66. data/vendor/assets/vis/timeline/component/item/ItemPoint.js +237 -0
  67. data/vendor/assets/vis/timeline/component/item/ItemRange.js +251 -0
  68. data/vendor/assets/vis/timeline/component/item/ItemRangeOverflow.js +91 -0
  69. data/vendor/assets/vis/util.js +673 -0
  70. data/vis-rails.gemspec +47 -0
  71. metadata +142 -0
@@ -0,0 +1,522 @@
1
+ /**
2
+ * A horizontal time axis
3
+ * @param {Component} parent
4
+ * @param {Component[]} [depends] Components on which this components depends
5
+ * (except for the parent)
6
+ * @param {Object} [options] See TimeAxis.setOptions for the available
7
+ * options.
8
+ * @constructor TimeAxis
9
+ * @extends Component
10
+ */
11
+ function TimeAxis (parent, depends, options) {
12
+ this.id = util.randomUUID();
13
+ this.parent = parent;
14
+ this.depends = depends;
15
+
16
+ this.dom = {
17
+ majorLines: [],
18
+ majorTexts: [],
19
+ minorLines: [],
20
+ minorTexts: [],
21
+ redundant: {
22
+ majorLines: [],
23
+ majorTexts: [],
24
+ minorLines: [],
25
+ minorTexts: []
26
+ }
27
+ };
28
+ this.props = {
29
+ range: {
30
+ start: 0,
31
+ end: 0,
32
+ minimumStep: 0
33
+ },
34
+ lineTop: 0
35
+ };
36
+
37
+ this.options = options || {};
38
+ this.defaultOptions = {
39
+ orientation: 'bottom', // supported: 'top', 'bottom'
40
+ // TODO: implement timeaxis orientations 'left' and 'right'
41
+ showMinorLabels: true,
42
+ showMajorLabels: true
43
+ };
44
+
45
+ this.conversion = null;
46
+ this.range = null;
47
+ }
48
+
49
+ TimeAxis.prototype = new Component();
50
+
51
+ // TODO: comment options
52
+ TimeAxis.prototype.setOptions = Component.prototype.setOptions;
53
+
54
+ /**
55
+ * Set a range (start and end)
56
+ * @param {Range | Object} range A Range or an object containing start and end.
57
+ */
58
+ TimeAxis.prototype.setRange = function (range) {
59
+ if (!(range instanceof Range) && (!range || !range.start || !range.end)) {
60
+ throw new TypeError('Range must be an instance of Range, ' +
61
+ 'or an object containing start and end.');
62
+ }
63
+ this.range = range;
64
+ };
65
+
66
+ /**
67
+ * Convert a position on screen (pixels) to a datetime
68
+ * @param {int} x Position on the screen in pixels
69
+ * @return {Date} time The datetime the corresponds with given position x
70
+ */
71
+ TimeAxis.prototype.toTime = function(x) {
72
+ var conversion = this.conversion;
73
+ return new Date(x / conversion.scale + conversion.offset);
74
+ };
75
+
76
+ /**
77
+ * Convert a datetime (Date object) into a position on the screen
78
+ * @param {Date} time A date
79
+ * @return {int} x The position on the screen in pixels which corresponds
80
+ * with the given date.
81
+ * @private
82
+ */
83
+ TimeAxis.prototype.toScreen = function(time) {
84
+ var conversion = this.conversion;
85
+ return (time.valueOf() - conversion.offset) * conversion.scale;
86
+ };
87
+
88
+ /**
89
+ * Repaint the component
90
+ * @return {Boolean} changed
91
+ */
92
+ TimeAxis.prototype.repaint = function () {
93
+ var changed = 0,
94
+ update = util.updateProperty,
95
+ asSize = util.option.asSize,
96
+ options = this.options,
97
+ orientation = this.getOption('orientation'),
98
+ props = this.props,
99
+ step = this.step;
100
+
101
+ var frame = this.frame;
102
+ if (!frame) {
103
+ frame = document.createElement('div');
104
+ this.frame = frame;
105
+ changed += 1;
106
+ }
107
+ frame.className = 'axis';
108
+ // TODO: custom className?
109
+
110
+ if (!frame.parentNode) {
111
+ if (!this.parent) {
112
+ throw new Error('Cannot repaint time axis: no parent attached');
113
+ }
114
+ var parentContainer = this.parent.getContainer();
115
+ if (!parentContainer) {
116
+ throw new Error('Cannot repaint time axis: parent has no container element');
117
+ }
118
+ parentContainer.appendChild(frame);
119
+
120
+ changed += 1;
121
+ }
122
+
123
+ var parent = frame.parentNode;
124
+ if (parent) {
125
+ var beforeChild = frame.nextSibling;
126
+ parent.removeChild(frame); // take frame offline while updating (is almost twice as fast)
127
+
128
+ var defaultTop = (orientation == 'bottom' && this.props.parentHeight && this.height) ?
129
+ (this.props.parentHeight - this.height) + 'px' :
130
+ '0px';
131
+ changed += update(frame.style, 'top', asSize(options.top, defaultTop));
132
+ changed += update(frame.style, 'left', asSize(options.left, '0px'));
133
+ changed += update(frame.style, 'width', asSize(options.width, '100%'));
134
+ changed += update(frame.style, 'height', asSize(options.height, this.height + 'px'));
135
+
136
+ // get characters width and height
137
+ this._repaintMeasureChars();
138
+
139
+ if (this.step) {
140
+ this._repaintStart();
141
+
142
+ step.first();
143
+ var xFirstMajorLabel = undefined;
144
+ var max = 0;
145
+ while (step.hasNext() && max < 1000) {
146
+ max++;
147
+ var cur = step.getCurrent(),
148
+ x = this.toScreen(cur),
149
+ isMajor = step.isMajor();
150
+
151
+ // TODO: lines must have a width, such that we can create css backgrounds
152
+
153
+ if (this.getOption('showMinorLabels')) {
154
+ this._repaintMinorText(x, step.getLabelMinor());
155
+ }
156
+
157
+ if (isMajor && this.getOption('showMajorLabels')) {
158
+ if (x > 0) {
159
+ if (xFirstMajorLabel == undefined) {
160
+ xFirstMajorLabel = x;
161
+ }
162
+ this._repaintMajorText(x, step.getLabelMajor());
163
+ }
164
+ this._repaintMajorLine(x);
165
+ }
166
+ else {
167
+ this._repaintMinorLine(x);
168
+ }
169
+
170
+ step.next();
171
+ }
172
+
173
+ // create a major label on the left when needed
174
+ if (this.getOption('showMajorLabels')) {
175
+ var leftTime = this.toTime(0),
176
+ leftText = step.getLabelMajor(leftTime),
177
+ widthText = leftText.length * (props.majorCharWidth || 10) + 10; // upper bound estimation
178
+
179
+ if (xFirstMajorLabel == undefined || widthText < xFirstMajorLabel) {
180
+ this._repaintMajorText(0, leftText);
181
+ }
182
+ }
183
+
184
+ this._repaintEnd();
185
+ }
186
+
187
+ this._repaintLine();
188
+
189
+ // put frame online again
190
+ if (beforeChild) {
191
+ parent.insertBefore(frame, beforeChild);
192
+ }
193
+ else {
194
+ parent.appendChild(frame)
195
+ }
196
+ }
197
+
198
+ return (changed > 0);
199
+ };
200
+
201
+ /**
202
+ * Start a repaint. Move all DOM elements to a redundant list, where they
203
+ * can be picked for re-use, or can be cleaned up in the end
204
+ * @private
205
+ */
206
+ TimeAxis.prototype._repaintStart = function () {
207
+ var dom = this.dom,
208
+ redundant = dom.redundant;
209
+
210
+ redundant.majorLines = dom.majorLines;
211
+ redundant.majorTexts = dom.majorTexts;
212
+ redundant.minorLines = dom.minorLines;
213
+ redundant.minorTexts = dom.minorTexts;
214
+
215
+ dom.majorLines = [];
216
+ dom.majorTexts = [];
217
+ dom.minorLines = [];
218
+ dom.minorTexts = [];
219
+ };
220
+
221
+ /**
222
+ * End a repaint. Cleanup leftover DOM elements in the redundant list
223
+ * @private
224
+ */
225
+ TimeAxis.prototype._repaintEnd = function () {
226
+ util.forEach(this.dom.redundant, function (arr) {
227
+ while (arr.length) {
228
+ var elem = arr.pop();
229
+ if (elem && elem.parentNode) {
230
+ elem.parentNode.removeChild(elem);
231
+ }
232
+ }
233
+ });
234
+ };
235
+
236
+
237
+ /**
238
+ * Create a minor label for the axis at position x
239
+ * @param {Number} x
240
+ * @param {String} text
241
+ * @private
242
+ */
243
+ TimeAxis.prototype._repaintMinorText = function (x, text) {
244
+ // reuse redundant label
245
+ var label = this.dom.redundant.minorTexts.shift();
246
+
247
+ if (!label) {
248
+ // create new label
249
+ var content = document.createTextNode('');
250
+ label = document.createElement('div');
251
+ label.appendChild(content);
252
+ label.className = 'text minor';
253
+ this.frame.appendChild(label);
254
+ }
255
+ this.dom.minorTexts.push(label);
256
+
257
+ label.childNodes[0].nodeValue = text;
258
+ label.style.left = x + 'px';
259
+ label.style.top = this.props.minorLabelTop + 'px';
260
+ //label.title = title; // TODO: this is a heavy operation
261
+ };
262
+
263
+ /**
264
+ * Create a Major label for the axis at position x
265
+ * @param {Number} x
266
+ * @param {String} text
267
+ * @private
268
+ */
269
+ TimeAxis.prototype._repaintMajorText = function (x, text) {
270
+ // reuse redundant label
271
+ var label = this.dom.redundant.majorTexts.shift();
272
+
273
+ if (!label) {
274
+ // create label
275
+ var content = document.createTextNode(text);
276
+ label = document.createElement('div');
277
+ label.className = 'text major';
278
+ label.appendChild(content);
279
+ this.frame.appendChild(label);
280
+ }
281
+ this.dom.majorTexts.push(label);
282
+
283
+ label.childNodes[0].nodeValue = text;
284
+ label.style.top = this.props.majorLabelTop + 'px';
285
+ label.style.left = x + 'px';
286
+ //label.title = title; // TODO: this is a heavy operation
287
+ };
288
+
289
+ /**
290
+ * Create a minor line for the axis at position x
291
+ * @param {Number} x
292
+ * @private
293
+ */
294
+ TimeAxis.prototype._repaintMinorLine = function (x) {
295
+ // reuse redundant line
296
+ var line = this.dom.redundant.minorLines.shift();
297
+
298
+ if (!line) {
299
+ // create vertical line
300
+ line = document.createElement('div');
301
+ line.className = 'grid vertical minor';
302
+ this.frame.appendChild(line);
303
+ }
304
+ this.dom.minorLines.push(line);
305
+
306
+ var props = this.props;
307
+ line.style.top = props.minorLineTop + 'px';
308
+ line.style.height = props.minorLineHeight + 'px';
309
+ line.style.left = (x - props.minorLineWidth / 2) + 'px';
310
+ };
311
+
312
+ /**
313
+ * Create a Major line for the axis at position x
314
+ * @param {Number} x
315
+ * @private
316
+ */
317
+ TimeAxis.prototype._repaintMajorLine = function (x) {
318
+ // reuse redundant line
319
+ var line = this.dom.redundant.majorLines.shift();
320
+
321
+ if (!line) {
322
+ // create vertical line
323
+ line = document.createElement('DIV');
324
+ line.className = 'grid vertical major';
325
+ this.frame.appendChild(line);
326
+ }
327
+ this.dom.majorLines.push(line);
328
+
329
+ var props = this.props;
330
+ line.style.top = props.majorLineTop + 'px';
331
+ line.style.left = (x - props.majorLineWidth / 2) + 'px';
332
+ line.style.height = props.majorLineHeight + 'px';
333
+ };
334
+
335
+
336
+ /**
337
+ * Repaint the horizontal line for the axis
338
+ * @private
339
+ */
340
+ TimeAxis.prototype._repaintLine = function() {
341
+ var line = this.dom.line,
342
+ frame = this.frame,
343
+ options = this.options;
344
+
345
+ // line before all axis elements
346
+ if (this.getOption('showMinorLabels') || this.getOption('showMajorLabels')) {
347
+ if (line) {
348
+ // put this line at the end of all childs
349
+ frame.removeChild(line);
350
+ frame.appendChild(line);
351
+ }
352
+ else {
353
+ // create the axis line
354
+ line = document.createElement('div');
355
+ line.className = 'grid horizontal major';
356
+ frame.appendChild(line);
357
+ this.dom.line = line;
358
+ }
359
+
360
+ line.style.top = this.props.lineTop + 'px';
361
+ }
362
+ else {
363
+ if (line && line.parentElement) {
364
+ frame.removeChild(line.line);
365
+ delete this.dom.line;
366
+ }
367
+ }
368
+ };
369
+
370
+ /**
371
+ * Create characters used to determine the size of text on the axis
372
+ * @private
373
+ */
374
+ TimeAxis.prototype._repaintMeasureChars = function () {
375
+ // calculate the width and height of a single character
376
+ // this is used to calculate the step size, and also the positioning of the
377
+ // axis
378
+ var dom = this.dom,
379
+ text;
380
+
381
+ if (!dom.measureCharMinor) {
382
+ text = document.createTextNode('0');
383
+ var measureCharMinor = document.createElement('DIV');
384
+ measureCharMinor.className = 'text minor measure';
385
+ measureCharMinor.appendChild(text);
386
+ this.frame.appendChild(measureCharMinor);
387
+
388
+ dom.measureCharMinor = measureCharMinor;
389
+ }
390
+
391
+ if (!dom.measureCharMajor) {
392
+ text = document.createTextNode('0');
393
+ var measureCharMajor = document.createElement('DIV');
394
+ measureCharMajor.className = 'text major measure';
395
+ measureCharMajor.appendChild(text);
396
+ this.frame.appendChild(measureCharMajor);
397
+
398
+ dom.measureCharMajor = measureCharMajor;
399
+ }
400
+ };
401
+
402
+ /**
403
+ * Reflow the component
404
+ * @return {Boolean} resized
405
+ */
406
+ TimeAxis.prototype.reflow = function () {
407
+ var changed = 0,
408
+ update = util.updateProperty,
409
+ frame = this.frame,
410
+ range = this.range;
411
+
412
+ if (!range) {
413
+ throw new Error('Cannot repaint time axis: no range configured');
414
+ }
415
+
416
+ if (frame) {
417
+ changed += update(this, 'top', frame.offsetTop);
418
+ changed += update(this, 'left', frame.offsetLeft);
419
+
420
+ // calculate size of a character
421
+ var props = this.props,
422
+ showMinorLabels = this.getOption('showMinorLabels'),
423
+ showMajorLabels = this.getOption('showMajorLabels'),
424
+ measureCharMinor = this.dom.measureCharMinor,
425
+ measureCharMajor = this.dom.measureCharMajor;
426
+ if (measureCharMinor) {
427
+ props.minorCharHeight = measureCharMinor.clientHeight;
428
+ props.minorCharWidth = measureCharMinor.clientWidth;
429
+ }
430
+ if (measureCharMajor) {
431
+ props.majorCharHeight = measureCharMajor.clientHeight;
432
+ props.majorCharWidth = measureCharMajor.clientWidth;
433
+ }
434
+
435
+ var parentHeight = frame.parentNode ? frame.parentNode.offsetHeight : 0;
436
+ if (parentHeight != props.parentHeight) {
437
+ props.parentHeight = parentHeight;
438
+ changed += 1;
439
+ }
440
+ switch (this.getOption('orientation')) {
441
+ case 'bottom':
442
+ props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0;
443
+ props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0;
444
+
445
+ props.minorLabelTop = 0;
446
+ props.majorLabelTop = props.minorLabelTop + props.minorLabelHeight;
447
+
448
+ props.minorLineTop = -this.top;
449
+ props.minorLineHeight = Math.max(this.top + props.majorLabelHeight, 0);
450
+ props.minorLineWidth = 1; // TODO: really calculate width
451
+
452
+ props.majorLineTop = -this.top;
453
+ props.majorLineHeight = Math.max(this.top + props.minorLabelHeight + props.majorLabelHeight, 0);
454
+ props.majorLineWidth = 1; // TODO: really calculate width
455
+
456
+ props.lineTop = 0;
457
+
458
+ break;
459
+
460
+ case 'top':
461
+ props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0;
462
+ props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0;
463
+
464
+ props.majorLabelTop = 0;
465
+ props.minorLabelTop = props.majorLabelTop + props.majorLabelHeight;
466
+
467
+ props.minorLineTop = props.minorLabelTop;
468
+ props.minorLineHeight = Math.max(parentHeight - props.majorLabelHeight - this.top);
469
+ props.minorLineWidth = 1; // TODO: really calculate width
470
+
471
+ props.majorLineTop = 0;
472
+ props.majorLineHeight = Math.max(parentHeight - this.top);
473
+ props.majorLineWidth = 1; // TODO: really calculate width
474
+
475
+ props.lineTop = props.majorLabelHeight + props.minorLabelHeight;
476
+
477
+ break;
478
+
479
+ default:
480
+ throw new Error('Unkown orientation "' + this.getOption('orientation') + '"');
481
+ }
482
+
483
+ var height = props.minorLabelHeight + props.majorLabelHeight;
484
+ changed += update(this, 'width', frame.offsetWidth);
485
+ changed += update(this, 'height', height);
486
+
487
+ // calculate range and step
488
+ this._updateConversion();
489
+
490
+ var start = util.convert(range.start, 'Number'),
491
+ end = util.convert(range.end, 'Number'),
492
+ minimumStep = this.toTime((props.minorCharWidth || 10) * 5).valueOf()
493
+ -this.toTime(0).valueOf();
494
+ this.step = new TimeStep(new Date(start), new Date(end), minimumStep);
495
+ changed += update(props.range, 'start', start);
496
+ changed += update(props.range, 'end', end);
497
+ changed += update(props.range, 'minimumStep', minimumStep.valueOf());
498
+ }
499
+
500
+ return (changed > 0);
501
+ };
502
+
503
+ /**
504
+ * Calculate the scale and offset to convert a position on screen to the
505
+ * corresponding date and vice versa.
506
+ * After the method _updateConversion is executed once, the methods toTime
507
+ * and toScreen can be used.
508
+ * @private
509
+ */
510
+ TimeAxis.prototype._updateConversion = function() {
511
+ var range = this.range;
512
+ if (!range) {
513
+ throw new Error('No range configured');
514
+ }
515
+
516
+ if (range.conversion) {
517
+ this.conversion = range.conversion(this.width);
518
+ }
519
+ else {
520
+ this.conversion = Range.conversion(range.start, range.end, this.width);
521
+ }
522
+ };
@@ -0,0 +1,5 @@
1
+ .vis.timeline .currenttime {
2
+ background-color: #FF7F6E;
3
+ width: 2px;
4
+ z-index: 9;
5
+ }
@@ -0,0 +1,6 @@
1
+ .vis.timeline .customtime {
2
+ background-color: #6E94FF;
3
+ width: 2px;
4
+ cursor: move;
5
+ z-index: 9;
6
+ }
@@ -0,0 +1,59 @@
1
+
2
+ .vis.timeline .groupset {
3
+ position: absolute;
4
+ padding: 0;
5
+ margin: 0;
6
+ }
7
+
8
+ .vis.timeline .labels {
9
+ position: absolute;
10
+ top: 0;
11
+ left: 0;
12
+ width: 100%;
13
+ height: 100%;
14
+
15
+ padding: 0;
16
+ margin: 0;
17
+
18
+ border-right: 1px solid #bfbfbf;
19
+ box-sizing: border-box;
20
+ -moz-box-sizing: border-box;
21
+ }
22
+
23
+ .vis.timeline .labels .label-set {
24
+ position: absolute;
25
+ top: 0;
26
+ left: 0;
27
+ width: 100%;
28
+ height: 100%;
29
+
30
+ overflow: hidden;
31
+
32
+ border-top: none;
33
+ border-bottom: 1px solid #bfbfbf;
34
+ }
35
+
36
+ .vis.timeline .labels .label-set .label {
37
+ position: absolute;
38
+ left: 0;
39
+ top: 0;
40
+ width: 100%;
41
+ color: #4d4d4d;
42
+ }
43
+
44
+ .vis.timeline.top .labels .label-set .label,
45
+ .vis.timeline.top .groupset .itemset-axis {
46
+ border-top: 1px solid #bfbfbf;
47
+ border-bottom: none;
48
+ }
49
+
50
+ .vis.timeline.bottom .labels .label-set .label,
51
+ .vis.timeline.bottom .groupset .itemset-axis {
52
+ border-top: none;
53
+ border-bottom: 1px solid #bfbfbf;
54
+ }
55
+
56
+ .vis.timeline .labels .label-set .label .inner {
57
+ display: inline-block;
58
+ padding: 5px;
59
+ }
@@ -0,0 +1,93 @@
1
+
2
+ .vis.timeline .item {
3
+ position: absolute;
4
+ color: #1A1A1A;
5
+ border-color: #97B0F8;
6
+ background-color: #D5DDF6;
7
+ display: inline-block;
8
+ }
9
+
10
+ .vis.timeline .item.selected {
11
+ border-color: #FFC200;
12
+ background-color: #FFF785;
13
+ z-index: 999;
14
+ }
15
+
16
+ .vis.timeline .item.point.selected {
17
+ background-color: #FFF785;
18
+ z-index: 999;
19
+ }
20
+ .vis.timeline .item.point.selected .dot {
21
+ border-color: #FFC200;
22
+ }
23
+
24
+ .vis.timeline .item.cluster {
25
+ /* TODO: use another color or pattern? */
26
+ background: #97B0F8 url('img/cluster_bg.png');
27
+ color: white;
28
+ }
29
+ .vis.timeline .item.cluster.point {
30
+ border-color: #D5DDF6;
31
+ }
32
+
33
+ .vis.timeline .item.box {
34
+ text-align: center;
35
+ border-style: solid;
36
+ border-width: 1px;
37
+ border-radius: 5px;
38
+ -moz-border-radius: 5px; /* For Firefox 3.6 and older */
39
+ }
40
+
41
+ .vis.timeline .item.point {
42
+ background: none;
43
+ }
44
+
45
+ .vis.timeline .dot {
46
+ border: 5px solid #97B0F8;
47
+ position: absolute;
48
+ border-radius: 5px;
49
+ -moz-border-radius: 5px; /* For Firefox 3.6 and older */
50
+ }
51
+
52
+ .vis.timeline .item.range {
53
+ overflow: hidden;
54
+ border-style: solid;
55
+ border-width: 1px;
56
+ border-radius: 2px;
57
+ -moz-border-radius: 2px; /* For Firefox 3.6 and older */
58
+ }
59
+
60
+ .vis.timeline .item.rangeoverflow {
61
+ border-style: solid;
62
+ border-width: 1px;
63
+ border-radius: 2px;
64
+ -moz-border-radius: 2px; /* For Firefox 3.6 and older */
65
+ }
66
+
67
+ .vis.timeline .item.range .drag-left, .vis.timeline .item.rangeoverflow .drag-left {
68
+ cursor: w-resize;
69
+ z-index: 1000;
70
+ }
71
+
72
+ .vis.timeline .item.range .drag-right, .vis.timeline .item.rangeoverflow .drag-right {
73
+ cursor: e-resize;
74
+ z-index: 1000;
75
+ }
76
+
77
+ .vis.timeline .item.range .content, .vis.timeline .item.rangeoverflow .content {
78
+ position: relative;
79
+ display: inline-block;
80
+ }
81
+
82
+ .vis.timeline .item.line {
83
+ position: absolute;
84
+ width: 0;
85
+ border-left-width: 1px;
86
+ border-left-style: solid;
87
+ }
88
+
89
+ .vis.timeline .item .content {
90
+ margin: 5px;
91
+ white-space: nowrap;
92
+ overflow: hidden;
93
+ }
@@ -0,0 +1,17 @@
1
+
2
+ .vis.timeline .itemset {
3
+ position: absolute;
4
+ padding: 0;
5
+ margin: 0;
6
+ overflow: hidden;
7
+ }
8
+
9
+ .vis.timeline .background {
10
+ }
11
+
12
+ .vis.timeline .foreground {
13
+ }
14
+
15
+ .vis.timeline .itemset-axis {
16
+ position: absolute;
17
+ }