Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

web-ui-pack

Package Overview
Dependencies
Maintainers
1
Versions
29
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

web-ui-pack

Web package with UI elements

  • 0.10.1
  • Source
  • npm
  • Socket score

Version published
Maintainers
1
Created
Source

logo web-ui-pack

Web package with high scalable WebComponents and helpers

npm version code coverage install size npm downloads License: MIT

Demo

You can see demo here or just clone repo and run npm i & npm start

Features

  • Possible to use with/without any frameworks like Angular, React, Vue etc. (because it's js-native logic)
  • Form/controls are ready to use and has built-in completed validation logic for any case that you can imagine (see demo/controls)
  • Focus on accessibility best practices, most of popular packages has low-accessibility support
  • High scalable and easy customizable (every component is developed to easy inherit and redefine/extend default logic)
  • Built-in css-variables to use custom color-themes with native ordinary styling (css, scss etc.)
  • Built-in dark color scheme. To use need to add attr wupdark (<body wupdark>) and define general background & text colors
  • Built-in Typescript (coverage types 100%)
  • Built-in .jsx/.tsx support (for React/Vue)
  • Supports different locales (based on localeInfo helper)
  • Well documented via JSDoc (use intellisense power of your editor to get details about each property/option/usage)
  • Optimized for webpack (build includes only used components and helpers via side-effects option)
  • Zero dependancy (don't need to wait for bug-fixing of other packages)
  • Always 100% test coverage via e2e and unit tests (it's must-have and always will be so)
  • Focus on performance (it's important to have low-memory consumption and fastest initialization)

Why the package is so big

It's developed with Typescript and has huge built-in documentation (JSDoc). Every method,property,event is documented well so you don't need extra resource to take an example to implement or configure elements. In build-result without comments you will see that it's small-enough

Installing & usage

  1. Install with npm npm install web-ui-pack

  2. Add import WUPPopupElement from "web-ui-pack"; into main.js file

  3. For usage with React see CODESTYLE.md

  4. For usage with HTML + VSCode extend VSCode settings

    // .vscode/settings.json
    {
      // ...
      "html.customData": ["node_modules/web-ui-pack/types.html.json"]
    }
    
  5. Type <wup w- to see suggestions (if it doesn't work reload VSCode). More details below

TODO

Components

Common rules:

  1. Naming
    • All components named as WUP..Element, WUP..Control and has <wup-...> html-tags
    • Public properties/options/events/methods startsWith $... (events $onShow, $onHide, methods $show, $hide, props like $isShown etc.)
    • Every component/class has static $defaults (common options for current class) and personal $options (per each component). See details in example
    • $options are observed. So changing options affects on component immediately after empty timeout (every component has static observedOptions as set of watched options)
    • all custom attributes updates $options automatically. So document.querySelector('wup-spin').$options.inline equal to <wup-spin inline />
  2. Usage
    • For webpack sideEffects switched on (for optimization). But if you don't use webpack don't import from web-ui-pack directly (due to tree-shaking can be not smart enough). Instead use web-ui-pack/path-to-element
    • Every component has a good JSDoc so go ahead and read details directly during the coding
    • Library compiled into ESNext. To avoid unexpected issues include this package into babel (use exclude: /node_modules\/(?!(web-ui-pack)\/).*/ for babel-loader)
  3. Limitations
    • In jsx/tsx instead of className use class attribute (React issue)
    • If you change custom html-attributes it will update $options, but if you change some option it removes related attribute (for performance reasons). Better to avoid usage attributes at all
  4. Inheritance

Example

Check how you can use every element/control (popupElement for example) Also check code style example

Typescript

import WUPPopupElement, { ShowCases } from "web-ui-pack/popup/popupElement";

// redefine some defaults; WARN: you can change placement rules here without changing $options per each element!!!
WUPPopupElement.$defaults.offset = [2, 2];
WUPPopupElement.$defaults.minWidthByTarget = true;
WUPPopupElement.$defaults.arrowEnable = true;

// create element
const el = document.createElement("wup-popup");
// WARN el.$options is a observable-clone of WUPPopupElement.$defaults
// WARN: ShowCases is const enum and import ShowCases available only in Typescript
el.$options.showCase = ShowCases.onClick | ShowCases.onFocus; // show popup by target.click and/or target.focus events
el.$options.target = document.querySelector("button");
/*
  Placement can be $top, $right, $bottom, $left (top - above at the target etc.)
  every placement has align options: $start, $middle, $end (left - to align at start of target)
  also you can set $adjust to allow Reduce popup to fit layout
*/
el.$options.placement = [
  WUPPopupElement.$placements.$top.$middle; // place at the top of target and align by vertical line
  WUPPopupElement.$placements.$bottom.$middle.$adjust, // adjust means 'ignore align to fit layout`
  WUPPopupElement.$placements.$bottom.$middle.$adjust.$resizeHeight, // resize means 'allow to resize to fit layout'
]
document.body.append(el);

HTML, JSX, TSX

<button id="btn1">Target</button>
<!-- You can skip pointing attribute 'target' if popup appended after target -->
<wup-popup w-target="#btn1" w-placement="top-start">Some content here</wup-popup>

How to extend/override

/// popup.ts

// you can override via prototypes
const original = WUPPopupElement.prototype.goShow;
WUPPopupElement.prototype.goShow = function customGoShow() {
  if (window.isBusy) {
    return null;
  }
  return original(...arguments);
};

/*** OR create extended class ***/

class Popup extends WUPPopupElement {
  // take a look on definition of WUPPopupElement and you will find internals
  protected override goShow(showCase: WUPPopup.ShowCases): boolean {
    if (showCase === WUPPopup.ShowCases.onHover) {
      return false;
    }
    return super.goShow(showCase);
  }
}

const tagName = "ext-popup";
customElements.define(tagName, Popup);
// That's it. New Popup with custom tag 'ext-popup' is ready

// add for intellisense (for *.ts only)
declare global {
  // add element to document.createElement
  interface HTMLElementTagNameMap {
    [tagName]: Popup;
  }

  // add element for tsx/jsx intellisense
  namespace JSX {
    interface IntrinsicElements {
      [tagName]: IntrinsicElements["wup-popup"];
    }
  }
}

Helpers

use import focusFirst from "web-ui-pack/helpers/focusFirst" etc. WARN: don't use import {focusFirst} from "web-ui-pack; because in this case the whole web-ui-pack module traps in compilation of dev-bundle and increases time of compilation

  • animateDropdownAnimate (show/hide) element as dropdown via scale and counter-scale for children
  • animateStackAnimate (show/hide) every element via moving from target to own position
  • dateCompareWithoutTimeCompare by Date-values without Time
  • dateCopyTimeCopy hh:mm:ss.fff part from B to A
  • dateFromStringReturns parsed date from string based on pointed format
  • dateToStringReturns a string representation of a date-time according to pointed format
  • findScrollParentFind first parent with active scroll X/Y
  • findScrollParentAllFind all parents with active scroll X/Y
  • focusFirstSet focus on element or first possible nested element
  • isIntoViewCheck if element is visible in scrollable parents
  • mathSumFloatSum without float-precision-issue
  • mathScaleValueScale value from one range to another
  • nestedProperty.setnestedProperty.set(obj, "value.nestedValue", 1) sets obj.value.nestedValue = 1
  • nestedProperty.getnestedProperty.get(obj, "nested.val2", out?: {hasProp?: boolean} ) returns value from obj.nested.val2
  • objectClonedeep cloning object
  • observerconverts object to observable (via Proxy) to allow listen for changes
  • onEventMore strict (for Typescript) wrapper of addEventListener() that returns callback with removeListener()
  • onFocusGotFires when element/children takes focus once (fires again after onFocusLost on element)
  • onScrollHandles wheel & touch events for custom scrolling
  • onScrollStopReturns callback when scrolling is stopped (via checking scroll position every frame-render)
  • onFocusLostFires when element/children completely lost focus
  • onSpySpy on method-call of object
  • promiseWaitProduce Promise during for "no less than pointed time"; it helps for avoding spinner blinking during the very fast api-request in case: pending > waitResponse > resetPending
  • scrollIntoViewScroll the HTMLElement's parent container such that the element is visible to the user and return promise by animation end
  • class WUPScrolledClass makes pointed element scrollable and implements carousel-scroll behavior (appends new items during the scrolling). Supports swipe/pageUp/pageDown/mouseWheel events.
  • stringLowerCountReturns count of chars in lower case (for any language with ignoring numbers, symbols)
  • stringUpperCountReturns count of chars in upper case (for any language with ignoring numbers, symbols)
  • stringPrettifyChanges camelCase, snakeCase, kebaCase text to user-friendly

Objects

  • localeInfoLocale-object with definitions related to user-locale
  • TimeObjectPlane time object without date

Troubleshooting

Be sure that you familiar with common rules

Library doesn't work in some browsers

web-ui-pack is compiled to ESNext. So some features maybe don't exist in browsers. To resolve it include the lib into babel-loader (for webpack check module.rules...exclude sections

// webpack.config.js
  {
      test: /\.(js|jsx)$/,
      exclude: (() => {
        // these packages must be included to change according to browserslist
        const include = ["web-ui-pack"];
        return (v) => v.includes("node_modules") && !include.some((lib) => v.includes(lib));
      })(),
      use: [ "babel-loader", ],
    },
UI doesn't recognize html tags like <wup-popup /> etc

It's possible if you missed import or it was removed by optimizer of wepback etc. To fix this you need to force import at least once

import { WUPSelectControl, WUPTextControl } from "web-ui-pack";

// this force webpack not ignore imports (if imported used only as html-tags without direct access)
const sideEffect = WUPTextControl && WUPSelectControl;
!sideEffect && console.error("Missed"); // It's required otherwise import is ignored by webpack
// or
WUPTextControl.$defaults.validateDebounceMs = 500;
WUPSelectControl.$defaults.validateDebounceMs = 500;
// etc.

FAQ

see demo/faq

Keywords

FAQs

Package last updated on 10 Oct 2023

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc