liquid_cms 0.2.0.11 → 0.2.0.12

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 (60) hide show
  1. data/CHANGELOG.rdoc +7 -0
  2. data/TODO.rdoc +1 -1
  3. data/app/controllers/cms/main_controller.rb +3 -2
  4. data/app/helpers/cms/common_helper.rb +9 -2
  5. data/app/helpers/cms/components_helper.rb +10 -4
  6. data/app/models/cms/component.rb +4 -0
  7. data/app/views/cms/assets/_list.html.erb +4 -4
  8. data/app/views/cms/components/_list.html.erb +5 -1
  9. data/app/views/cms/pages/_list.html.erb +4 -4
  10. data/app/views/cms/shared/_sidebar.html.erb +32 -8
  11. data/app/views/layouts/cms.html.erb +5 -2
  12. data/generators/liquid_cms/templates/config/locales/cms/en.yml +3 -2
  13. data/generators/liquid_cms/templates/public/cms/codemirror/LICENSE +0 -0
  14. data/generators/liquid_cms/templates/public/cms/codemirror/css/csscolors.css +0 -0
  15. data/generators/liquid_cms/templates/public/cms/codemirror/css/docs.css +17 -3
  16. data/generators/liquid_cms/templates/public/cms/codemirror/css/font.js +15 -0
  17. data/generators/liquid_cms/templates/public/cms/codemirror/css/jscolors.css +0 -0
  18. data/generators/liquid_cms/templates/public/cms/codemirror/css/sparqlcolors.css +0 -0
  19. data/generators/liquid_cms/templates/public/cms/codemirror/css/xmlcolors.css +0 -0
  20. data/generators/liquid_cms/templates/public/cms/codemirror/js/codemirror.js +59 -26
  21. data/generators/liquid_cms/templates/public/cms/codemirror/js/editor.js +149 -71
  22. data/generators/liquid_cms/templates/public/cms/codemirror/js/highlight.js +2 -2
  23. data/generators/liquid_cms/templates/public/cms/codemirror/js/mirrorframe.js +2 -2
  24. data/generators/liquid_cms/templates/public/cms/codemirror/js/parsecss.js +5 -3
  25. data/generators/liquid_cms/templates/public/cms/codemirror/js/parsedummy.js +0 -0
  26. data/generators/liquid_cms/templates/public/cms/codemirror/js/parsehtmlmixed.js +28 -9
  27. data/generators/liquid_cms/templates/public/cms/codemirror/js/parsejavascript.js +0 -0
  28. data/generators/liquid_cms/templates/public/cms/codemirror/js/parsesparql.js +0 -0
  29. data/generators/liquid_cms/templates/public/cms/codemirror/js/parsexml.js +6 -1
  30. data/generators/liquid_cms/templates/public/cms/codemirror/js/select.js +48 -21
  31. data/generators/liquid_cms/templates/public/cms/codemirror/js/stringstream.js +15 -1
  32. data/generators/liquid_cms/templates/public/cms/codemirror/js/tokenize.js +0 -0
  33. data/generators/liquid_cms/templates/public/cms/codemirror/js/tokenizejavascript.js +1 -1
  34. data/generators/liquid_cms/templates/public/cms/codemirror/js/undo.js +17 -14
  35. data/generators/liquid_cms/templates/public/cms/codemirror/js/unittests.js +44 -0
  36. data/generators/liquid_cms/templates/public/cms/codemirror/js/util.js +6 -3
  37. data/generators/liquid_cms/templates/public/cms/javascripts/cms.js +15 -1
  38. data/generators/liquid_cms/templates/public/cms/javascripts/livepipe.js +181 -0
  39. data/generators/liquid_cms/templates/public/cms/javascripts/tabs.js +149 -0
  40. data/generators/liquid_cms/templates/public/cms/stylesheets/ie9.css +4 -0
  41. data/generators/liquid_cms/templates/public/cms/stylesheets/sidebar.css +132 -0
  42. data/generators/liquid_cms/templates/public/cms/stylesheets/styles.css +1 -74
  43. data/generators/liquid_cms/templates/public/cms/stylesheets/themes/dark.css +2 -1
  44. data/lib/liquid_cms/context.rb +4 -0
  45. data/lib/liquid_cms/version.rb +1 -1
  46. data/liquid_cms.gemspec +1 -1
  47. data/test/functional/assets_controller_test.rb +3 -3
  48. data/test/rails_app/config/locales/cms/en.yml +8 -0
  49. metadata +11 -16
  50. data/generators/liquid_cms/templates/public/cms/codemirror/bigtest.html +0 -1296
  51. data/generators/liquid_cms/templates/public/cms/codemirror/css/people.jpg +0 -0
  52. data/generators/liquid_cms/templates/public/cms/codemirror/csstest.html +0 -60
  53. data/generators/liquid_cms/templates/public/cms/codemirror/highlight.html +0 -82
  54. data/generators/liquid_cms/templates/public/cms/codemirror/htmltest.html +0 -52
  55. data/generators/liquid_cms/templates/public/cms/codemirror/index.html +0 -245
  56. data/generators/liquid_cms/templates/public/cms/codemirror/jstest.html +0 -56
  57. data/generators/liquid_cms/templates/public/cms/codemirror/manual.html +0 -759
  58. data/generators/liquid_cms/templates/public/cms/codemirror/mixedtest.html +0 -52
  59. data/generators/liquid_cms/templates/public/cms/codemirror/sparqltest.html +0 -41
  60. data/generators/liquid_cms/templates/public/cms/codemirror/story.html +0 -671
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Test Harness for CodeMirror
3
+ * JS-unit compatible tests here. The two available assertions are
4
+ * assertEquals (strict equality) and assertEquivalent (looser equivalency).
5
+ *
6
+ * 'editor' is a global object for the CodeMirror editor shared between all
7
+ * tests. After manipulating it in each test, try to restore it to
8
+ * approximately its original state.
9
+ */
10
+
11
+ function testSetGet() {
12
+ var code = 'It was the best of times.\nIt was the worst of times.';
13
+ editor.setCode(code);
14
+ assertEquals(code, editor.getCode());
15
+ editor.setCode('');
16
+ assertEquals('', editor.getCode());
17
+ }
18
+
19
+ function testSetStylesheet() {
20
+ function cssStatus() {
21
+ // Returns a list of tuples, for each CSS link return the filename and
22
+ // whether it is enabled.
23
+ links = editor.win.document.getElementsByTagName('link');
24
+ css = [];
25
+ for (var x = 0, link; link = links[x]; x++) {
26
+ if (link.rel.indexOf("stylesheet") !== -1) {
27
+ css.push([link.href.substring(link.href.lastIndexOf('/') + 1),
28
+ !link.disabled])
29
+ }
30
+ }
31
+ return css;
32
+ }
33
+ assertEquivalent([], cssStatus());
34
+ editor.setStylesheet('css/jscolors.css');
35
+ assertEquivalent([['jscolors.css', true]], cssStatus());
36
+ editor.setStylesheet(['css/csscolors.css', 'css/xmlcolors.css']);
37
+ assertEquivalent([['jscolors.css', false], ['csscolors.css', true], ['xmlcolors.css', true]], cssStatus());
38
+ editor.setStylesheet([]);
39
+ assertEquivalent([['jscolors.css', false], ['csscolors.css', false], ['xmlcolors.css', false]], cssStatus());
40
+ }
41
+
42
+ // Update this list of tests as new ones are added.
43
+ var tests = ['testSetGet', 'testSetStylesheet'];
44
+
@@ -34,12 +34,15 @@ function matcher(regexp){
34
34
  return function(value){return regexp.test(value);};
35
35
  }
