├── .gitignore ├── Houdini ├── Python-Operators │ ├── curveFramePT.hdanc │ ├── curveFramePT.py │ ├── nearestNeighborsConnection.hdanc │ ├── nearestNeighborsConnection.py │ ├── positionToVelocity.hdanc │ ├── positionToVelocity.py │ ├── smoothAttribTransfer.hdanc │ └── smoothAttribTransfer.py └── README.md ├── Mari ├── README.md ├── Scripts │ └── init.py └── Shaders │ └── adjustment │ ├── MariNormalize.xml │ ├── MariSaturation.xml │ └── lib │ ├── adjUtils.glslc │ └── adjUtils.glslh ├── Maya ├── MASH-Scripts │ └── MASH_probScatter.py ├── Python-Scripts │ ├── mayaAiAttribManager.py │ ├── mayaAiFocus.py │ ├── mayaAiIDshader.py │ ├── mayaRenamer.py │ └── mayaStepST.py └── README.md ├── Nuke ├── BlinkScripts │ ├── DFT.blink │ ├── DFTi.blink │ ├── infNanFilter.blink │ ├── kaleidoscope.blink │ ├── medianSaturation.blink │ ├── normalize.blink │ ├── superConvolution.blink │ └── superFilter.blink ├── Python-Scripts │ ├── diNukeScripts.py │ ├── init.py │ └── menu.py └── README.md ├── README.md └── docs ├── .vscode └── settings.json ├── README.md ├── assets ├── css │ ├── fontawesome-all.min.css │ ├── images │ │ └── close.svg │ ├── main.css │ └── noscript.css ├── js │ ├── breakpoints.min.js │ ├── browser.min.js │ ├── jquery.min.js │ ├── jquery.scrollex.min.js │ ├── main.js │ ├── prism.js │ └── util.js ├── sass │ ├── base │ │ ├── _page.scss │ │ ├── _reset.scss │ │ └── _typography.scss │ ├── components │ │ ├── _actions.scss │ │ ├── _box.scss │ │ ├── _button.scss │ │ ├── _contact.scss │ │ ├── _features.scss │ │ ├── _form.scss │ │ ├── _icon.scss │ │ ├── _icons.scss │ │ ├── _image.scss │ │ ├── _list.scss │ │ ├── _pagination.scss │ │ ├── _row.scss │ │ ├── _section.scss │ │ └── _table.scss │ ├── layout │ │ ├── _banner.scss │ │ ├── _footer.scss │ │ ├── _header.scss │ │ ├── _menu.scss │ │ └── _wrapper.scss │ ├── libs │ │ ├── _breakpoints.scss │ │ ├── _functions.scss │ │ ├── _html-grid.scss │ │ ├── _mixins.scss │ │ ├── _prism.scss │ │ ├── _vars.scss │ │ └── _vendor.scss │ ├── main.scss │ └── noscript.scss ├── template │ ├── footer.js │ ├── header.js │ ├── menu.js │ └── setup.js └── webfonts │ ├── fa-brands-400.eot │ ├── fa-brands-400.svg │ ├── fa-brands-400.ttf │ ├── fa-brands-400.woff │ ├── fa-brands-400.woff2 │ ├── fa-regular-400.eot │ ├── fa-regular-400.svg │ ├── fa-regular-400.ttf │ ├── fa-regular-400.woff │ ├── fa-regular-400.woff2 │ ├── fa-solid-900.eot │ ├── fa-solid-900.svg │ ├── fa-solid-900.ttf │ ├── fa-solid-900.woff │ └── fa-solid-900.woff2 ├── elements.html ├── generic.html ├── houdini.html ├── images ├── _base │ ├── bg.jpg │ ├── pic01.jpg │ ├── pic02.jpg │ ├── pic03.jpg │ ├── pic04.jpg │ ├── pic05.jpg │ ├── pic06.jpg │ ├── pic07.jpg │ └── pic08.jpg ├── examples │ ├── MASH_probScatter.jpg │ ├── houdini_curveFramePT.jpg │ ├── houdini_nearestNeighborsConnection.jpg │ ├── houdini_positionToVelocity.jpg │ ├── houdini_smoothAttribTransfer.jpg │ ├── maya_AiAttribManager.jpg │ ├── maya_AiFocus.jpg │ ├── maya_AiIDshader.jpg │ ├── maya_Renamer.jpg │ ├── maya_StepST.jpg │ ├── nuke_dft1.jpg │ ├── nuke_dft2.jpg │ ├── nuke_dfti1.jpg │ ├── nuke_dfti2.jpg │ ├── nuke_infNanFilter1.jpg │ ├── nuke_infNanFilter2.jpg │ ├── nuke_kaleidoscope1.jpg │ ├── nuke_kaleidoscope2.jpg │ ├── nuke_medianSaturation1.jpg │ ├── nuke_medianSaturation2.jpg │ ├── nuke_normalize1.jpg │ ├── nuke_normalize2.jpg │ ├── nuke_superConvolution1.jpg │ ├── nuke_superConvolution2.jpg │ ├── nuke_superShape1.jpg │ ├── nuke_superShape2.jpg │ └── nuke_superShape3.jpg ├── houdini.png ├── index.png ├── mari.png ├── maya.png └── nuke.png ├── index.html ├── mari.html ├── maya.html └── nuke.html /.gitignore: -------------------------------------------------------------------------------- 1 | ### Python ### 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | ### Jupyter Notebook ### 7 | .ipynb_checkpoints 8 | 9 | ### Houdini ### 10 | backup/ 11 | 12 | ################### 13 | ### Page Assets ### 14 | ################### 15 | 16 | ### NodeJS ### 17 | node_modules/ 18 | package-lock.json 19 | 20 | # live sass compiler 21 | *.css.map 22 | -------------------------------------------------------------------------------- /Houdini/Python-Operators/curveFramePT.hdanc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/Houdini/Python-Operators/curveFramePT.hdanc -------------------------------------------------------------------------------- /Houdini/Python-Operators/curveFramePT.py: -------------------------------------------------------------------------------- 1 | '''.................................................................................................. 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: AUG/05/2013 5 | ..................................................................................................... 6 | This tool generates normal based on parallel transport method and Frenet-Serret frames. 7 | To create this tool just follow the next steps: 8 | 9 | 1 - Create new asset... (File/New Asset...); 10 | 2 - Put a operator name and a operator label as you want; 11 | 3 - Select "Python Type" on Operator Style; 12 | 4 - On Network Type, select "Geometry" (this is a very important step!!! pay attention =)); 13 | 5 - Save where you want; (do not forget to put ".otl" extension, not ".py") 14 | 6 - On Type Properties window, in Code tab, paste the code below. 15 | 16 | If you have any comments send to: diegodci@gmail.com 17 | Thank you! :D 18 | ..................................................................................................... 19 | References: 20 | 21 | HANSON, A.J.; MA, Hui. Parallel Transport Approach to Curve Framing. Department of Computer Science, 22 | Indiana University, 1995. 23 | 24 | 25 | YAMAGUCHI, Fujio. Curves and Surfaces in Computer Aided Geometric Design. Springer, 1988. 26 | ..................................................................................................''' 27 | import math 28 | 29 | ################### 30 | # Node initiation # 31 | ################### 32 | node = hou.pwd() 33 | geo = node.geometry() 34 | 35 | ############# 36 | # Functions # 37 | ############# 38 | def makeTemplate(): 39 | ''' 40 | Create node parameters 41 | ''' 42 | pGroup = hou.ParmTemplateGroup() 43 | type = hou.MenuParmTemplate('type', 'normal type', ('tangent', 'binormal', 'normal')) 44 | inv = hou.ToggleParmTemplate('inv', 'invert', 0) 45 | pGroup.append(type) 46 | pGroup.append(inv) 47 | node.setParmTemplateGroup(pGroup) 48 | 49 | def retTangent(points): 50 | ''' 51 | Returns a list of tangents 52 | T(s) = x'(s)/||x'(s)|| 53 | ''' 54 | tanList = [] 55 | for i in range(len(points)): 56 | if(i == 0): 57 | po = points[i].attribValue('P') 58 | pi = points[i + 1].attribValue('P') 59 | elif(i == len(points) - 1): 60 | po = points[i - 1].attribValue('P') 61 | pi = points[i].attribValue('P') 62 | else: 63 | po = points[i - 1].attribValue('P') 64 | pi = points[i + 1].attribValue('P') 65 | tan = difference(pi, po) 66 | tanList.append(tan) 67 | return tanList 68 | 69 | def retBinormal(tanList): 70 | ''' 71 | Returns a list of binormals 72 | B(s) = (x'(s) X x''(s))/||x'(s) X x''(s)|| 73 | ''' 74 | binList = [] 75 | for i in range(len(tanList)): 76 | if(i == 0): 77 | tano = tanList[i] 78 | tani = tanList[i + 1] 79 | elif(i == len(points) - 1): 80 | tano = tanList[i - 1] 81 | tani = tanList[i] 82 | else: 83 | tano = tanList[i - 1] 84 | tani = tanList[i + 1] 85 | bin = cross(tani, tano) 86 | binList.append(bin) 87 | return binList 88 | 89 | def retNormal(tanList, binList): 90 | ''' 91 | Returns a list of normals 92 | N(s) = B(s) X T(s) 93 | ''' 94 | normList = [] 95 | for i in range(len(binList)): 96 | norm = cross(binList[i], tanList[i]) 97 | normList.append(norm) 98 | return normList 99 | 100 | def difference(v1, v2): 101 | ''' 102 | Calculates a derivative differentiation between two vectors 103 | ''' 104 | dx = v2[0] - v1[0] 105 | dy = v2[1] - v1[1] 106 | dz = v2[2] - v1[2] 107 | d = (dx, dy, dz) 108 | return d 109 | 110 | def normalize(v): 111 | ''' 112 | Normalize a vector. 113 | The "mag" variable represents magnitude or length of vector 114 | ''' 115 | v = (v[0], v[1], v[2]) 116 | mag = math.sqrt(math.pow(v[0], 2) + math.pow(v[1], 2) + math.pow(v[2], 2)) 117 | if(mag == 0.0): mag = 0.001 118 | return ((v[0])/mag, v[1]/mag, v[2]/mag) 119 | 120 | def cross(v1, v2): 121 | ''' 122 | Makes a cross product between two vectors 123 | ''' 124 | vx = v1[1]*v2[2] - v1[2]*v2[1] 125 | vy = v1[2]*v2[0] - v1[0]*v2[2] 126 | vz = v1[0]*v2[1] - v1[1]*v2[0] 127 | return (vx, vy, vz) 128 | 129 | def invert(v): 130 | ''' 131 | Invert vector 132 | ''' 133 | return (-v[0], -v[1], -v[2]) 134 | 135 | ######## 136 | # Main # 137 | ######## 138 | makeTemplate() 139 | 140 | points = geo.points() 141 | 142 | type = node.parm('type').eval() 143 | inv = node.parm('inv').eval() 144 | 145 | if not geo.findPointAttrib('N'): 146 | geo.addAttrib(hou.attribType.Point, 'N', (0.0, 1.0, 0.0)) 147 | 148 | tanList = retTangent(points) 149 | 150 | if(type == 0): 151 | for i in range(len(tanList)): 152 | tan = normalize(tanList[i]) 153 | if(inv == 1): 154 | tan = invert(tan) 155 | points[i].setAttribValue('N', tan) 156 | 157 | elif(type == 1): 158 | binList = retBinormal(tanList) 159 | for i in range(len(binList)): 160 | bin = normalize(binList[i]) 161 | if(inv == 1): 162 | bin = invert(bin) 163 | points[i].setAttribValue('N', bin) 164 | 165 | else: 166 | binList = retBinormal(tanList) 167 | normList = retNormal(tanList, binList) 168 | for i in range(len(normList)): 169 | norm = normalize(normList[i]) 170 | if(inv == 1): 171 | norm = invert(norm) 172 | points[i].setAttribValue('N', norm) -------------------------------------------------------------------------------- /Houdini/Python-Operators/nearestNeighborsConnection.hdanc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/Houdini/Python-Operators/nearestNeighborsConnection.hdanc -------------------------------------------------------------------------------- /Houdini/Python-Operators/nearestNeighborsConnection.py: -------------------------------------------------------------------------------- 1 | '''.................................................................................................. 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: JULY/31/2013 5 | ..................................................................................................... 6 | This operator makes a polygon connection between all points that are at a distance less than the 7 | parameter 'Radius'. To create this tool just follow the next steps: 8 | 9 | 1 - Create new operator... (File/New Operator Type...); 10 | 2 - Put a operator name and a operator label as you want; 11 | 3 - Select "Python Type" on Operator Style; 12 | 4 - On Network Type, select "Geometry Operator"(this is a very important step!!! pay attention =)); 13 | 5 - Save where you want; (do not forget to put ".otl" extension, not ".py") 14 | 6 - On Type Properties window, in Code tab, paste the code below. 15 | 16 | If you have any comments send to: diegodci@gmail.com 17 | Thank you! :D 18 | ..................................................................................................''' 19 | import math 20 | 21 | ################### 22 | # Node initiation # 23 | ################### 24 | node = hou.pwd() 25 | geo = node.geometry() 26 | 27 | ############# 28 | # Functions # 29 | ############# 30 | def makeTemplate(): 31 | ''' 32 | Create node parameters 33 | ''' 34 | pGroup = hou.ParmTemplateGroup() 35 | rad = hou.FloatParmTemplate('radius', 'Radius', 1) 36 | pGroup.append(rad) 37 | node.setParmTemplateGroup(pGroup) 38 | 39 | def distance(p1, p2): 40 | ''' 41 | Calculates euclidean distance between two points. 42 | ''' 43 | dx = math.pow(p2[0] - p1[0], 2) 44 | dy = math.pow(p2[1] - p1[1], 2) 45 | dz = math.pow(p2[2] - p1[2], 2) 46 | d = math.sqrt(dx + dy + dz) 47 | return d 48 | 49 | ######## 50 | # Main # 51 | ######## 52 | makeTemplate() 53 | 54 | points = geo.points() 55 | blackList = {} 56 | 57 | radius = node.parm('radius').eval() 58 | 59 | for point in points: 60 | blackList[point] = [] 61 | 62 | for i in range(len(points)): 63 | po = points[i].attribValue('P') 64 | for j in range(len(points)): 65 | if((j == i) or (j in blackList[points[i]])): continue 66 | pi = points[j].attribValue('P') 67 | dist = distance(po, pi) 68 | if(dist <= radius): 69 | line = geo.createPolygon() 70 | line.addVertex(points[i]) 71 | line.addVertex(points[j]) 72 | line.setIsClosed(False) 73 | blackList[points[j]].append(i) -------------------------------------------------------------------------------- /Houdini/Python-Operators/positionToVelocity.hdanc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/Houdini/Python-Operators/positionToVelocity.hdanc -------------------------------------------------------------------------------- /Houdini/Python-Operators/positionToVelocity.py: -------------------------------------------------------------------------------- 1 | '''.................................................................................................. 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: JULY/29/2013 5 | ..................................................................................................... 6 | This is a very simple tool to creates a velocity point attribute from position differentiation. 7 | To create this tool just follow the next steps: 8 | 9 | 1 - Create new operator... (File/New Operator Type...); 10 | 2 - Put a operator name and a operator label as you want; 11 | 3 - Select "Python Type" on Operator Style; 12 | 4 - On Network Type, select "Geometry Operator"(this is a very important step!!! pay attention =)); 13 | 5 - Save where you want; (do not forget to put ".otl" extension, not ".py") 14 | 6 - On Type Properties window, in Basic tab, set to 2 a minimum and maximum inputs 15 | 6 - In Code tab, paste the code below. 16 | 17 | If you have any comments send to: diegodci@gmail.com 18 | Thank you! :D 19 | ..................................................................................................''' 20 | ################### 21 | # Node initiation # 22 | ################### 23 | node = hou.pwd() 24 | geoA = node.geometry() 25 | geoB = node.inputs()[1].geometry() 26 | 27 | ############# 28 | # Functions # 29 | ############# 30 | def makeTemplate(): 31 | ''' 32 | Create node parameters 33 | ''' 34 | pGroup = hou.ParmTemplateGroup() 35 | mult = hou.FloatParmTemplate('mult', 'Multiply', 1, (1.0, 0.0, 0.0), 0.0, 4.0) 36 | pGroup.append(mult) 37 | node.setParmTemplateGroup(pGroup) 38 | 39 | def difference(v1, v2): 40 | ''' 41 | Calculates a derivative differentiation between two vectors 42 | ''' 43 | dx = (v2[0] - v1[0])*mult 44 | dy = (v2[1] - v1[1])*mult 45 | dz = (v2[2] - v1[2])*mult 46 | d = (dx, dy, dz) 47 | return d 48 | 49 | ######## 50 | # Main # 51 | ######## 52 | makeTemplate() 53 | 54 | pointsA = geoA.points() 55 | pointsB = geoB.points() 56 | 57 | mult = node.parm('mult').eval() 58 | 59 | if not geoA.findPointAttrib('v'): 60 | try: 61 | geoA.addAttrib(hou.attribType.Point, 'v', (0.0, 0.0, 0.0)) 62 | except: 63 | None 64 | 65 | for i in range(len(pointsA)): 66 | pa = pointsA[i].attribValue('P') 67 | pb = pointsB[i].attribValue('P') 68 | v = difference(pa, pb) 69 | pointsA[i].setAttribValue('v', v) -------------------------------------------------------------------------------- /Houdini/Python-Operators/smoothAttribTransfer.hdanc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/Houdini/Python-Operators/smoothAttribTransfer.hdanc -------------------------------------------------------------------------------- /Houdini/Python-Operators/smoothAttribTransfer.py: -------------------------------------------------------------------------------- 1 | '''.................................................................................................. 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: AUG/12/2013 5 | ..................................................................................................... 6 | This tool makes smoothly transfer of point attributes between two models. To create this tool just 7 | follow the next steps: 8 | 9 | 1 - Create new operator... (File/New Operator Type...); 10 | 2 - Put a operator name and a operator label as you want; 11 | 3 - Select "Python Type" on Operator Style; 12 | 4 - On Network Type, select "Geometry Operator"(this is a very important step!!! pay attention =)); 13 | 5 - Save where you want; (do not forget to put ".otl" extension, not ".py") 14 | 6 - On Type Properties window, in Basic tab, set to 2 a minimum and maximum inputs 15 | 6 - In Code tab, paste the code below. 16 | 17 | If you have any comments send to: diegodci@gmail.com 18 | Thank you! :D 19 | ..................................................................................................''' 20 | import math 21 | 22 | ################### 23 | # Node initiation # 24 | ################### 25 | node = hou.pwd() 26 | geoA = node.geometry() 27 | geoB = node.inputs()[1].geometry() 28 | 29 | ############# 30 | # Functions # 31 | ############# 32 | def makeTemplate(): 33 | ''' 34 | Create node parameters 35 | ''' 36 | pGroup = hou.ParmTemplateGroup() 37 | ttype = hou.MenuParmTemplate('ttype', 'transfer type', ('over', 'add')) 38 | selAttrib = hou.ToggleParmTemplate('selAttrib', 'Selected Attributes', 1) 39 | attList = hou.StringParmTemplate('attList', 'Attribute List', 1) 40 | attList.setDefaultValue('*') 41 | minrad = hou.FloatParmTemplate('minrad', 'Minimum Radius', 1) 42 | maxrad = hou.FloatParmTemplate('maxrad', 'Maximum Radius', 1, (5.0, 0.0, 0.0)) 43 | gain = hou.FloatParmTemplate('gain', 'Gain', 1, (1.0, 0.0, 0.0), 0.0, 1.0) 44 | igamma = hou.FloatParmTemplate('igamma', 'Interpolation Gamma', 1, (1.0, 0.0, 0.0), 0.0, 4.0) 45 | matPos = hou.ToggleParmTemplate('matPos', 'Match Position', 0) 46 | pGroup.append(ttype) 47 | pGroup.append(selAttrib) 48 | pGroup.append(attList) 49 | pGroup.append(minrad) 50 | pGroup.append(maxrad) 51 | pGroup.append(gain) 52 | pGroup.append(igamma) 53 | pGroup.append(matPos) 54 | node.setParmTemplateGroup(pGroup) 55 | 56 | def distance(p1, p2): 57 | ''' 58 | Calculate euclidean distance between two points. 59 | ''' 60 | dx = math.pow(p2[0] - p1[0], 2) 61 | dy = math.pow(p2[1] - p1[1], 2) 62 | dz = math.pow(p2[2] - p1[2], 2) 63 | d = math.sqrt(dx + dy + dz) 64 | return d 65 | 66 | def sumVectors(v1, v2): 67 | ''' 68 | Add two vectors 69 | ''' 70 | vx = v1[0] + v2[0] 71 | vy = v1[1] + v2[1] 72 | vz = v1[2] + v2[2] 73 | return (vx, vy, vz) 74 | 75 | def multVecFloat(v, f): 76 | ''' 77 | Multiply a vector by a float 78 | ''' 79 | vx = v[0]*f 80 | vy = v[1]*f 81 | vz = v[2]*f 82 | return (vx, vy, vz) 83 | 84 | def defaultValues(dataType): 85 | ''' 86 | Returns a value of zero depending a type of the attribute. 87 | ''' 88 | if(dataType == tuple): return (0.0, 0.0, 0.0) 89 | elif(dataType == float): return 0.0 90 | elif(dataType == int): return 0 91 | else: return '' 92 | 93 | ######## 94 | # Main # 95 | ######## 96 | makeTemplate() 97 | 98 | pointsA = geoA.points() 99 | pointsB = geoB.points() 100 | 101 | ttype = node.parm('ttype').eval() 102 | selAttrib = node.parm('selAttrib').eval() 103 | attList = node.parm('attList').eval() 104 | minrad = node.parm('minrad').eval() 105 | maxrad = node.parm('maxrad').eval() 106 | gain = node.parm('gain').eval() 107 | igamma = node.parm('igamma').eval() 108 | matPos = node.parm('matPos').eval() 109 | 110 | if(attList == '*'): 111 | if(selAttrib == 1): 112 | attribs = list(geoB.pointAttribs()) 113 | for i in range(len(attribs)): 114 | attribs[i] = attribs[i].name() 115 | else: 116 | attribs = [] 117 | elif(attList == ''): 118 | if(selAttrib == 0): 119 | attribs = list(geoB.pointAttribs()) 120 | for i in range(len(attribs)): 121 | attribs[i] = attribs[i].name() 122 | else: 123 | attribs = [] 124 | else: 125 | attribs = list(geoB.pointAttribs()) 126 | for i in range(len(attribs)): 127 | attribs[i] = attribs[i].name() 128 | attList = attList.split(',') 129 | for i in range(len(attList)): 130 | attList[i] = attList[i].strip() 131 | if(selAttrib == 1): 132 | dnes = [] 133 | for att in attList: 134 | if(att not in attribs): 135 | dnes.append(att) 136 | for dne in dnes: 137 | print('attribute %s does not exist' %(dne)) 138 | attList.remove(dne) 139 | attribs = attList 140 | else: 141 | for att in attList: 142 | try: 143 | attribs.remove(att) 144 | except: 145 | continue 146 | 147 | if(matPos == 0): 148 | attribs.remove('P') 149 | attribs.remove('Pw') 150 | 151 | for attrib in attribs: 152 | if not geoA.findPointAttrib(attrib): 153 | try: 154 | geoA.addAttrib(hou.attribType.Point, attrib, defaultValues(type(pointsB[0].attribValue(attrib)))) 155 | except: 156 | None 157 | for pointB in pointsB: 158 | pb = pointB.attribValue('P') 159 | attribB = pointB.attribValue(attrib) 160 | for pointA in pointsA: 161 | pa = pointA.attribValue('P') 162 | dist = distance(pa, pb) 163 | if(dist > maxrad): continue 164 | elif(dist <= minrad): alpha = 1.0 165 | else: 166 | alpha = (dist - maxrad)/(minrad - maxrad) 167 | attribA = pointA.attribValue(attrib) 168 | oalpha = math.pow(1 - alpha, 1/igamma)*gain 169 | aalpha = math.pow(alpha, 1/igamma)*gain 170 | if(type(attribB) == tuple): 171 | if(ttype == 0): 172 | attribA = sumVectors(multVecFloat(attribB, aalpha), multVecFloat(attribA, oalpha)) 173 | else: 174 | attribA = sumVectors(multVecFloat(attribB, aalpha), attribA) 175 | elif(type(attribB) == int): 176 | if(ttype == 0): 177 | attribA = int(attribB*aalpha + attribA*(oalpha)) 178 | else: 179 | attribA += int(attribB*aalpha) 180 | else: 181 | if(ttype == 0): 182 | attribA = attribB*aalpha + attribA*(oalpha) 183 | else: 184 | attribA += attribB*alpha 185 | pointA.setAttribValue(attrib, attribA) -------------------------------------------------------------------------------- /Houdini/README.md: -------------------------------------------------------------------------------- 1 | # Houdini 2 | 3 | Some tools to use with the [SideFX's **Houdini**](https://www.sidefx.com/products/houdini/). -------------------------------------------------------------------------------- /Mari/README.md: -------------------------------------------------------------------------------- 1 | # Mari 2 | 3 | Some tools to use with the [Foundry's **Mari**](https://www.foundry.com/products/mari). -------------------------------------------------------------------------------- /Mari/Scripts/init.py: -------------------------------------------------------------------------------- 1 | import mari, PythonQt 2 | import sys, os 3 | 4 | mari.gl_render.registerCustomHeaderFile('ADJUSTMENT_UTILS_GLSLH', '../Shaders/adjustment/lib/adjUtils.glslh') 5 | mari.gl_render.registerCustomCodeFile('ADJUSTMENT_UTILS_GLSLC', '../Shaders/adjustment/lib/adjUtils.glslc') 6 | 7 | mari.gl_render.registerCustomAdjustmentLayerFromXMLFile('Custom-Shaders/Normalize', '%s/Shaders/adjustment/MariNormalize.xml') 8 | mari.gl_render.registerCustomAdjustmentLayerFromXMLFile('Custom-Shaders/Saturation', '%s/Shaders/adjustment/MariSaturation.xml') -------------------------------------------------------------------------------- /Mari/Shaders/adjustment/MariNormalize.xml: -------------------------------------------------------------------------------- 1 | 2 | customNormalizeAdjustment 3 | 4 | _adjustment 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | vec4(1, 1, 1, 1) 17 | 18 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Mari/Shaders/adjustment/MariSaturation.xml: -------------------------------------------------------------------------------- 1 | 2 | customSaturationAdjustment 3 | 4 | _adjustment 5 | 6 | 7 | 8 | 9 | 10 | maximum,average,maximum,minimum,ccir601,rec709,rec2020 11 | 1 12 | false 13 | 14 | 15 | 16 | 17 | 18 | vec4(1, 1, 1, 1) 19 | 20 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /Mari/Shaders/adjustment/lib/adjUtils.glslc: -------------------------------------------------------------------------------- 1 | #version 330 2 | 3 | // ! include | adjUtils.glslh 4 | 5 | // ! Utils 6 | 7 | float avrValue(vec3 input) 8 | { 9 | return (input.r + input.g + input.b) / 3; 10 | } 11 | 12 | float avrValue(vec4 input) 13 | { 14 | return (input.r + input.g + input.b) / 3; 15 | } 16 | 17 | float maxValue(vec3 input) 18 | { 19 | return max(max(input.r, input.g), input.b); 20 | } 21 | 22 | float maxValue(vec4 input) 23 | { 24 | return max(max(input.r, input.g), input.b); 25 | } 26 | 27 | float minValue(vec3 input) 28 | { 29 | return min(min(input.r, input.g), input.b); 30 | } 31 | 32 | float minValue(vec4 input) 33 | { 34 | return min(min(input.r, input.g), input.b); 35 | } 36 | 37 | // ! Saturation functions 38 | 39 | float ccir601Value(vec3 input) 40 | { 41 | float kb = 0.114; 42 | float kr = 0.299; 43 | float kg = 1 - kr - kb; 44 | return kr * input.r + kg * input.g + kb * input.b; 45 | } 46 | 47 | float ccir601Value(vec4 input) 48 | { 49 | float kb = 0.114; 50 | float kr = 0.299; 51 | float kg = 1 - kr - kb; 52 | return kr * input.r + kg * input.g + kb * input.b; 53 | } 54 | 55 | float rec709Value(vec3 input) 56 | { 57 | float kb = 0.0722; 58 | float kr = 0.2126; 59 | float kg = 1 - kr - kb; 60 | return kr * input.r + kg * input.g + kb * input.b; 61 | } 62 | 63 | float rec709Value(vec4 input) 64 | { 65 | float kb = 0.0722; 66 | float kr = 0.2126; 67 | float kg = 1 - kr - kb; 68 | return kr * input.r + kg * input.g + kb * input.b; 69 | } 70 | 71 | float rec2020Value(vec3 input) 72 | { 73 | float kb = 0.0593; 74 | float kr = 0.2627; 75 | float kg = 1 - kr - kb; 76 | return kr * input.r + kg * input.g + kb * input.b; 77 | } 78 | 79 | float rec2020Value(vec4 input) 80 | { 81 | float kb = 0.0593; 82 | float kr = 0.2627; 83 | float kg = 1 - kr - kb; 84 | return kr * input.r + kg * input.g + kb * input.b; 85 | } 86 | -------------------------------------------------------------------------------- /Mari/Shaders/adjustment/lib/adjUtils.glslh: -------------------------------------------------------------------------------- 1 | // ! Utils 2 | float avrValue(vec3 input); 3 | float avrValue(vec4 input); 4 | float maxValue(vec3 input); 5 | float maxValue(vec4 input); 6 | float minValue(vec3 input); 7 | float minValue(vec4 input); 8 | 9 | // ! Saturation functions 10 | float ccir601Value(vec3 input); 11 | float ccir601Value(vec4 input); 12 | float rec709Value(vec3 input); 13 | float rec709Value(vec4 input); 14 | float rec2020Value(vec3 input); 15 | float rec2020Value(vec4 input); 16 | -------------------------------------------------------------------------------- /Maya/MASH-Scripts/MASH_probScatter.py: -------------------------------------------------------------------------------- 1 | '''.................................................................................................. 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: AUG/28/2018 5 | ..................................................................................................... 6 | Script do tipo "Drop Window" para para scatter de instancias sobre uma superficie. 7 | - Suporte para probabilidade e controle de ID por meio de pesos. (node Python) 8 | - Numero instancias devem ser maior ou igual a 2. Superficie deve ser apenas uma. 9 | - Variacoes de escala, rotacao e etc. (node Random) 10 | - Controle de densidade e escala. (node Strength) 11 | ..................................................................................................''' 12 | import MASH.api as mapi 13 | import flux.core as fx 14 | import maya.cmds as cmds 15 | 16 | SCRIPT = '''# script para randomizacao por meio de probabilidade 17 | import openMASH 18 | import random 19 | 20 | # inicializacao do sistema MASH 21 | md = openMASH.MASHData(thisNode) 22 | count = md.count() 23 | 24 | # recebe valores dos atributos do node python 25 | countID = cmds.getAttr(thisNode + '.countID') 26 | seed = cmds.getAttr(thisNode + '.seed') 27 | 28 | ############## 29 | # parametros # 30 | ############## 31 | random.seed(seed) 32 | # numero de ids 33 | ids = countID 34 | # lista de pesos 35 | p = [1]*ids 36 | 37 | # set de probabilidade 38 | {0} 39 | # calculo de probabilidade 40 | p = [float(e)/sum(p) for e in p] 41 | p = [int(e*count + 0.5) for e in p] 42 | if sum(p) != count: 43 | diff = count - sum(p) 44 | argmax = p.index(max(p)) 45 | p[argmax] += diff 46 | ID = sum([[i]*p[i] for i in range(ids)], []) 47 | random.shuffle(ID) 48 | 49 | for i in range(count): 50 | md.outId[i] = ID[i] 51 | 52 | md.setData() 53 | ''' 54 | 55 | def runPreset(): 56 | cmds.select(clear=True) 57 | cmds.promptDialog(message='Nome do sistema MASH:') 58 | mashName = cmds.promptDialog(query=True, text=True) 59 | if not mashName: 60 | mashName = '#' 61 | else: 62 | mashName = '_' + mashName 63 | ############################################################################################ 64 | steps = [ 'Selecione as instancias | n >= 2 (arraste com o botao do meio)', 65 | 'Selecione a superficie | n = 1 (arraste com o botao do meio)'] 66 | accepts = [['mesh'], ['mesh']] 67 | ############################################################################################ 68 | fx.DropWindow.getDrop( steps, 69 | lambda data: smartPreset.send(data), 70 | accepts=accepts) 71 | node = yield 72 | nodes = node.split('\n') 73 | ############################################################################################ 74 | cmds.promptDialog(message='Numero de pontos:') 75 | pointCount = cmds.promptDialog(query=True, text=True) 76 | try: 77 | pointCount = int(pointCount) 78 | except: 79 | pointCount = 10 80 | 81 | mash = mapi.Network() 82 | mash.createNetwork(name='MASH' + mashName, geometry='Instancer') 83 | 84 | node = yield 85 | node = node.split('\n')[0] 86 | 87 | mash.meshDistribute(node) 88 | ############################################################################################ 89 | distNodeName = mash.waiter + '_Distribute' 90 | cmds.setAttr(distNodeName + '.pointCount', pointCount) 91 | 92 | idNodeName = mash.waiter + '_ID' 93 | cmds.setAttr(idNodeName + '.idtype', 2) 94 | count = cmds.getAttr(idNodeName + '.numObjects') 95 | 96 | pyNode = mash.addNode('MASH_Python') 97 | cmds.addAttr(pyNode.name, longName='countID', attributeType='long', defaultValue=count) 98 | expr = '{0}.countID = {1}.numObjects'.format(pyNode.name, idNodeName) 99 | cmds.expression(s=expr) 100 | cmds.addAttr(pyNode.name, longName='seed', attributeType='long', defaultValue=1234) 101 | scriptID = ''.join(['p[{0}] = 1 # {1} prob.\n'.format(i, e) for i, e in enumerate(nodes)]) 102 | cmds.setAttr(pyNode.name + '.pyScript', SCRIPT.format(scriptID), type='string') 103 | 104 | randNode = mash.addNode('MASH_Random') 105 | cmds.setAttr(randNode.name + '.positionX', 0) 106 | cmds.setAttr(randNode.name + '.positionY', 0) 107 | cmds.setAttr(randNode.name + '.positionZ', 0) 108 | cmds.setAttr(randNode.name + '.rotationY', 180) 109 | cmds.setAttr(randNode.name + '.scaleX', 1) 110 | cmds.setAttr(randNode.name + '.uniformRandom', 1) 111 | 112 | strengthNode = mash.addNode('MASH_Strength') 113 | 114 | yield 115 | 116 | smartPreset = runPreset() 117 | smartPreset.next() -------------------------------------------------------------------------------- /Maya/Python-Scripts/mayaAiFocus.py: -------------------------------------------------------------------------------- 1 | '''.................................................................................................. 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: JAN/19/2015 5 | ..................................................................................................... 6 | This script creates a locator to be used to control a focus distance on an arnold camera. 7 | If you have any comment send it to: diegodci@gmail.com 8 | Thank you! :D 9 | ..................................................................................................''' 10 | import maya.cmds as cmds 11 | 12 | sel = cmds.ls(selection = True, dagObjects = True, leaf = True) 13 | 14 | for obj in sel: 15 | if cmds.objectType(obj) == 'camera': 16 | cam = cmds.pickWalk(obj, direction = 'up') 17 | rot = cmds.getAttr('%s.rotate' %(cam[0])) 18 | pos = cmds.getAttr('%s.translate' %(cam[0])) 19 | scl = cmds.getAttr('%s.scale' %(cam[0])) 20 | mscl = max(max(scl[0][0], scl[0][1]), scl[0][2]) 21 | cmds.spaceLocator(name = '%s_focus' %(cam[0])) 22 | cmds.setAttr('%s_focus.rotate' %(cam[0]), rot[0][0], rot[0][1], rot[0][2]) 23 | cmds.setAttr('%s_focus.translate' %(cam[0]), pos[0][0], pos[0][1], pos[0][2]) 24 | cmds.setAttr('%s_focus.scale' %(cam[0]), scl[0][0], scl[0][1], scl[0][2]) 25 | cmds.move(0, 0, - mscl, '%s_focus' %(cam[0]), relative = True, objectSpace = True, worldSpaceDistance = True) 26 | cmds.setAttr('%s.aiEnableDOF' %(obj), 1) 27 | cmds.expression(string = '%s.aiFocusDistance = sqrt(' %(obj) +\ 28 | 'pow(%s_focus.translateX - %s.translateX, 2) + ' %(cam[0], cam[0]) +\ 29 | 'pow(%s_focus.translateY - %s.translateY, 2) + ' %(cam[0], cam[0]) +\ 30 | 'pow(%s_focus.translateZ - %s.translateZ, 2));' %(cam[0], cam[0]), object = obj) -------------------------------------------------------------------------------- /Maya/Python-Scripts/mayaAiIDshader.py: -------------------------------------------------------------------------------- 1 | '''.................................................................................................. 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: OCT/28/2014 5 | ..................................................................................................... 6 | This script creates three RGB aiUtilities. 7 | If you have any comment send it to: diegodci@gmail.com 8 | Thank you! :D 9 | ..................................................................................................''' 10 | import maya.cmds as cmds 11 | import mtoa 12 | 13 | script = 'mayaAiIDshader' 14 | version = '1.0.0' 15 | title = script + ' ' + version 16 | 17 | def closeUI(scriptUI): 18 | if cmds.window(scriptUI, menuBar = True, exists = True): 19 | cmds.deleteUI(scriptUI) 20 | 21 | def mayaAiIDshaderUI(): 22 | global cb01, cb02, cb03, cb04, cb05, cb06 #checkbox 23 | closeUI(script) 24 | cmds.window(script, title = title, sizeable = False) 25 | cmds.columnLayout(columnAttach = ['both', 5], rowSpacing = 5, columnWidth = 315) 26 | cmds.separator(style = 'in') 27 | cmds.text(label = '..: id shader :..', backgroundColor = [0, 0, 0]) 28 | cmds.separator(style = 'out') 29 | cmds.gridLayout(numberOfColumns = 3, cellWidthHeight = (105, 20)) 30 | cb01 = cmds.checkBox(label = 'red', value = True) 31 | cb02 = cmds.checkBox(label = 'green', value = True) 32 | cb03 = cmds.checkBox(label = 'blue', value = True) 33 | cb04 = cmds.checkBox(label = 'black', value = False) 34 | cb05 = cmds.checkBox(label = 'white', value = False) 35 | cb06 = cmds.checkBox(label = 'black hole', value = False) 36 | cmds.setParent('..') 37 | cmds.button('ok', command = 'mayaAiIDshader()') 38 | cmds.showWindow() 39 | 40 | def mayaAiIDshader(): 41 | if(cmds.checkBox(cb01, value = True, query = True)): 42 | if(not cmds.objExists('aiIDRed')): 43 | mtoa.core.createArnoldNode('aiUtility', name = 'aiIDRed') 44 | cmds.setAttr('aiIDRed.shadeMode', 2) 45 | cmds.setAttr('aiIDRed.color', 1, 0, 0, type = 'double3') 46 | cmds.setAttr('aiIDRed.hardwareColor', 1, 0, 0, type = 'double3') 47 | 48 | if(cmds.checkBox(cb02, value = True, query = True)): 49 | if(not cmds.objExists('aiIDGreen')): 50 | mtoa.core.createArnoldNode('aiUtility', name = 'aiIDGreen') 51 | cmds.setAttr('aiIDGreen.shadeMode', 2) 52 | cmds.setAttr('aiIDGreen.color', 0, 1, 0, type = 'double3') 53 | cmds.setAttr('aiIDGreen.hardwareColor', 0, 1, 0, type = 'double3') 54 | 55 | if(cmds.checkBox(cb03, value = True, query = True)): 56 | if(not cmds.objExists('aiIDBlue')): 57 | mtoa.core.createArnoldNode('aiUtility', name = 'aiIDBlue') 58 | cmds.setAttr('aiIDBlue.shadeMode', 2) 59 | cmds.setAttr('aiIDBlue.color', 0, 0, 1, type = 'double3') 60 | cmds.setAttr('aiIDBlue.hardwareColor', 0, 0, 1, type = 'double3') 61 | 62 | if(cmds.checkBox(cb04, value = True, query = True)): 63 | if(not cmds.objExists('aiIDBlack')): 64 | mtoa.core.createArnoldNode('aiUtility', name = 'aiIDBlack') 65 | cmds.setAttr('aiIDBlack.shadeMode', 2) 66 | cmds.setAttr('aiIDBlack.color', 0, 0, 0, type = 'double3') 67 | cmds.setAttr('aiIDBlack.hardwareColor', 0, 0, 0, type = 'double3') 68 | 69 | if(cmds.checkBox(cb05, value = True, query = True)): 70 | if(not cmds.objExists('aiIDWhite')): 71 | mtoa.core.createArnoldNode('aiUtility', name = 'aiIDWhite') 72 | cmds.setAttr('aiIDWhite.shadeMode', 2) 73 | cmds.setAttr('aiIDWhite.color', 1, 1, 1, type = 'double3') 74 | cmds.setAttr('aiIDWhite.hardwareColor', 1, 1, 1, type = 'double3') 75 | 76 | if(cmds.checkBox(cb06, value = True, query = True)): 77 | if(not cmds.objExists('aiBlackHole')): 78 | mtoa.core.createArnoldNode('aiStandard', name = 'aiBlackHole') 79 | cmds.setAttr('aiBlackHole.aiEnableMatte', 1) 80 | cmds.setAttr('aiBlackHole.color', 0.01, 0.01, 0.01, type = 'double3') 81 | 82 | mayaAiIDshaderUI() -------------------------------------------------------------------------------- /Maya/Python-Scripts/mayaRenamer.py: -------------------------------------------------------------------------------- 1 | '''.................................................................................................. 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: NOV/12/2012 5 | ..................................................................................................... 6 | This script is a simple renamer for objects, nodes or anything in your scene do you want to rename. 7 | If you have any comment send it to: diegodci@gmail.com 8 | Thank you! :D 9 | ..................................................................................................''' 10 | import maya.cmds as cmds 11 | 12 | ui = 'mayaRenamer' 13 | version = '1.0.0' 14 | title = ui + ' ' + version 15 | 16 | ############# 17 | # Functions # 18 | ############# 19 | def closeUI(): 20 | if cmds.window(ui, menuBar = True, exists = True): 21 | cmds.deleteUI(ui) 22 | 23 | def mayaRenamerUI(): 24 | global field1 25 | global field2 26 | global field3 27 | global field4 28 | global field5 29 | closeUI() 30 | cmds.window(ui, title = title, sizeable = False) 31 | tabs = cmds.tabLayout() 32 | tab1 = cmds.columnLayout(columnAttach = ['both', 5], rowSpacing = 10, columnWidth = 220) 33 | cmds.separator(style = 'in') 34 | cmds.text(label = '..: Renamer :..') 35 | cmds.separator(style = 'out') 36 | cmds.frameLayout(label = 'Search and Replace', borderStyle='etchedIn', collapse = True, collapsable = True) 37 | cmds.text(label = 'Search for:') 38 | field1 = cmds.textField() 39 | cmds.text(label = 'Replace with:') 40 | field2 = cmds.textField() 41 | cmds.button(label = 'Apply', command = 'srOption()') 42 | cmds.setParent('..') 43 | cmds.frameLayout(label = 'Prefix and Sufix', borderStyle='etchedIn', collapse = True, collapsable = True) 44 | cmds.text(label = 'Sufix:') 45 | field3 = cmds.textField() 46 | cmds.text(label = 'Prefix:') 47 | field4 = cmds.textField() 48 | cmds.button(label = 'Apply', command = 'psOption()') 49 | cmds.setParent('..') 50 | cmds.frameLayout(label = 'Rename', borderStyle='etchedIn', collapse = True, collapsable = True) 51 | cmds.text(label = 'Rename:') 52 | field5 = cmds.textField() 53 | cmds.button(label = 'Apply', command = 'rOption()') 54 | cmds.setParent('..') 55 | cmds.setParent('..') 56 | tab2 = cmds.columnLayout(columnAttach = ['both', 5], rowSpacing = 10, columnWidth = 220) 57 | cmds.text(label = info(), wordWrap = True) 58 | cmds.tabLayout( tabs, edit=True, tabLabel=((tab1, 'Main'), (tab2, 'Info'))) 59 | cmds.setParent('..') 60 | cmds.showWindow() 61 | 62 | def srOption(): 63 | sel = [] 64 | sel = cmds.ls(selection = True) 65 | if sel == []: noSelection() 66 | else: 67 | search = cmds.textField(field1, text = True, query = True) 68 | replace = cmds.textField(field2, text = True, query = True) 69 | for i in range(len(sel)): 70 | temp = sel[i].replace(search, replace) 71 | cmds.rename(sel[i], temp) 72 | 73 | def psOption(): 74 | sel = [] 75 | sel = cmds.ls(selection = True) 76 | if sel == []: noSelection() 77 | else: 78 | prefix = cmds.textField(field3, text = True, query = True) 79 | sufix = cmds.textField(field4, text = True, query = True) 80 | for i in range(len(sel)): 81 | cmds.rename(sel[i], prefix + sel[i] + sufix) 82 | 83 | def rOption(): 84 | sel = [] 85 | sel = cmds.ls(selection = True) 86 | if sel == []: noSelection() 87 | else: 88 | renamer = cmds.textField(field5, text = True, query = True) 89 | for i in range(len(sel)): 90 | cmds.rename(sel[i], renamer + str(i + 1)) 91 | 92 | def noSelection(): 93 | cmds.confirmDialog(message = 'no object was selected') 94 | 95 | def info(): 96 | infoText = ".: mayaRenamer :.\n\nThis script is a simple renamer for objects, nodes or anything in your scene do you want to rename.\nIf you have any comment, sent it to me at:\ndiegodci@gmail.com\n\nThank you! :D\nDiego Inácio\n" 97 | return(infoText) 98 | 99 | ######## 100 | # Main # 101 | ######## 102 | mayaRenamerUI() -------------------------------------------------------------------------------- /Maya/Python-Scripts/mayaStepST.py: -------------------------------------------------------------------------------- 1 | '''.................................................................................................. 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | ..................................................................................................... 5 | If you have any comment send it to: diegodci@gmail.com 6 | Thank you! :D 7 | ..................................................................................................''' 8 | import maya.cmds as cmds 9 | import random 10 | 11 | script = 'mayaStepST' 12 | version = '1.0.0' 13 | title = script + ' ' + version 14 | 15 | def closeUI(scriptUI): 16 | if cmds.window(scriptUI, menuBar = True, exists = True): 17 | cmds.deleteUI(scriptUI) 18 | 19 | def mayaStepSTUI(): 20 | global cb01, cb02, cb03, tfbg 21 | closeUI(script) 22 | cmds.window(script, title = title, widthHeight = (210, 30)) 23 | cmds.columnLayout(columnAttach = ['both', 5], rowSpacing = 5, columnWidth = 210) 24 | cmds.gridLayout(numberOfColumns = 3, cellWidthHeight = (70, 20)) 25 | cb01 = cmds.checkBox(label = 's', value = True) 26 | cb02 = cmds.checkBox(label = 't', value = True) 27 | cb03 = cmds.checkBox(label = 'random', value = False) 28 | cmds.setParent('..') 29 | cmds.text(label = '..: steps :..', backgroundColor = [0, 0, 0]) 30 | tfbg = cmds.textFieldButtonGrp(text = '32', buttonLabel = ' ok ', columnWidth2 = [160, 50], buttonCommand = 'mayaStepST()') 31 | cmds.setParent('..') 32 | cmds.showWindow() 33 | 34 | def mayaStepST(): 35 | steps = int(cmds.textFieldButtonGrp(tfbg, text = True, query = True)) 36 | cbS = cmds.checkBox(cb01, value = True, query = True) 37 | cbT = cmds.checkBox(cb02, value = True, query = True) 38 | cbRandom = cmds.checkBox(cb03, value = True, query = True) 39 | 40 | if(cbS): 41 | s = cmds.shadingNode('ramp', name = 's', asTexture = True) 42 | 43 | cmds.setAttr('%s.type' % s, 1) 44 | cmds.setAttr('%s.interpolation' % s, 0) 45 | 46 | if(cbRandom): 47 | c = random.random() 48 | else: 49 | c = 0.0 50 | p = 0.0 51 | 52 | for i in range(steps): 53 | cmds.setAttr('%s.colorEntryList[%s].color' %(s, i), c, c, c, type = 'double3') 54 | cmds.setAttr('%s.colorEntryList[%s].position' %(s, i), p) 55 | 56 | if(cbRandom): 57 | c = random.random() 58 | else: 59 | c += 1.0/(steps - 1) 60 | p += 1.0/steps 61 | 62 | if(cbT): 63 | t = cmds.shadingNode('ramp', name = 't', asTexture = True) 64 | 65 | cmds.setAttr('%s.type' % t, 0) 66 | cmds.setAttr('%s.interpolation' % t, 0) 67 | 68 | if(cbRandom): 69 | c = random.random() 70 | else: 71 | c = 0.0 72 | p = 0.0 73 | 74 | for i in range(steps): 75 | cmds.setAttr('%s.colorEntryList[%s].color' %(t, i), c, c, c, type = 'double3') 76 | cmds.setAttr('%s.colorEntryList[%s].position' %(t, i), p) 77 | 78 | if(cbRandom): 79 | c = random.random() 80 | else: 81 | c += 1.0/(steps - 1) 82 | p += 1.0/steps 83 | 84 | closeUI(script) 85 | 86 | mayaStepSTUI() -------------------------------------------------------------------------------- /Maya/README.md: -------------------------------------------------------------------------------- 1 | # Maya 2 | 3 | Some tools to use with [Autodesk's **Maya**](https://www.autodesk.com/products/maya/overview). -------------------------------------------------------------------------------- /Nuke/BlinkScripts/DFT.blink: -------------------------------------------------------------------------------- 1 | /*......................................................................................... 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: MAR/10/2017 5 | ........................................................................................... 6 | Complexity: O(n²) 7 | Discrete Fourier transform for frequency domain analysis. 8 | Use this code on blinkScript node for nuke. 9 | .........................................................................................*/ 10 | //defining the type for complex numbers 11 | typedef float2 complex; 12 | 13 | //Calculate complex number's exponential based on Euler's formula 14 | inline complex cExp(float a){ 15 | return a < 0 ? complex(cos(fabs(a)), - sin(fabs(a))) : complex(cos(a), sin(a)); 16 | } 17 | 18 | kernel DFT: ImageComputationKernel{ 19 | Image in; 20 | Image out; 21 | 22 | param: 23 | bool centerKernel; 24 | 25 | local: 26 | float N1, N2; 27 | 28 | void define(){ 29 | defineParam(centerKernel, "center kernel", true); 30 | } 31 | 32 | void init(){ 33 | N1 = in.bounds.width(); 34 | N2 = in.bounds.height(); 35 | } 36 | 37 | void process(int2 p){ 38 | ValueType(in) x(0); 39 | complex X(0); 40 | float w1 = centerKernel ? fmod(p.x + N1*0.5f, N1) : p.x; 41 | float w2 = centerKernel ? fmod(p.y + N2*0.5f, N2) : p.y; 42 | for(int n1 = 0; n1 < N1; n1++){ 43 | for(int n2 = 0; n2 < N2; n2++){ 44 | x = in(n1, n2); 45 | X += x*cExp(-2.0f*PI*(w1*n1/N1 + w2*n2/N2)); 46 | } 47 | } 48 | // normalization 49 | X *= 1/sqrt(N1*N2); 50 | // output 51 | out() = X.x + X.y; 52 | } 53 | }; -------------------------------------------------------------------------------- /Nuke/BlinkScripts/DFTi.blink: -------------------------------------------------------------------------------- 1 | /*......................................................................................... 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: MAR/10/2017 5 | ........................................................................................... 6 | Complexity: O(n²) 7 | Inverse discrete Fourier transform for frequency domain analysis. 8 | Use this code on blinkScript node for nuke. 9 | .........................................................................................*/ 10 | //defining the type for complex numbers 11 | typedef float2 complex; 12 | 13 | //Calculate complex number's exponential based on Euler's formula 14 | inline complex cExp(float a){ 15 | return complex(cos(a), sin(a)); 16 | } 17 | 18 | kernel DFTi: ImageComputationKernel{ 19 | Image in; 20 | Image out; 21 | 22 | param: 23 | bool centeredKernel; 24 | 25 | local: 26 | float N1, N2; 27 | 28 | void define(){ 29 | defineParam(centeredKernel, "centered kernel", true); 30 | } 31 | 32 | void init(){ 33 | N1 = in.bounds.width(); 34 | N2 = in.bounds.height(); 35 | } 36 | 37 | void process(int2 p){ 38 | ValueType(in) X(0); 39 | complex x(0); 40 | float n1 = N1 - p.x; 41 | float n2 = N2 - p.y; 42 | for(int k1 = 0; k1 < N1; k1++){ 43 | for(int k2 = 0; k2 < N2; k2++){ 44 | X = centeredKernel ? in(fmod(k1 + N1*0.5f, N1), fmod(k2 + N2*0.5f, N2)) : in(k1, k2); 45 | x += X*cExp(2.0f*PI*(n1*k1/N1 + n2*k2/N2)); 46 | } 47 | } 48 | x *= 1.0f/sqrt(N1*N2); 49 | out() = x.x + x.y; 50 | } 51 | }; -------------------------------------------------------------------------------- /Nuke/BlinkScripts/infNanFilter.blink: -------------------------------------------------------------------------------- 1 | /*......................................................................................... 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: MAR/01/2016 5 | ........................................................................................... 6 | Complexity: O(n*log(n)) 7 | Inf and NaN artifact removal. 8 | Use this code on blinkScript node for nuke. 9 | .........................................................................................*/ 10 | #define isInf(value) value/value != 1 ? true : false 11 | #define isNan(value) value != value ? true : false 12 | 13 | kernel infNanFilter: public ImageComputationKernel{ 14 | Image in; 15 | Image out; 16 | 17 | param: 18 | float radius; 19 | 20 | void define() { 21 | defineParam(radius, "radius", 1.0f); 22 | } 23 | 24 | void init(){ 25 | in.setRange(-radius, -radius, radius, radius); 26 | } 27 | 28 | void process(){ 29 | float current = in(0, 0); 30 | float ranged; 31 | float result = 0; 32 | int count = 0; 33 | if(isInf(current) || isNan(current)){ 34 | for(int j = - radius; j <= radius; j++){ 35 | for(int i = - radius; i <= radius; i++){ 36 | ranged = in(i, j); 37 | if(isInf(ranged) || isNan(ranged)) continue; 38 | else{ 39 | result += in(i, j); 40 | count++; 41 | } 42 | } 43 | } 44 | if(result != 0) out() = result/count; 45 | else out() = 0; 46 | } 47 | else out() = current; 48 | } 49 | }; -------------------------------------------------------------------------------- /Nuke/BlinkScripts/kaleidoscope.blink: -------------------------------------------------------------------------------- 1 | /*......................................................................................... 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: APR/20/2016 5 | ........................................................................................... 6 | Complexity: O(n) 7 | Use this code on blinkScript node for nuke. 8 | .........................................................................................*/ 9 | inline float lerp(float t, float a, float b){ 10 | return (1.0f - t)*a + t*b; 11 | } 12 | 13 | kernel kaleidoscope: ImageComputationKernel{ 14 | Image in; 15 | Image out; 16 | 17 | param: 18 | float rot, thetaTile, radiusTile, thetaOffset, radiusOffset, thetaRange, radiusRange; 19 | 20 | local: 21 | float M, N, cx, cy; 22 | 23 | void define(){ 24 | defineParam(rot, "rotation", 0.5f); 25 | defineParam(thetaTile, "theta repeat", 4.0f); 26 | defineParam(radiusTile, "radius repeat", 2.0f); 27 | defineParam(thetaOffset, "theta offset", 0.5f); 28 | defineParam(radiusOffset, "radius offset", 0.5f); 29 | defineParam(thetaRange, "theta range", 0.5f); 30 | defineParam(radiusRange, "radius range", 0.5f); 31 | } 32 | 33 | void init(){ 34 | M = in.bounds.width(); 35 | N = in.bounds.height(); 36 | cx = M*0.5f; 37 | cy = N*0.5f; 38 | } 39 | 40 | void process(int2 p){ 41 | ValueType(in) result(0); 42 | float theta, radius, thetaOffsetRemap, radiusOffsetRemap; 43 | // set angle and distance of pixels to polar mapping 44 | theta = fmod((atan2(p.y - cy, p.x - cx) + PI)/(2*PI) + rot, 1.0f); 45 | radius = 2*sqrt(pow(p.x - cx, 2) + pow(p.y - cy, 2))/N; 46 | // start repetition settings 47 | theta *= thetaTile; 48 | radius *= radiusTile; 49 | // mirror repeats 50 | theta = fmod(floor(theta), 2.0f) == 0 ? fmod(theta, 1.0f) : 1 - fmod(theta, 1.0f); 51 | radius = fmod(floor(radius), 2.0f) == 0 ? fmod(radius, 1.0f) : 1 - fmod(radius, 1.0f); 52 | // offset's remapping combined with the range 53 | thetaOffsetRemap = lerp( clamp(thetaOffset, 0.0f, 1.0f), 54 | clamp(thetaRange, 0.0f, 1.0f)*0.5f, 55 | 1.0f - clamp(thetaRange, 0.0f, 1.0f)*0.5f); 56 | radiusOffsetRemap = lerp( clamp(radiusOffset, 0.0f, 1.0f), 57 | clamp(radiusRange, 0.0f, 1.0f)*0.5f, 58 | 1.0f - clamp(radiusRange, 0.0f, 1.0f)*0.5f); 59 | // rearranges coordinates 60 | theta = lerp(theta, thetaOffsetRemap - thetaRange*0.5f, thetaOffsetRemap + thetaRange*0.5f); 61 | radius = lerp(radius, radiusOffsetRemap - radiusRange*0.5f, radiusOffsetRemap + radiusRange*0.5f); 62 | // remap the coordinates for image length 63 | theta *= M; 64 | radius *= N; 65 | // provide interpolation for intermediate coordinates 66 | result += lerp(fmod(theta, 1.0f), in(theta, radius), in(ceil(theta), radius)); 67 | result += lerp(fmod(radius, 1.0f), in(theta, radius), in(theta, ceil(radius))); 68 | result += lerp(fmod(theta*radius, 1.0f), in(theta, radius), in(ceil(theta), ceil(radius))); 69 | result /= 3; 70 | // output 71 | out() = result; 72 | } 73 | }; -------------------------------------------------------------------------------- /Nuke/BlinkScripts/medianSaturation.blink: -------------------------------------------------------------------------------- 1 | /*......................................................................................... 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: APR/25/2016 5 | ........................................................................................... 6 | Complexity: O(n) 7 | Adjust the levels of saturation statisticaly using median value 8 | Use this code on blinkScript node for nuke. 9 | .........................................................................................*/ 10 | kernel medianSaturation: ImageComputationKernel{ 11 | Image in; 12 | Image out; 13 | 14 | param: 15 | bool AM, GM, HM; 16 | float saturation; 17 | bool alpha; 18 | 19 | void define(){ 20 | defineParam(AM, "arithmetic mean", false); 21 | defineParam(GM, "geometric mean", false); 22 | defineParam(HM, "harmonic mean", false); 23 | defineParam(saturation, "saturation", 1.0f); 24 | defineParam(alpha, "includes alpha", false); 25 | } 26 | 27 | void process(){ 28 | float medi, ami, gmi, hmi; 29 | SampleType(in) color(0); 30 | SampleType(in) result(0); 31 | color = in(); 32 | ami = (color.x + color.y + color.z)/3.0f; 33 | gmi = pow(color.x*color.y*color.z, 1.0f/3.0f); 34 | hmi = 3.0f*pow(1.0f/color.x + 1.0f/color.y + 1.0f/color.z, -1.0f); 35 | if(!AM and !GM and !HM){ 36 | float l[3] = {color.x, color.y, color.z}; 37 | medi = median(l, 3); 38 | } 39 | else if(AM and !GM and !HM){ 40 | float l[4] = {color.x, color.y, color.z, ami}; 41 | medi = median(l, 4); 42 | } 43 | else if(!AM and GM and !HM){ 44 | float l[4] = {color.x, color.y, color.z, gmi}; 45 | medi = median(l, 4); 46 | } 47 | else if(!AM and !GM and HM){ 48 | float l[4] = {color.x, color.y, color.z, hmi}; 49 | medi = median(l, 4); 50 | } 51 | else if(AM and GM and !HM){ 52 | float l[5] = {color.x, color.y, color.z, ami, gmi}; 53 | medi = median(l, 5); 54 | } 55 | else if(AM and !GM and HM){ 56 | float l[5] = {color.x, color.y, color.z, ami, hmi}; 57 | medi = median(l, 5); 58 | } 59 | else if(!AM and GM and HM){ 60 | float l[5] = {color.x, color.y, color.z, gmi, hmi}; 61 | medi = median(l, 5); 62 | } 63 | else if(AM and GM and HM){ 64 | float l[6] = {color.x, color.y, color.z, ami, gmi, hmi}; 65 | medi = median(l, 6); 66 | } 67 | else{ 68 | float l[3] = {color.x, color.y, color.z}; 69 | medi = median(l, 3); 70 | } 71 | result = (1 - saturation)*medi + saturation*color; 72 | if(!alpha){ 73 | result.w = color.w; 74 | } 75 | out() = result; 76 | } 77 | }; -------------------------------------------------------------------------------- /Nuke/BlinkScripts/normalize.blink: -------------------------------------------------------------------------------- 1 | /*......................................................................................... 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: APR/08/2016 5 | ........................................................................................... 6 | Complexity: O(n) 7 | Normalize RGB channels. 8 | Use this code on blinkScript node for nuke. 9 | .........................................................................................*/ 10 | kernel Normalize: ImageComputationKernel{ 11 | Image in; 12 | Image out; 13 | 14 | void process(){ 15 | SampleType(in) n(in()); 16 | float normal = sqrt(pow(n.x, 2) + pow(n.y, 2) + pow(n.z, 2)); 17 | if(normal != 0){ 18 | n.x/= normal; n.y/= normal; n.z/= normal; 19 | } 20 | out() = n; 21 | } 22 | }; -------------------------------------------------------------------------------- /Nuke/BlinkScripts/superConvolution.blink: -------------------------------------------------------------------------------- 1 | /*.............................................................................................. 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: APR/11/2016 5 | ................................................................................................ 6 | Complexity: O(n*log(n)) 7 | Uses superformula's shapes in convolution matrices. 8 | Use this code on blinkScript node for nuke. 9 | p.s: remember to set the option "Percentage of image height per tile"("Settings" tab) to 100 10 | ..............................................................................................*/ 11 | inline float lerp(float t, float a, float b){ 12 | return t <= a ? 1 : t > b ? 0 : (b - t)/(b - a); 13 | } 14 | 15 | kernel superConvolution: ImageComputationKernel{ 16 | Image in; 17 | Image out; 18 | 19 | param: 20 | bool sample; 21 | float a, b, y, z, n1, n2, n3, size, rot, falloff, kRad; 22 | 23 | local: 24 | float M, N; 25 | 26 | void define(){ 27 | defineParam(sample, "view sample filter", false); 28 | defineParam(a, "a", 1.0f); 29 | defineParam(b, "b", 1.0f); 30 | defineParam(y, "y", 3.0f); 31 | defineParam(z, "z", 3.0f); 32 | defineParam(n1, "n1", 5.0f); 33 | defineParam(n2, "n2", 18.0f); 34 | defineParam(n3, "n3", 18.0f); 35 | defineParam(size, "size", 1.0f); 36 | defineParam(rot, "rotation", 0.5f); 37 | defineParam(falloff, "falloff", 0.01f); 38 | defineParam(kRad, "kernel radius", 16.0f); 39 | } 40 | 41 | void init(){ 42 | M = out.bounds.width(); 43 | N = out.bounds.height(); 44 | } 45 | 46 | void process(int2 p){ 47 | float s, t, r, theta, radius, rMin, rMax; 48 | if(sample){ 49 | s = p.x/M; 50 | t = p.y/N; 51 | r = sqrt(pow(0.5f - s, 2) + pow(0.5f - t, 2))*2.0f*PI/size; 52 | theta = atan2(0.5f - t, 0.5f - s) + rot*2.0f*PI; 53 | radius = pow(pow(fabs(cos(theta*y/4.0f)/a), n2) + pow(fabs(sin(theta*z/4.0f)/b), n3), - 1.0f/n1); 54 | rMin = radius - falloff; 55 | rMax = radius + falloff; 56 | out() = lerp(r, rMin, rMax); 57 | } 58 | else{ 59 | ValueType(in) result(0); 60 | ValueType(in) filter(0); 61 | float2 M(p.x - kRad, p.x + kRad); 62 | float2 N(p.y - kRad, p.y + kRad); 63 | for(int j = N[0]; j <= N[1]; j++){ 64 | for(int i = M[0]; i <= M[1]; i++){ 65 | s = lerp(i, M[0], M[1]); 66 | t = lerp(j, N[0], N[1]); 67 | r = sqrt(pow(0.5f - s, 2) + pow(0.5f - t, 2))*2.0f*PI/size; 68 | theta = atan2(0.5f - t, 0.5f - s) + rot*2.0f*PI; 69 | radius = pow(pow(fabs(cos(theta*y/4.0f)/a), n2) + pow(fabs(sin(theta*z/4.0f)/b), n3), - 1.0f/n1); 70 | rMin = radius - falloff; 71 | rMax = radius + falloff; 72 | filter += lerp(r, rMin, rMax); 73 | result += lerp(r, rMin, rMax)*in(i, j); 74 | } 75 | } 76 | result /= filter; 77 | out() = result; 78 | } 79 | } 80 | }; -------------------------------------------------------------------------------- /Nuke/BlinkScripts/superFilter.blink: -------------------------------------------------------------------------------- 1 | /*.............................................................................................. 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: JAN/13/2017 5 | ................................................................................................ 6 | Complexity: O(n) 7 | Provides a parametric filter based on the Superformula. 8 | Use this code on blinkScript node for nuke. 9 | p.s: remember to set the option "Percentage of image height per tile"("Settings" tab) to 100 10 | ..............................................................................................*/ 11 | inline float lerp(float t, float a, float b){ 12 | return t <= a ? 1 : t > b ? 0 : (b - t)/(b - a); 13 | } 14 | 15 | kernel superShape: ImageComputationKernel{ 16 | Image out; 17 | 18 | param: 19 | float a, b, y, z, n1, n2, n3, size, rot, falloff; 20 | 21 | local: 22 | float M, N; 23 | 24 | void define(){ 25 | defineParam(a, "a", 1.0f); 26 | defineParam(b, "b", 1.0f); 27 | defineParam(y, "y", 3.0f); 28 | defineParam(z, "z", 3.0f); 29 | defineParam(n1, "n1", 5.0f); 30 | defineParam(n2, "n2", 18.0f); 31 | defineParam(n3, "n3", 18.0f); 32 | defineParam(size, "size", 1.0f); 33 | defineParam(rot, "rotation", 0.5f); 34 | defineParam(falloff, "falloff", 0.01f); 35 | } 36 | 37 | void init(){ 38 | M = out.bounds.width(); 39 | N = out.bounds.height(); 40 | } 41 | 42 | void process(int2 p){ 43 | float s, t, r, theta, radius, rMin, rMax; 44 | s = p.x/M; 45 | t = p.y/N; 46 | r = sqrt(pow(0.5f - s, 2) + pow(0.5f - t, 2))*2.0f*PI/size; 47 | theta = atan2(0.5f - t, 0.5f - s) + rot*2.0f*PI; 48 | radius = pow(pow(fabs(cos(theta*y/4.0f)/a), n2) + pow(fabs(sin(theta*z/4.0f)/b), n3), - 1.0f/n1); 49 | rMin = radius - falloff; 50 | rMax = radius + falloff; 51 | out() = lerp(r, rMin, rMax); 52 | } 53 | }; -------------------------------------------------------------------------------- /Nuke/Python-Scripts/diNukeScripts.py: -------------------------------------------------------------------------------- 1 | '''.................................................................................................. 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | Date: SEP/01/2016 5 | ..................................................................................................''' 6 | import nuke 7 | 8 | def reloadAllReads(): 9 | ''' 10 | Reload all read nodes 11 | ''' 12 | nodes = [node for node in nuke.allNodes(recurseGroups = True) if node.Class() == 'Read'] 13 | for node in nodes: 14 | node.knob('reload').execute() 15 | 16 | def reloadAllBlinks(): 17 | ''' 18 | Reload all blinkScript nodes 19 | ''' 20 | nodes = [node for node in nuke.allNodes(recurseGroups = True) if node.Class() == 'BlinkScript'] 21 | for node in nodes: 22 | nuke.show(node) 23 | node.knob('reloadKernelSourceFile').execute() 24 | node.hideControlPanel() 25 | 26 | def pathExplorer(): 27 | ''' 28 | Open filename's path on explorer from Read or Write selected nodes 29 | ''' 30 | import os, subprocess 31 | 32 | sel = nuke.selectedNodes() 33 | for node in sel: 34 | if node.Class() == 'Read' or node.Class() == 'Write': 35 | File = nuke.filename(node) 36 | path = os.path.dirname(File) 37 | subprocess.Popen('explorer "%s"' % path.replace('/', '\\')) 38 | 39 | def writeFolderCreator(): 40 | ''' 41 | Checks if selected write node's folder exists and create them if does not 42 | ''' 43 | import os 44 | 45 | nodes = nuke.selectedNodes('Write') 46 | if nodes == []: 47 | nuke.message('select some write node') 48 | return None 49 | 50 | for node in nodes: 51 | file = nuke.filename(node) 52 | path = os.path.dirname(file) 53 | if not os.path.isdir(path): 54 | if nuke.ask(node.knob('name').getValue() + '\n\n' + path +\ 55 | '\n\nthis path does not exist. would like to create it?'): 56 | os.makedirs(path) 57 | 58 | def setMultipleKnobs(): 59 | ''' 60 | Set multiple knobs into multiple selected nodes 61 | ''' 62 | import ast 63 | 64 | nodes = nuke.selectedNodes() 65 | if nodes == []: 66 | nuke.message('select some node') 67 | return None 68 | 69 | classes = set() 70 | for node in nodes: 71 | classes.add(node.Class()) 72 | enumClasses = ' '.join(['all'] + list(classes)) 73 | 74 | p = nuke.Panel('set multiple knobs') 75 | p.addEnumerationPulldown('node class', enumClasses) 76 | p.addSingleLineInput('knob name', '') 77 | p.addSingleLineInput('value', '') 78 | c = p.show() 79 | 80 | if c: 81 | nodeClass = p.value('node class') 82 | knobName = [e.lstrip() for e in p.value('knob name').split(',')] 83 | try: 84 | value = list(ast.literal_eval(p.value('value'))) 85 | except: 86 | value = [eval(p.value('value'))] 87 | 88 | if len(knobName) != len(value): 89 | nuke.message( "the knobName's field and the value's \ 90 | field must have the same number of arguments") 91 | return None 92 | 93 | for node in nodes: 94 | if node.Class() == nodeClass or nodeClass == 'all': 95 | for index in range(len(knobName)): 96 | node.knob(knobName[index]).setValue(value[index]) -------------------------------------------------------------------------------- /Nuke/Python-Scripts/init.py: -------------------------------------------------------------------------------- 1 | nuke.pluginAddPath('./python') 2 | nuke.pluginAddPath('./icons') -------------------------------------------------------------------------------- /Nuke/Python-Scripts/menu.py: -------------------------------------------------------------------------------- 1 | '''.................................................................................................. 2 | Author: Diego Inácio 3 | GitHub: github.com/diegoinacio 4 | ..................................................................................................''' 5 | from diNukeScripts import * 6 | 7 | #--------------------------------------------------------------------------------------------------------------- 8 | # Formats 9 | #--------------------------------------------------------------------------------------------------------------- 10 | 11 | nuke.addFormat("32 32 0 0 32 32 1.0 square_32") 12 | nuke.addFormat("64 64 0 0 64 64 1.0 square_64") 13 | nuke.addFormat("128 128 0 0 128 128 1.0 square_128") 14 | nuke.addFormat("4096 4096 0 0 4096 4096 1.0 square_4k") 15 | 16 | #--------------------------------------------------------------------------------------------------------------- 17 | # Defaults 18 | #--------------------------------------------------------------------------------------------------------------- 19 | 20 | nuke.knobDefault('Write.channels', 'rgba') 21 | nuke.knobDefault('Write.file', '[file dirname [value root.name]]/_RENDER/[lindex [split [file tail [value root.name]] "."] 0]_[knob name]/[lindex [split [file tail [value root.name]] "."] 0]_[knob name].%04d.tiff') 22 | nuke.knobDefault('Write.file_type', 'tiff') 23 | 24 | nuke.knobDefault('BlinkScript.kernelSource', 'kernel diBlinkScript: ImageComputationKernel{\n\tImage in;\n\tImage out;\n\n\tparam:\n\t\tfloat mult;\n\n\tlocal:\n\t\tfloat temp;\n\n\tvoid define() {\n\t\tdefineParam(mult, "multiply", 1.0f);\n\t}\n\n\tvoid init() {\n\t\ttemp = 0;\n\t}\n\n\tvoid process() {\n\t\tout() = in() + temp;\n\t}\n};') 25 | 26 | #--------------------------------------------------------------------------------------------------------------- 27 | # Commands 28 | #--------------------------------------------------------------------------------------------------------------- 29 | 30 | nuke.menu('Nuke').addCommand('*** diScripts ***/01 - Reload all Read nodes', 'reloadAllReads()') 31 | nuke.menu('Nuke').addCommand('*** diScripts ***/02 - Reload all BlinkScripts', 'reloadAllBlinks()') 32 | nuke.menu('Nuke').addCommand('*** diScripts ***/03 - Open path on explorer', 'pathExplorer()') 33 | nuke.menu('Nuke').addCommand('*** diScripts ***/04 - Create folder from Write nodes', 'writeFolderCreator()') 34 | nuke.menu('Nuke').addCommand('*** diScripts ***/05 - Set multiple knobs', 'setMultipleKnobs()') -------------------------------------------------------------------------------- /Nuke/README.md: -------------------------------------------------------------------------------- 1 | # Nuke 2 | 3 | Some tools to use with the [Foundry's **Nuke**](https://www.foundry.com/products/nuke). -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Creative Production Coding 2 | 3 | _Scripts_, _plugins_, _addons_ or any kind of tool which promotes productivity for _creative productions_. 4 | 5 | Visit the repository [index page](http://dicgi.github.io/creative-production-coding/). 6 | -------------------------------------------------------------------------------- /docs/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "better-comments.tags": [ 3 | { 4 | "tag": "!", 5 | "color": "#FF0044", 6 | "strikethrough": false, 7 | "backgroundColor": "transparent" 8 | }, 9 | { 10 | "tag": "/!", 11 | "color": "#CC0044", 12 | "strikethrough": false, 13 | "backgroundColor": "transparent" 14 | }, 15 | { 16 | "tag": "*", 17 | "color": "#88FF00", 18 | "strikethrough": false, 19 | "backgroundColor": "transparent" 20 | }, 21 | { 22 | "tag": "/*", 23 | "color": "#44AA00", 24 | "strikethrough": false, 25 | "backgroundColor": "transparent" 26 | }, 27 | { 28 | "tag": "?", 29 | "color": "#AA44FF", 30 | "strikethrough": false, 31 | "backgroundColor": "transparent" 32 | }, 33 | { 34 | "tag": "//", 35 | "color": "#474747", 36 | "strikethrough": true, 37 | "backgroundColor": "transparent" 38 | }, 39 | { 40 | "tag": "todo", 41 | "color": "#FF8C00", 42 | "strikethrough": false, 43 | "backgroundColor": "transparent" 44 | } 45 | ], 46 | "liveSassCompile.settings.formats": [{ 47 | "format": "expanded", 48 | "extensionName": ".css", 49 | "savePath": "./assets/css" 50 | }] 51 | } -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | _Creative Production Coding_ webpage directory. 2 | -------------------------------------------------------------------------------- /docs/assets/css/images/close.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /docs/assets/css/noscript.css: -------------------------------------------------------------------------------- 1 | /* PrismJS 1.23.0 2 | https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+python&plugins=normalize-whitespace */ 3 | /** 4 | * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML 5 | * Based on https://github.com/chriskempson/tomorrow-theme 6 | * @author Rose Pritchard 7 | */ 8 | code[class*="language-"], 9 | pre[class*="language-"] { 10 | color: #ccc; 11 | background: none; 12 | font-size: 1em; 13 | text-align: left; 14 | white-space: pre; 15 | word-spacing: normal; 16 | word-break: normal; 17 | word-wrap: normal; 18 | line-height: 1.5; 19 | -moz-tab-size: 4; 20 | -o-tab-size: 4; 21 | tab-size: 4; 22 | -webkit-hyphens: none; 23 | -ms-hyphens: none; 24 | hyphens: none; 25 | } 26 | 27 | /* Inline code */ 28 | :not(pre) > code[class*="language-"] { 29 | padding: 0.1em; 30 | border-radius: 0.3em; 31 | white-space: normal; 32 | } 33 | 34 | .token.comment, 35 | .token.block-comment, 36 | .token.prolog, 37 | .token.doctype, 38 | .token.cdata { 39 | color: #999; 40 | } 41 | 42 | .token.punctuation { 43 | color: #ccc; 44 | } 45 | 46 | .token.tag, 47 | .token.attr-name, 48 | .token.namespace, 49 | .token.deleted { 50 | color: #e2777a; 51 | } 52 | 53 | .token.function-name { 54 | color: #6196cc; 55 | } 56 | 57 | .token.boolean, 58 | .token.number, 59 | .token.function { 60 | color: #f08d49; 61 | } 62 | 63 | .token.property, 64 | .token.class-name, 65 | .token.constant, 66 | .token.symbol { 67 | color: #f8c555; 68 | } 69 | 70 | .token.selector, 71 | .token.important, 72 | .token.atrule, 73 | .token.keyword, 74 | .token.builtin { 75 | color: #cc99cd; 76 | } 77 | 78 | .token.string, 79 | .token.char, 80 | .token.attr-value, 81 | .token.regex, 82 | .token.variable { 83 | color: #7ec699; 84 | } 85 | 86 | .token.operator, 87 | .token.entity, 88 | .token.url { 89 | color: #67cdcc; 90 | } 91 | 92 | .token.important, 93 | .token.bold { 94 | font-weight: bold; 95 | } 96 | 97 | .token.italic { 98 | font-style: italic; 99 | } 100 | 101 | .token.entity { 102 | cursor: help; 103 | } 104 | 105 | .token.inserted { 106 | color: green; 107 | } 108 | 109 | /* Banner */ 110 | body.is-preload #banner .logo { 111 | -webkit-transform: none; 112 | transform: none; 113 | opacity: 1; 114 | } 115 | 116 | body.is-preload #banner h2 { 117 | opacity: 1; 118 | -webkit-transform: none; 119 | transform: none; 120 | -moz-filter: none; 121 | -webkit-filter: none; 122 | -ms-filter: none; 123 | filter: none; 124 | } 125 | 126 | body.is-preload #banner p { 127 | opacity: 01; 128 | -webkit-transform: none; 129 | transform: none; 130 | -moz-filter: none; 131 | -webkit-filter: none; 132 | -ms-filter: none; 133 | filter: none; 134 | } 135 | /*# sourceMappingURL=noscript.css.map */ -------------------------------------------------------------------------------- /docs/assets/js/breakpoints.min.js: -------------------------------------------------------------------------------- 1 | /* breakpoints.js v1.0 | @ajlkn | MIT licensed */ 2 | var breakpoints=function(){"use strict";function e(e){t.init(e)}var t={list:null,media:{},events:[],init:function(e){t.list=e,window.addEventListener("resize",t.poll),window.addEventListener("orientationchange",t.poll),window.addEventListener("load",t.poll),window.addEventListener("fullscreenchange",t.poll)},active:function(e){var n,a,s,i,r,d,c;if(!(e in t.media)){if(">="==e.substr(0,2)?(a="gte",n=e.substr(2)):"<="==e.substr(0,2)?(a="lte",n=e.substr(2)):">"==e.substr(0,1)?(a="gt",n=e.substr(1)):"<"==e.substr(0,1)?(a="lt",n=e.substr(1)):"!"==e.substr(0,1)?(a="not",n=e.substr(1)):(a="eq",n=e),n&&n in t.list)if(i=t.list[n],Array.isArray(i)){if(r=parseInt(i[0]),d=parseInt(i[1]),isNaN(r)){if(isNaN(d))return;c=i[1].substr(String(d).length)}else c=i[0].substr(String(r).length);if(isNaN(r))switch(a){case"gte":s="screen";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: -1px)";break;case"not":s="screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (max-width: "+d+c+")"}else if(isNaN(d))switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen";break;case"gt":s="screen and (max-width: -1px)";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+")";break;default:s="screen and (min-width: "+r+c+")"}else switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+"), screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (min-width: "+r+c+") and (max-width: "+d+c+")"}}else s="("==i.charAt(0)?"screen and "+i:i;t.media[e]=!!s&&s}return t.media[e]!==!1&&window.matchMedia(t.media[e]).matches},on:function(e,n){t.events.push({query:e,handler:n,state:!1}),t.active(e)&&n()},poll:function(){var e,n;for(e=0;e0:!!("ontouchstart"in window),e.mobile="wp"==e.os||"android"==e.os||"ios"==e.os||"bb"==e.os}};return e.init(),e}();!function(e,n){"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?module.exports=n():e.browser=n()}(this,function(){return browser}); 3 | -------------------------------------------------------------------------------- /docs/assets/js/jquery.scrollex.min.js: -------------------------------------------------------------------------------- 1 | /* jquery.scrollex v0.2.1 | (c) @ajlkn | github.com/ajlkn/jquery.scrollex | MIT licensed */ 2 | !function(t){function e(t,e,n){return"string"==typeof t&&("%"==t.slice(-1)?t=parseInt(t.substring(0,t.length-1))/100*e:"vh"==t.slice(-2)?t=parseInt(t.substring(0,t.length-2))/100*n:"px"==t.slice(-2)&&(t=parseInt(t.substring(0,t.length-2)))),t}var n=t(window),i=1,o={};n.on("scroll",function(){var e=n.scrollTop();t.map(o,function(t){window.clearTimeout(t.timeoutId),t.timeoutId=window.setTimeout(function(){t.handler(e)},t.options.delay)})}).on("load",function(){n.trigger("scroll")}),jQuery.fn.scrollex=function(l){var s=t(this);if(0==this.length)return s;if(this.length>1){for(var r=0;r=i&&o>=t};break;case"bottom":h=function(t,e,n,i,o){return n>=i&&o>=n};break;case"middle":h=function(t,e,n,i,o){return e>=i&&o>=e};break;case"top-only":h=function(t,e,n,i,o){return i>=t&&n>=i};break;case"bottom-only":h=function(t,e,n,i,o){return n>=o&&o>=t};break;default:case"default":h=function(t,e,n,i,o){return n>=i&&o>=t}}return c=function(t){var i,o,l,s,r,a,u=this.state,h=!1,c=this.$element.offset();i=n.height(),o=t+i/2,l=t+i,s=this.$element.outerHeight(),r=c.top+e(this.options.top,s,i),a=c.top+s-e(this.options.bottom,s,i),h=this.test(t,o,l,r,a),h!=u&&(this.state=h,h?this.options.enter&&this.options.enter.apply(this.element):this.options.leave&&this.options.leave.apply(this.element)),this.options.scroll&&this.options.scroll.apply(this.element,[(o-r)/(a-r)])},p={id:a,options:u,test:h,handler:c,state:null,element:this,$element:s,timeoutId:null},o[a]=p,s.data("_scrollexId",p.id),p.options.initialize&&p.options.initialize.apply(this),s},jQuery.fn.unscrollex=function(){var e=t(this);if(0==this.length)return e;if(this.length>1){for(var n=0;n 0 32 | && $header.hasClass('alt')) { 33 | 34 | $window.on('resize', function() { $window.trigger('scroll'); }); 35 | 36 | $banner.scrollex({ 37 | bottom: $header.outerHeight(), 38 | terminate: function() { $header.removeClass('alt'); }, 39 | enter: function() { $header.addClass('alt'); }, 40 | leave: function() { $header.removeClass('alt'); } 41 | }); 42 | 43 | } 44 | 45 | // Menu. 46 | var $menu = $('#menu'); 47 | 48 | $menu._locked = false; 49 | 50 | $menu._lock = function() { 51 | 52 | if ($menu._locked) 53 | return false; 54 | 55 | $menu._locked = true; 56 | 57 | window.setTimeout(function() { 58 | $menu._locked = false; 59 | }, 350); 60 | 61 | return true; 62 | 63 | }; 64 | 65 | $menu._show = function() { 66 | 67 | if ($menu._lock()) 68 | $body.addClass('is-menu-visible'); 69 | 70 | }; 71 | 72 | $menu._hide = function() { 73 | 74 | if ($menu._lock()) 75 | $body.removeClass('is-menu-visible'); 76 | 77 | }; 78 | 79 | $menu._toggle = function() { 80 | 81 | if ($menu._lock()) 82 | $body.toggleClass('is-menu-visible'); 83 | 84 | }; 85 | 86 | $menu 87 | .appendTo($body) 88 | .on('click', function(event) { 89 | 90 | event.stopPropagation(); 91 | 92 | // Hide. 93 | $menu._hide(); 94 | 95 | }) 96 | .find('.inner') 97 | .on('click', '.close', function(event) { 98 | 99 | event.preventDefault(); 100 | event.stopPropagation(); 101 | event.stopImmediatePropagation(); 102 | 103 | // Hide. 104 | $menu._hide(); 105 | 106 | }) 107 | .on('click', function(event) { 108 | event.stopPropagation(); 109 | }) 110 | .on('click', 'a', function(event) { 111 | 112 | var href = $(this).attr('href'); 113 | 114 | event.preventDefault(); 115 | event.stopPropagation(); 116 | 117 | // Hide. 118 | $menu._hide(); 119 | 120 | // Redirect. 121 | window.setTimeout(function() { 122 | window.location.href = href; 123 | }, 350); 124 | 125 | }); 126 | 127 | $body 128 | .on('click', 'a[href="#menu"]', function(event) { 129 | 130 | event.stopPropagation(); 131 | event.preventDefault(); 132 | 133 | // Toggle. 134 | $menu._toggle(); 135 | 136 | }) 137 | .on('keydown', function(event) { 138 | 139 | // Hide on escape. 140 | if (event.keyCode == 27) 141 | $menu._hide(); 142 | 143 | }); 144 | 145 | })(jQuery); -------------------------------------------------------------------------------- /docs/assets/js/util.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 3 | /** 4 | * Generate an indented list of links from a nav. Meant for use with panel(). 5 | * @return {jQuery} jQuery object. 6 | */ 7 | $.fn.navList = function() { 8 | 9 | var $this = $(this); 10 | $a = $this.find('a'), 11 | b = []; 12 | 13 | $a.each(function() { 14 | 15 | var $this = $(this), 16 | indent = Math.max(0, $this.parents('li').length - 1), 17 | href = $this.attr('href'), 18 | target = $this.attr('target'); 19 | 20 | b.push( 21 | '' + 26 | '' + 27 | $this.text() + 28 | '' 29 | ); 30 | 31 | }); 32 | 33 | return b.join(''); 34 | 35 | }; 36 | 37 | /** 38 | * Panel-ify an element. 39 | * @param {object} userConfig User config. 40 | * @return {jQuery} jQuery object. 41 | */ 42 | $.fn.panel = function(userConfig) { 43 | 44 | // No elements? 45 | if (this.length == 0) 46 | return $this; 47 | 48 | // Multiple elements? 49 | if (this.length > 1) { 50 | 51 | for (var i=0; i < this.length; i++) 52 | $(this[i]).panel(userConfig); 53 | 54 | return $this; 55 | 56 | } 57 | 58 | // Vars. 59 | var $this = $(this), 60 | $body = $('body'), 61 | $window = $(window), 62 | id = $this.attr('id'), 63 | config; 64 | 65 | // Config. 66 | config = $.extend({ 67 | 68 | // Delay. 69 | delay: 0, 70 | 71 | // Hide panel on link click. 72 | hideOnClick: false, 73 | 74 | // Hide panel on escape keypress. 75 | hideOnEscape: false, 76 | 77 | // Hide panel on swipe. 78 | hideOnSwipe: false, 79 | 80 | // Reset scroll position on hide. 81 | resetScroll: false, 82 | 83 | // Reset forms on hide. 84 | resetForms: false, 85 | 86 | // Side of viewport the panel will appear. 87 | side: null, 88 | 89 | // Target element for "class". 90 | target: $this, 91 | 92 | // Class to toggle. 93 | visibleClass: 'visible' 94 | 95 | }, userConfig); 96 | 97 | // Expand "target" if it's not a jQuery object already. 98 | if (typeof config.target != 'jQuery') 99 | config.target = $(config.target); 100 | 101 | // Panel. 102 | 103 | // Methods. 104 | $this._hide = function(event) { 105 | 106 | // Already hidden? Bail. 107 | if (!config.target.hasClass(config.visibleClass)) 108 | return; 109 | 110 | // If an event was provided, cancel it. 111 | if (event) { 112 | 113 | event.preventDefault(); 114 | event.stopPropagation(); 115 | 116 | } 117 | 118 | // Hide. 119 | config.target.removeClass(config.visibleClass); 120 | 121 | // Post-hide stuff. 122 | window.setTimeout(function() { 123 | 124 | // Reset scroll position. 125 | if (config.resetScroll) 126 | $this.scrollTop(0); 127 | 128 | // Reset forms. 129 | if (config.resetForms) 130 | $this.find('form').each(function() { 131 | this.reset(); 132 | }); 133 | 134 | }, config.delay); 135 | 136 | }; 137 | 138 | // Vendor fixes. 139 | $this 140 | .css('-ms-overflow-style', '-ms-autohiding-scrollbar') 141 | .css('-webkit-overflow-scrolling', 'touch'); 142 | 143 | // Hide on click. 144 | if (config.hideOnClick) { 145 | 146 | $this.find('a') 147 | .css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)'); 148 | 149 | $this 150 | .on('click', 'a', function(event) { 151 | 152 | var $a = $(this), 153 | href = $a.attr('href'), 154 | target = $a.attr('target'); 155 | 156 | if (!href || href == '#' || href == '' || href == '#' + id) 157 | return; 158 | 159 | // Cancel original event. 160 | event.preventDefault(); 161 | event.stopPropagation(); 162 | 163 | // Hide panel. 164 | $this._hide(); 165 | 166 | // Redirect to href. 167 | window.setTimeout(function() { 168 | 169 | if (target == '_blank') 170 | window.open(href); 171 | else 172 | window.location.href = href; 173 | 174 | }, config.delay + 10); 175 | 176 | }); 177 | 178 | } 179 | 180 | // Event: Touch stuff. 181 | $this.on('touchstart', function(event) { 182 | 183 | $this.touchPosX = event.originalEvent.touches[0].pageX; 184 | $this.touchPosY = event.originalEvent.touches[0].pageY; 185 | 186 | }) 187 | 188 | $this.on('touchmove', function(event) { 189 | 190 | if ($this.touchPosX === null 191 | || $this.touchPosY === null) 192 | return; 193 | 194 | var diffX = $this.touchPosX - event.originalEvent.touches[0].pageX, 195 | diffY = $this.touchPosY - event.originalEvent.touches[0].pageY, 196 | th = $this.outerHeight(), 197 | ts = ($this.get(0).scrollHeight - $this.scrollTop()); 198 | 199 | // Hide on swipe? 200 | if (config.hideOnSwipe) { 201 | 202 | var result = false, 203 | boundary = 20, 204 | delta = 50; 205 | 206 | switch (config.side) { 207 | 208 | case 'left': 209 | result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX > delta); 210 | break; 211 | 212 | case 'right': 213 | result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX < (-1 * delta)); 214 | break; 215 | 216 | case 'top': 217 | result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY > delta); 218 | break; 219 | 220 | case 'bottom': 221 | result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY < (-1 * delta)); 222 | break; 223 | 224 | default: 225 | break; 226 | 227 | } 228 | 229 | if (result) { 230 | 231 | $this.touchPosX = null; 232 | $this.touchPosY = null; 233 | $this._hide(); 234 | 235 | return false; 236 | 237 | } 238 | 239 | } 240 | 241 | // Prevent vertical scrolling past the top or bottom. 242 | if (($this.scrollTop() < 0 && diffY < 0) 243 | || (ts > (th - 2) && ts < (th + 2) && diffY > 0)) { 244 | 245 | event.preventDefault(); 246 | event.stopPropagation(); 247 | 248 | } 249 | 250 | }); 251 | 252 | // Event: Prevent certain events inside the panel from bubbling. 253 | $this.on('click touchend touchstart touchmove', function(event) { 254 | event.stopPropagation(); 255 | }); 256 | 257 | // Event: Hide panel if a child anchor tag pointing to its ID is clicked. 258 | $this.on('click', 'a[href="#' + id + '"]', function(event) { 259 | 260 | event.preventDefault(); 261 | event.stopPropagation(); 262 | 263 | config.target.removeClass(config.visibleClass); 264 | 265 | }); 266 | 267 | // Body. 268 | 269 | // Event: Hide panel on body click/tap. 270 | $body.on('click touchend', function(event) { 271 | $this._hide(event); 272 | }); 273 | 274 | // Event: Toggle. 275 | $body.on('click', 'a[href="#' + id + '"]', function(event) { 276 | 277 | event.preventDefault(); 278 | event.stopPropagation(); 279 | 280 | config.target.toggleClass(config.visibleClass); 281 | 282 | }); 283 | 284 | // Window. 285 | 286 | // Event: Hide on ESC. 287 | if (config.hideOnEscape) 288 | $window.on('keydown', function(event) { 289 | 290 | if (event.keyCode == 27) 291 | $this._hide(event); 292 | 293 | }); 294 | 295 | return $this; 296 | 297 | }; 298 | 299 | /** 300 | * Apply "placeholder" attribute polyfill to one or more forms. 301 | * @return {jQuery} jQuery object. 302 | */ 303 | $.fn.placeholder = function() { 304 | 305 | // Browser natively supports placeholders? Bail. 306 | if (typeof (document.createElement('input')).placeholder != 'undefined') 307 | return $(this); 308 | 309 | // No elements? 310 | if (this.length == 0) 311 | return $this; 312 | 313 | // Multiple elements? 314 | if (this.length > 1) { 315 | 316 | for (var i=0; i < this.length; i++) 317 | $(this[i]).placeholder(); 318 | 319 | return $this; 320 | 321 | } 322 | 323 | // Vars. 324 | var $this = $(this); 325 | 326 | // Text, TextArea. 327 | $this.find('input[type=text],textarea') 328 | .each(function() { 329 | 330 | var i = $(this); 331 | 332 | if (i.val() == '' 333 | || i.val() == i.attr('placeholder')) 334 | i 335 | .addClass('polyfill-placeholder') 336 | .val(i.attr('placeholder')); 337 | 338 | }) 339 | .on('blur', function() { 340 | 341 | var i = $(this); 342 | 343 | if (i.attr('name').match(/-polyfill-field$/)) 344 | return; 345 | 346 | if (i.val() == '') 347 | i 348 | .addClass('polyfill-placeholder') 349 | .val(i.attr('placeholder')); 350 | 351 | }) 352 | .on('focus', function() { 353 | 354 | var i = $(this); 355 | 356 | if (i.attr('name').match(/-polyfill-field$/)) 357 | return; 358 | 359 | if (i.val() == i.attr('placeholder')) 360 | i 361 | .removeClass('polyfill-placeholder') 362 | .val(''); 363 | 364 | }); 365 | 366 | // Password. 367 | $this.find('input[type=password]') 368 | .each(function() { 369 | 370 | var i = $(this); 371 | var x = $( 372 | $('
') 373 | .append(i.clone()) 374 | .remove() 375 | .html() 376 | .replace(/type="password"/i, 'type="text"') 377 | .replace(/type=password/i, 'type=text') 378 | ); 379 | 380 | if (i.attr('id') != '') 381 | x.attr('id', i.attr('id') + '-polyfill-field'); 382 | 383 | if (i.attr('name') != '') 384 | x.attr('name', i.attr('name') + '-polyfill-field'); 385 | 386 | x.addClass('polyfill-placeholder') 387 | .val(x.attr('placeholder')).insertAfter(i); 388 | 389 | if (i.val() == '') 390 | i.hide(); 391 | else 392 | x.hide(); 393 | 394 | i 395 | .on('blur', function(event) { 396 | 397 | event.preventDefault(); 398 | 399 | var x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); 400 | 401 | if (i.val() == '') { 402 | 403 | i.hide(); 404 | x.show(); 405 | 406 | } 407 | 408 | }); 409 | 410 | x 411 | .on('focus', function(event) { 412 | 413 | event.preventDefault(); 414 | 415 | var i = x.parent().find('input[name=' + x.attr('name').replace('-polyfill-field', '') + ']'); 416 | 417 | x.hide(); 418 | 419 | i 420 | .show() 421 | .focus(); 422 | 423 | }) 424 | .on('keypress', function(event) { 425 | 426 | event.preventDefault(); 427 | x.val(''); 428 | 429 | }); 430 | 431 | }); 432 | 433 | // Events. 434 | $this 435 | .on('submit', function() { 436 | 437 | $this.find('input[type=text],input[type=password],textarea') 438 | .each(function(event) { 439 | 440 | var i = $(this); 441 | 442 | if (i.attr('name').match(/-polyfill-field$/)) 443 | i.attr('name', ''); 444 | 445 | if (i.val() == i.attr('placeholder')) { 446 | 447 | i.removeClass('polyfill-placeholder'); 448 | i.val(''); 449 | 450 | } 451 | 452 | }); 453 | 454 | }) 455 | .on('reset', function(event) { 456 | 457 | event.preventDefault(); 458 | 459 | $this.find('select') 460 | .val($('option:first').val()); 461 | 462 | $this.find('input,textarea') 463 | .each(function() { 464 | 465 | var i = $(this), 466 | x; 467 | 468 | i.removeClass('polyfill-placeholder'); 469 | 470 | switch (this.type) { 471 | 472 | case 'submit': 473 | case 'reset': 474 | break; 475 | 476 | case 'password': 477 | i.val(i.attr('defaultValue')); 478 | 479 | x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); 480 | 481 | if (i.val() == '') { 482 | i.hide(); 483 | x.show(); 484 | } 485 | else { 486 | i.show(); 487 | x.hide(); 488 | } 489 | 490 | break; 491 | 492 | case 'checkbox': 493 | case 'radio': 494 | i.attr('checked', i.attr('defaultValue')); 495 | break; 496 | 497 | case 'text': 498 | case 'textarea': 499 | i.val(i.attr('defaultValue')); 500 | 501 | if (i.val() == '') { 502 | i.addClass('polyfill-placeholder'); 503 | i.val(i.attr('placeholder')); 504 | } 505 | 506 | break; 507 | 508 | default: 509 | i.val(i.attr('defaultValue')); 510 | break; 511 | 512 | } 513 | }); 514 | 515 | }); 516 | 517 | return $this; 518 | 519 | }; 520 | 521 | /** 522 | * Moves elements to/from the first positions of their respective parents. 523 | * @param {jQuery} $elements Elements (or selector) to move. 524 | * @param {bool} condition If true, moves elements to the top. Otherwise, moves elements back to their original locations. 525 | */ 526 | $.prioritize = function($elements, condition) { 527 | 528 | var key = '__prioritize'; 529 | 530 | // Expand $elements if it's not already a jQuery object. 531 | if (typeof $elements != 'jQuery') 532 | $elements = $($elements); 533 | 534 | // Step through elements. 535 | $elements.each(function() { 536 | 537 | var $e = $(this), $p, 538 | $parent = $e.parent(); 539 | 540 | // No parent? Bail. 541 | if ($parent.length == 0) 542 | return; 543 | 544 | // Not moved? Move it. 545 | if (!$e.data(key)) { 546 | 547 | // Condition is false? Bail. 548 | if (!condition) 549 | return; 550 | 551 | // Get placeholder (which will serve as our point of reference for when this element needs to move back). 552 | $p = $e.prev(); 553 | 554 | // Couldn't find anything? Means this element's already at the top, so bail. 555 | if ($p.length == 0) 556 | return; 557 | 558 | // Move element to top of parent. 559 | $e.prependTo($parent); 560 | 561 | // Mark element as moved. 562 | $e.data(key, $p); 563 | 564 | } 565 | 566 | // Moved already? 567 | else { 568 | 569 | // Condition is true? Bail. 570 | if (condition) 571 | return; 572 | 573 | $p = $e.data(key); 574 | 575 | // Move element back to its original location (using our placeholder). 576 | $e.insertAfter($p); 577 | 578 | // Unmark element as moved. 579 | $e.removeData(key); 580 | 581 | } 582 | 583 | }); 584 | 585 | }; 586 | 587 | })(jQuery); -------------------------------------------------------------------------------- /docs/assets/sass/base/_page.scss: -------------------------------------------------------------------------------- 1 | /* Basic */ 2 | 3 | // MSIE: Required for IEMobile. 4 | @-ms-viewport { 5 | width: device-width; 6 | } 7 | 8 | // MSIE: Prevents scrollbar from overlapping content. 9 | body { 10 | -ms-overflow-style: scrollbar; 11 | } 12 | 13 | // Ensures page width is always >=320px. 14 | @include breakpoint("<=xsmall") { 15 | html, 16 | body { 17 | min-width: 320px; 18 | } 19 | } 20 | 21 | // Set box model to border-box. 22 | // Based on css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice 23 | html { 24 | box-sizing: border-box; 25 | } 26 | 27 | *, 28 | *:before, 29 | *:after { 30 | box-sizing: inherit; 31 | } 32 | 33 | body { 34 | @include dynamic-background-image; 35 | background-color: _palette(bg); 36 | 37 | background-size: auto, cover; 38 | 39 | background-attachment: fixed, fixed; 40 | 41 | background-position: center, center; 42 | 43 | // Stops initial animations until page loads. 44 | &.is-preload { 45 | *, 46 | *:before, 47 | *:after { 48 | @include vendor("animation", "none !important"); 49 | @include vendor("transition", "none !important"); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /docs/assets/sass/base/_reset.scss: -------------------------------------------------------------------------------- 1 | // Reset. 2 | // Based on meyerweb.com/eric/tools/css/reset (v2.0 | 20110126 | License: public domain) 3 | 4 | html, 5 | body, 6 | div, 7 | span, 8 | applet, 9 | object, 10 | iframe, 11 | h1, 12 | h2, 13 | h3, 14 | h4, 15 | h5, 16 | h6, 17 | p, 18 | blockquote, 19 | pre, 20 | a, 21 | abbr, 22 | acronym, 23 | address, 24 | big, 25 | cite, 26 | code, 27 | del, 28 | dfn, 29 | em, 30 | img, 31 | ins, 32 | kbd, 33 | q, 34 | s, 35 | samp, 36 | small, 37 | strike, 38 | strong, 39 | sub, 40 | sup, 41 | tt, 42 | var, 43 | b, 44 | u, 45 | i, 46 | center, 47 | dl, 48 | dt, 49 | dd, 50 | ol, 51 | ul, 52 | li, 53 | fieldset, 54 | form, 55 | label, 56 | legend, 57 | table, 58 | caption, 59 | tbody, 60 | tfoot, 61 | thead, 62 | tr, 63 | th, 64 | td, 65 | article, 66 | aside, 67 | canvas, 68 | details, 69 | embed, 70 | figure, 71 | figcaption, 72 | footer, 73 | header, 74 | hgroup, 75 | menu, 76 | nav, 77 | output, 78 | ruby, 79 | section, 80 | summary, 81 | time, 82 | mark, 83 | audio, 84 | video { 85 | margin: 0; 86 | padding: 0; 87 | border: 0; 88 | font-size: 100%; 89 | font: inherit; 90 | vertical-align: baseline; 91 | } 92 | 93 | article, 94 | aside, 95 | details, 96 | figcaption, 97 | figure, 98 | footer, 99 | header, 100 | hgroup, 101 | menu, 102 | nav, 103 | section { 104 | display: block; 105 | } 106 | 107 | body { 108 | line-height: 1; 109 | } 110 | 111 | ol, 112 | ul { 113 | list-style: none; 114 | } 115 | 116 | blockquote, 117 | q { 118 | quotes: none; 119 | 120 | &:before, 121 | &:after { 122 | content: ""; 123 | content: none; 124 | } 125 | } 126 | 127 | table { 128 | border-collapse: collapse; 129 | border-spacing: 0; 130 | } 131 | 132 | body { 133 | -webkit-text-size-adjust: none; 134 | } 135 | 136 | mark { 137 | background-color: transparent; 138 | color: inherit; 139 | } 140 | 141 | input::-moz-focus-inner { 142 | border: 0; 143 | padding: 0; 144 | } 145 | 146 | input, 147 | select, 148 | textarea { 149 | -moz-appearance: none; 150 | -webkit-appearance: none; 151 | -ms-appearance: none; 152 | appearance: none; 153 | } 154 | -------------------------------------------------------------------------------- /docs/assets/sass/base/_typography.scss: -------------------------------------------------------------------------------- 1 | /* Type */ 2 | 3 | body, 4 | input, 5 | select, 6 | textarea { 7 | color: _palette(fg); 8 | font-family: _font(family); 9 | font-size: 16.5pt; 10 | font-weight: _font(weight); 11 | line-height: 1.65; 12 | 13 | @include breakpoint("<=xlarge") { 14 | font-size: 13pt; 15 | } 16 | 17 | @include breakpoint("<=large") { 18 | font-size: 12pt; 19 | } 20 | 21 | @include breakpoint("<=medium") { 22 | font-size: 12pt; 23 | } 24 | 25 | @include breakpoint("<=small") { 26 | font-size: 12pt; 27 | } 28 | 29 | @include breakpoint("<=xsmall") { 30 | font-size: 12pt; 31 | } 32 | } 33 | 34 | a { 35 | @include vendor( 36 | "transition", 37 | "color #{_duration(transition)} ease-in-out, border-bottom-color #{_duration(transition)} ease-in-out" 38 | ); 39 | border-bottom: dotted 1px _palette(fg-light); 40 | color: _palette(fg-bold); 41 | text-decoration: none; 42 | 43 | &:hover { 44 | border-bottom-color: transparent; 45 | color: _palette(fg-bold) !important; 46 | } 47 | 48 | &.special:not(.button) { 49 | @include icon(false, solid); 50 | border-bottom: 0; 51 | display: block; 52 | font-family: _font(family-heading); 53 | font-size: 0.8em; 54 | font-weight: _font(weight-heading-bold); 55 | letter-spacing: _font(kern-heading); 56 | margin: 0 0 _size(element-margin) 0; 57 | text-transform: uppercase; 58 | 59 | &:before { 60 | @include vendor( 61 | "transition", 62 | "background-color #{_duration(transition)} ease-in-out" 63 | ); 64 | border-radius: 100%; 65 | border: solid 2px _palette(border); 66 | content: "\f105"; 67 | display: inline-block; 68 | font-size: 1.25em; 69 | height: 2em; 70 | line-height: 1.75em; 71 | margin-right: 0.85em; 72 | text-align: center; 73 | text-indent: 0.15em; 74 | vertical-align: middle; 75 | width: 2em; 76 | } 77 | 78 | &:hover { 79 | &:before { 80 | background-color: _palette(border-bg); 81 | } 82 | } 83 | 84 | &:active { 85 | &:before { 86 | background-color: _palette(border2-bg); 87 | } 88 | } 89 | } 90 | } 91 | 92 | strong, 93 | b { 94 | color: _palette(fg-bold); 95 | font-weight: _font(weight-bold); 96 | } 97 | 98 | em, 99 | i { 100 | font-style: italic; 101 | } 102 | 103 | p { 104 | margin: 0 0 _size(element-margin) 0; 105 | } 106 | 107 | h1, 108 | h2, 109 | h3, 110 | h4, 111 | h5, 112 | h6 { 113 | color: _palette(fg-bold); 114 | font-family: _font(family-heading); 115 | font-weight: _font(weight-heading-bold); 116 | letter-spacing: _font(kern-heading); 117 | margin: 0 0 (_size(element-margin) * 0.5) 0; 118 | text-transform: uppercase; 119 | 120 | a { 121 | color: inherit; 122 | text-decoration: none; 123 | border-bottom: 0; 124 | } 125 | 126 | span { 127 | font-weight: _font(weight-heading); 128 | } 129 | 130 | &.major { 131 | padding-bottom: 1em; 132 | border-bottom: solid 2px _palette(border); 133 | } 134 | } 135 | 136 | h2 { 137 | font-size: 1.2em; 138 | } 139 | 140 | h3 { 141 | font-size: 0.9em; 142 | } 143 | 144 | h4 { 145 | font-size: 0.7em; 146 | } 147 | 148 | h5 { 149 | font-size: 0.7em; 150 | } 151 | 152 | h6 { 153 | font-size: 0.7em; 154 | } 155 | 156 | @include breakpoint("<=small") { 157 | h2 { 158 | font-size: 1em; 159 | } 160 | 161 | h3 { 162 | font-size: 0.8em; 163 | } 164 | } 165 | 166 | sub { 167 | font-size: 0.8em; 168 | position: relative; 169 | top: 0.5em; 170 | } 171 | 172 | sup { 173 | font-size: 0.8em; 174 | position: relative; 175 | top: -0.5em; 176 | } 177 | 178 | blockquote { 179 | border-left: solid 4px _palette(border); 180 | font-style: italic; 181 | margin: 0 0 _size(element-margin) 0; 182 | padding: (_size(element-margin) / 4) 0 (_size(element-margin) / 4) 183 | _size(element-margin); 184 | } 185 | 186 | code { 187 | background: _palette(border-bg); 188 | border-radius: _size(border-radius); 189 | border: solid 2px _palette(border); 190 | font-family: _font(family-fixed); 191 | font-size: 0.9em; 192 | margin: 0 0.25em; 193 | padding: 0.25em 0.65em; 194 | } 195 | 196 | pre { 197 | -webkit-overflow-scrolling: touch; 198 | font-family: _font(family-fixed); 199 | font-size: 0.9em; 200 | margin: 0 0 _size(element-margin) 0; 201 | 202 | code { 203 | display: block; 204 | line-height: 1.75em; 205 | padding: 1em 1.5em; 206 | overflow-x: auto; 207 | } 208 | } 209 | 210 | hr { 211 | border: 0; 212 | border-bottom: solid 2px _palette(border); 213 | margin: (_size(element-margin) * 1.25) 0; 214 | 215 | &.major { 216 | margin: (_size(element-margin) * 2) 0; 217 | } 218 | } 219 | 220 | .align-left { 221 | text-align: left; 222 | } 223 | 224 | .align-center { 225 | text-align: center; 226 | } 227 | 228 | .align-right { 229 | text-align: right; 230 | } 231 | -------------------------------------------------------------------------------- /docs/assets/sass/components/_actions.scss: -------------------------------------------------------------------------------- 1 | /* Actions */ 2 | 3 | ul.actions { 4 | @include vendor("display", "flex"); 5 | cursor: default; 6 | list-style: none; 7 | margin-left: (_size(element-margin) * -0.5); 8 | padding-left: 0; 9 | 10 | li { 11 | padding: 0 0 0 (_size(element-margin) * 0.5); 12 | vertical-align: middle; 13 | } 14 | 15 | &.special { 16 | @include vendor("justify-content", "center"); 17 | width: 100%; 18 | margin-left: 0; 19 | 20 | li { 21 | &:first-child { 22 | padding-left: 0; 23 | } 24 | } 25 | } 26 | 27 | &.stacked { 28 | @include vendor("flex-direction", "column"); 29 | margin-left: 0; 30 | 31 | li { 32 | padding: (_size(element-margin) * 0.65) 0 0 0; 33 | 34 | &:first-child { 35 | padding-top: 0; 36 | } 37 | } 38 | } 39 | 40 | &.fit { 41 | width: calc(100% + #{_size(element-margin) * 0.5}); 42 | 43 | li { 44 | @include vendor("flex-grow", "1"); 45 | @include vendor("flex-shrink", "1"); 46 | width: 100%; 47 | 48 | > * { 49 | width: 100%; 50 | } 51 | } 52 | 53 | &.stacked { 54 | width: 100%; 55 | } 56 | } 57 | 58 | @include breakpoint("<=xsmall") { 59 | &:not(.fixed) { 60 | @include vendor("flex-direction", "column"); 61 | margin-left: 0; 62 | width: 100% !important; 63 | 64 | li { 65 | @include vendor("flex-grow", "1"); 66 | @include vendor("flex-shrink", "1"); 67 | padding: (_size(element-margin) * 0.5) 0 0 0; 68 | text-align: center; 69 | width: 100%; 70 | 71 | > * { 72 | width: 100%; 73 | } 74 | 75 | &:first-child { 76 | padding-top: 0; 77 | } 78 | 79 | input[type="submit"], 80 | input[type="reset"], 81 | input[type="button"], 82 | button, 83 | .button { 84 | width: 100%; 85 | 86 | &.icon { 87 | &:before { 88 | margin-left: -0.5rem; 89 | } 90 | } 91 | } 92 | } 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /docs/assets/sass/components/_box.scss: -------------------------------------------------------------------------------- 1 | /* Box */ 2 | 3 | .box { 4 | border-radius: _size(border-radius); 5 | border: solid 2px _palette(border); 6 | margin-bottom: _size(element-margin); 7 | padding: 1.5em; 8 | 9 | > :last-child, 10 | > :last-child > :last-child, 11 | > :last-child > :last-child > :last-child { 12 | margin-bottom: 0; 13 | } 14 | 15 | &.alt { 16 | border: 0; 17 | border-radius: 0; 18 | padding: 0; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /docs/assets/sass/components/_button.scss: -------------------------------------------------------------------------------- 1 | /* Button */ 2 | 3 | input[type="submit"], 4 | input[type="reset"], 5 | input[type="button"], 6 | button, 7 | .button { 8 | @include vendor("appearance", "none"); 9 | @include vendor( 10 | "transition", 11 | "background-color #{_duration(transition)} ease-in-out" 12 | ); 13 | background-color: transparent; 14 | border-radius: _size(border-radius); 15 | border: 0; 16 | box-shadow: inset 0 0 0 2px _palette(border); 17 | color: _palette(fg-bold) !important; 18 | cursor: pointer; 19 | display: inline-block; 20 | font-family: _font(family-heading); 21 | font-size: 0.8em; 22 | font-weight: _font(weight-heading-bold); 23 | height: 3.75em; 24 | letter-spacing: _font(kern-heading); 25 | line-height: 3.75em; 26 | padding: 0 2.25em; 27 | text-align: center; 28 | text-decoration: none; 29 | text-transform: uppercase; 30 | white-space: nowrap; 31 | 32 | &:hover { 33 | background-color: _palette(border-bg); 34 | } 35 | 36 | &:active { 37 | background-color: _palette(border2-bg); 38 | } 39 | 40 | &.icon { 41 | &:before { 42 | margin-right: 0.5em; 43 | color: _palette(fg-light); 44 | } 45 | } 46 | 47 | &.primary { 48 | background-color: _palette(accent); 49 | box-shadow: none; 50 | 51 | &:hover { 52 | background-color: desaturate(lighten(_palette(accent), 3), 1.5); 53 | } 54 | 55 | &:active { 56 | background-color: saturate(darken(_palette(accent), 3), 1.5); 57 | } 58 | 59 | &.icon { 60 | &:before { 61 | color: mix(_palette(fg-bold), _palette(accent), 25%); 62 | } 63 | } 64 | } 65 | 66 | &.fit { 67 | width: 100%; 68 | } 69 | 70 | &.small { 71 | font-size: 0.6em; 72 | } 73 | 74 | &.large { 75 | font-size: 1em; 76 | } 77 | 78 | &.disabled, 79 | &:disabled { 80 | opacity: 0.25; 81 | } 82 | 83 | @include breakpoint("<=xsmall") { 84 | padding: 0; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /docs/assets/sass/components/_contact.scss: -------------------------------------------------------------------------------- 1 | /* Contact */ 2 | 3 | ul.contact { 4 | list-style: none; 5 | padding: 0; 6 | 7 | li { 8 | @include icon; 9 | margin: (_size(element-margin) * 1.25) 0 0 0; 10 | padding: 0 0 0 3.25em; 11 | position: relative; 12 | 13 | &:before { 14 | border-radius: 100%; 15 | border: solid 2px _palette(border); 16 | display: inline-block; 17 | font-size: 0.8em; 18 | height: 2.5em; 19 | left: 0; 20 | line-height: 2.35em; 21 | position: absolute; 22 | text-align: center; 23 | top: 0; 24 | width: 2.5em; 25 | } 26 | 27 | &:first-child { 28 | margin-top: 0; 29 | } 30 | } 31 | 32 | @include breakpoint("<=small") { 33 | li { 34 | margin: (_size(element-margin) * 0.75) 0 0 0; 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /docs/assets/sass/components/_features.scss: -------------------------------------------------------------------------------- 1 | /* Features */ 2 | 3 | .features { 4 | @include vendor("display", "flex"); 5 | @include vendor("flex-wrap", "wrap"); 6 | margin: 0 0 _size(element-margin) 0; 7 | 8 | article { 9 | @include padding(1.75em, 1.75em); 10 | background-color: desaturate(lighten(_palette(bg), 3), 1.5); 11 | border-radius: _size(border-radius); 12 | margin: (_size(section-spacing, large) * 0.5) _size(section-spacing, large) 13 | (_size(section-spacing, large) * 0.5) 0; 14 | width: calc(50% - #{_size(section-spacing, large) * 0.5}); 15 | 16 | &:nth-child(2n) { 17 | margin-right: 0; 18 | } 19 | 20 | .image { 21 | border-radius: _size(border-radius) _size(border-radius) 0 0; 22 | display: block; 23 | margin-bottom: 1.75em; 24 | margin-left: -1.75em; 25 | margin-top: -1.75em; 26 | position: relative; 27 | width: calc(100% + #{3.5em}); 28 | 29 | img { 30 | border-radius: _size(border-radius) _size(border-radius) 0 0; 31 | width: 100%; 32 | } 33 | } 34 | } 35 | 36 | @include breakpoint("<=medium") { 37 | article { 38 | margin: (_size(section-spacing, medium) * 0.5) 39 | _size(section-spacing, medium) (_size(section-spacing, medium) * 0.5) 0; 40 | width: calc(50% - #{_size(section-spacing, medium) * 0.5}); 41 | } 42 | } 43 | 44 | @include breakpoint("<=small") { 45 | article { 46 | @include padding(1.5em, 1.5em); 47 | margin: (_size(section-spacing, small) * 0.5) 48 | _size(section-spacing, small) (_size(section-spacing, small) * 0.5) 0; 49 | width: calc(50% - #{_size(section-spacing, small) * 0.5} - 1px); 50 | 51 | .image { 52 | margin-bottom: 1.5em; 53 | margin-left: -1.5em; 54 | margin-top: -1.5em; 55 | width: calc(100% + #{3em}); 56 | } 57 | } 58 | } 59 | 60 | @include breakpoint("<=xsmall") { 61 | display: block; 62 | 63 | article { 64 | width: 100%; 65 | margin: 0 0 _size(element-margin) 0 !important; 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /docs/assets/sass/components/_form.scss: -------------------------------------------------------------------------------- 1 | /* Form */ 2 | 3 | form { 4 | margin: 0 0 _size(element-margin) 0; 5 | 6 | > :last-child { 7 | margin-bottom: 0; 8 | } 9 | 10 | > .fields { 11 | $gutter: (_size(element-margin) * 0.75); 12 | 13 | @include vendor("display", "flex"); 14 | @include vendor("flex-wrap", "wrap"); 15 | width: calc(100% + #{$gutter * 2}); 16 | margin: ($gutter * -1) 0 _size(element-margin) ($gutter * -1); 17 | 18 | > .field { 19 | @include vendor("flex-grow", "0"); 20 | @include vendor("flex-shrink", "0"); 21 | padding: $gutter 0 0 $gutter; 22 | width: calc(100% - #{$gutter * 1}); 23 | 24 | &.half { 25 | width: calc(50% - #{$gutter * 0.5}); 26 | } 27 | 28 | &.third { 29 | width: calc(#{100% / 3} - #{$gutter * (1 / 3)}); 30 | } 31 | 32 | &.quarter { 33 | width: calc(25% - #{$gutter * 0.25}); 34 | } 35 | } 36 | } 37 | 38 | @include breakpoint("<=xsmall") { 39 | > .fields { 40 | $gutter: (_size(element-margin) * 0.75); 41 | 42 | width: calc(100% + #{$gutter * 2}); 43 | margin: ($gutter * -1) 0 _size(element-margin) ($gutter * -1); 44 | 45 | > .field { 46 | padding: $gutter 0 0 $gutter; 47 | width: calc(100% - #{$gutter * 1}); 48 | 49 | &.half { 50 | width: calc(100% - #{$gutter * 1}); 51 | } 52 | 53 | &.third { 54 | width: calc(100% - #{$gutter * 1}); 55 | } 56 | 57 | &.quarter { 58 | width: calc(100% - #{$gutter * 1}); 59 | } 60 | } 61 | } 62 | } 63 | } 64 | 65 | label { 66 | color: _palette(fg-bold); 67 | display: block; 68 | font-family: _font(family-heading); 69 | font-size: 0.8em; 70 | font-weight: _font(weight-heading-bold); 71 | letter-spacing: _font(kern-heading); 72 | margin: 0 0 (_size(element-margin) * 0.35) 0; 73 | text-transform: uppercase; 74 | } 75 | 76 | input[type="text"], 77 | input[type="password"], 78 | input[type="email"], 79 | input[type="tel"], 80 | select, 81 | textarea { 82 | @include vendor("appearance", "none"); 83 | background: _palette(border-bg); 84 | border-radius: _size(border-radius); 85 | border: none; 86 | border: solid 2px _palette(border); 87 | color: inherit; 88 | display: block; 89 | outline: 0; 90 | padding: 0 1em; 91 | text-decoration: none; 92 | width: 100%; 93 | 94 | &:invalid { 95 | box-shadow: none; 96 | } 97 | 98 | &:focus { 99 | border-color: desaturate(lighten(_palette(accent), 6), 3); 100 | } 101 | } 102 | 103 | select { 104 | background-image: svg-url( 105 | "" 106 | ); 107 | background-size: 1.25rem; 108 | background-repeat: no-repeat; 109 | background-position: calc(100% - 1rem) center; 110 | height: _size(element-height); 111 | padding-right: _size(element-height); 112 | text-overflow: ellipsis; 113 | 114 | option { 115 | color: _palette(fg-bold); 116 | background: _palette(bg); 117 | } 118 | 119 | &:focus { 120 | &::-ms-value { 121 | background-color: transparent; 122 | } 123 | } 124 | 125 | &::-ms-expand { 126 | display: none; 127 | } 128 | } 129 | 130 | input[type="text"], 131 | input[type="password"], 132 | input[type="email"], 133 | select { 134 | height: _size(element-height); 135 | } 136 | 137 | textarea { 138 | padding: 0.75em 1em; 139 | } 140 | 141 | input[type="checkbox"], 142 | input[type="radio"] { 143 | @include vendor("appearance", "none"); 144 | display: block; 145 | float: left; 146 | margin-right: -2em; 147 | opacity: 0; 148 | width: 1em; 149 | z-index: -1; 150 | 151 | & + label { 152 | @include icon(false, solid); 153 | color: _palette(fg); 154 | cursor: pointer; 155 | display: inline-block; 156 | font-size: 1em; 157 | font-family: _font(family); 158 | text-transform: none; 159 | letter-spacing: 0; 160 | font-weight: _font(weight); 161 | padding-left: (_size(element-height) * 0.6) + 0.75em; 162 | padding-right: 0.75em; 163 | position: relative; 164 | 165 | &:before { 166 | background: _palette(border-bg); 167 | border-radius: _size(border-radius); 168 | border: solid 2px _palette(border); 169 | content: ""; 170 | display: inline-block; 171 | font-size: 0.8em; 172 | height: (_size(element-height) * 0.75); 173 | left: 0; 174 | line-height: (_size(element-height) * 0.75); 175 | position: absolute; 176 | text-align: center; 177 | top: 0; 178 | width: (_size(element-height) * 0.75); 179 | } 180 | } 181 | 182 | &:checked + label { 183 | &:before { 184 | background: _palette(fg-bold); 185 | border-color: _palette(fg-bold); 186 | content: "\f00c"; 187 | color: _palette(bg); 188 | } 189 | } 190 | 191 | &:focus + label { 192 | &:before { 193 | border-color: _palette(accent); 194 | } 195 | } 196 | } 197 | 198 | input[type="checkbox"] { 199 | & + label { 200 | &:before { 201 | border-radius: _size(border-radius); 202 | } 203 | } 204 | } 205 | 206 | input[type="radio"] { 207 | & + label { 208 | &:before { 209 | border-radius: 100%; 210 | } 211 | } 212 | } 213 | 214 | ::-webkit-input-placeholder { 215 | color: _palette(fg-light) !important; 216 | opacity: 1; 217 | } 218 | 219 | :-moz-placeholder { 220 | color: _palette(fg-light) !important; 221 | opacity: 1; 222 | } 223 | 224 | ::-moz-placeholder { 225 | color: _palette(fg-light) !important; 226 | opacity: 1; 227 | } 228 | 229 | :-ms-input-placeholder { 230 | color: _palette(fg-light) !important; 231 | opacity: 1; 232 | } 233 | -------------------------------------------------------------------------------- /docs/assets/sass/components/_icon.scss: -------------------------------------------------------------------------------- 1 | /* Icon */ 2 | 3 | .icon { 4 | @include icon; 5 | border-bottom: none; 6 | position: relative; 7 | 8 | > .label { 9 | display: none; 10 | } 11 | 12 | &:before { 13 | line-height: inherit; 14 | } 15 | 16 | &.solid { 17 | &:before { 18 | font-weight: 900; 19 | } 20 | } 21 | 22 | &.brands { 23 | &:before { 24 | font-family: "Font Awesome 5 Brands"; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /docs/assets/sass/components/_icons.scss: -------------------------------------------------------------------------------- 1 | /* Icons */ 2 | 3 | ul.icons { 4 | cursor: default; 5 | list-style: none; 6 | padding-left: 0; 7 | 8 | li { 9 | display: inline-block; 10 | padding: 0 1em 0 0; 11 | 12 | &:last-child { 13 | padding-right: 0; 14 | } 15 | 16 | .icon { 17 | &:before { 18 | font-size: 1.25em; 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /docs/assets/sass/components/_image.scss: -------------------------------------------------------------------------------- 1 | /* Image */ 2 | 3 | .image { 4 | border-radius: _size(border-radius); 5 | border: 0; 6 | display: inline-block; 7 | position: relative; 8 | 9 | img { 10 | border-radius: _size(border-radius); 11 | display: block; 12 | } 13 | 14 | &.left, 15 | &.right { 16 | max-width: 40%; 17 | 18 | img { 19 | width: 100%; 20 | } 21 | } 22 | 23 | &.left { 24 | float: left; 25 | padding: 0 1.5em 1em 0; 26 | top: 0.25em; 27 | } 28 | 29 | &.right { 30 | float: right; 31 | padding: 0 0 1em 1.5em; 32 | top: 0.25em; 33 | } 34 | 35 | &.fit { 36 | display: block; 37 | margin: 0 0 _size(element-margin) 0; 38 | width: 100%; 39 | 40 | img { 41 | width: 100%; 42 | } 43 | } 44 | 45 | &.main { 46 | display: block; 47 | margin: 0 0 (_size(element-margin) * 1.5) 0; 48 | width: 100%; 49 | 50 | img { 51 | width: 100%; 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /docs/assets/sass/components/_list.scss: -------------------------------------------------------------------------------- 1 | /* List */ 2 | 3 | ol { 4 | list-style: decimal; 5 | margin: 0 0 _size(element-margin) 0; 6 | padding-left: 1.25em; 7 | 8 | li { 9 | padding-left: 0.25em; 10 | } 11 | } 12 | 13 | ul { 14 | list-style: disc; 15 | margin: 0 0 _size(element-margin) 0; 16 | padding-left: 1em; 17 | 18 | li { 19 | padding-left: 0.5em; 20 | } 21 | 22 | &.alt { 23 | list-style: none; 24 | padding-left: 0; 25 | 26 | li { 27 | border-top: solid 1px _palette(border); 28 | padding: 0.5em 0; 29 | 30 | &:first-child { 31 | border-top: 0; 32 | padding-top: 0; 33 | } 34 | } 35 | } 36 | } 37 | 38 | dl { 39 | margin: 0 0 _size(element-margin) 0; 40 | 41 | dt { 42 | display: block; 43 | font-weight: _font(weight-bold); 44 | margin: 0 0 (_size(element-margin) * 0.5) 0; 45 | } 46 | 47 | dd { 48 | margin-left: _size(element-margin); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /docs/assets/sass/components/_pagination.scss: -------------------------------------------------------------------------------- 1 | /* Pagination */ 2 | 3 | ul.pagination { 4 | cursor: default; 5 | list-style: none; 6 | padding-left: 0; 7 | 8 | li { 9 | display: inline-block; 10 | padding-left: 0; 11 | vertical-align: middle; 12 | 13 | > .page { 14 | @include vendor( 15 | "transition", 16 | ( 17 | "background-color #{_duration(transition)} ease-in-out", 18 | "color #{_duration(transition)} ease-in-out" 19 | ) 20 | ); 21 | border-bottom: 0; 22 | border-radius: _size(border-radius); 23 | display: inline-block; 24 | height: 1.5em; 25 | line-height: 1.5em; 26 | margin: 0 0.125em; 27 | min-width: 1.5em; 28 | padding: 0 0.5em; 29 | text-align: center; 30 | 31 | &:hover { 32 | background-color: _palette(border-bg); 33 | } 34 | 35 | &.active { 36 | background-color: _palette(accent); 37 | } 38 | } 39 | 40 | &:first-child { 41 | padding-right: 0.75em; 42 | } 43 | 44 | &:last-child { 45 | padding-left: 0.75em; 46 | } 47 | } 48 | 49 | @include breakpoint("<=xsmall") { 50 | li { 51 | &:nth-child(n + 2):nth-last-child(n + 2) { 52 | display: none; 53 | } 54 | 55 | .button { 56 | width: 100%; 57 | } 58 | 59 | &:first-child { 60 | width: calc(50% - 2px); 61 | text-align: left; 62 | padding-right: 0.325em; 63 | } 64 | 65 | &:last-child { 66 | width: calc(50% - 2px); 67 | text-align: right; 68 | padding-left: 0.325em; 69 | } 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /docs/assets/sass/components/_row.scss: -------------------------------------------------------------------------------- 1 | /* Row */ 2 | 3 | .row { 4 | @include html-grid(1.75em); 5 | 6 | @include breakpoint("<=xlarge") { 7 | @include html-grid(1.75em, xlarge); 8 | } 9 | 10 | @include breakpoint("<=large") { 11 | @include html-grid(1.75em, large); 12 | } 13 | 14 | @include breakpoint("<=medium") { 15 | @include html-grid(1.75em, medium); 16 | } 17 | 18 | @include breakpoint("<=small") { 19 | @include html-grid(1.25em, small); 20 | } 21 | 22 | @include breakpoint("<=xsmall") { 23 | @include html-grid(1.25em, xsmall); 24 | } 25 | 26 | @include breakpoint("<=xxsmall") { 27 | @include html-grid(1.25em, xxsmall); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /docs/assets/sass/components/_section.scss: -------------------------------------------------------------------------------- 1 | /* Section/Article */ 2 | 3 | section, 4 | article { 5 | &.special { 6 | text-align: center; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /docs/assets/sass/components/_table.scss: -------------------------------------------------------------------------------- 1 | /* Table */ 2 | 3 | .table-wrapper { 4 | -webkit-overflow-scrolling: touch; 5 | overflow-x: auto; 6 | } 7 | 8 | table { 9 | margin: 0 0 _size(element-margin) 0; 10 | width: 100%; 11 | 12 | tbody { 13 | tr { 14 | border: solid 1px _palette(border); 15 | border-left: 0; 16 | border-right: 0; 17 | 18 | &:nth-child(2n + 1) { 19 | background-color: _palette(border-bg); 20 | } 21 | } 22 | } 23 | 24 | td { 25 | padding: 0.75em 0.75em; 26 | } 27 | 28 | th { 29 | color: _palette(fg-bold); 30 | font-size: 0.9em; 31 | font-weight: _font(weight-bold); 32 | padding: 0 0.75em 0.75em 0.75em; 33 | text-align: left; 34 | } 35 | 36 | thead { 37 | border-bottom: solid 2px _palette(border); 38 | } 39 | 40 | tfoot { 41 | border-top: solid 2px _palette(border); 42 | } 43 | 44 | &.alt { 45 | border-collapse: separate; 46 | 47 | tbody { 48 | tr { 49 | td { 50 | border: solid 1px _palette(border); 51 | border-left-width: 0; 52 | border-top-width: 0; 53 | 54 | &:first-child { 55 | border-left-width: 1px; 56 | } 57 | } 58 | 59 | &:first-child { 60 | td { 61 | border-top-width: 1px; 62 | } 63 | } 64 | } 65 | } 66 | 67 | thead { 68 | border-bottom: 0; 69 | } 70 | 71 | tfoot { 72 | border-top: 0; 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /docs/assets/sass/layout/_banner.scss: -------------------------------------------------------------------------------- 1 | /* Banner */ 2 | 3 | #banner { 4 | @include padding(10em, 0, (0, 0, _size(wrapper-edges, large) * -0.5, 0)); 5 | 6 | .inner { 7 | margin: 0 auto; 8 | width: _size(inner); 9 | } 10 | 11 | .logo { 12 | @include vendor("transition", ("opacity 2s ease", "transform 1s ease")); 13 | @include vendor("transform", "translateY(0)"); 14 | opacity: 1; 15 | margin: 0 0 (_size(element-margin) * 0.65) 0; 16 | 17 | .icon { 18 | border-radius: 100%; 19 | border: solid 2px _palette(border); 20 | cursor: default; 21 | display: inline-block; 22 | font-size: 2em; 23 | height: 2.25em; 24 | line-height: 2.25em; 25 | text-align: center; 26 | width: 2.25em; 27 | } 28 | } 29 | 30 | h2 { 31 | @include vendor( 32 | "transition", 33 | ("opacity 0.5s ease", "transform 0.5s ease", "filter 0.25s ease") 34 | ); 35 | @include vendor("transform", "translateX(0)"); 36 | @include vendor("transition-delay", "0.65s"); 37 | @include vendor("filter", "blur(0)"); 38 | opacity: 1; 39 | border-bottom: solid 2px _palette(border); 40 | font-size: 2.25em; 41 | margin-bottom: _size(element-margin) * 0.4; 42 | padding-bottom: _size(element-margin) * 0.2; 43 | } 44 | 45 | p { 46 | @include vendor( 47 | "transition", 48 | ("opacity 0.5s ease", "transform 0.5s ease", "filter 0.25s ease") 49 | ); 50 | @include vendor("transform", "translateX(0)"); 51 | @include vendor("transition-delay", "0.8s"); 52 | @include vendor("filter", "blur(0)"); 53 | opacity: 1; 54 | font-family: _font(family-heading); 55 | font-size: 1em; 56 | font-weight: _font(weight-heading); 57 | letter-spacing: _font(kern-heading); 58 | line-height: 2; 59 | text-transform: uppercase; 60 | } 61 | 62 | @include breakpoint("<=large") { 63 | @include padding(7em, 0, (0, 0, _size(wrapper-edges, large) * 0.5, 0)); 64 | 65 | @include dynamic-background-image; 66 | background-color: _palette(bg); 67 | 68 | background-size: auto, cover; 69 | 70 | background-position: center, center; 71 | 72 | margin-bottom: (_size(wrapper-edges, large) * -1); 73 | } 74 | 75 | @include breakpoint("<=medium") { 76 | @include padding(12em, 3em, (0, 0, _size(wrapper-edges, medium) * 0.5, 0)); 77 | 78 | margin-bottom: (_size(wrapper-edges, medium) * -1); 79 | 80 | .inner { 81 | width: 100%; 82 | } 83 | } 84 | 85 | @include breakpoint("<=small") { 86 | @include padding(5em, 2em, (0, 0, _size(wrapper-edges, small) * 0.5, 0)); 87 | 88 | margin-bottom: (_size(wrapper-edges, small) * -1); 89 | 90 | .logo { 91 | margin: 0 0 (_size(element-margin) * 0.5) 0; 92 | 93 | .icon { 94 | font-size: 1.5em; 95 | } 96 | } 97 | 98 | h2 { 99 | font-size: 1.5em; 100 | } 101 | 102 | p { 103 | font-size: 0.8em; 104 | } 105 | } 106 | 107 | body.is-preload & { 108 | .logo { 109 | @include vendor("transform", "translateY(0.5em)"); 110 | opacity: 0; 111 | } 112 | 113 | h2 { 114 | opacity: 0; 115 | @include vendor("transform", "translateX(0.25em)"); 116 | @include vendor("filter", "blur(2px)"); 117 | } 118 | 119 | p { 120 | opacity: 0; 121 | @include vendor("transform", "translateX(0.5em)"); 122 | @include vendor("filter", "blur(2px)"); 123 | } 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /docs/assets/sass/layout/_footer.scss: -------------------------------------------------------------------------------- 1 | /* Footer */ 2 | 3 | #footer { 4 | .inner { 5 | @include padding(5em, 0); 6 | @include vendor("display", "flex"); 7 | @include vendor("flex-direction", "row"); 8 | @include vendor("flex-wrap", "wrap"); 9 | margin: 0 auto; 10 | width: _size(inner); 11 | 12 | > * { 13 | width: 100%; 14 | } 15 | 16 | form { 17 | margin: 0 _size(section-spacing, large) 0 0; 18 | width: calc(50% - #{_size(section-spacing, large) * 0.5}); 19 | } 20 | 21 | .contact { 22 | width: calc(50% - #{_size(section-spacing, large) * 0.5}); 23 | } 24 | 25 | .copyright { 26 | border-top: solid 2px _palette(border); 27 | list-style: none; 28 | margin: (_size(element-margin) * 2) 0 _size(element-margin) 0; 29 | padding: _size(element-margin) 0 0 0; 30 | width: 100%; 31 | 32 | li { 33 | border-left: solid 2px _palette(border); 34 | color: _palette(fg-light); 35 | display: inline-block; 36 | font-size: 0.9em; 37 | line-height: 1; 38 | margin-left: 1em; 39 | padding: 0; 40 | padding-left: 1em; 41 | 42 | &:first-child { 43 | border-left: 0; 44 | margin-left: 0; 45 | padding-left: 0; 46 | } 47 | 48 | a { 49 | color: inherit; 50 | } 51 | } 52 | } 53 | } 54 | 55 | @include breakpoint("<=large") { 56 | @include dynamic-background-image; 57 | background-color: _palette(bg); 58 | 59 | background-size: auto, cover; 60 | 61 | background-position: center, center; 62 | 63 | margin-top: (_size(wrapper-edges, large) * -1); 64 | padding-top: _size(wrapper-edges, large); 65 | } 66 | 67 | @include breakpoint("<=medium") { 68 | margin-top: (_size(wrapper-edges, medium) * -1); 69 | padding-top: _size(wrapper-edges, medium); 70 | 71 | .inner { 72 | @include padding(3em, 3em); 73 | display: block; 74 | width: 100%; 75 | 76 | form { 77 | width: 100%; 78 | margin: 0 0 (_size(element-margin) * 2) 0; 79 | } 80 | 81 | .contact { 82 | width: 100%; 83 | margin: 0 0 (_size(element-margin) * 2) 0; 84 | } 85 | 86 | .copyright { 87 | margin: (_size(element-margin) * 2) 0 _size(element-margin) 0; 88 | } 89 | } 90 | } 91 | 92 | @include breakpoint("<=small") { 93 | margin-top: (_size(wrapper-edges, small) * -1); 94 | padding-top: _size(wrapper-edges, small); 95 | 96 | .inner { 97 | @include padding(2em, 2em); 98 | 99 | form { 100 | margin: 0 0 (_size(element-margin) * 1.5) 0; 101 | } 102 | 103 | .contact { 104 | margin: 0 0 (_size(element-margin) * 1.5) 0; 105 | } 106 | } 107 | } 108 | 109 | @include breakpoint("<=xsmall") { 110 | .inner { 111 | .copyright { 112 | li { 113 | border-left: 0; 114 | display: block; 115 | margin: 1em 0 0 0; 116 | padding-left: 0; 117 | 118 | &:first-child { 119 | margin-top: 0; 120 | } 121 | } 122 | } 123 | } 124 | } 125 | 126 | @include breakpoint("<=xxsmall") { 127 | .inner { 128 | @include padding(2em, 1.5em); 129 | } 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /docs/assets/sass/layout/_header.scss: -------------------------------------------------------------------------------- 1 | /* Header */ 2 | 3 | #header { 4 | @include vendor( 5 | "transition", 6 | "background-color #{_duration(transition)} ease-in-out" 7 | ); 8 | background-color: transparentize( 9 | desaturate(lighten(_palette(bg), 3), 1.5), 10 | 0.05 11 | ); 12 | height: 3.5em; 13 | left: 0; 14 | line-height: 3.5em; 15 | padding: 0 1.25em; 16 | position: fixed; 17 | top: 0; 18 | width: 100%; 19 | z-index: _misc(z-index-base); 20 | 21 | h1 { 22 | @include vendor( 23 | "transition", 24 | ( 25 | "opacity #{_duration(transition)} ease-in-out", 26 | "visibility #{_duration(transition)}" 27 | ) 28 | ); 29 | border-bottom: 0; 30 | font-size: 0.8em; 31 | margin-bottom: 0; 32 | opacity: 1; 33 | visibility: visible; 34 | 35 | a { 36 | border: 0; 37 | } 38 | } 39 | 40 | nav { 41 | font-family: _font(family-heading); 42 | font-size: 0.8em; 43 | font-weight: _font(weight-heading-bold); 44 | height: 3em; 45 | letter-spacing: _font(kern-heading); 46 | line-height: 3em; 47 | position: absolute; 48 | right: 0.7em; 49 | text-transform: uppercase; 50 | top: 0.7em; 51 | 52 | a { 53 | border: 0; 54 | display: inline-block; 55 | padding: 0 1em; 56 | 57 | &:before { 58 | float: right; 59 | margin-left: 0.75em; 60 | } 61 | 62 | &[href="#menu"] { 63 | @include icon(false, solid); 64 | @include vendor( 65 | "transition", 66 | "background-color #{_duration(transition)} ease-in-out" 67 | ); 68 | border-radius: _size(border-radius); 69 | box-shadow: inset 0 0 0 2px _palette(border); 70 | padding: 0 1.35em; 71 | 72 | &:before { 73 | content: "\f0c9"; 74 | line-height: inherit; 75 | } 76 | 77 | &:hover { 78 | background-color: _palette(border-bg); 79 | } 80 | 81 | &:active { 82 | background-color: _palette(border2-bg); 83 | } 84 | } 85 | } 86 | } 87 | 88 | &.alt { 89 | background-color: transparent; 90 | 91 | h1 { 92 | opacity: 0; 93 | visibility: hidden; 94 | } 95 | } 96 | 97 | @include breakpoint("<=small") { 98 | height: 2.75em; 99 | line-height: 2.75em; 100 | 101 | nav { 102 | top: 0; 103 | right: 0; 104 | height: inherit; 105 | line-height: inherit; 106 | 107 | a { 108 | height: inherit; 109 | line-height: inherit; 110 | 111 | &[href="#menu"] { 112 | box-shadow: none; 113 | padding: 0 1em; 114 | border-radius: 0; 115 | 116 | &:hover, 117 | &:active { 118 | background-color: inherit; 119 | } 120 | } 121 | } 122 | } 123 | } 124 | 125 | @include breakpoint("<=xsmall") { 126 | nav { 127 | a { 128 | &[href="#menu"] { 129 | width: 4em; 130 | white-space: nowrap; 131 | text-indent: 4em; 132 | position: relative; 133 | 134 | &:before { 135 | width: inherit; 136 | position: absolute; 137 | top: 0; 138 | left: 0; 139 | text-indent: 0; 140 | text-align: right; 141 | margin-left: 0; 142 | padding-right: 1.25em; 143 | } 144 | } 145 | } 146 | } 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /docs/assets/sass/layout/_menu.scss: -------------------------------------------------------------------------------- 1 | /* Menu */ 2 | 3 | #page-wrapper { 4 | @include vendor("transition", "filter 0.25s ease"); 5 | } 6 | 7 | #menu { 8 | @include vendor("align-items", "center"); 9 | @include vendor("display", "flex"); 10 | @include vendor("justify-content", "center"); 11 | @include vendor("pointer-events", "none"); 12 | @include vendor( 13 | "transition", 14 | ("opacity #{_duration(menu)} ease", "visibility #{_duration(menu)}") 15 | ); 16 | -moz-user-select: none; 17 | -webkit-user-select: none; 18 | -ms-user-select: none; 19 | user-select: none; 20 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 21 | background: transparentize(_palette(bg), $bg-transparent); 22 | cursor: default; 23 | height: 100%; 24 | left: 0; 25 | opacity: 0; 26 | position: fixed; 27 | text-align: center; 28 | top: 0; 29 | visibility: hidden; 30 | width: 100%; 31 | 32 | .inner { 33 | @include padding(2.5em, 1.5em); 34 | @include vendor("transform", "translateY(0.5em)"); 35 | @include vendor( 36 | "transition", 37 | ("opacity #{_duration(menu)} ease", "transform #{_duration(menu)} ease") 38 | ); 39 | -webkit-overflow-scrolling: touch; 40 | background: _palette(accent); 41 | border-radius: _size(border-radius); 42 | display: block; 43 | max-width: 100%; 44 | opacity: 0; 45 | position: relative; 46 | width: 18em; 47 | } 48 | 49 | h2 { 50 | border-bottom: solid 2px _palette(border); 51 | padding-bottom: 1em; 52 | } 53 | 54 | .close { 55 | background-image: url("images/close.svg"); 56 | background-position: 75% 25%; 57 | background-repeat: no-repeat; 58 | background-size: 2em 2em; 59 | border: 0; 60 | content: ""; 61 | display: block; 62 | height: 4em; 63 | overflow: hidden; 64 | position: absolute; 65 | right: 0; 66 | text-align: center; 67 | text-indent: 4em; 68 | top: 0; 69 | width: 4em; 70 | } 71 | 72 | .links { 73 | list-style: none; 74 | margin-bottom: (_size(element-margin) - 0.5em); 75 | padding: 0; 76 | 77 | li { 78 | padding: 0; 79 | 80 | a { 81 | border-radius: _size(border-radius); 82 | border: 0; 83 | display: block; 84 | font-family: _font(family-heading); 85 | font-size: 0.8em; 86 | font-weight: _font(weight-heading); 87 | letter-spacing: _font(kern-heading); 88 | line-height: 1.85em; 89 | padding: 0.75em 0; 90 | text-transform: uppercase; 91 | 92 | &:hover { 93 | background: saturate(darken(_palette(accent), 3), 1.5); 94 | } 95 | } 96 | } 97 | } 98 | 99 | @include breakpoint("<=small") { 100 | .inner { 101 | max-height: 100%; 102 | overflow-y: auto; 103 | overflow-x: hidden; 104 | 105 | .close { 106 | background-size: 1.5em 1.5em; 107 | } 108 | } 109 | } 110 | } 111 | 112 | body.is-menu-visible { 113 | #page-wrapper { 114 | @include vendor("filter", "blur(1.5px)"); 115 | } 116 | 117 | #menu { 118 | @include vendor("pointer-events", "auto"); 119 | opacity: 1; 120 | visibility: visible; 121 | 122 | .inner { 123 | @include vendor("transform", "translateY(0)"); 124 | opacity: 1; 125 | } 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /docs/assets/sass/layout/_wrapper.scss: -------------------------------------------------------------------------------- 1 | /* Wrapper */ 2 | 3 | /// Sets the colors of the wrapper's top/bottom edges. 4 | /// @param {string} $color Color. 5 | @mixin wrapper-edges-color($color: black) { 6 | &:before, 7 | &:after { 8 | background-image: svg-url( 9 | '' 10 | ); 11 | } 12 | 13 | &:before { 14 | box-shadow: inset 0 -1px 0 0 $color, 0 1px 0 0 $color; 15 | } 16 | 17 | &:after { 18 | box-shadow: inset 0 -1px 0 0 $color, 0 1px 0 0 $color; 19 | } 20 | } 21 | 22 | #wrapper { 23 | > header { 24 | @include padding( 25 | 7.5em, 26 | 0, 27 | (3.5em, 0, _size(wrapper-edges, large) * -0.5, 0) 28 | ); 29 | 30 | .inner { 31 | margin: 0 auto; 32 | width: _size(inner); 33 | } 34 | 35 | h2 { 36 | border-bottom: solid 2px _palette(border); 37 | font-size: 2em; 38 | margin-bottom: _size(element-margin) * 0.4; 39 | padding-bottom: _size(element-margin) * 0.2; 40 | } 41 | 42 | p { 43 | font-family: _font(family-heading); 44 | font-size: 1em; 45 | font-weight: _font(weight-heading); 46 | letter-spacing: _font(kern-heading); 47 | line-height: 2; 48 | text-transform: uppercase; 49 | } 50 | } 51 | 52 | @include breakpoint("<=large") { 53 | > header { 54 | @include padding(5em, 0, (4em, 0, _size(wrapper-edges, large) * 0.5, 0)); 55 | 56 | @include dynamic-background-image; 57 | background-color: _palette(bg); 58 | 59 | background-size: auto, cover; 60 | 61 | background-position: center, 0% 30%; 62 | 63 | margin-bottom: (_size(wrapper-edges, large) * -1); 64 | } 65 | } 66 | 67 | @include breakpoint("<=medium") { 68 | > header { 69 | @include padding( 70 | 7em, 71 | 3em, 72 | (4em, 0, _size(wrapper-edges, medium) * 0.5, 0) 73 | ); 74 | 75 | background-size: auto, cover; 76 | 77 | background-position: center, 0% 0%; 78 | 79 | margin-bottom: (_size(wrapper-edges, medium) * -1); 80 | 81 | .inner { 82 | width: 100%; 83 | } 84 | } 85 | } 86 | 87 | @include breakpoint("<=small") { 88 | > header { 89 | @include padding( 90 | 3.75em, 91 | 2em, 92 | (2.75em, 0, _size(wrapper-edges, small) * 0.5, 0) 93 | ); 94 | 95 | background-size: auto, 125%; 96 | 97 | margin-bottom: (_size(wrapper-edges, small) * -1); 98 | 99 | h2 { 100 | font-size: 1.25em; 101 | } 102 | 103 | p { 104 | font-size: 0.8em; 105 | } 106 | } 107 | } 108 | } 109 | 110 | .wrapper { 111 | background-color: _palette(bg); 112 | margin: _size(wrapper-edges, large) 0; 113 | position: relative; 114 | @include wrapper-edges-color(_palette(bg)); 115 | 116 | &:before, 117 | &:after { 118 | background-repeat: no-repeat; 119 | background-size: 100% 100%; 120 | content: ""; 121 | display: block; 122 | height: _size(wrapper-edges, large); 123 | position: absolute; 124 | width: 100%; 125 | } 126 | 127 | &:before { 128 | left: 0; 129 | top: (_size(wrapper-edges, large) * -1); 130 | } 131 | 132 | &:after { 133 | @include vendor("transform", "scaleY(-1)"); 134 | bottom: (_size(wrapper-edges, large) * -1); 135 | left: 0; 136 | } 137 | 138 | &.alt { 139 | &:before { 140 | @include vendor("transform", "scaleX(-1)"); 141 | } 142 | 143 | &:after { 144 | @include vendor("transform", "scaleY(-1) scaleX(-1)"); 145 | } 146 | } 147 | 148 | .inner { 149 | @include padding(3em, 0); 150 | margin: 0 auto; 151 | width: _size(inner); 152 | } 153 | 154 | @for $i from 2 through _misc(max-wrapper-styles) { 155 | $j: 3 * ($i - 1); 156 | $color: desaturate(lighten(_palette(bg), $j), $j * 0.5); 157 | 158 | &.style#{$i} { 159 | background-color: $color; 160 | @include wrapper-edges-color($color); 161 | } 162 | } 163 | 164 | &.spotlight { 165 | @include wrapper-edges-color(_palette(accent)); 166 | background-color: _palette(accent); 167 | 168 | .inner { 169 | @include vendor("display", "flex"); 170 | @include vendor("align-items", "center"); 171 | @include vendor("flex-direction", "row"); 172 | } 173 | 174 | .image { 175 | border-radius: 100%; 176 | margin: 0 _size(section-spacing, large) _size(element-margin) 0; 177 | width: 22em; 178 | overflow: hidden; 179 | -ms-flex: 1; 180 | 181 | img { 182 | border-radius: 100%; 183 | width: 100%; 184 | } 185 | } 186 | 187 | .content { 188 | width: 100%; 189 | -ms-flex: 2; 190 | } 191 | 192 | &:nth-child(2n - 1) { 193 | .inner { 194 | @include vendor("flex-direction", "row-reverse"); 195 | text-align: right; 196 | } 197 | 198 | .image { 199 | margin: 0 0 _size(element-margin) _size(section-spacing, large); 200 | } 201 | } 202 | 203 | @for $i from 2 through _misc(max-wrapper-styles) { 204 | $j: 3 * ($i - 1); 205 | $color: saturate(darken(_palette(accent), $j), $j * 0.5); 206 | 207 | &.style#{$i} { 208 | background-color: $color; 209 | @include wrapper-edges-color($color); 210 | } 211 | } 212 | } 213 | 214 | @include breakpoint("<=medium") { 215 | margin: _size(wrapper-edges, medium) 0; 216 | 217 | &:before, 218 | &:after { 219 | height: _size(wrapper-edges, medium); 220 | } 221 | 222 | &:before { 223 | top: (_size(wrapper-edges, medium) * -1); 224 | } 225 | 226 | &:after { 227 | bottom: (_size(wrapper-edges, medium) * -1); 228 | left: 0; 229 | } 230 | 231 | .inner { 232 | @include padding(3em, 3em); 233 | width: 100%; 234 | } 235 | 236 | &.spotlight { 237 | .image { 238 | margin: 0 _size(section-spacing, medium) _size(element-margin) 0; 239 | width: 32em; 240 | } 241 | 242 | &:nth-child(2n - 1) { 243 | .image { 244 | margin: 0 0 _size(element-margin) _size(section-spacing, medium); 245 | } 246 | } 247 | } 248 | } 249 | 250 | @include breakpoint("<=small") { 251 | margin: _size(wrapper-edges, small) 0; 252 | 253 | &:before, 254 | &:after { 255 | height: _size(wrapper-edges, small); 256 | } 257 | 258 | &:before { 259 | top: (_size(wrapper-edges, small) * -1); 260 | } 261 | 262 | &:after { 263 | bottom: (_size(wrapper-edges, small) * -1); 264 | left: 0; 265 | } 266 | 267 | .inner { 268 | @include padding(2em, 2em); 269 | } 270 | 271 | &.spotlight { 272 | .inner { 273 | @include vendor("align-items", "flex-start"); 274 | } 275 | 276 | .image { 277 | width: 19em; 278 | margin: 0 _size(section-spacing, small) _size(element-margin) 0; 279 | } 280 | 281 | &:nth-child(2n - 1) { 282 | .image { 283 | margin: 0 0 _size(element-margin) _size(section-spacing, small); 284 | } 285 | } 286 | } 287 | } 288 | 289 | @include breakpoint("<=xsmall") { 290 | &.spotlight { 291 | .inner { 292 | display: block; 293 | } 294 | 295 | .image { 296 | margin: 0 0 (_size(element-margin) * 0.5) 0 !important; 297 | max-width: 85%; 298 | width: 12em; 299 | } 300 | } 301 | } 302 | 303 | @include breakpoint("<=xxsmall") { 304 | .inner { 305 | @include padding(2em, 1.5em); 306 | } 307 | } 308 | } 309 | -------------------------------------------------------------------------------- /docs/assets/sass/libs/_breakpoints.scss: -------------------------------------------------------------------------------- 1 | // breakpoints.scss v1.0 | @ajlkn | MIT licensed */ 2 | 3 | // Vars. 4 | 5 | /// Breakpoints. 6 | /// @var {list} 7 | $breakpoints: () !global; 8 | 9 | // Mixins. 10 | 11 | /// Sets breakpoints. 12 | /// @param {map} $x Breakpoints. 13 | @mixin breakpoints($x: ()) { 14 | $breakpoints: $x !global; 15 | } 16 | 17 | /// Wraps @content in a @media block targeting a specific orientation. 18 | /// @param {string} $orientation Orientation. 19 | @mixin orientation($orientation) { 20 | @media screen and (orientation: #{$orientation}) { 21 | @content; 22 | } 23 | } 24 | 25 | /// Wraps @content in a @media block using a given query. 26 | /// @param {string} $query Query. 27 | @mixin breakpoint($query: null) { 28 | $breakpoint: null; 29 | $op: null; 30 | $media: null; 31 | 32 | // Determine operator, breakpoint. 33 | 34 | // Greater than or equal. 35 | @if (str-slice($query, 0, 2) == ">=") { 36 | $op: "gte"; 37 | $breakpoint: str-slice($query, 3); 38 | } 39 | 40 | // Less than or equal. 41 | @elseif (str-slice($query, 0, 2) == '<=') { 42 | $op: "lte"; 43 | $breakpoint: str-slice($query, 3); 44 | } 45 | 46 | // Greater than. 47 | @elseif (str-slice($query, 0, 1) == '>') { 48 | $op: "gt"; 49 | $breakpoint: str-slice($query, 2); 50 | } 51 | 52 | // Less than. 53 | @elseif (str-slice($query, 0, 1) == '<') { 54 | $op: "lt"; 55 | $breakpoint: str-slice($query, 2); 56 | } 57 | 58 | // Not. 59 | @elseif (str-slice($query, 0, 1) == '!') { 60 | $op: "not"; 61 | $breakpoint: str-slice($query, 2); 62 | } 63 | 64 | // Equal. 65 | @else { 66 | $op: "eq"; 67 | $breakpoint: $query; 68 | } 69 | 70 | // Build media. 71 | @if ($breakpoint and map-has-key($breakpoints, $breakpoint)) { 72 | $a: map-get($breakpoints, $breakpoint); 73 | 74 | // Range. 75 | @if (type-of($a) == "list") { 76 | $x: nth($a, 1); 77 | $y: nth($a, 2); 78 | 79 | // Max only. 80 | @if ($x == null) { 81 | // Greater than or equal (>= 0 / anything) 82 | @if ($op == "gte") { 83 | $media: "screen"; 84 | } 85 | 86 | // Less than or equal (<= y) 87 | @elseif ($op == 'lte') { 88 | $media: "screen and (max-width: " + $y + ")"; 89 | } 90 | 91 | // Greater than (> y) 92 | @elseif ($op == 'gt') { 93 | $media: "screen and (min-width: " + ($y + 1) + ")"; 94 | } 95 | 96 | // Less than (< 0 / invalid) 97 | @elseif ($op == 'lt') { 98 | $media: "screen and (max-width: -1px)"; 99 | } 100 | 101 | // Not (> y) 102 | @elseif ($op == 'not') { 103 | $media: "screen and (min-width: " + ($y + 1) + ")"; 104 | } 105 | 106 | // Equal (<= y) 107 | @else { 108 | $media: "screen and (max-width: " + $y + ")"; 109 | } 110 | } 111 | 112 | // Min only. 113 | @else if ($y == null) { 114 | // Greater than or equal (>= x) 115 | @if ($op == "gte") { 116 | $media: "screen and (min-width: " + $x + ")"; 117 | } 118 | 119 | // Less than or equal (<= inf / anything) 120 | @elseif ($op == 'lte') { 121 | $media: "screen"; 122 | } 123 | 124 | // Greater than (> inf / invalid) 125 | @elseif ($op == 'gt') { 126 | $media: "screen and (max-width: -1px)"; 127 | } 128 | 129 | // Less than (< x) 130 | @elseif ($op == 'lt') { 131 | $media: "screen and (max-width: " + ($x - 1) + ")"; 132 | } 133 | 134 | // Not (< x) 135 | @elseif ($op == 'not') { 136 | $media: "screen and (max-width: " + ($x - 1) + ")"; 137 | } 138 | 139 | // Equal (>= x) 140 | @else { 141 | $media: "screen and (min-width: " + $x + ")"; 142 | } 143 | } 144 | 145 | // Min and max. 146 | @else { 147 | // Greater than or equal (>= x) 148 | @if ($op == "gte") { 149 | $media: "screen and (min-width: " + $x + ")"; 150 | } 151 | 152 | // Less than or equal (<= y) 153 | @elseif ($op == 'lte') { 154 | $media: "screen and (max-width: " + $y + ")"; 155 | } 156 | 157 | // Greater than (> y) 158 | @elseif ($op == 'gt') { 159 | $media: "screen and (min-width: " + ($y + 1) + ")"; 160 | } 161 | 162 | // Less than (< x) 163 | @elseif ($op == 'lt') { 164 | $media: "screen and (max-width: " + ($x - 1) + ")"; 165 | } 166 | 167 | // Not (< x and > y) 168 | @elseif ($op == 'not') { 169 | $media: "screen and (max-width: " + ($x - 1) + 170 | "), screen and (min-width: " + ($y + 1) + ")"; 171 | } 172 | 173 | // Equal (>= x and <= y) 174 | @else { 175 | $media: "screen and (min-width: " + 176 | $x + 177 | ") and (max-width: " + 178 | $y + 179 | ")"; 180 | } 181 | } 182 | } 183 | 184 | // String. 185 | @else { 186 | // Missing a media type? Prefix with "screen". 187 | @if (str-slice($a, 0, 1) == "(") { 188 | $media: "screen and " + $a; 189 | } 190 | 191 | // Otherwise, use as-is. 192 | @else { 193 | $media: $a; 194 | } 195 | } 196 | } 197 | 198 | // Output. 199 | @media #{$media} { 200 | @content; 201 | } 202 | } 203 | -------------------------------------------------------------------------------- /docs/assets/sass/libs/_functions.scss: -------------------------------------------------------------------------------- 1 | /// Removes a specific item from a list. 2 | /// @author Hugo Giraudel 3 | /// @param {list} $list List. 4 | /// @param {integer} $index Index. 5 | /// @return {list} Updated list. 6 | @function remove-nth($list, $index) { 7 | $result: null; 8 | 9 | @if type-of($index) != number { 10 | @warn "$index: #{quote($index)} is not a number for `remove-nth`."; 11 | } @else if $index == 0 { 12 | @warn "List index 0 must be a non-zero integer for `remove-nth`."; 13 | } @else if abs($index) > length($list) { 14 | @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; 15 | } @else { 16 | $result: (); 17 | $index: if($index < 0, length($list) + $index + 1, $index); 18 | 19 | @for $i from 1 through length($list) { 20 | @if $i != $index { 21 | $result: append($result, nth($list, $i)); 22 | } 23 | } 24 | } 25 | 26 | @return $result; 27 | } 28 | 29 | /// Gets a value from a map. 30 | /// @author Hugo Giraudel 31 | /// @param {map} $map Map. 32 | /// @param {string} $keys Key(s). 33 | /// @return {string} Value. 34 | @function val($map, $keys...) { 35 | @if nth($keys, 1) == null { 36 | $keys: remove-nth($keys, 1); 37 | } 38 | 39 | @each $key in $keys { 40 | $map: map-get($map, $key); 41 | } 42 | 43 | @return $map; 44 | } 45 | 46 | /// Gets a duration value. 47 | /// @param {string} $keys Key(s). 48 | /// @return {string} Value. 49 | @function _duration($keys...) { 50 | @return val($duration, $keys...); 51 | } 52 | 53 | /// Gets a font value. 54 | /// @param {string} $keys Key(s). 55 | /// @return {string} Value. 56 | @function _font($keys...) { 57 | @return val($font, $keys...); 58 | } 59 | 60 | /// Gets a misc value. 61 | /// @param {string} $keys Key(s). 62 | /// @return {string} Value. 63 | @function _misc($keys...) { 64 | @return val($misc, $keys...); 65 | } 66 | 67 | /// Gets a palette value. 68 | /// @param {string} $keys Key(s). 69 | /// @return {string} Value. 70 | @function _palette($keys...) { 71 | @return val($palette, $keys...); 72 | } 73 | 74 | /// Gets a size value. 75 | /// @param {string} $keys Key(s). 76 | /// @return {string} Value. 77 | @function _size($keys...) { 78 | @return val($size, $keys...); 79 | } 80 | -------------------------------------------------------------------------------- /docs/assets/sass/libs/_html-grid.scss: -------------------------------------------------------------------------------- 1 | // html-grid.scss v1.0 | @ajlkn | MIT licensed */ 2 | 3 | // Mixins. 4 | 5 | /// Initializes the current element as an HTML grid. 6 | /// @param {mixed} $gutters Gutters (either a single number to set both column/row gutters, or a list to set them individually). 7 | /// @param {mixed} $suffix Column class suffix (optional; either a single suffix or a list). 8 | @mixin html-grid($gutters: 1.5em, $suffix: "") { 9 | // Initialize. 10 | $cols: 12; 11 | $multipliers: 0, 0.25, 0.5, 1, 1.5, 2; 12 | $unit: 100% / $cols; 13 | 14 | // Suffixes. 15 | $suffixes: null; 16 | 17 | @if (type-of($suffix) == "list") { 18 | $suffixes: $suffix; 19 | } @else { 20 | $suffixes: ($suffix); 21 | } 22 | 23 | // Gutters. 24 | $guttersCols: null; 25 | $guttersRows: null; 26 | 27 | @if (type-of($gutters) == "list") { 28 | $guttersCols: nth($gutters, 1); 29 | $guttersRows: nth($gutters, 2); 30 | } @else { 31 | $guttersCols: $gutters; 32 | $guttersRows: 0; 33 | } 34 | 35 | // Row. 36 | display: flex; 37 | flex-wrap: wrap; 38 | box-sizing: border-box; 39 | align-items: stretch; 40 | 41 | // Columns. 42 | > * { 43 | box-sizing: border-box; 44 | } 45 | 46 | // Gutters. 47 | &.gtr-uniform { 48 | > * { 49 | > :last-child { 50 | margin-bottom: 0; 51 | } 52 | } 53 | } 54 | 55 | // Alignment. 56 | &.aln-left { 57 | justify-content: flex-start; 58 | } 59 | 60 | &.aln-center { 61 | justify-content: center; 62 | } 63 | 64 | &.aln-right { 65 | justify-content: flex-end; 66 | } 67 | 68 | &.aln-top { 69 | align-items: flex-start; 70 | } 71 | 72 | &.aln-middle { 73 | align-items: center; 74 | } 75 | 76 | &.aln-bottom { 77 | align-items: flex-end; 78 | } 79 | 80 | // Step through suffixes. 81 | @each $suffix in $suffixes { 82 | // Suffix. 83 | @if ($suffix != "") { 84 | $suffix: "-" + $suffix; 85 | } @else { 86 | $suffix: ""; 87 | } 88 | 89 | // Row. 90 | 91 | // Important. 92 | > .imp#{$suffix} { 93 | order: -1; 94 | } 95 | 96 | // Columns, offsets. 97 | @for $i from 1 through $cols { 98 | > .col-#{$i}#{$suffix} { 99 | width: $unit * $i; 100 | } 101 | 102 | > .off-#{$i}#{$suffix} { 103 | margin-left: $unit * $i; 104 | } 105 | } 106 | 107 | // Step through multipliers. 108 | @each $multiplier in $multipliers { 109 | // Gutters. 110 | $class: null; 111 | 112 | @if ($multiplier != 1) { 113 | $class: ".gtr-" + ($multiplier * 100); 114 | } 115 | 116 | &#{$class} { 117 | margin-top: ($guttersRows * $multiplier * -1); 118 | margin-left: ($guttersCols * $multiplier * -1); 119 | 120 | > * { 121 | padding: ($guttersRows * $multiplier) 122 | 0 123 | 0 124 | ($guttersCols * $multiplier); 125 | } 126 | 127 | // Uniform. 128 | &.gtr-uniform { 129 | margin-top: $guttersCols * $multiplier * -1; 130 | 131 | > * { 132 | padding-top: $guttersCols * $multiplier; 133 | } 134 | } 135 | } 136 | } 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /docs/assets/sass/libs/_mixins.scss: -------------------------------------------------------------------------------- 1 | /// Makes an element's :before pseudoelement a FontAwesome icon. 2 | /// @param {string} $content Optional content value to use. 3 | /// @param {string} $category Optional category to use. 4 | /// @param {string} $where Optional pseudoelement to target (before or after). 5 | @mixin icon($content: false, $category: regular, $where: before) { 6 | text-decoration: none; 7 | 8 | &:#{$where} { 9 | @if $content { 10 | content: $content; 11 | } 12 | 13 | -moz-osx-font-smoothing: grayscale; 14 | -webkit-font-smoothing: antialiased; 15 | display: inline-block; 16 | font-style: normal; 17 | font-variant: normal; 18 | text-rendering: auto; 19 | line-height: 1; 20 | text-transform: none !important; 21 | 22 | @if ($category == brands) { 23 | font-family: "Font Awesome 5 Brands"; 24 | } 25 | @elseif ($category == solid) { 26 | font-family: "Font Awesome 5 Free"; 27 | font-weight: 900; 28 | } @else { 29 | font-family: "Font Awesome 5 Free"; 30 | font-weight: 400; 31 | } 32 | } 33 | } 34 | 35 | /// Applies padding to an element, taking the current element-margin value into account. 36 | /// @param {mixed} $tb Top/bottom padding. 37 | /// @param {mixed} $lr Left/right padding. 38 | /// @param {list} $pad Optional extra padding (in the following order top, right, bottom, left) 39 | /// @param {bool} $important If true, adds !important. 40 | @mixin padding($tb, $lr, $pad: (0, 0, 0, 0), $important: null) { 41 | @if $important { 42 | $important: "!important"; 43 | } 44 | 45 | $x: 0.1em; 46 | 47 | @if unit(_size(element-margin)) == "rem" { 48 | $x: 0.1rem; 49 | } 50 | 51 | padding: ($tb + nth($pad, 1)) ($lr + nth($pad, 2)) 52 | max($x, $tb - _size(element-margin) + nth($pad, 3)) ($lr + nth($pad, 4)) #{$important}; 53 | } 54 | 55 | /// Encodes a SVG data URL so IE doesn't choke (via codepen.io/jakob-e/pen/YXXBrp). 56 | /// @param {string} $svg SVG data URL. 57 | /// @return {string} Encoded SVG data URL. 58 | @function svg-url($svg) { 59 | $svg: str-replace($svg, '"', "'"); 60 | $svg: str-replace($svg, "%", "%25"); 61 | $svg: str-replace($svg, "<", "%3C"); 62 | $svg: str-replace($svg, ">", "%3E"); 63 | $svg: str-replace($svg, "&", "%26"); 64 | $svg: str-replace($svg, "#", "%23"); 65 | $svg: str-replace($svg, "{", "%7B"); 66 | $svg: str-replace($svg, "}", "%7D"); 67 | $svg: str-replace($svg, ";", "%3B"); 68 | 69 | @return url("data:image/svg+xml;charset=utf8,#{$svg}"); 70 | } 71 | 72 | // ! Dynamic background image 73 | @mixin dynamic-linear-gradient($name) { 74 | background-image: linear-gradient( 75 | to top, 76 | transparentize(_palette(bg), $bg-transparent), 77 | transparentize(_palette(bg), $bg-transparent) 78 | ), 79 | url("../../images/" + $name + ".png"); 80 | } 81 | 82 | @mixin dynamic-background-image { 83 | @include dynamic-linear-gradient("index"); 84 | 85 | &[background="maya"] { 86 | @include dynamic-linear-gradient("maya"); 87 | } 88 | 89 | &[background="mari"] { 90 | @include dynamic-linear-gradient("mari"); 91 | } 92 | 93 | &[background="nuke"] { 94 | @include dynamic-linear-gradient("nuke"); 95 | } 96 | 97 | &[background="houdini"] { 98 | @include dynamic-linear-gradient("houdini"); 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /docs/assets/sass/libs/_prism.scss: -------------------------------------------------------------------------------- 1 | /* PrismJS 1.23.0 2 | https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+python&plugins=normalize-whitespace */ 3 | /** 4 | * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML 5 | * Based on https://github.com/chriskempson/tomorrow-theme 6 | * @author Rose Pritchard 7 | */ 8 | 9 | code[class*="language-"], 10 | pre[class*="language-"] { 11 | color: #ccc; 12 | background: none; 13 | // font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; 14 | font-size: 1em; 15 | text-align: left; 16 | white-space: pre; 17 | word-spacing: normal; 18 | word-break: normal; 19 | word-wrap: normal; 20 | line-height: 1.5; 21 | 22 | -moz-tab-size: 4; 23 | -o-tab-size: 4; 24 | tab-size: 4; 25 | 26 | -webkit-hyphens: none; 27 | -moz-hyphens: none; 28 | -ms-hyphens: none; 29 | hyphens: none; 30 | } 31 | 32 | // /* Code blocks */ 33 | // pre[class*="language-"] { 34 | // padding: 1em; 35 | // margin: 0.5em 0; 36 | // overflow: auto; 37 | // } 38 | 39 | // :not(pre) > code[class*="language-"], 40 | // pre[class*="language-"] { 41 | // background: #2d2d2d; 42 | // } 43 | 44 | /* Inline code */ 45 | :not(pre) > code[class*="language-"] { 46 | padding: 0.1em; 47 | border-radius: 0.3em; 48 | white-space: normal; 49 | } 50 | 51 | .token.comment, 52 | .token.block-comment, 53 | .token.prolog, 54 | .token.doctype, 55 | .token.cdata { 56 | color: #999; 57 | } 58 | 59 | .token.punctuation { 60 | color: #ccc; 61 | } 62 | 63 | .token.tag, 64 | .token.attr-name, 65 | .token.namespace, 66 | .token.deleted { 67 | color: #e2777a; 68 | } 69 | 70 | .token.function-name { 71 | color: #6196cc; 72 | } 73 | 74 | .token.boolean, 75 | .token.number, 76 | .token.function { 77 | color: #f08d49; 78 | } 79 | 80 | .token.property, 81 | .token.class-name, 82 | .token.constant, 83 | .token.symbol { 84 | color: #f8c555; 85 | } 86 | 87 | .token.selector, 88 | .token.important, 89 | .token.atrule, 90 | .token.keyword, 91 | .token.builtin { 92 | color: #cc99cd; 93 | } 94 | 95 | .token.string, 96 | .token.char, 97 | .token.attr-value, 98 | .token.regex, 99 | .token.variable { 100 | color: #7ec699; 101 | } 102 | 103 | .token.operator, 104 | .token.entity, 105 | .token.url { 106 | color: #67cdcc; 107 | } 108 | 109 | .token.important, 110 | .token.bold { 111 | font-weight: bold; 112 | } 113 | .token.italic { 114 | font-style: italic; 115 | } 116 | 117 | .token.entity { 118 | cursor: help; 119 | } 120 | 121 | .token.inserted { 122 | color: green; 123 | } 124 | -------------------------------------------------------------------------------- /docs/assets/sass/libs/_vars.scss: -------------------------------------------------------------------------------- 1 | // Misc. 2 | $misc: ( 3 | z-index-base: 10000, 4 | max-wrapper-styles: 6, 5 | ); 6 | 7 | // Duration. 8 | $duration: ( 9 | menu: 0.35s, 10 | transition: 0.2s, 11 | ); 12 | 13 | // Size. 14 | $size: ( 15 | border-radius: 5px, 16 | element-height: 2.75em, 17 | element-margin: 2em, 18 | inner: 55em, 19 | section-spacing: ( 20 | large: 3em, 21 | medium: 2em, 22 | small: 1.75em, 23 | ), 24 | wrapper-edges: ( 25 | large: 6.5em, 26 | medium: 4.75em, 27 | small: 2.5em, 28 | ), 29 | ); 30 | 31 | // Font. 32 | $font: ( 33 | family: ( 34 | "Source Sans Pro", 35 | Helvetica, 36 | sans-serif, 37 | ), 38 | family-fixed: ( 39 | "Courier New", 40 | monospace, 41 | ), 42 | family-heading: ( 43 | Raleway, 44 | Helvetica, 45 | sans-serif, 46 | ), 47 | weight: 300, 48 | weight-bold: 600, 49 | weight-heading: 200, 50 | weight-heading-bold: 700, 51 | kern-heading: 0.1em, 52 | ); 53 | 54 | // Palette. 55 | $bg-transparent: 0.5; 56 | $palette: ( 57 | bg: #444444, 58 | fg: #ffffff, 59 | fg-bold: #ffffff, 60 | fg-light: rgba(255, 255, 255, 0.35), 61 | border: rgba(255, 255, 255, 0.125), 62 | border-bg: rgba(255, 255, 255, 0.025), 63 | border2: rgba(255, 255, 255, 0.25), 64 | border2-bg: rgba(255, 255, 255, 0.075), 65 | accent: #4c5c96, 66 | ); 67 | -------------------------------------------------------------------------------- /docs/assets/sass/libs/_vendor.scss: -------------------------------------------------------------------------------- 1 | // vendor.scss v1.0 | @ajlkn | MIT licensed */ 2 | 3 | // Vars. 4 | 5 | /// Vendor prefixes. 6 | /// @var {list} 7 | $vendor-prefixes: ("-moz-", "-webkit-", "-ms-", ""); 8 | 9 | /// Properties that should be vendorized. 10 | /// Data via caniuse.com, github.com/postcss/autoprefixer, and developer.mozilla.org 11 | /// @var {list} 12 | $vendor-properties: ( 13 | // Animation. 14 | "animation", 15 | "animation-delay", 16 | "animation-direction", 17 | "animation-duration", 18 | "animation-fill-mode", 19 | "animation-iteration-count", 20 | "animation-name", 21 | "animation-play-state", 22 | "animation-timing-function", 23 | // Appearance. 24 | "appearance", 25 | // Backdrop filter. 26 | "backdrop-filter", 27 | // Background image options. 28 | "background-clip", 29 | "background-origin", 30 | "background-size", 31 | // Box sizing. 32 | "box-sizing", 33 | // Clip path. 34 | "clip-path", 35 | // Filter effects. 36 | "filter", 37 | // Flexbox. 38 | "align-content", 39 | "align-items", 40 | "align-self", 41 | "flex", 42 | "flex-basis", 43 | "flex-direction", 44 | "flex-flow", 45 | "flex-grow", 46 | "flex-shrink", 47 | "flex-wrap", 48 | "justify-content", 49 | "order", 50 | // Font feature. 51 | "font-feature-settings", 52 | "font-language-override", 53 | "font-variant-ligatures", 54 | // Font kerning. 55 | "font-kerning", 56 | // Fragmented borders and backgrounds. 57 | "box-decoration-break", 58 | // Grid layout. 59 | "grid-column", 60 | "grid-column-align", 61 | "grid-column-end", 62 | "grid-column-start", 63 | "grid-row", 64 | "grid-row-align", 65 | "grid-row-end", 66 | "grid-row-start", 67 | "grid-template-columns", 68 | "grid-template-rows", 69 | // Hyphens. 70 | "hyphens", 71 | "word-break", 72 | // Masks. 73 | "mask", 74 | "mask-border", 75 | "mask-border-outset", 76 | "mask-border-repeat", 77 | "mask-border-slice", 78 | "mask-border-source", 79 | "mask-border-width", 80 | "mask-clip", 81 | "mask-composite", 82 | "mask-image", 83 | "mask-origin", 84 | "mask-position", 85 | "mask-repeat", 86 | "mask-size", 87 | // Multicolumn. 88 | "break-after", 89 | "break-before", 90 | "break-inside", 91 | "column-count", 92 | "column-fill", 93 | "column-gap", 94 | "column-rule", 95 | "column-rule-color", 96 | "column-rule-style", 97 | "column-rule-width", 98 | "column-span", 99 | "column-width", 100 | "columns", 101 | // Object fit. 102 | "object-fit", 103 | "object-position", 104 | // Regions. 105 | "flow-from", 106 | "flow-into", 107 | "region-fragment", 108 | // Scroll snap points. 109 | "scroll-snap-coordinate", 110 | "scroll-snap-destination", 111 | "scroll-snap-points-x", 112 | "scroll-snap-points-y", 113 | "scroll-snap-type", 114 | // Shapes. 115 | "shape-image-threshold", 116 | "shape-margin", 117 | "shape-outside", 118 | // Tab size. 119 | "tab-size", 120 | // Text align last. 121 | "text-align-last", 122 | // Text decoration. 123 | "text-decoration-color", 124 | "text-decoration-line", 125 | "text-decoration-skip", 126 | "text-decoration-style", 127 | // Text emphasis. 128 | "text-emphasis", 129 | "text-emphasis-color", 130 | "text-emphasis-position", 131 | "text-emphasis-style", 132 | // Text size adjust. 133 | "text-size-adjust", 134 | // Text spacing. 135 | "text-spacing", 136 | // Transform. 137 | "transform", 138 | "transform-origin", 139 | // Transform 3D. 140 | "backface-visibility", 141 | "perspective", 142 | "perspective-origin", 143 | "transform-style", 144 | // Transition. 145 | "transition", 146 | "transition-delay", 147 | "transition-duration", 148 | "transition-property", 149 | "transition-timing-function", 150 | // Unicode bidi. 151 | "unicode-bidi", 152 | // User select. 153 | "user-select", 154 | // Writing mode. 155 | "writing-mode" 156 | ); 157 | 158 | /// Values that should be vendorized. 159 | /// Data via caniuse.com, github.com/postcss/autoprefixer, and developer.mozilla.org 160 | /// @var {list} 161 | $vendor-values: ( 162 | // Cross fade. 163 | "cross-fade", 164 | // Element function. 165 | "element", 166 | // Filter function. 167 | "filter", 168 | // Flexbox. 169 | "flex", 170 | "inline-flex", 171 | // Grab cursors. 172 | "grab", 173 | "grabbing", 174 | // Gradients. 175 | "linear-gradient", 176 | "repeating-linear-gradient", 177 | "radial-gradient", 178 | "repeating-radial-gradient", 179 | // Grid layout. 180 | "grid", 181 | "inline-grid", 182 | // Image set. 183 | "image-set", 184 | // Intrinsic width. 185 | "max-content", 186 | "min-content", 187 | "fit-content", 188 | "fill", 189 | "fill-available", 190 | "stretch", 191 | // Sticky position. 192 | "sticky", 193 | // Transform. 194 | "transform", 195 | // Zoom cursors. 196 | "zoom-in", 197 | "zoom-out" 198 | ); 199 | 200 | // Functions. 201 | 202 | /// Removes a specific item from a list. 203 | /// @author Hugo Giraudel 204 | /// @param {list} $list List. 205 | /// @param {integer} $index Index. 206 | /// @return {list} Updated list. 207 | @function remove-nth($list, $index) { 208 | $result: null; 209 | 210 | @if type-of($index) != number { 211 | @warn "$index: #{quote($index)} is not a number for `remove-nth`."; 212 | } @else if $index == 0 { 213 | @warn "List index 0 must be a non-zero integer for `remove-nth`."; 214 | } @else if abs($index) > length($list) { 215 | @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; 216 | } @else { 217 | $result: (); 218 | $index: if($index < 0, length($list) + $index + 1, $index); 219 | 220 | @for $i from 1 through length($list) { 221 | @if $i != $index { 222 | $result: append($result, nth($list, $i)); 223 | } 224 | } 225 | } 226 | 227 | @return $result; 228 | } 229 | 230 | /// Replaces a substring within another string. 231 | /// @author Hugo Giraudel 232 | /// @param {string} $string String. 233 | /// @param {string} $search Substring. 234 | /// @param {string} $replace Replacement. 235 | /// @return {string} Updated string. 236 | @function str-replace($string, $search, $replace: "") { 237 | $index: str-index($string, $search); 238 | 239 | @if $index { 240 | @return str-slice($string, 1, $index - 1) + $replace + 241 | str-replace( 242 | str-slice($string, $index + str-length($search)), 243 | $search, 244 | $replace 245 | ); 246 | } 247 | 248 | @return $string; 249 | } 250 | 251 | /// Replaces a substring within each string in a list. 252 | /// @param {list} $strings List of strings. 253 | /// @param {string} $search Substring. 254 | /// @param {string} $replace Replacement. 255 | /// @return {list} Updated list of strings. 256 | @function str-replace-all($strings, $search, $replace: "") { 257 | @each $string in $strings { 258 | $strings: set-nth( 259 | $strings, 260 | index($strings, $string), 261 | str-replace($string, $search, $replace) 262 | ); 263 | } 264 | 265 | @return $strings; 266 | } 267 | 268 | // Mixins. 269 | 270 | /// Wraps @content in vendorized keyframe blocks. 271 | /// @param {string} $name Name. 272 | @mixin keyframes($name) { 273 | @-moz-keyframes #{$name} { 274 | @content; 275 | } 276 | @-webkit-keyframes #{$name} { 277 | @content; 278 | } 279 | @-ms-keyframes #{$name} { 280 | @content; 281 | } 282 | @keyframes #{$name} { 283 | @content; 284 | } 285 | } 286 | 287 | /// Vendorizes a declaration's property and/or value(s). 288 | /// @param {string} $property Property. 289 | /// @param {mixed} $value String/list of value(s). 290 | @mixin vendor($property, $value) { 291 | // Determine if property should expand. 292 | $expandProperty: index($vendor-properties, $property); 293 | 294 | // Determine if value should expand (and if so, add '-prefix-' placeholder). 295 | $expandValue: false; 296 | 297 | @each $x in $value { 298 | @each $y in $vendor-values { 299 | @if $y == str-slice($x, 1, str-length($y)) { 300 | $value: set-nth($value, index($value, $x), "-prefix-" + $x); 301 | $expandValue: true; 302 | } 303 | } 304 | } 305 | 306 | // Expand property? 307 | @if $expandProperty { 308 | @each $vendor in $vendor-prefixes { 309 | #{$vendor}#{$property}: #{str-replace-all($value, "-prefix-", $vendor)}; 310 | } 311 | } 312 | 313 | // Expand just the value? 314 | @elseif $expandValue { 315 | @each $vendor in $vendor-prefixes { 316 | #{$property}: #{str-replace-all($value, "-prefix-", $vendor)}; 317 | } 318 | } 319 | 320 | // Neither? Treat them as a normal declaration. 321 | @else { 322 | #{$property}: #{$value}; 323 | } 324 | } 325 | -------------------------------------------------------------------------------- /docs/assets/sass/main.scss: -------------------------------------------------------------------------------- 1 | @import "libs/vars"; 2 | @import "libs/functions"; 3 | @import "libs/mixins"; 4 | @import "libs/vendor"; 5 | @import "libs/breakpoints"; 6 | @import "libs/html-grid"; 7 | @import "libs/prism"; 8 | @import url("fontawesome-all.min.css"); 9 | @import url("https://fonts.googleapis.com/css?family=Raleway:200,700|Source+Sans+Pro:300,600,300italic,600italic"); 10 | 11 | // Breakpoints. 12 | 13 | @include breakpoints( 14 | ( 15 | xlarge: ( 16 | 1281px, 17 | 1680px, 18 | ), 19 | large: ( 20 | 981px, 21 | 1280px, 22 | ), 23 | medium: ( 24 | 737px, 25 | 980px, 26 | ), 27 | small: ( 28 | 481px, 29 | 736px, 30 | ), 31 | xsmall: ( 32 | 361px, 33 | 480px, 34 | ), 35 | xxsmall: ( 36 | null, 37 | 360px, 38 | ), 39 | ) 40 | ); 41 | 42 | // Base. 43 | 44 | @import "base/reset"; 45 | @import "base/page"; 46 | @import "base/typography"; 47 | 48 | // Component. 49 | 50 | @import "components/row"; 51 | @import "components/section"; 52 | @import "components/form"; 53 | @import "components/box"; 54 | @import "components/icon"; 55 | @import "components/image"; 56 | @import "components/list"; 57 | @import "components/actions"; 58 | @import "components/icons"; 59 | @import "components/contact"; 60 | @import "components/pagination"; 61 | @import "components/table"; 62 | @import "components/button"; 63 | @import "components/features"; 64 | 65 | // Layout. 66 | 67 | @import "layout/header"; 68 | @import "layout/menu"; 69 | @import "layout/banner"; 70 | @import "layout/wrapper"; 71 | @import "layout/footer"; 72 | -------------------------------------------------------------------------------- /docs/assets/sass/noscript.scss: -------------------------------------------------------------------------------- 1 | @import "libs/vars"; 2 | @import "libs/functions"; 3 | @import "libs/mixins"; 4 | @import "libs/vendor"; 5 | @import "libs/breakpoints"; 6 | @import "libs/html-grid"; 7 | @import "libs/prism"; 8 | 9 | /* Banner */ 10 | 11 | #banner { 12 | body.is-preload & { 13 | .logo { 14 | @include vendor("transform", "none"); 15 | opacity: 1; 16 | } 17 | 18 | h2 { 19 | opacity: 1; 20 | @include vendor("transform", "none"); 21 | @include vendor("filter", "none"); 22 | } 23 | 24 | p { 25 | opacity: 01; 26 | @include vendor("transform", "none"); 27 | @include vendor("filter", "none"); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /docs/assets/template/footer.js: -------------------------------------------------------------------------------- 1 | document.querySelector("section#footer").innerHTML = ` 2 |
3 | 7 |
8 | `; 9 | -------------------------------------------------------------------------------- /docs/assets/template/header.js: -------------------------------------------------------------------------------- 1 | document.querySelector("header#header.alt").innerHTML = ` 2 |

