tungsten 0.1.0 → 0.1.1

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/tungsten/_form_helpers.js +21 -0
  3. data/app/assets/javascripts/tungsten/code.js +20 -0
  4. data/app/assets/javascripts/tungsten/tungsten.js +4 -20
  5. data/app/assets/stylesheets/tungsten/_code-color.scss +0 -0
  6. data/app/assets/stylesheets/tungsten/_colors.yml +68 -4
  7. data/app/assets/stylesheets/tungsten/_index.scss +5 -0
  8. data/app/assets/stylesheets/tungsten/code/_codemirror.scss +56 -0
  9. data/app/assets/stylesheets/tungsten/code/_color.scss +58 -0
  10. data/app/assets/stylesheets/tungsten/code/_highlighted.scss +64 -0
  11. data/app/assets/stylesheets/tungsten/code/_index.scss +3 -0
  12. data/app/assets/stylesheets/tungsten/core/_buttons.scss +144 -0
  13. data/app/assets/stylesheets/tungsten/core/_cards.scss +90 -0
  14. data/app/assets/stylesheets/tungsten/core/_colors.scss +20 -0
  15. data/app/assets/stylesheets/tungsten/core/_globals.scss +172 -0
  16. data/app/assets/stylesheets/tungsten/core/_grid.scss +164 -0
  17. data/app/assets/stylesheets/tungsten/core/_index.scss +7 -13
  18. data/app/assets/stylesheets/tungsten/core/_layout.scss +47 -0
  19. data/app/assets/stylesheets/tungsten/core/_text.scss +219 -0
  20. data/app/assets/stylesheets/tungsten/form/_base.scss +235 -0
  21. data/app/assets/stylesheets/tungsten/form/_check-radio.scss +154 -0
  22. data/app/assets/stylesheets/tungsten/form/_check-switch.scss +104 -0
  23. data/app/assets/stylesheets/tungsten/form/_index.scss +4 -0
  24. data/app/assets/stylesheets/tungsten/form/_label-placeholder.scss +98 -0
  25. data/app/assets/stylesheets/tungsten/tungsten.scss +1 -3
  26. data/app/helpers/tungsten/card_helper.rb +76 -0
  27. data/app/helpers/tungsten/deployments_helper.rb +59 -0
  28. data/app/helpers/tungsten/form_helper.rb +509 -0
  29. data/app/helpers/tungsten/layout_helper.rb +7 -0
  30. data/app/helpers/tungsten/toggle_nav_helper.rb +84 -0
  31. data/app/views/layouts/tungsten/default.html.slim +47 -0
  32. data/app/views/shared/tungsten/_defs.html.slim +6 -0
  33. data/app/views/shared/tungsten/_footer.html.slim +2 -0
  34. data/app/views/shared/tungsten/_header.html.slim +2 -0
  35. data/config/data/deployments.yml +110 -0
  36. data/lib/tungsten.rb +26 -2
  37. data/lib/tungsten/helper.rb +4 -0
  38. data/lib/tungsten/version.rb +1 -1
  39. data/public/{tungsten-0.1.0.js → code-0.1.1.js} +43 -69
  40. data/public/code-0.1.1.js.gz +0 -0
  41. data/public/code-0.1.1.map.json +1 -0
  42. data/public/tungsten-0.1.1.css +1523 -0
  43. data/public/tungsten-0.1.1.css.gz +0 -0
  44. data/public/tungsten-0.1.1.js +79 -0
  45. data/public/tungsten-0.1.1.js.gz +0 -0
  46. data/public/tungsten-0.1.1.map.json +1 -0
  47. metadata +120 -16
  48. data/app/helpers/tungsten/application_helper.rb +0 -4
  49. data/app/views/layouts/tungsten/default.html.erb +0 -17
  50. data/public/tungsten-0.1.0.css +0 -17
  51. data/public/tungsten-0.1.0.css.gz +0 -0
  52. data/public/tungsten-0.1.0.js.gz +0 -0
  53. data/public/tungsten-0.1.0.map.json +0 -1
