├── .gitattributes ├── .github └── workflows │ └── nodejs.yml ├── .gitignore ├── .travis.yml ├── CNAME ├── Gemfile ├── README.md ├── __data ├── css_properties.json ├── events.json ├── lua_client.json ├── lua_client_enums.json ├── lua_server.json └── lua_server_enums.json ├── _config.yml ├── _data ├── css_properties.json ├── events.json ├── lua_bots.json ├── lua_bots_enums.json ├── lua_client.json ├── lua_client_enums.json ├── lua_server.json ├── lua_server_enums.json ├── modifiers.json ├── override_lua_bots.json ├── override_lua_server.json └── panorama_enums.json ├── declarations ├── panorama │ └── README.md └── server │ └── README.md ├── dump ├── cl_script_help2.lua ├── dump_panorama_css_properties.md ├── dump_panorama_events.md └── script_help2.lua ├── examples └── vscript │ ├── addon_game_mode.js │ ├── addon_game_mode.lua │ ├── addon_game_mode.ts │ ├── declarations │ ├── dota-api.d.ts │ ├── dota-enums.d.ts │ ├── dota-gameevents.d.ts │ ├── dota-modifier-properties.d.ts │ └── dota-std.d.ts │ ├── lib │ ├── lib-typescript.d.ts │ └── typescript.lua │ ├── modifiers │ ├── modifier_panic.js │ ├── modifier_panic.lua │ └── modifier_panic.ts │ └── tsconfig.json ├── gen ├── DefinitionGenerator.py ├── enumdump.js ├── enumdump.ts └── tsconfig.json ├── images ├── bg_hr.png ├── blacktocat.png ├── icon_download.png └── sprite_download.png ├── index.md ├── javascripts └── main.js ├── lua_bots.md ├── lua_bots_docs.md ├── lua_bots_enums.md ├── lua_server.md ├── lua_server_declaration.md ├── lua_server_docs.md ├── lua_server_editor.html ├── lua_server_enums.md ├── lua_server_enums_declaration.md ├── lua_server_enums_docs.md ├── override_validate ├── override_validate.js ├── override_validate.ts ├── package.json ├── tsconfig.json └── yarn.lock ├── panorama_enums.md ├── params.json ├── stylesheets ├── github-light.css └── stylesheet.css └── tsconfig.json /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js binary -------------------------------------------------------------------------------- /.github/workflows/nodejs.yml: -------------------------------------------------------------------------------- 1 | name: Node CI 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ubuntu-latest 9 | 10 | steps: 11 | - uses: actions/checkout@v1 12 | 13 | - name: Use Node.js 14 | uses: actions/setup-node@v1 15 | with: 16 | node-version: 12.X 17 | 18 | - name: npm install, build, and test 19 | working-directory: ./override_validate 20 | run: | 21 | yarn 22 | yarn test 23 | env: 24 | CI: true 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | panorama/.vscode/ 2 | Thumbs.db 3 | .idea/ 4 | 5 | _site/ 6 | .sass-cache/ 7 | Gemfile.lock 8 | node_modules 9 | build -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | rvm: 3 | - 2.1 4 | cache: bundler 5 | script: "bundle exec jekyll build" 6 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | docs.moddota.com -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'github-pages' -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # API 2 | This repository aims to document the different interfaces relevant to Dota 2 Modding. It uses these to render http://docs.moddota.com/ and provides a repository for TypeScript declarations to be used for Panorama UI or with [TypescriptToLua](https://github.com/Perryvw/TypescriptToLua) for game code. 3 | 4 | ## File Structure 5 | ### /_data 6 | Contains raw dumps from the engine 7 | 8 | ### /declarations/panorama/ 9 | TypeScript declarations for Panorama. 10 | * **dota.d.ts** Declarations for interfacing with the game engine. 11 | * **dota_enums.d.ts** Declarations for enumerations used in Panorama. 12 | * **dota_panels.d.ts** Declarations for Panel interaction in Panorama. 13 | 14 | ### /declarations/server/ 15 | TypeScript declarations for the lua API (see [TypescriptToLua](https://github.com/Perryvw/TypescriptToLua)). 16 | * **dota-api.d.ts** Declarations for the Lua API. 17 | * **dota-enums.d.ts** Declarations of Lua enums. 18 | * **dota-gameevents.d.ts** Declarations of the different game events and their event contents. 19 | * **dota-modifier-properties.d.ts** Declarations for modifier properties on Lua modifiers. 20 | * **dota-std.d.ts** Lua std functions used for Dota modding. 21 | 22 | ### /examples/vscript/ 23 | Example TypeScript code. 24 | -------------------------------------------------------------------------------- /__data/events.json: -------------------------------------------------------------------------------- 1 | { 2 | "AddStyle": { 3 | "description": "Add a CSS class to a panel.", 4 | "panelEvent": true, 5 | "args": [ 6 | { 7 | "name": "class", 8 | "type": "string" 9 | } 10 | ] 11 | }, 12 | "AddStyleAfterDelay": { 13 | "description": "Add a CSS class to a panel after a specified delay. ", 14 | "panelEvent": true, 15 | "args": [ 16 | { 17 | "name": "class", 18 | "type": "string" 19 | }, 20 | { 21 | "name": "pre-delay", 22 | "type": "float" 23 | } 24 | ] 25 | }, 26 | "AddStyleToEachChild": { 27 | "description": "Add a CSS class to all children of this panel.", 28 | "panelEvent": true, 29 | "args": [ 30 | { 31 | "name": "class", 32 | "type": "string" 33 | } 34 | ] 35 | }, 36 | "AddTimedStyle": { 37 | "description": "Add a class for a specified duration, with optional pre-delay; clears existing timers when called with same class. ", 38 | "panelEvent": true, 39 | "args": [ 40 | { 41 | "name": "class", 42 | "type": "string" 43 | }, 44 | { 45 | "name": "duration", 46 | "type": "float" 47 | }, 48 | { 49 | "name": "pre-delay", 50 | "type": "float" 51 | } 52 | ] 53 | }, 54 | "AsyncEvent": { 55 | "description": "Fire another event after a delay (in seconds).", 56 | "panelEvent": false, 57 | "args": [ 58 | { 59 | "name": "delay", 60 | "type": "float" 61 | }, 62 | { 63 | "name": "eventToFire", 64 | "type": "event" 65 | } 66 | ] 67 | }, 68 | "DOTAHideAbilityTooltip": { 69 | "description": "Hide the ability tooltip", 70 | "panelEvent": true, 71 | "args": [] 72 | }, 73 | "DOTAHideBuffTooltip": { 74 | "description": "Hide the buff tooltip", 75 | "panelEvent": true, 76 | "args": [] 77 | }, 78 | "DOTAHideDroppedItemTooltip": { 79 | "description": "Hide the dropped item tooltip", 80 | "panelEvent": true, 81 | "args": [] 82 | }, 83 | "DOTAHideEconItemTooltip": { 84 | "description": "Hide the econ item tooltip.", 85 | "panelEvent": true, 86 | "args": [] 87 | }, 88 | "DOTAHideProfileCardBattleCupTooltip": { 89 | "description": "Hide the profile card / battle cup tooltip.", 90 | "panelEvent": true, 91 | "args": [] 92 | }, 93 | "DOTAHideProfileCardTooltip": { 94 | "description": "Hide the profile card tooltip.", 95 | "panelEvent": true, 96 | "args": [] 97 | }, 98 | "DOTAHideRankTierTooltip": { 99 | "description": "Hide the rank tier tooltip.", 100 | "panelEvent": true, 101 | "args": [] 102 | }, 103 | "DOTAHideRuneTooltip": { 104 | "description": "Hide the rune tooltip", 105 | "panelEvent": true, 106 | "args": [] 107 | }, 108 | "DOTAHideTextTooltip": { 109 | "description": "Hide the text tooltip", 110 | "panelEvent": true, 111 | "args": [] 112 | }, 113 | "DOTAHideTitleImageTextTooltip": { 114 | "description": "Hide the title image text tooltip.", 115 | "panelEvent": true, 116 | "args": [] 117 | }, 118 | "DOTAHideTitleTextTooltip": { 119 | "description": "Hide the title text tooltip.", 120 | "panelEvent": true, 121 | "args": [] 122 | }, 123 | "DOTAShowAbilityInventoryItemTooltip": { 124 | "description": "Show tooltip for an item in the entityIndex NPC's inventory.", 125 | "panelEvent": true, 126 | "args": [ 127 | { 128 | "name": "entityIndex", 129 | "type": "int32" 130 | }, 131 | { 132 | "name": "inventorySlot", 133 | "type": "int32" 134 | } 135 | ] 136 | }, 137 | "DOTAShowAbilityShopItemTooltip": { 138 | "description": "Show tooltip for an item in the entityIndex NPC's shop.", 139 | "panelEvent": true, 140 | "args": [ 141 | { 142 | "name": "abilityName", 143 | "type": "string" 144 | }, 145 | { 146 | "name": "guideName", 147 | "type": "string" 148 | }, 149 | { 150 | "name": "entityIndex", 151 | "type": "int32" 152 | } 153 | ] 154 | }, 155 | "DOTAShowAbilityTooltip": { 156 | "description": "Show an ability tooltip.", 157 | "panelEvent": true, 158 | "args": [ 159 | { 160 | "name": "abilityName", 161 | "type": "string" 162 | } 163 | ] 164 | }, 165 | "DOTAShowAbilityTooltipForEntityIndex": { 166 | "description": "Show an ability tooltip. Level information comes from the entity specified by the entityIndex.", 167 | "panelEvent": true, 168 | "args": [ 169 | { 170 | "name": "abilityName", 171 | "type": "string" 172 | }, 173 | { 174 | "name": "entityIndex", 175 | "type": "int32" 176 | } 177 | ] 178 | }, 179 | "DOTAShowAbilityTooltipForGuide": { 180 | "description": "Show an ability tooltip annotated with a particular guide's info.", 181 | "panelEvent": true, 182 | "args": [ 183 | { 184 | "name": "abilityName", 185 | "type": "string" 186 | }, 187 | { 188 | "name": "guideName", 189 | "type": "string" 190 | } 191 | ] 192 | }, 193 | "DOTAShowAbilityTooltipForHero": { 194 | "description": "Show an ability tooltip for the specified hero.", 195 | "panelEvent": true, 196 | "args": [ 197 | { 198 | "name": "abilityName", 199 | "type": "string" 200 | }, 201 | { 202 | "name": "heroid", 203 | "type": "int32" 204 | }, 205 | { 206 | "name": "bool", 207 | "type": "boo" 208 | } 209 | ] 210 | }, 211 | "DOTAShowAbilityTooltipForLevel": { 212 | "description": "Show an ability tooltip for a specific level.", 213 | "panelEvent": true, 214 | "args": [ 215 | { 216 | "name": "abilityName", 217 | "type": "string" 218 | }, 219 | { 220 | "name": "int32", 221 | "type": "int3" 222 | } 223 | ] 224 | }, 225 | "DOTAShowBuffTooltip": { 226 | "description": "Show a buff tooltip for the specified entityIndex + buff serial.", 227 | "panelEvent": true, 228 | "args": [ 229 | { 230 | "name": "entityIndex", 231 | "type": "int32" 232 | }, 233 | { 234 | "name": "buffSerial", 235 | "type": "int32" 236 | }, 237 | { 238 | "name": "bOnEnemy", 239 | "type": "bool" 240 | } 241 | ] 242 | }, 243 | "DOTAShowEconItemTooltip": { 244 | "description": "Show the econ item tooltip for a given item, style, and hero. Use 0 for the default style, and -1 for the default hero.", 245 | "panelEvent": true, 246 | "args": [ 247 | { 248 | "name": "itemDef", 249 | "type": "class item_definition_index_t" 250 | }, 251 | { 252 | "name": "styleIndex", 253 | "type": "class style_index_t" 254 | }, 255 | { 256 | "name": "heroID", 257 | "type": "int32" 258 | } 259 | ] 260 | } 261 | } -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | title: ModDota API Documentation 2 | description: > # this means to ignore newlines until "baseurl:" 3 | A Project by ModDota to have automated documenation 4 | of all aspects of Custom Games, with more coming over time. 5 | markdown: kramdown 6 | theme: minima 7 | gems: 8 | - jekyll-feed -------------------------------------------------------------------------------- /_data/events.json: -------------------------------------------------------------------------------- 1 | { 2 | "AddStyle": { 3 | "description": "Add a CSS class to a panel.", 4 | "panelEvent": true, 5 | "args": [ 6 | { 7 | "name": "class", 8 | "type": "panoramasymbol" 9 | } 10 | ] 11 | }, 12 | "AddStyleAfterDelay": { 13 | "description": "Add a CSS class to a panel after a specified delay. ", 14 | "panelEvent": true, 15 | "args": [ 16 | { 17 | "name": "class", 18 | "type": "panoramasymbol" 19 | }, 20 | { 21 | "name": "pre-delay", 22 | "type": "float" 23 | } 24 | ] 25 | }, 26 | "AddStyleToEachChild": { 27 | "description": "Add a CSS class to all children of this panel.", 28 | "panelEvent": true, 29 | "args": [ 30 | { 31 | "name": "class", 32 | "type": "panoramasymbol" 33 | } 34 | ] 35 | }, 36 | "AddTimedStyle": { 37 | "description": "Add a class for a specified duration, with optional pre-delay; clears existing timers when called with same class. ", 38 | "panelEvent": true, 39 | "args": [ 40 | { 41 | "name": "class", 42 | "type": "panoramasymbol" 43 | }, 44 | { 45 | "name": "duration", 46 | "type": "float" 47 | }, 48 | { 49 | "name": "pre-delay", 50 | "type": "float" 51 | } 52 | ] 53 | }, 54 | "AsyncEvent": { 55 | "description": "Fire another event after a delay (in seconds).", 56 | "panelEvent": false, 57 | "args": [ 58 | { 59 | "name": "delay", 60 | "type": "float" 61 | }, 62 | { 63 | "name": "eventToFire", 64 | "type": "event" 65 | } 66 | ] 67 | }, 68 | "DOTADisplayDashboardTip": { 69 | "description": "Tip to display, panel to attach to (default 'DefaultTipAttachment')", 70 | "panelEvent": false, 71 | "args": [ 72 | { 73 | "name": "string", 74 | "type": "string" 75 | }, 76 | { 77 | "name": "string", 78 | "type": "string optional" 79 | } 80 | ] 81 | }, 82 | "DOTAHideAbilityTooltip": { 83 | "description": "Hide the ability tooltip", 84 | "panelEvent": true, 85 | "args": [] 86 | }, 87 | "DOTAHideBuffTooltip": { 88 | "description": "Hide the buff tooltip", 89 | "panelEvent": true, 90 | "args": [] 91 | }, 92 | "DOTAHideDroppedItemTooltip": { 93 | "description": "Hide the dropped item tooltip", 94 | "panelEvent": true, 95 | "args": [] 96 | }, 97 | "DOTAHideEconItemTooltip": { 98 | "description": "Hide the econ item tooltip.", 99 | "panelEvent": true, 100 | "args": [] 101 | }, 102 | "DOTAHideProfileCardBattleCupTooltip": { 103 | "description": "Hide the profile card / battle cup tooltip.", 104 | "panelEvent": true, 105 | "args": [] 106 | }, 107 | "DOTAHideProfileCardTooltip": { 108 | "description": "Hide the profile card tooltip.", 109 | "panelEvent": true, 110 | "args": [] 111 | }, 112 | "DOTAHideRankTierTooltip": { 113 | "description": "Hide the rank tier tooltip.", 114 | "panelEvent": true, 115 | "args": [] 116 | }, 117 | "DOTAHideRuneTooltip": { 118 | "description": "Hide the rune tooltip", 119 | "panelEvent": true, 120 | "args": [] 121 | }, 122 | "DOTAHideTextTooltip": { 123 | "description": "Hide the text tooltip", 124 | "panelEvent": true, 125 | "args": [] 126 | }, 127 | "DOTAHideTI10EventGameTooltip": { 128 | "description": "Hide the ti10 event game tooltip", 129 | "panelEvent": true, 130 | "args": [] 131 | }, 132 | "DOTAHideTitleImageTextTooltip": { 133 | "description": "Hide the title image text tooltip.", 134 | "panelEvent": true, 135 | "args": [] 136 | }, 137 | "DOTAHideTitleTextTooltip": { 138 | "description": "Hide the title text tooltip.", 139 | "panelEvent": true, 140 | "args": [] 141 | }, 142 | "DOTALiveStreamUpcoming": { 143 | "description": "Notify change in RTime32 we expect the stream to start", 144 | "panelEvent": true, 145 | "args": [ 146 | { 147 | "name": "time", 148 | "type": "uint32" 149 | } 150 | ] 151 | }, 152 | "DOTALiveStreamVideoLive": { 153 | "description": "Notify change in stream state (we detected the stream going live)", 154 | "panelEvent": true, 155 | "args": [ 156 | { 157 | "name": "isLive", 158 | "type": "bool" 159 | } 160 | ] 161 | }, 162 | "DOTALiveStreamVideoPlaying": { 163 | "description": "Notify change in video state (is it pointing at a live stream page or not)", 164 | "panelEvent": true, 165 | "args": [ 166 | { 167 | "name": "isShowingVideo", 168 | "type": "bool" 169 | } 170 | ] 171 | }, 172 | "DOTAShowAbilityInventoryItemTooltip": { 173 | "description": "Show tooltip for an item in the entityIndex NPC's inventory.", 174 | "panelEvent": true, 175 | "args": [ 176 | { 177 | "name": "entityIndex", 178 | "type": "int32" 179 | }, 180 | { 181 | "name": "inventorySlot", 182 | "type": "int32" 183 | } 184 | ] 185 | }, 186 | "DOTAShowAbilityShopItemTooltip": { 187 | "description": "Show tooltip for an item in the entityIndex NPC's shop.", 188 | "panelEvent": true, 189 | "args": [ 190 | { 191 | "name": "abilityName", 192 | "type": "string" 193 | }, 194 | { 195 | "name": "guideName", 196 | "type": "string" 197 | }, 198 | { 199 | "name": "entityIndex", 200 | "type": "int32" 201 | } 202 | ] 203 | }, 204 | "DOTAShowAbilityTooltip": { 205 | "description": "Show an ability tooltip.", 206 | "panelEvent": true, 207 | "args": [ 208 | { 209 | "name": "abilityName", 210 | "type": "string" 211 | } 212 | ] 213 | }, 214 | "DOTAShowAbilityTooltipForEntityIndex": { 215 | "description": "Show an ability tooltip. Level information comes from the entity specified by the entityIndex.", 216 | "panelEvent": true, 217 | "args": [ 218 | { 219 | "name": "abilityName", 220 | "type": "string" 221 | }, 222 | { 223 | "name": "entityIndex", 224 | "type": "int32" 225 | } 226 | ] 227 | }, 228 | "DOTAShowAbilityTooltipForGuide": { 229 | "description": "Show an ability tooltip annotated with a particular guide's info.", 230 | "panelEvent": true, 231 | "args": [ 232 | { 233 | "name": "abilityName", 234 | "type": "string" 235 | }, 236 | { 237 | "name": "guideName", 238 | "type": "string" 239 | } 240 | ] 241 | }, 242 | "DOTAShowAbilityTooltipForHero": { 243 | "description": "Show an ability tooltip for the specified hero.", 244 | "panelEvent": true, 245 | "args": [ 246 | { 247 | "name": "abilityName", 248 | "type": "string" 249 | }, 250 | { 251 | "name": "heroid", 252 | "type": "int32" 253 | }, 254 | { 255 | "name": "bool", 256 | "type": "boo" 257 | } 258 | ] 259 | } 260 | } -------------------------------------------------------------------------------- /_data/override_lua_bots.json: -------------------------------------------------------------------------------- 1 | { 2 | "Global": { 3 | "functions": { 4 | "GetHeroLevel": { 5 | "arg_names": [ 6 | "nPlayerID" 7 | ] 8 | } 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /declarations/panorama/README.md: -------------------------------------------------------------------------------- 1 | ### Declarations have moved! 2 | 3 | Up-to-date declarations at https://github.com/ModDota/TypescriptPanoramaDeclarations 4 | -------------------------------------------------------------------------------- /declarations/server/README.md: -------------------------------------------------------------------------------- 1 | ### Declarations have moved! 2 | 3 | Up-to-date declarations at https://github.com/TypeScriptToLua/Dota2Declarations 4 | 5 | -------------------------------------------------------------------------------- /dump/dump_panorama_css_properties.md: -------------------------------------------------------------------------------- 1 | === -s2-mix-blend-mode === 2 | Controls blending mode for the panel. See CSS mix-blend-mode docs on web, except normal for us is with alpha blending.

Examples:
-s2-mix-blend-mode: normal;
  3 | -s2-mix-blend-mode: multiply;
  4 | -s2-mix-blend-mode: screen;
5 | 6 | 7 | === align === 8 | <Needs a description> 9 | 10 | 11 | === animation === 12 | <Needs a description> 13 | 14 | 15 | === animation-delay === 16 | <Needs a description> 17 | 18 | 19 | === animation-direction === 20 | <Needs a description> 21 | 22 | 23 | === animation-duration === 24 | <Needs a description> 25 | 26 | 27 | === animation-iteration-count === 28 | <Needs a description> 29 | 30 | 31 | === animation-name === 32 | <Needs a description> 33 | 34 | 35 | === animation-timing-function === 36 | <Needs a description> 37 | 38 | 39 | === background-color === 40 | Sets the background fill color/gradient/combination for a panel.

