@designcrowd/fe-shared-lib 1.5.1-icontranslation → 1.5.2
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/.storybook-static/assets/Auth-CV5AmoX8.css +1 -0
- package/.storybook-static/assets/Auth.stories-CX3sjxh5.js +490 -0
- package/.storybook-static/assets/AuthCrazyDomains.stories-Didj_VFa.js +73 -0
- package/.storybook-static/assets/Button-5UzSGUF6.css +1 -0
- package/.storybook-static/assets/Button-DtVlr_q3.js +1 -0
- package/.storybook-static/assets/ButtonGroup-Dfr7bNL2.css +1 -0
- package/.storybook-static/assets/ButtonGroup.stories-4EQk-ktb.js +503 -0
- package/.storybook-static/assets/ButtonPrimary-Bu6bXb_c.css +1 -0
- package/.storybook-static/assets/ButtonPrimary-DG9wNod9.js +1 -0
- package/.storybook-static/assets/Buttons.stories-B_KpeCzt.js +761 -0
- package/.storybook-static/assets/ButtonsCrazyDomains.stories-oZtahAmR.js +199 -0
- package/.storybook-static/assets/Checkbox.mixin-DkHpdvGa.js +1 -0
- package/.storybook-static/assets/Checkbox.stories-C67RL0ut.js +203 -0
- package/.storybook-static/assets/Checktile.stories-DN2wfzd6.js +88 -0
- package/.storybook-static/assets/CollapsiblePanel.stories-BkzrqfVG.js +39 -0
- package/.storybook-static/assets/ColorPicker.stories-85BQwpyF.js +73 -0
- package/.storybook-static/assets/CopyToClipboardText.stories-Csh5nVRs.js +32 -0
- package/.storybook-static/assets/Dropdown.stories-NNlxNopk.js +159 -0
- package/.storybook-static/assets/DropdownItem-CDX_V6Mi.js +1 -0
- package/.storybook-static/assets/DropdownItem-CLNmWtKh.css +1 -0
- package/.storybook-static/assets/FormControl.mixin-_gXRExB7.js +1 -0
- package/.storybook-static/assets/HashRouteModal.stories-Dy1_nLTJ.js +64 -0
- package/.storybook-static/assets/HelloBar-z54fob0q.js +1 -0
- package/.storybook-static/assets/HelloBar.stories-ClJ9_KRK.js +342 -0
- package/.storybook-static/assets/Icon-8mZGP41G.js +144 -0
- package/.storybook-static/assets/Icon.stories-BcXMvpuh.js +126 -0
- package/.storybook-static/assets/Icon.stories-D6ECVMta.js +751 -0
- package/.storybook-static/assets/Loader-D61Ki9P1.js +1 -0
- package/.storybook-static/assets/LogoBusinessBrandColours-B1_8hw0H.js +1 -0
- package/.storybook-static/assets/LogoBusinessBrandColours-DEFhAyxR.css +1 -0
- package/.storybook-static/assets/LogoBusinessBrandColours.stories-CIWe9ndn.js +36 -0
- package/.storybook-static/assets/Masonry-C2MNiGg0.css +1 -0
- package/.storybook-static/assets/Masonry.stories-CDT8kZCv.js +71 -0
- package/.storybook-static/assets/Modal-BQrpXSGA.js +1 -0
- package/.storybook-static/assets/Modal-BvVMN71n.css +1 -0
- package/.storybook-static/assets/Modal.stories-BycF7YL6.js +345 -0
- package/.storybook-static/assets/Notice.stories-BufkrC1b.js +222 -0
- package/.storybook-static/assets/NumberStepper-Blffv09R.css +1 -0
- package/.storybook-static/assets/NumberStepper.stories-6_y_lEgC.js +64 -0
- package/.storybook-static/assets/PaymentConfigList-wI1eTv5x.css +1 -0
- package/.storybook-static/assets/PaymentConfigList.stories-BlzzKrzz.js +126 -0
- package/.storybook-static/assets/Picture-Cq76CaoK.js +1 -0
- package/.storybook-static/assets/Picture.stories-BDqRm9_g.js +119 -0
- package/.storybook-static/assets/Pill-BsMeJhV9.js +1 -0
- package/.storybook-static/assets/Pill.stories-DUvzbtnS.js +18 -0
- package/.storybook-static/assets/PillBar-os4mJV3M.css +1 -0
- package/.storybook-static/assets/PillBar.stories-BUMLXBij.js +41 -0
- package/.storybook-static/assets/Price-DKOwLeD0.js +1 -0
- package/.storybook-static/assets/Price.stories-DlqrNUWI.js +221 -0
- package/.storybook-static/assets/PublishBrandPageModal-CLU8-If3.css +1 -0
- package/.storybook-static/assets/PublishBrandPageModal.stories-Dqobvq-n.js +273 -0
- package/.storybook-static/assets/SearchBar.stories-_wPX3-Rl.js +12 -0
- package/.storybook-static/assets/Select-Dw-zvSUg.css +1 -0
- package/.storybook-static/assets/Select.stories-BWINGxdY.js +108 -0
- package/.storybook-static/assets/SellDomainNameList.fixtures-LC6fjr_b.js +1 -0
- package/.storybook-static/assets/SellDomainNameListModal-ByK_ak0A.js +1 -0
- package/.storybook-static/assets/SellDomainNameListModal-CdfyEX1a.css +1 -0
- package/.storybook-static/assets/SellDomainNameListModal.stories-DrL8w2AY.js +71 -0
- package/.storybook-static/assets/SellDomainNameListSearchResult-1WuAKfzI.css +1 -0
- package/.storybook-static/assets/SellDomainNameListSearchResult-By0IpIM_.js +1 -0
- package/.storybook-static/assets/SellDomainNameSearchWithResults-BttjI4PH.js +1 -0
- package/.storybook-static/assets/SellDomainNameSearchWithResults.stories-Dm1Q8Cza.js +37 -0
- package/.storybook-static/assets/SellDomainNameWidget.stories-CKoz3WnZ.js +36 -0
- package/.storybook-static/assets/SignIn-DNYeJu86.css +1 -0
- package/.storybook-static/assets/SignIn-Dt8OJr0J.js +1 -0
- package/.storybook-static/assets/Slider-Cog2FFdj.css +1 -0
- package/.storybook-static/assets/Slider.stories-08DN2SFB.js +141 -0
- package/.storybook-static/assets/StarRating-BtKh7pzm.css +1 -0
- package/.storybook-static/assets/StarRating.stories-BEIj9ufA.js +45 -0
- package/.storybook-static/assets/TabMenu.stories-D9f0pyZI.js +47 -0
- package/.storybook-static/assets/TextCopyField-B04vTGbG.js +1 -0
- package/.storybook-static/assets/TextCopyField.stories-KD0WUWzA.js +47 -0
- package/.storybook-static/assets/TextInput-JK1M0hv6.js +1 -0
- package/.storybook-static/assets/TextInput.stories-BO0eQqBY.js +233 -0
- package/.storybook-static/assets/Textarea.stories-Bcn4sCkV.js +207 -0
- package/.storybook-static/assets/Toggle.stories-CuTFLoNh.js +161 -0
- package/.storybook-static/assets/Tooltip-DcSbUh5f.js +1 -0
- package/.storybook-static/assets/Tooltip-DyXIgFQH.css +1 -0
- package/.storybook-static/assets/Tooltip.stories-B0I_PBGG.js +953 -0
- package/.storybook-static/assets/UploadYourLogoApplication-EyTEQx-x.css +9 -0
- package/.storybook-static/assets/UploadYourLogoApplication.stories-Dixp1ynI.js +194 -0
- package/.storybook-static/assets/UploadYourLogoDropzone-DQqACf-e.css +1 -0
- package/.storybook-static/assets/UploadYourLogoDropzone-DouZtNvi.js +24 -0
- package/.storybook-static/assets/UploadYourLogoDropzone.stories-BHYeu4gz.js +55 -0
- package/.storybook-static/assets/UploadedLogoSearchResultCard.stories-D1KR63O4.js +79 -0
- package/.storybook-static/assets/_commonjsHelpers-D6-XlEtG.js +1 -0
- package/.storybook-static/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
- package/.storybook-static/assets/api-lSJGRrF2.js +1 -0
- package/.storybook-static/assets/axe-nGVJxRof.js +30 -0
- package/.storybook-static/assets/brand-crowd-api.client-DiPM1Wo-.js +1 -0
- package/.storybook-static/assets/bundled-translations-BZ57czTo.js +1 -0
- package/.storybook-static/assets/bundled-translations.de-DE-DXggTXB2.js +1 -0
- package/.storybook-static/assets/bundled-translations.es-ES-DtMmvicd.js +1 -0
- package/.storybook-static/assets/bundled-translations.fr-FR-BrQqbieG.js +1 -0
- package/.storybook-static/assets/bundled-translations.pt-PT-CpiWEAtr.js +1 -0
- package/.storybook-static/assets/carousel-CMMZ5MZ-.css +1 -0
- package/.storybook-static/assets/carousel.stories-o3eu2Qyc.js +374 -0
- package/.storybook-static/assets/event-constants-CMO9VQVu.js +1 -0
- package/.storybook-static/assets/iframe-C86bI_2U.js +1126 -0
- package/.storybook-static/assets/index-Bw-gCGc_.js +6 -0
- package/.storybook-static/assets/index-DhkYCT1V.js +29 -0
- package/.storybook-static/assets/matchers-7Z3WT2CE-T3xScrR7.js +14 -0
- package/.storybook-static/assets/tracking-ATsLLehC.js +1 -0
- package/.storybook-static/css/tailwind-brandCrowd.css +2404 -0
- package/.storybook-static/css/tailwind-brandPage.css +2088 -0
- package/.storybook-static/css/tailwind-crazyDomains.css +2404 -0
- package/.storybook-static/css/tailwind-designCom.css +2404 -0
- package/.storybook-static/css/tailwind-designCrowd.css +2404 -0
- package/.storybook-static/favicon.svg +1 -0
- package/.storybook-static/iframe.html +694 -0
- package/.storybook-static/index.html +156 -0
- package/.storybook-static/index.json +1 -0
- package/.storybook-static/nunito-sans-bold-italic.woff2 +0 -0
- package/.storybook-static/nunito-sans-bold.woff2 +0 -0
- package/.storybook-static/nunito-sans-italic.woff2 +0 -0
- package/.storybook-static/nunito-sans-regular.woff2 +0 -0
- package/.storybook-static/project.json +1 -0
- package/.storybook-static/sb-addons/a11y-1/manager-bundle.js +5 -0
- package/.storybook-static/sb-addons/links-2/manager-bundle.js +3 -0
- package/.storybook-static/sb-addons/storybook-core-server-presets-0/common-manager-bundle.js +188 -0
- package/.storybook-static/sb-addons/themes-3/manager-bundle.js +3 -0
- package/.storybook-static/sb-common-assets/favicon.svg +1 -0
- package/.storybook-static/sb-common-assets/nunito-sans-bold-italic.woff2 +0 -0
- package/.storybook-static/sb-common-assets/nunito-sans-bold.woff2 +0 -0
- package/.storybook-static/sb-common-assets/nunito-sans-italic.woff2 +0 -0
- package/.storybook-static/sb-common-assets/nunito-sans-regular.woff2 +0 -0
- package/.storybook-static/sb-manager/globals-module-info.js +797 -0
- package/.storybook-static/sb-manager/globals-runtime.js +72062 -0
- package/.storybook-static/sb-manager/globals.js +34 -0
- package/.storybook-static/sb-manager/runtime.js +13002 -0
- package/CLAUDE.md +65 -227
- package/dist/css/tailwind-brandCrowd.css +2419 -0
- package/dist/css/tailwind-brandPage.css +2107 -0
- package/dist/css/tailwind-crazyDomains.css +2419 -0
- package/dist/css/tailwind-designCom.css +2419 -0
- package/dist/css/tailwind-designCrowd.css +2419 -0
- package/package.json +1 -1
- package/public/css/tailwind-brandCrowd.css +6 -3
- package/public/css/tailwind-brandPage.css +6 -3
- package/public/css/tailwind-crazyDomains.css +6 -3
- package/public/css/tailwind-designCom.css +6 -3
- package/public/css/tailwind-designCrowd.css +6 -3
- package/src/atoms/components/design-com/Icon/Icon.stories.js +0 -62
- package/src/atoms/components/design-com/Icon/Icon.vue +2 -7
- package/src/experiences/components/PublishBrandPageModal/PublishBrandPageModal.stories.js +36 -0
- package/src/experiences/components/PublishBrandPageModal/PublishBrandPageModal.vue +100 -297
- package/src/experiences/components/PublishBrandPageModal/views/PublishWhenHasDomainsView.vue +271 -0
- package/src/experiences/components/PublishBrandPageModal/views/PublishWhenNoDomainsView.vue +168 -0
- package/src/experiences/components/PublishBrandPageModal/views/PublishedView.vue +149 -0
- package/src/experiences/components/PublishBrandPageModal/views/SetUrlView.vue +155 -0
- package/.claude/settings.local.json +0 -17
- package/.claude/skills/publishing-test-versions.md +0 -285
- package/.storybook/image-1.png +0 -0
- package/.storybook/image-2.png +0 -0
- package/.storybook/image.png +0 -0
- package/.storybook/test.md +0 -3
- package/APasking.md +0 -9
- package/GT-8753.md +0 -127
- package/docs/plans/2025-11-03-typescript-declarations-design.md +0 -222
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
# TypeScript Declaration Files Design
|
|
2
|
-
|
|
3
|
-
**Date:** 2025-11-03
|
|
4
|
-
**Goal:** Add TypeScript declaration files (.d.ts) to the published npm package to support TypeScript consumers while enabling gradual migration to TypeScript.
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This design adds basic TypeScript support to `@designcrowd/fe-shared-lib` by auto-generating declaration files during the publish process. The approach allows:
|
|
9
|
-
- Immediate TypeScript support for library consumers
|
|
10
|
-
- Gradual migration from JavaScript to TypeScript over time
|
|
11
|
-
- No breaking changes for existing JavaScript consumers
|
|
12
|
-
- Clean git history (declarations not committed)
|
|
13
|
-
|
|
14
|
-
## Architecture
|
|
15
|
-
|
|
16
|
-
### Tooling Choice
|
|
17
|
-
|
|
18
|
-
Use `vue-tsc` (Vue's TypeScript compiler) to generate declarations from existing `.vue` and `.js` files. This tool:
|
|
19
|
-
- Understands Vue 3 component structure
|
|
20
|
-
- Extracts type information from JavaScript code
|
|
21
|
-
- Generates `.d.ts` files for both `.vue` and `.js` files
|
|
22
|
-
- Supports gradual TypeScript adoption
|
|
23
|
-
|
|
24
|
-
### File Structure
|
|
25
|
-
|
|
26
|
-
Generated declarations will be placed in `dist/types/`:
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
/dist/
|
|
30
|
-
├── types/
|
|
31
|
-
│ ├── index.d.ts # Main entry point
|
|
32
|
-
│ ├── atoms/
|
|
33
|
-
│ │ └── components/
|
|
34
|
-
│ │ ├── Button/
|
|
35
|
-
│ │ │ └── Button.vue.d.ts
|
|
36
|
-
│ │ ├── Icon/
|
|
37
|
-
│ │ └── ...
|
|
38
|
-
│ ├── experiences/
|
|
39
|
-
│ └── useSharedLibTranslate.d.ts
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### Package.json Configuration
|
|
43
|
-
|
|
44
|
-
**New Fields:**
|
|
45
|
-
- `"types": "./dist/types/index.d.ts"` - Points TypeScript to declarations
|
|
46
|
-
|
|
47
|
-
**Updated Scripts:**
|
|
48
|
-
- `build:types` - Generate declaration files
|
|
49
|
-
- `docker:publish` - Run `build:types` before building Docker image
|
|
50
|
-
|
|
51
|
-
### Type Generation Level
|
|
52
|
-
|
|
53
|
-
**Basic Component Exports:** Each component is typed as a generic Vue component. TypeScript consumers get:
|
|
54
|
-
- Import/export type checking
|
|
55
|
-
- Basic component type (can use in templates)
|
|
56
|
-
- IDE autocomplete for component names
|
|
57
|
-
|
|
58
|
-
**What's NOT included (can be added later):**
|
|
59
|
-
- Detailed prop types with specific values
|
|
60
|
-
- Event emission types
|
|
61
|
-
- Slot definitions
|
|
62
|
-
- Exposed method signatures
|
|
63
|
-
|
|
64
|
-
## Implementation Details
|
|
65
|
-
|
|
66
|
-
### 1. TypeScript Configuration
|
|
67
|
-
|
|
68
|
-
Create `tsconfig.declarations.json`:
|
|
69
|
-
```json
|
|
70
|
-
{
|
|
71
|
-
"extends": "./tsconfig.json",
|
|
72
|
-
"compilerOptions": {
|
|
73
|
-
"declaration": true,
|
|
74
|
-
"emitDeclarationOnly": true,
|
|
75
|
-
"outDir": "./dist/types",
|
|
76
|
-
"rootDir": "./",
|
|
77
|
-
"skipLibCheck": true
|
|
78
|
-
},
|
|
79
|
-
"include": [
|
|
80
|
-
"src/**/*",
|
|
81
|
-
"index.js",
|
|
82
|
-
"*.d.ts"
|
|
83
|
-
],
|
|
84
|
-
"exclude": [
|
|
85
|
-
"node_modules",
|
|
86
|
-
"dist",
|
|
87
|
-
".storybook",
|
|
88
|
-
"**/*.stories.js"
|
|
89
|
-
]
|
|
90
|
-
}
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
Create base `tsconfig.json` (if doesn't exist):
|
|
94
|
-
```json
|
|
95
|
-
{
|
|
96
|
-
"compilerOptions": {
|
|
97
|
-
"target": "ESNext",
|
|
98
|
-
"module": "ESNext",
|
|
99
|
-
"moduleResolution": "node",
|
|
100
|
-
"lib": ["ESNext", "DOM"],
|
|
101
|
-
"jsx": "preserve",
|
|
102
|
-
"strict": false,
|
|
103
|
-
"allowJs": true,
|
|
104
|
-
"checkJs": false,
|
|
105
|
-
"esModuleInterop": true,
|
|
106
|
-
"skipLibCheck": true,
|
|
107
|
-
"resolveJsonModule": true
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### 2. Package.json Updates
|
|
113
|
-
|
|
114
|
-
```json
|
|
115
|
-
{
|
|
116
|
-
"types": "./dist/types/index.d.ts",
|
|
117
|
-
"scripts": {
|
|
118
|
-
"build:types": "vue-tsc --project tsconfig.declarations.json",
|
|
119
|
-
"docker:publish": "npm run build:types && docker build . --build-arg NPM_TOKEN=$NPM_TOKEN"
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
### 3. Dockerfile Updates
|
|
125
|
-
|
|
126
|
-
Ensure `dist/types` is copied in the Dockerfile:
|
|
127
|
-
```dockerfile
|
|
128
|
-
COPY dist/types ./dist/types
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
### 4. Git Configuration
|
|
132
|
-
|
|
133
|
-
Add to `.gitignore`:
|
|
134
|
-
```
|
|
135
|
-
dist/types/
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### 5. Manual Type Definitions
|
|
139
|
-
|
|
140
|
-
Create `src/useSharedLibTranslate.d.ts` for translation utilities:
|
|
141
|
-
```typescript
|
|
142
|
-
export function setSharedLibLocaleAsync(locale: string): Promise<void>;
|
|
143
|
-
export function tr(key: string, params?: Record<string, any>): string;
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
## Gradual Migration Path
|
|
147
|
-
|
|
148
|
-
### Writing New Code
|
|
149
|
-
- New components: Use `<script setup lang="ts">` in `.vue` files
|
|
150
|
-
- New utilities: Write as `.ts` files
|
|
151
|
-
- `vue-tsc` automatically generates declarations
|
|
152
|
-
|
|
153
|
-
### Converting Existing Code
|
|
154
|
-
- Convert one component at a time
|
|
155
|
-
- Change `<script>` to `<script setup lang="ts">`
|
|
156
|
-
- Add type annotations incrementally
|
|
157
|
-
- No coordination needed across components
|
|
158
|
-
|
|
159
|
-
### Priority for Migration
|
|
160
|
-
1. Utility functions and helpers (highest value)
|
|
161
|
-
2. Complex components with many props
|
|
162
|
-
3. Simple presentational components (lowest priority)
|
|
163
|
-
|
|
164
|
-
## Edge Cases & Considerations
|
|
165
|
-
|
|
166
|
-
### Multi-Theme Components
|
|
167
|
-
Theme-specific exports (e.g., `DcomIcon`) are in `index.js`, so they'll automatically get declarations. No special handling needed.
|
|
168
|
-
|
|
169
|
-
### Translation Bundles
|
|
170
|
-
Translation JSON files don't need type definitions. The `tr()` function signature is sufficient.
|
|
171
|
-
|
|
172
|
-
### API Clients
|
|
173
|
-
Exported clients (`brandPageApiClient`, `brandCrowdApiClient`) will get basic type definitions. Can be enhanced later with Axios response types.
|
|
174
|
-
|
|
175
|
-
### Storybook Files
|
|
176
|
-
Excluded from type generation (`.exclude` in tsconfig). Stories are dev-only and don't need declarations.
|
|
177
|
-
|
|
178
|
-
## Validation Steps
|
|
179
|
-
|
|
180
|
-
Before publishing:
|
|
181
|
-
1. Run `npm run build:types` locally
|
|
182
|
-
2. Verify `dist/types/index.d.ts` exists
|
|
183
|
-
3. Check all exports are present in `index.d.ts`
|
|
184
|
-
4. Create test TypeScript project:
|
|
185
|
-
```typescript
|
|
186
|
-
import { Button, Icon } from '@designcrowd/fe-shared-lib';
|
|
187
|
-
```
|
|
188
|
-
5. Verify IDE autocomplete works
|
|
189
|
-
6. Test `npm run docker:publish` includes types
|
|
190
|
-
|
|
191
|
-
## Breaking Changes
|
|
192
|
-
|
|
193
|
-
**None.** This is purely additive:
|
|
194
|
-
- JavaScript consumers continue working unchanged
|
|
195
|
-
- TypeScript consumers gain type support
|
|
196
|
-
- No runtime behavior changes
|
|
197
|
-
- No API changes
|
|
198
|
-
|
|
199
|
-
## Dependencies
|
|
200
|
-
|
|
201
|
-
Already installed:
|
|
202
|
-
- `typescript: 5.3.3` (devDependency)
|
|
203
|
-
- `@vue/eslint-config-typescript: 12.0.0` (devDependency)
|
|
204
|
-
|
|
205
|
-
Need to verify `vue-tsc` is available (should be included with `@vitejs/plugin-vue` or add as devDependency).
|
|
206
|
-
|
|
207
|
-
## Future Enhancements
|
|
208
|
-
|
|
209
|
-
Once this is working, can incrementally add:
|
|
210
|
-
1. Detailed prop types with specific values (e.g., `theme: 'brandCrowd' | 'designCom'`)
|
|
211
|
-
2. Event emission types (e.g., `@click`, `@change`)
|
|
212
|
-
3. Slot definitions with scoped slot props
|
|
213
|
-
4. Generic type parameters for complex components
|
|
214
|
-
5. Full JSDoc comments for better IDE hints
|
|
215
|
-
|
|
216
|
-
## Success Criteria
|
|
217
|
-
|
|
218
|
-
- ✅ TypeScript consumers can import components without type errors
|
|
219
|
-
- ✅ IDE provides autocomplete for component names
|
|
220
|
-
- ✅ `dist/types/index.d.ts` published to npm
|
|
221
|
-
- ✅ No breaking changes for JavaScript consumers
|
|
222
|
-
- ✅ New TypeScript files can be added without build changes
|