Various enhancements to html2 docsgen (#643)

This commit includes the following changes:

- Fix docs not generating parameter descriptions, add rust sample.
- Add example to doc output.
- Add basic scope reporting.
- Stringify the JSON "Example" objects for response schemas.
- Prettify JSON examples in response schemas.
- Parse and present multiline response descriptions.
- Add API error details to docsgen.
- Add read only markers to read only properties.
- Fix up style document indentation.
- Add support for `x-shared-errors`, an extension to define common error types that can be shared across a microservice framework.
This commit is contained in:
Benjamin Gill 2018-07-26 14:57:57 +01:00 committed by William Cheng
parent 1d72edddf6
commit 7624a1ff85
10 changed files with 1759 additions and 438 deletions

View File

@ -17,12 +17,14 @@
package org.openapitools.codegen.languages;
import io.swagger.v3.core.util.Json;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.media.ArraySchema;
import io.swagger.v3.oas.models.media.Schema;
import com.fasterxml.jackson.databind.JsonNode;
import org.apache.commons.lang3.StringUtils;
import org.openapitools.codegen.CliOption;
import org.openapitools.codegen.CodegenConfig;
@ -175,6 +177,22 @@ public class StaticHtml2Generator extends DefaultCodegen implements CodegenConfi
additionalProperties.put("jsModuleName", jsModuleName);
preparHtmlForGlobalDescription(openAPI);
Map<String, Object> vendorExtensions = openAPI.getExtensions();
if (vendorExtensions != null) {
for(Map.Entry<String, Object> vendorExtension: vendorExtensions.entrySet()) {
// Vendor extensions could be Maps (objects). If we wanted to iterate through them in our template files
// without knowing the keys beforehand, the default `toString` method renders them unusable. Instead, we
// convert them to JSON strings now, which means we can easily use them later.
if (vendorExtension.getValue() instanceof Map) {
this.vendorExtensions().put(vendorExtension.getKey(), Json.mapper().convertValue(vendorExtension.getValue(), JsonNode.class));
} else {
this.vendorExtensions().put(vendorExtension.getKey(), vendorExtension.getValue());
}
}
}
openAPI.setExtensions(this.vendorExtensions);
}
@Override

View File

@ -0,0 +1 @@
@import url('https://fonts.googleapis.com/css?family=Source+Code+Pro');

View File

