• Stars
    star
    1,196
  • Rank 39,117 (Top 0.8 %)
  • Language
    CSS
  • License
    Apache License 2.0
  • Created about 6 years ago
  • Updated about 1 month ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

The standard CSS implementation of the Spectrum design language.

Spectrum CSS

Spectrum CSS provides a standard CSS implementation of the Spectrum design language for internal and 3rd party use on Adobe's platforms.

  1. Show me a demo
  2. Where is the JavaScript?
  3. Using Spectrum CSS
  4. Contributing
  5. Releasing

Show me a demo

Check out the component viewer for a demo of every component included in Spectrum CSS or spin it up locally with: yarn start. This preview is driven by Storybook, a development tool that enables rapid prototyping and test suite integration.

Alternatively, you can preview the documentation site or spin up the site locally with: yarn dev.

Where is the JavaScript?

Spectrum CSS is CSS-only, implementing only the interactivity that can be done with pure CSS. Thus, Spectrum CSS should only be used by implementations of Spectrum, or very simple applications that only need things like typography, checkboxes, text fields, etc.

Adobe maintains separate JavaScript libraries written with web components and React that use Spectrum CSS to create fully interactive Spectrum components.

Using Spectrum CSS

The preferred method of using Spectrum CSS relies on custom properties to swap out variables for different themes and colorstops. This has the lowest bundle size and the simplest usage, but is incompatible with < IE 11.

To use Spectrum CSS with IE 11, see the legacy usage documentation.

Installing components

Each component is released on npm as a separate, individually versioned package inside of the @spectrum-css org.

To get started, install the following components:

yarn install @spectrum-css/vars @spectrum-css/typography @spectrum-css/page @spectrum-css/icon @spectrum-css/button

Installed components will be available in the node_modules/@spectrum-css/ folder.

Using components

Spectrum CSS components have build output that uses CSS custom properties to change themes and scales. Start by including the base set of variables:

<!-- Include global variables first -->
<link
	rel="stylesheet"
	href="node_modules/@spectrum-css/vars/dist/spectrum-global.css"
/>

<!-- Include only the scales your application needs -->
<link
	rel="stylesheet"
	href="node_modules/@spectrum-css/vars/dist/spectrum-medium.css"
/>
<link
	rel="stylesheet"
	href="node_modules/@spectrum-css/vars/dist/spectrum-large.css"
/>

<!-- Include only the colorstops your application needs -->
<link
	rel="stylesheet"
	href="node_modules/@spectrum-css/vars/dist/spectrum-light.css"
/>
<link
	rel="stylesheet"
	href="node_modules/@spectrum-css/vars/dist/spectrum-dark.css"
/>
<link
	rel="stylesheet"
	href="node_modules/@spectrum-css/vars/dist/spectrum-darkest.css"
/>

<!-- Include tokens -->
<link
	rel="stylesheet"
	href="node_modules/@spectrum-css/tokens/dist/index.css"
/>

<!-- Include index-vars.css for all components you need -->
<link
	rel="stylesheet"
	href="node_modules/@spectrum-css/page/dist/index-vars.css"
/>
<link
	rel="stylesheet"
	href="node_modules/@spectrum-css/typography/dist/index-vars.css"
/>
<link
	rel="stylesheet"
	href="node_modules/@spectrum-css/icon/dist/index-vars.css"
/>
<link
	rel="stylesheet"
	href="node_modules/@spectrum-css/button/dist/index-vars.css"
/>

Make sure you've included the relevant classes to choose which scale and colorstop you want:

<html class="spectrum spectrum--medium spectrum--light"></html>

To switch to Express, load vars from @spectrum-css/expressvars instead of @spectrum-css/vars and add the .spectrum--express class to the <html> element:

<html class="spectrum spectrum--medium spectrum--light spectrum--express">
	<head>
		<!-- Include only the scales your application needs -->
		<link
			rel="stylesheet"
			href="node_modules/@spectrum-css/expressvars/dist/spectrum-medium.css"
		/>
		<link
			rel="stylesheet"
			href="node_modules/@spectrum-css/expressvars/dist/spectrum-large.css"
		/>

		<!-- Include only the colorstops your application needs -->
		<link
			rel="stylesheet"
			href="node_modules/@spectrum-css/expressvars/dist/spectrum-light.css"
		/>
		<link
			rel="stylesheet"
			href="node_modules/@spectrum-css/expressvars/dist/spectrum-dark.css"
		/>
	</head>
