Merge branch 'master' into canon-merge-field-input

This commit is contained in:
Charles de Dreuille
2025-03-31 11:25:12 +01:00
253 changed files with 5087 additions and 2128 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-auth-backend-module-bitbucket-provider': patch
---
Enabled persistency of scopes for Bitbucket Cloud.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog': minor
---
Added support of filtering based on system columns in catalog table
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/create-app': patch
---
Bumped create-app version.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Bump @module-federation/enhanced ^0.9.0 to fix GHSA-593f-38f6-jp5m
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/canon': patch
---
Updated styles for the Menu component in Canon.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-unprocessed-entities': patch
---
Added confirmation popup for delete entities in Catalog Unprocessed Entities plugin
+17
View File
@@ -0,0 +1,17 @@
---
'@backstage/plugin-auth-backend-module-oidc-provider': patch
---
Added custom timeout setting for oidc provider
Here is an example of how to use a custom timeout with the configuration:
```yaml
auth:
oidc:
production:
clientId: ${AUTH_GOOGLE_CLIENT_ID}
clientSecret: ${AUTH_GOOGLE_CLIENT_SECRET}
timeout:
seconds: 30
```
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-gitlab': patch
---
add filter for repos by membership and topics
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/canon': patch
---
Add global CSS reset for anchor tags.
+234
View File
@@ -0,0 +1,234 @@
{
"mode": "pre",
"tag": "next",
"initialVersions": {
"example-app": "0.2.107",
"@backstage/app-defaults": "1.6.0",
"example-app-next": "0.0.21",
"app-next-example-plugin": "0.0.21",
"example-backend": "0.0.36",
"@backstage/backend-app-api": "1.2.1",
"@backstage/backend-defaults": "0.8.2",
"@backstage/backend-dev-utils": "0.1.5",
"@backstage/backend-dynamic-feature-service": "0.6.1",
"example-backend-legacy": "0.2.108",
"@backstage/backend-openapi-utils": "0.5.1",
"@backstage/backend-plugin-api": "1.2.1",
"@backstage/backend-test-utils": "1.3.1",
"@backstage/canon": "0.2.0",
"@backstage/catalog-client": "1.9.1",
"@backstage/catalog-model": "1.7.3",
"@backstage/cli": "0.31.0",
"@backstage/cli-common": "0.1.15",
"@backstage/cli-node": "0.2.13",
"@backstage/codemods": "0.1.52",
"@backstage/config": "1.3.2",
"@backstage/config-loader": "1.10.0",
"@backstage/core-app-api": "1.16.0",
"@backstage/core-compat-api": "0.4.0",
"@backstage/core-components": "0.17.0",
"@backstage/core-plugin-api": "1.10.5",
"@backstage/create-app": "0.6.0",
"@backstage/dev-utils": "1.1.8",
"e2e-test": "0.2.26",
"@backstage/e2e-test-utils": "0.1.1",
"@backstage/errors": "1.2.7",
"@backstage/eslint-plugin": "0.1.10",
"@backstage/frontend-app-api": "0.11.0",
"@backstage/frontend-defaults": "0.2.0",
"@internal/frontend": "0.0.7",
"@backstage/frontend-plugin-api": "0.10.0",
"@backstage/frontend-test-utils": "0.3.0",
"@backstage/integration": "1.16.2",
"@backstage/integration-aws-node": "0.1.15",
"@backstage/integration-react": "1.2.5",
"@internal/opaque": "0.0.1",
"@backstage/release-manifests": "0.0.12",
"@backstage/repo-tools": "0.13.1",
"@internal/scaffolder": "0.0.7",
"@techdocs/cli": "1.9.1",
"techdocs-cli-embedded-app": "0.2.106",
"@backstage/test-utils": "1.7.6",
"@backstage/theme": "0.6.4",
"@backstage/types": "1.2.1",
"@backstage/version-bridge": "1.0.11",
"yarn-plugin-backstage": "0.0.4",
"@backstage/plugin-api-docs": "0.12.5",
"@backstage/plugin-api-docs-module-protoc-gen-doc": "0.1.9",
"@backstage/plugin-app": "0.1.7",
"@backstage/plugin-app-backend": "0.5.0",
"@backstage/plugin-app-node": "0.1.31",
"@backstage/plugin-app-visualizer": "0.1.17",
"@backstage/plugin-auth-backend": "0.24.4",
"@backstage/plugin-auth-backend-module-atlassian-provider": "0.4.1",
"@backstage/plugin-auth-backend-module-auth0-provider": "0.2.1",
"@backstage/plugin-auth-backend-module-aws-alb-provider": "0.4.1",
"@backstage/plugin-auth-backend-module-azure-easyauth-provider": "0.2.6",
"@backstage/plugin-auth-backend-module-bitbucket-provider": "0.3.1",
"@backstage/plugin-auth-backend-module-bitbucket-server-provider": "0.2.1",
"@backstage/plugin-auth-backend-module-cloudflare-access-provider": "0.4.1",
"@backstage/plugin-auth-backend-module-gcp-iap-provider": "0.4.1",
"@backstage/plugin-auth-backend-module-github-provider": "0.3.1",
"@backstage/plugin-auth-backend-module-gitlab-provider": "0.3.1",
"@backstage/plugin-auth-backend-module-google-provider": "0.3.1",
"@backstage/plugin-auth-backend-module-guest-provider": "0.2.6",
"@backstage/plugin-auth-backend-module-microsoft-provider": "0.3.1",
"@backstage/plugin-auth-backend-module-oauth2-provider": "0.4.1",
"@backstage/plugin-auth-backend-module-oauth2-proxy-provider": "0.2.6",
"@backstage/plugin-auth-backend-module-oidc-provider": "0.4.1",
"@backstage/plugin-auth-backend-module-okta-provider": "0.2.1",
"@backstage/plugin-auth-backend-module-onelogin-provider": "0.3.1",
"@backstage/plugin-auth-backend-module-pinniped-provider": "0.3.1",
"@backstage/plugin-auth-backend-module-vmware-cloud-provider": "0.5.1",
"@backstage/plugin-auth-node": "0.6.1",
"@backstage/plugin-auth-react": "0.1.13",
"@backstage/plugin-bitbucket-cloud-common": "0.2.28",
"@backstage/plugin-catalog": "1.28.0",
"@backstage/plugin-catalog-backend": "1.32.0",
"@backstage/plugin-catalog-backend-module-aws": "0.4.9",
"@backstage/plugin-catalog-backend-module-azure": "0.3.3",
"@backstage/plugin-catalog-backend-module-backstage-openapi": "0.5.0",
"@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.4.6",
"@backstage/plugin-catalog-backend-module-bitbucket-server": "0.3.3",
"@backstage/plugin-catalog-backend-module-gcp": "0.3.6",
"@backstage/plugin-catalog-backend-module-gerrit": "0.3.0",
"@backstage/plugin-catalog-backend-module-github": "0.7.11",
"@backstage/plugin-catalog-backend-module-github-org": "0.3.8",
"@backstage/plugin-catalog-backend-module-gitlab": "0.6.4",
"@backstage/plugin-catalog-backend-module-gitlab-org": "0.2.7",
"@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.6.4",
"@backstage/plugin-catalog-backend-module-ldap": "0.11.3",
"@backstage/plugin-catalog-backend-module-logs": "0.1.8",
"@backstage/plugin-catalog-backend-module-msgraph": "0.6.8",
"@backstage/plugin-catalog-backend-module-openapi": "0.2.8",
"@backstage/plugin-catalog-backend-module-puppetdb": "0.2.8",
"@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.2.6",
"@backstage/plugin-catalog-backend-module-unprocessed": "0.5.6",
"@backstage/plugin-catalog-common": "1.1.3",
"@backstage/plugin-catalog-graph": "0.4.17",
"@backstage/plugin-catalog-import": "0.12.11",
"@backstage/plugin-catalog-node": "1.16.1",
"@backstage/plugin-catalog-react": "1.16.0",
"@backstage/plugin-catalog-unprocessed-entities": "0.2.15",
"@backstage/plugin-catalog-unprocessed-entities-common": "0.0.7",
"@backstage/plugin-config-schema": "0.1.66",
"@backstage/plugin-devtools": "0.1.25",
"@backstage/plugin-devtools-backend": "0.5.3",
"@backstage/plugin-devtools-common": "0.1.15",
"@backstage/plugin-events-backend": "0.5.0",
"@backstage/plugin-events-backend-module-aws-sqs": "0.4.9",
"@backstage/plugin-events-backend-module-azure": "0.2.18",
"@backstage/plugin-events-backend-module-bitbucket-cloud": "0.2.18",
"@backstage/plugin-events-backend-module-gerrit": "0.2.18",
"@backstage/plugin-events-backend-module-github": "0.2.18",
"@backstage/plugin-events-backend-module-gitlab": "0.2.18",
"@backstage/plugin-events-backend-test-utils": "0.1.42",
"@backstage/plugin-events-node": "0.4.9",
"@internal/plugin-todo-list": "1.0.37",
"@internal/plugin-todo-list-backend": "1.0.37",
"@internal/plugin-todo-list-common": "1.0.24",
"@backstage/plugin-home": "0.8.6",
"@backstage/plugin-home-react": "0.1.24",
"@backstage/plugin-kubernetes": "0.12.5",
"@backstage/plugin-kubernetes-backend": "0.19.4",
"@backstage/plugin-kubernetes-cluster": "0.0.23",
"@backstage/plugin-kubernetes-common": "0.9.4",
"@backstage/plugin-kubernetes-node": "0.2.4",
"@backstage/plugin-kubernetes-react": "0.5.5",
"@backstage/plugin-notifications": "0.5.3",
"@backstage/plugin-notifications-backend": "0.5.4",
"@backstage/plugin-notifications-backend-module-email": "0.3.7",
"@backstage/plugin-notifications-common": "0.0.8",
"@backstage/plugin-notifications-node": "0.2.13",
"@backstage/plugin-org": "0.6.37",
"@backstage/plugin-org-react": "0.1.36",
"@backstage/plugin-permission-backend": "0.5.55",
"@backstage/plugin-permission-backend-module-allow-all-policy": "0.2.6",
"@backstage/plugin-permission-common": "0.8.4",
"@backstage/plugin-permission-node": "0.9.0",
"@backstage/plugin-permission-react": "0.4.32",
"@backstage/plugin-proxy-backend": "0.6.0",
"@backstage/plugin-proxy-node": "0.1.2",
"@backstage/plugin-scaffolder": "1.29.0",
"@backstage/plugin-scaffolder-backend": "1.31.0",
"@backstage/plugin-scaffolder-backend-module-azure": "0.2.7",
"@backstage/plugin-scaffolder-backend-module-bitbucket": "0.3.8",
"@backstage/plugin-scaffolder-backend-module-bitbucket-cloud": "0.2.7",
"@backstage/plugin-scaffolder-backend-module-bitbucket-server": "0.2.7",
"@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.3.7",
"@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.3.8",
"@backstage/plugin-scaffolder-backend-module-gcp": "0.2.7",
"@backstage/plugin-scaffolder-backend-module-gerrit": "0.2.7",
"@backstage/plugin-scaffolder-backend-module-gitea": "0.2.7",
"@backstage/plugin-scaffolder-backend-module-github": "0.6.1",
"@backstage/plugin-scaffolder-backend-module-gitlab": "0.8.1",
"@backstage/plugin-scaffolder-backend-module-notifications": "0.1.8",
"@backstage/plugin-scaffolder-backend-module-rails": "0.5.7",
"@backstage/plugin-scaffolder-backend-module-sentry": "0.2.7",
"@backstage/plugin-scaffolder-backend-module-yeoman": "0.4.8",
"@backstage/plugin-scaffolder-common": "1.5.10",
"@backstage/plugin-scaffolder-node": "0.8.0",
"@backstage/plugin-scaffolder-node-test-utils": "0.2.0",
"@backstage/plugin-scaffolder-react": "1.14.6",
"@backstage/plugin-search": "1.4.24",
"@backstage/plugin-search-backend": "2.0.0",
"@backstage/plugin-search-backend-module-catalog": "0.3.2",
"@backstage/plugin-search-backend-module-elasticsearch": "1.7.0",
"@backstage/plugin-search-backend-module-explore": "0.3.0",
"@backstage/plugin-search-backend-module-pg": "0.5.42",
"@backstage/plugin-search-backend-module-stack-overflow-collator": "0.3.7",
"@backstage/plugin-search-backend-module-techdocs": "0.4.0",
"@backstage/plugin-search-backend-node": "1.3.9",
"@backstage/plugin-search-common": "1.2.17",
"@backstage/plugin-search-react": "1.8.7",
"@backstage/plugin-signals": "0.0.17",
"@backstage/plugin-signals-backend": "0.3.2",
"@backstage/plugin-signals-node": "0.1.18",
"@backstage/plugin-signals-react": "0.0.11",
"@backstage/plugin-techdocs": "1.12.4",
"@backstage/plugin-techdocs-addons-test-utils": "1.0.46",
"@backstage/plugin-techdocs-backend": "2.0.0",
"@backstage/plugin-techdocs-common": "0.1.0",
"@backstage/plugin-techdocs-module-addons-contrib": "1.1.22",
"@backstage/plugin-techdocs-node": "1.13.1",
"@backstage/plugin-techdocs-react": "1.2.15",
"@backstage/plugin-user-settings": "0.8.20",
"@backstage/plugin-user-settings-backend": "0.3.0",
"@backstage/plugin-user-settings-common": "0.0.1"
},
"changesets": [
"chilly-sheep-scream",
"clever-tomatoes-jump",
"create-app-1742907012",
"cuddly-dodos-allow",
"cuddly-kids-sell",
"cuddly-mirrors-ask",
"deep-flies-vanish",
"early-feet-lay",
"every-ties-wink",
"famous-dragons-bake",
"funny-hotels-cut",
"giant-donkeys-punch",
"honest-ties-worry",
"itchy-times-behave",
"large-kings-protect",
"lemon-shoes-enter",
"metal-animals-notice",
"odd-bobcats-hang",
"orange-queens-grin",
"sad-pots-try",
"silver-rocks-invite",
"spotty-towns-show",
"strange-planes-kneel",
"sweet-maps-invent",
"swift-boats-add",
"tame-sloths-brake",
"thin-snails-judge",
"tiny-swans-warn",
"twenty-forks-cheat",
"twenty-walls-join",
"wet-penguins-beg",
"wide-planets-camp",
"witty-planets-sing"
]
}
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/canon': patch
---
Fix types on the Icon component.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/integration-react': patch
---
Added scope `project` for Bitbucket Cloud.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/integration': patch
---
Mark GitHub `webhookSecret` config property as optional. A `webhookSecret` is not required when creating a GitHub App.
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-scaffolder-react': minor
'@backstage/plugin-scaffolder': minor
---
add api to retrieve template extensions info from scaffolder-backend
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-unprocessed-entities': patch
---
Fixed the `convertTimeToLocalTimezone` function in the FailedEntities component to correctly parse ISO 8601 date strings and set the timezone to the current local timezone.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch
---
Fixed bug in event-based discovery that caused unnecessary API calls to Bitbucket Cloud
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-techdocs-module-addons-contrib': patch
---
Fixed rendering issues in `ReportIssue` addon for unsupported repository types and improved shadow DOM event handling. The addon now properly prevents initialization when encountering unsupported repository types and correctly handles selection events within the shadow DOM.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
---
fixed misleading example location annotations in docs
@@ -74,7 +74,7 @@ jobs:
- name: Cache Comment
if: ${{ steps.event.outputs.ACTION != 'closed' }}
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4.2.2
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with:
path: comment.md
key: ${{ steps.hash.outputs.COMMENT_FILE_HASH }}
@@ -103,7 +103,7 @@ jobs:
- name: Fetch cached Manifests File
id: cache
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4
with:
path: comment.md
key: ${{ needs.setup.outputs.comment-cache-key }}
+2 -2
View File
@@ -239,7 +239,7 @@ jobs:
# Use the lower-level cache actions for the success cache, so that we can store the cache even on failed builds
- name: restore backstage-cli cache
uses: actions/cache/restore@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4
with:
path: .cache/backstage-cli
key: ${{ runner.os }}-v${{ matrix.node-version }}-backstage-cli-${{ github.run_id }}
@@ -260,7 +260,7 @@ jobs:
# Always save success cache even if there were failures, that way it can be used in re-triggered builds
- name: save backstage-cli cache
uses: actions/cache/save@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4
if: always()
with:
path: .cache/backstage-cli
+5 -5
View File
@@ -92,7 +92,7 @@ jobs:
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: stable-openapi-docs
path: docs/**/*.api.mdx
path: docs/**/api/**/*
if-no-files-found: error
retention-days: 1
@@ -165,7 +165,7 @@ jobs:
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: next-openapi-docs
path: docs/**/*.api.mdx
path: docs/**/api/**/*
if-no-files-found: error
retention-days: 1
@@ -220,7 +220,7 @@ jobs:
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
with:
name: stable-openapi-docs
path: docs/**/*.api.mdx
path: docs
- name: grab lastest releases docs
run: |
@@ -235,7 +235,7 @@ jobs:
run: rm -r docs/reference
- name: clear OpenAPI reference
run: find . -name '*.api.mdx' -type f -delete
run: find ./docs -name '*.api.mdx' -type f -delete
# Next docs
- name: checkout master
@@ -257,7 +257,7 @@ jobs:
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
with:
name: next-openapi-docs
path: docs/**/*.api.mdx
path: docs
- name: build microsite
run: yarn build
+1 -1
View File
@@ -94,7 +94,7 @@ jobs:
run: yarn backstage-cli config:check --lax
- name: backstage-cli cache
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4
with:
path: .cache/backstage-cli
key: ${{ runner.os }}-v${{ matrix.node-version }}-backstage-cli-${{ github.run_id }}
+218 -10
View File
@@ -13,14 +13,178 @@ permissions:
contents: read
jobs:
stable:
runs-on: ubuntu-latest
concurrency:
group: stable-reference-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
CI: true
NODE_OPTIONS: --max-old-space-size=8192
outputs:
release: ${{ steps.find-release.outputs.result }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with:
egress-policy: audit
- name: find latest release
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7
id: find-release
with:
script: |
const { data } = await github.rest.repos.listTags({
owner: context.repo.owner,
repo: context.repo.repo,
per_page: 100,
})
const [{tag}] = data
.map(i => i.name)
.filter(tag => tag.match(/^v\d+\.\d+\.\d+$/))
.map(tag => ({
tag,
val: tag
.slice(1)
.split('.')
.reduce((val, part) => Number(val) * 1000 + Number(part))
}))
.sort((a, b) => b.val - a.val)
return tag
result-encoding: string
- name: checkout latest release
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: refs/tags/${{ steps.find-release.outputs.result }}
- name: Use Node.js 20.x
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
with:
node-version: 20.x
registry-url: https://registry.npmjs.org/ # Needed for auth
- name: yarn install
uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17
with:
cache-prefix: ${{ runner.os }}-v20.x
- name: build API reference
run: yarn build:api-docs
- name: upload API reference
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: stable-reference
path: docs/reference/
if-no-files-found: error
retention-days: 1
- name: microsite yarn install
run: yarn install --immutable
working-directory: microsite
- name: build OpenAPI API docs
working-directory: microsite
run: yarn docusaurus gen-api-docs all
- name: upload OpenAPI API docs
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: stable-openapi-docs
path: docs/**/api/**/*
if-no-files-found: error
retention-days: 1
next:
runs-on: ubuntu-latest
concurrency:
group: next-reference-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
CI: true
NODE_OPTIONS: --max-old-space-size=8192
steps:
- name: Harden Runner
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with:
egress-policy: audit
- name: checkout master
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Use Node.js 20.x
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
with:
node-version: 20.x
registry-url: https://registry.npmjs.org/ # Needed for auth
- name: yarn install
uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17
with:
cache-prefix: ${{ runner.os }}-v20.x
- name: build API reference
run: yarn build:api-docs
- name: upload API reference
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: next-reference
path: docs/reference/
if-no-files-found: error
retention-days: 1
# Also build and upload storybook
- name: storybook yarn install
run: yarn install --immutable
working-directory: storybook
- name: storybook build
run: yarn build-storybook
working-directory: storybook
- name: storybook upload
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: storybook
path: storybook/dist/
if-no-files-found: error
retention-days: 1
- name: microsite yarn install
run: yarn install --immutable
working-directory: microsite
- name: build OpenAPI API docs
working-directory: microsite
run: yarn docusaurus gen-api-docs all
- name: upload OpenAPI API docs
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: next-openapi-docs
path: docs/**/api/**/*
if-no-files-found: error
retention-days: 1
build-microsite:
runs-on: ubuntu-latest
env:
CI: true
NODE_OPTIONS: --max-old-space-size=8192
NODE_OPTIONS: --max-old-space-size=16384
DOCUSAURUS_SSR_CONCURRENCY: 5
needs:
- stable
- next
name: Microsite
steps:
- name: Harden Runner
@@ -50,19 +214,63 @@ jobs:
run: yarn install --immutable
working-directory: microsite
- name: build API reference
run: yarn build:api-docs
- name: Build MkDocs for TechDocs
run: mkdocs build --strict
- name: verify yarn dependency duplicates
run: node scripts/verify-lockfile-duplicates.js
- name: prettier
run: yarn prettier:check
working-directory: microsite
- name: verify yarn dependency duplicates
run: node scripts/verify-lockfile-duplicates.js
- name: download stable reference
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
with:
name: stable-reference
path: docs/reference
- name: download stable OpenAPI API docs
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
with:
name: stable-openapi-docs
path: docs
- name: grab lastest releases docs
run: |
git fetch origin master --depth 1
git checkout FETCH_HEAD -- docs/releases
- name: generate stable docs
run: yarn docusaurus docs:version stable
working-directory: microsite
- name: clear API reference
run: rm -r docs/reference
- name: clear OpenAPI reference
run: find ./docs -name '*.api.mdx' -type f -delete
- name: build API reference
run: yarn build:api-docs
- name: checkout master
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
clean: false
- name: Build MkDocs for TechDocs
run: mkdocs build --strict
- name: download next reference
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
with:
name: next-reference
path: docs/reference
- name: download next OpenAPI API docs
uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4
with:
name: next-openapi-docs
path: docs
- name: build microsite
run: yarn build
working-directory: microsite
+3 -3
View File
@@ -14,16 +14,16 @@
"@mdx-js/loader": "^3.1.0",
"@mdx-js/react": "^3.1.0",
"@next/mdx": "^15.1.4",
"@storybook/react": "^8.4.7",
"@storybook/react": "^8.6.8",
"@uiw/codemirror-themes": "^4.23.7",
"@uiw/react-codemirror": "^4.23.7",
"motion": "^12.4.1",
"next": "14.2.23",
"next": "14.2.25",
"react": "^18.0.2",
"react-dom": "^18.0.2",
"react-frame-component": "^5.2.7",
"shiki": "^1.26.1",
"storybook": "^8.4.7"
"storybook": "^8.6.8"
},
"devDependencies": {
"@types/mdx": "^2.0.13",
@@ -2,7 +2,7 @@ import { CodeBlock } from '@/components/CodeBlock';
import { PropsTable } from '@/components/PropsTable';
import { Tabs } from '@/components/Tabs';
import { Snippet } from '@/components/Snippet';
import { BoxPreview } from '@/snippets/box';
import { BoxSnippet } from '@/snippets/stories-snippets';
import { boxPropDefs } from './props';
import { spacingPropDefs } from '../../../../utils/propDefs';
@@ -12,7 +12,7 @@ Box is the lowest-level component in Canon. It provides a consistent API for sty
<Snippet
py={4}
preview={<BoxPreview />}
preview={<BoxSnippet story="Preview" />}
code={`<Box>
<DecorativeBox />
</Box>`}
@@ -2,15 +2,8 @@ import { PropsTable } from '@/components/PropsTable';
import { Snippet } from '@/components/Snippet';
import { Tabs } from '@/components/Tabs';
import { CodeBlock } from '@/components/CodeBlock';
import {
ButtonPreview,
ButtonSizes,
ButtonWithIcons,
ButtonFullWidth,
ButtonDisabled,
ButtonResponsive,
} from '@/snippets/button';
import { buttonVariants } from '@/snippets/_snippets';
import { ButtonSnippet } from '@/snippets/stories-snippets';
import { buttonVariants } from '@/snippets/code-snippets';
import { buttonPropDefs } from './props';
# Button
@@ -20,7 +13,7 @@ A button component that can be used to trigger actions.
<Snippet
align="center"
py={4}
preview={<ButtonPreview />}
preview={<ButtonSnippet story="Variants" />}
code={`<Inline alignY="center">
<Button iconStart="cloud" variant="primary">
Button
@@ -71,7 +64,7 @@ Here's a view when buttons have different variants.
align="center"
py={4}
open
preview={<ButtonPreview />}
preview={<ButtonSnippet story="Variants" />}
code={buttonVariants}
/>
@@ -83,7 +76,7 @@ Here's a view when buttons have different sizes.
align="center"
py={4}
open
preview={<ButtonSizes />}
preview={<ButtonSnippet story="Sizes" />}
code={`<Inline alignY="center">
<Button size="small">Small</Button>
<Button size="medium">Medium</Button>
@@ -98,7 +91,7 @@ Here's a view when buttons have icons.
align="center"
py={4}
open
preview={<ButtonWithIcons />}
preview={<ButtonSnippet story="WithIcons" />}
code={`<Inline alignY="center">
<Button iconStart="cloud">Button</Button>
<Button iconEnd="chevronRight">Button</Button>
@@ -114,7 +107,7 @@ Here's a view when buttons are full width.
align="center"
py={4}
open
preview={<ButtonFullWidth />}
preview={<ButtonSnippet story="FullWidth" />}
code={`<Flex style={{ width: '300px' }}>
<Button fullWidth>Full width</Button>
</Flex>`}
@@ -128,7 +121,7 @@ Here's a view when buttons are disabled.
align="center"
py={4}
open
preview={<ButtonDisabled />}
preview={<ButtonSnippet story="Disabled" />}
code={`<Button disabled>Button</Button>`}
/>
@@ -136,11 +129,7 @@ Here's a view when buttons are disabled.
Here's a view when buttons are responsive.
<Snippet
align="center"
py={4}
open
preview={<ButtonResponsive />}
<CodeBlock
code={`<Button variant={{ initial: 'primary', lg: 'secondary' }}>
Responsive Button
</Button>`}
@@ -1,5 +1,5 @@
import { PropsTable } from '@/components/PropsTable';
import { CheckboxPreview, CheckboxAllVariants } from '@/snippets/checkbox';
import { CheckboxSnippet } from '@/snippets/stories-snippets';
import { Snippet } from '@/components/Snippet';
import { Tabs } from '@/components/Tabs';
import { CodeBlock } from '@/components/CodeBlock';
@@ -11,8 +11,9 @@ import { checkboxPropDefs } from './props';
A checkbox component that can be used to trigger actions.
<Snippet
align="center"
py={4}
preview={<CheckboxPreview />}
preview={<CheckboxSnippet story="Default" />}
code={`<Checkbox label="Accept terms and conditions" />`}
/>
@@ -55,7 +56,7 @@ Here's a view when checkboxes have different variants.
align="center"
py={4}
open
preview={<CheckboxAllVariants />}
preview={<CheckboxSnippet story="AllVariants" />}
code={`<Inline alignY="center">
<Checkbox />
<Checkbox checked />
@@ -2,7 +2,7 @@ import { CodeBlock } from '@/components/CodeBlock';
import { PropsTable } from '@/components/PropsTable';
import { Tabs } from '@/components/Tabs';
import { Snippet } from '@/components/Snippet';
import { ContainerPreview } from '@/snippets/container';
import { ContainerSnippet } from '@/snippets/stories-snippets';
import { containerPropDefs } from './props';
# Container
@@ -12,7 +12,7 @@ content on the page.
<Snippet
py={4}
preview={<ContainerPreview />}
preview={<ContainerSnippet story="Preview" />}
code={`<Container>
<DecorativeBox />
</Container>`}
@@ -2,7 +2,7 @@ import { PropsTable } from '@/components/PropsTable';
import { Snippet } from '@/components/Snippet';
import { Tabs } from '@/components/Tabs';
import { CodeBlock } from '@/components/CodeBlock';
import { FieldPreview } from '@/snippets/field';
import { FieldSnippet } from '@/snippets/stories-snippets';
import { BaseUI } from '@/components/HeadlessBanners/BaseUI';
import {
fieldRootPropDefs,
@@ -15,7 +15,12 @@ import {
A wrapper around `Input` or `Select` component to add label, description and error messages..
<Snippet align="center" py={4} preview={<FieldPreview />} code={`<Field />`} />
<Snippet
align="center"
py={4}
preview={<FieldSnippet story="Default" />}
code={`<Field />`}
/>
<Tabs.Root>
<Tabs.List>
@@ -85,7 +90,7 @@ Here's a simple input with a label and description.
align="center"
py={4}
open
preview={<FieldPreview />}
preview={<FieldSnippet story="WithLabelAndDescription" />}
code={`<Field>
<Field.Label>Name</Field.Label>
<Field.Description>Visible on your profile</Field.Description>
@@ -6,9 +6,9 @@ import {
flexSimple,
flexResponsive,
flexAlign,
} from '@/snippets/_snippets';
} from '@/snippets/code-snippets';
import { Snippet } from '@/components/Snippet';
import { FlexPreview } from '@/snippets/flex';
import { FlexSnippet } from '@/snippets/stories-snippets';
import { flexPropDefs } from './props';
import { spacingPropDefs } from '../../../../utils/propDefs';
@@ -21,7 +21,7 @@ columns. All values are responsive.
<Snippet
py={4}
align="center"
preview={<FlexPreview />}
preview={<FlexSnippet story="Default" />}
code={`<Flex>
<DecorativeBox />
<DecorativeBox />
@@ -1,9 +1,9 @@
import { CodeBlock } from '@/components/CodeBlock';
import { PropsTable } from '@/components/PropsTable';
import { Tabs } from '@/components/Tabs';
import { grid } from '@/snippets/_snippets';
import { grid } from '@/snippets/code-snippets';
import { Snippet } from '@/components/Snippet';
import { GridPreview } from '@/snippets/grid';
import { GridSnippet } from '@/snippets/stories-snippets';
import { spacingPropDefs } from '../../../../utils/propDefs';
import { gridPropDefs, gridItemPropDefs } from './props';
@@ -14,7 +14,7 @@ more complex ones.
<Snippet
py={4}
preview={<GridPreview />}
preview={<GridSnippet story="Default" />}
code={`<Grid>
<DecorativeBox />
<DecorativeBox />
@@ -1,9 +1,5 @@
import { PropsTable } from '@/components/PropsTable';
import {
HeadingPreview,
HeadingAllVariants,
HeadingResponsive,
} from '@/snippets/heading';
import { HeadingSnippet } from '@/snippets/stories-snippets';
import { Snippet } from '@/components/Snippet';
import { Tabs } from '@/components/Tabs';
import { CodeBlock } from '@/components/CodeBlock';
@@ -15,7 +11,7 @@ Headings are used to structure the content of your page.
<Snippet
py={4}
preview={<HeadingPreview />}
preview={<HeadingSnippet story="Title1" />}
code={`<Heading variant="title1">Hello World!</Heading>`}
/>
@@ -56,7 +52,7 @@ appearance of the heading.
<Snippet
py={2}
open
preview={<HeadingAllVariants />}
preview={<HeadingSnippet story="AllVariants" />}
code={`<Flex direction="column" gap="4">
<Heading variant="display">Display</Heading>
<Heading variant="title1">Title 1</Heading>
@@ -71,10 +67,7 @@ appearance of the heading.
You can also use the `variant` prop to change the appearance of the text based
on the screen size.
<Snippet
py={4}
open
preview={<HeadingResponsive />}
<CodeBlock
code={`<Heading variant={{ initial: 'title2', lg: 'title1' }}>
Responsive heading
</Heading>`}
@@ -2,13 +2,8 @@ import { PropsTable } from '@/components/PropsTable';
import { Snippet } from '@/components/Snippet';
import { Tabs } from '@/components/Tabs';
import { CodeBlock } from '@/components/CodeBlock';
import {
IconButtonPreview,
IconButtonSizes,
IconButtonDisabled,
IconButtonResponsive,
} from '@/snippets/icon-button';
import { iconButtonVariants } from '@/snippets/_snippets';
import { IconButtonSnippet } from '@/snippets/stories-snippets';
import { iconButtonVariants } from '@/snippets/code-snippets';
import { iconButtonPropDefs } from './props';
# Icon Button
@@ -18,11 +13,11 @@ A button component with a single icon that can be used to trigger actions.
<Snippet
align="center"
py={4}
preview={<IconButtonPreview />}
preview={<IconButtonSnippet story="Variants" />}
code={`<Flex align="center">
<IconButton icon="cloud" variant="primary" />
<IconButton icon="cloud" variant="secondary" />
</Flex>`}
</Flex>`}
/>
<Tabs.Root>
@@ -62,7 +57,7 @@ Here's a view when buttons have different variants.
align="center"
py={4}
open
preview={<IconButtonPreview />}
preview={<IconButtonSnippet story="Variants" />}
code={iconButtonVariants}
/>
@@ -74,7 +69,7 @@ Here's a view when buttons have different sizes.
align="center"
py={4}
open
preview={<IconButtonSizes />}
preview={<IconButtonSnippet story="Sizes" />}
code={`<Flex align="center">
<IconButton icon="cloud" size="small" />
<IconButton icon="cloud" size="medium" />
@@ -89,7 +84,7 @@ Here's a view when buttons are disabled.
align="center"
py={4}
open
preview={<IconButtonDisabled />}
preview={<IconButtonSnippet story="Disabled" />}
code={`<IconButton icon="cloud" disabled />`}
/>
@@ -97,10 +92,6 @@ Here's a view when buttons are disabled.
Here's a view when buttons are responsive.
<Snippet
align="center"
py={4}
open
preview={<IconButtonResponsive />}
<CodeBlock
code={`<IconButton icon="cloud" variant={{ initial: 'primary', lg: 'secondary' }} />`}
/>
@@ -1,5 +1,5 @@
import { PropsTable } from '@/components/PropsTable';
import { IconPreview } from '@/snippets/icon';
import { IconSnippet } from '@/snippets/stories-snippets';
import { Snippet } from '@/components/Snippet';
import { Tabs } from '@/components/Tabs';
import { CodeBlock } from '@/components/CodeBlock';
@@ -12,7 +12,7 @@ Icons are used to represent an action or a state.
<Snippet
py={4}
align="center"
preview={<IconPreview />}
preview={<IconSnippet story="Default" />}
code={`<Icon name="heart" />`}
/>
@@ -2,7 +2,7 @@ import { PropsTable } from '@/components/PropsTable';
import { Snippet } from '@/components/Snippet';
import { Tabs } from '@/components/Tabs';
import { CodeBlock } from '@/components/CodeBlock';
import { InputPreview, InputSizes } from '@/snippets/input';
import { InputSnippet } from '@/snippets/stories-snippets';
import { BaseUI } from '@/components/HeadlessBanners/BaseUI';
import { inputPropDefs } from './props';
@@ -13,7 +13,7 @@ A input component tfor your forms.
<Snippet
align="center"
py={4}
preview={<InputPreview />}
preview={<InputSnippet story="Primary" />}
code={`<Input label="Name" placeholder="Enter your name" />`}
/>
@@ -55,7 +55,7 @@ Here's a simple input with a label and description.
align="center"
py={4}
open
preview={<InputSizes />}
preview={<InputSnippet story="Sizes" />}
code={`<Grid>
<Input size="sm" placeholder="Small" />
<Input size="md" placeholder="Medium" />
@@ -1,10 +1,5 @@
import { PropsTable } from '@/components/PropsTable';
import {
TextPreview,
TextAllVariants,
TextResponsive,
TextAllWeights,
} from '@/snippets/text';
import { TextSnippet } from '@/snippets/stories-snippets';
import { Snippet } from '@/components/Snippet';
import { Tabs } from '@/components/Tabs';
import { CodeBlock } from '@/components/CodeBlock';
@@ -16,7 +11,7 @@ The `Text` component is used to display content on your page.
<Snippet
py={4}
preview={<TextPreview />}
preview={<TextSnippet story="Default" />}
code={`<Text style={{ maxWidth: '600px' }}>
A man looks at a painting in a museum and says, “Brothers and sisters I
have none, but that man&apos;s father is my father&apos;s son.” Who is in
@@ -60,7 +55,7 @@ appearance of the text.
<Snippet
open
preview={<TextAllVariants />}
preview={<TextSnippet story="AllVariants" />}
code={`<Flex direction="column" gap="4">
<Text variant="subtitle" style={{ maxWidth: '600px' }}>
A man looks at a painting in a museum and says, “Brothers and sisters I
@@ -92,7 +87,7 @@ appearance of the text.
<Snippet
open
preview={<TextAllWeights />}
preview={<TextSnippet story="AllWeights" />}
code={`<Flex direction="column" gap="4">
<Text weight="regular" style={{ maxWidth: '600px' }}>
A man looks at a painting in a museum and says, “Brothers and sisters I
@@ -112,9 +107,7 @@ appearance of the text.
You can also use the `variant` prop to change the appearance of the text based
on the screen size.
<Snippet
open
preview={<TextResponsive />}
<CodeBlock
code={`<Text variant={{ initial: 'body', lg: 'subtitle' }}>
Responsive text
</Text>`}
@@ -1,7 +1,7 @@
import { CodeBlock } from '@/components/CodeBlock';
import * as Table from '@/components/Table';
import { Chip } from '@/components/Chip';
import { customTheme } from '@/snippets/_snippets';
import { customTheme } from '@/snippets/code-snippets';
# Theming
@@ -1,5 +1,4 @@
import { HeadingAllVariants } from '@/snippets/heading';
import { TextAllVariants } from '@/snippets/text';
import { HeadingSnippet, TextSnippet } from '@/snippets/stories-snippets';
import { Snippet } from '@/components/Snippet';
# Typography
@@ -20,7 +19,7 @@ component](?path=/docs/components-heading--docs).
<Snippet
py={2}
open
preview={<HeadingAllVariants />}
preview={<HeadingSnippet story="AllVariants" />}
code={`<Flex direction="column" gap="4">
<Heading variant="display">Display</Heading>
<Heading variant="title1">Title 1</Heading>
@@ -40,7 +39,7 @@ page.
<Snippet
open
preview={<TextAllVariants />}
preview={<TextSnippet story="AllVariants" />}
code={`<Flex direction="column" gap="4">
<Text variant="subtitle" style={{ maxWidth: '600px' }}>
A man looks at a painting in a museum and says, “Brothers and sisters I
@@ -5,10 +5,12 @@ import { Grid, Flex, Text } from '../../../../../packages/canon';
import { screenSizes } from '@/utils/data';
import { Frame } from '@/components/Frame';
import { usePlayground } from '@/utils/playground-context';
import { ButtonPlayground } from '@/snippets/button';
import { CheckboxPlayground } from '@/snippets/checkbox';
import { HeadingPlayground } from '@/snippets/heading';
import { TextPlayground } from '@/snippets/text';
import {
ButtonSnippet,
CheckboxSnippet,
HeadingSnippet,
TextSnippet,
} from '@/snippets/stories-snippets';
import styles from './styles.module.css';
@@ -55,16 +57,19 @@ const Content = () => {
return (
<Flex direction="column" gap="4">
{selectedComponents.find(c => c === 'button') && (
<Line content={<ButtonPlayground />} title="Button" />
<Line content={<ButtonSnippet story="Playground" />} title="Button" />
)}
{selectedComponents.find(c => c === 'checkbox') && (
<Line content={<CheckboxPlayground />} title="Checkbox" />
<Line
content={<CheckboxSnippet story="Playground" />}
title="Checkbox"
/>
)}
{selectedComponents.find(c => c === 'heading') && (
<Line content={<HeadingPlayground />} title="Heading" />
<Line content={<HeadingSnippet story="Playground" />} title="Heading" />
)}
{selectedComponents.find(c => c === 'text') && (
<Line content={<TextPlayground />} title="Text" />
<Line content={<TextSnippet story="Playground" />} title="Text" />
)}
{/* {selectedComponents.find(c => c === 'input') && (
<Line content={<InputPlayground />} title="Input" />
-20
View File
@@ -1,20 +0,0 @@
'use client';
import { Box } from '../../../packages/canon';
export const BoxPreview = () => {
return (
<Box
style={{
width: '64px',
height: '64px',
background: '#eaf2fd',
borderRadius: '4px',
border: '1px solid #2563eb',
color: '#2563eb',
backgroundImage:
'url("data:image/svg+xml,%3Csvg%20width%3D%226%22%20height%3D%226%22%20viewBox%3D%220%200%206%206%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cg%20fill%3D%22%232563eb%22%20fill-opacity%3D%220.3%22%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M5%200h1L0%206V5zM6%205v1H5z%22/%3E%3C/g%3E%3C/svg%3E")',
}}
/>
);
};
-102
View File
@@ -1,102 +0,0 @@
'use client';
import { Button, Flex, ButtonProps, Text } from '../../../packages/canon';
export const ButtonPreview = () => {
return (
<Flex align="center">
<Button iconStart="cloud" variant="primary">
Button
</Button>
<Button iconStart="cloud" variant="secondary">
Button
</Button>
</Flex>
);
};
export const ButtonSizes = () => {
return (
<Flex align="center">
<Button size="medium">Medium</Button>
<Button size="small">Small</Button>
</Flex>
);
};
export const ButtonWithIcons = () => {
return (
<Flex align="center">
<Button iconStart="cloud">Button</Button>
<Button iconEnd="chevron-right">Button</Button>
<Button iconStart="cloud" iconEnd="chevron-right">
Button
</Button>
</Flex>
);
};
export const ButtonFullWidth = () => {
return (
<Flex direction="column" style={{ width: '300px' }}>
<Button iconStart="cloud">Button</Button>
<Button iconEnd="chevron-right">Button</Button>
<Button iconStart="cloud" iconEnd="chevron-right">
Button
</Button>
</Flex>
);
};
export const ButtonDisabled = () => {
return <Button disabled>Button</Button>;
};
export const ButtonResponsive = () => {
return (
<Button variant={{ initial: 'primary', lg: 'secondary' }}>
Responsive Button
</Button>
);
};
export const ButtonPlayground = () => {
const variants: string[] = ['primary', 'secondary', 'tertiary'];
return (
<Flex direction="column">
{variants.map(variant => (
<Flex direction="column" key={variant}>
<Text>{variant}</Text>
{['small', 'medium'].map(size => (
<Flex align="center" key={size}>
<Button
iconStart="cloud"
variant={variant as ButtonProps['variant']}
size={size as ButtonProps['size']}
>
Button
</Button>
<Button
iconEnd="chevron-right"
variant={variant as ButtonProps['variant']}
size={size as ButtonProps['size']}
>
Button
</Button>
<Button
iconStart="cloud"
iconEnd="chevron-right"
style={{ width: '200px' }}
variant={variant as ButtonProps['variant']}
size={size as ButtonProps['size']}
>
Button
</Button>
</Flex>
))}
</Flex>
))}
</Flex>
);
};
-32
View File
@@ -1,32 +0,0 @@
'use client';
import { Checkbox, Flex, Text } from '../../../packages/canon';
export const CheckboxPreview = () => {
return <Checkbox label="Accept terms and conditions" />;
};
export const CheckboxAllVariants = () => {
return (
<Flex align="center">
<Checkbox />
<Checkbox checked />
<Checkbox label="Checkbox" />
<Checkbox label="Checkbox" checked />
</Flex>
);
};
export const CheckboxPlayground = () => {
return (
<Flex direction="column">
<Text>All variants</Text>
<Flex align="center">
<Checkbox />
<Checkbox checked />
<Checkbox label="Checkbox" />
<Checkbox label="Checkbox" checked />
</Flex>
</Flex>
);
};
-24
View File
@@ -1,24 +0,0 @@
'use client';
import { Box, Container } from '../../../packages/canon';
const DecorativeBox = () => (
<Box
style={{
height: '64px',
background: '#eaf2fd',
borderRadius: '4px',
border: '1px solid #2563eb',
backgroundImage:
'url("data:image/svg+xml,%3Csvg%20width%3D%226%22%20height%3D%226%22%20viewBox%3D%220%200%206%206%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cg%20fill%3D%22%232563eb%22%20fill-opacity%3D%220.3%22%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M5%200h1L0%206V5zM6%205v1H5z%22/%3E%3C/g%3E%3C/svg%3E")',
}}
/>
);
export const ContainerPreview = () => {
return (
<Container>
<DecorativeBox />
</Container>
);
};
-23
View File
@@ -1,23 +0,0 @@
'use client';
import { Input, Field } from '../../../packages/canon';
export const FieldPreview = () => {
return (
<div style={{ width: '300px' }}>
<Field.Root>
<Field.Label>Name</Field.Label>
<Input placeholder="Enter your name" />
<Field.Description>Visible on your profile</Field.Description>
</Field.Root>
</div>
);
};
export const InputPlayground = () => {
return (
<div style={{ maxWidth: '300px' }}>
<Input placeholder="Enter your name" />
</div>
);
};
-31
View File
@@ -1,31 +0,0 @@
'use client';
import { Flex } from '../../../packages/canon';
const DecorativeBox = () => {
return (
<div
style={{
background: '#eaf2fd',
borderRadius: '4px',
boxShadow: '0 0 0 1px #2563eb',
height: '32px',
minWidth: '100px',
backgroundImage:
'url("data:image/svg+xml,%3Csvg%20width%3D%226%22%20height%3D%226%22%20viewBox%3D%220%200%206%206%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cg%20fill%3D%22%232563eb%22%20fill-opacity%3D%220.3%22%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M5%200h1L0%206V5zM6%205v1H5z%22/%3E%3C/g%3E%3C/svg%3E")',
}}
/>
);
};
export const FlexPreview = () => {
return (
<div style={{ width: '320px' }}>
<Flex>
<DecorativeBox />
<DecorativeBox />
<DecorativeBox />
</Flex>
</div>
);
};
-26
View File
@@ -1,26 +0,0 @@
'use client';
import { Box, Grid } from '../../../packages/canon';
const FakeBox = () => (
<Box
style={{
background: '#eaf2fd',
borderRadius: '4px',
boxShadow: '0 0 0 1px #2563eb',
height: '64px',
backgroundImage:
'url("data:image/svg+xml,%3Csvg%20width%3D%226%22%20height%3D%226%22%20viewBox%3D%220%200%206%206%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cg%20fill%3D%22%232563eb%22%20fill-opacity%3D%220.3%22%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M5%200h1L0%206V5zM6%205v1H5z%22/%3E%3C/g%3E%3C/svg%3E")',
}}
/>
);
export const GridPreview = () => {
return (
<Grid>
<FakeBox />
<FakeBox />
<FakeBox />
</Grid>
);
};
-42
View File
@@ -1,42 +0,0 @@
'use client';
import { Heading, Flex, Text } from '../../../packages/canon';
export const HeadingPreview = () => {
return <Heading>Look mum, no hands!</Heading>;
};
export const HeadingAllVariants = () => {
return (
<Flex direction="column">
<Heading variant="display">Display</Heading>
<Heading variant="title1">Title 1</Heading>
<Heading variant="title2">Title 2</Heading>
<Heading variant="title3">Title 3</Heading>
<Heading variant="title4">Title 4</Heading>
</Flex>
);
};
export const HeadingResponsive = () => {
return (
<Flex direction="column">
<Heading variant={{ initial: 'title2', lg: 'title1' }}>
Responsive heading
</Heading>
</Flex>
);
};
export const HeadingPlayground = () => {
return (
<Flex direction="column">
<Text>All variants</Text>
<Heading variant="display">Display</Heading>
<Heading variant="title1">Title 1</Heading>
<Heading variant="title2">Title 2</Heading>
<Heading variant="title3">Title 3</Heading>
<Heading variant="title4">Title 4</Heading>
</Flex>
);
};
-57
View File
@@ -1,57 +0,0 @@
'use client';
import { IconButton, Flex, ButtonProps, Text } from '../../../packages/canon';
export const IconButtonPreview = () => {
return (
<Flex align="center">
<IconButton icon="cloud" variant="primary" />
<IconButton icon="cloud" variant="secondary" />
</Flex>
);
};
export const IconButtonSizes = () => {
return (
<Flex align="center">
<IconButton icon="cloud" size="medium" />
<IconButton icon="cloud" size="small" />
</Flex>
);
};
export const IconButtonDisabled = () => {
return <IconButton icon="cloud" disabled />;
};
export const IconButtonResponsive = () => {
return (
<IconButton
icon="cloud"
variant={{ initial: 'primary', lg: 'secondary' }}
/>
);
};
export const IconButtonPlayground = () => {
const variants: string[] = ['primary', 'secondary'];
return (
<Flex direction="column">
{variants.map(variant => (
<Flex direction="column" key={variant}>
<Text>{variant}</Text>
{['small', 'medium'].map(size => (
<Flex align="center" key={size}>
<IconButton
icon="cloud"
variant={variant as ButtonProps['variant']}
size={size as ButtonProps['size']}
/>
</Flex>
))}
</Flex>
))}
</Flex>
);
};
-7
View File
@@ -1,7 +0,0 @@
'use client';
import { Icon } from '../../../packages/canon';
export const IconPreview = () => {
return <Icon name="heart" />;
};
-47
View File
@@ -1,47 +0,0 @@
'use client';
import { Box, Flex } from '../../../packages/canon';
const fakeBlockList = [
{ width: 45, height: 60 },
{ width: 150, height: 75 },
{ width: 80, height: 50 },
{ width: 120, height: 70 },
{ width: 95, height: 65 },
{ width: 80, height: 32 },
{ width: 130, height: 60 },
{ width: 100, height: 80 },
{ width: 140, height: 45 },
{ width: 85, height: 70 },
{ width: 125, height: 50 },
];
const FakeBox = ({
width = 120,
height = 80,
}: {
width?: number;
height?: number;
}) => (
<Box
style={{
background: '#eaf2fd',
borderRadius: '4px',
boxShadow: '0 0 0 1px #2563eb',
width,
height,
backgroundImage:
'url("data:image/svg+xml,%3Csvg%20width%3D%226%22%20height%3D%226%22%20viewBox%3D%220%200%206%206%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cg%20fill%3D%22%232563eb%22%20fill-opacity%3D%220.3%22%20fill-rule%3D%22evenodd%22%3E%3Cpath%20d%3D%22M5%200h1L0%206V5zM6%205v1H5z%22/%3E%3C/g%3E%3C/svg%3E")',
}}
/>
);
export const InlinePreview = () => {
return (
<Flex>
{fakeBlockList.map((block, index) => (
<FakeBox key={index} width={block.width} height={block.height} />
))}
</Flex>
);
};
-36
View File
@@ -1,36 +0,0 @@
'use client';
import { Input, Grid } from '../../../packages/canon';
export const InputPreview = () => {
return (
<div style={{ width: '300px' }}>
<Input placeholder="Enter your name" />
</div>
);
};
export const InputSizes = () => {
return (
<Grid style={{ width: '300px' }}>
<Input size="sm" placeholder="Small" />
<Input size="md" placeholder="Medium" />
</Grid>
);
};
export const InputError = () => {
return (
<div style={{ width: '300px' }}>
<Input required />
</div>
);
};
export const InputPlayground = () => {
return (
<div style={{ maxWidth: '300px' }}>
<Input placeholder="Enter your name" />
</div>
);
};
@@ -0,0 +1,127 @@
'use client';
import { composeStories } from '@storybook/react';
import * as BoxStories from '../../../packages/canon/src/components/Box/Box.stories';
import * as ButtonStories from '../../../packages/canon/src/components/Button/Button.stories';
import * as CheckboxStories from '../../../packages/canon/src/components/Checkbox/Checkbox.stories';
import * as ContainerStories from '../../../packages/canon/src/components/Container/Container.stories';
import * as FieldStories from '../../../packages/canon/src/components/Field/Field.stories';
import * as GridStories from '../../../packages/canon/src/components/Grid/Grid.stories';
import * as HeadingStories from '../../../packages/canon/src/components/Heading/Heading.stories';
import * as IconButtonStories from '../../../packages/canon/src/components/IconButton/IconButton.stories';
import * as IconStories from '../../../packages/canon/src/components/Icon/Icon.stories';
import * as InputStories from '../../../packages/canon/src/components/Input/Input.stories';
import * as TextStories from '../../../packages/canon/src/components/Text/Text.stories';
import * as FlexStories from '../../../packages/canon/src/components/Flex/Flex.stories';
export const BoxSnippet = ({ story }: { story: keyof typeof BoxStories }) => {
const stories = composeStories(BoxStories);
const StoryComponent = stories[story as keyof typeof stories];
return StoryComponent ? <StoryComponent /> : null;
};
export const ButtonSnippet = ({
story,
}: {
story: keyof typeof ButtonStories;
}) => {
const stories = composeStories(ButtonStories);
const StoryComponent = stories[story as keyof typeof stories];
return StoryComponent ? <StoryComponent /> : null;
};
export const CheckboxSnippet = ({
story,
}: {
story: keyof typeof CheckboxStories;
}) => {
const stories = composeStories(CheckboxStories);
const StoryComponent = stories[story as keyof typeof stories];
return StoryComponent ? <StoryComponent /> : null;
};
export const ContainerSnippet = ({
story,
}: {
story: keyof typeof ContainerStories;
}) => {
const stories = composeStories(ContainerStories);
const StoryComponent = stories[story as keyof typeof stories];
return StoryComponent ? <StoryComponent /> : null;
};
export const FlexSnippet = ({ story }: { story: keyof typeof FlexStories }) => {
const stories = composeStories(FlexStories);
const StoryComponent = stories[story as keyof typeof stories];
return StoryComponent ? <StoryComponent /> : null;
};
export const FieldSnippet = ({
story,
}: {
story: keyof typeof FieldStories;
}) => {
const stories = composeStories(FieldStories);
const StoryComponent = stories[story as keyof typeof stories];
return StoryComponent ? <StoryComponent /> : null;
};
export const GridSnippet = ({ story }: { story: keyof typeof GridStories }) => {
const stories = composeStories(GridStories);
const StoryComponent = stories[story as keyof typeof stories];
return StoryComponent ? <StoryComponent /> : null;
};
export const HeadingSnippet = ({
story,
}: {
story: keyof typeof HeadingStories;
}) => {
const stories = composeStories(HeadingStories);
const StoryComponent = stories[story as keyof typeof stories];
return StoryComponent ? <StoryComponent /> : null;
};
export const IconButtonSnippet = ({
story,
}: {
story: keyof typeof IconButtonStories;
}) => {
const stories = composeStories(IconButtonStories);
const StoryComponent = stories[story as keyof typeof stories];
return StoryComponent ? <StoryComponent /> : null;
};
export const IconSnippet = ({ story }: { story: keyof typeof IconStories }) => {
const stories = composeStories(IconStories);
const StoryComponent = stories[story as keyof typeof stories];
return StoryComponent ? <StoryComponent /> : null;
};
export const InputSnippet = ({
story,
}: {
story: keyof typeof InputStories;
}) => {
const stories = composeStories(InputStories);
const StoryComponent = stories[story as keyof typeof stories];
return StoryComponent ? <StoryComponent /> : null;
};
export const TextSnippet = ({ story }: { story: keyof typeof TextStories }) => {
const stories = composeStories(TextStories);
const StoryComponent = stories[story as keyof typeof stories];
return StoryComponent ? <StoryComponent /> : null;
};
-94
View File
@@ -1,94 +0,0 @@
'use client';
import { Flex, Text } from '../../../packages/canon';
export const TextPreview = () => {
return (
<Text style={{ maxWidth: '600px' }}>
A man looks at a painting in a museum and says, Brothers and sisters I
have none, but that man&apos;s father is my father&apos;s son. Who is in
the painting?
</Text>
);
};
export const TextAllVariants = () => {
return (
<Flex direction="column">
<Text variant="subtitle" style={{ maxWidth: '600px' }}>
A man looks at a painting in a museum and says, Brothers and sisters I
have none, but that man&apos;s father is my father&apos;s son. Who is
in the painting?
</Text>
<Text variant="body" style={{ maxWidth: '600px' }}>
A man looks at a painting in a museum and says, Brothers and sisters I
have none, but that man&apos;s father is my father&apos;s son. Who is
in the painting?
</Text>
<Text variant="caption" style={{ maxWidth: '600px' }}>
A man looks at a painting in a museum and says, Brothers and sisters I
have none, but that man&apos;s father is my father&apos;s son. Who is
in the painting?
</Text>
<Text variant="label" style={{ maxWidth: '600px' }}>
A man looks at a painting in a museum and says, Brothers and sisters I
have none, but that man&apos;s father is my father&apos;s son. Who is
in the painting?
</Text>
</Flex>
);
};
export const TextAllWeights = () => {
return (
<Flex direction="column">
<Text weight="regular" style={{ maxWidth: '600px' }}>
A man looks at a painting in a museum and says, Brothers and sisters I
have none, but that man&apos;s father is my father&apos;s son. Who is
in the painting?
</Text>
<Text weight="bold" style={{ maxWidth: '600px' }}>
A man looks at a painting in a museum and says, Brothers and sisters I
have none, but that man&apos;s father is my father&apos;s son. Who is
in the painting?
</Text>
</Flex>
);
};
export const TextResponsive = () => {
return (
<Text variant={{ initial: 'body', lg: 'subtitle' }}>Responsive text</Text>
);
};
export const TextPlayground = () => {
return (
<Flex direction="column">
<Text>Subtitle</Text>
<Text variant="subtitle" style={{ maxWidth: '600px' }}>
A man looks at a painting in a museum and says, Brothers and sisters I
have none, but that man&apos;s father is my father&apos;s son. Who is
in the painting?
</Text>
<Text>Body</Text>
<Text variant="body" style={{ maxWidth: '600px' }}>
A man looks at a painting in a museum and says, Brothers and sisters I
have none, but that man&apos;s father is my father&apos;s son. Who is
in the painting?
</Text>
<Text>Caption</Text>
<Text variant="caption" style={{ maxWidth: '600px' }}>
A man looks at a painting in a museum and says, Brothers and sisters I
have none, but that man&apos;s father is my father&apos;s son. Who is
in the painting?
</Text>
<Text>Label</Text>
<Text variant="label" style={{ maxWidth: '600px' }}>
A man looks at a painting in a museum and says, Brothers and sisters I
have none, but that man&apos;s father is my father&apos;s son. Who is
in the painting?
</Text>
</Flex>
);
};
+129 -128
View File
@@ -6,11 +6,11 @@ __metadata:
cacheKey: 8
"@babel/runtime@npm:^7.18.6":
version: 7.26.0
resolution: "@babel/runtime@npm:7.26.0"
version: 7.26.10
resolution: "@babel/runtime@npm:7.26.10"
dependencies:
regenerator-runtime: ^0.14.0
checksum: c8e2c0504ab271b3467a261a8f119bf2603eb857a0d71e37791f4e3fae00f681365073cc79f141ddaa90c6077c60ba56448004ad5429d07ac73532be9f7cf28a
checksum: 22d2e0abb86e90de489ab16bb578db6fe2b63a88696db431198b24963749820c723f1982298cdbbea187f7b2b80fb4d98a514faf114ddb2fdc14a4b96277b955
languageName: node
linkType: hard
@@ -501,10 +501,10 @@ __metadata:
languageName: node
linkType: hard
"@next/env@npm:14.2.23":
version: 14.2.23
resolution: "@next/env@npm:14.2.23"
checksum: dad74ff7de68992a0753f728a5b926ed6eb0af8a62deece6bbb32ba254b1f7d870e256b61db8d4c40fa811695cfc5e69ba964339f3cb8b40237cf9c28dfe747f
"@next/env@npm:14.2.25":
version: 14.2.25
resolution: "@next/env@npm:14.2.25"
checksum: c937d4e8b62c7ae9c74bd607888e791b78445e93d523d22d0838e816c3fbeb7b1b62766d110ef235229e4c4ca8587f493e6ec761eb0a2c774dabaee2b58f581b
languageName: node
linkType: hard
@@ -534,65 +534,65 @@ __metadata:
languageName: node
linkType: hard
"@next/swc-darwin-arm64@npm:14.2.23":
version: 14.2.23
resolution: "@next/swc-darwin-arm64@npm:14.2.23"
"@next/swc-darwin-arm64@npm:14.2.25":
version: 14.2.25
resolution: "@next/swc-darwin-arm64@npm:14.2.25"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@next/swc-darwin-x64@npm:14.2.23":
version: 14.2.23
resolution: "@next/swc-darwin-x64@npm:14.2.23"
"@next/swc-darwin-x64@npm:14.2.25":
version: 14.2.25
resolution: "@next/swc-darwin-x64@npm:14.2.25"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@next/swc-linux-arm64-gnu@npm:14.2.23":
version: 14.2.23
resolution: "@next/swc-linux-arm64-gnu@npm:14.2.23"
"@next/swc-linux-arm64-gnu@npm:14.2.25":
version: 14.2.25
resolution: "@next/swc-linux-arm64-gnu@npm:14.2.25"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
"@next/swc-linux-arm64-musl@npm:14.2.23":
version: 14.2.23
resolution: "@next/swc-linux-arm64-musl@npm:14.2.23"
"@next/swc-linux-arm64-musl@npm:14.2.25":
version: 14.2.25
resolution: "@next/swc-linux-arm64-musl@npm:14.2.25"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
"@next/swc-linux-x64-gnu@npm:14.2.23":
version: 14.2.23
resolution: "@next/swc-linux-x64-gnu@npm:14.2.23"
"@next/swc-linux-x64-gnu@npm:14.2.25":
version: 14.2.25
resolution: "@next/swc-linux-x64-gnu@npm:14.2.25"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
"@next/swc-linux-x64-musl@npm:14.2.23":
version: 14.2.23
resolution: "@next/swc-linux-x64-musl@npm:14.2.23"
"@next/swc-linux-x64-musl@npm:14.2.25":
version: 14.2.25
resolution: "@next/swc-linux-x64-musl@npm:14.2.25"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
"@next/swc-win32-arm64-msvc@npm:14.2.23":
version: 14.2.23
resolution: "@next/swc-win32-arm64-msvc@npm:14.2.23"
"@next/swc-win32-arm64-msvc@npm:14.2.25":
version: 14.2.25
resolution: "@next/swc-win32-arm64-msvc@npm:14.2.25"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@next/swc-win32-ia32-msvc@npm:14.2.23":
version: 14.2.23
resolution: "@next/swc-win32-ia32-msvc@npm:14.2.23"
"@next/swc-win32-ia32-msvc@npm:14.2.25":
version: 14.2.25
resolution: "@next/swc-win32-ia32-msvc@npm:14.2.25"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
"@next/swc-win32-x64-msvc@npm:14.2.23":
version: 14.2.23
resolution: "@next/swc-win32-x64-msvc@npm:14.2.23"
"@next/swc-win32-x64-msvc@npm:14.2.25":
version: 14.2.25
resolution: "@next/swc-win32-x64-msvc@npm:14.2.25"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
@@ -722,20 +722,20 @@ __metadata:
languageName: node
linkType: hard
"@storybook/components@npm:8.6.7":
version: 8.6.7
resolution: "@storybook/components@npm:8.6.7"
"@storybook/components@npm:8.6.8":
version: 8.6.8
resolution: "@storybook/components@npm:8.6.8"
peerDependencies:
storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
checksum: cb20f8baa76deef1af1739d6c1b1a9f57eb22d158fa046d9919a91840e7a00f1b48e96b7ffe7994365b60808f864c963a3476ee98b4c8b63968a3a877068da3a
checksum: fb69c6d7804f91fffd3fc7d42ba5b144c7b808af6e6b764c14cdef11263897e551e5cc8a0fa379b9ed73f5c0438ed32d355c7ed63801046e1cb078c479d4cecf
languageName: node
linkType: hard
"@storybook/core@npm:8.6.7":
version: 8.6.7
resolution: "@storybook/core@npm:8.6.7"
"@storybook/core@npm:8.6.8":
version: 8.6.8
resolution: "@storybook/core@npm:8.6.8"
dependencies:
"@storybook/theming": 8.6.7
"@storybook/theming": 8.6.8
better-opn: ^3.0.2
browser-assert: ^1.2.1
esbuild: ^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0
@@ -751,7 +751,7 @@ __metadata:
peerDependenciesMeta:
prettier:
optional: true
checksum: b150b7472766fccbbc1dec74cba3c16e009a9f24c13f01198923f553d12e2a2070ee2a35f5514f9af350b79e34577946ea65a4a495fd1fa18a27655f897c013a
checksum: d67dea27c021b51f17a0d5807b72a29ea174bb8c945fb41092fbf3698002810da0a510aa7e0e23e1682634362f9b52590ba1a09ef6dd40a2ad5653988b0b0e14
languageName: node
linkType: hard
@@ -762,66 +762,66 @@ __metadata:
languageName: node
linkType: hard
"@storybook/manager-api@npm:8.6.7":
version: 8.6.7
resolution: "@storybook/manager-api@npm:8.6.7"
"@storybook/manager-api@npm:8.6.8":
version: 8.6.8
resolution: "@storybook/manager-api@npm:8.6.8"
peerDependencies:
storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
checksum: 6bb0860c3795945189832613da5866e5159b2adb376478a2b596c113928c64f5962efc325f927a6bcb7a48d7257f42cf6489b0c44397876129626ac68c44aa28
checksum: ee575781572898fc2fa734750ccb4bad09fc021bd0878ca9a05d9668cb336610d53e8110f4ff3c2c180573a64e9caba8f50f59d0bd3f0398a5c98e2eafdd91ae
languageName: node
linkType: hard
"@storybook/preview-api@npm:8.6.7":
version: 8.6.7
resolution: "@storybook/preview-api@npm:8.6.7"
"@storybook/preview-api@npm:8.6.8":
version: 8.6.8
resolution: "@storybook/preview-api@npm:8.6.8"
peerDependencies:
storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
checksum: 0d24d62444b7b153bde89d3949ab6539a163e15bc80c5bfcc73b7d49bbb34fb02eb74a99434793b8a6446aeec491e07f006c0f4e404f98486c6d1d614d01defa
checksum: ac923a342d09c9e51f67734acaea19a41dc87cfc6cb22aea262591396d41cd4b69896417b618c55f17a9d64660b659813475c30d338c9bb6aa45391cfe8328f0
languageName: node
linkType: hard
"@storybook/react-dom-shim@npm:8.6.7":
version: 8.6.7
resolution: "@storybook/react-dom-shim@npm:8.6.7"
"@storybook/react-dom-shim@npm:8.6.8":
version: 8.6.8
resolution: "@storybook/react-dom-shim@npm:8.6.8"
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
storybook: ^8.6.7
checksum: 51c20259ac4485d9a996266341a4d9898c949049e2a9af9a08bec58c2ace3a40be1a534005c52fc2db2c81bb010dbd36030bb70581b36c05cf4b34d58f140d3a
storybook: ^8.6.8
checksum: d48ba28fefe0bbe0bde02de6a99629d84ba9436fb539ffc6d779173f7b8f6ec466e26018e943d95fa079d73ace2d96d5911def0221754262782e8a5e8b20882d
languageName: node
linkType: hard
"@storybook/react@npm:^8.4.7":
version: 8.6.7
resolution: "@storybook/react@npm:8.6.7"
"@storybook/react@npm:^8.6.8":
version: 8.6.8
resolution: "@storybook/react@npm:8.6.8"
dependencies:
"@storybook/components": 8.6.7
"@storybook/components": 8.6.8
"@storybook/global": ^5.0.0
"@storybook/manager-api": 8.6.7
"@storybook/preview-api": 8.6.7
"@storybook/react-dom-shim": 8.6.7
"@storybook/theming": 8.6.7
"@storybook/manager-api": 8.6.8
"@storybook/preview-api": 8.6.8
"@storybook/react-dom-shim": 8.6.8
"@storybook/theming": 8.6.8
peerDependencies:
"@storybook/test": 8.6.7
"@storybook/test": 8.6.8
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
storybook: ^8.6.7
storybook: ^8.6.8
typescript: ">= 4.2.x"
peerDependenciesMeta:
"@storybook/test":
optional: true
typescript:
optional: true
checksum: c98438ddfd764300e1a805623fab976f9ef94a2d939984d6caf98ce92ed29d8a7307389b98e2df2d1302b302dc549c7c95050464731d9c588347cd154c360834
checksum: ebbfb2bed68d4ca8c8777769e5b752b1becf9cc1c3fd6f051df9a8eb012d209526b9e188812f3bf8ecf337a331c5049afa2236d2b073fbcafafd35e79cc3ed78
languageName: node
linkType: hard
"@storybook/theming@npm:8.6.7":
version: 8.6.7
resolution: "@storybook/theming@npm:8.6.7"
"@storybook/theming@npm:8.6.8":
version: 8.6.8
resolution: "@storybook/theming@npm:8.6.8"
peerDependencies:
storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
checksum: 747a2377df65d5f0962dc8606d06247ad89fb7ecabab0bd9611055d599b5bd0fa15769e4c76e948ae34ae232ba756bf6795ccb3467b1adf35ff961db7350f4de
checksum: 1be0dea23178af562133f1047165e170f7e90bec4c3cedbdcb59df22685f314273a06a4677835ab84e6dbc682b803590adad6963217971c8136b076ce69800aa
languageName: node
linkType: hard
@@ -1436,13 +1436,13 @@ __metadata:
languageName: node
linkType: hard
"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1":
version: 1.0.1
resolution: "call-bind-apply-helpers@npm:1.0.1"
"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2":
version: 1.0.2
resolution: "call-bind-apply-helpers@npm:1.0.2"
dependencies:
es-errors: ^1.3.0
function-bind: ^1.1.2
checksum: 3c55343261bb387c58a4762d15ad9d42053659a62681ec5eb50690c6b52a4a666302a01d557133ce6533e8bd04530ee3b209f23dd06c9577a1925556f8fcccdf
checksum: b2863d74fcf2a6948221f65d95b91b4b2d90cfe8927650b506141e669f7d5de65cea191bf788838bc40d13846b7886c5bc5c84ab96c3adbcf88ad69a72fcdc6b
languageName: node
linkType: hard
@@ -1458,13 +1458,13 @@ __metadata:
languageName: node
linkType: hard
"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3":
version: 1.0.3
resolution: "call-bound@npm:1.0.3"
"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4":
version: 1.0.4
resolution: "call-bound@npm:1.0.4"
dependencies:
call-bind-apply-helpers: ^1.0.1
get-intrinsic: ^1.2.6
checksum: a93bbe0f2d0a2d6c144a4349ccd0593d5d0d5d9309b69101710644af8964286420062f2cc3114dca120b9bc8cc07507952d4b1b3ea7672e0d7f6f1675efedb32
call-bind-apply-helpers: ^1.0.2
get-intrinsic: ^1.3.0
checksum: 2f6399488d1c272f56306ca60ff696575e2b7f31daf23bc11574798c84d9f2759dceb0cb1f471a85b77f28962a7ac6411f51d283ea2e45319009a19b6ccab3b2
languageName: node
linkType: hard
@@ -1491,7 +1491,7 @@ __metadata:
"@mdx-js/loader": ^3.1.0
"@mdx-js/react": ^3.1.0
"@next/mdx": ^15.1.4
"@storybook/react": ^8.4.7
"@storybook/react": ^8.6.8
"@types/mdx": ^2.0.13
"@types/node": ^20
"@types/react": ^18.0.0
@@ -1502,12 +1502,12 @@ __metadata:
eslint-config-next: 14.2.23
lightningcss: ^1.28.2
motion: ^12.4.1
next: 14.2.23
next: 14.2.25
react: ^18.0.2
react-dom: ^18.0.2
react-frame-component: ^5.2.7
shiki: ^1.26.1
storybook: ^8.4.7
storybook: ^8.6.8
typescript: ^5
languageName: unknown
linkType: soft
@@ -1934,12 +1934,12 @@ __metadata:
languageName: node
linkType: hard
"es-object-atoms@npm:^1.0.0":
version: 1.0.0
resolution: "es-object-atoms@npm:1.0.0"
"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1":
version: 1.1.1
resolution: "es-object-atoms@npm:1.1.1"
dependencies:
es-errors: ^1.3.0
checksum: 26f0ff78ab93b63394e8403c353842b2272836968de4eafe97656adfb8a7c84b9099bf0fe96ed58f4a4cddc860f6e34c77f91649a58a5daa4a9c40b902744e3c
checksum: 214d3767287b12f36d3d7267ef342bbbe1e89f899cfd67040309fc65032372a8e60201410a99a1645f2f90c1912c8c49c8668066f6bdd954bcd614dda2e3da97
languageName: node
linkType: hard
@@ -2555,12 +2555,12 @@ __metadata:
languageName: node
linkType: hard
"for-each@npm:^0.3.3":
version: 0.3.3
resolution: "for-each@npm:0.3.3"
"for-each@npm:^0.3.3, for-each@npm:^0.3.5":
version: 0.3.5
resolution: "for-each@npm:0.3.5"
dependencies:
is-callable: ^1.1.3
checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28
is-callable: ^1.2.7
checksum: 3c986d7e11f4381237cc98baa0a2f87eabe74719eee65ed7bed275163082b940ede19268c61d04c6260e0215983b12f8d885e3c8f9aa8c2113bf07c37051745c
languageName: node
linkType: hard
@@ -2631,21 +2631,21 @@ __metadata:
languageName: node
linkType: hard
"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7":
version: 1.2.7
resolution: "get-intrinsic@npm:1.2.7"
"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0":
version: 1.3.0
resolution: "get-intrinsic@npm:1.3.0"
dependencies:
call-bind-apply-helpers: ^1.0.1
call-bind-apply-helpers: ^1.0.2
es-define-property: ^1.0.1
es-errors: ^1.3.0
es-object-atoms: ^1.0.0
es-object-atoms: ^1.1.1
function-bind: ^1.1.2
get-proto: ^1.0.0
get-proto: ^1.0.1
gopd: ^1.2.0
has-symbols: ^1.1.0
hasown: ^2.0.2
math-intrinsics: ^1.1.0
checksum: a1597b3b432074f805b6a0ba1182130dd6517c0ea0c4eecc4b8834c803913e1ea62dfc412865be795b3dacb1555a21775b70cf9af7a18b1454ff3414e5442d4a
checksum: 301008e4482bb9a9cb49e132b88fee093bff373b4e6def8ba219b1e96b60158a6084f273ef5cafe832e42cd93462f4accb46a618d35fe59a2b507f2388c5b79d
languageName: node
linkType: hard
@@ -3042,7 +3042,7 @@ __metadata:
languageName: node
linkType: hard
"is-callable@npm:^1.1.3, is-callable@npm:^1.2.7":
"is-callable@npm:^1.2.7":
version: 1.2.7
resolution: "is-callable@npm:1.2.7"
checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac
@@ -4176,20 +4176,20 @@ __metadata:
languageName: node
linkType: hard
"next@npm:14.2.23":
version: 14.2.23
resolution: "next@npm:14.2.23"
"next@npm:14.2.25":
version: 14.2.25
resolution: "next@npm:14.2.25"
dependencies:
"@next/env": 14.2.23
"@next/swc-darwin-arm64": 14.2.23
"@next/swc-darwin-x64": 14.2.23
"@next/swc-linux-arm64-gnu": 14.2.23
"@next/swc-linux-arm64-musl": 14.2.23
"@next/swc-linux-x64-gnu": 14.2.23
"@next/swc-linux-x64-musl": 14.2.23
"@next/swc-win32-arm64-msvc": 14.2.23
"@next/swc-win32-ia32-msvc": 14.2.23
"@next/swc-win32-x64-msvc": 14.2.23
"@next/env": 14.2.25
"@next/swc-darwin-arm64": 14.2.25
"@next/swc-darwin-x64": 14.2.25
"@next/swc-linux-arm64-gnu": 14.2.25
"@next/swc-linux-arm64-musl": 14.2.25
"@next/swc-linux-x64-gnu": 14.2.25
"@next/swc-linux-x64-musl": 14.2.25
"@next/swc-win32-arm64-msvc": 14.2.25
"@next/swc-win32-ia32-msvc": 14.2.25
"@next/swc-win32-x64-msvc": 14.2.25
"@swc/helpers": 0.5.5
busboy: 1.6.0
caniuse-lite: ^1.0.30001579
@@ -4230,7 +4230,7 @@ __metadata:
optional: true
bin:
next: dist/bin/next
checksum: 4f9f744439fb860ba7c64ae1c61bc361bdd36e41d56760c52eabb404f4143c854b78ba9a79b7aefc322d93edbbd66d966cbdaf86772a88a8bf2e6b289987f14f
checksum: ca47d0f1d41351adaf75a37c8e8ce39dd76ebc62b054266ef84b5fc1ea41241ad5f16ab7a1ca47b6613b2c3e4c6f48b179f8cd3b0f087912ec7164c4e72981f0
languageName: node
linkType: hard
@@ -5051,11 +5051,11 @@ __metadata:
languageName: node
linkType: hard
"storybook@npm:^8.4.7":
version: 8.6.7
resolution: "storybook@npm:8.6.7"
"storybook@npm:^8.6.8":
version: 8.6.8
resolution: "storybook@npm:8.6.8"
dependencies:
"@storybook/core": 8.6.7
"@storybook/core": 8.6.8
peerDependencies:
prettier: ^2 || ^3
peerDependenciesMeta:
@@ -5065,7 +5065,7 @@ __metadata:
getstorybook: ./bin/index.cjs
sb: ./bin/index.cjs
storybook: ./bin/index.cjs
checksum: fe21ce4d9cd17069a5b409ed518603f97ec6ec421b7f41cff3e43b409820fcbc2c8dbcb3aed99dd7d0a99a0c6138c7576ddf72f78186b6f86085d503b3c8b32f
checksum: 93b92e53c00ff29b4864932c26c52dd4a45e76b3d46811a2bcdc0271ef37c96e2f8d1833982569ab6a6348d6e84d8348aecf74ee72164744459de4c78d0f6759
languageName: node
linkType: hard
@@ -5616,16 +5616,17 @@ __metadata:
linkType: hard
"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18, which-typed-array@npm:^1.1.2":
version: 1.1.18
resolution: "which-typed-array@npm:1.1.18"
version: 1.1.19
resolution: "which-typed-array@npm:1.1.19"
dependencies:
available-typed-arrays: ^1.0.7
call-bind: ^1.0.8
call-bound: ^1.0.3
for-each: ^0.3.3
call-bound: ^1.0.4
for-each: ^0.3.5
get-proto: ^1.0.1
gopd: ^1.2.0
has-tostringtag: ^1.0.2
checksum: d2feea7f51af66b3a240397aa41c796585033e1069f18e5b6d4cd3878538a1e7780596fd3ea9bf347c43d9e98e13be09b37d9ea3887cef29b11bc291fd47bb52
checksum: 162d2a07f68ea323f88ed9419861487ce5d02cb876f2cf9dd1e428d04a63133f93a54f89308f337b27cabd312ee3d027cae4a79002b2f0a85b79b9ef4c190670
languageName: node
linkType: hard
@@ -5677,8 +5678,8 @@ __metadata:
linkType: hard
"ws@npm:^8.2.3":
version: 8.18.0
resolution: "ws@npm:8.18.0"
version: 8.18.1
resolution: "ws@npm:8.18.1"
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: ">=5.0.2"
@@ -5687,7 +5688,7 @@ __metadata:
optional: true
utf-8-validate:
optional: true
checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975
checksum: 4658357185d891bc45cc2d42a84f9e192d047e8476fb5cba25b604f7d75ca87ca0dd54cd0b2cc49aeee57c79045a741cb7d0b14501953ac60c790cd105c42f23
languageName: node
linkType: hard
@@ -1157,13 +1157,21 @@ export class MyIncrementalEntityProvider
The last step is to implement the actual `next` method that will accept the cursor, call the API, process the result and return the result.
```ts
import {
ANNOTATION_LOCATION,
ANNOTATION_ORIGIN_LOCATION,
} from '@backstage/catalog-model';
import { IncrementalEntityProvider } from '@backstage/plugin-catalog-backend-module-incremental-ingestion';
export class MyIncrementalEntityProvider
implements IncrementalEntityProvider<Cursor, Context>
{
private readonly token: string;
private readonly mySource: string;
constructor(token: string) {
constructor(token: string, mySource: string) {
this.token = token;
this.mySource = mySource;
}
getProviderName() {
@@ -1181,6 +1189,7 @@ export class MyIncrementalEntityProvider
cursor: Cursor = { page: 1 },
): Promise<EntityIteratorResult<Cursor>> {
const { apiClient } = context;
const location = `${this.getProviderName()}:${this.mySource}`;
// call your API with the current cursor
const data = await apiClient.getServices(cursor);
@@ -1200,8 +1209,8 @@ export class MyIncrementalEntityProvider
name: item.name,
annotations: {
// You need to define these, otherwise they'll fail validation
[ANNOTATION_LOCATION]: this.getProviderName(),
[ANNOTATION_ORIGIN_LOCATION]: this.getProviderName(),
[ANNOTATION_LOCATION]: location,
[ANNOTATION_ORIGIN_LOCATION]: location,
},
},
spec: {
+8 -7
View File
@@ -86,13 +86,14 @@ catalog:
These config blocks have a lot of options in them, so we will describe each "root" key within the block separately.
> NOTE:
>
> If you want to import users and groups from different LDAP servers, you can define multiple providers with different names.
> If they should come from the same server, you can define multiple users and groups blocks within the same provider using an array of users / groups.
> Entries coming from the same block will be able to detect group memberships based on the `memberOf` attribute.
>
> If you want only to import users or groups, you can omit the groups or users block.
:::note Note
If you want to import users and groups from different LDAP servers, you can define multiple providers with different names.
If they should come from the same server, you can define multiple users and groups blocks within the same provider using an array of users / groups.
Entries coming from the same block will be able to detect group memberships based on the `memberOf` attribute.
If you want only to import users or groups, you can omit the groups or users block.
:::
### target
+17 -17
View File
@@ -8,7 +8,7 @@ The Backstage Notifications System provides a way for plugins and external servi
These notifications are displayed in the dedicated page of the Backstage frontend UI or by frontend plugins per specific scenarios.
Additionally, notifications can be sent to external channels (like email) via "processors" implemented within plugins.
Notifications can be optionally integrated with the signals (a push mechanism) to ensure users receive them immediately.
Notifications can be optionally extended with the signals plugin, which provides a push mechanism to ensure users receive notifications immediately.
### Upgrade to the latest version of Backstage
@@ -27,8 +27,8 @@ There are two basic types of notifications:
Example of use-cases:
- System-wide announcements or alerts
- Notifications for component owners: e.g., build failures, successful deployments, new vulnerabilities
- Notifications for individuals: e.g., updates you have subscribed to, new required training courses
- Notifications for component owners, e.g. build failures, successful deployments, new vulnerabilities
- Notifications for individuals, e.g. updates you have subscribed to, new required training courses
- Notifications pertaining to a particular entity in the catalog: A notification might apply to an entity and the owning team.
## Installation
@@ -87,17 +87,17 @@ import { NotificationsPage } from '@backstage/plugin-notifications';
### Optional: Add Signals
The use of signals is optional but improves user experience.
The use of signals is optional but improves the user experience.
#### Optional: Add Signals Backend
Add Signals to your backend by first adding the backend package:
Add signals to your backend by first adding the backend package:
```bash title="From your Backstage root directory"
yarn --cwd packages/backend add @backstage/plugin-signals-backend
```
The add the signals to your backend:
Then add the signals plugin to your backend:
```ts title="packages/backend/src/index.ts"
const backend = createBackend();
@@ -156,19 +156,19 @@ add the `UserNotificationSettingsCard` to your frontend.
You can customize the origin names shown in the UI by passing an object where the keys are the origins and the values are the names you want to show in the UI.
Each notification processor will receive its own column in the settings page, where the user can enable or disable notifications from that processor.
Each notification processor will receive its own row in the settings page, where the user can enable or disable notifications from that processor.
## Additional info
An example of a backend plugin sending notifications can be found in https://github.com/backstage/backstage/tree/master/plugins/scaffolder-backend-module-notifications.
An example of a backend plugin sending notifications can be found in the [`@backstage/plugin-scaffolder-backend-module-notifications` package](https://github.com/backstage/backstage/tree/master/plugins/scaffolder-backend-module-notifications).
Sources of the notifications and signal plugins:
Sources of the notifications and signals plugins:
- https://github.com/backstage/backstage/blob/master/plugins/notifications
- https://github.com/backstage/backstage/blob/master/plugins/notifications-backend
- https://github.com/backstage/backstage/blob/master/plugins/notifications-common
- https://github.com/backstage/backstage/blob/master/plugins/notifications-node
- https://github.com/backstage/backstage/blob/master/plugins/signals-backend
- https://github.com/backstage/backstage/blob/master/plugins/signals
- https://github.com/backstage/backstage/blob/master/plugins/signals-node
- https://github.com/backstage/backstage/blob/master/plugins/signals-react
- [notifications](https://github.com/backstage/backstage/blob/master/plugins/notifications)
- [notifications-backend](https://github.com/backstage/backstage/blob/master/plugins/notifications-backend)
- [notifications-common](https://github.com/backstage/backstage/blob/master/plugins/notifications-common)
- [notifications-node](https://github.com/backstage/backstage/blob/master/plugins/notifications-node)
- [signals-backend](https://github.com/backstage/backstage/blob/master/plugins/signals-backend)
- [signals](https://github.com/backstage/backstage/blob/master/plugins/signals)
- [signals-node](https://github.com/backstage/backstage/blob/master/plugins/signals-node)
- [signals-react](https://github.com/backstage/backstage/blob/master/plugins/signals-react)
+3 -3
View File
@@ -6,7 +6,7 @@ description: How to use the notifications and signals
## Notifications Backend
The Notifications backend plugin provides an API to create notifications, list notifications per logged-in user, and search based on parameters.
The notifications backend plugin provides an API to create notifications, list notifications per logged-in user, and search based on parameters.
The plugin uses a relational [database](https://backstage.io/docs/getting-started/config/database) for persistence; no specifics are introduced in this context.
@@ -26,7 +26,7 @@ In the `packages/app/src/components/Root/Root.tsx`, tweak the [properties](https
## Usage
New notifications can be sent either by a backend plugin or an external service through the REST API.
New notifications can be sent either by a backend plugin or by an external service through the REST API.
## Backend
@@ -71,7 +71,7 @@ await notificationService.send({
});
```
Refer the [API documentation](https://github.com/backstage/backstage/blob/master/plugins/notifications-node/report.api.md) for further details.
Consult the [API documentation](https://github.com/backstage/backstage/blob/master/plugins/notifications-node/report.api.md) for further details.
### External Services
+6 -56
View File
@@ -11,23 +11,9 @@ public roadmap. This not a complete list of all work happening in and around the
project, it only highlights the highest priority initiatives worked on by the
core maintainers.
## 2024 Fall Roadmap
## 2025 Spring Roadmap
The initiatives listed below are planned for release within the next half-year, starting in May 2024. The roadmap is updated every 6 months, and the next update is planned for November 2024.
### Backend System 1.0
The goal of this initiative is the stable 1.0 release of the [new backend system](../backend-system/index.md).
This includes ensuring that all documentation is up to date, and includes API
reviews and refactoring efforts to ensure that what is released is both stable
and evolvable. You can follow along with this work in the [meta issue](https://github.com/backstage/backstage/issues/24493).
As part of this initiative, there will also be an exploration on how to
simplify extension of backend services. It is not currently possible to augment
backend services through declarative integration, they are instead only
customizable through complete replacement. This also limits the ability to
modularize services and scale ownership of the implementations. The goal is to
provide a more flexible and scalable way to extend backend services.
The initiatives listed below are planned for release within the next half-year, starting in November 2024. The roadmap is updated every 6 months, and the next update is planned for April 2024.
### New Frontend System - Ready for Adoption
@@ -40,53 +26,17 @@ This milestone also includes reaching and executing [rollout phase 2](https://gi
Once the initial milestone is reached, the goal is to also build out broader
support for the new frontend system in the core plugins.
### Backstage Security Audit
This is the second security audit of the Backstage project. It is done together,
and with the support of the [Cloud Native Computing Foundation (CNCF)](https://www.cncf.io/).
This time the audit will in particular focus on the recently introduced
[authentication system](https://github.com/backstage/backstage/tree/master/beps/0003-auth-architecture-evolution),
but also cover other parts of the project.
### Plugin Metadata
The goal of this initiative is to provide better machine readable metadata for
Backstage packages, available both at runtime, at build-time and as part of
package registries. We want to surface information such as what packages make up
a particular plugin, what features it provides, and more generally laying the
foundation for an evolvable plugin metadata system.
### MUI v5 Green-light
Material-UI v4 is still the officially supported version of MUI in Backstage.
While we have heard that adopters have had success using MUI 5, this is still an
untested path with known bugs. The goal of this initiative is to iron out any
remaining issues or gaps, and then provide a green light for migration to MUI 5.
### Configuration Improvements
This initiative aims to improve the configuration experience and reliability in
Backstage. Areas for improvement include the way that configuration schema is
loaded, the way that plugins access configuration that is not owned by them, how
plugins read configuration, and how configuration visibility is handled.
### Versioned Documentation
The goal of this initiative is to provide versioned documentation at
[backstage.io](https://backstage.io). This lets us provide documentation that is
both up-to-date while at the same time not ahead of the latest release.
### Rework Pull Request & Issue Process
Our current review and issue triage process is centered around either core- or
project area maintainers. The goal of this initiative is to make it simpler for
more members of the community to be involved and contribute to this process.
### Catalog Observability
### Catalog Performance
The goal of this initiative is to provide better tools for debugging catalog
ingestion issues and to more generally reduce friction for setting up and
maintaining the software catalog.
The goal of this initiative is to improve the performance of the Software
Catalog, both in terms of speeding up the read API and improving the ingestion
process.
## How to influence the roadmap
+1 -1
View File
@@ -21,7 +21,7 @@ The backend supplies a central logging service,
[`rootLogger`](../backend-system/core-services/root-logger.md), as well as a plugin
based logger, [`logger`](../backend-system/core-services/logger.md) from `coreServices`.
To add additional granularity to your logs, you can create children from the plugin
based logger, using the `.child()` method and provide is with JSON data. For example,
based logger, using the `.child()` method and provide it with JSON data. For example,
if you wanted to log items for a specific span in your plugin, you could do
```ts
File diff suppressed because it is too large Load Diff
@@ -11,6 +11,8 @@ authorURL: https://www.linkedin.com/in/emmamckeewhite/
What an action-packed and memorable week for the Backstage community meeting up IRL at KubeCon North America 2022 in (unseasonably warm and sunny) Detroit. Lets see what the community was up to:
{/* truncate */}
### BackstageCon: A full day of nothing but Backstage
![BackstageCon group](assets/2022-10-28/groupimage.jpg)
@@ -10,7 +10,7 @@ author: Taylor Webber, Staff Engineer, Stash
{/* truncate */}
At [Stash](stash.com), our mission is to give people the confidence to invest for a better life. Our app simplifies investing for the middle class who may be less experienced with traditional investing and retirement planning. Our customers trust us with their money, and with that, rely on us to provide a responsive and quality experience that works every time.
At [Stash](https://www.stash.com), our mission is to give people the confidence to invest for a better life. Our app simplifies investing for the middle class who may be less experienced with traditional investing and retirement planning. Our customers trust us with their money, and with that, rely on us to provide a responsive and quality experience that works every time.
It isn't revolutionary to say that monitoring the health of a software application is critical for ensuring its reliability and performance in service of customers' needs. However, in a distributed architecture like microservices, tracking ownership and monitoring application health across the system quickly becomes complex. The difficulties are further compounded when leveraging multiple SaaS products, which is common in modern development but specifically so for fintechs like Stash that integrate best-of-breed software in novel ways, as we do across our platform.
+5 -5
View File
@@ -123,6 +123,11 @@ const config: Config = {
},
blog: {
path: 'blog',
// Gets rid of the following:
// Warning: Some blog authors used in "2024-12-18-backstage-wrapped-2024.mdx" are not defined in "authors.yml":
// - {"name":"Patrik Oldsberg, Spotify & Ben Lambert, Spotify","key":null,"page":null}
// Note that we recommend to declare authors once in a "authors.yml" file and reference them by key in blog posts front matter to avoid author info duplication.
onInlineAuthors: 'ignore',
},
theme: {
customCss: 'src/theme/customTheme.scss',
@@ -299,11 +304,6 @@ const config: Config = {
themes: ['docusaurus-theme-openapi-docs'],
themeConfig: {
languageTabs: [
{
highlight: 'javascript',
language: 'nodejs',
logoClass: 'nodejs',
},
{
highlight: 'javascript',
language: 'javascript',
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "root",
"version": "1.37.0",
"version": "1.38.0-next.0",
"backstage": {
"cli": {
"new": {
+46
View File
@@ -1,5 +1,51 @@
# example-app-next
## 0.0.22-next.0
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog@1.29.0-next.0
- @backstage/cli@0.32.0-next.0
- @backstage/canon@0.2.1-next.0
- @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.0
- @backstage/plugin-scaffolder-react@1.15.0-next.0
- @backstage/plugin-catalog-react@1.16.1-next.0
- @backstage/plugin-scaffolder@1.30.0-next.0
- @backstage/core-compat-api@0.4.1-next.0
- @backstage/plugin-api-docs@0.12.6-next.0
- @backstage/plugin-catalog-graph@0.4.18-next.0
- @backstage/plugin-catalog-import@0.12.12-next.0
- @backstage/plugin-org@0.6.38-next.0
- @backstage/plugin-techdocs@1.12.5-next.0
- @backstage/plugin-user-settings@0.8.21-next.0
- @backstage/app-defaults@1.6.0
- @backstage/catalog-model@1.7.3
- @backstage/config@1.3.2
- @backstage/core-app-api@1.16.0
- @backstage/core-components@0.17.0
- @backstage/core-plugin-api@1.10.5
- @backstage/frontend-app-api@0.11.0
- @backstage/frontend-defaults@0.2.0
- @backstage/frontend-plugin-api@0.10.0
- @backstage/integration-react@1.2.5
- @backstage/theme@0.6.4
- @backstage/plugin-app@0.1.7
- @backstage/plugin-app-visualizer@0.1.17
- @backstage/plugin-auth-react@0.1.13
- @backstage/plugin-catalog-common@1.1.3
- @backstage/plugin-home@0.8.7-next.0
- @backstage/plugin-kubernetes@0.12.6-next.0
- @backstage/plugin-kubernetes-cluster@0.0.24-next.0
- @backstage/plugin-notifications@0.5.4-next.0
- @backstage/plugin-permission-react@0.4.32
- @backstage/plugin-search@1.4.25-next.0
- @backstage/plugin-search-common@1.2.17
- @backstage/plugin-search-react@1.8.7
- @backstage/plugin-signals@0.0.17
- @backstage/plugin-techdocs-module-addons-contrib@1.1.22
- @backstage/plugin-techdocs-react@1.2.15
## 0.0.21
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-app-next",
"version": "0.0.21",
"version": "0.0.22-next.0",
"backstage": {
"role": "frontend"
},
+42
View File
@@ -1,5 +1,47 @@
# example-app
## 0.2.108-next.0
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog@1.29.0-next.0
- @backstage/cli@0.32.0-next.0
- @backstage/canon@0.2.1-next.0
- @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.0
- @backstage/plugin-scaffolder-react@1.15.0-next.0
- @backstage/plugin-catalog-react@1.16.1-next.0
- @backstage/plugin-scaffolder@1.30.0-next.0
- @backstage/plugin-api-docs@0.12.6-next.0
- @backstage/plugin-catalog-graph@0.4.18-next.0
- @backstage/plugin-catalog-import@0.12.12-next.0
- @backstage/plugin-org@0.6.38-next.0
- @backstage/plugin-techdocs@1.12.5-next.0
- @backstage/plugin-user-settings@0.8.21-next.0
- @backstage/app-defaults@1.6.0
- @backstage/catalog-model@1.7.3
- @backstage/config@1.3.2
- @backstage/core-app-api@1.16.0
- @backstage/core-components@0.17.0
- @backstage/core-plugin-api@1.10.5
- @backstage/frontend-app-api@0.11.0
- @backstage/integration-react@1.2.5
- @backstage/theme@0.6.4
- @backstage/plugin-auth-react@0.1.13
- @backstage/plugin-catalog-common@1.1.3
- @backstage/plugin-devtools@0.1.26-next.0
- @backstage/plugin-home@0.8.7-next.0
- @backstage/plugin-kubernetes@0.12.6-next.0
- @backstage/plugin-kubernetes-cluster@0.0.24-next.0
- @backstage/plugin-notifications@0.5.4-next.0
- @backstage/plugin-permission-react@0.4.32
- @backstage/plugin-search@1.4.25-next.0
- @backstage/plugin-search-common@1.2.17
- @backstage/plugin-search-react@1.8.7
- @backstage/plugin-signals@0.0.17
- @backstage/plugin-techdocs-module-addons-contrib@1.1.22
- @backstage/plugin-techdocs-react@1.2.15
## 0.2.107
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-app",
"version": "0.2.107",
"version": "0.2.108-next.0",
"backstage": {
"role": "frontend"
},
+23
View File
@@ -1,5 +1,28 @@
# @backstage/backend-defaults
## 0.9.0-next.0
### Minor Changes
- 01edf6e: Allow pass through of redis client and cluster options to Cache core service
### Patch Changes
- Updated dependencies
- @backstage/backend-app-api@1.2.1
- @backstage/plugin-auth-node@0.6.1
- @backstage/plugin-permission-node@0.9.0
- @backstage/backend-dev-utils@0.1.5
- @backstage/backend-plugin-api@1.2.1
- @backstage/cli-node@0.2.13
- @backstage/config@1.3.2
- @backstage/config-loader@1.10.0
- @backstage/errors@1.2.7
- @backstage/integration@1.16.2
- @backstage/integration-aws-node@0.1.15
- @backstage/types@1.2.1
- @backstage/plugin-events-node@0.4.9
## 0.8.2
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-defaults",
"version": "0.8.2",
"version": "0.9.0-next.0",
"description": "Backend defaults used by Backstage backend apps",
"backstage": {
"role": "node-library"
@@ -1,5 +1,29 @@
# @backstage/backend-dynamic-feature-service
## 0.6.2-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.9.0-next.0
- @backstage/plugin-scaffolder-node@0.8.1-next.0
- @backstage/plugin-auth-node@0.6.1
- @backstage/plugin-catalog-backend@1.32.0
- @backstage/plugin-events-backend@0.5.0
- @backstage/plugin-permission-node@0.9.0
- @backstage/plugin-search-backend-node@1.3.9
- @backstage/backend-plugin-api@1.2.1
- @backstage/cli-common@0.1.15
- @backstage/cli-node@0.2.13
- @backstage/config@1.3.2
- @backstage/config-loader@1.10.0
- @backstage/errors@1.2.7
- @backstage/types@1.2.1
- @backstage/plugin-app-node@0.1.31
- @backstage/plugin-events-node@0.4.9
- @backstage/plugin-permission-common@0.8.4
- @backstage/plugin-search-common@1.2.17
## 0.6.1
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-dynamic-feature-service",
"version": "0.6.1",
"version": "0.6.2-next.0",
"description": "Backstage dynamic feature service",
"backstage": {
"role": "node-library"
+38
View File
@@ -1,5 +1,43 @@
# example-backend-legacy
## 0.2.109-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.9.0-next.0
- @backstage/plugin-scaffolder-backend@1.32.0-next.0
- @backstage/plugin-auth-backend@0.24.5-next.0
- @backstage/plugin-auth-node@0.6.1
- @backstage/plugin-catalog-backend@1.32.0
- @backstage/plugin-events-backend@0.5.0
- @backstage/plugin-kubernetes-backend@0.19.4
- @backstage/plugin-permission-backend@0.5.55
- @backstage/plugin-permission-node@0.9.0
- @backstage/plugin-search-backend@2.0.1-next.0
- @backstage/plugin-search-backend-node@1.3.9
- @backstage/plugin-signals-backend@0.3.2
- @backstage/plugin-techdocs-backend@2.0.1-next.0
- @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0
- @backstage/backend-plugin-api@1.2.1
- @backstage/catalog-client@1.9.1
- @backstage/catalog-model@1.7.3
- @backstage/config@1.3.2
- @backstage/integration@1.16.2
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6
- @backstage/plugin-catalog-backend-module-unprocessed@0.5.6
- @backstage/plugin-catalog-node@1.16.1
- @backstage/plugin-events-node@0.4.9
- @backstage/plugin-permission-common@0.8.4
- @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.8-next.0
- @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.0
- @backstage/plugin-scaffolder-backend-module-rails@0.5.8-next.0
- @backstage/plugin-search-backend-module-catalog@0.3.2
- @backstage/plugin-search-backend-module-elasticsearch@1.7.0
- @backstage/plugin-search-backend-module-explore@0.3.0
- @backstage/plugin-search-backend-module-pg@0.5.42
- @backstage/plugin-signals-node@0.1.18
## 0.2.108
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend-legacy",
"version": "0.2.108",
"version": "0.2.109-next.0",
"backstage": {
"role": "backend"
},
+14
View File
@@ -1,5 +1,19 @@
# @backstage/backend-test-utils
## 1.3.2-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.9.0-next.0
- @backstage/backend-app-api@1.2.1
- @backstage/plugin-auth-node@0.6.1
- @backstage/backend-plugin-api@1.2.1
- @backstage/config@1.3.2
- @backstage/errors@1.2.7
- @backstage/types@1.2.1
- @backstage/plugin-events-node@0.4.9
## 1.3.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-test-utils",
"version": "1.3.1",
"version": "1.3.2-next.0",
"description": "Test helpers library for Backstage backends",
"backstage": {
"role": "node-library"
+38
View File
@@ -1,5 +1,43 @@
# example-backend
## 0.0.37-next.0
### Patch Changes
- Updated dependencies
- @backstage/backend-defaults@0.9.0-next.0
- @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.0
- @backstage/plugin-scaffolder-backend@1.32.0-next.0
- @backstage/plugin-scaffolder-backend-module-notifications@0.1.9-next.0
- @backstage/plugin-app-backend@0.5.0
- @backstage/plugin-auth-backend@0.24.5-next.0
- @backstage/plugin-auth-backend-module-github-provider@0.3.1
- @backstage/plugin-auth-node@0.6.1
- @backstage/plugin-catalog-backend@1.32.0
- @backstage/plugin-devtools-backend@0.5.4-next.0
- @backstage/plugin-events-backend@0.5.0
- @backstage/plugin-kubernetes-backend@0.19.4
- @backstage/plugin-notifications-backend@0.5.4
- @backstage/plugin-permission-backend@0.5.55
- @backstage/plugin-permission-node@0.9.0
- @backstage/plugin-proxy-backend@0.6.0
- @backstage/plugin-search-backend@2.0.1-next.0
- @backstage/plugin-search-backend-node@1.3.9
- @backstage/plugin-signals-backend@0.3.2
- @backstage/plugin-techdocs-backend@2.0.1-next.0
- @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0
- @backstage/backend-plugin-api@1.2.1
- @backstage/catalog-model@1.7.3
- @backstage/plugin-auth-backend-module-guest-provider@0.2.6
- @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.0
- @backstage/plugin-catalog-backend-module-openapi@0.2.8
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6
- @backstage/plugin-catalog-backend-module-unprocessed@0.5.6
- @backstage/plugin-permission-backend-module-allow-all-policy@0.2.6
- @backstage/plugin-permission-common@0.8.4
- @backstage/plugin-search-backend-module-catalog@0.3.2
- @backstage/plugin-search-backend-module-explore@0.3.0
## 0.0.36
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend",
"version": "0.0.36",
"version": "0.0.37-next.0",
"backstage": {
"role": "backend"
},
-12
View File
@@ -1,12 +0,0 @@
import { addons } from '@storybook/manager-api';
import { create } from '@storybook/theming';
const theme = create({
base: 'light',
brandTitle: 'Canon',
brandImage: 'logo.svg',
});
addons.setConfig({
theme,
});
+8
View File
@@ -1,5 +1,13 @@
# @backstage/canon
## 0.2.1-next.0
### Patch Changes
- 6af7b16: Updated styles for the Menu component in Canon.
- 513477f: Add global CSS reset for anchor tags.
- 05a5003: Fix the Icon component when the name is not found to return null instead of an empty SVG.
## 0.2.0
### Minor Changes
+53 -102
View File
@@ -404,36 +404,6 @@
height: 1.5rem;
}
.canon-FieldRoot {
font-family: var(--canon-font-regular);
flex-direction: column;
width: 100%;
display: flex;
}
.canon-FieldLabel {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-primary);
margin-bottom: var(--canon-space-1_5);
}
.canon-FieldDescription {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-secondary);
padding-top: var(--canon-space-1_5);
margin: 0;
}
.canon-FieldError {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-danger);
padding-top: var(--canon-space-1_5);
margin: 0;
}
.canon-Input {
border-radius: var(--canon-radius-3);
border: 1px solid var(--canon-border);
@@ -465,54 +435,50 @@
border-color: var(--canon-fg-danger);
}
.canon-Input[data-disabled] {
opacity: .5;
cursor: not-allowed;
border: 1px solid var(--canon-border-disabled);
}
.canon-Input--size-small {
.canon-Input--size-sm {
height: 2rem;
}
.canon-Input--size-medium {
.canon-Input--size-md {
height: 2.5rem;
}
.canon-MenuTrigger {
box-sizing: border-box;
border: 1px solid var(--color-gray-200);
background-color: var(--color-gray-50);
height: 2.5rem;
color: var(--color-gray-900);
user-select: none;
border-radius: .375rem;
outline: 0;
justify-content: center;
align-items: center;
gap: .375rem;
margin: 0;
padding: 0 .875rem;
font-family: inherit;
font-size: 1rem;
font-weight: 500;
line-height: 1.5rem;
.canon-FieldRoot {
font-family: var(--canon-font-regular);
flex-direction: column;
width: 100%;
display: flex;
}
@media (hover: hover) {
&:hover {
background-color: var(--color-gray-100);
}
}
.canon-FieldLabel {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-primary);
margin-bottom: var(--canon-space-1_5);
}
&:active, &[data-popup-open] {
background-color: var(--color-gray-100);
}
.canon-FieldDescription {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-secondary);
padding-top: var(--canon-space-1_5);
margin: 0;
}
&:focus-visible {
outline: 2px solid var(--color-blue);
outline-offset: -1px;
}
.canon-FieldError {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-danger);
padding-top: var(--canon-space-1_5);
margin: 0;
}
.canon-FieldValidity {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-secondary);
padding-top: var(--canon-space-1_5);
margin: 0;
}
.canon-MenuPositioner {
@@ -520,60 +486,45 @@
}
.canon-MenuPopup {
box-sizing: border-box;
background-color: var(--canon-bg-elevated);
color: var(--color-fg-primary);
padding: var(--canon-space-2);
background-color: var(--canon-bg-surface-1);
border: 1px solid var(--canon-border);
color: var(--canon-fg-primary);
transform-origin: var(--transform-origin);
border-radius: .375rem;
padding-block: .25rem;
outline: none;
max-width: 340px;
transition: transform .15s, opacity .15s;
overflow: hidden;
&[data-starting-style], &[data-ending-style] {
opacity: 0;
transform: scale(.9);
}
@media (prefers-color-scheme: light) {
& {
outline: 1px solid var(--color-gray-200);
box-shadow: 0px 10px 15px -3px var(--color-gray-200), 0px 4px 6px -4px var(--color-gray-200);
}
}
@media (prefers-color-scheme: dark) {
& {
outline: 1px solid var(--color-gray-300);
outline-offset: -1px;
}
}
}
.canon-MenuItem {
cursor: default;
user-select: none;
padding-block: .5rem;
gap: var(--canon-space-2);
color: var(--canon-fg-primary);
border-radius: var(--canon-radius-2);
padding: var(--canon-space-2) var(--canon-space-2);
padding-right: var(--canon-space-4);
cursor: pointer;
outline: 0;
padding-left: 1rem;
padding-right: 2rem;
font-size: .875rem;
line-height: 1rem;
text-decoration: none;
display: flex;
&:last-child {
border-bottom: none;
}
&[data-highlighted] {
z-index: 0;
color: var(--color-gray-50);
background-color: var(--canon-bg-tint-hover);
position: relative;
}
&[data-highlighted]:before {
content: "";
z-index: -1;
background-color: var(--color-gray-900);
border-radius: .25rem;
position: absolute;
inset-block: 0;
inset-inline: .25rem;
}
}
.canon-MenuSeparator {
+5
View File
@@ -9083,6 +9083,11 @@
}
}
:where(a) {
color: inherit;
text-decoration: none;
}
:root {
--canon-font-regular: system-ui;
--canon-font-monospace: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;
+19 -70
View File
@@ -1,98 +1,47 @@
.canon-MenuTrigger {
box-sizing: border-box;
border: 1px solid var(--color-gray-200);
background-color: var(--color-gray-50);
height: 2.5rem;
color: var(--color-gray-900);
user-select: none;
border-radius: .375rem;
outline: 0;
justify-content: center;
align-items: center;
gap: .375rem;
margin: 0;
padding: 0 .875rem;
font-family: inherit;
font-size: 1rem;
font-weight: 500;
line-height: 1.5rem;
display: flex;
@media (hover: hover) {
&:hover {
background-color: var(--color-gray-100);
}
}
&:active, &[data-popup-open] {
background-color: var(--color-gray-100);
}
&:focus-visible {
outline: 2px solid var(--color-blue);
outline-offset: -1px;
}
}
.canon-MenuPositioner {
outline: 0;
}
.canon-MenuPopup {
box-sizing: border-box;
background-color: var(--canon-bg-elevated);
color: var(--color-fg-primary);
padding: var(--canon-space-2);
background-color: var(--canon-bg-surface-1);
border: 1px solid var(--canon-border);
color: var(--canon-fg-primary);
transform-origin: var(--transform-origin);
border-radius: .375rem;
padding-block: .25rem;
outline: none;
max-width: 340px;
transition: transform .15s, opacity .15s;
overflow: hidden;
&[data-starting-style], &[data-ending-style] {
opacity: 0;
transform: scale(.9);
}
@media (prefers-color-scheme: light) {
& {
outline: 1px solid var(--color-gray-200);
box-shadow: 0px 10px 15px -3px var(--color-gray-200), 0px 4px 6px -4px var(--color-gray-200);
}
}
@media (prefers-color-scheme: dark) {
& {
outline: 1px solid var(--color-gray-300);
outline-offset: -1px;
}
}
}
.canon-MenuItem {
cursor: default;
user-select: none;
padding-block: .5rem;
gap: var(--canon-space-2);
color: var(--canon-fg-primary);
border-radius: var(--canon-radius-2);
padding: var(--canon-space-2) var(--canon-space-2);
padding-right: var(--canon-space-4);
cursor: pointer;
outline: 0;
padding-left: 1rem;
padding-right: 2rem;
font-size: .875rem;
line-height: 1rem;
text-decoration: none;
display: flex;
&:last-child {
border-bottom: none;
}
&[data-highlighted] {
z-index: 0;
color: var(--color-gray-50);
background-color: var(--canon-bg-tint-hover);
position: relative;
}
&[data-highlighted]:before {
content: "";
z-index: -1;
background-color: var(--color-gray-900);
border-radius: .25rem;
position: absolute;
inset-block: 0;
inset-inline: .25rem;
}
}
.canon-MenuSeparator {
+58 -102
View File
@@ -9083,6 +9083,11 @@
}
}
:where(a) {
color: inherit;
text-decoration: none;
}
:root {
--canon-font-regular: system-ui;
--canon-font-monospace: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;
@@ -9605,36 +9610,6 @@
height: 1.5rem;
}
.canon-FieldRoot {
font-family: var(--canon-font-regular);
flex-direction: column;
width: 100%;
display: flex;
}
.canon-FieldLabel {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-primary);
margin-bottom: var(--canon-space-1_5);
}
.canon-FieldDescription {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-secondary);
padding-top: var(--canon-space-1_5);
margin: 0;
}
.canon-FieldError {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-danger);
padding-top: var(--canon-space-1_5);
margin: 0;
}
.canon-Input {
border-radius: var(--canon-radius-3);
border: 1px solid var(--canon-border);
@@ -9666,54 +9641,50 @@
border-color: var(--canon-fg-danger);
}
.canon-Input[data-disabled] {
opacity: .5;
cursor: not-allowed;
border: 1px solid var(--canon-border-disabled);
}
.canon-Input--size-small {
.canon-Input--size-sm {
height: 2rem;
}
.canon-Input--size-medium {
.canon-Input--size-md {
height: 2.5rem;
}
.canon-MenuTrigger {
box-sizing: border-box;
border: 1px solid var(--color-gray-200);
background-color: var(--color-gray-50);
height: 2.5rem;
color: var(--color-gray-900);
user-select: none;
border-radius: .375rem;
outline: 0;
justify-content: center;
align-items: center;
gap: .375rem;
margin: 0;
padding: 0 .875rem;
font-family: inherit;
font-size: 1rem;
font-weight: 500;
line-height: 1.5rem;
.canon-FieldRoot {
font-family: var(--canon-font-regular);
flex-direction: column;
width: 100%;
display: flex;
}
@media (hover: hover) {
&:hover {
background-color: var(--color-gray-100);
}
}
.canon-FieldLabel {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-primary);
margin-bottom: var(--canon-space-1_5);
}
&:active, &[data-popup-open] {
background-color: var(--color-gray-100);
}
.canon-FieldDescription {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-secondary);
padding-top: var(--canon-space-1_5);
margin: 0;
}
&:focus-visible {
outline: 2px solid var(--color-blue);
outline-offset: -1px;
}
.canon-FieldError {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-danger);
padding-top: var(--canon-space-1_5);
margin: 0;
}
.canon-FieldValidity {
font-size: var(--canon-font-size-2);
font-weight: var(--canon-font-weight-regular);
color: var(--canon-fg-secondary);
padding-top: var(--canon-space-1_5);
margin: 0;
}
.canon-MenuPositioner {
@@ -9721,60 +9692,45 @@
}
.canon-MenuPopup {
box-sizing: border-box;
background-color: var(--canon-bg-elevated);
color: var(--color-fg-primary);
padding: var(--canon-space-2);
background-color: var(--canon-bg-surface-1);
border: 1px solid var(--canon-border);
color: var(--canon-fg-primary);
transform-origin: var(--transform-origin);
border-radius: .375rem;
padding-block: .25rem;
outline: none;
max-width: 340px;
transition: transform .15s, opacity .15s;
overflow: hidden;
&[data-starting-style], &[data-ending-style] {
opacity: 0;
transform: scale(.9);
}
@media (prefers-color-scheme: light) {
& {
outline: 1px solid var(--color-gray-200);
box-shadow: 0px 10px 15px -3px var(--color-gray-200), 0px 4px 6px -4px var(--color-gray-200);
}
}
@media (prefers-color-scheme: dark) {
& {
outline: 1px solid var(--color-gray-300);
outline-offset: -1px;
}
}
}
.canon-MenuItem {
cursor: default;
user-select: none;
padding-block: .5rem;
gap: var(--canon-space-2);
color: var(--canon-fg-primary);
border-radius: var(--canon-radius-2);
padding: var(--canon-space-2) var(--canon-space-2);
padding-right: var(--canon-space-4);
cursor: pointer;
outline: 0;
padding-left: 1rem;
padding-right: 2rem;
font-size: .875rem;
line-height: 1rem;
text-decoration: none;
display: flex;
&:last-child {
border-bottom: none;
}
&[data-highlighted] {
z-index: 0;
color: var(--color-gray-50);
background-color: var(--canon-bg-tint-hover);
position: relative;
}
&[data-highlighted]:before {
content: "";
z-index: -1;
background-color: var(--color-gray-900);
border-radius: .25rem;
position: absolute;
inset-block: 0;
inset-inline: .25rem;
}
}
.canon-MenuSeparator {
+11 -11
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/canon",
"version": "0.2.0",
"version": "0.2.1-next.0",
"backstage": {
"role": "web-library"
},
@@ -36,7 +36,7 @@
"lint": "backstage-cli package lint",
"prepack": "backstage-cli package prepack",
"postpack": "backstage-cli package postpack",
"start": "yarn build:css:watch && yarn storybook",
"start": "concurrently \"yarn build:css:watch\" \"yarn storybook\"",
"storybook": "storybook dev -p 6006",
"test": "backstage-cli package test"
},
@@ -47,15 +47,15 @@
},
"devDependencies": {
"@backstage/cli": "workspace:^",
"@storybook/addon-essentials": "^8.6.4",
"@storybook/addon-interactions": "^8.6.4",
"@storybook/addon-essentials": "^8.6.8",
"@storybook/addon-interactions": "^8.6.8",
"@storybook/addon-styling-webpack": "^1.0.1",
"@storybook/addon-themes": "^8.6.4",
"@storybook/addon-webpack5-compiler-swc": "^2.1.0",
"@storybook/blocks": "^8.6.4",
"@storybook/react": "^8.6.4",
"@storybook/react-webpack5": "^8.6.4",
"@storybook/test": "^8.6.4",
"@storybook/addon-themes": "^8.6.8",
"@storybook/addon-webpack5-compiler-swc": "^3.0.0",
"@storybook/blocks": "^8.6.8",
"@storybook/react": "^8.6.8",
"@storybook/react-webpack5": "^8.6.8",
"@storybook/test": "^8.6.8",
"@testing-library/jest-dom": "^6.0.0",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
@@ -68,7 +68,7 @@
"react": "^18.0.2",
"react-dom": "^18.0.2",
"react-router-dom": "^6.3.0",
"storybook": "^8.6.4"
"storybook": "^8.6.8"
},
"peerDependencies": {
"@types/react": "^17.0.0 || ^18.0.0",
+3 -2
View File
@@ -11,6 +11,7 @@ import { default as React_2 } from 'react';
import * as React_3 from 'react';
import { ReactNode } from 'react';
import { RefAttributes } from 'react';
import type { RemixiconComponentType } from '@remixicon/react';
import { ScrollArea as ScrollArea_2 } from '@base-ui-components/react/scroll-area';
import { Tooltip as Tooltip_2 } from '@base-ui-components/react/tooltip';
@@ -604,7 +605,7 @@ export interface IconContextProps {
}
// @public (undocumented)
export type IconMap = Partial<Record<IconNames, React.ComponentType>>;
export type IconMap = Partial<Record<IconNames, RemixiconComponentType>>;
// @public (undocumented)
export type IconNames =
@@ -679,7 +680,7 @@ export interface IconProviderProps {
// (undocumented)
children?: ReactNode;
// (undocumented)
overrides?: Partial<Record<IconNames, React.ComponentType>>;
overrides?: Partial<Record<IconNames, RemixiconComponentType>>;
}
// @public (undocumented)
@@ -61,21 +61,33 @@ const DecorativeBox = () => {
export const Default: Story = {
args: {
children: [<DecorativeBox />, <DecorativeBox />, <DecorativeBox />],
children: (
<>
<DecorativeBox />, <DecorativeBox />, <DecorativeBox />
</>
),
},
};
export const ColumnDirection: Story = {
args: {
direction: 'column',
children: [<DecorativeBox />, <DecorativeBox />, <DecorativeBox />],
children: (
<>
<DecorativeBox />, <DecorativeBox />, <DecorativeBox />
</>
),
},
};
export const RowDirection: Story = {
args: {
direction: 'row',
children: [<DecorativeBox />, <DecorativeBox />, <DecorativeBox />],
children: (
<>
<DecorativeBox />, <DecorativeBox />, <DecorativeBox />
</>
),
},
};
@@ -18,7 +18,6 @@ import React from 'react';
import type { Meta, StoryObj } from '@storybook/react';
import { Heading } from './Heading';
import { Flex } from '../Flex';
import { Text } from '../Text';
const meta = {
title: 'Components/Heading',
@@ -42,7 +41,7 @@ export const Title1: Story = {
export const AllVariants: Story = {
render: () => (
<Flex>
<Flex direction="column" gap="4">
<Heading variant="display">Display</Heading>
<Heading variant="title1">Title 1</Heading>
<Heading variant="title2">Title 2</Heading>
@@ -68,10 +67,22 @@ export const CustomTag: Story = {
},
};
export const WrappedInLink: Story = {
args: {
...Default.args,
},
decorators: [
Story => (
<a href="/">
<Story />
</a>
),
],
};
export const Playground: Story = {
render: () => (
<Flex>
<Text>All variants</Text>
<Flex direction="column" gap="4">
<Heading variant="display">Display</Heading>
<Heading variant="title1">Title 1</Heading>
<Heading variant="title2">Title 2</Heading>
+1 -1
View File
@@ -130,4 +130,4 @@ export const icons: IconMap = {
youtube: RiYoutubeLine,
'zoom-in': RiZoomInLine,
'zoom-out': RiZoomOutLine,
};
} as const;
+3 -2
View File
@@ -15,6 +15,7 @@
*/
import { ReactNode } from 'react';
import type { RemixiconComponentType } from '@remixicon/react';
/** @public */
export type IconNames =
@@ -74,7 +75,7 @@ export type IconNames =
| 'zoom-out';
/** @public */
export type IconMap = Partial<Record<IconNames, React.ComponentType>>;
export type IconMap = Partial<Record<IconNames, RemixiconComponentType>>;
/** @public */
export type IconProps = {
@@ -92,5 +93,5 @@ export interface IconContextProps {
/** @public */
export interface IconProviderProps {
children?: ReactNode;
overrides?: Partial<Record<IconNames, React.ComponentType>>;
overrides?: Partial<Record<IconNames, RemixiconComponentType>>;
}
@@ -17,6 +17,7 @@
import React from 'react';
import type { Meta, StoryObj } from '@storybook/react';
import { Menu } from './Menu';
import { Button } from '../Button';
const meta = {
title: 'Components/Menu',
@@ -30,9 +31,15 @@ export const Default: Story = {
args: {
children: (
<>
<Menu.Trigger>Menu</Menu.Trigger>
<Menu.Trigger
render={props => (
<Button {...props} size="small">
Menu
</Button>
)}
/>
<Menu.Portal>
<Menu.Positioner>
<Menu.Positioner sideOffset={8} align="start">
<Menu.Popup>
<Menu.Item>Item 1</Menu.Item>
<Menu.Item>Item 2</Menu.Item>
@@ -44,3 +51,10 @@ export const Default: Story = {
),
},
};
export const Open: Story = {
args: {
...Default.args,
open: true,
},
};
@@ -1,54 +1,17 @@
.canon-MenuTrigger {
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
gap: 0.375rem;
height: 2.5rem;
padding: 0 0.875rem;
margin: 0;
outline: 0;
border: 1px solid var(--color-gray-200);
border-radius: 0.375rem;
background-color: var(--color-gray-50);
font-family: inherit;
font-size: 1rem;
font-weight: 500;
line-height: 1.5rem;
color: var(--color-gray-900);
user-select: none;
@media (hover: hover) {
&:hover {
background-color: var(--color-gray-100);
}
}
&:active {
background-color: var(--color-gray-100);
}
&[data-popup-open] {
background-color: var(--color-gray-100);
}
&:focus-visible {
outline: 2px solid var(--color-blue);
outline-offset: -1px;
}
}
.canon-MenuPositioner {
outline: 0;
}
.canon-MenuPopup {
box-sizing: border-box;
padding-block: 0.25rem;
padding: var(--canon-space-2);
border-radius: 0.375rem;
background-color: var(--canon-bg-elevated);
color: var(--color-fg-primary);
background-color: var(--canon-bg-surface-1);
border: 1px solid var(--canon-border);
color: var(--canon-fg-primary);
outline: none;
overflow: hidden;
transform-origin: var(--transform-origin);
max-width: 340px;
transition: transform 150ms, opacity 150ms;
&[data-starting-style],
@@ -56,44 +19,29 @@
opacity: 0;
transform: scale(0.9);
}
@media (prefers-color-scheme: light) {
outline: 1px solid var(--color-gray-200);
box-shadow: 0px 10px 15px -3px var(--color-gray-200),
0px 4px 6px -4px var(--color-gray-200);
}
@media (prefers-color-scheme: dark) {
outline: 1px solid var(--color-gray-300);
outline-offset: -1px;
}
}
.canon-MenuItem {
outline: 0;
cursor: default;
user-select: none;
padding-block: 0.5rem;
padding-left: 1rem;
padding-right: 2rem;
display: flex;
font-size: 0.875rem;
line-height: 1rem;
gap: var(--canon-space-2);
color: var(--canon-fg-primary);
text-decoration: none;
border-radius: var(--canon-radius-2);
padding: var(--canon-space-2) var(--canon-space-2);
padding-right: var(--canon-space-4);
cursor: pointer;
&:last-child {
border-bottom: none;
}
&[data-highlighted] {
z-index: 0;
position: relative;
color: var(--color-gray-50);
}
&[data-highlighted]::before {
content: '';
z-index: -1;
position: absolute;
inset-block: 0;
inset-inline: 0.25rem;
border-radius: 0.25rem;
background-color: var(--color-gray-900);
background-color: var(--canon-bg-tint-hover);
}
}
@@ -89,6 +89,19 @@ export const Responsive: Story = {
},
};
export const WrappedInLink: Story = {
args: {
...Default.args,
},
decorators: [
Story => (
<a href="/">
<Story />
</a>
),
],
};
export const Playground: Story = {
render: () => (
<Flex gap="4" direction="column">
+6 -1
View File
@@ -18,8 +18,13 @@
@import './normalize.css';
@import './utilities.css';
/* Light theme tokens */
/* Global reset */
:where(a) {
color: inherit;
text-decoration: none;
}
/* Light theme tokens */
:root {
/* Font families */
--canon-font-regular: system-ui;
+23
View File
@@ -1,5 +1,28 @@
# @backstage/cli
## 0.32.0-next.0
### Minor Changes
- c7254ae: Internal update to move the `clean`, `pre/postpack` and `fix` commands into their own separate module.
### Patch Changes
- 4ea76f7: Bump @module-federation/enhanced ^0.9.0 to fix GHSA-593f-38f6-jp5m
- 87a5cb4: Fixed an issue causing the `repo lint` command to fail when the `--max-warnings` option was used.
- d83f3f4: Resolved a problem where the `start` command did not correctly handle multiple `--require` flags, ensuring all specified modules are now properly loaded.
- Updated dependencies
- @backstage/catalog-model@1.7.3
- @backstage/cli-common@0.1.15
- @backstage/cli-node@0.2.13
- @backstage/config@1.3.2
- @backstage/config-loader@1.10.0
- @backstage/errors@1.2.7
- @backstage/eslint-plugin@0.1.10
- @backstage/integration@1.16.2
- @backstage/release-manifests@0.0.12
- @backstage/types@1.2.1
## 0.31.0
### Minor Changes
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/cli",
"version": "0.31.0",
"version": "0.32.0-next.0",
"description": "CLI for developing Backstage plugins and apps",
"backstage": {
"role": "cli"
@@ -58,7 +58,7 @@
"@backstage/release-manifests": "workspace:^",
"@backstage/types": "workspace:^",
"@manypkg/get-packages": "^1.1.3",
"@module-federation/enhanced": "^0.8.0",
"@module-federation/enhanced": "^0.9.0",
"@octokit/graphql": "^5.0.0",
"@octokit/graphql-schema": "^13.7.0",
"@octokit/oauth-app": "^4.2.0",
+10
View File
@@ -1,5 +1,15 @@
# @backstage/core-compat-api
## 0.4.1-next.0
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog-react@1.16.1-next.0
- @backstage/core-plugin-api@1.10.5
- @backstage/frontend-plugin-api@0.10.0
- @backstage/version-bridge@1.0.11
## 0.4.0
### Minor Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/core-compat-api",
"version": "0.4.0",
"version": "0.4.1-next.0",
"backstage": {
"role": "web-library"
},

Some files were not shown because too many files have changed in this diff Show More