├── .babelrc ├── .eslintrc ├── .gitignore ├── .npmignore ├── .travis.yml ├── README.md ├── demo ├── BreadcrumbDemo.jsx ├── ButtonDemo.jsx ├── CardDemo.jsx ├── CheckboxDemo.jsx ├── CommentDemo.jsx ├── ContainerDemo.jsx ├── DividerDemo.jsx ├── FeedDemo.jsx ├── FlagDemo.jsx ├── FormDemo.jsx ├── GridDemo.jsx ├── HeaderDemo.jsx ├── IconDemo.jsx ├── ImageDemo.jsx ├── InputDemo.jsx ├── ItemDemo.jsx ├── LabelDemo.jsx ├── ListDemo.jsx ├── MenuDemo.jsx ├── MessageDemo.jsx ├── ParagraphExample.jsx ├── RailDemo.jsx ├── SegmentDemo.jsx ├── StatisticDemo.jsx ├── StepDemo.jsx ├── TableDemo.jsx ├── bomi.jpg ├── bomi_square.jpg ├── example.css ├── genji.jpg ├── image.png ├── index.js └── paragraph.png ├── npm-shrinkwrap.json ├── package.json ├── src ├── collections │ ├── Message.jsx │ ├── breadcrumb │ │ ├── Breadcrumb.jsx │ │ ├── BreadcrumbDivider.jsx │ │ └── BreadcrumbSection.jsx │ ├── form │ │ ├── Form.jsx │ │ ├── FormField.jsx │ │ └── FormFieldGroup.jsx │ ├── grid │ │ ├── Column.jsx │ │ ├── Grid.jsx │ │ └── Row.jsx │ ├── menu │ │ ├── Menu.jsx │ │ └── MenuItem.jsx │ └── table │ │ ├── Table.jsx │ │ ├── TableCell.jsx │ │ ├── TableFooter.jsx │ │ ├── TableHeader.jsx │ │ └── TableRow.jsx ├── common │ ├── SemanticUiPropTypes.js │ └── semanticClasses.js ├── elements │ ├── Container.jsx │ ├── Divider.jsx │ ├── Flag.jsx │ ├── Header.jsx │ ├── Icon.jsx │ ├── Input.jsx │ ├── List.jsx │ ├── Rail.jsx │ ├── button │ │ ├── Button.jsx │ │ └── ButtonGroup.jsx │ ├── extra │ │ ├── Actions.jsx │ │ ├── Author.jsx │ │ ├── Avatar.jsx │ │ ├── Content.jsx │ │ ├── ContentDescription.jsx │ │ ├── ContentHeader.jsx │ │ ├── ContentImages.jsx │ │ ├── ContentSummary.jsx │ │ ├── Date.jsx │ │ ├── Extra.jsx │ │ ├── Meta.jsx │ │ ├── MetaData.jsx │ │ └── Text.jsx │ ├── image │ │ ├── Image.jsx │ │ └── ImageGroup.jsx │ ├── label │ │ ├── Label.jsx │ │ └── LabelGroup.jsx │ ├── segment │ │ ├── Segment.jsx │ │ └── SegmentGroup.jsx │ └── step │ │ ├── Step.jsx │ │ └── StepGroup.jsx ├── index.js ├── modules │ ├── Checkbox.jsx │ ├── Modal.jsx │ ├── ModalActions.jsx │ ├── ModalContent.jsx │ └── ModalHeader.jsx ├── util │ ├── propsToClasses.js │ ├── spellNumber.js │ └── string.js └── views │ ├── card │ ├── Card.jsx │ └── CardGroup.jsx │ ├── comment │ ├── Comment.jsx │ └── CommentGroup.jsx │ ├── feed │ ├── Feed.jsx │ └── FeedEvent.jsx │ ├── item │ ├── Item.jsx │ └── ItemGroup.jsx │ └── statistic │ ├── Statistic.jsx │ └── StatisticGroup.jsx ├── test ├── common │ └── semanticClasses_spec.js ├── components │ └── elements │ │ └── Rail_spec.js ├── test_helper.js └── util │ └── string_spec.js └── webpack.config.dev.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["transform-runtime"], 3 | "presets": ["es2015", "react", "stage-0"] 4 | } 5 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "babel-eslint", 3 | "env": { 4 | "browser": true, 5 | "node": true 6 | }, 7 | "plugins": [ 8 | "react" 9 | ], 10 | "ecmaFeatures": { 11 | "jsx": true, 12 | "modules": true 13 | }, 14 | "rules": { 15 | "new-cap": 0, 16 | "strict": [2, "global"], 17 | "no-underscore-dangle": 0, 18 | "no-use-before-define": 0, 19 | "eol-last": 0, 20 | "quotes": [2, "single"], 21 | "comma-dangle": 0, 22 | "jsx-quotes": [1, "prefer-single"], 23 | "react/jsx-boolean-value": 1, 24 | "react/jsx-no-undef": 1, 25 | "react/jsx-uses-react": 1, 26 | "react/jsx-uses-vars": 1, 27 | "react/no-did-mount-set-state": 1, 28 | "react/no-did-update-set-state": 1, 29 | "react/no-multi-comp": [1, { "ignoreStateless": true }], 30 | "react/no-unknown-property": 1, 31 | "react/react-in-jsx-scope": 1, 32 | "react/self-closing-comp": 1 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | lib 3 | dist 4 | .tern-project 5 | 6 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src/ 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - "4.2" 5 | - "5.0" 6 | 7 | cache: 8 | directories: 9 | - node_modules 10 | 11 | sudo: false 12 | 13 | before_install: 14 | - npm install -g npm@3 15 | 16 | before_script: 17 | - npm prune 18 | 19 | script: 20 | - npm test 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-semantic-ui-kit 2 | 3 | [![Build Status](https://travis-ci.org/shinzui/react-semantic-ui-kit.png?branch=master)](https://travis-ci.org/shinzui/react-semantic-ui-kit) 4 | 5 | [Semantic UI](http://semantic-ui.com/) rebuilt as React components. 6 | 7 | ## Raison d'être 8 | 9 | - I needed a comprehensive UI component library to use on my side projects. 10 | - I am unsatisfied with [Bootstrap](http://getbootstrap.com/) (including boostrap 4 alpha) and [Foundation for sites](http://foundation.zurb.com/). 11 | - I wanted to learn how to use Semantic UI. 12 | 13 | ## Goals 14 | 15 | - Create components for Semantic UI widgets without using any of Semantic UI's javascript. 16 | 17 | ## Current status 18 | 19 | The project is under heavy development. The goal is to initially implement all components without their javascript behaviors for the [0.2 milestone](https://github.com/shinzui/react-semantic-ui-kit/milestones/0.2). 20 | Please check the demo to see what's already implemented. 21 | 22 | To run the demo: 23 | 24 | $ git clone https://github.com/shinzui/react-semantic-ui-kit.git 25 | $ cd react-semantic-ui-kit && npm install && npm run demo 26 | 27 | Then go to http://localhost:8080/demo 28 | 29 | Alternatively, you can look at the [closed component issues](https://github.com/shinzui/react-semantic-ui-kit/issues?utf8=%E2%9C%93&q=milestone%3A0.2+) which has all the 30 | **fully implemented** Semantic UI components. 31 | 32 | Please note that the API will likely change as I use it on my projects. 33 | -------------------------------------------------------------------------------- /demo/BreadcrumbDemo.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { Segment, Breadcrumb, BreadcrumbDivider, BreadcrumbSection, Divider, Icon } from '../src/index' 4 | 5 | const BreadcrumbDemo = (props) => { 6 | const sizes = ['mini', 'tiny', 'small', 'medium', 'large', 'big', 'huge', 'massive'] 7 | 8 | return ( 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | Search for: properties 34 | 35 | 36 | 37 | 38 | 39 | {sizes.map( size => { 40 | return ( 41 |
42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
51 | ) 52 | })} 53 |
54 |
55 | 56 | ) 57 | } 58 | 59 | export default BreadcrumbDemo 60 | -------------------------------------------------------------------------------- /demo/ButtonDemo.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { Button, ButtonGroup, Header, Content, 3 | Divider, Segment, Label } from '../src/index' 4 | 5 | import ParagrahExample from './ParagraphExample' 6 | 7 | export default class ButtonDemo extends Component { 8 | 9 | render() { 10 | const colors = ['red', 'orange', 'yellow', 'olive', 'green', 'teal', 'blue', 11 | 'violet', 'purple', 'pink', 'brown', 'grey', 'black'] 12 | 13 | const sizes = ['mini', 'tiny', 'small', 'medium', 'large', 'big', 'huge', 'massive'] 14 | 15 | return ( 16 |
17 | 18 |

Simple button

19 | 20 |
21 | 22 | 23 |

Basic buttons

24 | 25 | 26 | {colors.map( color => { 27 | return 28 | })} 29 |
30 | 31 | 32 |

Primary and secondary buttons

33 | 34 | 35 |
36 | 37 | 38 | 41 | 42 | 43 | 44 |

Labeled icon

45 | 49 |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 |

Equal width button group

61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 |
77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 |
91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | {colors.map( color => { 108 | return 109 | })} 110 | 111 | 112 | 113 | {colors.map( color => { 114 | return 115 | })} 116 | 117 | 118 | 119 | {colors.map( color => { 120 | return 121 | })} 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 136 | 137 | 138 | 139 |

Active button

140 | 143 |
144 | 145 | 146 |

Disabled button

147 | 150 |
151 | 152 | 153 |

Loading buttons

154 | 155 | 156 | 157 | 158 |
159 | 160 | 161 |

Fluid buttons

162 | 163 |
164 | 165 | 166 |

Floated buttons

167 | 168 | 169 | 170 | 171 |
172 | 173 | 174 | 178 | 179 | 180 | 185 | 186 | 190 | 191 | 192 | 196 | 197 | 198 | 199 | 200 | 201 | 204 | 207 | 210 | 213 | 216 | 219 | 222 | 223 | 224 | 225 |
Sizes
226 | 227 | {sizes.map( size => { 228 | return 229 | })} 230 |
231 | 232 | 233 |

Vertical attachment

234 | 235 | 236 | 237 | 238 | 239 |
240 | 241 | 242 |

Horizontal attachment

243 | 244 | 245 |
246 | 247 | 248 |

Vertical button group

249 | 250 | 251 | 252 | 253 | 254 | 255 |
256 | 257 | 258 |

Basic vertical button group

259 | 260 | 261 | 262 | 263 | 264 | 265 |
266 | 267 | 268 |

Basic button group

269 | 270 | 271 | 272 | 273 | 274 | 275 |
276 | 277 | 278 |

Animated buttons

279 | 283 | 287 | 291 |
292 | 293 | 294 |

Vertical labeled icon buttons

295 | 296 | 300 | 304 | 308 | 309 |
310 | 311 | 312 |
Button group sizes
313 | 314 | {sizes.map( size => { 315 | return
316 | 317 | 318 | 319 | 320 | 321 | 322 |
323 | })} 324 | 325 |
326 |
327 | ) 328 | } 329 | } 330 | -------------------------------------------------------------------------------- /demo/CardDemo.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { Segment, Card, CardGroup, Meta, Image, Grid, Column, 4 | Content, ContentDescription, ContentHeader } from '../src/index' 5 | 6 | import ParagraphExample from './ParagraphExample' 7 | 8 | import bomi from './bomi_square.jpg' 9 | import bomi2 from './bomi.jpg' 10 | import image from './image.png' 11 | 12 | const CardDemo = (props) => { 13 | const colors = ['red', 'orange', 'yellow', 'olive', 'green', 'teal', 'blue', 14 | 'violet', 'purple', 'pink', 'brown', 'grey', 'black'] 15 | return ( 16 |
17 | 18 | 19 |
20 | 21 |
22 | 23 | Bomi 24 | 25 | Born in 2015 26 | 27 | 28 | Bomi is a bengal cat. 29 | 30 | 31 | 32 | 33 | 323 Likes 34 | 35 |
36 | 37 | 38 | 39 | 40 | 14h 41 | 42 | Bomi 43 | 44 |
45 | 46 |
47 | 48 | 49 | 50 | 51 | 317 likes 52 | 53 | 54 | 39 comments 55 | 56 | 57 |
58 | 59 | 60 |
61 |
62 |
63 |
64 | 65 | 66 |

Grouped cards

67 | 68 | 69 |
70 | 71 |
72 | 73 | Bomi 74 | 75 | Born in 2015 76 | 77 | 78 | Bomi is a bengal cat. 79 | 80 | 81 | 82 | 83 | 323 Likes 84 | 85 |
86 | 87 |
88 | 89 |
90 | 91 | Bomi 92 | 93 | Born in 2015 94 | 95 | 96 | Bomi is a bengal cat. 97 | 98 | 99 | 100 | 101 | 323 Likes 102 | 103 |
104 |
105 |
106 | 107 | 108 |

Fluid Card

109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | Bomi 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | Bomi 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | Bomi 137 | 138 | 139 | 140 | 141 | 142 |
143 | 144 | 145 |

Centered card

146 | 147 | 148 | 149 | 150 | Bomi 151 | 152 | 153 | 154 |
155 | 156 | 157 |

Link card

158 | 159 | 160 | 161 | 162 | Cute Bomi 163 | 164 | 165 | 166 | Bengal cat 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 |
175 | 176 | Bomi 177 |
178 |
179 |
180 |
181 | 182 | 183 |

Colored

184 | 185 | {colors.map( color => { 186 | return ( 187 | 188 | 189 | 190 | 191 | {color} card 192 | 193 | 194 | 195 | ) 196 | })} 197 | 198 |
199 | 200 | 201 |

Column count

202 | 203 | {[1,2,3,4,5,6,7,8].map( (e) => { 204 | return ( 205 | 206 | 207 | 208 | 209 | Card 210 | 211 | 212 | 213 | ) 214 | })} 215 | 216 |
217 | 218 | 219 |

Stackable

220 | 221 | {[1,2,3,4,5,6].map( (e) => { 222 | return ( 223 | 224 | 225 | 226 | 227 | Card 228 | 229 | 230 | 231 | ) 232 | })} 233 | 234 |
235 | 236 | 237 |

Doubling

238 | 239 | {[1,2,3,4,5,6].map( (e) => { 240 | return ( 241 | 242 | 243 | 244 | 245 | Card 246 | 247 | 248 | 249 | ) 250 | })} 251 | 252 |
253 | 254 |
255 | ) 256 | } 257 | 258 | export default CardDemo 259 | -------------------------------------------------------------------------------- /demo/CheckboxDemo.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { Segment, Checkbox } from '../src/index' 4 | 5 | const CheckboxDemo = (props) => { 6 | 7 | return ( 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |

Radio

21 | 22 | 23 |
24 | 25 |
26 | ) 27 | } 28 | 29 | export default CheckboxDemo 30 | -------------------------------------------------------------------------------- /demo/CommentDemo.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { Comment, CommentGroup, Segment, Header, 4 | Content, MetaData, Avatar, Date, Author, 5 | Text, Actions, Form, Button } from '../src/index' 6 | 7 | import bomi from './bomi_square.jpg' 8 | 9 | const CommentDemo = (props) => { 10 | return ( 11 |
12 | 13 | 14 |
Comment
15 | 16 | 17 | 18 | Bomi 19 | 20 | Today at 5:42PM 21 | 22 | 23 | React is a great library. 24 | 25 | 26 | Reply 27 | 28 | 29 | 30 |
31 |
32 |