effects.rml 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <rml>
  2. <head>
  3. <link type="text/rcss" href="/assets/rml.rcss"/>
  4. <link type="text/rcss" href="effects_style.rcss"/>
  5. <title>Effects Sample</title>
  6. <style>
  7. @spritesheet effects-sheet
  8. {
  9. src: /assets/invader.tga;
  10. icon-invader: 179px 152px 51px 39px;
  11. }
  12. .filter {
  13. transform-origin: 50% 0;
  14. }
  15. .box {
  16. color: black;
  17. font-size: 18dp;
  18. width: 280dp;
  19. height: 70dp;
  20. background: #fff8;
  21. border: 2dp #def6f7;
  22. margin: 10dp auto;
  23. padding: 15dp;
  24. border-radius: 30dp 8dp;
  25. box-sizing: border-box;
  26. position: relative;
  27. }
  28. .box img, .box .placeholder {
  29. float: left;
  30. margin-right: 8dp;
  31. }
  32. .box .placeholder {
  33. width: 51dp;
  34. height: 39dp;
  35. }
  36. .box .label {
  37. color: #bbba;
  38. position: absolute;
  39. font-size: 0.75em;
  40. bottom: 0.1em;
  41. right: 1.5em;
  42. }
  43. .box.window {
  44. position: absolute;
  45. left: 30dp;
  46. margin: 0;
  47. }
  48. .box.window handle {
  49. position: absolute;
  50. top: 0; right: 0; bottom: 0; left: 0;
  51. display: block;
  52. cursor: move;
  53. }
  54. .box.big {
  55. width: 500dp;
  56. height: 260dp;
  57. max-width: 100%;
  58. border-color: #333;
  59. }
  60. .transform, .filter.transform_all > .box { transform: rotate3d(0.2, 0.4, 0.1, 15deg); }
  61. .mask {
  62. decorator: horizontal-gradient(#f00 #ff0);
  63. mask-image: image(icon-invader scale-none 15px 50%), horizontal-gradient(#0000 #000f);
  64. }
  65. .shader { decorator: shader("creation"); }
  66. .gradient { decorator: linear-gradient(110deg, #fff3, #fff 10%, #c33 250dp, #3c3, #33c, #000 90%, #0003) border-box; }
  67. .brightness { filter: brightness(0.5); }
  68. .contrast { filter: contrast(0.5); }
  69. .sepia { filter: sepia(80%); }
  70. .grayscale { filter: grayscale(0.9); }
  71. .saturate { filter: saturate(200%); }
  72. .hue_rotate { filter: hue-rotate(260deg); }
  73. .invert { filter: invert(100%); }
  74. .opacity_low { filter: opacity(0.2); }
  75. .blur { filter: blur(10px); }
  76. .back_blur { backdrop-filter: blur(5px); }
  77. .dropshadow { filter: drop-shadow(#f33f 30px 20px 5px); }
  78. .boxshadow_blur {
  79. box-shadow:
  80. #f00f 40px 30px 25px 0px,
  81. #00ff -40px -30px 45px 0px,
  82. #0f08 -60px 70px 60px 0px,
  83. #333a 0px 0px 30px 15px inset
  84. ;
  85. margin-top: 100px;
  86. margin-bottom: 100px;
  87. }
  88. .boxshadow_trail {
  89. box-shadow:
  90. #f66 30dp 30dp 0 0,
  91. #c88 60dp 60dp 0 0,
  92. #baa 90dp 90dp 0 0,
  93. #ffac 0 0 .8em 8dp inset
  94. ;
  95. margin-bottom: 100px;
  96. filter: opacity(1); /* Tests filter clipping behavior when element has ink overflow due to box-shadow. */
  97. }
  98. .boxshadow_inset { box-shadow: #f4fd 10px 5px 5px 3px inset; }
  99. @keyframes animate-filter {
  100. from { filter: drop-shadow(#f00) opacity(1.0) sepia(1.0); }
  101. to { filter: drop-shadow(#000 30px 20px 5px) opacity(0.2) sepia(0.2); }
  102. }
  103. .animate {
  104. animation: animate-filter 1.5s cubic-in-out infinite alternate;
  105. }
  106. </style>
  107. </head>
  108. <body
  109. data-model="effects"
  110. data-style-perspective="perspective >= 3000 ? 'none' : perspective + 'dp'"
  111. data-style-perspective-origin-x="perspective_origin_x + '%'"
  112. data-style-perspective-origin-y="perspective_origin_y + '%'"
  113. >
  114. <handle move_target="#document"><h1>Effects Sample</h1></handle>
  115. <handle class="size" size_target="#document"/>
  116. <div id="menu_button" data-class-open="show_menu" data-event-click="show_menu = !show_menu">—<br/>—<br/>—</div>
  117. <div id="menu" data-if="show_menu">
  118. <div id="submenu">
  119. <div data-event-click="submenu = 'filter'" data-class-selected="submenu == 'filter'">Filter</div>
  120. <div data-event-click="submenu = 'transform'" data-class-selected="submenu == 'transform'">Transform</div>
  121. </div>
  122. <table>
  123. <col style="width: 200%"/><col style="width: 300%"/><col style="width: 100%"/>
  124. <tbody data-if="submenu == 'filter'">
  125. <tr><td>Opacity</td><td><input type="range" min="0" max="1" step="0.01" data-value="opacity"/></td><td>{{ opacity }}</td></tr>
  126. <tr><td>Sepia</td><td><input type="range" min="0" max="1" step="0.01" data-value="sepia"/></td><td>{{ sepia*100 }} %</td></tr>
  127. <tr><td>Grayscale</td><td><input type="range" min="0" max="1" step="0.01" data-value="grayscale"/></td><td>{{ grayscale*100 }} %</td></tr>
  128. <tr><td>Saturate</td><td><input type="range" min="0" max="2" step="0.01" data-value="saturate"/></td><td>{{ saturate*100 }} %</td></tr>
  129. <tr><td>Brightness</td><td><input type="range" min="0" max="2" step="0.02" data-value="brightness"/></td><td>{{ brightness*100 }} %</td></tr>
  130. <tr><td>Contrast</td><td><input type="range" min="0" max="2" step="0.02" data-value="contrast"/></td><td>{{ contrast*100 }} %</td></tr>
  131. <tr><td>Hue</td><td><input type="range" min="0" max="360" step="1" data-value="hue_rotate"/></td><td>{{ hue_rotate }} deg</td></tr>
  132. <tr><td>Invert</td><td><input type="range" min="0" max="1" step="0.01" data-value="invert"/></td><td>{{ invert*100 }} %</td></tr>
  133. <tr><td>Blur</td><td><input type="range" min="0" max="50" step="1" data-value="blur"/></td><td>{{ blur }} px</td></tr>
  134. <tr><td><label for="drop_shadow">Drop shadow</label></td><td colspan="2"><input id="drop_shadow" type="checkbox" data-checked="drop_shadow"/></td></tr>
  135. </tbody>
  136. <tbody data-if="submenu == 'transform'">
  137. <tr><td>Scale</td><td><input type="range" min="0.1" max="2.0" step="0.1" data-value="scale"/></td><td>{{ scale | format(1) }}x</td></tr>
  138. <tr><td>Rotate X</td><td><input type="range" min="-90" max="90" step="5" data-value="rotate_x"/></td><td>{{ rotate_x }} deg</td></tr>
  139. <tr><td>Rotate Y</td><td><input type="range" min="-90" max="90" step="5" data-value="rotate_y"/></td><td>{{ rotate_y }} deg</td></tr>
  140. <tr><td>Rotate Z</td><td><input type="range" min="-90" max="90" step="5" data-value="rotate_z"/></td><td>{{ rotate_z }} deg</td></tr>
  141. <tr><td>Perspective</td><td><input type="range" min="100" max="3000" step="25" data-value="perspective"/></td><td>{{ perspective >= 3000 ? 'none' : perspective + ' dp' }}</td></tr>
  142. <tr><td>Perspective X</td><td><input type="range" min="-100" max="200" step="5" data-value="perspective_origin_x" data-attrif-disabled="perspective >= 3000"/></td><td>{{ perspective_origin_x }} %</td></tr>
  143. <tr><td>Perspective Y</td><td><input type="range" min="-100" max="200" step="5" data-value="perspective_origin_y" data-attrif-disabled="perspective >= 3000"/></td><td>{{ perspective_origin_y }} %</td></tr>
  144. <tr><td><label for="transform_all">Transform all</label></td><td colspan="2"><input id="transform_all" type="checkbox" data-checked="transform_all"/></td></tr>
  145. </tbody>
  146. </table>
  147. <button data-event-click="reset()">Reset</button>
  148. </div>
  149. <div class="filter"
  150. data-style-transform="'scale(' + scale + ') rotateX(' + rotate_x + 'deg) rotateY(' + rotate_y + 'deg) rotateZ(' + rotate_z + 'deg)'"
  151. data-style-filter="'opacity(' + opacity + ') sepia(' + sepia + ') grayscale(' + grayscale + ') saturate(' + saturate + ') brightness(' + brightness + ') contrast(' + contrast + ') hue-rotate(' + hue_rotate + 'deg) invert(' + invert + ') blur(' + blur + 'px)' + (drop_shadow ? ' drop-shadow(#f11b 10px 10px 8px)' : '')"
  152. data-class-transform_all="transform_all"
  153. >
  154. <div class="box boxshadow_blur transform"><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  155. <div class="box boxshadow_trail"><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  156. <div class="box boxshadow_inset"><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  157. <div class="box"><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  158. <div class="box big shader"><div class="label">"Creation" (Danilo Guanabara)</div></div>
  159. <div class="box big gradient"><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  160. <div class="box mask"><div class="placeholder"/>Hello, do you feel the funk?</div>
  161. <div class="box hue_rotate"><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  162. <div class="box animate"><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  163. <div class="box saturate"><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  164. <div class="box invert"><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  165. <div class="box blur"><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  166. <div class="box brightness"><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  167. <div class="box contrast"><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  168. <div class="box dropshadow"><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  169. <div class="box grayscale"><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  170. <div class="box opacity_low"><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  171. </div>
  172. <div class="box window sepia" style="top: 375dp"><handle move_target="#parent"/><img sprite="icon-invader"/>Hello, do you feel the funk?</div>
  173. <div class="box window back_blur" style="top: 475dp"><handle move_target="#parent"/><img sprite="icon-invader"/>Hello, do you feel the funk?
  174. </div>
  175. </body>
  176. </rml>