У меня есть приложение Rails 3 (не 3.1), работающее с внешним интерфейсом Ext JS 4, которое генерирует таблицы стилей непосредственно из тем SASS по умолчанию. Я использую Jammit для конвейера активов, но это не должно быть практически никакой разницей при работе с Sprockets , поскольку работа выполняется в обоих случаях Compass .
Сначала убедитесь, что у вас установлен Compass, поместив его в Gemfile
:
gem 'compass'
Compass объявил гем sass
как зависимость, поэтому нет необходимости объявлять его. Теперь вам нужно собрать Gem и инициализировать Compass:
$ bundle
$ compass init rails
Затем я создал папку public/resources/scss
, куда я помещаю все файлы SCSS. В этой папке у меня есть файл SCSS основного приложения application.scss
, который включает в себя все необходимые модули Compass и дополнительные части:
$theme-name: 'default';
@import 'compass/css3';
@import 'partials/ext4';
@import 'partials/sprites';
@import 'partials/fonts';
Затем я скопировал все файлы темы Ext 4 SASS в public/resources/scss/ext4/default
и создал другую папку public/resources/scss/partials
, в которую я поместил все свои пользовательские партиции SCSS и файл инициализации Ext 4 _ext4.scss
:
$include-default: true;
@import 'ext4/default/all';
Тогда это правильное место для установки некоторых переменных Compass, которые используются Ext 4. Вот несколько примеров для стилизации темы, скопированных непосредственно из файлов Ext 4 SASS:
/**
* @var {string} $font-family
* The default font-family to be used throughout the theme.
*
* @var {string} $base-gradient
* The base gradient to be used throughout the theme.
*
* @var {color} $base-color
* The base color to be used throughout the theme.
*
* @var {color} $css-shadow-background-color
* The base color for CSS shadows
*/
Теперь у вас есть практически все:
- Файл SASS глобального приложения
- Ext JS 4 theme
- Пользовательские партиалы
Но не хватает последней части: в Ext 4 есть несколько пользовательских функций Compass, которые должны быть на месте. Этот файл находится в платформе Ext JS 4 под resources/themes/lib/utils.rb
. Поскольку исходный файл не работал "из коробки" с моим способом организации файлов, я просто изменил его для своих нужд и поместил прямо в файл инициализации Compass config/compass.rb
:
project_type = :rails
project_path = Compass::AppIntegration::Rails.root
environment = Compass::AppIntegration::Rails.env
http_path = "/"
http_images_path = "/resources/images"
sass_dir = "public/resources/scss"
css_dir = "public/resources/css"
images_dir = "public/resources/images"
# File copied from ext-4.0.2a/resources/themes/lib/utils.rb
#
module ExtJS4
module SassExtensions
module Functions
module Utils
def parsebox(list, n)
assert_type n, :Number
if !n.int?
raise ArgumentError.new("List index #{n} must be an integer")
elsif n.to_i < 1
raise ArgumentError.new("List index #{n} must be greater than or equal to 1")
elsif n.to_i > 4
raise ArgumentError.new("A box string can't contain more then 4")
end
new_list = list.clone.to_a
size = new_list.size
if n.to_i >= size
if size == 1
new_list[1] = new_list[0]
new_list[2] = new_list[0]
new_list[3] = new_list[0]
elsif size == 2
new_list[2] = new_list[0]
new_list[3] = new_list[1]
elsif size == 3
new_list[3] = new_list[1]
end
end
new_list.to_a[n.to_i - 1]
end
def parseint(value)
Sass::Script::Number.new(value.to_i)
end
# Returns a background-image property for a specified images for the theme
def theme_image(theme, path, without_url = false, relative = false)
without_url = (without_url.class == FalseClass) ? without_url : without_url.value
if !without_url
url = "url('/resources/images/ext4/#{ theme.value }/#{ path.value }')"
else
url = "/resources/images/ext4/#{ theme.value }/#{ path.value }"
end
Sass::Script::String.new(url)
end
def theme_image_exists(path)
result = false
where_to_look = File.join(Rails.root, 'public') + path.value.gsub('../../resources', 'resources')
if where_to_look && FileTest.exists?("#{where_to_look}")
result = true
end
Sass::Script::Bool.new(result)
end
end
end
end
end
module Sass::Script::Functions
include ExtJS4::SassExtensions::Functions::Utils
end
Теперь вы можете устанавливать переменные Ext 4 в вашем партиале, и весь CSS для ваших пользовательских настроек генерируется на лету, и только все приятные функции Compass, такие как Sprites .