</html>

Components can then be added by leveraging the code from the documentation.

Because CSS custom properties honor the cascading nature of CSS, you can infinitely nest different colorstops and themes, as illustrated here.

Modifying components

You can override variables and modify Spectrum CSS' look and feel by re-defining the custom properties in context. Look for the Custom Property API section in each component to determine which custom properties you can override. See ActionButton for a complete example.

Importing UI icons

Some components require certain "UI icons" to render. To get these icons, you'll need to use loadicons.

For most use cases, you'll want to use spectrum-css-icons.svg so you have support for both scales:

<script src="node_modules/loadicons/index.js"></script>
<script>
  loadIcons('node_modules/@spectrum-css/icon/dist/spectrum-css-icons.svg');
</script>

Based on which scales you'll be using, you can choose to load different files:

  • @spectrum-css/icon/dist/spectrum-css-icons.svg - Both medium and large icons for responsive UIs that support both .spectrum--medium and .spectrum--large
  • @spectrum-css/icon/dist/spectrum-css-icons-medium.svg - Medium icons only, supports .spectrum--medium only
  • @spectrum-css/icon/dist/spectrum-css-icons-large.svg - Large icons only, supports .spectrum--large only

Note: If you're using spectrum-css-icons.svg, be sure to add .spectrum--medium or .spectrum--large to the <html> element, or you'll see both medium and large icons at once.

Importing workflow icons

If your app has any level of complexity, you'll need "workflow" icons to indicate actions. These icons are not required to render the base components, and instead are used within buttons or menu items for actions like share, play, justify, save, etc.

These icons are released within the @adobe/spectrum-css-workflow-icons package. After installing the package, you can import the entire set of icons in all sizes as follows:

loadIcons(
	"node_modules/@adobe/spectrum-css-workflow-icons/dist/spectrum-icons.svg"
);

You can then use the icons in your app. Visit the Spectrum workflow icon list and click on any icon to get the markup.

Language support

To take advantage of locale specific changes such as placeholders not italicizing Japanese, your application should specify a Content-Language response header or set the lang attribute.

In addition, you must set the dir attribute for components to render correctly.

For English, a left-to-right language:

<html lang="en" dir="ltr"></html>

For Arabic, a right-to-left language:

<html lang="ar" dir="rtl"></html>

Variable fallbacks

Each component has a dist/vars.css file that contains declarations for each component-level variable used by the component. The CSS in dist/index-vars.css references these variables, but has fallbacks for the global variables or hardcoded value that that the component-level variables resolve to.

As such, you do not need to include dist/vars.css unless:

  1. You wish to reference the component-level variables used by a component in external CSS (i.e. --spectrum-divider-medium-height)
  2. You have upgraded @spectrum-css/vars, but have not updated a component (such as @spectrum-css/divider) and do not want to update the component-level variables used by that component

When this file is imported, if in updated version of @spectrum-css/vars changed global variables (such as a global color, --spectrum-global-color-gray-300), you will get those updates. However, if the updated version of @spectrum-css/vars changed component-level variables (such as the height of a medium divider, --spectrum-divider-medium-height), you will not get those updates. As such, this file can be used to lock-in the basic visual style of a component while still allowing for system-level updates.

In most cases, this file will not be required, so you can safely ignore it. If you see unexpected visual changes creeping into components that you have not updated, dist/vars.css may correct them.

Optimizing Spectrum CSS

Spectrum CSS is designed to be as flexible as possible, and as such, leaves room for optimization. Let's assume you've included a few components as dependencies in your package.json:

{
	"name": "my-project",
	"devDependencies": {
		"@spectrum-css/button": "^3.0.0",
		"@spectrum-css/page": "^3.0.0",
		"@spectrum-css/vars": "^3.0.0"
	}
}

You've created an index.css that imports a few components, a scale, and a color-theme:

@import "node_modules/@spectrum-css/vars/dist/spectrum-global.css";
@import "node_modules/@spectrum-css/vars/dist/spectrum-medium.css";
@import "node_modules/@spectrum-css/vars/dist/spectrum-light.css";
@import "node_modules/@spectrum-css/page/dist/index-vars.css";
@import "node_modules/@spectrum-css/button/dist/index-vars.css";

