@saywright/studio 0.0.0-stage → 0.1.1

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.
Files changed (107) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/README.md +63 -2
  4. package/bin/saywright.mjs +10 -0
  5. package/dist/THIRD_PARTY_NOTICES.md +2699 -0
  6. package/dist/axe.min.js +12 -0
  7. package/dist/bridge.js +6582 -0
  8. package/dist/cli.mjs +56050 -0
  9. package/dist/client/assets/Calibration-xY4YDLzU.js +1 -0
  10. package/dist/client/assets/Calibration-xY4YDLzU.js.br +0 -0
  11. package/dist/client/assets/Calibration-xY4YDLzU.js.gz +0 -0
  12. package/dist/client/assets/CodeViews-ytEy2pIT.js +3 -0
  13. package/dist/client/assets/CodeViews-ytEy2pIT.js.br +0 -0
  14. package/dist/client/assets/CodeViews-ytEy2pIT.js.gz +0 -0
  15. package/dist/client/assets/CommandPalette-BA3akF-p.js +1 -0
  16. package/dist/client/assets/CommandPalette-BA3akF-p.js.br +0 -0
  17. package/dist/client/assets/CommandPalette-BA3akF-p.js.gz +0 -0
  18. package/dist/client/assets/HelpDialog-C6qmdEwi.js +1 -0
  19. package/dist/client/assets/HelpDialog-C6qmdEwi.js.br +0 -0
  20. package/dist/client/assets/HelpDialog-C6qmdEwi.js.gz +0 -0
  21. package/dist/client/assets/ReportView-Bj9xxLCi.js +4 -0
  22. package/dist/client/assets/ReportView-Bj9xxLCi.js.br +0 -0
  23. package/dist/client/assets/ReportView-Bj9xxLCi.js.gz +0 -0
  24. package/dist/client/assets/SettingsDialog-VrACcdUX.js +1 -0
  25. package/dist/client/assets/SettingsDialog-VrACcdUX.js.br +0 -0
  26. package/dist/client/assets/SettingsDialog-VrACcdUX.js.gz +0 -0
  27. package/dist/client/assets/asr.worker-FcRNDSsJ.js +17 -0
  28. package/dist/client/assets/asr.worker-FcRNDSsJ.js.br +0 -0
  29. package/dist/client/assets/asr.worker-FcRNDSsJ.js.gz +0 -0
  30. package/dist/client/assets/button-B2NFEpCs.js +18 -0
  31. package/dist/client/assets/button-B2NFEpCs.js.br +0 -0
  32. package/dist/client/assets/button-B2NFEpCs.js.gz +0 -0
  33. package/dist/client/assets/camera-BD9K1f5I.js +1 -0
  34. package/dist/client/assets/cn-Wq33h1G4.js +1 -0
  35. package/dist/client/assets/cn-Wq33h1G4.js.br +0 -0
  36. package/dist/client/assets/cn-Wq33h1G4.js.gz +0 -0
  37. package/dist/client/assets/confirm-D1U-bFIL.js +41 -0
  38. package/dist/client/assets/confirm-D1U-bFIL.js.br +0 -0
  39. package/dist/client/assets/confirm-D1U-bFIL.js.gz +0 -0
  40. package/dist/client/assets/footprints-DiYtIryA.js +1 -0
  41. package/dist/client/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  42. package/dist/client/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  43. package/dist/client/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  44. package/dist/client/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  45. package/dist/client/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
  46. package/dist/client/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
  47. package/dist/client/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
  48. package/dist/client/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
  49. package/dist/client/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
  50. package/dist/client/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
  51. package/dist/client/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  52. package/dist/client/assets/index-BakNwOFF.css +2 -0
  53. package/dist/client/assets/index-BakNwOFF.css.br +0 -0
  54. package/dist/client/assets/index-BakNwOFF.css.gz +0 -0
  55. package/dist/client/assets/index-DUAtV_Av.js +18 -0
  56. package/dist/client/assets/index-DUAtV_Av.js.br +0 -0
  57. package/dist/client/assets/index-DUAtV_Av.js.gz +0 -0
  58. package/dist/client/assets/ort-wasm-simd-threaded-DcHrbrbl.wasm +0 -0
  59. package/dist/client/assets/preload-helper-BLdHbfdN.js +1 -0
  60. package/dist/client/assets/preload-helper-BLdHbfdN.js.br +0 -0
  61. package/dist/client/assets/preload-helper-BLdHbfdN.js.gz +0 -0
  62. package/dist/client/assets/refresh-cw-Dobx2YmO.js +1 -0
  63. package/dist/client/assets/tracker.worker-DWwj76VA.js +41 -0
  64. package/dist/client/assets/tracker.worker-DWwj76VA.js.br +0 -0
  65. package/dist/client/assets/tracker.worker-DWwj76VA.js.gz +0 -0
  66. package/dist/client/assets/vision_bundle-ByYCzljp.js +41 -0
  67. package/dist/client/assets/vision_bundle-ByYCzljp.js.br +0 -0
  68. package/dist/client/assets/vision_bundle-ByYCzljp.js.gz +0 -0
  69. package/dist/client/favicon.svg +1 -0
  70. package/dist/client/index.html +27 -0
  71. package/dist/client/index.html.br +0 -0
  72. package/dist/client/index.html.gz +0 -0
  73. package/dist/client/voice-capture-worklet.js +23 -0
  74. package/dist/sample/index.html +13 -0
  75. package/dist/sample/package.json +23 -0
  76. package/dist/sample/playwright.config.ts +20 -0
  77. package/dist/sample/saywright.config.json +68 -0
  78. package/dist/sample/src/App.tsx +32 -0
  79. package/dist/sample/src/components/AddressCard.tsx +16 -0
  80. package/dist/sample/src/components/CouponField.tsx +50 -0
  81. package/dist/sample/src/components/Header.tsx +26 -0
  82. package/dist/sample/src/components/LineItems.tsx +22 -0
  83. package/dist/sample/src/components/OrderSummary.tsx +32 -0
  84. package/dist/sample/src/components/ProductCard.tsx +26 -0
  85. package/dist/sample/src/ds/Badge.tsx +14 -0
  86. package/dist/sample/src/ds/Button.tsx +16 -0
  87. package/dist/sample/src/ds/Card.tsx +17 -0
  88. package/dist/sample/src/ds/Heading.tsx +14 -0
  89. package/dist/sample/src/ds/ProductGrid.tsx +15 -0
  90. package/dist/sample/src/ds/SummaryRow.tsx +18 -0
  91. package/dist/sample/src/ds/TextField.tsx +31 -0
  92. package/dist/sample/src/ds/index.ts +7 -0
  93. package/dist/sample/src/lib/cart.ts +20 -0
  94. package/dist/sample/src/lib/money.ts +7 -0
  95. package/dist/sample/src/lib/pricing.ts +34 -0
  96. package/dist/sample/src/lib/route.ts +17 -0
  97. package/dist/sample/src/main.tsx +10 -0
  98. package/dist/sample/src/pages/Checkout.tsx +37 -0
  99. package/dist/sample/src/pages/Shop.tsx +27 -0
  100. package/dist/sample/src/styles.css +155 -0
  101. package/dist/sample/tests/smoke.spec.ts +7 -0
  102. package/dist/sample/tsconfig.json +37 -0
  103. package/dist/sample/vite.config.ts +8 -0
  104. package/dist/server/node-BgmEDdmn.mjs +23 -0
  105. package/dist/server/node-DuXxFg5I.mjs +2501 -0
  106. package/dist/server/speech-worker.mjs +266 -0
  107. package/package.json +97 -4
