@alikhalilll/a-skeleton 1.1.0 → 1.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/.media/hero.png +0 -0
- package/.media/hero.svg +232 -0
- package/README.md +458 -172
- package/dist/index.cjs +3685 -840
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +527 -40
- package/dist/index.d.ts +527 -40
- package/dist/index.js +3666 -842
- package/dist/index.js.map +1 -1
- package/dist/nuxt/index.cjs +16 -1
- package/dist/nuxt/index.cjs.map +1 -1
- package/dist/nuxt/index.js +16 -1
- package/dist/nuxt/index.js.map +1 -1
- package/dist/resolver/index.cjs +16 -1
- package/dist/resolver/index.cjs.map +1 -1
- package/dist/resolver/index.js +16 -1
- package/dist/resolver/index.js.map +1 -1
- package/dist/styles.css +56 -11
- package/package.json +8 -2
- package/src/components/ASkeleton.vue +212 -113
- package/src/components/ASkeletonClone.vue +106 -0
- package/src/components/ASkeletonLayer.vue +20 -32
- package/src/components/CloneNode.ts +161 -0
- package/src/components/StructuralLayerNode.ts +157 -0
- package/src/components/icons.ts +45 -0
- package/src/components/variants/ASkeletonArticle.vue +33 -0
- package/src/components/variants/ASkeletonAvatar.vue +42 -0
- package/src/components/variants/ASkeletonButton.vue +37 -0
- package/src/components/variants/ASkeletonCard.vue +47 -0
- package/src/components/variants/ASkeletonChart.vue +56 -0
- package/src/components/variants/ASkeletonChip.vue +32 -0
- package/src/components/variants/ASkeletonDivider.vue +26 -0
- package/src/components/variants/ASkeletonForm.vue +32 -0
- package/src/components/variants/ASkeletonHeading.vue +47 -0
- package/src/components/variants/ASkeletonImage.vue +57 -0
- package/src/components/variants/ASkeletonInput.vue +33 -0
- package/src/components/variants/ASkeletonListItem.vue +40 -0
- package/src/components/variants/ASkeletonTable.vue +49 -0
- package/src/components/variants/ASkeletonText.vue +49 -0
- package/src/components/variants/ASkeletonVideo.vue +55 -0
- package/src/composables/useShapeProbe.ts +33 -9
- package/src/composables/useSkeleton.ts +33 -21
- package/src/composables/useSkeletonCache.ts +251 -22
- package/src/index.ts +48 -2
- package/src/nuxt/index.ts +16 -0
- package/src/resolver/index.ts +16 -0
- package/src/types.ts +118 -2
- package/src/utils/buildStructuralSkeleton.ts +400 -103
- package/src/utils/captureStyles.ts +378 -0
- package/src/utils/domRead.ts +143 -0
- package/src/utils/walkDom.ts +261 -16
- package/src/utils/walkStructural.ts +418 -0
- package/web-types.json +9 -3
package/.media/hero.png
ADDED
|
Binary file
|
package/.media/hero.svg
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1718 1160" width="1718" height="1160" role="img" aria-label="ASkeleton — a real profile card on the left transforms into its shimmering skeleton replica on the right, layered with a stack of variant primitives at the bottom">
|
|
2
|
+
<defs>
|
|
3
|
+
<!-- Backdrop — same purple family as ATelInput hero. -->
|
|
4
|
+
<radialGradient id="bg" cx="50%" cy="32%" r="78%">
|
|
5
|
+
<stop offset="0%" stop-color="#3f2167"/>
|
|
6
|
+
<stop offset="55%" stop-color="#28153f"/>
|
|
7
|
+
<stop offset="100%" stop-color="#0a0410"/>
|
|
8
|
+
</radialGradient>
|
|
9
|
+
|
|
10
|
+
<radialGradient id="cardSurface" cx="50%" cy="0%" r="100%">
|
|
11
|
+
<stop offset="0%" stop-color="#1d142b"/>
|
|
12
|
+
<stop offset="100%" stop-color="#10081a"/>
|
|
13
|
+
</radialGradient>
|
|
14
|
+
|
|
15
|
+
<linearGradient id="cardOutline" x1="50%" y1="0%" x2="50%" y2="100%">
|
|
16
|
+
<stop offset="0%" stop-color="#3a2a5a" stop-opacity="0.9"/>
|
|
17
|
+
<stop offset="100%" stop-color="#1f1638" stop-opacity="0.4"/>
|
|
18
|
+
</linearGradient>
|
|
19
|
+
|
|
20
|
+
<!-- Shimmer bar gradients — animated feel via two-stop highlight. -->
|
|
21
|
+
<linearGradient id="shimmer" x1="0%" y1="50%" x2="100%" y2="50%">
|
|
22
|
+
<stop offset="0%" stop-color="#3a4458"/>
|
|
23
|
+
<stop offset="50%" stop-color="#7c89a8"/>
|
|
24
|
+
<stop offset="100%" stop-color="#3a4458"/>
|
|
25
|
+
</linearGradient>
|
|
26
|
+
|
|
27
|
+
<linearGradient id="shimmerWarm" x1="0%" y1="50%" x2="100%" y2="50%">
|
|
28
|
+
<stop offset="0%" stop-color="#4a3f5e"/>
|
|
29
|
+
<stop offset="50%" stop-color="#a78bfa"/>
|
|
30
|
+
<stop offset="100%" stop-color="#4a3f5e"/>
|
|
31
|
+
</linearGradient>
|
|
32
|
+
|
|
33
|
+
<linearGradient id="shimmerLight" x1="0%" y1="50%" x2="100%" y2="50%">
|
|
34
|
+
<stop offset="0%" stop-color="#525d7a"/>
|
|
35
|
+
<stop offset="50%" stop-color="#9aa6c0"/>
|
|
36
|
+
<stop offset="100%" stop-color="#525d7a"/>
|
|
37
|
+
</linearGradient>
|
|
38
|
+
|
|
39
|
+
<!-- Card glow + shadow. -->
|
|
40
|
+
<filter id="cardShadow" x="-20%" y="-20%" width="140%" height="140%">
|
|
41
|
+
<feGaussianBlur in="SourceAlpha" stdDeviation="20"/>
|
|
42
|
+
<feOffset dy="30"/>
|
|
43
|
+
<feComponentTransfer><feFuncA type="linear" slope="0.50"/></feComponentTransfer>
|
|
44
|
+
<feMerge>
|
|
45
|
+
<feMergeNode/>
|
|
46
|
+
<feMergeNode in="SourceGraphic"/>
|
|
47
|
+
</feMerge>
|
|
48
|
+
</filter>
|
|
49
|
+
|
|
50
|
+
<filter id="glow" x="-50%" y="-50%" width="200%" height="200%">
|
|
51
|
+
<feGaussianBlur stdDeviation="30"/>
|
|
52
|
+
</filter>
|
|
53
|
+
|
|
54
|
+
<!-- Arrow tip. -->
|
|
55
|
+
<marker id="arrowTip" viewBox="0 0 10 10" refX="6" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
|
|
56
|
+
<path d="M 0 0 L 10 5 L 0 10 z" fill="#c4b5fd"/>
|
|
57
|
+
</marker>
|
|
58
|
+
</defs>
|
|
59
|
+
|
|
60
|
+
<!-- Background -->
|
|
61
|
+
<rect width="1718" height="1160" fill="url(#bg)"/>
|
|
62
|
+
|
|
63
|
+
<!-- Decorative glow accents -->
|
|
64
|
+
<circle cx="200" cy="280" r="180" fill="#7c3aed" opacity="0.18" filter="url(#glow)"/>
|
|
65
|
+
<circle cx="1518" cy="320" r="220" fill="#a78bfa" opacity="0.15" filter="url(#glow)"/>
|
|
66
|
+
<circle cx="859" cy="900" r="260" fill="#10b981" opacity="0.10" filter="url(#glow)"/>
|
|
67
|
+
|
|
68
|
+
<!-- ============================================================ -->
|
|
69
|
+
<!-- TITLE BLOCK -->
|
|
70
|
+
<!-- ============================================================ -->
|
|
71
|
+
<g transform="translate(859, 110)">
|
|
72
|
+
<rect x="-185" y="-30" width="370" height="40" rx="20" fill="#a78bfa" fill-opacity="0.10" stroke="#a78bfa" stroke-opacity="0.35" stroke-width="1.5"/>
|
|
73
|
+
<text x="0" y="-3" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="14" fill="#c4b5fd" text-anchor="middle" letter-spacing="0.22em" font-weight="700">@ALIKHALILLL / A-SKELETON</text>
|
|
74
|
+
|
|
75
|
+
<text x="0" y="68" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="52" fill="#f4f3f8" text-anchor="middle" font-weight="700" letter-spacing="-0.02em">A self-generating skeleton loader</text>
|
|
76
|
+
<text x="0" y="124" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="24" fill="#a09bb8" text-anchor="middle" font-weight="400">clone · mirror · structural · fifteen variant primitives · themeable</text>
|
|
77
|
+
</g>
|
|
78
|
+
|
|
79
|
+
<!-- ============================================================ -->
|
|
80
|
+
<!-- LEFT CARD — real content -->
|
|
81
|
+
<!-- ============================================================ -->
|
|
82
|
+
<g transform="translate(140, 330)" filter="url(#cardShadow)">
|
|
83
|
+
<rect width="660" height="480" rx="28" fill="url(#cardSurface)" stroke="url(#cardOutline)" stroke-width="1.5"/>
|
|
84
|
+
|
|
85
|
+
<!-- Recommended pill -->
|
|
86
|
+
<rect x="46" y="46" width="210" height="44" rx="22" fill="#10b981" fill-opacity="0.18" stroke="#10b981" stroke-opacity="0.45" stroke-width="1.5"/>
|
|
87
|
+
<text x="151" y="74" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="15" font-weight="700" fill="#10b981" text-anchor="middle" letter-spacing="0.14em">RECOMMENDED</text>
|
|
88
|
+
|
|
89
|
+
<!-- Avatar -->
|
|
90
|
+
<circle cx="92" cy="180" r="42" fill="#7c3aed"/>
|
|
91
|
+
<text x="92" y="194" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="32" font-weight="700" fill="#ffffff" text-anchor="middle">MH</text>
|
|
92
|
+
|
|
93
|
+
<!-- Name -->
|
|
94
|
+
<text x="160" y="166" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="28" font-weight="700" fill="#f4f3f8">Maya Hartman</text>
|
|
95
|
+
<!-- Role -->
|
|
96
|
+
<text x="160" y="198" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="14" font-weight="600" fill="#8b85a0" letter-spacing="0.10em">SENIOR PLATFORM ENGINEER</text>
|
|
97
|
+
|
|
98
|
+
<!-- Description (absolute y per line) -->
|
|
99
|
+
<text x="46" y="278" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="18" fill="#bdb8d0">Builds developer tools and component libraries.</text>
|
|
100
|
+
<text x="46" y="308" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="18" fill="#bdb8d0">Currently exploring runtime DOM introspection for</text>
|
|
101
|
+
<text x="46" y="338" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="18" fill="#bdb8d0">self-generating skeleton loaders.</text>
|
|
102
|
+
|
|
103
|
+
<!-- Button -->
|
|
104
|
+
<rect x="46" y="384" width="240" height="56" rx="14" fill="#10b981"/>
|
|
105
|
+
<text x="166" y="420" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="18" font-weight="600" fill="#ffffff" text-anchor="middle">View profile</text>
|
|
106
|
+
</g>
|
|
107
|
+
|
|
108
|
+
<!-- Caption under left card -->
|
|
109
|
+
<text x="470" y="858" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="18" fill="#8b85a0" text-anchor="middle">
|
|
110
|
+
<tspan font-weight="700" fill="#e9e5f8"><ASkeleton :loading="false"></tspan><tspan> · real content</tspan>
|
|
111
|
+
</text>
|
|
112
|
+
|
|
113
|
+
<!-- ============================================================ -->
|
|
114
|
+
<!-- TRANSFORMATION ARROWS -->
|
|
115
|
+
<!-- ============================================================ -->
|
|
116
|
+
<g transform="translate(859, 570)">
|
|
117
|
+
<line x1="-60" y1="0" x2="60" y2="0" stroke="#c4b5fd" stroke-width="3" stroke-linecap="round" marker-end="url(#arrowTip)"/>
|
|
118
|
+
<text x="0" y="-22" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="17" fill="#c4b5fd" text-anchor="middle" font-weight="600">capture</text>
|
|
119
|
+
<text x="0" y="36" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="17" fill="#c4b5fd" text-anchor="middle" font-weight="600">replay</text>
|
|
120
|
+
</g>
|
|
121
|
+
|
|
122
|
+
<!-- ============================================================ -->
|
|
123
|
+
<!-- RIGHT CARD — skeleton replica -->
|
|
124
|
+
<!-- ============================================================ -->
|
|
125
|
+
<g transform="translate(918, 330)" filter="url(#cardShadow)">
|
|
126
|
+
<rect width="660" height="480" rx="28" fill="url(#cardSurface)" stroke="url(#cardOutline)" stroke-width="1.5"/>
|
|
127
|
+
|
|
128
|
+
<!-- Badge skeleton -->
|
|
129
|
+
<rect x="46" y="46" width="210" height="44" rx="22" fill="url(#shimmerWarm)" opacity="0.95"/>
|
|
130
|
+
|
|
131
|
+
<!-- Avatar skeleton -->
|
|
132
|
+
<circle cx="92" cy="180" r="42" fill="url(#shimmer)" opacity="0.95"/>
|
|
133
|
+
|
|
134
|
+
<!-- Name bar -->
|
|
135
|
+
<rect x="160" y="148" width="320" height="28" rx="6" fill="url(#shimmerLight)" opacity="0.95"/>
|
|
136
|
+
<!-- Role bar -->
|
|
137
|
+
<rect x="160" y="186" width="240" height="14" rx="3" fill="url(#shimmer)" opacity="0.65"/>
|
|
138
|
+
|
|
139
|
+
<!-- Paragraph bars -->
|
|
140
|
+
<rect x="46" y="266" width="568" height="16" rx="4" fill="url(#shimmer)" opacity="0.85"/>
|
|
141
|
+
<rect x="46" y="294" width="568" height="16" rx="4" fill="url(#shimmer)" opacity="0.85"/>
|
|
142
|
+
<rect x="46" y="322" width="380" height="16" rx="4" fill="url(#shimmer)" opacity="0.85"/>
|
|
143
|
+
|
|
144
|
+
<!-- Button skeleton -->
|
|
145
|
+
<rect x="46" y="384" width="240" height="56" rx="14" fill="url(#shimmerWarm)" opacity="0.95"/>
|
|
146
|
+
</g>
|
|
147
|
+
|
|
148
|
+
<!-- Caption under right card -->
|
|
149
|
+
<text x="1248" y="858" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="18" fill="#8b85a0" text-anchor="middle">
|
|
150
|
+
<tspan font-weight="700" fill="#e9e5f8"><ASkeleton :loading="true"></tspan><tspan> · shimmer replica</tspan>
|
|
151
|
+
</text>
|
|
152
|
+
|
|
153
|
+
<!-- ============================================================ -->
|
|
154
|
+
<!-- VARIANT RAIL — fifteen primitives strip -->
|
|
155
|
+
<!-- ============================================================ -->
|
|
156
|
+
<g transform="translate(140, 920)">
|
|
157
|
+
<rect width="1438" height="180" rx="22" fill="url(#cardSurface)" stroke="url(#cardOutline)" stroke-width="1.5"/>
|
|
158
|
+
|
|
159
|
+
<text x="32" y="44" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="13" fill="#c4b5fd" letter-spacing="0.16em" font-weight="700">FIFTEEN VARIANT PRIMITIVES</text>
|
|
160
|
+
|
|
161
|
+
<!-- Avatar -->
|
|
162
|
+
<circle cx="60" cy="118" r="22" fill="url(#shimmer)"/>
|
|
163
|
+
<text x="60" y="166" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="11" fill="#8b85a0" text-anchor="middle">Avatar</text>
|
|
164
|
+
|
|
165
|
+
<!-- Heading + text -->
|
|
166
|
+
<rect x="105" y="92" width="120" height="14" rx="3" fill="url(#shimmerLight)"/>
|
|
167
|
+
<rect x="105" y="116" width="120" height="9" rx="2" fill="url(#shimmer)" opacity="0.7"/>
|
|
168
|
+
<rect x="105" y="131" width="100" height="9" rx="2" fill="url(#shimmer)" opacity="0.7"/>
|
|
169
|
+
<text x="165" y="166" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="11" fill="#8b85a0" text-anchor="middle">Text</text>
|
|
170
|
+
|
|
171
|
+
<!-- Image -->
|
|
172
|
+
<rect x="260" y="88" width="80" height="56" rx="6" fill="url(#shimmer)"/>
|
|
173
|
+
<text x="300" y="166" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="11" fill="#8b85a0" text-anchor="middle">Image</text>
|
|
174
|
+
|
|
175
|
+
<!-- Button -->
|
|
176
|
+
<rect x="365" y="105" width="90" height="32" rx="8" fill="url(#shimmerWarm)"/>
|
|
177
|
+
<text x="410" y="166" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="11" fill="#8b85a0" text-anchor="middle">Button</text>
|
|
178
|
+
|
|
179
|
+
<!-- Input -->
|
|
180
|
+
<rect x="480" y="105" width="120" height="32" rx="6" fill="none" stroke="url(#shimmer)" stroke-width="2"/>
|
|
181
|
+
<rect x="490" y="116" width="30" height="10" rx="2" fill="url(#shimmer)"/>
|
|
182
|
+
<text x="540" y="166" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="11" fill="#8b85a0" text-anchor="middle">Input</text>
|
|
183
|
+
|
|
184
|
+
<!-- Chip -->
|
|
185
|
+
<rect x="630" y="108" width="46" height="22" rx="11" fill="url(#shimmer)"/>
|
|
186
|
+
<rect x="682" y="108" width="60" height="22" rx="11" fill="url(#shimmer)"/>
|
|
187
|
+
<text x="690" y="166" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="11" fill="#8b85a0" text-anchor="middle">Chip</text>
|
|
188
|
+
|
|
189
|
+
<!-- Card -->
|
|
190
|
+
<rect x="770" y="84" width="120" height="68" rx="8" fill="url(#cardSurface)" stroke="url(#shimmer)" stroke-width="1.5"/>
|
|
191
|
+
<rect x="780" y="94" width="36" height="36" rx="4" fill="url(#shimmer)"/>
|
|
192
|
+
<rect x="824" y="96" width="56" height="9" rx="2" fill="url(#shimmerLight)"/>
|
|
193
|
+
<rect x="824" y="112" width="50" height="6" rx="2" fill="url(#shimmer)" opacity="0.7"/>
|
|
194
|
+
<text x="830" y="166" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="11" fill="#8b85a0" text-anchor="middle">Card</text>
|
|
195
|
+
|
|
196
|
+
<!-- Table -->
|
|
197
|
+
<g transform="translate(920, 84)">
|
|
198
|
+
<rect width="120" height="14" rx="2" fill="url(#shimmerLight)"/>
|
|
199
|
+
<rect y="20" width="120" height="9" rx="2" fill="url(#shimmer)" opacity="0.7"/>
|
|
200
|
+
<rect y="34" width="120" height="9" rx="2" fill="url(#shimmer)" opacity="0.7"/>
|
|
201
|
+
<rect y="48" width="120" height="9" rx="2" fill="url(#shimmer)" opacity="0.7"/>
|
|
202
|
+
<rect y="62" width="120" height="9" rx="2" fill="url(#shimmer)" opacity="0.7"/>
|
|
203
|
+
</g>
|
|
204
|
+
<text x="980" y="166" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="11" fill="#8b85a0" text-anchor="middle">Table</text>
|
|
205
|
+
|
|
206
|
+
<!-- Chart -->
|
|
207
|
+
<g transform="translate(1070, 92)">
|
|
208
|
+
<rect y="48" width="14" height="14" rx="2" fill="url(#shimmer)"/>
|
|
209
|
+
<rect x="20" y="32" width="14" height="30" rx="2" fill="url(#shimmer)"/>
|
|
210
|
+
<rect x="40" y="20" width="14" height="42" rx="2" fill="url(#shimmer)"/>
|
|
211
|
+
<rect x="60" y="40" width="14" height="22" rx="2" fill="url(#shimmer)"/>
|
|
212
|
+
<rect x="80" y="10" width="14" height="52" rx="2" fill="url(#shimmer)"/>
|
|
213
|
+
<rect x="100" y="28" width="14" height="34" rx="2" fill="url(#shimmer)"/>
|
|
214
|
+
</g>
|
|
215
|
+
<text x="1127" y="166" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="11" fill="#8b85a0" text-anchor="middle">Chart</text>
|
|
216
|
+
|
|
217
|
+
<!-- List item -->
|
|
218
|
+
<g transform="translate(1190, 96)">
|
|
219
|
+
<circle cx="14" cy="22" r="14" fill="url(#shimmer)"/>
|
|
220
|
+
<rect x="36" y="10" width="100" height="11" rx="2" fill="url(#shimmerLight)"/>
|
|
221
|
+
<rect x="36" y="26" width="80" height="8" rx="2" fill="url(#shimmer)" opacity="0.7"/>
|
|
222
|
+
</g>
|
|
223
|
+
<text x="1260" y="166" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="11" fill="#8b85a0" text-anchor="middle">List</text>
|
|
224
|
+
|
|
225
|
+
<!-- Divider -->
|
|
226
|
+
<rect x="1340" y="118" width="80" height="3" rx="1.5" fill="url(#shimmer)"/>
|
|
227
|
+
<text x="1380" y="166" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="11" fill="#8b85a0" text-anchor="middle">Divider</text>
|
|
228
|
+
</g>
|
|
229
|
+
|
|
230
|
+
<!-- Bottom signature -->
|
|
231
|
+
<text x="859" y="1142" font-family="ui-monospace, 'SF Mono', Menlo, monospace" font-size="13" fill="#6b6582" text-anchor="middle" letter-spacing="0.12em">vue 3 · nuxt 3+ · typescript-first · ssr-safe (mirror)</text>
|
|
232
|
+
</svg>
|