@operato/contact 7.1.25 → 7.1.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,104 +0,0 @@
1
- import { html, css, LitElement, PropertyValues } from 'lit'
2
- import { customElement, property, query, state } from 'lit/decorators.js'
3
-
4
- export type Profile = {
5
- left?: number
6
- top?: number
7
- zoom?: number
8
- picture?: string
9
- file?: File
10
- }
11
-
12
- @customElement('ox-pfp-view')
13
- export class OxPfpView extends LitElement {
14
- static styles = css`
15
- :host {
16
- display: inline-block;
17
- aspect-ratio: 1 / 1;
18
-
19
- height: var(--ox-pfp-size, 100px);
20
- width: var(--ox-pfp-size, 100px);
21
- }
22
-
23
- [circle] {
24
- width: 100%;
25
- height: 100%;
26
- border-radius: 50%;
27
- position: relative;
28
- background-color: var(--md-sys-color-on-primary-container, #999);
29
-
30
- overflow: hidden;
31
- }
32
-
33
- [circle]::before {
34
- content: '';
35
- display: block;
36
- position: absolute;
37
- text-align: left;
38
- line-height: 24px;
39
- top: 0;
40
- right: 0;
41
- width: 100%;
42
- height: 100%;
43
- background-repeat: no-repeat;
44
- background-image: var(
45
- --background-image,
46
- linear-gradient(
47
- var(--md-sys-color-on-primary-container, #999),
48
- var(--md-sys-color-on-secondary-container, #666)
49
- )
50
- );
51
- transform: var(--image-transform, '');
52
- background-size: 100% 100%;
53
- }
54
-
55
- [monogram] {
56
- height: 100%;
57
- border-radius: 50%;
58
- border: 1px solid rgba(0, 0, 0, 0.1);
59
- box-sizing: border-box;
60
- padding: 0;
61
- overflow: hidden;
62
- background-color: var(--md-sys-color-primary-container, #999);
63
- color: var(--md-sys-color-on-primary-container, white);
64
-
65
- display: flex;
66
- align-items: center;
67
- justify-content: center;
68
- }
69
-
70
- [monogram] div {
71
- flex: 1;
72
- text-transform: uppercase;
73
- font-size: 1.5em;
74
- font-family: system-ui;
75
- text-align: center;
76
- }
77
- `
78
-
79
- @property({ type: Object }) profile?: Profile = {}
80
- @property({ type: String }) name?: string
81
-
82
- @query('[circle]') circle!: HTMLDivElement
83
-
84
- render() {
85
- return html`
86
- ${this.profile?.picture
87
- ? html`<div circle></div>`
88
- : html`<div monogram><div>${this.name?.replace(/\s/g, '').slice(0, 2)}</div></div>`}
89
-
90
- <slot></slot>
91
- `
92
- }
93
-
94
- updated(changes: PropertyValues<this>) {
95
- const { picture, zoom = 1, left = 0, top = 0 } = this.profile || {}
96
-
97
- if (picture) {
98
- const style = this.style
99
-
100
- style.setProperty('--background-image', `url(${picture})`)
101
- style.setProperty('--image-transform', `translate(${left}%, ${top}%) scale(${zoom}, ${zoom})`)
102
- }
103
- }
104
- }
package/src/ox-pfp.ts DELETED
@@ -1,95 +0,0 @@
1
- import '@material/web/icon/icon.js'
2
-
3
- import './ox-pfp-edit.js'
4
- import './ox-pfp-view.js'
5
-
6
- import { html, css, LitElement } from 'lit'
7
- import { customElement, property, query, state } from 'lit/decorators.js'
8
- import { Profile } from './ox-pfp-view.js'
9
- import { OxPfpEdit } from './ox-pfp-edit.js'
10
-
11
- @customElement('ox-pfp')
12
- export class OxPfp extends LitElement {
13
- static styles = css`
14
- :host {
15
- display: block;
16
- aspect-ratio: 1 / 1;
17
-
18
- height: var(--ox-pfp-size, 100px);
19
- width: var(--ox-pfp-size, 100px);
20
- }
21
-
22
- ox-pfp-edit,
23
- ox-pfp-view {
24
- position: relative;
25
- }
26
-
27
- [buttons] {
28
- position: absolute;
29
- bottom: 0;
30
- right: 0;
31
- display: flex;
32
- }
33
-
34
- md-icon {
35
- position: absolute;
36
-
37
- color: var(--md-sys-color-primary);
38
- --md-icon-size: 24px;
39
- }
40
-
41
- md-icon[icon='save'] {
42
- bottom: 0;
43
- right: 0;
44
- }
45
-
46
- md-icon[icon='edit'] {
47
- bottom: 0;
48
- right: 0;
49
- }
50
-
51
- md-icon[icon='cancel'] {
52
- top: 0;
53
- right: 0;
54
- }
55
-
56
- md-icon[icon='clear'] {
57
- bottom: 0;
58
- left: 0;
59
- }
60
- `
61
-
62
- @property({ type: Object }) profile: Profile = {}
63
- @property({ type: String }) name?: string
64
-
65
- @state() editMode?: boolean = false
66
-
67
- @query('ox-pfp-edit') edit!: OxPfpEdit
68
-
69
- render() {
70
- return this.editMode
71
- ? html`<ox-pfp-edit .profile=${this.profile} name=${this.name || ''} @dblclick=${() => this.edit.fit()}>
72
- <md-icon title="clear" icon="clear" @click=${() => this.edit.clear()}>delete</md-icon>
73
- <md-icon
74
- title="save"
75
- icon="save"
76
- @click=${() => {
77
- this.profile = this.edit.profile
78
- this.editMode = false
79
- this.dispatchEvent(
80
- new CustomEvent('change', {
81
- detail: this.profile
82
- })
83
- )
84
- }}
85
- >save</md-icon
86
- >
87
- <md-icon title="cancel" icon="cancel" @click=${() => (this.editMode = false)}>cancel</md-icon>
88
- </ox-pfp-edit> `
89
- : html`
90
- <ox-pfp-view .profile=${this.profile} name=${this.name || ''}>
91
- <md-icon title="edit" icon="edit" @click=${() => (this.editMode = true)}>edit</md-icon>
92
- </ox-pfp-view>
93
- `
94
- }
95
- }
@@ -1,169 +0,0 @@
1
- import { css, LitElement, PropertyValues } from 'lit'
2
- import { customElement, property, state } from 'lit/decorators.js'
3
-
4
- function getPoint(e: Event): { x: number; y: number } | undefined {
5
- if ((e as MouseEvent).button == 0) {
6
- return {
7
- x: (e as MouseEvent).clientX,
8
- y: (e as MouseEvent).clientY
9
- }
10
- } else if ((e as TouchEvent).touches?.length == 1) {
11
- const touch = (e as TouchEvent).touches[0]
12
- return {
13
- x: touch.clientX,
14
- y: touch.clientY
15
- }
16
- } else {
17
- return
18
- }
19
- }
20
-
21
- @customElement('ox-zoomable-image')
22
- export class OxZoomableImage extends LitElement {
23
- static styles = css`
24
- :host {
25
- display: block;
26
- position: relative;
27
- width: 100%;
28
- height: 100%;
29
- overflow: hidden;
30
- }
31
-
32
- :host::before {
33
- content: '';
34
- display: block;
35
-
36
- position: absolute;
37
- top: 0;
38
- right: 0;
39
- width: 100%;
40
- height: 100%;
41
-
42
- background-image: var(
43
- --background-image,
44
- linear-gradient(var(--primary-color, lightgray), var(--primary-color, lightgray))
45
- );
46
- transform: var(--image-transform, '');
47
- background-size: 100% 100%;
48
- }
49
- `
50
-
51
- @property({ type: String }) src?: string
52
-
53
- @state() zoom: number = 1
54
- @state() left: number = 0
55
- @state() top: number = 0
56
-
57
- private dragStart?: { x: number; y: number }
58
-
59
- private dragEndHandler = this.onDragEnd.bind(this) as EventListener
60
- private dragMoveHandler = this.onDragMove.bind(this) as EventListener
61
- private dragStartHandler = this.onDragStart.bind(this) as EventListener
62
- private wheelEventHandler = this.onWheelEvent.bind(this) as EventListener
63
- private resetHandler = this.onReset.bind(this) as EventListener
64
-
65
- connectedCallback(): void {
66
- super.connectedCallback()
67
-
68
- this.addEventListener('mousewheel', this.wheelEventHandler, false)
69
-
70
- this.addEventListener('mousedown', this.dragStartHandler)
71
- this.addEventListener('touchstart', this.dragStartHandler)
72
- this.addEventListener('dblclick', this.resetHandler)
73
-
74
- document.addEventListener('mouseup', this.dragEndHandler)
75
- document.addEventListener('touchend', this.dragEndHandler)
76
- document.addEventListener('touchcancel', this.dragEndHandler)
77
- document.addEventListener('mousemove', this.dragMoveHandler)
78
- document.addEventListener('touchmove', this.dragMoveHandler)
79
- }
80
-
81
- disconnectedCallback() {
82
- this.removeEventListener('mousewheel', this.wheelEventHandler, false)
83
-
84
- this.removeEventListener('mousedown', this.dragStartHandler!)
85
- this.removeEventListener('touchstart', this.dragStartHandler!)
86
- this.removeEventListener('dblclick', this.resetHandler!)
87
-
88
- document.removeEventListener('mouseup', this.dragEndHandler!)
89
- document.removeEventListener('touchend', this.dragEndHandler!)
90
- document.removeEventListener('touchcancel', this.dragEndHandler!)
91
- document.removeEventListener('mousemove', this.dragMoveHandler!)
92
- document.removeEventListener('touchmove', this.dragMoveHandler!)
93
-
94
- super.disconnectedCallback()
95
- }
96
-
97
- updated(changes: PropertyValues<this>) {
98
- const style = this.style
99
-
100
- if (changes.has('src') && this.src) {
101
- style.setProperty('--background-image', `url('${this.src}')`)
102
- }
103
-
104
- style.setProperty('--image-transform', `translate(${this.left}%, ${this.top}%) scale(${this.zoom}, ${this.zoom})`)
105
- }
106
-
107
- onWheelEvent(e: MouseEvent) {
108
- e.preventDefault()
109
-
110
- var delta = Math.max(-1, Math.min(1, (e as WheelEvent).deltaY || -(e as WheelEvent).detail))
111
-
112
- this.zoom *= 1 - delta / 20
113
- }
114
-
115
- onDragStart(e: Event) {
116
- const point = getPoint(e)
117
-
118
- if (point) {
119
- this.dragStart = point
120
- e.stopPropagation()
121
- return false
122
- }
123
- }
124
-
125
- onDragMove(e: Event) {
126
- if (!this.dragStart) {
127
- return false
128
- }
129
-
130
- const point = getPoint(e)
131
-
132
- if (!point) {
133
- return false
134
- }
135
-
136
- e.stopPropagation()
137
- e.preventDefault()
138
-
139
- const dragStart = point
140
- var { x, y } = point
141
-
142
- x -= this.dragStart.x
143
- y -= this.dragStart.y
144
-
145
- this.dragStart = dragStart
146
-
147
- const { offsetHeight, offsetWidth } = this
148
-
149
- this.top += (y / offsetHeight) * 100
150
- this.left += (x / offsetWidth) * 100
151
-
152
- return false
153
- }
154
-
155
- onDragEnd(e: Event) {
156
- if (this.dragStart) {
157
- e.stopPropagation()
158
- e.preventDefault()
159
-
160
- delete this.dragStart
161
- }
162
- }
163
-
164
- onReset(e: Event) {
165
- this.zoom = 1
166
- this.left = 0
167
- this.top = 0
168
- }
169
- }
@@ -1,107 +0,0 @@
1
- import { html, TemplateResult } from 'lit'
2
- import '@material/web/icon/icon.js'
3
- import '@operato/i18n'
4
- import '../src/ox-contact.js'
5
-
6
- import { Contact, ContactField } from '../src/ox-contact.js'
7
-
8
- export default {
9
- title: 'OxContact',
10
- component: 'ox-contact',
11
- argTypes: {
12
- contact: { control: 'object' }
13
- }
14
- }
15
-
16
- interface Story<T> {
17
- (args: T): TemplateResult
18
- args?: Partial<T>
19
- argTypes?: Record<string, unknown>
20
- }
21
-
22
- interface ArgTypes {
23
- contact?: Contact
24
- }
25
-
26
- const Template: Story<ArgTypes> = ({ contact }: ArgTypes) => html`
27
- <link
28
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
29
- rel="stylesheet"
30
- />
31
- <link
32
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1"
33
- rel="stylesheet"
34
- />
35
- <link
36
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
37
- rel="stylesheet"
38
- />
39
-
40
- <link href="/themes/app-theme.css" rel="stylesheet" />
41
- <link href="/themes/light.css" rel="stylesheet" />
42
- <link href="/themes/dark.css" rel="stylesheet" />
43
- <link href="/themes/spacing.css" rel="stylesheet" />
44
- <link href="/themes/grist-theme.css" rel="stylesheet" />
45
- <link href="/themes/form-theme.css" rel="stylesheet" />
46
-
47
- <style>
48
- body {
49
- background-color: var(--md-sys-color-surface);
50
- }
51
- </style>
52
-
53
- <ox-contact .contact=${contact}> </ox-contact>
54
- `
55
-
56
- export const Regular = Template.bind({})
57
- Regular.args = {
58
- contact: {
59
- note: 'abcdefg',
60
- name: '남 상혁',
61
- company: 'Hatiolab',
62
- items: [
63
- {
64
- id: '2',
65
- type: ContactField.Phone,
66
- label: 'home',
67
- value: '010-1223-3443'
68
- },
69
- {
70
- id: '3',
71
- type: ContactField.Phone,
72
- label: 'mobile',
73
- value: '010-1122-3344'
74
- },
75
- {
76
- id: '4',
77
- type: ContactField.Email,
78
- label: 'work',
79
- value: 'heartyoh@hatiolab.com'
80
- },
81
- {
82
- id: '5',
83
- type: ContactField.Email,
84
- label: 'home',
85
- value: 'shnam2k@gmail.com'
86
- },
87
- {
88
- id: '6',
89
- type: ContactField.Address,
90
- label: 'home',
91
- value: '경기도 성남시 분당구 123'
92
- },
93
- {
94
- id: '7',
95
- type: ContactField.Address,
96
- label: 'work',
97
- value: '경기도 성남시 분당구 234'
98
- },
99
- {
100
- id: '8',
101
- type: ContactField.Address,
102
- label: 'work',
103
- value: '서울특별시 종로구 123'
104
- }
105
- ]
106
- }
107
- }
@@ -1,71 +0,0 @@
1
- import { html, TemplateResult } from 'lit'
2
- import '@material/web/icon/icon.js'
3
- import '@operato/i18n'
4
- import '../src/ox-pfp.js'
5
-
6
- import { Profile } from '../src/ox-pfp-view.js'
7
-
8
- export default {
9
- title: 'OxPfp',
10
- component: 'ox-pfp',
11
- argTypes: {
12
- name: { control: 'string' },
13
- profile: { control: 'object' }
14
- }
15
- }
16
-
17
- interface Story<T> {
18
- (args: T): TemplateResult
19
- args?: Partial<T>
20
- argTypes?: Record<string, unknown>
21
- }
22
-
23
- interface ArgTypes {
24
- name?: string
25
- profile?: Profile
26
- }
27
-
28
- const Template: Story<ArgTypes> = ({ profile, name }: ArgTypes) => html`
29
- <link
30
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
31
- rel="stylesheet"
32
- />
33
- <link
34
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1"
35
- rel="stylesheet"
36
- />
37
- <link
38
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
39
- rel="stylesheet"
40
- />
41
-
42
- <link href="/themes/app-theme.css" rel="stylesheet" />
43
- <link href="/themes/light.css" rel="stylesheet" />
44
- <link href="/themes/dark.css" rel="stylesheet" />
45
- <link href="/themes/spacing.css" rel="stylesheet" />
46
- <link href="/themes/grist-theme.css" rel="stylesheet" />
47
- <link href="/themes/form-theme.css" rel="stylesheet" />
48
-
49
- <style>
50
- body {
51
- }
52
-
53
- ox-pfp {
54
- --ox-pfp-size: 300px;
55
- }
56
- </style>
57
-
58
- <ox-pfp .profile=${profile} .name=${name}> </ox-pfp>
59
- `
60
-
61
- export const Regular = Template.bind({})
62
- Regular.args = {
63
- name: 'heartyoh',
64
- profile: {
65
- left: 0,
66
- top: 0,
67
- zoom: 1,
68
- picture:
69
- 'data:image/jpeg;base64,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'
70
- }
71
- }
@@ -1,40 +0,0 @@
1
- import '@operato/i18n'
2
- import '../src/ox-zoomable-image.js'
3
-
4
- import { html, TemplateResult } from 'lit'
5
-
6
- export default {
7
- title: 'ox-zoomable-image',
8
- component: 'ox-zoomable-image',
9
- argTypes: {
10
- src: { control: 'text' }
11
- }
12
- }
13
-
14
- interface Story<T> {
15
- (args: T): TemplateResult
16
- args?: Partial<T>
17
- argTypes?: Record<string, unknown>
18
- }
19
-
20
- interface ArgTypes {
21
- src?: string
22
- }
23
-
24
- const Template: Story<ArgTypes> = ({ src = '' }: ArgTypes) => html`
25
- <link href="/themes/app-theme.css" rel="stylesheet" />
26
- <link href="/themes/light.css" rel="stylesheet" />
27
- <link href="/themes/dark.css" rel="stylesheet" />
28
- <link href="/themes/spacing.css" rel="stylesheet" />
29
- <link href="/themes/grist-theme.css" rel="stylesheet" />
30
- <link href="/themes/form-theme.css" rel="stylesheet" />
31
-
32
- <div style="height: 300px">
33
- <ox-zoomable-image src=${src} style="width: 300px; height: 300px"> </ox-zoomable-image>
34
- </div>
35
- `
36
-
37
- export const Regular = Template.bind({})
38
- Regular.args = {
39
- src: '/assets/sample-image.png'
40
- }
package/tsconfig.json DELETED
@@ -1,24 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "es2018",
4
- "module": "esnext",
5
- "moduleResolution": "node",
6
- "noEmitOnError": true,
7
- "lib": ["es2017", "dom"],
8
- "strict": true,
9
- "esModuleInterop": false,
10
- "allowSyntheticDefaultImports": true,
11
- "experimentalDecorators": true,
12
- "useDefineForClassFields": false,
13
- "importHelpers": true,
14
- "outDir": "dist",
15
- "sourceMap": true,
16
- "inlineSources": true,
17
- "rootDir": "./",
18
- "declaration": true,
19
- "incremental": true,
20
- "skipLibCheck": true,
21
- "types": ["node", "mocha"]
22
- },
23
- "include": ["**/*.ts"]
24
- }
@@ -1,27 +0,0 @@
1
- // import { hmrPlugin, presets } from '@open-wc/dev-server-hmr';
2
-
3
- /** Use Hot Module replacement by adding --hmr to the start command */
4
- const hmr = process.argv.includes('--hmr');
5
-
6
- export default /** @type {import('@web/dev-server').DevServerConfig} */ ({
7
- open: '/demo/',
8
- /** Use regular watch mode if HMR is not enabled. */
9
- watch: !hmr,
10
- /** Resolve bare module imports */
11
- nodeResolve: {
12
- exportConditions: ['browser', 'development'],
13
- },
14
-
15
- /** Compile JS for older browsers. Requires @web/dev-server-esbuild plugin */
16
- // esbuildTarget: 'auto'
17
-
18
- /** Set appIndex to enable SPA routing */
19
- // appIndex: 'demo/index.html',
20
-
21
- plugins: [
22
- /** Use Hot Module Replacement by uncommenting. Requires @open-wc/dev-server-hmr plugin */
23
- // hmr && hmrPlugin({ exclude: ['**/*/node_modules/**/*'], presets: [presets.litElement] }),
24
- ],
25
-
26
- // See documentation for all available options
27
- });