19 Commits

Author SHA1 Message Date
fb5471c177 feat: clean up apps and add publish
All checks were successful
Release / build_test (pull_request) Successful in 51s
2025-11-30 20:15:41 +01:00
134dc79f3c Implement better pipeline (#3)
Reviewed-on: #3
2025-11-30 14:02:21 +01:00
3f4d611a18 Merge pull request 'feature/remove-fleet' (#2) from feature/remove-fleet into main
Reviewed-on: #2
2025-11-29 23:29:17 +01:00
5ddd6501b6 feat: add release workflow for pull requests
Some checks failed
Release / build_test (pull_request) Failing after 39s
2025-11-29 23:28:56 +01:00
268e0a767c remove onedev 2025-11-29 22:56:42 +01:00
44b51ca055 Edit .onedev-buildspec.yml 2025-11-28 20:54:43 +01:00
8863ffd1f7 feat: add initial build specification for publishing 2025-11-28 20:52:29 +01:00
0a179ec3dc Delete .onedev-buildspec.yml 2025-11-28 20:44:59 +01:00
16965d779f Edit .onedev-buildspec.yml 2025-11-28 20:39:47 +01:00
141c2a0a16 chore: update build job steps in build specification 2025-11-28 20:38:49 +01:00
9815ade65a fix: add build job to the build specification 2025-11-28 20:37:23 +01:00
ec7f0c2f4f Merge branch 'feature/remove-fleet' of https://onedev.hijlkema.codes/z-elements into feature/remove-fleet 2025-11-28 20:28:14 +01:00
301f32b39c chore: remove staging deployment script from build specification 2025-11-28 20:27:10 +01:00
249c00e90c Edit .onedev-buildspec.yml 2025-11-28 20:25:08 +01:00
21238c5d41 Edit .onedev-buildspec.yml 2025-11-28 20:24:58 +01:00
c709ce9e8d chore: add deployment script for staging environment 2025-11-28 20:23:25 +01:00
f3c8d121ae chore: add initial build specification file 2025-11-28 20:17:40 +01:00
ce0e1742d2 chore: update dependencies and devDependencies in package.json
- Updated lit to version 3.3.1
- Upgraded react and react-dom to version 19.2.0
- Updated tslib to version 2.8.1
- Upgraded zod to version 4.1.13
- Updated @babel/plugin-proposal-decorators to version 7.28.0
- Upgraded @playwright/test to version 1.57.0
- Updated @storybook/test-runner to version 0.24.2
- Updated @swc-node/register to version 1.11.1
- Updated @swc/core to version 1.15.3
- Updated @swc/helpers to version 0.5.17
- Upgraded @trivago/prettier-plugin-sort-imports to version 6.0.0
- Updated @types/node to version 24.10.1
- Upgraded @typescript-eslint/eslint-plugin and parser to version 8.48.0
- Updated @vitest/ui to version 4.0.14
- Upgraded eslint to version 9.39.1
- Updated eslint-config-prettier to version 10.1.8
- Upgraded eslint-plugin-playwright to version 2.3.0
- Updated jest and related packages to version 30.2.0
- Updated jiti to version 2.6.1
- Updated jsdom to version 27.2.0
- Updated prettier to version 3.7.1
- Updated rxjs to version 7.8.2
- Upgraded storybook to version 10.1.2
- Updated verdaccio to version 6.2.3
- Updated vite to version 7.2.4
- Updated vitest to version 4.0.14
2025-11-28 20:02:46 +01:00
62d24417d4 update dependencies 2025-11-28 19:49:30 +01:00
41 changed files with 20721 additions and 16224 deletions

View File

@@ -0,0 +1,134 @@
name: Publish
concurrency:
cancel-in-progress: false
group: publish-${{ github.ref_name }}
env:
ACT_OWNER: ${{ github.repository_owner }}
ACT_REPOSITORY: ${{ github.repository }}
CGO_ENABLED: 0
# Default comma-separated list of projects to build+publish. Can be overridden
# when manually dispatching the workflow via the `projects` input.
PUBLISH_PROJECTS: 'reviews-stars'
on:
push:
tags:
- 'v*.*.*'
workflow_dispatch:
inputs:
projects:
description: 'Comma-separated list of Nx projects to build and publish'
required: false
default: 'reviews-stars'
version:
description: 'Semantic version to publish (e.g. 1.2.3). If omitted for tag runs, the tag name is used.'
required: false
npm_tag:
description: 'NPM dist-tag to use (overrides automatic selection). default: auto (latest for release, next for prerelease)'
required: false
jobs:
build:
runs-on: ubuntu-latest
outputs:
projects: ${{ steps.set-projects.outputs.projects }}
env:
PUBLISH_PROJECTS: ${{ github.event.inputs.projects || env.PUBLISH_PROJECTS }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- run: git fetch --force --tags
- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: 22
- name: Install dependencies
run: npm ci --legacy-peer-deps
- name: Build projects
run: |
echo "Projects to build: $PUBLISH_PROJECTS"
npx nx run-many --target=build --projects="$PUBLISH_PROJECTS"
- name: Upload dist artifact
uses: actions/upload-artifact@v4
with:
name: dist
path: dist
- name: Set projects output (JSON array)
id: set-projects
run: |
# Convert comma-separated list into JSON array
IFS=',' read -ra PROJS <<< "$PUBLISH_PROJECTS"
json='['
first=true
for p in "${PROJS[@]}"; do
p_trimmed=$(echo "$p" | xargs)
if [ "$first" = true ]; then
json+="\"$p_trimmed\""
first=false
else
json+=",\"$p_trimmed\""
fi
done
json+=']'
echo "projects=$json" >> "$GITHUB_OUTPUT"
publish:
runs-on: ubuntu-latest
needs: build
strategy:
fail-fast: false
matrix:
project: ${{ fromJson(needs.build.outputs.projects) }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Download dist artifact
uses: actions/download-artifact@v4
with:
name: dist
path: ./
- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: 22
- name: Determine version and npm tag
id: set-version
run: |
set -euo pipefail
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
if [ -n "${{ github.event.inputs.version }}" ]; then
VERSION="${{ github.event.inputs.version }}"
else
echo "No version provided for manual dispatch. Exiting." >&2
exit 1
fi
else
VERSION="${GITHUB_REF_NAME#v}"
fi
if [ -n "${{ github.event.inputs.npm_tag }}" ]; then
NPM_TAG="${{ github.event.inputs.npm_tag }}"
else
if echo "$VERSION" | grep -q "-"; then
NPM_TAG="next"
else
NPM_TAG="latest"
fi
fi
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "npm_tag=$NPM_TAG" >> "$GITHUB_OUTPUT"
- name: Configure npm auth
run: |
echo "//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}" > ~/.npmrc
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Publish project
run: |
echo "Publishing ${{ matrix.project }} with version ${VERSION} and tag ${NPM_TAG}"
node tools/scripts/publish.mjs "${{ matrix.project }}" "${VERSION}" "${NPM_TAG}"
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@@ -0,0 +1,37 @@
name: Release
concurrency:
cancel-in-progress: true
group: test-pr-${{ github.event.pull_request.number }}
env:
ACT_OWNER: ${{ github.repository_owner }}
ACT_REPOSITORY: ${{ github.repository }}
CGO_ENABLED: 0
on:
pull_request:
types:
- opened
- synchronize
- reopened
- edited
jobs:
build_test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- run: git fetch --force --tags
- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: 22
- name: Install dependencies
run: npm ci --legacy-peer-deps
- name: Build libraries
run: npx nx run-many -t build --projects="reviews-stars"
- name: Run tests
run: npx nx run-many -t test --code-coverage --passWithNoTests --projects="reviews-stars"

4
.gitignore vendored
View File

@@ -41,3 +41,7 @@ Thumbs.db
.nx/cache .nx/cache
.nx/workspace-data .nx/workspace-data
vite.config.*.timestamp*
.cursor/rules/nx-rules.mdc
.github/instructions/nx.instructions.md
act_runner*

View File

@@ -0,0 +1,175 @@
# Instructions for LLM: Transform Storybook Config Files from CommonJS to ESM
## Task Overview
Find all .storybook/main.ts and .storybook/main.js files in the workspace and transform
any CommonJS (CJS) configurations to ES Modules (ESM).
### Step 1: Find All Storybook Config Files
Use glob patterns to locate all Storybook main configuration files:
**/.storybook/main.js
**/.storybook/main.ts
### Step 2: Identify CommonJS vs ESM
For each file found, read its contents and determine if it uses CommonJS syntax by
checking for:
CommonJS indicators:
- `module.exports =` or `module.exports.`
- `exports.`
- `require()` function calls
ESM indicators (already correct):
- export default
- export const/export function
- import statements
### Step 3: Transform CJS to ESM
For each file identified as CommonJS, perform the following transformations:
A. Convert `module.exports`
// FROM (CJS):
```
module.exports = {
stories: ['../src/**/*.stories.@(js|jsx|ts|tsx|mdx)'],
addons: ['@storybook/addon-essentials']
};
```
// TO (ESM):
```
export default {
stories: ['../src/**/*.stories.@(js|jsx|ts|tsx|mdx)'],
addons: ['@storybook/addon-essentials']
};
```
B. Convert `require()` to import
// FROM (CJS):
```
const { nxViteTsPaths } = require('@nx/vite/plugins/nx-tsconfig-paths.plugin');
const { mergeConfig } = require('vite');
```
// TO (ESM):
```
import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
import { mergeConfig } from 'vite';
```
C. Handle `path.join()` patterns
// FROM (CJS):
```
const path = require('path');
const rootMain = require(path.join(__dirname, '../../.storybook/main'));
```
// TO (ESM):
```
import { join } from 'path';
import rootMain from '../../.storybook/main';
```
D. Handle Dynamic Requires in Config Functions
// FROM (CJS):
```
module.exports = {
viteFinal: async (config) => {
const { mergeConfig } = require('vite');
return mergeConfig(config, {});
}
};
```
// TO (ESM):
```
import { mergeConfig } from 'vite';
export default {
viteFinal: async (config) => {
return mergeConfig(config, {});
}
};
```
### Step 4: Validation Checks
After transformation, verify:
1. All require() calls have been converted to import statements at the top of the file
2. All module.exports have been converted to export default or named exports
3. Imports are at the top of the file (before the export)
4. The file maintains proper TypeScript typing if it's a .ts file
### Step 5: Report Results
Provide a summary of:
- Total files found
- Files that were already ESM (no changes needed)
- Files that were transformed from CJS to ESM
- List the specific files that were modified
### Example Complete Transformation
Before (CJS):
```
const path = require('path');
const { mergeConfig } = require('vite');
module.exports = {
stories: ['../src/**/*.stories.@(js|jsx|ts|tsx|mdx)'],
addons: ['@storybook/addon-essentials'],
viteFinal: async (config) => {
return mergeConfig(config, {
resolve: {
alias: {}
}
});
}
};
```
After (ESM):
```
import { join } from 'path';
import { mergeConfig } from 'vite';
export default {
stories: ['../src/**/*.stories.@(js|jsx|ts|tsx|mdx)'],
addons: ['@storybook/addon-essentials'],
viteFinal: async (config) => {
return mergeConfig(config, {
resolve: {
alias: {}
}
});
}
};
```
## Important Notes
- Preserve all comments in the original files
- Maintain the same indentation and formatting style
- For TypeScript files (.ts), ensure type imports use import type when appropriate
- Test that the transformations don't break the Storybook configuration

View File

View File

@@ -1,22 +0,0 @@
{
"extends": ["plugin:playwright/recommended", "../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
},
{
"files": ["*.js", "*.jsx"],
"rules": {}
},
{
"files": ["src/**/*.{ts,js,tsx,jsx}"],
"rules": {}
}
]
}

View File

@@ -1,68 +0,0 @@
import { workspaceRoot } from '@nx/devkit';
import { nxE2EPreset } from '@nx/playwright/preset';
import { defineConfig, devices } from '@playwright/test';
// For CI, you may want to set BASE_URL to the deployed application.
const baseURL = process.env['BASE_URL'] || 'http://localhost:4200';
/**
* Read environment variables from file.
* https://github.com/motdotla/dotenv
*/
// require('dotenv').config();
/**
* See https://playwright.dev/docs/test-configuration.
*/
export default defineConfig({
...nxE2EPreset(__filename, { testDir: './src' }),
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
use: {
baseURL,
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
trace: 'on-first-retry',
},
/* Run your local dev server before starting the tests */
webServer: {
command: 'npx nx serve showcase',
url: 'http://localhost:4200',
reuseExistingServer: !process.env.CI,
cwd: workspaceRoot,
},
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
{
name: 'firefox',
use: { ...devices['Desktop Firefox'] },
},
{
name: 'webkit',
use: { ...devices['Desktop Safari'] },
},
// Uncomment for mobile browsers support
/* {
name: 'Mobile Chrome',
use: { ...devices['Pixel 5'] },
},
{
name: 'Mobile Safari',
use: { ...devices['iPhone 12'] },
}, */
// Uncomment for branded browsers
/* {
name: 'Microsoft Edge',
use: { ...devices['Desktop Edge'], channel: 'msedge' },
},
{
name: 'Google Chrome',
use: { ...devices['Desktop Chrome'], channel: 'chrome' },
} */
],
});

View File

@@ -1,20 +0,0 @@
{
"name": "showcase-e2e",
"$schema": "../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "apps/showcase-e2e/src",
"projectType": "application",
"tags": [],
"implicitDependencies": ["showcase"],
"targets": {
"e2e": {
"executor": "@nx/playwright:playwright",
"outputs": ["{workspaceRoot}/dist/.playwright/apps/showcase-e2e"],
"options": {
"config": "apps/showcase-e2e/playwright.config.ts"
}
},
"lint": {
"executor": "@nx/eslint:lint"
}
}
}

View File

@@ -1,8 +0,0 @@
import { test, expect } from '@playwright/test';
test('has title', async ({ page }) => {
await page.goto('/');
// Expect h1 to contain a substring.
expect(await page.locator('h1').innerText()).toContain('Welcome');
});

View File

@@ -1,19 +0,0 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"allowJs": true,
"outDir": "../../dist/out-tsc",
"module": "commonjs",
"sourceMap": false
},
"include": [
"**/*.ts",
"**/*.js",
"playwright.config.ts",
"src/**/*.spec.ts",
"src/**/*.spec.js",
"src/**/*.test.ts",
"src/**/*.test.js",
"src/**/*.d.ts"
]
}

