Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ef1be47b7 | ||
|
|
dde30617e3 | ||
|
|
609678667f | ||
|
|
180ecd89bf | ||
|
|
635b0859b8 | ||
|
|
10cbe105bc | ||
|
|
f97eed8396 | ||
|
|
119d9df7b5 | ||
|
|
846d18cd23 | ||
|
|
833c35cbbc | ||
|
|
08353f50b5 | ||
|
|
fba81fb4eb | ||
|
|
9d9c6e9bfa | ||
|
|
4dad81714f | ||
|
|
8e9135149b | ||
|
|
852b53d6b9 | ||
|
|
ede1f5858a | ||
|
|
ad9e7165bb | ||
|
|
77302a30b8 | ||
|
|
0ef12ef601 | ||
|
|
4174f9a7b4 | ||
|
|
608f158d70 | ||
|
|
34d41ecc78 | ||
|
|
7e62365a60 | ||
|
|
8565f410a1 | ||
|
|
46d70820df | ||
|
|
67e66ffe02 | ||
|
|
e19bf67b33 | ||
|
|
97c5f60e91 | ||
|
|
ea5293c28d | ||
|
|
6a58efa9a9 | ||
|
|
c95f33679e | ||
|
|
b52a5e02a0 | ||
|
|
ab3ef0d34b | ||
|
|
69798f6ee2 | ||
|
|
ee14586beb | ||
|
|
82470ba669 | ||
|
|
6286f0e8e6 | ||
|
|
3c08651df2 | ||
|
|
e6d55fdcd6 | ||
|
|
8c445f020c | ||
|
|
78a76bac5d | ||
|
|
75b334af61 | ||
|
|
5d98c50b80 | ||
|
|
27803fd37c | ||
|
|
1bdb7e3777 | ||
|
|
20bcc28cb0 | ||
|
|
f43ec5c48c | ||
|
|
40f0b3340d | ||
|
|
1f023a84be | ||
|
|
f170a2201c | ||
|
|
7df8ee5dd3 | ||
|
|
713ccfb2eb | ||
|
|
99c35f4aed | ||
|
|
981f41c047 | ||
|
|
330e7867e1 | ||
|
|
82ed5ff3f0 | ||
|
|
17cf7f4ac2 | ||
|
|
decd2bac2a | ||
|
|
0a13a225c1 | ||
|
|
69a7dc76d9 | ||
|
|
433687a967 | ||
|
|
febf6543b9 | ||
|
|
aa506975b4 | ||
|
|
cb3201a788 | ||
|
|
0f70394cf4 | ||
|
|
b26cb5ef51 | ||
|
|
d66e6c7c94 | ||
|
|
48ed9934e6 | ||
|
|
dec60f90b4 | ||
|
|
9aa756b76e | ||
|
|
50573701ef |
No files matched your search
@@ -1,34 +1,33 @@
|
||||
# Changesets
|
||||
|
||||
To handle versioning and released, we use [Changesets](https://github.com/changesets/changesets) to [version](https://semver.org/) and publish our packages.
|
||||
For versjonering bruker vi løsningen [Changesets](https://github.com/changesets/changesets) for å [versjonering](https://semver.org/) og publisering av pakker.
|
||||
|
||||
## Howto
|
||||
|
||||
- To create a new version, run `yarn changeset`
|
||||
- select versions to change with arrowkeys + spacebar
|
||||
- For å lage en ny versjons-entry: `yarn changeset`
|
||||
- Velg pakkene som skal versjoneres med `arrowkeys` + `Space`
|
||||
|
||||
`🦋 Which packages would you like to include?`
|
||||
|
||||
- Press the `Space` key to select `changed packages`, then press `Enter` to move to the next question.
|
||||
Trykk `Space` for å velge pakkene som skal versjoneres, for så trykke `Enter` for å gå videre.
|
||||
|
||||
`🦋 Which packages should have a major bump?`
|
||||
|
||||
- Press the `Enter` key to select none and move to the next question, _*or*_ navigate packages using the arrow keys and press the `Space` key to select the packages with changes that should target a major version.
|
||||
Trykk `Enter` for å gå videre _*eller*_ velg pakkene som skal marjor-bumpes med `arrowkeys` + `Space`
|
||||
|
||||
`🦋 Which packages should have a minor bump?`
|
||||
|
||||
- Press the `Enter` key to select none so that your changes automatically target a patch bump, _*or*_ select packages using the up and down arrow keys and space if your changes should target a minor version.
|
||||
Trykk `Enter` for å gå videre _*eller*_ velg pakkene som skal marjor-bumpes med `arrowkeys` + `Space`
|
||||
|
||||
- Commit and push up.
|
||||
Hvis du ikke velger major eller minor, så blir pakkene få en patch-bump
|
||||
|
||||
## Fixed versioning
|
||||
- Commit og push.
|
||||
|
||||
All our "base"-packages are has fixed versioning. This means a semver-bump on any of them will bump all of them. Take
|
||||
## Fixed versjonering
|
||||
|
||||
Current fixed packages
|
||||
Alle base-pakkene våre har `fixed versjonering`. Dette tilsier at en bump på en av disse vil bumpe alle til samme versjon
|
||||
|
||||
```
|
||||
[
|
||||
```sh
|
||||
"@navikt/ds-react",
|
||||
"@navikt/ds-css",
|
||||
"@navikt/ds-icons",
|
||||
@@ -37,5 +36,4 @@ Current fixed packages
|
||||
"@navikt/ds-css-internal",
|
||||
"@navikt/ds-react-internal",
|
||||
"@navikt/ds-codemod"
|
||||
]
|
||||
```
|
||||
@@ -21,7 +21,8 @@
|
||||
"access": "public",
|
||||
"baseBranch": "master",
|
||||
"updateInternalDependencies": "patch",
|
||||
"ignore": ["nextjs-demo", "shadow-dom"],
|
||||
"ignore": ["nextjs-demo", "shadow-dom", "aksel.nav.no"],
|
||||
|
||||
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
|
||||
"updateInternalDependents": "always"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
name: Deploy aksel.dev.nav.no
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- next
|
||||
|
||||
env:
|
||||
IMAGE: ghcr.io/navikt/designsystemet
|
||||
|
||||
jobs:
|
||||
build_and_deploy:
|
||||
name: Build and deploy to dev-gcp
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: "14"
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
ref: "next"
|
||||
- name: add tokens to .env
|
||||
run: |
|
||||
echo "SANITY_WRITE_KEY=${{ secrets.SANITY_FEEDBACK_WRITE_KEY }}" >> aksel.nav.no/website/.env
|
||||
echo "ALGOLIA_ADMIN=${{ secrets.ALGOLIA_ADMIN }}" >> aksel.nav.no/website/.env
|
||||
echo "ALGOLIA_ID=${{ secrets.ALGOLIA_ID}}" >> aksel.nav.no/website/.env
|
||||
echo "TRELLO_TOKEN=${{ secrets.TRELLO_TOKEN }}" >> aksel.nav.no/website/.env
|
||||
echo "SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}" >> aksel.nav.no/website/.env
|
||||
echo "SANITY_PREVIEW_TOKEN=${{ secrets.SANITY_PREVIEW_TOKEN }}" >> aksel.nav.no/website/.env
|
||||
echo "SANITY_PRIVATE_NO_DRAFTS=${{ secrets.SANITY_PRIVATE_NO_DRAFTS }}" >> aksel.nav.no/website/.env
|
||||
|
||||
- name: Restore cache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: "**/node_modules"
|
||||
key: ${{ runner.os }}-dev-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-dev-
|
||||
|
||||
- name: Install dependencies
|
||||
run: yarn
|
||||
|
||||
- name: Build application
|
||||
run: |
|
||||
yarn boot
|
||||
yarn docgen
|
||||
yarn workspace aksel.nav.no build:next
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@ab80d026d4753220c4243394c07c7d80f9638d06 # Use commit-sha1 instead of tag for security concerns
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Get complete tag
|
||||
run: echo "TAG=DEV-$( date +%s )" >> $GITHUB_ENV
|
||||
- name: Create docker image tags
|
||||
run: echo "DOCKER_TAG=${{ env.IMAGE }}:${{ env.TAG }}" >> $GITHUB_ENV
|
||||
- name: Build docker image
|
||||
run: docker build -t ${{ env.DOCKER_TAG }} . -f aksel.nav.no/Dockerfile
|
||||
- name: Push docker image
|
||||
run: |
|
||||
docker push ${{ env.DOCKER_TAG }}
|
||||
|
||||
- name: Deploy to dev-gcp
|
||||
uses: nais/deploy/actions/deploy@master
|
||||
env:
|
||||
APIKEY: ${{ secrets.NAIS_DEPLOY_APIKEY }}
|
||||
RESOURCE: aksel.nav.no/nais-dev.yaml
|
||||
CLUSTER: dev-gcp
|
||||
IMAGE: ${{ env.DOCKER_TAG }}
|
||||
@@ -0,0 +1,81 @@
|
||||
name: Deploy aksel.nav.no
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- "aksel.nav.no/**"
|
||||
|
||||
env:
|
||||
IMAGE: ghcr.io/navikt/designsystemet
|
||||
|
||||
jobs:
|
||||
build_and_deploy:
|
||||
name: Build and deploy to prod-gcp
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: "14"
|
||||
- uses: actions/checkout@v2
|
||||
- name: add tokens to .env
|
||||
run: |
|
||||
echo "SANITY_WRITE_KEY=${{ secrets.SANITY_FEEDBACK_WRITE_KEY }}" >> aksel.nav.no/website/.env
|
||||
echo "ALGOLIA_ADMIN=${{ secrets.ALGOLIA_ADMIN }}" >> aksel.nav.no/website/.env
|
||||
echo "ALGOLIA_ID=${{ secrets.ALGOLIA_ID}}" >> aksel.nav.no/website/.env
|
||||
echo "TRELLO_TOKEN=${{ secrets.TRELLO_TOKEN }}" >> aksel.nav.no/website/.env
|
||||
echo "SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}" >> aksel.nav.no/website/.env
|
||||
echo "SANITY_PREVIEW_TOKEN=${{ secrets.SANITY_PREVIEW_TOKEN }}" >> aksel.nav.no/website/.env
|
||||
echo "SANITY_PRIVATE_NO_DRAFTS=${{ secrets.SANITY_PRIVATE_NO_DRAFTS }}" >> aksel.nav.no/website/.env
|
||||
|
||||
- name: Restore cache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: "**/node_modules"
|
||||
key: ${{ runner.os }}-prod-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-prod-
|
||||
|
||||
- name: Install dependencies
|
||||
run: yarn
|
||||
|
||||
- name: build packages
|
||||
run: |
|
||||
yarn boot
|
||||
yarn docgen
|
||||
|
||||
- name: Tests
|
||||
run: yarn workspace aksel.nav.no test
|
||||
|
||||
- name: E2E
|
||||
run: NEXT_PUBLIC_TEST=true yarn workspace website e2e
|
||||
|
||||
- name: Update sanity sync
|
||||
run: yarn workspace aksel.nav.no sanity:update
|
||||
|
||||
- name: Build application
|
||||
run: yarn workspace aksel.nav.no build:next
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@ab80d026d4753220c4243394c07c7d80f9638d06 # Use commit-sha1 instead of tag for security concerns
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Get complete tag
|
||||
run: echo "TAG=$( date +%s )" >> $GITHUB_ENV
|
||||
- name: Create docker image tags
|
||||
run: echo "DOCKER_TAG=${{ env.IMAGE }}:${{ env.TAG }}" >> $GITHUB_ENV
|
||||
- name: Build docker image
|
||||
run: docker build -t ${{ env.DOCKER_TAG }} . -f aksel.nav.no/Dockerfile
|
||||
- name: Push docker image
|
||||
run: |
|
||||
docker push ${{ env.DOCKER_TAG }}
|
||||
|
||||
- name: Deploy to prod-gcp
|
||||
uses: nais/deploy/actions/deploy@master
|
||||
env:
|
||||
APIKEY: ${{ secrets.NAIS_DEPLOY_APIKEY }}
|
||||
RESOURCE: aksel.nav.no/nais-prod.yaml
|
||||
CLUSTER: prod-gcp
|
||||
IMAGE: ${{ env.DOCKER_TAG }}
|
||||
@@ -0,0 +1,41 @@
|
||||
name: Redeploy image to for aksel.nav.no
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag:
|
||||
description: "Docker image tag"
|
||||
required: true
|
||||
default: ""
|
||||
dry:
|
||||
description: "Dry-run"
|
||||
required: true
|
||||
default: "false"
|
||||
|
||||
env:
|
||||
IMAGE: ghcr.io/navikt/designsystemet
|
||||
|
||||
jobs:
|
||||
redeploy:
|
||||
name: Redeploy image
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: "14"
|
||||
- uses: actions/checkout@v2
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@ab80d026d4753220c4243394c07c7d80f9638d06 # Use commit-sha1 instead of tag for security concerns
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Create docker image tag
|
||||
run: echo "DOCKER_TAG=${{ env.IMAGE }}:${{ github.event.inputs.tag }}" >> $GITHUB_ENV
|
||||
- name: Deploy to prod-gcp
|
||||
uses: nais/deploy/actions/deploy@master
|
||||
env:
|
||||
APIKEY: ${{ secrets.NAIS_DEPLOY_APIKEY }}
|
||||
RESOURCE: aksel.nav.no/nais-prod.yaml
|
||||
CLUSTER: prod-gcp
|
||||
IMAGE: ${{ env.DOCKER_TAG }}
|
||||
DRY_RUN: ${{ github.event.inputs.dry }}
|
||||
@@ -0,0 +1,39 @@
|
||||
name: Backup sanity dateset to gcp
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
# 12.00 every 3 days
|
||||
- cron: "0 0 */3 * *"
|
||||
jobs:
|
||||
execute:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0 # Required to retrieve git history
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: 14
|
||||
|
||||
- name: Restore cache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: "**/node_modules"
|
||||
key: ${{ runner.os }}-build-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-build-
|
||||
|
||||
- name: Install dependencies
|
||||
run: yarn
|
||||
|
||||
- name: Export dataset
|
||||
run: SANITY_TOKEN=${{secrets.SANITY_DATASET_EDITOR_TOKEN}} yarn workspace aksel.nav.no sanity:backup
|
||||
- name: Upload GCP bucket
|
||||
uses: "google-github-actions/auth@v0"
|
||||
with:
|
||||
credentials_json: "${{ secrets.gcp_credentials_prod }}"
|
||||
- uses: "google-github-actions/upload-cloud-storage@v0"
|
||||
with:
|
||||
path: ./aksel.nav.no/sanity
|
||||
destination: "aksel-website-prod/backups"
|
||||
glob: "**/backup-*.tar.gz"
|
||||
@@ -3,11 +3,11 @@ name: Visual Regression Tests
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- next
|
||||
- "master"
|
||||
paths:
|
||||
- "@navikt/**"
|
||||
pull_request:
|
||||
branches: [master, next]
|
||||
paths:
|
||||
- "@navikt/**"
|
||||
|
||||
@@ -37,9 +37,7 @@ jobs:
|
||||
run: yarn
|
||||
|
||||
- name: Build packages
|
||||
run: |
|
||||
yarn workspace @navikt/ds-tokens build
|
||||
yarn workspace @navikt/ds-css build
|
||||
run: yarn boot
|
||||
|
||||
- name: Chromatic
|
||||
uses: chromaui/action@v1
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
#
|
||||
# ******** NOTE ********
|
||||
# We have attempted to detect the languages in your repository. Please check
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [master, next]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [master]
|
||||
schedule:
|
||||
- cron: "41 8 * * 6"
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: ["javascript"]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v2
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
|
||||
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
|
||||
# queries: security-extended,security-and-quality
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v2
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||
|
||||
# If the Autobuild fails above, remove it and uncomment the following three lines.
|
||||
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
|
||||
|
||||
# - run: |
|
||||
# echo "Run, Build Application using script"
|
||||
# ./location_of_script_within_repo/buildscript.sh
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v2
|
||||
@@ -0,0 +1,56 @@
|
||||
name: E2E / Playwright Tests
|
||||
on:
|
||||
push:
|
||||
branches: [master, next]
|
||||
paths:
|
||||
- "aksel.nav.no/**"
|
||||
pull_request:
|
||||
branches: [master, next]
|
||||
paths:
|
||||
- "aksel.nav.no/**"
|
||||
|
||||
jobs:
|
||||
playwright:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
|
||||
- name: add tokens to .env
|
||||
run: |
|
||||
echo "SANITY_WRITE_KEY=${{ secrets.SANITY_FEEDBACK_WRITE_KEY }}" >> aksel.nav.no/website/.env
|
||||
echo "ALGOLIA_ADMIN=${{ secrets.ALGOLIA_ADMIN }}" >> aksel.nav.no/website/.env
|
||||
echo "ALGOLIA_ID=${{ secrets.ALGOLIA_ID}}" >> aksel.nav.no/website/.env
|
||||
echo "TRELLO_TOKEN=${{ secrets.TRELLO_TOKEN }}" >> aksel.nav.no/website/.env
|
||||
echo "SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}" >> aksel.nav.no/website/.env
|
||||
echo "SANITY_PREVIEW_TOKEN=${{ secrets.SANITY_PREVIEW_TOKEN }}" >> aksel.nav.no/website/.env
|
||||
echo "SANITY_PRIVATE_NO_DRAFTS=${{ secrets.SANITY_PRIVATE_NO_DRAFTS }}" >> aksel.nav.no/website/.env
|
||||
|
||||
- name: Restore cache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: "**/node_modules"
|
||||
key: ${{ runner.os }}-e2e-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-e2e-
|
||||
|
||||
- name: Install dependencies
|
||||
run: yarn
|
||||
|
||||
- name: build packages
|
||||
run: |
|
||||
yarn boot
|
||||
yarn docgen
|
||||
|
||||
- name: Install Playwright Browsers
|
||||
run: npx playwright install --with-deps
|
||||
- name: Run Playwright tests
|
||||
run: yarn workspace website e2e
|
||||
- uses: actions/upload-artifact@v3
|
||||
if: always()
|
||||
with:
|
||||
name: playwright-report
|
||||
path: aksel.nav.no/website/playwright-report/
|
||||
retention-days: 10
|
||||
@@ -0,0 +1,31 @@
|
||||
name: "push-to-cdn"
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- "master"
|
||||
paths:
|
||||
- "fonts/**"
|
||||
|
||||
jobs:
|
||||
upload:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: "read"
|
||||
id-token: "write"
|
||||
|
||||
steps:
|
||||
- uses: "actions/checkout@v3"
|
||||
|
||||
- id: upload
|
||||
uses: nais/frontend-plattform-cdn-upload-action@main
|
||||
with:
|
||||
cdn-environment: cdn.nav.no
|
||||
cdn-team-name: aksel
|
||||
source: ./fonts
|
||||
destination: "" # uploads folder to team root
|
||||
|
||||
- run: echo uploaded file ${{ steps.upload.outputs.uploaded }}
|
||||
shell: bash
|
||||
@@ -27,9 +27,9 @@ jobs:
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: "**/node_modules"
|
||||
key: ${{ runner.os }}-test-${{ github.sha }}
|
||||
key: ${{ runner.os }}-prod-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-test
|
||||
${{ runner.os }}-prod
|
||||
|
||||
- name: Install dependencies
|
||||
run: yarn
|
||||
@@ -42,7 +42,7 @@ jobs:
|
||||
publish: yarn release
|
||||
env:
|
||||
NPM_TOKEN: ${{ secrets.NPM_AUTOMATION }}
|
||||
GITHUB_TOKEN: ${{ secrets.GIT_REPO }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTOMATION }}
|
||||
|
||||
- name: Creating .npmrc
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
name: Indexing search
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
# 01.00 & 12.00 every day
|
||||
- cron: "00 01,12 * * *"
|
||||
|
||||
jobs:
|
||||
searchcrawl:
|
||||
name: Search-indexing aksel.nav.no
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
APPLICATION_ID: ${{ secrets.ALGOLIA_ID}}
|
||||
API_KEY: ${{ secrets.ALGOLIA_ADMIN }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Read crawler.json
|
||||
id: algolia_config
|
||||
run: echo "::set-output name=config::$(cat ./aksel.nav.no/crawler.json | jq -r tostring)"
|
||||
- name: Push indices to Algolia
|
||||
uses: signcl/docsearch-scraper-action@master
|
||||
env:
|
||||
APPLICATION_ID: ${{ secrets.ALGOLIA_ID}}
|
||||
API_KEY: ${{ secrets.ALGOLIA_ADMIN }}
|
||||
CONFIG: ${{ steps.algolia_config.outputs.config }}
|
||||
@@ -26,7 +26,7 @@ jobs:
|
||||
if: steps.node-cache.outputs.cache-hit == 'true'
|
||||
run: yarn postinstall
|
||||
- name: Update Icons
|
||||
run: yarn update:icons
|
||||
run: yarn workspace @navikt/ds-icons update
|
||||
env:
|
||||
FIGMA_TOKEN: ${{ secrets.FIGMA_IKONER_API }}
|
||||
- name: Create Pull Request
|
||||
@@ -39,4 +39,4 @@ jobs:
|
||||
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
|
||||
signoff: false
|
||||
delete-branch: true
|
||||
title: "[FIX] Ikonsynk Figma"
|
||||
title: "Ikonsynk Figma"
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
if: steps.node-cache.outputs.cache-hit == 'true'
|
||||
run: yarn postinstall
|
||||
- name: Update tokens
|
||||
run: yarn update:tokens
|
||||
run: yarn workspace @navikt/ds-tokens update
|
||||
env:
|
||||
FIGMA_TOKEN: ${{ secrets.FIGMA_IKONER_API }}
|
||||
- name: Create Pull Request
|
||||
@@ -33,7 +33,7 @@ jobs:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
branch: figma-tokens-sync
|
||||
delete-branch: true
|
||||
title: "[FEATURE] Tokens sync Figma"
|
||||
title: "Tokens sync Figma"
|
||||
commit-message: "Tokens synket fra figma"
|
||||
committer: GitHub <noreply@github.com>
|
||||
signoff: false
|
||||
@@ -128,4 +128,23 @@ _docs.json
|
||||
!.yarn/versions
|
||||
*/icons/src
|
||||
*/icons/png
|
||||
*/core/icons
|
||||
*/core/icons
|
||||
/storybook-static
|
||||
|
||||
# Aksel.nav.no
|
||||
.next
|
||||
!*/website/lib/
|
||||
!*/website/public/
|
||||
!aksel.nav.no/**/*.d.ts
|
||||
!*/sanity/lib/
|
||||
!*/sanity/static/
|
||||
out
|
||||
test-urls.json
|
||||
videos
|
||||
sanity/scripts/renameField.js
|
||||
tmp.json
|
||||
/test-results/
|
||||
/playwright-report/
|
||||
/playwright/.cache/
|
||||
playwright-report/
|
||||
/test-results/
|
||||
@@ -0,0 +1,2 @@
|
||||
**/nais-dev.yaml
|
||||
**/nais-prod.yaml
|
||||
@@ -15,3 +15,7 @@
|
||||
.rowgap[data-theme="dark"] {
|
||||
background-color: #262626;
|
||||
}
|
||||
|
||||
.rowgap-wrap {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
@@ -17,7 +17,6 @@ module.exports = {
|
||||
},
|
||||
stories: () => [...getStories(), "./*.stories.mdx"],
|
||||
addons: [
|
||||
"@storybook/addon-docs",
|
||||
"@storybook/addon-a11y",
|
||||
{
|
||||
name: "@storybook/addon-storysource",
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
enableImmutableInstalls: false
|
||||
|
||||
nodeLinker: node-modules
|
||||
|
||||
plugins:
|
||||
|
||||
@@ -1,31 +1,39 @@
|
||||
# @navikt/ds-codemod
|
||||
|
||||
## 1.3.37
|
||||
## 1.5.9
|
||||
|
||||
## 1.5.8
|
||||
|
||||
## 1.5.7
|
||||
|
||||
## 1.5.6
|
||||
|
||||
## 1.5.5
|
||||
|
||||
## 1.5.4
|
||||
|
||||
## 1.5.3
|
||||
|
||||
## 1.5.2
|
||||
|
||||
## 1.5.1
|
||||
|
||||
## 1.5.0
|
||||
|
||||
## 1.4.4
|
||||
|
||||
## 1.4.3
|
||||
|
||||
## 1.4.2
|
||||
|
||||
## 1.4.1
|
||||
|
||||
## 1.4.0
|
||||
|
||||
## 1.3.39
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`b95fc3364`](https://github.com/navikt/Designsystemet/commit/b95fc336490b7da4a0a2ba4a8a8a2bfceb691402) Thanks [@KenAJoh](https://github.com/KenAJoh)! - changeset-demo
|
||||
- [`40f0b3340`](https://github.com/navikt/Designsystemet/commit/40f0b3340d01bf85fecc04f2f3a8e8b2acf996f1) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Bump for latest-tag
|
||||
|
||||
## 1.3.36
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`5af875d98`](https://github.com/navikt/Designsystemet/commit/5af875d98133603eb6cdc8e83f2182d7087ba034) Thanks [@KenAJoh](https://github.com/KenAJoh)! - changeset-demo
|
||||
|
||||
## 1.3.35
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`dd92454d0`](https://github.com/navikt/Designsystemet/commit/dd92454d052386582cfbae28c3248886d70f6367) Thanks [@KenAJoh](https://github.com/KenAJoh)! - demo-bump
|
||||
|
||||
## 1.3.34
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1690](https://github.com/navikt/Designsystemet/pull/1690) [`2fa52b05e`](https://github.com/navikt/Designsystemet/commit/2fa52b05e75ef518f0725ef33ca1890c1b683313) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Workflow-test
|
||||
|
||||
## 1.3.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1690](https://github.com/navikt/Designsystemet/pull/1690) [`89ac7f8e9`](https://github.com/navikt/Designsystemet/commit/89ac7f8e9200133170562608e3cbba9b8b6d1abe) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Initial changeset changelog
|
||||
## 1.3.38
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@navikt/ds-codemod",
|
||||
"version": "1.3.37",
|
||||
"version": "1.5.9",
|
||||
"description": "NAV designsystem codemods",
|
||||
"author": "NAV Designsystem team",
|
||||
"license": "MIT",
|
||||
@@ -36,7 +36,7 @@
|
||||
"globby": "11.0.1",
|
||||
"inquirer": "7.3.3",
|
||||
"is-git-clean": "1.1.0",
|
||||
"jest": "^27.5.0",
|
||||
"jest": "^29.0.0",
|
||||
"jscodeshift": "0.13.1",
|
||||
"jscodeshift-add-imports": "1.0.10",
|
||||
"lodash": "4.17.21",
|
||||
@@ -44,10 +44,12 @@
|
||||
"prettier": "2.7.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/preset-env": "^7.0.0",
|
||||
"@types/jest": "^29.0.0",
|
||||
"@types/jscodeshift": "0.11.5",
|
||||
"@types/react": "^18.0.0",
|
||||
"del": "7.0.0",
|
||||
"typescript": "^4.7.2"
|
||||
"typescript": "^4.8.0"
|
||||
},
|
||||
"sideEffects": false,
|
||||
"engines": {
|
||||
|
||||
@@ -28,7 +28,7 @@ export default function transformer(file, api, options) {
|
||||
});
|
||||
});
|
||||
|
||||
if (!!j(file.source).findJSXElements(localName)) {
|
||||
if (j(file.source).findJSXElements(localName)) {
|
||||
renameProps({
|
||||
root,
|
||||
componentName: localName,
|
||||
|
||||
@@ -54,7 +54,7 @@ export default function transformer(file, api, options) {
|
||||
});
|
||||
});
|
||||
|
||||
if (!!j(file.source).findJSXElements(localName)) {
|
||||
if (j(file.source).findJSXElements(localName)) {
|
||||
root.findJSXElements(`${localName}`).forEach((parent) => {
|
||||
const skip = !!parent.value.openingElement?.attributes.find(
|
||||
(x) => x.name.name === "data-version" && x.value.value === "v1"
|
||||
|
||||
@@ -23,7 +23,7 @@ export default function transformer(file, api, options) {
|
||||
});
|
||||
});
|
||||
|
||||
if (!!j(file.source).findJSXElements(localName)) {
|
||||
if (j(file.source).findJSXElements(localName)) {
|
||||
renameProps({
|
||||
root,
|
||||
componentName: `${localName}.List`,
|
||||
|
||||
@@ -1,31 +1,73 @@
|
||||
# @navikt/ds-css
|
||||
|
||||
## 1.3.37
|
||||
## 1.5.9
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`b95fc3364`](https://github.com/navikt/Designsystemet/commit/b95fc336490b7da4a0a2ba4a8a8a2bfceb691402) Thanks [@KenAJoh](https://github.com/KenAJoh)! - changeset-demo
|
||||
- 4px -> 2px gap chips-toggle active
|
||||
|
||||
## 1.3.36
|
||||
## 1.5.8
|
||||
|
||||
## 1.5.7
|
||||
|
||||
## 1.5.6
|
||||
|
||||
## 1.5.5
|
||||
|
||||
## 1.5.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`5af875d98`](https://github.com/navikt/Designsystemet/commit/5af875d98133603eb6cdc8e83f2182d7087ba034) Thanks [@KenAJoh](https://github.com/KenAJoh)! - changeset-demo
|
||||
- [#1709](https://github.com/navikt/Designsystemet/pull/1709) [`77302a30b`](https://github.com/navikt/Designsystemet/commit/77302a30b8eef8dc00b2d2e9c904a3f57da81a11) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Oppdatert ikoner
|
||||
|
||||
## 1.3.35
|
||||
## 1.5.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`dd92454d0`](https://github.com/navikt/Designsystemet/commit/dd92454d052386582cfbae28c3248886d70f6367) Thanks [@KenAJoh](https://github.com/KenAJoh)! - demo-bump
|
||||
- Byttet om på alt-farge rekkefølge
|
||||
|
||||
## 1.3.34
|
||||
## 1.5.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1690](https://github.com/navikt/Designsystemet/pull/1690) [`2fa52b05e`](https://github.com/navikt/Designsystemet/commit/2fa52b05e75ef518f0725ef33ca1890c1b683313) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Workflow-test
|
||||
- :memo: Rename FilterChips to ToggleChips
|
||||
|
||||
## 1.3.31
|
||||
## 1.5.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1690](https://github.com/navikt/Designsystemet/pull/1690) [`89ac7f8e9`](https://github.com/navikt/Designsystemet/commit/89ac7f8e9200133170562608e3cbba9b8b6d1abe) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Initial changeset changelog
|
||||
- Flex-wrap chips.css
|
||||
|
||||
## 1.5.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- [#1684](https://github.com/navikt/Designsystemet/pull/1684) [`e19bf67b3`](https://github.com/navikt/Designsystemet/commit/e19bf67b337dea39989c68b5e9c2591cf0d5b40f) Thanks [@KenAJoh](https://github.com/KenAJoh)! - :sparkles: Oppdaterte tag-varianter
|
||||
|
||||
- [#1668](https://github.com/navikt/Designsystemet/pull/1668) [`97c5f60e9`](https://github.com/navikt/Designsystemet/commit/97c5f60e9111da7e08f55c8d0aa29581f0a9b1ca) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Chips komponent :sparkles:
|
||||
|
||||
## 1.4.4
|
||||
|
||||
## 1.4.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- :sparkles: Validering og inputFormat i Date-komponenter
|
||||
|
||||
## 1.4.2
|
||||
|
||||
## 1.4.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`3c08651df`](https://github.com/navikt/Designsystemet/commit/3c08651df28c3e19dd8c8a7a1d0032200bec473d) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Date-komponenter følger språkrådets dato-formatering for måneder.
|
||||
|
||||
## 1.4.0
|
||||
|
||||
## 1.3.39
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`40f0b3340`](https://github.com/navikt/Designsystemet/commit/40f0b3340d01bf85fecc04f2f3a8e8b2acf996f1) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Bump for latest-tag
|
||||
|
||||
## 1.3.38
|
||||
@@ -0,0 +1,137 @@
|
||||
.navds-chips {
|
||||
display: flex;
|
||||
gap: var(--navds-spacing-2);
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.navds-chips :where(li) {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.navds-chips__chip {
|
||||
all: unset;
|
||||
display: flex;
|
||||
cursor: pointer;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 0.125rem;
|
||||
margin: 0;
|
||||
padding: 0 var(--navds-spacing-3);
|
||||
text-decoration: none;
|
||||
border-radius: var(--navds-border-radius-full);
|
||||
min-height: 32px;
|
||||
}
|
||||
|
||||
.navds-chips--small .navds-chips__chip {
|
||||
min-height: 24px;
|
||||
padding: 0 var(--navds-spacing-2);
|
||||
}
|
||||
|
||||
.navds-chips__toggle {
|
||||
box-shadow: inset 0 0 0 1px var(--ac-chip-toggle-border, var(--navds-global-color-gray-500));
|
||||
background-color: var(--ac-chip-toggle-bg, rgb(0 0 0 / 0.055));
|
||||
}
|
||||
|
||||
.navds-chips__toggle:hover {
|
||||
box-shadow: inset 0 0 0 1px var(--ac-chip-toggle-border-hover, var(--navds-global-color-gray-600));
|
||||
background-color: var(--ac-chip-toggle-bg-hover, rgb(0 0 0 / 0.1));
|
||||
}
|
||||
|
||||
.navds-chips__toggle[aria-pressed="true"] {
|
||||
box-shadow: none;
|
||||
background-color: var(--ac-chip-toggle-bg-pressed, var(--navds-global-color-deepblue-500));
|
||||
color: var(--ac-chip-toggle-text-pressed, var(--navds-global-color-white));
|
||||
}
|
||||
|
||||
.navds-chips__toggle[aria-pressed="true"]:hover {
|
||||
background-color: var(--ac-chip-toggle-bg-pressed-hover, var(--navds-global-color-deepblue-600));
|
||||
}
|
||||
|
||||
.navds-chips__toggle:focus-visible {
|
||||
box-shadow: 0 0 0 2px var(--navds-global-color-blue-800);
|
||||
}
|
||||
|
||||
.navds-chips__toggle[aria-pressed="true"]:focus-visible,
|
||||
.navds-chips__toggle:active:focus-visible {
|
||||
box-shadow: inset 0 0 0 1px var(--navds-global-color-white), 0 0 0 2px var(--navds-global-color-blue-800);
|
||||
}
|
||||
|
||||
.navds-chips__removable--action {
|
||||
background-color: var(--ac-chip-removable-action-bg, var(--navds-global-color-deepblue-500));
|
||||
color: var(--ac-chip-removable-action-text, var(--navds-global-color-white));
|
||||
}
|
||||
|
||||
.navds-chips__removable--neutral {
|
||||
color: var(--ac-chip-removable-neutral-text, var(--navds-global-color-gray-900));
|
||||
background-color: var(--ac-chip-removable-neutral-bg, rgb(0 0 0/ 0.055));
|
||||
box-shadow: inset 0 0 0 1px var(--ac-chip-removable-neutral-border, var(--navds-global-color-gray-500));
|
||||
}
|
||||
|
||||
.navds-chips__removable-icon {
|
||||
width: 1.5rem;
|
||||
height: 1.5rem;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
border-radius: var(--navds-border-radius-full);
|
||||
}
|
||||
|
||||
.navds-chips__toggle-icon {
|
||||
width: 1.25rem;
|
||||
height: 1.25rem;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
border-radius: var(--navds-border-radius-full);
|
||||
}
|
||||
|
||||
.navds-chips--small .navds-chips__toggle-icon {
|
||||
width: 1rem;
|
||||
height: 1rem;
|
||||
}
|
||||
|
||||
.navds-chips--small .navds-chips__removable-icon {
|
||||
width: 1.25rem;
|
||||
height: 1.25rem;
|
||||
}
|
||||
|
||||
.navds-chips--small .navds-chips__removable-icon > svg {
|
||||
width: 0.75rem;
|
||||
}
|
||||
|
||||
.navds-chips__removable--action:focus-visible {
|
||||
box-shadow: inset 0 0 0 1px var(--navds-global-color-white), 0 0 0 2px var(--navds-global-color-blue-800);
|
||||
}
|
||||
|
||||
.navds-chips__removable--neutral:focus-visible {
|
||||
box-shadow: 0 0 0 2px var(--navds-global-color-blue-800);
|
||||
}
|
||||
|
||||
.navds-chips__removable--action:hover {
|
||||
background-color: var(--ac-chip-removable-action-bg-hover, var(--navds-global-color-deepblue-700));
|
||||
}
|
||||
|
||||
.navds-chips__removable--neutral:hover {
|
||||
background-color: var(--ac-chip-removable-action-bg-hover, rgb(0 0 0 / 0.1));
|
||||
box-shadow: inset 0 0 0 1px var(--ac-chip-removable-neutral-border-hover, var(--navds-global-color-gray-600));
|
||||
}
|
||||
|
||||
.navds-chips--icon-left {
|
||||
padding-left: 0.375rem;
|
||||
}
|
||||
|
||||
.navds-chips--icon-right {
|
||||
padding-right: var(--navds-spacing-1);
|
||||
}
|
||||
|
||||
.navds-chips--small .navds-chips--icon-right {
|
||||
padding-right: 0.125rem;
|
||||
}
|
||||
|
||||
.navds-chips--small .navds-chips--icon-left {
|
||||
padding-left: 0.375rem;
|
||||
}
|
||||
@@ -7,6 +7,7 @@
|
||||
@import "button.css";
|
||||
@import "content-container.css";
|
||||
@import "chat.css";
|
||||
@import "chips.css";
|
||||
@import "guide-panel.css";
|
||||
@import "form/index.css";
|
||||
@import "help-text.css";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@navikt/ds-css",
|
||||
"version": "1.3.37",
|
||||
"version": "1.5.9",
|
||||
"description": "Css for NAV Designsystem components",
|
||||
"author": "NAV Designsystem team",
|
||||
"keywords": [
|
||||
@@ -20,11 +20,11 @@
|
||||
"watch": "postcss --watch --use postcss-import -o dist/index.css index.css"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@navikt/ds-tokens": "^1.3.37",
|
||||
"@navikt/ds-tokens": "^1.5.9",
|
||||
"normalize.css": "^8.0.1",
|
||||
"postcss": "^8.3.6",
|
||||
"postcss-cli": "^8.3.1",
|
||||
"postcss": "^8.4.0",
|
||||
"postcss-cli": "^9.0.0",
|
||||
"postcss-combine-duplicated-selectors": "10.0.3",
|
||||
"postcss-import": "^14.0.2"
|
||||
"postcss-import": "^14.1.0"
|
||||
}
|
||||
}
|
||||
@@ -14,38 +14,117 @@
|
||||
|
||||
.navds-tag {
|
||||
border: 1px solid;
|
||||
border-color: var(--navds-tag-color-border);
|
||||
border-radius: var(--navds-border-radius-medium);
|
||||
background-color: var(--navds-tag-color-background);
|
||||
border-radius: var(--navds-border-radius-small);
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 0.125rem var(--navds-spacing-3);
|
||||
padding: 0.125rem var(--navds-spacing-2);
|
||||
min-height: 32px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.navds-tag--small {
|
||||
min-height: 24px;
|
||||
padding-right: var(--navds-spacing-1);
|
||||
padding-left: var(--navds-spacing-1);
|
||||
padding: 0 0.375rem;
|
||||
}
|
||||
|
||||
.navds-tag--xsmall {
|
||||
min-height: 20px;
|
||||
padding: 0 var(--navds-spacing-1);
|
||||
}
|
||||
|
||||
.navds-tag--error {
|
||||
background-color: var(--navds-tag-color-error-background);
|
||||
border-color: var(--navds-tag-color-error-border);
|
||||
border-color: var(--ac-tag-error-border, var(--navds-global-color-red-500));
|
||||
background-color: var(--ac-tag-error-bg, var(--navds-global-color-red-50));
|
||||
color: var(--ac-tag-error-text, var(--navds-global-color-gray-900));
|
||||
}
|
||||
|
||||
.navds-tag--error-filled {
|
||||
border-color: transparent;
|
||||
background-color: var(--ac-tag-error-filled-bg, var(--navds-global-color-red-500));
|
||||
color: var(--ac-tag-error-filled-text, var(--navds-global-color-white));
|
||||
}
|
||||
|
||||
.navds-tag--success {
|
||||
background-color: var(--navds-tag-color-success-background);
|
||||
border-color: var(--navds-tag-color-success-border);
|
||||
border-color: var(--ac-tag-success-border, var(--navds-global-color-green-500));
|
||||
background-color: var(--ac-tag-success-bg, var(--navds-global-color-green-50));
|
||||
color: var(--ac-tag-success-text, var(--navds-global-color-gray-900));
|
||||
}
|
||||
|
||||
.navds-tag--success-filled {
|
||||
border-color: transparent;
|
||||
background-color: var(--ac-tag-success-filled-bg, var(--navds-global-color-green-500));
|
||||
color: var(--ac-tag-success-filled-text, var(--navds-global-color-white));
|
||||
}
|
||||
|
||||
.navds-tag--warning {
|
||||
background-color: var(--navds-tag-color-warning-background);
|
||||
border-color: var(--navds-tag-color-warning-border);
|
||||
border-color: var(--ac-tag-warning-border, var(--navds-global-color-orange-600));
|
||||
background-color: var(--ac-tag-warning-bg, var(--navds-global-color-orange-50));
|
||||
color: var(--ac-tag-warning-text, var(--navds-global-color-gray-900));
|
||||
}
|
||||
|
||||
.navds-tag--warning-filled {
|
||||
border-color: transparent;
|
||||
background-color: var(--ac-tag-warning-filled-bg, var(--navds-global-color-orange-500));
|
||||
color: var(--ac-tag-warning-filled-text, var(--navds-global-color-gray-900));
|
||||
}
|
||||
|
||||
.navds-tag--info {
|
||||
background-color: var(--navds-tag-color-info-background);
|
||||
border-color: var(--navds-tag-color-info-border);
|
||||
border-color: var(--ac-tag-info-border, var(--navds-global-color-lightblue-700));
|
||||
background-color: var(--ac-tag-info-bg, var(--navds-global-color-lightblue-50));
|
||||
color: var(--ac-tag-info-text, var(--navds-global-color-gray-900));
|
||||
}
|
||||
|
||||
.navds-tag--info-filled {
|
||||
border-color: transparent;
|
||||
background-color: var(--ac-tag-info-filled-bg, var(--navds-global-color-lightblue-500));
|
||||
color: var(--ac-tag-info-filled-text, var(--navds-global-color-gray-900));
|
||||
}
|
||||
|
||||
.navds-tag--neutral {
|
||||
border-color: var(--ac-tag-neutral-border, var(--navds-global-color-gray-500));
|
||||
background-color: var(--ac-tag-neutral-bg, var(--navds-global-color-gray-100));
|
||||
color: var(--ac-tag-neutral-text, var(--navds-global-color-gray-900));
|
||||
}
|
||||
|
||||
.navds-tag--neutral-filled {
|
||||
border-color: transparent;
|
||||
background-color: var(--ac-tag-neutral-filled-bg, var(--navds-global-color-gray-800));
|
||||
color: var(--ac-tag-neutral-filled-text, var(--navds-global-color-white));
|
||||
}
|
||||
|
||||
.navds-tag--alt1 {
|
||||
border-color: var(--ac-tag-alt1-border, var(--navds-global-color-purple-400));
|
||||
background-color: var(--ac-tag-alt1-bg, var(--navds-global-color-purple-100));
|
||||
color: var(--ac-tag-alt1-text, var(--navds-global-color-gray-900));
|
||||
}
|
||||
|
||||
.navds-tag--alt1-filled {
|
||||
border-color: transparent;
|
||||
background-color: var(--ac-tag-alt1-filled-bg, var(--navds-global-color-purple-400));
|
||||
color: var(--ac-tag-alt1-filled-text, var(--navds-global-color-white));
|
||||
}
|
||||
|
||||
.navds-tag--alt2 {
|
||||
border-color: var(--ac-tag-alt2-border, var(--navds-global-color-limegreen-500));
|
||||
background-color: var(--ac-tag-alt2-bg, var(--navds-global-color-limegreen-100));
|
||||
color: var(--ac-tag-alt2-text, var(--navds-global-color-gray-900));
|
||||
}
|
||||
|
||||
.navds-tag--alt2-filled {
|
||||
border-color: transparent;
|
||||
background-color: var(--ac-tag-alt2-filled-bg, var(--navds-global-color-limegreen-400));
|
||||
color: var(--ac-tag-alt2-filled-text, var(--navds-global-color-gray-900));
|
||||
}
|
||||
|
||||
.navds-tag--alt3 {
|
||||
border-color: var(--ac-tag-alt3-border, var(--navds-global-color-deepblue-400));
|
||||
background-color: var(--ac-tag-alt3-bg, var(--navds-global-color-deepblue-100));
|
||||
color: var(--ac-tag-alt3-text, var(--navds-global-color-gray-900));
|
||||
}
|
||||
|
||||
.navds-tag--alt3-filled {
|
||||
border-color: transparent;
|
||||
background-color: var(--ac-tag-alt3-filled-bg, var(--navds-global-color-deepblue-500));
|
||||
color: var(--ac-tag-alt3-filled-text, var(--navds-global-color-white));
|
||||
}
|
||||
@@ -1,46 +1,148 @@
|
||||
# @navikt/ds-react
|
||||
|
||||
## 1.3.37
|
||||
## 1.5.9
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`b95fc3364`](https://github.com/navikt/Designsystemet/commit/b95fc336490b7da4a0a2ba4a8a8a2bfceb691402) Thanks [@KenAJoh](https://github.com/KenAJoh)! - changeset-demo
|
||||
- Updated dependencies []:
|
||||
- @navikt/ds-icons@1.5.9
|
||||
|
||||
- Updated dependencies [[`b95fc3364`](https://github.com/navikt/Designsystemet/commit/b95fc336490b7da4a0a2ba4a8a8a2bfceb691402)]:
|
||||
- @navikt/ds-icons@1.3.37
|
||||
|
||||
## 1.3.36
|
||||
## 1.5.8
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`5af875d98`](https://github.com/navikt/Designsystemet/commit/5af875d98133603eb6cdc8e83f2182d7087ba034) Thanks [@KenAJoh](https://github.com/KenAJoh)! - changeset-demo
|
||||
- console.log removed
|
||||
|
||||
- Updated dependencies [[`5af875d98`](https://github.com/navikt/Designsystemet/commit/5af875d98133603eb6cdc8e83f2182d7087ba034)]:
|
||||
- @navikt/ds-icons@1.3.36
|
||||
- Updated dependencies []:
|
||||
- @navikt/ds-icons@1.5.8
|
||||
|
||||
## 1.3.35
|
||||
## 1.5.7
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`dd92454d0`](https://github.com/navikt/Designsystemet/commit/dd92454d052386582cfbae28c3248886d70f6367) Thanks [@KenAJoh](https://github.com/KenAJoh)! - demo-bump
|
||||
- defaultMonth/Year prop date-komponent
|
||||
|
||||
- Updated dependencies [[`dd92454d0`](https://github.com/navikt/Designsystemet/commit/dd92454d052386582cfbae28c3248886d70f6367)]:
|
||||
- @navikt/ds-icons@1.3.35
|
||||
- Updated dependencies []:
|
||||
- @navikt/ds-icons@1.5.7
|
||||
|
||||
## 1.3.34
|
||||
## 1.5.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1690](https://github.com/navikt/Designsystemet/pull/1690) [`2fa52b05e`](https://github.com/navikt/Designsystemet/commit/2fa52b05e75ef518f0725ef33ca1890c1b683313) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Workflow-test
|
||||
- Datepicker fungerte ikke med open shadow-dom
|
||||
|
||||
- Updated dependencies [[`2fa52b05e`](https://github.com/navikt/Designsystemet/commit/2fa52b05e75ef518f0725ef33ca1890c1b683313)]:
|
||||
- @navikt/ds-icons@1.3.34
|
||||
- Updated dependencies []:
|
||||
- @navikt/ds-icons@1.5.6
|
||||
|
||||
## 1.3.31
|
||||
## 1.5.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1690](https://github.com/navikt/Designsystemet/pull/1690) [`89ac7f8e9`](https://github.com/navikt/Designsystemet/commit/89ac7f8e9200133170562608e3cbba9b8b6d1abe) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Initial changeset changelog
|
||||
- Updated dependencies []:
|
||||
- @navikt/ds-icons@1.5.5
|
||||
|
||||
- Updated dependencies [[`89ac7f8e9`](https://github.com/navikt/Designsystemet/commit/89ac7f8e9200133170562608e3cbba9b8b6d1abe)]:
|
||||
- @navikt/ds-icons@1.3.31
|
||||
## 1.5.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`77302a30b`](https://github.com/navikt/Designsystemet/commit/77302a30b8eef8dc00b2d2e9c904a3f57da81a11)]:
|
||||
- @navikt/ds-icons@1.5.4
|
||||
|
||||
## 1.5.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @navikt/ds-icons@1.5.3
|
||||
|
||||
## 1.5.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- :memo: Rename FilterChips to ToggleChips
|
||||
|
||||
- Updated dependencies []:
|
||||
- @navikt/ds-icons@1.5.2
|
||||
|
||||
## 1.5.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Flex-wrap chips.css
|
||||
|
||||
- Updated dependencies []:
|
||||
- @navikt/ds-icons@1.5.1
|
||||
|
||||
## 1.5.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- [#1684](https://github.com/navikt/Designsystemet/pull/1684) [`e19bf67b3`](https://github.com/navikt/Designsystemet/commit/e19bf67b337dea39989c68b5e9c2591cf0d5b40f) Thanks [@KenAJoh](https://github.com/KenAJoh)! - :sparkles: Oppdaterte tag-varianter
|
||||
|
||||
- [#1668](https://github.com/navikt/Designsystemet/pull/1668) [`97c5f60e9`](https://github.com/navikt/Designsystemet/commit/97c5f60e9111da7e08f55c8d0aa29581f0a9b1ca) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Chips komponent :sparkles:
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @navikt/ds-icons@1.5.0
|
||||
|
||||
## 1.4.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Eksponerer validation-typer
|
||||
|
||||
- Updated dependencies []:
|
||||
- @navikt/ds-icons@1.4.4
|
||||
|
||||
## 1.4.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- :sparkles: Validering og inputFormat i Date-komponenter
|
||||
|
||||
- Updated dependencies []:
|
||||
- @navikt/ds-icons@1.4.3
|
||||
|
||||
## 1.4.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @navikt/ds-icons@1.4.2
|
||||
|
||||
## 1.4.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`3c08651df`](https://github.com/navikt/Designsystemet/commit/3c08651df28c3e19dd8c8a7a1d0032200bec473d) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Date-komponenter følger språkrådets dato-formatering for måneder.
|
||||
|
||||
- Updated dependencies []:
|
||||
- @navikt/ds-icons@1.4.1
|
||||
|
||||
## 1.4.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- [`1bdb7e377`](https://github.com/navikt/Designsystemet/commit/1bdb7e3777ece28d153991b78dbdd289366fca57) Thanks [@KenAJoh](https://github.com/KenAJoh)! - [#1702](https://github.com/navikt/Designsystemet/pull/1702) [`20bcc28cb`](https://github.com/navikt/Designsystemet/commit/20bcc28cb0a886aa40d2c1b042fb2706a144c014) Thanks [@andnorda](https://github.com/andnorda)! - Global Provider komponent for håndtering av global config
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies []:
|
||||
- @navikt/ds-icons@1.4.0
|
||||
|
||||
## 1.3.39
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`40f0b3340`](https://github.com/navikt/Designsystemet/commit/40f0b3340d01bf85fecc04f2f3a8e8b2acf996f1) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Bump for latest-tag
|
||||
|
||||
- Updated dependencies [[`40f0b3340`](https://github.com/navikt/Designsystemet/commit/40f0b3340d01bf85fecc04f2f3a8e8b2acf996f1)]:
|
||||
- @navikt/ds-icons@1.3.39
|
||||
|
||||
## 1.3.38
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [[`aa506975b`](https://github.com/navikt/Designsystemet/commit/aa506975b4466d4daa79c75f5f9faa255b7fae42)]:
|
||||
- @navikt/ds-icons@1.3.38
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@navikt/ds-react",
|
||||
"version": "1.3.37",
|
||||
"version": "1.5.9",
|
||||
"description": "NAV designsystem react components",
|
||||
"author": "NAV Designsystem team",
|
||||
"license": "MIT",
|
||||
@@ -24,19 +24,20 @@
|
||||
"/cjs",
|
||||
"/esm",
|
||||
"/src",
|
||||
"_docs.json"
|
||||
"_docs.json",
|
||||
"!**/*.tsbuildinfo"
|
||||
],
|
||||
"scripts": {
|
||||
"docgen": "yarn ts-node ../../../scripts/docgen.ts",
|
||||
"create-package-json-pointers-to-esm": "node ../../../scripts/createPackageJsonsWithESMPointers.js",
|
||||
"clean": "rimraf cjs esm",
|
||||
"build": "yarn run clean && concurrently \"tsc\" \"tsc -p tsconfig.esm.json\" && yarn create-package-json-pointers-to-esm",
|
||||
"build": "concurrently \"tsc\" \"tsc -p tsconfig.esm.json\" && yarn create-package-json-pointers-to-esm",
|
||||
"watch": "tsc --watch -p tsconfig.esm.json",
|
||||
"test": "jest"
|
||||
"test": "TZ=UTC jest"
|
||||
},
|
||||
"dependencies": {
|
||||
"@floating-ui/react-dom-interactions": "0.9.2",
|
||||
"@navikt/ds-icons": "^1.3.37",
|
||||
"@navikt/ds-icons": "^1.5.9",
|
||||
"@radix-ui/react-tabs": "1.0.0",
|
||||
"@radix-ui/react-toggle-group": "1.0.0",
|
||||
"clsx": "^1.2.1",
|
||||
@@ -50,21 +51,22 @@
|
||||
"@testing-library/react": "^13.3.0",
|
||||
"@testing-library/user-event": "^14.2.0",
|
||||
"@types/faker": "5.5.8",
|
||||
"@types/jest": "^27.0.1",
|
||||
"@types/jest": "^29.0.0",
|
||||
"@types/node": "^17.0.35",
|
||||
"@types/react-modal": "^3.13.1",
|
||||
"concurrently": "7.2.1",
|
||||
"copyfiles": "^2.4.1",
|
||||
"faker": "5.5.3",
|
||||
"fast-glob": "3.2.11",
|
||||
"jest": "^27.5.0",
|
||||
"jest": "^29.0.0",
|
||||
"jest-environment-jsdom": "^29.0.0",
|
||||
"react-dom": "^18.0.0",
|
||||
"react-router-dom": "^6.3.0",
|
||||
"rimraf": "3.0.2",
|
||||
"swr": "^1.1.2",
|
||||
"ts-jest": "^27.1.0",
|
||||
"ts-node": "10.7.0",
|
||||
"typescript": "^4.7.2"
|
||||
"ts-jest": "^29.0.0",
|
||||
"ts-node": "10.9.0",
|
||||
"typescript": "^4.8.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": "^17.0.30 || ^18.0.0",
|
||||
|
||||
@@ -32,7 +32,6 @@ const Bubble: BubbleType = forwardRef(
|
||||
ref={ref}
|
||||
className={cl("navds-chat__bubble", className)}
|
||||
style={{ backgroundColor: backgroundColor }}
|
||||
tabIndex={0}
|
||||
{...rest}
|
||||
>
|
||||
{(timestamp || name) && (
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
import cl from "clsx";
|
||||
import React, { forwardRef, HTMLAttributes } from "react";
|
||||
import ToggleChips, { ToggleChipsType } from "./Toggle";
|
||||
import RemovableChips, { RemovableChipsType } from "./Removable";
|
||||
|
||||
export interface ChipsProps extends HTMLAttributes<HTMLUListElement> {
|
||||
children: React.ReactNode;
|
||||
/**
|
||||
* Changes padding and font-sizes
|
||||
* @default "medium"
|
||||
*/
|
||||
size?: "medium" | "small";
|
||||
}
|
||||
|
||||
interface ChipsComponent
|
||||
extends React.ForwardRefExoticComponent<
|
||||
ChipsProps & React.RefAttributes<HTMLUListElement>
|
||||
> {
|
||||
Toggle: ToggleChipsType;
|
||||
Removable: RemovableChipsType;
|
||||
}
|
||||
|
||||
export const Chips: ChipsComponent = forwardRef<HTMLUListElement, ChipsProps>(
|
||||
({ className, size = "medium", children, ...rest }, ref) => {
|
||||
return (
|
||||
<ul
|
||||
{...rest}
|
||||
ref={ref}
|
||||
className={cl("navds-chips", className, `navds-chips--${size}`, {
|
||||
"navds-body-short navds-body-short--small": size === "medium",
|
||||
"navds-detail navds-detail--small": size === "small",
|
||||
})}
|
||||
>
|
||||
{React.Children.map(children, (chip, index) => {
|
||||
return <li key={index + (chip?.toString() ?? "")}>{chip}</li>;
|
||||
})}
|
||||
</ul>
|
||||
);
|
||||
}
|
||||
) as ChipsComponent;
|
||||
|
||||
Chips.Toggle = ToggleChips;
|
||||
Chips.Removable = RemovableChips;
|
||||
|
||||
export default Chips;
|
||||
@@ -0,0 +1,68 @@
|
||||
import { Close } from "@navikt/ds-icons";
|
||||
import cl from "clsx";
|
||||
import React, { forwardRef } from "react";
|
||||
import { OverridableComponent } from "..";
|
||||
|
||||
export interface RemovableChipsProps
|
||||
extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
||||
children: string;
|
||||
/**
|
||||
* Chip-variants
|
||||
* @default "action"
|
||||
*/
|
||||
variant?: "action" | "neutral";
|
||||
/**
|
||||
* Replaces label read for screen-readers
|
||||
* @default "slett filter"
|
||||
*/
|
||||
removeLabel?: string;
|
||||
/**
|
||||
* Click callback
|
||||
*/
|
||||
onDelete?: () => void;
|
||||
}
|
||||
|
||||
export interface RemovableChipsType
|
||||
extends OverridableComponent<RemovableChipsProps, HTMLButtonElement> {}
|
||||
|
||||
export const RemovableChips: OverridableComponent<
|
||||
RemovableChipsProps,
|
||||
HTMLButtonElement
|
||||
> = forwardRef(
|
||||
(
|
||||
{
|
||||
className,
|
||||
children,
|
||||
variant = "action",
|
||||
as: Component = "button",
|
||||
removeLabel = "slett",
|
||||
onDelete,
|
||||
...rest
|
||||
},
|
||||
ref
|
||||
) => {
|
||||
return (
|
||||
<Component
|
||||
{...rest}
|
||||
ref={ref}
|
||||
className={cl(
|
||||
"navds-chips__chip navds-chips__removable navds-chips--icon-right",
|
||||
className,
|
||||
`navds-chips__removable--${variant}`
|
||||
)}
|
||||
aria-label={`${children} ${removeLabel}`}
|
||||
onClick={(e) => {
|
||||
onDelete?.();
|
||||
rest?.onClick?.(e);
|
||||
}}
|
||||
>
|
||||
<span className="navds-chips__chip-text">{children}</span>
|
||||
<span className="navds-chips__removable-icon">
|
||||
<Close aria-hidden />
|
||||
</span>
|
||||
</Component>
|
||||
);
|
||||
}
|
||||
) as RemovableChipsType;
|
||||
|
||||
export default RemovableChips;
|
||||
@@ -0,0 +1,41 @@
|
||||
import { SuccessStroke } from "@navikt/ds-icons";
|
||||
import cl from "clsx";
|
||||
import React, { forwardRef } from "react";
|
||||
import { OverridableComponent } from "..";
|
||||
|
||||
export interface ToggleChipsProps
|
||||
extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
||||
children: string;
|
||||
/**
|
||||
* Toggles aria-pressed and visual-changes
|
||||
*/
|
||||
selected?: boolean;
|
||||
}
|
||||
|
||||
export interface ToggleChipsType
|
||||
extends OverridableComponent<ToggleChipsProps, HTMLButtonElement> {}
|
||||
|
||||
export const ToggleChips: ToggleChipsType = forwardRef(
|
||||
(
|
||||
{ className, children, selected, as: Component = "button", ...rest },
|
||||
ref
|
||||
) => {
|
||||
return (
|
||||
<Component
|
||||
{...rest}
|
||||
ref={ref}
|
||||
className={cl("navds-chips__chip navds-chips__toggle", className, {
|
||||
"navds-chips--icon-left": selected,
|
||||
})}
|
||||
aria-pressed={selected}
|
||||
>
|
||||
{selected && (
|
||||
<SuccessStroke aria-hidden className="navds-chips__toggle-icon" />
|
||||
)}
|
||||
<span className="navds-chips__chip-text">{children}</span>
|
||||
</Component>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
export default ToggleChips;
|
||||
@@ -0,0 +1,165 @@
|
||||
import React, { useState } from "react";
|
||||
import { Chips } from ".";
|
||||
|
||||
export default {
|
||||
title: "ds-react/Chips",
|
||||
component: Chips,
|
||||
argTypes: {
|
||||
type: {
|
||||
control: {
|
||||
type: "radio",
|
||||
options: ["toggle", "removable"],
|
||||
},
|
||||
},
|
||||
size: {
|
||||
control: {
|
||||
type: "radio",
|
||||
options: ["medium", "small"],
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const options = ["Norsk", "Dansk", "Svensk", "Tysk", "Spansk"];
|
||||
|
||||
export const Default = (props) => {
|
||||
const [selected, setSelected] = useState(["Dansk", "Svensk"]);
|
||||
const [filter, setFilter] = useState(options);
|
||||
|
||||
if (props.type === "toggle") {
|
||||
return (
|
||||
<Chips size={props.size ?? "medium"}>
|
||||
{options.map((c) => (
|
||||
<Chips.Toggle
|
||||
selected={selected.includes(c)}
|
||||
key={c}
|
||||
onClick={() =>
|
||||
setSelected(
|
||||
selected.includes(c)
|
||||
? selected.filter((x) => x !== c)
|
||||
: [...selected, c]
|
||||
)
|
||||
}
|
||||
>
|
||||
{c}
|
||||
</Chips.Toggle>
|
||||
))}
|
||||
</Chips>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Chips size={props.size ?? "medium"}>
|
||||
{filter.map((c) => (
|
||||
<Chips.Removable
|
||||
key={c}
|
||||
onClick={() => setFilter((x) => x.filter((y) => y !== c))}
|
||||
>
|
||||
{c}
|
||||
</Chips.Removable>
|
||||
))}
|
||||
</Chips>
|
||||
);
|
||||
};
|
||||
|
||||
export const Toggle = () => {
|
||||
const [selected, setSelected] = useState<number[]>([]);
|
||||
return (
|
||||
<Chips>
|
||||
{options.map((c, y) => (
|
||||
<Chips.Toggle
|
||||
selected={selected.includes(y)}
|
||||
onClick={() =>
|
||||
setSelected(
|
||||
selected.includes(y)
|
||||
? selected.filter((x) => x !== y)
|
||||
: [...selected, y]
|
||||
)
|
||||
}
|
||||
key={y}
|
||||
>
|
||||
{c}
|
||||
</Chips.Toggle>
|
||||
))}
|
||||
</Chips>
|
||||
);
|
||||
};
|
||||
|
||||
export const Removable = () => {
|
||||
return (
|
||||
<div className="colgap">
|
||||
<Chips>
|
||||
{options.map((c, y) => (
|
||||
<Chips.Removable key={y}>{c}</Chips.Removable>
|
||||
))}
|
||||
</Chips>
|
||||
<Chips>
|
||||
{options.map((c, y) => (
|
||||
<Chips.Removable variant="neutral" key={y}>
|
||||
{c}
|
||||
</Chips.Removable>
|
||||
))}
|
||||
</Chips>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const Regular = () => {
|
||||
const [selected, setSelected] = useState<number[]>([]);
|
||||
return (
|
||||
<div className="colgap">
|
||||
<Chips>
|
||||
{options.map((c, y) => (
|
||||
<Chips.Removable key={y}>{c}</Chips.Removable>
|
||||
))}
|
||||
</Chips>
|
||||
<Chips>
|
||||
{options.map((c, y) => (
|
||||
<Chips.Toggle
|
||||
selected={selected.includes(y)}
|
||||
onClick={() =>
|
||||
setSelected(
|
||||
selected.includes(y)
|
||||
? selected.filter((x) => x !== y)
|
||||
: [...selected, y]
|
||||
)
|
||||
}
|
||||
key={y}
|
||||
>
|
||||
{c}
|
||||
</Chips.Toggle>
|
||||
))}
|
||||
</Chips>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const Small = () => {
|
||||
const [selected, setSelected] = useState<number[]>([]);
|
||||
return (
|
||||
<div className="colgap">
|
||||
<Chips size="small">
|
||||
{options.map((c, y) => (
|
||||
<Chips.Removable key={y}>{c}</Chips.Removable>
|
||||
))}
|
||||
</Chips>
|
||||
<Chips size="small">
|
||||
{options.map((c, y) => (
|
||||
<Chips.Toggle
|
||||
selected={selected.includes(y)}
|
||||
onClick={() =>
|
||||
setSelected(
|
||||
selected.includes(y)
|
||||
? selected.filter((x) => x !== y)
|
||||
: [...selected, y]
|
||||
)
|
||||
}
|
||||
key={y}
|
||||
>
|
||||
{c}
|
||||
</Chips.Toggle>
|
||||
))}
|
||||
</Chips>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1 @@
|
||||
export { default as Chips, ChipsProps } from "./Chips";
|
||||
@@ -1,4 +1,3 @@
|
||||
import isSaturday from "date-fns/isSaturday";
|
||||
import React, { useId, useState } from "react";
|
||||
import { UNSAFE_useDatepicker, UNSAFE_useRangeDatepicker } from "..";
|
||||
import { Button } from "../..";
|
||||
@@ -221,8 +220,13 @@ export const UserControlled = () => {
|
||||
};
|
||||
|
||||
export const Validering = () => {
|
||||
const { datepickerProps, selectedDay, inputProps } = UNSAFE_useDatepicker({
|
||||
fromDate: new Date("Aug 23 2019"),
|
||||
const [error, setError] = useState(false);
|
||||
const { datepickerProps, inputProps } = UNSAFE_useDatepicker({
|
||||
fromDate: new Date("Aug 2 2019"),
|
||||
onValidate: (val) => setError(val.isWeekend),
|
||||
defaultSelected: new Date("Nov 26 2022"),
|
||||
disableWeekends: true,
|
||||
onDateChange: console.log,
|
||||
});
|
||||
|
||||
return (
|
||||
@@ -230,8 +234,8 @@ export const Validering = () => {
|
||||
<DatePicker {...datepickerProps}>
|
||||
<DatePicker.Input
|
||||
error={
|
||||
selectedDay && isSaturday(selectedDay)
|
||||
? "NAV-kontoret er ikke åpent på lørdager. Velg en annen dag."
|
||||
error
|
||||
? "NAV-kontoret er ikke åpent i helger. Velg en annen dag."
|
||||
: undefined
|
||||
}
|
||||
{...inputProps}
|
||||
@@ -261,3 +265,40 @@ export const ErrorInput = () => {
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const UseRangedDatepickerValidation = () => {
|
||||
const { datepickerProps, fromInputProps, toInputProps } =
|
||||
UNSAFE_useRangeDatepicker({
|
||||
fromDate: new Date("Aug 23 2019"),
|
||||
disableWeekends: true,
|
||||
disabled: [new Date("Oct 10 2022")],
|
||||
onValidate: console.table,
|
||||
});
|
||||
|
||||
return (
|
||||
<div style={{ display: "flex", gap: "1rem" }}>
|
||||
<DatePicker {...datepickerProps}>
|
||||
<div style={{ display: "flex", gap: "1rem" }}>
|
||||
<DatePicker.Input {...fromInputProps} label="Fra" />
|
||||
<DatePicker.Input {...toInputProps} label="Til" />
|
||||
</div>
|
||||
</DatePicker>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const defaultShownMonth = () => {
|
||||
const { datepickerProps, inputProps } = UNSAFE_useDatepicker({
|
||||
fromDate: new Date("Aug 23 2019"),
|
||||
onDateChange: console.log,
|
||||
defaultMonth: new Date("Oct 23 2022"),
|
||||
});
|
||||
|
||||
return (
|
||||
<div style={{ display: "flex", gap: "1rem" }}>
|
||||
<DatePicker {...datepickerProps}>
|
||||
<DatePicker.Input {...inputProps} label="Velg dato" />
|
||||
</DatePicker>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -1,6 +1,9 @@
|
||||
export { useDatepicker as UNSAFE_useDatepicker } from "./useDatepicker";
|
||||
export type { DateValidationT } from "./useDatepicker";
|
||||
export { useRangeDatepicker as UNSAFE_useRangeDatepicker } from "./useRangeDatepicker";
|
||||
export type { RangeValidationT } from "./useRangeDatepicker";
|
||||
export { useMonthpicker as UNSAFE_useMonthpicker } from "./useMonthPicker";
|
||||
export type { MonthValidationT } from "./useMonthPicker";
|
||||
export { useDateInputContext, DateContext } from "./useDateInputContext";
|
||||
export {
|
||||
useSharedMonthContext,
|
||||
|
||||
@@ -28,6 +28,10 @@ export interface UseDatepickerOptions
|
||||
* The initially selected Date
|
||||
*/
|
||||
defaultSelected?: Date;
|
||||
/**
|
||||
* Default shown month
|
||||
*/
|
||||
defaultMonth?: Date;
|
||||
/**
|
||||
* Make selection of Date required
|
||||
*/
|
||||
@@ -36,6 +40,15 @@ export interface UseDatepickerOptions
|
||||
* Callback for changed state
|
||||
*/
|
||||
onDateChange?: (val?: Date) => void;
|
||||
/**
|
||||
* Input-format
|
||||
* @default "dd.MM.yyyy"
|
||||
*/
|
||||
inputFormat?: string;
|
||||
/**
|
||||
* validation-callback
|
||||
*/
|
||||
onValidate?: (val: DateValidationT) => void;
|
||||
}
|
||||
|
||||
interface UseDatepickerValue {
|
||||
@@ -62,6 +75,27 @@ interface UseDatepickerValue {
|
||||
setSelected: (date?: Date) => void;
|
||||
}
|
||||
|
||||
export type DateValidationT = {
|
||||
isDisabled: boolean;
|
||||
isWeekend: boolean;
|
||||
isEmpty: boolean;
|
||||
isInvalid: boolean;
|
||||
isValidDate: boolean;
|
||||
isBefore: boolean;
|
||||
isAfter: boolean;
|
||||
};
|
||||
|
||||
const getValidationMessage = (val = {}): DateValidationT => ({
|
||||
isDisabled: false,
|
||||
isWeekend: false,
|
||||
isEmpty: false,
|
||||
isInvalid: false,
|
||||
isBefore: false,
|
||||
isAfter: false,
|
||||
isValidDate: true,
|
||||
...val,
|
||||
});
|
||||
|
||||
export const useDatepicker = (
|
||||
opt: UseDatepickerOptions = {}
|
||||
): UseDatepickerValue => {
|
||||
@@ -75,6 +109,9 @@ export const useDatepicker = (
|
||||
disabled,
|
||||
disableWeekends,
|
||||
onDateChange,
|
||||
inputFormat,
|
||||
onValidate,
|
||||
defaultMonth,
|
||||
} = opt;
|
||||
|
||||
const locale = getLocaleFromString(_locale);
|
||||
@@ -85,12 +122,12 @@ export const useDatepicker = (
|
||||
const [defaultSelected, setDefaultSelected] = useState(_defaultSelected);
|
||||
|
||||
// Initialize states
|
||||
const [month, setMonth] = useState(defaultSelected ?? today);
|
||||
const [month, setMonth] = useState(defaultSelected ?? defaultMonth ?? today);
|
||||
const [selectedDay, setSelectedDay] = useState(defaultSelected);
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
const defaultInputValue = defaultSelected
|
||||
? formatDateForInput(defaultSelected, locale, "date")
|
||||
? formatDateForInput(defaultSelected, locale, "date", inputFormat)
|
||||
: "";
|
||||
const [inputValue, setInputValue] = useState(defaultInputValue);
|
||||
|
||||
@@ -99,16 +136,26 @@ export const useDatepicker = (
|
||||
setSelectedDay(date);
|
||||
};
|
||||
|
||||
const updateValidation = (val: Partial<DateValidationT> = {}) => {
|
||||
const msg = getValidationMessage(val);
|
||||
onValidate?.(msg);
|
||||
};
|
||||
|
||||
const handleFocusIn = useCallback(
|
||||
(e) => {
|
||||
if (!e?.target || !e?.target?.nodeType) {
|
||||
/* Workaround for shadow-dom users (open) */
|
||||
const composed = e.composedPath?.()?.[0];
|
||||
if (!e?.target || !e?.target?.nodeType || !composed) {
|
||||
return;
|
||||
}
|
||||
|
||||
![
|
||||
daypickerRef.current,
|
||||
inputRef.current,
|
||||
inputRef.current?.nextSibling,
|
||||
].some((element) => element?.contains(e.target)) &&
|
||||
].some(
|
||||
(element) => element?.contains(e.target) || element?.contains(composed)
|
||||
) &&
|
||||
open &&
|
||||
setOpen(false);
|
||||
},
|
||||
@@ -126,30 +173,32 @@ export const useDatepicker = (
|
||||
|
||||
const reset = () => {
|
||||
updateDate(defaultSelected);
|
||||
setMonth(defaultSelected ?? today);
|
||||
setMonth(defaultSelected ?? defaultMonth ?? today);
|
||||
setInputValue(defaultInputValue ?? "");
|
||||
setDefaultSelected(_defaultSelected);
|
||||
};
|
||||
|
||||
const setSelected = (date: Date | undefined) => {
|
||||
updateDate(date);
|
||||
setMonth(date ?? today);
|
||||
setInputValue(date ? formatDateForInput(date, locale, "date") : "");
|
||||
setMonth(date ?? defaultMonth ?? today);
|
||||
setInputValue(
|
||||
date ? formatDateForInput(date, locale, "date", inputFormat) : ""
|
||||
);
|
||||
};
|
||||
|
||||
const handleFocus: React.FocusEventHandler<HTMLInputElement> = (e) => {
|
||||
!open && setOpen(true);
|
||||
|
||||
let day = parseDate(e.target.value, today, locale, "date");
|
||||
if (isValidDate(day)) {
|
||||
setMonth(day);
|
||||
setInputValue(formatDateForInput(day, locale, "date"));
|
||||
setInputValue(formatDateForInput(day, locale, "date", inputFormat));
|
||||
}
|
||||
};
|
||||
|
||||
const handleBlur: React.FocusEventHandler<HTMLInputElement> = (e) => {
|
||||
let day = parseDate(e.target.value, today, locale, "date");
|
||||
isValidDate(day) && setInputValue(formatDateForInput(day, locale, "date"));
|
||||
isValidDate(day) &&
|
||||
setInputValue(formatDateForInput(day, locale, "date", inputFormat));
|
||||
};
|
||||
|
||||
/* Only allow de-selecting if not required */
|
||||
@@ -162,11 +211,15 @@ export const useDatepicker = (
|
||||
if (!required && selected) {
|
||||
updateDate(undefined);
|
||||
setInputValue("");
|
||||
updateValidation({ isValidDate: false, isEmpty: true });
|
||||
return;
|
||||
}
|
||||
updateDate(day);
|
||||
updateValidation();
|
||||
setMonth(day);
|
||||
setInputValue(day ? formatDateForInput(day, locale, "date") : "");
|
||||
setInputValue(
|
||||
day ? formatDateForInput(day, locale, "date", inputFormat) : ""
|
||||
);
|
||||
};
|
||||
|
||||
// When changing the input field, save its value in state and check if the
|
||||
@@ -176,23 +229,40 @@ export const useDatepicker = (
|
||||
setInputValue(e.target.value);
|
||||
const day = parseDate(e.target.value, today, locale, "date");
|
||||
|
||||
const isBefore =
|
||||
fromDate && day && differenceInCalendarDays(fromDate, day) > 0;
|
||||
const isAfter = toDate && day && differenceInCalendarDays(day, toDate) > 0;
|
||||
|
||||
if (
|
||||
!isValidDate(day) ||
|
||||
(disabled &&
|
||||
((disableWeekends && isWeekend(day)) || isMatch(day, disabled)))
|
||||
(disableWeekends && isWeekend(day)) ||
|
||||
(disabled && isMatch(day, disabled))
|
||||
) {
|
||||
updateDate(undefined);
|
||||
updateValidation({
|
||||
isInvalid: isValidDate(day),
|
||||
isWeekend: disableWeekends && isWeekend(day),
|
||||
isDisabled: disabled && isMatch(day, disabled),
|
||||
isValidDate: false,
|
||||
isEmpty: !e.target.value,
|
||||
isBefore: isBefore ?? false,
|
||||
isAfter: isAfter ?? false,
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const isBefore = fromDate && differenceInCalendarDays(fromDate, day) > 0;
|
||||
const isAfter = toDate && differenceInCalendarDays(day, toDate) > 0;
|
||||
if (isBefore || isAfter) {
|
||||
updateDate(undefined);
|
||||
updateValidation({
|
||||
isValidDate: false,
|
||||
isBefore: isBefore ?? false,
|
||||
isAfter: isAfter ?? false,
|
||||
});
|
||||
return;
|
||||
}
|
||||
updateDate(day);
|
||||
setMonth(day);
|
||||
updateValidation();
|
||||
setMonth(defaultMonth ?? day);
|
||||
};
|
||||
|
||||
const handleClose = useCallback(() => {
|
||||
@@ -217,13 +287,15 @@ export const useDatepicker = (
|
||||
month,
|
||||
onMonthChange: (month) => setMonth(month),
|
||||
onDayClick: handleDayClick,
|
||||
selected: selectedDay,
|
||||
selected: selectedDay ?? new Date("Invalid date"),
|
||||
locale: _locale,
|
||||
fromDate,
|
||||
toDate,
|
||||
today,
|
||||
open,
|
||||
onOpenToggle: () => setOpen((x) => !x),
|
||||
disabled,
|
||||
disableWeekends,
|
||||
ref: daypickerRef,
|
||||
};
|
||||
|
||||
|
||||
@@ -22,6 +22,19 @@ export interface UseMonthPickerOptions
|
||||
* Callback for month-change
|
||||
*/
|
||||
onMonthChange?: (date?: Date) => void;
|
||||
/**
|
||||
* Input-format
|
||||
* @default "MMMM yyyy"
|
||||
*/
|
||||
inputFormat?: string;
|
||||
/**
|
||||
* validation-callback
|
||||
*/
|
||||
onValidate?: (val: MonthValidationT) => void;
|
||||
/**
|
||||
* Default shown year
|
||||
*/
|
||||
defaultYear?: Date;
|
||||
}
|
||||
|
||||
interface UseMonthPickerValue {
|
||||
@@ -48,6 +61,25 @@ interface UseMonthPickerValue {
|
||||
reset: () => void;
|
||||
}
|
||||
|
||||
export type MonthValidationT = {
|
||||
isDisabled: boolean;
|
||||
isEmpty: boolean;
|
||||
isInvalid: boolean;
|
||||
isValidMonth: boolean;
|
||||
isBefore: boolean;
|
||||
isAfter: boolean;
|
||||
};
|
||||
|
||||
const getValidationMessage = (val = {}): MonthValidationT => ({
|
||||
isDisabled: false,
|
||||
isEmpty: false,
|
||||
isInvalid: false,
|
||||
isBefore: false,
|
||||
isAfter: false,
|
||||
isValidMonth: true,
|
||||
...val,
|
||||
});
|
||||
|
||||
export const useMonthpicker = (
|
||||
opt: UseMonthPickerOptions = {}
|
||||
): UseMonthPickerValue => {
|
||||
@@ -59,6 +91,9 @@ export const useMonthpicker = (
|
||||
disabled,
|
||||
required,
|
||||
onMonthChange,
|
||||
inputFormat,
|
||||
onValidate,
|
||||
defaultYear,
|
||||
} = opt;
|
||||
|
||||
const [defaultSelected, setDefaultSelected] = useState(_defaultSelected);
|
||||
@@ -70,12 +105,12 @@ export const useMonthpicker = (
|
||||
const monthpickerRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
// Initialize states
|
||||
const [year, setYear] = useState(defaultSelected ?? today);
|
||||
const [year, setYear] = useState(defaultSelected ?? defaultYear ?? today);
|
||||
const [selectedMonth, setSelectedMonth] = useState(defaultSelected);
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
const defaultInputValue = defaultSelected
|
||||
? formatDateForInput(defaultSelected, locale, "month")
|
||||
? formatDateForInput(defaultSelected, locale, "month", inputFormat)
|
||||
: "";
|
||||
|
||||
const [inputValue, setInputValue] = useState(defaultInputValue);
|
||||
@@ -85,16 +120,25 @@ export const useMonthpicker = (
|
||||
setSelectedMonth(date);
|
||||
};
|
||||
|
||||
const updateValidation = (val: Partial<MonthValidationT> = {}) => {
|
||||
const msg = getValidationMessage(val);
|
||||
onValidate?.(msg);
|
||||
};
|
||||
|
||||
const handleFocusIn = useCallback(
|
||||
(e) => {
|
||||
if (!e?.target || !e?.target?.nodeType) {
|
||||
/* Workaround for shadow-dom users (open) */
|
||||
const composed = e.composedPath?.()?.[0];
|
||||
if (!e?.target || !e?.target?.nodeType || !composed) {
|
||||
return;
|
||||
}
|
||||
![
|
||||
monthpickerRef.current,
|
||||
inputRef.current,
|
||||
inputRef.current?.nextSibling,
|
||||
].some((element) => element?.contains(e.target)) &&
|
||||
].some(
|
||||
(element) => element?.contains(e.target) || element?.contains(composed)
|
||||
) &&
|
||||
open &&
|
||||
setOpen(false);
|
||||
},
|
||||
@@ -112,15 +156,17 @@ export const useMonthpicker = (
|
||||
|
||||
const reset = () => {
|
||||
updateMonth(defaultSelected);
|
||||
setYear(defaultSelected ?? today);
|
||||
setYear(defaultSelected ?? defaultYear ?? today);
|
||||
setInputValue(defaultInputValue ?? "");
|
||||
setDefaultSelected(_defaultSelected);
|
||||
};
|
||||
|
||||
const setSelected = (date: Date | undefined) => {
|
||||
updateMonth(date);
|
||||
setYear(date ?? today);
|
||||
setInputValue(date ? formatDateForInput(date, locale, "month") : "");
|
||||
setYear(date ?? defaultYear ?? today);
|
||||
setInputValue(
|
||||
date ? formatDateForInput(date, locale, "month", inputFormat) : ""
|
||||
);
|
||||
};
|
||||
|
||||
const handleFocus: React.FocusEventHandler<HTMLInputElement> = (e) => {
|
||||
@@ -128,13 +174,14 @@ export const useMonthpicker = (
|
||||
let day = parseDate(e.target.value, today, locale, "month");
|
||||
if (isValidDate(day)) {
|
||||
setYear(day);
|
||||
setInputValue(formatDateForInput(day, locale, "month"));
|
||||
setInputValue(formatDateForInput(day, locale, "month", inputFormat));
|
||||
}
|
||||
};
|
||||
|
||||
const handleBlur: React.FocusEventHandler<HTMLInputElement> = (e) => {
|
||||
let day = parseDate(e.target.value, today, locale, "month");
|
||||
isValidDate(day) && setInputValue(formatDateForInput(day, locale, "month"));
|
||||
isValidDate(day) &&
|
||||
setInputValue(formatDateForInput(day, locale, "month", inputFormat));
|
||||
};
|
||||
|
||||
/* Only allow de-selecting if not required */
|
||||
@@ -146,11 +193,15 @@ export const useMonthpicker = (
|
||||
|
||||
if (!required && !month) {
|
||||
updateMonth(undefined);
|
||||
updateValidation({ isValidMonth: false, isEmpty: true });
|
||||
setInputValue("");
|
||||
return;
|
||||
}
|
||||
updateMonth(month);
|
||||
setInputValue(month ? formatDateForInput(month, locale, "month") : "");
|
||||
updateValidation();
|
||||
setInputValue(
|
||||
month ? formatDateForInput(month, locale, "month", inputFormat) : ""
|
||||
);
|
||||
};
|
||||
|
||||
// When changing the input field, save its value in state and check if the
|
||||
@@ -160,32 +211,48 @@ export const useMonthpicker = (
|
||||
setInputValue(e.target.value);
|
||||
const month = parseDate(e.target.value, today, locale, "month");
|
||||
|
||||
if (!isValidDate(month) || (disabled && isMatch(month, disabled))) {
|
||||
updateMonth(undefined);
|
||||
return;
|
||||
}
|
||||
|
||||
const isBefore =
|
||||
fromDate &&
|
||||
month &&
|
||||
(fromDate.getFullYear() > month.getFullYear() ||
|
||||
(fromDate.getFullYear() === month.getFullYear() &&
|
||||
fromDate.getMonth() > month.getMonth()));
|
||||
|
||||
const isAfter =
|
||||
toDate &&
|
||||
month &&
|
||||
(toDate.getFullYear() < month.getFullYear() ||
|
||||
(toDate.getFullYear() === month.getFullYear() &&
|
||||
toDate.getMonth() < month.getMonth()));
|
||||
|
||||
if (!isValidDate(month) || (disabled && isMatch(month, disabled))) {
|
||||
updateMonth(undefined);
|
||||
updateValidation({
|
||||
isInvalid: isValidDate(month),
|
||||
isDisabled: disabled && isMatch(month, disabled),
|
||||
isValidMonth: false,
|
||||
isEmpty: !e.target.value,
|
||||
isBefore: isBefore ?? false,
|
||||
isAfter: isAfter ?? false,
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
isAfter ||
|
||||
isBefore ||
|
||||
(fromDate && toDate && !isMatch(month, [{ from: fromDate, to: toDate }]))
|
||||
) {
|
||||
updateMonth(undefined);
|
||||
updateValidation({
|
||||
isValidMonth: false,
|
||||
isBefore: isBefore ?? false,
|
||||
isAfter: isAfter ?? false,
|
||||
});
|
||||
return;
|
||||
}
|
||||
updateMonth(month);
|
||||
updateValidation();
|
||||
setYear(month);
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
/* eslint-disable react/jsx-pascal-case */
|
||||
import { act, render } from "@testing-library/react";
|
||||
import userEvent from "@testing-library/user-event";
|
||||
import React from "react";
|
||||
import { UNSAFE_DatePicker, UNSAFE_useRangeDatepicker } from "..";
|
||||
|
||||
const RangeDemo = () => {
|
||||
const { datepickerProps, fromInputProps, selectedRange, toInputProps } =
|
||||
UNSAFE_useRangeDatepicker({
|
||||
fromDate: new Date("Aug 23 2019"),
|
||||
});
|
||||
|
||||
return (
|
||||
<div style={{ display: "flex", gap: "1rem" }}>
|
||||
<UNSAFE_DatePicker {...datepickerProps}>
|
||||
<UNSAFE_DatePicker.Input {...fromInputProps} label="Fra" />
|
||||
<UNSAFE_DatePicker.Input {...toInputProps} label="Til" />
|
||||
</UNSAFE_DatePicker>
|
||||
<div title="res">{JSON.stringify(selectedRange)}</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
describe("Writing in input sets correct values", () => {
|
||||
it("useRangeDatepicker same date", async () => {
|
||||
const utils = render(<RangeDemo />);
|
||||
|
||||
const fraInput = utils.getByRole("textbox", { name: "Fra" });
|
||||
const tilInput = utils.getByRole("textbox", { name: "Til" });
|
||||
await act(async () => {
|
||||
await userEvent.type(fraInput, "03.08.2022");
|
||||
await userEvent.type(tilInput, "03.08.2022");
|
||||
});
|
||||
const res = utils.getByTitle("res");
|
||||
expect(res.innerHTML).toEqual(
|
||||
JSON.stringify({
|
||||
from: "2022-08-03T00:00:00.000Z",
|
||||
to: "2022-08-03T00:00:00.000Z",
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
it("useRangeDatepicker before after to ", async () => {
|
||||
const utils = render(<RangeDemo />);
|
||||
|
||||
const fraInput = utils.getByRole("textbox", { name: "Fra" });
|
||||
const tilInput = utils.getByRole("textbox", { name: "Til" });
|
||||
await act(async () => {
|
||||
await userEvent.type(fraInput, "03.08.2022");
|
||||
await userEvent.type(tilInput, "02.08.2022");
|
||||
});
|
||||
const res = utils.getByTitle("res");
|
||||
expect(res.innerHTML).toEqual(
|
||||
JSON.stringify({
|
||||
from: "2022-08-03T00:00:00.000Z",
|
||||
})
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -10,10 +10,42 @@ import {
|
||||
isValidDate,
|
||||
parseDate,
|
||||
} from "../utils";
|
||||
import { UseDatepickerOptions } from "./useDatepicker";
|
||||
import { DateValidationT, UseDatepickerOptions } from "./useDatepicker";
|
||||
|
||||
export type RangeValidationT = {
|
||||
from: DateValidationT;
|
||||
to: DateValidationT & { isBeforeFrom?: boolean };
|
||||
};
|
||||
|
||||
const getValidationMessage = (from = {}, to = {}): RangeValidationT => ({
|
||||
from: {
|
||||
isDisabled: false,
|
||||
isWeekend: false,
|
||||
isEmpty: false,
|
||||
isInvalid: false,
|
||||
isBefore: false,
|
||||
isAfter: false,
|
||||
isValidDate: true,
|
||||
...from,
|
||||
},
|
||||
to: {
|
||||
isDisabled: false,
|
||||
isWeekend: false,
|
||||
isEmpty: false,
|
||||
isInvalid: false,
|
||||
isBefore: false,
|
||||
isAfter: false,
|
||||
isBeforeFrom: false,
|
||||
isValidDate: true,
|
||||
...to,
|
||||
},
|
||||
});
|
||||
|
||||
interface UseRangeDatepickerOptions
|
||||
extends Omit<UseDatepickerOptions, "defaultSelected" | "onDateChange"> {
|
||||
extends Omit<
|
||||
UseDatepickerOptions,
|
||||
"defaultSelected" | "onDateChange" | "onValidate"
|
||||
> {
|
||||
/**
|
||||
* The initially selected DateRange
|
||||
*/
|
||||
@@ -22,6 +54,10 @@ interface UseRangeDatepickerOptions
|
||||
* Callback for changed state
|
||||
*/
|
||||
onRangeChange?: (val?: DateRange) => void;
|
||||
/**
|
||||
* validation-callback
|
||||
*/
|
||||
onValidate?: (val: RangeValidationT) => void;
|
||||
}
|
||||
|
||||
interface UseRangeDatepickerValue {
|
||||
@@ -65,6 +101,92 @@ const RANGE = {
|
||||
|
||||
type RangeT = typeof RANGE[keyof typeof RANGE];
|
||||
|
||||
const fromValidation = (day: Date, opt?: UseRangeDatepickerOptions) => {
|
||||
const isBefore =
|
||||
opt?.fromDate && day && differenceInCalendarDays(opt?.fromDate, day) > 0;
|
||||
const isAfter =
|
||||
opt?.toDate && day && differenceInCalendarDays(day, opt?.toDate) > 0;
|
||||
|
||||
if (
|
||||
isValidDate(day) &&
|
||||
!(opt?.disableWeekends && isWeekend(day)) &&
|
||||
!(opt?.disabled && isMatch(day, opt.disabled))
|
||||
) {
|
||||
return {
|
||||
isValidDate: false,
|
||||
isInvalid: !isValidDate(day),
|
||||
isWeekend: opt?.disableWeekends && isWeekend(day),
|
||||
isDisabled: opt?.disabled && isMatch(day, opt.disabled),
|
||||
isBefore: isBefore,
|
||||
isAfter: isAfter,
|
||||
};
|
||||
}
|
||||
if (isBefore || isAfter) {
|
||||
return {
|
||||
isValidDate: false,
|
||||
isBefore: isBefore,
|
||||
isAfter: isAfter,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
const toValidation = (
|
||||
day: Date,
|
||||
from: Date,
|
||||
opt?: UseRangeDatepickerOptions
|
||||
) => {
|
||||
const isBefore =
|
||||
opt?.fromDate && day && differenceInCalendarDays(opt?.fromDate, day) > 0;
|
||||
const isAfter =
|
||||
opt?.toDate && day && differenceInCalendarDays(day, opt?.toDate) > 0;
|
||||
|
||||
const isBeforeFrom =
|
||||
(from && differenceInCalendarDays(from, day) > 0) ?? false;
|
||||
|
||||
if (
|
||||
isValidDate(day) &&
|
||||
!(opt?.disableWeekends && isWeekend(day)) &&
|
||||
!(opt?.disabled && isMatch(day, opt.disabled))
|
||||
) {
|
||||
return {
|
||||
isValidDate: false,
|
||||
isInvalid: !isValidDate(day),
|
||||
isWeekend: opt?.disableWeekends && isWeekend(day),
|
||||
isDisabled: opt?.disabled && isMatch(day, opt.disabled),
|
||||
isBefore,
|
||||
isAfter,
|
||||
isBeforeFrom,
|
||||
};
|
||||
}
|
||||
if (isBefore || isAfter || isBeforeFrom) {
|
||||
return {
|
||||
isValidDate: false,
|
||||
isBefore,
|
||||
isAfter,
|
||||
isBeforeFrom,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
const initialValidation = (
|
||||
range?: DateRange,
|
||||
opt?: UseRangeDatepickerOptions
|
||||
): RangeValidationT => {
|
||||
if (!range || !range?.from) {
|
||||
return getValidationMessage(
|
||||
{ isEmpty: true, isValidDate: false },
|
||||
{ isEmpty: true, isValidDate: false }
|
||||
);
|
||||
}
|
||||
|
||||
const fromVal = fromValidation(range.from, opt);
|
||||
const toVal = range.to
|
||||
? toValidation(range.to, range.from, opt)
|
||||
: { isEmpty: true, isValidDate: false };
|
||||
|
||||
return getValidationMessage({ ...fromVal }, { ...toVal });
|
||||
};
|
||||
|
||||
export const useRangeDatepicker = (
|
||||
opt: UseRangeDatepickerOptions = {}
|
||||
): UseRangeDatepickerValue => {
|
||||
@@ -77,6 +199,9 @@ export const useRangeDatepicker = (
|
||||
disabled,
|
||||
disableWeekends,
|
||||
onRangeChange,
|
||||
inputFormat,
|
||||
onValidate,
|
||||
defaultMonth,
|
||||
} = opt;
|
||||
|
||||
const locale = getLocaleFromString(_locale);
|
||||
@@ -89,7 +214,7 @@ export const useRangeDatepicker = (
|
||||
|
||||
// Initialize states
|
||||
const [month, setMonth] = useState(
|
||||
defaultSelected ? defaultSelected?.from : today
|
||||
defaultSelected ? defaultSelected?.from : defaultMonth ?? today
|
||||
);
|
||||
const [selectedRange, setSelectedRange] = useState<DateRange | undefined>(
|
||||
defaultSelected ?? { from: undefined, to: undefined }
|
||||
@@ -97,15 +222,20 @@ export const useRangeDatepicker = (
|
||||
|
||||
const [fromInputValue, setFromInputValue] = useState(
|
||||
defaultSelected?.from
|
||||
? formatDateForInput(defaultSelected.from, locale, "date")
|
||||
? formatDateForInput(defaultSelected.from, locale, "date", inputFormat)
|
||||
: ""
|
||||
);
|
||||
|
||||
const [toInputValue, setToInputValue] = useState(
|
||||
defaultSelected?.to
|
||||
? formatDateForInput(defaultSelected.to, locale, "date")
|
||||
? formatDateForInput(defaultSelected.to, locale, "date", inputFormat)
|
||||
: ""
|
||||
);
|
||||
|
||||
const [validation, setValidation] = useState<RangeValidationT>(
|
||||
initialValidation(selectedRange, opt)
|
||||
);
|
||||
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
const updateRange = (range?: DateRange) => {
|
||||
@@ -113,9 +243,20 @@ export const useRangeDatepicker = (
|
||||
setSelectedRange(range);
|
||||
};
|
||||
|
||||
const updateValidation = (
|
||||
from: Partial<RangeValidationT["from"]> = {},
|
||||
to: Partial<RangeValidationT["to"]> = {}
|
||||
) => {
|
||||
const msg = getValidationMessage(from, to);
|
||||
setValidation(msg);
|
||||
onValidate?.(msg);
|
||||
};
|
||||
|
||||
const handleFocusIn = useCallback(
|
||||
(e) => {
|
||||
if (!e?.target || !e?.target?.nodeType) {
|
||||
/* Workaround for shadow-dom users (open) */
|
||||
const composed = e.composedPath?.()?.[0];
|
||||
if (!e?.target || !e?.target?.nodeType || !composed) {
|
||||
return;
|
||||
}
|
||||
![
|
||||
@@ -124,7 +265,9 @@ export const useRangeDatepicker = (
|
||||
inputRefFrom.current,
|
||||
inputRefTo.current?.nextSibling,
|
||||
inputRefFrom.current?.nextSibling,
|
||||
].some((element) => element?.contains(e.target)) &&
|
||||
].some(
|
||||
(element) => element?.contains(e.target) || element?.contains(composed)
|
||||
) &&
|
||||
open &&
|
||||
setOpen(false);
|
||||
},
|
||||
@@ -142,15 +285,21 @@ export const useRangeDatepicker = (
|
||||
|
||||
const reset = () => {
|
||||
updateRange(defaultSelected ?? { from: undefined, to: undefined });
|
||||
setMonth(defaultSelected ? defaultSelected?.from : today);
|
||||
setMonth(defaultSelected ? defaultSelected?.from : defaultMonth ?? today);
|
||||
setValidation(
|
||||
initialValidation(
|
||||
defaultSelected ?? { from: undefined, to: undefined },
|
||||
opt
|
||||
)
|
||||
);
|
||||
setFromInputValue(
|
||||
defaultSelected?.from
|
||||
? formatDateForInput(defaultSelected.from, locale, "date")
|
||||
? formatDateForInput(defaultSelected.from, locale, "date", inputFormat)
|
||||
: ""
|
||||
);
|
||||
setToInputValue(
|
||||
defaultSelected?.to
|
||||
? formatDateForInput(defaultSelected.to, locale, "date")
|
||||
? formatDateForInput(defaultSelected.to, locale, "date", inputFormat)
|
||||
: ""
|
||||
);
|
||||
setDefaultSelected(_defaultSelected);
|
||||
@@ -159,11 +308,16 @@ export const useRangeDatepicker = (
|
||||
const setSelected = (range?: DateRange) => {
|
||||
updateRange(range);
|
||||
setFromInputValue(
|
||||
range?.from ? formatDateForInput(range.from, locale, "date") : ""
|
||||
range?.from
|
||||
? formatDateForInput(range.from, locale, "date", inputFormat)
|
||||
: ""
|
||||
);
|
||||
setToInputValue(
|
||||
range?.to ? formatDateForInput(range?.to, locale, "date") : ""
|
||||
range?.to
|
||||
? formatDateForInput(range?.to, locale, "date", inputFormat)
|
||||
: ""
|
||||
);
|
||||
setValidation(initialValidation(range, opt));
|
||||
};
|
||||
|
||||
const handleFocus = (e, src: RangeT) => {
|
||||
@@ -172,52 +326,10 @@ export const useRangeDatepicker = (
|
||||
if (isValidDate(day)) {
|
||||
setMonth(day);
|
||||
src === RANGE.FROM
|
||||
? setFromInputValue(formatDateForInput(day, locale, "date"))
|
||||
: setToInputValue(formatDateForInput(day, locale, "date"));
|
||||
}
|
||||
};
|
||||
|
||||
const handleInputs = (day: Date, src: RangeT) => {
|
||||
if (src === RANGE.FROM) {
|
||||
const isAfter =
|
||||
toInputValue &&
|
||||
differenceInCalendarDays(
|
||||
day,
|
||||
parseDate(toInputValue, today, locale, "date")
|
||||
) > 0;
|
||||
|
||||
if (isAfter) {
|
||||
setFromInputValue(
|
||||
formatDateForInput(
|
||||
parseDate(toInputValue, today, locale, "date"),
|
||||
locale,
|
||||
"date"
|
||||
? setFromInputValue(
|
||||
formatDateForInput(day, locale, "date", inputFormat)
|
||||
)
|
||||
);
|
||||
setToInputValue(formatDateForInput(day, locale, "date"));
|
||||
} else {
|
||||
setFromInputValue(formatDateForInput(day, locale, "date"));
|
||||
}
|
||||
} else if (src === RANGE.TO) {
|
||||
const isBefore =
|
||||
fromInputValue &&
|
||||
differenceInCalendarDays(
|
||||
parseDate(fromInputValue, today, locale, "date"),
|
||||
day
|
||||
) > 0;
|
||||
|
||||
if (isBefore) {
|
||||
setToInputValue(
|
||||
formatDateForInput(
|
||||
parseDate(fromInputValue, today, locale, "date"),
|
||||
locale,
|
||||
"date"
|
||||
)
|
||||
);
|
||||
setFromInputValue(formatDateForInput(day, locale, "date"));
|
||||
} else {
|
||||
setToInputValue(formatDateForInput(day, locale, "date"));
|
||||
}
|
||||
: setToInputValue(formatDateForInput(day, locale, "date", inputFormat));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -227,7 +339,19 @@ export const useRangeDatepicker = (
|
||||
return;
|
||||
}
|
||||
|
||||
handleInputs(day, src);
|
||||
if (src === RANGE.FROM) {
|
||||
setFromInputValue(formatDateForInput(day, locale, "date", inputFormat));
|
||||
} else if (src === RANGE.TO) {
|
||||
setToInputValue(formatDateForInput(day, locale, "date", inputFormat));
|
||||
}
|
||||
};
|
||||
|
||||
const validateDay = (day: any) => {
|
||||
return (
|
||||
isValidDate(day) &&
|
||||
!(disableWeekends && isWeekend(day)) &&
|
||||
!(disabled && isMatch(day, disabled))
|
||||
);
|
||||
};
|
||||
|
||||
const handleSelect = (range) => {
|
||||
@@ -238,68 +362,140 @@ export const useRangeDatepicker = (
|
||||
!selectedRange?.from && selectedRange?.to ? selectedRange?.to : range?.to;
|
||||
|
||||
range?.from
|
||||
? setFromInputValue(formatDateForInput(range?.from, locale, "date"))
|
||||
? setFromInputValue(
|
||||
formatDateForInput(range?.from, locale, "date", inputFormat)
|
||||
)
|
||||
: setFromInputValue("");
|
||||
prevToRange
|
||||
? setToInputValue(formatDateForInput(prevToRange, locale, "date"))
|
||||
? setToInputValue(
|
||||
formatDateForInput(prevToRange, locale, "date", inputFormat)
|
||||
)
|
||||
: setToInputValue("");
|
||||
updateValidation(
|
||||
{ isValidDate: !!range?.from, isEmpty: !range?.from },
|
||||
{ isValidDate: !!range?.to, isEmpty: !prevToRange }
|
||||
);
|
||||
updateRange({ from: range?.from, to: prevToRange });
|
||||
};
|
||||
|
||||
/* live-update datepicker based on changes in inputfields */
|
||||
const handleChange = (e, src: RangeT) => {
|
||||
src === RANGE.FROM
|
||||
? setFromInputValue(e.target.value)
|
||||
: setToInputValue(e.target.value);
|
||||
const day = parseDate(e.target.value, today, locale, "date");
|
||||
|
||||
if (
|
||||
!isValidDate(day) ||
|
||||
(disabled &&
|
||||
((disableWeekends && isWeekend(day)) || isMatch(day, disabled)))
|
||||
) {
|
||||
updateRange(
|
||||
src === RANGE.FROM
|
||||
? { ...selectedRange, from: undefined }
|
||||
: { from: selectedRange?.from, to: undefined }
|
||||
const fromChange = (
|
||||
val: string = "",
|
||||
day: Date,
|
||||
isBefore = false,
|
||||
isAfter = false
|
||||
) => {
|
||||
setFromInputValue(val);
|
||||
if (!validateDay(day)) {
|
||||
updateRange({ ...selectedRange, from: undefined });
|
||||
updateValidation(
|
||||
{
|
||||
isEmpty: !val,
|
||||
isValidDate: false,
|
||||
isInvalid: !isValidDate(day),
|
||||
isWeekend: disableWeekends && isWeekend(day),
|
||||
isDisabled: disabled && isMatch(day, disabled),
|
||||
isBefore,
|
||||
isAfter,
|
||||
},
|
||||
validation.to
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (isBefore || isAfter) {
|
||||
updateRange({ ...selectedRange, from: undefined });
|
||||
updateValidation(
|
||||
{
|
||||
isValidDate: false,
|
||||
isBefore,
|
||||
isAfter,
|
||||
},
|
||||
validation.to
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
selectedRange?.to &&
|
||||
differenceInCalendarDays(day, selectedRange?.to) > 0
|
||||
) {
|
||||
updateRange({ to: day, from: day });
|
||||
setToInputValue(formatDateForInput(day, locale, "date", inputFormat));
|
||||
setMonth(day);
|
||||
updateValidation();
|
||||
return;
|
||||
}
|
||||
|
||||
if (toInputValue && !selectedRange?.to) {
|
||||
const toDay = parseDate(toInputValue, today, locale, "date");
|
||||
if (validateDay(toDay)) {
|
||||
updateRange({ from: day, to: toDay });
|
||||
setMonth(day);
|
||||
updateValidation();
|
||||
return;
|
||||
}
|
||||
}
|
||||
updateRange({ ...selectedRange, from: day });
|
||||
updateValidation({}, validation.to);
|
||||
setMonth(day);
|
||||
};
|
||||
|
||||
const toChange = (
|
||||
val: string = "",
|
||||
day: Date,
|
||||
isBefore = false,
|
||||
isAfter = false
|
||||
) => {
|
||||
setToInputValue(val);
|
||||
if (!validateDay(day)) {
|
||||
updateRange({ from: selectedRange?.from, to: undefined });
|
||||
updateValidation(validation.from, {
|
||||
isEmpty: !val,
|
||||
isValidDate: false,
|
||||
isInvalid: !isValidDate(day),
|
||||
isWeekend: disableWeekends && isWeekend(day),
|
||||
isDisabled: disabled && isMatch(day, disabled),
|
||||
isBefore,
|
||||
isAfter,
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (isBefore || isAfter) {
|
||||
updateRange({ from: selectedRange?.from, to: undefined });
|
||||
updateValidation(validation.from, {
|
||||
isValidDate: false,
|
||||
isBefore,
|
||||
isAfter,
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
/* If to-value < from-value */
|
||||
if (
|
||||
selectedRange?.from &&
|
||||
differenceInCalendarDays(selectedRange?.from, day) > 0
|
||||
) {
|
||||
updateRange({ from: selectedRange?.from, to: undefined });
|
||||
updateValidation(validation.from, {
|
||||
isValidDate: false,
|
||||
isBeforeFrom: true,
|
||||
});
|
||||
return;
|
||||
}
|
||||
updateRange({ from: selectedRange?.from, to: day });
|
||||
updateValidation(validation.from, {});
|
||||
setMonth(day);
|
||||
};
|
||||
|
||||
/* live-update datepicker based on changes in inputfields */
|
||||
const handleChange = (e, src: RangeT) => {
|
||||
const day = parseDate(e.target.value, today, locale, "date");
|
||||
const isBefore = fromDate && differenceInCalendarDays(fromDate, day) > 0;
|
||||
const isAfter = toDate && differenceInCalendarDays(day, toDate) > 0;
|
||||
if (isBefore || isAfter) {
|
||||
src === RANGE.FROM
|
||||
? updateRange({ ...selectedRange, from: undefined })
|
||||
: updateRange({ from: selectedRange?.from, to: undefined });
|
||||
return;
|
||||
}
|
||||
|
||||
/* If to-value < from-value, switch places in state */
|
||||
if (
|
||||
src === RANGE.TO &&
|
||||
selectedRange?.from &&
|
||||
differenceInCalendarDays(selectedRange?.from, day) >= 0
|
||||
) {
|
||||
updateRange({ from: day, to: selectedRange?.from });
|
||||
setMonth(day);
|
||||
return;
|
||||
}
|
||||
|
||||
/* If from-value > to-value , switch places in state */
|
||||
if (
|
||||
src === RANGE.FROM &&
|
||||
selectedRange?.to &&
|
||||
differenceInCalendarDays(day, selectedRange?.to) >= 0
|
||||
) {
|
||||
updateRange({ to: day, from: selectedRange?.to });
|
||||
setMonth(day);
|
||||
return;
|
||||
}
|
||||
|
||||
src === RANGE.FROM && updateRange({ ...selectedRange, from: day });
|
||||
src === RANGE.TO && updateRange({ from: selectedRange?.from, to: day });
|
||||
setMonth(day);
|
||||
return src === RANGE.FROM
|
||||
? fromChange(e.target.value, day, isBefore, isAfter)
|
||||
: toChange(e.target.value, day, isBefore, isAfter);
|
||||
};
|
||||
|
||||
const handleClose = useCallback(() => {
|
||||
@@ -336,6 +532,8 @@ export const useRangeDatepicker = (
|
||||
mode: "range" as const,
|
||||
open,
|
||||
onOpenToggle: () => setOpen((x) => !x),
|
||||
disabled,
|
||||
disableWeekends,
|
||||
ref: datePickerRef,
|
||||
};
|
||||
|
||||
|
||||
@@ -9,6 +9,9 @@ export {
|
||||
UNSAFE_useDatepicker,
|
||||
UNSAFE_useMonthpicker,
|
||||
UNSAFE_useRangeDatepicker,
|
||||
RangeValidationT,
|
||||
DateValidationT,
|
||||
MonthValidationT,
|
||||
} from "./hooks";
|
||||
export {
|
||||
default as UNSAFE_MonthPicker,
|
||||
|
||||
@@ -90,6 +90,26 @@ export const UseMonthpicker = () => {
|
||||
);
|
||||
};
|
||||
|
||||
export const UseMonthpickerFormat = () => {
|
||||
const { inputProps, monthpickerProps } = UNSAFE_useMonthpicker({
|
||||
disabled: [new Date("Apr 1 2022")],
|
||||
onMonthChange: console.log,
|
||||
inputFormat: "MM.yyyy",
|
||||
});
|
||||
|
||||
return (
|
||||
<div style={{ height: "20rem" }}>
|
||||
<MonthPicker {...monthpickerProps}>
|
||||
<MonthPicker.Input
|
||||
{...inputProps}
|
||||
label="Velg måned"
|
||||
variant="monthpicker"
|
||||
/>
|
||||
</MonthPicker>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const Required = () => {
|
||||
const { inputProps, monthpickerProps } = UNSAFE_useMonthpicker({
|
||||
locale: "nb",
|
||||
|
||||
@@ -6,16 +6,16 @@ const parse = (inp: string) => parseDate(inp, new Date(), nb, "date");
|
||||
|
||||
describe("Format date to correct output", () => {
|
||||
test("formatDateForInput", () => {
|
||||
expect(formatDateForInput(parse("15/05/22"), nb, "date")).toEqual(
|
||||
expect(formatDateForInput(parse("15/05/2022"), nb, "date")).toEqual(
|
||||
"15.05.2022"
|
||||
);
|
||||
expect(formatDateForInput(parse("1/5/22"), nb, "date")).toEqual(
|
||||
expect(formatDateForInput(parse("1/5/2022"), nb, "date")).toEqual(
|
||||
"01.05.2022"
|
||||
);
|
||||
expect(formatDateForInput(parse("1/05/22"), nb, "date")).toEqual(
|
||||
expect(formatDateForInput(parse("1/05/2022"), nb, "date")).toEqual(
|
||||
"01.05.2022"
|
||||
);
|
||||
expect(formatDateForInput(parse("15/5/22"), nb, "date")).toEqual(
|
||||
expect(formatDateForInput(parse("15/5/2022"), nb, "date")).toEqual(
|
||||
"15.05.2022"
|
||||
);
|
||||
});
|
||||
|
||||
@@ -2,7 +2,6 @@ import { parseDate } from "..";
|
||||
import { isValidDate } from "..";
|
||||
import nb from "date-fns/locale/nb";
|
||||
import getMonth from "date-fns/getMonth";
|
||||
import getYear from "date-fns/getYear";
|
||||
|
||||
const check = (inp: string) =>
|
||||
expect(isValidDate(parseDate(inp, new Date(), nb, "date")));
|
||||
@@ -11,71 +10,32 @@ const parse = (inp: string) => parseDate(inp, new Date(), nb, "date");
|
||||
|
||||
describe("Parse date-inputs", () => {
|
||||
test("No spaces", () => {
|
||||
check("150522").toBeTruthy();
|
||||
check("11052022").toBeTruthy();
|
||||
check("15052022").toBeTruthy();
|
||||
});
|
||||
|
||||
test(". divider", () => {
|
||||
check("1.5.22").toBeTruthy();
|
||||
check("1.5.2022").toBeTruthy();
|
||||
check("11.05.22").toBeTruthy();
|
||||
check("11.05.2022").toBeTruthy();
|
||||
});
|
||||
|
||||
test("/ divider", () => {
|
||||
check("1/5/22").toBeTruthy();
|
||||
check("10/5/22").toBeTruthy();
|
||||
check("1/5/2022").toBeTruthy();
|
||||
check("10/5/2022").toBeTruthy();
|
||||
check("1/05/22").toBeTruthy();
|
||||
check("10/05/22").toBeTruthy();
|
||||
check("1/05/2022").toBeTruthy();
|
||||
check("10/05/2022").toBeTruthy();
|
||||
});
|
||||
|
||||
test("- divider", () => {
|
||||
check("1-5-22").toBeTruthy();
|
||||
check("10-5-22").toBeTruthy();
|
||||
check("1-5-2022").toBeTruthy();
|
||||
check("10-5-2022").toBeTruthy();
|
||||
check("1-05-22").toBeTruthy();
|
||||
check("10-05-22").toBeTruthy();
|
||||
check("1-05-2022").toBeTruthy();
|
||||
check("10-05-2022").toBeTruthy();
|
||||
});
|
||||
});
|
||||
|
||||
describe("Parse date-inputs to correct year", () => {
|
||||
test("No spaces", () => {
|
||||
expect(getYear(parse("150522"))).toEqual(2022);
|
||||
});
|
||||
|
||||
test(". divider", () => {
|
||||
expect(getYear(parse("1.05.22"))).toEqual(2022);
|
||||
expect(getYear(parse("11.05.22"))).toEqual(2022);
|
||||
expect(getYear(parse("1.5.22"))).toEqual(2022);
|
||||
expect(getYear(parse("11.5.22"))).toEqual(2022);
|
||||
});
|
||||
|
||||
test("/ divider", () => {
|
||||
expect(getYear(parse("1/5/22"))).toEqual(2022);
|
||||
expect(getYear(parse("10/5/22"))).toEqual(2022);
|
||||
expect(getYear(parse("1/05/22"))).toEqual(2022);
|
||||
expect(getYear(parse("10/05/22"))).toEqual(2022);
|
||||
});
|
||||
|
||||
test("- divider", () => {
|
||||
expect(getYear(parse("1-5-22"))).toEqual(2022);
|
||||
expect(getYear(parse("10-5-22"))).toEqual(2022);
|
||||
expect(getYear(parse("1-05-22"))).toEqual(2022);
|
||||
expect(getYear(parse("10-05-22"))).toEqual(2022);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Parse date-inputs to correct month", () => {
|
||||
test("No spaces", () => {
|
||||
expect(getMonth(parse("150522"))).toEqual(4);
|
||||
expect(getMonth(parse("11052022"))).toEqual(4);
|
||||
expect(getMonth(parse("15052022"))).toEqual(4);
|
||||
});
|
||||
|
||||
@@ -7,11 +7,13 @@ import {
|
||||
export const formatDateForInput = (
|
||||
date: Date,
|
||||
locale: Locale,
|
||||
type: "date" | "month"
|
||||
type: "date" | "month",
|
||||
inputFormat?: string
|
||||
) => {
|
||||
const INPUT_DATE_STRING_FORMAT =
|
||||
type === "date"
|
||||
inputFormat ??
|
||||
(type === "date"
|
||||
? INPUT_DATE_STRING_FORMAT_DATE
|
||||
: INPUT_DATE_STRING_FORMAT_MONTH;
|
||||
: INPUT_DATE_STRING_FORMAT_MONTH);
|
||||
return format(date, INPUT_DATE_STRING_FORMAT, { locale });
|
||||
};
|
||||
@@ -6,16 +6,10 @@ export const INPUT_DATE_STRING_FORMAT_DATE = "dd.MM.yyyy";
|
||||
export const INPUT_DATE_STRING_FORMAT_MONTH = "MMMM yyyy";
|
||||
|
||||
const ALLOWED_INPUT_FORMATS_DATE = [
|
||||
"ddMMyy",
|
||||
"d.M.yy",
|
||||
"dd.MM.yy",
|
||||
"dd/MM/yy",
|
||||
"dd-MM-yy",
|
||||
INPUT_DATE_STRING_FORMAT_DATE,
|
||||
"ddMMyyyy",
|
||||
"dd/MM/yyyy",
|
||||
"dd-MM-yyyy",
|
||||
"d.M.yyyy",
|
||||
];
|
||||
|
||||
const ALLOWED_INPUT_FORMATS_MONTH = [
|
||||
@@ -28,20 +22,35 @@ const ALLOWED_INPUT_FORMATS_MONTH = [
|
||||
...ALLOWED_INPUT_FORMATS_DATE,
|
||||
];
|
||||
|
||||
const isTwoDigitYear = (dateString, today, locale, formats) => {
|
||||
let parsed;
|
||||
const newFormat = formats.map((x) => x.replace("yyyy", "yy"));
|
||||
for (const format of newFormat) {
|
||||
parsed = parse(dateString, format, today, { locale });
|
||||
if (isValidDate(parsed)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
export const parseDate = (
|
||||
date: string,
|
||||
today: Date,
|
||||
locale: Locale,
|
||||
type: "date" | "month"
|
||||
) => {
|
||||
): Date => {
|
||||
let parsed;
|
||||
const ALLOWED_FORMATS =
|
||||
type === "date" ? ALLOWED_INPUT_FORMATS_DATE : ALLOWED_INPUT_FORMATS_MONTH;
|
||||
for (const format of ALLOWED_FORMATS) {
|
||||
parsed = parse(date, format, today, { locale });
|
||||
if (isValidDate(parsed)) {
|
||||
if (
|
||||
isValidDate(parsed) &&
|
||||
!isTwoDigitYear(date, today, locale, ALLOWED_FORMATS)
|
||||
) {
|
||||
return parsed;
|
||||
}
|
||||
}
|
||||
return parsed;
|
||||
return new Date("Invalid date");
|
||||
};
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useContext } from "react";
|
||||
import React, { useContext } from "react";
|
||||
import cl from "clsx";
|
||||
import { FieldsetContext } from "./index";
|
||||
import { useId } from "../index";
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import * as React from "react";
|
||||
import { BodyLong } from "../..";
|
||||
import { Grid, Cell, ContentContainer } from "../index";
|
||||
import { BodyLong, Grid, Cell, ContentContainer } from "../index";
|
||||
|
||||
export default {
|
||||
title: "ds-react/Grid",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
export * from "./accordion";
|
||||
export * from "./alert";
|
||||
export * from "./provider";
|
||||
export * from "./button";
|
||||
export * from "./date";
|
||||
export * from "./form";
|
||||
@@ -15,6 +16,7 @@ export * from "./panel";
|
||||
export * from "./popover";
|
||||
export * from "./read-more";
|
||||
export * from "./chat";
|
||||
export * from "./chips";
|
||||
export * from "./stepper";
|
||||
export * from "./tag";
|
||||
export * from "./toggle-group";
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
import { Add } from "@navikt/ds-icons";
|
||||
import React from "react";
|
||||
import { ConfirmationPanel as DsConfirmationPanel, Link } from "..";
|
||||
import { Alert as DsAlert, BodyLong } from "../..";
|
||||
import {
|
||||
ConfirmationPanel as DsConfirmationPanel,
|
||||
Link,
|
||||
Alert as DsAlert,
|
||||
BodyLong,
|
||||
} from "..";
|
||||
export default {
|
||||
title: "ds-react/Link",
|
||||
component: Link,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import React, { forwardRef, useMemo, useRef } from "react";
|
||||
import React, { forwardRef, useEffect, useMemo, useRef } from "react";
|
||||
import cl from "clsx";
|
||||
import ReactModal from "react-modal";
|
||||
import { Close } from "@navikt/ds-icons";
|
||||
import { Button, mergeRefs } from "..";
|
||||
import { Button, mergeRefs, useProvider } from "..";
|
||||
import ModalContent, { ModalContentType } from "./ModalContent";
|
||||
|
||||
export interface ModalProps {
|
||||
@@ -63,7 +63,7 @@ interface ModalComponent
|
||||
}
|
||||
|
||||
type ModalLifecycle = {
|
||||
setAppElement?: (element: any) => void;
|
||||
setAppElement: (element: any) => void;
|
||||
};
|
||||
|
||||
export const Modal = forwardRef<ReactModal, ModalProps>(
|
||||
@@ -81,6 +81,7 @@ export const Modal = forwardRef<ReactModal, ModalProps>(
|
||||
"aria-modal": ariaModal,
|
||||
"aria-label": contentLabel,
|
||||
style,
|
||||
parentSelector,
|
||||
...rest
|
||||
},
|
||||
ref
|
||||
@@ -88,6 +89,12 @@ export const Modal = forwardRef<ReactModal, ModalProps>(
|
||||
const modalRef = useRef<ReactModal | null>(null);
|
||||
const mergedRef = useMemo(() => mergeRefs([modalRef, ref]), [ref]);
|
||||
const buttonRef = useRef<HTMLButtonElement>(null);
|
||||
const rootElement = useProvider()?.rootElement;
|
||||
const appElement = useProvider()?.appElement;
|
||||
|
||||
useEffect(() => {
|
||||
appElement && Modal.setAppElement(appElement);
|
||||
}, [appElement]);
|
||||
|
||||
const onModalCloseRequest = (e) => {
|
||||
if (shouldCloseOnOverlayClick || e.type === "keydown") {
|
||||
@@ -100,6 +107,11 @@ export const Modal = forwardRef<ReactModal, ModalProps>(
|
||||
return (
|
||||
<ReactModal
|
||||
{...rest}
|
||||
parentSelector={
|
||||
parentSelector ?? rootElement !== undefined
|
||||
? () => rootElement as HTMLElement
|
||||
: undefined
|
||||
}
|
||||
style={style}
|
||||
isOpen={open}
|
||||
ref={mergedRef}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React, { useEffect, useState } from "react";
|
||||
import { BodyLong, Button, Heading } from "../..";
|
||||
import { BodyLong, Button, Heading } from "..";
|
||||
import Modal from "./Modal";
|
||||
|
||||
export default {
|
||||
|
||||
@@ -114,7 +114,7 @@ describe("Popover", () => {
|
||||
expect(fn).toHaveBeenCalledTimes(0);
|
||||
|
||||
cleanup();
|
||||
});
|
||||
}, 20000);
|
||||
|
||||
it("keep open on popover-click", async () => {
|
||||
const fn = jest.fn();
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
import React, { createContext, useContext } from "react";
|
||||
|
||||
export interface ProviderContextType {
|
||||
/**
|
||||
* Global root-element to attach portals to (Modal, Tooltip)
|
||||
*/
|
||||
rootElement?: HTMLElement;
|
||||
/**
|
||||
* Global config for appElement (Modal)
|
||||
*/
|
||||
appElement?: HTMLElement;
|
||||
}
|
||||
|
||||
export const ProviderContext = createContext<ProviderContextType | undefined>(
|
||||
undefined
|
||||
);
|
||||
|
||||
export interface ProviderProps {
|
||||
children?: React.ReactNode;
|
||||
rootElement?: HTMLElement;
|
||||
appElement?: HTMLElement;
|
||||
}
|
||||
|
||||
export const useProvider = () => useContext(ProviderContext);
|
||||
|
||||
export const Provider = ({ children, ...rest }: ProviderProps) => {
|
||||
return (
|
||||
<ProviderContext.Provider value={rest}>{children}</ProviderContext.Provider>
|
||||
);
|
||||
};
|
||||
|
||||
export default Provider;
|
||||
@@ -0,0 +1 @@
|
||||
export { default as Provider, useProvider } from "./Provider";
|
||||
@@ -37,7 +37,7 @@ export const TabList = forwardRef<HTMLDivElement, TabListProps>(
|
||||
() =>
|
||||
debounce(() => {
|
||||
if (!listRef?.current) return;
|
||||
const { scrollWidth, clientWidth } = listRef?.current;
|
||||
const { scrollWidth, clientWidth } = listRef.current;
|
||||
let showStartScroll;
|
||||
let showEndScroll;
|
||||
|
||||
|
||||
@@ -3,19 +3,31 @@ import cl from "clsx";
|
||||
import { BodyShort, Detail } from "..";
|
||||
|
||||
export interface TagProps extends HTMLAttributes<HTMLSpanElement> {
|
||||
/**
|
||||
* Tag label
|
||||
*/
|
||||
children: React.ReactNode;
|
||||
/**
|
||||
* Changes background and border color
|
||||
* Changes visual profile of tag
|
||||
*/
|
||||
variant: "warning" | "error" | "info" | "success";
|
||||
variant:
|
||||
| "warning"
|
||||
| "warning-filled"
|
||||
| "error"
|
||||
| "error-filled"
|
||||
| "info"
|
||||
| "info-filled"
|
||||
| "success"
|
||||
| "success-filled"
|
||||
| "neutral"
|
||||
| "neutral-filled"
|
||||
| "alt1"
|
||||
| "alt1-filled"
|
||||
| "alt2"
|
||||
| "alt2-filled"
|
||||
| "alt3"
|
||||
| "alt3-filled";
|
||||
/**
|
||||
* Changes padding and font-sizes
|
||||
* @default "medium"
|
||||
*/
|
||||
size?: "medium" | "small";
|
||||
size?: "medium" | "small" | "xsmall";
|
||||
}
|
||||
|
||||
export const Tag = forwardRef<HTMLSpanElement, TagProps>(
|
||||
@@ -27,7 +39,7 @@ export const Tag = forwardRef<HTMLSpanElement, TagProps>(
|
||||
{...rest}
|
||||
ref={ref}
|
||||
as="span"
|
||||
size={size}
|
||||
size={size === "medium" ? "medium" : "small"}
|
||||
className={cl(
|
||||
"navds-tag",
|
||||
className,
|
||||
|
||||
@@ -9,17 +9,70 @@ export default {
|
||||
defaultValue: "info",
|
||||
control: {
|
||||
type: "radio",
|
||||
options: ["error", "warning", "info", "success"],
|
||||
options: [
|
||||
"warning",
|
||||
"error",
|
||||
"info",
|
||||
"success",
|
||||
"neutral",
|
||||
"alt1",
|
||||
"alt2",
|
||||
"alt3",
|
||||
"warning-filled",
|
||||
"error-filled",
|
||||
"info-filled",
|
||||
"success-filled",
|
||||
"neutral-filled",
|
||||
"alt1-filled",
|
||||
"alt2-filled",
|
||||
"alt3-filled",
|
||||
],
|
||||
},
|
||||
},
|
||||
size: {
|
||||
defaultValue: "medium",
|
||||
control: {
|
||||
type: "radio",
|
||||
options: ["xsmall", "small", "medium"],
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const variants: Array<"error" | "warning" | "info" | "success"> = [
|
||||
"error",
|
||||
const variants: Array<
|
||||
| "warning"
|
||||
| "warning-filled"
|
||||
| "error"
|
||||
| "error-filled"
|
||||
| "info"
|
||||
| "info-filled"
|
||||
| "success"
|
||||
| "success-filled"
|
||||
| "neutral"
|
||||
| "neutral-filled"
|
||||
| "alt1"
|
||||
| "alt1-filled"
|
||||
| "alt2"
|
||||
| "alt2-filled"
|
||||
| "alt3"
|
||||
| "alt3-filled"
|
||||
> = [
|
||||
"warning",
|
||||
"error",
|
||||
"info",
|
||||
"success",
|
||||
"neutral",
|
||||
"alt1",
|
||||
"alt2",
|
||||
"alt3",
|
||||
"warning-filled",
|
||||
"error-filled",
|
||||
"info-filled",
|
||||
"success-filled",
|
||||
"neutral-filled",
|
||||
"alt1-filled",
|
||||
"alt2-filled",
|
||||
"alt3-filled",
|
||||
];
|
||||
|
||||
export const Default = (props) => (
|
||||
@@ -34,10 +87,34 @@ Default.args = {
|
||||
|
||||
export const Small = () => {
|
||||
return (
|
||||
<div className="rowgap">
|
||||
<div className="rowgap rowgap-wrap">
|
||||
{variants.map((variant, i) => (
|
||||
<Tag key={variant} variant={variant} size="small">
|
||||
{new Array(i + 1).fill("Id elit esse")}
|
||||
{variant}
|
||||
</Tag>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const xSmall = () => {
|
||||
return (
|
||||
<div className="rowgap rowgap-wrap">
|
||||
{variants.map((variant, i) => (
|
||||
<Tag key={variant} variant={variant} size="xsmall">
|
||||
{variant}
|
||||
</Tag>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const Variants = () => {
|
||||
return (
|
||||
<div className="rowgap rowgap-wrap">
|
||||
{variants.map((variant, i) => (
|
||||
<Tag key={variant} variant={variant}>
|
||||
{variant}
|
||||
</Tag>
|
||||
))}
|
||||
</div>
|
||||
|
||||
@@ -21,7 +21,7 @@ import React, {
|
||||
useRef,
|
||||
useState,
|
||||
} from "react";
|
||||
import { Detail } from "..";
|
||||
import { Detail, useProvider } from "..";
|
||||
import { mergeRefs, useId } from "../util";
|
||||
|
||||
export interface TooltipProps extends HTMLAttributes<HTMLDivElement> {
|
||||
@@ -96,6 +96,7 @@ export const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(
|
||||
) => {
|
||||
const [open, setOpen] = useState(defaultOpen);
|
||||
const arrowRef = useRef<HTMLDivElement | null>(null);
|
||||
const rootElement = useProvider()?.rootElement;
|
||||
|
||||
const {
|
||||
x,
|
||||
@@ -170,7 +171,7 @@ export const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(
|
||||
: children?.props["aria-describedby"],
|
||||
})
|
||||
)}
|
||||
<FloatingPortal>
|
||||
<FloatingPortal root={rootElement}>
|
||||
{(userOpen ?? open) && (
|
||||
<div
|
||||
{...getFloatingProps({
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
/* https://github.com/radix-ui/primitives/blob/main/packages/react/portal/src/Portal.tsx */
|
||||
import ReactDOM from "react-dom";
|
||||
|
||||
const Portal = ({ children }) => {
|
||||
const hostElement = globalThis?.document?.body;
|
||||
|
||||
if (hostElement) {
|
||||
return ReactDOM.createPortal(children, hostElement);
|
||||
}
|
||||
|
||||
// bail out of ssr
|
||||
return null;
|
||||
};
|
||||
|
||||
export default Portal;
|
||||
@@ -1,7 +1,6 @@
|
||||
import { Meta } from "@storybook/react/types-6-0";
|
||||
import React from "react";
|
||||
import { Alert, Button, Search } from "../..";
|
||||
import { Tooltip } from "../index";
|
||||
import { Tooltip, Alert, Button, Search } from "..";
|
||||
|
||||
export default {
|
||||
title: "ds-react/Tooltip",
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import React from "react";
|
||||
|
||||
export interface OverridableComponent<Component, Element extends HTMLElement> {
|
||||
(props: Component & React.RefAttributes<Element>): ReturnType<React.FC>;
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import React from "react";
|
||||
// https://github.com/gregberge/react-merge-refs
|
||||
export default function mergeRefs<T = any>(
|
||||
refs: Array<React.MutableRefObject<T> | React.LegacyRef<T>>
|
||||
|
||||
@@ -1,31 +1,39 @@
|
||||
# @navikt/ds-tailwind
|
||||
|
||||
## 1.3.37
|
||||
## 1.5.9
|
||||
|
||||
## 1.5.8
|
||||
|
||||
## 1.5.7
|
||||
|
||||
## 1.5.6
|
||||
|
||||
## 1.5.5
|
||||
|
||||
## 1.5.4
|
||||
|
||||
## 1.5.3
|
||||
|
||||
## 1.5.2
|
||||
|
||||
## 1.5.1
|
||||
|
||||
## 1.5.0
|
||||
|
||||
## 1.4.4
|
||||
|
||||
## 1.4.3
|
||||
|
||||
## 1.4.2
|
||||
|
||||
## 1.4.1
|
||||
|
||||
## 1.4.0
|
||||
|
||||
## 1.3.39
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`b95fc3364`](https://github.com/navikt/Designsystemet/commit/b95fc336490b7da4a0a2ba4a8a8a2bfceb691402) Thanks [@KenAJoh](https://github.com/KenAJoh)! - changeset-demo
|
||||
- [`40f0b3340`](https://github.com/navikt/Designsystemet/commit/40f0b3340d01bf85fecc04f2f3a8e8b2acf996f1) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Bump for latest-tag
|
||||
|
||||
## 1.3.36
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`5af875d98`](https://github.com/navikt/Designsystemet/commit/5af875d98133603eb6cdc8e83f2182d7087ba034) Thanks [@KenAJoh](https://github.com/KenAJoh)! - changeset-demo
|
||||
|
||||
## 1.3.35
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`dd92454d0`](https://github.com/navikt/Designsystemet/commit/dd92454d052386582cfbae28c3248886d70f6367) Thanks [@KenAJoh](https://github.com/KenAJoh)! - demo-bump
|
||||
|
||||
## 1.3.34
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1690](https://github.com/navikt/Designsystemet/pull/1690) [`2fa52b05e`](https://github.com/navikt/Designsystemet/commit/2fa52b05e75ef518f0725ef33ca1890c1b683313) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Workflow-test
|
||||
|
||||
## 1.3.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1690](https://github.com/navikt/Designsystemet/pull/1690) [`89ac7f8e9`](https://github.com/navikt/Designsystemet/commit/89ac7f8e9200133170562608e3cbba9b8b6d1abe) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Initial changeset changelog
|
||||
## 1.3.38
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@navikt/ds-tailwind",
|
||||
"version": "1.3.37",
|
||||
"version": "1.5.9",
|
||||
"description": "Auto-generated tailwind config based on @navikt/ds-tokens",
|
||||
"author": "NAV Designsystem team",
|
||||
"keywords": [
|
||||
@@ -22,13 +22,13 @@
|
||||
"directory": "@navikt/core/tailwind"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@navikt/ds-tokens": "^1.3.37",
|
||||
"@types/jest": "^27.0.1",
|
||||
"@navikt/ds-tokens": "^1.5.9",
|
||||
"@types/jest": "^29.0.0",
|
||||
"@types/node": "^17.0.35",
|
||||
"jest": "^27.2.0",
|
||||
"jest": "^29.0.0",
|
||||
"lodash": "^4.17.21",
|
||||
"ts-jest": "^27.0.5",
|
||||
"ts-node": "^10.3.0",
|
||||
"typescript": "^4.7.2"
|
||||
"ts-jest": "^29.0.0",
|
||||
"ts-node": "10.9.0",
|
||||
"typescript": "^4.8.0"
|
||||
}
|
||||
}
|
||||
@@ -1,31 +1,39 @@
|
||||
# @navikt/ds-tokens
|
||||
|
||||
## 1.3.37
|
||||
## 1.5.9
|
||||
|
||||
## 1.5.8
|
||||
|
||||
## 1.5.7
|
||||
|
||||
## 1.5.6
|
||||
|
||||
## 1.5.5
|
||||
|
||||
## 1.5.4
|
||||
|
||||
## 1.5.3
|
||||
|
||||
## 1.5.2
|
||||
|
||||
## 1.5.1
|
||||
|
||||
## 1.5.0
|
||||
|
||||
## 1.4.4
|
||||
|
||||
## 1.4.3
|
||||
|
||||
## 1.4.2
|
||||
|
||||
## 1.4.1
|
||||
|
||||
## 1.4.0
|
||||
|
||||
## 1.3.39
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`b95fc3364`](https://github.com/navikt/Designsystemet/commit/b95fc336490b7da4a0a2ba4a8a8a2bfceb691402) Thanks [@KenAJoh](https://github.com/KenAJoh)! - changeset-demo
|
||||
- [`40f0b3340`](https://github.com/navikt/Designsystemet/commit/40f0b3340d01bf85fecc04f2f3a8e8b2acf996f1) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Bump for latest-tag
|
||||
|
||||
## 1.3.36
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`5af875d98`](https://github.com/navikt/Designsystemet/commit/5af875d98133603eb6cdc8e83f2182d7087ba034) Thanks [@KenAJoh](https://github.com/KenAJoh)! - changeset-demo
|
||||
|
||||
## 1.3.35
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`dd92454d0`](https://github.com/navikt/Designsystemet/commit/dd92454d052386582cfbae28c3248886d70f6367) Thanks [@KenAJoh](https://github.com/KenAJoh)! - demo-bump
|
||||
|
||||
## 1.3.34
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1690](https://github.com/navikt/Designsystemet/pull/1690) [`2fa52b05e`](https://github.com/navikt/Designsystemet/commit/2fa52b05e75ef518f0725ef33ca1890c1b683313) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Workflow-test
|
||||
|
||||
## 1.3.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1690](https://github.com/navikt/Designsystemet/pull/1690) [`89ac7f8e9`](https://github.com/navikt/Designsystemet/commit/89ac7f8e9200133170562608e3cbba9b8b6d1abe) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Initial changeset changelog
|
||||
## 1.3.38
|
||||
@@ -13,7 +13,7 @@ const styleFieldNames = {
|
||||
|
||||
const findNodeWithStyle = (node: Node<any>, styleId: StyleId): Node<any> => {
|
||||
if (
|
||||
node.hasOwnProperty("styles") &&
|
||||
"styles" in node &&
|
||||
styleFieldNames[styleId.styleType]?.some(
|
||||
(name) => node.styles[name] === styleId.id
|
||||
)
|
||||
@@ -31,8 +31,6 @@ const findNodeWithStyle = (node: Node<any>, styleId: StyleId): Node<any> => {
|
||||
|
||||
const findStyleValue = (document: DOCUMENT, styleId: StyleId) => {
|
||||
const node = findNodeWithStyle(document, styleId);
|
||||
if (styleId.id === "5249:11258") {
|
||||
}
|
||||
|
||||
switch (styleId.styleType) {
|
||||
case "FILL":
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@navikt/ds-tokens",
|
||||
"version": "1.3.37",
|
||||
"version": "1.5.9",
|
||||
"description": "Auto-generated design-tokens for NAV design-systems framework",
|
||||
"author": "NAV Designsystem team",
|
||||
"keywords": [
|
||||
@@ -29,18 +29,18 @@
|
||||
"directory": "@navikt/core/tokens"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^27.0.1",
|
||||
"@types/jest": "^29.0.0",
|
||||
"@types/node": "^17.0.35",
|
||||
"axios": "^0.21.3",
|
||||
"color": "4.2.3",
|
||||
"dotenv": "^10.0.0",
|
||||
"figma-api": "^1.7.0",
|
||||
"jest": "^27.2.0",
|
||||
"jest": "^29.0.0",
|
||||
"lodash": "^4.17.21",
|
||||
"nodemon": "^2.0.12",
|
||||
"style-dictionary": "^3.0.2",
|
||||
"ts-jest": "^27.0.5",
|
||||
"ts-node": "^10.3.0",
|
||||
"typescript": "^4.7.2"
|
||||
"ts-jest": "^29.0.0",
|
||||
"ts-node": "10.9.0",
|
||||
"typescript": "^4.8.0"
|
||||
}
|
||||
}
|
||||
@@ -1,31 +1,51 @@
|
||||
# @navikt/ds-icons
|
||||
|
||||
## 1.3.37
|
||||
## 1.5.9
|
||||
|
||||
## 1.5.8
|
||||
|
||||
## 1.5.7
|
||||
|
||||
## 1.5.6
|
||||
|
||||
## 1.5.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`b95fc3364`](https://github.com/navikt/Designsystemet/commit/b95fc336490b7da4a0a2ba4a8a8a2bfceb691402) Thanks [@KenAJoh](https://github.com/KenAJoh)! - changeset-demo
|
||||
- Error-ikon hadde avrundede kanter
|
||||
|
||||
## 1.3.36
|
||||
## 1.5.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`5af875d98`](https://github.com/navikt/Designsystemet/commit/5af875d98133603eb6cdc8e83f2182d7087ba034) Thanks [@KenAJoh](https://github.com/KenAJoh)! - changeset-demo
|
||||
- [#1709](https://github.com/navikt/Designsystemet/pull/1709) [`77302a30b`](https://github.com/navikt/Designsystemet/commit/77302a30b8eef8dc00b2d2e9c904a3f57da81a11) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Oppdatert ikoner
|
||||
|
||||
## 1.3.35
|
||||
## 1.5.3
|
||||
|
||||
## 1.5.2
|
||||
|
||||
## 1.5.1
|
||||
|
||||
## 1.5.0
|
||||
|
||||
## 1.4.4
|
||||
|
||||
## 1.4.3
|
||||
|
||||
## 1.4.2
|
||||
|
||||
## 1.4.1
|
||||
|
||||
## 1.4.0
|
||||
|
||||
## 1.3.39
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [`dd92454d0`](https://github.com/navikt/Designsystemet/commit/dd92454d052386582cfbae28c3248886d70f6367) Thanks [@KenAJoh](https://github.com/KenAJoh)! - demo-bump
|
||||
- [`40f0b3340`](https://github.com/navikt/Designsystemet/commit/40f0b3340d01bf85fecc04f2f3a8e8b2acf996f1) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Bump for latest-tag
|
||||
|
||||
## 1.3.34
|
||||
## 1.3.38
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1690](https://github.com/navikt/Designsystemet/pull/1690) [`2fa52b05e`](https://github.com/navikt/Designsystemet/commit/2fa52b05e75ef518f0725ef33ca1890c1b683313) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Workflow-test
|
||||
|
||||
## 1.3.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- [#1690](https://github.com/navikt/Designsystemet/pull/1690) [`89ac7f8e9`](https://github.com/navikt/Designsystemet/commit/89ac7f8e9200133170562608e3cbba9b8b6d1abe) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Initial changeset changelog
|
||||
- [#1692](https://github.com/navikt/Designsystemet/pull/1692) [`aa506975b`](https://github.com/navikt/Designsystemet/commit/aa506975b4466d4daa79c75f5f9faa255b7fae42) Thanks [@KenAJoh](https://github.com/KenAJoh)! - Oppdaterte kateogorisering for ikoner i Figma
|
||||
@@ -78,8 +78,4 @@ const main = async () => {
|
||||
console.log("\nDownloaded all icons from Figma!\n");
|
||||
};
|
||||
|
||||
try {
|
||||
main();
|
||||
} catch (e) {
|
||||
throw e;
|
||||
}
|
||||
main();
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@navikt/ds-icons",
|
||||
"version": "1.3.37",
|
||||
"version": "1.5.9",
|
||||
"description": "Aksel icons",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -25,13 +25,14 @@
|
||||
"/esm",
|
||||
"/src",
|
||||
"/svg",
|
||||
"/meta.json"
|
||||
"/meta.json",
|
||||
"!**/*.tsbuildinfo"
|
||||
],
|
||||
"scripts": {
|
||||
"create-package-json-pointers-to-esm": "node ../../scripts/createPackageJsonsWithESMPointers.js",
|
||||
"create-icons": "svgr --out-dir src svg",
|
||||
"create-icons": "svgr --silent --out-dir src svg",
|
||||
"clean": "rimraf src cjs esm",
|
||||
"build": "yarn clean && copyfiles util/* src && yarn create-icons && concurrently \"tsc\" \"tsc -p tsconfig.esm.json\" && yarn create-package-json-pointers-to-esm",
|
||||
"build": "copyfiles util/* src && yarn create-icons && concurrently \"tsc\" \"tsc -p tsconfig.esm.json\" && yarn create-package-json-pointers-to-esm",
|
||||
"update": "ts-node figma/index.ts dotenv/config",
|
||||
"test": "jest"
|
||||
},
|
||||
@@ -46,7 +47,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@svgr/cli": "6.2.1",
|
||||
"@types/jest": "^27.0.1",
|
||||
"@types/jest": "^29.0.0",
|
||||
"@types/lodash.startcase": "^4.4.6",
|
||||
"@types/node": "^17.0.35",
|
||||
"@types/rimraf": "3.0.2",
|
||||
@@ -54,13 +55,13 @@
|
||||
"concurrently": "7.2.1",
|
||||
"copyfiles": "^2.4.1",
|
||||
"dotenv": "^10.0.0",
|
||||
"jest": "^27.5.0",
|
||||
"jest": "^29.0.0",
|
||||
"lodash.kebabcase": "^4.1.1",
|
||||
"lodash.startcase": "4.4.0",
|
||||
"react": "^18.0.0",
|
||||
"rimraf": "3.0.2",
|
||||
"ts-jest": "^27.1.0",
|
||||
"ts-node": "^10.4.0",
|
||||
"typescript": "^4.7.2"
|
||||
"ts-jest": "^29.0.0",
|
||||
"ts-node": "10.9.0",
|
||||
"typescript": "^4.8.0"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.58578 12L14.2929 4.29289L15.7071 5.70711L9.41421 12L15.7071 18.2929L14.2929 19.7071L6.58578 12Z" fill="#262626"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.58582 12L14.2929 4.29289L15.7071 5.70711L9.41424 12L15.7071 18.2929L14.2929 19.7071L6.58582 12Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 269 B After Width: | Height: | Size: 269 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.87868 12L13.9393 3.93934L16.0607 6.06066L10.1213 12L16.0607 17.9393L13.9393 20.0607L5.87868 12Z" fill="#262626"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.87866 12L13.9393 3.93934L16.0606 6.06066L10.1213 12L16.0606 17.9393L13.9393 20.0607L5.87866 12Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 269 B After Width: | Height: | Size: 269 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M13 2V4.07089C16.3923 4.55612 19 7.47353 19 11V12.3767C19 13.6798 19.3992 14.9517 20.1439 16.021L21.8206 18.4285C22.0335 18.7341 22.0588 19.1327 21.8864 19.4629C21.714 19.793 21.3724 20 21 20H15C15 21.6569 13.6569 23 12 23C10.3431 23 9 21.6569 9 20H3C2.62756 20 2.28597 19.793 2.11358 19.4629C1.94118 19.1327 1.96654 18.7341 2.17939 18.4285L3.85606 16.021C4.60077 14.9517 5 13.6798 5 12.3767V11C5 7.47353 7.60771 4.55612 11 4.07089V2H13ZM11 20C11 20.5523 11.4477 21 12 21C12.5523 21 13 20.5523 13 20H11ZM12 6C9.23858 6 7 8.23858 7 11V12.3767C7 14.0885 6.47556 15.7593 5.49727 17.164L4.91504 18H19.085L18.5027 17.164C17.5244 15.7593 17 14.0885 17 12.3767V11C17 8.23857 14.7614 6 12 6Z" fill="#262626"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M13 2V4.07089C16.3923 4.55612 19 7.47353 19 11V12.3767C19 13.6798 19.3992 14.9517 20.1439 16.021L21.8206 18.4285C22.0335 18.7341 22.0588 19.1327 21.8864 19.4629C21.714 19.793 21.3724 20 21 20H15C15 21.6569 13.6569 23 12 23C10.3431 23 9 21.6569 9 20H3C2.62756 20 2.28597 19.793 2.11358 19.4629C1.94118 19.1327 1.96655 18.7341 2.1794 18.4285L3.85606 16.021C4.60077 14.9517 5 13.6798 5 12.3767V11C5 7.47353 7.60771 4.55612 11 4.07089V2H13ZM11 20C11 20.5523 11.4477 21 12 21C12.5523 21 13 20.5523 13 20H11ZM12 6C9.23858 6 7 8.23858 7 11V12.3767C7 14.0885 6.47556 15.7593 5.49727 17.164L4.91504 18H19.085L18.5027 17.164C17.5244 15.7593 17 14.0885 17 12.3767V11C17 8.23857 14.7614 6 12 6Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 854 B After Width: | Height: | Size: 853 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M13 2V4.07089C16.3923 4.55612 19 7.47353 19 11V12.3767C19 13.6798 19.3992 14.9517 20.1439 16.021L21.8206 18.4285C22.0335 18.7341 22.0588 19.1327 21.8864 19.4629C21.714 19.793 21.3724 20 21 20H15C15 21.6569 13.6569 23 12 23C10.3431 23 9 21.6569 9 20H3C2.62756 20 2.28597 19.793 2.11358 19.4629C1.94118 19.1327 1.96654 18.7341 2.17939 18.4285L3.85606 16.021C4.60077 14.9517 5 13.6798 5 12.3767V11C5 7.47353 7.60771 4.55612 11 4.07089V2H13ZM11 20C11 20.5523 11.4477 21 12 21C12.5523 21 13 20.5523 13 20H11Z" fill="#262626"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M13 2V4.07089C16.3923 4.55612 19 7.47353 19 11V12.3767C19 13.6798 19.3992 14.9517 20.1439 16.021L21.8206 18.4285C22.0335 18.7341 22.0588 19.1327 21.8864 19.4629C21.714 19.793 21.3724 20 21 20H15C15 21.6569 13.6569 23 12 23C10.3431 23 9 21.6569 9 20H3C2.62756 20 2.28597 19.793 2.11358 19.4629C1.94118 19.1327 1.96655 18.7341 2.1794 18.4285L3.85606 16.021C4.60077 14.9517 5 13.6798 5 12.3767V11C5 7.47353 7.60771 4.55612 11 4.07089V2H13ZM11 20C11 20.5523 11.4477 21 12 21C12.5523 21 13 20.5523 13 20H11Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 674 B After Width: | Height: | Size: 673 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.70711 4.7071C8.09763 4.31657 8.09763 3.68341 7.70711 3.29289C7.31658 2.90236 6.68342 2.90236 6.29289 3.29289L2.29289 7.29289C2.10535 7.48042 2 7.73478 2 8C2 8.26521 2.10535 8.51957 2.29289 8.7071L6.29289 12.7071C6.68342 13.0976 7.31658 13.0976 7.70711 12.7071C8.09763 12.3166 8.09763 11.6834 7.70711 11.2929L5.41421 8.99999H15C17.7614 8.99999 20 11.2386 20 14C20 16.7614 17.7614 19 15 19H13.7879C13.2356 19 12.7879 19.4477 12.7879 20C12.7879 20.5523 13.2356 21 13.7879 21H15C18.866 21 22 17.866 22 14C22 10.134 18.866 6.99999 15 6.99999H5.41421L7.70711 4.7071Z" fill="#262626"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.70711 4.70711C8.09763 4.31658 8.09763 3.68342 7.70711 3.29289C7.31659 2.90237 6.68342 2.90237 6.2929 3.29289L2.29289 7.2929C2.10536 7.48043 2 7.73479 2 8C2 8.26522 2.10536 8.51957 2.29289 8.70711L6.2929 12.7071C6.68342 13.0976 7.31659 13.0976 7.70711 12.7071C8.09763 12.3166 8.09763 11.6834 7.70711 11.2929L5.41421 9H15C17.7614 9 20 11.2386 20 14C20 16.7614 17.7614 19 15 19H13.7879C13.2356 19 12.7879 19.4477 12.7879 20C12.7879 20.5523 13.2356 21 13.7879 21H15C18.866 21 22 17.866 22 14C22 10.134 18.866 7 15 7H5.41422L7.70711 4.70711Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 734 B After Width: | Height: | Size: 710 B |
@@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.25 12C21.25 6.89137 17.1086 2.75 12 2.75C6.89137 2.75 2.75 6.89137 2.75 12C2.75 17.1086 6.89137 21.25 12 21.25C17.1086 21.25 21.25 17.1086 21.25 12ZM12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25Z" fill="#262626"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 15.5607L7.46967 11.0303L8.53033 9.96967L12 13.4393L15.4697 9.96967L16.5303 11.0303L12 15.5607Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 640 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25ZM12 15.5607L16.5303 11.0303L15.4697 9.96967L12 13.4393L8.53033 9.96967L7.46967 11.0303L12 15.5607Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 420 B |
@@ -0,0 +1,5 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.25 12C21.25 6.89137 17.1086 2.75 12 2.75C6.89137 2.75 2.75 6.89137 2.75 12C2.75 17.1086 6.89137 21.25 12 21.25C17.1086 21.25 21.25 17.1086 21.25 12ZM12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25Z" fill="#262626"/>
|
||||
<path d="M12 13.5607L16.5303 9.03033L15.4697 7.96967L12 11.4393L8.53033 7.96967L7.46967 9.03033L12 13.5607Z" fill="#262626"/>
|
||||
<path d="M12 17.0607L16.5303 12.5303L15.4697 11.4697L12 14.9393L8.53033 11.4697L7.46967 12.5303L12 17.0607Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 726 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12ZM11.9984 13.4579L6.94365 8.40316L8.27389 7.07292L11.9984 10.7974L15.7228 7.07292L17.0531 8.40316L11.9984 13.4579ZM6.94365 13.241L11.9984 18.2957L17.0531 13.241L15.7228 11.9108L11.9984 15.6352L8.27389 11.9108L6.94365 13.241Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 546 B |
@@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 21.25C17.1086 21.25 21.25 17.1086 21.25 12C21.25 6.89137 17.1086 2.75 12 2.75C6.89137 2.75 2.75 6.89137 2.75 12C2.75 17.1086 6.89137 21.25 12 21.25ZM22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12Z" fill="#262626"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.43934 12L12.9697 7.46967L14.0303 8.53033L10.5607 12L14.0303 15.4697L12.9697 16.5303L8.43934 12Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 641 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12ZM8.43934 12L12.9697 16.5303L14.0303 15.4697L10.5607 12L14.0303 8.53033L12.9697 7.46967L8.43934 12Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 421 B |
@@ -0,0 +1,5 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 21.25C17.1086 21.25 21.25 17.1086 21.25 12C21.25 6.89137 17.1086 2.75 12 2.75C6.89137 2.75 2.75 6.89137 2.75 12C2.75 17.1086 6.89137 21.25 12 21.25ZM22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12Z" fill="#262626"/>
|
||||
<path d="M10.4393 12L14.9697 16.5303L16.0303 15.4697L12.5607 12L16.0303 8.53033L14.9697 7.46967L10.4393 12Z" fill="#262626"/>
|
||||
<path d="M6.93934 12L11.4697 16.5303L12.5303 15.4697L9.06066 12L12.5303 8.53033L11.4697 7.46967L6.93934 12Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 727 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75ZM10.5421 11.9984L15.5968 6.94365L16.9271 8.27389L13.2026 11.9984L16.9271 15.7228L15.5968 17.0531L10.5421 11.9984ZM10.759 6.94365L5.70428 11.9984L10.759 17.0531L12.0892 15.7228L8.36477 11.9984L12.0892 8.27389L10.759 6.94365Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 546 B |
@@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 2.75C6.89137 2.75 2.75 6.89137 2.75 12C2.75 17.1086 6.89137 21.25 12 21.25C17.1086 21.25 21.25 17.1086 21.25 12C21.25 6.89137 17.1086 2.75 12 2.75ZM1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12Z" fill="#262626"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.5607 12L11.0303 16.5303L9.96967 15.4697L13.4393 12L9.96967 8.53033L11.0303 7.46967L15.5607 12Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 639 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12ZM15.5607 12L11.0303 7.46967L9.96967 8.53033L13.4393 12L9.96967 15.4697L11.0303 16.5303L15.5607 12Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 420 B |
@@ -0,0 +1,5 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 2.75C6.89137 2.75 2.75 6.89137 2.75 12C2.75 17.1086 6.89137 21.25 12 21.25C17.1086 21.25 21.25 17.1086 21.25 12C21.25 6.89137 17.1086 2.75 12 2.75ZM1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12Z" fill="#262626"/>
|
||||
<path d="M13.5607 12L9.03033 7.46967L7.96967 8.53033L11.4393 12L7.96967 15.4697L9.03033 16.5303L13.5607 12Z" fill="#262626"/>
|
||||
<path d="M17.0607 12L12.5303 7.46967L11.4697 8.53033L14.9393 12L11.4697 15.4697L12.5303 16.5303L17.0607 12Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 725 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25ZM13.4579 12.0016L8.40316 17.0564L7.07292 15.7261L10.7974 12.0016L7.07292 8.27718L8.40316 6.94694L13.4579 12.0016ZM13.241 17.0564L18.2957 12.0016L13.241 6.94694L11.9108 8.27718L15.6352 12.0016L11.9108 15.7261L13.241 17.0564Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 545 B |
@@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 12C2.75 17.1086 6.89137 21.25 12 21.25C17.1086 21.25 21.25 17.1086 21.25 12C21.25 6.89137 17.1086 2.75 12 2.75C6.89137 2.75 2.75 6.89137 2.75 12ZM12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75Z" fill="#262626"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 8.43934L16.5303 12.9697L15.4697 14.0303L12 10.5607L8.53033 14.0303L7.46967 12.9697L12 8.43934Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 640 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75ZM12 8.43934L7.46967 12.9697L8.53033 14.0303L12 10.5607L15.4697 14.0303L16.5303 12.9697L12 8.43934Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 421 B |
@@ -0,0 +1,5 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 12C2.75 17.1086 6.89137 21.25 12 21.25C17.1086 21.25 21.25 17.1086 21.25 12C21.25 6.89137 17.1086 2.75 12 2.75C6.89137 2.75 2.75 6.89137 2.75 12ZM12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75Z" fill="#262626"/>
|
||||
<path d="M12 10.4393L7.46967 14.9697L8.53033 16.0303L12 12.5607L15.4697 16.0303L16.5303 14.9697L12 10.4393Z" fill="#262626"/>
|
||||
<path d="M12 6.93934L7.46967 11.4697L8.53033 12.5303L12 9.06066L15.4697 12.5303L16.5303 11.4697L12 6.93934Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 726 B |
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12ZM12.0016 10.5421L17.0564 15.5968L15.7261 16.9271L12.0016 13.2026L8.27718 16.9271L6.94694 15.5968L12.0016 10.5421ZM17.0564 10.759L12.0016 5.70428L6.94694 10.759L8.27718 12.0892L12.0016 8.36477L15.7261 12.0892L17.0564 10.759Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 545 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M3.48673 19V17H1.0044C0.237047 17 -0.244376 16.1714 0.135641 15.5048L2.98855 10.5C2.98855 4.70126 7.68936 0 13.4881 0C21.9282 0 26.9188 9.45374 22.1574 16.4226L21.4214 17.5V24H8.96676V22H6.48673C4.82988 22 3.48673 20.6569 3.48673 19ZM15.4447 7C15.7198 7 15.9428 6.77614 15.9428 6.5C15.9428 6.22386 15.7198 6 15.4447 6C15.1695 6 14.9465 6.22386 14.9465 6.5C14.9465 6.77614 15.1695 7 15.4447 7ZM15.4447 9C16.8204 9 17.9356 7.88071 17.9356 6.5C17.9356 5.11929 16.8204 4 15.4447 4C14.069 4 12.9537 5.11929 12.9537 6.5C12.9537 7.0739 13.1464 7.60264 13.4704 8.0246L13.1449 8.56898L10.9587 7.39873C10.9057 6.06497 9.81166 5 8.46976 5C7.09407 5 5.97884 6.11929 5.97884 7.5C5.97884 8.88071 7.09407 10 8.46976 10C9.15491 10 9.77545 9.72237 10.2258 9.27309L12.1184 10.2861L11.6856 11.0101C11.6112 11.0034 11.536 11 11.4599 11C10.0842 11 8.96899 12.1193 8.96899 13.5C8.96899 14.8807 10.0842 16 11.4599 16C12.8356 16 13.9508 14.8807 13.9508 13.5C13.9508 12.9257 13.7579 12.3966 13.4335 11.9745L13.8793 11.2287L15.9478 12.336C15.9443 12.3902 15.9425 12.4449 15.9425 12.5C15.9425 13.8807 17.0578 15 18.4335 15C19.8092 15 20.9244 13.8807 20.9244 12.5C20.9244 11.1193 19.8092 10 18.4335 10C17.8382 10 17.2916 10.2096 16.8631 10.5592L14.9059 9.51158L15.2178 8.98977C15.2925 8.99654 15.3682 9 15.4447 9ZM8.46976 8C8.7449 8 8.96795 7.77614 8.96795 7.5C8.96795 7.22386 8.7449 7 8.46976 7C8.19462 7 7.97158 7.22386 7.97158 7.5C7.97158 7.77614 8.19462 8 8.46976 8ZM18.4335 13C18.7086 13 18.9316 12.7761 18.9316 12.5C18.9316 12.2239 18.7086 12 18.4335 12C18.1583 12 17.9353 12.2239 17.9353 12.5C17.9353 12.7761 18.1583 13 18.4335 13ZM11.9581 13.5C11.9581 13.7761 11.7351 14 11.4599 14C11.1848 14 10.9617 13.7761 10.9617 13.5C10.9617 13.2239 11.1848 13 11.4599 13C11.7351 13 11.9581 13.2239 11.9581 13.5Z" fill="#262626"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M3.48651 19V17H1.00418C0.236826 17 -0.244597 16.1714 0.13542 15.5048L2.98833 10.5C2.98833 4.70126 7.68914 0 13.4879 0C21.928 0 26.9185 9.45374 22.1572 16.4226L21.4211 17.5V24H8.96654V22H6.48651C4.82966 22 3.48651 20.6569 3.48651 19ZM15.4444 7C15.7196 7 15.9426 6.77614 15.9426 6.5C15.9426 6.22386 15.7196 6 15.4444 6C15.1693 6 14.9463 6.22386 14.9463 6.5C14.9463 6.77614 15.1693 7 15.4444 7ZM15.4444 9C16.8201 9 17.9354 7.88071 17.9354 6.5C17.9354 5.11929 16.8201 4 15.4444 4C14.0687 4 12.9535 5.11929 12.9535 6.5C12.9535 7.0739 13.1462 7.60264 13.4702 8.0246L13.1447 8.56898L10.9585 7.39873C10.9055 6.06497 9.81144 5 8.46954 5C7.09384 5 5.97862 6.11929 5.97862 7.5C5.97862 8.88071 7.09384 10 8.46954 10C9.15469 10 9.77523 9.72237 10.2256 9.27309L12.1181 10.2861L11.6853 11.0101C11.611 11.0034 11.5357 11 11.4597 11C10.084 11 8.96877 12.1193 8.96877 13.5C8.96877 14.8807 10.084 16 11.4597 16C12.8354 16 13.9506 14.8807 13.9506 13.5C13.9506 12.9257 13.7577 12.3966 13.4333 11.9745L13.8791 11.2287L15.9476 12.336C15.9441 12.3902 15.9423 12.4449 15.9423 12.5C15.9423 13.8807 17.0575 15 18.4332 15C19.8089 15 20.9242 13.8807 20.9242 12.5C20.9242 11.1193 19.8089 10 18.4332 10C17.8379 10 17.2914 10.2096 16.8629 10.5592L14.9057 9.51158L15.2176 8.98977C15.2923 8.99654 15.368 9 15.4444 9ZM8.46954 8C8.74468 8 8.96773 7.77614 8.96773 7.5C8.96773 7.22386 8.74468 7 8.46954 7C8.1944 7 7.97136 7.22386 7.97136 7.5C7.97136 7.77614 8.1944 8 8.46954 8ZM18.4332 13C18.7084 13 18.9314 12.7761 18.9314 12.5C18.9314 12.2239 18.7084 12 18.4332 12C18.1581 12 17.9351 12.2239 17.9351 12.5C17.9351 12.7761 18.1581 13 18.4332 13ZM11.9579 13.5C11.9579 13.7761 11.7348 14 11.4597 14C11.1846 14 10.9615 13.7761 10.9615 13.5C10.9615 13.2239 11.1846 13 11.4597 13C11.7348 13 11.9579 13.2239 11.9579 13.5Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
@@ -1,3 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.9997 7.99978C13.6565 7.99978 14.9996 6.65667 14.9996 4.99986C14.9996 3.34305 13.6565 1.99995 11.9997 1.99995C10.3429 1.99995 8.99975 3.34305 8.99975 4.99986C8.99975 6.65667 10.3429 7.99978 11.9997 7.99978ZM11.9997 9.99973C14.761 9.99973 16.9995 7.76121 16.9995 4.99986C16.9995 2.23851 14.761 0 11.9997 0C9.23832 0 6.99981 2.23851 6.99981 4.99986C6.99981 7.76121 9.23832 9.99973 11.9997 9.99973ZM18.4436 18.8862L15.4212 15.0002L16.9998 13.7724L19.7104 17.2574L22.421 13.7724L23.9996 15.0002L20.9772 18.8862L23.9996 22.7721L22.421 24L19.7104 20.515L16.9998 24L15.4211 22.7722L18.4436 18.8862ZM14.1342 13.4769L15.8355 12.1433C14.7339 11.4203 13.4159 10.9997 11.9997 10.9997C8.13378 10.9997 4.99986 14.1336 4.99986 17.9995H6.99981C6.99981 15.2382 9.23832 12.9996 11.9997 12.9996C12.7632 12.9996 13.4868 13.1708 14.1342 13.4769Z" fill="#262626"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.9997 7.99978C13.6565 7.99978 14.9996 6.65667 14.9996 4.99986C14.9996 3.34305 13.6565 1.99994 11.9997 1.99994C10.3429 1.99994 8.99975 3.34305 8.99975 4.99986C8.99975 6.65667 10.3429 7.99978 11.9997 7.99978ZM11.9997 9.99972C14.761 9.99972 16.9995 7.76121 16.9995 4.99986C16.9995 2.23851 14.761 0 11.9997 0C9.23832 0 6.9998 2.23851 6.9998 4.99986C6.9998 7.76121 9.23832 9.99972 11.9997 9.99972ZM18.4436 18.8862L15.4212 15.0002L16.9998 13.7724L19.7104 17.2574L22.4209 13.7724L23.9996 15.0002L20.9772 18.8862L23.9996 22.7721L22.421 24L19.7104 20.5149L16.9998 24L15.4211 22.7721L18.4436 18.8862ZM14.1342 13.4769L15.8355 12.1433C14.7339 11.4203 13.4159 10.9997 11.9997 10.9997C8.13378 10.9997 4.99986 14.1336 4.99986 17.9995H6.9998C6.9998 15.2381 9.23832 12.9996 11.9997 12.9996C12.7632 12.9996 13.4868 13.1708 14.1342 13.4769Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 998 B After Width: | Height: | Size: 995 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.9995 4.99986C16.9995 7.76121 14.761 9.99973 11.9997 9.99973C9.23832 9.99973 6.99981 7.76121 6.99981 4.99986C6.99981 2.23851 9.23832 0 11.9997 0C14.761 0 16.9995 2.23851 16.9995 4.99986ZM11.9997 10.9997C8.13378 10.9997 4.99986 14.1336 4.99986 17.9995H15.3673L12.6852 14.5511L15.8705 12.1665C14.7618 11.4293 13.4309 10.9997 11.9997 10.9997ZM15.2605 15.0002L18.2829 18.8862L15.2605 22.7722L16.8392 24L19.5498 20.515L22.2603 24L23.839 22.7721L20.8166 18.8862L23.839 15.0002L22.2603 13.7724L19.5498 17.2574L16.8392 13.7724L15.2605 15.0002Z" fill="#262626"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.9995 4.99986C16.9995 7.76121 14.761 9.99972 11.9997 9.99972C9.23832 9.99972 6.9998 7.76121 6.9998 4.99986C6.9998 2.23851 9.23832 0 11.9997 0C14.761 0 16.9995 2.23851 16.9995 4.99986ZM11.9997 10.9997C8.13378 10.9997 4.99986 14.1336 4.99986 17.9995H15.3673L12.6852 14.5511L15.8705 12.1665C14.7618 11.4292 13.4309 10.9997 11.9997 10.9997ZM15.2605 15.0002L18.2829 18.8862L15.2605 22.7721L16.8392 24L19.5498 20.5149L22.2603 24L23.839 22.7721L20.8166 18.8862L23.839 15.0002L22.2603 13.7724L19.5497 17.2574L16.8392 13.7724L15.2605 15.0002Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 709 B After Width: | Height: | Size: 707 B |
@@ -1,3 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M13 1V3H11V1C11 0.447715 11.4477 0 12 0C12.5523 0 13 0.447715 13 1ZM0.518226 4.77735C0.296708 4.44507 0.534904 4 0.934252 4H19.4648C19.7992 4 20.1114 4.1671 20.2969 4.4453L24 10L20.2969 15.5547C20.1114 15.8329 19.7992 16 19.4648 16H0.934253C0.534905 16 0.296708 15.5549 0.518226 15.2227L3.99999 10L0.518226 4.77735ZM11 17L11 24H13V17H11Z" fill="#262626"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M13 1V3H11V1C11 0.447715 11.4477 0 12 0C12.5523 0 13 0.447715 13 1ZM0.518211 4.77735C0.296693 4.44507 0.534889 4 0.934236 4H19.4648C19.7991 4 20.1114 4.1671 20.2968 4.4453L24 10L20.2968 15.5547C20.1114 15.8329 19.7991 16 19.4648 16H0.934238C0.53489 16 0.296693 15.5549 0.518211 15.2227L3.99998 10L0.518211 4.77735ZM11 17L11 24H13V17H11Z" fill="#262626"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 508 B After Width: | Height: | Size: 507 B |