archetype 0.0.1.pre.13 → 1.0.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +97 -24
- data/README.md +11 -5
- data/VERSION +1 -0
- data/lib/archetype.rb +30 -18
- data/lib/archetype/actions/migrate.rb +152 -0
- data/lib/archetype/actions/theme.rb +6 -7
- data/lib/archetype/executor.rb +21 -7
- data/lib/archetype/extensions.rb +57 -0
- data/lib/archetype/functions.rb +2 -3
- data/lib/archetype/functions/css.rb +70 -0
- data/lib/archetype/functions/css/constants.rb +247 -0
- data/lib/archetype/functions/css/helpers.rb +265 -0
- data/lib/archetype/functions/css/routers.rb +28 -0
- data/lib/archetype/functions/css/routers/animation.rb +55 -0
- data/lib/archetype/functions/css/routers/background.rb +38 -0
- data/lib/archetype/functions/css/routers/border.rb +151 -0
- data/lib/archetype/functions/css/routers/list.rb +63 -0
- data/lib/archetype/functions/css/routers/margin_padding.rb +40 -0
- data/lib/archetype/functions/css/routers/outline.rb +56 -0
- data/lib/archetype/functions/css/routers/overflow.rb +11 -0
- data/lib/archetype/functions/css/routers/target.rb +38 -0
- data/lib/archetype/functions/css/routers/transition.rb +48 -0
- data/lib/archetype/functions/css/shorthands.rb +43 -0
- data/lib/archetype/functions/css/shorthands/animation.rb +18 -0
- data/lib/archetype/functions/css/shorthands/background.rb +68 -0
- data/lib/archetype/functions/css/shorthands/border.rb +102 -0
- data/lib/archetype/functions/hash.rb +3 -149
- data/lib/archetype/functions/hash/extend.rb +74 -0
- data/lib/archetype/functions/hash/shim.rb +48 -0
- data/lib/archetype/functions/helpers.rb +231 -22
- data/lib/archetype/functions/styleguide_memoizer.rb +18 -1
- data/lib/archetype/sass_extensions.rb +1 -3
- data/lib/archetype/sass_extensions/functions.rb +15 -1
- data/lib/archetype/sass_extensions/functions/environment.rb +152 -1
- data/lib/archetype/sass_extensions/functions/lists.rb +95 -45
- data/lib/archetype/sass_extensions/functions/locale.rb +107 -28
- data/lib/archetype/sass_extensions/functions/numbers.rb +118 -4
- data/lib/archetype/sass_extensions/functions/strings.rb +53 -0
- data/lib/archetype/sass_extensions/functions/styleguide.rb +43 -375
- data/lib/archetype/sass_extensions/functions/styleguide/components.rb +25 -0
- data/lib/archetype/sass_extensions/functions/styleguide/constants.rb +27 -0
- data/lib/archetype/sass_extensions/functions/styleguide/grammar.rb +80 -0
- data/lib/archetype/sass_extensions/functions/styleguide/helpers.rb +36 -0
- data/lib/archetype/sass_extensions/functions/styleguide/resolve.rb +159 -0
- data/lib/archetype/sass_extensions/functions/styleguide/styles.rb +146 -0
- data/lib/archetype/sass_extensions/functions/styleguide/themes.rb +40 -0
- data/lib/archetype/sass_extensions/functions/ui.rb +7 -57
- data/lib/archetype/sass_extensions/functions/ui/glyphs.rb +118 -0
- data/lib/archetype/sass_extensions/functions/ui/scopes.rb +96 -0
- data/lib/archetype/sass_extensions/functions/util.rb +14 -0
- data/lib/archetype/sass_extensions/functions/util/debug.rb +22 -0
- data/lib/archetype/sass_extensions/functions/util/hacks.rb +44 -0
- data/lib/archetype/sass_extensions/functions/util/images.rb +132 -0
- data/lib/archetype/sass_extensions/functions/util/misc.rb +220 -0
- data/lib/archetype/sass_extensions/functions/util/spacing.rb +83 -0
- data/lib/archetype/sass_extensions/functions/version.rb +12 -17
- data/lib/archetype/version.rb +1 -1
- data/stylesheets/archetype/_config.scss +1 -389
- data/stylesheets/archetype/_core.scss +15 -0
- data/stylesheets/archetype/_hacks.scss +4 -120
- data/stylesheets/archetype/_init.scss +4 -22
- data/stylesheets/archetype/_required.scss +3 -0
- data/stylesheets/archetype/_reset.scss +3 -0
- data/stylesheets/archetype/_styleguide.scss +2 -6
- data/stylesheets/archetype/_ui.scss +2 -358
- data/stylesheets/archetype/_util.scss +3 -10
- data/stylesheets/archetype/config/_core.scss +14 -0
- data/stylesheets/archetype/config/_environment.scss +19 -0
- data/stylesheets/archetype/config/_formatting.scss +63 -0
- data/stylesheets/archetype/config/_glyphs.scss +252 -0
- data/stylesheets/archetype/config/_resets.scss +7 -0
- data/stylesheets/archetype/config/_resolution.scss +3 -0
- data/stylesheets/archetype/config/_spacing.scss +5 -0
- data/stylesheets/archetype/config/_targeting.scss +18 -0
- data/stylesheets/archetype/config/_theme.scss +3 -0
- data/stylesheets/archetype/config/_typography.scss +56 -0
- data/stylesheets/archetype/config/_units.scss +2 -0
- data/stylesheets/archetype/config/_vars.scss +10 -0
- data/stylesheets/archetype/hacks/_core.scss +4 -0
- data/stylesheets/archetype/hacks/_hacks.scss +160 -0
- data/stylesheets/archetype/hacks/_init.scss +2 -0
- data/stylesheets/archetype/styleguide/_core.scss +4 -0
- data/stylesheets/archetype/styleguide/_init.scss +1 -0
- data/stylesheets/archetype/styleguide/_styleguide.scss +41 -18
- data/stylesheets/archetype/ui/_accessibility.scss +41 -0
- data/stylesheets/archetype/ui/_breakpoints.scss +19 -0
- data/stylesheets/archetype/ui/_core.scss +10 -0
- data/stylesheets/archetype/ui/_elements.scss +98 -0
- data/stylesheets/archetype/ui/_glyphs.scss +244 -0
- data/stylesheets/archetype/ui/_init.scss +5 -0
- data/stylesheets/archetype/ui/_layout.scss +37 -0
- data/stylesheets/archetype/ui/_locale.scss +12 -0
- data/stylesheets/archetype/ui/_scopes.scss +42 -0
- data/stylesheets/archetype/util/_core.scss +8 -0
- data/stylesheets/archetype/util/_debug.scss +9 -21
- data/stylesheets/archetype/util/_init.scss +1 -0
- data/stylesheets/archetype/util/_misc.scss +21 -86
- data/stylesheets/archetype/util/_spacing.scss +9 -40
- data/stylesheets/archetype/util/_styles.scss +189 -178
- data/stylesheets/archetype/util/_targeting.scss +51 -68
- data/templates/example/manifest.rb +2 -2
- data/templates/example/screen.scss +0 -1
- data/templates/project/manifest.rb +3 -8
- metadata +93 -263
- data/bin/archetype +0 -3
- data/lib/archetype/sass_extensions/monkey_patches.rb +0 -3
- data/lib/archetype/sass_extensions/monkey_patches/handle_include_loop.rb +0 -13
- data/stylesheets/archetype/_base.scss +0 -54
- data/stylesheets/archetype/_grid.scss +0 -3
- data/stylesheets/archetype/base/_h5bp.scss +0 -307
- data/stylesheets/archetype/base/_hybrid.scss +0 -25
- data/stylesheets/archetype/base/_normalize.scss +0 -634
- data/stylesheets/archetype/base/_reset.scss +0 -72
- data/stylesheets/archetype/grid/_config.scss +0 -14
- data/stylesheets/archetype/grid/_grid.scss +0 -391
- data/stylesheets/archetype/styleguide/_components.scss +0 -25
- data/stylesheets/archetype/styleguide/_helpers.scss +0 -215
- data/stylesheets/archetype/styleguide/_primitives.scss +0 -10
- data/stylesheets/archetype/styleguide/components/_alerts.scss +0 -59
- data/stylesheets/archetype/styleguide/components/_annotations.scss +0 -27
- data/stylesheets/archetype/styleguide/components/_bristol.scss +0 -15
- data/stylesheets/archetype/styleguide/components/_button_groups.scss +0 -47
- data/stylesheets/archetype/styleguide/components/_button_toolbars.scss +0 -17
- data/stylesheets/archetype/styleguide/components/_buttons.scss +0 -339
- data/stylesheets/archetype/styleguide/components/_canvas.scss +0 -15
- data/stylesheets/archetype/styleguide/components/_carets.scss +0 -336
- data/stylesheets/archetype/styleguide/components/_closes.scss +0 -63
- data/stylesheets/archetype/styleguide/components/_container.scss +0 -27
- data/stylesheets/archetype/styleguide/components/_copy.scss +0 -85
- data/stylesheets/archetype/styleguide/components/_flyouts.scss +0 -52
- data/stylesheets/archetype/styleguide/components/_headings.scss +0 -33
- data/stylesheets/archetype/styleguide/components/_headlines.scss +0 -64
- data/stylesheets/archetype/styleguide/components/_hovercards.scss +0 -27
- data/stylesheets/archetype/styleguide/components/_icons.scss +0 -17
- data/stylesheets/archetype/styleguide/components/_identities.scss +0 -34
- data/stylesheets/archetype/styleguide/components/_links.scss +0 -68
- data/stylesheets/archetype/styleguide/components/_loaders.scss +0 -154
- data/stylesheets/archetype/styleguide/components/_menu_items.scss +0 -31
- data/stylesheets/archetype/styleguide/components/_module.scss +0 -15
- data/stylesheets/archetype/styleguide/components/_pullquotes.scss +0 -29
- data/stylesheets/archetype/styleguide/components/_punchcut.scss +0 -18
- data/stylesheets/archetype/styleguide/components/_tooltips.scss +0 -28
- data/stylesheets/archetype/styleguide/primitives/_animations.scss +0 -17
- data/stylesheets/archetype/styleguide/primitives/_dimensions.scss +0 -50
- data/stylesheets/archetype/styleguide/primitives/_glyphs.scss +0 -11
- data/stylesheets/archetype/styleguide/primitives/_misc.scss +0 -8
- data/stylesheets/archetype/styleguide/primitives/_palettes.scss +0 -94
- data/stylesheets/archetype/styleguide/primitives/_shadows.scss +0 -23
- data/stylesheets/archetype/styleguide/primitives/_sprites.scss +0 -46
- data/stylesheets/archetype/styleguide/primitives/_textures.scss +0 -10
- data/stylesheets/archetype/styleguide/primitives/_typography.scss +0 -56
- data/stylesheets/archetype/util/_lists.scss +0 -57
- data/stylesheets/archetype/util/_rtl.scss +0 -279
- data/stylesheets/archetype/util/_units.scss +0 -18
- data/templates/project/screen.scss +0 -1
- data/templates/project/vendor/archetype/animations/loaders/large/large.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/large/large_dark.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/large/large_dark_static.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/large/large_static.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/medium/medium.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/medium/medium_dark.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/medium/medium_dark_static.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/medium/medium_static.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/small/small.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/small/small_dark.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/small/small_dark_static.png +0 -0
- data/templates/project/vendor/archetype/animations/loaders/small/small_static.png +0 -0
- data/templates/project/vendor/archetype/fontawesome-webfont.eot +0 -0
- data/templates/project/vendor/archetype/fontawesome-webfont.svg +0 -255
- data/templates/project/vendor/archetype/fontawesome-webfont.ttf +0 -0
- data/templates/project/vendor/archetype/fontawesome-webfont.woff +0 -0
- data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.eot +0 -0
- data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.svg +0 -255
- data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.ttf +0 -0
- data/test/fixtures/stylesheets/archetype/assets/fonts/fontawesome-webfont.woff +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders-s7889ccc8c1.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large_dark.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large_dark_static.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/large/large_static.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium_dark.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium_dark_static.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/medium/medium_static.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small_dark.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small_dark_static.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/animations/loaders/small/small_static.png +0 -0
- data/test/fixtures/stylesheets/archetype/assets/images/vendor/archetype/sprites/hovercard_tip.png +0 -0
- data/test/fixtures/stylesheets/archetype/config.rb +0 -21
- data/test/fixtures/stylesheets/archetype/source/b.scss +0 -9
- data/test/fixtures/stylesheets/archetype/source/base.scss +0 -3
- data/test/fixtures/stylesheets/archetype/source/hacks/ie_pseudo.scss +0 -13
- data/test/fixtures/stylesheets/archetype/source/hacks/transparent_focusable.scss +0 -5
- data/test/fixtures/stylesheets/archetype/source/locale.scss +0 -43
- data/test/fixtures/stylesheets/archetype/source/styleguide/alerts.scss +0 -21
- data/test/fixtures/stylesheets/archetype/source/styleguide/buttons.scss +0 -18
- data/test/fixtures/stylesheets/archetype/source/styleguide/drop.scss +0 -101
- data/test/fixtures/stylesheets/archetype/source/styleguide/extend.scss +0 -24
- data/test/fixtures/stylesheets/archetype/source/styleguide/fallback_styles.scss +0 -23
- data/test/fixtures/stylesheets/archetype/source/styleguide/invalid_structures.scss +0 -85
- data/test/fixtures/stylesheets/archetype/source/styleguide/multi_value.scss +0 -18
- data/test/fixtures/stylesheets/archetype/source/styleguide/nested_styleguides.scss +0 -40
- data/test/fixtures/stylesheets/archetype/source/styleguide/selective_state.scss +0 -22
- data/test/fixtures/stylesheets/archetype/source/ui/glyph_icon.scss +0 -35
- data/test/fixtures/stylesheets/archetype/source/ui/hide_element.scss +0 -5
- data/test/fixtures/stylesheets/archetype/source/ui/stroke.scss +0 -13
- data/test/fixtures/stylesheets/archetype/source/ui/triangle.scss +0 -13
- data/test/fixtures/stylesheets/archetype/source/utilities/associative.scss +0 -24
- data/test/fixtures/stylesheets/archetype/source/utilities/custom_output_styler.scss +0 -22
- data/test/fixtures/stylesheets/archetype/source/utilities/if-set.scss +0 -16
- data/test/fixtures/stylesheets/archetype/source/utilities/spacing/horizontal-spacing.scss +0 -27
- data/test/fixtures/stylesheets/archetype/source/utilities/spacing/vertical-spacing.scss +0 -27
- data/test/fixtures/stylesheets/archetype/source/utilities/styles/filter.scss +0 -9
- data/test/fixtures/stylesheets/archetype/source/utilities/styles/font-family.scss +0 -9
- data/test/fixtures/stylesheets/archetype/source/utilities/styles/z-index.scss +0 -18
- data/test/fixtures/stylesheets/archetype/source/utilities/targeting/target-browser.scss +0 -77
- data/test/fixtures/stylesheets/archetype/source/utilities/targeting/target-os.scss +0 -42
- data/test/fixtures/stylesheets/archetype/tmp/b.css +0 -14
- data/test/fixtures/stylesheets/archetype/tmp/base.css +0 -349
- data/test/fixtures/stylesheets/archetype/tmp/hacks/ie_pseudo.css +0 -11
- data/test/fixtures/stylesheets/archetype/tmp/hacks/transparent_focusable.css +0 -4
- data/test/fixtures/stylesheets/archetype/tmp/locale.css +0 -23
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/alerts.css +0 -711
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/buttons.css +0 -2119
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/drop.css +0 -63
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/extend.css +0 -11
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/fallback_styles.css +0 -10
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/invalid_structures.css +0 -21
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/multi_value.css +0 -13
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/nested_styleguides.css +0 -28
- data/test/fixtures/stylesheets/archetype/tmp/styleguide/selective_state.css +0 -177
- data/test/fixtures/stylesheets/archetype/tmp/ui/glyph_icon.css +0 -127
- data/test/fixtures/stylesheets/archetype/tmp/ui/hide_element.css +0 -8
- data/test/fixtures/stylesheets/archetype/tmp/ui/stroke.css +0 -17
- data/test/fixtures/stylesheets/archetype/tmp/ui/triangle.css +0 -35
- data/test/fixtures/stylesheets/archetype/tmp/utilities/associative.css +0 -9
- data/test/fixtures/stylesheets/archetype/tmp/utilities/custom_output_styler.css +0 -8
- data/test/fixtures/stylesheets/archetype/tmp/utilities/if-set.css +0 -9
- data/test/fixtures/stylesheets/archetype/tmp/utilities/spacing/horizontal-spacing.css +0 -29
- data/test/fixtures/stylesheets/archetype/tmp/utilities/spacing/vertical-spacing.css +0 -29
- data/test/fixtures/stylesheets/archetype/tmp/utilities/styles/filter.css +0 -11
- data/test/fixtures/stylesheets/archetype/tmp/utilities/styles/font-family.css +0 -16
- data/test/fixtures/stylesheets/archetype/tmp/utilities/styles/z-index.css +0 -15
- data/test/fixtures/stylesheets/archetype/tmp/utilities/targeting/target-browser.css +0 -105
- data/test/fixtures/stylesheets/archetype/tmp/utilities/targeting/target-os.css +0 -55
- data/test/helpers/diff.rb +0 -49
- data/test/helpers/io.rb +0 -36
- data/test/helpers/test_case.rb +0 -62
- data/test/integrations/archetype_test.rb +0 -126
- data/test/test_helper.rb +0 -26
- data/test/units/sass_extensions_test.rb +0 -200
@@ -0,0 +1,40 @@
|
|
1
|
+
module Archetype::SassExtensions::Styleguide
|
2
|
+
|
3
|
+
private
|
4
|
+
|
5
|
+
#
|
6
|
+
# keep a registry of styleguide themes
|
7
|
+
#
|
8
|
+
# *Parameters*:
|
9
|
+
# - <tt>theme</tt> {String} the theme to use
|
10
|
+
# *Returns*:
|
11
|
+
# - {Hash} the theme
|
12
|
+
#
|
13
|
+
def get_theme(theme)
|
14
|
+
if @@styleguide_themes.nil?
|
15
|
+
# bind a callback to file save to cleanup the cache if needed
|
16
|
+
Compass.configuration.on_stylesheet_saved do |filename|
|
17
|
+
::Archetype::SassExtensions::Styleguide.reset!(filename) unless Compass.configuration.memoize == :aggressive
|
18
|
+
end
|
19
|
+
end
|
20
|
+
@@styleguide_themes ||= {}
|
21
|
+
theme_name = helpers.to_str(theme || environment.var('CONFIG_THEME') || Archetype.name)
|
22
|
+
key = nil
|
23
|
+
begin
|
24
|
+
key = environment.options[:css_filename].hash
|
25
|
+
end
|
26
|
+
# if we're aggressively memoizing, store everything across the session
|
27
|
+
if Compass.configuration.memoize == :aggressive or not key
|
28
|
+
styleguide_store = @@styleguide_themes
|
29
|
+
#otherwise, just store it per this file instance
|
30
|
+
else
|
31
|
+
styleguide_store = @@styleguide_themes[key] ||= {}
|
32
|
+
end
|
33
|
+
theme = styleguide_store[theme_name] ||= {}
|
34
|
+
theme[:name] ||= theme_name
|
35
|
+
theme[:components] ||= {}
|
36
|
+
theme[:extensions] ||= []
|
37
|
+
return theme
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -1,60 +1,10 @@
|
|
1
|
-
|
2
|
-
require 'thread'
|
1
|
+
module Archetype::SassExtensions::UI; end
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
module Archetype::SassExtensions::UI
|
8
|
-
# :stopdoc:
|
9
|
-
@@archetype_ui_mutex = Mutex.new
|
10
|
-
# :startdoc:
|
11
|
-
|
12
|
-
#
|
13
|
-
# generate a unique token
|
14
|
-
#
|
15
|
-
# *Parameters*:
|
16
|
-
# - <tt>$prefix</tt> {String} a string to prefix the UID with, `class` and `id` will generate a unique selector
|
17
|
-
# *Returns*:
|
18
|
-
# - {String} the unique string
|
19
|
-
#
|
20
|
-
def unique(prefix = '')
|
21
|
-
prefix = helpers.to_str(prefix, ' ', :quotes)
|
22
|
-
prefix = '.' if prefix == 'class'
|
23
|
-
prefix = '#' if prefix == 'id'
|
24
|
-
suffix = Compass.configuration.testing ? "RANDOM_UID" : "#{Time.now.to_i}-#{rand(36**8).to_s(36)}-#{uid}"
|
25
|
-
return Sass::Script::String.new("#{prefix}archetype-uid-#{suffix}")
|
26
|
-
end
|
27
|
-
|
28
|
-
#
|
29
|
-
# parse a CSS content string and format it for injection into innerHTML
|
30
|
-
#
|
31
|
-
# *Parameters*:
|
32
|
-
# - <tt>$content</tt> {String} the CSS content string
|
33
|
-
# *Returns*:
|
34
|
-
# - {String} the processed string
|
35
|
-
#
|
36
|
-
def _ie_pseudo_content(content)
|
37
|
-
content = helpers.to_str(content)
|
38
|
-
# escape &
|
39
|
-
content = content.gsub(/\&/, '&')
|
40
|
-
# convert char codes (and remove single trailing whitespace if present) (e.g. \2079 -> ⁹)
|
41
|
-
content = content.gsub(/\\([\da-zA-Z]{4})\s?/, '&#x\1;')
|
42
|
-
# escape tags and cleanup quotes
|
43
|
-
content = content.gsub(/\</, '<').gsub(/\>/, '>')
|
44
|
-
# cleanup quotes
|
45
|
-
content = content.gsub(/\A"|"\Z/, '').gsub(/\"/, '\\"')
|
46
|
-
return Sass::Script::String.new(content)
|
47
|
-
end
|
48
|
-
|
49
|
-
private
|
50
|
-
def helpers
|
51
|
-
@helpers ||= Archetype::Functions::Helpers
|
52
|
-
end
|
3
|
+
%w(glyphs scopes).each do |func|
|
4
|
+
require "archetype/sass_extensions/functions/ui/#{func}"
|
5
|
+
end
|
53
6
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
@@uid += 1
|
58
|
-
end
|
59
|
-
end
|
7
|
+
module Archetype::SassExtensions::UI
|
8
|
+
include Archetype::SassExtensions::UI::Glyphs
|
9
|
+
include Archetype::SassExtensions::UI::Scopes
|
60
10
|
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
module Archetype::SassExtensions::UI::Glyphs
|
2
|
+
|
3
|
+
#
|
4
|
+
# given a set of grid sizes and an individual size, return the closest matching size
|
5
|
+
#
|
6
|
+
# *Parameters*:
|
7
|
+
# - <tt>$grids</tt> {List} the list of grid options
|
8
|
+
# - <tt>$size</tt> {Number} the size to find a match for
|
9
|
+
# *Returns*:
|
10
|
+
# - {Number} the closest matching grid size
|
11
|
+
#
|
12
|
+
def choose_best_glyph_grid(grids, size)
|
13
|
+
return grids if grids == null
|
14
|
+
|
15
|
+
grids = grids.to_a
|
16
|
+
|
17
|
+
# perfect match?
|
18
|
+
if grids.include?(size)
|
19
|
+
return size
|
20
|
+
end
|
21
|
+
|
22
|
+
# otherwise let's find the best match
|
23
|
+
# start with assuming the first item is the best
|
24
|
+
best = {
|
25
|
+
:grid => grids.first,
|
26
|
+
:distance => (+1.0/0.0) # similuate Float::INFINITY, but for Ruby 1.8
|
27
|
+
}
|
28
|
+
|
29
|
+
# for each grid option...
|
30
|
+
grids.each do |grid|
|
31
|
+
# if the units are comparable...
|
32
|
+
if unit(grid) == unit(size)
|
33
|
+
|
34
|
+
tmp_grid = strip_units(grid).value.to_f
|
35
|
+
tmp_size = strip_units(size).value.to_f
|
36
|
+
|
37
|
+
# simple algorithm to compute the distance between the size and grid
|
38
|
+
# choose the lesser of the (mod) or (grid - mod)
|
39
|
+
# then divide it by grid^(number_of_grid_choices)
|
40
|
+
mod = (tmp_size % tmp_grid)
|
41
|
+
distance = [mod, tmp_grid - mod].min / tmp_grid**(grids.length)
|
42
|
+
|
43
|
+
# if it's closer (smaller distance), use it...
|
44
|
+
if distance < best[:distance]
|
45
|
+
best = {
|
46
|
+
:grid => grid,
|
47
|
+
:distance => distance
|
48
|
+
}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
# return the best match we found
|
53
|
+
return best[:grid]
|
54
|
+
end
|
55
|
+
Sass::Script::Functions.declare :choose_best_glyph_grid, [:grids, :size]
|
56
|
+
|
57
|
+
#
|
58
|
+
# checks if a string looks like it's just a composition of character codes
|
59
|
+
#
|
60
|
+
# *Parameters*:
|
61
|
+
# - <tt>$string</tt> {String} the string to check
|
62
|
+
# *Returns*:
|
63
|
+
# - {Boolean} whether or not the string looks like a sequence of character codes
|
64
|
+
#
|
65
|
+
def looks_like_character_code(string)
|
66
|
+
string = helpers.to_str(string, ' ', :quotes)
|
67
|
+
return bool(string =~ /^(\\([\da-fA-F]{4})\s*)+$/)
|
68
|
+
end
|
69
|
+
Sass::Script::Functions.declare :looks_like_character_code, [:string]
|
70
|
+
|
71
|
+
|
72
|
+
#
|
73
|
+
# registers a glyph library under a given key
|
74
|
+
#
|
75
|
+
def register_glyph_library(key, library)
|
76
|
+
registry = archetype_glyphs_registry
|
77
|
+
# if it's already in the registry, just return the current list
|
78
|
+
if is_null(registry[key])
|
79
|
+
registry = registry.dup
|
80
|
+
registry[key] = library
|
81
|
+
registry = Sass::Script::Value::Map.new(registry)
|
82
|
+
environment.global_env.set_var('CONFIG_GLYPHS_LIBRARIES', registry)
|
83
|
+
end
|
84
|
+
return key
|
85
|
+
end
|
86
|
+
|
87
|
+
#
|
88
|
+
# gets a glyph library as registered under the given key
|
89
|
+
#
|
90
|
+
def get_glyph_library(key)
|
91
|
+
default_key = identifier('default')
|
92
|
+
default = archetype_glyphs_registry[default_key] || null
|
93
|
+
return default if key == default_key
|
94
|
+
|
95
|
+
library = archetype_glyphs_registry[key]
|
96
|
+
# if the library doesn't exist...
|
97
|
+
if helpers.is_null(library)
|
98
|
+
# notify the user
|
99
|
+
helpers.warn("[archetype:glyph] could not find a glyph library for `#{library}`, using default")
|
100
|
+
# and return the default
|
101
|
+
return default
|
102
|
+
end
|
103
|
+
# merge the library with the default
|
104
|
+
return map_merge(default, library)
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
def get_all_glyph_libraries
|
109
|
+
return environment.var('CONFIG_GLYPHS_LIBRARIES') || Sass::Script::Value::Map.new
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
def archetype_glyphs_registry
|
115
|
+
registry = environment.var('CONFIG_GLYPHS_LIBRARIES')
|
116
|
+
return registry.respond_to?(:to_h) ? registry.to_h : {}
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module Archetype::SassExtensions::UI::Scopes
|
2
|
+
|
3
|
+
#
|
4
|
+
# registers a breakpoint
|
5
|
+
#
|
6
|
+
# *Parameters*:
|
7
|
+
# - <tt>$key</tt> {String} the key to register it under
|
8
|
+
# - <tt>$value</tt> {*} the value to register
|
9
|
+
# - <tt>$force</tt> {Boolean} if true, forces any new value into the registry
|
10
|
+
# *Returns*:
|
11
|
+
# - {Boolean} whether or not the value was registered
|
12
|
+
#
|
13
|
+
def register_breakpoint(key, value, force = nil)
|
14
|
+
# we need a dup as the Hash is frozen
|
15
|
+
breakpoints = registered_breakpoints.dup
|
16
|
+
force = force.nil? ? false : force.value
|
17
|
+
not_registered = breakpoints[key].nil? || is_null(breakpoints[key]).value
|
18
|
+
# if there's no key registered...
|
19
|
+
if force || not_registered
|
20
|
+
# just register the value
|
21
|
+
breakpoints[key] = value
|
22
|
+
# otherwise, if the current value is different...
|
23
|
+
elsif breakpoints[key] != value
|
24
|
+
# throw a warning
|
25
|
+
helpers.warn("[#{Archetype.name}:breakpoint] a breakpoint for `#{key}` is already set to `#{breakpoints[key]}`, ignoring `#{value}`")
|
26
|
+
return bool(false)
|
27
|
+
end
|
28
|
+
environment.global_env.set_var('CONFIG_BREAKPOINTS', Sass::Script::Value::Map.new(breakpoints))
|
29
|
+
return bool(true)
|
30
|
+
end
|
31
|
+
Sass::Script::Functions.declare :register_breakpoint, [:key, :value]
|
32
|
+
Sass::Script::Functions.declare :register_breakpoint, [:key, :value, :force]
|
33
|
+
|
34
|
+
#
|
35
|
+
# retrieves a breakpoint
|
36
|
+
#
|
37
|
+
# *Parameters*:
|
38
|
+
# - <tt>$key</tt> {String} the key to lookup
|
39
|
+
# *Returns*:
|
40
|
+
# - {*} the registered breakpoint
|
41
|
+
#
|
42
|
+
def get_breakpoint(key)
|
43
|
+
return registered_breakpoints[key] || null
|
44
|
+
end
|
45
|
+
Sass::Script::Functions.declare :get_breakpoint, [:key]
|
46
|
+
|
47
|
+
#
|
48
|
+
# convert a modifier/element context to a BEM style selector
|
49
|
+
#
|
50
|
+
# *Parameters*:
|
51
|
+
# - <tt>$context</tt> {String} the root selector to scope to
|
52
|
+
# - <tt>$element</tt> {String} the element name
|
53
|
+
# - <tt>$modifier</tt> {String} the modifier
|
54
|
+
# *Returns*:
|
55
|
+
# - {String} the BEM formatted selector
|
56
|
+
#
|
57
|
+
def bem_selector(context = nil, element = nil, modifier = nil)
|
58
|
+
element_separator = environment.var('CONFIG_BEM_ELEMENT_SEPARATOR')
|
59
|
+
element_separator = element_separator.nil? ? '__' : element_separator.value
|
60
|
+
|
61
|
+
modifier_separator = environment.var('CONFIG_BEM_MODIFIER_SEPARATOR')
|
62
|
+
modifier_separator = modifier_separator.nil? ? '--' : modifier_separator.value
|
63
|
+
|
64
|
+
context = is_null(context).value ? '' : context.value
|
65
|
+
element = is_null(element).value ? nil : element.value
|
66
|
+
modifier = is_null(modifier).value ? nil : modifier.value
|
67
|
+
|
68
|
+
selector = context
|
69
|
+
|
70
|
+
warning = "[#{Archetype.name}:bem] the current context may produce a non-standard BEM selector for";
|
71
|
+
|
72
|
+
unless element.nil?
|
73
|
+
helpers.warn("#{warning} element `#{element}`: #{context}") if (context.include?(element_separator) || context.include?(modifier_separator))
|
74
|
+
selector = "#{selector}#{element_separator}#{element}"
|
75
|
+
end
|
76
|
+
|
77
|
+
unless modifier.nil?
|
78
|
+
helpers.warn("#{warning} modifier `#{modifier}`: #{context}") if context.include?(modifier_separator)
|
79
|
+
selector = "#{selector}#{modifier_separator}#{modifier}"
|
80
|
+
end
|
81
|
+
|
82
|
+
return identifier(selector)
|
83
|
+
end
|
84
|
+
Sass::Script::Functions.declare :bem_selector, [:context]
|
85
|
+
Sass::Script::Functions.declare :bem_selector, [:context, :element]
|
86
|
+
Sass::Script::Functions.declare :bem_selector, [:context, :modifier]
|
87
|
+
Sass::Script::Functions.declare :bem_selector, [:context, :element, :modifier]
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
def registered_breakpoints
|
92
|
+
breakpoints = environment.var('CONFIG_BREAKPOINTS')
|
93
|
+
breakpoints.respond_to?(:to_h) ? breakpoints.to_h : {}
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# :stopdoc:
|
2
|
+
module Archetype::SassExtensions::Util; end
|
3
|
+
|
4
|
+
%w(debug misc images spacing hacks).each do |func|
|
5
|
+
require "archetype/sass_extensions/functions/util/#{func}"
|
6
|
+
end
|
7
|
+
|
8
|
+
module Archetype::SassExtensions::Util
|
9
|
+
include Archetype::SassExtensions::Util::Misc
|
10
|
+
include Archetype::SassExtensions::Util::Images
|
11
|
+
include Archetype::SassExtensions::Util::Debug
|
12
|
+
include Archetype::SassExtensions::Util::Spacing
|
13
|
+
include Archetype::SassExtensions::Util::Hacks
|
14
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Archetype::SassExtensions::Util::Debug
|
2
|
+
|
3
|
+
#
|
4
|
+
# check if debug is enabled
|
5
|
+
#
|
6
|
+
# *Parameters*:
|
7
|
+
# - <tt>$iff</tt> {Boolean} optional override for `$CONFIG_DEBUG`
|
8
|
+
# *Returns*:
|
9
|
+
# - {Boolean} whether or not debug is enabled
|
10
|
+
#
|
11
|
+
def is_debug_enabled(iff = nil)
|
12
|
+
# debug is only available in DEBUG environments, so check that first
|
13
|
+
return bool(false) unless (environment.var('CONFIG_DEBUG_ENVS') || []).to_a.include?(archetype_env)
|
14
|
+
# then check if the debug flag/override is truthy
|
15
|
+
# if the param is non-null, then use it
|
16
|
+
return iff unless is_null(iff).value
|
17
|
+
# otherwise, use `CONFIG_DEBUG`
|
18
|
+
return environment.var('CONFIG_DEBUG') || bool(false)
|
19
|
+
end
|
20
|
+
Sass::Script::Functions.declare :is_debug_enabled, [:iff]
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Archetype::SassExtensions::Util::Hacks
|
2
|
+
|
3
|
+
#
|
4
|
+
# parse a CSS content string and format it for injection into innerHTML
|
5
|
+
#
|
6
|
+
# *Parameters*:
|
7
|
+
# - <tt>$content</tt> {String} the CSS content string
|
8
|
+
# *Returns*:
|
9
|
+
# - {String} the processed string
|
10
|
+
#
|
11
|
+
def _ie_pseudo_content(content)
|
12
|
+
content = helpers.to_str(content)
|
13
|
+
# escape &
|
14
|
+
content = content.gsub(/\&/, '&')
|
15
|
+
# convert char codes (and remove single trailing whitespace if present) (e.g. \2079 -> ⁹)
|
16
|
+
content = content.gsub(/\\([\da-fA-F]{4})\s?/, '&#x\1;')
|
17
|
+
# escape tags and cleanup quotes
|
18
|
+
content = content.gsub(/\</, '<').gsub(/\>/, '>')
|
19
|
+
# cleanup quotes
|
20
|
+
content = content.gsub(/\A"|"\Z/, '').gsub(/\"/, '\\"')
|
21
|
+
return identifier(content)
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# given a string of styles, convert it into a map
|
26
|
+
#
|
27
|
+
# *Parameters*:
|
28
|
+
# - <tt>$string</tt> {String} the string to convert
|
29
|
+
# *Returns*:
|
30
|
+
# - {Map} the converted map of styles
|
31
|
+
#
|
32
|
+
def _style_string_to_map(string = '')
|
33
|
+
# convert to string and strip all comments
|
34
|
+
string = helpers.to_str(string, ' ').gsub(/\/\*(?!\*\/)*\*\//, '')
|
35
|
+
# then split it on each rule and for each rule break it into it's key-value pairs
|
36
|
+
styles = string.split(';').map do |rule|
|
37
|
+
k, v = rule.split(':')
|
38
|
+
[identifier(k), identifier(v)]
|
39
|
+
end
|
40
|
+
# then recompose the map
|
41
|
+
return Sass::Script::Value::Map.new(Sass::Util.to_hash(styles))
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
module Archetype::SassExtensions::Util::Images
|
2
|
+
|
3
|
+
#
|
4
|
+
# helper to determine if a sprite is already set or sprites are disabled
|
5
|
+
#
|
6
|
+
# *Parameters*:
|
7
|
+
# - <tt>$sprite</tt> {SpriteMap} the sprite map to check against
|
8
|
+
# *Returns*:
|
9
|
+
# - {Boolean} should the sprite be set
|
10
|
+
#
|
11
|
+
def _shouldSetSprite(sprite)
|
12
|
+
is_sprite = sprite.is_a?(Compass::SassExtensions::Sprites::SpriteMap)
|
13
|
+
should_set_sprite = !global_sprites_disabled? && !is_sprite
|
14
|
+
return bool(should_set_sprite)
|
15
|
+
end
|
16
|
+
Sass::Script::Functions.declare :get_collection, [:components, :min]
|
17
|
+
|
18
|
+
#
|
19
|
+
# check that a sprite isn't null or false
|
20
|
+
#
|
21
|
+
# *Parameters*:
|
22
|
+
# - <tt>$map</tt> {SpriteMap} the sprite map to check against
|
23
|
+
# *Returns*:
|
24
|
+
# - {Boolean} is the sprite set
|
25
|
+
#
|
26
|
+
def _archetype_check_sprite(map)
|
27
|
+
status = !(global_sprites_disabled? && (is_null(map) || !map.value))
|
28
|
+
return bool(status)
|
29
|
+
end
|
30
|
+
Sass::Script::Functions.declare :_archetype_check_sprite, [:map]
|
31
|
+
|
32
|
+
#
|
33
|
+
# wrapper for `sprite`
|
34
|
+
#
|
35
|
+
# *Parameters*:
|
36
|
+
# - <tt>$map</tt> {SpriteMap} the sprite map
|
37
|
+
# - <tt>$sprite</tt> {Sprite} the sprite name
|
38
|
+
# - <tt>$offset-x</tt> {Number} the horizontal offset of the sprite position
|
39
|
+
# - <tt>$offset-y</tt> {Number} the vertical offset of the sprite position
|
40
|
+
# *Returns*:
|
41
|
+
# - {Sprite} the sprite object or `null`
|
42
|
+
#
|
43
|
+
def _archetype_sprite(map, sprite, offset_x = number(0), offset_y = number(0))
|
44
|
+
return null unless _archetype_check_sprite(map)
|
45
|
+
return sprite(map, sprite, offset_x, offset_y)
|
46
|
+
end
|
47
|
+
Sass::Script::Functions.declare :_archetype_sprite, [:map, :sprite, :offset_x, :offset_y]
|
48
|
+
|
49
|
+
#
|
50
|
+
# wrapper for `sprite-position`
|
51
|
+
#
|
52
|
+
# *Parameters*:
|
53
|
+
# - <tt>$map</tt> {SpriteMap} the sprite map
|
54
|
+
# - <tt>$sprite</tt> {Sprite} the sprite name
|
55
|
+
# - <tt>$offset-x</tt> {Number} the horizontal offset of the sprite position
|
56
|
+
# - <tt>$offset-y</tt> {Number} the vertical offset of the sprite position
|
57
|
+
# *Returns*:
|
58
|
+
# - {List} the sprite position or `null`
|
59
|
+
#
|
60
|
+
def _archetype_sprite_position(map, sprite, offset_x = number(0), offset_y = number(0))
|
61
|
+
return null unless _archetype_check_sprite(map)
|
62
|
+
return sprite_position(map, sprite, offset_x, offset_y)
|
63
|
+
end
|
64
|
+
Sass::Script::Functions.declare :_archetype_sprite_position, [:map, :sprite, :offset_x, :offset_y]
|
65
|
+
|
66
|
+
#
|
67
|
+
# wrapper for `sprite-url`
|
68
|
+
#
|
69
|
+
# *Parameters*:
|
70
|
+
# - <tt>$map</tt> {SpriteMap} the sprite map
|
71
|
+
# *Returns*:
|
72
|
+
# - {String} the sprite URL or `null`
|
73
|
+
#
|
74
|
+
def _archetype_sprite_url(map)
|
75
|
+
return null unless _archetype_check_sprite(map)
|
76
|
+
return sprite_url(map)
|
77
|
+
end
|
78
|
+
Sass::Script::Functions.declare :_archetype_sprite_url, [:map]
|
79
|
+
|
80
|
+
#
|
81
|
+
# wrapper for `sprite-file`
|
82
|
+
#
|
83
|
+
# *Parameters*:
|
84
|
+
# - <tt>$map</tt> {SpriteMap} the sprite map
|
85
|
+
# - <tt>$sprite</tt> {Sprite} the sprite name
|
86
|
+
# *Returns*:
|
87
|
+
# - {ImageFile} the image or `null`
|
88
|
+
#
|
89
|
+
def _archetype_sprite_file(map, sprite)
|
90
|
+
return null unless _archetype_check_sprite(map)
|
91
|
+
return sprite_file(map, sprite)
|
92
|
+
end
|
93
|
+
Sass::Script::Functions.declare :_archetype_sprite_file, [:map, :sprite]
|
94
|
+
|
95
|
+
#
|
96
|
+
# wrapper for `image-width`
|
97
|
+
#
|
98
|
+
# *Parameters*:
|
99
|
+
# - <tt>$image</tt> {ImageFile} the image
|
100
|
+
# - <tt>$sprite</tt> {Sprite} the sprite name
|
101
|
+
# *Returns*:
|
102
|
+
# - {Number} the width of the image or `null`
|
103
|
+
#
|
104
|
+
def _archetype_image_width(image)
|
105
|
+
return null if is_null(image).value
|
106
|
+
return image_width(image)
|
107
|
+
end
|
108
|
+
Sass::Script::Functions.declare :_archetype_image_width, [:image]
|
109
|
+
|
110
|
+
#
|
111
|
+
# wrapper for `image-height`
|
112
|
+
#
|
113
|
+
# *Parameters*:
|
114
|
+
# - <tt>$image</tt> {ImageFile} the image
|
115
|
+
# - <tt>$sprite</tt> {Sprite} the sprite name
|
116
|
+
# *Returns*:
|
117
|
+
# - {Number} the height of the image or `null`
|
118
|
+
#
|
119
|
+
def _archetype_image_height(image)
|
120
|
+
return null if is_null(image).value
|
121
|
+
return image_height(image)
|
122
|
+
end
|
123
|
+
Sass::Script::Functions.declare :_archetype_image_height, [:image]
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
def global_sprites_disabled?
|
128
|
+
sprites_disabled = environment.var('CONFIG_DISABLE_STYLEGUIDE_SPRITES')
|
129
|
+
return sprites_disabled.respond_to?(:value) ? sprites_disabled.value : false
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|