View File

@@ -1,3 +0,0 @@
{
"presets": ["@nx/js/babel"]
}

View File

@@ -1,18 +0,0 @@
{
"extends": ["../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
},
{
"files": ["*.js", "*.jsx"],
"rules": {}
}
]
}

View File

@@ -1,8 +0,0 @@
{
"jsc": {
"parser": {
"syntax": "typescript"
},
"target": "es2016"
}
}

View File

@@ -1,16 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Showcase</title>
<base href="/" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="stylesheet" href="/src/styles.css" />
</head>
<body>
<z-elements-root></z-elements-root>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

View File

@@ -1,11 +0,0 @@
/* eslint-disable */
export default {
displayName: 'showcase',
preset: '../../jest.preset.js',
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
transform: {
'^.+\\.[tj]s$': '@swc/jest',
},
moduleFileExtensions: ['ts', 'js', 'html'],
coverageDirectory: '../../coverage/apps/showcase',
};

View File

@@ -1,67 +0,0 @@
{
"name": "showcase",
"$schema": "../../node_modules/nx/schemas/project-schema.json",
"projectType": "application",
"sourceRoot": "apps/showcase/src",
"tags": [],
"targets": {
"build": {
"executor": "@nx/vite:build",
"outputs": ["{options.outputPath}"],
"defaultConfiguration": "production",
"options": {
"outputPath": "dist/apps/showcase"
},
"configurations": {
"development": {
"mode": "development"
},
"production": {
"mode": "production"
}
}
},
"serve": {
"executor": "@nx/vite:dev-server",
"defaultConfiguration": "development",
"options": {
"buildTarget": "showcase:build"
},
"configurations": {
"development": {
"buildTarget": "showcase:build:development",
"hmr": true
},
"production": {
"buildTarget": "showcase:build:production",
"hmr": false
}
}
},
"preview": {
"executor": "@nx/vite:preview-server",
"defaultConfiguration": "development",
"options": {
"buildTarget": "showcase:build"
},
"configurations": {
"development": {
"buildTarget": "showcase:build:development"
},
"production": {
"buildTarget": "showcase:build:production"
}
}
},
"lint": {
"executor": "@nx/eslint:lint"
},
"test": {
"executor": "@nx/jest:jest",
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
"options": {
"jestConfig": "apps/showcase/jest.config.ts"
}
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -1,499 +0,0 @@
/*
* Remove template code below
*/
html {
-webkit-text-size-adjust: 100%;
font-family:
ui-sans-serif,
system-ui,
-apple-system,
BlinkMacSystemFont,
'Segoe UI',
Roboto,
'Helvetica Neue',
Arial,
'Noto Sans',
sans-serif,
'Apple Color Emoji',
'Segoe UI Emoji',
'Segoe UI Symbol',
'Noto Color Emoji';
line-height: 1.5;
tab-size: 4;
scroll-behavior: smooth;
}
body {
font-family: inherit;
line-height: inherit;
margin: 0;
}
h1,
h2,
p,
pre {
margin: 0;
}
*,
::before,
::after {
box-sizing: border-box;
border-width: 0;
border-style: solid;
border-color: currentColor;
}
h1,
h2 {
font-size: inherit;
font-weight: inherit;
}
a {
color: inherit;
text-decoration: inherit;
}
pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
}
svg {
display: block;
vertical-align: middle;
}
svg {
shape-rendering: auto;
text-rendering: optimizeLegibility;
}
pre {
background-color: rgba(55, 65, 81, 1);
border-radius: 0.25rem;
color: rgba(229, 231, 235, 1);
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
overflow: scroll;
padding: 0.5rem 0.75rem;
}
.shadow {
box-shadow:
0 0 #0000,
0 0 #0000,
0 10px 15px -3px rgba(0, 0, 0, 0.1),
0 4px 6px -2px rgba(0, 0, 0, 0.05);
}
.rounded {
border-radius: 1.5rem;
}
.wrapper {
width: 100%;
}
.container {
margin-left: auto;
margin-right: auto;
max-width: 768px;
padding-bottom: 3rem;
padding-left: 1rem;
padding-right: 1rem;
color: rgba(55, 65, 81, 1);
width: 100%;
}
#welcome {
margin-top: 2.5rem;
}
#welcome h1 {
font-size: 3rem;
font-weight: 500;
letter-spacing: -0.025em;
line-height: 1;
}
#welcome span {
display: block;
font-size: 1.875rem;
font-weight: 300;
line-height: 2.25rem;
margin-bottom: 0.5rem;
}
#hero {
align-items: center;
background-color: hsla(214, 62%, 21%, 1);
border: none;
box-sizing: border-box;
color: rgba(55, 65, 81, 1);
display: grid;
grid-template-columns: 1fr;
margin-top: 3.5rem;
}
#hero .text-container {
color: rgba(255, 255, 255, 1);
padding: 3rem 2rem;
}
#hero .text-container h2 {
font-size: 1.5rem;
line-height: 2rem;
position: relative;
}
#hero .text-container h2 svg {
color: hsla(162, 47%, 50%, 1);
height: 2rem;
left: -0.25rem;
position: absolute;
top: 0;
width: 2rem;
}
#hero .text-container h2 span {
margin-left: 2.5rem;
}
#hero .text-container a {
background-color: rgba(255, 255, 255, 1);
border-radius: 0.75rem;
color: rgba(55, 65, 81, 1);
display: inline-block;
margin-top: 1.5rem;
padding: 1rem 2rem;
text-decoration: inherit;
}
#hero .logo-container {
display: none;
justify-content: center;
padding-left: 2rem;
padding-right: 2rem;
}
#hero .logo-container svg {
color: rgba(255, 255, 255, 1);
width: 66.666667%;
}
#middle-content {
align-items: flex-start;
display: grid;
gap: 4rem;
grid-template-columns: 1fr;
margin-top: 3.5rem;
}
#learning-materials {
padding: 2.5rem 2rem;
}
#learning-materials h2 {
font-weight: 500;
font-size: 1.25rem;
letter-spacing: -0.025em;
line-height: 1.75rem;
padding-left: 1rem;
padding-right: 1rem;
}
.list-item-link {
align-items: center;
border-radius: 0.75rem;
display: flex;
margin-top: 1rem;
padding: 1rem;
transition-property:
background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
width: 100%;
}
.list-item-link svg:first-child {
margin-right: 1rem;
height: 1.5rem;
transition-property:
background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
width: 1.5rem;
}
.list-item-link > span {
flex-grow: 1;
font-weight: 400;
transition-property:
background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
.list-item-link > span > span {
color: rgba(107, 114, 128, 1);
display: block;
flex-grow: 1;
font-size: 0.75rem;
font-weight: 300;
line-height: 1rem;
transition-property:
background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
.list-item-link svg:last-child {
height: 1rem;
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
width: 1rem;
}
.list-item-link:hover {
color: rgba(255, 255, 255, 1);
background-color: hsla(162, 47%, 50%, 1);
}
.list-item-link:hover > span {
}
.list-item-link:hover > span > span {
color: rgba(243, 244, 246, 1);
}
.list-item-link:hover svg:last-child {
transform: translateX(0.25rem);
}
#other-links {
}
.button-pill {
padding: 1.5rem 2rem;
transition-duration: 300ms;
transition-property:
background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
align-items: center;
display: flex;
}
.button-pill svg {
transition-property:
background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
flex-shrink: 0;
width: 3rem;
}
.button-pill > span {
letter-spacing: -0.025em;
font-weight: 400;
font-size: 1.125rem;
line-height: 1.75rem;
padding-left: 1rem;
padding-right: 1rem;
}
.button-pill span span {
display: block;
font-size: 0.875rem;
font-weight: 300;
line-height: 1.25rem;
}
.button-pill:hover svg,
.button-pill:hover {
color: rgba(255, 255, 255, 1) !important;
}
#nx-console:hover {
background-color: rgba(0, 122, 204, 1);
}
#nx-console svg {
color: rgba(0, 122, 204, 1);
}
#nx-console-jetbrains {
margin-top: 2rem;
}
#nx-console-jetbrains:hover {
background-color: rgba(255, 49, 140, 1);
}
#nx-console-jetbrains svg {
color: rgba(255, 49, 140, 1);
}
#nx-repo:hover {
background-color: rgba(24, 23, 23, 1);
}
#nx-repo svg {
color: rgba(24, 23, 23, 1);
}
#nx-cloud {
margin-bottom: 2rem;
margin-top: 2rem;
padding: 2.5rem 2rem;
}
#nx-cloud > div {
align-items: center;
display: flex;
}
#nx-cloud > div svg {
border-radius: 0.375rem;
flex-shrink: 0;
width: 3rem;
}
#nx-cloud > div h2 {
font-size: 1.125rem;
font-weight: 400;
letter-spacing: -0.025em;
line-height: 1.75rem;
padding-left: 1rem;
padding-right: 1rem;
}
#nx-cloud > div h2 span {
display: block;
font-size: 0.875rem;
font-weight: 300;
line-height: 1.25rem;
}
#nx-cloud p {
font-size: 1rem;
line-height: 1.5rem;
margin-top: 1rem;
}
#nx-cloud pre {
margin-top: 1rem;
}
#nx-cloud a {
color: rgba(107, 114, 128, 1);
display: block;
font-size: 0.875rem;
line-height: 1.25rem;
margin-top: 1.5rem;
text-align: right;
}
#nx-cloud a:hover {
text-decoration: underline;
}
#commands {
padding: 2.5rem 2rem;
margin-top: 3.5rem;
}
#commands h2 {
font-size: 1.25rem;
font-weight: 400;
letter-spacing: -0.025em;
line-height: 1.75rem;
padding-left: 1rem;
padding-right: 1rem;
}
#commands p {
font-size: 1rem;
font-weight: 300;
line-height: 1.5rem;
margin-top: 1rem;
padding-left: 1rem;
padding-right: 1rem;
}
details {
align-items: center;
display: flex;
margin-top: 1rem;
padding-left: 1rem;
padding-right: 1rem;
width: 100%;
}
details pre > span {
color: rgba(181, 181, 181, 1);
}
summary {
border-radius: 0.5rem;
display: flex;
font-weight: 400;
padding: 0.5rem;
cursor: pointer;
transition-property:
background-color,
border-color,
color,
fill,
stroke,
opacity,
box-shadow,
transform,
filter,
backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
summary:hover {
background-color: rgba(243, 244, 246, 1);
}
summary svg {
height: 1.5rem;
margin-right: 1rem;
width: 1.5rem;
}
#love {
color: rgba(107, 114, 128, 1);
font-size: 0.875rem;
line-height: 1.25rem;
margin-top: 3.5rem;
opacity: 0.6;
text-align: center;
}
#love svg {
color: rgba(252, 165, 165, 1);
width: 1.25rem;
height: 1.25rem;
display: inline;
margin-top: -0.25rem;
}
@media screen and (min-width: 768px) {
#hero {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
#hero .logo-container {
display: flex;
}
#middle-content {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}