⚙️ ${window.PAGE_TITLE}

3 | 6 | `; 7 | -------------------------------------------------------------------------------- /docs/assets/template/menu.js: -------------------------------------------------------------------------------- 1 | document.querySelector("nav#menu").innerHTML = ` 2 |
3 |

Menu

4 | 11 | Close 12 |
13 | `; 14 | -------------------------------------------------------------------------------- /docs/assets/template/setup.js: -------------------------------------------------------------------------------- 1 | // ! Prototypes 2 | String.prototype.capitalize = function () { 3 | return this.charAt(0).toUpperCase() + this.slice(1); 4 | }; 5 | 6 | // ! Global variables 7 | window.YEAR_FOOTER = new Date().getFullYear(); 8 | window.PAGE_LINK = "diegoinacio.github.io"; 9 | 10 | // * Get meta title 11 | window.META_TITLE = document.querySelector(`meta[name="title"]`).content; 12 | window.PAGE_TITLE = 13 | window.META_TITLE !== "index" ? `${window.META_TITLE.capitalize()} | ` : ""; 14 | window.PAGE_TITLE += "Creative Production Coding"; 15 | 16 | // ! Dynamic settings 17 | // * Set title 18 | document.querySelector("title").innerText = window.PAGE_TITLE; 19 | 20 | // * Set background attributes 21 | document.querySelector("body").setAttribute("background", window.META_TITLE); 22 | document.querySelector("#banner").setAttribute("background", window.META_TITLE); 23 | document.querySelector("#footer").setAttribute("background", window.META_TITLE); 24 | -------------------------------------------------------------------------------- /docs/assets/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/assets/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /docs/assets/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/assets/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /docs/assets/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/assets/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /docs/assets/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/assets/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /docs/assets/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/assets/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /docs/assets/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/assets/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /docs/assets/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/assets/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /docs/assets/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/assets/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /docs/assets/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/assets/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /docs/assets/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/assets/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /docs/assets/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/assets/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /docs/assets/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/assets/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /docs/generic.html: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | Generic - Solid State by HTML5 UP 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 27 | 28 | 29 | 42 | 43 | 44 |
45 |
46 |
47 |

Generic

48 |

Phasellus non pulvinar erat. Fusce tincidunt nisl eget ipsum.

49 |
50 |
51 | 52 | 53 |
54 |
55 | 56 |

Lorem ipsum dolor

57 |

Morbi mattis mi consectetur tortor elementum, varius pellentesque velit convallis. Aenean tincidunt lectus auctor mauris maximus, ac scelerisque ipsum tempor. Duis vulputate ex et ex tincidunt, quis lacinia velit aliquet. Duis non efficitur nisi, id malesuada justo. Maecenas sagittis felis ac sagittis semper. Curabitur purus leo donec vel dolor at arcu tincidunt bibendum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce ut aliquet justo. Donec id neque ipsum. Integer eget ultricies odio. Nam vel ex a orci fringilla tincidunt. Aliquam eleifend ligula non velit accumsan cursus. Etiam ut gravida sapien.

58 | 59 |

Vestibulum ultrices risus velit, sit amet blandit massa auctor sit amet. Sed eu lectus sem. Phasellus in odio at ipsum porttitor mollis id vel diam. Praesent sit amet posuere risus, eu faucibus lectus. Vivamus ex ligula, tempus pulvinar ipsum in, auctor porta quam. Proin nec commodo, vel scelerisque nisi scelerisque. Suspendisse id quam vel tortor tincidunt suscipit. Nullam auctor orci eu dolor consectetur, interdum ullamcorper ante tincidunt. Mauris felis nec felis elementum varius.

60 | 61 |

Vitae phasellus

62 |

Cras mattis ante fermentum, malesuada neque vitae, eleifend erat. Phasellus non pulvinar erat. Fusce tincidunt, nisl eget mattis egestas, purus ipsum consequat orci, sit amet lobortis lorem lacus in tellus. Sed ac elementum arcu. Quisque placerat auctor laoreet.

63 | 64 |
65 |
66 | 67 |

Sed feugiat lorem

68 |

Lorem ipsum dolor sit amet, consectetur adipiscing vehicula id nulla dignissim dapibus ultrices.

69 | Learn more 70 |
71 |
72 | 73 |

Nisl placerat

74 |

Lorem ipsum dolor sit amet, consectetur adipiscing vehicula id nulla dignissim dapibus ultrices.

75 | Learn more 76 |
77 |
78 | 79 |
80 |
81 | 82 |
83 | 84 | 85 | 125 | 126 |
127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | -------------------------------------------------------------------------------- /docs/houdini.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Houdini 6 | 7 | 11 | 12 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 38 | 39 | 40 |
41 |
42 |
43 |

44 | A collection of tools, operators and examples for 45 | SideFX Houdini 48 | that helps the production of 3D procedural content. Here you are 49 | going to find: 50 |

51 | 52 |
53 | 56 |
57 |

58 | If you want to know more, please consider vising the 59 | repository. 65 |

66 | 67 |
68 |

1. Python Operators

69 |

70 | Pieces of Python code that can ben used in the 71 | production of digital assets or in 72 | Python nodes (mainly in geometry context). 73 |

74 |
75 | 76 |
77 | 83 |

Curve Frame PT

84 |

85 | Generates normal vector of a curve, based on the 86 | parallel transport method and 87 | Frenet-Serret frames. 88 |

89 | View code 95 |
96 | 97 | 98 |
99 | 107 |

Nearest Neighbors Connection

108 |

109 | Makes a polyline connection with all the points 110 | whose distance is less than the parameter radius. 111 |

112 | View code 118 |
119 | 120 | 121 |
122 | 130 |

Position to Velocity

131 |

132 | Produces a velocity vector attribute based on the 133 | positional differentiation of two object points. 134 |

135 | View code 141 |
142 | 143 | 144 |
145 | 153 |

Smooth Attribute Transfer

154 |

155 | Transfers attributes smoothly by considering distances and 156 | parameters for radial based functions. 157 |

158 | View code 164 |
165 | 166 |
167 |
168 |
169 |
170 |
171 | 172 | 173 | 174 |
175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | -------------------------------------------------------------------------------- /docs/images/_base/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/_base/bg.jpg -------------------------------------------------------------------------------- /docs/images/_base/pic01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/_base/pic01.jpg -------------------------------------------------------------------------------- /docs/images/_base/pic02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/_base/pic02.jpg -------------------------------------------------------------------------------- /docs/images/_base/pic03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/_base/pic03.jpg -------------------------------------------------------------------------------- /docs/images/_base/pic04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/_base/pic04.jpg -------------------------------------------------------------------------------- /docs/images/_base/pic05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/_base/pic05.jpg -------------------------------------------------------------------------------- /docs/images/_base/pic06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/_base/pic06.jpg -------------------------------------------------------------------------------- /docs/images/_base/pic07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/_base/pic07.jpg -------------------------------------------------------------------------------- /docs/images/_base/pic08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/_base/pic08.jpg -------------------------------------------------------------------------------- /docs/images/examples/MASH_probScatter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/MASH_probScatter.jpg -------------------------------------------------------------------------------- /docs/images/examples/houdini_curveFramePT.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/houdini_curveFramePT.jpg -------------------------------------------------------------------------------- /docs/images/examples/houdini_nearestNeighborsConnection.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/houdini_nearestNeighborsConnection.jpg -------------------------------------------------------------------------------- /docs/images/examples/houdini_positionToVelocity.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/houdini_positionToVelocity.jpg -------------------------------------------------------------------------------- /docs/images/examples/houdini_smoothAttribTransfer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/houdini_smoothAttribTransfer.jpg -------------------------------------------------------------------------------- /docs/images/examples/maya_AiAttribManager.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/maya_AiAttribManager.jpg -------------------------------------------------------------------------------- /docs/images/examples/maya_AiFocus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/maya_AiFocus.jpg -------------------------------------------------------------------------------- /docs/images/examples/maya_AiIDshader.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/maya_AiIDshader.jpg -------------------------------------------------------------------------------- /docs/images/examples/maya_Renamer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/maya_Renamer.jpg -------------------------------------------------------------------------------- /docs/images/examples/maya_StepST.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/maya_StepST.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_dft1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_dft1.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_dft2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_dft2.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_dfti1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_dfti1.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_dfti2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_dfti2.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_infNanFilter1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_infNanFilter1.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_infNanFilter2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_infNanFilter2.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_kaleidoscope1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_kaleidoscope1.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_kaleidoscope2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_kaleidoscope2.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_medianSaturation1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_medianSaturation1.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_medianSaturation2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_medianSaturation2.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_normalize1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_normalize1.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_normalize2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_normalize2.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_superConvolution1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_superConvolution1.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_superConvolution2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_superConvolution2.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_superShape1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_superShape1.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_superShape2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_superShape2.jpg -------------------------------------------------------------------------------- /docs/images/examples/nuke_superShape3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/examples/nuke_superShape3.jpg -------------------------------------------------------------------------------- /docs/images/houdini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/houdini.png -------------------------------------------------------------------------------- /docs/images/index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/index.png -------------------------------------------------------------------------------- /docs/images/mari.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/mari.png -------------------------------------------------------------------------------- /docs/images/maya.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/maya.png -------------------------------------------------------------------------------- /docs/images/nuke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dicgi/creative-production-coding/6a0bef189d1f45a8852f7b1d0f2bfe6f2036ea98/docs/images/nuke.png -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Index 6 | 7 | 11 | 12 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 45 | 46 | 47 |
48 |
49 |
50 | maya 53 |
54 |

Maya

55 |

56 | Utilities for use with the 57 | Autodesk Maya. 62 |

63 | Know more 64 |
65 |
66 |
67 | 68 |
69 |
70 | mari 73 |
74 |

Mari

75 |

76 | Utilities for use with the 77 | Foundry Mari. 80 |

81 | Know more 82 |
83 |
84 |
85 | 86 |
87 |
88 | nuke 91 |
92 |

Nuke

93 |

94 | Utilities for use with the 95 | Foundry Nuke. 98 |

99 | Know more 100 |
101 |
102 |
103 | 104 |
105 |
106 | houdini 109 |
110 |

Houdini

111 |

112 | Utilities for use with the 113 | SideFX Houdini. 118 |

119 | Know more 120 |
121 |
122 |
123 |
124 | 125 | 126 | 127 |
128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | -------------------------------------------------------------------------------- /docs/maya.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Maya 6 | 7 | 11 | 12 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 40 | 41 | 42 |
43 |
44 |
45 |

46 | A collection of tools for 47 | Autodesk Maya 52 | that smooth the way in producing 3D content. Here you are going to 53 | find: 54 |

55 | 56 |
57 | 61 |
62 |

63 | If you want to know more, please consider vising the 64 | repository. 70 |

71 | 72 |
73 | 74 |

1. Python Scripts

75 |

Scripts and plugins using Python language.

76 |
77 | 78 |
79 | 85 |

Arnold attribute manager

86 |

Management of Arnold Renderer attributes.

87 | View code 93 |
94 | 95 | 96 |
97 | 103 |

Arnold camera focus

104 |

105 | This script creates a locator, which controls the focus 106 | distance of an Arnold camera. 107 |

108 | View code 114 |
115 | 116 | 117 |
118 | 124 |

Arnold ID shader creator

125 |

Creates three preset RGB aiUtilities shaders.

126 | View code 132 |
133 | 134 | 135 |
136 | 142 |

Object Renamer

143 |

144 | Simple renamer of objects, nodes or anything in your scene 145 | that you want to change its name. 146 |

147 | View code 153 |
154 | 155 | 156 |
157 | 163 |

Step ST

164 |

Creates truncated st maps using ramps.

165 | View code 171 |
172 | 173 |
174 | 175 | 176 |

2. Mash Scripts

177 |

178 | Tools to use in conjunction with 179 | MASH 183 | to produce procedural effects. 184 |

185 |
186 | 187 |
188 | 194 |

Probabilistic Scatter

195 |

196 | A "Drop Window" script, which spreads instances 197 | over a selected surface based on probabilistic parameters. 198 |

199 | View code 205 |
206 | 207 |
208 | 209 |
210 |
211 |
212 |
213 | 214 | 215 | 216 |
217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | --------------------------------------------------------------------------------