Skip to content

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also .

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also .
...
  • 19 commits
  • 21 files changed
  • 0 commit comments
  • 1 contributor
Commits on Mar 31, 2012
@nene nene Fix login from comments block.
Created LoginHelper class for generating the HTML and binding the
submit listener in one single spot.
2743c95
Commits on Apr 01, 2012
@nene nene Friendly error message when config file not found. efe3d6b
@nene nene Friendly error message when JSON parsing fails. 3c1b54f
@nene nene Friendly error message when jsb file parsing fails. 8652deb
Commits on Apr 03, 2012
@nene nene Defer HoverMenu creation until it's actually needed.
Previously the when menu buttons were created the menus were also
created right away.  Ext JS 4.1 didn't like that and placed the menus
somewhere at the top and refused to hide them initially.  Didn't really
managed to find out why, but doing it this way is probably better
anyway.
a54e97f
@nene nene Hack to prevent store.filterBy from showing menus in ExtJS 4.1.
A really strange bug indeed. Hope it gets fixed in 4.1 final.
81f1e6e
Commits on Apr 04, 2012
@nene nene Merge remote branch 'origin/master' 76d93bb
@nene nene Hide TreeContainer header when using ExtJS 4.1. 1da94d9
@nene nene Fix class overview toolbar for ExtJS 4.1.
First I'm constraining the styles of the main class-overview container
inside the body-area - otherwise the styles will also have unpredictable
effects on toolbar (especially the styles for tables as in 4.1 the
search field inside toolbar is wrapped in two tables).

Secondly the search field styles are applied differently as the DOM that
makes up the field has changed considerably.  At the moment this results
in the field looking a bit different in 4.1.  Needs more work...

Also added width to the trigger-field which otherwise would change its
width when trigger is shown/hidden.
df79e7e
Commits on Apr 05, 2012
@nene nene Change :senchaio task target dir. f945154
@nene nene Fix mystery bug when building docs app.
It took hours to track this down... and I'm out of ideas of why we need
to require this class over there.
d6e82dc
@nene nene Up version to 3.8.3. d126cbb
Commits on Apr 09, 2012
@nene nene Better handling of fatal parse errors.
In addition to stack trace the name of the file causing the problem is
printed.
020ad56
@nene nene Fix loading of videos when using Ext JS 4.1.
Use Ext.clone when passing #data config to store to avoid the
destructive behavior.
ab7c3bc
@nene nene Avoid conflict with CodeMirror styles for <pre>.
CodeMirror just defines the rule:

    .CodeMirror pre { ... }

This selector has quite low specificity, so it's easy to accidentally
override it.  And this indeed happened when the selector for normal pre
elements was changed from:

    .class-overview pre { ... }

to:

    .class-overview .x-panel-body pre { ... }

The result was that a <pre> inside CodeMirror editor received unwanted
rounded corners etc, rendering the editor pretty-much unusable.

Resolved this by only styling pre.prettyprint and pre.notpretty.
(The latter class is now added to all not-to-be-prettified pre-s, which
distinguishes them from pre-s used inside CodeMirror component.)
9120b49
@nene nene Fix avatar images of commentators. b782b4e
@nene nene Up version to 3.8.4 cba534d
Commits on Apr 10, 2012
@nene nene Fix line-height of CodeMirror editor.
Some previous <pre>-related style tweaks resulted in <pre> line height
being no more applied to the CodeMirror editor.  Now explicitly stored
the line-height style.
4de0de5
@nene nene Fix regression of guides page styles.
The main styles were restricted to panel body, but guides and others
were containers, not panels, so the styles did not get applied.

