@asrunjs/asrun 0.6.1 → 0.7.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/docs/install.md CHANGED
@@ -23,8 +23,10 @@ pnpm go
23
23
 
24
24
  `init --install` scaffolds the workspace and then adds the dependency. Running `init` first matters on pnpm 12: it
25
25
  writes `pnpm-workspace.yaml` with the `allowBuilds` entry (`esbuild` through `tsx`, `ffmpeg-static`), and without it
26
- `pnpm add` exits with `ERR_PNPM_IGNORED_BUILDS`. An existing `pnpm-workspace.yaml` that lacks the entry gets a note
27
- instead: add the block by hand (see "Manual install").
26
+ `pnpm add` exits with `ERR_PNPM_IGNORED_BUILDS`. The same file lists `@asrunjs/asrun` under `minimumReleaseAgeExclude`,
27
+ so pnpm's 24-hour release age does not hold a fresh release back (see
28
+ [troubleshooting.md](./troubleshooting.md#installing)). An existing `pnpm-workspace.yaml` that lacks either entry gets
29
+ a note instead: add the block by hand (see "Manual install").
28
30
 
29
31
  `init` also records `@asrunjs/asrun` (pinned to its own version) in the workspace `package.json`, so `pnpm install`
30
32
  installs the framework even without `--install`. When the install step itself fails — `pnpm` is not on `PATH`, the
@@ -39,7 +41,9 @@ registry is unreachable, or a build script is not approved — `init` names the
39
41
  4. starts the web UI at http://127.0.0.1:4173 and opens it.
40
42
 
41
43
  Run it again on any day: the install step then takes seconds, and if the UI is already running it only opens it.
42
- `pnpm go --no-open` does not open a browser. Set `ASRUN_UI_PORT` to change the port.
44
+ `pnpm go --no-open` does not open a browser; `pnpm go --no-ui` stops after step 3, with the workspace prepared and no
45
+ server running; `pnpm go --dry-run` only prints the workspace, the framework and the `asrun` command it resolved, then
46
+ exits. Set `ASRUN_UI_PORT` to change the port.
43
47
 
44
48
  The UI is optional: all commands in [commands.md](./commands.md) work without it.
45
49
 
@@ -53,13 +57,15 @@ pnpm asrun init
53
57
  pnpm go
54
58
  ```
55
59
 
56
- If pnpm refuses the build scripts of `esbuild` / `ffmpeg-static`, add this to `pnpm-workspace.yaml` and run the
57
- install again:
60
+ If pnpm refuses the build scripts of `esbuild` / `ffmpeg-static`, or installs the release before `latest`, add this to
61
+ `pnpm-workspace.yaml` and run the install again:
58
62
 
59
63
  ```yaml
60
64
  allowBuilds:
61
65
  esbuild: true
62
66
  ffmpeg-static: true
67
+ minimumReleaseAgeExclude:
68
+ - '@asrunjs/asrun'
63
69
  ```
64
70
 
65
71
  To pin a version:
@@ -68,7 +74,8 @@ To pin a version:
68
74
  pnpm add -D @asrunjs/asrun@<version>
69
75
  ```
70
76
 
71
- `pnpm asrun init` is safe to run many times: it never overwrites a file the project owns.
77
+ `pnpm asrun init` is safe to run many times: it never overwrites a file the project owns unless `--force` asks for
78
+ it (and `--reset-rules` for the project's rules).
72
79
 
73
80
  ## What `init` writes
74
81
 
@@ -86,13 +93,16 @@ Flags:
86
93
  |---|---|
87
94
  | `--root <dir>` | initialize that folder instead of the current one |
88
95
  | `--update` | refresh only the generated files |
96
+ | `--force` | overwrite every file init writes, for a clean installation (keeps `profiles.yaml` and `package.json`) |
89
97
  | `--force <path>` | overwrite one file init owns (repeatable) |
90
98
  | `--reset-rules` | allow `--force` on `AGENTS.md`, `CLAUDE.md` or `.claude/skills/**` |
91
99
  | `--no-env` | do not write `.env` |
92
100
  | `--install [spec]` | also add the dependency (default `@asrunjs/asrun`) |
93
101
 
94
- `AGENTS.md`, `CLAUDE.md` and `.claude/skills/**` belong to the project. `init --force` refuses them without
95
- `--reset-rules`, so a framework update can never replace a project's rules.
102
+ `AGENTS.md`, `CLAUDE.md` and `.claude/skills/**` belong to the project. `init --force` keeps them unless
103
+ `--reset-rules` is given, so a framework update can never replace a project's rules. `--force` also keeps
104
+ `profiles.yaml` and `package.json`: replace the profiles with `--force profiles.yaml`; `package.json` is only merged
105
+ into, so your scripts and dependencies stay.
96
106
 
97
107
  ## Update
98
108
 
@@ -103,7 +113,8 @@ pnpm asrun doctor
103
113
  ```
104
114
 
105
115
  `init --update` rewrites only the generated files and leaves project rules, case files, values and baselines alone.
106
- `doctor` tells you when the workspace is behind the installed version.
116
+ `init --force` rewrites every file init writes (see the flags above). `doctor` tells you when the workspace is
117
+ behind the installed version.
107
118
 
108
119
  There is no folder to move: the framework lives in `node_modules`, which the package manager owns. To change the
109
120
  framework itself, `pnpm patch @asrunjs/asrun` (a committed patch).
@@ -169,6 +180,32 @@ and `pnpm-workspace.yaml`.
169
180
  Never commit or share `.auth/` (one saved login per profile, as sensitive as a password), `reports/`, `.tmp/`,
170
181
  `.explore/`, `.env` or `node_modules/`. The asrun block of `.gitignore` covers them.
171
182
 
183
+ ## Reset and reinstall
184
+
185
+ To get a clean environment without losing the project's test content:
186
+
187
+ ```bash
188
+ pnpm asrun reset # lists what it removes, then asks
189
+ pnpm dlx @asrunjs/asrun init --install
190
+ pnpm go
191
+ ```
192
+
193
+ `reset` removes `node_modules/` and the files `init` writes: the generated config and commands, `.asrun.json`, the
194
+ asrun block of `.gitignore` and the `ASRUN_ROOT` lines of `.env`. It deletes a once-only file only when it is still
195
+ identical to its template, so a file you edited is kept (and listed). `cases/`, specs and their baselines,
196
+ `profiles.yaml`, `package.json` and `.claude/skills/**` are never removed.
197
+
198
+ | Flag | Meaning |
199
+ |---|---|
200
+ | `--root <dir>` | reset that folder instead of the current workspace |
201
+ | `--dry-run` | list what would be removed, and change nothing |
202
+ | `--yes` | skip the confirmation (for unattended runs) |
203
+ | `--state` | also remove `.auth/`, `reports/`, `.tmp/`, `.explore/`, `test-results/`, `playwright-report/`, `.playwright-mcp/` |
204
+ | `--lockfile` | also remove `pnpm-lock.yaml`, so the next install resolves the dependencies again |
205
+
206
+ Without `--yes` it asks you to type `yes`; a run without a terminal refuses instead of removing anything. It refuses
207
+ to run on the framework's own checkout. `--state` removes saved logins, so every profile must be signed in again.
208
+
172
209
  ## Uninstall
173
210
 
174
211
  ```bash
@@ -176,4 +213,4 @@ pnpm remove @asrunjs/asrun
176
213
  ```
177
214
 
178
215
  Then delete the workspace files you no longer want (`profiles.yaml`, `cases/`, `tests/`, the generated commands and
179
- configs, `.asrun.json`). They are ordinary files: keep them if another tool still uses them.
216
+ configs, `.asrun.json`). `pnpm asrun reset` does most of that; keep the files if another tool still uses them.
@@ -67,6 +67,37 @@ is recorded.
67
67
  checkout has the card but not the screenshot. Run the exploration again on this machine (or look at the card and the
68
68
  report's baseline).
69
69
 
70
+ ## Installing
71
+
72
+ **`pnpm add` installs the previous release instead of `latest`** — pnpm holds back versions published in the last
73
+ 24 hours (`minimumReleaseAge`, 1440 minutes), so right after a release `latest` resolves to the version before it.
74
+ Exempt the framework in `pnpm-workspace.yaml` (the file `init` writes already does):
75
+
76
+ ```yaml
77
+ minimumReleaseAgeExclude:
78
+ - '@asrunjs/asrun'
79
+ ```
80
+
81
+ For a single command, set the same list as a JSON array:
82
+ `PNPM_CONFIG_MINIMUM_RELEASE_AGE_EXCLUDE='["@asrunjs/asrun"]'` (a comma-separated list is not parsed), or turn the wait
83
+ off for that command with `PNPM_CONFIG_MINIMUM_RELEASE_AGE=0`. The wait covers `pnpm dlx @asrunjs/asrun init` too. Once
84
+ `minimumReleaseAgeStrict` is on, the install fails with `ERR_PNPM_NO_MATURE_MATCHING_VERSION` instead of falling back.
85
+
86
+ **`ERR_PNPM_IGNORED_BUILDS` while installing** — pnpm refused the build scripts of `esbuild` / `ffmpeg-static`. Run
87
+ `pnpm dlx @asrunjs/asrun init` first (it writes the `allowBuilds` entry), or add it to `pnpm-workspace.yaml` by hand;
88
+ see [install.md](./install.md#manual-install).
89
+
90
+ **`init` stopped and `.asrun.json` is missing** — the workspace files are written, but the `pnpm add -D
91
+ @asrunjs/asrun` step failed, and `init` printed the reason (most often `pnpm` is not on `PATH`, or the registry
92
+ refused the install). Run the command it prints, then `pnpm asrun init` again. Until then `pnpm asrun` and every
93
+ script that calls `asrun` do not exist, and `pnpm asrun doctor` reports both the missing framework and the missing
94
+ marker.
95
+
96
+ **The workspace looks half-installed, or you want fresh dependencies** — run `pnpm asrun reset` (add `--dry-run` to
97
+ see the list first, `--yes` to skip the prompt). It removes `node_modules` and the files `init` wrote; edited files,
98
+ cases, specs, `profiles.yaml` and `package.json` stay. Then run `pnpm dlx @asrunjs/asrun init --install` and
99
+ `pnpm go`. `--state` also clears saved logins and reports, and `--lockfile` clears the lockfile.
100
+
70
101
  ## AI steps
71
102
 
72
103
  **An AI command says the `playwright-test` MCP server is missing** — run `pnpm asrun doctor`. OpenCode reads only
@@ -91,16 +122,6 @@ read it. `doctor` lists the overrides it sees.
91
122
  **`pnpm asrun init --force AGENTS.md` is refused** — `AGENTS.md`, `CLAUDE.md` and `.claude/skills/**` belong to the
92
123
  project. Add `--reset-rules` to replace them with the template, and expect to lose the project's rules.
93
124
 
94
- **`ERR_PNPM_IGNORED_BUILDS` while installing** — pnpm refused the build scripts of `esbuild` / `ffmpeg-static`. Run
95
- `pnpm dlx @asrunjs/asrun init` first (it writes the `allowBuilds` entry), or add it to `pnpm-workspace.yaml` by hand;
96
- see [install.md](./install.md#manual-install).
97
-
98
- **`init` stopped and `.asrun.json` is missing** — the workspace files are written, but the `pnpm add -D
99
- @asrunjs/asrun` step failed, and `init` printed the reason (most often `pnpm` is not on `PATH`, or the registry
100
- refused the install). Run the command it prints, then `pnpm asrun init` again. Until then `pnpm asrun` and every
101
- script that calls `asrun` do not exist, and `pnpm asrun doctor` reports both the missing framework and the missing
102
- marker.
103
-
104
125
  **The AI did something you did not expect** — exploring and generating only read pages and edit the case file; healing
105
126
  edits the spec and runs it under the same write gate as any run (staging writes are allowed, any other environment
106
127
  needs a person's confirmation). None of them writes product data on its own, and none updates a baseline. If a step
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asrunjs/asrun",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "Multi-profile end-to-end test suite: plain-language cases, AI-written Playwright specs, evidence for every run.",
5
5
  "license": "UNLICENSED",
6
6
  "author": "Zoro Chen",
@@ -42,6 +42,38 @@
42
42
  "publishConfig": {
43
43
  "access": "public"
44
44
  },
45
+ "scripts": {
46
+ "go": "node scripts/go.mjs",
47
+ "bootstrap": "pnpm install && playwright install chromium",
48
+ "signin": "tsx scripts/login.ts",
49
+ "status": "tsx scripts/status.ts",
50
+ "reset": "tsx scripts/cli.ts reset",
51
+ "asrun": "tsx scripts/cli.ts",
52
+ "report": "tsx scripts/report.ts",
53
+ "heal:evidence": "node scripts/heal-evidence.mjs",
54
+ "explore": "tsx scripts/explore.ts",
55
+ "cleanup": "tsx scripts/cleanup.ts",
56
+ "case:new": "tsx scripts/new-case.ts",
57
+ "case:check": "tsx scripts/check-cases.ts",
58
+ "spec:lint": "tsx scripts/lint-specs.ts",
59
+ "baselines:review": "tsx scripts/review-baselines.ts",
60
+ "pdf:render": "tsx scripts/render-pdf.ts",
61
+ "demo:up": "node scripts/demo.mjs up",
62
+ "demo:build": "node scripts/demo.mjs build",
63
+ "demo:seed": "node scripts/demo.mjs seed",
64
+ "demo:reset": "node scripts/demo.mjs reset",
65
+ "demo:down": "node scripts/demo.mjs down",
66
+ "demo:logs": "node scripts/demo.mjs logs",
67
+ "demo:status": "node scripts/demo.mjs status",
68
+ "typecheck": "tsc --noEmit && tsc --noEmit -p ui/tsconfig.json",
69
+ "ui": "tsx scripts/ui.ts",
70
+ "ui:build": "tsx scripts/ui-build.ts",
71
+ "ui:dev": "tsx scripts/ui-dev.ts",
72
+ "build": "tsx scripts/build.ts",
73
+ "prepare": "pnpm build && pnpm ui:build",
74
+ "prepack": "pnpm build && pnpm ui:build",
75
+ "verify:pack": "node scripts/verify-pack.mjs"
76
+ },
45
77
  "peerDependencies": {
46
78
  "@playwright/test": "^1.64.0"
47
79
  },
@@ -88,33 +120,5 @@
88
120
  },
89
121
  "optionalDependencies": {
90
122
  "ffmpeg-static": "^5.3.0"
91
- },
92
- "scripts": {
93
- "go": "node scripts/go.mjs",
94
- "bootstrap": "pnpm install && playwright install chromium",
95
- "signin": "tsx scripts/login.ts",
96
- "status": "tsx scripts/status.ts",
97
- "asrun": "tsx scripts/cli.ts",
98
- "report": "tsx scripts/report.ts",
99
- "heal:evidence": "node scripts/heal-evidence.mjs",
100
- "explore": "tsx scripts/explore.ts",
101
- "cleanup": "tsx scripts/cleanup.ts",
102
- "case:new": "tsx scripts/new-case.ts",
103
- "case:check": "tsx scripts/check-cases.ts",
104
- "spec:lint": "tsx scripts/lint-specs.ts",
105
- "baselines:review": "tsx scripts/review-baselines.ts",
106
- "pdf:render": "tsx scripts/render-pdf.ts",
107
- "demo:up": "node scripts/demo.mjs up",
108
- "demo:build": "node scripts/demo.mjs build",
109
- "demo:seed": "node scripts/demo.mjs seed",
110
- "demo:reset": "node scripts/demo.mjs reset",
111
- "demo:down": "node scripts/demo.mjs down",
112
- "demo:logs": "node scripts/demo.mjs logs",
113
- "demo:status": "node scripts/demo.mjs status",
114
- "typecheck": "tsc --noEmit && tsc --noEmit -p ui/tsconfig.json",
115
- "ui": "tsx scripts/ui.ts",
116
- "ui:build": "tsx scripts/ui-build.ts",
117
- "ui:dev": "tsx scripts/ui-dev.ts",
118
- "build": "tsx scripts/build.ts"
119
123
  }
120
- }
124
+ }
@@ -1,5 +1,5 @@
1
- {
2
- "sandbox": {
3
- "excludedCommands": ["pnpm asrun *", "pnpm status *", "pnpm heal:evidence *", "tail *", "head *"]
4
- }
5
- }
1
+ {
2
+ "sandbox": {
3
+ "excludedCommands": ["pnpm asrun *", "pnpm status *", "pnpm heal:evidence *", "tail *", "head *"]
4
+ }
5
+ }
@@ -1 +1 @@
1
- @AGENTS.md
1
+ @AGENTS.md
@@ -1,13 +1,13 @@
1
- # >>> asrun (generated by `pnpm asrun init`; keep these lines)
2
- # Saved logins are equivalent to passwords: never commit or share them.
3
- .auth/
4
- reports/
5
- .tmp/
6
- .explore/
7
- test-results/
8
- playwright-report/
9
- .playwright-mcp/
10
- # Local settings: ASRUN_ROOT and machine-specific values.
11
- .env
12
- .env.*
13
- # <<< asrun
1
+ # >>> asrun (generated by `pnpm asrun init`; keep these lines)
2
+ # Saved logins are equivalent to passwords: never commit or share them.
3
+ .auth/
4
+ reports/
5
+ .tmp/
6
+ .explore/
7
+ test-results/
8
+ playwright-report/
9
+ .playwright-mcp/
10
+ # Local settings: ASRUN_ROOT and machine-specific values.
11
+ .env
12
+ .env.*
13
+ # <<< asrun
@@ -1,32 +1,33 @@
1
- {
2
- "name": "my-project",
3
- "private": true,
4
- "type": "module",
5
- "engines": {
6
- "node": ">=22"
7
- },
8
- "scripts": {
9
- "go": "asrun go",
10
- "asrun": "asrun",
11
- "signin": "asrun signin",
12
- "status": "asrun status",
13
- "report": "asrun report",
14
- "heal:evidence": "asrun heal:evidence",
15
- "explore": "asrun explore",
16
- "cleanup": "asrun cleanup",
17
- "case:new": "asrun case:new",
18
- "case:check": "asrun case:check",
19
- "spec:lint": "asrun spec:lint",
20
- "baselines:review": "asrun baselines:review",
21
- "pdf:render": "asrun pdf:render",
22
- "typecheck": "tsc --noEmit",
23
- "ui": "asrun ui",
24
- "ui:dev": "asrun ui:dev"
25
- },
26
- "devDependencies": {
27
- "@asrunjs/asrun": "{{asrun}}",
28
- "@playwright/test": "1.64.1",
29
- "@types/node": "^22.20.5",
30
- "typescript": "^7.0.2"
31
- }
32
- }
1
+ {
2
+ "name": "my-project",
3
+ "private": true,
4
+ "type": "module",
5
+ "engines": {
6
+ "node": ">=22"
7
+ },
8
+ "scripts": {
9
+ "go": "asrun go",
10
+ "asrun": "asrun",
11
+ "signin": "asrun signin",
12
+ "status": "asrun status",
13
+ "reset": "asrun reset",
14
+ "report": "asrun report",
15
+ "heal:evidence": "asrun heal:evidence",
16
+ "explore": "asrun explore",
17
+ "cleanup": "asrun cleanup",
18
+ "case:new": "asrun case:new",
19
+ "case:check": "asrun case:check",
20
+ "spec:lint": "asrun spec:lint",
21
+ "baselines:review": "asrun baselines:review",
22
+ "pdf:render": "asrun pdf:render",
23
+ "typecheck": "tsc --noEmit",
24
+ "ui": "asrun ui",
25
+ "ui:dev": "asrun ui:dev"
26
+ },
27
+ "devDependencies": {
28
+ "@asrunjs/asrun": "{{asrun}}",
29
+ "@playwright/test": "1.64.1",
30
+ "@types/node": "^22.20.5",
31
+ "typescript": "^7.0.2"
32
+ }
33
+ }
@@ -1,3 +1,3 @@
1
- // Generated by `pnpm asrun init`. The real configuration is `{{framework}}/dist/playwright.config.js`; it resolves the
2
- // workspace root (this folder) itself, so `pnpm asrun` finds `tests/`, `profiles.yaml` and `reports/` here.
3
- export {default} from '{{framework}}/dist/playwright.config.js';
1
+ // Generated by `pnpm asrun init`. The real configuration is `{{framework}}/dist/playwright.config.js`; it resolves the
2
+ // workspace root (this folder) itself, so `pnpm asrun` finds `tests/`, `profiles.yaml` and `reports/` here.
3
+ export {default} from '{{framework}}/dist/playwright.config.js';
@@ -1,5 +1,8 @@
1
- # `asrun` is a normal devDependency; this file only approves the build scripts its dependencies run.
2
- # The framework's dependencies (esbuild through tsx, ffmpeg-static) compile a binary on install.
3
- allowBuilds:
4
- esbuild: true
5
- ffmpeg-static: true
1
+ # `asrun` is a normal devDependency; this file approves the build scripts its dependencies run
2
+ # (esbuild through tsx and ffmpeg-static compile a binary on install) and exempts the framework
3
+ # from pnpm's 24-hour release age, so a fresh release installs right away.
4
+ allowBuilds:
5
+ esbuild: true
6
+ ffmpeg-static: true
7
+ minimumReleaseAgeExclude:
8
+ - '@asrunjs/asrun'
@@ -1,9 +1,9 @@
1
- import {test} from '@asrunjs/asrun/fixtures';
2
-
3
- test.use({mustLogin: false});
4
-
5
- // Used by the Playwright MCP agents to open a ready-to-use page for the current profile.
6
- // Not a real test: `pnpm asrun` skips anything tagged @seed.
7
- test('seed @seed', async ({page}) => {
8
- await page.goto('/');
9
- });
1
+ import {test} from '@asrunjs/asrun/fixtures';
2
+
3
+ test.use({mustLogin: false});
4
+
5
+ // Used by the Playwright MCP agents to open a ready-to-use page for the current profile.
6
+ // Not a real test: `pnpm asrun` skips anything tagged @seed.
7
+ test('seed @seed', async ({page}) => {
8
+ await page.goto('/');
9
+ });
@@ -1,14 +1,14 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "ESNext",
5
- "moduleResolution": "bundler",
6
- "strict": true,
7
- "noEmit": true,
8
- "skipLibCheck": true,
9
- "esModuleInterop": true,
10
- "resolveJsonModule": true,
11
- "types": ["node"]
12
- },
13
- "include": ["tests", "playwright.config.ts"]
14
- }
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "strict": true,
7
+ "noEmit": true,
8
+ "skipLibCheck": true,
9
+ "esModuleInterop": true,
10
+ "resolveJsonModule": true,
11
+ "types": ["node"]
12
+ },
13
+ "include": ["tests", "playwright.config.ts"]
14
+ }
@@ -1,11 +1,11 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
2
- <g transform="rotate(-3 32 32)">
3
- <rect x="5" y="5" width="54" height="54" rx="6" fill="#b5443a"/>
4
- <rect x="8" y="8" width="48" height="48" rx="4" fill="none" stroke="#f6f2e9" stroke-opacity="0.32" stroke-width="2"/>
5
- <polygon fill="#f6f2e9" points="30.6,15 33.4,15 22,48 19,48"/>
6
- <polygon fill="#f6f2e9" points="29.2,15 34.8,15 46.5,48 40.5,48"/>
7
- <rect fill="#f6f2e9" x="24.5" y="36.5" width="15" height="2.6"/>
8
- <rect fill="#f6f2e9" x="15" y="47" width="12" height="2.6"/>
9
- <rect fill="#f6f2e9" x="36.5" y="47" width="13" height="2.6"/>
10
- </g>
11
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
2
+ <g transform="rotate(-3 32 32)">
3
+ <rect x="5" y="5" width="54" height="54" rx="6" fill="#b5443a"/>
4
+ <rect x="8" y="8" width="48" height="48" rx="4" fill="none" stroke="#f6f2e9" stroke-opacity="0.32" stroke-width="2"/>
5
+ <polygon fill="#f6f2e9" points="30.6,15 33.4,15 22,48 19,48"/>
6
+ <polygon fill="#f6f2e9" points="29.2,15 34.8,15 46.5,48 40.5,48"/>
7
+ <rect fill="#f6f2e9" x="24.5" y="36.5" width="15" height="2.6"/>
8
+ <rect fill="#f6f2e9" x="15" y="47" width="12" height="2.6"/>
9
+ <rect fill="#f6f2e9" x="36.5" y="47" width="13" height="2.6"/>
10
+ </g>
11
+ </svg>
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z"/></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z"/></svg>
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M16 6H8v12h8V6zm4 16H4V2h16v20z"/></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M16 6H8v12h8V6zm4 16H4V2h16v20z"/></svg>