High-quality, customizable web components for common user interface patterns

Overview

Elix logo

Elix is a community-driven collection of high-quality web components for common user interface patterns.

Most applications make use of common, general-purpose user interface patterns such lists, menus, dialogs, carousels, and so on. Such patterns can be efficiently implemented and packaged as web components. Their modular nature lets you easily incorporate web components into your web application, and their standard definition ensures good results across browsers.

This arrangement permits a beneficial economy of scale, as common patterns only have to be implemented once. But that is not to say that it’s easy to develop general-purpose user interface patterns as solid components. To the contrary, implementing even simple patterns with a very high degree of quality can entail substantial complexity.

For that reason, the Elix project believes that implementing high-quality, general-purpose components is best done as a community effort. This spreads the cost of creating the components across organizations, and ensures that the resulting components satisfy a broad range of concerns and can be used in many contexts.

For full details and demos, see the Elix documentation.

Quick start

Plain HTML and JavaScript

Add the Elix package to your package.json:

{
  "dependencies": {
    "elix": "<latest version number here>"
  }
}

Then run npm install. We generally recommend locking your package.json to a fixed Elix version number (1.0.0 rather than ^1.0.0 or 1.x, for example). See more at Versioning.

In markup, you can then reference the components you need:

<html>
  <head>
    <script type="module" src="node_modules/elix/define/Carousel.js"></script>
  </head>
  <body>
    <elix-carousel>
      <!-- Images and other elements go here -->
    </elix-carousel>
  </body>
</html>

Alternatively, in JavaScript, you can directly import components:

import Carousel from "elix/define/Carousel.js";

const carousel = new Carousel();
// Add images, etc., to the carousel.
const image1 = new Image();
image1.src = "image1.jpg";
carousel.append(image1);
// Add the carousel to the page.
document.body.append(carousel);

The Elix project itself requires no build step. You are free to use your preferred tools to bundle the Elix modules for better network performance.

You can try out the plain HTML and JavaScript project on your own machine.

React

See the sample React project showing how to use Elix components in a React application.

TypeScript

See the sample TypeScript project showing how to use Elix components in a TypeScript application. Elix includes TypeScript declaration files so that you can confirm that interactions with Elix components are type safe.

Core principles

  • Usability excellence. All components are designed with the experience of the end user in mind. Each component tries to provide the best implementation possible of a very common user interface pattern. The components try to provide a great user experience by default, freeing you from having to worry about small details, and letting you focus on your application’s core value. Elix includes universal access in its definition of usability excellence: our components should provide a great experience to all users regardless of temporary or permanent handicaps.
  • As good as HTML elements. These components are measured against the Gold Standard checklist for web components, which uses the built-in HTML elements as the quality bar to which web components should aspire. These components should work predictably and reliably in a wide variety of contexts and with good performance.
  • Ready for use. The project's components can be used as-is, without requiring any customization or further coding.
  • Extensible behavior. No design can meet every situation — there is no One Carousel to Rule Them All. Elix components are factored into parts that you can readily recombine to create solid components to meet your needs.
  • Use the platform. These components are generally written as "close to the metal" as is possible while still allowing code to be shared across components. These components are not built upon a monolithic framework, nor is any shared runtime required to use them. By virtue of being web components, these elements can be used with any front-end framework.
  • Maximize the audience of potential contributors. Designing components that appeal to a broad audience requires accepting contributions from a broad audience. For that to happen, we can’t rely on complex, project-specific abstractions or techniques. We try to write the component code to be as plain as possible, with the least amount of declarative, framework-style magic. In practice, that means that clear, verbose code is often preferred over tight but inscrutable code. We’re willing to tolerate a certain degree of boilerplate code if that makes it easier for you to understand the code or step through it when you’re debugging your own application. If you’re able to write a simple web component in plain JavaScript, a minimal learning curve should allow to you to understand — and contribute to — Elix code.
  • Well-documented. We do our best to document not only the public API of each component and mixin, but also the underlying intention and design principles. We try to document why something is the way it is in order to make the best use of a potential contributor’s time.
  • Provide a minimalist, themeable appearance. These components are meant to fit unobtrusively into your application, and so come with a bare minimum of styling. They can be customized to achieve more distinctive visual effects or branding to blend seamlessly with your application’s own style.
  • Intended to be a foundation for brand design systems. Web components are an excellent way to implement your company's design system so that everyone in your company can build consistent, high-quality UI aligned with your brand. Elix components are explicitly designed to be used as the basis for such a design system. Elix takes care of the structural styling and fundamental UI interactions so that you can focus your time on the aesthetics and behavior that make your brand unique.
  • Native source that loads directly in the browser. We want to leverage your existing understanding of the web's core technologies, and avoid imposing any build-time tools. All Elix demos load directly in the browser with no transpilation or bundling required. (For production environments, of course, you can optimize and package the code however you want.) We use TypeScript on the side as a type-checker to achieve high confidence in our code, but the source for all components is in plain JavaScript.
  • Work on all mainstream browsers. This includes the latest versions of Apple Safari and Mobile Safari, Google Chrome and Chrome for Android, Microsoft Edge (Chromium-based), and Mozilla Firefox.
  • Open process. The process behind Elix is as important to us as the code artifacts. We strive to incorporate feedback from a general web audience, while at the same time imposing just enough structure to keep the project moving forward at a consistent pace in a consistent direction. To that end, all significant changes to the project are proposed and tracked through Request for Comments (RFC) documents tracked in the Elix RFCs repository.

Versioning

Elix is an ambitious attempt to deconstruct complex user interface elements into constituent parts at various levels of abstraction. We regularly feel like the project is breaking new ground at the frontier of front-end design and implementation. That can be exciting, but also means that promising implementation strategies will sometimes turn out to be dead ends. Moving forward will often entail breaking changes.

  • Elix follows standard semantic version numbering, and signals breaking changes by incrementing its major project version number.
  • We do our best to announce breaking changes in advance, and to provide upgrade guidance as we can.
  • In some cases, we may retire a particular component or mixin and replace it with something fundamentally new.
  • These user interface components are extremely complex, and are designed to be customized to work in a wide range of applications and environments. This means that even minor Elix releases may accidentally introduce breaking changes, particularly in customized components. We’ll try to fix those when we can.
  • As recommended above, locking on to a specific Elix version number will let you evaluate new Elix releases — including minor releases — in a more controlled fashion.

Contributing

Please see our Contributor's guide.

The Elix project is led by Component Kitchen, which offers professional support for Elix.