@@ -0,0 +1,59 @@
1
+ module Tungsten
2
+ module DeploymentsHelper
3
+ def deployment_data(name = nil)
4
+ deployments = Cyborg.config_data['deployments']['deployments']
5
+
6
+ if name.nil?
7
+ deployments
8
+ else
9
+ deployment = deployments.find { |d|
10
+ d[:name] =~ /#{name}/i
11
+ }
12
+
13
+ if deployment.nil? && !Rails.env.production?
14
+ raise %Q{No deployment type "#{name}" exists.}
15
+ end
16
+
17
+ deployment
18
+ end
19
+ end
20
+
21
+ def deployment_graphic
22
+ @deployment_icon ||= Esvg.find_symbol('deployment')
23
+ end
24
+
25
+ def deployment_text(text, options={})
26
+ options = {
27
+ x: deployment_graphic.width.to_f / 2,
28
+ y: deployment_graphic.height.to_f / 2, fill: "currentColor",
29
+ "font-weight" => 700,
30
+ "font-size" => "57px",
31
+ "text-anchor" => "middle",
32
+ "dominant-baseline" =>"central",
33
+ "alignment-baseline" => "central"
34
+ }.merge(options)
35
+
36
+ content_tag(:text, text, options).html_safe
37
+ end
38
+
39
+ def deployment_svg(name, options={})
40
+ data = deployment_data(name)
41
+ (options[:use] ||= {})
42
+ options[:use][:stroke] ||= options.delete(:stroke) || "currentColor"
43
+ options[:use][:stroke_width] ||= options.delete(:stroke_width) || 4
44
+ options[:use][:class] = "deployment-icon-hex #{options[:use][:class]}".strip
45
+
46
+ options[:color] ||= "#fff"
47
+ options[:fill] ||= "url(##{name.downcase}-gradient-bg)"
48
+ options[:content] ||= deployment_text(data[:short_name], options.delete(:text) || {})
49
+
50
+ deployment_graphic.use(options).html_safe
51
+ end
52
+
53
+ def deployment_icon(name, options={})
54
+ options[:stroke_width] ||= 8
55
+ options[:text] ||= { "font-weight" => 600, "font-size" => "76px" }
56
+ deployment_svg name, options
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,509 @@
1
+ module Tungsten
2
+ module FormHelper
3
+ INPUT_OPTIONS = {
4
+ email: {
5
+ type: "email",
6
+ placeholder: "Email address",
7
+ pattern: "[^@]+@[^@]+\\.[a-zA-Z]{2,}",
8
+ autocorrect: "off",
9
+ autocapitalize: "off",
10
+ spellcheck: "false",
11
+ data: { message: "Please enter a valid email address." }
12
+ },
13
+
14
+ password: {
15
+ type: "password",
16
+ placeholder: "Password"
17
+ },
18
+
19
+ text: {
20
+ type: "text"
21
+ },
22
+
23
+ tel: {
24
+ type: "tel",
25
+ placeholder: "Phone number"
26
+ },
27
+
28
+ url: {
29
+ type: "text",
30
+ placeholder: "Web address",
31
+ autocorrect: "off",
32
+ autocapitalize: "off",
33
+ spellcheck: "false",
34
+ pattern: ".+\\.[a-zA-Z]{2,}"
35
+ },
36
+
37
+ card_number: {
38
+ type: "text",
39
+ required: true,
40
+ pattern: "[0-9 -]{13,20}",
41
+ placeholder: "Credit Card Number",
42
+ data: {
43
+ stripe: "number",
44
+ message: "Please enter a valid credit card number."
45
+ }
46
+ },
47
+
48
+ card_month: {
49
+ type: "text",
50
+ required: true,
51
+ pattern: "0[1-9]|1[012]",
52
+ placeholder: "MM",
53
+ data: {
54
+ stripe: "exp_month",
55
+ message: "Please enter a valid expiration month."
56
+ }
57
+ },
58
+
59
+ card_year: {
60
+ type: "text",
61
+ required: true,
62
+ pattern: "[0-9]{4}",
63
+ placeholder: "YYYY",
64
+ data: {
65
+ stripe: "exp_year",
66
+ message: "Please enter a valid expiration year."
67
+ }
68
+ },
69
+
70
+ card_cvc: {
71
+ type: "text",
72
+ required: true,
73
+ pattern: "[0-9]{3,4}",
74
+ placeholder: "CVC",
75
+ data: {
76
+ stripe: "cvc",
77
+ message: "Please enter a valid security code."
78
+ }
79
+ },
80
+
81
+ select_country: {
82
+ type: "select",
83
+ country_options: {
84
+ include_blank: "Select a country",
85
+ priority_countries: ["US", "GB", "CA"],
86
+ },
87
+
88
+ html_options: {}
89
+ }
90
+ }
91
+
92
+ def table_form_for(record, options = {}, &block)
93
+ form_for record, options do |f|
94
+ table_form_tag f, &block
95
+ end
96
+ end
97
+
98
+ def table_form_tag(form = nil)
99
+ form.style = 'table' if form
100
+ content_tag :div, class: ['table', 'table-form'] do
101
+ yield form if block_given?
102
+ end
103
+ end
104
+
105
+ def stacked_form_for(record, options = {}, &block)
106
+ form_for record, options do |f|
107
+ stacked_form_tag f, &block
108
+ end
109
+ end
110
+
111
+ def stacked_form_tag(form = nil)
112
+ form.style = 'stacked' if form
113
+ content_tag :div, class: 'stacked-form' do
114
+ yield form if block_given?
115
+ end
116
+ end
117
+
118
+ def slider_input_tag(name, options={})
119
+ options = options.stringify_keys
120
+ classnames = options.delete('class') || ''
121
+
122
+ if label = options.delete('label')
123
+ label = content_tag(:span, class: 'label-text') { label }
124
+ end
125
+
126
+ data = options['data'] || {}
127
+ data['input'] ||= name
128
+
129
+ if options['position_label']
130
+ data['position_label'] = options['position_label']
131
+ end
132
+
133
+ # Set values (and max based on values size)
134
+ if values = options['values']
135
+ data['values'] = values.join(',')
136
+ options['max'] ||= values.size - 1
137
+ end
138
+
139
+ # Support legacy option
140
+ options['labels'] ||= options['label']
141
+
142
+ if labels = options['labels']
143
+ if labels.is_a?(Array)
144
+ data['label'] = labels.join(';')
145
+ options['max'] ||= labels.size - 1
146
+ elsif labels.is_a?(Hash)
147
+ labels.each do |label, value|
148
+ data['label-'+dasherize(label.to_s.downcase)] = value.join(';')
149
+ options['max'] ||= value.size - 1
150
+ end
151
+ end
152
+ end
153
+
154
+ if labels == false
155
+ data['label'] = 'false'
156
+ end
157
+
158
+ if labels = options['external_labels']
159
+ if labels.is_a?(Hash)
160
+ labels.each do |label, value|
161
+ data['external-label-'+dasherize(label.to_s.downcase)] = value.join(';')
162
+ end
163
+ end
164
+ end
165
+
166
+ if before = options['before']
167
+ if before.is_a?(String)
168
+ data['before-label'] = before
169
+ else
170
+ before.each do |key, value|
171
+ data["before-label-#{key}"] = value
172
+ end
173
+ end
174
+ end
175
+
176
+ if mark = options['mark']
177
+ data['mark'] = mark.join(',')
178
+ end
179
+
180
+ if after = options['after']
181
+ if after.is_a?(String)
182
+ data['after-label'] = after
183
+ else
184
+ after.each do |key, value|
185
+ data["after-label-#{key}"] = value
186
+ end
187
+ end
188
+ end
189
+
190
+ if line_labels = options['line_labels']
191
+ data['line_labels'] = []
192
+ line_labels.each do |k, v|
193
+ data['line_labels'] << "#{k}:#{v}"
194
+ end
195
+ data['line_labels'] = data['line_labels'].join(';')
196
+ end
197
+
198
+ options['value'] ||= options['min'] || 0
199
+
200
+ html_options = {"id"=> options['id'], "class" => classnames, "type" => "range", "min" => options['min'], "max" => options['max'], "value" => options['value'] }.update('data' => data)
201
+
202
+ content_tag(:label, class: 'range-label') {
203
+ concat label if label
204
+ concat tag :input, html_options
205
+ }
206
+ end
207
+ alias :range_input_tag :slider_input_tag
208
+
209
+ # Country select
210
+ def select_country_tag(name, options = {}, country_options = {})
211
+ country_options.reverse_merge! INPUT_OPTIONS[:select_country][:country_options]
212
+
213
+ options = INPUT_OPTIONS[:select_country][:html_options].deep_merge options
214
+ options[:class] ||= ' '
215
+ options[:class] += " #{label_class(:select)}"
216
+
217
+ content_tag(:label, class: options.delete(:class) ) do
218
+ country_select :user, :country, country_options, options
219
+ end
220
+ end
221
+
222
+ # Email inputs
223
+ def email_input_tag(name, value = nil, options = {})
224
+ input_tag(:email, name, value, options)
225
+ end
226
+
227
+ # Passowrd inputs
228
+ def password_input_tag(name, value = nil, options = {})
229
+ input_tag(:password, name, value, options)
230
+ end
231
+
232
+ def text_input_tag(name, value = nil, options = {})
233
+ input_tag(:text, name, value, options)
234
+ end
235
+
236
+ def url_input_tag(name, value = nil, options = {})
237
+ input_tag(:url, name, value, options)
238
+ end
239
+
240
+ def tel_input_tag(name, value = nil, options = {})
241
+ input_tag(:tel, name, value, options)
242
+ end
243
+
244
+ def textarea_tag(name, value = nil, options = {}, &block)
245
+ input_tag(:textarea, name, value, options, &block)
246
+ end
247
+
248
+ def number_input_tag(name, value = nil, options = {})
249
+ input_tag(:number, name, value, options)
250
+ end
251
+
252
+ def search_input_tag(name, value = nil, options = {})
253
+ input_tag(:search, name, value, options)
254
+ end
255
+
256
+ def card_number_tag(name, value=nil, options={})
257
+ input_tag(:card_number, name, value, options)
258
+ end
259
+
260
+ def card_month_tag(name, value=nil, options={})
261
+ input_tag(:card_month, name, value, options)
262
+ end
263
+
264
+ def card_year_tag(name, value=nil, options={})
265
+ input_tag(:card_year, name, value, options)
266
+ end
267
+
268
+ def card_cvc_tag(name, value=nil, options={})
269
+ input_tag(:card_cvc, name, value, options)
270
+ end
271
+
272
+ def radio_button_input_tag(name, value, checked = false, options = {})
273
+
274
+ if checked.is_a? Hash
275
+ options = checked
276
+ checked = false
277
+ end
278
+
279
+ options[:type] = :radio
280
+
281
+ tick_wrapper( name, options ) do
282
+ radio_button_tag(name, value, checked, options)
283
+ end
284
+
285
+ end
286
+
287
+ def checkbox_input_tag(name, checked = false, options = {})
288
+ value = true
289
+
290
+ if checked.is_a? Hash
291
+ options = checked
292
+ checked = false
293
+ end
294
+
295
+ options[:type] = :checkbox
296
+
297
+ tick_wrapper( name, options ) do
298
+ options.delete(:class)
299
+ concat tag :input, name: name, type: :hidden, value: false
300
+ concat check_box_tag(name, value, checked, options)
301
+ end
302
+ end
303
+
304
+ def select_input_tag(name, option_tags=nil, options={}, &block)
305
+ if option_tags.is_a? Hash
306
+ options = option_tags
307
+ option_tags = nil
308
+ end
309
+
310
+ options[:label] ||= options.delete(:label_placeholder)
311
+
312
+ option_tags ||= capture(&block).html_safe if block_given?
313
+
314
+ input_tag(:select, name, option_tags.html_safe, options)
315
+ end
316
+
317
+ def switch_input_tag(name, checked = false, options = {})
318
+
319
+ if checked.is_a? Hash
320
+ options = checked
321
+ checked = false
322
+ end
323
+
324
+ if label_text = options.delete(:label)
325
+ label_text = content_tag(:span, class: 'label-text') { label_text }
326
+ end
327
+
328
+ content_tag(:label, class: 'check-switch switch-label', data: { input: 'checkbox' }) do
329
+ concat tag :input, name: name, type: :hidden, value: false
330
+ concat label_text
331
+ concat check_box_tag(name, true, checked, options)
332
+
333
+ concat content_tag(:span, class: 'check-switch-panel') {
334
+ concat content_tag(:span, class: 'check-switch-tick') { '' }
335
+ }
336
+
337
+ concat content_tag(:span, class: 'check-switch-label') { 'Enable' }
338
+ end
339
+
340
+ end
341
+
342
+ private
343
+
344
+ def base_tag(name, value, options, type, &block)
345
+ case type
346
+ when :select
347
+ value = value.html_safe if value
348
+ select_tag(name, value, options)
349
+ when :textarea
350
+ value ||= capture(&block).html_safe if block_given?
351
+ options[:class] = "#{options[:class]} empty".strip if value.nil?
352
+ text_area_tag(name, value, options)
353
+ else
354
+ options[:class] = "#{options[:class]} empty".strip if value.nil?
355
+ text_field_tag(name, value, options)
356
+ end
357
+ end
358
+
359
+ def input_tag(type, name, value, options=nil, &block)
360
+ type.to_sym! if type.is_a?( String )
361
+
362
+ if value.is_a? Hash
363
+ options = value
364
+ value = nil
365
+ end
366
+
367
+ options = (INPUT_OPTIONS[type]||{}).deep_merge options
368
+ options[:type] ||= type
369
+
370
+
371
+ label_options = {
372
+ class: "#{label_class(options[:type])} #{options.delete(:class)}"
373
+ }
374
+
375
+ if label_placeholder = options.delete(:label_placeholder)
376
+ options[:placeholder] = label_placeholder
377
+ label_placeholder = content_tag(:span, class: 'placeholder-label-text') { label_placeholder }
378
+ label_options[:class] += ' placeholder-label'
379
+ end
380
+
381
+ if !label_placeholder && label_text = options.delete(:label)
382
+ label_text = content_tag(:span, class: 'label-text') { label_text }
383
+ end
384
+
385
+ content_tag(:label, label_options) {
386
+ concat label_text
387
+ concat base_tag(name, value, options, type, &block)
388
+ concat label_placeholder
389
+ }
390
+
391
+ end
392
+
393
+ private
394
+
395
+ def label_class( type )
396
+ type = case type
397
+ when :tel, :password, :number, :url, :email, :search
398
+ "text"
399
+ when :checkbox, :radio
400
+ "tick"
401
+ else
402
+ type.to_s
403
+ end
404
+
405
+ "#{type}-label"
406
+ end
407
+
408
+ def tick_wrapper( name, options, &block )
409
+
410
+ tag = capture(&block).html_safe
411
+
412
+ tick = content_tag(:span, class: 'tick') {''}
413
+ label = content_tag(:span, class: 'label-text') { options.delete(:label) || name }
414
+
415
+ options[:class] ||= ' '
416
+ options[:class] << "#{label_class( options.delete(:type) )} tick-box"
417
+
418
+ content_tag(:label, options ) {
419
+ concat tag.html_safe
420
+ concat tick
421
+ concat content_tag(:span, class: 'label-text-wrapper') { label }
422
+ }
423
+ end
424
+
425
+ def slider_input_tag(name, options={})
426
+ options = options.stringify_keys
427
+ classnames = options.delete('class') || ''
428
+
429
+ data = options['data'] || {}
430
+ data['input'] ||= name
431
+
432
+ if options['position_label']
433
+ data['position_label'] = options['position_label']
434
+ end
435
+
436
+ # Set values (and max based on values size)
437
+ if values = options['values']
438
+ data['values'] = values.join(',')
439
+ options['max'] ||= values.size - 1
440
+ end
441
+
442
+ # Support legacy option
443
+ options['labels'] ||= options['label']
444
+
445
+ if labels = options['labels']
446
+ if labels.is_a?(Array)
447
+ data['label'] = labels.join(';')
448
+ options['max'] ||= labels.size - 1
449
+ elsif labels.is_a?(Hash)
450
+ labels.each do |label, value|
451
+ data['label-'+dasherize(label.to_s.downcase)] = value.join(';')
452
+ options['max'] ||= value.size - 1
453
+ end
454
+ end
455
+ end
456
+
457
+ if labels == false
458
+ data['label'] = 'false'
459
+ end
460
+
461
+ if labels = options['external_labels']
462
+ if labels.is_a?(Hash)
463
+ labels.each do |label, value|
464
+ l = label.to_s.downcase.dasherize
465
+ data['external-label-'+l] = value.join(';')
466
+ end
467
+ end
468
+ end
469
+
470
+ if before = options['before']
471
+ if before.is_a?(String)
472
+ data['before-label'] = before
473
+ else
474
+ before.each do |key, value|
475
+ data["before-label-#{key}"] = value
476
+ end
477
+ end
478
+ end
479
+
480
+ if mark = options['mark']
481
+ data['mark'] = mark.join(',')
482
+ end
483
+
484
+ if after = options['after']
485
+ if after.is_a?(String)
486
+ data['after-label'] = after
487
+ else
488
+ after.each do |key, value|
489
+ data["after-label-#{key}"] = value
490
+ end
491
+ end
492
+ end
493
+
494
+ if line_labels = options['line_labels']
495
+ data['line_labels'] = []
496
+ line_labels.each do |k, v|
497
+ data['line_labels'] << "#{k}:#{v}"
498
+ end
499
+ data['line_labels'] = data['line_labels'].join(';')
500
+ end
501
+
502
+ options['value'] ||= options['min'] || 0
503
+
504
+ html_options = {"class" => classnames, "type" => "range", "min" => options['min'], "max" => options['max'], "value" => options['value'] }.update('data' => data)
505
+ tag :input, html_options
506
+ end
507
+ alias :range_input_tag :slider_input_tag
508
+ end
509
+ end