isodoodle 0.1.0 → 0.2.0
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.
- package/README.md +36 -61
- package/dist/index.d.ts +16 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -40
- package/dist/index.js.map +1 -1
- package/package.json +9 -1
package/README.md
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+

|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Draw isometric graphics with code.**
|
|
4
|
+
|
|
5
|
+
💻 <a href="https://isodoodle.netlify.app" target="_blank" rel="noopener noreferrer">**Try the online editor →**</a>
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Isodoodle generates clean, minimal SVG markup. No canvas. No WebGL. No runtime.
|
|
4
10
|
|
|
5
11
|
## Installation
|
|
6
12
|
|
|
@@ -8,19 +14,26 @@ A minimal TypeScript library for drawing SVGs on an isometric grid.
|
|
|
8
14
|
npm install isodoodle
|
|
9
15
|
```
|
|
10
16
|
|
|
11
|
-
##
|
|
17
|
+
## Quick Start
|
|
12
18
|
|
|
13
19
|
```typescript
|
|
14
20
|
import { isodoodle } from 'isodoodle';
|
|
15
21
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
.ne(2).se(2).sw(2).nw(2).close()
|
|
22
|
+
const diamond = isodoodle({ scale: 40, fill: 'teal' })
|
|
23
|
+
.ne(2).se(2).sw(2).nw(2)
|
|
19
24
|
.toSvgString();
|
|
20
25
|
|
|
21
|
-
|
|
22
|
-
document.body.innerHTML = svg;
|
|
26
|
+
document.body.innerHTML = diamond;
|
|
23
27
|
```
|
|
28
|
+
Gives:
|
|
29
|
+
|
|
30
|
+

|
|
31
|
+
|
|
32
|
+
## Isometric grid
|
|
33
|
+
|
|
34
|
+
The library uses standard coordinates for an isometric grid:
|
|
35
|
+
|
|
36
|
+

|
|
24
37
|
|
|
25
38
|
## API
|
|
26
39
|
|
|
@@ -38,6 +51,8 @@ Creates a new IsoDoodle instance.
|
|
|
38
51
|
|--------|------|---------|-------------|
|
|
39
52
|
| `scale` | number | 20 | Pixels per unit |
|
|
40
53
|
| `stroke` | string | '#000' | Stroke color |
|
|
54
|
+
| `strokeLinecap` | 'butt' \| 'round' \| 'square' | 'round' | Stroke linecap |
|
|
55
|
+
| `strokeLinejoin` | 'miter' \| 'round' \| 'bevel' | 'round' | Stroke linejoin |
|
|
41
56
|
| `strokeWidth` | number | 1 | Stroke width |
|
|
42
57
|
| `fill` | string | 'none' | Fill color |
|
|
43
58
|
| `width` | number | auto | SVG width |
|
|
@@ -57,67 +72,27 @@ All direction methods accept an optional `distance` parameter (default: 1).
|
|
|
57
72
|
|
|
58
73
|
### Path Control
|
|
59
74
|
|
|
60
|
-
- `.moveTo(x, y)` - Jump to position without drawing (in scaled units)
|
|
61
|
-
- `.close()` - Close current path
|
|
62
|
-
- `.path(options?)` - Start new path with optional style overrides
|
|
63
75
|
|
|
64
|
-
|
|
76
|
+
`moveTo(n, ne, nw)` - Jump to an absolute position without drawing using isometric coordinates: `n` (north), `ne` (northeast), and `nw` (northwest). Values are in grid units and are converted to screen pixels by the library's `scale` option.
|
|
65
77
|
|
|
66
|
-
|
|
67
|
-
- `.toElement()` - Returns SVGSVGElement (browser only)
|
|
68
|
-
- `.toPathData()` - Returns just the path `d` attribute
|
|
78
|
+
`move(n, ne, nw)` - Move relative to the current position without drawing using isometric coordinates (same coordinate order as `moveTo`).
|
|
69
79
|
|
|
70
|
-
|
|
80
|
+
Both `moveTo` and `move` accept three numeric arguments which are interpreted as counts along the isometric axes rather than direct x/y screen coordinates. For example:
|
|
81
|
+
- `move(1,0,1)` moves 1 unit north and one unit northwest
|
|
82
|
+
- `move(0,2,0)` moves 2 units northeast
|
|
83
|
+
- `move(0,-1,0)` moves 1 unit southwest (the opposite of northeast)
|
|
71
84
|
|
|
72
|
-
|
|
85
|
+
The origin (0,0,0) is where the path was started from.
|
|
73
86
|
|
|
74
|
-
|
|
75
|
-
const cube = isodoodle({ scale: 30, stroke: '#333' })
|
|
76
|
-
// Top face
|
|
77
|
-
.moveTo(0, 0)
|
|
78
|
-
.ne(2).se(2).sw(2).nw(2).close()
|
|
79
|
-
// Left face
|
|
80
|
-
.path({ fill: '#ccc' })
|
|
81
|
-
.moveTo(0, 0)
|
|
82
|
-
.nw(2).s(2).se(2).n(2).close()
|
|
83
|
-
// Right face
|
|
84
|
-
.path({ fill: '#999' })
|
|
85
|
-
.moveTo(0, 0)
|
|
86
|
-
.ne(2).s(2).sw(2).n(2).close()
|
|
87
|
-
.toSvgString();
|
|
88
|
-
```
|
|
87
|
+
`path(options?)` - Start new path with optional style overrides
|
|
89
88
|
|
|
90
|
-
###
|
|
91
|
-
|
|
92
|
-
```typescript
|
|
93
|
-
const shapes = isodoodle({ scale: 20 })
|
|
94
|
-
.ne(1).se(1).sw(1).nw(1).close()
|
|
95
|
-
.path({ stroke: 'red' })
|
|
96
|
-
.moveTo(3, 0)
|
|
97
|
-
.ne(1).se(1).sw(1).nw(1).close()
|
|
98
|
-
.toSvgString();
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
## Isometric Geometry
|
|
102
|
-
|
|
103
|
-
The library uses standard isometric projection where the X and Y axes are at 30° angles from horizontal:
|
|
89
|
+
### Output Methods
|
|
104
90
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
NW | NE
|
|
109
|
-
\ | /
|
|
110
|
-
\ | /
|
|
111
|
-
\|/
|
|
112
|
-
-------.-------
|
|
113
|
-
/|\
|
|
114
|
-
/ | \
|
|
115
|
-
/ | \
|
|
116
|
-
SW | SE
|
|
117
|
-
|
|
|
118
|
-
S
|
|
119
|
-
```
|
|
91
|
+
- `.toSvgString()` - Returns SVG markup string
|
|
92
|
+
- `.toElement()` - Returns SVGElement (browser only)
|
|
93
|
+
- `.toPathData()` - Returns just the path `d` attribute
|
|
120
94
|
|
|
121
95
|
## License
|
|
122
96
|
|
|
123
97
|
MIT
|
|
98
|
+
|
package/dist/index.d.ts
CHANGED
|
@@ -38,6 +38,10 @@ export interface IsoDoodleOptions {
|
|
|
38
38
|
scale?: number;
|
|
39
39
|
/** Stroke color (default: '#000') */
|
|
40
40
|
stroke?: string;
|
|
41
|
+
/** Stroke linecap (default: 'round') */
|
|
42
|
+
strokeLinecap?: 'butt' | 'round' | 'square';
|
|
43
|
+
/** Stroke linejoin (default: 'round') */
|
|
44
|
+
strokeLinejoin?: 'miter' | 'round' | 'bevel';
|
|
41
45
|
/** Stroke width (default: 1) */
|
|
42
46
|
strokeWidth?: number;
|
|
43
47
|
/** Fill color (default: 'none') */
|
|
@@ -51,6 +55,8 @@ export interface IsoDoodleOptions {
|
|
|
51
55
|
}
|
|
52
56
|
export interface PathOptions {
|
|
53
57
|
stroke?: string;
|
|
58
|
+
strokeLinecap?: 'butt' | 'round' | 'square';
|
|
59
|
+
strokeLinejoin?: 'miter' | 'round' | 'bevel';
|
|
54
60
|
strokeWidth?: number;
|
|
55
61
|
fill?: string;
|
|
56
62
|
}
|
|
@@ -67,24 +73,26 @@ export declare class IsoDoodle {
|
|
|
67
73
|
constructor(options?: IsoDoodleOptions);
|
|
68
74
|
private step;
|
|
69
75
|
private updateBounds;
|
|
70
|
-
/**
|
|
76
|
+
/** Draw North (up) */
|
|
71
77
|
n(distance?: number): this;
|
|
72
|
-
/**
|
|
78
|
+
/** Draw South (down) */
|
|
73
79
|
s(distance?: number): this;
|
|
74
|
-
/**
|
|
80
|
+
/** Draw Northeast */
|
|
75
81
|
ne(distance?: number): this;
|
|
76
|
-
/**
|
|
82
|
+
/** Draw Southeast */
|
|
77
83
|
se(distance?: number): this;
|
|
78
|
-
/**
|
|
84
|
+
/** Draw Southwest */
|
|
79
85
|
sw(distance?: number): this;
|
|
80
|
-
/**
|
|
86
|
+
/** Draw Northwest */
|
|
81
87
|
nw(distance?: number): this;
|
|
82
88
|
/** Jump to absolute position without drawing using isometric coordinates (n, ne, nw) */
|
|
83
89
|
moveTo(n: number, ne: number, nw: number): this;
|
|
84
90
|
/** Move relative to current position without drawing using isometric coordinates (n, ne, nw) */
|
|
85
91
|
move(n: number, ne: number, nw: number): this;
|
|
86
|
-
/**
|
|
87
|
-
|
|
92
|
+
/** Draw a line by a combined isometric offset (n, ne, nw axes; use negative values for S, SW, SE) */
|
|
93
|
+
draw(n: number, ne?: number, nw?: number): this;
|
|
94
|
+
/** Draw a line to an absolute isometric position (n, ne, nw axes; use negative values for S, SW, SE) */
|
|
95
|
+
drawTo(n: number, ne: number, nw: number): this;
|
|
88
96
|
/** Start a new path with optional style overrides */
|
|
89
97
|
path(options?: PathOptions): this;
|
|
90
98
|
private buildPathD;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,kFAAkF;AAClF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;CAOb,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,UAAU,CAAC;AAEhD,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAaD,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAGb;IACF,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,WAAW,CAAW;IAC9B,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;gBAEL,OAAO,GAAE,gBAAqB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -25,6 +25,8 @@ export class IsoDoodle {
|
|
|
25
25
|
this.options = {
|
|
26
26
|
scale: options.scale ?? 20,
|
|
27
27
|
stroke: options.stroke ?? '#000',
|
|
28
|
+
strokeLinecap: options.strokeLinecap ?? 'round',
|
|
29
|
+
strokeLinejoin: options.strokeLinejoin ?? 'round',
|
|
28
30
|
strokeWidth: options.strokeWidth ?? 1,
|
|
29
31
|
fill: options.fill ?? 'none',
|
|
30
32
|
padding: options.padding ?? 10,
|
|
@@ -35,27 +37,21 @@ export class IsoDoodle {
|
|
|
35
37
|
segments: [],
|
|
36
38
|
options: {
|
|
37
39
|
stroke: this.options.stroke,
|
|
40
|
+
strokeLinecap: this.options.strokeLinecap,
|
|
41
|
+
strokeLinejoin: this.options.strokeLinejoin,
|
|
38
42
|
strokeWidth: this.options.strokeWidth,
|
|
39
43
|
fill: this.options.fill,
|
|
40
44
|
},
|
|
41
45
|
};
|
|
42
46
|
}
|
|
43
|
-
step(direction, distance
|
|
47
|
+
step(direction, distance) {
|
|
44
48
|
const dir = DIRECTIONS[direction];
|
|
45
|
-
const dx = dir.x * distance * this.options.scale;
|
|
46
|
-
const dy = dir.y * distance * this.options.scale;
|
|
47
|
-
// Start a new path with M if this is the first segment
|
|
48
49
|
if (this.currentPath.segments.length === 0) {
|
|
49
50
|
this.currentPath.segments.push({ type: 'M', x: this.currentX, y: this.currentY });
|
|
50
51
|
}
|
|
51
|
-
this.currentX +=
|
|
52
|
-
this.currentY +=
|
|
53
|
-
|
|
54
|
-
this.currentPath.segments.push({ type: 'L', x: this.currentX, y: this.currentY });
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
this.currentPath.segments.push({ type: 'M', x: this.currentX, y: this.currentY });
|
|
58
|
-
}
|
|
52
|
+
this.currentX += dir.x * distance * this.options.scale;
|
|
53
|
+
this.currentY += dir.y * distance * this.options.scale;
|
|
54
|
+
this.currentPath.segments.push({ type: 'L', x: this.currentX, y: this.currentY });
|
|
59
55
|
this.updateBounds();
|
|
60
56
|
return this;
|
|
61
57
|
}
|
|
@@ -65,30 +61,18 @@ export class IsoDoodle {
|
|
|
65
61
|
this.minY = Math.min(this.minY, this.currentY);
|
|
66
62
|
this.maxY = Math.max(this.maxY, this.currentY);
|
|
67
63
|
}
|
|
68
|
-
/**
|
|
69
|
-
n(distance = 1) {
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
/** Move Southeast */
|
|
81
|
-
se(distance = 1) {
|
|
82
|
-
return this.step('SE', distance, true);
|
|
83
|
-
}
|
|
84
|
-
/** Move Southwest */
|
|
85
|
-
sw(distance = 1) {
|
|
86
|
-
return this.step('SW', distance, true);
|
|
87
|
-
}
|
|
88
|
-
/** Move Northwest */
|
|
89
|
-
nw(distance = 1) {
|
|
90
|
-
return this.step('NW', distance, true);
|
|
91
|
-
}
|
|
64
|
+
/** Draw North (up) */
|
|
65
|
+
n(distance = 1) { return this.step('N', distance); }
|
|
66
|
+
/** Draw South (down) */
|
|
67
|
+
s(distance = 1) { return this.step('S', distance); }
|
|
68
|
+
/** Draw Northeast */
|
|
69
|
+
ne(distance = 1) { return this.step('NE', distance); }
|
|
70
|
+
/** Draw Southeast */
|
|
71
|
+
se(distance = 1) { return this.step('SE', distance); }
|
|
72
|
+
/** Draw Southwest */
|
|
73
|
+
sw(distance = 1) { return this.step('SW', distance); }
|
|
74
|
+
/** Draw Northwest */
|
|
75
|
+
nw(distance = 1) { return this.step('NW', distance); }
|
|
92
76
|
/** Jump to absolute position without drawing using isometric coordinates (n, ne, nw) */
|
|
93
77
|
moveTo(n, ne, nw) {
|
|
94
78
|
// Calculate screen position by combining direction vectors
|
|
@@ -112,9 +96,26 @@ export class IsoDoodle {
|
|
|
112
96
|
this.updateBounds();
|
|
113
97
|
return this;
|
|
114
98
|
}
|
|
115
|
-
/**
|
|
116
|
-
|
|
117
|
-
this.currentPath.segments.
|
|
99
|
+
/** Draw a line by a combined isometric offset (n, ne, nw axes; use negative values for S, SW, SE) */
|
|
100
|
+
draw(n, ne = 0, nw = 0) {
|
|
101
|
+
if (this.currentPath.segments.length === 0) {
|
|
102
|
+
this.currentPath.segments.push({ type: 'M', x: this.currentX, y: this.currentY });
|
|
103
|
+
}
|
|
104
|
+
this.currentX += (ne - nw) * SQRT3_2 * this.options.scale;
|
|
105
|
+
this.currentY += (-n - 0.5 * (ne + nw)) * this.options.scale;
|
|
106
|
+
this.currentPath.segments.push({ type: 'L', x: this.currentX, y: this.currentY });
|
|
107
|
+
this.updateBounds();
|
|
108
|
+
return this;
|
|
109
|
+
}
|
|
110
|
+
/** Draw a line to an absolute isometric position (n, ne, nw axes; use negative values for S, SW, SE) */
|
|
111
|
+
drawTo(n, ne, nw) {
|
|
112
|
+
if (this.currentPath.segments.length === 0) {
|
|
113
|
+
this.currentPath.segments.push({ type: 'M', x: this.currentX, y: this.currentY });
|
|
114
|
+
}
|
|
115
|
+
this.currentX = (ne - nw) * SQRT3_2 * this.options.scale;
|
|
116
|
+
this.currentY = (-n - 0.5 * (ne + nw)) * this.options.scale;
|
|
117
|
+
this.currentPath.segments.push({ type: 'L', x: this.currentX, y: this.currentY });
|
|
118
|
+
this.updateBounds();
|
|
118
119
|
return this;
|
|
119
120
|
}
|
|
120
121
|
/** Start a new path with optional style overrides */
|
|
@@ -127,6 +128,8 @@ export class IsoDoodle {
|
|
|
127
128
|
segments: [],
|
|
128
129
|
options: {
|
|
129
130
|
stroke: options?.stroke ?? this.options.stroke,
|
|
131
|
+
strokeLinecap: options?.strokeLinecap ?? this.options.strokeLinecap,
|
|
132
|
+
strokeLinejoin: options?.strokeLinejoin ?? this.options.strokeLinejoin,
|
|
130
133
|
strokeWidth: options?.strokeWidth ?? this.options.strokeWidth,
|
|
131
134
|
fill: options?.fill ?? this.options.fill,
|
|
132
135
|
},
|
|
@@ -171,7 +174,7 @@ export class IsoDoodle {
|
|
|
171
174
|
x: seg.x !== undefined ? seg.x + offsetX : undefined,
|
|
172
175
|
y: seg.y !== undefined ? seg.y + offsetY : undefined,
|
|
173
176
|
})));
|
|
174
|
-
return ` <path d="${d}" stroke="${p.options.stroke}" stroke-width="${p.options.strokeWidth}" fill="${p.options.fill}" />`;
|
|
177
|
+
return ` <path d="${d}" stroke="${p.options.stroke}" stroke-linecap="${p.options.strokeLinecap}" stroke-linejoin="${p.options.strokeLinejoin}" stroke-width="${p.options.strokeWidth}" fill="${p.options.fill}" />`;
|
|
175
178
|
})
|
|
176
179
|
.join('\n');
|
|
177
180
|
return `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}">
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU;AAE5C,kFAAkF;AAClF,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACjB,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE;IAC3B,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE;IAC1B,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE;IAC3B,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE;CACpB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "isodoodle",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A minimal TypeScript library for drawing SVGs on an isometric grid",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,6 +25,14 @@
|
|
|
25
25
|
"graphics",
|
|
26
26
|
"typescript"
|
|
27
27
|
],
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/owen-lacey/isodoodle.git"
|
|
31
|
+
},
|
|
32
|
+
"homepage": "https://isodoodle.netlify.app",
|
|
33
|
+
"bugs": {
|
|
34
|
+
"url": "https://github.com/owen-lacey/isodoodle/issues"
|
|
35
|
+
},
|
|
28
36
|
"author": "owen-lacey",
|
|
29
37
|
"license": "MIT",
|
|
30
38
|
"devDependencies": {
|