argon_admin 0.1.0

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 (44) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +42 -0
  3. data/lib/argon_admin.rb +7 -0
  4. data/lib/argon_admin/engine.rb +8 -0
  5. data/lib/argon_admin/version.rb +3 -0
  6. data/lib/generators/argon_admin_generator.rb +83 -0
  7. data/lib/tasks/argon_admin_tasks.rake +15 -0
  8. data/lib/templates/assets/images/admin/blue.png +0 -0
  9. data/lib/templates/assets/images/admin/favicon.png +0 -0
  10. data/lib/templates/assets/images/admin/team-1-800x800.jpg +0 -0
  11. data/lib/templates/assets/images/admin/white.png +0 -0
  12. data/lib/templates/assets/javascripts/admin.js +5 -0
  13. data/lib/templates/assets/stylesheets/admin.scss +4 -0
  14. data/lib/templates/controllers/base_admin_controller.rb +4 -0
  15. data/lib/templates/controllers/pages_controller.rb +4 -0
  16. data/lib/templates/controllers/users_controller.rb +44 -0
  17. data/lib/templates/layouts/admin.html.erb +26 -0
  18. data/lib/templates/layouts/devise.html.erb +26 -0
  19. data/lib/templates/views/kaminari/_gap.html.erb +1 -0
  20. data/lib/templates/views/kaminari/_next_page.html.erb +8 -0
  21. data/lib/templates/views/kaminari/_page.html.erb +3 -0
  22. data/lib/templates/views/kaminari/_paginator.html.erb +17 -0
  23. data/lib/templates/views/kaminari/_prev_page.html.erb +8 -0
  24. data/lib/templates/views/pages/dashboard.html.erb +228 -0
  25. data/lib/templates/views/sessions/new.html.erb +18 -0
  26. data/lib/templates/views/shared/_alert.html.erb +8 -0
  27. data/lib/templates/views/shared/_footer.html.erb +25 -0
  28. data/lib/templates/views/shared/_header.html.erb +7 -0
  29. data/lib/templates/views/shared/_navbar.html.erb +43 -0
  30. data/lib/templates/views/shared/_sidebar.html.erb +103 -0
  31. data/lib/templates/views/users/_user-form.html.erb +11 -0
  32. data/lib/templates/views/users/_user.html.erb +9 -0
  33. data/lib/templates/views/users/edit.html.erb +26 -0
  34. data/lib/templates/views/users/index.html.erb +42 -0
  35. data/lib/templates/views/users/new.html.erb +23 -0
  36. data/vendor/assets/fonts/nucleo-icons.eot +0 -0
  37. data/vendor/assets/fonts/nucleo-icons.svg +312 -0
  38. data/vendor/assets/fonts/nucleo-icons.ttf +0 -0
  39. data/vendor/assets/fonts/nucleo-icons.woff +0 -0
  40. data/vendor/assets/fonts/nucleo-icons.woff2 +0 -0
  41. data/vendor/assets/javascripts/argon-admin.js +51 -0
  42. data/vendor/assets/stylesheets/argon-admin.css +17 -0
  43. data/vendor/assets/stylesheets/nucleo.css +572 -0
  44. metadata +200 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c891dd162a61bb9d0299259487d9e036afb9ef0761d035754b1d335a5a28a236
