fron-ui 1.0.0rc2

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 (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