View File

@@ -1,19 +0,0 @@
import { AppElement } from './app.element';
describe('AppElement', () => {
let app: AppElement;
beforeEach(() => {
app = new AppElement();
});
it('should create successfully', () => {
expect(app).toBeTruthy();
});
it('should have a greeting', () => {
app.connectedCallback();
expect(app.querySelector('h1').innerHTML).toContain('Welcome showcase');
});
});

View File

@@ -1,407 +0,0 @@
import './app.element.css';
export class AppElement extends HTMLElement {
public static observedAttributes = [];
connectedCallback() {
const title = 'showcase';
this.innerHTML = `
<div class="wrapper">
<div class="container">
<!-- WELCOME -->
<div id="welcome">
<h1>
<span> Hello there, </span>
Welcome ${title} 👋
</h1>
</div>
<!-- HERO -->
<div id="hero" class="rounded">
<div class="text-container">
<h2>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z"
/>
</svg>
<span>You&apos;re up and running</span>
</h2>
<a href="#commands"> What&apos;s next? </a>
</div>
<div class="logo-container">
<svg
fill="currentColor"
role="img"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M11.987 14.138l-3.132 4.923-5.193-8.427-.012 8.822H0V4.544h3.691l5.247 8.833.005-3.998 3.044 4.759zm.601-5.761c.024-.048 0-3.784.008-3.833h-3.65c.002.059-.005 3.776-.003 3.833h3.645zm5.634 4.134a2.061 2.061 0 0 0-1.969 1.336 1.963 1.963 0 0 1 2.343-.739c.396.161.917.422 1.33.283a2.1 2.1 0 0 0-1.704-.88zm3.39 1.061c-.375-.13-.8-.277-1.109-.681-.06-.08-.116-.17-.176-.265a2.143 2.143 0 0 0-.533-.642c-.294-.216-.68-.322-1.18-.322a2.482 2.482 0 0 0-2.294 1.536 2.325 2.325 0 0 1 4.002.388.75.75 0 0 0 .836.334c.493-.105.46.36 1.203.518v-.133c-.003-.446-.246-.55-.75-.733zm2.024 1.266a.723.723 0 0 0 .347-.638c-.01-2.957-2.41-5.487-5.37-5.487a5.364 5.364 0 0 0-4.487 2.418c-.01-.026-1.522-2.39-1.538-2.418H8.943l3.463 5.423-3.379 5.32h3.54l1.54-2.366 1.568 2.366h3.541l-3.21-5.052a.7.7 0 0 1-.084-.32 2.69 2.69 0 0 1 2.69-2.691h.001c1.488 0 1.736.89 2.057 1.308.634.826 1.9.464 1.9 1.541a.707.707 0 0 0 1.066.596zm.35.133c-.173.372-.56.338-.755.639-.176.271.114.412.114.412s.337.156.538-.311c.104-.231.14-.488.103-.74z"
/>
</svg>
</div>
</div>
<!-- MIDDLE CONTENT -->
<div id="middle-content">
<div id="learning-materials" class="rounded shadow">
<h2>Learning materials</h2>
<a href="https://nx.dev/getting-started/intro?utm_source=nx-project" target="_blank" rel="noreferrer" class="list-item-link">
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"
/>
</svg>
<span>
Documentation
<span> Everything is in there </span>
</span>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M9 5l7 7-7 7"
/>
</svg>
</a>
<a href="https://nx.dev/blog/?utm_source=nx-project" target="_blank" rel="noreferrer" class="list-item-link">
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M19 20H5a2 2 0 01-2-2V6a2 2 0 012-2h10a2 2 0 012 2v1m2 13a2 2 0 01-2-2V7m2 13a2 2 0 002-2V9a2 2 0 00-2-2h-2m-4-3H9M7 16h6M7 8h6v4H7V8z"
/>
</svg>
<span>
Blog
<span> Changelog, features & events </span>
</span>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M9 5l7 7-7 7"
/>
</svg>
</a>
<a href="https://www.youtube.com/@NxDevtools/videos?utm_source=nx-project&sub_confirmation=1" target="_blank" rel="noreferrer" class="list-item-link">
<svg
role="img"
viewBox="0 0 24 24"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
>
<title>YouTube</title>
<path
d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z"
/>
</svg>
<span>
YouTube channel
<span> Nx Show, talks & tutorials </span>
</span>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M9 5l7 7-7 7"
/>
</svg>
</a>
<a href="https://nx.dev/react-tutorial/1-code-generation?utm_source=nx-project" target="_blank" rel="noreferrer" class="list-item-link">
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5M7.188 2.239l.777 2.897M5.136 7.965l-2.898-.777M13.95 4.05l-2.122 2.122m-5.657 5.656l-2.12 2.122"
/>
</svg>
<span>
Interactive tutorials
<span> Create an app, step-by-step </span>
</span>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M9 5l7 7-7 7"
/>
</svg>
</a>
<a href="https://nxplaybook.com/?utm_source=nx-project" target="_blank" rel="noreferrer" class="list-item-link">
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path d="M12 14l9-5-9-5-9 5 9 5z" />
<path
d="M12 14l6.16-3.422a12.083 12.083 0 01.665 6.479A11.952 11.952 0 0012 20.055a11.952 11.952 0 00-6.824-2.998 12.078 12.078 0 01.665-6.479L12 14z"
/>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M12 14l9-5-9-5-9 5 9 5zm0 0l6.16-3.422a12.083 12.083 0 01.665 6.479A11.952 11.952 0 0012 20.055a11.952 11.952 0 00-6.824-2.998 12.078 12.078 0 01.665-6.479L12 14zm-4 6v-7.5l4-2.222"
/>
</svg>
<span>
Video courses
<span> Nx custom courses </span>
</span>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M9 5l7 7-7 7"
/>
</svg>
</a>
</div>
<div id="other-links">
<a id="nx-console" class="button-pill rounded shadow" href="https://marketplace.visualstudio.com/items?itemName=nrwl.angular-console&utm_source=nx-project" target="_blank" rel="noreferrer">
<svg
fill="currentColor"
role="img"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<title>Visual Studio Code</title>
<path
d="M23.15 2.587L18.21.21a1.494 1.494 0 0 0-1.705.29l-9.46 8.63-4.12-3.128a.999.999 0 0 0-1.276.057L.327 7.261A1 1 0 0 0 .326 8.74L3.899 12 .326 15.26a1 1 0 0 0 .001 1.479L1.65 17.94a.999.999 0 0 0 1.276.057l4.12-3.128 9.46 8.63a1.492 1.492 0 0 0 1.704.29l4.942-2.377A1.5 1.5 0 0 0 24 20.06V3.939a1.5 1.5 0 0 0-.85-1.352zm-5.146 14.861L10.826 12l7.178-5.448v10.896z"
/>
</svg>
<span>
Install Nx Console for VSCode
<span>The official VSCode extension for Nx.</span>
</span>
</a>
<a
id="nx-console-jetbrains"
class="button-pill rounded shadow"
href="https://plugins.jetbrains.com/plugin/21060-nx-console"
target="_blank"
rel="noreferrer"
>
<svg
height="48"
width="48"
viewBox="20 20 60 60"
xmlns="http://www.w3.org/2000/svg"
>
<path d="m22.5 22.5h60v60h-60z" />
<g fill="#fff">
<path d="m29.03 71.25h22.5v3.75h-22.5z" />
<path d="m28.09 38 1.67-1.58a1.88 1.88 0 0 0 1.47.87c.64 0 1.06-.44 1.06-1.31v-5.98h2.58v6a3.48 3.48 0 0 1 -.87 2.6 3.56 3.56 0 0 1 -2.57.95 3.84 3.84 0 0 1 -3.34-1.55z" />
<path d="m36 30h7.53v2.19h-5v1.44h4.49v2h-4.42v1.49h5v2.21h-7.6z" />
<path d="m47.23 32.29h-2.8v-2.29h8.21v2.27h-2.81v7.1h-2.6z" />
<path d="m29.13 43.08h4.42a3.53 3.53 0 0 1 2.55.83 2.09 2.09 0 0 1 .6 1.53 2.16 2.16 0 0 1 -1.44 2.09 2.27 2.27 0 0 1 1.86 2.29c0 1.61-1.31 2.59-3.55 2.59h-4.44zm5 2.89c0-.52-.42-.8-1.18-.8h-1.29v1.64h1.24c.79 0 1.25-.26 1.25-.81zm-.9 2.66h-1.57v1.73h1.62c.8 0 1.24-.31 1.24-.86 0-.5-.4-.87-1.27-.87z" />
<path d="m38 43.08h4.1a4.19 4.19 0 0 1 3 1 2.93 2.93 0 0 1 .9 2.19 3 3 0 0 1 -1.93 2.89l2.24 3.27h-3l-1.88-2.84h-.87v2.84h-2.56zm4 4.5c.87 0 1.39-.43 1.39-1.11 0-.75-.54-1.12-1.4-1.12h-1.44v2.26z" />
<path d="m49.59 43h2.5l4 9.44h-2.79l-.67-1.69h-3.63l-.67 1.69h-2.71zm2.27 5.73-1-2.65-1.06 2.65z" />
<path d="m56.46 43.05h2.6v9.37h-2.6z" />
<path d="m60.06 43.05h2.42l3.37 5v-5h2.57v9.37h-2.26l-3.53-5.14v5.14h-2.57z" />
<path d="m68.86 51 1.45-1.73a4.84 4.84 0 0 0 3 1.13c.71 0 1.08-.24 1.08-.65 0-.4-.31-.6-1.59-.91-2-.46-3.53-1-3.53-2.93 0-1.74 1.37-3 3.62-3a5.89 5.89 0 0 1 3.86 1.25l-1.26 1.84a4.63 4.63 0 0 0 -2.62-.92c-.63 0-.94.25-.94.6 0 .42.32.61 1.63.91 2.14.46 3.44 1.16 3.44 2.91 0 1.91-1.51 3-3.79 3a6.58 6.58 0 0 1 -4.35-1.5z" />
</g>
</svg>
<span>
Install Nx Console for JetBrains
<span>
Available for WebStorm, Intellij IDEA Ultimate and more!
</span>
</span>
</a>
<div id="nx-cloud" class="rounded shadow">
<div>
<svg id="nx-cloud-logo" role="img" xmlns="http://www.w3.org/2000/svg" stroke="currentColor" fill="transparent" viewBox="0 0 24 24">
<path stroke-width="2" d="M23 3.75V6.5c-3.036 0-5.5 2.464-5.5 5.5s-2.464 5.5-5.5 5.5-5.5 2.464-5.5 5.5H3.75C2.232 23 1 21.768 1 20.25V3.75C1 2.232 2.232 1 3.75 1h16.5C21.768 1 23 2.232 23 3.75Z" />
<path stroke-width="2" d="M23 6v14.1667C23 21.7307 21.7307 23 20.1667 23H6c0-3.128 2.53867-5.6667 5.6667-5.6667 3.128 0 5.6666-2.5386 5.6666-5.6666C17.3333 8.53867 19.872 6 23 6Z" />
</svg>
<h2>
Nx Cloud
<span>
Enable faster CI & better DX
</span>
</h2>
</div>
<p>
You can activate distributed tasks executions and caching by
running:
</p>
<pre>nx connect</pre>
<a href="https://nx.app/?utm_source=nx-project" target="_blank" rel="noreferrer"> What is Nx Cloud? </a>
</div>
<a id="nx-repo" class="button-pill rounded shadow" href="https://github.com/nrwl/nx?utm_source=nx-project" target="_blank" rel="noreferrer">
<svg
fill="currentColor"
role="img"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"
/>
</svg>
<span>
Nx is open source
<span> Love Nx? Give us a star! </span>
</span>
</a>
</div>
</div>
<!-- COMMANDS -->
<div id="commands" class="rounded shadow">
<h2>Next steps</h2>
<p>Here are some things you can do with Nx:</p>
<details>
<summary>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"
/>
</svg>
Add UI library
</summary>
<pre><span># Generate UI lib</span>
nx g @nx/angular:lib ui
<span># Add a component</span>
nx g @nx/angular:component ui/src/lib/button</pre>
</details>
<details>
<summary>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"
/>
</svg>
View interactive project graph
</summary>
<pre>nx graph</pre>
</details>
<details>
<summary>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"
/>
</svg>
Run affected commands
</summary>
<pre><span># see what&apos;s been affected by changes</span>
nx affected:graph
<span># run tests for current changes</span>
nx affected:test
<span># run e2e tests for current changes</span>
nx affected:e2e</pre>
</details>
</div>
<p id="love">
Carefully crafted with
<svg
fill="currentColor"
stroke="none"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z"
/>
</svg>
</p>
</div>
</div>
`;
}
}
customElements.define('z-elements-root', AppElement);

