[HN Gopher] Microsoft Fast Design
       ___________________________________________________________________
        
       Microsoft Fast Design
        
       Author : no_wizard
       Score  : 381 points
       Date   : 2020-08-07 15:55 UTC (7 hours ago)
        
 (HTM) web link (www.fast.design)
 (TXT) w3m dump (www.fast.design)
        
       | chrisweekly wrote:
       | Web Components, as a standard, remain problematic. Among other
       | things, they fail to address the critical need for server-side
       | rendering.
        
         | ramon wrote:
         | I don't think that was the objetive of Web Components at all
         | but to really create open standards around what React started a
         | long time ago. Server-side rendering is not going away ever,
         | there will always be a way to optimize things and to do tree-
         | shaking and all so don't think that a new technology replaces
         | everything else the rest of the eco-system will still remain
         | with a clear purpose. You can do a small little project without
         | builds and all but every "real" project will still need a build
         | process in the end this concept was inherited from Continuous
         | Integration and it's not going away.
        
       | jjcm wrote:
       | I love seeing a wider adoption of webcomponents, but I have some
       | complaints about this library, mainly because they're really
       | pushing the whole, "lightweight and low memory" lines.
       | 
       | Take a look at the accordian component (the very first one in
       | their system) and check it out in the dom inspector - it has a
       | shadowroot that has precisely one child: a <slot> element. In
       | this situation a shadowroot does nothing to help. All it means is
       | instead of just creating children for the element, you have to
       | create them and add "slot='item'" to all of them. Shadowroots are
       | great when you need encapsulation of styles or static non-content
       | UI, but with this outer element neither of those are true. There
       | isn't any additional UI, nor styles. This is something I see a
       | lot in lazy libraries - they automatically create a separate dom
       | tree even if it isn't needed whatsoever.
       | 
       | This tells me either the library requires this every time (going
       | against the "lightweight / low memory" motto), or the developer
       | for this one didn't have enough understanding of when to use
       | shadowroots.
       | 
       | That's not to say this is all bad though - their design system
       | tokens are really nice and provide a lot of flexibility. I'll
       | probably emulate a lot of them for the next webcomponent based
       | design system I'm working on. Their algorithmic color palettes
       | are interesting, but so far I've never found a solid algorithmic
       | color generator - color is simply too tied to trends and too
       | subjective to be algorithmically made. Curious to see it work in
       | practice, and a shame they don't provide examples of it.
        
         | infogulch wrote:
         | To clear my understanding of your first statement, you're
         | saying that their "lightweight / low memory" claim is
         | invalidated by components having one unnecessary level of
         | nesting in DOM?
        
           | jsf01 wrote:
           | No. They're saying that it's creating an entirely separate
           | DOM tree unnecessarily by using shadow DOM where it isn't
           | needed.
           | 
           | On a related note, I'm curious if anyone has a benchmark
           | comparing performance and memory consumption when attaching a
           | shadow root vs not.
        
         | WorldMaker wrote:
         | > Shadowroots are great when you need encapsulation of styles
         | or static non-content UI, but with this outer element neither
         | of those are true. There isn't any additional UI, nor styles.
         | 
         | To my understanding of these components, because they are meant
         | to be styled by the user or a downstream design system the
         | component authors don't know ahead of time where style
         | encapsulation needs to happen, so this approach makes sense for
         | that.
        
         | jumby wrote:
         | Another funny thing with the accordion component: the icons for
         | expand and collapse seem to my mind to be reversed (- for
         | expand and + for collapse)?
        
       | pearjuice wrote:
       | Kind of surprises me that Microsoft allowed this project to use
       | Discord for external communication.
        
         | throwaways885 wrote:
         | Why not? It's incredibly popular.
        
         | CuddleBunny wrote:
         | Teams doesn't have a free public mode at this time so it sounds
         | like the best option to me. There are official Microsoft
         | instances of Slack and Gitter as well and teams seem to be
         | given a fair degree of freedom.
        
       | badrchoubai wrote:
       | I really love watching companies adopt the Web Components
       | standard, Apple's adoption of it for building Apple Music's web
       | player got me interested in learning them.
        
       | jhardy54 wrote:
       | This is great, I was hoping for another way to build websites
       | that are completely broken with JavaScript disabled. Try
       | selecting links on the sidebar or even just going to
       | https://fast.design and see how broken it is.
       | 
       | Sweet.
        
       | megaman821 wrote:
       | It looks like LitElement but more TypeScript first. The
       | decorators do make it a bit more approachable for me.
        
         | spankalee wrote:
         | LitElement is written in TypeScript so has great typings for
         | all APIs, and TypeScript (and Babel 7) decorators. There's also
         | a template type-checker CLI, compiler plugin, and VS Code
         | extension: https://github.com/runem/lit-analyzer
         | 
         | The big difference from Fast is that LitElement's render()
         | method is an instance method, so it can access any state with
         | `this.` and any properties and methods it uses can be
         | overridden. But it's all just as declarative:
         | import { LitElement, customElement, property, html } from 'lit-
         | element';              @customElement('hello-world')
         | export class HelloWorldElement extends LitElement {
         | @property()           name: string = 'World';
         | render() {             return html`               <h1>Hello
         | ${this.name}</h1>             `;           }         }
         | 
         | We have decorators for reactive properties, registering
         | elements, shadow root queries, and adding event listener
         | options to methods: https://lit-element.polymer-
         | project.org/guide/decorators
        
           | megaman821 wrote:
           | Yeah, LitElement definitely has a cleaner render template.
           | How would one do a computed property in LitElement?
        
             | spankalee wrote:
             | You really don't need any special for a computed property.
             | I'd start with a simple getter:                   class
             | MyElement extends LitElement {           @property() value:
             | number = 42;           get valueSquared() {
             | return this.value ** 2;           }         }
             | 
             | If the value is expensive to compute you can memoize it in
             | the getter, or set it in update.
        
       | bengale wrote:
       | I don't know if i'm missing something, but this seems crap. Its
       | really ugly, and there isnt a lot there. Why wouldn't I just use
       | BlueprintJs?
        
         | [deleted]
        
       | ggregoire wrote:
       | For all the comments asking what's the difference between this
       | and Bootstrap, Ant, jQuery UI, React, Vue and friends:
       | 
       |  _Interfaces built with FAST adapt to your design system and can
       | be used with any modern UI Framework by leveraging industry
       | standard _Web Components_._
       | 
       | The important word here is Web Components, which are like React
       | or Vue components but using only standard HTML and JavaScript (no
       | frameworks).
       | 
       | I guess you could even add Bootstrap on top of Fast.
       | 
       | Some references:
       | 
       | - https://en.wikipedia.org/wiki/Web_Components
       | 
       | - https://developer.mozilla.org/en-US/docs/Web/Web_Components
       | 
       | - https://developers.google.com/web/fundamentals/web-component...
       | 
       | - https://caniuse.com/#search=components
       | 
       | Also worth reading: https://dev.to/richharris/why-i-don-t-use-
       | web-components-2ci... (discussion on HN:
       | https://news.ycombinator.com/item?id=20232628)
        
         | Vinnl wrote:
         | > The important word here is Web Components, which is like
         | React or Vue components but using only standard HTML and
         | JavaScript (no frameworks).
         | 
         | I wouldn't say that - Web Components (by themselves) do not
         | allow you to write your view as a function of application
         | state, which is the main draw of at least React.
         | 
         | But the initial use case of Web Components is to create a
         | standard that allows developers to iterate on the web's built-
         | in components (inputs, date pickers, etc.) without having to
         | wait on the standards track, and FAST appears to intend to
         | provide a number of such components.
         | 
         | (And there is more to such components than just styling (which
         | is what Bootstrap provides) - it's behaviour, usability by
         | people reliant on e.g. screen readers, an API to access its
         | data, etc.
        
           | sroussey wrote:
           | Ionic Stencil let's you wrap webcomponents and turn them into
           | React, Vue, or Angular components. MS should use that or do
           | something of a similar nature. Otherwise there is a impedance
           | mismatch between this and what most or used to.
        
             | helixten wrote:
             | Not quite, Ionic Stencil is library to helps build
             | webcomponents. Since fast.design are webcomponents, they
             | can be used in any with any framework, no wrapping
             | required.
        
               | turadg wrote:
               | Web Components can't be directly used in React due to
               | these limitations documented at https://custom-elements-
               | everywhere.com/
               | 
               |  _Handling data_ React passes all data to Custom Elements
               | in the form of HTML attributes. For primitive data this
               | is fine, but the system breaks down when passing rich
               | data, like objects or arrays. In these instances you end
               | up with stringified values like some-attr= "[object
               | Object]" which can't actually be used.
               | 
               |  _Handling events_ Because React implements its own
               | synthetic event system, it cannot listen for DOM events
               | coming from Custom Elements without the use of a
               | workaround. Developers will need to reference their
               | Custom Elements using a ref and manually attach event
               | listeners with addEventListener. This makes working with
               | Custom Elements cumbersome.
               | 
               | Stencil provides wrapping to circumvent these
               | limitations. https://stenciljs.com/docs/react
        
               | Vinnl wrote:
               | > they can be used in any with any framework, no wrapping
               | required.
               | 
               | That's the selling point, but is not quite true. At least
               | a while ago there was still some ceremony needed at least
               | in React. You could say that that's React's fault, but it
               | doesn't really matter whose fault it is - Web Components
               | are different from standard DOM elements, and thus need
               | special treatment from frameworks that interact with
               | standard DOM elements.
        
               | sroussey wrote:
               | Ah, thanks for the clarification. I know the developer of
               | Framework7.io has a tool to take his components (not
               | webcomponents though) and make them into React/Svelte/Vue
               | native ones. So I kinda mixed the two tools together in
               | my head.
        
         | pc86 wrote:
         | _That 's FAST._
        
         | Udik wrote:
         | > but using only standard HTML and JavaScript (no frameworks).
         | 
         | Sounds like they ship a framework with the browser and call it
         | "standard". Given that the size of a UI components framework is
         | tiny anyway (3kb for preact) I'm not sure it's such a
         | revolution.
         | 
         | I'm open to hearing alternative takes on this though.
        
           | lucasmullens wrote:
           | If all the open source components I used all used preact, I
           | wouldn't be concerned about the 3kb. But if each component
           | author uses a different framework or even a different version
           | of a framework, it quickly becomes something like 3kb *
           | number of components.
        
             | Udik wrote:
             | True, but what I meant to say is that there is nothing
             | revolutionary. It's not providing capabilities that we
             | didn't have before. It's simply establishing a standard for
             | a tiny subset of what a modern web framework does- roughly
             | equivalent to those 3kb of code- by doing the equivalent of
             | incorporating it natively inside the browser.
             | 
             | Yes, now you can use components without a framework (you
             | could use them without a build step also before). But if
             | you want to do anything more complex than a static page
             | with jquery, you still need both.
             | 
             | To me it feels like the dream of 2005. It's cool, but we've
             | been able to do the same for at least ten years at this
             | point, and with the tools of our choice.
        
               | rictic wrote:
               | The big thing web components solve is interoperability.
               | How do you use a preact component inside an angular app?
               | How do you use an angular component inside a vue app?
               | 
               | Web components are the solution. No matter what library
               | or framework or whatever that you're using, you can
               | render a <div> so you can render a <my-component>. That
               | combined with shadow dom means that the element's
               | internals and its styles are encapsulated, so that you
               | can drop it into a page and it won't mess up the rest of
               | the page and the page can't mess it up.
               | 
               | This is particularly valuable for a design system,
               | because a company will have a design and want their web
               | properties to look consistent, but they'll have one app
               | written with angular, and another couple with react, and
               | a few ancient apps written with jquery. You could either
               | convert _everything_ to the latest and greatest thing, or
               | you could write your design system with web components,
               | and it'll work everywhere.
        
         | Someone wrote:
         | So, like https://medium.com/ing-blog/ing-open-sources-lion-a-
         | library-...?
        
         | CuddleBunny wrote:
         | The difference is that FAST is NOT a component library. It is a
         | tool for building component libraries. The fast-components
         | package is a showcase of what this library is capable of. You
         | could use FAST to create web component libraries that consume
         | bootstrap styles if you want. Microsoft is using this same base
         | to write web components for Fluent UI (previously Office
         | Fabric): https://www.npmjs.com/package/@fluentui/web-components
        
       | reaperducer wrote:
       | So, is this Microsoft's iteration of a more modern jQuery?
       | 
       | Forgive me if I don't get what's happening here. The coffee maker
       | broke last night.
        
       | dynamite-ready wrote:
       | At first glance, while the intro tries to differentiate the
       | product from Fluent UI, I doubt anyone, even the most
       | enthusiastic devotees, would read this...
       | 
       | "Have you ever needed a reusable set of UI components that you
       | could drop into your app and have an amazing experience? That's
       | FAST."
       | 
       | ...and think 'That's FAST'. They'd immediately think "That's
       | Fabric (or Fluent)".
        
       | andybak wrote:
       | Is it just me or is the first thing you want to to see and try
       | the damn things out?
       | 
       | Ctrl+F "Demo" - nope.
       | 
       | I think I found them eventually under "Component Explorer" - but
       | that's in the secondary nav and not in the main menu.
        
       | mark_l_watson wrote:
       | I need to check this out. I have been using Bootstrap for years,
       | and would like to try something new. I am not a very good front
       | end developer, even though my https://markwatson.com site is now
       | about 27 years old.
       | 
       | I want something batteries included.
        
       | qppo wrote:
       | The "fast slider" is a perfect example of how animations make
       | something perceptually slower, and might even be problematic as
       | it implies the underlying value change is lagging behind the UI
       | update.
        
         | ourcat wrote:
         | While sliding it from 0% to 100%, the 'thumb cursor' reaches
         | 100% before the mouse pointer does, after some strange
         | animation 'jumps' which have no bearing on the step value
         | setting.
         | 
         | Also, clicking anywhere on the bar doesn't set the slider to
         | the centre of the click. They don't appear to be making the
         | correct calculations based on Bounding Client Rects and Offset
         | widths.
        
         | dsego wrote:
         | The slider thing is horrible, it animates while dragging so it
         | looks like it's lagging behind the cursor.
        
         | tehbeard wrote:
         | That Slider's unusable on mobile. Seems to just be click for a
         | value, hope you don't need to make a small tweak.
        
       | ramon wrote:
       | I was looking at the code it looks optimized, will do a couple of
       | tests later maybe combining this as the main webcomponent
       | controller with something like tailwind css makes sense, but just
       | using this plain look and feel I don't think it's viable at this
       | moment but it's a good structural start I would say. Was looking
       | forward to do this with lit so maybe I might test this and see
       | how the code looks, from a code output perspective it looks
       | promising let us see this with something like snowpack. Till now
       | Lit looks a lot easier to use and all let us see how it goes.
        
       | eimg wrote:
       | To my understanding, the point of this system is not actually how
       | its default component looks or how rich the default components
       | set are. It's to provide a framework to create Custom HTML
       | Elements (which are browser native?) that we can re-use across
       | projects with different front-end frameworks.
       | 
       | e.g., Creating a React Button component using Fast Button like
       | this:
       | 
       | `const ReactButton = () => <fast-button>Button</fast-button>`
        
       | trenchgun wrote:
       | That is some seriously cheesy but brilliant copywriting!
        
       | r-w wrote:
       | For anyone who would like to take a look at the code for the
       | respective packages, here it is:
       | https://github.com/microsoft/fast/tree/master/packages/web-c...
        
       | Datsundere wrote:
       | There are plenty of these libraries. Can someone tackle the hot
       | mess css is? Give me one way of doing things. Css breaks do much
       | shit for me to the point where I don't want to code
        
         | crooked-v wrote:
         | If you use React, you might like Rebass
         | (https://rebassjs.org/getting-started), which turns the most
         | common CSS attributes into component props with assorted built-
         | in functionality for common theming and media queries, or
         | Emotion (https://emotion.sh/docs/introduction), which lets you
         | composably define CSS per component that automatically gets
         | scoped to that component only. Both are designed in a way that
         | still render efficiently, such as turning static CSS rules into
         | statically-defined bundles and only swapping out the dynamic
         | bits on the fly.
        
       | MR4D wrote:
       | Possibly the best commercial for Microsoft is how ...fast... this
       | site is. (clearly the pun was unavoidable, which is evident in
       | their name selection)
       | 
       | Honestly, one of the quickest loading & changing sites I've seen,
       | and gives HN a run for its money!
        
       | azinman2 wrote:
       | I find it hilarious that they put a dark mode toggle in the
       | corner (why would I want this on a per-website basis?) that
       | doesn't even change the rendering of their sample components (the
       | only reason I can think why that would be useful).
        
         | ggregoire wrote:
         | > I find it hilarious that they put a dark mode toggle in the
         | corner (why would I want this on a per-website basis?)
         | 
         | They detect your OS preference and display their light/dark
         | style automatically based on that [1]. The toggle is just there
         | if you wanna switch it manually. My Mac is in dark mode but I
         | usually prefer reading docs in light mode, so that toggle is
         | handy.
         | 
         | Agree that it should update the background of the examples tho.
         | Probably just a bug or something they didn't think about.
         | 
         | [1] https://developer.mozilla.org/en-
         | US/docs/Web/CSS/@media/pref...
        
           | azinman2 wrote:
           | If that's the case then I think you should take your Mac out
           | of dark mode. If we have to put it in every app and webpage
           | in a non-standard way, then that suggests that dark mode
           | itself is broken.
           | 
           | That it doesn't change the example on the web page seems like
           | a giant oversight, or a rendering error on Safari.
        
       | mishkovski wrote:
       | It looks like alternative for https://material.io/
        
       | unnouinceput wrote:
       | I like their transparent implementation. Went to text-area
       | expecting ...something else, but I got Microsoft instead
       | -\\_(tsu)_/-
       | 
       | Is this a pre-pre alpha preview of the preview? Because it feels
       | like
        
       | [deleted]
        
       | timvisee wrote:
       | Took a quick look: It has limited components. It isn't fast on my
       | mobile device. Some components appear to be broken. Why would I
       | ever use this?
        
         | mey wrote:
         | Sliders and radio buttons do not seem to work on Firefox for
         | Android nightly build.
        
           | GrayShade wrote:
           | Neither do they seem to work in desktop Nightly.
        
         | XCSme wrote:
         | Agree, UI and UX is really bad for the components demo, but I
         | think their goal is not to be an UI framework, but a step
         | before that? I am very confused about what they are trying to
         | achieve and how. I personally that think this project has no
         | future.
        
       | the-dude wrote:
       | And I was thinking they bought this for $1.3bn in 2008 :
       | https://searchengineland.com/microsoft-to-buy-fast-search-fo...
        
       | d0m wrote:
       | There are many design issues with their website which IMHO don't
       | provide great confidence in using their components
        
         | [deleted]
        
       | pjmlp wrote:
       | For those that miss it, the dark mode can be turned off on the
       | top right corner.
        
       | darepublic wrote:
       | On mobile Firefox the side menu is quite janky
        
       | su8898 wrote:
       | Not sure if it's just me but I kind of feel like these components
       | are not very polished - at least not to the point of
       | Bootstrap/AntDesign. May be it's the square unrounded borders or
       | may be it's just the way the demo components are presented.
        
       | rwieruch wrote:
       | For anyone who is interested in seeing a practical example of
       | using web components in a library like React
       | https://www.robinwieruch.de/react-web-components Last year I
       | worked for a large company which had Angular and React teams, so
       | the idea was to use web components for their UI library and then
       | just let the angular and react teams write wrapper for these
       | components. I had to prototype how to use web components in
       | react.
        
       | sholladay wrote:
       | Microsoft recently wrote a blog post saying they would be
       | rallying around a single component library. [1]
       | 
       | > What's in a name? A lot it turns out. And we have a lot of
       | them. Too many? We hear you and agree. That's one of the key
       | reasons we're simplifying our story. To collectively rally around
       | a single UI library for our web components--Fluent UI.
       | 
       | Yet, here we are, and they've released another component library.
       | They really seem to love these things. It's not entirely clear
       | what the difference is between them.
       | 
       | 1: https://developer.microsoft.com/en-us/office/blogs/ui-
       | fabric...
        
         | fassssst wrote:
         | Fluent UI is the one the Office team is standardizing on.
         | 
         | FAST is from the Edge team and used for their settings pages.
         | 
         | That's life at BigCo for ya.
        
       | nojvek wrote:
       | Have >3 years of experience working with web components full
       | time.
       | 
       | 1) Their templating library has a learning curve. It's not quite
       | like svelte, nor like JSX. If you have templates as strings that
       | aren't typechecked, it makes it really hard to work on large code
       | bases where the components are built by someone else and you're
       | the consumer. I remember breaking powerbi.com due to missing > in
       | an angular template that ended up in prod that only triggered for
       | non english customers. It was a hard lesson that day never to
       | touch untyped string based templates ever again. It's so easy to
       | miss something. You want strict compile time checks, not run
       | time.
       | 
       | 2) Being dependent on slots. It's not easy to watch for changes
       | in attributes to a slotted child. Yes you can add mutation
       | observers but they aren't cheap either. All sorts of bugs poped
       | up because some code does querySelector(x).setAttribute on a
       | slotted child but the parent doesn't rerender and the UI doesn't
       | look right. We ended up going to json strings inside attributes
       | so components take their inputs via attrs rather than reading
       | slotted children. The other avenue is props (like ionic), but
       | props don't show up in dom explorer, so you have to make the
       | tradeoff.
       | 
       | 3) the 3rd big gotcha of web components. Attributes are strings.
       | You have to serialize and deserialize from strings. Sure you can
       | listen to when they change via attributeChangedCallback and get
       | immutability for free because of serialization, but that comes at
       | a perf cost. for deeply nested objects, you have to serialize and
       | deserialize from json.
       | 
       | All in all, I love that Microsoft is doing web components.
       | Webcomponents are part of native dom api with simple lifecycle
       | api. They're neat.
        
         | flowerlad wrote:
         | You can use JSX to implement as well as consume Web Components.
         | See here: https://github.com/wisercoder/uibuilder
         | 
         | This gives you compile-time checks, and attributes can be
         | objects.
        
         | CuddleBunny wrote:
         | The template strings are sort of typed, using tagged template
         | literals. These even come with editor support using extensions
         | previously built for lit-html and the like.
        
           | flowerlad wrote:
           | You get compile-time checks for embedded JavaScript
           | expressions. But you don't get checks for html tags and
           | attributes. With JSX the TypeScript compiler checks
           | JavaScript expressions as well as mismatched tags and
           | attributes, all without any add-ons.
        
             | CuddleBunny wrote:
             | If the tagged literal approach takes off I'm sure tooling
             | will keep up. JSX wasn't always as well supported as it is
             | now.
        
             | spankalee wrote:
             | With the lit-html TypeScript and VS Code plugins you _do_
             | get checks (and auto-completion) for HTML tags, attribute,
             | and properties.
             | 
             | Yes, it requires a plugin, but JSX required the parser,
             | compiler, and type-checker to explicitly add support for
             | it. They both require an extension to core TypeScript.
        
         | spankalee wrote:
         | Attributes are strings, but web components can have properties
         | like any other object, and you can set properties on elements
         | from JS and almost all template libraries.
         | 
         | Properties can be complex objects, do not trigger
         | attributeChangedCallback, and don't need to be serialized.
         | 
         | What are you using to build your web components if you think
         | they can only take strings?
        
         | e111077 wrote:
         | Heyo, been working with WCs full time as well:
         | 
         | 1. Libraries like lit-html have syntax highlighting and tooling
         | to do type checking.
         | 
         | For the developer:
         | https://marketplace.visualstudio.com/items?itemName=runem.li...
         | 
         | For node: https://www.npmjs.com/package/lit-analyzer
         | 
         | For other Web Component libraries:
         | https://www.npmjs.com/package/web-component-analyzer
         | 
         | 2. Totally agree on slots. They suck and were hamstringed by
         | Safari in spec talks. Libraries like LitElement have the
         | concept of reflecting a property to an attribute and it's
         | really easy to do so. Also, Chrome had a property explorer in
         | dev tools that just got deprecated which also sucks.
         | 
         | 3. Attributes are strings, yes, but you can also set properties
         | on a component. Easy to have a setter and getter for a property
         | (can easily be turned into a TS decorator) that just calls a
         | render method on change, but again, the cost for
         | attributeChangedCallback to serialize a primitive is very low.
         | Passing objects should just be sent as a prop, but also,
         | passing objects to child web components we've found is a bad
         | habit. Often the props of an object should be spread (easy to
         | make a directive of this in lit-html) over the props of the
         | child and arrays typically easier to turn their contents into
         | DOM nodes.
         | 
         | Also none of this takes into consideration of a web component
         | using a state library like redux.
        
         | cdata wrote:
         | > the 3rd big gotcha of web components. Attributes are strings.
         | You have to serialize and deserialize from strings. Sure you
         | can listen to when they change via attributeChangedCallback and
         | get immutability for free because of serialization, but that
         | comes at a perf cost. for deeply nested objects, you have to
         | serialize and deserialize from json.
         | 
         | In practice, most libraries built around web components only
         | use attributes when serializing / deserializing HTML strings.
         | When performing updates to existing DOM, it is very common for
         | a library to use a corresponding property instead. This is very
         | fast, supports all types of values, and many libraries enable
         | users to think in terms of attributes while the library updates
         | properties under the hood (conceptually similar to the React
         | mental model).
        
       | moneywoes wrote:
       | Slider doesn't work for me on Chrome Android.
        
       | nathanaldensr wrote:
       | Allow me to ask the obvious question: How does Fast compare
       | against React, Angular, VueJS, etc.?
        
         | dudus wrote:
         | At first glance it seems the fast-components are akin to
         | material components and fast-foundation kinda reminds of
         | angular cdk
        
         | moenarch wrote:
         | That's FAST!
        
         | lucideer wrote:
         | It doesn't.
         | 
         | It's more comparable to something like Google Polymer[0]
         | 
         | They can be used in conjunction with eachother[1][2], so I'd
         | imagine the same/similar would be possible with Fast.
         | 
         | [0] https://en.wikipedia.org/wiki/Polymer_(library)
         | 
         | [1] https://www.digitalocean.com/community/tutorials/vuejs-
         | vue-i...
         | 
         | [2] https://github.com/jscissr/react-polymer#readme
        
           | kutorio wrote:
           | It reminds me more of https://material-ui.com/
        
         | bokchoi wrote:
         | From this page:
         | 
         | https://www.fast.design/docs/fast-element/observables-and-st...
         | 
         | > The arrow function bindings and directives used in templates
         | allow the fast-element templating engine to intelligently react
         | by only updating the parts of the DOM that actually change,
         | with no need for a virtual DOM, VDOM diffing, or DOM
         | reconciliation algorithms. This approach enables top-tier
         | initial render time, industry-leading incremental DOM updates,
         | and ultra-low memory allocation.
         | 
         | > When a binding is used within a template, the underlying
         | engine uses a technique to capture which properties are
         | accessed in that expression. With the list of properties
         | captured, it then subscribes to changes in their values. Any
         | time a value changes, a task is scheduled on the DOM update
         | queue. When the queue is processed, all updates run as a batch,
         | updating precisely the aspects of the DOM that have changed.
         | 
         | That's neat.
        
         | atarian wrote:
         | Apples and oranges. A design system is a collection of
         | components that fit a certain look-and-feel; it is not tied to
         | the implementation so it can be implemented by React, Angular,
         | or VueJS:
         | https://www.fast.design/docs/integrations/introduction
        
         | arsome wrote:
         | My understanding is this is closer to something like Bootstrap
         | but using Web Components (or material-ui if you want a react
         | component set) than it is to React itself.
         | 
         | You'd probably still want to use React or similar ontop of it,
         | but in the future we might get much lighter libraries covering
         | that side of things.
        
         | [deleted]
        
         | sreekotay wrote:
         | Appears to be a custom HTML elements (and some helper
         | libraries) that you can plugin to vanilla, Vue, React, etc?
        
         | crooked-v wrote:
         | Well, the focus on Web Components is good for cross-
         | compatibility, but means not being able to do the full static
         | analysis of components that you can do with JSX or equivalents.
        
       | duopixel wrote:
       | Check out the FAST Component explorer to see it in action:
       | https://explore.fast.design/
       | 
       | Looks very flexible but the presentation and default design is
       | horrible.
        
         | dmix wrote:
         | Strange how the switch uses the default arrow cursor and the
         | checkbox uses the pointer, while neither have a hover effects,
         | but the other form elements and interactive components all have
         | hover/active effects.
         | 
         | There might be some interesting base stuff underneath but the
         | UI/design part is pretty barebones and meh. Maybe that's not
         | the point?
        
         | spanhandler wrote:
         | On desktop all of it looks like they either didn't do any
         | styling, so I can hardly tell I'm not looking at unstyled HTML
         | (lots of the static elements) or what they did is pretty bad-
         | looking (everything else). Is this representative of the work,
         | or is this presentation just weirdly bad for some reason?
         | What's good about it? What am I missing?
        
         | onion2k wrote:
         | _default design is horrible_
         | 
         | Good. That will encourage people to change it.
        
           | kevincox wrote:
           | How is that good? If they make it have good design then
           | people don't have to try to make it good (and often fail).
        
         | [deleted]
        
         | neogodless wrote:
         | I would imagine the design convention is to show a + when you
         | have more content hidden, and a - to indicate you can hide
         | (minimize) it.
         | 
         | Is that the popular consensus, or is that an odd way of looking
         | at it?
        
           | achr2 wrote:
           | Yeah, this threw me as well, it is implemented incorrectly..
        
           | yodon wrote:
           | The accordion tag doesn't make any assumptions about icons.
           | You can use smiley faces & frowny faces for open and closed
           | if you prefer, or you can use plus and minus signs in either
           | order or anything else.
           | 
           | The bigger more systemic documentation issue is the examples
           | pages lack a view example source mode so there isn't an easy
           | way to discover that icons are a user choice thing rather
           | than a prebuilt styling thing.
        
         | klohto wrote:
         | The default design looks awful, especially on phone. I'm not a
         | frontend dev, but I don't see any reason why would I use this
         | instead of, for example, Bootstrap for sideprojects. Can some
         | FE comment on the project usefulness? Why go with Fast?
        
           | WorldMaker wrote:
           | The impression I get is FAST is trying to simplify the markup
           | you see in for instance Bootstrap's documentation by trying
           | to build standard components that Bootstrap themselves could
           | use (or Material or their own Fluent stuff). The emphasis is
           | on a lot of the little things in Bootstrap's documentation
           | that doesn't either get copy/pasted or it gets copy and
           | pasted and ignored/forgotten/left-to-bit-rot. Stuff like
           | aria- tags for accessibility. Seems the idea here is that by
           | baking them into web components that do most of the work for
           | you they are less likely to be forgotten or left to bit-rot.
           | 
           | (I'm not a front end dev myself, but do enough full stack to
           | think I know what is going on here.)
        
       | dainiusse wrote:
       | Don't want to be ride but that is yet more JavaScript
       | fragmentation. That's it
        
         | megaman821 wrote:
         | Is it really? Web components seem good for reusable components
         | and design systems.
         | 
         | If you are making a reusable component like a switch, you make
         | a web component (maybe with a helper library like Stencil,
         | LitElement, or FastElement). If you are feeling nice you can
         | create thin wrappers for React and Vue. As a consumer you just
         | use an import and an HTML tag.
         | 
         | If you take a bunch of reusable components and a theming
         | system. Now you have a design system, but it is still just as
         | easy to consume.
         | 
         | For most front-end developers the choices remain the same.
         | Build your site with React, Vue, or whatever you normally use.
        
       | mrweasel wrote:
       | > fast-anchor is a web component implementation of an HTML anchor
       | element.
       | 
       | Wait, what.... WHY? Can't you just use an a tag?
        
         | Vinnl wrote:
         | I was equally confused by fast-divider. I wonder what the
         | rationale behind these were?
        
       | wslh wrote:
       | I always wonder where is the VB6/Windows Forms for web apps. I
       | don't want to know the intricacies of Rect/Angular/Vue, I just
       | want to do a declaration of the UI, not programming. Zillions of
       | apps doing the same thing and spending weeks and months on the
       | same problems. I start to think that this is not interesting for,
       | for example, Microsoft because the developer market will shrink
       | and their developers, developers, developers mantra. I remember
       | when Bootstrap come up and suddenly we don't need a lot of
       | graphic design time to build a web page.
       | 
       | Just an additional note about VB6/Windows Forms. They helped to
       | build commodity UIs but when you needed more advanced one you
       | should rely on specific components.
        
         | mstijak wrote:
         | CxJS tries to solve common UI problems related to CRUD apps and
         | dashboards.
         | 
         | https://cxjs.io
        
         | Animats wrote:
         | _I always wonder where is the VB6 /Windows Forms for web apps?_
         | 
         | Me too. Dreamweaver once did that. But the Javascript/CSS crowd
         | complicated layout so much that writing WYSIWYG layout tools
         | became extremely difficult.
         | 
         | Blue Griffon is perhaps the last remnant of that era.
        
       | red_admiral wrote:
       | Pet hate: SQUARE radio buttons
       | (https://explore.fast.design/components/fast-radio-group)
       | 
       | In case it makes any difference: I'm on Win10, Edge 84.
        
         | erikig wrote:
         | Ditto on OSX+Chrome
        
       | fareesh wrote:
       | The slider performs terribly on Android Chrome
        
       | pcr910303 wrote:
       | Ok, so it looks like the main point of this is fast-components,
       | which is a just a bunch of components styled as MS-style, but I'm
       | more interested in the fast-foundation package.
       | 
       | According to the instructions:
       | 
       | > The exports of this package can generally be thought of as un-
       | styled base components that implement semantic and accessible
       | markup and behavior.
       | 
       | > it exports parts and pieces intended to be composed into Web
       | Components, allowing you to implement your own design language by
       | simply applying CSS styles and behaviors without having to write
       | all the JavaScript that's involved in building production-quality
       | component implementations.
       | 
       | Which means... if I want to make my own components, I can just
       | take this package and don't worry about making broken components.
       | Since the core HTML/JS is properly taken care (by MS, hopefully)
       | I can less worry about re-implementing keyboard access, or things
       | like accessibility which is hard to do properly. This is IMO
       | huge, and should be more universal.
        
         | ourmandave wrote:
         | MS had this back in 2006 with CSS Friendly Control Adapters for
         | asp.net.
         | 
         | https://docs.microsoft.com/en-us/aspnet/web-forms/videos/how...
        
         | CuddleBunny wrote:
         | fast-foundation and fast-element are the main point of this.
         | The components are mostly just a showcase. Though the MS-style
         | set of components (https://www.npmjs.com/package/@fluentui/web-
         | components) leveraging FAST will probably end up one of the
         | most consumed products.
        
         | RubenvanE wrote:
         | The foundation package sounds a lot like the Lion components
         | that ING Bank open sourced last year. It is indeed super handy
         | to not have to worry about all the browser compatibility and
         | accessibility issues!
        
           | spankalee wrote:
           | Link to Lion's storybook demos for those interested:
           | https://lion-web-
           | components.netlify.app/?path=/story/intro-l...
        
             | Arkdy wrote:
             | Any idea how FAST compares to using storybook directly?
             | 
             | ( https://storybook.js.org/ )
        
               | spankalee wrote:
               | Fast is a set of components (and a base class). Storybook
               | is a way to demo components.
        
         | ramon wrote:
         | Lit has been doing this for a while it's from that Polymer
         | project. https://lit-element.polymer-project.org/ Web
         | Components is a huge deal, you can do just web components on
         | plain notepad and not need any build system for something very
         | simple just using module based packages on the browser this is
         | really cool. Snowpack for me was something huge, getting away
         | from webpack was like getting back hours of work. But I don't
         | know, till now for me I still see the Lit-Element and stuff as
         | being more flexible than this one, the beauty is for example
         | you can have a component in react and another on in Vue, it
         | doesn't really matter and another one in JQuery. You can have
         | whatever works best for you for each case.
        
         | parksy wrote:
         | edit - to thank everyone who took time out to explain what's
         | going on - I'm still cynical but it all makes more sense now. I
         | also like to think the ignorant guy asking the ignorant
         | questions (in this case me) can sometimes be valuable for
         | others who aren't in the club. Previous rant intact below for
         | fun and hijinks.
         | 
         | ---
         | 
         | As a jaded old web developer I've seen so many frameworks along
         | the way all promising this and that.
         | 
         | Can someone who is familiar with this answer me this: Does this
         | framework automatically sort out ARIA standards for me? Like
         | tab ordering and stuff is dealt with automatically?
         | 
         | I know it seems I am being lazy but I am just fed up.
         | 
         | "FAST is a collection of JavaScript packages centered around
         | web standards, designed to help you efficiently tackle some of
         | the most common challenges in website and application design
         | and development."
         | 
         | COOL! (/s)
         | 
         | "Have you ever needed a reusable set of UI components that you
         | could drop into your app and have an amazing experience? That's
         | FAST."
         | 
         | UNIQUE! (/s)
         | 
         | "Have you ever needed to create your own components, and share
         | them across your company, including across groups that use
         | different, incompatible front-end frameworks? That's FAST."
         | 
         | <record scratch>
         | 
         | Different, incompatible front-end frameworks?
         | 
         | So like, this shit is magic that will let me streamline
         | components between my Oceania team's WordPress and my German
         | team's Magento frontends?
         | 
         | And I don't have to learn any new paradigm to make this work?
         | 
         | I don't have to use their specific, custom HTML in order to
         | leverage it? https://www.fast.design/docs/components/accordion
         | 
         | SWEET! (/s)
         | 
         | Come on. We'd have to re-write everything to use this library
         | specifically, and train our teams.
         | 
         | Honestly this is to me just another bunch of shit that will get
         | tacked into projects and have to be known and supported,
         | because some sprightly young thing will convince management
         | this is the panacea to seemingly redundant development work.
         | 
         | What's the actual selling point here.
        
           | spankalee wrote:
           | > Come on. We'd have to re-write everything to use this
           | library specifically
           | 
           | That is not how web components work. Web components are just
           | HTML elements, so any framework that can use HTML can use web
           | components. That's what sharing across different,
           | incompatible frameworks means.
        
             | chrisweekly wrote:
             | "just HTML elements"
             | 
             | -- which depend on Javascript and have no good answer to
             | "what about SSR"?
        
             | parksy wrote:
             | I honestly don't understand what this definition of
             | "frameworks" means in this exact context and I've been
             | building websites since 1994, survived the XHTML collapse,
             | etc etc...
             | 
             | What's the main advantage here? That we have a standardised
             | way of writing HTML markup so that CSS / JS knows how to
             | operate on it?
             | 
             | I'm almost certainly coming across as "old man yells at
             | cloud" (lol just realised a pun there) but what would you
             | say is the best resource for me to go and upskill so I can
             | see the actual value in this for me and / or my teams in
             | the future?
        
               | felipeccastro wrote:
               | Frameworks mean React, Vue, Angular, etc. Usually, if you
               | make a TextInput component in React, you can't use it in
               | Vue and vice-versa. If you create a <text-input> web
               | component, then you can use it in any of these frameworks
               | (or with no framework at all), like a native html tag.
        
               | parksy wrote:
               | Thanks that actually sounds like it could have value, but
               | again it's a new paradigm to learn.
               | 
               | It's like a while back I trained myself up on GWT because
               | in my mind it was the future of reusability.
               | 
               | Sure it was Java based and everyone hates Java these days
               | I guess, or at least hating Java is a meme. But the
               | entire concept and value was that you write everything as
               | reusable components.
               | 
               | Then all you really needed to do was choose your compile
               | targets and the compiler would do the rest, generating
               | cross-browser / device versions of your application code
               | as needed.
               | 
               | I can see now what the OP means and honestly from my
               | point of view the post-XHTML / DTD / XSD diaspora is
               | circling back around to trying to find standard ways to
               | separate data from presentation.
               | 
               | I think I get it now, thank you.
        
               | pupdogg wrote:
               | Lol, love your comment! Funny thing is that there are
               | more people on your side than what this community might
               | tell you! Silence is golden for a reason ;)
        
               | parksy wrote:
               | I appreciate the support I guess but at the same time I
               | don't understand what you mean by there are an
               | unspecified number of people on my side and that silence
               | is golden - either that means I should be quiet and join
               | the throngs of the self-superior invisible some-jority
               | which I think is condescending to the fine folk here, or
               | it means I personally should be silent and not express my
               | honest confusion, frustration and dismay. That's not
               | going to happen either.
               | 
               | I did come out pretty strong in my apprehension but I am
               | serious in wanting to know specifically what the benefit
               | of this is, and I don't really care whether I am making a
               | fool of myself for asking questions lol.
        
               | dmitriid wrote:
               | Theory: web components provide a standardised component
               | model for the web so that you don't need to rely on
               | frameworks and a bunch of JavaScript to create
               | interchangeable interoperable components that are no
               | different from built-in browser components. Oh, and you
               | can extend existing built-in components with your own
               | behaviours.
               | 
               | Reality:
               | 
               | - WebComponents is a collection of 4 web standards, one
               | of them is already deprecated, and v0 of another one is
               | also already deprecated.
               | 
               | - The standards provide a verbose, error-prone imperative
               | API that leaks implementation details left and right
               | 
               | - The API is so bad, that the official stance is "the API
               | is aimed at _library and framework developers_ , and you
               | are not expected to write your components using this
               | API". And if you look at the frameworks, they try to not
               | even compile/transpile down to this API
               | 
               | - Since all WebComponents basically have is DOM APIs, the
               | official stance is basically "yeah, they are good for
               | implementing leaf nodes" (that is basic dump components
               | like an simple input field, or a label) because you still
               | need a full-fledged lib/framework for anything else
               | 
               | - You cannot extend some (most?) of the built-in
               | components. And even if you can, your custom
               | implementations will not participate in form events, so
               | you have to create workarounds if you want to submit
               | values from your components
               | 
               | - They break accessibility
               | 
               | - They don't work without JavaScript
               | 
               | - They cannot be rendered server-side
               | 
               | - They are not strictly HTML, but a subset of it, because
               | you can't provide callbacks for their custom events (you
               | can do onClick, but you cannot do onSomeCustomEvent)
               | 
               | - And on the social side of things, their proponents will
               | very rarely acknowledge or discuss these issues in public
               | (even though there are dozens if not hundreds of issues
               | with extensive discussions on GitHub), but will spend not
               | an inconsiderable amount of time and energy bashing non-
               | webcomponent libraries and frameworks
        
               | parksy wrote:
               | Okay I think I get it:
               | 
               | 1. Define elements in script by extending htmlelement
               | 
               | 2. Follow the allowed structure in the DOM so that the
               | custom elements don't break / conflict with anything
               | 
               | 3. Use CSS to make the custom element look nice.
               | 
               | Then, basically what we have is:
               | 
               | 1. A class-based way to attach event listeners in a
               | standard interface (which is nice)
               | 
               | 2. what we always had to do anyway (unless framework
               | forces using JS to inject HTML at runtime)
               | 
               | 3. what we always had to do anyway
               | 
               | 4. Can't use custom events anymore... Encapsulation fTW.
               | 
               | But now that brings us to a situation where, essentially,
               | it comes down to which htmlelement classes take
               | precedence in our dependency hierarchy. Some libraries
               | are probably compatible but you can't guarantee it
               | because there's no explicit package dependencies between
               | different implementations, so if you choose two different
               | component libraries you may end up with unexpected
               | behaviours and bugs.
               | 
               | So if I were to build a component library that is
               | "compatible" with all major component libraries,
               | essentially what I'd have to build is a shit-ton of
               | "mappings" and exceptions that define an order of
               | precedence of which component variants my library should
               | interact with or cede to? I don't really like the idea of
               | "just magically working with incompatible libraries"
               | right?
               | 
               | Does that seem about right?
               | 
               | I think I learned something new and fundamental today,
               | and the overall approach makes sense if you pick a single
               | library to build your application but I can't see it
               | having any realistic value if you're to try and jimmy it
               | into existing products, in fact I can see that being an
               | extremely expensive exercise and potentially adding a
               | load of overheads to maintain and configure.
               | 
               | Also I can see now why no one really answered the
               | question about ARIA tab orders and accessibility, it's
               | not the job of these libraries.
               | 
               | I'm not a very smart person, thanks again to you and
               | everyone else jumping on my thread to take the time to
               | explain :)
        
               | dmitriid wrote:
               | In theory you wouldn't worry about idiosyncrasies of
               | specific component libraries if they are based on web
               | components because they would provide only a single
               | interface: properties go in (as in
               | customElement.myCustomProp = <some-value>), events go out
               | (as in customElement.attachEventListener(<some-custom-
               | event>, (e) => <do something in your callback>)).
               | 
               | This is definitely true for "dumb" components aka leaf
               | components such as labels, footers, links, basic inputs.
               | However, since you need more (for example, data-binding
               | and reactivity), this may become a question of
               | interoperability, and I don't really know how that plays
               | out in the real world.
               | 
               | > I'm not a very smart person, thanks again to you and
               | everyone else jumping on my thread to take the time to
               | explain :
               | 
               | No stupid questions, right? :) And the whole web
               | components discussion _is_ extremely muddied. Mostly
               | because people expect you to already know what they are
               | about, and talk about and use libraries on top of them:
               | lit-html, stencil etc.
        
               | parksy wrote:
               | Is the only thing that stops components from colliding
               | literally naming convention? Like <fast-dropdown> != <my-
               | homebrew-dropdown>? So it's basically a convention-based
               | standard rather than a fixed standard? This feels like
               | another example of the XHTML apocalypse coming full
               | circle and we're trying to find objective approaches to
               | loosely defined data.
               | 
               | I do feel I am exposing myself to some ridicule for being
               | out of style and I regret my attitude in my original
               | reply but it felt honest at the time, I am glad that we
               | have had this conversation in general because it's given
               | me a lot to think over.
               | 
               | My main fear that I developed over the years is we end up
               | developing frameworks for frameworks instead of
               | delivering tangible results. I've been on projects that
               | ended up taking far, far longer and costing way more to
               | maintain simply because we had to nurse the framework
               | rather than deliver the results.
               | 
               | Anyway thanks for taking the time out again, I need to
               | percolate for a while and look into some of the ideas
               | that have been expressed here.
        
               | dmitriid wrote:
               | > Is the only thing that stops components from colliding
               | literally naming convention? Like <fast-dropdown> != <my-
               | homebrew-dropdown>? So it's basically a convention-based
               | standard rather than a fixed standard?
               | 
               | Yup :) They decided to go for a flat namespace where all
               | that distinguishes between components is their name. I'm
               | guessing this already leads to collisions between
               | different versions of the same element. And there has
               | been an open issue for it for three years now:
               | https://github.com/w3c/webcomponents/issues/716 And the
               | "solution" seems to be "let's add more Javascript":
               | https://github.com/justinfagnani/scoped-custom-elements
               | 
               | > I do feel I am exposing myself to some ridicule for
               | being out of style and I regret my attitude in my
               | original reply
               | 
               | It's perfectly fine :) I've been way more rude about web
               | components before (and still am :) )
               | 
               | > My main fear that I developed over the years is we end
               | up developing frameworks for frameworks instead of
               | delivering tangible results.
               | 
               | Indeed. That's my main gripe with web components, really:
               | instead of providing tangible benefits to developers,
               | they ended up being "an API primarily for library and
               | framework developers"
        
               | pupdogg wrote:
               | What I meant was that are a lot of like minded developers
               | here who cringe every time they have to hear how JS is
               | going to teleport us from Earth to Mars. And since there
               | are no bonus cookies that can won by proving that you can
               | create a functional website simply by using some good old
               | HTML with CSS and vanilla JS, a lot of us resort to being
               | silent and enjoy the show!
               | 
               | So, what do ya say? Would you React the same way? ;)
        
               | parksy wrote:
               | It's funny because in writing my previous reply to you I
               | felt a momentary sense of inclusion into a special club,
               | I did think something along the lines of "should I just
               | enjoy the show" and then on reflection I realised that
               | taking such a stance would be equivalent to having no
               | voice at all, and it would also essentially evaporate my
               | chances to learn anything new from the good folk here as
               | it would set up a "me vs them" context, which I don't
               | believe would lead to me learning anything new.
               | 
               | Don't get me wrong, I can see where you're coming from
               | and feel the same way many times myself, but I am no
               | stranger to conflict, and I spent a great deal of my life
               | fawning to people or deferring my opinion for some
               | "greater ideal" that other people tried to set for me,
               | like you are doing now. You have set up so many logical
               | fallacies, talking about "so many developers", "bonus
               | cookies", and some weird need to "prove" ourselves, that
               | I don't even know where to begin unwrapping whatever
               | complex you have.
               | 
               | Get help. You will be happier.
               | 
               | I decided in this instance to say whatever is on the top
               | of my mind no matter how stupid it makes me look, I don't
               | seek camaraderie with anybody at face value just because
               | you purportedly represent a group that I can join. "Like
               | minded developers"? You would have to try harder to
               | entice me to be a part of your group, if you even have a
               | group. I really don't care to feel superior to anyone,
               | results speak for themselves, so good luck I guess
               | establishing a weird inner circle of ideals but I really
               | want no part of it, nor do I need any endorsement from
               | such a group.
               | 
               | Wow, that felt so fucking weird to type.
        
               | cfcosta wrote:
               | I'd say the important word there is "team", you use those
               | libraries and frameworks because they are curated ways of
               | doing what you want, reducing friction. If you are coding
               | by yourself, you know everything about the codebase, and
               | you focus on different trade-offs.
               | 
               | In general those who use these frameworks are ok with
               | adding build complexity if they allow to avoid, at least
               | a little bit, problems that can come from lack of
               | standardization and one-off solutions to deceptively
               | simple problems, taking care of edge cases your team is
               | likely to find but unlikely to think beforehand.
        
               | parksy wrote:
               | I understand the framework concept very well and have (oh
               | god I hate this term) "spearheaded" multiple
               | componentisation schemes over the years, to make code
               | more reusable across teams, to reduce coding effort, to
               | reduce expense for the business while improving the QA
               | outcomes for the client etc. We standardised on frontend
               | frameworks, set up and configured automated build systems
               | way back when most web dev shops were still FTPing their
               | shit up to servers, automated the task of installing
               | dependencies and so forth. So I honestly get the value of
               | frameworks and systems in a general context, I know what
               | frameworks are...
               | 
               | It's more about I guess what context is this framework
               | more applicable in? What does this exactly "standardise"
               | - given that "standardisation" frequently just means "now
               | we have x number of frameworks to support instead of x -
               | 1)"
               | 
               | I still have to train my team to structure their
               | components differently than they currently do, to
               | refactor existing systems away from their current
               | frameworks to this one, a significant investment in time
               | and energy... so... Why? Why is this one the ultimate
               | framework for "web components" (which used to just be
               | called "semantic html")?
        
               | spankalee wrote:
               | You can tell a framework by the "Hollywood Principle"
               | (don't call me, I'll call you). A framework is the
               | component host. It's responsible for defining the
               | component model and calling the component lifecycle.
               | 
               | Since frameworks define their own component model,
               | components are typically incompatible between frameworks.
               | You can't use an Angular component in React because React
               | defines a different model.
               | 
               | This leads to huge fragmentation across the ecosystem and
               | internally within large companies, and a waste of effort
               | to reimplement components in each framework.
               | 
               | Web components are a standard component model where the
               | _browser_ is effectively the framework. It calls the
               | component lifecycle, and to other userland JS code, or
               | HTML markup processors, web components act like any other
               | HTML element. It's like being able able to add your own
               | elements to the HTML spec.
               | 
               | Web components only specify the interface between the
               | components and the DOM, they don't specify how the
               | components are implemented. So you see several libraries
               | that help implement web components. These libraries
               | usually do a subset of what a framework does: main
               | templating and reacting to state changes. They don't do
               | the component model part of a framework.
               | 
               | Fast is another library that helps you build web
               | components. Polymer was probably the first, and currently
               | there are Polymer's LitElement, Ionic's Stencil,
               | Salesforce's Lightning, and many more. They're all
               | compatible with each other and with frameworks because
               | the libraries only manage the internals of the
               | components, the externals are standard.
        
               | [deleted]
        
             | parksy wrote:
             | And I am trying to understand, I think I'm just in a bad
             | mood about this (I think I have framework fatigue? if
             | that's a thing?) so thanks for explaining.
        
           | ramon wrote:
           | Focus on Web Components and forget Fast you'll see the
           | benefits then and then start looking around at other projects
           | focusing on Web Components. The benefit is that you can have
           | whatever frontend tech stack at your project, someone doing
           | Vue another one in React.. another one in JQuery there's no
           | limits.
        
             | parksy wrote:
             | Thanks I have asked another poster to fill me in because
             | maybe I'm too old school and yelling at kids to get off my
             | lawn. I might have to shut up now for a while until I run
             | away and get back up to speed in this arena.
             | 
             | But I have used react, vue, jquery, and my favourite which
             | is just plain old JS and to me this is just generating
             | templates with a different DOM structure and class
             | semantics. IDK it just seems like this is not something I'd
             | want to retrofit but would have to adopt as a standard to
             | see any value long-term over a bunch of projects.
             | 
             | Usually I am more measured in my responses but this time I
             | tried to just say what I am thinking (screw my ignorance)
             | so maybe I can learn a thing or two.
             | 
             | Thanks for responding.
        
               | ramon wrote:
               | I'm in the same boat, I still like the plain old vanilla
               | JS I do see the benefits of Typescript and all but I
               | don't know I have been doing JS since I was 10 years old
               | so I guess it's something that comes from my childhood
               | haha. I just love JS in any fashion, it's a love
               | relationship since the beginning and way back then I
               | always saw that there was huge value around JS but never
               | imagined back then that we would get to were we are
               | today, back then Flash was the big deal and it was doing
               | the more advanced functionality in the front-end could
               | never imagined that Shockwave, Flash would all get
               | basically banned due to security. Interesting turn around
               | for JS and the open source nature it has always had since
               | its infancy with the Mozilla Browser.
        
               | parksy wrote:
               | I can't send DM's here and I don't know if you'll see an
               | edit, so I wanted to add that I am sorry if I sounded
               | condescending in my other reply, I initially just wanted
               | to make sure you and other readers understand I am not
               | new to the programming game to emphasise my frustration
               | at not being able to understand something so simple as
               | drawing html elements, and prevent assumptions about my
               | ability to comprehend frameworks in general, but on re-
               | reading it sounds like I'm trying to 1-up you, in reality
               | I do find it hard to keep up and I am fearful that things
               | are moving beyond my ability to comprehend. After some
               | other discussions with other posters here this sounds
               | like it might be a cool addition to the ug... component-
               | o-sphere? It'll take me a while to get up to speed.
               | 
               | Thanks for taking the time, and I will try to be better
               | next time.
        
               | parksy wrote:
               | I started coding BASIC in the late 80s and built websites
               | before CSS and JS was a thing in addition to just coding
               | stuff in whatever language took my fancy to solve
               | whatever whimsical project I had that day, I had a
               | particular affinity for optimising getpixel and putpixel
               | routines in ASM when you could still directly address
               | video memory.
               | 
               | On the one hand this is great because programming is in
               | my bones and I know whatever comes along I'll figure out.
               | 
               | It's also terrible because sometimes something that looks
               | like a rebranded version of what I already know is
               | actually a fantastic new and easier way of doing things,
               | and it's really easy to miss something great.
               | 
               | This just doesn't feel like something great, it just
               | feels like another branded corporate way to structure
               | code that there's dozens of examples of already, it's not
               | an improvement just an alternative, if that makes sense.
        
       | EisenbergEffect wrote:
       | Howdy! I'm the architecture lead on FAST at Microsoft. There's a
       | great conversation here with lots of questions, so I thought I
       | would chime in and try to clarify a few things.
       | 
       | The first point of note is that FAST is built on Web Component
       | standards. I see a number of comments that indicate some folks
       | aren't familiar with Web Components. So, let me give a brief
       | explanation.
       | 
       | First, the term "Web Components" is an umbrella term. You may
       | remember when the industry used to talk about "HTML5". This was
       | also an umbrella term for a collection of new HTML standards.
       | Similarly, "Web Components" refers to a collection of standards
       | related to creating reusable custom HTML elements. Some of the
       | standards that are under the umbrella include the ability to
       | define new custom element tags, a standard component lifecycle,
       | encapsulated HTML rendering and encapsulated CSS (shadow dom),
       | CSS properties, CSS Shadow Parts, and more. These are all defined
       | by W3C and have shipped in all major browsers today. The work on
       | Web Component standards, like the rest of the web, is ongoing.
       | New APIs continue to be designed and released. Some recent APIs
       | include form associated custom element APIs and CSS Shadow Parts.
       | W3C is currently working on standards for things like
       | constructible style sheets, declarative Shadow DOM, custom
       | element registries, custom states/pseudo selectors, and more.
       | Microsoft, Google, Salesforce, and many others are working
       | together on this.
       | 
       | Because FAST is built on Web Components, it does not create its
       | own component model; it's using the standard component model.
       | What has traditionally been thought of as a "front-end framework"
       | typically has its own component model, not based on web
       | components. Examples of this include Angular, React, Vue, Svelte,
       | etc. Any library that is based on web components isn't trying to
       | create its own model, but rather to leverage the standards. This
       | allows a web component to work like any normal HTML element. You
       | do not need a framework to use them. However, if you want, you
       | can use them in combination with a framework of your choice, or
       | jQuery, or whatever.
       | 
       | To drive the point home that these are web standards, here are 4
       | lines of code that you can execute in a modern browser console to
       | define, create, and add a web component. You can even execute it
       | in this Hacker News page using DevTools.
       | 
       | // define the custom element class
       | 
       | class HelloWorld extends HTMLElement { constructor() { super();
       | this.attachShadow({ mode: 'open' }).innerHTML = 'Hello World'; }
       | }
       | 
       | // register the custom element by tag name
       | 
       | customElements.define('hello-world', HelloWorld);
       | 
       | // create an instance of your new element
       | 
       | const ele = document.createElement('hello-world');
       | 
       | // add your new element to the body
       | 
       | document.body.appendChild(ele);
       | 
       | If you do this in your console now, you'll be able to scroll down
       | to the end of the page and see your component rendering. Have a
       | look in the element inspector and you'll see the custom tag,
       | along with its shadow dom, including "Hello World".
       | 
       | When you start to build web components, you're likely to notice
       | that there's a pretty large amount of code you need to write to
       | implement even a basic component. That's because the standard
       | defines low-level protocols, rather than high-level abstractions.
       | By doing this, the standard provides you with interoperability
       | and flexibility to innovate without boxing you in. At this point,
       | something like FAST comes along and provides a thin layer of
       | opinions, lifting the level of abstraction just enough to make it
       | easier and FASTer to build components. Things that FAST helps
       | with include: providing attribute/property syncing, rich Model-
       | View-ViewModel (MVVM), template rendering/update, style
       | composition, etc. All of this is an internal implementation
       | detail of a FAST component, allowing FAST to integrate with Web
       | Components built in completely different ways or with different
       | libraries. The entire fast-element library, without tree-shaking,
       | is around 10kb minified and GZipped. It was designed for tree-
       | shaking from the beginning, so any feature you don't use when
       | building a component will be removed during build, allowing you
       | to get it smaller based on your needs.
       | 
       | Architecturally, today FAST is composed of 3 layers. At the
       | lowest level is fast-element, which provides a basic mechanism
       | for defining components. For many people, this is all they need.
       | However, others need an actual component library to build their
       | site/app with, and often times they need control over the
       | look/feel/branding. To address this, you can add the second
       | layer, fast-foundation, which provides a set of building blocks
       | for creating component libraries and design systems. It itself is
       | not a component library. Rather, it has the base behaviors for
       | standard components like button, tree view, menu, etc. It also
       | has the basic functionality that design systems typically need,
       | such as color algos, design tokens (design variables), typography
       | primitives, etc. Foundation allows you to build your own button,
       | tree-view, etc, without having to design the semantic HTML, work
       | out the correct Aria behaviors, mess with proper keyboard nav,
       | manage the JavaScript state and behavior, etc. Instead, you can
       | compose together a foundation button and foundation template with
       | your own styles, giving you complete control over the appearance
       | of your components. With these building blocks, it's possible to
       | implement something like Bootstrap, Material Design, Lightning,
       | etc. However, if you don't need to implement your own design
       | system, you can use one that we build. This is the third layer.
       | We provide two design systems today. One is called FAST Frame
       | (featured on our web site). The other is Fluent UI Web
       | Components.
       | 
       | FAST Frame is an early, experimental design system that our team
       | is working on. I saw some feedback below that it's "ugly" :-D As
       | mentioned, this design system is a work in progress, being
       | designed and developed in the open. So, we welcome you to
       | contribute to the project and help us define something that the
       | industry would feel proud to use in their apps. As for Fluent UI
       | Web Components, Fluent UI is Microsoft's design language. I saw
       | some comments below about how Microsoft was trying to consolidate
       | and that FAST seems to add yet another option. The consolidation
       | work is around our design system first. So, we're moving to a
       | single design system "Fluent UI" across the company. We're then
       | consolidating implementations as appropriate. Previously, there
       | were several React implementations. There's work ongoing to
       | consolidate that into a single React implementation. But what
       | about people who don't use React? Well, that's what Web
       | Components are for. FAST is providing the Fluent UI Web
       | Components implementation. So, regardless of what platform,
       | framework, etc. you use there will be a best fit implementation
       | that provides you with a consistent Fluent UI experience.
        
         | EisenbergEffect wrote:
         | Ok, let's get on to a few other items mentioned below...
         | 
         | * Being Dependent on Slots - Web components don't need to use
         | slots and neither does FAST. When slots are needed, FAST
         | provides facilities to respond to changes in slots and respond
         | to changes in slotted child attributes. The render system is
         | reactive in nature and specifically has features that enable
         | rendering around these slot scenarios.
         | 
         | * Attributes are Strings - Yes, this is part of the DOM API.
         | That's the way HTML works. However, HTML elements also have
         | properties, and those do not have to be strings. They can be
         | any type. As such, FAST enables properties of any type, and
         | will provide type conversion between attributes and properties
         | if desired. It is considered "bad practice" to serialize to
         | json and pass through attributes. Rather, just use a standard
         | JS property.
         | 
         | * Typing in Templates - If you use TypeScript with FAST, you
         | can have full type checking and editor refactor support over
         | the data in your template. Because FAST's templates leverage
         | the JavaScript language's standard tagged template literal
         | feature, popular editors (such as VS code) will provide syntax
         | highlighting, documentation, and tag completion for both HTML
         | and CSS written in this way. Additionally, lint tools
         | understand tagged template literals and can lint the HTML and
         | CSS that is written in them. So, there's strong support in
         | tooling today and more coming in the future.
         | 
         | * Web Components Break Accessibility - Accessiblilty is
         | difficult. When you build re-usable web components, you have to
         | think carefully about the best way to accomplish this. That
         | said, it's incorrect to say that WCs break accessibility. Our
         | team has worked extensively on the accessibility of our
         | components and the results have been good. If you find an
         | accessibility bug, let us know. We prioritize those types of
         | issues pretty high.
         | 
         | * They Don't Work Without JavaScript - This is true today not
         | just of WCs but of every front-end framework (without
         | leveraging SSR). However, it has never been the long-term plan.
         | We are currently working with W3C on declarative shadow dom as
         | well as declarative custom element definitions. Many WCs will
         | always require JS but in the future a whole category of WCs
         | will not.
         | 
         | * You Can't SSR a Web Component - Strictly speaking, this is
         | not quite correct. Custom elements are just html tags and can
         | be rendered by any server framework. If you want to SSR the
         | shadow DOM itself, that's possible by inlining the template and
         | using a small bit of JS to attach the shadow after streaming
         | the template in. That said, as mentioned, we are working on
         | declarative shadow dom, which will provide the W3C standard on
         | which SSR and other WC capabilities will be built.
         | 
         | * The WC API is Very Bad - As mentioned earlier, the focus for
         | v1 WCs is to provide a low-level API that enables
         | interoperability and flexibility. Baking a high-level API in at
         | this point would shut down innovation when aspects of component
         | models are still being deeply explored, experimented with, and
         | debated. As such, platform WC APIs are more like Win32 and less
         | like Java or .NET. Over time, as the industry establishes more
         | patterns, new higher level APIs will be added, but they will be
         | built on the low-level APIs, always leaving open the
         | opportunity for "user-land" innovation.
         | 
         | * You Can't Provide Callbacks for Custom Events - Maybe I
         | misunderstand this but in my experience this is not true. You
         | can use addEventListener on any web component to register for
         | completely custom events. If you want an `onevent` property,
         | you can set a function to as part of your API, you only need
         | implement a property setter that internally calls
         | addEventListener. Events from inside the shadow dom are re-
         | targeted, but you have complete control over whether they
         | bubble or compose. So, there's no issue there as long as you
         | know how to use the composedPath() API.
         | 
         | * Why does Accordion/Anchor/Divider, etc. have a slot and
         | nothing else? - It does have something else. Styles. Shadow dom
         | can be used to enable composition and encapsulate styles. In
         | this case, these elements are not doing anything interesting
         | with composition, but are providing encapsulated styles. If you
         | are wondering why you can't see them, it's because FAST
         | leverages a new standard for constructible style sheets, which
         | allows it to attach style sheets to the Shadow Root, via its
         | adoptedStyleSheets property. If you find the shadow root in
         | your inspector, and look at its adoptedStyleSheets property,
         | you will see what you are looking for. For browsers that do not
         | yet support this new WC feature, we fall back to standard style
         | element injection. FAST does not force you to use shadow dom or
         | slots. Any FAST element can render into the light DOM as well.
         | If we're using shadow dom, there's a reason for it (or there's
         | a bug if there isn't).
         | 
         | * It Has Limited Components - This is our first release, and
         | includes a subset of the many components we have planned.
         | Ultimately, we plan to at least implement everything in
         | FluentUI.
         | 
         | * The Components Are Broken - As our first release, I'm sure
         | it's not perfect. FAST is MIT licensed and open sourced on
         | GitHub. Please feel free to report bugs and we'll work to get
         | them fixed. If you feel comfortable contributing, we'd love to
         | have you work with us on the fixes as well.
         | 
         | Ok, hopefully this helps a bit. At Microsoft, we're excited to
         | begin our journey into Web Components with FAST. These are our
         | first steps, but we've got a lot more planned for the future.
         | We invite all of you to join us on this journey. You are
         | welcome to provide feedback, contributions, docs improvements,
         | thoughts on web standards improvements, etc. Looking forward to
         | seeing you around!
        
           | jabits wrote:
           | Thanks for the detailed responses, and thanks for the
           | release. I am looking forward to digging...
        
       | mattlondon wrote:
       | A lot of the components don't appear to work? Checkboxes, radios,
       | sliders.
       | 
       | There are also weird extra spaces and alignment issues on things
       | like basic links or the list numbers in the tab demo.
       | 
       | Bit of a shame
       | 
       | This is on Firefox on Android.
        
       | c-smile wrote:
       | How I would do that in Sciter:
       | 
       | fast.css :                   fast-something {         // custom
       | element           aspect: FastSomething; // its function-
       | controller           display:block;         }
       | 
       | script:                   function FastSomething() {           //
       | note JSX is built-in in Sciter           this.content( <b>Hello
       | World</b> );         }
       | 
       | and markup:                   <style src="fast.css" />
       | <body>            <fast-something />          </body>
       | 
       | Easy, no?
        
         | DethNinja wrote:
         | I love Sciter and it is pretty amazing for what it does, but I
         | still wouldn't use it to share internal web component libraries
         | within my own company, never mind some other 3rd party.
         | 
         | Sciter unfortunately uses it's own dialect of JavaScript and
         | CSS which might not be compliant with browser JavaScript
         | engines.
         | 
         | I really wish Sciter would move to some other commonly used JS
         | engine and get rid of TIScript, then I would be more confident
         | with creating an internal library, at least I would be able to
         | use web components in a cross compliant way between browsers
         | and Sciter.
        
           | c-smile wrote:
           | That's just an illustration of how it can be done otherwise.
           | The only non-standard thing there is that CSS glue construct:
           | selector { aspect: Func url(script.js); }
           | 
           | It tells that as soon as element matching that _selector_
           | will appear in the DOM it will have Func() called (from
           | script.js). No complex abstractions are required.
           | 
           | "to share internal web component libraries within my own
           | company, never mind some other 3rd party"
           | 
           | My pardon, I didn't get the "to share" part, who share, what,
           | and with whom?
        
       ___________________________________________________________________
       (page generated 2020-08-07 23:00 UTC)