36
36
 
37
- // Test whether a DOM node has a certain CSS class. Much faster than
38
- // the MochiKit equivalent, for some reason.
39
- function hasClass(element, className){
37
+ // Test whether a DOM node has a certain CSS class.
38
+ function hasClass(element, className) {
40
39
  var classes = element.className;
41
40
  return classes && new RegExp("(^| )" + className + "($| )").test(classes);
42
41
  }
42
+ function removeClass(element, className) {
43
+ element.className = element.className.replace(new RegExp(" " + className + "\\b", "g"), "");
44
+ return element;
45
+ }
43
46
 
44
47
  // Insert a DOM node after another node.
45
48
  function insertAfter(newNode, oldNode) {
@@ -1,5 +1,19 @@
1
+ // set or delete a cookie value to remember the folders view state
2
+ function set_component_view_state(elem) {
3
+ var key = elem.getAttribute('id');
4
+ var current_folders = jar.get('component_folders') || {};
5
+
6
+ if (elem.next('ul').visible())
7
+ current_folders[key] = true;
8
+ else
9
+ delete current_folders[key];
10
+
11
+ jar.put('component_folders', current_folders);
12
+ }
13
+
1
14
  function toggle_component() {
2
15
  $(this).next('ul').toggle();
16
+ set_component_view_state(this);
3
17
  }
4
18
 
5
19
  function asset_preview_toggle() {
@@ -17,5 +31,5 @@ $(document).observe('dom:loaded', function() {
17
31
  });
18
32
  });
19
33
 
20
- var cookie_expiry = 60 * 60 * 24 * 30; // 1 month
34
+ var cookie_expiry = 60 * 60 * 24 * 30 * 3; // 3 months
21
35
  var jar = new CookieJar({expires:cookie_expiry, path:'/cms'});
@@ -0,0 +1,181 @@
1
+ /**
2
+ * @author Ryan Johnson <http://syntacticx.com/>
3
+ * @copyright 2008 PersonalGrid Corporation <http://personalgrid.com/>
4
+ * @package LivePipe UI
5
+ * @license MIT
6
+ * @url http://livepipe.net/core
7
+ * @require prototype.js
8
+ */
9
+
10
+ if(typeof(Control) == 'undefined')
11
+ Control = {};
12
+
13
+ var $proc = function(proc){
14
+ return typeof(proc) == 'function' ? proc : function(){return proc};
15
+ };
16
+
17
+ var $value = function(value){
18
+ return typeof(value) == 'function' ? value() : value;
19
+ };
20
+
21
+ Object.Event = {
22
+ extend: function(object){
23
+ object._objectEventSetup = function(event_name){
24
+ this._observers = this._observers || {};
25
+ this._observers[event_name] = this._observers[event_name] || [];
26
+ };
27
+ object.observe = function(event_name,observer){
28
+ if(typeof(event_name) == 'string' && typeof(observer) != 'undefined'){
29
+ this._objectEventSetup(event_name);
30
+ if(!this._observers[event_name].include(observer))
31
+ this._observers[event_name].push(observer);
32
+ }else
33
+ for(var e in event_name)
34
+ this.observe(e,event_name[e]);
35
+ };
36
+ object.stopObserving = function(event_name,observer){
37
+ this._objectEventSetup(event_name);
38
+ if(event_name && observer)
39
+ this._observers[event_name] = this._observers[event_name].without(observer);
40
+ else if(event_name)
41
+ this._observers[event_name] = [];
42
+ else
43
+ this._observers = {};
44
+ };
45
+ object.observeOnce = function(event_name,outer_observer){
46
+ var inner_observer = function(){
47
+ outer_observer.apply(this,arguments);
48
+ this.stopObserving(event_name,inner_observer);
49
+ }.bind(this);
50
+ this._objectEventSetup(event_name);
51
+ this._observers[event_name].push(inner_observer);
52
+ };
53
+ object.notify = function(event_name){
54
+ this._objectEventSetup(event_name);
55
+ var collected_return_values = [];
56
+ var args = $A(arguments).slice(1);
57
+ try{
58
+ for(var i = 0; i < this._observers[event_name].length; ++i)
59
+ collected_return_values.push(this._observers[event_name][i].apply(this._observers[event_name][i],args) || null);
60
+ }catch(e){
61
+ if(e == $break)
62
+ return false;
63
+ else
64
+ throw e;
65
+ }
66
+ return collected_return_values;
67
+ };
68
+ if(object.prototype){
69
+ object.prototype._objectEventSetup = object._objectEventSetup;
70
+ object.prototype.observe = object.observe;
71
+ object.prototype.stopObserving = object.stopObserving;
72
+ object.prototype.observeOnce = object.observeOnce;
73
+ object.prototype.notify = function(event_name){
74
+ if(object.notify){
75
+ var args = $A(arguments).slice(1);
76
+ args.unshift(this);
77
+ args.unshift(event_name);
78
+ object.notify.apply(object,args);
79
+ }
80
+ this._objectEventSetup(event_name);
81
+ var args = $A(arguments).slice(1);
82
+ var collected_return_values = [];
83
+ try{
84
+ if(this.options && this.options[event_name] && typeof(this.options[event_name]) == 'function')
85
+ collected_return_values.push(this.options[event_name].apply(this,args) || null);
86
+ var callbacks_copy = this._observers[event_name]; // since original array will be modified after observeOnce calls
87
+ for(var i = 0; i < callbacks_copy.length; ++i)
88
+ collected_return_values.push(callbacks_copy[i].apply(callbacks_copy[i],args) || null);
89
+ }catch(e){
90
+ if(e == $break)
91
+ return false;
92
+ else
93
+ throw e;
94
+ }
95
+ return collected_return_values;
96
+ };
97
+ }
98
+ }
99
+ };
100
+
101
+ /* Begin Core Extensions */
102
+
103
+ //Element.observeOnce
104
+ Element.addMethods({
105
+ observeOnce: function(element,event_name,outer_callback){
106
+ var inner_callback = function(){
107
+ outer_callback.apply(this,arguments);
108
+ Element.stopObserving(element,event_name,inner_callback);
109
+ };
110
+ Element.observe(element,event_name,inner_callback);
111
+ }
112
+ });
113
+
114
+ //mouse:wheel
115
+ (function(){
116
+ function wheel(event){
117
+ var delta, element, custom_event;
118
+ // normalize the delta
119
+ if (event.wheelDelta) { // IE & Opera
120
+ delta = event.wheelDelta / 120;
121
+ } else if (event.detail) { // W3C
122
+ delta =- event.detail / 3;
123
+ }
124
+ if (!delta) { return; }
125
+ element = Event.extend(event).target;
126
+ element = Element.extend(element.nodeType === Node.TEXT_NODE ? element.parentNode : element);
127
+ custom_event = element.fire('mouse:wheel',{ delta: delta });
128
+ if (custom_event.stopped) {
129
+ Event.stop(event);
130
+ return false;
131
+ }
132
+ }
133
+ document.observe('mousewheel',wheel);
134
+ document.observe('DOMMouseScroll',wheel);
135
+ })();
136
+
137
+ /* End Core Extensions */
138
+
139
+ //from PrototypeUI
140
+ var IframeShim = Class.create({
141
+ initialize: function() {
142
+ this.element = new Element('iframe',{
143
+ style: 'position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);display:none',
144
+ src: 'javascript:void(0);',
145
+ frameborder: 0
146
+ });
147
+ $(document.body).insert(this.element);
148
+ },
149
+ hide: function() {
150
+ this.element.hide();
151
+ return this;
152
+ },
153
+ show: function() {
154
+ this.element.show();
155
+ return this;
156
+ },
157
+ positionUnder: function(element) {
158
+ var element = $(element);
159
+ var offset = element.cumulativeOffset();
160
+ var dimensions = element.getDimensions();
161
+ this.element.setStyle({
162
+ left: offset[0] + 'px',
163
+ top: offset[1] + 'px',
164
+ width: dimensions.width + 'px',
165
+ height: dimensions.height + 'px',
166
+ zIndex: element.getStyle('zIndex') - 1
167
+ }).show();
168
+ return this;
169
+ },
170
+ setBounds: function(bounds) {
171
+ for(prop in bounds)
172
+ bounds[prop] += 'px';
173
+ this.element.setStyle(bounds);
174
+ return this;
175
+ },
176
+ destroy: function() {
177
+ if(this.element)
178
+ this.element.remove();
179
+ return this;
180
+ }
181
+ });
@@ -0,0 +1,149 @@
1
+ /**
2
+ * @author Ryan Johnson <http://syntacticx.com/>
3
+ * @copyright 2008 PersonalGrid Corporation <http://personalgrid.com/>
4
+ * @package LivePipe UI
5
+ * @license MIT
6
+ * @url http://livepipe.net/control/tabs
7
+ * @require prototype.js, livepipe.js
8
+ */
9
+
10
+ /*global window, document, Prototype, $, $A, $H, $break, Class, Element, Event, Control */
11
+
12
+ if(typeof(Prototype) == "undefined") {
13
+ throw "Control.Tabs requires Prototype to be loaded."; }
14
+ if(typeof(Object.Event) == "undefined") {
15
+ throw "Control.Tabs requires Object.Event to be loaded."; }
16
+
17
+ Control.Tabs = Class.create({
18
+ initialize: function(tab_list_container,options){
19
+ if(!$(tab_list_container)) {
20
+ throw "Control.Tabs could not find the element: " + tab_list_container; }
21
+ this.activeContainer = false;
22
+ this.activeLink = false;
23
+ this.containers = $H({});
24
+ this.links = [];
25
+ Control.Tabs.instances.push(this);
26
+ this.options = {
27
+ beforeChange: Prototype.emptyFunction,
28
+ afterChange: Prototype.emptyFunction,
29
+ hover: false,
30
+ linkSelector: 'li a',
31
+ setClassOnContainer: false,
32
+ activeClassName: 'active',
33
+ defaultTab: 'first',
34
+ autoLinkExternal: true,
35
+ targetRegExp: /#(.+)$/,
36
+ showFunction: Element.show,
37
+ hideFunction: Element.hide
38
+ };
39
+ Object.extend(this.options,options || {});
40
+ (typeof(this.options.linkSelector == 'string') ?
41
+ $(tab_list_container).select(this.options.linkSelector) :
42
+ this.options.linkSelector($(tab_list_container))
43
+ ).findAll(function(link){
44
+ return (/^#/).exec((Prototype.Browser.WebKit ? decodeURIComponent(link.href) : link.href).replace(window.location.href.split('#')[0],''));
45
+ }).each(function(link){
46
+ this.addTab(link);
47
+ }.bind(this));
48
+ this.containers.values().each(Element.hide);
49
+ if(this.options.defaultTab == 'first') {
50
+ this.setActiveTab(this.links.first());
51
+ } else if(this.options.defaultTab == 'last') {
52
+ this.setActiveTab(this.links.last());
53
+ } else {
54
+ this.setActiveTab(this.options.defaultTab); }
55
+ var targets = this.options.targetRegExp.exec(window.location);
56
+ if(targets && targets[1]){
57
+ targets[1].split(',').each(function(target){
58
+ this.setActiveTab(this.links.find(function(link){
59
+ return link.key == target;
60
+ }));
61
+ }.bind(this));
62
+ }
63
+ if(this.options.autoLinkExternal){
64
+ $A(document.getElementsByTagName('a')).each(function(a){
65
+ if(!this.links.include(a)){
66
+ var clean_href = a.href.replace(window.location.href.split('#')[0],'');
67
+ if(clean_href.substring(0,1) == '#'){
68
+ if(this.containers.keys().include(clean_href.substring(1))){
69
+ $(a).observe('click',function(event,clean_href){
70
+ this.setActiveTab(clean_href.substring(1));
71
+ }.bindAsEventListener(this,clean_href));
72
+ }
73
+ }
74
+ }
75
+ }.bind(this));
76
+ }
77
+ },
78
+ addTab: function(link){
79
+ this.links.push(link);
80
+ link.key = link.getAttribute('href').replace(window.location.href.split('#')[0],'').split('#').last().replace(/#/,'');
81
+ var container = $(link.key);
82
+ if(!container) {
83
+ throw "Control.Tabs: #" + link.key + " was not found on the page."; }
84
+ this.containers.set(link.key,container);
85
+ link[this.options.hover ? 'onmouseover' : 'onclick'] = function(link){
86
+ if(window.event) {
87
+ Event.stop(window.event); }
88
+ this.setActiveTab(link);
89
+ return false;
90
+ }.bind(this,link);
91
+ },
92
+ setActiveTab: function(link){
93
+ if(!link && typeof(link) == 'undefined') {
94
+ return; }
95
+ if(typeof(link) == 'string'){
96
+ this.setActiveTab(this.links.find(function(_link){
97
+ return _link.key == link;
98
+ }));
99
+ }else if(typeof(link) == 'number'){
100
+ this.setActiveTab(this.links[link]);
101
+ }else{
102
+ if(this.notify('beforeChange',this.activeContainer,this.containers.get(link.key)) === false) {
103
+ return; }
104
+ if(this.activeContainer) {
105
+ this.options.hideFunction(this.activeContainer); }
106
+ this.links.each(function(item){
107
+ (this.options.setClassOnContainer ? $(item.parentNode) : item).removeClassName(this.options.activeClassName);
108
+ }.bind(this));
109
+ (this.options.setClassOnContainer ? $(link.parentNode) : link).addClassName(this.options.activeClassName);
110
+ this.activeContainer = this.containers.get(link.key);
111
+ this.activeLink = link;
112
+ this.options.showFunction(this.containers.get(link.key));
113
+ this.notify('afterChange',this.containers.get(link.key));
114
+ }
115
+ },
116
+ next: function(){
117
+ this.links.each(function(link,i){
118
+ if(this.activeLink == link && this.links[i + 1]){
119
+ this.setActiveTab(this.links[i + 1]);
120
+ throw $break;
121
+ }
122
+ }.bind(this));
123
+ },
124
+ previous: function(){
125
+ this.links.each(function(link,i){
126
+ if(this.activeLink == link && this.links[i - 1]){
127
+ this.setActiveTab(this.links[i - 1]);
128
+ throw $break;
129
+ }
130
+ }.bind(this));
131
+ },
132
+ first: function(){
133
+ this.setActiveTab(this.links.first());
134
+ },
135
+ last: function(){
136
+ this.setActiveTab(this.links.last());
137
+ }
138
+ });
139
+ Object.extend(Control.Tabs,{
140
+ instances: [],
141
+ findByTabId: function(id){
142
+ return Control.Tabs.instances.find(function(tab){
143
+ return tab.links.find(function(link){
144
+ return link.key == id;
145
+ });
146
+ });
147
+ }
148
+ });
149
+ Object.Event.extend(Control.Tabs);
@@ -0,0 +1,4 @@
1
+ form.simple_form .buttons input,
2
+ form.simple_form a.cancel {
3
+ line-height: 1.5em;
4
+ }
@@ -0,0 +1,132 @@
1
+ #sidebar {
2
+ background-color: #CFCFCF;
3
+ float: left;
4
+ padding: 0 0.5em 0.5em;
5
+ margin-left: 1em;
6
+ width: 19em;
7
+ }
8
+ #sidebar h2 {
9
+ font-size: 12pt;
10
+ padding: 0.2em;
11
+ margin: 0;
12
+ text-align: center;
13
+ }
14
+ #sidebar form {
15
+ margin-top: 0.5em;
16
+ }
17
+ #sidebar ul {
18
+ list-style-type: none;
19
+ margin: 0;
20
+ padding: 0;
21
+ }
22
+ #sidebar #assets li {
23
+ border: 1px solid #AAA;
24
+ padding: 0.3em 0.4em;
25
+ margin-bottom: 0.3em;
26
+ }
27
+ #sidebar #assets li:hover {
28
+ background-color: #BFD6FF !important;
29
+ }
30
+ #sidebar #assets li.light {
31
+ background-color: #DDD;
32
+ }
33
+ #sidebar .asset_details {
34
+ margin-top: 0.5em;
35
+ }
36
+ #sidebar .asset_image {
37
+ margin: 0 1.5em 0;
38
+ }
39
+ #sidebar .asset_image {
40
+ float: left;
41
+ }
42
+ #sidebar .asset_size {
43
+ font-size: 8pt;
44
+ float: right;
45
+ }
46
+ #sidebar #components form {
47
+ margin-bottom: 0.5em;
48
+ }
49
+ #sidebar #components ul ul {
50
+ margin-left: 0.5em;
51
+ }
52
+ #sidebar .documentation {
53
+ text-align: center;
54
+ margin-bottom: 0;
55
+ }
56
+
57
+ #sidebar ul.tabs {
58
+ display: block;
59
+ margin: 1em 0 0.5em 0;
60
+ padding: 0;
61
+ text-align: center;
62
+ }
63
+ #sidebar ul.tabs li {
64
+ display: inline;
65
+ }
66
+ #sidebar ul.tabs a {
67
+ -moz-border-radius: 0.4em 0.4em 0 0;
68
+ -webkit-border-radius: 0.4em 0.4em 0 0;
69
+ border-radius: 0.4em 0.4em 0 0;
70
+ background-color: #333;
71
+ color: #CCC;
72
+ font-size: 9pt;
73
+ font-weight: bold;
74
+ margin: 0;
75
+ padding: 0.5em 0.5em;
76
+ padding-right: 0.5em;
77
+ text-align: center;
78
+ text-shadow: -1px -1px 1px #000000;
79
+ text-decoration: none;
80
+ }
81
+ #sidebar ul.tabs a.active,
82
+ #sidebar ul.tabs a:hover {
83
+ text-shadow: none;
84
+ }
85
+ #sidebar ul.tabs a:hover {
86
+ background-color: #777;
87
+ }
88
+ #sidebar ul.tabs a.active {
89
+ background-color: #666;
90
+ }
91
+
92
+ #tab_container {
93
+ border: 2px groove #CCC;
94
+ padding: 0.2em 0.5em;
95
+ }
96
+ #tab_container p {
97
+ background: none repeat scroll 0 0 #E5E5E5;
98
+ font-size: 8pt;
99
+ margin: 0 0 0.5em;
100
+ padding: 0.5em 0;
101
+ text-align: center;
102
+ }
103
+ #tab_container p:first-child {
104
+ background: #777;
105
+ background: -moz-linear-gradient(270deg, #666 0%, #888 100%) repeat scroll 0 0 transparent;
106
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0,#666), color-stop(1.0,#888));
107
+ }
108
+ #tab_container p:first-child a {
109
+ color: #EEE;
110
+ font-weight: bold;
111
+ text-decoration: none;
112
+ text-shadow: -1px -1px 1px #333;
113
+ }
114
+ #tab_container p:first-child a:hover {
115
+ text-decoration: underline;
116
+ }
117
+
118
+ #cms ul.tree { list-style-type: none; background: url(/cms/images/tree/vline.png) repeat-y; margin: 0; padding: 0; }
119
+ #cms ul.tree ul { margin-left: 10px; }
120
+ #cms ul.tree li { margin: 0; padding: 0 0px 0 12px; line-height: 20px; background: url(/cms/images/tree/node.png) no-repeat; color: #369; font-weight: bold; }
121
+ #cms ul.tree li:last-child { background: url(/cms/images/tree/lastnode.png) no-repeat; }
122
+
123
+ #cms ul.tree, #sidebar #assets ul {
124
+ margin-bottom: 0.5em;
125
+ }
126
+ #cms ul.tree ul {
127
+ margin-left: 15px;
128
+ }
129
+ #cms ul.tree li img.folder:hover {
130
+ cursor: pointer;
131
+ }
132
+