mirror of
				https://github.com/lxsang/antos-frontend.git
				synced 2025-10-31 02:15:47 +01:00 
			
		
		
		
	add setting package
This commit is contained in:
		| @@ -240,7 +240,7 @@ class AboutDialog extends BaseDialog | ||||
|         super "AboutDialog" | ||||
|  | ||||
|     init: () -> | ||||
|         @render "os:///resources/schemes/about.html" | ||||
|         @render "os://resources/schemes/about.html" | ||||
|  | ||||
|     main: () -> | ||||
|         mt = @meta() | ||||
| @@ -260,7 +260,7 @@ class FileDiaLog extends BaseDialog | ||||
|         super "FileDiaLog" | ||||
|      | ||||
|     init: () -> | ||||
|         @render "os:///resources/schemes/filedialog.html" | ||||
|         @render "os://resources/schemes/filedialog.html" | ||||
|      | ||||
|     main: () -> | ||||
|         fileview = @find "fileview" | ||||
|   | ||||
| @@ -242,7 +242,7 @@ self.OS.API = | ||||
|                 , (e, s) -> | ||||
|                     _courrier.oserror __("Cannot load 3rd library at: {0}", l), e, r | ||||
|             else | ||||
|                 path = "os:///scripts/" | ||||
|                 path = "os://scripts/" | ||||
|                 js = "#{path}#{l}.js" | ||||
|                 js.asFileHandler().onready (d) -> | ||||
|                     _API.shared[l] = true | ||||
|   | ||||
| @@ -118,7 +118,7 @@ self.OS.GUI = | ||||
|         _GUI.launch app, args | ||||
|  | ||||
|     loadApp: (app, ok, err) -> | ||||
|         path = "os:///packages/#{app}" | ||||
|         path = "os://packages/#{app}" | ||||
|         path = _OS.setting.system.packages[app].path if _OS.setting.system.packages[app].path | ||||
|         js = path + "/main.js" | ||||
|          | ||||
| @@ -211,6 +211,14 @@ self.OS.GUI = | ||||
|         return unless _GUI.shortcut[fnk] | ||||
|         _GUI.shortcut[fnk][c] = f | ||||
|  | ||||
|     wallpaper: (obj) -> | ||||
|         if obj | ||||
|             _OS.setting.appearance.wp = obj | ||||
|         wp = _OS.setting.appearance.wp | ||||
|         $("body").css("background-image", "url(#{_API.handler.get}/#{wp.url})" ) | ||||
|             .css("background-size", wp.size) | ||||
|             .css("ackground-repeat", wp.repeat) | ||||
|  | ||||
|     initDM: -> | ||||
|         ($ document).on 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange', ()-> | ||||
|             _GUI.fullscreen = not _GUI.fullscreen | ||||
| @@ -388,6 +396,7 @@ self.OS.GUI = | ||||
|         #console.log _OS.setting | ||||
|         # load theme | ||||
|         _GUI.loadTheme _OS.setting.appearance.theme | ||||
|         _GUI.wallpaper() | ||||
|         _courrier.observable.one "syspanelloaded", () -> | ||||
|             # TODO load packages list then build system menu | ||||
|             _courrier.observable.on "systemlocalechange", (name) -> | ||||
|   | ||||
| @@ -2,18 +2,23 @@ | ||||
|     _OS.setting.desktop = conf.desktop if conf.desktop | ||||
|     _OS.setting.applications = conf.applications if conf.applications | ||||
|     _OS.setting.appearance = conf.appearance if conf.appearance | ||||
|     _OS.setting.appearance.wp = { | ||||
|         url: "os://resources/themes/system/wp/wp2.png", | ||||
|         size: "cover", | ||||
|         repeat: "repeat" | ||||
|     } unless _OS.setting.appearance.wp | ||||
|     _OS.setting.user = conf.user | ||||
|     _OS.setting.VFS = conf.VFS if conf.VFS | ||||
|     _OS.setting.desktop.path = "home:///.desktop" unless _OS.setting.desktop.path | ||||
|     _OS.setting.desktop.path = "home://.desktop" unless _OS.setting.desktop.path | ||||
|     _OS.setting.desktop.menu = {} unless _OS.setting.desktop.menu | ||||
|     _OS.setting.VFS.mountpoints = [ | ||||
|         #TODO: multi app try to write to this object, it neet to be cloned | ||||
|         { text: __("Applications"), path: 'app:///', iconclass: "fa  fa-adn", type: "app" }, | ||||
|         { text: __("Home"), path: 'home:///', iconclass: "fa fa-home", type: "fs" }, | ||||
|         { text: __("Applications"), path: 'app://', iconclass: "fa  fa-adn", type: "app" }, | ||||
|         { text: __("Home"), path: 'home://', iconclass: "fa fa-home", type: "fs" }, | ||||
|         { text: __("Desktop"), path: _OS.setting.desktop.path , iconclass: "fa fa-desktop", type: "fs" }, | ||||
|         { text: __("OS"), path: 'os:///', iconclass: "fa fa-inbox", type: "fs" }, | ||||
|         { text: __("Google Drive"), path: 'gdv:///', iconclass: "fa fa-inbox", type: "fs" }, | ||||
|         { text: __("Shared"), path: 'shared:///' , iconclass: "fa fa-share-square", type: "fs" } | ||||
|         { text: __("OS"), path: 'os://', iconclass: "fa fa-inbox", type: "fs" }, | ||||
|         { text: __("Google Drive"), path: 'gdv://', iconclass: "fa fa-inbox", type: "fs" }, | ||||
|         { text: __("Shared"), path: 'shared://' , iconclass: "fa fa-share-square", type: "fs" } | ||||
|     ] if not _OS.setting.VFS.mountpoints | ||||
|  | ||||
|     _OS.setting.system = conf.system if conf.system | ||||
| @@ -28,8 +33,8 @@ | ||||
|     } if not _OS.setting.system.startup | ||||
|  | ||||
|     _OS.setting.system.pkgpaths = { | ||||
|         user: "home:///.packages", | ||||
|         system: "os:///packages" | ||||
|         user: "home://.packages", | ||||
|         system: "os://packages" | ||||
|      } unless _OS.setting.system.pkgpaths | ||||
|     _OS.setting.system.locale = "en_GB" unless _OS.setting.system.locale | ||||
|     _OS.setting.system.menu = {} unless _OS.setting.system.menu | ||||
|   | ||||
| @@ -6,6 +6,7 @@ | ||||
|         var self = this | ||||
|         this.rid = $(self.root).attr("data-id") || Math.floor(Math.random() * 100000) + 1 | ||||
|         this.on('mount', function(){ | ||||
|             self.root.observable =   (self.parent && self.parent.root && self.parent.root.observable) || opts.observable || riot.observable() | ||||
|             $(self.refs.container) | ||||
|                 .css("display","flex") | ||||
|                 .css("flex-direction","row") | ||||
| @@ -29,6 +30,16 @@ | ||||
|             var csize, ocwidth = 0, avaiheight; | ||||
|             avaiheight = $(self.root).height() | ||||
|             avaiWidth = $(self.root).width() | ||||
|             /*if(avaiheight == 0) | ||||
|             { | ||||
|                 avaiheight = $(self.parent.root).height() | ||||
|                 $(self.root).css("height", avaiheight+"px") | ||||
|             } | ||||
|             if(avaiWidth == 0) | ||||
|             { | ||||
|                 avaiWidth = $(self.parent.root).width() | ||||
|                 $(self.root).css("height", avaiWidth+"px") | ||||
|             }*/ | ||||
|             $(self.refs.container).css("height",avaiheight + "px") | ||||
|             $(self.refs.container) | ||||
|                 .children() | ||||
|   | ||||
| @@ -112,6 +112,7 @@ | ||||
|         } | ||||
|          | ||||
|         this.on("mount", function(){ | ||||
|             self.root.observable = opts.observable || (self.parent && self.parent.root && self.parent.root.observable) || riot.observable() | ||||
|             if(opts.dropdown == "true") | ||||
|             { | ||||
|                 $(document).click(function(event) {  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
|         else | ||||
|             this.swon = false | ||||
|         var self = this | ||||
|         this.root.observable = opts.observable | ||||
|         //this.root.observable = opts.observable | ||||
|         if(opts.enable != undefined) | ||||
|             this.enable = opts.enable | ||||
|         else | ||||
| @@ -31,6 +31,9 @@ | ||||
|             opts.swon = !self.swon | ||||
|             self.update() | ||||
|         } | ||||
|         /*this.on("mount", function(){ | ||||
|             self.root.observable =   (self.parent && self.parent.root && self.parent.root.observable) || opts.observable || riot.observable() | ||||
|         })*/ | ||||
|         this.on("update", function(e){ | ||||
|             self.swon = opts.swon | ||||
|             self.onchange = opts.onchange | ||||
|   | ||||
| @@ -3,7 +3,6 @@ | ||||
|     <script> | ||||
|         var self = this | ||||
|         this.closable = opts.closable || false | ||||
|         self.root.observable = opts.observable || riot.observable() | ||||
|         self.ontabselect = opts.ontabselect | ||||
|         get_observable(){ | ||||
|             return self.root.observable | ||||
| @@ -17,6 +16,7 @@ | ||||
|             self.update(true) | ||||
|         } | ||||
|         self.on("mount", function(){ | ||||
|             self.root.observable = opts.observable || (self.parent && self.parent.root && self.parent.root.observable) || riot.observable() | ||||
|             self.refs.list.root.observable = self.root.observable | ||||
|             /*self.root.observable.on("listselect", function(){ | ||||
|                 console.log("list select") | ||||
|   | ||||
							
								
								
									
										84
									
								
								src/core/tags/afx-tab-container.tag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								src/core/tags/afx-tab-container.tag
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| <afx-tab-container> | ||||
|     <afx-hbox ref = "mybox" if = {bar == "left"}> | ||||
|     <afx-tab-bar data-ref="tabbar" ></afx-tab-bar> | ||||
|     <div data-ref="container"></div> | ||||
|     </afx-hbox> | ||||
|     <afx-vbox ref = "mybox" if = { bar == "top"}> | ||||
|     <afx-tab-bar data-ref="tabbar" ></afx-tab-bar> | ||||
|     <div data-ref="container"></div> | ||||
|     </afx-vbox> | ||||
|     <script> | ||||
|         this.bar = opts.bar || "top" | ||||
|         this.barwidth = opts.barwidth | ||||
|         this.barheight = opts.barheight | ||||
|         var schemes = [] | ||||
|         var self = this | ||||
|         var calibrate = function() | ||||
|         { | ||||
|             $(self.refs.mybox.root).css("width", $(self.root).width()+"px") | ||||
|             $(self.refs.mybox.root).css("height", $(self.root).height()+"px") | ||||
|             self.root.observable.trigger("calibrate") | ||||
|         } | ||||
|         self.on("mount", function () { | ||||
|             self.tabbar = $("[data-ref='tabbar']", self.root)[0] | ||||
|             self.container = $("[data-ref='container']", self.root)[0] | ||||
|             if(self.barwidth) | ||||
|                 $(self.tabbar).attr("data-width", self.barwidth) | ||||
|             if(self.barheight) | ||||
|                 $(self.tabbar).attr("data-height", self.barheight) | ||||
|             self.root.observable =   (self.parent && self.parent.root && self.parent.root.observable) || opts.observable || riot.observable() | ||||
|             self.tabbar.set("ontabselect", function(e){ | ||||
|                 $(self.container).children().each(function(el){ | ||||
|                     $(this).hide() | ||||
|                 }) | ||||
|                 $(e.data.scheme).show() | ||||
|                 e.data.f() | ||||
|                 calibrate() | ||||
|             }) | ||||
|             self.root.observable.on("resize", function(){ | ||||
|                 calibrate() | ||||
|             }) | ||||
|         }) | ||||
|         var render = function(el) | ||||
|         { | ||||
|             var sch = $.parseHTML(el.scheme) | ||||
|             $(self.container).append(sch) | ||||
|             el.scheme = sch | ||||
|             riot.mount(sch, {observable: self.root.observable}) | ||||
|             $(sch).hide() | ||||
|             el.f() | ||||
|             self.root.observable.trigger("tabrendered") | ||||
|             //self.root.observable.trigger("calibrate") | ||||
|         } | ||||
|         var addTab = function(el) | ||||
|         { | ||||
|             if(!el.f) | ||||
|                 el.f = (function(){}) | ||||
|             self.tabbar.push(el) | ||||
|             if(el.url) | ||||
|             { | ||||
|                 el.url.asFileHandler().read(function(d){ | ||||
|                     el.scheme = d | ||||
|                     render(el) | ||||
|                 }) | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 render(el) | ||||
|             } | ||||
|         } | ||||
|         self.root.setTabs = function(arr) | ||||
|         { | ||||
|             if(arr.length <= 0) | ||||
|             { | ||||
|                 self.tabbar.set("selected", 0) | ||||
|                 return | ||||
|             } | ||||
|             self.root.observable.one("tabrendered", function(){ | ||||
|                 arr.splice(0,1) | ||||
|                 self.root.setTabs(arr) | ||||
|             }) | ||||
|             addTab(arr[0]) | ||||
|         } | ||||
|     </script> | ||||
| </afx-tab-container> | ||||
| @@ -6,6 +6,7 @@ | ||||
|         var self = this | ||||
|         this.rid = $(self.root).attr("data-id") || Math.floor(Math.random() * 100000) + 1 | ||||
|         this.on('mount', function(){ | ||||
|             self.root.observable =   (self.parent && self.parent.root && self.parent.root.observable) || opts.observable || riot.observable() | ||||
|             $(self.refs.container) | ||||
|                 .css("display","flex") | ||||
|                 .css("flex-direction","column") | ||||
| @@ -32,6 +33,16 @@ | ||||
|             var csize, ocheight = 0, avaiheight; | ||||
|             avaiheight = $(self.root).height() | ||||
|             avaiwidth = $(self.root).width() | ||||
|             /*if(avaiheight == 0) | ||||
|             { | ||||
|                 avaiheight = $(self.parent.root).height() | ||||
|                 $(self.root).css("height", avaiheight+"px") | ||||
|             } | ||||
|             if(avaiwidth == 0) | ||||
|             { | ||||
|                 avaiwidth = $(self.parent.root).width() | ||||
|                 $(self.root).css("height", avaiwidth+"px") | ||||
|             }*/ | ||||
|             $(self.refs.container).css("height",avaiheight + "px") | ||||
|             $(self.refs.container) | ||||
|                 .children() | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| String.prototype.asFileHandler = () -> | ||||
|     list = @split ":///" | ||||
|     list = @split "://" | ||||
|     handlers = _API.VFS.findHandlers list[0] | ||||
|     if not handlers or handlers.length is 0 | ||||
|         _courrier.osfail __("VFS unknown handler: {0}", @), (_API.throwe "OS.VFS"), @ | ||||
| @@ -25,7 +25,7 @@ class BaseFileHandler | ||||
|         @ready = false | ||||
|         return unless p | ||||
|         @path = p.toString() | ||||
|         list = @path.split ":///" | ||||
|         list = @path.split "://" | ||||
|         @protocol = list[0] | ||||
|         return unless list.length > 1 | ||||
|         re = list[1].replace(/^\/+|\/+$/g, '') | ||||
| @@ -67,7 +67,7 @@ class BaseFileHandler | ||||
|                 return _courrier.osfail __("VFS Cannot encode file: {0}", me.path), (_API.throwe "OS.VFS"), e | ||||
|     parent: () -> | ||||
|         return @ if @isRoot() | ||||
|         return (@protocol + ":///" + (@genealogy.slice 0 , @genealogy.length - 1).join "/") | ||||
|         return (@protocol + "://" + (@genealogy.slice 0 , @genealogy.length - 1).join "/") | ||||
|  | ||||
|     onready: (f, err) -> | ||||
|         # read meta data | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
|  | ||||
| # GoogleDrive File Handler | ||||
| G_CACHE = {"gdv:///":{ id: "root", mime: 'dir' } } | ||||
| G_CACHE = {"gdv://":{ id: "root", mime: 'dir' } } | ||||
|  | ||||
| class GoogleDriveHandler extends this.OS.API.VFS.BaseFileHandler | ||||
|     constructor: (path) -> | ||||
| @@ -17,7 +17,7 @@ class GoogleDriveHandler extends this.OS.API.VFS.BaseFileHandler | ||||
|         fn = (r) -> | ||||
|             return f() if r | ||||
|             # perform the login | ||||
|             G_CACHE = {"gdv:///":{ id: "root", mime: 'dir' } } | ||||
|             G_CACHE = {"gdv://":{ id: "root", mime: 'dir' } } | ||||
|             gapi.auth2.getAuthInstance().signIn() | ||||
|  | ||||
|         if _API.libready @setting.apilink | ||||
| @@ -316,7 +316,7 @@ self.OS.API.onsearch "Google Drive", (t) -> | ||||
|     return arr | ||||
|  | ||||
| self.OS.onexit "cleanUpGoogleDrive", () -> | ||||
|     G_CACHE = { "gdv:///": { id: "root", mime: 'dir' } } | ||||
|     G_CACHE = { "gdv://": { id: "root", mime: 'dir' } } | ||||
|     return unless _OS.setting.VFS.gdrive and _API.libready _OS.setting.VFS.gdrive.apilink | ||||
|     auth2 = gapi.auth2.getAuthInstance() | ||||
|     return unless auth2 | ||||
|   | ||||
| @@ -80,7 +80,7 @@ class CodeBlock extends this.OS.GUI.BaseApplication | ||||
|         @socket.onopen = () -> | ||||
|             console.log "socket open" | ||||
|             enc = new TextEncoder "utf-8" | ||||
|             me.socket.send enc.encode me.blen + "os:///packages/packages.json" | ||||
|             me.socket.send enc.encode me.blen + "os://packages/packages.json" | ||||
|  | ||||
|         @socket.onmessage =  (e) -> | ||||
|             console.log e.data | ||||
|   | ||||
| @@ -8,7 +8,7 @@ class Files extends this.OS.GUI.BaseApplication | ||||
|         @view = @find "fileview" | ||||
|         @navinput = @find "navinput" | ||||
|         @navbar = @find "nav-bar" | ||||
|         @currdir = if @args and @args.length > 0 then @args[0].asFileHandler() else "home:///".asFileHandler() | ||||
|         @currdir = if @args and @args.length > 0 then @args[0].asFileHandler() else "home://".asFileHandler() | ||||
|         @favo = @find "favouri" | ||||
|         @clipboard = undefined | ||||
|  | ||||
|   | ||||
							
								
								
									
										11
									
								
								src/packages/Setting/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/packages/Setting/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| coffee_files = main.coffee | ||||
|  | ||||
| jsfiles =  | ||||
|  | ||||
| cssfiles = main.css | ||||
|  | ||||
| copyfiles = scheme.html package.json schemes | ||||
|  | ||||
|  | ||||
| PKG_NAME=Setting | ||||
| include ../pkg.mk | ||||
							
								
								
									
										25
									
								
								src/packages/Setting/main.coffee
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/packages/Setting/main.coffee
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| class Setting extends this.OS.GUI.BaseApplication | ||||
|     constructor: (args) -> | ||||
|         super "Setting", args | ||||
|      | ||||
|     main: () -> | ||||
|         me = @ | ||||
|         @container = @find "container" | ||||
|         @container.setTabs [  | ||||
|             { | ||||
|                 text: "Appearance",  | ||||
|                 iconclass: "fa fa-paint-brush",  | ||||
|                 url: "#{@path()}/schemes/appearance.html",  | ||||
|                 f: () -> | ||||
|                     console.log "finish init appearance" | ||||
|             }, | ||||
|             { | ||||
|                 text: "VFS", | ||||
|                 iconclass: "fa fa-inbox" , | ||||
|                 url: "#{@path()}/schemes/vfs.html" , | ||||
|                 f: () -> | ||||
|                     console.log "finish init VFS" | ||||
|             } | ||||
|         ] | ||||
| Setting.singleton = true | ||||
| this.OS.register "Setting", Setting | ||||
							
								
								
									
										11
									
								
								src/packages/Setting/main.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/packages/Setting/main.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| afx-app-window[data-id = "setting-window"] afx-tab-container afx-tab-bar afx-list-view > div > ul > li{ | ||||
|     float:none; | ||||
|     border-radius: 0; | ||||
|     font-weight: bold; | ||||
|     padding-top:3px; | ||||
|     padding-bottom: 3px; | ||||
|     border:0; | ||||
| } | ||||
| afx-app-window[data-id = "setting-window"] afx-tab-container  div[data-ref="container"]{ | ||||
|     border-left: 1px solid #cbcbcb; | ||||
| } | ||||
							
								
								
									
										13
									
								
								src/packages/Setting/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/packages/Setting/package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| { | ||||
|     "app":"Setting", | ||||
|     "name":"System setting", | ||||
|     "description":"System setting", | ||||
|     "info":{ | ||||
|         "author": "Xuan Sang LE", | ||||
|         "email": "xsang.le@gmail.com" | ||||
|     }, | ||||
|     "version":"0.1a", | ||||
|     "category":"System", | ||||
|     "iconclass":"fa fa-wrench", | ||||
|     "mimes":["none"] | ||||
| } | ||||
							
								
								
									
										5
									
								
								src/packages/Setting/scheme.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/packages/Setting/scheme.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| <afx-app-window data-id = "setting-window" apptitle="Setting" width="600" height="400"> | ||||
|    <afx-vbox> | ||||
|         <afx-tab-container data-id = "container" barwidth="120" bar="left"></afx-tab-container> | ||||
|    </afx-vbox> | ||||
| </afx-app-window> | ||||
							
								
								
									
										14
									
								
								src/packages/Setting/schemes/appearance.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/packages/Setting/schemes/appearance.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| <afx-vbox> | ||||
|     <afx-label text = "__(Wallpaper)" class = "header" data-height="30"></afx-label> | ||||
|     <afx-hbox> | ||||
|         <afx-list-view data-width="120"></afx-list-view> | ||||
|         <div> | ||||
|         </div> | ||||
|     </afx-hbox> | ||||
|     <afx-label text = "__(Theme)" class = "header" data-height="30"></afx-label> | ||||
|     <afx-list-view data-height="50" dropdown="true"></afx-list-view> | ||||
|     <afx-hbox data-height="30" > | ||||
|             <div></div> | ||||
|             <afx-button text="__(Save)" iconclass="fa fa-save" data-width="50"></afx-button> | ||||
|     </afx-hbox> | ||||
| </afx-vbox> | ||||
							
								
								
									
										1
									
								
								src/packages/Setting/schemes/vfs.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/packages/Setting/schemes/vfs.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| <afx-label text = "example2" ></afx-label> | ||||
							
								
								
									
										3
									
								
								src/themes/antos/afx-tab-container.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/themes/antos/afx-tab-container.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| afx-tab-container{ | ||||
|     display: block; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user