View File

@@ -1 +0,0 @@
import './app/app.element';

View File

@@ -1 +0,0 @@
/* You can add global styles to this file, and also import other style files */

View File

@@ -1,9 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/out-tsc",
"types": ["node"]
},
"exclude": ["src/**/*.spec.ts", "src/**/*.test.ts"],
"include": ["src/**/*.ts"]
}

View File

@@ -1,30 +0,0 @@
{
"extends": "../../tsconfig.base.json",
"files": [],
"compilerOptions": {
"target": "ESNext",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": ["ESNext", "DOM"],
"moduleResolution": "Node",
"strict": true,
"resolveJsonModule": true,
"isolatedModules": true,
"esModuleInterop": true,
"noEmit": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noImplicitReturns": true,
"skipLibCheck": true,
"types": ["vite/client"]
},
"include": ["src"],
"references": [
{
"path": "./tsconfig.app.json"
},
{
"path": "./tsconfig.spec.json"
}
]
}

View File

@@ -1,10 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/out-tsc",
"module": "commonjs",
"types": ["jest", "node"]
},
"files": ["src/test-setup.ts"],
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
}

View File

@@ -1,34 +0,0 @@
/// <reference types='vitest' />
import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
import { defineConfig } from 'vite';
export default defineConfig({
root: __dirname,
cacheDir: '../../node_modules/.vite/apps/showcase',
server: {
port: 4200,
host: 'localhost',
},
preview: {
port: 4300,
host: 'localhost',
},
plugins: [nxViteTsPaths()],
// Uncomment this if you are using workers.
// worker: {
// plugins: [ nxViteTsPaths() ],
// },
build: {
outDir: '../../dist/apps/showcase',
emptyOutDir: true,
reportCompressedSize: true,
commonjsOptions: {
transformMixedEsModules: true,
},
},
});