Now guides, videos, comments are all panels.
205b2bf
View
2 Rakefile
@@ -492,7 +492,7 @@ task :senchaio, [:mode] => :sass do |t, args|
compress if mode == "live"
runner = JsDuckRunner.new
- runner.add_options ["--output", OUT_DIR, "--config", "#{SDK_DIR}/../sync/docs/config.json"]
+ runner.add_options ["--output", OUT_DIR, "--config", "#{SDK_DIR}/../client-framework/docs/config.json"]
runner.add_debug if mode == "debug"
runner.add_seo if mode == "debug" || mode == "live"
runner.add_google_analytics if mode == "live"
View
4 jsduck.gemspec
@@ -2,8 +2,8 @@ Gem::Specification.new do |s|
s.required_rubygems_version = ">= 1.3.5"
s.name = 'jsduck'
- s.version = '3.8.2'
- s.date = '2012-03-29'
+ s.version = '3.8.4'
+ s.date = '2012-04-05'
s.summary = "Simple JavaScript Duckumentation generator"
s.description = "Documentation generator for Sencha JS frameworks"
s.homepage = "https://github.com/senchalabs/jsduck"
View
7 lib/jsduck/json_duck.rb
@@ -34,7 +34,12 @@ def self.generate(data)
# Reads and parses JSON from file
def self.read(filename)
- self.parse(JsDuck::IO.read(filename))
+ begin
+ self.parse(JsDuck::IO.read(filename))
+ rescue
+ puts "Oh noes! #{filename} is not a valid JSON file."
+ exit(1)
+ end
end
# Parses JSON string
View
13 lib/jsduck/options.rb
@@ -1,7 +1,7 @@
require 'optparse'
require 'jsduck/meta_tag_registry'
require 'jsduck/logger'
-require 'jsduck/io'
+require 'jsduck/json_duck'
module JsDuck
@@ -73,7 +73,7 @@ def initialize
]
@meta_tag_paths = []
- @version = "3.8.2"
+ @version = "3.8.4"
# Customizing output
@title = "Sencha Docs - Ext JS"
@@ -349,7 +349,12 @@ def create_option_parser
opts.on('--config=PATH',
"Loads config options from JSON file.", " ") do |path|
path = canonical(path)
- config = read_json_config(path)
+ if File.exists?(path)
+ config = read_json_config(path)
+ else
+ puts "Oh noes! The config file #{path} doesn't exist."
+ exit(1)
+ end
# treat paths inside JSON config relative to the location of
# config file. When done, switch back to current working dir.
@working_dir = File.dirname(path)
@@ -447,7 +452,7 @@ def read_filenames(fname)
# Extracts files of first build in jsb file
def extract_jsb_files(jsb_file)
- json = JSON.parse(JsDuck::IO.read(jsb_file))
+ json = JsonDuck::read(jsb_file)
basedir = File.dirname(jsb_file)
return json["builds"][0]["packages"].map do |package_id|
View
16 lib/jsduck/source_file.rb
@@ -80,10 +80,18 @@ def id(doc)
# Parses the file depending on filename as JS or CSS
def parse
- if @filename =~ /\.s?css$/
- CssParser.new(@contents, @options).parse
- else
- JsParser.new(@contents, @options).parse
+ begin
+ if @filename =~ /\.s?css$/
+ CssParser.new(@contents, @options).parse
+ else
+ JsParser.new(@contents, @options).parse
+ end
+ rescue
+ puts "Error while parsing #{@filename}: #{$!}"
+ puts
+ puts "Here's a full backtrace:"
+ puts $!.backtrace
+ exit(1)
end
end
View
2 opt/comments-server-side/app.js
@@ -248,7 +248,7 @@ app.post('/auth/:sdk/:version/comments', util.requireLoggedInUser, function(req,
upVotes: [],
createdAt: new Date,
target: target,
- emaiHash: crypto.createHash('md5').update(req.session.user.email).digest("hex"),
+ emailHash: crypto.createHash('md5').update(req.session.user.email).digest("hex"),
sdk: req.params.sdk,
version: req.params.version,
moderator: req.session.user.moderator,
View
20 template/app/Syntax.js
@@ -12,12 +12,20 @@ Ext.define("Docs.Syntax", {
* which to perform the highlighting.
*/
highlight: function(root) {
- Ext.Array.forEach(Ext.query("pre > code", root.dom || root), function(code) {
- code = Ext.get(code);
- var pre = code.parent();
- // Don't prettify inline examples that have preview enabled.
- if (!(pre.hasCls("inline-example") && pre.hasCls("preview"))) {
- code.addCls("prettyprint");
+ Ext.Array.forEach(Ext.query("pre", root.dom || root), function(pre) {
+ pre = Ext.get(pre);
+
+ if (pre.child("code")) {
+ // Don't prettify inline examples that have preview enabled.
+ if (!(pre.hasCls("inline-example") && pre.hasCls("preview"))) {
+ pre.addCls("prettyprint");
+ }
+ }
+ else if (!pre.parent(".CodeMirror")) {
+ // For normal pre-s add "notpretty" class so they can be
+ // distinguished in CSS from any other <pre> element
+ // that might appear on page.
+ pre.addCls("notpretty");
}
});
prettyPrint();
View
3 template/app/controller/Comments.js
@@ -11,6 +11,7 @@ Ext.define('Docs.controller.Comments', {
},
requires: [
+ "Docs.view.auth.LoginHelper",
"Docs.Syntax",
"Docs.Tip"
],
@@ -682,7 +683,7 @@ Ext.define('Docs.controller.Comments', {
}
}
} else {
- Docs.view.Comments.loggedOutCommentTpl.overwrite(commentWrap, {});
+ Docs.view.auth.LoginHelper.renderToComments(commentWrap);
}
}
},
View
28 template/app/view/Comments.js
@@ -3,7 +3,16 @@
*/
Ext.define('Docs.view.Comments', {
singleton: true,
- requires: ['Docs.view.auth.Login'],
+ requires: [
+ 'Docs.view.auth.LoginHelper',
+ // WTF!
+ // When I don't add this line then "sencha create jsb" command
+ // will fail. But this class shouldn't require that class,
+ // and indeed, when running in browser, the app will work just
+ // fine, but when doing e.g. "rake gem" something goes wrong
+ // and the "sencha create jsb" command just hangs.
+ 'Docs.view.auth.Login'
+ ],
constructor: function() {
var numComments = [
@@ -274,21 +283,6 @@ Ext.define('Docs.view.Comments', {
commentMetaAndGuide.join(''),
'</form>'
);
-
- if (Ext.isIE && Ext.ieVersion <= 7) {
- this.loggedOutCommentTpl = Ext.create('Ext.XTemplate',
- '<div class="new-comment">',
- '<span class="toggleNewComment"><span></span>Sorry, adding comments is not supported in IE 7 or earlier</span>',
- '</div>'
- );
- } else {
- this.loggedOutCommentTpl = Ext.create('Ext.XTemplate',
- '<div class="new-comment">',
- '<span class="toggleNewComment"><span></span>Sign in to post a comment:</span>',
- Docs.view.auth.Login.prototype.loginTplHtml.join(''),
- '</div>'
- );
- }
},
/**
@@ -474,7 +468,7 @@ Ext.define('Docs.view.Comments', {
this.makeCodeMirror(textarea, wrap);
} else {
- this.loggedOutCommentTpl.overwrite(newComment, {});
+ Docs.view.auth.LoginHelper.renderToComments(newComment);
}
}, this);
},
View
57 template/app/view/HoverMenuButton.js
@@ -44,11 +44,6 @@ Ext.define('Docs.view.HoverMenuButton', {
}, this);
}
- this.menu = Ext.create('Docs.view.HoverMenu', {
- store: this.store,
- columnHeight: this.getColumnHeight()
- });
-
this.callParent(arguments);
},
@@ -61,8 +56,6 @@ Ext.define('Docs.view.HoverMenuButton', {
onRender: function() {
this.callParent(arguments);
- this.renderMenu();
-
this.getEl().on({
click: function() {
this.fireEvent("click");
@@ -71,39 +64,46 @@ Ext.define('Docs.view.HoverMenuButton', {
mouseout: this.deferHideMenu,
scope: this
});
-
- this.menu.getEl().on({
- mouseover: function() {
- clearTimeout(this.hideTimeout);
- },
- mouseout: this.deferHideMenu,
- scope: this
- });
-
},
onDestroy: function() {
- // clean up DOM
- this.menu.destroy();
- // remove from global menu list
- Ext.Array.remove(Docs.view.HoverMenuButton.menus, this.menu);
+ if (this.menu) {
+ // clean up DOM
+ this.menu.destroy();
+ // remove from global menu list
+ Ext.Array.remove(Docs.view.HoverMenuButton.menus, this.menu);
+ }
this.callParent(arguments);
},
renderMenu: function() {
- this.menu.getEl().setVisibilityMode(Ext.core.Element.DISPLAY);
- this.menu.hide();
+ this.menu = Ext.create('Docs.view.HoverMenu', {
+ store: this.store,
+ columnHeight: this.getColumnHeight()
+ });
- this.menu.getEl().addListener('click', function(e) {
- this.menu.hide();
- e.preventDefault();
- }, this);
+ this.menu.getEl().on({
+ click: function(e) {
+ this.menu.hide();
+ e.preventDefault();
+ },
+ mouseover: function() {
+ clearTimeout(this.hideTimeout);
+ },
+ mouseout: this.deferHideMenu,
+ scope: this
+ });
Docs.view.HoverMenuButton.menus.push(this.menu);
},
deferHideMenu: function() {
+ // skip if nothing to hide
+ if (!this.menu) {
+ return;
+ }
+
clearTimeout(Docs.view.HoverMenuButton.showTimeout);
this.hideTimeout = Ext.Function.defer(function() {
this.menu.hide();
@@ -113,6 +113,11 @@ Ext.define('Docs.view.HoverMenuButton', {
deferShowMenu: function() {
clearTimeout(Docs.view.HoverMenuButton.showTimeout);
Docs.view.HoverMenuButton.showTimeout = Ext.Function.defer(function() {
+ // Create menu if needed
+ if (!this.menu) {
+ this.renderMenu();
+ }
+
// hide other menus
Ext.Array.forEach(Docs.view.HoverMenuButton.menus, function(menu) {
if (menu !== this.menu) {
View
11 template/app/view/ThumbList.js
@@ -44,10 +44,17 @@ Ext.define('Docs.view.ThumbList', {
});
this.store = Ext.create('Ext.data.JsonStore', {
- fields: ['id', 'title', 'items'],
- data: this.data
+ fields: ['id', 'title', 'items']
});
+ // Can't just pass the #data config to store as in Ext 4.1 the
+ // value of data config gets modified - each array element
+ // gets replaced with a Model record.
+ //
+ // But we don't want to modify the items in the global
+ // Docs.data...
+ this.store.loadData(this.data);
+
// Place itemTpl inside main template
this.tpl = new Ext.XTemplate(Ext.Array.flatten([
'<div>',
View
3 template/app/view/TreeContainer.js
@@ -17,6 +17,9 @@ Ext.define('Docs.view.TreeContainer', {
hideCollapseTool: true,
animCollapse: true,
+ // For some strange reason the container gets a heading in Ext JS 4.1
+ header: false,
+
initComponent: function() {
this.items = [
{
View
34 template/app/view/auth/Login.js
@@ -1,44 +1,16 @@
/**
- * View for login form.
+ * View for login form in header.
*/
Ext.define('Docs.view.auth.Login', {
extend: 'Ext.container.Container',
alias: 'widget.authentication',
-
- loginTplHtml: [
- '<form class="loginForm" method="POST">',
- '<input class="username" type="text" name="username" placeholder="Username" />',
- '<input class="password" type="password" name="password" placeholder="Password" />',
- '<label><input type="checkbox" name="remember" /> Remember Me</label>',
- '<input class="submit" type="submit" value="Sign in" />',
- ' or ',
- '<a class="register" href="http://www.sencha.com/forum/register.php" target="_blank">Register</a>',
- '</form>'
- ],
-
- initComponent: function() {
- this.loginTpl = Ext.create('Ext.Template', this.loginTplHtml.join(''));
- this.callParent(arguments);
- },
+ requires: 'Docs.view.auth.LoginHelper',
/**
* Shows login form.
*/
showLoginForm: function() {
- this.update(this.loginTpl.apply());
- this.getEl().down("form").on("submit", this.submitLogin, this, {preventDefault: true});
- },
-
- submitLogin: function(event, el) {
- var form = Ext.get(el),
- username = form.down('input[name=username]').getValue(),
- password = form.down('input[name=password]').getValue(),
- rememberEl = form.down('input[name=remember]'),
- submitEl = form.down('input[type=submit]');
-
- var remember = rememberEl ? Boolean(rememberEl.getAttribute('checked')) : false;
-
- Docs.App.getController('Auth').login(username, password, remember, submitEl);
+ Docs.view.auth.LoginHelper.renderToHeader(this.getEl());
},
/**
View
73 template/app/view/auth/LoginHelper.js
@@ -0,0 +1,73 @@
+/**
+ * Generates the login form for both in header and at the end of
+ * comments list.
+ *
+ * When form is submitted, Docs.controller.Auth#login method is called.
+ */
+Ext.define('Docs.view.auth.LoginHelper', {
+ singleton: true,
+
+ loginTplHtml: [
+ '<form class="loginForm">',
+ '<input class="username" type="text" name="username" placeholder="Username" />',
+ '<input class="password" type="password" name="password" placeholder="Password" />',
+ '<label><input type="checkbox" name="remember" /> Remember Me</label>',
+ '<input class="submit" type="submit" value="Sign in" />',
+ ' or ',
+ '<a class="register" href="http://www.sencha.com/forum/register.php" target="_blank">Register</a>',
+ '</form>'
+ ],
+
+ /**
+ * Renders the form inside Login component in header.
+ * @param {Ext.Element/HTMLElement} el
+ */
+ renderToHeader: function(el) {
+ var tpl = Ext.create('Ext.Template', this.loginTplHtml.join(''));
+ tpl.overwrite(el, {});
+ this.bindSubmit(el);
+ },
+
+ /**
+ * Renders the form at the end of comments list.
+ * @param {Ext.Element/HTMLElement} el
+ */
+ renderToComments: function(el) {
+ if (Ext.isIE && Ext.ieVersion <= 7) {
+ var tpl = Ext.create('Ext.XTemplate',
+ '<div class="new-comment">',
+ '<span class="toggleNewComment"><span></span>Sorry, ',
+ 'adding comments is not supported in IE 7 or earlier</span>',
+ '</div>'
+ );
+ }
+ else {
+ var tpl = Ext.create('Ext.XTemplate',
+ '<div class="new-comment">',
+ '<span class="toggleNewComment"><span></span>Sign in to post a comment:</span>',
+ this.loginTplHtml.join(''),
+ '</div>'
+ );
+ }
+ tpl.overwrite(el, {});
+ this.bindSubmit(el);
+ },
+
+ bindSubmit: function(el) {
+ Ext.get(el).down("form").on("submit", this.submitLogin, this, {preventDefault: true});
+ },
+
+ // Gathers values from form and passes to Auth controller
+ submitLogin: function(event, el) {
+ var form = Ext.get(el);
+ var username = form.down('input[name=username]').getValue();
+ var password = form.down('input[name=password]').getValue();
+ var rememberEl = form.down('input[name=remember]');
+ var submitEl = form.down('input[type=submit]');
+
+ var remember = rememberEl ? Boolean(rememberEl.getAttribute('checked')) : false;
+
+ Docs.App.getController('Auth').login(username, password, remember, submitEl);
+ }
+
+});
View
11 template/app/view/cls/Toolbar.js
@@ -104,6 +104,7 @@ Ext.define('Docs.view.cls.Toolbar', {
hideTrigger: true,
emptyText: 'Filter class members',
enableKeyEvents: true,
+ width: 150,
listeners: {
keyup: function(cmp) {
this.fireEvent("filter", cmp.getValue(), this.getShowFlags());
@@ -237,6 +238,16 @@ Ext.define('Docs.view.cls.Toolbar', {
isSearch && !re.test(m.get("label"))
);
});
+ // HACK!!!
+ // In Ext JS 4.1 filtering the stores causes the menus
+ // to become visible. But the visibility behaves badly
+ // - one has to call #show first or #hide won't have
+ // an effect.
+ var menu = this.memberButtons[type].menu;
+ if (menu && Ext.getVersion().version >= "4.1.0") {
+ menu.show();
+ menu.hide();
+ }
}
}, this);
},
View
2 template/app/view/comments/Index.js
@@ -2,7 +2,7 @@
* Container for recent comments listing.
*/
Ext.define('Docs.view.comments.Index', {
- extend: 'Ext.container.Container',
+ extend: 'Ext.panel.Panel',
alias: 'widget.commentindex',
cls: 'comment-index iScroll',
View
2 template/app/view/guides/Container.js
@@ -4,7 +4,7 @@
* Renders the guide and print button.
*/
Ext.define('Docs.view.guides.Container', {
- extend: 'Ext.container.Container',
+ extend: 'Ext.panel.Panel',
alias: 'widget.guidecontainer',
componentCls: 'guide-container',
View
2 template/app/view/videos/Container.js
@@ -4,7 +4,7 @@
* Renders the video itself and its title + description.
*/
Ext.define('Docs.view.videos.Container', {
- extend: 'Ext.container.Container',
+ extend: 'Ext.panel.Panel',
alias: 'widget.videocontainer',
componentCls: 'video-container',
View
5 template/resources/sass/_examples.scss
@@ -42,7 +42,10 @@ pre.inline-example {
@include border-radius(5px);
// Create exactly the same amount of padding as normal code <pre> has
padding: 5px 15px !important;
- background: #f7f7f7; } }
+ background: #f7f7f7; }
+ // same line height as for non-live code examples
+ .CodeMirror pre {
+ line-height: 1.3em; } }
.inline-example-cmp {
margin-bottom: 10px;
View
16 template/resources/sass/_toolbar.scss
@@ -10,18 +10,20 @@
// The reset (X) button in filter-class-members text box
.member-filter {
+ height: 20px;
+ border-style: solid;
+ border-color: #bebebe;
+ border-width: 1px;
+ margin-left: -1px;
+ background: white url('../images/text-bg.gif') repeat-x 0 0;
.x-form-trigger.reset {
background: url(../images/x12.png) no-repeat 2px 3px;
padding: 0;
margin: 0;
border: 0; }
- .x-form-trigger-wrap {
- height: 20px;
- border-style: solid;
- border-color: #bebebe;
- border-width: 1px 1px 1px 0;
- margin-left: -1px;
- background: url('../images/text-bg.gif'); } }
+ input {
+ background: transparent;
+ border: none; } }
// Backgrounds for two states of the expand/collapse all button.
View
108 template/resources/sass/viewport.scss
@@ -26,61 +26,61 @@
font-weight: normal; } }
.class-overview, .guide-container, .comment-index {
- min-height: 100px;
- .clr {
- clear: both; }
- p, ul, ol {
- color: #484848;
- max-width: 900px; }
- p {
- padding: 0;
- margin: 0 0 1em; }
- p:last-child {
- margin: 0; }
- ul {
- margin: 0 0 1em 2em;
- li {
- list-style: disc outside; } }
- ol {
- margin: 0 0 1em 2em;
- li {
- list-style: decimal outside; } }
- em {
- font-style: italic; }
- strong {
- font-weight: bold; }
- h3 {
- font-weight: bold;
- font-size: 1.1em; }
- h4 {
- font-weight: bold; }
- table {
- margin-bottom: 10px;
- tr:first-child {
- td {
- color: #000;
- font-weight: bold; } }
- td {
+ // Style only the body area, or the toolbar will get styled too
+ .x-panel-body {
+ min-height: 100px;
+ .clr {
+ clear: both; }
+ p, ul, ol {
color: #484848;
- padding: 2px 20px 2px 0; } }
- pre {
- background-color: #f7f7f7;
- border: solid 1px #e8e8e8;
- @include border-radius(5px);
- color: #314e64;
- font-family: $docs-monospace-font;
- padding: 10px 20px;
- line-height: 1.3em;
- margin: 10px 0 14px 0;
- max-width: 900px;
- overflow-x: auto;
- overflow-y: hidden;
- code {
- font-family: $docs-monospace-font; }
- i,em {
- font-style: normal; } }
- pre.prettyprint {
- padding: 10px 12px; } }
+ max-width: 900px; }
+ p {
+ padding: 0;
+ margin: 0 0 1em; }
+ p:last-child {
+ margin: 0; }
+ ul {
+ margin: 0 0 1em 2em;
+ li {
+ list-style: disc outside; } }
+ ol {
+ margin: 0 0 1em 2em;
+ li {
+ list-style: decimal outside; } }
+ em {
+ font-style: italic; }
+ strong {
+ font-weight: bold; }
+ h3 {
+ font-weight: bold;
+ font-size: 1.1em; }
+ h4 {
+ font-weight: bold; }
+ table {
+ margin-bottom: 10px;
+ tr:first-child {
+ td {
+ color: #000;
+ font-weight: bold; } }
+ td {
+ color: #484848;
+ padding: 2px 20px 2px 0; } }
+ pre.notpretty, pre.prettyprint {
+ background-color: #f7f7f7;
+ border: solid 1px #e8e8e8;
+ @include border-radius(5px);
+ color: #314e64;
+ font-family: $docs-monospace-font;
+ padding: 10px 12px;
+ line-height: 1.3em;
+ margin: 10px 0 14px 0;
+ max-width: 900px;
+ overflow-x: auto;
+ overflow-y: hidden;
+ code {
+ font-family: $docs-monospace-font; }
+ i, em {
+ font-style: normal; } } } }
@import "class_overview";

No commit comments for this range

Something went wrong with that request. Please try again.