@ -103,20 +103,31 @@
});
</script>
<style type="text/css">
{{>css_bootstrap}}
{{>css_prettify}}
{{>styles}}
{{>fonts}}
{{>css_bootstrap}}
{{>css_prettify}}
{{>styles}}
</style>
</head>
<body>
<script>
// Script section to load models into a JS Var
var defs = {}
{{#models}}
{{#model}}
defs.{{name}} = {{{modelJson}}};
{{/model}}
{{#models}}
{{#model}}
defs["{{name}}"] = {{{modelJson}}};
{{/model}}
{{/models}}
var errs = {};
{{#swagger.vendorExtensions.x-shared-errors}}
{
let err = {{{.}}};
errs[err.errorID] = err;
}
{{/swagger.vendorExtensions.x-shared-errors}}
</script>
<div class="container-fluid">
@ -162,7 +173,9 @@
<div class="app-desc">Version: {{{version}}}</div>
{{/version}}
<hr>
<div>{{{appDescription}}}</div>
<div id="app-description" class="app-desc">
{{{appDescription}}}
</div>
</div>
</div>
<div id="sections">
@ -200,6 +213,7 @@
<li class=""><a href="#examples-{{baseName}}-{{nickname}}-0-php">PHP</a></li>
<li class=""><a href="#examples-{{baseName}}-{{nickname}}-0-perl">Perl</a></li>
<li class=""><a href="#examples-{{baseName}}-{{nickname}}-0-python">Python</a></li>
<li class=""><a href="#examples-{{baseName}}-{{nickname}}-0-rust">Rust</a></li>
</ul>
<div class="tab-content">
@ -243,8 +257,22 @@
<div class="tab-pane" id="examples-{{baseName}}-{{nickname}}-0-python">
<pre class="prettyprint"><code class="language-python">{{>sample_python}}</code></pre>
</div>
<div class="tab-pane" id="examples-{{baseName}}-{{nickname}}-0-rust">
<pre class="prettyprint"><code class="language-rust">{{>sample_rust}}</code></pre>
</div>
</div>
<h2>Scopes</h2>
<table>
{{#authMethods}}{{#scopes}}
<tr>
<td>{{scope}}</td>
<td>{{description}}</td>
</tr>
{{/scopes}}{{/authMethods}}
</table>
<h2>Parameters</h2>
{{#hasPathParams}}
@ -314,31 +342,77 @@
<h2>Responses</h2>
{{#responses}}
<h3> Status: {{code}} - {{message}} </h3>
<h3 id="examples-{{baseName}}-{{nickname}}-title-{{code}}"></h3>
<p id="examples-{{baseName}}-{{nickname}}-description-{{code}}" class="marked"></p>
<script>
var response{{baseName}}{{code}}_description = `{{{message}}}`;
var response{{baseName}}{{code}}_description_break = response{{baseName}}{{code}}_description.indexOf('\n');
if (response{{baseName}}{{code}}_description_break == -1) {
$("#examples-{{baseName}}-{{nickname}}-title-{{code}}").text("Status: {{code}} - " + response{{baseName}}{{code}}_description);
} else {
$("#examples-{{baseName}}-{{nickname}}-title-{{code}}").text("Status: {{code}} - " + response{{baseName}}{{code}}_description.substring(0, response{{baseName}}{{code}}_description_break));
$("#examples-{{baseName}}-{{nickname}}-description-{{code}}").html(response{{baseName}}{{code}}_description.substring(response{{baseName}}{{code}}_description_break));
}
</script>
<ul class="nav nav-tabs nav-tabs-examples" >
<ul id="responses-detail-{{baseName}}-{{nickname}}-{{code}}" class="nav nav-tabs nav-tabs-examples" >
{{#schema}}
<li class="active">
<a data-toggle="tab" href="#responses-{{nickname}}-{{code}}-schema">Schema</a>
<a data-toggle="tab" href="#responses-{{baseName}}-{{nickname}}-{{code}}-schema">Schema</a>
</li>
{{#examples}}
<li class="">
<a data-toggle="tab" href="#responses-{{nickname}}-{{code}}-example">Response Example</a>
<a data-toggle="tab" href="#responses-{{baseName}}-{{nickname}}-{{code}}-example">Response Example</a>
</li>
{{/examples}}
{{/schema}}
{{#hasHeaders}}
<li class="">
<a data-toggle="tab" href="#responses-{{nickname}}-{{code}}-headers">Headers</a>
</li>
{{/hasHeaders}}
{{#vendorExtensions}}
{{#x-shared-errors}}
<script>
$(document).ready(function()
{
var errRef = "{{{$ref}}}";
var errorID = errRef.substring(errRef.lastIndexOf("/") + 1);
var errorDef = errs[errorID];
var tabID = 'responses-detail-{{baseName}}-{{nickname}}-{{code}}-' + errorID;
var contentID = tabID + "-content";
$('#responses-detail-{{baseName}}-{{nickname}}-{{code}}').append("<li><a href='#" + tabID + "' data-toggle='tab'>" + errorID + "</a></li>");
var contentWrapper = $('#responses-{{baseName}}-{{nickname}}-{{code}}-wrapper');
contentWrapper.append('<div class="tab-pane" id="' + tabID + '"><div id="' + contentID + '" class="exampleStyle"></div></div>');
var contentPane = $('#' + contentID);
contentPane.append('<p>' + errorDef.message + '</p>');
if (errorDef.variables)
{
contentPane.append('<h4>Variables</h4>');
var lVars = $('<ol></ol>').appendTo(contentPane);
for (lii = 0; lii < errorDef.variables.length; lii++)
{
$("<li></li>").appendTo(lVars).text(errorDef.variables[lii]);
}
}
});
</script>
{{/x-shared-errors}}
{{/vendorExtensions}}
</ul>
<div class="tab-content" style='margin-bottom: 10px;'>
<div class="tab-content" id="responses-{{baseName}}-{{nickname}}-{{code}}-wrapper" style='margin-bottom: 10px;'>
{{#schema}}
<div class="tab-pane active" id="responses-{{nickname}}-{{code}}-schema">
<div id='responses-{{nickname}}-{{code}}-schema-{{code}}' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
<div class="tab-pane active" id="responses-{{baseName}}-{{nickname}}-{{code}}-schema">
<div id="responses-{{baseName}}-{{nickname}}-schema-{{code}}" class="exampleStyle">
<script>
$(document).ready(function() {
var schemaWrapper = {{{jsonSchema}}};
@ -352,45 +426,43 @@
});
}
//console.log(JSON.stringify(schema));
var view = new JSONSchemaView(schema, 3);
$('#responses-{{nickname}}-{{code}}-schema-data').val(stringify(schema));
var result = $('#responses-{{nickname}}-{{code}}-schema-{{code}}');
$('#responses-{{baseName}}-{{nickname}}-{{code}}-schema-data').val(JSON.stringify(schema));
var result = $('#responses-{{baseName}}-{{nickname}}-schema-{{code}}');
result.empty();
result.append(view.render());
});
</script>
</div>
<input id='responses-{{nickname}}-{{code}}-schema-data' type='hidden' value=''></input>
<input id='responses-{{baseName}}-{{nickname}}-{{code}}-schema-data' type='hidden' value=''></input>
</div>
{{#examples}}
<div class="tab-pane" id="responses-{{nickname}}-{{code}}-example">
<pre class="prettyprint"><code class="json">{{example}}</code></pre>
</div>
<div class="tab-pane" id="examples-{{baseName}}-{{nickname}}-{{code}}-example">
<pre class="prettyprint"><code class="json">{{example}}</code></pre>
</div>
{{/examples}}
{{/schema}}
{{#hasHeaders}}
<div class="tab-pane" id="responses-{{nickname}}-{{code}}-headers">
<table>
<tr>
<th width="150px">Name</th>
<th width="100px">Type</th>
<th width="100px">Format</th>
<th>Description</th>
</tr>
{{#headers}}
<tr>
<td>{{#name}}{{name}}{{/name}}</td>
<td>{{#datatype}}{{dataType}}{{/datatype}}</td>
<td>{{#dataFormat}}{{dataFormat}}{{/dataFormat}}</td>
<td>{{#description}}{{description}}{{/description}}</td>
</tr>
{{/headers}}
</table>
</div>
<div class="tab-pane" id="responses-{{nickname}}-{{code}}-headers">
<table>
<tr>
<th width="150px">Name</th>
<th width="100px">Type</th>
<th width="100px">Format</th>
<th>Description</th>
</tr>
{{#headers}}
<tr>
<td>{{#name}}{{name}}{{/name}}</td>
<td>{{#datatype}}{{dataType}}{{/datatype}}</td>
<td>{{#dataFormat}}{{dataFormat}}{{/dataFormat}}</td>
<td>{{#description}}{{description}}{{/description}}</td>
</tr>
{{/headers}}
</table>
</div>
{{/hasHeaders}}
</div>
{{/responses}}
</article>
</div>

File diff suppressed because one or more lines are too long

View File

@ -15,8 +15,8 @@
{{/dataFormat}}
{{#description}}
<div class="inner description">
{{description}}
<div class="inner description marked">
{{description}}
</div>
{{/description}}
</div>

View File

@ -1,7 +1,6 @@
<tr><td style="width:150px;">{{paramName}} {{^required}}{{/required}}{{#required}}<span style="color:red;">*</span>{{/required}}</td>
<td>
<p class="marked">{{description}}</p>
<script>
$(document).ready(function() {
var schemaWrapper = {{{jsonSchema}}};

View File

@ -0,0 +1,11 @@
extern crate {{classname}};
pub fn main() {
{{#allParams}} let {{paramName}} = {{{example}}}; // {{{dataType}}}
{{/allParams}}
let mut context = {{classname}}::Context::default();
let result = client.{{operationId}}({{#allParams}}{{paramName}}, {{/allParams}}&context).wait();
println!("{:?}", result);
}

View File

@ -2,7 +2,7 @@
* Content
* ------------------------------------------------------------------------------------------ */
@import url('https://fonts.googleapis.com/css?family=Source+Code+Pro');
* {
font-family: 'Source Code Pro', sans-serif;
}
@ -10,7 +10,11 @@ body {
min-width: 980px;
}
body, p, a, div, th, td {
.app-desc {
color: #808080
}
body, p, a, div, th, td, li {
font-family: "Source Sans Pro", sans-serif;
font-weight: 400;
font-size: 16px;
@ -310,8 +314,6 @@ pre code.sample-request-response-json {
border-left: #e5e5e5 4px solid;
}
/* ------------------------------------------------------------------------------------------
* Tabs
* ------------------------------------------------------------------------------------------ */
@ -362,59 +364,175 @@ ul.nav-tabs {
} /* /@media print */
.doc-chapter
{
display:none;
background-color: #eee;
border-radius: 1px;
padding: 10px;
margin-bottom: 20px;
.doc-chapter {
display: none;
background-color: #eee;
border-radius: 1px;
padding: 10px;
margin-bottom: 20px;
}
/*!
* json-schema-view-js
* https://github.com/mohsen1/json-schema-view-js#readme
* Version: 0.4.1 - 2015-11-12T17:19:27.615Z
* License: MIT
*/.json-schema-view .toggle-handle:after,.json-schema-view.json-schema-view-dark .toggle-handle:after,json-schema-view .toggle-handle:after,json-schema-view[json-schema-view-dark] .toggle-handle:after{content:"\25BC"}.json-schema-view .title,.json-schema-view.json-schema-view-dark .title,json-schema-view .title,json-schema-view[json-schema-view-dark] .title{font-weight:700;cursor:pointer}.json-schema-view,json-schema-view{font-family:monospace;font-size:0;display:table-cell}.json-schema-view>*,json-schema-view>*{font-size:14px}.json-schema-view .toggle-handle,json-schema-view .toggle-handle{cursor:pointer;margin:auto .3em;font-size:10px;display:inline-block;transform-origin:50% 40%;transition:transform 150ms ease-in}.json-schema-view .toggle-handle,.json-schema-view .toggle-handle:hover,json-schema-view .toggle-handle,json-schema-view .toggle-handle:hover{text-decoration:none;color:#333}.json-schema-view .description,json-schema-view .description{color:gray;font-style:italic}
.pattern {
color: blue;
}
.default {
color: black;
}
.required {
color:black;
}
.json-schema-view .title,.json-schema-view .title:hover,json-schema-view .title,json-schema-view .title:hover{text-decoration:none;color:#333}.json-schema-view .brace,.json-schema-view .bracket,.json-schema-view .title,json-schema-view .brace,json-schema-view .bracket,json-schema-view .title{color:#333}.json-schema-view .property,json-schema-view .property{font-size:0;display:table-row}.json-schema-view .property>*,json-schema-view .property>*{font-size:14px;padding:.2em}.json-schema-view .name,json-schema-view .name{color:#00f;display:table-cell;vertical-align:top}.json-schema-view .type,json-schema-view .type{color:green}.json-schema-view .type-any,json-schema-view .type-any{color:#33f}.json-schema-view .required,json-schema-view .required{color:red}.json-schema-view .inner,json-schema-view .inner{padding-left:18px}.json-schema-view.collapsed .description,.json-schema-view.collapsed .property,json-schema-view.collapsed .description,json-schema-view.collapsed .property{display:none}.json-schema-view.collapsed .closeing.brace,json-schema-view.collapsed .closeing.brace{display:inline-block}.json-schema-view.collapsed .toggle-handle,json-schema-view.collapsed .toggle-handle{transform:rotate(-90deg)}.json-schema-view.json-schema-view-dark,json-schema-view[json-schema-view-dark]{font-family:monospace;font-size:0;display:table-cell}.json-schema-view.json-schema-view-dark>*,json-schema-view[json-schema-view-dark]>*{font-size:14px}.json-schema-view.json-schema-view-dark .toggle-handle,json-schema-view[json-schema-view-dark] .toggle-handle{cursor:pointer;margin:auto .3em;font-size:10px;display:inline-block;transform-origin:50% 40%;transition:transform 150ms ease-in}.json-schema-view.json-schema-view-dark .toggle-handle,.json-schema-view.json-schema-view-dark .toggle-handle:hover,json-schema-view[json-schema-view-dark] .toggle-handle,json-schema-view[json-schema-view-dark] .toggle-handle:hover{text-decoration:none;color:#eee}.json-schema-view.json-schema-view-dark .description,json-schema-view[json-schema-view-dark] .description{color:gray;font-style:italic}.json-schema-view.json-schema-view-dark .title,.json-schema-view.json-schema-view-dark .title:hover,json-schema-view[json-schema-view-dark] .title,json-schema-view[json-schema-view-dark] .title:hover{text-decoration:none;color:#eee}.json-schema-view.json-schema-view-dark .brace,.json-schema-view.json-schema-view-dark .bracket,.json-schema-view.json-schema-view-dark .title,json-schema-view[json-schema-view-dark] .brace,json-schema-view[json-schema-view-dark] .bracket,json-schema-view[json-schema-view-dark] .title{color:#eee}.json-schema-view.json-schema-view-dark .property,json-schema-view[json-schema-view-dark] .property{font-size:0;display:table-row}.json-schema-view.json-schema-view-dark .property>*,json-schema-view[json-schema-view-dark] .property>*{font-size:14px;padding:.2em}.json-schema-view.json-schema-view-dark .name,json-schema-view[json-schema-view-dark] .name{color:#add8e6;display:table-cell;vertical-align:top}.json-schema-view.json-schema-view-dark .type,json-schema-view[json-schema-view-dark] .type{color:#90ee90}.json-schema-view.json-schema-view-dark .type-any,json-schema-view[json-schema-view-dark] .type-any{color:#d4ebf2}.json-schema-view.json-schema-view-dark .required,json-schema-view[json-schema-view-dark] .required{color:#fe0000}.json-schema-view.json-schema-view-dark .inner,json-schema-view[json-schema-view-dark] .inner{padding-left:18px}.json-schema-view.json-schema-view-dark.collapsed .description,.json-schema-view.json-schema-view-dark.collapsed .property,json-schema-view[json-schema-view-dark].collapsed .description,json-schema-view[json-schema-view-dark].collapsed .property{display:none}.json-schema-view.json-schema-view-dark.collapsed .closeing.brace,json-schema-view[json-schema-view-dark].collapsed .closeing.brace{display:inline-block}.json-schema-view.json-schema-view-dark.collapsed .toggle-handle,json-schema-view[json-schema-view-dark].collapsed .toggle-handle{transform:rotate(-90deg)}
* json-schema-view-js
* https://github.com/mohsen1/json-schema-view-js#readme
* Version: 0.4.1 - 2015-11-12T17:19:27.615Z
* License: MIT
*/
.json-schema-view .toggle-handle:after, .json-schema-view.json-schema-view-dark .toggle-handle:after, json-schema-view .toggle-handle:after, json-schema-view[json-schema-view-dark] .toggle-handle:after {
content: "\25BC"
}
.json-schema-view .title, .json-schema-view.json-schema-view-dark .title, json-schema-view .title, json-schema-view[json-schema-view-dark] .title {
font-weight: 700;
cursor: pointer
}
.json-schema-view, json-schema-view {
font-family: monospace;
font-size: 0;
display: table-cell
}
.json-schema-view>*, json-schema-view>* {
font-size: 14px
}
.json-schema-view .toggle-handle, json-schema-view .toggle-handle {
cursor: pointer;
margin: auto .3em;
font-size: 10px;
display: inline-block;
transform-origin: 50% 40%;
transition: transform 150ms ease-in
}
.json-schema-view .toggle-handle, .json-schema-view .toggle-handle:hover, json-schema-view .toggle-handle, json-schema-view .toggle-handle:hover {
text-decoration: none;
color: #333
}
.json-schema-view .description, json-schema-view .description {
color: gray;
font-style: italic
}
.json-schema-view .readOnly, json-schema-view .readOnly {
color: gray;
font-style: italic
}
.json-schema-view .nullable, json-schema-view .nullable {
color: gray;
font-style: italic
}
.pattern, .example {
color: blue;
}
.default {
color: black;
}
.required {
color: black;
}
.json-schema-view .title, .json-schema-view .title:hover, json-schema-view .title, json-schema-view .title:hover {
text-decoration: none;
color: #333
}
.json-schema-view .brace, .json-schema-view .bracket, .json-schema-view .title, json-schema-view .brace, json-schema-view .bracket, json-schema-view .title {
color: #333
}
.json-schema-view .property, json-schema-view .property {
font-size: 0;
display: table-row
}
.json-schema-view .property>*, json-schema-view .property>* {
font-size: 14px;
padding: .2em
}
.json-schema-view .name, json-schema-view .name {
color: #00f;
display: table-cell;
vertical-align: top
}
.json-schema-view .type, json-schema-view .type {
color: green
}
.json-schema-view .type-any, json-schema-view .type-any {
color: #33f
}
.json-schema-view .required, json-schema-view .required {
color: red
}
.json-schema-view .inner, json-schema-view .inner {
padding-left: 18px
}
.json-schema-view.collapsed .description, .json-schema-view.collapsed .property, json-schema-view.collapsed .description, json-schema-view.collapsed .property {
display: none
}
.json-schema-view.collapsed .closeing.brace, json-schema-view.collapsed .closeing.brace {
display: inline-block
}
.json-schema-view.collapsed .toggle-handle, json-schema-view.collapsed .toggle-handle {
transform: rotate(-90deg)
}
.json-schema-view.json-schema-view-dark, json-schema-view[json-schema-view-dark] {
font-family: monospace;
font-size: 0;
display: table-cell
}
.json-schema-view.json-schema-view-dark>*, json-schema-view[json-schema-view-dark]>* {
font-size: 14px
}
.json-schema-view.json-schema-view-dark .toggle-handle, json-schema-view[json-schema-view-dark] .toggle-handle {
cursor: pointer;
margin: auto .3em;
font-size: 10px;
display: inline-block;
transform-origin: 50% 40%;
transition: transform 150ms ease-in
}
.json-schema-view.json-schema-view-dark .toggle-handle, .json-schema-view.json-schema-view-dark .toggle-handle:hover, json-schema-view[json-schema-view-dark] .toggle-handle, json-schema-view[json-schema-view-dark] .toggle-handle:hover {
text-decoration: none;
color: #eee
}
.json-schema-view.json-schema-view-dark .description, json-schema-view[json-schema-view-dark] .description {
color: gray;
font-style: italic
}
.json-schema-view.json-schema-view-dark .title, .json-schema-view.json-schema-view-dark .title:hover, json-schema-view[json-schema-view-dark] .title, json-schema-view[json-schema-view-dark] .title:hover {
text-decoration: none;
color: #eee
}
.json-schema-view.json-schema-view-dark .brace, .json-schema-view.json-schema-view-dark .bracket, .json-schema-view.json-schema-view-dark .title, json-schema-view[json-schema-view-dark] .brace, json-schema-view[json-schema-view-dark] .bracket, json-schema-view[json-schema-view-dark] .title {
color: #eee
}
.json-schema-view.json-schema-view-dark .property, json-schema-view[json-schema-view-dark] .property {
font-size: 0;
display: table-row
}
.json-schema-view.json-schema-view-dark .property>*, json-schema-view[json-schema-view-dark] .property>* {
font-size: 14px;
padding: .2em
}
.json-schema-view.json-schema-view-dark .name, json-schema-view[json-schema-view-dark] .name {
color: #add8e6;
display: table-cell;
vertical-align: top
}
.json-schema-view.json-schema-view-dark .type, json-schema-view[json-schema-view-dark] .type {
color: #90ee90
}
.json-schema-view.json-schema-view-dark .type-any, json-schema-view[json-schema-view-dark] .type-any {
color: #d4ebf2
}
.json-schema-view.json-schema-view-dark .required, json-schema-view[json-schema-view-dark] .required {
color: #fe0000
}
.json-schema-view.json-schema-view-dark .inner, json-schema-view[json-schema-view-dark] .inner {
padding-left: 18px
}
.json-schema-view.json-schema-view-dark.collapsed .description, .json-schema-view.json-schema-view-dark.collapsed .property, json-schema-view[json-schema-view-dark].collapsed .description, json-schema-view[json-schema-view-dark].collapsed .property {
display: none
}
.json-schema-view.json-schema-view-dark.collapsed .closeing.brace, json-schema-view[json-schema-view-dark].collapsed .closeing.brace {
display: inline-block
}
.json-schema-view.json-schema-view-dark.collapsed .toggle-handle, json-schema-view[json-schema-view-dark].collapsed .toggle-handle {
transform: rotate(-90deg)
}
.exampleStyle {
padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;
}

View File

@ -1 +1 @@
3.0.0-SNAPSHOT
3.1.2-SNAPSHOT

File diff suppressed because one or more lines are too long