pwnstyles_rails 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/pwnstyles_rails/generators/install_generator.rb +12 -2
- data/lib/pwnstyles_rails/generators/layouts/_footer.html.erb +18 -0
- data/lib/pwnstyles_rails/generators/layouts/_header.html.erb +12 -0
- data/lib/pwnstyles_rails/generators/layouts/_menu.html.erb +22 -0
- data/lib/pwnstyles_rails/generators/layouts/_status_bar.html.erb +19 -0
- data/lib/pwnstyles_rails/generators/layouts/application.html.erb +28 -0
- data/lib/pwnstyles_rails/generators/update_generator.rb +11 -5
- data/public/javascripts/pwn-fx.js +160 -0
- data/public/stylesheets/scss/modules/_body.scss +4 -2
- data/pwnstyles_rails.gemspec +8 -2
- metadata +10 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
@@ -6,8 +6,18 @@ module PwnstylesRails
|
|
6
6
|
|
7
7
|
# rails g pwnstyles_rails:install
|
8
8
|
class InstallGenerator < UpdateGenerator
|
9
|
-
def
|
10
|
-
|
9
|
+
def staic_assets
|
10
|
+
copy_static_assets []
|
11
|
+
end
|
12
|
+
|
13
|
+
def layout
|
14
|
+
dir = File.expand_path 'layouts', File.dirname(__FILE__)
|
15
|
+
Dir.glob(File.join(dir, '*'), File::FNM_DOTMATCH).each do |source|
|
16
|
+
next if File.directory?(source)
|
17
|
+
source_file = source[(dir.length + 1)..-1]
|
18
|
+
dest = Rails.root.join 'app', 'views', 'layouts', source_file
|
19
|
+
copy_file source, dest
|
20
|
+
end
|
11
21
|
end
|
12
22
|
end # class PwnstylesRails::AllGenerator
|
13
23
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<nav>
|
2
|
+
<ul>
|
3
|
+
<li>
|
4
|
+
<a href="#">Footer Link</a>
|
5
|
+
<a href="#">Footer Link</a>
|
6
|
+
<a href="#">Footer Link</a>
|
7
|
+
</li>
|
8
|
+
</ul>
|
9
|
+
<p class="copyright">
|
10
|
+
<%= link_to image_tag('cc_by_nd.png', :alt => 'Creative Commons License'),
|
11
|
+
'http://creativecommons.org/licenses/by-nd/3.0/us/' %>
|
12
|
+
© Copyright 2011
|
13
|
+
<a href="#">someone</a>
|
14
|
+
</p>
|
15
|
+
<p class="design">
|
16
|
+
Designed by <a href="http://www.costan.us">Victor Costan</a>
|
17
|
+
</p>
|
18
|
+
</nav>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<nav>
|
2
|
+
<ol>
|
3
|
+
<li>
|
4
|
+
<%= link_to 'Submenu', '#' %>
|
5
|
+
<ol>
|
6
|
+
<li><%= link_to 'Item 1', '#' %></li>
|
7
|
+
<li><%= link_to 'Item 2', '#' %></li>
|
8
|
+
<li><%= link_to 'Item 3', '#' %></li>
|
9
|
+
</ol>
|
10
|
+
</li>
|
11
|
+
<li>
|
12
|
+
<%= link_to 'Action', '#' %>
|
13
|
+
</li>
|
14
|
+
<li>
|
15
|
+
<%= link_to 'username', '#' %>
|
16
|
+
<ol>
|
17
|
+
<li><%= link_to 'Sign out', '#' %></li>
|
18
|
+
<li><%= link_to 'Settings', '#' %></li>
|
19
|
+
</ol>
|
20
|
+
</li>
|
21
|
+
</ol>
|
22
|
+
</nav>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<% if flash[:error] %>
|
2
|
+
<p class="status-bar error" data-pwnfx-reveal-target="status-bar">
|
3
|
+
<%= flash[:error] %>
|
4
|
+
|
5
|
+
<span class="actions">
|
6
|
+
<%= link_to 'Hide', '#', 'data-pwnfx-reveal' => 'status-bar',
|
7
|
+
'data-pwnfx-reveal-trigger' => 'click-hide' %>
|
8
|
+
</span>
|
9
|
+
</p>
|
10
|
+
<% elsif flash[:notice] %>
|
11
|
+
<p class="status-bar notice" data-pwnfx-reveal-target="status-bar">
|
12
|
+
<%= flash[:notice] %>
|
13
|
+
|
14
|
+
<span class="actions">
|
15
|
+
<%= link_to 'Hide', '#', 'data-pwnfx-reveal' => 'status-bar',
|
16
|
+
'data-pwnfx-reveal-trigger' => 'click-hide' %>
|
17
|
+
</span>
|
18
|
+
</p>
|
19
|
+
<% end %>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>App Name</title>
|
5
|
+
<%= csrf_meta_tag %>
|
6
|
+
<%= favicon_link_tag %>
|
7
|
+
<%= stylesheet_link_tag :pwnstyles, :cache => true %>
|
8
|
+
<%= javascript_include_tag :all, :cache => true %>
|
9
|
+
</head>
|
10
|
+
<body>
|
11
|
+
<header>
|
12
|
+
<%= render 'layouts/header' %>
|
13
|
+
</header>
|
14
|
+
|
15
|
+
<div id="real-body">
|
16
|
+
<%= render 'layouts/status_bar' %>
|
17
|
+
<div id="content-wrapper">
|
18
|
+
<article id="main">
|
19
|
+
<%= yield %>
|
20
|
+
</article>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<footer>
|
25
|
+
<%= render 'layouts/footer' %>
|
26
|
+
</footer>
|
27
|
+
</body>
|
28
|
+
</html>
|
@@ -6,21 +6,27 @@ module PwnstylesRails
|
|
6
6
|
|
7
7
|
# rails g pwnstyles_rails:update
|
8
8
|
class UpdateGenerator < Rails::Generators::Base
|
9
|
-
def
|
10
|
-
|
9
|
+
def static_assets
|
10
|
+
copy_static_assets ['scss/vars/_app.scss']
|
11
11
|
end
|
12
12
|
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
|
-
def
|
17
|
-
|
16
|
+
def copy_static_assets(exclude_list = [])
|
17
|
+
copy_dir 'public/stylesheets', 'public/pwnstyles/stylesheets'
|
18
|
+
copy_dir 'public/javascripts', 'public/javascripts'
|
19
|
+
end
|
20
|
+
|
21
|
+
def copy_dir(source_dir, destination_dir, exclude_list = [])
|
22
|
+
dir = File.expand_path File.join('../../..', source_dir),
|
23
|
+
File.dirname(__FILE__)
|
18
24
|
Dir.glob(File.join(dir, '**', '*'), File::FNM_DOTMATCH).each do |source|
|
19
25
|
next if File.directory?(source)
|
20
26
|
source_file = source[(dir.length + 1)..-1]
|
21
27
|
next if exclude_list.include?(source_file)
|
22
28
|
|
23
|
-
dest = Rails.root.join
|
29
|
+
dest = Rails.root.join destination_dir, source_file
|
24
30
|
copy_file source, dest
|
25
31
|
end
|
26
32
|
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
/**
|
2
|
+
* PwnFx: AJAX sprinkles via unobtrusive JavaScript.
|
3
|
+
* @author Victor Costan
|
4
|
+
*
|
5
|
+
* The author sorely misses Rails' AJAX helpers such as observe_field. This
|
6
|
+
* library provides a replacement that adheres to the new philosophy of
|
7
|
+
* unobtrusive JavaScript triggered by HTML5 data- attributes.
|
8
|
+
*/
|
9
|
+
|
10
|
+
|
11
|
+
/** Namespace. */
|
12
|
+
var PwnFx = {};
|
13
|
+
|
14
|
+
/** Wires JS to elements with data-pwnfx attributes. */
|
15
|
+
PwnFx.wireAll = function () {
|
16
|
+
$('[data-pwnfx-move]').each(function (_, element) {
|
17
|
+
PwnFx.wireMove(element);
|
18
|
+
});
|
19
|
+
|
20
|
+
$('[data-pwnfx-refresh-url]').each(function (_, element) {
|
21
|
+
PwnFx.wireRefresh(element);
|
22
|
+
});
|
23
|
+
$('[data-pwnfx-confirm]').each(function (_, element) {
|
24
|
+
PwnFx.wireConfirm(element);
|
25
|
+
});
|
26
|
+
$('[data-pwnfx-reveal]').each(function (_, element) {
|
27
|
+
PwnFx.wireReveal(element);
|
28
|
+
});
|
29
|
+
};
|
30
|
+
|
31
|
+
/** Wires JS to an AJAX refresh element that uses data-pwnfx-refresh-url. */
|
32
|
+
PwnFx.wireRefresh = function (element) {
|
33
|
+
var jElement = $(element);
|
34
|
+
var xhrUrl = jElement.attr('data-pwnfx-refresh-url');
|
35
|
+
jElement.attr('data-pwnfx-refresh-url-done', xhrUrl);
|
36
|
+
jElement.removeAttr('data-pwnfx-refresh-url');
|
37
|
+
|
38
|
+
var targetSelector = '#' + jElement.attr('data-pwnfx-refresh-target');
|
39
|
+
var refreshInterval =
|
40
|
+
parseInt(jElement.attr('data-pwnfx-refresh-ms') || '200');
|
41
|
+
var xhrMethod = jElement.attr('data-pwnfx-refresh-method') || 'POST';
|
42
|
+
var form = $(jElement.parents('form')[0]);
|
43
|
+
var onXhrSuccessFn = function (data) {
|
44
|
+
$(targetSelector).html(data);
|
45
|
+
};
|
46
|
+
var refreshPending = false;
|
47
|
+
var refreshOldValue = null;
|
48
|
+
var ajaxRefreshFn = function () {
|
49
|
+
refreshPending = false;
|
50
|
+
$.ajax({
|
51
|
+
data: form.serialize(), success: onXhrSuccessFn,
|
52
|
+
dataType: 'html', type: xhrMethod, url: xhrUrl
|
53
|
+
});
|
54
|
+
};
|
55
|
+
var onChangeFn = function () {
|
56
|
+
var value = jElement.val();
|
57
|
+
if (value == refreshOldValue) {
|
58
|
+
return;
|
59
|
+
} else {
|
60
|
+
refreshOldValue = value;
|
61
|
+
}
|
62
|
+
if (refreshPending) {
|
63
|
+
return;
|
64
|
+
} else {
|
65
|
+
refreshPending = true;
|
66
|
+
setTimeout(ajaxRefreshFn, refreshInterval);
|
67
|
+
}
|
68
|
+
};
|
69
|
+
|
70
|
+
jElement.bind('change', onChangeFn);
|
71
|
+
jElement.bind('keydown', onChangeFn);
|
72
|
+
jElement.bind('keyup', onChangeFn);
|
73
|
+
onChangeFn();
|
74
|
+
};
|
75
|
+
|
76
|
+
/**
|
77
|
+
* Wires JS to an AJAX confirmation check element using data-pwnfx-confirm.
|
78
|
+
*/
|
79
|
+
PwnFx.wireConfirm = function (element) {
|
80
|
+
var jElement = $(element);
|
81
|
+
var identifier = jElement.attr('data-pwnfx-confirm');
|
82
|
+
var sourceSelector = '[data-pwnfx-confirm="' + identifier + '"]'
|
83
|
+
var winSelector = '[data-pwnfx-confirm-win="' + identifier + '"]';
|
84
|
+
var failSelector = '[data-pwnfx-confirm-fail="' + identifier + '"]';
|
85
|
+
|
86
|
+
var onChangeFn = function () {
|
87
|
+
var value = null;
|
88
|
+
var matching = true;
|
89
|
+
$(sourceSelector).each(function (index, element) {
|
90
|
+
var val = $(element).val();
|
91
|
+
value = value || val;
|
92
|
+
if (value != val) {
|
93
|
+
matching = false;
|
94
|
+
}
|
95
|
+
if (matching) {
|
96
|
+
$(winSelector).removeClass('hidden');
|
97
|
+
$(failSelector).addClass('hidden');
|
98
|
+
} else {
|
99
|
+
$(winSelector).addClass('hidden');
|
100
|
+
$(failSelector).removeClass('hidden');
|
101
|
+
}
|
102
|
+
});
|
103
|
+
};
|
104
|
+
jElement.bind('change', onChangeFn);
|
105
|
+
jElement.bind('keydown', onChangeFn);
|
106
|
+
jElement.bind('keyup', onChangeFn);
|
107
|
+
onChangeFn();
|
108
|
+
};
|
109
|
+
|
110
|
+
/** Moves an element using data-pwnfx-move. */
|
111
|
+
PwnFx.wireMove = function (element) {
|
112
|
+
var jElement = $(element);
|
113
|
+
var identifier = jElement.attr('data-pwnfx-move');
|
114
|
+
jElement.attr('data-pwnfx-move-done', identifier);
|
115
|
+
jElement.removeAttr('data-pwnfx-move');
|
116
|
+
|
117
|
+
var targetSelector = '[data-pwnfx-move-target="' + identifier + '"]';
|
118
|
+
var jTarget = $(targetSelector).first();
|
119
|
+
jElement.detach();
|
120
|
+
jTarget.append(jElement);
|
121
|
+
};
|
122
|
+
|
123
|
+
/** Wires JS to an AJAX show/hide trigger using data-pwnfx-reveal. */
|
124
|
+
PwnFx.wireReveal = function (element) {
|
125
|
+
var jElement = $(element);
|
126
|
+
var identifier = jElement.attr('data-pwnfx-reveal');
|
127
|
+
jElement.attr('data-pwnfx-reveal-done', identifier);
|
128
|
+
jElement.removeAttr('data-pwnfx-reveal');
|
129
|
+
|
130
|
+
var trigger = jElement.attr('data-pwnfx-reveal-trigger') || 'click';
|
131
|
+
var showOnCheck = true;
|
132
|
+
if (trigger == 'uncheck') {
|
133
|
+
trigger = 'check';
|
134
|
+
showOnCheck = false;
|
135
|
+
} else if (trigger == 'click-hide') {
|
136
|
+
trigger = 'click';
|
137
|
+
showOnCheck = false;
|
138
|
+
}
|
139
|
+
var targetSelector = '[data-pwnfx-reveal-target="' + identifier + '"]';
|
140
|
+
|
141
|
+
var onChangeFn = function () {
|
142
|
+
var checked = (trigger == 'click') || jElement.is(':checked');
|
143
|
+
var willShow = (checked == showOnCheck);
|
144
|
+
if (willShow) {
|
145
|
+
$(targetSelector).removeClass('hidden');
|
146
|
+
} else {
|
147
|
+
$(targetSelector).addClass('hidden');
|
148
|
+
}
|
149
|
+
};
|
150
|
+
|
151
|
+
if (trigger == 'click') {
|
152
|
+
jElement.bind('click', onChangeFn);
|
153
|
+
} else if (trigger = 'check') {
|
154
|
+
jElement.bind('change', onChangeFn);
|
155
|
+
onChangeFn();
|
156
|
+
}
|
157
|
+
};
|
158
|
+
|
159
|
+
// Wire JS to elements when the document is loaded.
|
160
|
+
$(PwnFx.wireAll);
|
data/pwnstyles_rails.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{pwnstyles_rails}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Victor Costan"]
|
12
|
-
s.date = %q{2011-04-
|
12
|
+
s.date = %q{2011-04-26}
|
13
13
|
s.description = %q{Included CSS was designed for reuse across pwnb.us apps.}
|
14
14
|
s.email = %q{victor@costan.us}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -29,7 +29,13 @@ Gem::Specification.new do |s|
|
|
29
29
|
"lib/pwnstyles_rails.rb",
|
30
30
|
"lib/pwnstyles_rails/engine.rb",
|
31
31
|
"lib/pwnstyles_rails/generators/install_generator.rb",
|
32
|
+
"lib/pwnstyles_rails/generators/layouts/_footer.html.erb",
|
33
|
+
"lib/pwnstyles_rails/generators/layouts/_header.html.erb",
|
34
|
+
"lib/pwnstyles_rails/generators/layouts/_menu.html.erb",
|
35
|
+
"lib/pwnstyles_rails/generators/layouts/_status_bar.html.erb",
|
36
|
+
"lib/pwnstyles_rails/generators/layouts/application.html.erb",
|
32
37
|
"lib/pwnstyles_rails/generators/update_generator.rb",
|
38
|
+
"public/javascripts/pwn-fx.js",
|
33
39
|
"public/stylesheets/.gitignore",
|
34
40
|
"public/stylesheets/scss/generic/_controls.scss",
|
35
41
|
"public/stylesheets/scss/generic/_links.scss",
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pwnstyles_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Victor Costan
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-04-
|
18
|
+
date: 2011-04-26 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
requirement: &id001 !ruby/object:Gem::Requirement
|
@@ -131,7 +131,13 @@ files:
|
|
131
131
|
- lib/pwnstyles_rails.rb
|
132
132
|
- lib/pwnstyles_rails/engine.rb
|
133
133
|
- lib/pwnstyles_rails/generators/install_generator.rb
|
134
|
+
- lib/pwnstyles_rails/generators/layouts/_footer.html.erb
|
135
|
+
- lib/pwnstyles_rails/generators/layouts/_header.html.erb
|
136
|
+
- lib/pwnstyles_rails/generators/layouts/_menu.html.erb
|
137
|
+
- lib/pwnstyles_rails/generators/layouts/_status_bar.html.erb
|
138
|
+
- lib/pwnstyles_rails/generators/layouts/application.html.erb
|
134
139
|
- lib/pwnstyles_rails/generators/update_generator.rb
|
140
|
+
- public/javascripts/pwn-fx.js
|
135
141
|
- public/stylesheets/.gitignore
|
136
142
|
- public/stylesheets/scss/generic/_controls.scss
|
137
143
|
- public/stylesheets/scss/generic/_links.scss
|