I think my main point was that we wouldn’t need computeFinalClassNames() which would be overridden in subclasses.
If there’s simple a _classList:Array which would have something like: protected function applyClassNames():void { element.className = className ? className : “” + “ “ + _classList.join(“ “).trim(); } Which could replace the setClassName() method. The rest was simply how to go about building the _classList. We’re probably more or less saying the same thing. > On Feb 26, 2018, at 9:35 PM, Piotr Zarzycki <piotrzarzyck...@gmail.com> wrote: > > Harbs, > > You simply suggesting to have several functions instead of one which > computes things? > > > > On Mon, Feb 26, 2018, 20:21 Harbs <harbs.li...@gmail.com> wrote: > >> Yes. Very thorough explanation. Thanks. >> >> It seems to me like there should be functions for addClassName() and >> removeClassName() which would add and remove the classNames from a list. >> When the className is computed, the list should be concatenated to >> classNames (and possibly typeNames — although we might not need typeNames >> if there’s a general list). We might also want a clearClassNames() method >> to allow removal of “default” classNames for classes which have such a need. >> >> I do think we also need a className setter so classNames could be >> specified in mxml, but we might be able to do away with typeNames. That >> might simplify things. >> >> My $0.02, >> Harbs >> >> >>> On Feb 26, 2018, at 8:09 PM, Piotr Zarzycki <piotrzarzyck...@gmail.com> >> wrote: >>> >>> Hi Alex, >>> >>> Great reading and explanation. My first thought was to have something >> which >>> computes className together, but currently it is needed for MDL only >>> almost. I went with this additional function Utility. >>> I think there won't be too much time when we will need such ability like >>> switching and adding shadow css classes etc. >>> >>> If other also think about such function I would be happy to implement it. >>> It will really get rid of a lot of dump code and even some workarounds in >>> MDL. Live would be much easier. >>> >>> +1 to have such functions. >>> >>> All of that should land on the Wiki or somewhere in the documentation. >>> >>> Waiting for thoughts from others. >>> >>> Thanks, Piotr >>> >>> 2018-02-26 18:50 GMT+01:00 Alex Harui <aha...@adobe.com.invalid>: >>> >>>> Here's my view of this problem space. This is my opinion, not marching >>>> orders. Everything is up for discussion. This is what the current code >>>> is trying to do, though. Also, important note: The order of names in >> the >>>> HTMLElement.className does not matter. CSS style precedence is >> determined >>>> by the order of declarations in the CSS file. OK, lots of reading >> ahead: >>>> >>>> HTML and JavaScript do not really have a first-class notion of a Class >>>> like we do in ActionScript. IOW, no such thing as true subclassing, >>>> especially in a way that supports Reflection APIs like >>>> flash.utils.getQualifiedClassName. So, there is a fixed set of types in >>>> the browser, such as Button, Input, Div (which, by the way, are >>>> implemented as instances of HTMLButtonElement, HTMLInputElement, >>>> HTMLDivElement and not just Button, Input, Div). And thus, a fixed set >> of >>>> Type Selectors in CSS. You can't really make up new Type selectors, >> AFAIK. >>>> >>>> A CSS Class selector is the way that you can distinguish one set of, >> say, >>>> HTMLDivElements, from another set of HTMLDivElements. Since you can't >>>> make subclasses and new type selectors, you set the HTML class or >>>> JavaScript HTMLElement.className/classList on individual HTML elements >> and >>>> declare them to be of class "BigButton" or whatever. It is their form >> of >>>> subclassing. >>>> >>>> In Flex/Flash/SWF/ActionScript, folks are used to being able to make a >>>> subclass of Button called BigButton. And add a Type Selector for it in >> a >>>> CSS file as "BigButton {}" and not ".BigButton {}". And the Flex/Royale >>>> compilers know that if you don't have a BigButton in the final output, >> it >>>> doesn't output the CSS for BigButton, making your app smaller. If you >> use >>>> class selectors and ".BigButton" the Flex/Royale compilers do not search >>>> the code to see if some code sets className to "BigButton" and it really >>>> probably never can since you might have code that does: >>>> >>>> var kinds:Array ["Big", "Little", "Puny"]; >>>> Foo.className = kinds[i] + "Button"; >>>> >>>> So, IMO, in Royale we want to leverage ActionScript types and pretend to >>>> extend the Type Selectors subsystem in CSS. I think we can't actually >>>> truly do it since the "*" selector will be masked by our fake Type >>>> Selectors, but it should be good enough, and it allows the compiler to >>>> prune CSS that isn't used. >>>> >>>> So, I think we want a convention where each class sets the "typename" >>>> property to itself if it wants to support a fake Type Selector. I >>>> considered having the compiler auto-generate it but that isn't really >> PAYG >>>> for small lightweight subclasses that won't ever have a fake Type >> Selector. >>>> >>>> Now in Flex, and Royale's SimpleCSSValuesImpl for SWF, Type Selectors >> from >>>> ancestor classes apply to subclasses. We did that because it was a pain >>>> to have to copy all of Label's Type Selector into a MultilineLabel Type >>>> Selector and that duplication made the CSS file bigger. So we want to >>>> mimic that on the JS side as well. >>>> >>>> So to make all of that happen, any new "type" of component should set >>>> typeName to itself somewhere. So Button and DataGrid should just have >>>> typeNames="Button" or typeNames="DataGrid". But subclasses of these >> types >>>> can append themselves, so MultilineLabel does: typenames+=" >>>> MultilineLabel". That gets appended to Label's typeNames so the >>>> MultilineLabel's final typenames is "Label MultilineLabel". >>>> >>>> Recently, I proposed that the best place to allow appending of typeNames >>>> is in the constructor. It makes appending easier (after the call to >>>> super()) and eliminates the need for simple subclasses to have to add a >>>> createElement call just to override typenames. >>>> >>>> And that's why I think typeNames should never be set from "outside" the >>>> class and maybe we should make it protected. It is there to represent a >>>> new Type Name that folks can use to style EVERY instance of that type in >>>> their app without having to make up a new className and try to to miss >>>> setting that className on some MXML/HTML tag. And similarly the code >> in a >>>> class should never set className on itself, because className should be >>>> reserved to be used by consumers of that component to further >> distinguish >>>> sets of instances of that component from other instances. >>>> >>>> And that's why, when we build complex views, we might make an instance >> of >>>> a TextInput in ComboBoxView and assign it a className. We want to >>>> distinguish that TextInput from other TextInputs in the users app or in >>>> other views. So we assign the TextInput in ComboBox a useful className >>>> like ComboBoxTextInput. We could take the time to actually subclass >>>> TextInput and make a ComboBoxTextInput extends TextInput and then make a >>>> new type selector available in the CSS. That would be cleaner, but it >> has >>>> a couple of disadvantages: I think a subclass is more code than a CSS >>>> class selector, and it clutters the documentation. I did play around >> with >>>> some convention to allow us to prune class selectors by somehow >>>> associating them with a type, but I'm not sure there's a great answer >>>> there. But if you look in HelloWorld.css you'll see unused class >>>> selectors in there. >>>> >>>> There is no API to allow the consumer of the ComboBox to set classNames >> on >>>> the inner TextInput, so we document (or imply by its being in the CSS) >>>> that there is a class called ComboBoxTextInput. We do this in order to >>>> not need advanced selector support on the SWF side. Otherwise, we would >>>> probably build out shadow DOMs and use descendant selectors. >>>> >>>> Then, as if that wasn't complex enough (and you are still reading this), >>>> className is used in the browser as a convenient way to set buckets of >>>> styles on an element. So lots of code in real web pages are dynamically >>>> changing the className/classList to add "shadow" or "emphasized" or >> things >>>> like that. IMO, that's because there is no other way to do that in >>>> HTML/JS/CSS. But because AS classes are not transformable at runtime >> (you >>>> can't turn an instance of Label into MultilineLabel, you have to >>>> instantiate a MultilineLabel and replace the Label instance), and >> because >>>> we have an extensible type selector system, we further want to allow >>>> className to be used to add buckets of style attributes dynamically at >>>> runtime. >>>> >>>> Yes, attributes like "shadow" could modify the typename instead of >>>> className. In the end it does not matter as long as all strings end up >> in >>>> the HTMLElement.classList, and as I said at the top, the order does not >>>> matter. The main goal is to list them all. And, I suppose, to make >>>> changing at runtime easy. I personally would lean away from having a >>>> shadow attribute change typenames because mentally for me, you can't >>>> change an AS class at runtime. So, that's why I think className is >>>> better, and I would imagine that folks who don't use Royale would be >>>> setting className to include "shadow" and know that their other code >> can't >>>> just set className. >>>> >>>> Or maybe we just need to put the code that computes the final >>>> className/classList in an overridable method so that components that do >>>> have attributes that affect the classList can have all of that computed >>>> on-demand. So in UIBase, where we currently set className, we could >> have >>>> >>>> element.className = computeFinalClassNames(); >>>> >>>> Where: >>>> >>>> public function computeFinalClassNames():String >>>> { >>>> return this.className + " " + this.typeNames; >>>> } >>>> >>>> And in MDL, or any component with attributes: >>>> >>>> private var _shadow:String; >>>> public function get shadow():Boolean >>>> { >>>> return _shadow != null; >>>> } >>>> public function set shadow(value:Boolean):void >>>> { >>>> _shadow = value ? "mdl-shadow" : null; >>>> } >>>> override public function computeFinalClassNames():String >>>> { >>>> return super.computeFinalClassNames() + " " + _shadow; >>>> } >>>> >>>> HTH, >>>> -Alex >>>> >>>> On 2/26/18, 5:14 AM, "Harbs" <harbs.li...@gmail.com> wrote: >>>> >>>>> Yes. The changes did break things. >>>>> >>>>> I committed an alternate way of fixing things. >>>>> >>>>> There is a discussion on Github on how strictly we avoid changing >>>>> typeNames: >>>>> https://na01.safelinks.protection.outlook.com/?url= >>>> https%3A%2F%2Fgithub.co >>>>> m%2Fapache%2Froyale-asjs%2Fcommit%2Fc01ebc2cc946570006d8f5cea607 >>>> 182e16eaf0 >>>>> fe%23r27788371&data=02%7C01%7Caharui%40adobe.com% >>>> 7Cb8a821250e814e93f88308d >>>>> 57d1af51c%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>> 7C636552477096186200& >>>>> sdata=%2BwCkmLjlAHyDACH294G4bEutIbK%2FDLsAkkSIhUc3cqA%3D&reserved=0 >>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>> https%3A%2F%2Fgithub.c >>>>> om%2Fapache%2Froyale-asjs%2Fcommit%2Fc01ebc2cc946570006d8f5cea607 >>>> 182e16eaf >>>>> 0fe%23r27788371&data=02%7C01%7Caharui%40adobe.com% >>>> 7Cb8a821250e814e93f88308 >>>>> d57d1af51c%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>> 7C636552477096186200 >>>>> &sdata=%2BwCkmLjlAHyDACH294G4bEutIbK%2FDLsAkkSIhUc3cqA%3D&reserved=0> >>>>> >>>>> Thoughts? >>>>> Harbs >>>>> >>>>>> On Feb 25, 2018, at 6:15 PM, Piotr Zarzycki < >> piotrzarzyck...@gmail.com> >>>>>> wrote: >>>>>> >>>>>> I just pushed changes to MDL. With couple of exceptions all typeNames >>>>>> landed to constructor. Thanks to that changes some components started >> to >>>>>> work better. I'm wondering whether I do not break anything. >>>>>> >>>>>> Harbs, >>>>>> >>>>>> If you are using something more than MDL Dialog in your application it >>>>>> would be great to get feedback whether I didn't break for you >> anything. >>>>>> :) >>>>>> >>>>>> Thanks, Piotr >>>>>> >>>>>> 2018-02-24 17:53 GMT+01:00 Alex Harui <aha...@adobe.com.invalid>: >>>>>> >>>>>>> Sorry, I wasn't clear. The function itself can go in Basic or better >>>>>>> yet, >>>>>>> Core, since I don't think it has any dependencies and can be use >>>>>>> anywhere. >>>>>>> I was just saying that I would prefer if none of the Basic components >>>>>>> or >>>>>>> UIBase used your new function. You should be able to write a Royale >>>>>>> app >>>>>>> with Basic and not bring in that function. Not that it isn't useful, >>>>>>> but >>>>>>> it isn't truly "basic" given that Basic components are supposed to >> have >>>>>>> typeNames. >>>>>>> >>>>>>> My 2 cents, >>>>>>> -Alex >>>>>>> >>>>>>> On 2/24/18, 8:17 AM, "Piotr Zarzycki" <piotrzarzyck...@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>>> I was going to put it somewhere in the Basic, but I can leave it in >>>>>>>> the >>>>>>>> MDL. The className can be undefined in the case where you wanted to >>>>>>>> add >>>>>>>> something to such "undefinded" string you will got: >>>>>>>> >>>>>>>> "undefined myClass". - I probably cannot escape from that... >>>>>>>> >>>>>>>> Maybe I'm missing some way. >>>>>>>> >>>>>>>> 2018-02-24 17:00 GMT+01:00 Alex Harui <aha...@adobe.com.invalid>: >>>>>>>> >>>>>>>>> Looks ok to me. Seems like you don't need COMPILE::JS. It should >>>>>>>>> work >>>>>>>>> on >>>>>>>>> all platforms. We can have lots of utility functions in >>>>>>>>> org.apache.royale.utils. >>>>>>>>> >>>>>>>>> In terms of optimization (size/performance) a function like this is >>>>>>>>> potentially overkill for the Basic set. It is fine for MDL since >> MDL >>>>>>>>> has >>>>>>>>> already picked up additional overhead in order to style >> "everything". >>>>>>>>> But >>>>>>>>> I subscribe to what I learned from a wise programmer many years >> ago: >>>>>>>>> If >>>>>>>>> you truly understand the problem space, you can often find a >> smaller, >>>>>>>>> faster solution. Like I said, if you know that there "must" be at >>>>>>>>> least >>>>>>>>> one string from typenames as the last string, the replacement is >> much >>>>>>>>> easier. All of the extra null checking and trimming in your >> version >>>>>>>>> is >>>>>>>>> not really needed for the specific problem of replacing from a set >> of >>>>>>>>> string you know about that don't need trimming. >>>>>>>>> >>>>>>>>> My 2 cents, >>>>>>>>> -Alex >>>>>>>>> >>>>>>>>> On 2/24/18, 4:50 AM, "Piotr Zarzycki" <piotrzarzyck...@gmail.com> >>>>>>> wrote: >>>>>>>>> >>>>>>>>>> Alex, >>>>>>>>>> >>>>>>>>>> I used your suggestion, added some additional things and I end up >>>>>>>>>> with >>>>>>>>>> following utility [1]. Usage will looks like that: [2]. Do you >>>>>>>>>> think it >>>>>>>>>> could be part of the framework ? It's working nicely with MDL. >>>>>>>>>> >>>>>>>>>> [1] >>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>> https%3A%2F%2Fpaste.apa >>>>>>>>>> che.org%2FtsaF&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>> 7C91e633a78bea4fc4c89908d >>>>>>>>>> 57b853bdf%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>>>>>>> 7C636550734524475642& >>>>>>>>>> sdata=O%2BZn0ajlM6A2Q0tBEBvDDtZZcNQYNOBsCn1kO0fgdPo%3D&reserved=0 >>>>>>>>>> [2] >>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>> https%3A%2F%2Fpaste.apa >>>>>>>>>> che.org%2Fxbfb&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>> 7C91e633a78bea4fc4c89908d >>>>>>>>>> 57b853bdf%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>>>>>>> 7C636550734524475642& >>>>>>>>>> >> sdata=j0n83ksobPZfR0YY7oMBJMU1dzx7fcW%2FNOmLd1S%2BL0o%3D&reserved=0 >>>>>>>>>> >>>>>>>>>> Thanks, Piotr >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 2018-02-23 21:31 GMT+01:00 Alex Harui <aha...@adobe.com.invalid>: >>>>>>>>>> >>>>>>>>>>> Well, whether you like it or not, the wrapper is mapping a >>>>>>>>>>> space-delimited >>>>>>>>>>> list to the array so if you manipulate the array you have to >>>>>>>>>>> back-calculate the string. IMO, in HTML, the "class" property >> is a >>>>>>>>>>> string >>>>>>>>>>> and people are used to entering a space-delimited list. That's >> why >>>>>>>>> we >>>>>>>>>>> have a className property on UIBase. So that folks have >> something >>>>>>>>>>> similar >>>>>>>>>>> in MXML. >>>>>>>>>>> >>>>>>>>>>> So, unfortunately, your problem can't be as simple as >> manipulating >>>>>>>>>>> classList via its APIs. Also consider that the classList API >> might >>>>>>>>>>> itself >>>>>>>>>>> be doing a string search in the array. >>>>>>>>>>> >>>>>>>>>>> If you have the string "Piotr Alex Harbs" and want to replace >> Alex >>>>>>>>> with >>>>>>>>>>> Peter and you know that Alex can't be the last item because the >>>>>>>>>>> last >>>>>>>>>>> item >>>>>>>>>>> is the typeName which is never null or "", then a simple >>>>>>>>> String.replace >>>>>>>>>>> call should work. >>>>>>>>>>> >>>>>>>>>>> className = className.replace(oldName + " ", newName + " "); >>>>>>>>>>> >>>>>>>>>>> HTH, >>>>>>>>>>> -Alex >>>>>>>>>>> >>>>>>>>>>> On 2/23/18, 12:21 PM, "Piotr Zarzycki" < >> piotrzarzyck...@gmail.com> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> It's just swapping. If I have following code [1] - it is easier >> to >>>>>>>>>>>> manipulate classList than className which is simple string. What >>>>>>>>>>> utility >>>>>>>>>>>> could look like ? It would be manipulating strings, which is >> less >>>>>>>>>>>> convenient. >>>>>>>>>>>> >>>>>>>>>>>> [1] >>>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>> https%3A%2F%2Fpaste.apa >>>>>>>>>>>> che.org%2Fat0H&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>> 7C061f7278ca3748bfaee408d >>>>>>>>>>>> 57afb14a9%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>>>>>>>>> 7C636550141162759398& >>>>>>>>>>>> sdata=76W6lkZuIxUbO5mDtenl4g88zmRPsHaA1evyvvk7O08%3D&reserved=0 >>>>>>>>>>>> >>>>>>>>>>>> 2018-02-23 21:11 GMT+01:00 Alex Harui <aha...@adobe.com.invalid >>> : >>>>>>>>>>>> >>>>>>>>>>>>> Just compiler. No need for asjs changes at this time I think. >>>>>>>>>>>>> >>>>>>>>>>>>> I'm still unclear on why you need to manipulate classList >>>>>>>>> directly. >>>>>>>>>>> Is >>>>>>>>>>>>> there some code that is in the JS from Material that >> manipulates >>>>>>>>>>>>> classList? Or are you just trying to swap out a name on the >>>>>>>>>>> classList? >>>>>>>>>>>>> If the latter, why not just create some utility function that >>>>>>>>>>> operates >>>>>>>>>>>>> on >>>>>>>>>>>>> className and not the underlying element? >>>>>>>>>>>>> >>>>>>>>>>>>> -Aleex >>>>>>>>>>>>> >>>>>>>>>>>>> On 2/23/18, 11:58 AM, "Piotr Zarzycki" < >>>> piotrzarzyck...@gmail.com >>>>>>>> >>>>>>>>>>>>> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> You did merge vivid compiler changes or also changes from asjs >>>>>>>>>>>>> repository. >>>>>>>>>>>>>> >>>>>>>>>>>>>> As for my work on MDL. I ended up with something like that >> [1]. >>>>>>>>> The >>>>>>>>>>>>>> question now how to propagate that code ? This is code for the >>>>>>>>>>>>> component >>>>>>>>>>>>>> which manipulates classList. Should I create some parent >> class ? >>>>>>>>>>>>> General/ >>>>>>>>>>>>>> for MDL only, or Bead which will be included into such >> classes ? >>>>>>>>>>>>>> Theoretically bead could listen for initComplete. >>>>>>>>>>>>>> >>>>>>>>>>>>>> [1] >>>>>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>> https%3A%2F%2Fpaste.apa >>>>>>>>>>>>>> che.org%2F1dy2&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>> 7C8e313e7d7f9d4608759f08d >>>>>>>>>>>>>> 57af7d477%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>>>>>>>>>>> 7C636550127203173382& >>>>>>>>>>>>>> sdata=NkxHZQlHtOeJzWC%2BIyxxst89DlX0CCUa9VeGpztTL2s% >>>>>>> 3D&reserved=0 >>>>>>>>>>>>>> >>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>> Piotr >>>>>>>>>>>>>> >>>>>>>>>>>>>> 2018-02-23 20:53 GMT+01:00 Alex Harui >> <aha...@adobe.com.invalid >>>>>>>> : >>>>>>>>>>>>>> >>>>>>>>>>>>>>> I think I have Maven using the basic.css appropriately. >> There >>>>>>>>> is >>>>>>>>>>> no >>>>>>>>>>>>> way >>>>>>>>>>>>>>> to default to including a SWC in Maven and then not use it >> in a >>>>>>>>>>> child >>>>>>>>>>>>>>> project, so all example poms that aren't MDL need to bring in >>>>>>>>> the >>>>>>>>>>>>>>> BasicTheme. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Also, I had to merge the compiler change from vivid-ui-set >>>>>>>>> branch >>>>>>>>>>> to >>>>>>>>>>>>> get >>>>>>>>>>>>>>> the theme SWC to work in Maven. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -Alex >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 2/23/18, 8:04 AM, "Alex Harui" <aha...@adobe.com.INVALID> >>>>>>>>>>> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> MDL does not want the basic.css theme. That is why we are >>>>>>>>> moving >>>>>>>>>>>>>>> styles >>>>>>>>>>>>>>>> from Basic:swc's defaults.css to themes/basic.css. I see >> that >>>>>>>>>>> the >>>>>>>>>>>>>>> Maven >>>>>>>>>>>>>>>> plugin doesn't allow specification of a theme, so that's >>>>>>>>> another >>>>>>>>>>>>> task. >>>>>>>>>>>>>>> I >>>>>>>>>>>>>>>> can do it if nobody wants to take that on. So, yes, move >> the >>>>>>>>>>> Button >>>>>>>>>>>>>>>> selectors from defaults.css to basic.css if that helps, but >> I >>>>>>>>>>> will >>>>>>>>>>>>> say >>>>>>>>>>>>>>>> that I didn't notice those styles taking effect in my local >>>>>>>>>>> version >>>>>>>>>>>>> of >>>>>>>>>>>>>>>> MDLTabsExample and assumed that mdl had overridden those >>>>>>>>> styles. >>>>>>>>>>> As >>>>>>>>>>>>>>>> Carlos said, in the end we want basic.css to be compliant >> CSS >>>>>>>>> so >>>>>>>>>>>>> don't >>>>>>>>>>>>>>>> move anything with ClassReference as the value without >>>>>>>>> discussing >>>>>>>>>>>>>>> first. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> TypeNames should be set after the call to super(). Look at >>>>>>>>> Label >>>>>>>>>>>>> and >>>>>>>>>>>>>>>> MultilineLabel. They are working fine for me. They are >> being >>>>>>>>>>> used >>>>>>>>>>>>> in >>>>>>>>>>>>>>>> RoyaleStore. There might have been issues before yesterday >>>>>>>>>>> because >>>>>>>>>>>>>>> lots >>>>>>>>>>>>>>>> of Basic components were setting ClassName, but I went and >>>>>>>>>>> cleaned >>>>>>>>>>>>>>> that up >>>>>>>>>>>>>>>> although I could have missed a few. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> In complex Views, you have two choices: Make a subclass or >>>>>>>>>>> assign >>>>>>>>>>>>> the >>>>>>>>>>>>>>>> className. We should try to set set typeNames. In fact, >>>>>>>>> maybe >>>>>>>>>>> we >>>>>>>>>>>>>>> should >>>>>>>>>>>>>>>> make typeNames protected. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> So, for ComboBoxView, the current code is setting a custom >>>>>>>>>>> className >>>>>>>>>>>>>>> which >>>>>>>>>>>>>>>> is valid. Users can then style it further by adding a >>>>>>>>>>>>>>> .ComboBoxTextInput >>>>>>>>>>>>>>>> selector to their CSS. However, class selectors are not >>>>>>>>> pruned by >>>>>>>>>>>>> the >>>>>>>>>>>>>>>> compiler. So in other cases, we have created a real >> subclass >>>>>>>>> (in >>>>>>>>>>>>> this >>>>>>>>>>>>>>>> case "ComboBoxTextInput extends TextInput) and then the CSS >>>>>>>>> would >>>>>>>>>>>>> not >>>>>>>>>>>>>>> have >>>>>>>>>>>>>>>> the "." in front so it would look like a type selector and >> the >>>>>>>>>>>>> compiler >>>>>>>>>>>>>>>> would prune it from apps that don't use a ComboBox. Not >> sure >>>>>>>>>>> which >>>>>>>>>>>>> is >>>>>>>>>>>>>>>> better/faster, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Regarding Peter's point about Labels in Menus. The issue >>>>>>>>> isn't >>>>>>>>>>> that >>>>>>>>>>>>>>> Flash >>>>>>>>>>>>>>>> can't handle it. It is that our SimpleCSSValuesImpl lookup >>>>>>>>>>> doesn't >>>>>>>>>>>>>>> handle >>>>>>>>>>>>>>>> descendant and other advanced selectors. The techniques for >>>>>>>>>>>>>>> ComboBoxView >>>>>>>>>>>>>>>> is how we avoid requiring a more complex lookup on the SWF >>>>>>>>> side. >>>>>>>>>>>>> The >>>>>>>>>>>>>>> menu >>>>>>>>>>>>>>>> code should not be setting typeNames on other things, only >>>>>>>>>>> itself. >>>>>>>>>>>>> I'm >>>>>>>>>>>>>>>> not sure if on the JS side, avoiding descendant selectors >>>>>>>>> speeds >>>>>>>>>>>>>>> things up >>>>>>>>>>>>>>>> in the browser or not. We could create an IValuesImpl with >>>>>>>>>>>>> descendant >>>>>>>>>>>>>>>> selector support on the SWF side and probably will someday. >>>>>>>>>>>>> Volunteers >>>>>>>>>>>>>>>> are welcome to take that on. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Of course, I could be wrong... >>>>>>>>>>>>>>>> -Alex >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 2/23/18, 7:37 AM, "Piotr Zarzycki" >>>>>>>>> <piotrzarzyck...@gmail.com >>>>>>>>>> >>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> A bit more on point 1. and let's take for the example >> simple >>>>>>>>>>>>> Button. >>>>>>>>>>>>>>> We >>>>>>>>>>>>>>>>> have some styles for Button in Basic.css. MDL Button >> extends >>>>>>>>>>>>>>> TextButton - >>>>>>>>>>>>>>>>> some styles naturally has been added from default.css. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> If I create theme I should achieve that my theme classes >> will >>>>>>>>>>>>> override >>>>>>>>>>>>>>>>> default.css Button styles and I should be good yes ? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Am I understand it correctly ? >>>>>>>>>>>>>>>>> Thanks, Piotr >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> 2018-02-23 16:32 GMT+01:00 Piotr Zarzycki >>>>>>>>>>>>> <piotrzarzyck...@gmail.com >>>>>>>>>>>>>> : >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Alex, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I have started to work on MDL and move all typeNames from >>>>>>>>>>>>>>> createElement >>>>>>>>>>>>>>>>>> to >>>>>>>>>>>>>>>>>> constructor. Unfortunately something is not right here. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> 1) I still need to exclude BasicJS.swc:default.css - I did >>>>>>>>> add >>>>>>>>>>>>>>> theme to >>>>>>>>>>>>>>>>>> MaterialDesignLite module maven build - it didn't help. >>>>>>>>>>>>>>>>>> 2) If I cannot setup typeNames and classNames inside my >>>>>>>>>>>>> component, >>>>>>>>>>>>>>> how >>>>>>>>>>>>>>>>>> can >>>>>>>>>>>>>>>>>> I achieve switching some UI parts of the component ? In >> MDL >>>>>>>>>>> it is >>>>>>>>>>>>>>> quite >>>>>>>>>>>>>>>>>> common that if I would like to change component I'm adding >>>>>>>>> to >>>>>>>>>>> it >>>>>>>>>>>>> css >>>>>>>>>>>>>>>>>> class. >>>>>>>>>>>>>>>>>> [1] - This is the example. If I remove line it doesn't >>>>>>>>> work. >>>>>>>>>>>>> There >>>>>>>>>>>>>>> are >>>>>>>>>>>>>>>>>> several places in MDL where we are doing such things. It >> is >>>>>>>>>>>>> common >>>>>>>>>>>>>>> in >>>>>>>>>>>>>>>>>> JS >>>>>>>>>>>>>>>>>> world doing such things. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> typeNames = element.className; >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Thoughts ? >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> [1] >>>>>>>>>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>>> https%3A%2F%2Fpaste.a >>>>>>>>>>>>>>>>>> p >>>>>>>>>>>>>>>>>> ache.org%2Fat0H&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>>>> 7Ca44c142f0ddc455c70bf >>>>>>>>>>>>>>>>>> 0 >>>>>>>>>>>>>>>>>> 8d57ad361e6%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>>> cee1%7C0%7C0%7C636549970664822 >>>>>>>>>>>>>>>>>> 4 >>>>>>>>>>>>>>>>>> 53&sdata=1sSgdfBy%2BAv%2FsFIYwVFFHvVlhtJ3w3TW% >>>>>>>>>>>>>>> 2FiDEyPVYGmo%3D&reserved=0 >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>>>>>> Piotr >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> 2018-02-23 15:55 GMT+01:00 Piotr Zarzycki >>>>>>>>>>>>>>> <piotrzarzyck...@gmail.com>: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Peter, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> That is interesting what you are saying. What will happen >>>>>>>>>>> then >>>>>>>>>>>>> if >>>>>>>>>>>>>>> you >>>>>>>>>>>>>>>>>>> have class which extends other one. The parent class is >>>>>>>>>>> setting >>>>>>>>>>>>>>>>>>> typeNames >>>>>>>>>>>>>>>>>>> and derived one also before super? The parent one will >>>>>>>>>>> override >>>>>>>>>>>>> it? >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> I cannot check now how typeNames is implemented. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Piotr >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On Fri, Feb 23, 2018, 15:13 Peter Ent >>>>>>>>>>> <p...@adobe.com.invalid> >>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I have been guilty of this and have been using typeNames >>>>>>>>>>> now. >>>>>>>>>>>>> I've >>>>>>>>>>>>>>>>>>>> found >>>>>>>>>>>>>>>>>>>> that I need to set typeNames before calling super() in >>>>>>>>> the >>>>>>>>>>>>>>>>>>>> constructor. I >>>>>>>>>>>>>>>>>>>> thought it was done afterwards, but if I set typeNames >>>>>>>>> after >>>>>>>>>>>>>>> calling >>>>>>>>>>>>>>>>>>>> super(), the typeName I set does not show up in the HTML >>>>>>>>>>>>> produced. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Also, suppose I have this: A Menu with a label inside of >>>>>>>>> it. >>>>>>>>>>>>>>> People >>>>>>>>>>>>>>>>>>>> will >>>>>>>>>>>>>>>>>>>> want to change the background color of the menu and the >>>>>>>>>>> color >>>>>>>>>>>>> of >>>>>>>>>>>>>>> the >>>>>>>>>>>>>>>>>>>> label's text. If I were doing this in plain HTML/JS/CSS, >>>>>>>>> I >>>>>>>>>>>>> would >>>>>>>>>>>>>>> set >>>>>>>>>>>>>>>>>>>> a >>>>>>>>>>>>>>>>>>>> selector: .Menu .Label { color: blue; } but that's not >>>>>>>>>>>>> supported >>>>>>>>>>>>>>> in >>>>>>>>>>>>>>>>>>>> the >>>>>>>>>>>>>>>>>>>> Flash Player. So when I set up the typeName for the >> label >>>>>>>>>>>>> inside >>>>>>>>>>>>>>> of >>>>>>>>>>>>>>>>>>>> the >>>>>>>>>>>>>>>>>>>> Menu should I set it to: Menu_Label or MenuLabel or >>>>>>>>>>> Menu-Label? >>>>>>>>>>>>>>> And >>>>>>>>>>>>>>>>>>>> is >>>>>>>>>>>>>>>>>>>> using "." in a selector name a good idea? I would think >>>>>>>>> the >>>>>>>>>>> CSS >>>>>>>>>>>>>>>>>>>> processor >>>>>>>>>>>>>>>>>>>> in the browser would be confused between ".x.y" and ".x >>>>>>>>> .y" >>>>>>>>>>>>> which >>>>>>>>>>>>>>> can >>>>>>>>>>>>>>>>>>>> also >>>>>>>>>>>>>>>>>>>> be written as ".x.y". Basically, we should have a >> consist >>>>>>>>>>>>> naming >>>>>>>>>>>>>>>>>>>> pattern >>>>>>>>>>>>>>>>>>>> here. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> ‹peter >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> On 2/23/18, 4:09 AM, "Gabe Harbs" < >> harbs.li...@gmail.com >>>>>>>> >>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> There¹s some edge cases which seem problematic. One >>>>>>>>>>> example: >>>>>>>>>>>>>>>>>>>>> ComboBoxBiew has the following: >>>>>>>>>>>>>>>>>>>>> input = new TextInput(); >>>>>>>>>>>>>>>>>>>>> input.className = "ComboBoxTextInput"; >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> button = new TextButton(); >>>>>>>>>>>>>>>>>>>>> button.className = >>>>>>>>>>>>>>>>>>>>> "opt_org-apache.royale-html-ComboBox_Button"; >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Input and button are both external to the view class, >>>>>>>>> but >>>>>>>>>>> are >>>>>>>>>>>>>>>>>>>> managed by >>>>>>>>>>>>>>>>>>>>> the view class. On the other hand, there is a chance >>>>>>>>> that >>>>>>>>>>> the >>>>>>>>>>>>>>> user >>>>>>>>>>>>>>>>>>>> might >>>>>>>>>>>>>>>>>>>>> wan to style them. I¹m not sure whether className or >>>>>>>>>>>>> typeNames is >>>>>>>>>>>>>>>>>>>> more >>>>>>>>>>>>>>>>>>>>> appropriate hereŠ >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Harbs >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> On Feb 23, 2018, at 11:03 AM, Gabe Harbs >>>>>>>>>>>>>>> <harbs.li...@gmail.com> >>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> I¹ll help. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> On Feb 23, 2018, at 10:50 AM, Alex Harui >>>>>>>>>>>>>>>>>>>> <aha...@adobe.com.INVALID> >>>>>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Quick note before I shut down for the night. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> UIBase has both a typeNames and className property. >>>>>>>>>>>>>>> TypeNames is >>>>>>>>>>>>>>>>>>>> used >>>>>>>>>>>>>>>>>>>>>>> to >>>>>>>>>>>>>>>>>>>>>>> emulate Flex-like type selectors in the CSS lookup. >>>>>>>>> It >>>>>>>>>>>>>>> should be >>>>>>>>>>>>>>>>>>>> set >>>>>>>>>>>>>>>>>>>>>>> in >>>>>>>>>>>>>>>>>>>>>>> the constructor and never set from outside the class. >>>>>>>>>>>>> There >>>>>>>>>>>>>>> are >>>>>>>>>>>>>>>>>>>> a >>>>>>>>>>>>>>>>>>>> few >>>>>>>>>>>>>>>>>>>>>>> classes in Basic and lots of classes in MDL that >>>>>>>>> should >>>>>>>>>>> be >>>>>>>>>>>>>>>>>>>> upgraded >>>>>>>>>>>>>>>>>>>> to >>>>>>>>>>>>>>>>>>>>>>> set >>>>>>>>>>>>>>>>>>>>>>> typeNames in the constructor. Subclasses can append >>>>>>>>> to >>>>>>>>>>> the >>>>>>>>>>>>>>> base >>>>>>>>>>>>>>>>>>>>>>> class's >>>>>>>>>>>>>>>>>>>>>>> typeNames >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> className is the opposite. It should never be set >>>>>>>>>>> inside >>>>>>>>>>>>> the >>>>>>>>>>>>>>>>>>>>>>> component's >>>>>>>>>>>>>>>>>>>>>>> class. It is for users of that component to set >>>>>>>>> styles >>>>>>>>>>> on >>>>>>>>>>>>> the >>>>>>>>>>>>>>>>>>>>>>> component. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Can we get a volunteer to clean this up? >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>>>>>>>>>>> -Alex >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Piotr Zarzycki >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Patreon: >>>>>>>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>>> https%3A%2F%2Fwww.pa >>>>>>>>>>>>>>>>>> t >>>>>>>>>>>>>>>>>> reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui% >> 40adobe.com >>>>>>>>>>>>>>> %7Ca44c142f0dd >>>>>>>>>>>>>>>>>> c >>>>>>>>>>>>>>>>>> 455c70bf08d57ad361e6%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>>> cee1%7C0%7C0%7C636549 >>>>>>>>>>>>>>>>>> 9 >>>>>>>>>>>>>>>>>> 70664822453&sdata=RxqP6b0L0BmWiiX3t6QdtbiA3YwoJR >>>>>>>>>>>>>>> FFjSWC8LaxmWI%3D&reserve >>>>>>>>>>>>>>>>>> d >>>>>>>>>>>>>>>>>> =0 >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>>> https%3A%2F%2Fwww.pa >>>>>>>>>>>>>>>>>> t >>>>>>>>>>>>>>>>>> reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui% >> 40adobe.com >>>>>>>>>>>>>>> %7Ca44c142f0dd >>>>>>>>>>>>>>>>>> c >>>>>>>>>>>>>>>>>> 455c70bf08d57ad361e6%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>>> cee1%7C0%7C0%7C636549 >>>>>>>>>>>>>>>>>> 9 >>>>>>>>>>>>>>>>>> 70664822453&sdata=RxqP6b0L0BmWiiX3t6QdtbiA3YwoJR >>>>>>>>>>>>>>> FFjSWC8LaxmWI%3D&reserve >>>>>>>>>>>>>>>>>> d >>>>>>>>>>>>>>>>>> =0>* >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Piotr Zarzycki >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Patreon: >>>>>>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>>> https%3A%2F%2Fwww.pat >>>>>>>>>>>>>>>>> r >>>>>>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com >>>>>>>>>>>>>>> %7Ca44c142f0ddc4 >>>>>>>>>>>>>>>>> 5 >>>>>>>>>>>>>>>>> 5c70bf08d57ad361e6%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>>> cee1%7C0%7C0%7C636549970 >>>>>>>>>>>>>>>>> 6 >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> 64822453&sdata=RxqP6b0L0BmWiiX3t6QdtbiA3YwoJR >>>>>>>>>>>>> FFjSWC8LaxmWI%3D&reserved= >>>>>>>>>>>>>>>>> 0 >>>>>>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>>> https%3A%2F%2Fwww.pat >>>>>>>>>>>>>>>>> r >>>>>>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com >>>>>>>>>>>>>>> %7Ca44c142f0ddc4 >>>>>>>>>>>>>>>>> 5 >>>>>>>>>>>>>>>>> 5c70bf08d57ad361e6%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>>> cee1%7C0%7C0%7C636549970 >>>>>>>>>>>>>>>>> 6 >>>>>>>>>>>>>>>>> 64822453&sdata=RxqP6b0L0BmWiiX3t6QdtbiA3YwoJR >>>>>>>>>>>>>>> FFjSWC8LaxmWI%3D&reserved=0> >>>>>>>>>>>>>>>>> * >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> >>>>>>>>>>>>>> Piotr Zarzycki >>>>>>>>>>>>>> >>>>>>>>>>>>>> Patreon: >>>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>> 7C8e313e7d7f9d46 >>>>>>>>>>>>>> 08759f08d57af7d477%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>> cee1%7C0%7C0%7C6365501272 >>>>>>>>>>>>> >>>>>>>>>>>>>> 03173382&sdata=CTWhfUy0ILGvvx3HwRbmnkSZ3Nf5ay >>>>>>>>>>> lHwldhGDulDOE%3D&reserved=0 >>>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>> 7C8e313e7d7f9d46 >>>>>>>>>>>>>> 08759f08d57af7d477%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>> cee1%7C0%7C0%7C6365501272 >>>>>>>>>>>>>> 03173382&sdata=CTWhfUy0ILGvvx3HwRbmnkSZ3Nf5ay >>>>>>>>>>>>> lHwldhGDulDOE%3D&reserved=0>* >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> >>>>>>>>>>>> Piotr Zarzycki >>>>>>>>>>>> >>>>>>>>>>>> Patreon: >>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>> 7C061f7278ca3748 >>>>>>>>>>>> bfaee408d57afb14a9%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>> cee1%7C0%7C0%7C6365501411 >>>>>>>>>>> >>>>>>>>>>>> 62759398&sdata=rpVtPRF2nJb03vSLEIQiK0K3uzGMs6 >>>>>>>>> 6vbTZtOxsVXKs%3D&reserved=0 >>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>> 7C061f7278ca3748 >>>>>>>>>>>> bfaee408d57afb14a9%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>> cee1%7C0%7C0%7C6365501411 >>>>>>>>>>>> 62759398&sdata=rpVtPRF2nJb03vSLEIQiK0K3uzGMs6 >>>>>>>>>>> 6vbTZtOxsVXKs%3D&reserved=0>* >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> >>>>>>>>>> Piotr Zarzycki >>>>>>>>>> >>>>>>>>>> Patreon: >>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>> 7C91e633a78bea4f >>>>>>>>>> c4c89908d57b853bdf%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>> cee1%7C0%7C0%7C6365507345 >>>>>>>>>> 24475642&sdata=dG08yDIsBZVQ1XNIJIjCCqFgQwgmNQ >>>>>>>>> HJQSQ7ds5O%2F38%3D&reserved=0 >>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>> 7C91e633a78bea4f >>>>>>>>>> c4c89908d57b853bdf%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>> cee1%7C0%7C0%7C6365507345 >>>>>>>>>> 24475642&sdata=dG08yDIsBZVQ1XNIJIjCCqFgQwgmNQ >>>>>>>>> HJQSQ7ds5O%2F38%3D&reserved=0 >>>>>>>>>>> * >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> >>>>>>>> Piotr Zarzycki >>>>>>>> >>>>>>>> Patreon: >>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >>>>>>> https%3A%2F%2Fwww.patr >>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>> 7C0c4af859745d4f >>>>>>>> 1e55fb08d57ba22da3%7Cfa7b1b5a7b34438794aed2c178de >>>>>>> cee1%7C0%7C0%7C6365508588 >>>>>>>> 36682085&sdata=vcTmV4sMSk3ZfhGCKd4mX6%2ByAb8saVYLysyZnCX%2FV8M%3D& >>>>>>> reserved >>>>>>>> =0 >>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>>>>> https%3A%2F%2Fwww.patr >>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>> 7C0c4af859745d4f >>>>>>>> 1e55fb08d57ba22da3%7Cfa7b1b5a7b34438794aed2c178de >>>>>>> cee1%7C0%7C0%7C6365508588 >>>>>>>> 36682085&sdata=vcTmV4sMSk3ZfhGCKd4mX6%2ByAb8saVYLysyZnCX%2FV8M%3D& >>>>>>> reserved >>>>>>>> =0>* >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> >>>>>> Piotr Zarzycki >>>>>> >>>>>> Patreon: >>>>>> *https://na01.safelinks.protection.outlook.com/?url= >>>> https%3A%2F%2Fwww.pat >>>>>> reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com >>>> %7Cb8a821250e81 >>>>>> 4e93f88308d57d1af51c%7Cfa7b1b5a7b34438794aed2c178de >>>> cee1%7C0%7C0%7C6365524 >>>>>> 77096186200&sdata=9ERkTTu4TsGRD2j1uIrU1OggCl0EyW >>>> yGL2HD7sl5ALI%3D&reserved >>>>>> =0 >>>>>> >>>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>> https%3A%2F%2Fwww.pat >>>>>> reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com >>>> %7Cb8a821250e81 >>>>>> 4e93f88308d57d1af51c%7Cfa7b1b5a7b34438794aed2c178de >>>> cee1%7C0%7C0%7C6365524 >>>>>> 77096186200&sdata=9ERkTTu4TsGRD2j1uIrU1OggCl0EyW >>>> yGL2HD7sl5ALI%3D&reserved >>>>>> =0>* >>>>> >>>> >>>> >>> >>> >>> -- >>> >>> Piotr Zarzycki >>> >>> Patreon: *https://www.patreon.com/piotrzarzycki >>> <https://www.patreon.com/piotrzarzycki>* >> >> >>