Examples:
background-color: #FFFFFFFF;
 41 | background-color: gradient( linear, 0% 0%, 0% 100%, from( #fbfbfbff ), to( #c0c0c0c0 ) );
 42 | background-color: gradient( linear, 0% 0%, 0% 100%, from( #fbfbfbff ), color-stop( 0.3, #ebebebff ), to( #c0c0c0c0 ) );
 43 | background-color: gradient( radial, 50% 50%, 0% 0%, 80% 80%, from( #00ff00ff ), to( #0000ffff ) );
 44 | background-color: #0d1c22ff, gradient( radial, 100% -0%, 100px -40px, 320% 270%, from( #3a464bff ), color-stop( 0.23, #0d1c22ff ), to( #0d1c22ff ) );
45 | 46 | 47 | === background-image === 48 | Comma separated list of images or movies to draw in the background. Can specify "none" to not draw a background layer. Combined with background-position, background-size and background-repeat values.

Example:
background-image: url("file://{images}/default.tga"), url( "file://{movies}/Background1080p.webm" );
49 | 50 | 51 | === background-position === 52 | Controls the horizontal and vertical placement of the background image, with the format: <left|center|right> <horizontal length> <top|center|bottom> <vertical length>

If length is a percent, the specified location within the image is positioned over that same specified position in the background. If the length is pixels, the top left corner is placed relative to the provided alignment keywords (left, bottom, etc.). See examples for more details.

If 1 value is specified, the other value is assumed to be center. If 2 values are specified, the first value must be for horizontal placement and the second for vertical.

Examples:
// aligns the top left corner of the image with the top left corner of the panel (default)
 53 | background-position: 0% 0%;
 54 | 
 55 | // centers the image within the background (same as "center center")
 56 | background-position: center;
 57 | 
 58 | // aligns the bottom right corner of the image with the bottom right corner of the panel (same as "100% 100%")
 59 | background-position: right bottom;
 60 | 
 61 | // the top left corner of the image is placed 10px to the right of, 40px below the top left corner of the panel
 62 | background-position: left 10px top 40px;
63 | 64 | 65 | === background-repeat === 66 | Controls if the background should be repeated in the horizontal and vertical directions.

Possible values per direction:
"repeat" - (default) Repeated in the specified direction until it fills the panel
"space" - Repeated as many times as required to fill the panel w/o being clipped. Space is added between images to to align first and last image with panel edges.
"round" - Repeated as many times as required to fill the panel w/o being clipped. The image is resized to align first and last image with panel edges.
"no-repeat" - Not repeated

Possible single values:
"repeat-x" - equals "repeat no-repeat"
"repeat-y" - equals "no-repeat repeat"

Examples:
background-repeat: repeat; // equals "repeat repeat" (default)
 67 | background-repeat: repeat space; // repeats horizontally, spaces vertically 
 68 | background-repeat: no-repeat round; // 1 column of images, scaled to fit evenly
69 | 70 | 71 | === background-size === 72 | Sets the horizontal and vertical dimensions used to draw the background image. Can be set in pixels, percent, "contains" to size down to panel dimensions or "auto" preserves the image aspect ratio. By default, set to "auto" which preveres the image's original size.

Multiple background layers can be specified in a comma separated list, which are then combined with background-image, background-position, and background-repeat values.

Examples:
background-size: auto; // same as "auto auto" (default) 
 73 | background-size: 100% 100%; // image fills the panel
 74 | background-size: 50% 75%; // image fills 50% of the panel's width, and 75% of the panel's height
 75 | background-size: 300px 200px; // image is drawn 300px wide, 200px tall
76 | 77 | 78 | === blur === 79 | Sets the amount of blur to apply to the panel and all it's children during composition. Default is no blur, for now Gaussian is the only blur type and takes a horizontal standard deviation, vertical standard deviation, and number of passes. Good std deviation values are around 0-10, if 10 is still not intense enough consider more passes, but more than one pass is bad for perf. As shorthand you can specify with just one value, which will be used for the standard deviation in both directions and 1 pass will be set.

Examples:
blur: gaussian( 2.5 );
 80 | blur: gaussian( 6, 6, 1 );
81 | 82 | 83 | === border === 84 | Shorthand for setting panel border. Specify width, style, and color. Supported styles are: solid, none.

Examples:
border: 2px solid #111111FF;
85 | 86 | 87 | === border-bottom === 88 | Shorthand for setting the bottom panel border. Specify width, style, and color. Supported styles are: solid, none.

Examples:
border-bottom: 2px solid #111111FF;
89 | 90 | 91 | === border-bottom-color === 92 | Specifies border color for the bottom edge of the panel.

Examples:
border-bottom-color: #111111FF;
93 | 94 | 95 | === border-bottom-left-radius === 96 | Specifies border-radius for bottom-left corner which rounds off border and clips background/foreground content to rounded edge. Takes 1 or 2 values in px or %, first value is horizontal radii for elliptical corner, second is vertical radii, if only one is specified then horizontal/vertical will both be set and corner will be circular.

Examples:
border-bottom-left-radius: 2px 2px;
 97 | border-bottom-left-radius: 5%;
98 | 99 | 100 | === border-bottom-right-radius === 101 | Specifies border-radius for bottom-right corner which rounds off border and clips background/foreground content to rounded edge. Takes 1 or 2 values in px or %, first value is horizontal radii for elliptical corner, second is vertical radii, if only one is specified then horizontal/vertical will both be set and corner will be circular.

Examples:
border-bottom-right-radius: 2px 2px;
102 | border-bottom-right-radius: 5%;
103 | 104 | 105 | === border-bottom-style === 106 | Specifies border style for the bottom edge of the panel.

Examples:
border-bottom-style: solid;
107 | 108 | 109 | === border-bottom-width === 110 | Specifies border width for the bottom edge of the panel.

Examples:
border-bottom-width: 2px;
111 | 112 | 113 | === border-color === 114 | Specifies border color for panel. If a single color value is set it applies to all sides, if 2 are set the first is top/bottom and the second is left/right, if all four are set then they are top, right, bottom, left in order.

Examples:
border-color: #111111FF;
115 | border-color: #FF0000FF #00FF00FF #0000FFFF #00FFFFFF;
116 | 117 | 118 | === border-left === 119 | Shorthand for setting the left panel border. Specify width, style, and color. Supported styles are: solid, none.

Examples:
border-left: 2px solid #111111FF;
120 | 121 | 122 | === border-left-color === 123 | Specifies border color for the left edge of the panel.

Examples:
border-left-color: #111111FF;
124 | 125 | 126 | === border-left-style === 127 | Specifies border style for the left edge of the panel.

Examples:
border-left-style: solid;
128 | 129 | 130 | === border-left-width === 131 | Specifies border width for the left edge of the panel.

Examples:
border-left-width: 2px;
132 | 133 | 134 | === border-radius === 135 | Shorthand to set border radius for all corners at once. Border radius rounds off corners of the panel, adjusting the border to smoothly round and also clipping background image/color and contents to the specified elliptical or circular values. In this shorthand version you may specify a single value for all raddi, or horizontal / vertical separated by the '/' character. For both horizontal and vertical you may specify 1 to 4 values in pixels or %, they will be taken in order as top-left, top-right, bottom-right, bottom-left radii values.

Examples:
// 2 px circular corners on all sides
136 | border-radius: 2px;
137 | // Perfect circular or elliptical panel (circular if box was square)
138 | border-radius: 50% / 50%;
139 | // 2 px horizontal radii 4px vertical elliptical corners on all sides
140 | border-radius: 2px / 4px;
141 | // All corners fully specified 
142 | border-radius: 2px 3px 4px 2px / 2px 3px 3px 2px;
143 | 144 | 145 | === border-right === 146 | Shorthand for setting the right panel border. Specify width, style, and color. Supported styles are: solid, none.

Examples:
border-right: 2px solid #111111FF;
147 | 148 | 149 | === border-right-color === 150 | Specifies border color for the right edge of the panel.

Examples:
border-right-color: #111111FF;
151 | 152 | 153 | === border-right-style === 154 | Specifies border style for the right edge of the panel.

Examples:
border-right-style: solid;
155 | 156 | 157 | === border-right-width === 158 | Specifies border width for the right edge of the panel.

Examples:
border-right-width: 2px;
159 | 160 | 161 | === border-style === 162 | Specifies border style for panel. If a single style value is set it applies to all sides, if 2 are set the first is top/bottom and the second is left/right, if all four are set then they are top, right, bottom, left in order.

Examples:
border-style: solid;
163 | border-style: solid none solid none;
164 | 165 | 166 | === border-top === 167 | Shorthand for setting the top panel border. Specify width, style, and color. Supported styles are: solid, none.

Examples:
border-top: 2px solid #111111FF;
168 | 169 | 170 | === border-top-color === 171 | Specifies border color for the top edge of the panel.

Examples:
border-top-color: #111111FF;
172 | 173 | 174 | === border-top-left-radius === 175 | Specifies border-radius for top-left corner which rounds off border and clips background/foreground content to rounded edge. Takes 1 or 2 values in px or %, first value is horizontal radii for elliptical corner, second is vertical radii, if only one is specified then horizontal/vertical will both be set and corner will be circular.

Examples:
border-top-left-radius: 2px 2px;
176 | border-top-left-radius: 5%;
177 | 178 | 179 | === border-top-right-radius === 180 | Specifies border-radius for top-right corner which rounds off border and clips background/foreground content to rounded edge. Takes 1 or 2 values in px or %, first value is horizontal radii for elliptical corner, second is vertical radii, if only one is specified then horizontal/vertical will both be set and corner will be circular.

Examples:
border-top-right-radius: 2px 2px;
181 | border-top-right-radius: 5%;
182 | 183 | 184 | === border-top-style === 185 | Specifies border style for the top edge of the panel.

Examples:
border-top-style: solid;
186 | 187 | 188 | === border-top-width === 189 | Specifies border width for the top edge of the panel.

Examples:
border-top-width: 2px;
190 | 191 | 192 | === border-width === 193 | Specifies border width for panel. If a single width value is set it applies to all sides, if 2 are set the first is top/bottom and the second is left/right, if all four are set then they are top, right, bottom, left in order.

Examples:
border-width: 1px;'
194 | border-width: 20px 1px 20px 1px;
195 | 196 | 197 | === box-shadow === 198 | Specifies outer shadows for boxes, or inset shadows/glows. The shadow shape will match the border box for the panel,so use border-radius to affect rounding. Syntax takes optional 'inset', optional 'fill' then color, and then horizontal offset pixels, vertical offset pixels, blur radius pixels, and spread distance in pixels. Inset means the shadow is an inner shadow/glow, fill is validonly on outer shadows and means draw the shadow behind the entire box, not clipping it to outside the border area only.

Examples:
box-shadow: #ffffff80 4px 4px 8px 0px; // outer
199 | box-shadow: fill #ffffff80 4px 4px 8px 0px; // outer, filled
200 | box-shadow: inset #333333b0 0px 0px 8px 12px; // inner
201 | 202 | 203 | === brightness === 204 | Sets the brightness that applies to the panel and all it's children during composition. The value is a multiplier on the HSB brightness value.

Example:
brightness: 1.5;
205 | 206 | 207 | === clip === 208 | Specifies a clip region within the panel, where contents will be clipped at render time. This clipping has no impact on layout, and is fast and supported for transitions/animations. Radial clip mode takes a center point, start angle and angular width of the revealed sector.

Example:
clip: rect( 10%, 90%, 90%, 10% );clip: radial( 50% %50, 0deg, 90deg );
209 | 210 | 211 | === color === 212 | Sets the foreground fill color/gradient/combination for a panel. This color is the color used to render text within the panel.

Examples:
color: #FFFFFFFF;
213 | color: gradient( linear, 0% 0%, 0% 100%, from( #cbcbcbff ), to( #a0a0a0a0 ) );
214 | 215 | 216 | === context-menu-arrow-position === 217 | Specifies where to point the arrow of a context menu at on this panel. The first value controls how the arrow is positioned horizontally when the context menu is to the top or bottom of the panel, and the second value controls how the arrow is positioned vertically when the context menu is to the left or right of the panel. Default is '50% 50%'.

Example:
context-menu-arrow-position: 25% 50%;
218 | 219 | 220 | === context-menu-body-position === 221 | Specifies where to position the body of a context menu relative to this panel. The first value controls how the body is aligned horizontally when the context menu is to the top or bottom of the panel, and the second value controls how the body is aligned vertically when the context menu is to the left or right of the panel. 0% means left/top aligned, 50% means center/middle aligned, and 100% means right/bottom aligned. Default is '0% 0%'.

Example:
context-menu-body-position: 50% 100%;
222 | 223 | 224 | === context-menu-position === 225 | Specifies where to position a context menu relative to this panel. Valid options include 'left', 'top', 'right', and 'bottom'. List up to 4 positions to determine the order that positions are tried if the context menu doesn't fully fit on screen. Default is 'right left bottom top'. If less than 4 positions are specified, the context menu first tries the opposite of the specified position along the same axis before switching to the other axis.

Examples:
context-menu-position: bottom;
226 | context-menu-position: left bottom;
227 | 228 | 229 | === contrast === 230 | Sets the contrast that applies to the panel and all it's children during composition.

Example:
contrast: 1.5;
231 | 232 | 233 | === flow-children === 234 | <Needs a description> 235 | 236 | 237 | === font === 238 | <Needs a description> 239 | 240 | 241 | === font-family === 242 | Specifies the font face to use.

Examples:
font-family: Arial;
243 | font-family: "Comic Sans MS";
244 | 245 | 246 | === font-size === 247 | Specifies the target font face height in pixels.

Example:
font-size: 12;
248 | 249 | 250 | === font-style === 251 | Specifies the font style to use. Supported values are normal, and italic

Example:
font-style: normal;
252 | 253 | 254 | === font-weight === 255 | Specifies the font weight to use. Supported values are light, thin, normal, medium, bold, and black.

Examples:
font-weight: normal;
256 | font-weight: bold;
257 | font-weight: thin;
258 | 259 | 260 | === height === 261 | Sets the height for this panel. Possible values:
"fit-children" - Panel size is set to the required size of all children (default)
<pixels> - Any fixed pixel value (ex: "100px")
<percentage> - Percentage of parent height (ex: "100%")
"fill-parent-flow( <weight> )" - Fills to remaining parent width. If multiple children are set to this value, weight is used to determine final height. For example, if three children are set to fill-parent-flow of 1.0 and the parent is 300px tall, each child will be 100px tall. (ex: "fill-parent-flow( 1.0 )" )
"width-percentage( <percentage> )" - Percentage of the panel's width, which allows you to enforce a particular aspect ratio. The width cannot also be height-percentage. 262 | 263 | 264 | === horizontal-align === 265 | <Needs a description> 266 | 267 | 268 | === hue-rotation === 269 | Sets the hue rotation to apply to the panel and all it's children during composition. Default of 0.0 means no adjustment, domain is in degrees.

Example:
hue-rotation: 180deg;
270 | 271 | 272 | === letter-spacing === 273 | Sets letter-spacing for text in a string. Possible values:
normal - no manual spacing
<pixels> - Any fixed pixel value (ex: "1px") 274 | 275 | 276 | === line-height === 277 | Specifies the line height (distance between top edge of line above and line below) to use for text. By default this is unset and a value that matches the font-size reasonably will be used automatically.

Example:
line-height: 20px;
278 | 279 | 280 | === margin === 281 | <Needs a description> 282 | 283 | 284 | === margin-bottom === 285 | <Needs a description> 286 | 287 | 288 | === margin-left === 289 | <Needs a description> 290 | 291 | 292 | === margin-right === 293 | <Needs a description> 294 | 295 | 296 | === margin-top === 297 | <Needs a description> 298 | 299 | 300 | === max-height === 301 | <Needs a description> 302 | 303 | 304 | === max-width === 305 | <Needs a description> 306 | 307 | 308 | === min-height === 309 | <Needs a description> 310 | 311 | 312 | === min-width === 313 | <Needs a description> 314 | 315 | 316 | === opacity === 317 | Sets the opacity or amount of transparency applied to the panel and all it's children during composition. Default of 1.0 means fully opaque, 0.0 means fully transparent.

Example:
opacity: 0.8;
318 | 319 | 320 | === opacity-mask === 321 | Applies an image as an opacity mask that stretches to the panel bounds and fades out it's content based on the alpha channel. The second float value is an optional opacity value for the mask itself, the image won't interpolate/cross-fade, but you can animate the opacity to fade the mask in/out. The -scroll-up, -scroll-down, and -scroll-up-down varients override the mask and apply only when the various vertical scroll scenarios affect the panel based on the overflow property.

Examples:
opacity-mask: url( "file://{images}/upper_row_mask.tga" );
322 | opacity-mask: url( "file://{images}/upper_row_mask.tga" ) 0.5;
323 | opacity-mask-scroll-up: url( "file://{images}/upper_row_mask_up.tga" ) 0.5;
324 | opacity-mask-scroll-down: url( "file://{images}/upper_row_mask_down.tga" ) 0.5;
325 | opacity-mask-scroll-up-down: url( "file://{images}/upper_row_mask_up_down.tga" ) 0.5;
326 | 327 | 328 | === opacity-mask-scroll-down === 329 | 330 | 331 | 332 | === opacity-mask-scroll-up === 333 | 334 | 335 | 336 | === opacity-mask-scroll-up-down === 337 | 338 | 339 | 340 | === overflow === 341 | Specifies what to do with contents that overflow the available space for the panel. Possible values:
"squish" - Children are squished to fit within the panel's bounds if needed (default)
"clip" - Children maintain their desired size but their contents are clipped
"scroll" - Children maintain their desired size and a scrollbar is added to this panel

Examples:
overflow: squish squish; // squishes contents in horizontal and vertical directions
342 | overflow: squish scroll; // scrolls contents in the Y direction
343 | 344 | 345 | === padding === 346 | <Needs a description> 347 | 348 | 349 | === padding-bottom === 350 | <Needs a description> 351 | 352 | 353 | === padding-left === 354 | <Needs a description> 355 | 356 | 357 | === padding-right === 358 | <Needs a description> 359 | 360 | 361 | === padding-top === 362 | <Needs a description> 363 | 364 | 365 | === perspective === 366 | Sets the perspective depth space available for children of the panel. Default of 1000 would mean that children at 1000px zpos are right at the viewers eye, -1000px are just out of view distance faded to nothing.

Example:
perspective: 1000;
367 | 368 | 369 | === perspective-origin === 370 | Sets the perspective origin which will be used when transforming children of this panel. This can be thought of as the camera x/y position relative to the panel.

Example:
perspective-origin: 50% 50%;
371 | 372 | 373 | === position === 374 | Sets the x, y, z position for a panel. Must not be in a flowing layout.

Example:
position: 3% 20px 0px;
375 | 376 | 377 | === pre-transform-rotate2d === 378 | Sets 2 dimensional rotation degrees that apply to the quad for this panel prior to 3 dimensional transforms. This rotation applies without perspective and leaves the panel centered at the same spot as it started.

Example:
pre-transform-rotate2d: 45deg;
379 | 380 | 381 | === pre-transform-scale2d === 382 | Sets 2 dimensional X/Y scale factors that apply to the quad for this panel prior to 3 dimensional transforms. This scaling applies without perspective and leaves the panel centered at the same spot as it started. Default of 1.0 means no scaling, 0.5 would be half size.

Examples:
pre-transform-scale2d: 0.8
383 | pre-transform-scale2d: 0.4, 0.6
384 | 385 | 386 | === saturation === 387 | Sets the amount of saturation to apply to the panel and all it's children during composition. Default of 1.0 means no adjustment, 0.0 means fully desaturated to gray scale, greater than 1.0 means over-saturation.

Example:
saturation: 0.4;
388 | 389 | 390 | === sound === 391 | Specifies a sound name to play when this selector is applied.

Example:
sound: "whoosh_in";
392 | 393 | 394 | === sound-out === 395 | Specifies a sound name to play when this selector is removed.

Example:
sound-out: "whoosh_out";
396 | 397 | 398 | === text-align === 399 | Specifies the text alignment for text within this panel, defaults to left.

Examples:
text-align: left;
400 | text-align: right;
401 | text-align: center;
402 | 403 | 404 | === text-decoration === 405 | Specifies the decoration for text within this panel, defaults to none. Possible values: none, underline, line-through.

Example:
text-decoration: underline;
406 | 407 | 408 | === text-overflow === 409 | Controls truncation of text that doesn't fit in a panel. "clip" means to simply truncate (on char boundaries), "ellipsis" means to end with '...', and "shrink" means to a 410 | We default to ellipsis, which is contrary to the normal CSS spec.

Examples:
text-overflow: ellipsis;
411 | text-overflow: clip;
412 | text-overflow: shrink;
413 | 
414 | 415 | 416 | === text-shadow === 417 | Specifies text shadows. The shadow shape will match the text the panel can generate,and this is only meaningful for labels. Syntax takes horizontal offset pixels, vertical offset pixels, blur radius pixels, strength, and then shadow color.

Example:
text-shadow: 2px 2px 8px 3.0 #333333b0;
418 | 419 | 420 | === text-transform === 421 | Specifies the transform for text within this panel, defaults to none. Possible values: none, uppercase, lowercase.

Example:
text-transform: uppercase;
422 | 423 | 424 | === texture-sampling === 425 | Controls texture sampling mode for the panel. Set to alpha-only to use the textures alpha data across all 3 color channels.

Examples:
texture-sampling: normal;
426 | texture-sampling: alpha-only;
427 | 428 | 429 | === tooltip-arrow-position === 430 | Specifies where to point the arrow of a tooltip at on this panel. The first value controls how the arrow is positioned horizontally when the tooltip is to the top or bottom of the panel, and the second value controls how the arrow is positioned vertically when the tooltip is to the left or right of the panel. Default is '50% 50%'.

Example:
tooltip-arrow-position: 25% 50%;
431 | 432 | 433 | === tooltip-body-position === 434 | Specifies where to position the body of a tooltip relative to this panel. The first value controls how the body is aligned horizontally when the tooltip is to the top or bottom of the panel, and the second value controls how the body is aligned vertically when the tooltip is to the left or right of the panel. 0% means left/top aligned, 50% means center/middle aligned, and 100% means right/bottom aligned. Default is '0% 0%'.

Example:
tooltip-body-position: 50% 100%;
435 | 436 | 437 | === tooltip-position === 438 | Specifies where to position a tooltip relative to this panel. Valid options include 'left', 'top', 'right', and 'bottom'. List up to 4 positions to determine the order that positions are tried if the tooltip doesn't fully fit on screen. Default is 'right left bottom top'. If less than 4 positions are specified, the tooltip first tries the opposite of the specified position along the same axis before switching to the other axis.

Examples:
tooltip-position: bottom;
439 | tooltip-position: left bottom;
440 | 441 | 442 | === transform === 443 | Sets the transforms to apply to the panel in 2d or 3d space. You can combine various transforms (comma separated) and they will be applied in order to create a 4x4 3d transform matrix. The possible operations are: translate3d( x, y, z ), translatex( x ), translatey( y ), translatez( z ), scale3d( x, y, z), rotate3d( x, y, z ), rotatex( x ), rotatey( y ), rotatez( z ).

Examples:
transform: translate3d( -100px, -100px, 0px );
444 | transform: rotateZ( -32deg ) rotateX( 30deg ) translate3d( 125px, 520px, 230px );
445 | 446 | 447 | === transform-origin === 448 | Sets the transform origin about which transforms will be applied. Default is 50% 50% on the panel so a rotation/scale is centered.

Example:
transform-origin: 50% 50%
449 | 450 | 451 | === transition === 452 | Specifies which properties should transition smoothly to new values if a class/pseudo class changes the styles. Also specifies duration, timing function, and delay. Valid timing functions are: ease, ease-in, ease-out, ease-in-out, linear.

Example:
transition: position 2.0s ease-in-out 0.0s, perspective-origin 1.2s ease-in-out 0.8s;
453 | 454 | 455 | === transition-delay === 456 | Specifies the delay in seconds to use for transition properties on this panel, if more than one comma delimited value is specified then the values are applied to each property specified in 'transition-property' in order. If only one value is specified then it applies to all the properties specified in transition-property.

Examples:
transition-delay: 0.0s;
457 | transition-delay: 0.0s, 1.2s;
458 | 459 | 460 | === transition-duration === 461 | Specifies the durating in seconds to use for transition properties on this panel, if more than one comma delimited value is specified then the values are applied to each property specified in 'transition-property' in order. If only one value is specified then it applies to all the properties specified in transition-property.

Examples:
transition-duration: 2.0s;
462 | transition-duration: 2.0s, 1.2s, 1.2s, 4.0s, 2.0s;
463 | 464 | 465 | === transition-property === 466 | Specifies which properties should transition smoothly to new values if a class/pseudo class changes the styles.

Examples:
transition: position, transform, background-color;
467 | 468 | 469 | === transition-timing-function === 470 | Specifies the timing function to use for transition properties on this panel, if more than one comma delimited value is specified then the values are applied to each property specified in 'transition-property' in order. If only one value is specified then it applies to all the properties specified in transition-property. Valid timing functions are: ease, ease-in, ease-out, ease-in-out, linear.

Examples:
transition-timing-function: ease-in-out;
471 | transition-timing-function: ease-in-out, linear;
472 | transition-timing-function: cubic-bezier( 0.785, 0.385, 0.555, 1.505 );
473 | 474 | 475 | === vertical-align === 476 | <Needs a description> 477 | 478 | 479 | === visibility === 480 | Controls if the panel is visible and is included in panel layout. Possible values:
"visible" - panel is visible and included in layout (default)
"collapse" - panel is invisible and not included in layout 481 | 482 | 483 | === wash-color === 484 | Specifies a 'wash' color, which means a color that will be blended over the panel and all it's children at composition time, tinting them. The alpha value of the color determines the intensity of the tinting.

Example:
wash-color: #39b0d325;
485 | 486 | 487 | === white-space === 488 | Controls white-space wrapping on rendered text. "normal" means wrap on whitespace, "nowrap" means do no wrapping at all.

Examples:
white-space: normal;
489 | white-space: nowrap;
490 | 491 | 492 | === width === 493 | Sets the width for this panel. Possible values:
"fit-children" - Panel size is set to the required size of all children (default)
<pixels> - Any fixed pixel value (ex: "100px")
<percentage> - Percentage of parent width (ex: "100%")
"fill-parent-flow( <weight> )" - Fills to remaining parent width. If multiple children are set to this value, weight is used to determine final width. For example, if three children are set to fill-parent-flow of 1.0 and the parent is 300px wide, each child will be 100px wide. (ex: "fill-parent-flow( 1.0 )" )
"height-percentage( <percentage> )" - Percentage of the panel's height, which allows you to enforce a particular aspect ratio. The height cannot also be width-percentage. 494 | 495 | 496 | === x === 497 | Sets the x, y, z position for a panel. Must not be in a flowing layout.

Example:
position: 3% 20px 0px;
498 | 499 | 500 | === y === 501 | Sets the x, y, z position for a panel. Must not be in a flowing layout.

Example:
position: 3% 20px 0px;
502 | 503 | 504 | === z === 505 | Sets the x, y, z position for a panel. Must not be in a flowing layout.

Example:
position: 3% 20px 0px;
506 | 507 | 508 | === z-index === 509 | Sets the z-index for a panel, panels will be sorted and painted in order within a parent panel. The sorting first sorts by the z-pos computed from position and transforms, then if panels have matching zpos zindex is used. z-index is different than z-pos in that it doesn't affect rendering perspective, just paint/hit-test ordering. The default z-index value is 0, and any floating point value is accepted.

Example:
z-index: 1;
-------------------------------------------------------------------------------- /dump/dump_panorama_events.md: -------------------------------------------------------------------------------- 1 | {| class="wikitable" 2 | ! Event 3 | ! Panel Event 4 | ! Description 5 | |- 6 | | AddStyle(string class) 7 | | Yes 8 | | Add a CSS class to a panel. 9 | |- 10 | | AddStyleToEachChild(string class) 11 | | Yes 12 | | Add a CSS class to all children of this panel. 13 | |- 14 | | AsyncEvent(float delay, event eventToFire) 15 | | No 16 | | Fire another event after a delay (in seconds). 17 | |- 18 | | DOTAHideAbilityTooltip() 19 | | Yes 20 | | Hide the ability tooltip 21 | |- 22 | | DOTAHideBuffTooltip() 23 | | Yes 24 | | Hide the buff tooltip 25 | |- 26 | | DOTAHideEconItemTooltip() 27 | | Yes 28 | | Hide the econ item tooltip. 29 | |- 30 | | DOTAHideProfileCardBattleCupTooltip() 31 | | Yes 32 | | Hide the profile card / battle cup tooltip. 33 | |- 34 | | DOTAHideProfileCardTooltip() 35 | | Yes 36 | | Hide the profile card tooltip. 37 | |- 38 | | DOTAHideTextTooltip() 39 | | Yes 40 | | Hide the text tooltip 41 | |- 42 | | DOTAHideTitleImageTextTooltip() 43 | | Yes 44 | | Hide the title image text tooltip. 45 | |- 46 | | DOTAHideTitleTextTooltip() 47 | | Yes 48 | | Hide the title text tooltip. 49 | |- 50 | | DOTAShowAbilityInventoryItemTooltip(int32 entityIndex, int32 inventorySlot) 51 | | Yes 52 | | Show tooltip for an item in the entityIndex NPC's inventory. 53 | |- 54 | | DOTAShowAbilityTooltip(string abilityName) 55 | | Yes 56 | | Show an ability tooltip. 57 | |- 58 | | DOTAShowAbilityTooltipForEntityIndex(string abilityName, int32 entityIndex) 59 | | Yes 60 | | Show an ability tooltip. Level information comes from the entity specified by the entityIndex. 61 | |- 62 | | DOTAShowAbilityTooltipForLevel(string abilityName, int32) 63 | | Yes 64 | | Show an ability tooltip for a specific level. 65 | |- 66 | | DOTAShowBuffTooltip(int32 entityIndex, int32 buffSerial, bool bOnEnemy) 67 | | Yes 68 | | Show a buff tooltip for the specified entityIndex + buff serial. 69 | |- 70 | | DOTAShowEconItemTooltip(class item_definition_index_t itemDef, class style_index_t styleIndex, int32 heroID) 71 | | Yes 72 | | Show the econ item tooltip for a given item, style, and hero. Use 0 for the default style, and -1 for the default hero. 73 | |- 74 | | DOTAShowProfileCardBattleCupTooltip(uint64 steamID) 75 | | Yes 76 | | Show the battle cup portion of the user's profile card, if it exists 77 | |- 78 | | DOTAShowProfileCardTooltip(uint64 steamID, bool useProName) 79 | | Yes 80 | | Show a user's profile card. Use pro name determines whether to use their professional team name if applicable. 81 | |- 82 | | DOTAShowTextTooltip(string text) 83 | | Yes 84 | | Show a tooltip with the given text. 85 | |- 86 | | DOTAShowTextTooltipStyled(string text, string style) 87 | | Yes 88 | | Show a tooltip with the given text. Also apply a CSS class named "style" to allow custom styling. 89 | |- 90 | | DOTAShowTitleImageTextTooltip(string title, string imagePath, string text) 91 | | Yes 92 | | Show a tooltip with the given title, image, and text. 93 | |- 94 | | DOTAShowTitleImageTextTooltipStyled(string title, string imagePath, string text, string style) 95 | | Yes 96 | | Show a tooltip with the given title, image, and text. Also apply a CSS class named "style" to allow custom styling. 97 | |- 98 | | DOTAShowTitleTextTooltip(string title, string text) 99 | | Yes 100 | | Show a tooltip with the given title and text. 101 | |- 102 | | DOTAShowTitleTextTooltipStyled(string title, string text, string style) 103 | | Yes 104 | | Show a tooltip with the given title and text. Also apply a CSS class named "style" to allow custom styling. 105 | |- 106 | | IfHasClassEvent(string class, event eventToFire) 107 | | Yes 108 | | Fire another event if this panel has a given class. 109 | |- 110 | | IfHoverOtherEvent(string otherPanelID, event eventToFire) 111 | | Yes 112 | | Fire another event if currently hovering over a panel with the given ID. 113 | |- 114 | | IfNotHasClassEvent(string class, event eventToFire) 115 | | Yes 116 | | Fire another event if this panel does not have a given class. 117 | |- 118 | | IfNotHoverOtherEvent(string otherPanelID, event eventToFire) 119 | | Yes 120 | | Fire another event if not currently hovering over a panel with the given ID. 121 | |- 122 | | MovePanelDown(int32 repeatCount) 123 | | Yes 124 | | Move down from the panel. By default, this will change the focus position, but other panel types may implement this differently. 125 | |- 126 | | MovePanelLeft(int32 repeatCount) 127 | | Yes 128 | | Move left from the panel. By default, this will change the focus position, but other panel types may implement this differently. 129 | |- 130 | | MovePanelRight(int32 repeatCount) 131 | | Yes 132 | | Move right from the panel. By default, this will change the focus position, but other panel types may implement this differently. 133 | |- 134 | | MovePanelUp(int32 repeatCount) 135 | | Yes 136 | | Move up from the panel. By default, this will change the focus position, but other panel types may implement this differently. 137 | |- 138 | | PageDown() 139 | | No 140 | | Scroll the panel down by one page. 141 | |- 142 | | PageLeft() 143 | | No 144 | | Scroll the panel left by one page. 145 | |- 146 | | PagePanelDown() 147 | | Yes 148 | | Scroll the panel down by one page. 149 | |- 150 | | PagePanelLeft() 151 | | Yes 152 | | Scroll the panel left by one page. 153 | |- 154 | | PagePanelRight() 155 | | Yes 156 | | Scroll the panel left by one page. 157 | |- 158 | | PagePanelUp() 159 | | Yes 160 | | Scroll the panel up by one page. 161 | |- 162 | | PageRight() 163 | | No 164 | | Scroll the panel right by one page. 165 | |- 166 | | PageUp() 167 | | No 168 | | Scroll the panel up by one page. 169 | |- 170 | | RemoveStyle(string class) 171 | | Yes 172 | | Remove a CSS class from a panel. 173 | |- 174 | | RemoveStyleFromEachChild(string class) 175 | | Yes 176 | | Remove a CSS class from all children of this panel. 177 | |- 178 | | ScrollDown() 179 | | No 180 | | Scroll the panel down by one line. 181 | |- 182 | | ScrollLeft() 183 | | No 184 | | Scroll the panel left by one line. 185 | |- 186 | | ScrollPanelDown() 187 | | Yes 188 | | Scroll the panel down by one line. 189 | |- 190 | | ScrollPanelLeft() 191 | | Yes 192 | | Scroll the panel left by one line. 193 | |- 194 | | ScrollPanelRight() 195 | | Yes 196 | | Scroll the panel right by one line. 197 | |- 198 | | ScrollPanelUp() 199 | | Yes 200 | | Scroll the panel up by one line. 201 | |- 202 | | ScrollRight() 203 | | No 204 | | Scroll the panel right by one line. 205 | |- 206 | | ScrollToBottom() 207 | | Yes 208 | | Scroll this panel to the bottom. 209 | |- 210 | | ScrollToTop() 211 | | Yes 212 | | Scroll this panel to the top. 213 | |- 214 | | ScrollUp() 215 | | No 216 | | Scroll the panel up by one line. 217 | |- 218 | | SetChildPanelsSelected(bool selected) 219 | | Yes 220 | | Set whether any child panels are :selected. 221 | |- 222 | | SetInputFocus() 223 | | Yes 224 | | Set focus to this panel. 225 | |- 226 | | SetPanelEnabled(bool enabled) 227 | | Yes 228 | | Sets whether the given panel is enabled 229 | |- 230 | | SetPanelSelected(bool selected) 231 | | Yes 232 | | Set whether this panel is :selected. 233 | |- 234 | | TogglePanelSelected() 235 | | Yes 236 | | Toggle whether this panel is :selected. 237 | |- 238 | | ToggleStyle(string class) 239 | | Yes 240 | | Toggle whether a panel has the given CSS class. 241 | |} -------------------------------------------------------------------------------- /examples/vscript/addon_game_mode.js: -------------------------------------------------------------------------------- 1 | require("lib.typescript"); 2 | // Link lua modifier 3 | LinkLuaModifier("modifier_panic", "modifiers/modifier_panic.lua", LuaModifierType.LUA_MODIFIER_MOTION_NONE); 4 | function Precache(context) { 5 | // Nothing to precache... 6 | } 7 | function Activate() { 8 | // Set general settings 9 | const mode = GameRules.GetGameModeEntity(); 10 | mode.SetFogOfWarDisabled(true); 11 | mode.SetCustomGameForceHero("npc_dota_hero_jakiro"); 12 | mode.SetWeatherEffectsDisabled(true); 13 | mode.SetCustomAttributeDerivedStatValue(AttributeDerivedStats.DOTA_ATTRIBUTE_AGILITY_ARMOR, 0); 14 | GameRules.SetHeroRespawnEnabled(false); 15 | // Listen for state change 16 | ListenToGameEvent("game_rules_state_change", OnStateChange, null); 17 | } 18 | function OnStateChange() { 19 | const state = GameRules.State_Get(); 20 | if (state == DOTA_GameState.DOTA_GAMERULES_STATE_PRE_GAME) { 21 | // Start game as soon as we hit the pregame 22 | StartGame(); 23 | } 24 | } 25 | function StartGame() { 26 | // Figure out who the players in the game are 27 | let players = []; 28 | for (let pID = 0; pID < DOTALimits_t.DOTA_MAX_TEAM_PLAYERS; pID++) { 29 | if (PlayerResource.IsValidPlayer(pID)) { 30 | players.push(pID); 31 | } 32 | } 33 | // Create instance of our game mode object 34 | const myGameMode = new MyGameMode(players); 35 | myGameMode.Init(); 36 | } 37 | class MyGameMode { 38 | constructor(players) { 39 | this.players = players; 40 | } 41 | Init() { 42 | // Print number of players 43 | print(`Starting game with ${this.players.length} players!`); 44 | // Listen for spawns 45 | ListenToGameEvent("npc_spawned", (event) => this.OnNpcSpawn(event), null); 46 | // Set ExecuteOrder filter 47 | GameRules.GetGameModeEntity().SetExecuteOrderFilter((ctx, order) => this.OnExecuteOrder(order), this); 48 | } 49 | OnNpcSpawn(event) { 50 | // Apply our lua modifier to the spawned unit 51 | // We can cast to npc since this is the 'npc_spawned' event 52 | const unit = EntIndexToHScript(event.entindex); 53 | unit.AddNewModifier(null, null, "modifier_panic", { duration: 8 }); 54 | } 55 | OnExecuteOrder(order) { 56 | print(order.order_type); 57 | return true; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /examples/vscript/addon_game_mode.lua: -------------------------------------------------------------------------------- 1 | --======================================================================================= 2 | -- Generated by TypescriptToLua transpiler https://github.com/Perryvw/TypescriptToLua 3 | -- Date: Wed Jan 31 2018 4 | --======================================================================================= 5 | require("lib.typescript") 6 | LinkLuaModifier("modifier_panic","modifiers/modifier_panic.lua",LUA_MODIFIER_MOTION_NONE) 7 | function Precache(context) 8 | end 9 | function Activate() 10 | local mode = GameRules.GetGameModeEntity(GameRules) 11 | mode.SetFogOfWarDisabled(mode,true) 12 | mode.SetCustomGameForceHero(mode,"npc_dota_hero_jakiro") 13 | mode.SetWeatherEffectsDisabled(mode,true) 14 | mode.SetCustomAttributeDerivedStatValue(mode,DOTA_ATTRIBUTE_AGILITY_ARMOR,0) 15 | GameRules.SetHeroRespawnEnabled(GameRules,false) 16 | ListenToGameEvent("game_rules_state_change",OnStateChange,nil) 17 | end 18 | function OnStateChange() 19 | local state = GameRules.State_Get(GameRules) 20 | if state==DOTA_GAMERULES_STATE_PRE_GAME then 21 | StartGame() 22 | end 23 | end 24 | function StartGame() 25 | local players = {} 26 | for pID=0,DOTA_MAX_TEAM_PLAYERS-1,1 do 27 | if PlayerResource.IsValidPlayer(PlayerResource,pID) then 28 | table.insert(players, pID) 29 | end 30 | end 31 | local myGameMode = MyGameMode.new(true,players) 32 | myGameMode.Init(myGameMode) 33 | end 34 | MyGameMode = MyGameMode or {} 35 | MyGameMode.__index = MyGameMode 36 | function MyGameMode.new(construct, ...) 37 | local instance = setmetatable({}, MyGameMode) 38 | if construct and MyGameMode.constructor then MyGameMode.constructor(instance, ...) end 39 | return instance 40 | end 41 | function MyGameMode.constructor(self,players) 42 | self.players=players 43 | end 44 | function MyGameMode.Init(self) 45 | print("Starting game with "..#self.players.." players!") 46 | ListenToGameEvent("npc_spawned",function(event) return self.OnNpcSpawn(self,event) end,nil) 47 | GameRules.GetGameModeEntity(GameRules).SetExecuteOrderFilter(GameRules.GetGameModeEntity(GameRules),function(ctx,order) return self.OnExecuteOrder(self,order) end,self) 48 | end 49 | function MyGameMode.OnNpcSpawn(self,event) 50 | local unit = EntIndexToHScript(event.entindex) 51 | unit.AddNewModifier(unit,nil,nil,"modifier_panic",{duration=8}) 52 | end 53 | function MyGameMode.OnExecuteOrder(self,order) 54 | print(order.order_type) 55 | return true 56 | end 57 | -------------------------------------------------------------------------------- /examples/vscript/addon_game_mode.ts: -------------------------------------------------------------------------------- 1 | require("lib.typescript"); 2 | 3 | // Link lua modifier 4 | LinkLuaModifier("modifier_panic", "modifiers/modifier_panic.lua", LuaModifierType.LUA_MODIFIER_MOTION_NONE); 5 | 6 | function Precache(context: CScriptPrecacheContext): void { 7 | // Nothing to precache... 8 | } 9 | 10 | function Activate(): void { 11 | // Set general settings 12 | const mode = GameRules.GetGameModeEntity(); 13 | mode.SetFogOfWarDisabled(true); 14 | mode.SetCustomGameForceHero("npc_dota_hero_jakiro"); 15 | mode.SetWeatherEffectsDisabled(true); 16 | mode.SetCustomAttributeDerivedStatValue(AttributeDerivedStats.DOTA_ATTRIBUTE_AGILITY_ARMOR, 0); 17 | GameRules.SetHeroRespawnEnabled(false); 18 | 19 | // Listen for state change 20 | ListenToGameEvent("game_rules_state_change", OnStateChange, null); 21 | } 22 | 23 | function OnStateChange(): void { 24 | const state = GameRules.State_Get(); 25 | 26 | if (state == DOTA_GameState.DOTA_GAMERULES_STATE_PRE_GAME) { 27 | // Start game as soon as we hit the pregame 28 | StartGame(); 29 | } 30 | } 31 | 32 | function StartGame(): void { 33 | // Figure out who the players in the game are 34 | let players: PlayerID[] = []; 35 | for (let pID = 0; pID < DOTALimits_t.DOTA_MAX_TEAM_PLAYERS; pID++) { 36 | if (PlayerResource.IsValidPlayer(pID)) { 37 | players.push(pID); 38 | } 39 | } 40 | 41 | // Create instance of our game mode object 42 | const myGameMode = new MyGameMode(players); 43 | myGameMode.Init(); 44 | } 45 | 46 | class MyGameMode { 47 | // Declare instance variables 48 | players: PlayerID[]; 49 | 50 | constructor(players: PlayerID[]) { 51 | this.players = players; 52 | } 53 | 54 | Init() { 55 | // Print number of players 56 | print(`Starting game with ${this.players.length} players!`); 57 | 58 | // Listen for spawns 59 | ListenToGameEvent("npc_spawned", (event: NpcSpawnedEvent) => this.OnNpcSpawn(event), null); 60 | 61 | // Set ExecuteOrder filter 62 | GameRules.GetGameModeEntity().SetExecuteOrderFilter((ctx, order) => this.OnExecuteOrder(order), this); 63 | } 64 | 65 | OnNpcSpawn(event: NpcSpawnedEvent) { 66 | // Apply our lua modifier to the spawned unit 67 | // We can cast to npc since this is the 'npc_spawned' event 68 | const unit = EntIndexToHScript(event.entindex) as CDOTA_BaseNPC; 69 | unit.AddNewModifier(null, null, "modifier_panic", {duration: 8}); 70 | } 71 | 72 | OnExecuteOrder(order: ExecuteOrderEvent): boolean { 73 | print(order.order_type); 74 | return true; 75 | } 76 | } -------------------------------------------------------------------------------- /examples/vscript/declarations/dota-modifier-properties.d.ts: -------------------------------------------------------------------------------- 1 | declare interface ModifierAttackEvent { 2 | attacker: CDOTA_BaseNPC; 3 | damage: number; 4 | damage_type: DAMAGE_TYPES; 5 | damage_category: DamageCategory_t; 6 | damage_flags: DOTADamageFlag_t; 7 | inflictor?: CDOTABaseAbility; 8 | original_damage: number; 9 | ranged_attack: boolean; 10 | target: CDOTA_BaseNPC; 11 | } 12 | 13 | declare interface ModifierEvent { 14 | new_pos: Vec; 15 | order_type: DotaUnitOrder_t; 16 | unit: CDOTA_BaseNPC; 17 | } 18 | 19 | declare interface ModifierAbilityEvent extends ModifierEvent { 20 | ability: CDOTABaseAbility; 21 | target?: CDOTA_BaseNPC; 22 | } 23 | 24 | /** !PureAbstract */ 25 | declare abstract class CDOTA_Modifier_Lua extends CDOTA_Buff { 26 | /** 27 | * Return a list of modifier functions this modifier implements. 28 | */ 29 | DeclareFunctions(): modifierfunction[]; 30 | 31 | /** 32 | * Return a map of enabled/disabled states. 33 | */ 34 | CheckState(): {[state: number]: boolean}; 35 | 36 | /** 37 | * True/false if this modifier is active on illusions. 38 | */ 39 | AllowIllusionDuplicate(): boolean; 40 | /** 41 | * True/false if this buff is removed when the duration expires. 42 | */ 43 | DestroyOnExpire(): boolean; 44 | /** 45 | * Return the types of attributes applied to this modifier (enum value from DOTAModifierAttribute_t 46 | */ 47 | GetAttributes(): DOTAModifierAttribute_t; 48 | /** 49 | * Returns aura stickiness 50 | */ 51 | GetAuraDuration(): number; 52 | /** 53 | * Return true/false if this entity should receive the aura under specific conditions 54 | */ 55 | GetAuraEntityReject(hEntity: CDOTA_BaseNPC): boolean; 56 | /** 57 | * Return the range around the parent this aura tries to apply its buff. 58 | */ 59 | GetAuraRadius(): number; 60 | /** 61 | * Return the unit flags this aura respects when placing buffs. 62 | */ 63 | GetAuraSearchFlags(): DOTA_UNIT_TARGET_FLAGS; 64 | /** 65 | * Return the teams this aura applies its buff to. 66 | */ 67 | GetAuraSearchTeam(): DOTA_UNIT_TARGET_TEAM; 68 | /** 69 | * Return the unit classifications this aura applies its buff to. 70 | */ 71 | GetAuraSearchType(): DOTA_UNIT_TARGET_TYPE; 72 | /** 73 | * Return the attach type of the particle system from GetEffectName. 74 | */ 75 | GetEffectAttachType(): ParticleAttachment_t; 76 | /** 77 | * Return the name of the particle system that is created while this modifier is active. 78 | */ 79 | GetEffectName(): string; 80 | /** 81 | * Return the name of the hero effect particle system that is created while this modifier is active. 82 | */ 83 | GetHeroEffectName(): string; 84 | /** 85 | * The name of the secondary modifier that will be applied by this modifier (if it is an aura). 86 | */ 87 | GetModifierAura(): string; 88 | /** 89 | * Return the priority order this modifier will be applied over others. 90 | */ 91 | GetPriority(): modifierpriority; 92 | /** 93 | * Return the name of the status effect particle system that is created while this modifier is active. 94 | */ 95 | GetStatusEffectName(): string; 96 | /** 97 | * Return the name of the buff icon to be shown for this modifier. 98 | */ 99 | GetTexture(): string; 100 | /** 101 | * Relationship of this hero effect with those from other buffs (higher is more likely to be shown). 102 | */ 103 | HeroEffectPriority(): modifierpriority; 104 | /** 105 | * True/false if this modifier is an aura. 106 | */ 107 | IsAura(): boolean; 108 | /** 109 | * True/false if this aura provides buffs when the parent is dead. 110 | */ 111 | IsAuraActiveOnDeath(): boolean; 112 | /** 113 | * True/false if this modifier should be displayed as a debuff. 114 | */ 115 | IsDebuff(): boolean; 116 | /** 117 | * True/false if this modifier should be displayed on the buff bar. 118 | */ 119 | IsHidden(): boolean; 120 | IsPermanent(): boolean; 121 | /** 122 | * True/false if this modifier can be purged. 123 | */ 124 | IsPurgable(): boolean; 125 | /** 126 | * True/false if this modifier can be purged by strong dispels. 127 | */ 128 | IsPurgeException(): boolean; 129 | /** 130 | * True/false if this modifier is considered a stun for purge reasons. 131 | */ 132 | IsStunDebuff(): boolean; 133 | /** 134 | * Runs when the modifier is created. 135 | */ 136 | OnCreated(params: table): void; 137 | /** 138 | * Runs when the modifier is destroyed (after unit loses modifier). 139 | */ 140 | OnDestroy(): void; 141 | /** 142 | * Runs when the think interval occurs. 143 | */ 144 | OnIntervalThink(): void; 145 | /** 146 | * Runs when the modifier is refreshed. 147 | */ 148 | OnRefresh(params: table): void; 149 | /** 150 | * Runs when the modifier is destroyed (before unit loses modifier). 151 | */ 152 | OnRemoved(): void; 153 | /** 154 | * Runs when stack count changes (param is old count). 155 | */ 156 | OnStackCountChanged(iStackCount: number): void; 157 | /** 158 | * True/false if this modifier is removed when the parent dies. 159 | */ 160 | RemoveOnDeath(): boolean; 161 | /** 162 | * Apply the overhead offset to the attached effect. 163 | */ 164 | ShouldUseOverheadOffset(): boolean; 165 | /** 166 | * Relationship of this status effect with those from other buffs (higher is more likely to be shown). 167 | */ 168 | StatusEffectPriority(): modifierpriority; 169 | 170 | //========== Modifier properties ================= 171 | 172 | /** 173 | * Bonus damag (Green numbers) 174 | */ 175 | GetModifierPreAttack_BonusDamage(): number; 176 | /** 177 | * 178 | */ 179 | GetModifierPreAttack_BonusDamage_Proc(): number; 180 | /** 181 | * Bonus damage not factoring in with crit 182 | */ 183 | GetModifierPreAttack_BonusDamagePostCrit(event: ModifierAttackEvent): number; 184 | /** 185 | * Changes base damage 186 | */ 187 | GetModifierBaseAttack_BonusDamage(): number; 188 | /** 189 | * Add bonus physical damage 190 | */ 191 | GetModifierProcAttack_BonusDamage_Physical(event: ModifierAttackEvent): number; 192 | /** 193 | * Add bonus magical damage 194 | */ 195 | GetModifierProcAttack_BonusDamage_Magical(event: ModifierAttackEvent): number; 196 | /** 197 | * Add bonus pure damage 198 | */ 199 | GetModifierProcAttack_BonusDamage_Pure(event: ModifierAttackEvent): number; 200 | 201 | GetModifierProcAttack_Feedback(event: ModifierAttackEvent): number; 202 | // Not working 203 | //GetModifierOverrideAttackDamage(): number; 204 | 205 | GetModifierPreAttack(event: ModifierAttackEvent): number; 206 | /** 207 | * Makes the hero transparent( Use a value from 0 to 1) 208 | */ 209 | GetModifierInvisibilityLevel(): number; 210 | GetModifierPersistentInvisibility(): number; 211 | GetModifierMoveSpeedBonus_Constant(): number; 212 | GetModifierMoveSpeedOverride(): number; 213 | GetModifierMoveSpeedBonus_Percentage(): number; 214 | GetModifierMoveSpeedBonus_Percentage_Unique(): number; 215 | GetModifierMoveSpeedBonus_Percentage_Unique_2(): number; 216 | GetModifierMoveSpeedBonus_Special_Boots(): number; 217 | GetModifierMoveSpeedBonus_Special_Boots_2(): number; 218 | GetModifierMoveSpeed_Absolute(): number; 219 | GetModifierMoveSpeed_AbsoluteMin(): number; 220 | GetModifierMoveSpeed_Limit(): number; 221 | GetModifierMoveSpeed_Max(): number; 222 | GetModifierAttackSpeedBaseOverride(): number; 223 | GetModifierFixedAttackRate(): number; 224 | GetModifierAttackSpeedBonus_Constant(): number; 225 | GetModifierCooldownReduction_Constant(event: ModifierAbilityEvent): number; 226 | GetModifierBaseAttackTimeConstant(): number; 227 | GetModifierAttackPointConstant(): number; 228 | GetModifierDamageOutgoing_Percentage(event: ModifierAttackEvent): number; 229 | GetModifierDamageOutgoing_Percentage_Illusion(event: ModifierAttackEvent): number; 230 | GetModifierTotalDamageOutgoing_Percentage(event: ModifierAttackEvent): number; 231 | GetModifierSpellAmplify_Percentage(event: ModifierAttackEvent): number; 232 | // Not working 233 | GetModifierSpellAmplify_PercentageUnique(): number; 234 | GetModifierHPRegenAmplify_Percentage(): number; 235 | GetModifierMPRegenAmplify_Percentage(): number; 236 | // Not working 237 | GetModifierMagicDamageOutgoing_Percentage(event: ModifierAttackEvent): number; 238 | GetModifierBaseDamageOutgoing_Percentage(event: ModifierAttackEvent): number; 239 | // Not working 240 | GetModifierBaseDamageOutgoing_PercentageUnique(event: ModifierAttackEvent): number; 241 | GetModifierIncomingDamage_Percentage(event: ModifierAttackEvent): number; 242 | GetModifierIncomingPhysicalDamage_Percentage(event: ModifierAttackEvent): number; 243 | // Not working 244 | GetModifierIncomingPhysicalDamageConstant(event: ModifierAttackEvent): number; 245 | GetModifierIncomingSpellDamageConstant(event: ModifierAttackEvent): number; 246 | GetModifierEvasion_Constant(event: ModifierAttackEvent): number; 247 | // Not working 248 | GetModifierNegativeEvasion_Constant(): number; 249 | // Not working 250 | GetModifierStatusResistance(): number; 251 | // Not working 252 | GetModifierStatusResistanceStacking(): number; 253 | GetModifierAvoidDamage(event: ModifierAttackEvent): number; 254 | GetModifierAvoidSpell(event: ModifierAttackEvent): 0|1; 255 | GetModifierMiss_Percentage(): number; 256 | GetModifierPhysicalArmorBonus(event: ModifierAttackEvent): number; 257 | GetModifierPhysicalArmorBonusUnique(event: ModifierAttackEvent): number; 258 | GetModifierPhysicalArmorBonusUniqueActive(event: ModifierAttackEvent): number; 259 | // Not working 260 | GetModifierIgnorePhysicalArmor(event: ModifierAttackEvent): number; 261 | // Not working 262 | GetModifierMagicalResistanceDirectModification(event: ModifierAttackEvent): number; 263 | GetModifierMagicalResistanceBonus(event: ModifierAttackEvent): number; 264 | GetModifierMagicalResistanceDecrepifyUnique(event: ModifierAttackEvent): number; 265 | GetModifierBaseRegen(): number; 266 | GetModifierConstantManaRegen(): number; 267 | GetModifierConstantManaRegenUnique(): number; 268 | GetModifierTotalPercentageManaRegen(): number; 269 | GetModifierConstantHealthRegen(): number; 270 | GetModifierHealthRegenPercentage(): number; 271 | // Not working 272 | GetModifierHealthRegenPercentageUnique(): number; 273 | GetModifierHealthBonus(): number; 274 | GetModifierManaBonus(): number; 275 | GetModifierExtraStrengthBonus(): number; 276 | GetModifierExtraHealthBonus(): number; 277 | GetModifierExtraManaBonus(): number; 278 | GetModifierExtraHealthPercentage(): number; 279 | GetModifierBonusStats_Strength(): number; 280 | GetModifierBonusStats_Agility(): number; 281 | GetModifierBonusStats_Intellect(): number; 282 | GetModifierCastRangeBonus(event: ModifierAbilityEvent): number; 283 | // Not working 284 | GetModifierCastRangeBonusTarget(event: ModifierAbilityEvent): number; 285 | GetModifierCastRangeBonusStacking(event: ModifierAbilityEvent): number; 286 | // Not working 287 | GetModifierAttackRangeOverride(): number; 288 | GetModifierAttackRangeBonus(): number; 289 | // Not working 290 | GetModifierAttackRangeBonusUnique(): number; 291 | // Not working 292 | GetModifierMaxAttackRange(): number; 293 | GetModifierProjectileSpeedBonus(): number; 294 | GetModifierProjectileName(): string; 295 | ReincarnateTime(): number; 296 | GetModifierConstantRespawnTime(): number; 297 | GetModifierPercentageRespawnTime(): number; 298 | GetModifierStackingRespawnTime(): number; 299 | GetModifierPercentageCooldown(event: ModifierAbilityEvent): number; 300 | GetModifierPercentageCooldownStacking(event: ModifierAbilityEvent): number; 301 | GetModifierPercentageCasttime(event: ModifierAbilityEvent): number; 302 | GetModifierPercentageManacost(event: ModifierAbilityEvent): number; 303 | // Not working 304 | GetModifierPercentageManacostStacking(): number; 305 | GetModifierConstantDeathGoldCost(): number; 306 | GetModifierPercentageExpRateBoost(): number; 307 | GetModifierPreAttack_CriticalStrike(event: ModifierAttackEvent): number; 308 | // Not working 309 | GetModifierPreAttack_Target_CriticalStrike(): number; 310 | // Not working 311 | GetModifierMagical_ConstantBlock(event: ModifierAttackEvent): number; 312 | GetModifierPhysical_ConstantBlock(event: ModifierAttackEvent): number; 313 | // Not working 314 | GetModifierPhysical_ConstantBlockSpecial(): number; 315 | GetModifierPhysical_ConstantBlockUnavoidablePreArmor(event: ModifierAttackEvent): number; 316 | GetModifierTotal_ConstantBlock(event: ModifierAttackEvent): number; 317 | GetOverrideAnimation(): GameActivity_t; 318 | GetOverrideAnimationWeight(): number; 319 | GetOverrideAnimationRate(): number; 320 | GetAbsorbSpell(event: ModifierAbilityEvent): 0|1; 321 | GetReflectSpell(event: ModifierAbilityEvent): 0|1; 322 | GetDisableAutoAttack(): 0|1; 323 | GetBonusDayVision(): number; 324 | GetBonusNightVision(): number; 325 | // Not working 326 | GetBonusNightVisionUnique(): number; 327 | GetBonusVisionPercentage(): number; 328 | GetFixedDayVision(): number; 329 | GetFixedNightVision(): number; 330 | GetMinHealth(): number; 331 | GetAbsoluteNoDamagePhysical(event: ModifierAttackEvent): 0|1; 332 | GetAbsoluteNoDamageMagical(event: ModifierAttackEvent): 0|1; 333 | GetAbsoluteNoDamagePure(event: ModifierAttackEvent): 0|1; 334 | GetIsIllusion(): 0|1; 335 | GetModifierIllusionLabel(): 0|1; 336 | GetModifierSuperIllusion(): 0|1; 337 | GetModifierSuperIllusionWithUltimate(): 0|1; 338 | GetModifierTurnRate_Percentage(): number; 339 | GetDisableHealing(): 0|1; 340 | // Not working 341 | GetAlwaysAllowAttack(): 0|1; 342 | /** 343 | * 0 deal damage like usual; 1 no damage at all 344 | */ 345 | GetOverrideAttackMagical(): 0|1; 346 | // Not working 347 | GetModifierUnitStatsNeedsRefresh(): 0|1; 348 | /** 349 | * Untested on lane creeps; did not work on beastmaster creeps 350 | */ 351 | GetModifierBountyCreepMultiplier(): number; 352 | // Not working 353 | GetModifierBountyOtherMultiplier(): number; 354 | /** 355 | * Untested 356 | */ 357 | GetModifierUnitDisllowUpgrading(): 0|1; 358 | // Not working 359 | GetModifierDodgeProjectile(): 0|1; 360 | // Not working 361 | OnSpellTargetReady(): void; 362 | OnAttackRecord(event: ModifierAttackEvent): void; 363 | OnAttackStart(event: ModifierAttackEvent): void; 364 | OnAttack(event: ModifierAttackEvent): void; 365 | OnAttackLanded(event: ModifierAttackEvent): void; 366 | OnAttackFail(event: ModifierAttackEvent): void; 367 | OnProjectileDodge(event: ModifierAttackEvent): void; 368 | OnOrder(event: ModifierEvent): void; 369 | OnUnitMoved(event: ModifierEvent): void; 370 | OnAbilityStart(event: ModifierAbilityEvent): void; 371 | OnAbilityExecuted(event: ModifierAbilityEvent): void; 372 | OnAbilityFullyCast(event: ModifierAbilityEvent): void; 373 | // Not working 374 | OnBreakInvisibility(): void; 375 | OnAbilityEndChannel(event: ModifierAbilityEvent): void; 376 | OnTakeDamage(event: ModifierAttackEvent): void; 377 | OnStateChanged(event: ModifierEvent): void; 378 | OnAttacked(event: ModifierAttackEvent): void; 379 | OnDeath(event: ModifierAttackEvent): void; 380 | OnRespawn(event: ModifierEvent): void; 381 | OnSpentMana(event: ModifierAbilityEvent): void; 382 | OnTeleporting(event: ModifierEvent): void; 383 | OnTeleported(event: ModifierEvent): void; 384 | OnSetLocation(event: ModifierEvent): void; 385 | OnHealthGained(event: ModifierEvent): void; 386 | OnManaGained(event: ModifierEvent): void; 387 | OnTakeDamageKillCredit(event: ModifierAttackEvent): void; 388 | OnHeroKilled(event: ModifierAttackEvent): void; 389 | OnHealReceived(event: ModifierEvent): void; 390 | OnBuildingKilled(event: ModifierAttackEvent): void; 391 | OnModelChanged(event: ModifierEvent): void; 392 | //Not working 393 | OnModifierAdded(): void; 394 | GetModifierModelChange(): string; 395 | GetModifierModelScale(): number; 396 | /** 397 | * Always applies scepter when this property is active 398 | */ 399 | GetModifierScepter(): void; 400 | GetActivityTranslationModifiers(): string; 401 | GetAttackSound(): string; 402 | GetUnitLifetimeFraction(): number; 403 | GetModifierProvidesFOWVision(): 0|1; 404 | GetModifierSpellsRequireHP(): number; 405 | // ?? 406 | GetForceDrawOnMinimap(): 0|1; 407 | GetModifierDisableTurning(): 0|1; 408 | // Not working 409 | GetModifierIgnoreCastAngle(): 0|1; 410 | // ?? 411 | GetModifierChangeAbilityValue(): void; 412 | GetModifierAbilityLayout(): number; 413 | // Not working 414 | OnDominated(event: ModifierEvent): void; 415 | OnAttackFinished(event: ModifierAttackEvent): void; 416 | // Not working 417 | GetModifierIgnoreCooldown(): 0|1; 418 | // Not working 419 | GetModifierCanAttackTrees(): 0|1; 420 | } 421 | 422 | -------------------------------------------------------------------------------- /examples/vscript/declarations/dota-std.d.ts: -------------------------------------------------------------------------------- 1 | declare function print(...messages: any[]): void; 2 | declare function require(module: string): any; -------------------------------------------------------------------------------- /examples/vscript/lib/lib-typescript.d.ts: -------------------------------------------------------------------------------- 1 | declare class Set { 2 | constructor(other?: Set); 3 | add(item: T): void; 4 | contains(item: T): boolean; 5 | remove(item: T): boolean; 6 | items(): T[]; 7 | count(): number; 8 | 9 | //forEach((item: T) => U): U[]; 10 | } 11 | 12 | declare class Map { 13 | constructor(other?: Map); 14 | put(key: S, value: T): void; 15 | remove(key: S): boolean; 16 | get(key: S): T; 17 | containsKey(key: S): boolean; 18 | keys(): S[]; 19 | values(): T[]; 20 | items(): {key: S, value: T}[]; 21 | count(): number; 22 | } -------------------------------------------------------------------------------- /examples/vscript/lib/typescript.lua: -------------------------------------------------------------------------------- 1 | -- Ternary operator 2 | function TS_ITE(condition, v1f, v2f) 3 | if condition then 4 | return v1f() 5 | else 6 | return v2f() 7 | end 8 | end 9 | 10 | function TS_forEach(list, func) 11 | for k, v in ipairs(list) do 12 | func(v, k, list) 13 | end 14 | end 15 | 16 | function TS_map(list, func) 17 | local out = {} 18 | for _, v in ipairs(list) do 19 | table.insert(out, func(v)) 20 | end 21 | return out 22 | end 23 | 24 | function TS_filter(list, func) 25 | local out = {} 26 | for _, v in ipairs(list) do 27 | if func(v) then 28 | table.insert(out, v) 29 | end 30 | end 31 | return out 32 | end 33 | 34 | function TS_some(list, func) 35 | return #TS_filter(list, func) > 0 36 | end 37 | 38 | function TS_every(list, func) 39 | return #list == #TS_filter(list, func) 40 | end 41 | 42 | -- Set data structure implementation 43 | Set = Set or {} 44 | Set.__index = Set 45 | function Set.new(construct, ...) 46 | local instance = setmetatable({}, Set) 47 | Set.constructor(instance, ...) 48 | return instance 49 | end 50 | function Set.constructor(self, other) 51 | self._items = {} 52 | if other then 53 | for a, _ in pairs(other) do 54 | self._items[a] = true 55 | end 56 | end 57 | end 58 | function Set.add(self, item) self._items[item] = true end 59 | function Set.contains(self, item) return self._items[item] ~= nil end 60 | function Set.remove(self, item) 61 | local contains = Set.contains(self, item) 62 | self._items[item] = nil 63 | return contains 64 | end 65 | function Set.items(self) 66 | local out = {} 67 | for item, _ in pairs(self._items) do 68 | table.insert(out, item) 69 | end 70 | return out 71 | end 72 | function Set.count(self) 73 | local count = 0 74 | for item, _ in pairs(self._items) do 75 | count = count + 1 76 | end 77 | return count 78 | end 79 | 80 | -- Set data structure implementation 81 | Map = Map or {} 82 | Map.__index = Map 83 | function Map.new(construct, ...) 84 | local instance = setmetatable({}, Map) 85 | Map.constructor(instance, ...) 86 | return instance 87 | end 88 | function Map.constructor(self, other) 89 | self._items = {} 90 | if other then 91 | for k, v in pairs(other) do 92 | self._items[k] = v 93 | end 94 | end 95 | end 96 | function Map.put(self, key, value) self._items[key] = value end 97 | function Map.containsKey(self, key) return self._items[key] ~= nil end 98 | function Map.remove(self, key) 99 | local contains = self.containsKey(self, key) 100 | self._items[key] = nil 101 | return contains 102 | end 103 | function Map.get(self, key) return self._items[key] end 104 | function Map.keys(self) 105 | local out = {} 106 | for k, v in pairs(self._items) do 107 | table.insert(out, k) 108 | end 109 | return out 110 | end 111 | function Map.values(self) 112 | local out = {} 113 | for k, v in pairs(self._items) do 114 | table.insert(out, v) 115 | end 116 | return out 117 | end 118 | function Map.items(self) 119 | local out = {} 120 | for k, v in pairs(self._items) do 121 | table.insert(out, {key=k, value=v}) 122 | end 123 | return out 124 | end 125 | function Map.count(self) 126 | local count = 0 127 | for k, v in pairs(self._items) do 128 | count = count + 1 129 | end 130 | return count 131 | end 132 | -------------------------------------------------------------------------------- /examples/vscript/modifiers/modifier_panic.js: -------------------------------------------------------------------------------- 1 | class modifier_panic extends CDOTA_Modifier_Lua { 2 | // Set state 3 | CheckState() { 4 | return { 5 | [modifierstate.MODIFIER_STATE_COMMAND_RESTRICTED]: true 6 | }; 7 | } 8 | // Declare functions 9 | DeclareFunctions() { 10 | return [ 11 | modifierfunction.MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE 12 | ]; 13 | } 14 | GetModifierMoveSpeed_Absolute() { return 540; } 15 | // Run when modifier instance is created 16 | OnCreated(params) { 17 | // Think every second 18 | this.StartIntervalThink(0.3); 19 | } 20 | // Called when intervalThink is triggered 21 | OnIntervalThink() { 22 | const parent = this.GetParent(); 23 | // Check if parent is not too far from origin 24 | if (parent.GetAbsOrigin().Length2D() < 500) { 25 | parent.MoveToPosition(parent.GetAbsOrigin() + RandomVector(400)); 26 | } 27 | else { 28 | // Otherwise redirect in the direction of the origin 29 | parent.MoveToPosition(RandomVector(300)); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /examples/vscript/modifiers/modifier_panic.lua: -------------------------------------------------------------------------------- 1 | --======================================================================================= 2 | -- Generated by TypescriptToLua transpiler https://github.com/Perryvw/TypescriptToLua 3 | -- Date: Tue Jan 30 2018 4 | --======================================================================================= 5 | modifier_panic = modifier_panic or {} 6 | modifier_panic.__index = modifier_panic 7 | function modifier_panic.new(construct, ...) 8 | local instance = setmetatable({}, modifier_panic) 9 | if construct and modifier_panic.constructor then modifier_panic.constructor(instance, ...) end 10 | return instance 11 | end 12 | function modifier_panic.CheckState(self) 13 | return {[MODIFIER_STATE_COMMAND_RESTRICTED]=true} 14 | end 15 | function modifier_panic.DeclareFunctions(self) 16 | return {MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE} 17 | end 18 | function modifier_panic.GetModifierMoveSpeed_Absolute(self) 19 | return 540 20 | end 21 | function modifier_panic.OnCreated(self,params) 22 | self.StartIntervalThink(self,0.3) 23 | end 24 | function modifier_panic.OnIntervalThink(self) 25 | local parent = self.GetParent(self) 26 | if parent.GetAbsOrigin(parent).Length2D(parent.GetAbsOrigin(parent))<500 then 27 | parent.MoveToPosition(parent,parent.GetAbsOrigin(parent)+RandomVector(400)) 28 | else 29 | parent.MoveToPosition(parent,RandomVector(300)) 30 | end 31 | end 32 | -------------------------------------------------------------------------------- /examples/vscript/modifiers/modifier_panic.ts: -------------------------------------------------------------------------------- 1 | class modifier_panic extends CDOTA_Modifier_Lua { 2 | // Set state 3 | CheckState(): {[state: number]: boolean} { 4 | return { 5 | [modifierstate.MODIFIER_STATE_COMMAND_RESTRICTED] : true 6 | }; 7 | } 8 | 9 | // Declare functions 10 | DeclareFunctions(): modifierfunction[] { 11 | return [ 12 | modifierfunction.MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE 13 | ]; 14 | } 15 | 16 | GetModifierMoveSpeed_Absolute(): number { return 540; } 17 | 18 | // Run when modifier instance is created 19 | OnCreated(params: table): void { 20 | // Think every second 21 | this.StartIntervalThink(0.3); 22 | } 23 | 24 | // Called when intervalThink is triggered 25 | OnIntervalThink(): void { 26 | const parent = this.GetParent(); 27 | 28 | // Check if parent is not too far from origin 29 | if (parent.GetAbsOrigin().Length2D() < 500) { 30 | parent.MoveToPosition(parent.GetAbsOrigin() + RandomVector(400)); 31 | } else { 32 | // Otherwise redirect in the direction of the origin 33 | parent.MoveToPosition(RandomVector(300)); 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /examples/vscript/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "noImplicitAny" : true, 4 | "noImplicitThis" : true, 5 | "alwaysStrict" : true, 6 | "strictNullChecks" : true, 7 | "target": "lua", 8 | }, 9 | } -------------------------------------------------------------------------------- /gen/DefinitionGenerator.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import re 3 | 4 | ##TODO Make this pull from stdin or from command paramaters 5 | input = """ 6 | """ 7 | 8 | conversion = { 9 | "integer" : "number", 10 | "float" : "number", 11 | "cstring" : "string", 12 | "boolean" : "boolean", 13 | "js_array" : "error[]", 14 | "js_object" : "error[]", 15 | "js_value" : "error", 16 | "unsigned" : "error", #WTF 17 | "int64" : "error", 18 | "float64" : "error", 19 | "js_raw_args" : "error", 20 | "void" : "void" 21 | } 22 | 23 | regex = re.compile("^(?P\w+) (?P\w+)\.(?P\w+)\((?P[^)]+?)?\)(?P.*)", re.MULTILINE) 24 | for match in regex.finditer(input): 25 | info = match.groupdict() 26 | print(" /**") 27 | print(" * " + info["comment"]) 28 | print(" */") 29 | arg = info["args"] 30 | arguments = "" 31 | if arg: 32 | args = arg.split(",") 33 | for argument in args: 34 | innerArg = argument.split(" ") 35 | arguments = arguments + innerArg[2] + ": " + conversion[innerArg[1]] + ", " 36 | arguments = arguments[:-2] 37 | returnType = conversion[info["return"]] 38 | print(" {function}({arg}): {returnType};".format(arg=arguments, returnType=returnType, **info)) 39 | print("") -------------------------------------------------------------------------------- /gen/enumdump.js: -------------------------------------------------------------------------------- 1 | function repeat(pattern, count) { 2 | if (count < 1) 3 | return ''; 4 | var result = ''; 5 | while (count > 1) { 6 | if (count & 1) 7 | result += pattern; 8 | count >>= 1, pattern += pattern; 9 | } 10 | return result + pattern; 11 | } 12 | function altDump(object) { 13 | $.Msg(`/* 14 | Typescript definition file of the DotA 2 Panorama API. 15 | 16 | This file contains information on the enums. This file can be used 17 | just as reference, or when writing Typescript to compile into Panorama JS. 18 | 19 | To use this file with typescript for Panorama, install typescript and put this file at the project root. 20 | 21 | Any javascript compiled from this typescript should be Panorama-compatible and run in Panorama. 22 | Issues or bugs in the definitions can be reported by making an issue on GitHub: 23 | https://github.com/ModDota/API. 24 | */`); 25 | $.Msg(""); 26 | for (var v in object) { 27 | if (typeof object[v] == "object") { 28 | let i = 0; 29 | for (let w in object[v]) { 30 | if (typeof (object[v][w]) != "function") { 31 | i++; 32 | } 33 | } 34 | if (i > 0) { 35 | $.Msg("declare enum " + v + " {"); 36 | for (let w in object[v]) { 37 | /*if (i-- == 1) { 38 | $.Msg("Last entry test"); 39 | }*/ 40 | if (typeof (object[v][w]) != "function") { 41 | $.Msg(" " + w + " = " + ("" + object[v][w]) + ((i-- == 1) ? "" : ",")); 42 | } 43 | } 44 | $.Msg("}"); 45 | $.Msg(""); 46 | } 47 | } 48 | } 49 | } 50 | altDump(this); 51 | -------------------------------------------------------------------------------- /gen/enumdump.ts: -------------------------------------------------------------------------------- 1 | function repeat(pattern, count) { 2 | if (count < 1) return ''; 3 | var result = ''; 4 | while (count > 1) { 5 | if (count & 1) result += pattern; 6 | count >>= 1, pattern += pattern; 7 | } 8 | return result + pattern; 9 | } 10 | function altDump(object: Object) { 11 | $.Msg(`/* 12 | Typescript definition file of the DotA 2 Panorama API. 13 | 14 | This file contains information on the enums. This file can be used 15 | just as reference, or when writing Typescript to compile into Panorama JS. 16 | 17 | To use this file with typescript for Panorama, install typescript and put this file at the project root. 18 | 19 | Any javascript compiled from this typescript should be Panorama-compatible and run in Panorama. 20 | Issues or bugs in the definitions can be reported by making an issue on GitHub: 21 | https://github.com/ModDota/API. 22 | */`); 23 | $.Msg(""); 24 | for (var v in object) { 25 | if(typeof object[v] == "object") { 26 | let i = 0; 27 | for (let w in object[v]) { 28 | if (typeof(object[v][w]) != "function") { 29 | i++; 30 | } 31 | } 32 | if (i > 0) { 33 | $.Msg("declare enum " + v + " {"); 34 | for (let w in object[v]) { 35 | /*if (i-- == 1) { 36 | $.Msg("Last entry test"); 37 | }*/ 38 | if (typeof(object[v][w]) != "function") { 39 | $.Msg(" " + w + " = " + (""+object[v][w]) + ((i-- == 1) ? "" : ",")); 40 | } 41 | } 42 | $.Msg("}"); 43 | $.Msg(""); 44 | } 45 | } 46 | } 47 | } 48 | altDump(this); -------------------------------------------------------------------------------- /gen/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": true, 3 | "compilerOptions": { 4 | "target": "es3" 5 | } 6 | } -------------------------------------------------------------------------------- /images/bg_hr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ModDota/API/570fff43db9165e24a745cc511a9f3562d8f30a8/images/bg_hr.png -------------------------------------------------------------------------------- /images/blacktocat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ModDota/API/570fff43db9165e24a745cc511a9f3562d8f30a8/images/blacktocat.png -------------------------------------------------------------------------------- /images/icon_download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ModDota/API/570fff43db9165e24a745cc511a9f3562d8f30a8/images/icon_download.png -------------------------------------------------------------------------------- /images/sprite_download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ModDota/API/570fff43db9165e24a745cc511a9f3562d8f30a8/images/sprite_download.png -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: home 3 | --- -------------------------------------------------------------------------------- /javascripts/main.js: -------------------------------------------------------------------------------- 1 | console.log('This would be the main JS file.'); 2 | -------------------------------------------------------------------------------- /lua_bots.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Lua (Bots) 4 | permalink: /lua_bots/ 5 | --- 6 | 7 | * TOC 8 | {:toc} 9 | 10 | {% for server_class in site.data.lua_bots %} 11 | ## {{ server_class[0] }} 12 | {% if server_class[1] contains "extends" %}*extends **{{server_class[1].extends}}*** {% endif %} 13 | 14 | #### {{server_class[1].description}} 15 | {% for function in server_class[1].functions %} 16 | * {{function[0]}}( 17 | {% if function[1] contains "args" %}{%for arg in function[1].args %}{% if function[1] contains "arg_names" %}*{{arg}}* {{function[1].arg_names[forloop.index0]}}{% else %}{{arg}}{% endif %}{% if forloop.last != true %}, {% endif %}{% endfor %}{% endif %} ) : {{function[1].return | default: "void"}} 18 | {% if function[1] contains "description" %} * {{function[1].description}}{% endif %} 19 | {% endfor %} 20 | {% endfor %} -------------------------------------------------------------------------------- /lua_bots_docs.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | permalink: /lua_bots/docs 4 | --- 5 | ```lua 6 | {%- assign override = site.data.override_lua_bots %} 7 | {% for server_class in site.data.lua_bots %} 8 | {% if server_class[0] != "Global" %} 9 | --- @class {{ server_class[0] }} {% if server_class[1] contains "extends" %} : {{server_class[1].extends}}{% endif %} 10 | --- {{server_class[1].description}} 11 | {% endif %} 12 | {% for function in server_class[1].functions %} 13 | {%- assign function_override = nil %} 14 | {%- if override contains server_class[0] %} 15 | {%- for override_class in override %} 16 | {%- if override_class[0] != server_class[0] %}{% continue %}{% endif %} 17 | {%- if override_class[1].functions contains function[0] %} 18 | {%- for override_function in override_class[1].functions %} 19 | {%- if override_function[0] != function[0] %}{% continue %}{% endif %} 20 | {%- assign function_override = override_function[1] %} 21 | {%- break %} 22 | {%- endfor %} 23 | {%- endif %} 24 | {%- break %} 25 | {%- endfor %} 26 | {%- endif %} 27 | --- {% if function[1] contains "description" %}{{function[1].description}}{% endif %}{%- if function[1] contains "args" %} 28 | {%- for arg in function[1].args %} 29 | {%- assign arg_index = forloop.index0 %} 30 | {%- assign var_type = arg %} 31 | {%- if function[1] contains "arg_names" %} 32 | {%- assign var_name = function[1].arg_names[forloop.index0] %} 33 | {%- else %} 34 | {%- capture var_name %}{{var_type}}_{{forloop.index}}{%- endcapture %} 35 | {%- endif %} 36 | {%- if function_override %} 37 | {%- if function_override contains "args" %} 38 | {%- assign var_type = function_override.args[arg_index] %} 39 | {%- endif %} 40 | {%- if function_override contains "arg_names" %} 41 | {%- assign var_name = function_override.arg_names[arg_index] %} 42 | {%- else if (function[1] contains "arg_names") == false %} 43 | {%- capture var_name %}{{var_type}}_{{arg_index | increment}}{%- endcapture %} 44 | {%- endif %} 45 | {%- endif %} 46 | --- @param {{var_name}} {{var_type}} 47 | {%- endfor %} 48 | {%- endif %} 49 | {%- if function_override contains "return" %} 50 | --- @return {{function_override.return}} 51 | {%- else %} 52 | --- @return {{function[1].return | default: "void"}} 53 | {%- endif %} 54 | function {% if server_class[0] != "Global" %}{{server_class[0]}}:{% endif %}{{function[0]}}({%- if function[1] contains "args" %} 55 | {%- for arg in function[1].args %} 56 | {%- assign arg_index = forloop.index0 %} 57 | {%- assign var_type = arg %} 58 | {%- if function[1] contains "arg_names" %} 59 | {%- assign var_name = function[1].arg_names[forloop.index0] %} 60 | {%- else %} 61 | {%- capture var_name %}{{var_type}}_{{forloop.index}}{%- endcapture %} 62 | {%- endif %} 63 | {%- if function_override %} 64 | {%- if function_override contains "args" %} 65 | {%- assign var_type = function_override.args[arg_index] %} 66 | {%- endif %} 67 | {%- if function_override contains "arg_names" %} 68 | {%- assign var_name = function_override.arg_names[arg_index] %} 69 | {%- else if (function[1] contains "arg_names") == false %} 70 | {%- capture var_name %}{{var_type}}_{{arg_index | increment}}{%- endcapture %} 71 | {%- endif %} 72 | {%- endif %} 73 | {{-var_name-}} 74 | {%- if forloop.last != true %}, {% endif %} 75 | {%- endfor %} 76 | {%- endif %}) 77 | end 78 | {% endfor %} 79 | {% endfor %} 80 | ``` -------------------------------------------------------------------------------- /lua_bots_enums.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Lua Enums (Bots) 4 | permalink: /lua_bots_enums/ 5 | --- 6 | 7 | * TOC 8 | {:toc} 9 | 10 | {% for enum_class in site.data.lua_bots_enums %} 11 | # {{ enum_class[0] }} 12 | {% for enum_field in enum_class[1] %} 13 | * {{enum_field["key"] | escape}} = {{enum_field["value"] | append: '' | escape}} 14 | {% if enum_field contains "description"%} 15 | * {{enum_field["description"] | escape}} 16 | {% endif %} 17 | {% endfor %} 18 | {% endfor %} -------------------------------------------------------------------------------- /lua_server.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Lua (Server) 4 | permalink: /lua_server/ 5 | --- 6 | 7 | * TOC 8 | {:toc} 9 | 10 | {% for server_class in site.data.lua_server %} 11 | ## {{ server_class[0] }} 12 | {% if server_class[1] contains "extends" %}*extends **{{server_class[1].extends}}*** {% endif %} 13 | 14 | {% for function in server_class[1].functions %} 15 | * {{function[0]}}( 16 | {% if function[1] contains "args" %}{%for arg in function[1].args %}{% if function[1] contains "arg_names" %}*{{arg}}* {{function[1].arg_names[forloop.index0]}}{% else %}{{arg}}{% endif %}{% if forloop.last != true %}, {% endif %}{% endfor %}{% endif %} ) : {{function[1].return | default: "void"}} 17 | {% if function[1] contains "description" %} * {{function[1].description}}{% endif %} 18 | {% endfor %} 19 | {% endfor %} -------------------------------------------------------------------------------- /lua_server_declaration.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | permalink: /lua_server/declaration 4 | --- 5 | ```ts 6 | {%- assign override = site.data.override_lua_server %} 7 | {%- for server_class in site.data.lua_server %} 8 | {%- if server_class[0] != "Global" %} 9 | interface {{ server_class[0] }}{% if server_class[1] contains "extends" %} extends {{server_class[1].extends}}{% endif %} { 10 | {%- endif %} 11 | {% for function in server_class[1].functions %} 12 | {%- assign function_override = nil %} 13 | {%- if override contains server_class[0] %} 14 | {%- for override_class in override %} 15 | {%- if override_class[0] != server_class[0] %}{% continue %}{% endif %} 16 | {%- if override_class[1].functions contains function[0] %} 17 | {%- for override_function in override_class[1].functions %} 18 | {%- if override_function[0] != function[0] %}{% continue %}{% endif %} 19 | {%- assign function_override = override_function[1] %} 20 | {%- break %} 21 | {%- endfor %} 22 | {%- endif %} 23 | {%- break %} 24 | {%- endfor %} 25 | {%- endif %} 26 | {%- assign return_type = nil %} 27 | {%- if function_override contains "return" %} 28 | {%- assign return_type = function_override.return %} 29 | {%- else %} 30 | {%- capture return_type %}{{function[1].return | default: "nil"}}{%- endcapture %} 31 | {%- endif %} 32 | 33 | {%- if return_type == "int" %} 34 | {%- assign return_type = "number" %} 35 | {%- endif %} 36 | {%- if return_type == "float" %} 37 | {%- assign return_type = "number" %} 38 | {%- endif %} 39 | {%- if return_type == "bool" %} 40 | {%- assign return_type = "boolean" %} 41 | {%- endif %} 42 | {%- if return_type == "cstring" %} 43 | {%- assign return_type = "string" %} 44 | {%- endif %} 45 | {%- if return_type == "variant" %} 46 | {%- assign return_type = "any" %} 47 | {%- endif %} 48 | {%- if return_type == "" %} 49 | {%- assign return_type = "any" %} 50 | {%- endif %} 51 | /** 52 | * {% if function[1] contains "description" %}{{function[1].description}}{% endif %}{%- if function[1] contains "args" %} 53 | {%- for arg in function[1].args %} 54 | {%- assign arg_index = forloop.index0 %} 55 | {%- assign var_type = arg %} 56 | {%- if function_override contains "args" %} 57 | {%- assign var_type = function_override.args[arg_index] %} 58 | {%- endif %} 59 | 60 | {%- if var_type == "int" %} 61 | {%- assign var_type = "number" %} 62 | {%- endif %} 63 | {%- if var_type == "float" %} 64 | {%- assign var_type = "number" %} 65 | {%- endif %} 66 | {%- if var_type == "bool" %} 67 | {%- assign var_type = "boolean" %} 68 | {%- endif %} 69 | {%- if var_type == "cstring" %} 70 | {%- assign var_type = "string" %} 71 | {%- endif %} 72 | {%- if var_type == "variant" %} 73 | {%- assign var_type = "any" %} 74 | {%- endif %} 75 | {%- if var_type == "" %} 76 | {%- assign var_type = "any" %} 77 | {%- endif %} 78 | 79 | {%- if function[1] contains "arg_names" %} 80 | {%- assign var_name = function[1].arg_names[forloop.index0] %} 81 | {%- else %} 82 | {%- capture var_name %}{{var_type}}_{{forloop.index}}{%- endcapture %} 83 | {%- endif %} 84 | {%- if function_override contains "arg_names" %} 85 | {%- assign var_name = function_override.arg_names[arg_index] %} 86 | {%- endif %} 87 | {%- if function_override contains "arg_desc" %} 88 | * @param {{var_name}} {{function_override.arg_names[arg_index]}} 89 | {%- endif %} 90 | {%- endfor %} 91 | {%- endif %} 92 | */ 93 | {{function[0]}}({%- if function[1] contains "args" %} 94 | {%- for arg in function[1].args %} 95 | {%- assign arg_index = forloop.index0 %} 96 | {%- assign var_type = arg %} 97 | {%- if function_override contains "args" %} 98 | {%- assign var_type = function_override.args[arg_index] %} 99 | {%- endif %} 100 | 101 | {%- if var_type == "int" %} 102 | {%- assign var_type = "number" %} 103 | {%- endif %} 104 | {%- if var_type == "float" %} 105 | {%- assign var_type = "number" %} 106 | {%- endif %} 107 | {%- if var_type == "bool" %} 108 | {%- assign var_type = "boolean" %} 109 | {%- endif %} 110 | {%- if var_type == "cstring" %} 111 | {%- assign var_type = "string" %} 112 | {%- endif %} 113 | {%- if var_type == "variant" %} 114 | {%- assign var_type = "any" %} 115 | {%- endif %} 116 | {%- if var_type == "" %} 117 | {%- assign var_type = "any" %} 118 | {%- endif %} 119 | 120 | {%- if function[1] contains "arg_names" %} 121 | {%- assign var_name = function[1].arg_names[forloop.index0] %} 122 | {%- else %} 123 | {%- capture var_name %}{{var_type}}_{{forloop.index}}{%- endcapture %} 124 | {%- endif %} 125 | {%- if function_override contains "arg_names" %} 126 | {%- assign var_name = function_override.arg_names[arg_index] %} 127 | {%- endif %} 128 | {{-var_name-}}:{{-var_type-}} 129 | {%- if forloop.last != true %}, {% endif %} 130 | {%- endfor %} 131 | {%- endif %}) : {{return_type}}; 132 | {% endfor %} 133 | } 134 | {%- if server_class[1] contains "instance" %} 135 | declare var {{ server_class[1].instance }} : {{ server_class[0] }}; 136 | {%- endif %} 137 | {% endfor %} 138 | 139 | /** 140 | * A lua-based modifier. 141 | * modifierfunction specifc methods are not typed, sorry in advance 142 | */ 143 | interface CDOTA_Modifier_Lua extends CDOTA_Buff { 144 | 145 | CheckState() : void; 146 | 147 | DeclareFunctions() : modifierfunction[]; 148 | 149 | {%- for enum_class in site.data.lua_server_enums %} 150 | {%- if enum_class[0] == "modifierfunction" %} 151 | {% for enum_field in enum_class[1] %} 152 | {%- if enum_field contains "description" %} 153 | {{enum_field["description"] | escape}}(keys:Object?) : any; 154 | {%- endif %} 155 | {%- endfor %} 156 | {%- endif %} 157 | {%- endfor %} 158 | } 159 | ``` 160 | -------------------------------------------------------------------------------- /lua_server_docs.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | permalink: /lua_server/docs 4 | --- 5 | ```lua 6 | {%- assign override = site.data.override_lua_server %} 7 | {% for server_class in site.data.lua_server %} 8 | {% if server_class[0] != "Global" %} 9 | --- @class {{ server_class[0] }} {% if server_class[1] contains "extends" %} : {{server_class[1].extends}}{% endif %} 10 | {{ server_class[0] }} = {} 11 | {% endif %} 12 | {%- if server_class[1] contains "instance" %} 13 | --- @type {{ server_class[0] }} 14 | {{ server_class[1].instance }} = {} 15 | {%- endif %} 16 | {% for function in server_class[1].functions %} 17 | {%- assign function_override = nil %} 18 | {%- if override contains server_class[0] %} 19 | {%- for override_class in override %} 20 | {%- if override_class[0] != server_class[0] %}{% continue %}{% endif %} 21 | {%- if override_class[1].functions contains function[0] %} 22 | {%- for override_function in override_class[1].functions %} 23 | {%- if override_function[0] != function[0] %}{% continue %}{% endif %} 24 | {%- assign function_override = override_function[1] %} 25 | {%- break %} 26 | {%- endfor %} 27 | {%- endif %} 28 | {%- break %} 29 | {%- endfor %} 30 | {%- endif %} 31 | {%- assign return_type = nil %} 32 | {%- if function_override contains "return" %} 33 | {%- assign return_type = function_override.return %} 34 | {%- else %} 35 | {%- capture return_type %}{{function[1].return | default: "nil"}}{%- endcapture %} 36 | {%- endif %} 37 | 38 | {%- if return_type == "int" %} 39 | {%- assign return_type = "number" %} 40 | {%- endif %} 41 | {%- if return_type == "float" %} 42 | {%- assign return_type = "number" %} 43 | {%- endif %} 44 | {%- if return_type == "bool" %} 45 | {%- assign return_type = "boolean" %} 46 | {%- endif %} 47 | {%- if return_type == "cstring" %} 48 | {%- assign return_type = "string" %} 49 | {%- endif %} 50 | {%- if return_type == "variant" %} 51 | {%- assign return_type = "any" %} 52 | {%- endif %} 53 | {%- if return_type == "" %} 54 | {%- assign return_type = "any" %} 55 | {%- endif %} 56 | {%- if return_type == "void" %} 57 | {%- assign return_type = "nil" %} 58 | {%- endif %} 59 | --- {% if function[1] contains "description" %}{{function[1].description}}{% endif %}{%- if function[1] contains "args" %} 60 | {%- for arg in function[1].args %} 61 | {%- assign arg_index = forloop.index0 %} 62 | {%- assign var_type = arg %} 63 | {%- if function_override contains "args" %} 64 | {%- assign var_type = function_override.args[arg_index] %} 65 | {%- endif %} 66 | 67 | {%- if var_type == "int" %} 68 | {%- assign var_type = "number" %} 69 | {%- endif %} 70 | {%- if var_type == "float" %} 71 | {%- assign var_type = "number" %} 72 | {%- endif %} 73 | {%- if var_type == "bool" %} 74 | {%- assign var_type = "boolean" %} 75 | {%- endif %} 76 | {%- if var_type == "cstring" %} 77 | {%- assign var_type = "string" %} 78 | {%- endif %} 79 | {%- if var_type == "variant" %} 80 | {%- assign var_type = "any" %} 81 | {%- endif %} 82 | {%- if var_type == "" %} 83 | {%- assign var_type = "any" %} 84 | {%- endif %} 85 | 86 | {%- if function[1] contains "arg_names" %} 87 | {%- assign var_name = function[1].arg_names[forloop.index0] %} 88 | {%- else %} 89 | {%- capture var_name %}{{var_type}}_{{forloop.index}}{%- endcapture %} 90 | {%- endif %} 91 | {%- if function_override contains "arg_names" %} 92 | {%- assign var_name = function_override.arg_names[arg_index] %} 93 | {%- endif %} 94 | --- @param {{var_name}} {{var_type | replace:'?',' | nil'}} 95 | {%- endfor %} 96 | {%- endif %} 97 | --- @return {{return_type | replace:'?',' | nil'}} 98 | function {% if server_class[0] != "Global" %}{{server_class[0]}}:{% endif %}{{function[0]}}({%- if function[1] contains "args" %} 99 | {%- for arg in function[1].args %} 100 | {%- assign arg_index = forloop.index0 %} 101 | {%- assign var_type = arg %} 102 | {%- if function_override contains "args" %} 103 | {%- assign var_type = function_override.args[arg_index] %} 104 | {%- endif %} 105 | 106 | {%- if var_type == "int" %} 107 | {%- assign var_type = "number" %} 108 | {%- endif %} 109 | {%- if var_type == "float" %} 110 | {%- assign var_type = "number" %} 111 | {%- endif %} 112 | {%- if var_type == "bool" %} 113 | {%- assign var_type = "boolean" %} 114 | {%- endif %} 115 | {%- if var_type == "cstring" %} 116 | {%- assign var_type = "string" %} 117 | {%- endif %} 118 | {%- if var_type == "variant" %} 119 | {%- assign var_type = "any" %} 120 | {%- endif %} 121 | {%- if var_type == "" %} 122 | {%- assign var_type = "any" %} 123 | {%- endif %} 124 | 125 | {%- if function[1] contains "arg_names" %} 126 | {%- assign var_name = function[1].arg_names[forloop.index0] %} 127 | {%- else %} 128 | {%- capture var_name %}{{var_type}}_{{forloop.index}}{%- endcapture %} 129 | {%- endif %} 130 | {%- if function_override contains "arg_names" %} 131 | {%- assign var_name = function_override.arg_names[arg_index] %} 132 | {%- endif %} 133 | {{-var_name-}} 134 | {%- if forloop.last != true %}, {% endif %} 135 | {%- endfor %} 136 | {%- endif %}) 137 | end 138 | {% endfor %} 139 | {% endfor %} 140 | 141 | --- @return table 142 | function CDOTA_Modifier_Lua:CheckState() 143 | end 144 | 145 | --- @return modifierfunction[] 146 | function CDOTA_Modifier_Lua:DeclareFunctions() 147 | end 148 | 149 | {%- for enum_class in site.data.lua_server_enums %} 150 | {%- if enum_class[0] == "modifierfunction" %} 151 | {% for enum_field in enum_class[1] %} 152 | {%- if enum_field contains "description" %} 153 | function CDOTA_Modifier_Lua:{{enum_field["description"] | escape}}() 154 | end 155 | {%- endif %} 156 | {%- endfor %} 157 | {%- endif %} 158 | {%- endfor %} 159 | ``` 160 | -------------------------------------------------------------------------------- /lua_server_editor.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 14 | 15 | 16 | 17 |
18 |
19 |
20 |

Total {{ getTotalCount() }}

21 | 22 |
23 | 24 | 25 | 26 | 30 | 31 | 35 | 36 | 37 | 38 | 39 |
40 |
41 | 42 |
43 |
44 |

class {{ scope }}

45 | 46 |
47 |
48 | function {{ function }} 49 | * 50 | -> 51 | 52 |
53 | 54 | {{ functionElements.description }} 55 | 56 |
57 |
58 |
59 |
60 | 61 | 62 |
, 63 |
64 |
65 |
66 | 67 |
68 |
69 |
70 |
71 | 72 | 371 | 372 | 373 | -------------------------------------------------------------------------------- /lua_server_enums.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Lua Enums (Server) 4 | permalink: /lua_server_enums/ 5 | --- 6 | 7 | * TOC 8 | {:toc} 9 | 10 | {% for enum_class in site.data.lua_server_enums %} 11 | # {{ enum_class[0] }} 12 | {% for enum_field in enum_class[1] %} 13 | * {{enum_field["key"] | escape}} = {{enum_field["value"] | append: '' | escape}} 14 | {% if enum_field contains "description"%} 15 | * {{enum_field["description"] | escape}} 16 | {% endif %} 17 | {% endfor %} 18 | {% endfor %} -------------------------------------------------------------------------------- /lua_server_enums_declaration.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | permalink: /lua_server_enums/declatation 4 | --- 5 | 6 | ```lua 7 | {%- for enum_class in site.data.lua_server_enums %} 8 | {%- if enum_class[0] != "_Unscoped" %} 9 | @CompileMembersOnly 10 | declare enum {{enum_class[0] | escape}} { 11 | {%- endif %} 12 | {%- for enum_field in enum_class[1] %} 13 | {%- assign found = nil %} 14 | {%- if enum_class[0] == "_Unscoped" %} 15 | {%- for test_enum_class in site.data.lua_server_enums %} 16 | {%- if test_enum_class[0] == "_Unscoped" %} 17 | {%- continue %} 18 | {%- endif %} 19 | {%- for test_enum_field in test_enum_class[1] %} 20 | {%- if test_enum_field["key"] == enum_field["key"] %} 21 | {%- assign found = true %} 22 | {%- endif %} 23 | {%- endfor %} 24 | {%- endfor %} 25 | {%- endif %} 26 | {%- if found == true %} 27 | {%- continue %} 28 | {%- endif %} 29 | {%- capture enum_key_upper %}{{enum_field["key"] | upcase}}{% endcapture %} 30 | {%- if enum_key_upper == enum_field["key"] %} 31 | {%- if enum_field contains "description" %} 32 | /** 33 | * {{enum_field["description"] | escape}} 34 | */ 35 | {%- endif %} 36 | {%- assign prefix = " " %} 37 | {%- assign suffix = "" %} 38 | {%- if enum_class[0] == "_Unscoped" %} 39 | {%- assign prefix = "declare var " %} 40 | {%- assign suffix = ";" %} 41 | {%- else %} 42 | {%- if forloop.last == false %} 43 | {%- assign suffix = "," %} 44 | {%- endif %} 45 | {%- endif %} 46 | {{prefix}}{{enum_field["key"] | escape}} = {{enum_field["value"] | append: '' | escape}}{{suffix}} 47 | {%- endif %} 48 | {%- endfor %} 49 | {%- if enum_class[0] != "_Unscoped" %} 50 | } 51 | {% endif %} 52 | {%- endfor %} 53 | ``` 54 | -------------------------------------------------------------------------------- /lua_server_enums_docs.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | permalink: /lua_server_enums/docs 4 | --- 5 | 6 | ```lua 7 | {%- for enum_class in site.data.lua_server_enums %} 8 | {% for enum_field in enum_class[1] %} 9 | {%- assign found = nil %} 10 | {%- if enum_class[0] == "_Unscoped" %} 11 | {%- for test_enum_class in site.data.lua_server_enums %} 12 | {%- if test_enum_class[0] == "_Unscoped" %} 13 | {%- continue %} 14 | {%- endif %} 15 | {%- for test_enum_field in test_enum_class[1] %} 16 | {%- if test_enum_field["key"] == enum_field["key"] %} 17 | {%- assign found = true %} 18 | {%- endif %} 19 | {%- endfor %} 20 | {%- endfor %} 21 | {%- endif %} 22 | {%- if found == true %} 23 | {%- continue %} 24 | {%- endif %} 25 | {%- capture enum_key_upper %}{{enum_field["key"] | upcase}}{% endcapture %} 26 | {%- if enum_key_upper == enum_field["key"] %} 27 | {%- if enum_field contains "description" %} 28 | --- {{enum_field["description"] | escape}} 29 | {%- endif %} 30 | {%- unless enum_class[0] == "_Unscoped" %} 31 | --- @type {{enum_class[0] | escape}} 32 | {%- endunless %} 33 | {{enum_field["key"] | escape}} = {{enum_field["value"] | append: '' | escape}} 34 | {%- endif %} 35 | {%- endfor %} 36 | {%- endfor %} 37 | ``` 38 | -------------------------------------------------------------------------------- /override_validate/override_validate.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | const override_lua_server_json_1 = require("../_data/override_lua_server.json"); 4 | const lua_server_json_1 = require("../_data/lua_server.json"); 5 | const lua_server_enums_json_1 = require("../_data/lua_server_enums.json"); 6 | const primitives = [ 7 | "cstring", 8 | "int", 9 | "float", 10 | "bool", 11 | "vector", 12 | "void" 13 | ]; 14 | const ReturnIDs = [ 15 | "CCustomGameEventListener", 16 | "PlayerID", 17 | "ParticleID", 18 | "EventListenerID", 19 | "ProjectileID", 20 | "CProjectileID" // EWW 21 | ]; 22 | const numbers = [ 23 | "float", 24 | "int", 25 | "uint", 26 | "number" // Probably an error later down the track? 27 | ]; 28 | function typeCompare(overrideType, baseType, className, funcName, argIndex) { 29 | if (overrideType.endsWith("!")) { 30 | console.warn(ValidationWarning(`${baseType} has been forceably casted to ${overrideType.slice(0, -1)}.`, className, funcName, argIndex)); 31 | return true; 32 | } 33 | switch (baseType.toLowerCase()) { 34 | case "": 35 | case "table": 36 | // not manually casting is considered a failure 37 | if (overrideType === baseType) { 38 | console.warn(ValidationWarning(`${baseType} should be casted to something more meaningful.`, className, funcName, argIndex)); 39 | } 40 | return true; 41 | case "int": 42 | case "uint": 43 | case "float": 44 | if (numbers.indexOf(overrideType) !== -1 && overrideType !== baseType) { 45 | console.warn(ValidationWarning(`${baseType} shouldn't be converted to ${overrideType}.`, className, funcName, argIndex)); 46 | return true; 47 | } 48 | return overrideType === baseType || Object.keys(lua_server_enums_json_1.default).indexOf(overrideType) !== -1 || ReturnIDs.indexOf(overrideType) !== -1; 49 | case "cstring": 50 | if (overrideType === "string") { 51 | console.warn(ValidationWarning(`${baseType} shouldn't be converted to ${overrideType}.`, className, funcName, argIndex)); 52 | return true; 53 | } 54 | case "uint64": 55 | case "bool": 56 | case "vector": 57 | case "qangle": 58 | case "void": 59 | return overrideType === baseType; 60 | case "handle": 61 | if (overrideType === baseType || overrideType === "table" || overrideType === "function") { 62 | console.warn(ValidationWarning(`${baseType} should be casted to something more meaningful.`, className, funcName, argIndex)); 63 | return true; 64 | } 65 | return overrideType.startsWith("fun(") || Object.keys(lua_server_json_1.default).indexOf(overrideType.replace("?", "").replace(" | nil", "")) !== -1; 66 | default: 67 | return false; 68 | } 69 | } 70 | const fails = []; 71 | let questions = 0; 72 | let nils = 0; 73 | const ValidationMessage = (message, className, funcName, argIndex) => { 74 | let argMsg = ""; 75 | if (argIndex !== undefined) { 76 | argMsg = ` arg ${argIndex}`; 77 | } 78 | if (argIndex === "return") { 79 | argMsg = " return"; 80 | } 81 | return `[${className}.${funcName || ""}${argMsg}] - ${message}`; 82 | }; 83 | const ValidationWarning = (message, className, funcName, argIndex) => "WARNING: " + ValidationMessage(message, className, funcName, argIndex); 84 | const ValidationError = (message, className, funcName, argIndex) => "ERROR: " + ValidationMessage(message, className, funcName, argIndex); 85 | function check(condidition, msg, className, funcName, argIndex) { 86 | if (!condidition) { 87 | fails.push(ValidationError(msg, className, funcName, argIndex)); 88 | } 89 | return condidition; 90 | } 91 | for (const className of Object.keys(override_lua_server_json_1.default)) { 92 | check(className in lua_server_json_1.default, "Overriding a class that doesn't exist", className); 93 | const baseClass = lua_server_json_1.default[className]; 94 | const overrideClass = override_lua_server_json_1.default[className]; 95 | // You might not be overriding functions 96 | if (typeof override_lua_server_json_1.default[className].functions === "object") { 97 | for (const funcName of Object.keys(override_lua_server_json_1.default[className].functions)) { 98 | check(funcName in baseClass.functions, "Overriding a function that doesn't exist", className, funcName); 99 | const baseFunc = baseClass.functions[funcName]; 100 | const overrideFunc = overrideClass.functions[funcName]; 101 | if (overrideFunc.return) { 102 | check(typeCompare(overrideFunc.return, baseFunc.return, className, funcName, "return"), `Overriden return is not compatible, expected ${baseFunc.return} but got ${overrideFunc.return}`, className, funcName, "return"); 103 | } 104 | if (check(baseFunc.args.length === overrideFunc.args.length, `Overriden args should have same length, expected ${baseFunc.args.length} but got ${overrideFunc.args.length}`, className, funcName)) { 105 | if (overrideFunc.arg_names && baseFunc.arg_names) { 106 | check(baseFunc.arg_names.length === overrideFunc.arg_names.length, `Overriden arg names should have same length, expected ${baseFunc.arg_names.length} but got ${overrideFunc.arg_names.length}`, className, funcName); 107 | } 108 | for (let i in baseFunc.args) { 109 | if (overrideFunc.args[i].endsWith("?")) { 110 | questions++; 111 | } 112 | if (overrideFunc.args[i].endsWith(" | nil")) { 113 | nils++; 114 | } 115 | let argName = i; 116 | if (baseFunc.arg_names) { 117 | argName = `"${baseFunc.arg_names[i]}"`; 118 | } 119 | if (overrideFunc.arg_names) { 120 | argName = `\`${overrideFunc.arg_names[i]}\``; 121 | } 122 | check(typeCompare(overrideFunc.args[i], baseFunc.args[i], className, funcName, argName), `Overriden argument type not compatible, expected ${baseFunc.args[i]} but got ${overrideFunc.args[i]}`, className, funcName, argName); 123 | } 124 | } 125 | } 126 | } 127 | } 128 | for (let fail of fails) { 129 | console.error(fail.toString()); 130 | } 131 | console.table({ questions, nils }); 132 | process.exit(fails.length === 0 ? 0 : 1); 133 | -------------------------------------------------------------------------------- /override_validate/override_validate.ts: -------------------------------------------------------------------------------- 1 | import assert = require("assert"); 2 | 3 | import override_server from "../_data/override_lua_server.json"; 4 | import lua_server from "../_data/lua_server.json"; 5 | import lua_server_enums from "../_data/lua_server_enums.json"; 6 | 7 | const primitives = [ 8 | "cstring", 9 | "int", 10 | "float", 11 | "bool", 12 | "vector", 13 | "void" 14 | ]; 15 | 16 | const ReturnIDs = [ 17 | "CCustomGameEventListener", // EWW 18 | "PlayerID", 19 | "ParticleID", 20 | "EventListenerID", 21 | "ProjectileID", 22 | "CProjectileID" // EWW 23 | ]; 24 | const numbers = [ 25 | "float", 26 | "int", 27 | "uint", 28 | "number" // Probably an error later down the track? 29 | ] 30 | function typeCompare(overrideType: string, baseType: string, className: string, funcName: string, argIndex?: string) { 31 | if (overrideType.endsWith("!")) { 32 | console.warn(ValidationWarning(`${baseType} has been forceably casted to ${overrideType.slice(0, -1)}.`, className, funcName, argIndex)); 33 | return true; 34 | } 35 | switch(baseType.toLowerCase()) { 36 | case "": 37 | case "table": 38 | // not manually casting is considered a failure 39 | if (overrideType === baseType) { 40 | console.warn(ValidationWarning(`${baseType} should be casted to something more meaningful.`, className, funcName, argIndex)); 41 | } 42 | return true; 43 | case "int": 44 | case "uint": 45 | case "float": 46 | if (numbers.indexOf(overrideType) !== -1 && overrideType !== baseType) { 47 | console.warn(ValidationWarning(`${baseType} shouldn't be converted to ${overrideType}.`, className, funcName, argIndex)); 48 | return true; 49 | } 50 | return overrideType === baseType || Object.keys(lua_server_enums).indexOf(overrideType) !== -1 || ReturnIDs.indexOf(overrideType) !== -1; 51 | case "cstring": 52 | if (overrideType === "string") { 53 | console.warn(ValidationWarning(`${baseType} shouldn't be converted to ${overrideType}.`, className, funcName, argIndex)); 54 | return true; 55 | } 56 | case "uint64": 57 | case "bool": 58 | case "vector": 59 | case "qangle": 60 | case "void": 61 | return overrideType === baseType; 62 | case "handle": 63 | if (overrideType === baseType || overrideType === "table" || overrideType === "function") { 64 | console.warn(ValidationWarning(`${baseType} should be casted to something more meaningful.`, className, funcName, argIndex)); 65 | return true; 66 | } 67 | return overrideType.startsWith("fun(") || Object.keys(lua_server).indexOf(overrideType.replace("?", "").replace(" | nil", "")) !== -1; 68 | default: 69 | return false; 70 | } 71 | } 72 | 73 | const fails = []; 74 | let questions = 0; 75 | let nils = 0; 76 | const ValidationMessage = (message: string, className: string, funcName?: string, argIndex?: string) => { 77 | let argMsg = ""; 78 | if (argIndex !== undefined) { 79 | argMsg = ` arg ${argIndex}`; 80 | } 81 | if (argIndex === "return") { 82 | argMsg = " return"; 83 | } 84 | return `[${className}.${funcName || ""}${argMsg}] - ${message}`; 85 | } 86 | const ValidationWarning = (message: string, className: string, funcName?: string, argIndex?: string) => "WARNING: " + ValidationMessage(message, className, funcName, argIndex); 87 | const ValidationError = (message: string, className: string, funcName?: string, argIndex?: string) => "ERROR: " + ValidationMessage(message, className, funcName, argIndex); 88 | 89 | function check(condidition: boolean, msg: string, className: string, funcName?: string, argIndex?: string) : boolean { 90 | if (!condidition) { 91 | fails.push(ValidationError(msg, className, funcName, argIndex)); 92 | } 93 | return condidition; 94 | } 95 | for (const className of Object.keys(override_server)) { 96 | check(className in lua_server, "Overriding a class that doesn't exist", className); 97 | const baseClass = lua_server[className]; 98 | const overrideClass = override_server[className]; 99 | 100 | // You might not be overriding functions 101 | if (typeof override_server[className].functions === "object") { 102 | for (const funcName of Object.keys(override_server[className].functions)) { 103 | check(funcName in baseClass.functions, "Overriding a function that doesn't exist", className, funcName); 104 | const baseFunc = baseClass.functions[funcName]; 105 | const overrideFunc = overrideClass.functions[funcName]; 106 | if (overrideFunc.return) { 107 | check(typeCompare(overrideFunc.return, baseFunc.return, className, funcName, "return"), `Overriden return is not compatible, expected ${baseFunc.return} but got ${overrideFunc.return}`, className, funcName, "return"); 108 | } 109 | 110 | if (check(baseFunc.args.length === overrideFunc.args.length, `Overriden args should have same length, expected ${baseFunc.args.length} but got ${overrideFunc.args.length}`, className, funcName)) { 111 | if (overrideFunc.arg_names && baseFunc.arg_names) { 112 | check(baseFunc.arg_names.length === overrideFunc.arg_names.length, `Overriden arg names should have same length, expected ${baseFunc.arg_names.length} but got ${overrideFunc.arg_names.length}`, className, funcName); 113 | } 114 | for (let i in baseFunc.args) { 115 | if ((overrideFunc.args[i] as string).endsWith("?")) { 116 | questions++; 117 | } 118 | if ((overrideFunc.args[i] as string).endsWith(" | nil")) { 119 | nils++; 120 | } 121 | let argName = i; 122 | if (baseFunc.arg_names) { 123 | argName = `"${baseFunc.arg_names[i]}"`; 124 | } 125 | if (overrideFunc.arg_names) { 126 | argName = `\`${overrideFunc.arg_names[i]}\``; 127 | } 128 | check(typeCompare(overrideFunc.args[i], baseFunc.args[i], className, funcName, argName), `Overriden argument type not compatible, expected ${baseFunc.args[i]} but got ${overrideFunc.args[i]}`, className, funcName, argName); 129 | } 130 | } 131 | } 132 | } 133 | } 134 | 135 | for (let fail of fails) { 136 | console.error(fail.toString()); 137 | } 138 | console.table({questions, nils}); 139 | process.exit(fails.length === 0 ? 0 : 1); 140 | -------------------------------------------------------------------------------- /override_validate/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "license": "MIT", 3 | "private": true, 4 | "scripts": { 5 | "test": "ts-node-dev override_validate.ts", 6 | "start-dev": "ts-node-dev override_validate.ts" 7 | }, 8 | "devDependencies": { 9 | "@types/node": "^11.10.4", 10 | "ts-node-dev": "^1.0.0-pre.44", 11 | "typescript": "^3.3.3333" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /override_validate/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "jsx": "preserve", 6 | "moduleResolution": "node", 7 | "resolveJsonModule": true, 8 | "esModuleInterop": true, 9 | "outDir": "build/" 10 | }, 11 | "exclude": [ 12 | "node_modules", 13 | "**/node_modules/*" 14 | ] 15 | } -------------------------------------------------------------------------------- /override_validate/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/node@^11.10.4": 6 | version "11.10.4" 7 | resolved "https://registry.yarnpkg.com/@types/node/-/node-11.10.4.tgz#3f5fc4f0f322805f009e00ab35a2ff3d6b778e42" 8 | integrity sha512-wa09itaLE8L705aXd8F80jnFpxz3Y1/KRHfKsYL2bPc0XF+wEWu8sR9n5bmeu8Ba1N9z2GRNzm/YdHcghLkLKg== 9 | 10 | "@types/strip-bom@^3.0.0": 11 | version "3.0.0" 12 | resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" 13 | integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= 14 | 15 | "@types/strip-json-comments@0.0.30": 16 | version "0.0.30" 17 | resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" 18 | integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== 19 | 20 | arg@^4.1.0: 21 | version "4.1.0" 22 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.0.tgz#583c518199419e0037abb74062c37f8519e575f0" 23 | integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== 24 | 25 | array-find-index@^1.0.1: 26 | version "1.0.2" 27 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 28 | integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= 29 | 30 | balanced-match@^1.0.0: 31 | version "1.0.0" 32 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 33 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 34 | 35 | brace-expansion@^1.1.7: 36 | version "1.1.11" 37 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 38 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 39 | dependencies: 40 | balanced-match "^1.0.0" 41 | concat-map "0.0.1" 42 | 43 | buffer-from@^1.0.0: 44 | version "1.1.1" 45 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 46 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 47 | 48 | camelcase-keys@^2.0.0: 49 | version "2.1.0" 50 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 51 | integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= 52 | dependencies: 53 | camelcase "^2.0.0" 54 | map-obj "^1.0.0" 55 | 56 | camelcase@^2.0.0: 57 | version "2.1.1" 58 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 59 | integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= 60 | 61 | concat-map@0.0.1: 62 | version "0.0.1" 63 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 64 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 65 | 66 | currently-unhandled@^0.4.1: 67 | version "0.4.1" 68 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 69 | integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= 70 | dependencies: 71 | array-find-index "^1.0.1" 72 | 73 | dateformat@~1.0.4-1.2.3: 74 | version "1.0.12" 75 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" 76 | integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= 77 | dependencies: 78 | get-stdin "^4.0.1" 79 | meow "^3.3.0" 80 | 81 | debounce@^1.0.0: 82 | version "1.2.0" 83 | resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" 84 | integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== 85 | 86 | decamelize@^1.1.2: 87 | version "1.2.0" 88 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 89 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 90 | 91 | diff@^3.1.0: 92 | version "3.5.0" 93 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 94 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 95 | 96 | dynamic-dedupe@^0.3.0: 97 | version "0.3.0" 98 | resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" 99 | integrity sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE= 100 | dependencies: 101 | xtend "^4.0.0" 102 | 103 | error-ex@^1.2.0: 104 | version "1.3.2" 105 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 106 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 107 | dependencies: 108 | is-arrayish "^0.2.1" 109 | 110 | filewatcher@~3.0.0: 111 | version "3.0.1" 112 | resolved "https://registry.yarnpkg.com/filewatcher/-/filewatcher-3.0.1.tgz#f4a1957355ddaf443ccd78a895f3d55e23c8a034" 113 | integrity sha1-9KGVc1Xdr0Q8zXiolfPVXiPIoDQ= 114 | dependencies: 115 | debounce "^1.0.0" 116 | 117 | find-up@^1.0.0: 118 | version "1.1.2" 119 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 120 | integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= 121 | dependencies: 122 | path-exists "^2.0.0" 123 | pinkie-promise "^2.0.0" 124 | 125 | fs.realpath@^1.0.0: 126 | version "1.0.0" 127 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 128 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 129 | 130 | get-stdin@^4.0.1: 131 | version "4.0.1" 132 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 133 | integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= 134 | 135 | glob@^7.1.3: 136 | version "7.1.3" 137 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 138 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 139 | dependencies: 140 | fs.realpath "^1.0.0" 141 | inflight "^1.0.4" 142 | inherits "2" 143 | minimatch "^3.0.4" 144 | once "^1.3.0" 145 | path-is-absolute "^1.0.0" 146 | 147 | graceful-fs@^4.1.2: 148 | version "4.1.15" 149 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 150 | integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== 151 | 152 | growly@^1.3.0: 153 | version "1.3.0" 154 | resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" 155 | integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= 156 | 157 | hosted-git-info@^2.1.4: 158 | version "2.7.1" 159 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" 160 | integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== 161 | 162 | indent-string@^2.1.0: 163 | version "2.1.0" 164 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 165 | integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= 166 | dependencies: 167 | repeating "^2.0.0" 168 | 169 | inflight@^1.0.4: 170 | version "1.0.6" 171 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 172 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 173 | dependencies: 174 | once "^1.3.0" 175 | wrappy "1" 176 | 177 | inherits@2: 178 | version "2.0.3" 179 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 180 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 181 | 182 | is-arrayish@^0.2.1: 183 | version "0.2.1" 184 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 185 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 186 | 187 | is-finite@^1.0.0: 188 | version "1.0.2" 189 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 190 | integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= 191 | dependencies: 192 | number-is-nan "^1.0.0" 193 | 194 | is-utf8@^0.2.0: 195 | version "0.2.1" 196 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 197 | integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= 198 | 199 | is-wsl@^1.1.0: 200 | version "1.1.0" 201 | resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" 202 | integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= 203 | 204 | isexe@^2.0.0: 205 | version "2.0.0" 206 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 207 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 208 | 209 | load-json-file@^1.0.0: 210 | version "1.1.0" 211 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 212 | integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= 213 | dependencies: 214 | graceful-fs "^4.1.2" 215 | parse-json "^2.2.0" 216 | pify "^2.0.0" 217 | pinkie-promise "^2.0.0" 218 | strip-bom "^2.0.0" 219 | 220 | loud-rejection@^1.0.0: 221 | version "1.6.0" 222 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 223 | integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= 224 | dependencies: 225 | currently-unhandled "^0.4.1" 226 | signal-exit "^3.0.0" 227 | 228 | make-error@^1.1.1: 229 | version "1.3.5" 230 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" 231 | integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== 232 | 233 | map-obj@^1.0.0, map-obj@^1.0.1: 234 | version "1.0.1" 235 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 236 | integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= 237 | 238 | meow@^3.3.0: 239 | version "3.7.0" 240 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 241 | integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= 242 | dependencies: 243 | camelcase-keys "^2.0.0" 244 | decamelize "^1.1.2" 245 | loud-rejection "^1.0.0" 246 | map-obj "^1.0.1" 247 | minimist "^1.1.3" 248 | normalize-package-data "^2.3.4" 249 | object-assign "^4.0.1" 250 | read-pkg-up "^1.0.1" 251 | redent "^1.0.0" 252 | trim-newlines "^1.0.0" 253 | 254 | minimatch@^3.0.4: 255 | version "3.0.4" 256 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 257 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 258 | dependencies: 259 | brace-expansion "^1.1.7" 260 | 261 | minimist@0.0.8: 262 | version "0.0.8" 263 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 264 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 265 | 266 | minimist@^1.1.3: 267 | version "1.2.0" 268 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 269 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 270 | 271 | mkdirp@^0.5.1: 272 | version "0.5.1" 273 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 274 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 275 | dependencies: 276 | minimist "0.0.8" 277 | 278 | node-notifier@^5.4.0: 279 | version "5.4.3" 280 | resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" 281 | integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== 282 | dependencies: 283 | growly "^1.3.0" 284 | is-wsl "^1.1.0" 285 | semver "^5.5.0" 286 | shellwords "^0.1.1" 287 | which "^1.3.0" 288 | 289 | normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: 290 | version "2.5.0" 291 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 292 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 293 | dependencies: 294 | hosted-git-info "^2.1.4" 295 | resolve "^1.10.0" 296 | semver "2 || 3 || 4 || 5" 297 | validate-npm-package-license "^3.0.1" 298 | 299 | number-is-nan@^1.0.0: 300 | version "1.0.1" 301 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 302 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 303 | 304 | object-assign@^4.0.1: 305 | version "4.1.1" 306 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 307 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 308 | 309 | once@^1.3.0: 310 | version "1.4.0" 311 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 312 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 313 | dependencies: 314 | wrappy "1" 315 | 316 | parse-json@^2.2.0: 317 | version "2.2.0" 318 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 319 | integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 320 | dependencies: 321 | error-ex "^1.2.0" 322 | 323 | path-exists@^2.0.0: 324 | version "2.1.0" 325 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 326 | integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= 327 | dependencies: 328 | pinkie-promise "^2.0.0" 329 | 330 | path-is-absolute@^1.0.0: 331 | version "1.0.1" 332 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 333 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 334 | 335 | path-parse@^1.0.6: 336 | version "1.0.6" 337 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 338 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 339 | 340 | path-type@^1.0.0: 341 | version "1.1.0" 342 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 343 | integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= 344 | dependencies: 345 | graceful-fs "^4.1.2" 346 | pify "^2.0.0" 347 | pinkie-promise "^2.0.0" 348 | 349 | pify@^2.0.0: 350 | version "2.3.0" 351 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 352 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 353 | 354 | pinkie-promise@^2.0.0: 355 | version "2.0.1" 356 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 357 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 358 | dependencies: 359 | pinkie "^2.0.0" 360 | 361 | pinkie@^2.0.0: 362 | version "2.0.4" 363 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 364 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 365 | 366 | read-pkg-up@^1.0.1: 367 | version "1.0.1" 368 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 369 | integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= 370 | dependencies: 371 | find-up "^1.0.0" 372 | read-pkg "^1.0.0" 373 | 374 | read-pkg@^1.0.0: 375 | version "1.1.0" 376 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 377 | integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= 378 | dependencies: 379 | load-json-file "^1.0.0" 380 | normalize-package-data "^2.3.2" 381 | path-type "^1.0.0" 382 | 383 | redent@^1.0.0: 384 | version "1.0.0" 385 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 386 | integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= 387 | dependencies: 388 | indent-string "^2.1.0" 389 | strip-indent "^1.0.1" 390 | 391 | repeating@^2.0.0: 392 | version "2.0.1" 393 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 394 | integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= 395 | dependencies: 396 | is-finite "^1.0.0" 397 | 398 | resolve@^1.0.0, resolve@^1.10.0: 399 | version "1.10.0" 400 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" 401 | integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== 402 | dependencies: 403 | path-parse "^1.0.6" 404 | 405 | rimraf@^2.6.1: 406 | version "2.6.3" 407 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 408 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 409 | dependencies: 410 | glob "^7.1.3" 411 | 412 | "semver@2 || 3 || 4 || 5": 413 | version "5.6.0" 414 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 415 | integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== 416 | 417 | semver@^5.5.0: 418 | version "5.7.1" 419 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 420 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 421 | 422 | shellwords@^0.1.1: 423 | version "0.1.1" 424 | resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" 425 | integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== 426 | 427 | signal-exit@^3.0.0: 428 | version "3.0.2" 429 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 430 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 431 | 432 | source-map-support@^0.5.12: 433 | version "0.5.16" 434 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" 435 | integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== 436 | dependencies: 437 | buffer-from "^1.0.0" 438 | source-map "^0.6.0" 439 | 440 | source-map-support@^0.5.6: 441 | version "0.5.10" 442 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" 443 | integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== 444 | dependencies: 445 | buffer-from "^1.0.0" 446 | source-map "^0.6.0" 447 | 448 | source-map@^0.6.0: 449 | version "0.6.1" 450 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 451 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 452 | 453 | spdx-correct@^3.0.0: 454 | version "3.1.0" 455 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" 456 | integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== 457 | dependencies: 458 | spdx-expression-parse "^3.0.0" 459 | spdx-license-ids "^3.0.0" 460 | 461 | spdx-exceptions@^2.1.0: 462 | version "2.2.0" 463 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" 464 | integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== 465 | 466 | spdx-expression-parse@^3.0.0: 467 | version "3.0.0" 468 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 469 | integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== 470 | dependencies: 471 | spdx-exceptions "^2.1.0" 472 | spdx-license-ids "^3.0.0" 473 | 474 | spdx-license-ids@^3.0.0: 475 | version "3.0.3" 476 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz#81c0ce8f21474756148bbb5f3bfc0f36bf15d76e" 477 | integrity sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g== 478 | 479 | strip-bom@^2.0.0: 480 | version "2.0.0" 481 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 482 | integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= 483 | dependencies: 484 | is-utf8 "^0.2.0" 485 | 486 | strip-bom@^3.0.0: 487 | version "3.0.0" 488 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 489 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 490 | 491 | strip-indent@^1.0.1: 492 | version "1.0.1" 493 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 494 | integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= 495 | dependencies: 496 | get-stdin "^4.0.1" 497 | 498 | strip-json-comments@^2.0.0: 499 | version "2.0.1" 500 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 501 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 502 | 503 | tree-kill@^1.2.1: 504 | version "1.2.2" 505 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" 506 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== 507 | 508 | trim-newlines@^1.0.0: 509 | version "1.0.0" 510 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 511 | integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= 512 | 513 | ts-node-dev@^1.0.0-pre.44: 514 | version "1.0.0-pre.44" 515 | resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.0.0-pre.44.tgz#2f4d666088481fb9c4e4f5bc8f15995bd8b06ecb" 516 | integrity sha512-M5ZwvB6FU3jtc70i5lFth86/6Qj5XR5nMMBwVxZF4cZhpO7XcbWw6tbNiJo22Zx0KfjEj9py5DANhwLOkPPufw== 517 | dependencies: 518 | dateformat "~1.0.4-1.2.3" 519 | dynamic-dedupe "^0.3.0" 520 | filewatcher "~3.0.0" 521 | minimist "^1.1.3" 522 | mkdirp "^0.5.1" 523 | node-notifier "^5.4.0" 524 | resolve "^1.0.0" 525 | rimraf "^2.6.1" 526 | source-map-support "^0.5.12" 527 | tree-kill "^1.2.1" 528 | ts-node "*" 529 | tsconfig "^7.0.0" 530 | 531 | ts-node@*: 532 | version "8.0.2" 533 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.0.2.tgz#9ecdf8d782a0ca4c80d1d641cbb236af4ac1b756" 534 | integrity sha512-MosTrinKmaAcWgO8tqMjMJB22h+sp3Rd1i4fdoWY4mhBDekOwIAKI/bzmRi7IcbCmjquccYg2gcF6NBkLgr0Tw== 535 | dependencies: 536 | arg "^4.1.0" 537 | diff "^3.1.0" 538 | make-error "^1.1.1" 539 | source-map-support "^0.5.6" 540 | yn "^3.0.0" 541 | 542 | tsconfig@^7.0.0: 543 | version "7.0.0" 544 | resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" 545 | integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== 546 | dependencies: 547 | "@types/strip-bom" "^3.0.0" 548 | "@types/strip-json-comments" "0.0.30" 549 | strip-bom "^3.0.0" 550 | strip-json-comments "^2.0.0" 551 | 552 | typescript@^3.3.3333: 553 | version "3.3.3333" 554 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.3333.tgz#171b2c5af66c59e9431199117a3bcadc66fdcfd6" 555 | integrity sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw== 556 | 557 | validate-npm-package-license@^3.0.1: 558 | version "3.0.4" 559 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 560 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 561 | dependencies: 562 | spdx-correct "^3.0.0" 563 | spdx-expression-parse "^3.0.0" 564 | 565 | which@^1.3.0: 566 | version "1.3.1" 567 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 568 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 569 | dependencies: 570 | isexe "^2.0.0" 571 | 572 | wrappy@1: 573 | version "1.0.2" 574 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 575 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 576 | 577 | xtend@^4.0.0: 578 | version "4.0.1" 579 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 580 | integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= 581 | 582 | yn@^3.0.0: 583 | version "3.0.0" 584 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.0.0.tgz#0073c6b56e92aed652fbdfd62431f2d6b9a7a091" 585 | integrity sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q== 586 | -------------------------------------------------------------------------------- /panorama_enums.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Panorama Enums 4 | permalink: /panorama_enums/ 5 | --- 6 | 7 | {% for enum_class in site.data.panorama_enums %} 8 | # {{ enum_class[0] }} 9 | {% for enum_field in enum_class[1] %} 10 | * {{enum_field[0]}} = {{enum_field[1]}} 11 | {% endfor %} 12 | {% endfor %} -------------------------------------------------------------------------------- /params.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "API", 3 | "tagline": "Documenting Dota 2 API's", 4 | "body": "# API\r\n\r\n##File Structure\r\n### dota.d.ts\r\nContains all the javascript API functions to do intellisense\r\n### dota_enums.d.ts\r\nContains all the constants / enums that exist in the global panorama scope\r\n###dota_panels.d.ts\r\nContains all the Panel types (Panel, Button, etc) and their associated properties\r\n###`gen/`\r\nThis folder contains all the scripts to help automate this repository", 5 | "note": "Don't delete this file! It's used internally to help with page regeneration." 6 | } -------------------------------------------------------------------------------- /stylesheets/github-light.css: -------------------------------------------------------------------------------- 1 | /* 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2016 GitHub, Inc. 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | 24 | */ 25 | 26 | .pl-c /* comment */ { 27 | color: #969896; 28 | } 29 | 30 | .pl-c1 /* constant, variable.other.constant, support, meta.property-name, support.constant, support.variable, meta.module-reference, markup.raw, meta.diff.header */, 31 | .pl-s .pl-v /* string variable */ { 32 | color: #0086b3; 33 | } 34 | 35 | .pl-e /* entity */, 36 | .pl-en /* entity.name */ { 37 | color: #795da3; 38 | } 39 | 40 | .pl-smi /* variable.parameter.function, storage.modifier.package, storage.modifier.import, storage.type.java, variable.other */, 41 | .pl-s .pl-s1 /* string source */ { 42 | color: #333; 43 | } 44 | 45 | .pl-ent /* entity.name.tag */ { 46 | color: #63a35c; 47 | } 48 | 49 | .pl-k /* keyword, storage, storage.type */ { 50 | color: #a71d5d; 51 | } 52 | 53 | .pl-s /* string */, 54 | .pl-pds /* punctuation.definition.string, string.regexp.character-class */, 55 | .pl-s .pl-pse .pl-s1 /* string punctuation.section.embedded source */, 56 | .pl-sr /* string.regexp */, 57 | .pl-sr .pl-cce /* string.regexp constant.character.escape */, 58 | .pl-sr .pl-sre /* string.regexp source.ruby.embedded */, 59 | .pl-sr .pl-sra /* string.regexp string.regexp.arbitrary-repitition */ { 60 | color: #183691; 61 | } 62 | 63 | .pl-v /* variable */ { 64 | color: #ed6a43; 65 | } 66 | 67 | .pl-id /* invalid.deprecated */ { 68 | color: #b52a1d; 69 | } 70 | 71 | .pl-ii /* invalid.illegal */ { 72 | color: #f8f8f8; 73 | background-color: #b52a1d; 74 | } 75 | 76 | .pl-sr .pl-cce /* string.regexp constant.character.escape */ { 77 | font-weight: bold; 78 | color: #63a35c; 79 | } 80 | 81 | .pl-ml /* markup.list */ { 82 | color: #693a17; 83 | } 84 | 85 | .pl-mh /* markup.heading */, 86 | .pl-mh .pl-en /* markup.heading entity.name */, 87 | .pl-ms /* meta.separator */ { 88 | font-weight: bold; 89 | color: #1d3e81; 90 | } 91 | 92 | .pl-mq /* markup.quote */ { 93 | color: #008080; 94 | } 95 | 96 | .pl-mi /* markup.italic */ { 97 | font-style: italic; 98 | color: #333; 99 | } 100 | 101 | .pl-mb /* markup.bold */ { 102 | font-weight: bold; 103 | color: #333; 104 | } 105 | 106 | .pl-md /* markup.deleted, meta.diff.header.from-file */ { 107 | color: #bd2c00; 108 | background-color: #ffecec; 109 | } 110 | 111 | .pl-mi1 /* markup.inserted, meta.diff.header.to-file */ { 112 | color: #55a532; 113 | background-color: #eaffea; 114 | } 115 | 116 | .pl-mdr /* meta.diff.range */ { 117 | font-weight: bold; 118 | color: #795da3; 119 | } 120 | 121 | .pl-mo /* meta.output */ { 122 | color: #1d3e81; 123 | } 124 | 125 | -------------------------------------------------------------------------------- /stylesheets/stylesheet.css: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | Slate Theme for GitHub Pages 3 | by Jason Costello, @jsncostello 4 | *******************************************************************************/ 5 | 6 | @import url(github-light.css); 7 | 8 | /******************************************************************************* 9 | MeyerWeb Reset 10 | *******************************************************************************/ 11 | 12 | html, body, div, span, applet, object, iframe, 13 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 14 | a, abbr, acronym, address, big, cite, code, 15 | del, dfn, em, img, ins, kbd, q, s, samp, 16 | small, strike, strong, sub, sup, tt, var, 17 | b, u, i, center, 18 | dl, dt, dd, ol, ul, li, 19 | fieldset, form, label, legend, 20 | table, caption, tbody, tfoot, thead, tr, th, td, 21 | article, aside, canvas, details, embed, 22 | figure, figcaption, footer, header, hgroup, 23 | menu, nav, output, ruby, section, summary, 24 | time, mark, audio, video { 25 | margin: 0; 26 | padding: 0; 27 | border: 0; 28 | font: inherit; 29 | vertical-align: baseline; 30 | } 31 | 32 | /* HTML5 display-role reset for older browsers */ 33 | article, aside, details, figcaption, figure, 34 | footer, header, hgroup, menu, nav, section { 35 | display: block; 36 | } 37 | 38 | ol, ul { 39 | list-style: none; 40 | } 41 | 42 | table { 43 | border-collapse: collapse; 44 | border-spacing: 0; 45 | } 46 | 47 | /******************************************************************************* 48 | Theme Styles 49 | *******************************************************************************/ 50 | 51 | body { 52 | box-sizing: border-box; 53 | color:#373737; 54 | background: #212121; 55 | font-size: 16px; 56 | font-family: 'Myriad Pro', Calibri, Helvetica, Arial, sans-serif; 57 | line-height: 1.5; 58 | -webkit-font-smoothing: antialiased; 59 | } 60 | 61 | h1, h2, h3, h4, h5, h6 { 62 | margin: 10px 0; 63 | font-weight: 700; 64 | color:#222222; 65 | font-family: 'Lucida Grande', 'Calibri', Helvetica, Arial, sans-serif; 66 | letter-spacing: -1px; 67 | } 68 | 69 | h1 { 70 | font-size: 36px; 71 | font-weight: 700; 72 | } 73 | 74 | h2 { 75 | padding-bottom: 10px; 76 | font-size: 32px; 77 | background: url('../images/bg_hr.png') repeat-x bottom; 78 | } 79 | 80 | h3 { 81 | font-size: 24px; 82 | } 83 | 84 | h4 { 85 | font-size: 21px; 86 | } 87 | 88 | h5 { 89 | font-size: 18px; 90 | } 91 | 92 | h6 { 93 | font-size: 16px; 94 | } 95 | 96 | p { 97 | margin: 10px 0 15px 0; 98 | } 99 | 100 | footer p { 101 | color: #f2f2f2; 102 | } 103 | 104 | a { 105 | text-decoration: none; 106 | color: #007edf; 107 | text-shadow: none; 108 | 109 | transition: color 0.5s ease; 110 | transition: text-shadow 0.5s ease; 111 | -webkit-transition: color 0.5s ease; 112 | -webkit-transition: text-shadow 0.5s ease; 113 | -moz-transition: color 0.5s ease; 114 | -moz-transition: text-shadow 0.5s ease; 115 | -o-transition: color 0.5s ease; 116 | -o-transition: text-shadow 0.5s ease; 117 | -ms-transition: color 0.5s ease; 118 | -ms-transition: text-shadow 0.5s ease; 119 | } 120 | 121 | a:hover, a:focus {text-decoration: underline;} 122 | 123 | footer a { 124 | color: #F2F2F2; 125 | text-decoration: underline; 126 | } 127 | 128 | em { 129 | font-style: italic; 130 | } 131 | 132 | strong { 133 | font-weight: bold; 134 | } 135 | 136 | img { 137 | position: relative; 138 | margin: 0 auto; 139 | max-width: 739px; 140 | padding: 5px; 141 | margin: 10px 0 10px 0; 142 | border: 1px solid #ebebeb; 143 | 144 | box-shadow: 0 0 5px #ebebeb; 145 | -webkit-box-shadow: 0 0 5px #ebebeb; 146 | -moz-box-shadow: 0 0 5px #ebebeb; 147 | -o-box-shadow: 0 0 5px #ebebeb; 148 | -ms-box-shadow: 0 0 5px #ebebeb; 149 | } 150 | 151 | p img { 152 | display: inline; 153 | margin: 0; 154 | padding: 0; 155 | vertical-align: middle; 156 | text-align: center; 157 | border: none; 158 | } 159 | 160 | pre, code { 161 | width: 100%; 162 | color: #222; 163 | background-color: #fff; 164 | 165 | font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; 166 | font-size: 14px; 167 | 168 | border-radius: 2px; 169 | -moz-border-radius: 2px; 170 | -webkit-border-radius: 2px; 171 | } 172 | 173 | pre { 174 | width: 100%; 175 | padding: 10px; 176 | box-shadow: 0 0 10px rgba(0,0,0,.1); 177 | overflow: auto; 178 | } 179 | 180 | code { 181 | padding: 3px; 182 | margin: 0 3px; 183 | box-shadow: 0 0 10px rgba(0,0,0,.1); 184 | } 185 | 186 | pre code { 187 | display: block; 188 | box-shadow: none; 189 | } 190 | 191 | blockquote { 192 | color: #666; 193 | margin-bottom: 20px; 194 | padding: 0 0 0 20px; 195 | border-left: 3px solid #bbb; 196 | } 197 | 198 | 199 | ul, ol, dl { 200 | margin-bottom: 15px 201 | } 202 | 203 | ul { 204 | list-style-position: inside; 205 | list-style: disc; 206 | padding-left: 20px; 207 | } 208 | 209 | ol { 210 | list-style-position: inside; 211 | list-style: decimal; 212 | padding-left: 20px; 213 | } 214 | 215 | dl dt { 216 | font-weight: bold; 217 | } 218 | 219 | dl dd { 220 | padding-left: 20px; 221 | font-style: italic; 222 | } 223 | 224 | dl p { 225 | padding-left: 20px; 226 | font-style: italic; 227 | } 228 | 229 | hr { 230 | height: 1px; 231 | margin-bottom: 5px; 232 | border: none; 233 | background: url('../images/bg_hr.png') repeat-x center; 234 | } 235 | 236 | table { 237 | border: 1px solid #373737; 238 | margin-bottom: 20px; 239 | text-align: left; 240 | } 241 | 242 | th { 243 | font-family: 'Lucida Grande', 'Helvetica Neue', Helvetica, Arial, sans-serif; 244 | padding: 10px; 245 | background: #373737; 246 | color: #fff; 247 | } 248 | 249 | td { 250 | padding: 10px; 251 | border: 1px solid #373737; 252 | } 253 | 254 | form { 255 | background: #f2f2f2; 256 | padding: 20px; 257 | } 258 | 259 | /******************************************************************************* 260 | Full-Width Styles 261 | *******************************************************************************/ 262 | 263 | .outer { 264 | width: 100%; 265 | } 266 | 267 | .inner { 268 | position: relative; 269 | max-width: 640px; 270 | padding: 20px 10px; 271 | margin: 0 auto; 272 | } 273 | 274 | #forkme_banner { 275 | display: block; 276 | position: absolute; 277 | top:0; 278 | right: 10px; 279 | z-index: 10; 280 | padding: 10px 50px 10px 10px; 281 | color: #fff; 282 | background: url('../images/blacktocat.png') #0090ff no-repeat 95% 50%; 283 | font-weight: 700; 284 | box-shadow: 0 0 10px rgba(0,0,0,.5); 285 | border-bottom-left-radius: 2px; 286 | border-bottom-right-radius: 2px; 287 | } 288 | 289 | #header_wrap { 290 | background: #212121; 291 | background: -moz-linear-gradient(top, #373737, #212121); 292 | background: -webkit-linear-gradient(top, #373737, #212121); 293 | background: -ms-linear-gradient(top, #373737, #212121); 294 | background: -o-linear-gradient(top, #373737, #212121); 295 | background: linear-gradient(top, #373737, #212121); 296 | } 297 | 298 | #header_wrap .inner { 299 | padding: 50px 10px 30px 10px; 300 | } 301 | 302 | #project_title { 303 | margin: 0; 304 | color: #fff; 305 | font-size: 42px; 306 | font-weight: 700; 307 | text-shadow: #111 0px 0px 10px; 308 | } 309 | 310 | #project_tagline { 311 | color: #fff; 312 | font-size: 24px; 313 | font-weight: 300; 314 | background: none; 315 | text-shadow: #111 0px 0px 10px; 316 | } 317 | 318 | #downloads { 319 | position: absolute; 320 | width: 210px; 321 | z-index: 10; 322 | bottom: -40px; 323 | right: 0; 324 | height: 70px; 325 | background: url('../images/icon_download.png') no-repeat 0% 90%; 326 | } 327 | 328 | .zip_download_link { 329 | display: block; 330 | float: right; 331 | width: 90px; 332 | height:70px; 333 | text-indent: -5000px; 334 | overflow: hidden; 335 | background: url(../images/sprite_download.png) no-repeat bottom left; 336 | } 337 | 338 | .tar_download_link { 339 | display: block; 340 | float: right; 341 | width: 90px; 342 | height:70px; 343 | text-indent: -5000px; 344 | overflow: hidden; 345 | background: url(../images/sprite_download.png) no-repeat bottom right; 346 | margin-left: 10px; 347 | } 348 | 349 | .zip_download_link:hover { 350 | background: url(../images/sprite_download.png) no-repeat top left; 351 | } 352 | 353 | .tar_download_link:hover { 354 | background: url(../images/sprite_download.png) no-repeat top right; 355 | } 356 | 357 | #main_content_wrap { 358 | background: #f2f2f2; 359 | border-top: 1px solid #111; 360 | border-bottom: 1px solid #111; 361 | } 362 | 363 | #main_content { 364 | padding-top: 40px; 365 | } 366 | 367 | #footer_wrap { 368 | background: #212121; 369 | } 370 | 371 | 372 | 373 | /******************************************************************************* 374 | Small Device Styles 375 | *******************************************************************************/ 376 | 377 | @media screen and (max-width: 480px) { 378 | body { 379 | font-size:14px; 380 | } 381 | 382 | #downloads { 383 | display: none; 384 | } 385 | 386 | .inner { 387 | min-width: 320px; 388 | max-width: 480px; 389 | } 390 | 391 | #project_title { 392 | font-size: 32px; 393 | } 394 | 395 | h1 { 396 | font-size: 28px; 397 | } 398 | 399 | h2 { 400 | font-size: 24px; 401 | } 402 | 403 | h3 { 404 | font-size: 21px; 405 | } 406 | 407 | h4 { 408 | font-size: 18px; 409 | } 410 | 411 | h5 { 412 | font-size: 14px; 413 | } 414 | 415 | h6 { 416 | font-size: 12px; 417 | } 418 | 419 | code, pre { 420 | min-width: 320px; 421 | max-width: 480px; 422 | font-size: 11px; 423 | } 424 | 425 | } 426 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": true, 3 | "compilerOptions": { 4 | "target": "es3" 5 | } 6 | } --------------------------------------------------------------------------------