4
+ data.tar.gz: c110fe882dd220994e113ca3ad6c39bd14044eca9e25e4d975d74cfcf47ae740
5
+ SHA512:
6
+ metadata.gz: 84dbafd0b95268146559cf6155c01a2ed9fc146ffa0438a9d72124fc975b933acc6bac9c1d5431b1aab86aff4525bff9b24677de5258c2fbaf73180f7b63432b
7
+ data.tar.gz: b230a0608f55b2e54de1e5eb2fc93f872f1ef8af690c943796f87555a370b998ccbb8b109e56ba461f4e00153fca24559b5482f35212009ffc82e6d95ee5a00f
@@ -0,0 +1,42 @@
1
+ # ArgonAdmin
2
+
3
+ Simple admin panel generator with the [Argon Dashboard theme](https://github.com/creativetimofficial/argon-dashboard) for your new project.
4
+
5
+ ![](https://i.ibb.co/DGHc4Q0/argon-dashboard.jpg)
6
+
7
+ Main features included by default:
8
+
9
+ - Authentication with [Devise](https://github.com/plataformatec/devise).
10
+ - [Argon Dashboard theme](https://github.com/creativetimofficial/argon-dashboard) theme included for the admin panel.
11
+ - ERB template engine.
12
+ - Pagination with [Kaminari](https://github.com/kaminari/kaminari)
13
+ - [Simple form](https://github.com/plataformatec/simple_form) integration
14
+ - Сustomized flash messages
15
+
16
+ ## Installation
17
+
18
+ Add this line to your application's Gemfile:
19
+
20
+ ```ruby
21
+ gem 'argon_admin'
22
+ ```
23
+ And then execute:
24
+
25
+ $ bundle i
26
+
27
+ Next, you need to run the generator:
28
+
29
+ $ rails argon_admin:install
30
+
31
+ Generate devise user:
32
+
33
+ $ rails db:migrate
34
+ $ rails db:seed
35
+
36
+ And you're ready to go. Test if all it's ok by starting a server and check it with rails s.
37
+
38
+ Default admin user with email admin@example.com and password 123456789
39
+
40
+ ## Contributing
41
+
42
+ Bug reports and pull requests are welcome on GitHub at https://github.com/zelen-sv/argon_admin.
@@ -0,0 +1,7 @@
1
+ require "argon_admin/version"
2
+
3
+ module ArgonAdmin
4
+ module Rails
5
+ require "argon_admin/engine"
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ class Engine < ::Rails::Engine
2
+ require "jquery-rails"
3
+ require "bootstrap"
4
+ require "font-awesome-rails"
5
+ require "devise"
6
+ require "simple_form"
7
+ require "kaminari"
8
+ end
@@ -0,0 +1,3 @@
1
+ module ArgonAdmin
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,83 @@
1
+ class ArgonAdminGenerator < Rails::Generators::Base
2
+ include Singleton
3
+ source_root File.expand_path("../templates", __dir__)
4
+
5
+ ROUTES_TEXT = <<-RUBY
6
+ namespace :admin do
7
+ root 'pages#dashboard'
8
+ resources :users
9
+ end
10
+ RUBY
11
+
12
+ HELPER_TEXT = <<-RUBY
13
+ def flash_class(level)
14
+ case level.to_sym
15
+ when :notice then "alert alert-primary"
16
+ when :success then "alert alert-success"
17
+ when :error then "alert alert-danger"
18
+ when :alert then "alert alert-warning"
19
+ end
20
+ end
21
+ RUBY
22
+
23
+ ASSETS_TEXT = <<-RUBY
24
+ Rails.application.config.assets.precompile += %w( admin.js admin.scss )
25
+ Rails.application.config.assets.precompile << /\.(?:svg|eot|woff|ttf)\z/
26
+ RUBY
27
+
28
+ def generate_assets
29
+ copy_file "assets/stylesheets/admin.scss", "app/assets/stylesheets/admin.scss"
30
+ copy_file "assets/javascripts/admin.js", "app/assets/javascripts/admin.js"
31
+ directory "assets/images/admin", "app/assets/images/admin"
32
+ append_to_file 'config/initializers/assets.rb' do
33
+ ASSETS_TEXT
34
+ end
35
+ end
36
+
37
+ def generate_views
38
+ directory "layouts", "app/views/layouts"
39
+ directory "views/pages", "app/views/admin/pages"
40
+ directory "views/users", "app/views/admin/users"
41
+ directory "views/shared", "app/views/admin/shared"
42
+ directory "views/sessions", "app/views/devise/sessions"
43
+ directory "views/kaminari", "app/views/kaminari"
44
+ end
45
+
46
+ def generate_admin_data
47
+ insert_into_file "config/routes.rb", after: "Rails.application.routes.draw do\n" do
48
+ ROUTES_TEXT
49
+ end
50
+ insert_into_file "app/helpers/application_helper.rb", after: "module ApplicationHelper\n" do
51
+ HELPER_TEXT
52
+ end
53
+ directory "controllers", "app/controllers/admin/"
54
+ end
55
+
56
+ def generate_devise_data
57
+ add_secret_key
58
+ update_development_mailer_config
59
+ update_seeds_file
60
+ end
61
+
62
+ private
63
+
64
+ def add_secret_key
65
+ secret = SecureRandom.hex(64)
66
+ insert_into_file "config/initializers/devise.rb", after: "Devise.setup do |config|\n" do
67
+ "config.secret_key = '#{secret}'"
68
+ end
69
+ gsub_file('config/initializers/devise.rb', "config.sign_out_via = :delete", "config.sign_out_via = :get")
70
+ end
71
+
72
+ def update_development_mailer_config
73
+ insert_into_file "config/environments/development.rb", after: "Rails.application.configure do\n" do
74
+ "config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }\n"
75
+ end
76
+ end
77
+
78
+ def update_seeds_file
79
+ append_to_file 'db/seeds.rb' do
80
+ "User.create!(email: 'admin@example.com', password: '123456789', password_confirmation: '123456789')"
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,15 @@
1
+ require 'generators/argon_admin_generator'
2
+
3
+ namespace :argon_admin do
4
+ desc 'Generate admin panel'
5
+ task :install do
6
+ generator = ArgonAdminGenerator.instance
7
+ generator.generate_assets
8
+ generator.generate_views
9
+ generator.generate_admin_data
10
+ system "rails generate simple_form:install --bootstrap"
11
+ system "rails generate devise:install"
12
+ generator.generate_devise_data
13
+ system "rails generate devise user"
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ //= require jquery
2
+ //= require jquery_ujs
3
+ //= require popper
4
+ //= require bootstrap-sprockets
5
+ //= require argon-admin
@@ -0,0 +1,4 @@
1
+ @import "bootstrap";
2
+ @import "nucleo";
3
+ @import "font-awesome";
4
+ @import "argon-admin";
@@ -0,0 +1,4 @@
1
+ class Admin::BaseAdminController < ApplicationController
2
+ layout 'admin'
3
+ before_action :authenticate_user!
4
+ end
@@ -0,0 +1,4 @@
1
+ class Admin::PagesController < Admin::BaseAdminController
2
+ def dashboard
3
+ end
4
+ end
@@ -0,0 +1,44 @@
1
+ class Admin::UsersController < Admin::BaseAdminController
2
+ before_action :set_user, only: [:edit, :update, :destroy]
3
+
4
+ def new
5
+ @user = User.new
6
+ end
7
+
8
+ def index
9
+ @users = User.order(created_at: :desc).page(params[:page]).per(6)
10
+ end
11
+
12
+ def edit
13
+ end
14
+
15
+ def update
16
+ return redirect_to admin_users_path if @user.update(user_params)
17
+ flash.now[:error] = 'Failed to update user!'
18
+ render 'edit'
19
+ end
20
+
21
+ def create
22
+ @user = User.new(user_params)
23
+
24
+ return redirect_to admin_users_path if @user.save
25
+ flash.now[:error] = 'Failed to create user!'
26
+ render 'new'
27
+ end
28
+
29
+ def destroy
30
+ @user.destroy
31
+ flash[:error] = 'User destroyed'
32
+ redirect_to admin_users_path
33
+ end
34
+
35
+ private
36
+
37
+ def set_user
38
+ @user = User.find(params[:id])
39
+ end
40
+
41
+ def user_params
42
+ params.require(:user).permit(:email, :password, :password_confirmation)
43
+ end
44
+ end
@@ -0,0 +1,26 @@
1
+ <!doctype html>
2
+ <html class="no-js h-100">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
6
+ <title>Admin panel</title>
7
+
8
+ <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet">
9
+
10
+ <%= csrf_meta_tags %>
11
+ <%= stylesheet_link_tag 'admin', media: 'all', 'data-turbolinks-track': 'reload' %>
12
+ </head>
13
+ <body>
14
+ <%= render 'admin/shared/sidebar' %>
15
+ <div class="main-content">
16
+ <%= render 'admin/shared/navbar' %>
17
+ <%= render 'admin/shared/header' %>
18
+ <div class="container-fluid mt--7">
19
+ <%= render 'admin/shared/alert' %>
20
+ <%= yield %>
21
+ <%= render 'admin/shared/footer' %>
22
+ </div>
23
+ </div>
24
+ </body>
25
+ <%= javascript_include_tag 'admin' %>
26
+ </html>
@@ -0,0 +1,26 @@
1
+ <!doctype html>
2
+ <html class="no-js h-100">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
6
+ <title>Admin panel | Login</title>
7
+
8
+ <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet">
9
+
10
+ <%= csrf_meta_tags %>
11
+ <%= stylesheet_link_tag 'admin', media: 'all', 'data-turbolinks-track': 'reload' %>
12
+ </head>
13
+ <body class="bg-default">
14
+ <div class="main-content">
15
+ <div class="container mt-4 pb-5">
16
+ <div class="row justify-content-center">
17
+ <div class="col-lg-5 col-md-7">
18
+ <%= yield %>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ </div>
23
+ </body>
24
+ <%= javascript_include_tag 'admin' %>
25
+ </html>
26
+
@@ -0,0 +1 @@
1
+ <span class="page-item gap"><%= "&hellip;".html_safe %></span>
@@ -0,0 +1,8 @@
1
+ <% unless current_page.last? %>
2
+ <span class="page-item">
3
+ <%= link_to url, rel: 'next', remote: remote, class: "page-link" do %>
4
+ <i class="fa fa-angle-right"></i>
5
+ <span class="sr-only">Next</span>
6
+ <% end %>
7
+ </span>
8
+ <% end %>
@@ -0,0 +1,3 @@
1
+ <li class="page-item<%= ' active' if page.current? %>">
2
+ <%= link_to page, url, {remote: remote, rel: page.rel, class: "page-link"} %>
3
+ </li>
@@ -0,0 +1,17 @@
1
+ <%= paginator.render do -%>
2
+ <nav>
3
+ <ul class="pagination justify-content-end" role="navigation" aria-label="pager">
4
+ <%= prev_page_tag unless current_page.first? %>
5
+ <% each_page do |page| -%>
6
+ <% if page.display_tag? -%>
7
+ <%= page_tag page %>
8
+ <% elsif !page.was_truncated? -%>
9
+ <%= gap_tag %>
10
+ <% end -%>
11
+ <% end -%>
12
+ <% unless current_page.out_of_range? %>
13
+ <%= next_page_tag unless current_page.last? %>
14
+ <% end %>
15
+ </ul>
16
+ </nav>
17
+ <% end -%>
@@ -0,0 +1,8 @@
1
+ <% unless current_page.first? %>
2
+ <span class="page-item">
3
+ <%= link_to url, rel: 'prev', remote: remote, class: "page-link" do %>
4
+ <i class="fa fa-angle-left"></i>
5
+ <span class="sr-only">Previous</span>
6
+ <% end %>
7
+ </span>
8
+ <% end %>
@@ -0,0 +1,228 @@
1
+ <% content_for :header_body do %>
2
+ <div class="container">
3
+ <div class="col-lg-7 col-md-10">
4
+ <h1 class="display-2 text-white">Hello Admin</h1>
5
+ <p class="text-white mt-0 mb-5">This is your dashboard page.</p>
6
+ </div>
7
+ </div>
8
+ <% end %>
9
+
10
+ <div class="row">
11
+ <div class="col">
12
+ <div class="card shadow">
13
+ <div class="card-header border-0">
14
+ <h3 class="mb-0">Example projects table</h3>
15
+ </div>
16
+ <div class="table-responsive">
17
+ <table class="table align-items-center table-flush">
18
+ <thead class="thead-light">
19
+ <tr>
20
+ <th scope="col">Project</th>
21
+ <th scope="col">Budget</th>
22
+ <th scope="col">Status</th>
23
+ <th scope="col">Completion</th>
24
+ <th scope="col">Actions</th>
25
+ </tr>
26
+ </thead>
27
+ <tbody>
28
+ <tr>
29
+ <th scope="row">
30
+ <div class="media align-items-center">
31
+ <div class="media-body">
32
+ <span class="mb-0 text-sm">Project №1</span>
33
+ </div>
34
+ </div>
35
+ </th>
36
+ <td>
37
+ $2,500 USD
38
+ </td>
39
+ <td>
40
+ <span class="badge badge-dot mr-4">
41
+ <i class="bg-warning"></i> pending
42
+ </span>
43
+ </td>
44
+ <td>
45
+ <div class="d-flex align-items-center">
46
+ <span class="mr-2">60%</span>
47
+ <div>
48
+ <div class="progress">
49
+ <div class="progress-bar bg-warning" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;"></div>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </td>
54
+ <td class="text-right">
55
+ <div class="dropdown">
56
+ <a class="btn btn-sm btn-icon-only text-light" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
57
+ <i class="fa fa-ellipsis-v"></i>
58
+ </a>
59
+ <div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
60
+ <a class="dropdown-item" href="#">Action</a>
61
+ <a class="dropdown-item" href="#">Another action</a>
62
+ <a class="dropdown-item" href="#">Something else here</a>
63
+ </div>
64
+ </div>
65
+ </td>
66
+ </tr>
67
+ <tr>
68
+ <th scope="row">
69
+ <div class="media align-items-center">
70
+ <div class="media-body">
71
+ <span class="mb-0 text-sm">Project №2</span>
72
+ </div>
73
+ </div>
74
+ </th>
75
+ <td>
76
+ $1,800 USD
77
+ </td>
78
+ <td>
79
+ <span class="badge badge-dot">
80
+ <i class="bg-success"></i> completed
81
+ </span>
82
+ </td>
83
+ <td>
84
+ <div class="d-flex align-items-center">
85
+ <span class="mr-2">100%</span>
86
+ <div>
87
+ <div class="progress">
88
+ <div class="progress-bar bg-success" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%;"></div>
89
+ </div>
90
+ </div>
91
+ </div>
92
+ </td>
93
+ <td class="text-right">
94
+ <div class="dropdown">
95
+ <a class="btn btn-sm btn-icon-only text-light" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
96
+ <i class="fa fa-ellipsis-v"></i>
97
+ </a>
98
+ <div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
99
+ <a class="dropdown-item" href="#">Action</a>
100
+ <a class="dropdown-item" href="#">Another action</a>
101
+ <a class="dropdown-item" href="#">Something else here</a>
102
+ </div>
103
+ </div>
104
+ </td>
105
+ </tr>
106
+ <tr>
107
+ <th scope="row">
108
+ <div class="media align-items-center">
109
+ <div class="media-body">
110
+ <span class="mb-0 text-sm">Project №3</span>
111
+ </div>
112
+ </div>
113
+ </th>
114
+ <td>
115
+ $3,150 USD
116
+ </td>
117
+ <td>
118
+ <span class="badge badge-dot mr-4">
119
+ <i class="bg-danger"></i> delayed
120
+ </span>
121
+ </td>
122
+ <td>
123
+ <div class="d-flex align-items-center">
124
+ <span class="mr-2">73%</span>
125
+ <div>
126
+ <div class="progress">
127
+ <div class="progress-bar bg-danger" role="progressbar" aria-valuenow="73" aria-valuemin="0" aria-valuemax="100" style="width: 73%;"></div>
128
+ </div>
129
+ </div>
130
+ </div>
131
+ </td>
132
+ <td class="text-right">
133
+ <div class="dropdown">
134
+ <a class="btn btn-sm btn-icon-only text-light" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
135
+ <i class="fa fa-ellipsis-v"></i>
136
+ </a>
137
+ <div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
138
+ <a class="dropdown-item" href="#">Action</a>
139
+ <a class="dropdown-item" href="#">Another action</a>
140
+ <a class="dropdown-item" href="#">Something else here</a>
141
+ </div>
142
+ </div>
143
+ </td>
144
+ </tr>
145
+ <tr>
146
+ <th scope="row">
147
+ <div class="media align-items-center">
148
+ <div class="media-body">
149
+ <span class="mb-0 text-sm">Project №4</span>
150
+ </div>
151
+ </div>
152
+ </th>
153
+ <td>
154
+ $4,400 USD
155
+ </td>
156
+ <td>
157
+ <span class="badge badge-dot">
158
+ <i class="bg-info"></i> on schedule
159
+ </span>
160
+ </td>
161
+ <td>
162
+ <div class="d-flex align-items-center">
163
+ <span class="mr-2">90%</span>
164
+ <div>
165
+ <div class="progress">
166
+ <div class="progress-bar bg-info" role="progressbar" aria-valuenow="90" aria-valuemin="0" aria-valuemax="100" style="width: 90%;"></div>
167
+ </div>
168
+ </div>
169
+ </div>
170
+ </td>
171
+ <td class="text-right">
172
+ <div class="dropdown">
173
+ <a class="btn btn-sm btn-icon-only text-light" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
174
+ <i class="fa fa-ellipsis-v"></i>
175
+ </a>
176
+ <div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
177
+ <a class="dropdown-item" href="#">Action</a>
178
+ <a class="dropdown-item" href="#">Another action</a>
179
+ <a class="dropdown-item" href="#">Something else here</a>
180
+ </div>
181
+ </div>
182
+ </td>
183
+ </tr>
184
+ <tr>
185
+ <th scope="row">
186
+ <div class="media align-items-center">
187
+ <div class="media-body">
188
+ <span class="mb-0 text-sm">Project №5</span>
189
+ </div>
190
+ </div>
191
+ </th>
192
+ <td>
193
+ $2,200 USD
194
+ </td>
195
+ <td>
196
+ <span class="badge badge-dot mr-4">
197
+ <i class="bg-success"></i> completed
198
+ </span>
199
+ </td>
200
+ <td>
201
+ <div class="d-flex align-items-center">
202
+ <span class="mr-2">100%</span>
203
+ <div>
204
+ <div class="progress">
205
+ <div class="progress-bar bg-success" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%;"></div>
206
+ </div>
207
+ </div>
208
+ </div>
209
+ </td>
210
+ <td class="text-right">
211
+ <div class="dropdown">
212
+ <a class="btn btn-sm btn-icon-only text-light" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
213
+ <i class="fa fa-ellipsis-v"></i>
214
+ </a>
215
+ <div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
216
+ <a class="dropdown-item" href="#">Action</a>
217
+ <a class="dropdown-item" href="#">Another action</a>
218
+ <a class="dropdown-item" href="#">Something else here</a>
219
+ </div>
220
+ </div>
221
+ </td>
222
+ </tr>
223
+ </tbody>
224
+ </table>
225
+ </div>
226
+ </div>
227
+ </div>
228
+ </div>