init with create-stencil v3.5.6
This commit is contained in:
commit
6e34a0892f
15
.editorconfig
Normal file
15
.editorconfig
Normal file
@ -0,0 +1,15 @@
|
||||
# http://editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
insert_final_newline = false
|
||||
trim_trailing_whitespace = false
|
||||
26
.gitignore
vendored
Normal file
26
.gitignore
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
dist/
|
||||
www/
|
||||
loader/
|
||||
|
||||
*~
|
||||
*.sw[mnpcod]
|
||||
*.log
|
||||
*.lock
|
||||
*.tmp
|
||||
*.tmp.*
|
||||
log.txt
|
||||
*.sublime-project
|
||||
*.sublime-workspace
|
||||
|
||||
.stencil/
|
||||
.idea/
|
||||
.vscode/
|
||||
.sass-cache/
|
||||
.versions/
|
||||
node_modules/
|
||||
$RECYCLE.BIN/
|
||||
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
UserInterfaceState.xcuserstate
|
||||
.env
|
||||
13
.prettierrc.json
Normal file
13
.prettierrc.json
Normal file
@ -0,0 +1,13 @@
|
||||
{
|
||||
"arrowParens": "avoid",
|
||||
"bracketSpacing": true,
|
||||
"jsxBracketSameLine": false,
|
||||
"jsxSingleQuote": false,
|
||||
"quoteProps": "consistent",
|
||||
"printWidth": 180,
|
||||
"semi": true,
|
||||
"singleQuote": true,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "all",
|
||||
"useTabs": false
|
||||
}
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
50
package.json
Normal file
50
package.json
Normal file
@ -0,0 +1,50 @@
|
||||
{
|
||||
"name": "advancetextbox",
|
||||
"version": "0.0.1",
|
||||
"description": "Stencil Component Starter",
|
||||
"main": "dist/index.cjs.js",
|
||||
"module": "dist/index.js",
|
||||
"types": "dist/types/index.d.ts",
|
||||
"collection": "dist/collection/collection-manifest.json",
|
||||
"collection:main": "dist/collection/index.js",
|
||||
"unpkg": "dist/advancetextbox/advancetextbox.esm.js",
|
||||
"exports": {
|
||||
".": {
|
||||
"import": "./dist/advancetextbox/advancetextbox.esm.js",
|
||||
"require": "./dist/advancetextbox/advancetextbox.cjs.js"
|
||||
},
|
||||
"./my-component": {
|
||||
"import": "./dist/components/my-component.js",
|
||||
"types": "./dist/components/my-component.d.ts"
|
||||
},
|
||||
"./loader": {
|
||||
"import": "./loader/index.js",
|
||||
"require": "./loader/index.cjs",
|
||||
"types": "./loader/index.d.ts"
|
||||
}
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/ionic-team/stencil-component-starter.git"
|
||||
},
|
||||
"files": [
|
||||
"dist/",
|
||||
"loader/"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "stencil build",
|
||||
"start": "stencil build --dev --watch --serve",
|
||||
"test": "stencil test --spec --e2e",
|
||||
"test.watch": "stencil test --spec --e2e --watchAll",
|
||||
"generate": "stencil generate"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@stencil/core": "^4.7.0",
|
||||
"@types/jest": "^29.5.6",
|
||||
"@types/node": "^16.18.11",
|
||||
"jest": "^29.7.0",
|
||||
"jest-cli": "^29.7.0",
|
||||
"puppeteer": "^21.9.0"
|
||||
},
|
||||
"license": "MIT"
|
||||
}
|
||||
115
readme.md
Normal file
115
readme.md
Normal file
@ -0,0 +1,115 @@
|
||||
[](https://stenciljs.com)
|
||||
|
||||
# Stencil Component Starter
|
||||
|
||||
This is a starter project for building a standalone Web Component using Stencil.
|
||||
|
||||
Stencil is also great for building entire apps. For that, use the [stencil-app-starter](https://github.com/ionic-team/stencil-app-starter) instead.
|
||||
|
||||
# Stencil
|
||||
|
||||
Stencil is a compiler for building fast web apps using Web Components.
|
||||
|
||||
Stencil combines the best concepts of the most popular frontend frameworks into a compile-time rather than runtime tool. Stencil takes TypeScript, JSX, a tiny virtual DOM layer, efficient one-way data binding, an asynchronous rendering pipeline (similar to React Fiber), and lazy-loading out of the box, and generates 100% standards-based Web Components that run in any browser supporting the Custom Elements v1 spec.
|
||||
|
||||
Stencil components are just Web Components, so they work in any major framework or with no framework at all.
|
||||
|
||||
## Getting Started
|
||||
|
||||
To start building a new web component using Stencil, clone this repo to a new directory:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/ionic-team/stencil-component-starter.git my-component
|
||||
cd my-component
|
||||
git remote rm origin
|
||||
```
|
||||
|
||||
and run:
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm start
|
||||
```
|
||||
|
||||
To build the component for production, run:
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
To run the unit tests for the components, run:
|
||||
|
||||
```bash
|
||||
npm test
|
||||
```
|
||||
|
||||
Need help? Check out our docs [here](https://stenciljs.com/docs/my-first-component).
|
||||
|
||||
## Naming Components
|
||||
|
||||
When creating new component tags, we recommend _not_ using `stencil` in the component name (ex: `<stencil-datepicker>`). This is because the generated component has little to nothing to do with Stencil; it's just a web component!
|
||||
|
||||
Instead, use a prefix that fits your company or any name for a group of related components. For example, all of the Ionic-generated web components use the prefix `ion`.
|
||||
|
||||
## Using this component
|
||||
|
||||
There are two strategies we recommend for using web components built with Stencil.
|
||||
|
||||
The first step for all two of these strategies is to [publish to NPM](https://docs.npmjs.com/getting-started/publishing-npm-packages).
|
||||
|
||||
You can read more about these different approaches in the [Stencil docs](https://stenciljs.com/docs/publishing).
|
||||
|
||||
### Lazy Loading
|
||||
|
||||
If your Stencil project is built with the [`dist`](https://stenciljs.com/docs/distribution) output target, you can import a small bootstrap script that registers all components and allows you to load individual component scripts lazily.
|
||||
|
||||
For example, given your Stencil project namespace is called `my-design-system`, to use `my-component` on any website, inject this into your HTML:
|
||||
|
||||
```html
|
||||
<script type="module" src="https://unpkg.com/my-design-system"></script>
|
||||
<!--
|
||||
To avoid unpkg.com redirects to the actual file, you can also directly import:
|
||||
https://unpkg.com/foobar-design-system@0.0.1/dist/foobar-design-system/foobar-design-system.esm.js
|
||||
-->
|
||||
<my-component first="Stencil" middle="'Don't call me a framework'" last="JS"></my-component>
|
||||
```
|
||||
|
||||
This will only load the necessary scripts needed to render `<my-component />`. Once more components of this package are used, they will automatically be loaded lazily.
|
||||
|
||||
You can also import the script as part of your `node_modules` in your applications entry file:
|
||||
|
||||
```tsx
|
||||
import 'foobar-design-system/dist/foobar-design-system/foobar-design-system.esm.js';
|
||||
```
|
||||
|
||||
Check out this [Live Demo](https://stackblitz.com/edit/vitejs-vite-y6v26a?file=src%2Fmain.tsx).
|
||||
|
||||
### Standalone
|
||||
|
||||
If you are using a Stencil component library with `dist-custom-elements`, we recommend importing Stencil components individually in those files where they are needed.
|
||||
|
||||
To export Stencil components as standalone components make sure you have the [`dist-custom-elements`](https://stenciljs.com/docs/custom-elements) output target defined in your `stencil.config.ts`.
|
||||
|
||||
For example, given you'd like to use `<my-component />` as part of a React component, you can import the component directly via:
|
||||
|
||||
```tsx
|
||||
import 'foobar-design-system/my-component';
|
||||
|
||||
function App() {
|
||||
return (
|
||||
<>
|
||||
<div>
|
||||
<my-component
|
||||
first="Stencil"
|
||||
middle="'Don't call me a framework'"
|
||||
last="JS"
|
||||
></my-component>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export default App;
|
||||
```
|
||||
|
||||
Check out this [Live Demo](https://stackblitz.com/edit/vitejs-vite-b6zuds?file=src%2FApp.tsx).
|
||||
61
src/components.d.ts
vendored
Normal file
61
src/components.d.ts
vendored
Normal file
@ -0,0 +1,61 @@
|
||||
/* eslint-disable */
|
||||
/* tslint:disable */
|
||||
/**
|
||||
* This is an autogenerated file created by the Stencil compiler.
|
||||
* It contains typing information for all components that exist in this project.
|
||||
*/
|
||||
import { HTMLStencilElement, JSXBase } from "@stencil/core/internal";
|
||||
export namespace Components {
|
||||
interface MyComponent {
|
||||
/**
|
||||
* The first name
|
||||
*/
|
||||
"first": string;
|
||||
/**
|
||||
* The last name
|
||||
*/
|
||||
"last": string;
|
||||
/**
|
||||
* The middle name
|
||||
*/
|
||||
"middle": string;
|
||||
}
|
||||
}
|
||||
declare global {
|
||||
interface HTMLMyComponentElement extends Components.MyComponent, HTMLStencilElement {
|
||||
}
|
||||
var HTMLMyComponentElement: {
|
||||
prototype: HTMLMyComponentElement;
|
||||
new (): HTMLMyComponentElement;
|
||||
};
|
||||
interface HTMLElementTagNameMap {
|
||||
"my-component": HTMLMyComponentElement;
|
||||
}
|
||||
}
|
||||
declare namespace LocalJSX {
|
||||
interface MyComponent {
|
||||
/**
|
||||
* The first name
|
||||
*/
|
||||
"first"?: string;
|
||||
/**
|
||||
* The last name
|
||||
*/
|
||||
"last"?: string;
|
||||
/**
|
||||
* The middle name
|
||||
*/
|
||||
"middle"?: string;
|
||||
}
|
||||
interface IntrinsicElements {
|
||||
"my-component": MyComponent;
|
||||
}
|
||||
}
|
||||
export { LocalJSX as JSX };
|
||||
declare module "@stencil/core" {
|
||||
export namespace JSX {
|
||||
interface IntrinsicElements {
|
||||
"my-component": LocalJSX.MyComponent & JSXBase.HTMLAttributes<HTMLMyComponentElement>;
|
||||
}
|
||||
}
|
||||
}
|
||||
3
src/components/my-component/my-component.css
Normal file
3
src/components/my-component/my-component.css
Normal file
@ -0,0 +1,3 @@
|
||||
:host {
|
||||
display: block;
|
||||
}
|
||||
32
src/components/my-component/my-component.e2e.ts
Normal file
32
src/components/my-component/my-component.e2e.ts
Normal file
@ -0,0 +1,32 @@
|
||||
import { newE2EPage } from '@stencil/core/testing';
|
||||
|
||||
describe('my-component', () => {
|
||||
it('renders', async () => {
|
||||
const page = await newE2EPage();
|
||||
|
||||
await page.setContent('<my-component></my-component>');
|
||||
const element = await page.find('my-component');
|
||||
expect(element).toHaveClass('hydrated');
|
||||
});
|
||||
|
||||
it('renders changes to the name data', async () => {
|
||||
const page = await newE2EPage();
|
||||
|
||||
await page.setContent('<my-component></my-component>');
|
||||
const component = await page.find('my-component');
|
||||
const element = await page.find('my-component >>> div');
|
||||
expect(element.textContent).toEqual(`Hello, World! I'm `);
|
||||
|
||||
component.setProperty('first', 'James');
|
||||
await page.waitForChanges();
|
||||
expect(element.textContent).toEqual(`Hello, World! I'm James`);
|
||||
|
||||
component.setProperty('last', 'Quincy');
|
||||
await page.waitForChanges();
|
||||
expect(element.textContent).toEqual(`Hello, World! I'm James Quincy`);
|
||||
|
||||
component.setProperty('middle', 'Earl');
|
||||
await page.waitForChanges();
|
||||
expect(element.textContent).toEqual(`Hello, World! I'm James Earl Quincy`);
|
||||
});
|
||||
});
|
||||
36
src/components/my-component/my-component.spec.ts
Normal file
36
src/components/my-component/my-component.spec.ts
Normal file
@ -0,0 +1,36 @@
|
||||
import { newSpecPage } from '@stencil/core/testing';
|
||||
import { MyComponent } from './my-component';
|
||||
|
||||
describe('my-component', () => {
|
||||
it('renders', async () => {
|
||||
const { root } = await newSpecPage({
|
||||
components: [MyComponent],
|
||||
html: '<my-component></my-component>',
|
||||
});
|
||||
expect(root).toEqualHtml(`
|
||||
<my-component>
|
||||
<mock:shadow-root>
|
||||
<div>
|
||||
Hello, World! I'm
|
||||
</div>
|
||||
</mock:shadow-root>
|
||||
</my-component>
|
||||
`);
|
||||
});
|
||||
|
||||
it('renders with values', async () => {
|
||||
const { root } = await newSpecPage({
|
||||
components: [MyComponent],
|
||||
html: `<my-component first="Stencil" middle="'Don't call me a framework'" last="JS"></my-component>`,
|
||||
});
|
||||
expect(root).toEqualHtml(`
|
||||
<my-component first="Stencil" middle="'Don't call me a framework'" last="JS">
|
||||
<mock:shadow-root>
|
||||
<div>
|
||||
Hello, World! I'm Stencil 'Don't call me a framework' JS
|
||||
</div>
|
||||
</mock:shadow-root>
|
||||
</my-component>
|
||||
`);
|
||||
});
|
||||
});
|
||||
32
src/components/my-component/my-component.tsx
Normal file
32
src/components/my-component/my-component.tsx
Normal file
@ -0,0 +1,32 @@
|
||||
import { Component, Prop, h } from '@stencil/core';
|
||||
import { format } from '../../utils/utils';
|
||||
|
||||
@Component({
|
||||
tag: 'my-component',
|
||||
styleUrl: 'my-component.css',
|
||||
shadow: true,
|
||||
})
|
||||
export class MyComponent {
|
||||
/**
|
||||
* The first name
|
||||
*/
|
||||
@Prop() first: string;
|
||||
|
||||
/**
|
||||
* The middle name
|
||||
*/
|
||||
@Prop() middle: string;
|
||||
|
||||
/**
|
||||
* The last name
|
||||
*/
|
||||
@Prop() last: string;
|
||||
|
||||
private getText(): string {
|
||||
return format(this.first, this.middle, this.last);
|
||||
}
|
||||
|
||||
render() {
|
||||
return <div>Hello, World! I'm {this.getText()}</div>;
|
||||
}
|
||||
}
|
||||
19
src/components/my-component/readme.md
Normal file
19
src/components/my-component/readme.md
Normal file
@ -0,0 +1,19 @@
|
||||
# my-component
|
||||
|
||||
|
||||
|
||||
<!-- Auto Generated Below -->
|
||||
|
||||
|
||||
## Properties
|
||||
|
||||
| Property | Attribute | Description | Type | Default |
|
||||
| -------- | --------- | --------------- | -------- | ----------- |
|
||||
| `first` | `first` | The first name | `string` | `undefined` |
|
||||
| `last` | `last` | The last name | `string` | `undefined` |
|
||||
| `middle` | `middle` | The middle name | `string` | `undefined` |
|
||||
|
||||
|
||||
----------------------------------------------
|
||||
|
||||
*Built with [StencilJS](https://stenciljs.com/)*
|
||||
14
src/index.html
Normal file
14
src/index.html
Normal file
@ -0,0 +1,14 @@
|
||||
<!DOCTYPE html>
|
||||
<html dir="ltr" lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=5.0" />
|
||||
<title>Stencil Component Starter</title>
|
||||
|
||||
<script type="module" src="/build/advancetextbox.esm.js"></script>
|
||||
<script nomodule src="/build/advancetextbox.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<my-component first="Stencil" middle="'Don't call me a framework'" last="JS"></my-component>
|
||||
</body>
|
||||
</html>
|
||||
12
src/index.ts
Normal file
12
src/index.ts
Normal file
@ -0,0 +1,12 @@
|
||||
/**
|
||||
* @fileoverview entry point for your component library
|
||||
*
|
||||
* This is the entry point for your component library. Use this file to export utilities,
|
||||
* constants or data structure that accompany your components.
|
||||
*
|
||||
* DO NOT use this file to export your components. Instead, use the recommended approaches
|
||||
* to consume components of this package as outlined in the `README.md`.
|
||||
*/
|
||||
|
||||
export { format } from './utils/utils';
|
||||
export type * from './components.d.ts';
|
||||
19
src/utils/utils.spec.ts
Normal file
19
src/utils/utils.spec.ts
Normal file
@ -0,0 +1,19 @@
|
||||
import { format } from './utils';
|
||||
|
||||
describe('format', () => {
|
||||
it('returns empty string for no names defined', () => {
|
||||
expect(format(undefined, undefined, undefined)).toEqual('');
|
||||
});
|
||||
|
||||
it('formats just first names', () => {
|
||||
expect(format('Joseph', undefined, undefined)).toEqual('Joseph');
|
||||
});
|
||||
|
||||
it('formats first and last names', () => {
|
||||
expect(format('Joseph', undefined, 'Publique')).toEqual('Joseph Publique');
|
||||
});
|
||||
|
||||
it('formats first, middle and last names', () => {
|
||||
expect(format('Joseph', 'Quincy', 'Publique')).toEqual('Joseph Quincy Publique');
|
||||
});
|
||||
});
|
||||
3
src/utils/utils.ts
Normal file
3
src/utils/utils.ts
Normal file
@ -0,0 +1,3 @@
|
||||
export function format(first?: string, middle?: string, last?: string): string {
|
||||
return (first || '') + (middle ? ` ${middle}` : '') + (last ? ` ${last}` : '');
|
||||
}
|
||||
26
stencil.config.ts
Normal file
26
stencil.config.ts
Normal file
@ -0,0 +1,26 @@
|
||||
import { Config } from '@stencil/core';
|
||||
|
||||
export const config: Config = {
|
||||
namespace: 'advancetextbox',
|
||||
outputTargets: [
|
||||
{
|
||||
type: 'dist',
|
||||
esmLoaderPath: '../loader',
|
||||
},
|
||||
{
|
||||
type: 'dist-custom-elements',
|
||||
customElementsExportBehavior: 'auto-define-custom-elements',
|
||||
externalRuntime: false,
|
||||
},
|
||||
{
|
||||
type: 'docs-readme',
|
||||
},
|
||||
{
|
||||
type: 'www',
|
||||
serviceWorker: null, // disable service workers
|
||||
},
|
||||
],
|
||||
testing: {
|
||||
browserHeadless: "new",
|
||||
},
|
||||
};
|
||||
25
tsconfig.json
Normal file
25
tsconfig.json
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"allowUnreachableCode": false,
|
||||
"declaration": false,
|
||||
"experimentalDecorators": true,
|
||||
"lib": [
|
||||
"dom",
|
||||
"es2017"
|
||||
],
|
||||
"moduleResolution": "node",
|
||||
"module": "esnext",
|
||||
"target": "es2017",
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"jsx": "react",
|
||||
"jsxFactory": "h"
|
||||
},
|
||||
"include": [
|
||||
"src"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
]
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user