View File

@@ -1,5 +1,5 @@
import { getJestProjects } from '@nx/jest'; import { getJestProjectsAsync } from '@nx/jest';
export default { export default async () => ({
projects: getJestProjects(), projects: await getJestProjectsAsync(),
}; });

View File

@@ -1,7 +1,7 @@
import { noChange } from 'lit'; import { noChange } from 'lit';
import { AsyncDirective, directive } from 'lit/async-directive.js'; import { AsyncDirective, directive } from 'lit/async-directive.js';
import { Observable, Subject, tap } from 'rxjs'; import { Observable, Subject, takeUntil, tap } from 'rxjs';
class Async extends AsyncDirective { class Async extends AsyncDirective {
/** Private variables */ /** Private variables */
@@ -23,6 +23,7 @@ class Async extends AsyncDirective {
render(observable: Observable<unknown>) { render(observable: Observable<unknown>) {
observable observable
.pipe( .pipe(
takeUntil(this.destroy$),
tap((value: unknown) => { tap((value: unknown) => {
this.setValue(value); this.setValue(value);
}), }),

View File

@@ -3,38 +3,28 @@
"$schema": "../../../node_modules/nx/schemas/project-schema.json", "$schema": "../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "libs/_internal/styles/src", "sourceRoot": "libs/_internal/styles/src",
"projectType": "library", "projectType": "library",
"tags": [],
"targets": { "targets": {
"build": { "build": {
"executor": "@nx/js:tsc", "executor": "@nx/js:tsc",
"outputs": [ "outputs": ["{options.outputPath}"],
"{options.outputPath}"
],
"options": { "options": {
"outputPath": "dist/libs/_internal/styles", "outputPath": "dist/libs/_internal/styles",
"main": "libs/_internal/styles/src/index.ts", "main": "libs/_internal/styles/src/index.ts",
"tsConfig": "libs/_internal/styles/tsconfig.lib.json", "tsConfig": "libs/_internal/styles/tsconfig.lib.json",
"assets": [ "assets": ["libs/_internal/styles/*.md"]
"libs/_internal/styles/*.md"
]
} }
}, },
"lint": { "lint": {
"executor": "@nx/linter:eslint", "executor": "@nx/linter:eslint",
"outputs": [ "outputs": ["{options.outputFile}"],
"{options.outputFile}"
],
"options": { "options": {
"lintFilePatterns": [ "lintFilePatterns": ["libs/_internal/styles/**/*.ts", "libs/_internal/styles/package.json"]
"libs/_internal/styles/**/*.ts",
"libs/_internal/styles/package.json"
]
} }
}, },
"test": { "test": {
"executor": "@nx/jest:jest", "executor": "@nx/jest:jest",
"outputs": [ "outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
"{workspaceRoot}/coverage/{projectRoot}"
],
"options": { "options": {
"jestConfig": "libs/_internal/styles/jest.config.ts", "jestConfig": "libs/_internal/styles/jest.config.ts",
"passWithNoTests": true "passWithNoTests": true
@@ -46,6 +36,5 @@
} }
} }
} }
}, }
"tags": []
} }

View File

@@ -1,5 +1,5 @@
import { unsafeCSS } from 'lit'; import { unsafeCSS } from 'lit';
export function variable(variableName: string, defaultValue?: string) { export function variable(variableName: `--${string}`, defaultValue?: string) {
return unsafeCSS(`var(${variableName}${defaultValue ? `, ${defaultValue}` : ''})`); return unsafeCSS(`var(${variableName}${defaultValue ? `, ${defaultValue}` : ''})`);
} }

View File

@@ -3,39 +3,29 @@
"$schema": "../../node_modules/nx/schemas/project-schema.json", "$schema": "../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "libs/accordion/src", "sourceRoot": "libs/accordion/src",
"projectType": "library", "projectType": "library",
"tags": ["type:component", ""],
"targets": { "targets": {
"build": { "build": {
"executor": "@nx/vite:build", "executor": "@nx/vite:build",
"outputs": [ "outputs": ["{options.outputPath}"],
"{options.outputPath}"
],
"options": { "options": {
"outputPath": "dist/libs/accordion" "outputPath": "dist/libs/accordion"
} }
}, },
"publish": { "publish": {
"command": "node tools/scripts/publish.mjs accordion {args.ver} {args.tag}", "command": "node tools/scripts/publish.mjs accordion {args.ver} {args.tag}",
"dependsOn": [ "dependsOn": ["build"]
"build"
]
}, },
"lint": { "lint": {
"executor": "@nx/linter:eslint", "executor": "@nx/linter:eslint",
"outputs": [ "outputs": ["{options.outputFile}"],
"{options.outputFile}"
],
"options": { "options": {
"lintFilePatterns": [ "lintFilePatterns": ["libs/accordion/**/*.ts", "libs/accordion/package.json"]
"libs/accordion/**/*.ts",
"libs/accordion/package.json"
]
} }
}, },
"test": { "test": {
"executor": "@nx/jest:jest", "executor": "@nx/jest:jest",
"outputs": [ "outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
"{workspaceRoot}/coverage/{projectRoot}"
],
"options": { "options": {
"jestConfig": "libs/accordion/jest.config.ts", "jestConfig": "libs/accordion/jest.config.ts",
"passWithNoTests": true "passWithNoTests": true
@@ -47,9 +37,5 @@
} }
} }
} }
}, }
"tags": [
"type:component",
""
]
} }

