Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
80bfb6b
Design System: New Fluent theme (dxdsfluent) powered by design tokens
EugeniyKiyashko Jul 27, 2026
629014e
Design system: fix inconsistencies after design review and add etalon…
EugeniyKiyashko Jul 31, 2026
f9d1b44
Design System: use current screenshots as etalons of dxdsfluent (#34585)
pharret31 Jul 31, 2026
aacde0a
Design System: fix tests
pharret31 Jul 31, 2026
f58fe47
Design System: naming convention standart
EugeniyKiyashko Aug 5, 2026
f6979fb
Design system: get rid of use ds tokens of component's level
EugeniyKiyashko Aug 5, 2026
cf2534d
Design system: update etalons after package bump to 262.6.0
EugeniyKiyashko Aug 6, 2026
1524414
Design System: Rename theme from dxdsfluent to fluent-next (#34677)
dmlvr Aug 6, 2026
5477706
Design System: finish the fluent-next naming migration and rename bas…
EugeniyKiyashko Aug 12, 2026
51e6b93
Fluent design tokens pipeline (#34701)
Raushen Aug 12, 2026
22f5a68
Design system: change highlight color after designer review (#34744)
EugeniyKiyashko Aug 12, 2026
37d1393
Design System: New Fluent theme (dxdsfluent) powered by design tokens…
dmlvr Aug 18, 2026
f31c3f6
Design System: apply the clear-styles cleanup to fluent-next
EugeniyKiyashko Aug 18, 2026
7de403e
Design System: drop the release-branch CI push triggers
EugeniyKiyashko Aug 18, 2026
57cda5d
Fluent-next: delivery artifacts to distribution and support accents (…
Raushen Aug 24, 2026
5389fa0
Fluent-next: sync the theme with the fluent fixes that landed after t…
EugeniyKiyashko Aug 25, 2026
73b268b
Design System: move fluent-next onto design tokens 262.10.1 (#34916)
EugeniyKiyashko Aug 26, 2026
bad5d9b
Fluent-next: extract css variables of components level (#34888)
EugeniyKiyashko Aug 26, 2026
805d53c
Fluent-next: reduce runtime calc() with direct token steps and tier-p…
EugeniyKiyashko Aug 27, 2026
4212418
Fluent-next: unify focus rings on one role and restore their contrast…
EugeniyKiyashko Aug 27, 2026
31d995b
Fluent-next: gate the compiled bundles against runtime calc() growth …
EugeniyKiyashko Aug 27, 2026
6a0a2f3
Fluent-next: fix demo and remove unused variable (#34947)
EugeniyKiyashko Aug 27, 2026
d235249
Fluent next: add px markers (#34950)
EugeniyKiyashko Aug 27, 2026
d8d1041
Fluent-next: symplify aliases (#34976)
EugeniyKiyashko Aug 28, 2026
00c936b
Fluent-next: extend the component tier to every component that owns v…
EugeniyKiyashko Aug 31, 2026
dfd24df
Fluent-next: publish the type scale into the system tier (#34983)
EugeniyKiyashko Aug 31, 2026
d05cef7
Fluent-next: move onto design tokens 262.15.0
pharret31 Aug 31, 2026
f2173bd
Fluent-next: change colors in Viz palettes (#34981)
Raushen Sep 1, 2026
87fe70b
Update demo with new palette (#34984)
Raushen Sep 1, 2026
d791a43
Point the Scheduler demo at a colour role that still exists
EugeniyKiyashko Sep 1, 2026
232958d
Design System: open up the fixed sizes in the shared base layer (#34996)
pharret31 Sep 3, 2026
29653df
Fluent-next: mirror the other-month hovered cell color from fluent
EugeniyKiyashko Sep 3, 2026
3047856
Demos: move the Scheduler/ContextMenu appointment title color out of …
EugeniyKiyashko Sep 3, 2026
07ccd67
Fluent-next: paint the disabled state from the roles instead of opaci…
EugeniyKiyashko Sep 4, 2026
2320092
Fluent-next: re-shoot the cardView column chooser drag etalons (#35057)
EugeniyKiyashko Sep 5, 2026
86690ba
Fluent-next: run naming:check in CI
EugeniyKiyashko Sep 5, 2026
9436594
Fluent-next: use the token font and the dark surface color in viz the…
EugeniyKiyashko Sep 7, 2026
22bae16
Fluent-next: paint the single-colour icons with a mask instead of a b…
EugeniyKiyashko Sep 7, 2026
f864a0e
Fluent-next: bring the component tier generator back (#35068)
EugeniyKiyashko Sep 7, 2026
28631f8
Fluent-next: sync with main and bring the theme into line with the ne…
EugeniyKiyashko Sep 7, 2026
3790dfc
Fluent-next: gate the fallback policy of the tier (runtime-contract.j…
EugeniyKiyashko Sep 8, 2026
00bce93
Fluent-next: move onto design tokens 262.16.0 (#35085)
EugeniyKiyashko Sep 8, 2026
ab88c0b
Fluent-next: re-shoot the two T1152498 scrolling etalons that were ca…
EugeniyKiyashko Sep 8, 2026
40641a0
Fluent-next: ship both colour modes in every bundle, selectable by cl…
EugeniyKiyashko Sep 11, 2026
baa8d71
Custom Accent support (#35096)
Raushen Sep 14, 2026
42767d1
Fluent-next: refactor scales exceptions (#35102)
pharret31 Sep 14, 2026
e5b502c
Fluent-next: bump design-tokens package to 262.23.0 (#35205)
pharret31 Sep 15, 2026
d4e0ecd
Fluent-next: guards for the public tier and the token bump (#35218)
pharret31 Sep 16, 2026
f54e750
Fluent-next: CardView sizes stop repeating themselves between default…
EugeniyKiyashko Sep 17, 2026
c9e6d64
Fluent-next: validate role assignment across all components (#35107)
EugeniyKiyashko Sep 17, 2026
9fc3417
Fluent-next: get shadows from the design tokens shadow scale (#35245)
pharret31 Sep 18, 2026
577ba30
Fluent-next: update pnpm-lock.yaml
pharret31 Sep 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
8 changes: 8 additions & 0 deletions .github/renovate.json
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,14 @@
"matchPackageNames": [
"*"
]
},
{
"matchPackageNames": [
"@devexpress/design-tokens-internal"
],
"automerge": false,
"dependencyDashboardApproval": true,
"minimumReleaseAge": null
}
],
"lockFileMaintenance": {
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/styles.yml
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,9 @@ jobs:
- name: Run tests
run: pnpm exec nx test devextreme-scss

- name: Check naming registries
run: pnpm exec nx naming:check devextreme-scss

notify:
runs-on: ubuntu-latest
name: Send notifications
Expand Down
11 changes: 10 additions & 1 deletion .github/workflows/testcafe_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,7 @@ jobs:
style_dependent_matrix=$(cat <<'JSON'
[
{ "componentFolder": "accessibility", "name": "accessibility - fluent.dark", "theme": "fluent.blue.dark", "concurrency": 6 },
{ "componentFolder": "accessibility", "name": "accessibility - fluent-next.dark", "theme": "fluent-next.blue.dark", "concurrency": 6 },
{ "componentFolder": "accessibility", "name": "accessibility - material.light", "theme": "material.blue.light", "concurrency": 6 },
{ "componentFolder": "accessibility", "name": "accessibility - material.dark", "theme": "material.blue.dark", "concurrency": 6 }
]
Expand All @@ -259,7 +260,15 @@ jobs:
--argjson baseEnd "$base_matrix_end" \
--argjson styleDependent "$style_dependent_matrix" \
--arg stylesChanged "${{ needs.check-should-run.outputs.styles-changed }}" \
'{ include: ($baseStart + (if $stylesChanged == "true" then $styleDependent else [] end) + $baseEnd) }')
'{ include: (
$baseStart
+ (if $stylesChanged == "true" then $styleDependent else [] end)
+ $baseEnd
+ (($baseStart + $baseEnd) | map(
select(.theme == null)
| . + { name: (.name + " - fluent-next"), theme: "fluent-next.blue.light" }
))
) }')

echo "matrix=$matrix" >> $GITHUB_OUTPUT

Expand Down
305 changes: 304 additions & 1 deletion .github/workflows/visual-tests-demos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,148 @@ jobs:
runs-on: ubuntu-slim
outputs:
should-run: ${{ steps.check.outputs.should-run }}
styles-changed: ${{ steps.changes.outputs.styles }}
steps:
- uses: actions/checkout@v6
- name: Check RUN_TESTS flag
id: check
run: echo "should-run=${{ env.RUN_TESTS }}" >> $GITHUB_OUTPUT

- uses: dorny/paths-filter@v4
id: changes
with:
filters: |
styles:
- 'packages/devextreme-scss/scss/**'
- 'packages/devextreme-scss/icons/**'
- 'packages/devextreme-scss/images/**'
- 'packages/devextreme-scss/fonts/**'
- 'packages/devextreme/js/**/themes/**'

get-changes:
runs-on: ubuntu-latest
needs: check-should-run
if: github.event_name == 'pull_request' && needs.check-should-run.outputs.should-run == 'true'
name: Get changed demos
timeout-minutes: 5
outputs:
has-changed-demos: ${{ steps.check-changes.outputs.has-changed-demos }}

steps:
- name: Get sources
uses: actions/checkout@v6

- name: Get changed files
uses: DevExpress/github-actions/get-changed-files@get-changed-files
with:
gh-token: ${{ secrets.GITHUB_TOKEN }}
paths: 'apps/demos/Demos/**/*'
output: apps/demos/changed-files.json

- name: Display changed files
id: check-changes
run: |
HAS_CHANGED="false"
if [ -f "apps/demos/changed-files.json" ]; then
DEMO_COUNT=$(jq length apps/demos/changed-files.json)
echo "Found changed-files.json"
echo "Content of changed-files.json:"
cat apps/demos/changed-files.json
echo "Number of changed files: $DEMO_COUNT"
if [ "$DEMO_COUNT" -gt 0 ]; then
HAS_CHANGED="true"
fi
else
echo "changed-files.json not found"
fi
echo "has-changed-demos=${HAS_CHANGED}" >> $GITHUB_OUTPUT

- name: Upload artifacts
uses: actions/upload-artifact@v7
with:
name: changed-demos
path: apps/demos/changed-files.json
retention-days: 1

determine-framework-tests-scope:
runs-on: ubuntu-slim
name: Determine scope for framework tests
needs: [check-should-run, get-changes]
if: |
!cancelled() &&
needs.check-should-run.outputs.should-run == 'true' &&
(needs.get-changes.result == 'success' || needs.get-changes.result == 'skipped')
outputs:
framework-tests-scope: ${{ steps.determine.outputs.framework-tests-scope }}

steps:
- name: Determine framework tests scope
id: determine
run: |
if [ "${{ github.event_name }}" != "pull_request" ] || [ "${{ contains(github.event.pull_request.labels.*.name, 'force all tests') }}" = "true" ]; then
echo "Framework tests scope: all demos"
echo "framework-tests-scope=all" >> $GITHUB_OUTPUT
elif [ "${{ needs.get-changes.outputs.has-changed-demos }}" = "true" ]; then
echo "Framework tests scope: changed demos"
echo "framework-tests-scope=changed" >> $GITHUB_OUTPUT
else
echo "Framework tests NOT needed"
echo "framework-tests-scope=none" >> $GITHUB_OUTPUT
fi

determine-jquery-test-matrix:
runs-on: ubuntu-slim
name: Determine jQuery test matrix
needs: [check-should-run, determine-framework-tests-scope]
if: |
!cancelled() &&
needs.check-should-run.outputs.should-run == 'true' &&
needs.determine-framework-tests-scope.result == 'success'
outputs:
matrix: ${{ steps.matrix.outputs.matrix }}

steps:
- name: Build matrix
id: matrix
run: |
base_matrix=$(cat <<'JSON'
[
{ "STRATEGY": "screenshots", "THEME": "material.blue.light", "CONSTEL": "jquery(1/3)" },
{ "STRATEGY": "screenshots", "THEME": "material.blue.light", "CONSTEL": "jquery(2/3)" },
{ "STRATEGY": "screenshots", "THEME": "material.blue.light", "CONSTEL": "jquery(3/3)" },
{ "STRATEGY": "screenshots", "THEME": "fluent.blue.light", "CONSTEL": "jquery(1/3)" },
{ "STRATEGY": "screenshots", "THEME": "fluent.blue.light", "CONSTEL": "jquery(2/3)" },
{ "STRATEGY": "screenshots", "THEME": "fluent.blue.light", "CONSTEL": "jquery(3/3)" },
{ "STRATEGY": "screenshots", "THEME": "fluent-next.blue.light", "CONSTEL": "jquery(1/3)" },
{ "STRATEGY": "screenshots", "THEME": "fluent-next.blue.light", "CONSTEL": "jquery(2/3)" },
{ "STRATEGY": "screenshots", "THEME": "fluent-next.blue.light", "CONSTEL": "jquery(3/3)" },
{ "STRATEGY": "accessibility", "THEME": "material.blue.light", "CONSTEL": "jquery" },
{ "STRATEGY": "accessibility", "THEME": "fluent.blue.light", "CONSTEL": "jquery" },
{ "STRATEGY": "accessibility", "THEME": "fluent-next.blue.light", "CONSTEL": "jquery" }
]
JSON
)

dark_accessibility_matrix=$(cat <<'JSON'
[
{ "STRATEGY": "accessibility", "THEME": "material.blue.dark", "CONSTEL": "jquery" },
{ "STRATEGY": "accessibility", "THEME": "fluent.blue.dark", "CONSTEL": "jquery" },
{ "STRATEGY": "accessibility", "THEME": "fluent-next.blue.dark", "CONSTEL": "jquery" }
]
JSON
)

# Dark accessibility (color-contrast) runs when framework tests are in scope
# OR when styles changed — mirroring the style_dependent_matrix gate in testcafe_tests.yml.
matrix=$(jq -c -n \
--argjson base "$base_matrix" \
--argjson darkAccessibility "$dark_accessibility_matrix" \
--arg frameworkTestsScope "${{ needs.determine-framework-tests-scope.outputs.framework-tests-scope }}" \
--arg stylesChanged "${{ needs.check-should-run.outputs.styles-changed }}" \
'{ include: ($base + (if $frameworkTestsScope != "none" or $stylesChanged == "true" then $darkAccessibility else [] end)) }')

echo "matrix=$matrix" >> $GITHUB_OUTPUT

build-devextreme:
runs-on: ${{ github.event_name == 'merge_group' && 'devextreme-shr2-ondemand' || 'devextreme-shr2' }}
name: Build DevExtreme
Expand Down Expand Up @@ -662,7 +799,7 @@ jobs:
angular(9/10),
angular(10/10),
]
THEME: ['fluent.blue.light']
THEME: ['fluent.blue.light', 'fluent-next.blue.light']

runs-on: ${{ github.event_name == 'merge_group' && 'devextreme-shr2-ondemand' || 'devextreme-shr2' }}
name: ${{ matrix.CONSTEL }}-screenshots-${{ matrix.THEME }}
Expand Down Expand Up @@ -819,6 +956,172 @@ jobs:
path: ${{ github.workspace }}/apps/demos/testing/artifacts/compared-screenshots/**/*
if-no-files-found: ignore

testcafe-frameworks-changed:
needs: [check-should-run, determine-framework-tests-scope, build-demos, build-vendor-bundles]
if: |
!cancelled() &&
needs.check-should-run.outputs.should-run == 'true' &&
needs.determine-framework-tests-scope.result == 'success' &&
needs.determine-framework-tests-scope.outputs.framework-tests-scope == 'changed' &&
needs.build-demos.result == 'success'
strategy:
fail-fast: false
matrix:
CONSTEL: [react, vue, angular]
THEME: ['fluent.blue.light', 'fluent-next.blue.light']

runs-on: ${{ github.event_name == 'merge_group' && 'devextreme-shr2-ondemand' || 'devextreme-shr2' }}
name: ${{ matrix.CONSTEL }}-screenshots-${{ matrix.THEME }}
timeout-minutes: 60

steps:
- name: Get sources
uses: actions/checkout@v6

- name: Setup Chrome
uses: ./.github/actions/setup-chrome
with:
chrome-version: '150.0.7871.181'

- name: Use Node.js
uses: actions/setup-node@v6
with:
node-version-file: '.node-version'

- name: Download devextreme sources
uses: actions/download-artifact@v8
with:
name: devextreme-sources

- name: Download changed demos
uses: actions/download-artifact@v8
with:
name: changed-demos
path: apps/demos
continue-on-error: true

- uses: pnpm/action-setup@v6
with:
run_install: false

- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV

- uses: actions/cache/restore@v5
name: Restore pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-cache-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-cache

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Install tgz
working-directory: apps/demos
run: pnpm add --ignore-workspace --allow-build=core-js --allow-build=inferno devextreme-aspnet-data@5.1.0 devextreme-aspnet-data-nojquery@5.1.0 ../../devextreme-installer.tgz ../../devextreme-dist-installer.tgz ../../devextreme-react-installer.tgz ../../devextreme-vue-installer.tgz ../../devextreme-angular-installer.tgz && rm -f pnpm-workspace.yaml pnpm-lock.yaml

- name: Download demo bundles (React)
if: matrix.CONSTEL == 'react'
uses: actions/download-artifact@v8
with:
name: devextreme-bundles-React
path: apps/demos/.demo-bundles/react

- name: Download demo bundles (Vue)
if: matrix.CONSTEL == 'vue'
uses: actions/download-artifact@v8
with:
name: devextreme-bundles-Vue
path: apps/demos/.demo-bundles/vue

# build-demos shards Angular 3 ways regardless of how it's tested here.
- name: Download demo bundles (Angular shard 1)
if: matrix.CONSTEL == 'angular'
uses: actions/download-artifact@v8
with:
name: devextreme-bundles-Angular-shard1
path: apps/demos/.demo-bundles/angular-shard1

- name: Download demo bundles (Angular shard 2)
if: matrix.CONSTEL == 'angular'
uses: actions/download-artifact@v8
with:
name: devextreme-bundles-Angular-shard2
path: apps/demos/.demo-bundles/angular-shard2

- name: Download demo bundles (Angular shard 3)
if: matrix.CONSTEL == 'angular'
uses: actions/download-artifact@v8
with:
name: devextreme-bundles-Angular-shard3
path: apps/demos/.demo-bundles/angular-shard3

- name: Download changes artifacts
uses: actions/download-artifact@v8
with:
name: changed-demos
path: apps/demos

# No-op for angular demos (no manifest — see build-vendor-bundles.js).
- name: Download vendor bundles
uses: actions/download-artifact@v8
with:
name: devextreme-vendor-bundles
path: apps/demos/bundles/vendor

- name: Unpack demo bundles
run: |
shopt -s nullglob
archives=(apps/demos/.demo-bundles/*/demo-bundles.tgz)
if [ ${#archives[@]} -eq 0 ]; then
echo "No demo bundle archives downloaded for constellation '${{ matrix.CONSTEL }}'" >&2
exit 1
fi
for archive in "${archives[@]}"; do
tar -xzf "$archive" -C apps/demos
done
rm -rf apps/demos/.demo-bundles
echo "Unpacked $(find apps/demos/Demos -name 'bundle.js' | wc -l) demo bundle(s)"

- name: Run Web Server
run: |
python -m http.server 8080 &
python -m http.server 8081 &
python -m http.server 8082 &
python -m http.server 8083 &

- name: Run TestCafe tests
shell: bash
working-directory: apps/demos
env:
CHANGEDFILEINFOSPATH: changed-files.json
BROWSERS: chrome:headless --window-size=1200,800 --disable-gpu --no-sandbox --disable-dev-shm-usage --disable-partial-raster --disable-skia-runtime-opts --run-all-compositor-stages-before-draw --disable-new-content-rendering-timeout --disable-threaded-animation --disable-threaded-scrolling --disable-checker-imaging --disable-image-animation-resync --use-gl=swiftshader --disable-features=PaintHolding --js-flags=--random-seed=2147483647 --font-render-hinting=none --disable-font-subpixel-positioning
# DEBUG: hammerhead:*,testcafe:*
CONCURRENCY: 1
CONSTEL: ${{ matrix.CONSTEL }}
THEME: ${{ matrix.THEME }}
# DISABLE_DEMO_TEST_SETTINGS: all # Uncomment to ignore all the visualtestrc.json settings
# DISABLE_DEMO_TEST_SETTINGS: ignore # Uncomment to ignore the `ignore` field
# DISABLE_DEMO_TEST_SETTINGS: comparison-options # Uncomment to ignore the `comparison-options` field
CI_ENV: true # The `ignore` field in the visualtestrc.json should be disabled when running test locally
run: pnpm exec nx test-testcafe

- name: Sanitize job name
if: ${{ failure() }}
run: echo "JOB_NAME=$(echo "${{ matrix.CONSTEL }}-${{ matrix.THEME }}" | tr '/' '-')" >> $GITHUB_ENV

- name: Copy screenshots artifacts
if: ${{ failure() }}
uses: actions/upload-artifact@v7
with:
name: screenshots-${{ env.JOB_NAME }}
path: ${{ github.workspace }}/apps/demos/testing/artifacts/compared-screenshots/**/*
if-no-files-found: ignore

merge-artifacts:
runs-on: ubuntu-latest
needs: [testcafe-jquery, testcafe-frameworks-all]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
right: 0;
width: 340px;
top: 0;
background-color: rgba(191, 191, 191, 0.15);
background-color: var(--dx-color-options-panel-bg);
}

.options > .caption {
Expand Down
2 changes: 1 addition & 1 deletion apps/demos/Demos/Accordion/Overview/React/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
right: 0;
width: 340px;
top: 0;
background-color: rgba(191, 191, 191, 0.15);
background-color: var(--dx-color-options-panel-bg);
}

.options > .caption {
Expand Down
Loading
Loading