To build an more optimized bundle, you can employ a few simple PostCSS plugins. First, install them:

yarn add -D postcss-import postcss-varfallback postcss-dropunusedvars cssnano

Next, create a postcss.config.js:

module.exports = {
	plugins: [
		require("postcss-import"),
		require("postcss-varfallback"),
		require("postcss-dropunusedvars"),
		require("cssnano"),
	],
};

Finally, include PostCSS in your build process, or run it from the command line:

postcss -o dist/index.min.css index.css

dist/index.min.css file will contain a much slimmer version of Spectrum CSS customized to only include the variables used by the components that you imported. If you've referenced any of variables Spectrum CSS defines in your CSS, they will be perserved as well.

If you need an even smaller bundle, you can employ a tool such as PurifyCSS to strip unused CSS classes from the output.

Customizing Spectrum CSS

You can employ postcss-transformselectors to change the classnames Spectrum CSS uses. For instance, you may want to use bare h1/h2/h3 instead of .spectrum-Heading.spectrum-Heading--size*.

To do this, first install the plugin:

npm i postcss-transformselectors --save-dev

Then, add something like this to your postcss.config.js:

module.exports = {
	plugins: [
		require("postcss-transformselectors")({
			replace: [
				{ search: ".spectrum-Heading--sizeXXL", replace: "h1" },
				{ search: ".spectrum-Heading--sizeXL", replace: "h2" },
				{ search: ".spectrum-Heading--sizeL", replace: "h3" },
			],
			transform: (selector) => {
				if (selector.startsWith(".spectrum-Heading")) {
					// Operate on each selector in a selector list
					return selector
						.split(",")
						.map((selectorPart) => {
							// Create separate selectors for each reference to .spectrum-Heading
							return ["h1", "h2", "h3"]
								.map((h) => {
									return selectorPart.replace(".spectrum-Heading", h);
								})
								.join(",");
						})
						.join(",");
				}

				// Don't mess with things that don't have .spectrum-Heading in them
				return selector;
			},
		}),
	],
};

Contributing

Check out the contributing guidelines for quick start information, and head over to the component documentation for more.

Building

Run the following commands:

yarn install
yarn start

Your dist/ folder should now have a local copy of the Spectrum CSS docs and minimal CSS files, and your browser should be open with the project's preview site. Editing any of the .css or the .stories.js files in components/* will update the project documentation and live reload in your browser.

Important: Ensure you have Node.js > 14 installed or the build system will not run. Node.js > 16.x is preferred.

This project is leveraging caching from Nx to speed up the build process. If you are seeing unexpected results, you can clear the cache by running yarn nx clean or yarn nx run-many --target clean --all.

To spin up the local development environment (Storybook) without first building the components, use: SKIP_BUILD=true yarn start as yarn start alone will start from a clean build.

Documentation site

Local documentation site

Building the project will build and launch the project documentation site in your browser automatically.

See site generation for more information.

Generating and deploying external documentation site

Checkout nextjs branch, pull, and install dependencies.

git checkout nextjs
git pull
yarn install

Update yml data from main

yarn importdata

Run prep script to build the static site locally

yarn prep

Commit changes

git commit -am '<message here>'

Deploy

yarn deploy

Push changes to nextjs branch

git push origin nextjs

CLI

The following tasks are available:

  • yarn build:all - Performs a build of all components, documentation site, and storybook
  • yarn build - Performs a build of all components
  • yarn dev - Performs a component build, runs storybook, and serves the documentation on the default port (3000), then starts watching components and website files
  • yarn clean - Cleans all output files for the project and all components
  • yarn watch - Assuming a build has already been performed, re-starts starts watching components and website files. Presumes a browser is already open to your locally served docs

Releasing

Releasing individual components

Releasing individual components is handled by Lerna. When any component or its dependencies change, Lerna will queue that component (and all of its dependents) up for a release.

To release everything that has changed, simply run:

yarn release

Version numbers are automatically determined, changelogs generated, and packages published.

Releasing the website

After performing a release, run the following command to release the website:

yarn release:docs

Publishing prereleases

Occasionally, it can be helpful for our subscribers to test CSS changes before they're considered ready to be part of a stable release. To facilitate this, we can publish prerelease versions.