View File

@@ -3,38 +3,28 @@
"$schema": "../../node_modules/nx/schemas/project-schema.json", "$schema": "../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "libs/container/src", "sourceRoot": "libs/container/src",
"projectType": "library", "projectType": "library",
"tags": [],
"targets": { "targets": {
"build": { "build": {
"executor": "@nx/js:tsc", "executor": "@nx/js:tsc",
"outputs": [ "outputs": ["{options.outputPath}"],
"{options.outputPath}"
],
"options": { "options": {
"outputPath": "dist/libs/container", "outputPath": "dist/libs/container",
"main": "libs/container/src/index.ts", "main": "libs/container/src/index.ts",
"tsConfig": "libs/container/tsconfig.lib.json", "tsConfig": "libs/container/tsconfig.lib.json",
"assets": [ "assets": ["libs/container/*.md"]
"libs/container/*.md"
]
} }
}, },
"lint": { "lint": {
"executor": "@nx/linter:eslint", "executor": "@nx/linter:eslint",
"outputs": [ "outputs": ["{options.outputFile}"],
"{options.outputFile}"
],
"options": { "options": {
"lintFilePatterns": [ "lintFilePatterns": ["libs/container/**/*.ts", "libs/container/package.json"]
"libs/container/**/*.ts",
"libs/container/package.json"
]
} }
}, },
"test": { "test": {
"executor": "@nx/jest:jest", "executor": "@nx/jest:jest",
"outputs": [ "outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
"{workspaceRoot}/coverage/{projectRoot}"
],
"options": { "options": {
"jestConfig": "libs/container/jest.config.ts", "jestConfig": "libs/container/jest.config.ts",
"passWithNoTests": true "passWithNoTests": true
@@ -60,9 +50,7 @@
}, },
"build-storybook": { "build-storybook": {
"executor": "@nx/storybook:build", "executor": "@nx/storybook:build",
"outputs": [ "outputs": ["{options.outputDir}"],
"{options.outputDir}"
],
"options": { "options": {
"outputDir": "dist/storybook/container", "outputDir": "dist/storybook/container",
"configDir": "libs/container/.storybook" "configDir": "libs/container/.storybook"
@@ -79,6 +67,5 @@
"command": "test-storybook -c libs/container/.storybook --url=http://localhost:4400" "command": "test-storybook -c libs/container/.storybook --url=http://localhost:4400"
} }
} }
}, }
"tags": []
} }