@@ -0,0 +1,155 @@
1
+ /* Tidewell design tokens. Components read these; nothing else should hardcode colors. */
2
+ :root {
3
+ --ink: #1b1f1c;
4
+ --ink-2: #4a504b;
5
+ --ink-3: #8a908a;
6
+ --bg: #f7f6f2;
7
+ --surface: #ffffff;
8
+ --line: #e9e7e0;
9
+ --line-2: #dedbd2;
10
+ --brand: #1f4d3a;
11
+ --brand-ink: #ffffff;
12
+ --brand-soft: #e7efe9;
13
+ --success: #2f7a4d;
14
+ --success-soft: #e6f2ea;
15
+ --danger: #b4362b;
16
+ --danger-soft: #fbeae7;
17
+ --focus: #2b6cb0;
18
+
19
+ --radius-sm: 8px;
20
+ --radius-md: 12px;
21
+ --radius-lg: 16px;
22
+
23
+ --space-2: 8px;
24
+ --space-3: 12px;
25
+ --space-4: 16px;
26
+ --space-5: 20px;
27
+ --space-6: 24px;
28
+ --space-8: 32px;
29
+
30
+ --font: ui-sans-serif, -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
31
+ --font-display: 'New York', 'Iowan Old Style', Georgia, serif;
32
+ --shadow-sm: 0 1px 2px rgba(20, 24, 20, 0.05);
33
+ --shadow-md: 0 6px 24px rgba(20, 24, 20, 0.06);
34
+ }
35
+
36
+ * { box-sizing: border-box; }
37
+ html, body { margin: 0; }
38
+ body {
39
+ font-family: var(--font);
40
+ color: var(--ink);
41
+ background: var(--bg);
42
+ font-size: 15px;
43
+ line-height: 1.5;
44
+ -webkit-font-smoothing: antialiased;
45
+ }
46
+ button, input { font: inherit; color: inherit; }
47
+ :focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
48
+
49
+ /* layout */
50
+ .shell { min-height: 100vh; display: flex; flex-direction: column; }
51
+ .header { height: 64px; display: flex; align-items: center; gap: 28px; padding: 0 40px; background: var(--surface); border-bottom: 1px solid var(--line); }
52
+ .logo { font-family: var(--font-display); font-style: italic; font-size: 26px; color: var(--brand); text-decoration: none; letter-spacing: -0.01em; }
53
+ .nav { display: flex; gap: 4px; }
54
+ .nav a { color: var(--ink-2); text-decoration: none; padding: 6px 12px; border-radius: 999px; font-size: 14px; }
55
+ .nav a[aria-current='page'] { background: var(--brand-soft); color: var(--brand); font-weight: 600; }
56
+ .header-end { margin-left: auto; color: var(--ink-3); font-size: 13px; display: flex; align-items: center; gap: 8px; }
57
+ .page { width: 100%; max-width: 1120px; margin: 0 auto; padding: 32px 40px 64px; }
58
+ .page-head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 24px; gap: 16px; }
59
+ .steps { display: flex; align-items: center; gap: 10px; color: var(--ink-3); font-size: 13px; }
60
+ .steps i { width: 20px; height: 1px; background: var(--line-2); }
61
+ .steps b { color: var(--ink); font-weight: 600; }
62
+ .checkout { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr); gap: 24px; align-items: start; }
63
+ .stack { display: grid; gap: 24px; }
64
+ @media (max-width: 860px) { .checkout { grid-template-columns: minmax(0, 1fr); } .page { padding: 24px 20px 48px; } .header { padding: 0 20px; } }
65
+
66
+ /* design system: Card */
67
+ .ds-card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); }
68
+ .ds-card[data-padding='sm'] { padding: var(--space-4); }
69
+ .ds-card[data-padding='md'] { padding: var(--space-6); }
70
+ .ds-card[data-padding='lg'] { padding: var(--space-8); }
71
+ .ds-card[data-tone='muted'] { background: var(--bg); }
72
+ .ds-card[data-tone='brand'] { background: var(--brand-soft); border-color: transparent; }
73
+ .ds-card-title { margin: 0 0 var(--space-4); font-size: 15px; font-weight: 600; }
74
+
75
+ /* Heading */
76
+ .ds-heading { margin: 0; font-family: var(--font-display); font-weight: 500; letter-spacing: -0.015em; color: var(--ink); }
77
+ .ds-heading[data-size='sm'] { font-size: 18px; }
78
+ .ds-heading[data-size='md'] { font-size: 24px; }
79
+ .ds-heading[data-size='lg'] { font-size: 32px; }
80
+ .ds-heading[data-size='xl'] { font-size: 44px; }
81
+
82
+ /* Button */
83
+ .ds-button { appearance: none; border: 0; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 8px; font-weight: 600; border-radius: var(--radius-md); white-space: nowrap; transition: background 0.15s, box-shadow 0.15s, transform 0.05s; }
84
+ .ds-button:active { transform: translateY(1px); }
85
+ .ds-button[data-size='sm'] { height: 34px; padding: 0 14px; font-size: 13px; }
86
+ .ds-button[data-size='md'] { height: 44px; padding: 0 18px; font-size: 15px; }
87
+ .ds-button[data-size='lg'] { height: 54px; padding: 0 24px; font-size: 16px; }
88
+ .ds-button[data-variant='primary'] { background: var(--brand); color: var(--brand-ink); }
89
+ .ds-button[data-variant='primary']:hover { background: #18402f; }
90
+ .ds-button[data-variant='secondary'] { background: var(--surface); color: var(--brand); box-shadow: inset 0 0 0 1.5px var(--brand); }
91
+ .ds-button[data-variant='secondary']:hover { background: var(--brand-soft); }
92
+ .ds-button[data-variant='ghost'] { background: transparent; color: var(--ink-2); }
93
+ .ds-button[data-variant='ghost']:hover { background: var(--bg); }
94
+ .ds-button[data-variant='link'] { background: transparent; color: var(--brand); padding-left: 6px; padding-right: 6px; text-decoration: underline; text-underline-offset: 3px; text-decoration-color: color-mix(in srgb, var(--brand) 40%, transparent); }
95
+ .ds-button[data-variant='danger'] { background: var(--danger); color: #fff; }
96
+ .ds-button[data-full='true'] { width: 100%; }
97
+ .ds-button:disabled { opacity: 0.5; cursor: not-allowed; }
98
+
99
+ /* Badge */
100
+ .ds-badge { display: inline-flex; align-items: center; gap: 6px; height: 24px; padding: 0 9px; border-radius: 999px; font-size: 12px; font-weight: 600; }
101
+ .ds-badge[data-tone='neutral'] { background: var(--bg); color: var(--ink-2); }
102
+ .ds-badge[data-tone='success'] { background: var(--success-soft); color: var(--success); }
103
+ .ds-badge[data-tone='danger'] { background: var(--danger-soft); color: var(--danger); }
104
+ .ds-badge[data-tone='brand'] { background: var(--brand-soft); color: var(--brand); }
105
+
106
+ /* SummaryRow */
107
+ .ds-row { display: flex; align-items: center; justify-content: space-between; gap: 16px; color: var(--ink-2); min-height: 32px; }
108
+ .ds-row[data-size='sm'] { font-size: 13px; }
109
+ .ds-row[data-size='md'] { font-size: 15px; }
110
+ .ds-row[data-size='lg'] { font-size: 18px; }
111
+ .ds-row[data-emphasis='strong'] { color: var(--ink); font-weight: 700; }
112
+ .ds-row[data-tone='success'] .ds-row-value { color: var(--success); font-weight: 600; }
113
+ .ds-row[data-tone='danger'] .ds-row-value { color: var(--danger); font-weight: 600; }
114
+ .ds-row-value { font-variant-numeric: tabular-nums; }
115
+
116
+ /* TextField */
117
+ .ds-field { display: grid; gap: 6px; }
118
+ .ds-field label { font-size: 13px; color: var(--ink-2); font-weight: 500; }
119
+ .ds-input { height: 44px; border-radius: var(--radius-md); border: 1px solid var(--line-2); background: var(--surface); padding: 0 14px; outline: none; transition: border-color 0.15s, box-shadow 0.15s; }
120
+ .ds-input:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-soft); }
121
+ .ds-input[aria-invalid='true'] { border-color: var(--danger); }
122
+ .ds-field-hint { font-size: 12px; color: var(--ink-3); }
123
+ .ds-field-hint[data-tone='danger'] { color: var(--danger); }
124
+
125
+ /* checkout pieces */
126
+ .address { color: var(--ink-2); line-height: 1.6; }
127
+ .line-items { display: grid; }
128
+ .line-item { display: grid; grid-template-columns: 56px minmax(0, 1fr) auto; gap: 14px; align-items: center; padding: 14px 0; border-top: 1px solid var(--line); }
129
+ .line-item:first-child { border-top: 0; padding-top: 0; }
130
+ .thumb { width: 56px; height: 56px; border-radius: 12px; }
131
+ .line-item b { display: block; font-weight: 600; }
132
+ .line-item small { color: var(--ink-3); font-size: 12.5px; }
133
+ .price { font-variant-numeric: tabular-nums; }
134
+ .coupon { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 10px; align-items: end; }
135
+ .coupon-applied { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 12px; border-radius: var(--radius-md); background: var(--success-soft); }
136
+ .summary { display: grid; gap: 6px; }
137
+ .summary hr { border: 0; height: 1px; background: var(--line); margin: 8px 0; width: 100%; }
138
+ .pay-note { margin: 12px 0 0; text-align: center; font-size: 12.5px; color: var(--ink-3); }
139
+
140
+ /* shop */
141
+ .ds-grid { display: grid; }
142
+ .ds-grid[data-columns='2'] { grid-template-columns: repeat(2, minmax(0, 1fr)); }
143
+ .ds-grid[data-columns='3'] { grid-template-columns: repeat(3, minmax(0, 1fr)); }
144
+ .ds-grid[data-columns='4'] { grid-template-columns: repeat(4, minmax(0, 1fr)); }
145
+ .ds-grid[data-gap='sm'] { gap: var(--space-3); }
146
+ .ds-grid[data-gap='md'] { gap: var(--space-6); }
147
+ .ds-grid[data-gap='lg'] { gap: var(--space-8); }
148
+ .ds-grid[data-gap='xl'] { gap: 48px; }
149
+ .product { display: grid; gap: 10px; }
150
+ .product-img { aspect-ratio: 4 / 3; border-radius: var(--radius-lg); }
151
+ .product-meta { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; }
152
+ .product-meta b { font-weight: 600; }
153
+ .product-meta span { color: var(--ink-2); font-variant-numeric: tabular-nums; }
154
+ .product small { color: var(--ink-3); }
155
+ .toast { position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%); background: var(--ink); color: #fff; padding: 10px 16px; border-radius: 999px; font-size: 14px; box-shadow: var(--shadow-md); }
@@ -0,0 +1,7 @@
1
+ import { expect, test } from '@playwright/test';
2
+
3
+ test('checkout page loads', async ({ page }) => {
4
+ await page.goto('/');
5
+ await expect(page.getByRole('heading', { name: 'Checkout' })).toBeVisible();
6
+ await expect(page.getByTestId('summary-total')).toContainText('$');
7
+ });
@@ -0,0 +1,37 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": [
5
+ "ES2023",
6
+ "DOM",
7
+ "DOM.Iterable"
8
+ ],
9
+ "module": "ESNext",
10
+ "moduleResolution": "bundler",
11
+ "customConditions": [
12
+ "source"
13
+ ],
14
+ "jsx": "react-jsx",
15
+ "strict": true,
16
+ "noUncheckedIndexedAccess": false,
17
+ "noFallthroughCasesInSwitch": true,
18
+ "noUnusedLocals": true,
19
+ "noUnusedParameters": true,
20
+ "skipLibCheck": true,
21
+ "resolveJsonModule": true,
22
+ "isolatedModules": true,
23
+ "verbatimModuleSyntax": false,
24
+ "allowImportingTsExtensions": true,
25
+ "noEmit": true,
26
+ "types": [
27
+ "vite/client",
28
+ "node"
29
+ ]
30
+ },
31
+ "include": [
32
+ "src",
33
+ "tests",
34
+ "playwright.config.ts",
35
+ "vite.config.ts"
36
+ ]
37
+ }
@@ -0,0 +1,8 @@
1
+ import { defineConfig } from 'vite';
2
+ import react from '@vitejs/plugin-react';
3
+ import saywright from '@saywright/vite';
4
+
5
+ export default defineConfig({
6
+ plugins: [saywright(), react()],
7
+ server: { port: 5174 },
8
+ });
@@ -0,0 +1,23 @@
1
+ import { p as __exportAll } from "../cli.mjs";
2
+ import * as path$1 from "node:path";
3
+ import * as fs$1 from "node:fs";
4
+ import * as child_process from "node:child_process";
5
+ import * as util from "node:util";
6
+ import * as crypto$1 from "node:crypto";
7
+ import * as stream from "node:stream";
8
+ //#region ../../node_modules/@anthropic-ai/sdk/internal/node.mjs
9
+ /**
10
+ * The one module under `src/` that may import Node built-ins (eslint enforces this).
11
+ * The package.json `browser` field swaps it for `./node.browser`, so only touch its
12
+ * exports on code paths that run on Node-compatible runtimes.
13
+ */
14
+ var node_exports = /* @__PURE__ */ __exportAll({
15
+ child_process: () => child_process,
16
+ crypto: () => crypto$1,
17
+ fs: () => fs$1,
18
+ path: () => path$1,
19
+ stream: () => stream,
20
+ util: () => util
21
+ });
22
+ //#endregion
23
+ export { path$1 as a, node_exports as i, crypto$1 as n, stream as o, fs$1 as r, util as s, child_process as t };