To publish prerelease versions:

  • First, be sure that you're working on a branch other than main.
  • Once your change(s) are ready to be committed, be aware of the severity of the change(s), and be sure to author your commit message so that Lerna understands how to increase the version number(s) of the affected components.
  • Once your changes are committed, you must build the affected package(s) locally before publishing them to npm. An npm task for cleaning, building, and beta publishing is available, and it can be run via the following command: yarn release:beta-from-package. This command will perform a full clean (via the clean task), a full build (via the build task), and will attempt to bump the version numbers in the affected package(s) (via lerna publish --conventional-prerelease --preid beta --pre-dist-tag beta --no-private).
  • Depending on the severity of your change(s), and before publishing to npm, Lerna should show a preview of the affected package version numbers that look something like: @spectrum-css/tag: 3.3.8 => 3.3.9-beta.0. Additionally, at this time, Lerna will ask if you would like to continue with publishing the changes or cancel.
  • Selecting y to publish will publish the affected package(s) to npm.

Manual prerelease versioning & publishing

Occasionally, you may want to run a prerelease for an individual package and skip a version bump for consuming packages. It's possible to manually change a package's version number to achieve this.

  • For the package that you want to prerelease, manually alter the version number in the package's package.json file.
    • For example, let's say you'd like to release a beta version of the Switch component. In the Switch's package.json, manually change the version number from its current number ("version": "1.0.23") to the next appropriate semver version number ("version": "2.0.0-beta.0").
  • Save your changes, and commit them with the appropriate conventional commit-style commit message: chore(switch): manual version bump for beta release or something similar.
  • You must run a build before continuing with the prerelease. An npm task for cleaning, building, and beta publishing is available, and it can be run via the following command: yarn release:beta-from-package. This command will perform a full clean (via the clean task), a full build (via the build task), and will attempt to publish the package (via lerna publish --conventional-prerelease --preid beta --pre-dist-tag beta --no-private).
  • Depending on the severity of your change(s), and before publishing to npm, Lerna should show a preview of the affected package version number that looks something like: @spectrum-css/switch: 1.0.23 => 2.0.0-beta.0. Additionally, at this time, Lerna will ask if you would like to continue with publishing the changes or cancel.
  • Selecting y to publish will publish the affected package(s) to npm.

More Repositories

1

brackets

An open source code editor for the web, written in JavaScript, HTML and CSS.
JavaScript
33,258
star
2

react-spectrum

A collection of libraries and tools that help you build adaptive, accessible, and robust user experiences.
TypeScript
12,850
star
3

leonardo

Generate colors based on a desired contrast ratio
JavaScript
1,952
star
4

antialiased-cnns

pip install antialiased-cnns to improve stability and accuracy
Python
1,611
star
5

balance-text

A plugin for implementing balancing of wrapping text in a web page
JavaScript
1,362
star
6

adobe.github.com

Adobe central hub for open source
CSS
1,290
star
7

spectrum-web-components

Spectrum Web Components
TypeScript
1,267
star
8

brackets-shell

CEF3-based application shell for Brackets.
Python
1,176
star
9

aem-core-wcm-components

Standardized components to build websites with AEM.
Java
741
star
10

S3Mock

A simple mock implementation of the AWS S3 API startable as Docker image, TestContainer, JUnit 4 rule, JUnit Jupiter extension or TestNG listener
Java
699
star
11

jsonschema2md

Convert Complex JSON Schemas into Markdown Documentation
JavaScript
594
star
12

NLP-Cube

Natural Language Processing Pipeline - Sentence Splitting, Tokenization, Lemmatization, Part-of-speech Tagging and Dependency Parsing
HTML
551
star
13

aem-project-archetype

Maven template to create best-practice websites on AEM.
JavaScript
544
star
14

ferrum

Features from the rust language in javascript: Provides Traits/Type classes & a hashing infrastructure and an advanced library for working with sequences/iterators in js
JavaScript
496
star
15

cryptr

Cryptr: a GUI for Hashicorp's Vault
HTML
495
star
16

brackets-app

Deprecated CEF1-based app shell for Brackets. Use https://github.com/adobe/brackets-shell instead.
C++
490
star
17

cssfilterlab

CSS FilterLab
JavaScript
348
star
18

hyde

