Samurai: Bring web standards to native platform

Samurai-Native enables you to build native apps using web technologies based on its own Web-Core.
Support iOS now, Android later.

Native Components

You can use the native components such as UICollectionView and UICollectionViewCell on iOS. This gives your app a consistent look and feel with the rest of the platform ecosystem, and keeps the quality bar high. These components are easily incorporated into your app using <UICollectionView/> and <UICollectionViewCell/> directly.

 <html> <body> <UICollectionView class="list" is-vertical> <UICollectionViewCell is-static is-row> ... </UICollectionViewCell> </UICollectionView> </body> </html>

HTML Components

You can use the standard HTML tags such as div and img on iOS. This gives you ability to define your user interface using a hybrid way.

 <html> <body> <UICollectionViewCell is-static is-row> <div class="profile-wrapper"> <div class="profile-attribution"> <div class="profile-segment no-wrap"> <div class="segment-wrapper"> <span class="segment-count">10,875</span> <span class="segment-suffix">Followers</span> </div> </div> <div class="profile-segment no-wrap"> <div class="segment-wrapper"> <span class="segment-count">199</span> <span class="segment-suffix">Followers</span> </div> </div> </div> </div> </UICollectionViewCell> </body> </html>

CSS Fluid layout

We brought the css layout model from the web to samurai-native, css layout makes it simple to build the most common UI layouts, such as stacked and nested boxes with margin and padding. samurai-native also supports common web styles, such as font-weight and border-radius, and you can extend your style in SamuraiHtmlRenderStyle class.

 <html> <head> <link rel="stylesheet" type="text/css" href="../css/normalize.css"/> <link rel="stylesheet" type="text/css" href="../css/main.css"/> </head> </html> 
 <html> <body> <p style="color: red;"> Hello, world! </p> </body> </html> 
 <html> <body> <div class="tab-bar"> <div class="tab">Popular</div> <div class="tab">Debuts</div> <div class="tab">Everyone</div> </div>  <style>  .tab-bar {  display: block;  width: 100%;  height: 34px;  background-color: #e5508c;  /* box-shadow: 0px 0.5px 0.5px black; */  z-index: 2;  }  .tab {  float: left;  display: block;  width: 33.33%;  height: 34px;  font-size: 14px;  line-height: 34px;  color: #fff 0.75;  text-align: center;  font-weight: normal;  }  </style> </body> </html> 

Easy to Integration

 @implementation MyViewController - (void)viewDidLoad { [self loadViewTemplate:@"/www/html/dribbble-index.html"]; // [self loadViewTemplate:@"http://localhost:8000/html/dribbble-index.html"]; } - (void)dealloc { [self unloadViewTemplate]; } - (void)onTemplateLoading {} - (void)onTemplateLoaded {} - (void)onTemplateFailed {} - (void)onTemplateCancelled {} @end 

Signal Handling

samurai-native provide a high level event system called Signal, you can interact (gesture) with HTML page through signal system.

 <div onclick="signal('hello')"> Click here </div> <div onswipe-left="signal('next')" onswipe-right="signal('prev')"> Swipe left or right </div> 
 @implementation MyViewController handleSignal( hello ) { [self doSomething]; } handleSignal( prev ) { [self doSomething]; } handleSignal( next ) { [self doSomething]; } @end 

Data Binding

samurai-native provide a efficient way to binding native objects to HTML page in single way through DOM's name property.

 <html> <body> <div name="author"> <img name="avatar"/> <div> <div name="title"/> <div>by <span name="name"/></div> </div> </div> </body> </html> 
 @implementation MyViewController - (void)reloadData { self[@"author"] = @{ @"avatar" : "xxx.jpg", @"title" : @"Hello", @"name" : @"World" }; } @end 

Extensibility

samurai-native is designed to be easily extended with custom native components, that means you can reuse anything you've already built, and can import and use your favorite native components.

 @implementation UILabel(Html) - (void)html_applyDom:(SamuraiHtmlDomNode *)dom { [super html_applyDom:dom]; self.text = [dom computeInnerText]; } - (void)html_applyStyle:(SamuraiHtmlRenderStyle *)style { [super html_applyStyle:style]; self.font = [style computeFont:self.font]; self.textColor = [style computeColor:self.textColor]; self.textAlignment = [style computeTextAlignment:self.textAlignment]; self.baselineAdjustment = [style computeBaselineAdjustment:self.baselineAdjustment]; self.lineBreakMode = [style computeLineBreakMode:self.lineBreakMode]; self.numberOfLines = 0; ... } @end 

Live reload

Add lines below into your main() function, samurai-native will applies HTML/CSS changes to iPhoneSimulator without rebuild and run the app.

[[SamuraiWatcher sharedInstance] watch:@(__FILE__)];

Running the Examples

Licensing

samurai-native is licensed under the MIT License.

Contributors

Related Projects