{"_id":"@arbetsformedlingen/yrkesvaljaren","_rev":"4-c3d82becf5e31afddbd0c360fff3258b","name":"@arbetsformedlingen/yrkesvaljaren","dist-tags":{"latest":"2.0.12"},"versions":{"2.0.5":{"name":"@arbetsformedlingen/yrkesvaljaren","version":"2.0.5","license":"Apache-2.0","_id":"@arbetsformedlingen/yrkesvaljaren@2.0.5","maintainers":[{"name":"fredrik.ampler.af","email":"fredrik.ampler@arbetsformedlingen.se"}],"dist":{"shasum":"34abeb6be03734ad53ed6478dcd207bdd3536979","tarball":"https://registry.npmjs.org/@arbetsformedlingen/yrkesvaljaren/-/yrkesvaljaren-2.0.5.tgz","fileCount":146,"integrity":"sha512-d+Te4G9rIla6nkngWG6jF9XrnUCK1MGp7f+S8/w3dKRJT21VcVUz04aKM/6c3nDRtyxqKmwFWkU1jsydO/HUkg==","signatures":[{"sig":"MEYCIQCE28oAvxRHuSDjcmk09T4p/4xS1jZNEovY6jLV56yfOwIhAP81Sf2sfzZiSbcBYJ/LvUqS7wdXjqKZ7k24WZYOi6mQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3064381},"main":"dist/index.js","type":"module","types":"dist/types/index.d.ts","unpkg":"dist/job-selector/job-selector.esm.js","module":"dist/index.js","engines":{"node":">=22"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js"},"./loader":{"types":"./loader/index.d.ts","import":"./loader/index.js"},"./package.json":"./package.json"},"gitHead":"0b4dfd2cda9aa6f37f7532987fb1a2f4367eaca1","scripts":{"lint":"npx eslint","test":"vitest run --coverage --reporter=default --reporter=junit --outputFile.junit=junit.xml","build":"npm run build:data && npm run sync:kv-demo-data && npm run build -w @taxonomy/kompetensvaljaren && stencil build","start":"npm run dev:root","verify":"npm run lint && npm run typecheck && npm run test && npm run test:scripts && npm run test:contracts && npm run build && npm run check:packages && npm run prepare:e2e && npm run test:e2e:functional:prepared && npm run test:visual:coverage","dev:e2e":"node scripts/sync-e2e-assets.mjs && cd e2e-test-app && npm run dev","pretest":"npm run build -w @taxonomy/core","build:kv":"npm run build -w @taxonomy/kompetensvaljaren","dev:root":"npm run build:data && npm run build:kv && npm run sync:kv-demo-data && node scripts/ensure-loaders.mjs && stencil build --dev --watch --serve","start:kv":"npm run build:data && npm run sync:kv-demo-data && npm start -w @taxonomy/kompetensvaljaren","test:e2e":"npm run build && npm run test:e2e:built","watch:kv":"npm run watch -w @taxonomy/kompetensvaljaren","postbuild":"node scripts/prune-stencil-collection.mjs dist job-selector-demo geo-valjaren neobrutal-search","typecheck":"npm run typecheck:root && npm run typecheck:kompetensvaljaren","build:data":"node scripts/build-data-workspaces.mjs --family=kompetensvaljaren","test:watch":"vitest --coverage","build:pages":"npm run sync:doc-data-packages && npm run build","prepare:e2e":"npm ci --prefix e2e-test-app --install-links && node scripts/sync-e2e-assets.mjs","test:pre-mr":"npm run verify","test:visual":"node scripts/run-visual-tests.mjs","verify:full":"npm run verify && npm run test:e2e:cross-browser && npm run test:package-consumer && npm run test:visual:docker","pretypecheck":"npm run build -w @taxonomy/core","refresh:data":"node scripts/build-data-workspaces.mjs","test:scripts":"NODE_OPTIONS=--experimental-vm-modules jest --config jest.config.scripts.cjs","validate:data":"node scripts/validate-taxonomy-data.mjs","check:packages":"node scripts/verify-package-contents.mjs","test:contracts":"node scripts/verify-public-contract.mjs && node scripts/verify-render-state-contract.mjs && node scripts/verify-css-contract.mjs && node scripts/verify-ci-release-gates.mjs","test:e2e:built":"npm run prepare:e2e && npm run test:e2e:functional:prepared && npm run test:e2e:cross-browser:prepared && npm run test:package-consumer:prepared","test:e2e:chaos":"npm run build && node scripts/sync-e2e-assets.mjs && TEST_URL=http://localhost:5173/failing-scenarios.html npx playwright test tests/e2e/","typecheck:root":"tsc --noEmit","sync:kv-demo-data":"node scripts/sync-kv-demo-data.mjs","test:e2e:released":"npm run build && node scripts/sync-e2e-assets.mjs && cd e2e-test-app && npm install --install-links && cd .. && TEST_URL=http://localhost:5173/index-released.html npx playwright test tests/e2e/ && node scripts/print-e2e-versions.mjs","test:ci-safety-net":"npm run test:scripts && npm run test:contracts && npm run build && npm run prepare:e2e && node scripts/ci-safety-net.mjs","test:visual:docker":"node scripts/run-visual-docker.mjs","test:visual:report":"node scripts/visual-report.mjs","test:visual:update":"node scripts/run-visual-docker.mjs --update","test:visual:coverage":"node scripts/visual-coverage.mjs --check","verify:consumer-pack":"node scripts/verify-consumer-pack.mjs","test:package-consumer":"npm run prepare:e2e && npm run test:package-consumer:prepared","test:visual:bootstrap":"node scripts/run-visual-docker.mjs --bootstrap","sync:doc-data-packages":"node scripts/sync-doc-data-packages.mjs","test:e2e:cross-browser":"npm run prepare:e2e && npm run test:e2e:cross-browser:prepared","test:visual:standalone":"VISUAL_HOST=standalone playwright test -c playwright.visual.config.ts","check:doc-data-packages":"node scripts/sync-doc-data-packages.mjs --check","test:e2e:functional:built":"npm run prepare:e2e && npm run test:e2e:functional:prepared","test:visual:coverage:update":"node scripts/visual-coverage.mjs --write","typecheck:kompetensvaljaren":"tsc -p packages/kompetensvaljaren/tsconfig.json --noEmit","verify:designsystem-runtime":"node scripts/verify-designsystem-runtime.mjs","test:e2e:functional:prepared":"playwright test tests/e2e/","test:visual:update:canonical":"node scripts/assert-visual-environment.mjs && VISUAL_HOST=designsystem playwright test -c playwright.visual.config.ts --update-snapshots && node scripts/visual-coverage.mjs --write","test:package-consumer:prepared":"node scripts/prepare-packed-consumer.mjs && VISUAL_YV_ROOT=\"$PWD/.tmp/package-consumer/node_modules/@taxonomy/yrkesvaljaren\" VISUAL_KV_ROOT=\"$PWD/.tmp/package-consumer/node_modules/@taxonomy/kompetensvaljaren\" VISUAL_CORE_ROOT=\"$PWD/.tmp/package-consumer/node_modules/@taxonomy/core\" VITE_PACKAGE_CONSUMER=1 playwright test -c playwright.package-consumer.config.ts","test:e2e:cross-browser:prepared":"playwright test -c playwright.smoke.config.ts","test:visual:bootstrap:canonical":"node scripts/visual-bootstrap.mjs"},"_npmUser":{"name":"fredrik.ampler.af","email":"fredrik.ampler@arbetsformedlingen.se"},"overrides":{"immutable":"5.1.9"},"collection":"dist/collection/collection-manifest.json","workspaces":["packages/*"],"_npmVersion":"11.16.0","description":"Monorepo för Arbetsförmedlingens väljarkomponenter.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"marked":"^18.0.0","mkdirp":"^3.0.1","fuse.js":"^7.0.0","loglevel":"^1.9.2","@stencil/core":"^4.7.2","@taxonomy/core":"0.1.0-beta.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"collection:main":"dist/collection/index.js","devDependencies":{"ajv":"^8.17.1","jest":"^29.7.0","pngjs":"^7.0.0","eslint":"^10.0.0","vitest":"^4.1.11","globals":"^17.0.0","@eslint/js":"^10.0.1","fast-check":"^4.5.3","pixelmatch":"^7.1.0","typescript":"6.0.3","@types/node":"^25.5.0","ajv-formats":"^3.0.1","@types/lodash":"^4.17.7","@types/marked":"^6.0.0","@stencil/vitest":"^1.14.0","@playwright/test":"1.62.1","@designsystem-se/af":"37.0.2","@vitest/coverage-v8":"^4.1.11","@typescript-eslint/parser":"^8.0.0","@taxonomy/yrkesvaljaren-data-v29":"file:./packages/yrkesvaljaren-data-v29","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/yrkesvaljaren_2.0.5_1787929992731_0.3596816522795767","host":"s3://npm-registry-packages-npm-production"}},"2.0.6":{"name":"@arbetsformedlingen/yrkesvaljaren","version":"2.0.6","license":"Apache-2.0","_id":"@arbetsformedlingen/yrkesvaljaren@2.0.6","maintainers":[{"name":"fredrik.ampler.af","email":"fredrik.ampler@arbetsformedlingen.se"}],"dist":{"shasum":"72bfe06f62e1d4ac4477a727ed0fd525d35e7141","tarball":"https://registry.npmjs.org/@arbetsformedlingen/yrkesvaljaren/-/yrkesvaljaren-2.0.6.tgz","fileCount":146,"integrity":"sha512-rv+qYKMowFYYw24N1OnkxXYvhv5hIoNHEh7L1lmkpla7Ce7Q6kaOSpJr0d1ZdRp8ps5o2bfBjpoo/n3Y+R5vRA==","signatures":[{"sig":"MEYCIQDjPyrn8FIPcXBy6B/F3FKbRwGxjwR+hz8yIifrA8XoVgIhAKDzcewyA7vspezofrbqTPy6chBXOFkJcbzqaRw6ODrf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3064381},"main":"dist/index.js","type":"module","types":"dist/types/index.d.ts","unpkg":"dist/job-selector/job-selector.esm.js","module":"dist/index.js","engines":{"node":">=22"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js"},"./loader":{"types":"./loader/index.d.ts","import":"./loader/index.js"},"./package.json":"./package.json"},"gitHead":"0b4dfd2cda9aa6f37f7532987fb1a2f4367eaca1","scripts":{"lint":"npx eslint","test":"vitest run --coverage --reporter=default --reporter=junit --outputFile.junit=junit.xml","build":"npm run build:data && npm run sync:kv-demo-data && npm run build -w @taxonomy/kompetensvaljaren && stencil build","start":"npm run dev:root","verify":"npm run lint && npm run typecheck && npm run test && npm run test:scripts && npm run test:contracts && npm run build && npm run check:packages && npm run prepare:e2e && npm run test:e2e:functional:prepared && npm run test:visual:coverage","dev:e2e":"node scripts/sync-e2e-assets.mjs && cd e2e-test-app && npm run dev","pretest":"npm run build -w @taxonomy/core","build:kv":"npm run build -w @taxonomy/kompetensvaljaren","dev:root":"npm run build:data && npm run build:kv && npm run sync:kv-demo-data && node scripts/ensure-loaders.mjs && stencil build --dev --watch --serve","start:kv":"npm run build:data && npm run sync:kv-demo-data && npm start -w @taxonomy/kompetensvaljaren","test:e2e":"npm run build && npm run test:e2e:built","watch:kv":"npm run watch -w @taxonomy/kompetensvaljaren","postbuild":"node scripts/prune-stencil-collection.mjs dist job-selector-demo geo-valjaren neobrutal-search","typecheck":"npm run typecheck:root && npm run typecheck:kompetensvaljaren","build:data":"node scripts/build-data-workspaces.mjs --family=kompetensvaljaren","test:watch":"vitest --coverage","build:pages":"npm run sync:doc-data-packages && npm run build","prepare:e2e":"npm ci --prefix e2e-test-app --install-links && node scripts/sync-e2e-assets.mjs","test:pre-mr":"npm run verify","test:visual":"node scripts/run-visual-tests.mjs","verify:full":"npm run verify && npm run test:e2e:cross-browser && npm run test:package-consumer && npm run test:visual:docker","pretypecheck":"npm run build -w @taxonomy/core","refresh:data":"node scripts/build-data-workspaces.mjs","test:scripts":"NODE_OPTIONS=--experimental-vm-modules jest --config jest.config.scripts.cjs","validate:data":"node scripts/validate-taxonomy-data.mjs","check:packages":"node scripts/verify-package-contents.mjs","test:contracts":"node scripts/verify-public-contract.mjs && node scripts/verify-render-state-contract.mjs && node scripts/verify-css-contract.mjs && node scripts/verify-ci-release-gates.mjs","test:e2e:built":"npm run prepare:e2e && npm run test:e2e:functional:prepared && npm run test:e2e:cross-browser:prepared && npm run test:package-consumer:prepared","test:e2e:chaos":"npm run build && node scripts/sync-e2e-assets.mjs && TEST_URL=http://localhost:5173/failing-scenarios.html npx playwright test tests/e2e/","typecheck:root":"tsc --noEmit","sync:kv-demo-data":"node scripts/sync-kv-demo-data.mjs","test:e2e:released":"npm run build && node scripts/sync-e2e-assets.mjs && cd e2e-test-app && npm install --install-links && cd .. && TEST_URL=http://localhost:5173/index-released.html npx playwright test tests/e2e/ && node scripts/print-e2e-versions.mjs","test:ci-safety-net":"npm run test:scripts && npm run test:contracts && npm run build && npm run prepare:e2e && node scripts/ci-safety-net.mjs","test:visual:docker":"node scripts/run-visual-docker.mjs","test:visual:report":"node scripts/visual-report.mjs","test:visual:update":"node scripts/run-visual-docker.mjs --update","test:visual:coverage":"node scripts/visual-coverage.mjs --check","verify:consumer-pack":"node scripts/verify-consumer-pack.mjs","test:package-consumer":"npm run prepare:e2e && npm run test:package-consumer:prepared","test:visual:bootstrap":"node scripts/run-visual-docker.mjs --bootstrap","sync:doc-data-packages":"node scripts/sync-doc-data-packages.mjs","test:e2e:cross-browser":"npm run prepare:e2e && npm run test:e2e:cross-browser:prepared","test:visual:standalone":"VISUAL_HOST=standalone playwright test -c playwright.visual.config.ts","check:doc-data-packages":"node scripts/sync-doc-data-packages.mjs --check","test:e2e:functional:built":"npm run prepare:e2e && npm run test:e2e:functional:prepared","test:visual:coverage:update":"node scripts/visual-coverage.mjs --write","typecheck:kompetensvaljaren":"tsc -p packages/kompetensvaljaren/tsconfig.json --noEmit","verify:designsystem-runtime":"node scripts/verify-designsystem-runtime.mjs","test:e2e:functional:prepared":"playwright test tests/e2e/","test:visual:update:canonical":"node scripts/assert-visual-environment.mjs && VISUAL_HOST=designsystem playwright test -c playwright.visual.config.ts --update-snapshots && node scripts/visual-coverage.mjs --write","test:package-consumer:prepared":"node scripts/prepare-packed-consumer.mjs && VISUAL_YV_ROOT=\"$PWD/.tmp/package-consumer/node_modules/@taxonomy/yrkesvaljaren\" VISUAL_KV_ROOT=\"$PWD/.tmp/package-consumer/node_modules/@taxonomy/kompetensvaljaren\" VISUAL_CORE_ROOT=\"$PWD/.tmp/package-consumer/node_modules/@taxonomy/core\" VITE_PACKAGE_CONSUMER=1 playwright test -c playwright.package-consumer.config.ts","test:e2e:cross-browser:prepared":"playwright test -c playwright.smoke.config.ts","test:visual:bootstrap:canonical":"node scripts/visual-bootstrap.mjs"},"_npmUser":{"name":"fredrik.ampler.af","email":"fredrik.ampler@arbetsformedlingen.se"},"overrides":{"immutable":"5.1.9"},"collection":"dist/collection/collection-manifest.json","workspaces":["packages/*"],"_npmVersion":"11.16.0","description":"Monorepo för Arbetsförmedlingens väljarkomponenter.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"marked":"^18.0.0","mkdirp":"^3.0.1","fuse.js":"^7.0.0","loglevel":"^1.9.2","@stencil/core":"^4.7.2","@taxonomy/core":"0.1.0-beta.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"collection:main":"dist/collection/index.js","devDependencies":{"ajv":"^8.17.1","jest":"^29.7.0","pngjs":"^7.0.0","eslint":"^10.0.0","vitest":"^4.1.11","globals":"^17.0.0","@eslint/js":"^10.0.1","fast-check":"^4.5.3","pixelmatch":"^7.1.0","typescript":"6.0.3","@types/node":"^25.5.0","ajv-formats":"^3.0.1","@types/lodash":"^4.17.7","@types/marked":"^6.0.0","@stencil/vitest":"^1.14.0","@playwright/test":"1.62.1","@designsystem-se/af":"37.0.2","@vitest/coverage-v8":"^4.1.11","@typescript-eslint/parser":"^8.0.0","@taxonomy/yrkesvaljaren-data-v29":"file:./packages/yrkesvaljaren-data-v29","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/yrkesvaljaren_2.0.6_1787930168268_0.9728689205355467","host":"s3://npm-registry-packages-npm-production"}},"2.0.11":{"name":"@arbetsformedlingen/yrkesvaljaren","version":"2.0.11","license":"Apache-2.0","_id":"@arbetsformedlingen/yrkesvaljaren@2.0.11","maintainers":[{"name":"fredrik.ampler.af","email":"fredrik.ampler@arbetsformedlingen.se"}],"homepage":"https://gitlab.com/arbetsformedlingen/taxonomy-dev/frontend/yrkesvaljaren#readme","bugs":{"url":"https://gitlab.com/arbetsformedlingen/taxonomy-dev/frontend/yrkesvaljaren/issues"},"dist":{"shasum":"aa7606495c5b08c9a1b23973b6009ee50d883b2d","tarball":"https://registry.npmjs.org/@arbetsformedlingen/yrkesvaljaren/-/yrkesvaljaren-2.0.11.tgz","fileCount":145,"integrity":"sha512-AzARwHRAKPcsa9NSs3kQZs19j0ouNQwACzthRFQnD7LqKLpJZduqZOJmyhiFOP0Qn2EibyJ1uiEBvnCjB3PG+A==","signatures":[{"sig":"MEUCIQC+SCIaYUXxk49hzyWMzTPV3QUiDD7WWokWeffRguGaMAIgU2AVrrXOs8MONsexx9sC9KzTs/7uS51IJNopiy/oZ2M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCtWC7SLk1RgMepMNFTkS0at34kDJK5JkG56S+sV/sYrQIgZAS2isNLM9rQ+/yCwlHRviI9QIa/jHZ1C/ytw/EsnJ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@arbetsformedlingen%2fyrkesvaljaren@2.0.11","provenance":{"predicateType":"https://slsa.dev/provenance/v0.2"}},"unpackedSize":2532690},"main":"dist/index.js","type":"module","types":"dist/types/index.d.ts","unpkg":"dist/job-selector/job-selector.esm.js","module":"dist/index.js","engines":{"node":">=22"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js"},"./loader":{"types":"./loader/index.d.ts","import":"./loader/index.js"},"./package.json":"./package.json"},"gitHead":"642efe9dc7471179923006446f06a1f1bbd5ed9b","scripts":{"lint":"npx eslint","test":"vitest run --coverage --reporter=default --reporter=junit --outputFile.junit=junit.xml","build":"npm run build -w @taxonomy/kompetensvaljaren && stencil build","start":"npm run dev:root","verify":"npm run lint && npm run typecheck && npm run test && npm run test:scripts && npm run test:contracts && npm run build && npm run check:packages && npm run prepare:e2e && npm run test:e2e:functional:prepared && npm run test:visual:coverage","dev:e2e":"node scripts/sync-e2e-assets.mjs && cd e2e-test-app && npm run dev","pretest":"npm run build -w @taxonomy/core","build:kv":"npm run build -w @taxonomy/kompetensvaljaren","dev:root":"npm run build:kv && node scripts/ensure-loaders.mjs && stencil build --dev --watch --serve","start:kv":"npm start -w @taxonomy/kompetensvaljaren","test:e2e":"npm run build && npm run test:e2e:built","watch:kv":"npm run watch -w @taxonomy/kompetensvaljaren","postbuild":"node scripts/prune-stencil-collection.mjs dist job-selector-demo geo-valjaren neobrutal-search && node scripts/vendor-taxonomy-core.mjs dist loader","typecheck":"npm run typecheck:root && npm run typecheck:kompetensvaljaren","test:watch":"vitest --coverage","build:pages":"npm run sync:doc-data-packages && npm run build","prepare:e2e":"npm ci --prefix e2e-test-app --install-links && node scripts/sync-e2e-assets.mjs","test:pre-mr":"npm run verify","test:visual":"node scripts/run-visual-tests.mjs","verify:full":"npm run verify && npm run test:e2e:cross-browser && npm run test:package-consumer && npm run test:visual:docker","pretypecheck":"npm run build -w @taxonomy/core","test:scripts":"NODE_OPTIONS=--experimental-vm-modules jest --config jest.config.scripts.cjs","validate:data":"node scripts/validate-taxonomy-data.mjs","check:packages":"node scripts/verify-package-contents.mjs","test:contracts":"node scripts/verify-public-contract.mjs && node scripts/verify-render-state-contract.mjs && node scripts/verify-css-contract.mjs && node scripts/verify-ci-release-gates.mjs","test:e2e:built":"npm run prepare:e2e && npm run test:e2e:functional:prepared && npm run test:e2e:cross-browser:prepared && npm run test:package-consumer:prepared","test:e2e:chaos":"npm run build && npm run prepare:e2e:explicit && TEST_URL=http://localhost:5173/failing-scenarios.html npx playwright test tests/e2e/","typecheck:root":"tsc --noEmit","sync:kv-demo-data":"node scripts/sync-kv-demo-data.mjs","test:e2e:released":"npm run build && node scripts/sync-e2e-assets.mjs && cd e2e-test-app && npm install --install-links && cd .. && TEST_URL=http://localhost:5173/index-released.html npx playwright test tests/e2e/ && node scripts/print-e2e-versions.mjs","test:ci-safety-net":"npm run test:scripts && npm run test:contracts && npm run build && npm run prepare:e2e && node scripts/ci-safety-net.mjs","test:visual:docker":"node scripts/run-visual-docker.mjs","test:visual:report":"node scripts/visual-report.mjs","test:visual:update":"node scripts/run-visual-docker.mjs --update","check:data-packages":"node scripts/verify-data-package-versions.mjs","prepare:e2e:explicit":"npm run prepare:e2e && node scripts/sync-e2e-explicit-assets.mjs","test:visual:coverage":"node scripts/visual-coverage.mjs --check","verify:consumer-pack":"node scripts/verify-consumer-pack.mjs","test:package-consumer":"npm run prepare:e2e && npm run test:package-consumer:prepared","test:visual:bootstrap":"node scripts/run-visual-docker.mjs --bootstrap","verify:npmjs-consumer":"node scripts/verify-npmjs-consumer.mjs","sync:doc-data-packages":"node scripts/sync-doc-data-packages.mjs","test:e2e:cross-browser":"npm run prepare:e2e && npm run test:e2e:cross-browser:prepared","test:visual:standalone":"VISUAL_HOST=standalone playwright test -c playwright.visual.config.ts","check:doc-data-packages":"node scripts/sync-doc-data-packages.mjs --check","test:e2e:functional:built":"npm run prepare:e2e && npm run test:e2e:functional:prepared","test:visual:coverage:update":"node scripts/visual-coverage.mjs --write","typecheck:kompetensvaljaren":"tsc -p packages/kompetensvaljaren/tsconfig.json --noEmit","verify:designsystem-runtime":"node scripts/verify-designsystem-runtime.mjs","test:e2e:functional:prepared":"playwright test tests/e2e/","test:visual:update:canonical":"node scripts/assert-visual-environment.mjs && VISUAL_HOST=designsystem playwright test -c playwright.visual.config.ts --update-snapshots && node scripts/visual-coverage.mjs --write","test:package-consumer:prepared":"node scripts/prepare-packed-consumer.mjs && VISUAL_YV_ROOT=\"$PWD/.tmp/package-consumer/node_modules/@taxonomy/yrkesvaljaren\" VISUAL_KV_ROOT=\"$PWD/.tmp/package-consumer/node_modules/@taxonomy/kompetensvaljaren\" VISUAL_CORE_ROOT=\"$PWD/.tmp/package-consumer/node_modules/@taxonomy/core\" VITE_PACKAGE_CONSUMER=1 playwright test -c playwright.package-consumer.config.ts","test:e2e:cross-browser:prepared":"playwright test -c playwright.smoke.config.ts","test:visual:bootstrap:canonical":"node scripts/visual-bootstrap.mjs"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:27b9f070-0796-4645-ae93-1b92c0320cc0"}},"overrides":{"immutable":"5.1.9"},"collection":"dist/collection/collection-manifest.json","repository":{"url":"git+https://gitlab.com/arbetsformedlingen/taxonomy-dev/frontend/yrkesvaljaren.git","type":"git"},"workspaces":["packages/*"],"_npmVersion":"11.19.0","description":"Monorepo för Arbetsförmedlingens väljarkomponenter.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"marked":"^18.0.0","mkdirp":"^3.0.1","fuse.js":"^7.0.0","loglevel":"^1.9.2","@stencil/core":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"collection:main":"dist/collection/index.js","devDependencies":{"ajv":"^8.17.1","jest":"^29.7.0","pngjs":"^7.0.0","eslint":"^10.0.0","vitest":"^4.1.11","globals":"^17.0.0","ts-jest":"^29.4.1","jest-cli":"^29.7.0","@eslint/js":"^10.0.1","fast-check":"^4.5.3","jest-junit":"^17.0.0","pixelmatch":"^7.1.0","typescript":"6.0.3","@types/jest":"^29.5.14","@types/node":"^25.5.0","ajv-formats":"^3.0.1","@types/lodash":"^4.17.7","@types/marked":"^6.0.0","@taxonomy/core":"0.1.0-beta.1","@stencil/vitest":"^1.14.0","@playwright/test":"1.62.1","@designsystem-se/af":"37.0.2","@vitest/coverage-v8":"^4.1.11","@typescript-eslint/parser":"^8.0.0","@taxonomy/yrkesvaljaren-data-v31":"1.0.0","@typescript-eslint/eslint-plugin":"^8.0.0","@taxonomy/kompetensvaljaren-data-v31":"1.0.0"},"peerDependencies":{"@designsystem-se/af":">=32.0.0"},"_npmOperationalInternal":{"tmp":"tmp/yrkesvaljaren_2.0.11_1790341217531_0.1732224343845996","host":"s3://npm-registry-packages-npm-production"}},"2.0.12":{"_id":"@arbetsformedlingen/yrkesvaljaren@2.0.12","bugs":{"url":"https://gitlab.com/arbetsformedlingen/taxonomy-dev/frontend/yrkesvaljaren/issues"},"dist":{"shasum":"4a736596d2ab6c14b92b90d4ccedd7259a060a43","tarball":"https://registry.npmjs.org/@arbetsformedlingen/yrkesvaljaren/-/yrkesvaljaren-2.0.12.tgz","fileCount":145,"integrity":"sha512-oLSaQlX/lvQ73kVNVeM1TVxXU+POlTcuisYVw0NAYWjBfoMwenfJdI73VtheTT8NYWuGyUmMIL9xjcNXcPrszw==","signatures":[{"sig":"MEUCIQDyLeQJNl27JeTFmAxxeHBNaBnhbbClQ9Q5URsgX557RwIgd+A+fGdhbszLCgoSQ2svjtEn0Up90V1mMv0N7DgATDE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG5YjOgcm3hSlnOXIVtNRKprdWvsYYELdhZ8xqc6Ky9SAiEAwHl696F+oRNEkBnWMaFP9s6/j82SKJYMXKLmUb92lUw="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@arbetsformedlingen%2fyrkesvaljaren@2.0.12","provenance":{"predicateType":"https://slsa.dev/provenance/v0.2"}},"unpackedSize":2520134},"main":"dist/index.js","name":"@arbetsformedlingen/yrkesvaljaren","type":"module","types":"dist/types/index.d.ts","unpkg":"dist/job-selector/job-selector.esm.js","module":"dist/index.js","engines":{"node":">=22"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/index.js"},"./loader":{"types":"./loader/index.d.ts","import":"./loader/index.js"},"./package.json":"./package.json"},"gitHead":"af41a62857d834c7fd616f8af189da07c9a644d7","license":"Apache-2.0","scripts":{"lint":"npx eslint","test":"vitest run --coverage --reporter=default --reporter=junit --outputFile.junit=junit.xml","build":"npm run build -w @taxonomy/kompetensvaljaren && stencil build","start":"npm run dev:root","verify":"npm run lint && npm run typecheck && npm run test && npm run test:scripts && npm run test:contracts && npm run build && npm run check:packages && npm run prepare:e2e && npm run test:e2e:functional:prepared && npm run test:visual:coverage","dev:e2e":"node scripts/sync-e2e-assets.mjs && cd e2e-test-app && npm run dev","pretest":"npm run build -w @taxonomy/core","build:kv":"npm run build -w @taxonomy/kompetensvaljaren","dev:root":"npm run build:kv && node scripts/ensure-loaders.mjs && stencil build --dev --watch --serve","start:kv":"npm start -w @taxonomy/kompetensvaljaren","test:e2e":"npm run build && npm run test:e2e:built","watch:kv":"npm run watch -w @taxonomy/kompetensvaljaren","postbuild":"node scripts/prune-stencil-collection.mjs dist job-selector-demo geo-valjaren neobrutal-search && node scripts/vendor-taxonomy-core.mjs dist loader","typecheck":"npm run typecheck:root && npm run typecheck:kompetensvaljaren","test:watch":"vitest --coverage","build:pages":"npm run sync:doc-data-packages && npm run build","prepare:e2e":"npm ci --prefix e2e-test-app --install-links && node scripts/sync-e2e-assets.mjs","test:pre-mr":"npm run verify","test:visual":"node scripts/run-visual-tests.mjs","verify:full":"npm run verify && npm run test:e2e:cross-browser && npm run test:package-consumer && npm run test:visual:docker","pretypecheck":"npm run build -w @taxonomy/core","test:scripts":"NODE_OPTIONS=--experimental-vm-modules jest --config jest.config.scripts.cjs","validate:data":"node scripts/validate-taxonomy-data.mjs","check:packages":"node scripts/verify-package-contents.mjs","test:contracts":"node scripts/verify-public-contract.mjs && node scripts/verify-render-state-contract.mjs && node scripts/verify-css-contract.mjs && node scripts/verify-ci-release-gates.mjs","test:e2e:built":"npm run prepare:e2e && npm run test:e2e:functional:prepared && npm run test:e2e:cross-browser:prepared && npm run test:package-consumer:prepared","test:e2e:chaos":"npm run build && npm run prepare:e2e:explicit && TEST_URL=http://localhost:5173/failing-scenarios.html npx playwright test tests/e2e/","typecheck:root":"tsc --noEmit","sync:kv-demo-data":"node scripts/sync-kv-demo-data.mjs","test:e2e:released":"npm run build && node scripts/sync-e2e-assets.mjs && cd e2e-test-app && npm install --install-links && cd .. && TEST_URL=http://localhost:5173/index-released.html npx playwright test tests/e2e/ && node scripts/print-e2e-versions.mjs","test:ci-safety-net":"npm run test:scripts && npm run test:contracts && npm run build && npm run prepare:e2e && node scripts/ci-safety-net.mjs","test:visual:docker":"node scripts/run-visual-docker.mjs","test:visual:report":"node scripts/visual-report.mjs","test:visual:update":"node scripts/run-visual-docker.mjs --update","check:data-packages":"node scripts/verify-data-package-versions.mjs","prepare:e2e:explicit":"npm run prepare:e2e && node scripts/sync-e2e-explicit-assets.mjs","test:visual:coverage":"node scripts/visual-coverage.mjs --check","verify:consumer-pack":"node scripts/verify-consumer-pack.mjs","test:package-consumer":"npm run prepare:e2e && npm run test:package-consumer:prepared","test:visual:bootstrap":"node scripts/run-visual-docker.mjs --bootstrap","verify:npmjs-consumer":"node scripts/verify-npmjs-consumer.mjs","sync:doc-data-packages":"node scripts/sync-doc-data-packages.mjs","test:e2e:cross-browser":"npm run prepare:e2e && npm run test:e2e:cross-browser:prepared","test:visual:standalone":"VISUAL_HOST=standalone playwright test -c playwright.visual.config.ts","check:doc-data-packages":"node scripts/sync-doc-data-packages.mjs --check","test:e2e:functional:built":"npm run prepare:e2e && npm run test:e2e:functional:prepared","test:visual:coverage:update":"node scripts/visual-coverage.mjs --write","typecheck:kompetensvaljaren":"tsc -p packages/kompetensvaljaren/tsconfig.json --noEmit","verify:designsystem-runtime":"node scripts/verify-designsystem-runtime.mjs","test:e2e:functional:prepared":"playwright test tests/e2e/","test:visual:update:canonical":"node scripts/assert-visual-environment.mjs && VISUAL_HOST=designsystem playwright test -c playwright.visual.config.ts --update-snapshots && node scripts/visual-coverage.mjs --write","test:package-consumer:prepared":"node scripts/prepare-packed-consumer.mjs && VISUAL_YV_ROOT=\"$PWD/.tmp/package-consumer/node_modules/@taxonomy/yrkesvaljaren\" VISUAL_KV_ROOT=\"$PWD/.tmp/package-consumer/node_modules/@taxonomy/kompetensvaljaren\" VISUAL_CORE_ROOT=\"$PWD/.tmp/package-consumer/node_modules/@taxonomy/core\" VITE_PACKAGE_CONSUMER=1 playwright test -c playwright.package-consumer.config.ts","test:e2e:cross-browser:prepared":"playwright test -c playwright.smoke.config.ts","test:visual:bootstrap:canonical":"node scripts/visual-bootstrap.mjs"},"version":"2.0.12","_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"27b9f070-0796-4645-ae93-1b92c0320cc0"}},"homepage":"https://gitlab.com/arbetsformedlingen/taxonomy-dev/frontend/yrkesvaljaren#readme","overrides":{"immutable":"5.1.9"},"collection":"dist/collection/collection-manifest.json","repository":{"url":"git+https://gitlab.com/arbetsformedlingen/taxonomy-dev/frontend/yrkesvaljaren.git","type":"git"},"workspaces":["packages/*"],"_npmVersion":"11.19.0","description":"Monorepo för Arbetsförmedlingens väljarkomponenter.","directories":{},"maintainers":[{"name":"fredrik.ampler.af","email":"fredrik.ampler@arbetsformedlingen.se"}],"_nodeVersion":"24.21.0","dependencies":{"marked":"^18.0.0","mkdirp":"^3.0.1","fuse.js":"^7.0.0","loglevel":"^1.9.2","@stencil/core":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"collection:main":"dist/collection/index.js","devDependencies":{"ajv":"^8.17.1","jest":"^29.7.0","pngjs":"^7.0.0","eslint":"^10.0.0","vitest":"^4.1.11","globals":"^17.0.0","ts-jest":"^29.4.1","jest-cli":"^29.7.0","@eslint/js":"^10.0.1","fast-check":"^4.5.3","jest-junit":"^17.0.0","pixelmatch":"^7.1.0","typescript":"6.0.3","@types/jest":"^29.5.14","@types/node":"^25.5.0","ajv-formats":"^3.0.1","@types/lodash":"^4.17.7","@types/marked":"^6.0.0","@taxonomy/core":"0.1.0-beta.1","@stencil/vitest":"^1.14.0","@playwright/test":"1.62.1","@designsystem-se/af":"37.0.2","@vitest/coverage-v8":"^4.1.11","@typescript-eslint/parser":"^8.0.0","@taxonomy/yrkesvaljaren-data-v31":"1.0.0","@typescript-eslint/eslint-plugin":"^8.0.0","@taxonomy/kompetensvaljaren-data-v31":"1.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/yrkesvaljaren_2.0.12_1791185586955_0.22276907745435603"}}},"time":{"created":"2026-08-28T15:13:12.565Z","modified":"2026-10-05T07:33:07.636Z","2.0.5":"2026-08-28T15:13:12.956Z","2.0.6":"2026-08-28T15:16:08.476Z","2.0.11":"2026-09-25T13:00:17.649Z","2.0.12":"2026-10-05T07:33:07.126Z"},"bugs":{"url":"https://gitlab.com/arbetsformedlingen/taxonomy-dev/frontend/yrkesvaljaren/issues"},"license":"Apache-2.0","homepage":"https://gitlab.com/arbetsformedlingen/taxonomy-dev/frontend/yrkesvaljaren#readme","repository":{"url":"git+https://gitlab.com/arbetsformedlingen/taxonomy-dev/frontend/yrkesvaljaren.git","type":"git"},"description":"Monorepo för Arbetsförmedlingens väljarkomponenter.","maintainers":[{"name":"fredrik.ampler.af","email":"fredrik.ampler@arbetsformedlingen.se"}],"readme":"# Yrkesväljaren webbkomponent\n\nEn robust och intelligent sökkomponent för svenska yrken, designad för hög prestanda och tillförlitlighet. Den integrerar yrken från Arbetsförmedlingens taxonomi i valfri webbapplikation.\n\n---\n\n\n### Beskrivning\n\n*   **Enkelt hitta rätt yrke för användaren** <br>Sökalgoritmen prioriterar exakta träffar, prefix, flerdelade direktträffar och innehåller-träffar. Om inga direktträffar finns kan upp till tre fuzzy-träffar visas. Viktdata används som sekundär sortering.\n*   **Hög prestanda:** <br>Sökningen sker lokalt i webbläsaren mot inläst yrkesdata. Komponenten gör inga sökanrop till Taxonomy API.\n*   **Flexibel datahantering:** <br>Versionerat npm-datapaket (rekommenderas), automatiskt uppdaterad data eller en egen URL.\n\n---\n\n### Installation\n\nInstallera komponenten och datapaketet:\n\n```bash\nnpm install @arbetsformedlingen/yrkesvaljaren @arbetsformedlingen/yrkesvaljaren-data@31\n```\n\nDatapaketets majorversion är taxonomiversionen: `31.x.y` innehåller taxonomi v31. Med `^31.0.0` i `package.json` får du rättningar av v31-datan men byter aldrig taxonomiversion av misstag. Installera nästa majorversion när du vill byta taxonomiversion.\n\nDatan registreras med `registerTaxonomy(...)` innan komponenten används. Se [Angular](#användning-i-angular) eller [HTML och andra ramverk](#användning-i-html-och-andra-ramverk).\n\nUtan registrerad data hämtar komponenten den senaste publicerade yrkesdatan från CDN. `af-taxonomy-url` är ett avancerat alternativ om du vill peka komponenten mot en egenhostad datafil.\n\n### Användning i Angular\n\nDe flesta som använder Yrkesväljaren bygger i Angular. Komponenten är en vanlig webbkomponent, så den fungerar i standalone-komponenter med eller utan zone.js.\n\nRegistrera datan och webbkomponenterna i `main.ts` innan appen startar. Taxonomidatan är cirka 2 MB. Importera den dynamiskt, så hamnar den i en egen chunk. Med en statisk import hamnar den i main-bundlen och `ng build` fastnar på Angulars standardbudget (1 MB).\n\n```ts\n// src/main.ts\nimport { bootstrapApplication } from '@angular/platform-browser';\nimport { defineCustomElements as defineYv } from '@arbetsformedlingen/yrkesvaljaren/loader';\nimport { registerTaxonomy } from '@arbetsformedlingen/yrkesvaljaren';\nimport { appConfig } from './app/app.config';\nimport { App } from './app/app';\n\nasync function main() {\n  const { metadata, taxonomyData } = await import('@arbetsformedlingen/yrkesvaljaren-data');\n  registerTaxonomy({ data: taxonomyData, metadata });\n  defineYv(window);\n  await bootstrapApplication(App, appConfig);\n}\nmain().catch((err) => console.error(err));\n```\n\nAnvänd sedan komponenten i en standalone-komponent med `CUSTOM_ELEMENTS_SCHEMA` och lyssna på eventet i templaten:\n\n```ts\n// src/app/job-picker.component.ts\nimport { Component, CUSTOM_ELEMENTS_SCHEMA, signal } from '@angular/core';\nimport type { JobSelectionItem } from '@arbetsformedlingen/yrkesvaljaren';\n\n@Component({\n  selector: 'app-job-picker',\n  standalone: true,\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  template: `\n    <digi-service-job-selector af-label=\"Välj yrke\" (afJobSelected)=\"onJobSelected($event)\"></digi-service-job-selector>\n    <p>Valt yrke: {{ selected()[0]?.preferred_label ?? 'inget' }}</p>\n  `,\n})\nexport class JobPickerComponent {\n  readonly selected = signal<JobSelectionItem[]>([]);\n\n  onJobSelected(event: Event): void {\n    this.selected.set((event as CustomEvent<JobSelectionItem[] | null>).detail ?? []);\n  }\n}\n```\n\nUppdatera vyn via signals (eller `ChangeDetectorRef`) när ni sätter värden efter en `await`. Annars uppdateras inte vyn i zoneless-appar.\n\nKompletta exempel:\n\n- [`examples/angular-wizard`](https://gitlab.com/arbetsformedlingen/taxonomy-dev/frontend/yrkesvaljaren/-/tree/main/examples/angular-wizard): Yrkesväljaren i Reactive Forms via `ControlValueAccessor`.\n- [`examples/angular-multi-occupation-skills`](https://gitlab.com/arbetsformedlingen/taxonomy-dev/frontend/yrkesvaljaren/-/tree/main/examples/angular-multi-occupation-skills): flera yrken med egna kompetensval via Kompetensväljarens headless-API.\n\n### Användning i HTML och andra ramverk\n\nFör att snabbt komma igång, här är ett komplett HTML-exempel som visar hur du inkluderar och använder Yrkesväljaren:\n\n```html\n<!DOCTYPE html>\n<html lang=\"sv\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Yrkesväljaren exempel</title>\n</head>\n<body>\n\n  <h1>Yrkesväljaren exempel</h1>\n\n<!-- Komponenten -->\n<digi-service-job-selector af-label=\"Välj yrke\"></digi-service-job-selector>\n<script type=\"module\">\n\n// Imports (sökväg beror på ditt byggverktyg)\nimport { defineCustomElements as defineYrkesvaljaren } from \"@arbetsformedlingen/yrkesvaljaren/loader\";\ndefineYrkesvaljaren(window);\ndocument.querySelector(\"digi-service-job-selector\")\n.addEventListener(\"afJobSelected\", (e) => {\nconsole.log(\"Valt yrke:\", e.detail);\n});\n</script>\n\n</body>\n</html>\n```\n\n**Utan Angular:** registrera datapaketets data innan komponenten används:\n\n```javascript\nimport { registerTaxonomy } from '@arbetsformedlingen/yrkesvaljaren';\nimport { taxonomyData, metadata } from '@arbetsformedlingen/yrkesvaljaren-data';\n\nregisterTaxonomy({ data: taxonomyData, metadata });\n```\n\n**React:** koppla komponentens event med `addEventListener` via en `ref` i en `useEffect`. Det fungerar i alla React-versioner; en `onAfJobSelected`-prop fungerar inte i React 18.\n\n### Vite\n\nYrkesväljaren använder en Stencil-loader som hämtar komponenternas entry-filer dynamiskt. I Vite ska loader-paketet därför undantas från dependency optimizer, annars kan Vite flytta loadern till `.vite/deps` och de dynamiska importerna får fel sökväg.\n\n```javascript\n// vite.config.js\nexport default {\n  optimizeDeps: {\n    exclude: [\n      '@arbetsformedlingen/yrkesvaljaren/loader',\n    ],\n  },\n};\n```\n\n### Designsystem-kompatibilitet\n\nYrkesväljaren är uppbyggd med designsystemets tokens, typografi, färger, fokusramar och ikoner och kommer att uppdateras automatiskt för dig som har designsystemet installerat. Den använder de förväntade attributen för att styla etikett, felmeddelande osv, men har inga komponentberoenden till designsystemet. För den som inte har designsystemet installerat används inbyggda fallbacks för att bibehålla utseendet.\n\n### Attribut\n\n| Attribut | Beskrivning | Typ | Standardvärde |\n|:---|:---|:---|:---|\n| `af-label` | Etikettext som visas ovanför sökfältet. | `string` | `'Välj yrke'` |\n| `disabled` | Om satt till `true`, kan väljaren inte användas med mus eller tangentbord. | `boolean` | `false` |\n| `af-label-description`| En valfri beskrivningstext som visas under etiketten. | `string` | `undefined` |\n| `af-placeholder` | Hjälptext som visas inuti sökfältet. Denna är ett bra stöd för de med kognitiv funktionsvariation - vi rekommenderar att behålla denna text (den är osynlig för skärmläsare). | `string` | `'T.ex. målare, florist, kock'` |\n| `af-error-message` | Ett anpassat felmeddelande som visas vid valideringsfel. | `string` | `undefined` |\n| `af-enable-multiple` | Om satt till `true`, tillåts val av flera yrken. | `boolean` | `false` |\n| `af-history` | Sparar användarval lokalt i webbläsarens Local Storage och visar historiken på samma domän. | `boolean` | `true` |\n| `af-required` | Om satt till `true`, måste användaren göra ett val för att fältet ska vara giltigt (obligatoriskt fält). | `boolean` | `false` |\n| `af-manual-input` | Om satt till `true` kan användaren ange ett yrke som fritext när det inte finns i listan. Om satt till `false` måste ett fördefinierat yrke väljas. | `boolean` | `false` |\n| `af-size` | Storleken på inputfältet. Möjliga värden: `'small'`, `'medium'`, `'large'`. | `string` | `'medium'` |\n| `af-popular` | Om satt till `true` visas sektionen \"Populära sökningar\" när historiken är tom. | `boolean` | `true` |\n| `af-taxonomy-url` | Fullständig, explicit URL till en egenhostad datafil. Utelämna attributet för att använda senaste data automatiskt. | `string` | `undefined` |\n\n### Riktlinjer och rekommendationer\n\nTre centrala inställningar styr användarupplevelsen och datakvaliteten i Yrkesväljaren:\n\n#### Obligatorisk (`af-required`)\n* **Hur man kan resonera:** När `af-required=\"true\"` måste användaren välja minst ett yrke för att fältet ska betraktas som giltigt. Komponenten fungerar som ett standardenligt *Form-Associated Custom Element* (FACE). Det innebär att webbläsaren automatiskt validerar fältet vid formulärinskick, förhindrar att formuläret skickas in om det är tomt, och integrerar med formulärets `validity`-status.\n* **När det rekommenderas:** I formulär och flöden där ett yrkesval är ett obligatoriskt steg i ett ärende (t.ex. inskrivning och aktivitetsrapportering).\n* **När det bör undvikas:** I öppna sök- eller filtreringsvyer där användaren ska kunna söka brett, filtrera på andra parametrar (t.ex. enbart ort/geografi) eller frivilligt specificera yrke.\n\n#### Tillåt fritext (`af-manual-input`)\n* **Hur man kan resonera:** Avgör om användaren strikt måste välja ett strukturerat yrkesbegrepp ur Arbetsförmedlingens taxonomi (vilket garanterar Concept ID och SSYK-kod), eller om användaren även tillåts mata in egna fritextvärden som inte finns i taxonomin. Vid fritext visas valet *\"Använd '{inmatning}'\"* i listan som användaren aktivt väljer eller bekräftar med Enter.\n* **När det rekommenderas:**\n  * **Strikt taxonomi (`af-manual-input=\"false\"` – standard & rekommenderas):** När yrkesdatan ska användas för automatisk matchning, statistiska analyser, maskininlärning eller integration mot backend-system som förutsätter Concept ID. Detta säkerställer hög datakvalitet.\n  * **Fritext tillåten (`af-manual-input=\"true\"`):** I öppna fritextprofiler, fritextenkäter eller intresseanmälningar där det är viktigare att fånga upp vad användaren själv kallar sin roll än att få ett taxonomi-ID, eller där man inte vill blockera användare med ovanliga, nischade eller internationella titlar.\n\n#### Tillåt historik (`af-history`)\n* **Hur man kan resonera:** Sparar gjorda val i webbläsarens localStorage per domän och enhet, och visar dem som \"Tidigare val\" när användaren fokuserar Yrkesväljaren. Det betyder att historiken kommer att visas på alla tjänster med yrkesväljare på arbetsformedlingen.se (så länge personen använder samma enhet, t.ex. sin mobil).\n* **När det rekommenderas:** På alla tjänster mot konsumenter.\n* **När det bör undvikas:** På delade publika terminaler eller kioskdatorer (t.ex. på Arbetsförmedlingens servicekontor) där personers tidigare sökningar inte ska sparas eller exponeras för efterföljande besökare på samma dator. I handläggartjänster är historiken sällan till hjälp, eftersom handläggare söker på många olika yrken.\n\n### Välj datakälla\n\nVälj ett av följande sätt:\n\n1. Registrera ett versionerat datapaket med `registerTaxonomy(...)`.\n2. Ange en fullständig URL med `af-taxonomy-url` för en egenhostad datafil.\n3. Utelämna båda för att använda senaste data automatiskt.\n\nEn angiven `af-taxonomy-url` är den valda datakällan. Om URL:en inte kan laddas\ngår komponenten till felläge och skickar `afJobDataLoadFailed`.\n<br>\n\n### Events\n\n| Händelse | Beskrivning |\n|:---|:---|\n| `afJobSelected` | Skickas ut när användaren ändrar valet. `event.detail` innehåller `JobSelectionItem[]` som kan skickas tillbaka till `setSelection()`. |\n| `afJobDataLoadFailed` | Skickas när laddningen av yrkesdata misslyckas. |\n| `afJobValidationChange` | Skickas när komponenten kör validering efter att fältet har berörts. `event.detail` innehåller `{ isValid: boolean, errorType: 'required'|'invalidInput'|null }`. |\n\n### Metoder\n\nYrkesväljaren exponerar några metoder för värdapplikationer som behöver styra\nkomponenten från JavaScript. De vanligaste är `setSelection(...)` och\n`setFocus()`. Övriga metoder finns för formulärintegration och dynamisk\ndataladdning.\n\n#### Primära metoder\n\n| Metod | Returvärde | Beskrivning |\n|:---|:---|:---|\n| `setSelection(input)` | `Promise<JobSelectionItem[]>` | Sätter eller rensar ett programmatiskt val. Returnerar komponentens normaliserade val. |\n| `setFocus()` | `Promise<void>` | Flyttar fokus till sökfältet. Används när värdappen till exempel öppnar en modal eller vill fokusera fältet efter ett fel. |\n\n#### Formulärvalidering\n\nYrkesväljaren är ett form-associated custom element. Det betyder att den kan\ndelta i vanliga HTML-formulär ungefär som ett inbyggt inputfält. Metoderna\nnedan är till för värdapplikationer som behöver läsa eller trigga den\nvalideringen manuellt.\n\n| Metod | Returvärde | Beskrivning |\n|:---|:---|:---|\n| `validate(forceTouch?)` | `Promise<boolean>` | Kör Yrkesväljarens egen validering. Returnerar `true` om fältet är giltigt. Med `forceTouch=true` visas valideringsfel även om användaren inte hunnit interagera med fältet. |\n| `checkValidity()` | `Promise<boolean>` | Returnerar om komponenten är giltig enligt webbläsarens formulärvalidering. Visar inget felmeddelande i UI. |\n| `reportValidity()` | `Promise<boolean>` | Kör webbläsarens formulärvalidering och låter webbläsaren visa valideringsfeedback om fältet är ogiltigt. |\n| `getValidity()` | `Promise<ValidityState>` | Returnerar webbläsarens detaljerade giltighetsstatus, till exempel om värdet saknas eller om komponenten har satt ett eget fel. De flesta integrationer behöver bara `validate()` eller `checkValidity()`. |\n| `getValidationMessage()` | `Promise<string>` | Returnerar texten som webbläsaren skulle använda som valideringsmeddelande just nu. |\n\n#### Dynamisk dataladdning\n\n| Metod | Returvärde | Beskrivning |\n|:---|:---|:---|\n| `updateData()` | `Promise<void>` | Läser om data efter ett nytt anrop till `registerTaxonomy(...)`. Behövs bara om värdappen byter taxonomidata efter att komponenten redan har renderats. |\n<br>\n\n### Input och output - programmatisk värdesättning\n\nProgrammatisk input går endast genom `setSelection()`. Metoden accepterar:\n\n* en sträng\n* en array där alla värden är strängar\n* den rika `JobSelectionItem[]` som `afJobSelected` tidigare har returnerat\n\nOutput är alltid en rik `JobSelectionItem[]`, både från metodens returvärde och från `afJobSelected.detail`.\n\n```typescript\ntype JobSelectionItem =\n  | {\n      type: 'job-title' | 'occupation-name';\n      id: string;\n      preferred_label: string;\n      ssyk_code_2012?: string;\n      related?: {\n        type: 'occupation-name';\n        id: string;\n        preferred_label: string;\n      };\n    }\n  | {\n      type: 'manual-input';\n      id: null;\n      preferred_label: string;\n    };\n```\n\nFör vanliga formulär hämtas värdet lämpligen via `new FormData(form)`. För applikationsstate sparar värdappen metodens returvärde eller `afJobSelected.detail`.\n\n`afJobSelected` använder samma format som metoden returnerar. Output kan därför sparas av värdappen och senare skickas tillbaka utan konvertering:\n\n```javascript\nyrkesvaljaren.addEventListener(\"afJobSelected\", async (event) => {\n  await annanYrkesvaljare.setSelection(event.detail);\n});\n```\n\n* **Inget valt:** `await yrkesvaljaren.setSelection([])`\n* **Taxonomival in:** `await yrkesvaljaren.setSelection('jrjV_wcz_fxg')`\n* **Taxonomival ut:** `{ type: 'job-title', id: 'jrjV_wcz_fxg', preferred_label: 'Sjuksköterska', ssyk_code_2012: '2221', related: { type: 'occupation-name', id: 'bXNH_MNX_dUR', preferred_label: 'Sjuksköterska, grundutbildad' } }`\n* **Fritext in:** `await yrkesvaljaren.setSelection('Pensionär')` kräver `af-manual-input=\"true\"`\n* **Fritext ut:** `{ type: 'manual-input', id: null, preferred_label: 'Pensionär' }`\n\nEn sträng som matchar Concept ID-formatet tolkas alltid som ett taxonomi-id och verifieras mot det laddade YV-datasetet. Övriga strängar tolkas som fritext. Fritext kräver `af-manual-input=\"true\"`.\n\nKomponenten gör inget anrop till Taxonomy API. För ett rikt taxonomiobjekt identifierar `id` yrket; YV returnerar aktuell metadata från det redan laddade datasetet.\n`ssyk_code_2012` är SSYK 2012-koden när den finns i YV-datat. Komponenten returnerar inget fält som heter `ssyk` och returnerar inte SSYK-nivåns taxonomi-id.\n\nSamma input-array får inte blanda strängar och objekt. Flera värden kräver `af-enable-multiple=\"true\"`; metoden aktiverar aldrig flervalsläge automatiskt.\n\n```javascript\nimport { InvalidSelectionError } from '@arbetsformedlingen/yrkesvaljaren';\n\nconst yrkesvaljaren = document.querySelector('digi-service-job-selector');\n\ntry {\n  const selection = await yrkesvaljaren.setSelection([\n    'iW55_9hv_bNp',\n    'Pensionär'\n  ]);\n  console.log('Valda yrken:', selection);\n} catch (error) {\n  if (error instanceof InvalidSelectionError) {\n    console.error(error.code, error.invalidIds);\n  }\n}\n```\n\nOm inputen är ogiltig avvisas Promise-anropet med `InvalidSelectionError`. Senaste giltiga val behålls, ett tydligt fel skrivs med `console.error`, och Yrkesväljaren markeras som `invalidInput` via `afJobValidationChange`. `setSelection()` skickar inte `afJobSelected`; eventet representerar endast användarens val.\n\n<br>\n\n#### Rensa val (både singel- och flervalsläge)\n\nFör att programmatiskt rensa gjorda val, anropa `setSelection([])`:\n\n```javascript\nconst yrkesvaljaren = document.querySelector('digi-service-job-selector');\nawait yrkesvaljaren.setSelection([]);\n```\n\n---\n<br>\n\n### Validering\n\nKomponenten har ett inbyggt, autonomt valideringssystem.\n\n#### Obligatoriskt fält\n\nFör att göra fältet obligatoriskt, använd `af-required`-attributet och ställ in `af-manual-input` på `false`.\n\n```html\n<digi-service-job-selector\n  af-label=\"Välj ett yrke (obligatoriskt)\"\n  af-required=\"true\"\n  af-manual-input=\"false\"\n></digi-service-job-selector>\n```\n\nNär detta är inställt kommer komponenten att visa ett felmeddelande om användaren klickar i och sedan lämnar fältet utan att göra ett giltigt val. Om `af-manual-input` i stället är satt till `true` tillåts användaren att ange ett yrke manuellt via fritext.\n<br>\n#### Lyssna på valideringsstatus (`afJobValidationChange`)\n\nFör att i realtid veta om komponenten är giltig kan du lyssna på `afJobValidationChange`-händelsen.\n\n```javascript\nconst yrkesvaljarenElement = document.querySelector('digi-service-job-selector');\n\nyrkesvaljarenElement.addEventListener('afJobValidationChange', (event) => {\n  const { isValid, errorType } = event.detail;\n  console.log(`Är komponenten giltig? ${isValid}`);\n  if (!isValid) {\n    console.log(`Typ av fel: ${errorType}`); // 'required' eller 'invalidInput'\n  }\n});\n```\n<br>\n#### Manuell validering (`validate()`)\n\nFör att manuellt trigga en validering, till exempel vid ett formulär-submit, kan du anropa den publika metoden `validate()`.\n<br>\n#### Formulärstöd (FACE)\n\nKomponenten agerar som ett inbyggt HTML-formulärelement (`Form-Associated Custom Element`). Detta innebär att om komponenten ligger i ett `<form>` och har `af-required=\"true\"` kommer webbläsaren automatiskt att stoppa inskick av formuläret om fältet är tomt. Det går även bra att hämta värdet via `new FormData(form)`.\n\n`name` följer HTML-standard och fungerar som på `<input name=\"...\">`. Det är\ndärför inte prefixat med `af-`. Värdet används som fältnamn och nyckel i\n`FormData`.\n\n```html\n<form id=\"job-form\">\n  <digi-service-job-selector\n    name=\"occupation\"\n    af-label=\"Välj yrke\"\n    af-required=\"true\">\n  </digi-service-job-selector>\n</form>\n```\n\n```javascript\nconst form = document.querySelector('#job-form');\nconst yrkesvaljarenElement = document.querySelector('digi-service-job-selector');\n\nform.addEventListener('submit', async (e) => {\n  e.preventDefault();\n  const isComponentValid = await yrkesvaljarenElement.validate();\n\n  if (isComponentValid) {\n    const formData = new FormData(form);\n    console.log(formData.get('occupation'));\n    console.log('Formuläret är giltigt och kan skickas!');\n    // Skicka formulär...\n  } else {\n    console.log('Formuläret är ogiltigt.');\n  }\n});\n```\n","readmeFilename":"README.md"}