A front-end to Jekyll that parses C++ sources to produce and enforce out-of-line documentation
C++
303
star
19

htl-spec

HTML Template Language Specification
280
star
20

node-smb-server

A 100% JavaScript implementation of the SMB file sharing protocol.
JavaScript
276
star
21

lit-mobx

Mixin and base class for using mobx with lit-element
TypeScript
268
star
22

aem-guides-wknd

Tutorial Code companion for Getting Started Developing with AEM Sites WKND Tutorial
JavaScript
261
star
23

xdm

Experience Data Model
JavaScript
245
star
24

lagrange

A Robust Geometry Processing Library
C++
215
star
25

webkit

Experiments and contributions to WebKit. Tracks git://git.webkit.org/WebKit.git
213
star
26

chromium

Experiments and contributions to Chromium project
C++
207
star
27

elixir-styler

An @elixir-lang code-style enforcer that will just FIFY instead of complaining
Elixir
207
star
28

avmplus

Source code for the Actionscript virtual machine
ActionScript
194
star
29

ops-cli

Ops - cli wrapper for Terraform, Ansible, Helmfile and SSH for cloud automation
Python
186
star
30

rules_gitops

This repository contains rules for continuous, GitOps driven Kubernetes deployments.
Starlark
168
star
31

Deep-Audio-Prior

Audio Source Separation Without Any Training Data.
Python
156
star
32

pdf-embed-api-samples

Samples for Adobe Document Services PDF Embed API
JavaScript
155
star
33

svg-native-viewer

SVG Native viewer is a library that parses and renders SVG Native documents
C++
152
star
34

aem-htl-repl

Read–Eval–Print Loop environment for HTL.
JavaScript
152
star
35

OSAS

One Stop Anomaly Shop: Anomaly detection using two-phase approach: (a) pre-labeling using statistics, Natural Language Processing and static rules; (b) anomaly scoring using supervised and unsupervised machine learning.
Python
150
star
36

stringlifier

Stringlifier is on Opensource ML Library for detecting random strings in raw text. It can be used in sanitising logs, detecting accidentally exposed credentials and as a pre-processing step in unsupervised ML-based analysis of application text data.
Python
148
star
37

Spry

Spry is a JavaScript-based framework that enables the rapid development of Ajax-powered web pages.
HTML
140
star
38

XMP-Toolkit-SDK

The XMP Toolkit allows you to integrate XMP functionality into your product or solution
C++
135
star
39

himl

A hierarchical yaml config in Python
Python
118
star
40

aem-boilerplate

Use this repository template for new AEM projects.
JavaScript
118
star
41

adobe-client-data-layer

An event-driven store for all trackable data of your site.
JavaScript
114
star
42

brackets-phonegap

A brackets extension for PhoneGap development.
JavaScript
112
star
43

aem-component-generator

AEM Component Generator is a java project that enables developers to generate the base structure of an AEM component using a JSON configuration file specifying component and dialog properties and other configuration options.
Java
111
star
44

brackets.io

brackets.io website
HTML
111
star
45

tf-manage

Shell
110
star
46

coral-spectrum

A JavaScript library of Web Components following Spectrum design patterns.
JavaScript
108
star
47

GLS3D

An implementation of OpenGL for Stage3D that can run inside Flash Player 11+
C
105
star
48

aem-core-cif-components

A set of configurations and components to get you started with AEM Commerce development
Java
103
star
49

react-webcomponent

This projects automates the wrapping of a React component in a CustomElement.
JavaScript
95
star
50

ride

REST API Automation framework for functional, integration, fuzzing, and performance testing
Java
93
star
51

alloy

Alloy is the web SDK for the Adobe Experience Platform.
JavaScript
92
star
52

spectrum-tokens

Tokens used by Spectrum, Adobe's design system.
JavaScript
90
star
53

web-platform

JavaScript
90
star
54

asset-share-commons

A modern, open-source asset share reference implementation built on Adobe Experience Manager (AEM)
Java
88
star
55

experience-platform-postman-samples

83
star
56

go-starter

Bootstrap a new project from a template.
Go
83
star
57

orc

ORC is a tool for finding violations of C++'s One Definition Rule on the OSX toolchain.
C++
79
star
58

pdfservices-node-sdk-samples

Samples for the Adobe Document Services PDF Tools Node SDK
HTML
77
star
59