Comments
  • Improve documentation for npm usage

    Improve documentation for npm usage

    It's simply not clear how to use it when installing it from here https://www.npmjs.com/package/elix

    Some examples (e.g. carousel component) would be appreciated and could improve adoption and general interest in the library.

    opened by pixelbucket-dev 10
  • openedchange isn't reliably raised for Popup

    openedchange isn't reliably raised for Popup

    I'm trying to use Elix in a Blazor project. I wrapped the Popup element in a Blazor component and tried to listen for the openedchange event. I coded my tests so each time the event was raised I'd display something like "popup is open : true" or "popup is open : false" to the web page. It seemed to work very reliably when I opened the popup via a button or dismissed the popup by clicking outside its bounds. So my plumbing seemed to be ok. Then I added a button INSIDE the popup that called close to dismiss it. The popup became hidden - my close button worked - BUT the openedchange event was not firing. I tried a few different ways to manually close the popup, like setting the "opened" property to false; this again caused the popup to close but again no event was raised. I thought maybe the event was getting raised but the message not being displayed, but could not get any proof of this through debugger messages, Console.Log, or other means. So it seemed like the event was not being raised.

    I figured maybe this was a weird problem with Blazor so I tried to build a plain vanilla javascript project to repro. I used the Chrome dev tools to watch what is happening. This is tough to work with because it seems every time I attempt to Console.Log what is happening the Popup gets stuck in the open state on the screen, or won't open at all. The dev tools are interfering with the behavior of the app. But in any case through my experimentation it seems like the open and close events will work. But the openedchange event doesn't.

    I'm really new to javascript and Chrome debugging so it is possible I'm doing something wrong here. But because I can't get reliable behavior in Blazor OR vanilla javascript, I think there might be a problem with the openedchange event.

    For repro, see github referenced in later comment.

    -- deleted old code here --

    opened by jmagaram 9
  • Serene tabs don't fire selected-index-changed consistently if selected-index set programmatically

    Serene tabs don't fire selected-index-changed consistently if selected-index set programmatically

    See demo here

    If I click directly on the tabs, the selected-index-changed event fires consistently.

    However, the buttons, which set selected-index programmatically, the event only fires the first time.

    opened by bahrus 9
  • Feature Request : package it as monorepo

    Feature Request : package it as monorepo

    I have a use case where I would like to use/extend a single component from elix. importing the whole package makes my extended component too bulky. Would you consider restructuring this project as a Monorepo and logically separate the shared and unique code into individual sub-packages ?

    opened by mrin9 9
  • Styling with classes (get template() called only once)

    Styling with classes (get template() called only once)

    tldr; what would it take to call get template() for every instance on the page?

    I'm experimenting with ways to style elix components. Here's one way:

    <elix-button data-class="f6 link  br2 ph3 pv2 mb2 dib white dim bg-green pointer"  id="btnTachyon">Elix Tachyon Button</elix-button>
    
    <elix-button disabled data-class="f6 link  br2 ph3 pv2 mb2 dib white button-disabled bg-gray"  id="btnTachyonDisabled">Elix Tachyon Button</elix-button>
    

    I can pass classes in via dataset attributes. Then modify the component to pick them up like this:

    get [symbols.template]() {
        console.log('get template: ${this.id} - ${this.dataset.class}')
        return template.html'
          <style>
            @import "/assets/tachyons.min.css";
            .button-disabled {
              opacity: 0.65;
              cursor: not-allowed;
            }
          </style>
    
          <button class="${this.dataset.class}" id="inner" role="none">
            <slot></slot>
          </button>
        ';
      }
    

    But get template() is only being called once, regardless of the number of instances on the page, so both buttons are getting the same classes.

    The call chain is non-trivial:

    get [template] | @ | Button.js:103   | getTemplate | @ | ShadowTemplateMixin.js:107   | [render] | @ | ShadowTemplateMixin.js:81   | [render] | @ | ReactiveMixin.js:138   | [render] | @ | WrappedStandardElement.js:333   | [render] | @ | KeyboardMixin.js:89   | [render] | @ | FocusVisibleMixin.js:90   | [render] | @ | AriaRoleMixin.js:24   | [render] | @ | Button.js:86   | render | @ | ReactiveMixin.js:98   | connectedCallback | @ | ReactiveMixin.js:49

    Thoughts?

    opened by timsim00 7
  • Headless tests

    Headless tests

    This adds npm test that uses puppeteer for headless testing on Chrome. This allows a fast local feedback cycle, no need to open the browser. But it runs only in (headless) Chrome.

    Updates to docs and README accordingly.

    opened by wolframkriesing 7
  • Inconsistent FilterComboBox whenClosed() result

    Inconsistent FilterComboBox whenClosed() result

    When toggling the filter combo box with the v icon, the previous result will simply be repeated. I would have expected it to be "no user interaction, return undefined"

    Steps that reproduce the issue

    1. Use the following little script
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width,initial-scale=1" />
        <title>Elix FilterComboBox</title>
        <script type="module" src="https://unpkg.com/[email protected]/define/FilterComboBox.js"></script>
      </head>
    
      <body role="main">
        Open the dev tools.
    	Type A and then click on the little v icon.
      
        <div class="demo padded">
          Fruit:
          <elix-filter-combo-box aria-label="Fruits" id="mySearchBox">
            <div>Acai</div>
            <div>Akee</div>
            <div>Apple</div>
            <div>Apricot</div>
            <div>Avocado</div>
          </elix-filter-combo-box>
        </div>
    	
    	<script>
    		mySearchBox.addEventListener("open", (ev) => {
    			ev.target.whenClosed().then(result => {console.log(result)});	
    		});
    	</script>
      </body>
    </html>
    
    1. Type in some search text and interact with the component.
    2. Click on Apple.
    3. Click on the v icon a few times
    4. Open it and click outside of the component
    5. Click on the v icon a few times

    Expected behavior I expected it to return undefined if I click on the v icon.

    opened by stefnotch 6
  • PopupSource break ListComboBox

    PopupSource break ListComboBox

    This bug cannot be reproduced on codepen, please create an html file manually and open it in a browser.

    <script type="module" src="https://cdn.jsdelivr.net/gh/elix/elix@main/define/ListComboBox.js"></script>
    
    <elix-list-combo-box>
      <div>1</div>
      <div>2</div>
      <div>3</div>
    </elix-list-combo-box>
    

    Snipaste_2021-01-15_18-37-17

    The component will be displayed incorrectly, and the list cannot be opened. If you turn off PopupSource's height style, it returns to normal.

    [part~="source"] {
        height: 100%; /* this line */
        -webkit-tap-highlight-color: transparent;
        touch-action: manipulation;
        width: 100%;
    }
    
    opened by BlackGlory 6
  • Can Elix components be fully controlled by the developer?

    Can Elix components be fully controlled by the developer?

    I came from the very interesting video on https://youtu.be/mtHf7crZZIQ One extreemly important note is that it mentioned that web components have to be as close to HTML as possible. However, in some of the code shown we have the web-component itself listening for events (so far so good) and then directly settings its state. Obviously, HTML elements do not set their state themselves but instead dispatch events about the user interaction/intent. It's the developer job to set the state and the HTML element would render itself accordingly. I'm hoping this is the case with Elix component as well but I'm not sure from what I saw so far. For instance, take a Tabs component with two tabs: First Text Second Text Assuming the tab-1 is the active/selected one and the stage area showing text "First Text". If the user clicks on the tab-2 "header" that tab-2 becomes active/selected and the stage then show "Second Text". If the above "web-component" behaved like native HTML elements, it'd have first dispatch an event, the developer would then decide if she wants the tab-2 to become active or not, or do whatever the developer wishes to do! I'm hoping Elix does use this principle!?

    Such scenario is not that far fetched. Imagine, the tabs contained some text area that the user would fill and then save her filled-in text to some backend. A developer might want to halt the switching from tab-1 to tab-2 and present the user with a dialog with three options: 1- discard changes and move to tab-2 2- save changes and move to tab-2 3- close this dialog and stay in tab-1 (the user wold manually continue her work on that text area).

    I hope you guys got the point. I really love so many things about what I think Elix is and wish it does allow full control from the developer as described in the example above!

    opened by mehdi-cit 6
  • SlidingStage interferes with tab navigation

    SlidingStage interferes with tab navigation

    After going through all focusable elements of a SlidingStage item, tab navigation jumps to the next SlidingStage item (1st problem) and causes a partial scroll of that item in order to make the focused element visible (2nd problem).

    Steps that reproduce the issue

    My use case is a multi-page wizard implemented as a form containing a SlidingPages/SlidingStage and a pair of buttons for validation+navigation. Each page contains focusable elements such as INPUT:

              <elix-sliding-pages>
                <div>
                  <h2>PAGE 1</h2>
                  <input name="input1a">
                  <input name="input1b">
                </div>
                <div>
                  <h2>PAGE 2</h2>
                  <input name="input2">
                </div>
              </elix-sliding-pages>
    
              <div>
                <button style="float: right">Next</button>
                <button>Previous</button>
              </div>
    

    Click on input1a ("start"), then hit the 'tab' key a first time, focus goes to input1b. Hit the tab key again, focus goes to input2. The second item ("PAGE 2") becomes partially visible.

    Expected behavior Focusable elements, which are in items not currently shown, should not participate in tab navigation. Instead, navigation should leave the item and jump to the next focusable outside of the SlidingStage component (here the "Next" button).

    Methink the proper behavior would be attained if not-shown items had visibility: hidden. This does not seem to interfere with the transition effect, at least when tested by adding the rule:

          elix-sliding-pages > [aria-selected="false"] {
            visibility: hidden;
          }
    
    opened by geonanorch 6
  • how to add forms / input elements validation

    how to add forms / input elements validation

    It seems that the Input element (possibly also other elements participating in a form) does not propagate the type attribute to the inner input element. This prevents the default browser validation from taking place.

    The Input documentation states about type:

    The value of this property will be the same as the HTML tag name registered for the custom element.

    And that is indeed the case (elix-input), but what is the purpose? In Chrome I can force the inner element type to be number and get a specialized input (though I must admit that this doesn't work with type email).

    Of course to keep elix clean and reliable, it might be preferable to not rely on the browser for validation because of the implied styling of specialized input types. But then elix form elements could provide their own validation, like is currently done in NumberSpinBox ?

    I realize that validation is not an easy topic --even the NumberSpinBox implementation is questionable as the feedback messages are not internationalization-ready. So in this issue I am rather asking for advice: how do you suggest we add validation to elix form elements ? (assuming a 'modern' browser, see also issue #113 for the others)

    opened by geonanorch 6
  • Bump typescript from 4.6.3 to 4.9.3

    Bump typescript from 4.6.3 to 4.9.3

    Bumps typescript from 4.6.3 to 4.9.3.

    Release notes

    Sourced from typescript's releases.

    TypeScript 4.9

    For release notes, check out the release announcement.

    Downloads are available on:

    Changes:

    • 93bd577458d55cd720b2677705feab5c91eb12ce Bump version to 4.9.3 and LKG.
    • 107f832b80df2dc97748021cb00af2b6813db75b Update LKG.
    • 31bee5682df130a14ffdd5742f994dbe7313dd0e Cherry-pick PR #50977 into release-4.9 (#51363) [ #50872 ]
    • 1e2fa7ae15f8530910fef8b916ec8a4ed0b59c45 Update version to 4.9.2-rc and LKG.
    • 7ab89e5c6e401d161f31f28a6c555a3ba530910e Merge remote-tracking branch 'origin/main' into release-4.9
    • e5cd686defb1a4cbdb36bd012357ba5bed28f371 Update package-lock.json
    • 8d40dc15d1b9945837e7860320fdccfe27c40cad Update package-lock.json
    • 5cfb3a2fe344a5350734305193e6cc99516285ca Only call return() for an abrupt completion in user code (#51297)
    • a7a9d158e817fcb0e94dc1c24e0a401b21be0cc9 Fix for broken baseline in yieldInForInInDownlevelGenerator (#51345)
    • 7f8426f4df0d0a7dd8b72079dafc3e60164a23b1 fix for-in enumeration containing yield in generator (#51295)
    • 3d2b4017eb6b9a2b94bc673291e56ae95e8beddd Fix assertion functions accessed via wildcard imports (#51324)
    • 64d0d5ae140b7b26a09e75114517b418d6bcaa9f fix(51301): Fixing an unused import at the end of a line removes the newline (#51320)
    • 754eeb2986bde30d5926e0fa99c87dda9266d01b Update CodeQL workflow and configuration, fix found bugs (#51263)
    • d8aad262006ad2d2c91aa7a0e4449b4b83c57f7b Update package-lock.json
    • d4f26c840b1db76c0b25a405c8e73830a2b45cbc fix(51245): Class with parameter decorator in arrow function causes "convert to default export" refactoring failure (#51256)
    • 16faf45682173ea437a50330feb4785578923d7f Update package-lock.json
    • 8b1ecdb701e2a2e19e9f8bcdd6b2beac087eabee fix(50654): "Move to a new file" breaks the declaration of referenced variable (#50681)
    • 170a17fad57eae619c5ef2b7bdb3ac00d6c32c47 Dom update 2022-10-25 (#51300)
    • 9c4e14d75174432f6a4dc5967a09712a6784ab88 Remove "No type information for this code" from baseline (#51311)
    • 88d25b4f232929df59729156dfda6b65277affec fix(50068): Refactors trigger debug failure when JSX text has a ' and a tag on the same line. (#51299)
    • 8bee69acf410d4986cb0cc102b949e2d133d5380 Update package-lock.json
    • 702de1eeaaef88a189e4d06e5a2aae287853790a Fix early call to return/throw on generator (#51294)
    • 2c12b1499908ad7718e65d20e264561207c22375 Add a GH Action to file a new issue if we go a week without seeing a typescript-error-deltas issue (#51271)
    • 6af270dee09d62516f6dc02ec102a745ffebc037 Update package-lock.json
    • 2cc4c16a26672a7ba6c97ba16309fcf334db7cae Update package-lock.json
    • 60934915d9ccc4ca9c0fb2cd060d7ec81601942b Fix apparent typo in getStringMappingType (#51248)
    • 61c26096e3373719ece686b84c698423890e9a5f Update package-lock.json
    • ef69116c41cb6805f89e6592eacb0ccb7f02207d Generate shortest rootDirs module specifier instead of first possible (#51244)
    • bbb42f453dc684e03d977c5b70391124d57543a9 Fix typo in canWatchDirectoryOrFile found by CodeQL (#51262)
    • a56b254ad3c52b598bc5d44f83f3d0a1cf806068 Include 'this' type parameter in isRelatedTo fast path (#51230)
    • 3abd351c0eea55758f27ee5558a4a1525b77f45b Fix super property transform in async arrow in method (#51240)
    • eed05112180e0d94f78aa02d676d49468f15dc31 Update package-lock.json
    • 2625c1feae25aede35465ca835440fc57bf13d52 Make the init config category order predictable (#51247)
    • 1ca99b34029dafad2c18af7bdc0711f4abf7e522 fix(50551): Destructuring assignment with var bypasses "variable is used before being assigned" check (2454) (#50560)
    • 3f28fa12dfecb8dfd66ce4684bf26f64e1f092f1 Update package-lock.json
    • 906ebe49334a3a9c2dbd73cd3c902898bc712b66 Revert structuredTypeRelatedTo change and fix isUnitLikeType (#51076)
    • 8ac465239f52de1da3ada8cdc4c3f107f4d62e45 change type (#51231)
    • 245a02cbed7ad50a21289730159abc8d19a66f40 fix(51222): Go-to-definition on return statements should jump to the containing function declaration (#51227)
    • 2dff34e8c4a91c0005ca9ccfb7e045e225b6f2e4 markAliasReferenced should include ExportValue as well (#51219)

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump puppeteer from 13.6.0 to 19.3.0

    Bump puppeteer from 13.6.0 to 19.3.0

    Bumps puppeteer from 13.6.0 to 19.3.0.

    Release notes

    Sourced from puppeteer's releases.

    puppeteer-core: v19.3.0

    19.3.0 (2022-11-23)

    Features

    • puppeteer-core: Infer element type from complex selector (#9253) (bef1061)
    • puppeteer-core: update Chrome launcher flags (#9239) (ae87bfc)

    Bug Fixes

    • remove boundary conditions for visibility (#9249) (e003513)

    puppeteer: v19.3.0

    19.3.0 (2022-11-23)

    Miscellaneous Chores

    • puppeteer: Synchronize puppeteer versions

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • puppeteer-core bumped from 19.2.2 to 19.3.0

    puppeteer-core: v19.2.2

    19.2.2 (2022-11-03)

    Bug Fixes

    puppeteer-core: v19.2.1

    19.2.1 (2022-10-28)

    Bug Fixes

    puppeteer-core: v19.2.0

    19.2.0 (2022-10-26)

    Features

    ... (truncated)

    Commits
    • c4803e4 chore: release main (#9313)
    • 689a084 chore(ng-schematics): Spawn server when running ng e2e (#9306)
    • 181b20f test: mark Frame.waitForSelector test as flaky in headful Firefox (#9307)
    • 0ed361d chore: update latest release sha (#9311)
    • 3994cdc chore: specify latest-release for puppeteer (#9309)
    • 750f236 chore: include component in puppeteer tag (#9303)
    • eda1827 docs: add bug triage guidelines (#9305)
    • bef1061 feat(puppeteer-core): Infer element type from complex selector (#9253)
    • 16784fc chore(ng-schematics): Update ng e2e to custom builder (#9300)
    • 0107ad8 chore: use groupName in release-please manifest (#9292)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump node-fetch from 3.2.3 to 3.3.0

    Bump node-fetch from 3.2.3 to 3.3.0

    Bumps node-fetch from 3.2.3 to 3.3.0.

    Release notes

    Sourced from node-fetch's releases.

    v3.3.0

    3.3.0 (2022-11-10)

    Features

    v3.2.10

    3.2.10 (2022-07-31)

    Bug Fixes

    v3.2.9

    3.2.9 (2022-07-18)

    Bug Fixes

    • Headers: don't forward secure headers on protocol change (#1599) (e87b093)

    v3.2.8

    3.2.8 (2022-07-12)

    Bug Fixes

    v3.2.7

    3.2.7 (2022-07-11)

    Bug Fixes

    v3.2.6

    3.2.6 (2022-06-09)

    Bug Fixes

    • undefined reference to response.body when aborted (#1578) (1c5ed6b)

    v3.2.5

    3.2.5 (2022-06-01)

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump express from 4.17.3 to 4.18.2

    Bump express from 4.17.3 to 4.18.2

    Bumps express from 4.17.3 to 4.18.2.

    Release notes

    Sourced from express's releases.

    4.18.2

    4.18.1

    • Fix hanging on large stack of sync routes

    4.18.0

    ... (truncated)

    Changelog

    Sourced from express's changelog.

    4.18.2 / 2022-10-08

    4.18.1 / 2022-04-29

    • Fix hanging on large stack of sync routes

    4.18.0 / 2022-04-25

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump mocha and @types/mocha

    Bump mocha and @types/mocha

    Bumps mocha and @types/mocha. These dependencies needed to be updated together. Updates mocha from 9.2.2 to 10.1.0

    Release notes

    Sourced from mocha's releases.

    v10.1.0

    10.1.0 / 2022-10-16

    :tada: Enhancements

    :nut_and_bolt: Other

    v10.0.0

    10.0.0 / 2022-05-01

    :boom: Breaking Changes

    :nut_and_bolt: Other

    Also thanks to @​ea2305 and @​SukkaW for improvements to our documentation.

    Changelog

    Sourced from mocha's changelog.

    10.1.0 / 2022-10-16

    :tada: Enhancements

    :nut_and_bolt: Other

    10.0.0 / 2022-05-01

    :boom: Breaking Changes

    :nut_and_bolt: Other

    Also thanks to @​ea2305 and @​SukkaW for improvements to our documentation.

    Commits
    • 5f96d51 build(v10.1.0): release
    • ed74f16 build(v10.1.0): update CHANGELOG
    • 51d4746 chore(devDeps): update 'ESLint' to v8 (#4926)
    • 4e06a6f fix(browser): increase contrast for replay buttons (#4912)
    • 41567df Support prefers-color-scheme: dark (#4896)
    • 61b4b92 fix the regular expression for function clean in utils.js (#4770)
    • 77c18d2 chore: use standard 'Promise.allSettled' instead of polyfill (#4905)
    • 84b2f84 chore(ci): upgrade GH actions to latest versions (#4899)
    • 023f548 build(v10.0.0): release
    • 62b1566 build(v10.0.0): update CHANGELOG
    • Additional commits viewable in compare view

    Updates @types/mocha from 9.1.1 to 10.0.0

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
Releases(15.0.1)
  • 15.0.1(Nov 13, 2021)

    This release includes a handful of minor bug fixes to PopupToggleMixin (used in FilterComboBox), SpinBox (inherited by NumberSpinBox), and FormElementMixin (used by AutoSizeTextarea and other components).

    One notable infrastructure change is that we migrated the scripts that project uses to generate various library files from CommonJS module format to ES modules. This necessitated adding type: "module" to the elix package.json file. We hope this doesn't cause issues for Elix users, but please file an issue if you run into problems.

    Source code(tar.gz)
    Source code(zip)
  • 15.0.0(Feb 13, 2021)

    This is a relatively small release, but includes the removal of some deprecated API members, so we're marking it as a major version to reflecting the potentially breaking changes for projects that have yet to update their code.

    The following deprecated features have been removed:

    • Old hyphenated event names (selected-index-changed) and the old template.html and standalone html template literal. For details on both of these, see the Elix 14.0.0 release notes.
    • Old horizontalAlign and popupPosition properties in PopupSource.

    This release also includes a number of fixes:

    • Fixed regressions in ListComboBox that failed to leave the value's text selected after the popup list box was closed, or prevented the user from entering text that was not in the list.
    • Various fixes in popup layout. This includes more reliable detection of cases where a left-aligned popup at the far right of the viewport will go outside the viewport bound's; in these cases, the popup should flip to right-aligned so the user can see the full popup.
    • A fair amount of rework of structural styling in Overlays, including Dialog, Drawer, and Popup.

    Other work:

    • Adding #elixdebugpopup=true to the URL will suppress the default close-on-blur behavior in Elix popup components. This makes it much easier to inspect and debug popups in their opened state. Thanks to @klobetime for the suggestion.
    • Track recent standard changes in the new CSS custom state selector for custom element states. The old syntax looked like my-button:state(selected), the new syntax is my-button:--selected. This updated standard is currently only supported in Google Chrome Canary.
    • Pared back the amount of code required by the ReactiveElement base class.
    Source code(tar.gz)
    Source code(zip)
  • 14.1.2(Jan 5, 2021)

    A minor release:

    • Rewrite of the logic used to layout popups to allow more positions, including left or right of the popup source.
    • Bug fixes in TrackTextSelectionMixin so that components like AutoSizeTextarea can expose more accurate text selection properties.
    Source code(tar.gz)
    Source code(zip)
  • 14.1.1(Oct 29, 2020)

    Changes in this release:

    • A new component called TooltipButton is intended for use as a base class for elements that produce a tooltip on focus or hover.
    • A new mixin called MultiSelectValueAPIMixin defines a value property for multi-select list-like elements.
    • The use of PopupToggleMixin has been moved out of PopupButton, since there exist popup buttons (notably TooltipSource, above) that don't want a popup toggle. The components that want the toggle are currently the Plain PopupButton variants and ComboBox.
    • Like wise, the application of the aria-expanded attribute has been moved from PopupButton to the subclasses that want that, including MenuButton and DropdownList.
    • PopupSource takes greater care to avoid affecting the page layout during the phase in which it is measuring the size of the popup before displaying it.
    • All component property setters that accept a string defensively coerce the supplied value to a string before storing it or working with it. This replicates the behavior of string-valued properties in native HTML elements.
    • ShadowTemplateMixin is now easier to use on its own. Normally ShadowTemplateMixin is picked up by a component by inheriting from ReactiveElement, but there are situations where it is nice to be able to use the mixin on its own, and that's now a little easier.

    We've also added a locally-runable demo browser at /demos/index.html. You can load that page in any static web server to browse the demos. For the time being, you can also see that demo browser at https://component.kitchen/demos/, although that location may change.

    Source code(tar.gz)
    Source code(zip)
  • 14.1.0(Sep 5, 2020)

    The main focus of this release is on creating more accessible components, particularly in the DropdownList, ComboBox, and MenuButton families. This is rather challenging — ARIA makes it difficult to construct an accessible representation of a component that contains interesting information in both the light DOM and Shadow DOM.

    • DropdownList and ComboBox now expose their list contents in a more ARIA-compliant way to accessibility technologies such as screen readers.
    • DelegateInputLabelMixin has been extensively reworked to support a fuller range of ARIA labeling techniques.
    • DropdownList now inherits from PopupSource instead of MenuButton so that it can provide different ARIA semantics.
    • AutoCompleteInput has been reworked to implement ARIA 1.2 combobox semantics. This enables ComboBox variants that use AutoCompleteInput to provide proper accessibility.
    • The new PopupDragSelectMixin handles the mouse interactions necessary to let users efficiently select an item from a dropdown-style element in a single mouse operation. This functionality had previously been part of MenuButton, but has been factored into a mixin so that components in the ComboBox family can also take advantage of it.
    • The new PopupListMixin is designed for components like MenuButton, DropdownList, and ListComboBox that track their own list item cursor, and want to keep that in sync with the item cursor of an inner list shown in a popup.
    • The new OptionList component is intended to present a collection of Option elements in components like DropdownList. Among other things, it does not assume that the selected item and the current item are the same. It also avoids the special focus behavior of Menu.
    • ComboBox interactions have been improved to better match the behavior of well-designed combo boxes in applications like Microsoft Office and Google Docs. For example, pressing the Esc key while a combo box is open will now restore the previously-entered value instead of simply closing the combo box.
    • ListComboBox exposes a new selectedItemValue property that returns the value attribute of the currently-selected item if one exists. For comparison, its value property is used to retrieve the current text in the combo box's input, which could be free-form text entered by the user.
    • Fixed a bug in which a ComboBox popup could appear underneath the input of another nearby ComboBox.
    Source code(tar.gz)
    Source code(zip)
  • 14.0.0(May 30, 2020)

    This is a major release.

    Event renaming

    All of the custom events raised by Elix components are being renamed to better align with the precedent set by native HTML event names.

    Until now, Elix event names have generally been in the past tense and include hyphens: e.g., when the selectedIndex property changes, a list-like component would raise a selected-index-changed event. The use of the past tense indicated that the given condition had already happened (inspecting the selectedIndex property in the event handler would show that the property value had already changed). The use of hyphens was intended to make the event names easier to read.

    However, the list of native DOM events clearly show a general preference for present tense and names without hyphens (even if that results in a hard-to-read mash of words like vrdisplaypresentchange).

    While we may not like the web's DOM event naming strategy, it's also our goal to create custom elements that feel native to the web. With that in mind, all Elix custom event names are changing to use the present tense and to omit hyphens:

    Old event name → New event name

    • closedclose
    • current-changedcurrentchange
    • current-index-changedcurrentindexchange
    • date-changeddatechange
    • disabled-changeddisabledchange
    • effect-phase-changedeffectphasechange
    • focus-visible-changedfocusvisiblechange
    • items-changeditemschange
    • openedopen
    • opened-changedopenedchange
    • refreshing-changedrefreshingchange
    • selected-changedselectedchange
    • selected-flags-changedselecteditemflagschange (note addition of "item")
    • selected-index-changedselectedindexchange
    • selection-effect-finishedselectioneffectend (note "end")
    • value-changedinput (for consistency with native textarea)

    The new event names are now available in Elix 14.0. The old event names are still available, but will be removed in a subsequent release. Normally we try to provide console warnings when you try to invoke a deprecated feature, but there's no clean way for Elix to know if you are using a deprecated event name.

    We strongly recommend that you search for all occurrences of addEventListener and review whether you are listening to any of the old event names listed above. You might try searching your code with a regex like this one, which looks for hyphens in event names passed to addEventListener:

    addEventListener\(\s*['"].+-.+['"]
    

    New names for JavaScript template literals

    Elix provides two JavaScript string template literals to make it easier to construct an HTMLTemplateElement or a DocumentFragment. These two literals are moving to a new file, elix/src/core/htmlLiterals.js. The literals are also getting new names:

    import { fragmentFrom, templateFrom } from "elix/src/core/htmlLiterals.js";
    
    templateFrom.html`<div>Hello</div>`; // returns an HTMLTemplateElement
    fragmentFrom.html`<div>Hello</div>`; // returns a DocumentFragment
    

    Previously, both of these literals were just called html, which made it slightly confusing to use both of them in the same file. The functions now hang off of two distinct objects, templateFrom and fragmentFrom that can be imported from htmlLiterals.js.

    • You generally use templateFrom.html inside a component's template property if the component is defining a template from scratch.
    • You generally use fragmentFrom.html inside a component's template property if the component is subclassing another component, and appending fragments of content to the template it inherits from its base class.

    The reason both these template literal functions are called html is that development tools like Microsoft VS Code can format the contents of a template literal called exactly html with color formatting specifically for HTML. (For VS Code users, we recommend installing the lit-html extension to see HTML properly formatted inside of an Elix JavaScript component definition.)

    The old template functions are deprecated, and using them will now trigger console warnings. They will be removed in a subsequent release.

    Rework of FilterListBox and FilterComboBox

    The Elix FilterListBox, which shows up in FilterComboBox, previously recalculated the component's set of items as the user typed a filter. This allowed the components to easily support the use of mixins like DirectionCursorMixin to navigate the set of filtered items.

    However, dynamically redefining this items collection proved to have serious downsides. Chief among them was that the filtering components would return the index of the selected item in terms of the filtered items, rather than the full, original set of items. This made it challenging for a page using these components to determine the real selected item.

    Fixing this ultimately required making substantial changes in a number of mixins, especially ItemsCursorMixin.

    To define a custom filter for FilterListBox or FilterComboBox, you previously would define an element method called internal.itemMatchesState. This would be invoked for each item to see if it matched the current state. That approach has been replaced with one in which a filtering component can maintain a state member called availableItemFlags. This is an array of booleans: a true value indicates that the item in the corresponding position of items is "available". In a filtering context, an available item is one that matches the filter.

    While doing this work, we implemented a request to have FilterListBox ignore diacritical marks like accents for filtering purposes. Thanks to @klobetime for the suggestion.

    Redefinition of value property for list-like elements

    Elix components like ListBox have long exposed a value property that returned the text of the selected item. User @chisholmd filed an issue that led us to realize that it wasn't helpful to have value work so differently from the value property on the native select element.

    To fix this, we've made the following breaking change to all list-like elements in Elix:

    • A list's value property now returns the value attribute of the selected item. Setting this property makes the item with that value the selected item.
    • A new selectedText property gets/sets the text of the selected item. That is, it provides the behavior previously delivered through the old definition of the value property.

    To facilitate components that want to provide value and selectedText properties like this, we've introduced two new mixins, SelectedValueAPIMixin and SelectedTextAPIMixin.

    Introduction of checkable Option component for use in DropdownList

    The DropdownList component now has a companion component, Option, that can be used to represent the user's choices in the list. The Option component supports a selected state, which the PlainOption variation in the Plain design system represents with a checkmark. This allows a user to see which item in the list is currently selected.

    Mixin changes

    While doing the work on FilterListBox and DropdownList, we ended up reworking a number of mixins:

    • Renamed CurrentItemInViewMixinCursorInViewMixin
    • Introduced CursorSelectMixin, which keeps an element's currentIndex and selectedIndex in sync. This mixin is used in components like ListBox that link the concepts of an item cursor and a selection. This mixin is not used by DropdownList, since that component separates those two concepts — when you navigate the list, the item cursor moves, but the selection is unaffected until you close the dropdown.
    • Introduced DelegateCursorMixin for components like the ListComboBox family that want to delegate item cursor operations to an inner list element.
    Source code(tar.gz)
    Source code(zip)
  • 13.0.0(May 11, 2020)

    This is a major release of Elix, and includes a number of breaking changes at the mixin level. Most components should work the same as before.

    Multi-selection support

    This release adds includes the project's first multi-select component, MultiSelectListBox.

    Adding this component required substantially refactoring the large collection of mixins which deal with selection. In a single-selection list like ListBox, the current item in the list — the one which can be navigated with the keyboard — is also implicitly the selected item. In a multi-selection list, the concepts of the current item and the selection are independent. E.g., in what Microsoft calls a "simple multi-select" list box, the user can navigate the current item and then toggle the selected state of that item by pressing the Space key.

    Renaming state members and mixins

    Nearly all of the Elix mixins that dealt with selection actually dealt with the current item. In order to use those mixins in multi-select components, we needed to rewrite them to manipulate or respond to the item cursor: the conceptual pointer into a set of items which indicates which item is current.

    Mostly this was a matter of renaming and reorganizing things.

    For the most part, names at the component level have remained the same. A number of mixins have changed names. Significantly, two commonly-reference state members have been renamed:

    • selectedIndexcurrentIndex
    • selectedItemcurrentItem

    Those renames affect the state members, not the public property names. The public APIs of the Elix list-like components still expose selectedIndex and selectedItem properties and a selected-index-changed event.

    If you are constructing list-like components from mixins, you can use the new ItemsCursorMixin to define currentIndex and currentItem.

    The following mixins have been renamed to reflect that they now work with the item cursor instead of "selection":

    • DirectionSelectionMixinDirectionCursorMixin
    • KeyboardPagedSelectionMixinKeyboardPagedCursorMixin
    • KeyboardPrefixSelectionMixinKeyboardPrefixCursorMixin
    • SelectionInViewMixinCurrentItemInViewMixin (The mixin's scrollSelectedItemIntoView method is now called scrollCurrentItemIntoView.)
    • TapSelectionMixinTapCursorMixin
    • TimerSelectionMixinTimerCursorMixin

    Multi-select lists

    A new mixin, ItemsMultiSelectMixin, tracks which items in a multi-select list are selected. This defines a state member selectedFlags, which is an array of flags of the same dimensions as the items state member. If a given item is selected, the corresponding position in the selectedFlags array will be true.

    Additionally, AriaListMixin has been extended to support ARIA behavior for multi-select lists.

    The new MultiSelectListBox makes use of ItemsMultiSelectMixin, AriaListMixin, and all of the renamed cursor mixins described above.

    A "simple multi-select" list typically represents the individual list items as labeled check boxes. Clicks on the check box portion toggle the selection state of the item; clicks on the label merely make it the current item but leave selection unaffected. The release introduces a new component called CheckListItem to address this use case.

    As with all Elix base components, MultiSelectListBox and CheckListItem provide structural styling only and no aesthetic styling. The Plain reference design system contains new components PlainMultiSelectListBox and PlainCheckListItem which subclass the base components to provide basic styling.

    Mixins for public APIs

    Until now, Elix mixins have defined both component internals and public APIs for working with those internals. E.g., the previous SingleSelectionMixin defined a selectedIndex state member and exposed that as a public selectedIndex property and selected-index-changed event.

    In the long run, it seems better to factor internals from public APIs. A generic single-selection list may want to expose a public selectedItem property, but a single-selection list focused on a specific data object like a list of users may want to expose that same concept as a public selectedUser property.

    To accommodate that, we would like to eventually factor out public APIs into mixins of their own. We used the above reworking of selection mixins into item cursor mixins to also factor out public APIs:

    • ItemsAPIMixin exposes a public items collection and items-changed event. Previously, these had been defined by ContentItemsMixin.
    • CursorAPIMixin exposes public currentIndex and currentItem properties and a current-index-changed event. This also exposes public cursor methods: goFirst, goLast, goNext, and goPrevious.
    • SingleSelectAPIMixin exposes selectedIndex and selectedItem properties and a selected-index-changed event.
    • MultiSelectAPIMixin exposes public selectedFlags and selectedItems properties and a selected-flags-changed event.

    The list components apply these mixins as follows:

    • ListBox includes ItemsAPIMixin, CursorAPIMixin, and SingleSelectAPIMixin. The currentIndex/currentItem properties will report the same values as the corresponding selectedIndex/selectedItem properties. Among other things, this arrangement ensures that pages that previously listened for a list's selected-index-changed event will continue to work.
    • MultiSelectListBox includes ItemsAPIMixin, CursorAPIMixin, and MultiSelectAPIMixin.

    The responsibilities of the previous SingleSelectionMixin are now split between the new internal-focused ItemsCursorMixin and the external-focused SingleSelectAPIMixin. You can apply both those mixins to a component to replace the use of SingleSelectionMixin.

    If you were previously navigating a list's selection through public "select" methods defined by SingleSelectionMixin, you will now need to use the public cursor methods defined by ItemsCursorMixin:

    • selectFirstgoFirst
    • selectLastgoLast
    • selectNextgoNext
    • selectPrevious go→ Previous

    Removals of deprecated features

    This release removes some features that had been deprecated in Elix 12.0.0.

    • The old lifecycle methods componentDidMount and componentDidUpdate have been removed.
    • The template.createElement and template.transmute methods no longer support an HTMLTemplateElement as a part descriptor.

    See the earlier release notes for migration instructions.

    Source code(tar.gz)
    Source code(zip)
  • 12.1.4(Apr 25, 2020)

    This is a minor bug fix release.

    • Fixes a regression with typing and selection behavior in input and textarea components.
    • Fixes a regression with auto-complete behavior in FilterComboBox.
    Source code(tar.gz)
    Source code(zip)
  • 12.1.3(Apr 25, 2020)

    This is a minor bug fix release.

    • Fixes for some focus ring issues.
    • Allow a list item to define a label via internal.getItemText. The default implementation looks at the aria-label attribute, the alt attribute, and textContent, in that order.
    • Prefer display: inline-block, inline-flex, or inline-grid on host unless we actually need a block-type display. The inline variations tend to be more flexible as default display values.
    Source code(tar.gz)
    Source code(zip)
  • 12.1.2(Apr 7, 2020)

    This is a minor release.

    • DarkModeMixin now tracks live changes the user makes to their OS color scheme preference. The demo on the docs page shows a carousel that updates itself to match the light or dark color scheme when the user applies that change through system properties.
    Source code(tar.gz)
    Source code(zip)
  • 12.1.1(Apr 3, 2020)

  • 12.1.0(Mar 31, 2020)

    This is a minor release of Elix.

    • The new SpinBox class can be used as the basis for input elements that let the user increment/decrement a value along a continuous range.
    • The specific NumberSpinBox component extends SpinBox to optimize for simple numeric values. It’s comparable to a standard <input type=“number”>.
    • The new RepeatButton component can be used to create buttons that repeat an action for as long as the user holds the mouse button down. A SpinBox can use this for its up and down button parts so the user can rapidly increment/decrement a value by holding the mouse button down.
    • The repeat work in RepeatButton is handled by a new RepeatMousedownMixin that can be applied to any component to give it the repeating mouse down behavior.
    • In complex elements like SpinBox and ComboBox that place interactive elements next to an input element, FocusVisibleMixin can now apply a focus ring around the entire component instance. This helps the user perceive the entire instance as a single interactive unit. To accomplish this, FocusVisibleMixin does its styling work through a style element it inserts in the component’s template. If you have a component that applies FocusVisibleMixin, be sure to have your internal.template getter invoke super so FocusVisibleMixin has a chance to modify the template.
    • A number of Elix components are built around an inner input element. Two new mixins, DelegateInputLabelMixin and DelegateInputSelectionMixin make it easier for such components to deliver standard input features. The former ensures that any aria-label attribute set on the outer component is delegated to the inner input; the latter delegates standard HTML text selection methods like setRangeText to the inner input.
    Source code(tar.gz)
    Source code(zip)
  • 12.0.0(Mar 20, 2020)

    This release introduces breaking changes.

    New rendered method replaces componentDidMount/componentDidUpdate

    The componentDidMount and componentDidUpdate methods have been reworked into a single method called rendered. ReactiveMixin invokes this method after your component has completed all of its rendering work in the pre-existing render method. Like render, the new rendered method receives a changed parameter indicating which state member changes triggered rendering.

    In both render and rendered, you can inspect a new internal.firstRender property: if true, the component is rendering for the first time (as in the previous componentDidMount method). This is a good time to do one-time work like wiring up event handlers; in many cases you can actually now move the wiring of events into the render call, since it will only be called once. (If you prefer, it's of course fine to do event wiring in the rendered call after rendering completes.)

    If internal.firstRender is false, the component is rendering for a subsequent time (as in the previous componentDidUpdate method).

    Old:

    class MyElement extends ReactiveElement {
      [internal.componentDidMount]() {
        super[internal.componentDidMount]();
        this.addEventListener('click', event => { ... });
      }
    }
    

    New:

    class MyElement extends ReactiveElement {
      [internal.render](changed) {
        super[internal.render](changed);
        if (this[internal.firstRender]) {
          this.addEventListener('click', event => { ... });
        }
      }
    }
    

    Calling componentDidMount or componentDidUpdate in Elix 12.0 will still work, but will trigger a console warning. Those methods will be dropped in the next major release of Elix.

    transmute will longer accept an HTMLTemplateElement as a part descriptor

    The template.transmute function previously let you pass one of three different part descriptors: 1) a component constructor, 2) an element tag name, or 3) an HTMLTemplateElement. The last was rarely used, and twisted the meaning of "transmute". In Elix 12.0, that will now trigger a console warning. In the next major release of Elix, that will stop working; you'll only be able to pass in a constructor or tag name.

    If you were passing a template to transmute, chances are that you were using it to insert elements into a larger template inherited from a base class. In general, you should be able to do that using DOM methods directly — append, etc. — to perform the same manipulation without the overhead of transmute.

    Additionally, the transmute function no longer accepts an array of nodes or a NodeList; you can only transmute one Node at a time. To transmute an array or NodeList, simply loop over it yourself and invoke transmute for each element in the array or list. Again, the goal of this removal was to simplify the definition of transmute.

    Other changes

    • OpenCloseMixin's opened property is now parsed and reflected like a native HTML boolean attribute. All Elix mixins with boolean attributes support both native boolean attribute formats: to set a boolean attribute like opened to true in HTML, you can write either <elix-drawer opened> or <elix-drawer opened=“opened”>.
    • OpenCloseMixin’s closed property is now read-only. To change an element’s opened/closed state, set opened instead.
    • The Drawer component no longer manipulates the opacity of the backdrop part; that functionality has been moved to PlainDrawer. Thanks to @nategreen, who reported this Drawer bug, as well as another that led to the two above changes.
    • The template.wrap helper has been removed, as it was extremely specialized for the needs of a small number of mixins. Those mixins now make plain DOM calls directly to accomplish the same result.
    • The dom.js helper replaceChildNodes has been renamed updateChildNodes, to better suggest that it updates the set of child nodes rather than completely replacing them.
    • A number of type declarations have been tightened.
    • The template.html and html helpers now leverage the native String.raw template function for better performance and reduced code size.
    • All Elix components with replaceable parts now perform part replacement in both the template getter and the render method. The addition of the former means that, if you define a component subclass and override a part type defined by the base class, your component’s template will end up with the replaced part baked in — no parts will need to be replaced the first time instances are rendered.
    Source code(tar.gz)
    Source code(zip)
  • 11.0.1(Mar 2, 2020)

  • 11.0.0(Mar 2, 2020)

    This is a major release of Elix with numerous breaking changes.

    The Plain reference design system

    Previous releases of the Elix components included both base class behavior and a minimum degree of styling. This made it easy to pick up and use an Elix component if you were fine with that default styling, but made it harder to use Elix as the basis for implementing your own company’s design system as components.

    Since one of Elix’s core goals is to be a foundation for design systems, we’ve factored the default styling out of the base components. The Elix base components now only include structural styling: styling necessary necessary to achieve the basic expectations of a user interface pattern. For example, a basic expectation of a combobox component is that it position a popup directly underneath (or above) an input element, so the Elix ComboBox base class has structural styling to make that possible.

    But the base components do not contain any aesthetic styling to achieve a particular look and feel. If you try to instantiate a base component, it probably won’t be usable. It will be missing borders, background colors, and other visual cues to let the user recognize the component as an interactive UI element.

    Aesthetic styling is now left up to component subclasses to provide. To demonstrate how that can be done, and to deliver components that can be used directly, Elix now provides a reference design system called “Plain”. As its name implies, the Plain design system is deliberately minimalistic so that it can fit in with a wide variety of applications. For every base component like Drawer, you’ll find a Plain version of that component that adds extremely basic aesthetic styling.

    If you want to use Elix components in your application right away, you’ll want to use the new Plain versions. If you have been loading Elix components via the paths at /define, those will now load the Plain components automatically. E.g., elix/define/Drawer.js now loads the Plain version of the Drawer component.

    File reorganization

    The /src folder has been grouped into three subfolders:

    • src/core – The ReactiveElement base class, the core files it’s built from, plus utilities
    • src/base – Component mixins and generic components (typically can’t be instantiated directly)
    • src/plain – Components in the new Plain reference design system

    The base components include no styling, so you generally won’t be able to use them directly.

    Updating imports

    If you were importing files directly from the /src folder, you will need to update your import paths:

    Imports of the core files should now include /core/:

      elix/src/internal.js → elix/src/core/internal.js
      elix/src/ReactiveElement.js → elix/src/core/ReactiveElement.js
      elix/src/template.js → elix/src/core/template.js
      elix/src/utilities.js → elix/src/core/utilities.js
    

    One exception is internal.js. Import that file from src/base:

      elix/src/internal.js → elix/src/base/internal.js
    

    Imports of component mixins will now need to include /base/, e.g.:

      elix/src/SingleSelectionMixin.js → elix/src/base/SingleSelectionMixin.js
    

    If you are subclassing any Elix components, you will need to decide whether you want to start with the generic base component (and provide all styling yourself) or start with the Plain version of the base component:

      elix/src/Drawer.js → elix/src/base/Drawer.js (if you want the generic drawer)
      elix/src/Drawer.js → elix/src/plain/PlainDrawer.js (if you want the drawer with reference Plain styling)
    

    Finally, the file utilities.js has been renamed dom.js to better reflect the fact that it contains DOM helpers:

      elix/src/utilities.js → elix/src/core/dom.js
    

    Imports of elix/src/elix.js (or just import “elix” with bundlers like webpack) should still work as before.

    Imports of any component in elix/define that auto-defined itself, e.g., /elix/define/Drawer, should still work as before.

    If you use TypeScript or VS Code, all type-checking should still work as before.

    New components and mixins

    • The new UpDownToggle component can be used for the part of a combo box, menu button, expanding panel, etc. that can point up or down.
    • The new SelectableMixin tracks the selected state of a button, tab, etc.

    The Plain design system distinguishes between a Button, which has no border, and a BorderButton, which provides a border. Previous versions of Elix included a component called SeamlessButton that turned off the border styling it inherited from Button. Since the base Button component now has no border, SeamlessButton is no longer necessary. If you were using that, you can now use Button instead.

    Simplification to defining templates

    The template.concat function in previous versions of Elix has been deprecated in favor of calling the DOM API to directly append new elements to a template’s content. To make that a little easier, this version of Elix introduces an html utility in src/core/html.js that returns a DocumentFragment. That lets you directly append to a template’s content:

    Old way to extend a template:

    import * as internal from "elix/src/internal.js";
    import * as template from "elix/src/template.js";
    
    class MyElement extends SomeBaseElement {
      get [internal.template]() {
        return template.concat(
          super[internal.template],
          template.html`<style>…</style>`
        );
      }
    }
    

    New way to extend a template:

    import * as internal from "elix/src/base/internal.js";
    import html from "elix/src/core/html.js";
    
    class MyElement extends SomeBaseElement {
      get [internal.template]() {
        const result = super[internal.template];
        result.content.append(
          html`
            <style>
              …
            </style>
          `
        );
        return result;
      }
    }
    

    Most of the Plain components in src/plain show use of this technique.

    As part of this shift, the previous template.defaultSlot helper has been removed. Use the DOM API directly to find the slot with no name attribute — that will be the default slot.

    Old:

    const defaultSlot = template.defaultSlot(result.content);
    

    New:

    const defaultSlot = result.content.querySelector("slot:not([name])");
    
    Source code(tar.gz)
    Source code(zip)
  • 10.0.0(Feb 7, 2020)

    This essentially minor release does make a breaking change to an obscure part of Elix, so we're taking the precaution of marking it as a major release.

    The change pertains to the way that Elix lets multiple mixins and classes ensure state consistency in situations where one mixin updates a state member and the change has implications for a state member handled by another mixin.

    Previously, this was done by defining state through a special State class that had some magic. Since we prefer explicit code (including a bit of boilerplate) over magic, we've removed that State class, and have gone back to defining state as just a plain object. The State class' magic onChange handlers are now handled by a more explicit component method called internal.stateEffects.

    We're not aware of anyone who was using the previous State class directly. If you have issues or questions, please get in touch. In most cases, this release should not be a breaking change for you.

    Other work in this release:

    • You can now create Elix components with closed shadow roots. ShadowTemplateMixin now looks at an optional shadowRootMode property to determine whether the shadow root should be open or closed. The default mode is still open.
    • Expansion of our type-checking coverage to include the Elix unit test suite. Many thanks to @wolframkriesing for doing that work.
    Source code(tar.gz)
    Source code(zip)
  • 9.0.3(Jan 16, 2020)

    Minor bug fix release.

    • Fix an internal function that converts camelcase fooBar property names to kebab-case foo-bar attribute names. Thanks to @rperki8 for spotting and fixing this!
    • Fix ListComboBox and its variations so that the user can properly scroll the list when the list of items is longer than the available space. Also fix a ListComboBox bug in which clicking in the list's scroll bar to scroll the list would prematurely close the combo box.
    Source code(tar.gz)
    Source code(zip)
  • 9.0.2(Dec 21, 2019)

    This is a minor release.

    • OverlayMixin now works around a quirk in Safari that prevented the correct calculation of a default z-index.
    • Some of PopupButton's default button styling has been identified as generic styling so that you can more easily turn it off when created themed variations of that component.
    Source code(tar.gz)
    Source code(zip)
  • 9.0.1(Nov 22, 2019)

    This is a minor release.

    • Components like buttons and input elements that want to inherit font styling from the document (instead of using default system fonts for such controls) now use font: inherit instead of more specific font-* properties. This lets them inherit all font aspects instead of just a few specific aspects.
    Source code(tar.gz)
    Source code(zip)
  • 9.0.0(Nov 8, 2019)

    This release adds initial support for CSS Shadow Parts and custom pseudo-classes.

    • All components should now expose their key internal elements as CSS shadow parts.
    • The Elix documentation has been updated to list those shadow parts. E.g., the API listing for Dialog shows that the component exposes backdrop and frame parts. These can be targeted in CSS as ::part(backdrop) and ::part(frame), respectively.
    • Demos have been created or extended to showcase support for styling with ::part and :state. See the demos in the Customizing documentation.
    • In order to match up with the new part language, the earlier Elix properties that ended in Role now end in PartType. The corresponding attributes that ended in "-role" now end in "-part-type". E.g., the stageRole property is now stagePartType, and the corresponding stage-role attribute is now stage-part-type.
    • Elix components previously applied CSS classes in certain cases for styling purposes. E.g., a ListBox would apply a "selected" CSS class to the selected item. To avoid possible conflict with page CSS, Elix components now generally apply attributes instead of CSS classes. In the case of ListBox, it now applies a selected attribute (instead of a CSS class) to the selected item.
    Source code(tar.gz)
    Source code(zip)
  • 8.0.1(Oct 25, 2019)

    This is a minor release.

    • Fixes #105: CrossfadeStage: Unselected items are transparent but can still interfere with interactions inside selected item.
    Source code(tar.gz)
    Source code(zip)
  • 8.0.0(Oct 3, 2019)

    Elix 8.0 is a major release with breaking changes that focuses on giving you greater manual control over component registration.

    All Elix components in prior versions automatically registered themselves with the browser with a tag that looked like <elix-something>. Read this blog post for more details on why Elix did this, and some of the pros and cons of doing that.

    To give projects more flexibility with Elix components, in Elix 8.0 all Elix component modules now come in two flavors:

    • The modules in the project's /src folder now export a component class, but do not register that class as a custom element. You have to register it yourself. These /src modules are intended for use in apps that have some complexity, and where you want complete control over your components.
    • The modules in the project's new /define folder export the corresponding class and register that class as a custom element. Example: elix/define/Carousel.js exports the Carousel class and registers it with the tag elix-carousel. The tag name is always the prefix elix- followed by the class name in kebab case, so ComboBox becomes elix-combo-box. These /define modules are a convenient way to use components in straightforward apps where you're more concerned about getting things done than having complete control, and the constraints of auto-registration are acceptable.

    This is a breaking change, as most projects that want to continue using the auto-registered elix- component tags will need to find paths that reference components in the elix/src folder and replace those with the elix/define variations. At the same time, you'll want to leave paths that reference mixins and other helpers alone so that they continue to point to elix/src. Mixin file names end with the word "Mixin", and helper file names begin with a lowercase letter.

    Examples:

    • elix/src/ListBox.js becomes elix/define/ListBox.js (if you want the automatically-registered, default elix-list-box tag).
    • elix/src/SingleSelectionMixin.js remains the same because it's a mixin.
    • elix/src/template.js remains the same because it's a helper.

    Migration

    In editors like VS Code whose Find/Replace features support regular expressions with negative lookbehind, you can migrate your component paths to Elix 8.0 with a case-sensitive Find/Replace operation:

    • Find: elix\/src\/([A-Z].+(?<!Mixin)\.js)
    • Replace: elix/define/$1

    Following the upgrade to Elix 8.0, you'll have the option of manually registering the Elix components with different tag names.

    Different versions of the Elix 8.0 components can be loaded on the same page. Among other things, you can load Elix 7.0 (and earlier) components and Elix 8.0 components on the same page. See this sample project.

    Source code(tar.gz)
    Source code(zip)
  • 7.0.0(Sep 12, 2019)

    This release includes the following breaking changes intended to solidify the public APIs for all Elix components:

    • All internal operations, like the setState or render methods, and the state property, are now behind symbols instead of string names.
    • We've renamed our collection of Symbol keys from symbols.js (which focused on the data type) to internal.js (which focuses on the intended purpose). So an element accesses its state via this[internal.state].
    • We've renamed our shorthand function that looks up shadow elements by ID. Previously, you could write this.$.foo to get a reference to a shadow element with the ID "foo". The equivalent new code is this[internal.ids].foo.

    For the rationale behind these changes , see this blog post on Hiding internal framework methods and properties from web component APIs.

    To update components built on Elix 6.0 or earlier, you will need to make the following replacements in your code:

    $ -> [internal.ids] componentDidMount -> [internal.componentDidMount] componentDidUpdate -> [internal.componentDidUpdate] defaultState -> [internal.defaultState] render -> [internal.render] state -> [internal.state] setState -> [internal.setState]

    Aside from the above breaking changes, this release includes no substantive changes in the Elix components or mixins themselves.

    Source code(tar.gz)
    Source code(zip)
  • 6.0.6(Sep 4, 2019)

    This release adds support for components that can be submitted with forms. As described in this explainer, custom elements can now sit inside a <form> and submit data along with the standard HTML input elements.

    • The new FormElementMixin allows you to quickly make any component class participate in form submission.
    • All Elix elements that have a value property now use the above FormElementMixin and can participate in forms. This includes: AutoCompleteComboBox, AutoCompleteInput, AutoSizeTextarea, CalendarMonthNavigator, ComboBox, DateComboBox, DateInput, DropdownList, FilterComboBox, FilterListBox, Input, ListBox, and ListComboBox.

    As of this writing (September 2019), form support is only available in Chrome/Edge Canary builds. The first public release of a browser that supports form-enabled custom elements will likely be Chrome 78, currently scheduled to ship in late October 2019. Safari and Firefox have both expressed support for the API, although it is not yet known when they might ship that support.

    Source code(tar.gz)
    Source code(zip)
  • 6.0.5(Aug 15, 2019)

    This release focuses on improving support for vertically-oriented carousels and drawers:

    • Added vertical support to TrackpadSwipeMixin. A component can set its orientation state to “vertical” to tell both TouchSwipeMixin and TrackpadSwipeMixin that it wants to support vertical swipes.
    • Added vertical support to SlidingStage, SlidingPages, Explorer, Carousel, and carousel variations. See the vertical Carousel demo on the Carousel page.
    • Introduce DrawerWithGrip component for drawers that want to leave a little grip visible at all times. This lets the user know the drawer is there, and give them something to click or swipe out to open the drawer.
    • Added a demonstration of a highly-stylized custom drawer; see the above DrawerWithGrip page;

    Bug fixes:

    Source code(tar.gz)
    Source code(zip)
  • 6.0.4(Jul 9, 2019)

    This release fixes a bug in TrackpadSwipeMixin in which a trackpad swipe to the left or right would result in moving two index positions to the left or right instead of one as expected.

    Source code(tar.gz)
    Source code(zip)
  • 6.0.3(Jun 28, 2019)

  • 6.0.2(Jun 7, 2019)

    Minor release including:

    • Better support for compilation in Babel projects, e.g., React apps.
    • Minor improvements to TypeScript declarations.
    Source code(tar.gz)
    Source code(zip)
  • 6.0.1(May 31, 2019)

    This minor release adds TypeScript .d.ts files for all components and helper functions. This allows people using Elix in a TypeScript project perform type-checking of their code that interacts with Elix components.

    To try this out, see the sample TypeScript project at https://github.com/elix/typescript-example.

    Source code(tar.gz)
    Source code(zip)
  • 6.0.0(May 24, 2019)

    This is a major release, with a number of breaking changes.

    Rendering

    • ReactiveMixin now tracks which state members have actually changed between renders. See the ReactiveMixin example for more information. For an example that uses a template to define the Shadow DOM, see the corresponding ReactiveElement example.
    • This means that the method identified by symbols.render accepts a changed parameter that must be passed to any superclasses so they can use it too.
    • componentDidUpdate now accepts a changed parameter identical to the one passed to symbols.render. Previously a previousState property was passed to componentDidUpdate.
    • Components are now expected to use symbols.render to directly make all of their updates to the DOM, taking advantage of the changed parameter to know what to update.
    • Similarly, list-like components are now expected to directly render changes to list items to the DOM.
    • With the above, the "updates" system previously handled by RenderUpdatesMixin is no longer supported. The similar "item updates" system handled by ContentItemsMixin has been dropped as well.
    • Since no Elix components were using shouldComponentUpdate, that lifecycle method has been dropped. If we find cases where we need it, we'll add it back.

    As result of the above changes, components now generally use the web platform more directly. This has allowed the size of our base ReactiveElement class to shrink. In Elix 5.0, a minified, gzip'ed package with ReactiveElement was 12K. In 6.0, the corresponding package is 7K.

    End of polyfill support

    With Microsoft's shift to using Chromium in Microsoft Edge, Elix will no longer support versions of Microsoft Edge using the EdgeHTML rendering engine, and will no longer support using Elix under the web components polyfills. With these changes, Elix has been able to drop a variety of hacks and workarounds that had only been necessary to support Microsoft Edge 18 and earlier.

    Minor improvements

    Many small bugs have been fixed. Some of the more notable fixes include:

    • CenteredStripOpacity, and components like Carousel that use it, initially render their elements (e.g., a carousel's page dots) at low opacity, then makes the selected one opaque. Previously, it had done the reverse, which could cause flashing.
    • ComboBox has received a number of fixes to address issue #89 and others related to popup overflow.
    • ComboBox opens the popup if the user presses Page Up or Page Down when popup is closed.
    • KeyboardPagedSelectionMixin had previously displayed some cross-browser differences in how paged scrolling work. These have been addressed.
    • A number of components have been rewritten to use CSS for styling instead of applying inline styles. This makes it easier to override the generic styling that comes with those components.
    • A new AriaRoleMixin helps components provide a default ARIA role.
    • DateComboBox now exposes the same year/month/day format options as CalendarMonth.
    Source code(tar.gz)
    Source code(zip)
Owner
Elix
Web community project for high-quality web components
Elix
@nodesecure/ci brings together a set of tools to identify dependencies vulnerabilities and track most common malicious code and patterns

NodeSecure CI Action @nodesecure/ci brings together a set of tools to identify dependencies vulnerabilities and track most common malicious code and p

null 7 Jul 29, 2022
Grupprojekt för kurserna 'Javascript med Ramverk' och 'Agil Utveckling'

JavaScript-med-Ramverk-Laboration-3 Grupprojektet för kurserna Javascript med Ramverk och Agil Utveckling. Utvecklingsguide För information om hur utv

Svante Jonsson IT-Högskolan 3 May 18, 2022
Hemsida för personer i Sverige som kan och vill erbjuda boende till människor på flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
A good web interface for youtube-dl that allows you to download arbitrary mixes of audio and video, including up to the highest quality such as 8K.

?? youtube-dl-web A good web interface for youtube-dl that allows you to download arbitrary mixes of audio and video, including up to the highest qual

Codian 90 Dec 30, 2022
Awesome critique of crypto / web3. Curated list of high quality critique plus background. Seek to be as constructive as possible.

Awesome critique of crypto/web3 Awesome critique of crypto/web3, etc. Contributions are welcome. Critique General Stephen Diehl series - https://www.s

Rufus Pollock 1.5k Jan 1, 2023
High-quality QR Code generator library in Java, TypeScript/JavaScript, Python, Rust, C++, C.

QR Code generator library Introduction This project aims to be the best, clearest QR Code generator library in multiple languages. The primary goals a

Nayuki 3.3k Jan 4, 2023
CloudCrafter CLI is a command-line interface tool that provides templates for common cloud resources to help you get started quickly.

CloudCrafter CLI CloudCrafter CLI is a command-line interface tool that provides templates for common cloud resources to help you get started quickly.

Missio 7 May 5, 2023
A high-speed download mirror list of common software for Chinese users.

cdMir mir.ug0.ltd 介绍 这是一个软件镜像站,旨在通过搜集或搭建镜像的方式,为处于中国大陆的用户提供高速下载服务。 如果您需要软件并未被 cdMir 收录,请联系我们(包括但不限于 发布Issues、社交媒体联系、邮箱联系),我们会考虑并添加。 如果您认为我们值得支持,请 star

Had 14 Dec 29, 2022
Listing of accessible components & patterns

Accessible Components I've built a good handful of accessible markup patterns and widgets at this point. Each is based on testing with users, UX and d

Scott O'Hara 538 Jan 3, 2023
A set of common UI Components using the power of CSS and without Javascript

A set of common UI Components using the power of CSS and without Javascript

Felipe Fialho 650 Dec 31, 2022
This is a demo of updating a map to show air quality data for the user’s current location using Next.js Advanced Middleware, powered by Netlify Edge Functions.

Show Local Air Quality Based on the User's Location Use AQI data to show the air quality near the current user. This is built using Next.js Advanced M

Jason Lengstorf 8 Nov 4, 2022
AppRun is a JavaScript library for developing high-performance and reliable web applications using the elm inspired architecture, events and components.

AppRun AppRun is a JavaScript library for building reliable, high-performance web applications using the Elm-inspired architecture, events, and compon

Yiyi Sun 1.1k Dec 20, 2022
🌬️ Web platform to show air quality data.

Air Quality Measurement - Web ??️ Web platform to show air quality data. ?? Table of Contents About How it works Usage Getting Started Built Using Aut

Jean Poffo 4 Oct 12, 2022
Responsive Portfolio Website Using Html, Css and JavaScript, With a beautiful user interface

Responsive Portfolio Website Alexa Watch it on youtube Responsive Portfolio Website Alexa Responsive Portfolio Website Using Html, Css and JavaScript,

Alex Axel Mucyo 1 Mar 11, 2022
A User Interface for calling a program's instructions

Anchor Test UI Testing Anchor programs can be lenghty and overwelming So we thought of a Cool Way of Testing Anchor program without writing an Testing

Pratik Saria 25 Sep 3, 2022
Ossama Mehmood (ossamamehmood.me) 🚀 Digital Creator / 🎗️ Graphic Designer / 🔮 User Interface (UI) & Experience (UX)

Ossama Mehmood 샘 (ossamamehmood.me) Greetings..! I'm Ossama Mehmood DIGITAL CREATOR OSSAMAMEHMOOD Home About me Skills Resume Testimonials Portfolio C

Ossama Mehmood 샘 2 Jun 17, 2022
ClickCat is a firendly user interface that lets you search,explore and visualize your ClickHouse Data.

ClickCat is a firendly user interface that lets you search,explore and visualize your ClickHouse Data. We provides the following features,you can acce

海博科技 34 Dec 13, 2022