fron-ui 1.0.0rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +38 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +7 -0
  7. data/.yardopts +8 -0
  8. data/Gemfile +8 -0
  9. data/Gemfile.lock +105 -0
  10. data/Rakefile +37 -0
  11. data/Readme.md +4 -0
  12. data/db.json +192 -0
  13. data/fron-ui.gemspec +21 -0
  14. data/lib/fron-ui.rb +1 -0
  15. data/lib/fron_ui.rb +5 -0
  16. data/lib/fron_ui/version.rb +7 -0
  17. data/opal/fron-ui/base.rb +49 -0
  18. data/opal/fron-ui/behaviors/action.rb +40 -0
  19. data/opal/fron-ui/behaviors/actions.rb +40 -0
  20. data/opal/fron-ui/behaviors/confirmation.rb +23 -0
  21. data/opal/fron-ui/behaviors/dropdown.rb +27 -0
  22. data/opal/fron-ui/behaviors/file.rb +48 -0
  23. data/opal/fron-ui/behaviors/intendable_children.rb +76 -0
  24. data/opal/fron-ui/behaviors/keydown.rb +31 -0
  25. data/opal/fron-ui/behaviors/loop.rb +41 -0
  26. data/opal/fron-ui/behaviors/render.rb +30 -0
  27. data/opal/fron-ui/behaviors/rest.rb +121 -0
  28. data/opal/fron-ui/behaviors/selectable_children.rb +67 -0
  29. data/opal/fron-ui/behaviors/serialize.rb +32 -0
  30. data/opal/fron-ui/behaviors/shortcuts.rb +35 -0
  31. data/opal/fron-ui/behaviors/state.rb +56 -0
  32. data/opal/fron-ui/behaviors/transition.rb +63 -0
  33. data/opal/fron-ui/components/action.rb +18 -0
  34. data/opal/fron-ui/components/box.rb +17 -0
  35. data/opal/fron-ui/components/button.rb +61 -0
  36. data/opal/fron-ui/components/calendar.rb +129 -0
  37. data/opal/fron-ui/components/checkbox.rb +57 -0
  38. data/opal/fron-ui/components/chooser.rb +246 -0
  39. data/opal/fron-ui/components/color_panel.rb +235 -0
  40. data/opal/fron-ui/components/color_picker.rb +111 -0
  41. data/opal/fron-ui/components/container.rb +61 -0
  42. data/opal/fron-ui/components/date_picker.rb +141 -0
  43. data/opal/fron-ui/components/drag.rb +76 -0
  44. data/opal/fron-ui/components/dropdown.rb +72 -0
  45. data/opal/fron-ui/components/icon.rb +29 -0
  46. data/opal/fron-ui/components/image.rb +77 -0
  47. data/opal/fron-ui/components/input.rb +30 -0
  48. data/opal/fron-ui/components/label.rb +9 -0
  49. data/opal/fron-ui/components/list.rb +34 -0
  50. data/opal/fron-ui/components/loader.rb +63 -0
  51. data/opal/fron-ui/components/modal.rb +0 -0
  52. data/opal/fron-ui/components/notifications.rb +73 -0
  53. data/opal/fron-ui/components/number.rb +202 -0
  54. data/opal/fron-ui/components/progress.rb +52 -0
  55. data/opal/fron-ui/components/slider.rb +47 -0
  56. data/opal/fron-ui/components/tabs.rb +149 -0
  57. data/opal/fron-ui/components/textarea.rb +13 -0
  58. data/opal/fron-ui/components/time.rb +65 -0
  59. data/opal/fron-ui/components/title.rb +34 -0
  60. data/opal/fron-ui/examples/blog/index.rb +289 -0
  61. data/opal/fron-ui/examples/comments/components/comment.rb +75 -0
  62. data/opal/fron-ui/examples/comments/components/comments.rb +93 -0
  63. data/opal/fron-ui/examples/comments/components/footer.rb +36 -0
  64. data/opal/fron-ui/examples/comments/components/header.rb +35 -0
  65. data/opal/fron-ui/examples/comments/components/list.rb +12 -0
  66. data/opal/fron-ui/examples/comments/index.rb +6 -0
  67. data/opal/fron-ui/examples/contacts/components/contacts.rb +100 -0
  68. data/opal/fron-ui/examples/contacts/components/details.rb +92 -0
  69. data/opal/fron-ui/examples/contacts/components/item.rb +46 -0
  70. data/opal/fron-ui/examples/contacts/components/list.rb +10 -0
  71. data/opal/fron-ui/examples/contacts/components/sidebar.rb +30 -0
  72. data/opal/fron-ui/examples/contacts/index.rb +6 -0
  73. data/opal/fron-ui/examples/editor/index.rb +164 -0
  74. data/opal/fron-ui/examples/kitchensink/index.rb +193 -0
  75. data/opal/fron-ui/examples/todos/components/item.rb +84 -0
  76. data/opal/fron-ui/examples/todos/components/options.rb +26 -0
  77. data/opal/fron-ui/examples/todos/components/todos.rb +145 -0
  78. data/opal/fron-ui/examples/todos/index.rb +6 -0
  79. data/opal/fron-ui/examples/webshop/index.rb +0 -0
  80. data/opal/fron-ui/fonts/ionicons.rb +2954 -0
  81. data/opal/fron-ui/fonts/open_sans.rb +19 -0
  82. data/opal/fron-ui/lib/collection.rb +138 -0
  83. data/opal/fron-ui/lib/date.rb +23 -0
  84. data/opal/fron-ui/lib/debounce.rb +14 -0
  85. data/opal/fron-ui/lib/image_loader.rb +13 -0
  86. data/opal/fron-ui/lib/lorem.rb +93 -0
  87. data/opal/fron-ui/lib/nil.rb +29 -0
  88. data/opal/fron-ui/lib/record.rb +23 -0
  89. data/opal/fron-ui/lib/state_serializer.rb +129 -0
  90. data/opal/fron-ui/lib/storage.rb +57 -0
  91. data/opal/fron-ui/spec/setup.rb +40 -0
  92. data/opal/fron-ui/ui.rb +40 -0
  93. data/opal/fron-ui/utils/theme_roller.rb +63 -0
  94. data/opal/fron-ui/vendor/autoprefixer.js +21114 -0
  95. data/opal/fron-ui/vendor/marked.js +1291 -0
  96. data/opal/fron-ui/vendor/md5.js +274 -0
  97. data/opal/fron-ui/vendor/moment.js +3083 -0
  98. data/opal/fron-ui/vendor/uuid.js +92 -0
  99. data/opal/fron_ui.rb +13 -0
  100. data/spec/behaviors/action_spec.rb +34 -0
  101. data/spec/behaviors/actions_spec.rb +38 -0
  102. data/spec/behaviors/confirmation_spec.rb +23 -0
  103. data/spec/behaviors/dropdown_spec.rb +32 -0
  104. data/spec/behaviors/render_spec.rb +20 -0
  105. data/spec/behaviors/rest_spec.rb +70 -0
  106. data/spec/behaviors/selectable_children_spec.rb +40 -0
  107. data/spec/behaviors/serialize_spec.rb +34 -0
  108. data/spec/components/action_spec.rb +7 -0
  109. data/spec/components/base_spec.rb +19 -0
  110. data/spec/components/box_spec.rb +7 -0
  111. data/spec/components/button_spec.rb +9 -0
  112. data/spec/components/calendar_spec.rb +58 -0
  113. data/spec/components/checkbox_spec.rb +20 -0
  114. data/spec/components/chooser_spec.rb +75 -0
  115. data/spec/components/color_panel_spec.rb +49 -0
  116. data/spec/components/color_picker_spec.rb +41 -0
  117. data/spec/components/container_spec.rb +23 -0
  118. data/spec/components/date_picker_spec.rb +71 -0
  119. data/spec/components/drag_spec.rb +20 -0
  120. data/spec/components/dropdown_spec.rb +33 -0
  121. data/spec/components/image_spec.rb +33 -0
  122. data/spec/components/input_spec.rb +8 -0
  123. data/spec/components/list_spec.rb +10 -0
  124. data/spec/components/loader_spec.rb +9 -0
  125. data/spec/components/notifications_spec.rb +17 -0
  126. data/spec/components/number_spec.rb +64 -0
  127. data/spec/components/progress_spec.rb +23 -0
  128. data/spec/components/slider_spec.rb +25 -0
  129. data/spec/components/tabs_spec.rb +50 -0
  130. data/spec/components/textarea_spec.rb +7 -0
  131. data/spec/components/time_spec.rb +37 -0
  132. data/spec/components/title_spec.rb +11 -0
  133. data/spec/examples/comments_spec.rb +72 -0
  134. data/spec/examples/todos_spec.rb +39 -0
  135. data/spec/lib/collection_spec.rb +38 -0
  136. data/spec/lib/lorem_spec.rb +55 -0
  137. data/spec/lib/state_serializer_spec.rb +58 -0
  138. data/spec/lib/storage_spec.rb +39 -0
  139. data/spec/spec_helper.rb +1 -0
  140. metadata +223 -0
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe UI::Button do
4
+ before do
5
+ subject.text = 'ads'
6
+ end
7
+
8
+ it { subject[:type].should eq :primary }
9
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe UI::Calendar do
4
+ before do
5
+ allow(Date).to receive(:today).and_return Date.parse('2015-05-01')
6
+ end
7
+
8
+ context 'This year' do
9
+ it 'should display the active month name' do
10
+ expect(subject.header.label.text).to equal('May')
11
+ end
12
+ end
13
+
14
+ context 'Next year' do
15
+ before do
16
+ subject.render(Date.parse('2016-05-01'))
17
+ end
18
+
19
+ it 'should display the active month name and year' do
20
+ expect(subject.header.label.text).to equal('May 2016')
21
+ end
22
+ end
23
+
24
+ context 'Table' do
25
+ let(:cells) { subject.find_all('tbody td').map(&:text) }
26
+ let(:padding) { 4 }
27
+
28
+ it 'should display days' do
29
+ cells[padding..-1].count.should eq 31
30
+ end
31
+
32
+ it 'should pad cells' do
33
+ cells[0...padding].should eq ['', '', '', '']
34
+ end
35
+ end
36
+
37
+ context 'Clicking on the next month icon' do
38
+ it 'should render the next month' do
39
+ expect {
40
+ subject.find('[action=next_month]').trigger :click
41
+ }.to change { subject.header.label.text }.from('May').to('June')
42
+ end
43
+ end
44
+
45
+ context 'Clicking on the previous month icon' do
46
+ it 'should render the previous month' do
47
+ expect {
48
+ subject.find('[action=prev_month]').trigger :click
49
+ }.to change { subject.header.label.text }.from('May').to('April')
50
+ end
51
+ end
52
+
53
+ describe '#render' do
54
+ it 'should yield for every day' do
55
+ expect { |b| subject.render(&b) }.to yield_control.exactly(31).times
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe UI::Checkbox do
4
+ it 'should have tabindex' do
5
+ subject[:tabindex].should eq '0'
6
+ end
7
+
8
+ describe '#action' do
9
+ it 'should toggle' do
10
+ expect {
11
+ subject.action
12
+ }.to change { subject.checked }.from(false).to(true)
13
+ end
14
+
15
+ it 'should trigger change' do
16
+ expect(subject).to receive(:trigger).with :change
17
+ subject.action
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ describe UI::Chooser do
4
+ before do
5
+ subject.items = [{ id: 0, value: 'Test' }, { id: 1, value: 'Asd' }]
6
+ end
7
+
8
+ it 'should render items' do
9
+ subject.find_all('ui-chooser-item').count.should eq 2
10
+ end
11
+
12
+ context 'Focusing the input' do
13
+ let(:expectation) { expect { subject.input.trigger :focus } }
14
+
15
+ it 'should set focused attribute' do
16
+ expectation.to change { subject.attribute?(:focused) }.from(false).to(true)
17
+ end
18
+
19
+ it 'should empty the input' do
20
+ subject.input.value = 'test'
21
+ expectation.to change { subject.input.value }.from('test').to(nil)
22
+ end
23
+ end
24
+
25
+ context 'Bluring the input' do
26
+ let(:expectation) { expect { subject.input.trigger :blur } }
27
+
28
+ it 'should remove focused attribute' do
29
+ subject[:focused] = true
30
+ expectation.to change { subject.attribute?(:focused) }.from(true).to(false)
31
+ end
32
+
33
+ it 'should update the input field' do
34
+ subject.select_first
35
+ subject.input.value = ''
36
+ expectation.to change { subject.input.value }.from(nil).to('Test')
37
+ end
38
+ end
39
+
40
+ context 'Selecting inteded item' do
41
+ it 'should select it' do
42
+ expect {
43
+ subject.intend_next
44
+ subject.select_intended
45
+ subject.intend_previous
46
+ }.to change { subject.value }.from(nil).to('Test')
47
+ end
48
+ end
49
+
50
+ describe '#value' do
51
+ context 'Nothing selected' do
52
+ it 'should return nil' do
53
+ subject.value.should eq nil
54
+ end
55
+ end
56
+
57
+ context 'One selected' do
58
+ it 'should return single value' do
59
+ expect {
60
+ subject.select_first
61
+ }.to change { subject.value }.from(nil).to('Test')
62
+ end
63
+ end
64
+
65
+ context 'Multiple selected' do
66
+ it 'should return single value' do
67
+ expect {
68
+ subject.multiple = true
69
+ subject.select_last
70
+ subject.select_first
71
+ }.to change { subject.value }.from(nil).to(%w(Test Asd))
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe UI::ColorPanel do
4
+ it 'should have a default value' do
5
+ subject.color.hex.should eq 'ffffff'
6
+ end
7
+
8
+ context 'Changing the fields' do
9
+ it 'should update the color' do
10
+ expect(subject.hued).to receive(:value_y).and_return 0.5
11
+ expect(subject.recta).to receive(:value_y).and_return 0.5
12
+ expect(subject.recta).to receive(:value_x).and_return 0.5
13
+
14
+ subject.hued.trigger :change
15
+
16
+ subject.hue.should eq 180
17
+ subject.saturation.should eq 50
18
+ subject.value.should eq 50
19
+ end
20
+ end
21
+
22
+ describe '#hue=' do
23
+ it 'should set the value_y of hued' do
24
+ subject.hued.should receive(:value_y=).with(0.5)
25
+ subject.hue = 180
26
+ end
27
+ end
28
+
29
+ describe '#value=' do
30
+ it 'should set the value_y of rect' do
31
+ subject.recta.should receive(:value_y=).with(0.5)
32
+ subject.value = 50
33
+ end
34
+ end
35
+
36
+ describe '#saturation=' do
37
+ it 'should set the value_y of rect' do
38
+ subject.recta.should receive(:value_x=).with(0.5)
39
+ subject.saturation = 50
40
+ end
41
+ end
42
+
43
+ describe '#color=' do
44
+ it 'should set color from CSS' do
45
+ subject.color = :red
46
+ subject.color.hex.should eq 'ff0000'
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe UI::ColorPicker do
4
+ it 'should have a default value' do
5
+ subject.value.should eq '#FFFFFF'
6
+ end
7
+
8
+ describe '#value=' do
9
+ context 'Valid' do
10
+ it 'should set the value' do
11
+ expect {
12
+ subject.value = :orangered
13
+ }.to change { subject.input.value }.from('#FFFFFF').to(:orangered)
14
+ end
15
+ end
16
+
17
+ context 'Invalid' do
18
+ it 'should_not set the value' do
19
+ expect {
20
+ subject.value = :asd
21
+ }.to change { subject.input.value }.from('#FFFFFF').to('rgba(255,255,255,0.0)')
22
+ end
23
+ end
24
+ end
25
+
26
+ context 'Focusing on the input' do
27
+ it 'should update the dropdown' do
28
+ subject.should receive(:update_dropdown)
29
+ subject.input.trigger :focus
30
+ end
31
+ end
32
+
33
+ context 'Setting value' do
34
+ it 'should update dropdown' do
35
+ expect {
36
+ subject.input.value = :orangered
37
+ subject.input.trigger :change
38
+ }.to change { subject.input.value }.from('#FFFFFF').to(:orangered)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe UI::Container do
4
+ it 'should set defaults' do
5
+ subject.direction.should eq :column
6
+ end
7
+
8
+ describe '#compact' do
9
+ context 'false' do
10
+ it 'should remvoe compact attribute' do
11
+ subject.compact = false
12
+ expect {
13
+ subject.compact = true
14
+ }.to change { subject.attribute?(:compact) }.from(false).to(true)
15
+ end
16
+ end
17
+
18
+ context 'true' do
19
+ it 'should add compact attribute' do
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ describe UI::DatePicker do
4
+ before do
5
+ allow(Date).to receive(:today).and_return Date.parse('2015-01-01')
6
+ end
7
+
8
+ it 'should set default value' do
9
+ subject.value.should eq Date.today
10
+ end
11
+
12
+ it 'should set selected td' do
13
+ subject.find('.selected')[:date].should eq '2015-01-01'
14
+ end
15
+
16
+ context 'Focusing the input' do
17
+ it 'should render the dropdown' do
18
+ subject.should receive(:render)
19
+ subject.input.trigger :focus
20
+ end
21
+ end
22
+
23
+ context 'Changing the input' do
24
+ it 'should set the value' do
25
+ expect {
26
+ subject.input.value = '2015-05-05'
27
+ subject.input.trigger :change
28
+ }.to change { subject.find('.selected')[:date] }.from('2015-01-01').to('2015-05-05')
29
+ end
30
+ end
31
+
32
+ context 'Pressing down' do
33
+ it 'should select next day' do
34
+ expect {
35
+ subject.trigger :keydown, keyCode: 40, shiftKey: false
36
+ }.to change { subject.value }.from(Date.today).to(Date.today + 1)
37
+ end
38
+ end
39
+
40
+ context 'Pressing down with shift' do
41
+ it 'should select next day' do
42
+ expect {
43
+ subject.trigger :keydown, keyCode: 40, shiftKey: true
44
+ }.to change { subject.value }.from(Date.today).to(Date.today.next_month)
45
+ end
46
+ end
47
+
48
+ context 'Pressing up' do
49
+ it 'should select next day' do
50
+ expect {
51
+ subject.trigger :keydown, keyCode: 38, shiftKey: false
52
+ }.to change { subject.value }.from(Date.today).to(Date.today - 1)
53
+ end
54
+ end
55
+
56
+ context 'Pressing up with shift' do
57
+ it 'should select next day' do
58
+ expect {
59
+ subject.trigger :keydown, keyCode: 38, shiftKey: true
60
+ }.to change { subject.value }.from(Date.today).to(Date.today.prev_month)
61
+ end
62
+ end
63
+
64
+ context 'Selecting a date' do
65
+ it 'should set the value' do
66
+ expect {
67
+ subject.find('[date="2015-01-21"]').trigger :click
68
+ }.to change { subject.value }.from(Date.today).to(Date.parse('2015-01-21'))
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe UI::Drag do
4
+ before do
5
+ allow(subject).to receive(:width).and_return 100
6
+ allow(subject).to receive(:height).and_return 100
7
+ end
8
+
9
+ context 'Dragging on the component' do
10
+ let(:expectation) { expect { mock_drag subject.drag, 10, 10 } }
11
+
12
+ it 'should move the handle horizontally' do
13
+ expectation.to change { subject.handle.style.top }.from('').to('10px')
14
+ end
15
+
16
+ it 'should move the handle vertically' do
17
+ expectation.to change { subject.handle.style.left }.from('').to('10px')
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe UI::Dropdown do
4
+ describe '#open' do
5
+ it 'should add open class' do
6
+ expect {
7
+ subject.open
8
+ }.to change { subject.has_class(:open) }.from(false).to(true)
9
+ end
10
+
11
+ it 'should set vertical attribute' do
12
+ expect {
13
+ subject.open
14
+ }.to change { subject[:vertical] }.from(nil).to(:bottom)
15
+ end
16
+
17
+ it 'should set horizontal attribute' do
18
+ expect {
19
+ subject.open
20
+ }.to change { subject[:horizontal] }.from(nil).to(:right)
21
+ end
22
+ end
23
+
24
+ describe '#close' do
25
+ it 'should remove open class' do
26
+ subject.add_class :open
27
+ expect {
28
+ subject.close
29
+ subject.trigger :animationend, animationName: 'ui-dropdown-hide'
30
+ }.to change { subject.has_class(:open) }.from(true).to(false)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe UI::Image do
4
+ it 'should listen on load' do
5
+ expect {
6
+ subject.img.trigger :load
7
+ }.to change { subject.img.has_class(:loaded) }.from(false).to(true)
8
+ end
9
+
10
+ describe '#width=' do
11
+ it 'should set the width of the image' do
12
+ expect {
13
+ subject.width = '100px'
14
+ }.to change { subject.style.width }.from('').to('100px')
15
+ end
16
+ end
17
+
18
+ describe '#height=' do
19
+ it 'should set the height of the image' do
20
+ expect {
21
+ subject.height = '100px'
22
+ }.to change { subject.style.height }.from('').to('100px')
23
+ end
24
+ end
25
+
26
+ describe '#src=' do
27
+ it 'should set the src of the image' do
28
+ expect {
29
+ subject.src = '//placehold.it/250/f9f9f9/333'
30
+ }.to change { subject.src }.from(nil).to('//placehold.it/250/f9f9f9/333')
31
+ end
32
+ end
33
+ end