View File

@@ -1,7 +0,0 @@
import { reviewsStars } from './reviews-stars';
describe('reviewsStars', () => {
it('should work', () => {
expect(reviewsStars()).toEqual('reviews-stars');
});
});

View File

@@ -13,7 +13,7 @@ import { Placement } from './models/placement.enum';
import { basicStyles, positioning, variables } from './styles'; import { basicStyles, positioning, variables } from './styles';
@customElement('z-tooltip') @customElement('z-tooltip')
export default class TooltipComponent extends LitElement { export class TooltipComponent extends LitElement {
/** Private variables */ /** Private variables */
private readonly _visibilityController = new VisibilityController(this); private readonly _visibilityController = new VisibilityController(this);
private readonly _positionController = new PositionController(this); private readonly _positionController = new PositionController(this);

View File

@@ -1,7 +0,0 @@
import { tooltip } from './tooltip.component';
describe('tooltip', () => {
it('should work', () => {
expect(tooltip()).toEqual('tooltip');
});
});

View File

@@ -1,74 +0,0 @@
{
"migrations": [
{
"cli": "nx",
"version": "17.3.0-beta.6",
"description": "Updates the nx wrapper.",
"implementation": "./src/migrations/update-17-3-0/update-nxw",
"package": "nx",
"name": "17.3.0-update-nx-wrapper"
},
{
"cli": "nx",
"version": "18.0.0-beta.2",
"description": "Updates nx.json to disabled adding plugins when generating projects in an existing Nx workspace",
"implementation": "./src/migrations/update-18-0-0/disable-crystal-for-existing-workspaces",
"x-repair-skip": true,
"package": "nx",
"name": "18.0.0-disable-adding-plugins-for-existing-workspaces"
},
{
"version": "18.1.0-beta.3",
"description": "Moves affected.defaultBase to defaultBase in `nx.json`",
"implementation": "./src/migrations/update-17-2-0/move-default-base",
"package": "nx",
"name": "move-default-base-to-nx-json-root"
},
{
"cli": "nx",
"version": "19.2.0-beta.2",
"description": "Updates the default workspace data directory to .nx/workspace-data",
"implementation": "./src/migrations/update-19-2-0/move-workspace-data-directory",
"package": "nx",
"name": "19-2-0-move-graph-cache-directory"
},
{
"cli": "nx",
"version": "19.2.2-beta.0",
"description": "Updates the nx wrapper.",
"implementation": "./src/migrations/update-17-3-0/update-nxw",
"package": "nx",
"name": "19-2-2-update-nx-wrapper"
},
{
"version": "19.2.4-beta.0",
"description": "Set project name in nx.json explicitly",
"implementation": "./src/migrations/update-19-2-4/set-project-name",
"x-repair-skip": true,
"package": "nx",
"name": "19-2-4-set-project-name"
},
{
"version": "17.3.0-beta.0",
"description": "Move the vitest coverage thresholds in their own object if exists and add reporters.",
"implementation": "./src/migrations/update-17-3-0/vitest-coverage-and-reporters",
"package": "@nx/vite",
"name": "vitest-coverage-and-reporters"
},
{
"version": "17.2.9",
"description": "Move executor options to target defaults",
"implementation": "./src/migrations/update-17-2-9/move-options-to-target-defaults",
"package": "@nx/linter",
"name": "move-options-to-target-defaults"
},
{
"cli": "nx",
"version": "19.1.0-beta.6",
"description": "Migrate no-extra-semi rules into user config, out of nx extendable configs",
"implementation": "./src/migrations/update-19-1-0-migrate-no-extra-semi/migrate-no-extra-semi",
"package": "@nx/eslint-plugin",
"name": "update-19-1-0-rename-no-extra-semi"
}
]
}

20292
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -5,64 +5,61 @@
"scripts": {}, "scripts": {},
"private": true, "private": true,
"dependencies": { "dependencies": {
"lit": "^3.2.0", "lit": "3.3.1",
"react": "^18.3.1", "react": "^19.2.0",
"react-dom": "^18.3.1", "react-dom": "^19.2.0",
"tslib": "^2.6.3", "tslib": "^2.8.1",
"zod": "^3.23.8" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@babel/plugin-proposal-decorators": "^7.24.7", "@babel/plugin-proposal-decorators": "^7.28.0",
"@nx/devkit": "19.5.7", "@nx/devkit": "22.1.3",
"@nx/eslint-plugin": "19.5.7", "@nx/eslint-plugin": "22.1.3",
"@nx/jest": "19.5.7", "@nx/jest": "22.1.3",
"@nx/js": "19.5.7", "@nx/js": "22.1.3",
"@nx/linter": "19.5.7", "@nx/playwright": "22.1.3",
"@nx/playwright": "19.5.7", "@nx/storybook": "22.1.3",
"@nx/storybook": "19.5.7", "@nx/vite": "22.1.3",
"@nx/vite": "19.5.7", "@nx/web": "22.1.3",
"@nx/web": "19.5.7", "@nx/workspace": "22.1.3",
"@nx/workspace": "19.5.7", "@playwright/test": "^1.57.0",
"@playwright/test": "^1.46.0",
"@storybook/addon-essentials": "8.2.8",
"@storybook/addon-interactions": "8.2.8",
"@storybook/core-server": "8.2.8",
"@storybook/jest": "0.2.3", "@storybook/jest": "0.2.3",
"@storybook/test-runner": "0.19.1", "@storybook/test-runner": "0.24.2",
"@storybook/testing-library": "0.2.2", "@storybook/testing-library": "0.2.2",
"@storybook/web-components": "^8.2.8", "@storybook/web-components": "^10",
"@storybook/web-components-vite": "8.2.8", "@storybook/web-components-vite": "^10",
"@storybook/web-components-webpack5": "8.2.8", "@swc-node/register": "~1.11.1",
"@swc-node/register": "~1.10.9", "@swc/core": "~1.15.3",
"@swc/core": "~1.7.10", "@swc/helpers": "~0.5.17",
"@swc/helpers": "~0.5.12", "@swc/jest": "0.2.39",
"@swc/jest": "~0.2.36", "@trivago/prettier-plugin-sort-imports": "^6.0.0",
"@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/jest": "30.0.0",
"@types/jest": "^29.5.12", "@types/node": "24.10.1",
"@types/node": "22.2.0", "@typescript-eslint/eslint-plugin": "8.48.0",
"@typescript-eslint/eslint-plugin": "8.0.1", "@typescript-eslint/parser": "8.48.0",
"@typescript-eslint/parser": "8.0.1",
"@vitest/coverage-c8": "~0.33.0", "@vitest/coverage-c8": "~0.33.0",
"@vitest/ui": "2.0.5", "@vitest/ui": "4.0.14",
"eslint": "9.9.0", "eslint": "9.39.1",
"eslint-config-prettier": "9.1.0", "eslint-config-prettier": "10.1.8",
"eslint-plugin-playwright": "^1.6.2", "eslint-plugin-playwright": "^2.3.0",
"jest": "^29.7.0", "jest": "30.2.0",
"jest-environment-jsdom": "^29.7.0", "jest-environment-jsdom": "30.2.0",
"jest-environment-node": "^29.7.0", "jest-environment-node": "^30.2.0",
"jsdom": "~24.1.1", "jest-util": "30.2.0",
"nx": "19.5.7", "jiti": "2.6.1",
"prettier": "^3.3.3", "jsdom": "~27.2.0",
"rxjs": "^7.8.1", "nx": "22.1.3",
"storybook": "^8.2.8", "prettier": "^3.7.1",
"rxjs": "^7.8.2",
"storybook": "10.1.2",
"swc-loader": "0.2.6", "swc-loader": "0.2.6",
"ts-jest": "^29.2.4", "ts-jest": "29.4.5",
"ts-node": "10.9.2", "ts-node": "10.9.2",
"typescript": "5.5.4", "typescript": "5.9.3",
"verdaccio": "^5.32.1", "verdaccio": "6.2.3",
"vite": "5.4.0", "vite": "7.2.4",
"vite-plugin-dts": "4.0.2", "vite-plugin-dts": "4.5.4",
"vitest": "2.0.5" "vitest": "4.0.14"
}, },
"nx": { "nx": {
"includedScripts": [] "includedScripts": []

14747
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff