Merge pull request #1 from Pridestalker/develop

Develop
This commit is contained in:
2025-11-28 09:44:32 +01:00
committed by GitHub
81 changed files with 13555 additions and 10252 deletions

View File

@@ -24,12 +24,18 @@
{ {
"files": ["*.ts", "*.tsx"], "files": ["*.ts", "*.tsx"],
"extends": ["plugin:@nx/typescript"], "extends": ["plugin:@nx/typescript"],
"rules": {} "rules": {
"@typescript-eslint/no-extra-semi": "error",
"no-extra-semi": "off"
}
}, },
{ {
"files": ["*.js", "*.jsx"], "files": ["*.js", "*.jsx"],
"extends": ["plugin:@nx/javascript"], "extends": ["plugin:@nx/javascript"],
"rules": {} "rules": {
"@typescript-eslint/no-extra-semi": "error",
"no-extra-semi": "off"
}
}, },
{ {
"files": ["*.spec.ts", "*.spec.tsx", "*.spec.js", "*.spec.jsx"], "files": ["*.spec.ts", "*.spec.tsx", "*.spec.js", "*.spec.jsx"],

56
.fleet/settings.json Normal file
View File

@@ -0,0 +1,56 @@
{
"plugins": [
{
"type": "add",
"pluginName": "fleet.ai"
},
{
"type": "add",
"pluginName": "fleet.css"
},
{
"type": "add",
"pluginName": "fleet.diff"
},
{
"type": "add",
"pluginName": "fleet.emmet"
},
{
"type": "add",
"pluginName": "fleet.git.frontend"
},
{
"type": "add",
"pluginName": "fleet.xml"
},
{
"type": "add",
"pluginName": "fleet.intellij"
},
{
"type": "add",
"pluginName": "fleet.json"
},
{
"type": "add",
"pluginName": "fleet.javascript"
},
{
"type": "add",
"pluginName": "fleet.lsp"
},
{
"type": "add",
"pluginName": "fleet.smartMode"
},
{
"type": "add",
"pluginName": "fleet.tailwindcss"
},
{
"type": "add",
"pluginName": "fleet.vim"
}
]
}

3
.gitignore vendored
View File

@@ -37,3 +37,6 @@ testem.log
# System Files # System Files
.DS_Store .DS_Store
Thumbs.db Thumbs.db
.nx/cache
.nx/workspace-data

View File

@@ -1,3 +1,5 @@
# Add files here to ignore them from prettier formatting # Add files here to ignore them from prettier formatting
/dist /dist
/coverage /coverage
/.nx/cache
/.nx/workspace-data

View File

@@ -1,14 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../../dist/out-tsc",
"declaration": true,
"types": ["node"]
},
"include": ["../../../../libs/_internal/directives/src/**/*.ts"],
"exclude": [
"../../../../libs/_internal/directives/jest.config.ts",
"../../../../libs/_internal/directives/src/**/*.spec.ts",
"../../../../libs/_internal/directives/src/**/*.test.ts"
]
}

View File

@@ -1,16 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/out-tsc",
"declaration": true,
"types": ["node"]
},
"include": ["../../../libs/tooltip/src/**/*.ts"],
"exclude": [
"../../../libs/tooltip/jest.config.ts",
"../../../libs/tooltip/src/**/*.spec.ts",
"../../../libs/tooltip/src/**/*.test.ts",
"../../../libs/tooltip/**/*.stories.ts",
"../../../libs/tooltip/**/*.stories.js"
]
}

View File

@@ -0,0 +1,22 @@
{
"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

@@ -0,0 +1,68 @@
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

@@ -0,0 +1,20 @@
{
"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

@@ -0,0 +1,8 @@
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

@@ -0,0 +1,19 @@
{
"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"
]
}

3
apps/showcase/.babelrc Normal file
View File

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

View File

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

8
apps/showcase/.swcrc Normal file
View File

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

16
apps/showcase/index.html Normal file
View File

@@ -0,0 +1,16 @@
<!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

@@ -0,0 +1,11 @@
/* 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

@@ -0,0 +1,67 @@
{
"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.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,499 @@
/*
* 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

@@ -0,0 +1,19 @@
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

@@ -0,0 +1,407 @@
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

View File

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

View File

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

View File

View File

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

View File

@@ -0,0 +1,30 @@
{
"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

@@ -0,0 +1,10 @@
{
"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

@@ -0,0 +1,34 @@
/// <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

@@ -2,16 +2,10 @@
This library was generated with [Nx](https://nx.dev). This library was generated with [Nx](https://nx.dev).
## Building ## Building
Run `nx build _internal-controllers` to build the library. Run `nx build _internal-controllers` to build the library.
## Running unit tests ## Running unit tests
Run `nx test _internal-controllers` to execute the unit tests via [Jest](https://jestjs.io). Run `nx test _internal-controllers` to execute the unit tests via [Jest](https://jestjs.io).

View File

@@ -1,35 +1,24 @@
/// <reference types="vitest" />
import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
import { defineConfig } from 'vite';
/// <reference types="vitest" /> export default defineConfig({
import { defineConfig } from 'vite'; cacheDir: '../../../node_modules/.vite/_internal-controllers',
import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'; plugins: [nxViteTsPaths()],
// Uncomment this if you are using workers.
export default defineConfig({ // worker: {
cacheDir: '../../../node_modules/.vite/_internal-controllers', // plugins: [ nxViteTsPaths() ],
// },
test: {
plugins: [ reporters: ['default'],
nxViteTsPaths(),
],
// Uncomment this if you are using workers.
// worker: {
// plugins: [ nxViteTsPaths() ],
// },
test: {
globals: true, globals: true,
cache: { cache: {
dir: '../../../node_modules/.vitest' dir: '../../../node_modules/.vitest',
}, },
environment: 'node', environment: 'node',
include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
}, },
}); });

View File

@@ -1,35 +1,24 @@
/// <reference types="vitest" />
import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
import { defineConfig } from 'vite';
/// <reference types="vitest" /> export default defineConfig({
import { defineConfig } from 'vite'; cacheDir: '../../../node_modules/.vite/_internal-directives',
import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'; plugins: [nxViteTsPaths()],
// Uncomment this if you are using workers.
export default defineConfig({ // worker: {
cacheDir: '../../../node_modules/.vite/_internal-directives', // plugins: [ nxViteTsPaths() ],
// },
test: {
plugins: [ reporters: ['default'],
nxViteTsPaths(),
],
// Uncomment this if you are using workers.
// worker: {
// plugins: [ nxViteTsPaths() ],
// },
test: {
globals: true, globals: true,
cache: { cache: {
dir: '../../../node_modules/.vitest' dir: '../../../node_modules/.vitest',
}, },
environment: 'node', environment: 'node',
include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
}, },
}); });

View File

@@ -1,5 +1,5 @@
{ {
"name": "z-styles", "name": "@hijlkema-codes/internal/z-styles",
"version": "0.0.1", "version": "0.0.1",
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"

View File

@@ -6,17 +6,23 @@
"targets": { "targets": {
"build": { "build": {
"executor": "@nx/js:tsc", "executor": "@nx/js:tsc",
"outputs": ["{options.outputPath}"], "outputs": [
"{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": ["libs/_internal/styles/*.md"] "assets": [
"libs/_internal/styles/*.md"
]
} }
}, },
"lint": { "lint": {
"executor": "@nx/linter:eslint", "executor": "@nx/linter:eslint",
"outputs": ["{options.outputFile}"], "outputs": [
"{options.outputFile}"
],
"options": { "options": {
"lintFilePatterns": [ "lintFilePatterns": [
"libs/_internal/styles/**/*.ts", "libs/_internal/styles/**/*.ts",
@@ -26,7 +32,9 @@
}, },
"test": { "test": {
"executor": "@nx/jest:jest", "executor": "@nx/jest:jest",
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "outputs": [
"{workspaceRoot}/coverage/{projectRoot}"
],
"options": { "options": {
"jestConfig": "libs/_internal/styles/jest.config.ts", "jestConfig": "libs/_internal/styles/jest.config.ts",
"passWithNoTests": true "passWithNoTests": true

View File

@@ -1,5 +1,5 @@
export * from './lib/normalize'; export { normalize } from './lib/normalize';
export * from './lib/variable.helper'; export { VariableHelper } from './lib/variable.helper';
export * from './lib/variable.func'; export { variable } from './lib/variable.func';

View File

@@ -6,18 +6,24 @@
"targets": { "targets": {
"build": { "build": {
"executor": "@nx/vite:build", "executor": "@nx/vite:build",
"outputs": ["{options.outputPath}"], "outputs": [
"{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": ["build"] "dependsOn": [
"build"
]
}, },
"lint": { "lint": {
"executor": "@nx/linter:eslint", "executor": "@nx/linter:eslint",
"outputs": ["{options.outputFile}"], "outputs": [
"{options.outputFile}"
],
"options": { "options": {
"lintFilePatterns": [ "lintFilePatterns": [
"libs/accordion/**/*.ts", "libs/accordion/**/*.ts",
@@ -27,7 +33,9 @@
}, },
"test": { "test": {
"executor": "@nx/jest:jest", "executor": "@nx/jest:jest",
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "outputs": [
"{workspaceRoot}/coverage/{projectRoot}"
],
"options": { "options": {
"jestConfig": "libs/accordion/jest.config.ts", "jestConfig": "libs/accordion/jest.config.ts",
"passWithNoTests": true "passWithNoTests": true
@@ -40,5 +48,8 @@
} }
} }
}, },
"tags": ["type:component", ""] "tags": [
"type:component",
""
]
} }

View File

@@ -1,5 +1,6 @@
import { LitElement, TemplateResult, html } from 'lit'; import { LitElement, TemplateResult, html } from 'lit';
import { customElement, queryAssignedElements } from 'lit/decorators.js'; import { customElement, property, queryAssignedElements } from 'lit/decorators.js';
import AccordionComponent from './accordion.component'; import AccordionComponent from './accordion.component';
@customElement('z-accordion.group') @customElement('z-accordion.group')
@@ -7,22 +8,19 @@ export default class AccordionGroupComponent extends LitElement {
@queryAssignedElements({ selector: 'z-accordion' }) @queryAssignedElements({ selector: 'z-accordion' })
public items!: NodeListOf<AccordionComponent>; public items!: NodeListOf<AccordionComponent>;
@property({ type: Boolean })
public closeOthers: boolean = false;
protected override firstUpdated() { protected override firstUpdated() {
this.items.forEach((item) => { this.items.forEach((item) => {
item.addEventListener('open', () => { item.addEventListener('open', () => {
this.items.forEach((i) => { if (this.closeOthers) {
if (i !== item) { this.items.forEach((i: AccordionComponent) => {
i.open = false; if (i !== item) {
} i.open = false;
}); }
}); });
}
item.addEventListener('close', () => {
this.items.forEach((i) => {
if (i !== item) {
i.open = false;
}
});
}); });
}); });
} }

View File

@@ -1,21 +1,38 @@
{ {
"extends": ["../../.eslintrc.json"], "extends": [
"ignorePatterns": ["!**/*"], "../../.eslintrc.json"
],
"ignorePatterns": [
"!**/*"
],
"overrides": [ "overrides": [
{ {
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"], "files": [
"*.ts",
"*.tsx",
"*.js",
"*.jsx"
],
"rules": {} "rules": {}
}, },
{ {
"files": ["*.ts", "*.tsx"], "files": [
"*.ts",
"*.tsx"
],
"rules": {} "rules": {}
}, },
{ {
"files": ["*.js", "*.jsx"], "files": [
"*.js",
"*.jsx"
],
"rules": {} "rules": {}
}, },
{ {
"files": ["*.json"], "files": [
"*.json"
],
"parser": "jsonc-eslint-parser", "parser": "jsonc-eslint-parser",
"rules": { "rules": {
"@nx/dependency-checks": "error" "@nx/dependency-checks": "error"

View File

@@ -0,0 +1,35 @@
import type { StorybookConfig } from '@storybook/web-components-vite';
import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
import { mergeConfig } from 'vite';
const config: StorybookConfig = {
stories: [
'../src/lib/**/*.stories.@(js|jsx|ts|tsx|mdx)'
],
addons: ['@storybook/addon-essentials' , '@storybook/addon-interactions' ],
framework: {
name: '@storybook/web-components-vite',
options: {
},
},
viteFinal: async (config) =>
mergeConfig(config, {
plugins: [nxViteTsPaths()],
}),
};
export default config;
// To customize your Vite configuration you can use the viteFinal field.
// Check https://storybook.js.org/docs/react/builders/vite#configuration
// and https://nx.dev/packages/storybook/documents/custom-builder-configs

View File

View File

@@ -6,17 +6,23 @@
"targets": { "targets": {
"build": { "build": {
"executor": "@nx/js:tsc", "executor": "@nx/js:tsc",
"outputs": ["{options.outputPath}"], "outputs": [
"{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": ["libs/container/*.md"] "assets": [
"libs/container/*.md"
]
} }
}, },
"lint": { "lint": {
"executor": "@nx/linter:eslint", "executor": "@nx/linter:eslint",
"outputs": ["{options.outputFile}"], "outputs": [
"{options.outputFile}"
],
"options": { "options": {
"lintFilePatterns": [ "lintFilePatterns": [
"libs/container/**/*.ts", "libs/container/**/*.ts",
@@ -26,7 +32,9 @@
}, },
"test": { "test": {
"executor": "@nx/jest:jest", "executor": "@nx/jest:jest",
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "outputs": [
"{workspaceRoot}/coverage/{projectRoot}"
],
"options": { "options": {
"jestConfig": "libs/container/jest.config.ts", "jestConfig": "libs/container/jest.config.ts",
"passWithNoTests": true "passWithNoTests": true
@@ -37,6 +45,39 @@
"codeCoverage": true "codeCoverage": true
} }
} }
},
"storybook": {
"executor": "@nx/storybook:storybook",
"options": {
"port": 4400,
"configDir": "libs/container/.storybook"
},
"configurations": {
"ci": {
"quiet": true
}
}
},
"build-storybook": {
"executor": "@nx/storybook:build",
"outputs": [
"{options.outputDir}"
],
"options": {
"outputDir": "dist/storybook/container",
"configDir": "libs/container/.storybook"
},
"configurations": {
"ci": {
"quiet": true
}
}
},
"test-storybook": {
"executor": "nx:run-commands",
"options": {
"command": "test-storybook -c libs/container/.storybook --url=http://localhost:4400"
}
} }
}, },
"tags": [] "tags": []

View File

@@ -1 +1 @@
export * from './lib/container'; export * from './lib/container.component';

View File

@@ -0,0 +1,45 @@
import { Meta, StoryObj } from '@storybook/web-components';
import { html } from 'lit';
import './container.component';
import { Container } from './container.component';
const meta: Meta<Container> = {
title: 'Design System/Atoms/Container',
component: 'z-container',
args: {
conditionalRadius: true,
radius: '12px',
},
render: (args) => html`
<style>
html {
background-color: #e2e2e2;
--container--background-color: #fff;
--container--max-width: 80rem;
}
</style>
<z-container radius="${args['radius']}" ?conditional-radius="${args['conditionalRadius']}">
<div style="display: flex; column-gap: 3.5rem; padding-left: 3.5rem;">
<p style="margin: 0; padding-block: 3.5rem">
Incididunt voluptate non ea reprehenderit quis nostrud proident pariatur enim mollit esse nulla. Ex mollit mollit occaecat esse
consequat. Tempor dolor irure qui dolor proident esse voluptate excepteur dolor. Pariatur aliqua exercitation Lorem Lorem irure
occaecat amet est in nulla eu.
</p>
<img src="https://placeholder.co/350" alt="" />
</div>
</z-container>
`,
parameters: {
layout: 'fullscreen',
},
} satisfies Meta;
export default meta;
type Story = StoryObj<unknown>;
export const Primary: Story = {};

View File

@@ -0,0 +1,99 @@
import { LitElement, PropertyValues, css, html, unsafeCSS } from 'lit';
import { customElement, property } from 'lit/decorators.js';
/**
* A container element that centers its content and has a max-width.
*
* @slot - The default slot.
* @slot img - The slot for the image.
*
* @cssproperty --container--max-width - The max-width of the container.
* @cssproperty --container--background-color - The background color of the container.
*/
@customElement('z-container')
export class Container extends LitElement {
/// Private variables ///
/// Protected variables ///
/// Public variables ///
@property() public radius: string | undefined;
@property({ type: Boolean, attribute: 'conditional-radius' }) public conditionalRadius: boolean = false;
/// constructor & lifecycle ///
protected override willUpdate(_changedProperties: PropertyValues): void {
super.willUpdate(_changedProperties);
this.updateBorderRadius();
}
/// Public methods ///
/// Protected methods ///
protected override render(): unknown {
return html`
<section>
<slot></slot>
<slot name="img"></slot>
</section>
`;
}
/// Private methods ///
private updateBorderRadius(): void {
const hasRadius = !!this.radius;
const isConditional = this.conditionalRadius;
switch (true) {
case !hasRadius:
this.removeBorderRadius();
break;
case hasRadius && isConditional:
this.setConditionRadius();
break;
case hasRadius && !isConditional:
this.setRadius();
break;
}
}
private removeBorderRadius(): void {
this.style.removeProperty(Container.CSS_PROPERTY_NAMES.RADIUS);
}
private setConditionRadius(): void {
if (this.radius) {
this.style.setProperty(Container.CSS_PROPERTY_NAMES.RADIUS, `max(0px, min(${this.radius}, calc((100vw - 4px - 100%) * 9999)))`);
}
}
private setRadius(): void {
if (this.radius) {
this.style.setProperty(Container.CSS_PROPERTY_NAMES.RADIUS, this.radius);
}
}
/// Statics ///
static CSS_PROPERTY_NAMES = {
RADIUS: '--container--radius',
BACKGROUND_COLOR: '--container--background-color',
MAX_WIDTH: '--container--max-width',
};
static override get styles() {
return [
css`
:host {
width: 100%;
max-width: var(${unsafeCSS(Container.CSS_PROPERTY_NAMES.MAX_WIDTH)}, 80rem);
margin-inline: auto;
display: flex;
background-color: var(${unsafeCSS(Container.CSS_PROPERTY_NAMES.BACKGROUND_COLOR)});
border-radius: var(${unsafeCSS(Container.CSS_PROPERTY_NAMES.RADIUS)}, 0px);
overflow: hidden;
}
`,
];
}
}

View File

@@ -1,3 +0,0 @@
export function container(): string {
return 'container';
}

View File

@@ -17,6 +17,9 @@
}, },
{ {
"path": "./tsconfig.spec.json" "path": "./tsconfig.spec.json"
},
{
"path": "./tsconfig.storybook.json"
} }
] ]
} }

View File

@@ -3,8 +3,18 @@
"compilerOptions": { "compilerOptions": {
"outDir": "../../dist/out-tsc", "outDir": "../../dist/out-tsc",
"declaration": true, "declaration": true,
"types": ["node"] "types": [
"node"
]
}, },
"include": ["src/**/*.ts"], "include": [
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] "src/**/*.ts"
],
"exclude": [
"jest.config.ts",
"src/**/*.spec.ts",
"src/**/*.test.ts",
"**/*.stories.ts",
"**/*.stories.js"
]
} }

View File

@@ -0,0 +1,19 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"emitDecoratorMetadata": true
},
"exclude": [
"src/**/*.spec.ts",
"src/**/*.test.ts"
],
"include": [
"src/**/*.stories.ts",
"src/**/*.stories.js",
"src/**/*.stories.jsx",
"src/**/*.stories.tsx",
"src/**/*.stories.mdx",
".storybook/*.js",
".storybook/*.ts"
]
}

View File

@@ -33,7 +33,7 @@
"test": { "test": {
"executor": "@nx/vite:test", "executor": "@nx/vite:test",
"outputs": [ "outputs": [
"coverage/libs/panels/bottom-panel" "{workspaceRoot}/coverage/libs/panels/bottom-panel"
], ],
"options": { "options": {
"passWithNoTests": true, "passWithNoTests": true,

View File

@@ -1 +1 @@
export * from './lib/panels-bottom-panel'; export * from './lib/bottom-panel.component';

View File

@@ -8,7 +8,7 @@ import { filter, fromEvent, takeUntil, tap } from 'rxjs';
import { hostStyles, panelStyles } from './styles'; import { hostStyles, panelStyles } from './styles';
@customElement('z-panels.bottom') @customElement('z-panels.bottom')
export default class BottomPanel extends LitElement { export default class BottomPanel extends LietElement {
static override get styles() { static override get styles() {
return [hostStyles, panelStyles]; return [hostStyles, panelStyles];
} }

View File

@@ -1,7 +1,6 @@
/// <reference types="vitest" /> /// <reference types="vitest" />
import { defineConfig } from 'vite';
import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'; import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
import { defineConfig } from 'vite';
export default defineConfig({ export default defineConfig({
cacheDir: '../../../node_modules/.vite/panels-bottom-panel', cacheDir: '../../../node_modules/.vite/panels-bottom-panel',
@@ -14,6 +13,7 @@ export default defineConfig({
// }, // },
test: { test: {
reporters: ['default'],
globals: true, globals: true,
cache: { cache: {
dir: '../../../node_modules/.vitest', dir: '../../../node_modules/.vitest',

View File

@@ -6,17 +6,23 @@
"targets": { "targets": {
"build": { "build": {
"executor": "@nx/js:tsc", "executor": "@nx/js:tsc",
"outputs": ["{options.outputPath}"], "outputs": [
"{options.outputPath}"
],
"options": { "options": {
"outputPath": "dist/libs/panels/side-panel", "outputPath": "dist/libs/panels/side-panel",
"main": "libs/panels/side-panel/src/index.ts", "main": "libs/panels/side-panel/src/index.ts",
"tsConfig": "libs/panels/side-panel/tsconfig.lib.json", "tsConfig": "libs/panels/side-panel/tsconfig.lib.json",
"assets": ["libs/panels/side-panel/*.md"] "assets": [
"libs/panels/side-panel/*.md"
]
} }
}, },
"lint": { "lint": {
"executor": "@nx/linter:eslint", "executor": "@nx/linter:eslint",
"outputs": ["{options.outputFile}"], "outputs": [
"{options.outputFile}"
],
"options": { "options": {
"lintFilePatterns": [ "lintFilePatterns": [
"libs/panels/side-panel/**/*.ts", "libs/panels/side-panel/**/*.ts",
@@ -26,7 +32,9 @@
}, },
"test": { "test": {
"executor": "@nx/vite:test", "executor": "@nx/vite:test",
"outputs": ["coverage/libs/panels/side-panel"], "outputs": [
"{workspaceRoot}/coverage/libs/panels/side-panel"
],
"options": { "options": {
"passWithNoTests": true, "passWithNoTests": true,
"reportsDirectory": "../../../coverage/libs/panels/side-panel" "reportsDirectory": "../../../coverage/libs/panels/side-panel"

View File

@@ -1,7 +1,7 @@
import { panelsSidePanel } from './panels-side-panel'; import { SidePanel } from './panels-side-panel';
describe('panelsSidePanel', () => { describe('panelsSidePanel', () => {
it('should work', () => { it('should work', () => {
expect(panelsSidePanel()).toEqual('panels-side-panel'); expect(SidePanel()).toEqual('panels-side-panel');
}); });
}); });

View File

@@ -4,7 +4,7 @@ import { LitElement } from 'lit';
import { customElement } from 'lit/decorators.js'; import { customElement } from 'lit/decorators.js';
@customElement('z-panels.side') @customElement('z-panels.side')
export default class SidePanel extends LitElement { export class SidePanel extends LitElement {
static override get styles() { static override get styles() {
return []; return [];
} }

View File

@@ -1,7 +1,6 @@
/// <reference types="vitest" /> /// <reference types="vitest" />
import { defineConfig } from 'vite';
import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'; import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
import { defineConfig } from 'vite';
export default defineConfig({ export default defineConfig({
cacheDir: '../../../node_modules/.vite/panels-side-panel', cacheDir: '../../../node_modules/.vite/panels-side-panel',
@@ -14,6 +13,7 @@ export default defineConfig({
// }, // },
test: { test: {
reporters: ['default'],
globals: true, globals: true,
cache: { cache: {
dir: '../../../node_modules/.vitest', dir: '../../../node_modules/.vitest',

View File

@@ -0,0 +1,25 @@
{
"extends": ["../../.eslintrc.json"],
"ignorePatterns": ["!**/*", "storybook-static"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
},
{
"files": ["*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.json"],
"parser": "jsonc-eslint-parser",
"rules": {
"@nx/dependency-checks": "error"
}
}
]
}

View File

@@ -0,0 +1,34 @@
import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
import type { StorybookConfig } from '@storybook/web-components-vite';
import { mergeConfig } from 'vite';
// These options were migrated by @nx/storybook:convert-to-inferred from the project.json file.
const configValues = { default: {}, ci: {} };
// Determine the correct configValue to use based on the configuration
const nxConfiguration = process.env.NX_TASK_TARGET_CONFIGURATION ?? 'default';
const options = {
...configValues.default,
...(configValues[nxConfiguration] ?? {}),
};
const config: StorybookConfig = {
stories: ['../src/lib/*.stories.@(js|jsx|ts|tsx|mdx)'],
addons: ['@storybook/addon-essentials', '@storybook/addon-interactions'],
framework: {
name: '@storybook/web-components-vite',
options: {},
},
viteFinal: async (config) =>
mergeConfig(config, {
plugins: [nxViteTsPaths()],
}),
};
export default config;
// To customize your Vite configuration you can use the viteFinal field.
// Check https://storybook.js.org/docs/react/builders/vite#configuration
// and https://nx.dev/recipes/storybook/custom-builder-configs

View File

View File

@@ -0,0 +1,11 @@
# reviews-stars
This library was generated with [Nx](https://nx.dev).
## Building
Run `nx build reviews-stars` to build the library.
## Running unit tests
Run `nx test reviews-stars` to execute the unit tests via [Jest](https://jestjs.io).

View File

@@ -0,0 +1,11 @@
/* eslint-disable */
export default {
displayName: 'reviews-stars',
preset: '../../jest.preset.js',
testEnvironment: 'node',
transform: {
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
},
moduleFileExtensions: ['ts', 'js', 'html'],
coverageDirectory: '../../coverage/libs/reviews-stars',
};

View File

@@ -0,0 +1,11 @@
{
"name": "@z-elements/reviews-stars",
"version": "0.0.1",
"dependencies": {
"tslib": "^2.3.0"
},
"type": "commonjs",
"main": "./src/index.js",
"typings": "./src/index.d.ts",
"private": true
}

View File

@@ -0,0 +1,64 @@
{
"name": "reviews-stars",
"$schema": "../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "libs/reviews-stars/src",
"projectType": "library",
"tags": [],
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": ["{options.outputPath}"],
"options": {
"outputPath": "dist/libs/reviews-stars",
"main": "libs/reviews-stars/src/index.ts",
"tsConfig": "libs/reviews-stars/tsconfig.lib.json",
"assets": ["libs/reviews-stars/*.md"]
}
},
"lint": {
"executor": "@nx/eslint:lint"
},
"test": {
"executor": "@nx/jest:jest",
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
"options": {
"jestConfig": "libs/reviews-stars/jest.config.ts"
}
},
"storybook": {
"options": {
"port": 4400,
"config-dir": ".storybook"
},
"configurations": {
"ci": {
"args": ["--quiet"]
}
}
},
"build-storybook": {
"outputs": [
"{projectRoot}/{options.output-dir}",
"{workspaceRoot}/{projectRoot}/storybook-static",
"{options.output-dir}",
"{options.outputDir}",
"{options.o}"
],
"options": {
"config-dir": ".storybook",
"output-dir": "../../dist/storybook/reviews-stars"
},
"configurations": {
"ci": {
"quiet": true
}
}
},
"test-storybook": {
"executor": "nx:run-commands",
"options": {
"command": "test-storybook -c libs/reviews-stars/.storybook --url=http://localhost:4400"
}
}
}
}

View File

@@ -0,0 +1 @@
export * from './lib/reviews-stars';

View File

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

View File

@@ -0,0 +1,53 @@
import { Meta, StoryObj } from '@storybook/web-components';
import { html } from 'lit';
import './reviews-stars';
import { ReviewsStarsComponent } from './reviews-stars';
const meta: Meta<ReviewsStarsComponent> = {
title: 'Design System/Atoms/Reviews Stars',
component: 'z-reviews.stars',
render: (args) => html`
<z-reviews.stars
?allow-fractional="${args.allowFractional}"
rating="${args.rating}"
out-of="${args.outOf}"
.stars=${args.stars}
></z-reviews.stars>
`,
parameters: {
layout: 'centered',
},
argTypes: {
rating: {
control: 'number',
min: 1,
},
outOf: {
control: {
type: 'number',
min: 1,
},
},
stars: {
control: {
type: 'number',
min: 1,
},
},
allowFractional: {
control: 'boolean',
},
},
args: {
rating: 3,
outOf: 5,
stars: 5,
allowFractional: false,
},
};
export default meta;
export const Primary: StoryObj<ReviewsStarsComponent> = {};

View File

@@ -0,0 +1,140 @@
import { css, CSSResultArray, html, LitElement, TemplateResult } from 'lit';
import { customElement, property, state } from 'lit/decorators.js';
import { styleMap } from 'lit/directives/style-map.js';
/**
* @cssprop --filled-star-color - The color of the filled stars.
* @cssprop --empty-star-color - The color of the empty stars.
*/
@customElement('z-reviews.stars')
export class ReviewsStarsComponent extends LitElement {
/// Private variables ///
/// Protected variables ///
@state() protected _filledStarCount = 0;
/// Public variables ///
@property({ type: Number }) public rating: number | undefined;
@property({ type: Number, attribute: 'out-of' }) public outOf: number | undefined;
@property({ type: Number }) public stars: number = 5;
@property({ type: Boolean, attribute: 'allow-fractional' }) public allowFractional = false;
/// constructor & lifecycle ///
override connectedCallback(): void {
super.connectedCallback();
this.validateProperties();
}
override updated(changedProperties: Map<string | number | symbol, unknown>): void {
super.updated(changedProperties);
this._filledStarCount = this.calculateFilledStarCount();
// this.requestUpdate();
}
/// Public methods ///
/// Protected methods ///
protected override render(): TemplateResult {
return html`
<div class="stars">${this.renderStars()}</div>
<div
class="stars stars--filled"
style="${styleMap({
'--filled-star-count': this._filledStarCount,
'--_filled-star-width': `${(this._filledStarCount / this.stars) * 100}%`,
})}"
>
${this.renderStars()}
</div>
`;
}
protected renderStars(): TemplateResult {
const stars: TemplateResult[] = [];
for (let i = 0; i < this.stars; i++) {
stars.push(this.renderStar());
}
return html`${stars}`;
}
protected renderStar(): TemplateResult {
return html`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" class="icon">
<!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
<path
d="M316.9 18C311.6 7 300.4 0 288.1 0s-23.4 7-28.8 18L195 150.3 51.4 171.5c-12 1.8-22 10.2-25.7 21.7s-.7 24.2 7.9 32.7L137.8 329 113.2 474.7c-2 12 3 24.2 12.9 31.3s23 8 33.8 2.3l128.3-68.5 128.3 68.5c10.8 5.7 23.9 4.9 33.8-2.3s14.9-19.3 12.9-31.3L438.5 329 542.7 225.9c8.6-8.5 11.7-21.2 7.9-32.7s-13.7-19.9-25.7-21.7L381.2 150.3 316.9 18z"
/>
</svg>
</svg>`;
}
/// Private methods ///
/**
* Validate the properties for the rules of availability.
*
* @throws {Error} If the properties are not valid.
*/
private validateProperties(): void {
console.log(this.rating, this.stars, this.outOf, this.allowFractional);
if (!this.rating) {
throw new Error('Rating is required.');
}
if (!this.outOf) {
throw new Error('Out of is required when rating is used.');
}
if (this.stars < 1) {
throw new Error('Stars cannot be less than 1.');
}
if (this.rating! > this.outOf) {
throw new Error('Rating cannot be greater than out of.');
}
}
private calculateFilledStarCount(): number {
if (this.allowFractional) {
return (this.rating! / this.outOf!) * this.stars;
}
return Math.round((this.rating! / this.outOf!) * this.stars);
}
/// Statics ///
static override styles: CSSResultArray = [
css`
:host {
display: flex;
position: relative;
}
.icon {
vertical-align: -0.125em;
flex: 0 0 1em;
height: 1em;
width: 1em;
fill: currentColor;
}
.stars {
display: flex;
color: var(--empty-star-color, #e4e5e9);
}
.stars--filled {
position: absolute;
top: 0;
left: 0;
overflow: hidden;
opacity: 1;
right: calc(100% - var(--_filled-star-width));
color: var(--filled-star-color, #f7b731);
}
`,
];
}

View File

@@ -0,0 +1,25 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
},
{
"path": "./tsconfig.spec.json"
},
{
"path": "./tsconfig.storybook.json"
}
]
}

View File

@@ -0,0 +1,10 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/out-tsc",
"declaration": true,
"types": ["node"]
},
"include": ["src/**/*.ts"],
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts", "**/*.stories.ts", "**/*.stories.js"]
}

View File

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

View File

@@ -0,0 +1,16 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"emitDecoratorMetadata": true
},
"exclude": ["src/**/*.spec.ts", "src/**/*.test.ts"],
"include": [
"src/**/*.stories.ts",
"src/**/*.stories.js",
"src/**/*.stories.jsx",
"src/**/*.stories.tsx",
"src/**/*.stories.mdx",
".storybook/*.js",
".storybook/*.ts"
]
}

View File

@@ -6,35 +6,24 @@
"targets": { "targets": {
"build": { "build": {
"executor": "@nx/js:tsc", "executor": "@nx/js:tsc",
"outputs": [ "outputs": ["{options.outputPath}"],
"{options.outputPath}"
],
"options": { "options": {
"outputPath": "dist/libs/tooltip", "outputPath": "dist/libs/tooltip",
"main": "libs/tooltip/src/index.ts", "main": "libs/tooltip/src/index.ts",
"tsConfig": "libs/tooltip/tsconfig.lib.json", "tsConfig": "libs/tooltip/tsconfig.lib.json",
"assets": [ "assets": ["libs/tooltip/*.md"]
"libs/tooltip/*.md"
]
} }
}, },
"lint": { "lint": {
"executor": "@nx/linter:eslint", "executor": "@nx/linter:eslint",
"outputs": [ "outputs": ["{options.outputFile}"],
"{options.outputFile}"
],
"options": { "options": {
"lintFilePatterns": [ "lintFilePatterns": ["libs/tooltip/**/*.ts", "libs/tooltip/package.json"]
"libs/tooltip/**/*.ts",
"libs/tooltip/package.json"
]
} }
}, },
"test": { "test": {
"executor": "@nx/vite:test", "executor": "@nx/vite:test",
"outputs": [ "outputs": ["{workspaceRoot}/coverage/libs/tooltip"],
"coverage/libs/tooltip"
],
"options": { "options": {
"passWithNoTests": true, "passWithNoTests": true,
"reportsDirectory": "../../coverage/libs/tooltip" "reportsDirectory": "../../coverage/libs/tooltip"
@@ -54,9 +43,7 @@
}, },
"build-storybook": { "build-storybook": {
"executor": "@nx/storybook:build", "executor": "@nx/storybook:build",
"outputs": [ "outputs": ["{options.outputDir}"],
"{options.outputDir}"
],
"options": { "options": {
"outputDir": "dist/storybook/tooltip", "outputDir": "dist/storybook/tooltip",
"configDir": "libs/tooltip/.storybook" "configDir": "libs/tooltip/.storybook"

View File

@@ -49,7 +49,11 @@ export const positioning = css`
export const variables = css` export const variables = css`
:host { :host {
${VariableHelper.fromProperty('--_tooltip--offset').withGroupModifier('tooltip').withVariableName('offset').withDefaultValue(0).toCss()} ${VariableHelper.fromProperty('--_tooltip--offset')
.withGroupModifier('tooltip')
.withVariableName('offset')
.withDefaultValue('0')
.toCss()}
${VariableHelper.fromProperty('--_tooltip--backdrop-color') ${VariableHelper.fromProperty('--_tooltip--backdrop-color')
.withVariableName('backdrop-color') .withVariableName('backdrop-color')
.withGroupModifier('tooltip') .withGroupModifier('tooltip')

View File

@@ -3,18 +3,8 @@
"compilerOptions": { "compilerOptions": {
"outDir": "../../dist/out-tsc", "outDir": "../../dist/out-tsc",
"declaration": true, "declaration": true,
"types": [ "types": ["node"]
"node"
]
}, },
"include": [ "include": ["src/**/*.ts"],
"src/**/*.ts" "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts", "**/*.stories.ts", "**/*.stories.js"]
],
"exclude": [
"jest.config.ts",
"src/**/*.spec.ts",
"src/**/*.test.ts",
"**/*.stories.ts",
"**/*.stories.js"
]
} }

View File

@@ -1,7 +1,6 @@
/// <reference types="vitest" /> /// <reference types="vitest" />
import { defineConfig } from 'vite';
import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'; import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
import { defineConfig } from 'vite';
export default defineConfig({ export default defineConfig({
cacheDir: '../../node_modules/.vite/tooltip', cacheDir: '../../node_modules/.vite/tooltip',
@@ -14,6 +13,7 @@ export default defineConfig({
// }, // },
test: { test: {
reporters: ['default'],
globals: true, globals: true,
cache: { cache: {
dir: '../../node_modules/.vitest', dir: '../../node_modules/.vitest',

74
migrations.json Normal file
View File

@@ -0,0 +1,74 @@
{
"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"
}
]
}

92
nx.json
View File

@@ -1,57 +1,44 @@
{ {
"$schema": "./node_modules/nx/schemas/nx-schema.json", "$schema": "./node_modules/nx/schemas/nx-schema.json",
"tasksRunnerOptions": {
"default": {
"runner": "nx/tasks-runners/default",
"options": {
"cacheableOperations": [
"build",
"lint",
"test",
"e2e",
"build-storybook"
]
}
}
},
"targetDefaults": { "targetDefaults": {
"build": { "build": {
"dependsOn": [ "dependsOn": ["^build"],
"^build" "inputs": ["production", "^production"],
], "cache": true
"inputs": [
"production",
"^production"
]
}, },
"test": { "test": {
"inputs": [ "inputs": ["default", "^production", "{workspaceRoot}/jest.preset.js"],
"default", "cache": true
"^production",
"{workspaceRoot}/jest.preset.js"
]
}, },
"lint": { "lint": {
"inputs": [ "inputs": ["default", "{workspaceRoot}/.eslintrc.json", "{workspaceRoot}/.eslintignore"],
"default", "cache": true
"{workspaceRoot}/.eslintrc.json",
"{workspaceRoot}/.eslintignore"
]
}, },
"build-storybook": { "build-storybook": {
"inputs": [ "inputs": ["default", "^production", "{projectRoot}/.storybook/**/*", "{projectRoot}/tsconfig.storybook.json"],
"default", "cache": true
"^production", },
"{projectRoot}/.storybook/**/*", "e2e": {
"{projectRoot}/tsconfig.storybook.json" "cache": true,
] "inputs": ["default", "^production"]
},
"@nx/js:tsc": {
"cache": true,
"dependsOn": ["^build"],
"inputs": ["production", "^production"]
},
"@nx/vite:test": {
"cache": true,
"inputs": ["default", "^production"]
},
"@nx/vite:build": {
"cache": true,
"dependsOn": ["^build"],
"inputs": ["production", "^production"]
} }
}, },
"namedInputs": { "namedInputs": {
"default": [ "default": ["{projectRoot}/**/*", "sharedGlobals"],
"{projectRoot}/**/*",
"sharedGlobals"
],
"production": [ "production": [
"default", "default",
"!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap)", "!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap)",
@@ -65,5 +52,26 @@
"!{projectRoot}/tsconfig.storybook.json" "!{projectRoot}/tsconfig.storybook.json"
], ],
"sharedGlobals": [] "sharedGlobals": []
} },
"useInferencePlugins": false,
"generators": {
"@nx/web:application": {
"style": "css",
"linter": "eslint",
"unitTestRunner": "jest",
"e2eTestRunner": "playwright"
}
},
"plugins": [
{
"plugin": "@nx/storybook/plugin",
"options": {
"buildStorybookTargetName": "build-storybook",
"serveStorybookTargetName": "storybook",
"staticStorybookTargetName": "static-storybook",
"testStorybookTargetName": "test-storybook"
},
"include": ["libs/reviews-stars/**/*"]
}
]
} }

View File

@@ -5,51 +5,64 @@
"scripts": {}, "scripts": {},
"private": true, "private": true,
"dependencies": { "dependencies": {
"lit": "^2.8.0", "lit": "^3.2.0",
"react": "^18.2.0", "react": "^18.3.1",
"react-dom": "^18.2.0", "react-dom": "^18.3.1",
"tslib": "^2.6.2" "tslib": "^2.6.3",
"zod": "^3.23.8"
}, },
"devDependencies": { "devDependencies": {
"@babel/plugin-proposal-decorators": "^7.22.10", "@babel/plugin-proposal-decorators": "^7.24.7",
"@nx/eslint-plugin": "16.7.4", "@nx/devkit": "19.5.7",
"@nx/jest": "16.7.4", "@nx/eslint-plugin": "19.5.7",
"@nx/js": "16.7.4", "@nx/jest": "19.5.7",
"@nx/linter": "16.7.4", "@nx/js": "19.5.7",
"@nx/storybook": "^16.7.4", "@nx/linter": "19.5.7",
"@nx/vite": "16.7.4", "@nx/playwright": "19.5.7",
"@nx/web": "^16.7.4", "@nx/storybook": "19.5.7",
"@nx/workspace": "16.7.4", "@nx/vite": "19.5.7",
"@storybook/addon-essentials": "^7.3.2", "@nx/web": "19.5.7",
"@storybook/addon-interactions": "^7.3.2", "@nx/workspace": "19.5.7",
"@storybook/core-server": "^7.3.2", "@playwright/test": "^1.46.0",
"@storybook/jest": "~0.2.1", "@storybook/addon-essentials": "8.2.8",
"@storybook/test-runner": "^0.13.0", "@storybook/addon-interactions": "8.2.8",
"@storybook/testing-library": "~0.2.0", "@storybook/core-server": "8.2.8",
"@storybook/web-components": "^7.3.2", "@storybook/jest": "0.2.3",
"@storybook/web-components-vite": "^7.3.2", "@storybook/test-runner": "0.19.1",
"@storybook/web-components-webpack5": "7.3.2", "@storybook/testing-library": "0.2.2",
"@trivago/prettier-plugin-sort-imports": "^4.2.0", "@storybook/web-components": "^8.2.8",
"@types/jest": "^29.5.4", "@storybook/web-components-vite": "8.2.8",
"@types/node": "20.5.6", "@storybook/web-components-webpack5": "8.2.8",
"@typescript-eslint/eslint-plugin": "^6.4.1", "@swc-node/register": "~1.10.9",
"@typescript-eslint/parser": "^6.4.1", "@swc/core": "~1.7.10",
"@vitest/coverage-c8": "~0.32.4", "@swc/helpers": "~0.5.12",
"@vitest/ui": "~0.34.3", "@swc/jest": "~0.2.36",
"eslint": "~8.48.0", "@trivago/prettier-plugin-sort-imports": "^4.3.0",
"eslint-config-prettier": "9.0.0", "@types/jest": "^29.5.12",
"jest": "^29.6.4", "@types/node": "22.2.0",
"jest-environment-node": "^29.6.4", "@typescript-eslint/eslint-plugin": "8.0.1",
"nx": "16.7.4", "@typescript-eslint/parser": "8.0.1",
"prettier": "^3.0.2", "@vitest/coverage-c8": "~0.33.0",
"@vitest/ui": "2.0.5",
"eslint": "9.9.0",
"eslint-config-prettier": "9.1.0",
"eslint-plugin-playwright": "^1.6.2",
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"jest-environment-node": "^29.7.0",
"jsdom": "~24.1.1",
"nx": "19.5.7",
"prettier": "^3.3.3",
"rxjs": "^7.8.1", "rxjs": "^7.8.1",
"ts-jest": "^29.1.1", "storybook": "^8.2.8",
"ts-node": "10.9.1", "swc-loader": "0.2.6",
"typescript": "~5.2.2", "ts-jest": "^29.2.4",
"verdaccio": "^5.26.1", "ts-node": "10.9.2",
"vite": "~4.4.9", "typescript": "5.5.4",
"vite-plugin-dts": "~3.5.2", "verdaccio": "^5.32.1",
"vitest": "~0.34.3" "vite": "5.4.0",
"vite-plugin-dts": "4.0.2",
"vitest": "2.0.5"
}, },
"nx": { "nx": {
"includedScripts": [] "includedScripts": []

21149
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,5 @@
{ {
"name": "@z-elements/source", "name": "@z-elements/source",
"$schema": "node_modules/nx/schemas/project-schema.json", "$schema": "node_modules/nx/schemas/project-schema.json",
"targets": { "targets": {}
}
} }

View File

@@ -10,45 +10,22 @@
"importHelpers": true, "importHelpers": true,
"target": "es2015", "target": "es2015",
"module": "esnext", "module": "esnext",
"lib": [ "lib": ["es2020", "dom"],
"es2020",
"dom"
],
"skipLibCheck": true, "skipLibCheck": true,
"skipDefaultLibCheck": true, "skipDefaultLibCheck": true,
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"@hijlkema-codes/internal/z-styles": [ "@hijlkema-codes/internal/z-styles": ["libs/_internal/styles/src/index.ts"],
"libs/_internal/styles/src/index.ts" "@hijlkema-codes/z-accordion": ["libs/accordion/src/index.ts"],
], "@z-elements/_internal/controllers": ["libs/_internal/controllers/src/index.ts"],
"@hijlkema-codes/z-accordion": [ "@z-elements/_internal/directives": ["libs/_internal/directives/src/index.ts"],
"libs/accordion/src/index.ts" "@z-elements/_internal/types": ["libs/_internal/types/src/index.ts"],
], "@z-elements/container": ["libs/container/src/index.ts"],
"@z-elements/_internal/controllers": [ "@z-elements/panels/bottom-panel": ["libs/panels/bottom-panel/src/index.ts"],
"libs/_internal/controllers/src/index.ts" "@z-elements/panels/side-panel": ["libs/panels/side-panel/src/index.ts"],
], "@z-elements/reviews-stars": ["libs/reviews-stars/src/index.ts"],
"@z-elements/_internal/directives": [ "@z-elements/tooltip": ["libs/tooltip/src/index.ts"]
"libs/_internal/directives/src/index.ts"
],
"@z-elements/_internal/types": [
"libs/_internal/types/src/index.ts"
],
"@z-elements/container": [
"libs/container/src/index.ts"
],
"@z-elements/panels/bottom-panel": [
"libs/panels/bottom-panel/src/index.ts"
],
"@z-elements/panels/side-panel": [
"libs/panels/side-panel/src/index.ts"
],
"@z-elements/tooltip": [
"libs/tooltip/src/index.ts"
]
} }
}, },
"exclude": [ "exclude": ["node_modules", "tmp"]
"node_modules",
"tmp"
]
} }