sbmc

Sample-based Monte Carlo Denoising using a Kernel-Splatting Network [Siggraph 2019]
Python
76
star
60

git-server

A GitHub Protocol & API emulation
JavaScript
75
star
61

aio-theme

The Adobe I/O theme for building markdown powered sites
JavaScript
72
star
62

aem-guides-wknd-spa

71
star
63

aem-sample-we-retail-journal

We.Retail Journal is a sample showcasing SPA Editing capabilities in AEM using React and Angular
CSS
70
star
64

frontend-regression-validator

Visual regression tool used to compare baseline and updated instances of a website in a deployment pipeline.
Python
67
star
65

blackhole

An HTTP sink (for testing) with optional recording and playback ability
Go
65
star
66

react-spectrum-charts

Build compelling visualizations using declarative react components.
TypeScript
61
star
67

aem-spa-project-archetype

Maven Archetype for creating new AEM SPA projects
CSS
61
star
68

aio-cli

Adobe I/O Extensible CLI
JavaScript
60
star
69

aem-react-editable-components

SPA React Editable Components for Adobe Experience Manager
TypeScript
60
star
70

aem-upload

Makes uploading to AEM easier, and can be used as a command line executable or required as a Node.js module.
JavaScript
60
star
71

dds2atf

Tool for converting DDS files into ATF files suitable for use with the Flash Stage3D API
C++
58
star
72

redux-saga-promise

Create actions that return promises, which are resolved/rejected by a redux saga
JavaScript
58
star
73

aem-modernize-tools

A suite of tools to modernize your AEM Sites implementations off legacy features.
Java
58
star
74

adobe-photoshop-api-sdk

Adobe Photoshop API SDK
JavaScript
57
star
75

helix-home

The home of Project Helix
HTML
54
star
76

xmp-docs

XMP documentation
52
star
77

aem-testing-clients

Testing tools for Adobe Experience Manager
Java
51
star
78

aem-brackets-extension

Brackets extension for Adobe Experience Manager (AEM) front-end developers with auto-sync and HTL support.
JavaScript
51
star
79

aem-enablement

Content required for AEM Enablement
Java
50
star
80

brackets-edge-web-fonts

Edge Web Fonts extension for Brackets. Simply unzip and drop into your Brackets extension folder to browse and include Edge Web Fonts.
JavaScript
50
star
81

helix-cli

Command-line tools for developing with AEM
JavaScript
49
star
82

aem-guides-wknd-graphql

JavaScript
49
star
83

brackets-registry

A registry system for hosting Brackets extensions powered by node.js
JavaScript
46
star
84

htlengine

An HTL (Sightly) Interpreter/Compiler for Node.js
HTML
45
star
85

aem-dispatcher-experiments

Experiments to demonstrate the impact of the Dispatcher and it's configuration parameters.
HTML
44
star
86

pdfservices-python-sdk-samples

Adobe PDFServices python SDK Samples
Python
44
star
87

commerce-cif-connector

AEM Commerce connector for Magento and GraphQL
Java
43
star
88

node-fetch-retry

Node Module for performing retries using node-fetch
JavaScript
42
star
89

aem-react-core-wcm-components

41
star
90

behavior_tree_editor

A visual editor for building behavior trees for the bots
JavaScript
41
star
91

libLOL

Python
40
star
92

starter-repo

Documentation templates for use in open source and open development projects
40
star
93

commerce-cif-magento

Adobe Commerce Integration Framework (CIF) Magento Integration
JavaScript
40
star
94

aem-cif-guides-venia

AEM CIF Venia Project
JavaScript
39
star
95

bin2c

Convert to/Embed binary files in C source files, quickly and efficiently.
C
38
star
96

aem-site-template-standard

Basic site template for AEM that allows non-Java experts to create new sites by customizing CSS and JS only.
SCSS
37
star
97

aio-cli-plugin-cloudmanager

Cloud Manager plugin for the Adobe I/O CLI
JavaScript
37
star
98

graphicalweb-keynote

Keynote for Graphical Web Conference
JavaScript
37
star
99

oss-contributors

How do tech companies rank amongst themselves when it comes to github.com activity?
JavaScript
35
star
100

aem-spa-page-model-manager

Interface between Adobe Experience Manager and Single Page Application framework.
TypeScript
35
star