wineater-bot 3.9.4 → 4.0.0-beta.4
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/.prettierignore +9 -0
- package/.prettierrc +16 -0
- package/README.md +86 -0
- package/dist/wineater-chatbot.css +1 -0
- package/dist/wineater-chatbot.mjs +6502 -5128
- package/dist/wineater-chatbot.umd.js +40 -985
- package/docs/SVELTE.md +146 -0
- package/e2e/demo.test.ts +6 -0
- package/eslint.config.js +41 -0
- package/index.html +14 -3
- package/package.json +30 -5
- package/playwright.config.ts +9 -0
- package/pnpm-workspace.yaml +2 -0
- package/src/App.svelte +394 -0
- package/src/App.svelte.test.ts +13 -0
- package/src/components/Footer.svelte +131 -0
- package/src/components/Header.svelte +92 -0
- package/src/components/Loader.svelte +62 -0
- package/src/components/Search.svelte +188 -0
- package/src/components/WinePopup.svelte +192 -0
- package/src/components/WineTile.svelte +331 -0
- package/src/demo.spec.ts +13 -0
- package/src/index.js +4 -36
- package/src/services/analytics/analytics.ts +103 -0
- package/src/{js/widget/widget-events.js → services/analytics/constants.ts} +0 -2
- package/src/services/api/api.ts +112 -0
- package/src/services/api/deserialize.ts +102 -0
- package/src/services/i18n/i18n.ts +134 -0
- package/src/services/i18n/translations.json +521 -0
- package/src/services/store/app-store.svelte.ts +77 -0
- package/src/services/store/deserialize.ts +22 -0
- package/src/services/store/types.ts +10 -0
- package/tsconfig.json +23 -0
- package/vite.config.js +69 -19
- package/vitest-setup-client.ts +2 -0
- package/src/js/analytics.js +0 -117
- package/src/js/api.js +0 -138
- package/src/js/i18n.js +0 -703
- package/src/js/widget/widget-language.js +0 -107
- package/src/js/widget/widget-search.js +0 -68
- package/src/js/widget/widget-styles.js +0 -855
- package/src/js/widget/widget-ui.js +0 -186
- package/src/js/widget.js +0 -241
package/.prettierignore
ADDED
package/.prettierrc
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"useTabs": true,
|
|
3
|
+
"singleQuote": true,
|
|
4
|
+
"trailingComma": "none",
|
|
5
|
+
"printWidth": 100,
|
|
6
|
+
"plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"],
|
|
7
|
+
"overrides": [
|
|
8
|
+
{
|
|
9
|
+
"files": "*.svelte",
|
|
10
|
+
"options": {
|
|
11
|
+
"parser": "svelte"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"tailwindStylesheet": "./src/app.css"
|
|
16
|
+
}
|
package/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Wineater Chatbot Widget
|
|
2
|
+
|
|
3
|
+
Embeddable Svelte-based wine recommendation widget.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Node.js (LTS recommended)
|
|
8
|
+
- [pnpm](https://pnpm.io/) package manager
|
|
9
|
+
|
|
10
|
+
## Install dependencies
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
pnpm install
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Run locally (development)
|
|
17
|
+
|
|
18
|
+
Start the Vite dev server (Svelte app with HMR):
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
pnpm dev
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
This will start the dev server on:
|
|
25
|
+
|
|
26
|
+
- http://localhost:3001 (as configured in `vite.config.js`)
|
|
27
|
+
|
|
28
|
+
You can open `index.html` directly in the browser or rely on Vite’s default index page, depending on how you integrate the widget during development.
|
|
29
|
+
|
|
30
|
+
## Build for production
|
|
31
|
+
|
|
32
|
+
Build the library bundles (ESM + UMD):
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pnpm build
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
This produces files in the `dist/` directory, including:
|
|
39
|
+
|
|
40
|
+
- `wineater-chatbot.mjs` – ES module build (primary distribution)
|
|
41
|
+
- `wineater-chatbot.umd.js` – legacy UMD/global build (kept for historical reasons; can be removed if not used)
|
|
42
|
+
- CSS asset(s) emitted by Vite/Svelte (e.g. `wineater-chatbot.css` if configured)
|
|
43
|
+
|
|
44
|
+
> Note: The UMD bundle is only generated for backward compatibility. If you do not embed the widget via a plain `<script>` tag in older environments, you can safely remove the UMD output from the build config.
|
|
45
|
+
|
|
46
|
+
## Using the production bundles
|
|
47
|
+
|
|
48
|
+
### 1. ESM (modern bundlers / type="module")
|
|
49
|
+
|
|
50
|
+
Use this in apps that can import ES modules (e.g. via Vite/Webpack, or directly in the browser):
|
|
51
|
+
|
|
52
|
+
```html
|
|
53
|
+
<link rel="stylesheet" href="/path/to/dist/wineater-chatbot.css">
|
|
54
|
+
<div id="wineater-widget-conteiner"></div>
|
|
55
|
+
<script src="/path/to/dist/wineater-chatbot.mjs"></script>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 2. UMD (script tag, no bundler)
|
|
59
|
+
|
|
60
|
+
Use this when you want to embed the widget directly on a site via `<script>` and rely on its auto-initialization:
|
|
61
|
+
|
|
62
|
+
```html
|
|
63
|
+
<link rel="stylesheet" href="/path/to/dist/wineater-chatbot.css">
|
|
64
|
+
<div id="wineater-widget-conteiner"></div>
|
|
65
|
+
<script src="/path/to/dist/wineater-chatbot.umd.js"></script>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
No manual JS init is required; the bundle mounts itself when loaded.
|
|
69
|
+
|
|
70
|
+
## Scripts reference
|
|
71
|
+
|
|
72
|
+
Defined in `package.json`:
|
|
73
|
+
|
|
74
|
+
- `pnpm dev` – start Vite dev server
|
|
75
|
+
- `pnpm build` – build the library with Vite
|
|
76
|
+
- `pnpm test` – run all tests (unit + e2e)
|
|
77
|
+
- `pnpm test:unit` – run unit tests with Vitest
|
|
78
|
+
- `pnpm test:e2e` – run Playwright end-to-end tests
|
|
79
|
+
- `pnpm lint` – run Prettier + ESLint
|
|
80
|
+
- `pnpm format` – format code with Prettier
|
|
81
|
+
|
|
82
|
+
## Notes
|
|
83
|
+
|
|
84
|
+
- The library entry point is `src/index.js`.
|
|
85
|
+
- Vite is configured in `vite.config.js` to emit both UMD and ESM bundles; the UMD bundle is considered legacy.
|
|
86
|
+
- Svelte components are built as a hydratable widget suitable for embedding on third-party sites.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,200..800&display=swap";#wine-widget-header.svelte-oiwvqb h1:where(.svelte-oiwvqb){font-family:Bricolage Grotesque,serif;font-weight:600;font-size:24px;margin:0 auto;line-height:1.3;color:#333;text-align:center}.icon.svelte-oiwvqb{display:inline-block;width:1.2em;height:1.2em;vertical-align:middle;margin:0 4px 0 2px;background-repeat:no-repeat;background-size:contain}.icon-meal.svelte-oiwvqb{background-image:url(https://czvgkhagwvmknscoerfy.supabase.co/storage/v1/object/public/static-media//meal1.svg)}.icon-meal.svelte-oiwvqb:hover{background-image:url(https://czvgkhagwvmknscoerfy.supabase.co/storage/v1/object/public/static-media//meal3.svg)}.icon-mood.svelte-oiwvqb{background-image:url(https://czvgkhagwvmknscoerfy.supabase.co/storage/v1/object/public/static-media//mood.svg)}.icon-occasion.svelte-oiwvqb{background-image:url(https://czvgkhagwvmknscoerfy.supabase.co/storage/v1/object/public/static-media//ocasion.svg)}.icon-label.svelte-oiwvqb{color:var(--wineater-color);font-weight:500}@media screen and (max-width: 768px){#wine-widget-header.svelte-oiwvqb h1:where(.svelte-oiwvqb){display:none}}#powered-by-widget.svelte-1sr6y3t{position:relative;border-top:2px solid #f6f7fd;font-family:Bricolage Grotesque,sans-serif;font-weight:200;padding:12px 24px;min-height:40px}#powered-by-widget.svelte-1sr6y3t .powered-by-center:where(.svelte-1sr6y3t){position:absolute;left:50%;transform:translate(-50%);text-align:center}#powered-by-widget.svelte-1sr6y3t .powered-by-lang:where(.svelte-1sr6y3t){position:absolute;right:0;top:50%;transform:translateY(-50%)}.language-dropdown.svelte-1sr6y3t{padding:4px;border-radius:6px;border:2px solid var(--wineater-color);background-color:#fff;color:var(--wineater-color);font-weight:500;font-family:Bricolage Grotesque,sans-serif;font-size:12px;cursor:pointer;transition:all .2s ease}.language-dropdown.svelte-1sr6y3t:hover{box-shadow:0 4px 8px #7b2beb33}#powered-by-widget.svelte-1sr6y3t a:where(.svelte-1sr6y3t){text-decoration:none;display:flex;align-items:center;white-space:nowrap;gap:8px;color:#a8a8a8;font-size:12px;line-height:16px;transition:opacity .2s ease}#powered-by-widget.svelte-1sr6y3t a:where(.svelte-1sr6y3t):hover{opacity:.8}#powered-by-widget.svelte-1sr6y3t img:where(.svelte-1sr6y3t){height:16px;width:auto;color:#a8a8a8}@media screen and (max-width: 768px){.powered-by-sommelier.svelte-1sr6y3t{display:none}}#wine-widget-search.svelte-1wah7ro{position:relative;margin:12px auto;padding:0 6px;display:flex;align-items:center;border:2px solid #d5d9ee;border-radius:10px}.search-icon.svelte-1wah7ro{left:12px;width:24px;height:24px;flex:0 0 auto;background-image:url(https://czvgkhagwvmknscoerfy.supabase.co/storage/v1/object/public/static-media//search.svg?x=1);background-repeat:no-repeat;background-size:contain;z-index:2}#wine-search-input.svelte-1wah7ro{flex:1 1 0%;min-width:0;padding:12px;font-size:16px;border:none;border-radius:10px;outline:none;transition:border .2s ease}#wine-search-input.svelte-1wah7ro::placeholder{color:var(--wineater-color);opacity:1;transition:color .3s ease,opacity .3s ease-in-out}#wine-search-input.svelte-1wah7ro:focus{border-color:var(--wineater-color)}#wine-search-input.svelte-1wah7ro:focus::placeholder{opacity:.5}#wine-search-button.svelte-1wah7ro{flex:0 0 auto;background-color:var(--wineater-color);color:#fff;border:none;border-radius:6px;padding:8px 16px;font-size:16px;cursor:pointer;transition:opacity .2s ease}#wine-search-button.svelte-1wah7ro:hover{opacity:.8}#loading-indicator.svelte-li6gfl{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:10000;text-align:center}.typing-indicator.svelte-li6gfl{display:flex;justify-content:center;align-items:center;height:40px;visibility:visible;background-color:#fff}.typing-indicator.svelte-li6gfl span:where(.svelte-li6gfl){display:block;width:8px;height:8px;margin:0 3px;border-radius:50%;background:linear-gradient(90deg,var(--wineater-color),var(--wineater-corp-color));opacity:.7;animation:svelte-li6gfl-typing 1s infinite}@keyframes svelte-li6gfl-typing{0%,to{transform:translateY(0);opacity:.7}50%{transform:translateY(-8px);opacity:1}}.typing-indicator.svelte-li6gfl span:where(.svelte-li6gfl):nth-child(1){animation-delay:0s}.typing-indicator.svelte-li6gfl span:where(.svelte-li6gfl):nth-child(2){animation-delay:.15s}.typing-indicator.svelte-li6gfl span:where(.svelte-li6gfl):nth-child(3){animation-delay:.3s}.card-popup.svelte-17gehox{position:absolute;width:100%;background-color:#fff;padding:16px;border-radius:16px;box-shadow:0 6px 30px #0003;text-align:left;font-size:14px;box-sizing:border-box;display:flex;flex-direction:column}.card-popup.svelte-17gehox p:where(.svelte-17gehox){margin:5px 0}.card-popup-header.svelte-17gehox{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.card-popup-header.svelte-17gehox h2:where(.svelte-17gehox){font-size:16px;font-weight:600;margin:0;flex:1;line-height:1.3}.card-popup-close.svelte-17gehox{font-size:20px;font-weight:700;cursor:pointer;color:#999;border:none;background:transparent;line-height:1}.card-popup-close.svelte-17gehox:hover{color:#000}.popup-short-desc.svelte-17gehox{margin-top:8px}.popup-reason.svelte-17gehox{font-size:14px;font-weight:400;color:#333;margin-top:8px}.popup-pairing.svelte-17gehox{margin-top:8px}.popup-tags.svelte-17gehox{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px;justify-content:center}.popup-tag.svelte-17gehox{display:inline-block;padding:4px 8px;border-radius:12px;background-color:#f5f0ff;border:1px solid #ddd;font-size:13px;color:#333;text-transform:capitalize}.mobile-fullscreen-wrapper.svelte-17gehox{position:fixed;top:0;left:0;width:100%;height:100%;z-index:10000}.mobile-fullscreen-overlay.svelte-17gehox{position:absolute;top:0;left:0;width:100%;height:100%;background:#00000080}.mobile-fullscreen-popup.svelte-17gehox{position:absolute;width:100%;height:100%;top:50%;left:50%;transform:translate(-50%,-50%);max-width:90%;max-height:80%;overflow-y:auto;background:transparent}.wine-recommendation-tile.svelte-yk3emv{display:flex;flex-direction:column;align-items:center;text-align:center;box-sizing:border-box;padding:16px 8px;border-right:2px solid #f6f7fd;position:relative;transform:translateY(0);opacity:1;transition:transform .18s cubic-bezier(.22,.61,.36,1),opacity .18s cubic-bezier(.22,.61,.36,1);will-change:transform,opacity}.wine-recommendation-tile.svelte-yk3emv:last-child{border-right:none}.wine-recommendation-tile.ww-slide-up.svelte-yk3emv{transform:translateY(-28px);opacity:0}.tile-top.svelte-yk3emv{display:flex;flex-direction:column;align-items:center;justify-content:flex-start}.wine-image.svelte-yk3emv{height:200px;object-fit:contain;margin:0 auto 16px;display:block}.wine-title.svelte-yk3emv{font-size:15px;font-weight:500;margin:0 0 8px;min-height:3rem;line-height:1.2;text-align:center;color:#000}.wine-params.svelte-yk3emv{font-size:14px;color:#666;white-space:normal;text-align:center}.bottom-row.svelte-yk3emv{margin-top:auto;display:flex;align-items:center;gap:12px;justify-content:center}.wine-price.svelte-yk3emv{font-size:16px;font-weight:400;margin-bottom:8px;color:#333}.buy-btn.svelte-yk3emv{margin:16px auto 0;background-color:transparent;color:var(--wineater-color);border:2px solid var(--wineater-color);border-radius:6px;padding:8px 16px;font-size:14px;font-weight:500;cursor:pointer;display:block;text-decoration:none;transition:background-color .2s,color .2s,box-shadow .2s}.buy-btn.svelte-yk3emv:hover{box-shadow:0 4px 8px #7b2beb40;background-color:var(--wineater-color);color:#fff}.wine-hover-popup.svelte-yk3emv{display:none;position:absolute;top:0;left:0;width:100%;padding:12px;background-color:#fff;border:1px solid #ddd;border-radius:8px;box-shadow:0 4px 16px #0000001a;transition:transform .3s ease;z-index:999}.wine-hover-popup.visible.svelte-yk3emv{display:block}.wine-hover-popup.slide-in.svelte-yk3emv{animation:svelte-yk3emv-whPopup .25s ease}.popup-reason.svelte-yk3emv{font-size:14px;font-weight:400;color:#333;margin-bottom:8px}.popup-tags.svelte-yk3emv{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px;justify-content:center}.popup-tag.svelte-yk3emv{display:inline-block;padding:4px 8px;border-radius:12px;background-color:#f5f0ff;border:1px solid #ddd;font-size:13px;color:#333;text-transform:capitalize}@keyframes svelte-yk3emv-whPopup{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@media screen and (max-width: 768px){.wine-recommendation-tile.svelte-yk3emv{flex:0 0 auto;scroll-snap-align:center;width:240px;text-align:center}}:root{--wineater-corp-color: #0044ff;--wineater-color: #7b2beb}*{box-sizing:border-box}.hidden{display:none}#wine-widget-container.svelte-1n46o8q{display:flex;gap:24px;font-family:Bricolage Grotesque,sans-serif;padding:12px 12px 0;border-radius:16px;background-color:#fff;box-shadow:0 4px 16px #0000001a;max-width:1024px;min-width:1024px;min-height:500px;margin:40px auto;position:relative;box-sizing:border-box}#wine-widget-container.svelte-1n46o8q [class^=icon-],#wine-widget-container.svelte-1n46o8q [class*=" icon-"]{font-family:Bricolage Grotesque,sans-serif!important}.wine-widget-wrapper.svelte-1n46o8q{width:100%}#wine-widget-right.svelte-1n46o8q{position:relative;min-height:300px}#wine-placeholder.svelte-1n46o8q{display:grid;grid-template-columns:repeat(4,1fr);gap:0;align-items:stretch;margin-bottom:0}.error-message.svelte-1n46o8q{text-align:center;padding:24px;color:#666}@media screen and (max-width: 768px){#wine-widget-container.svelte-1n46o8q{flex-direction:column;padding:0 16px;min-width:100vw}#wine-placeholder.svelte-1n46o8q{display:flex;gap:8px;overflow-x:auto;scroll-snap-type:x mandatory;padding:8px 0;width:calc(100vw - 32px);min-width:calc(100vw - 32px)}}
|