@dialpad/dialtone-css 8.80.0-next.2 → 8.80.0-next.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/build/js/dialtone_migrate_link_rendering/button-nav-test-examples.vue +92 -0
- package/lib/build/js/dialtone_migrate_link_rendering/button-nav.test.mjs +272 -0
- package/lib/build/js/dialtone_migrate_link_rendering/helpers.mjs +25 -0
- package/lib/build/js/dialtone_migrate_link_rendering/index.mjs +1041 -0
- package/lib/build/js/dialtone_migrate_link_rendering/link-nav-test-examples.vue +97 -0
- package/lib/build/js/dialtone_migrate_link_rendering/link-nav.test.mjs +194 -0
- package/lib/build/js/dialtone_migrate_link_rendering/underline-test-examples.vue +57 -0
- package/lib/build/js/dialtone_migrate_link_rendering/underline.test.mjs +161 -0
- package/lib/build/js/dialtone_migrate_props/index.mjs +794 -0
- package/lib/build/js/dialtone_migrate_props/test.mjs +959 -0
- package/lib/build/js/dialtone_migration_helper/configs/base-to-semantic.mjs +8 -8
- package/lib/build/js/dialtone_migration_helper/configs/size-to-layout.mjs +10 -0
- package/lib/build/js/dialtone_migration_helper/configs/success-to-positive.mjs +73 -0
- package/lib/build/js/dialtone_migration_helper/configs/utility-class-to-token-stops.mjs +92 -12
- package/lib/build/js/dialtone_migration_helper/tests/base-to-semantic-test-examples.vue +10 -10
- package/lib/build/js/dialtone_migration_helper/tests/base-to-semantic.test.mjs +8 -8
- package/lib/build/js/dialtone_migration_helper/tests/size-to-layout-test-examples.vue +16 -0
- package/lib/build/js/dialtone_migration_helper/tests/size-to-layout.test.mjs +87 -0
- package/lib/build/js/dialtone_migration_helper/tests/success-to-positive-test-examples.vue +166 -0
- package/lib/build/js/dialtone_migration_helper/tests/success-to-positive.test.mjs +287 -0
- package/lib/build/js/dialtone_migration_helper/tests/utility-class-to-token-stops-radius-examples.vue +66 -0
- package/lib/build/js/dialtone_migration_helper/tests/utility-class-to-token-stops.test.mjs +170 -0
- package/lib/build/less/components/badge.less +1 -1
- package/lib/build/less/components/banner.less +1 -1
- package/lib/build/less/components/box.less +9 -22
- package/lib/build/less/components/description-list.less +4 -0
- package/lib/build/less/components/forms.less +4 -2
- package/lib/build/less/components/input.less +2 -2
- package/lib/build/less/components/link.less +18 -4
- package/lib/build/less/components/modal.less +1 -1
- package/lib/build/less/components/notice.less +3 -3
- package/lib/build/less/components/progress_circle.less +10 -2
- package/lib/build/less/components/prose.less +512 -0
- package/lib/build/less/components/rich-text-editor.less +31 -0
- package/lib/build/less/components/selects.less +1 -1
- package/lib/build/less/components/text.less +2 -0
- package/lib/build/less/components/toast.less +1 -1
- package/lib/build/less/dialtone.less +1 -0
- package/lib/build/less/recipes/leftbar_row.less +2 -2
- package/lib/build/less/recipes/settings_menu_button.less +1 -1
- package/lib/build/less/recipes/top_banner_info.less +1 -1
- package/lib/build/less/utilities/backgrounds.less +12 -0
- package/lib/build/less/utilities/borders.less +56 -89
- package/lib/build/less/utilities/colors.less +8 -0
- package/lib/build/less/utilities/effects.less +1 -0
- package/lib/build/less/utilities/flex.less +145 -18
- package/lib/build/less/utilities/grid.less +40 -152
- package/lib/build/less/utilities/layout.less +19 -7
- package/lib/build/less/utilities/sizing.less +148 -143
- package/lib/build/less/variables/visual-styles.less +2 -1
- package/lib/dist/dialtone-default-theme.css +2840 -1807
- package/lib/dist/dialtone-default-theme.min.css +1 -1
- package/lib/dist/dialtone-docs.json +1 -1
- package/lib/dist/dialtone.css +2747 -1756
- package/lib/dist/dialtone.min.css +1 -1
- package/lib/dist/js/dialtone_migrate_link_rendering/button-nav-test-examples.vue +92 -0
- package/lib/dist/js/dialtone_migrate_link_rendering/button-nav.test.mjs +272 -0
- package/lib/dist/js/dialtone_migrate_link_rendering/helpers.mjs +25 -0
- package/lib/dist/js/dialtone_migrate_link_rendering/index.mjs +1041 -0
- package/lib/dist/js/dialtone_migrate_link_rendering/link-nav-test-examples.vue +97 -0
- package/lib/dist/js/dialtone_migrate_link_rendering/link-nav.test.mjs +194 -0
- package/lib/dist/js/dialtone_migrate_link_rendering/underline-test-examples.vue +57 -0
- package/lib/dist/js/dialtone_migrate_link_rendering/underline.test.mjs +161 -0
- package/lib/dist/js/dialtone_migrate_props/index.mjs +794 -0
- package/lib/dist/js/dialtone_migrate_props/test.mjs +959 -0
- package/lib/dist/js/dialtone_migration_helper/configs/base-to-semantic.mjs +8 -8
- package/lib/dist/js/dialtone_migration_helper/configs/size-to-layout.mjs +10 -0
- package/lib/dist/js/dialtone_migration_helper/configs/success-to-positive.mjs +73 -0
- package/lib/dist/js/dialtone_migration_helper/configs/utility-class-to-token-stops.mjs +92 -12
- package/lib/dist/js/dialtone_migration_helper/tests/base-to-semantic-test-examples.vue +10 -10
- package/lib/dist/js/dialtone_migration_helper/tests/base-to-semantic.test.mjs +8 -8
- package/lib/dist/js/dialtone_migration_helper/tests/size-to-layout-test-examples.vue +16 -0
- package/lib/dist/js/dialtone_migration_helper/tests/size-to-layout.test.mjs +87 -0
- package/lib/dist/js/dialtone_migration_helper/tests/success-to-positive-test-examples.vue +166 -0
- package/lib/dist/js/dialtone_migration_helper/tests/success-to-positive.test.mjs +287 -0
- package/lib/dist/js/dialtone_migration_helper/tests/utility-class-to-token-stops-radius-examples.vue +66 -0
- package/lib/dist/js/dialtone_migration_helper/tests/utility-class-to-token-stops.test.mjs +170 -0
- package/lib/dist/tokens/tokens-101-dark.css +81 -45
- package/lib/dist/tokens/tokens-101-light.css +75 -39
- package/lib/dist/tokens/tokens-102-dark.css +81 -45
- package/lib/dist/tokens/tokens-102-light.css +75 -39
- package/lib/dist/tokens/tokens-103-dark.css +81 -45
- package/lib/dist/tokens/tokens-103-light.css +75 -39
- package/lib/dist/tokens/tokens-104-dark.css +81 -45
- package/lib/dist/tokens/tokens-104-light.css +75 -39
- package/lib/dist/tokens/tokens-105-dark.css +81 -45
- package/lib/dist/tokens/tokens-105-light.css +75 -39
- package/lib/dist/tokens/tokens-106-dark.css +81 -45
- package/lib/dist/tokens/tokens-106-light.css +75 -39
- package/lib/dist/tokens/tokens-107-dark.css +81 -45
- package/lib/dist/tokens/tokens-107-light.css +75 -39
- package/lib/dist/tokens/tokens-108-dark.css +81 -45
- package/lib/dist/tokens/tokens-108-light.css +75 -39
- package/lib/dist/tokens/tokens-109-dark.css +81 -45
- package/lib/dist/tokens/tokens-109-light.css +75 -39
- package/lib/dist/tokens/tokens-110-dark.css +81 -45
- package/lib/dist/tokens/tokens-110-light.css +75 -39
- package/lib/dist/tokens/tokens-111-dark.css +81 -45
- package/lib/dist/tokens/tokens-111-light.css +75 -39
- package/lib/dist/tokens/tokens-112-dark.css +81 -45
- package/lib/dist/tokens/tokens-112-light.css +75 -39
- package/lib/dist/tokens/tokens-113-dark.css +81 -45
- package/lib/dist/tokens/tokens-113-light.css +75 -39
- package/lib/dist/tokens/tokens-114-dark.css +81 -45
- package/lib/dist/tokens/tokens-114-light.css +75 -39
- package/lib/dist/tokens/tokens-115-dark.css +81 -45
- package/lib/dist/tokens/tokens-115-light.css +75 -39
- package/lib/dist/tokens/tokens-116-dark.css +81 -45
- package/lib/dist/tokens/tokens-116-light.css +75 -39
- package/lib/dist/tokens/tokens-117-dark.css +81 -45
- package/lib/dist/tokens/tokens-117-light.css +75 -39
- package/lib/dist/tokens/tokens-118-dark.css +81 -45
- package/lib/dist/tokens/tokens-118-light.css +75 -39
- package/lib/dist/tokens/tokens-119-dark.css +81 -45
- package/lib/dist/tokens/tokens-119-light.css +75 -39
- package/lib/dist/tokens/tokens-120-dark.css +81 -45
- package/lib/dist/tokens/tokens-120-light.css +75 -39
- package/lib/dist/tokens/tokens-121-dark.css +81 -45
- package/lib/dist/tokens/tokens-121-light.css +75 -39
- package/lib/dist/tokens/tokens-122-dark.css +81 -45
- package/lib/dist/tokens/tokens-122-light.css +75 -39
- package/lib/dist/tokens/tokens-123-dark.css +81 -45
- package/lib/dist/tokens/tokens-123-light.css +75 -39
- package/lib/dist/tokens/tokens-124-dark.css +81 -45
- package/lib/dist/tokens/tokens-124-light.css +75 -39
- package/lib/dist/tokens/tokens-125-dark.css +81 -45
- package/lib/dist/tokens/tokens-125-light.css +75 -39
- package/lib/dist/tokens/tokens-126-dark.css +81 -45
- package/lib/dist/tokens/tokens-126-light.css +75 -39
- package/lib/dist/tokens/tokens-127-dark.css +81 -45
- package/lib/dist/tokens/tokens-127-light.css +75 -39
- package/lib/dist/tokens/tokens-128-dark.css +81 -45
- package/lib/dist/tokens/tokens-128-light.css +75 -39
- package/lib/dist/tokens/tokens-129-dark.css +81 -45
- package/lib/dist/tokens/tokens-129-light.css +75 -39
- package/lib/dist/tokens/tokens-130-dark.css +81 -45
- package/lib/dist/tokens/tokens-130-light.css +75 -39
- package/lib/dist/tokens/tokens-131-dark.css +81 -45
- package/lib/dist/tokens/tokens-131-light.css +75 -39
- package/lib/dist/tokens/tokens-132-dark.css +81 -45
- package/lib/dist/tokens/tokens-132-light.css +75 -39
- package/lib/dist/tokens/tokens-133-dark.css +81 -45
- package/lib/dist/tokens/tokens-133-light.css +75 -39
- package/lib/dist/tokens/tokens-134-dark.css +81 -45
- package/lib/dist/tokens/tokens-134-light.css +75 -39
- package/lib/dist/tokens/tokens-135-dark.css +81 -45
- package/lib/dist/tokens/tokens-135-light.css +75 -39
- package/lib/dist/tokens/tokens-136-dark.css +81 -45
- package/lib/dist/tokens/tokens-136-light.css +75 -39
- package/lib/dist/tokens/tokens-137-dark.css +81 -45
- package/lib/dist/tokens/tokens-137-light.css +75 -39
- package/lib/dist/tokens/tokens-aegean-dark.css +81 -45
- package/lib/dist/tokens/tokens-aegean-light.css +75 -39
- package/lib/dist/tokens/tokens-base-dark.css +18 -12
- package/lib/dist/tokens/tokens-base-light.css +18 -12
- package/lib/dist/tokens/tokens-botany-dark.css +81 -45
- package/lib/dist/tokens/tokens-botany-light.css +75 -39
- package/lib/dist/tokens/tokens-buttercream-dark.css +81 -45
- package/lib/dist/tokens/tokens-buttercream-light.css +75 -39
- package/lib/dist/tokens/tokens-ceruleo-dark.css +81 -45
- package/lib/dist/tokens/tokens-ceruleo-light.css +75 -39
- package/lib/dist/tokens/tokens-debug-base.css +6 -0
- package/lib/dist/tokens/tokens-debug-dp.css +39 -3
- package/lib/dist/tokens/tokens-dp-dark.css +81 -45
- package/lib/dist/tokens/tokens-dp-light.css +75 -39
- package/lib/dist/tokens/tokens-expressive-dark.css +81 -45
- package/lib/dist/tokens/tokens-expressive-light.css +75 -39
- package/lib/dist/tokens/tokens-expressive-sm-dark.css +81 -45
- package/lib/dist/tokens/tokens-expressive-sm-light.css +75 -39
- package/lib/dist/tokens/tokens-high-desert-dark.css +81 -45
- package/lib/dist/tokens/tokens-high-desert-light.css +75 -39
- package/lib/dist/tokens/tokens-melon-dark.css +81 -45
- package/lib/dist/tokens/tokens-melon-light.css +75 -39
- package/lib/dist/tokens/tokens-plum-dark.css +81 -45
- package/lib/dist/tokens/tokens-plum-light.css +75 -39
- package/lib/dist/tokens/tokens-prota-deuter-dark.css +79 -43
- package/lib/dist/tokens/tokens-prota-deuter-light.css +74 -38
- package/lib/dist/tokens/tokens-sunflower-dark.css +81 -45
- package/lib/dist/tokens/tokens-sunflower-light.css +75 -39
- package/lib/dist/tokens/tokens-tmo-dark.css +81 -45
- package/lib/dist/tokens/tokens-tmo-light.css +75 -39
- package/lib/dist/tokens/tokens-trita-dark.css +81 -45
- package/lib/dist/tokens/tokens-trita-light.css +75 -39
- package/lib/dist/tokens/tokens-verdant-haze-dark.css +81 -45
- package/lib/dist/tokens/tokens-verdant-haze-light.css +75 -39
- package/lib/dist/tokens-docs.json +1 -1
- package/package.json +10 -5
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<!--
|
|
3
|
+
TEST FILE FOR SUCCESS-TO-POSITIVE MIGRATION
|
|
4
|
+
Tests replacement of `success` color references with `positive`.
|
|
5
|
+
-->
|
|
6
|
+
|
|
7
|
+
<!-- ============================================ -->
|
|
8
|
+
<!-- FOREGROUND UTILITIES (d-fc-success*) -->
|
|
9
|
+
<!-- ============================================ -->
|
|
10
|
+
|
|
11
|
+
<p class="d-fc-success">success foreground</p>
|
|
12
|
+
<p class="d-fc-success-strong">success-strong foreground</p>
|
|
13
|
+
<p class="d-fc-success-inverted">success inverted foreground</p>
|
|
14
|
+
<p class="d-fc-success-strong-inverted">success-strong inverted foreground</p>
|
|
15
|
+
|
|
16
|
+
<!-- ============================================ -->
|
|
17
|
+
<!-- SURFACE UTILITIES (d-bgc-success*) -->
|
|
18
|
+
<!-- ============================================ -->
|
|
19
|
+
|
|
20
|
+
<div class="d-bgc-success">success surface</div>
|
|
21
|
+
<div class="d-bgc-success-subtle">success-subtle surface</div>
|
|
22
|
+
<div class="d-bgc-success-strong">success-strong surface</div>
|
|
23
|
+
<div class="d-bgc-success-opaque">success-opaque surface</div>
|
|
24
|
+
<div class="d-bgc-success-subtle-opaque">success-subtle-opaque surface</div>
|
|
25
|
+
<div class="d-bgc-success-inverted">success inverted</div>
|
|
26
|
+
<div class="d-bgc-success-subtle-inverted">success-subtle inverted</div>
|
|
27
|
+
<div class="d-bgc-success-strong-inverted">success-strong inverted</div>
|
|
28
|
+
<div class="d-bgc-success-opaque-inverted">success-opaque inverted</div>
|
|
29
|
+
<div class="d-bgc-success-subtle-opaque-inverted">success-subtle-opaque inverted</div>
|
|
30
|
+
|
|
31
|
+
<!-- ============================================ -->
|
|
32
|
+
<!-- BORDER UTILITIES (d-bc-success*) -->
|
|
33
|
+
<!-- ============================================ -->
|
|
34
|
+
|
|
35
|
+
<div class="d-bc-success">success border</div>
|
|
36
|
+
<div class="d-bc-success-subtle">success-subtle border</div>
|
|
37
|
+
<div class="d-bc-success-strong">success-strong border</div>
|
|
38
|
+
<div class="d-bc-success-inverted">success inverted border</div>
|
|
39
|
+
<div class="d-bc-success-subtle-inverted">success-subtle inverted border</div>
|
|
40
|
+
<div class="d-bc-success-strong-inverted">success-strong inverted border</div>
|
|
41
|
+
|
|
42
|
+
<!-- ============================================ -->
|
|
43
|
+
<!-- PSEUDO & RESPONSIVE PREFIXED -->
|
|
44
|
+
<!-- ============================================ -->
|
|
45
|
+
|
|
46
|
+
<p class="h:d-fc-success">hover success text</p>
|
|
47
|
+
<p class="f:d-fc-success-strong">focus success-strong text</p>
|
|
48
|
+
<div class="sm:d-bgc-success">responsive success surface</div>
|
|
49
|
+
<div class="md:d-bc-success-subtle">responsive success-subtle border</div>
|
|
50
|
+
|
|
51
|
+
<!-- ============================================ -->
|
|
52
|
+
<!-- ALREADY-POSITIVE CLASSES (should NOT be touched) -->
|
|
53
|
+
<!-- ============================================ -->
|
|
54
|
+
|
|
55
|
+
<p class="d-fc-positive">already positive</p>
|
|
56
|
+
<div class="d-bgc-positive-subtle">already positive</div>
|
|
57
|
+
<div class="d-bc-positive-strong">already positive</div>
|
|
58
|
+
|
|
59
|
+
<!-- ============================================ -->
|
|
60
|
+
<!-- UNRELATED SEMANTIC FAMILIES (preserve) -->
|
|
61
|
+
<!-- ============================================ -->
|
|
62
|
+
|
|
63
|
+
<p class="d-fc-critical">critical text — preserve</p>
|
|
64
|
+
<div class="d-bgc-warning-subtle">warning surface — preserve</div>
|
|
65
|
+
|
|
66
|
+
<!-- ============================================ -->
|
|
67
|
+
<!-- ENGLISH WORDS WITH "success" PREFIX (preserve) -->
|
|
68
|
+
<!-- ============================================ -->
|
|
69
|
+
|
|
70
|
+
<p>The migration ran successfully.</p>
|
|
71
|
+
<p>This is a successful operation.</p>
|
|
72
|
+
</template>
|
|
73
|
+
|
|
74
|
+
<style>
|
|
75
|
+
/* ============================================ */
|
|
76
|
+
/* CSS VARIABLE: FOREGROUND */
|
|
77
|
+
/* ============================================ */
|
|
78
|
+
|
|
79
|
+
.test-fg-success {
|
|
80
|
+
color: var(--dt-color-foreground-success);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.test-fg-success-strong {
|
|
84
|
+
color: var(--dt-color-foreground-success-strong);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.test-fg-success-inverted {
|
|
88
|
+
color: var(--dt-color-foreground-success-inverted);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.test-fg-success-strong-inverted {
|
|
92
|
+
color: var(--dt-color-foreground-success-strong-inverted);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* ============================================ */
|
|
96
|
+
/* CSS VARIABLE: SURFACE */
|
|
97
|
+
/* ============================================ */
|
|
98
|
+
|
|
99
|
+
.test-surface-success {
|
|
100
|
+
background-color: var(--dt-color-surface-success);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.test-surface-success-opaque {
|
|
104
|
+
background-color: var(--dt-color-surface-success-opaque);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.test-surface-success-subtle-opaque {
|
|
108
|
+
background-color: var(--dt-color-surface-success-subtle-opaque);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.test-surface-success-subtle-opaque-inverted {
|
|
112
|
+
background-color: var(--dt-color-surface-success-subtle-opaque-inverted);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* ============================================ */
|
|
116
|
+
/* CSS VARIABLE: BORDER */
|
|
117
|
+
/* ============================================ */
|
|
118
|
+
|
|
119
|
+
.test-border-success {
|
|
120
|
+
border-color: var(--dt-color-border-success);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.test-border-success-subtle-inverted {
|
|
124
|
+
border-color: var(--dt-color-border-success-subtle-inverted);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/* ============================================ */
|
|
128
|
+
/* CSS VARIABLE: LINK */
|
|
129
|
+
/* ============================================ */
|
|
130
|
+
|
|
131
|
+
.test-link-success {
|
|
132
|
+
color: var(--dt-color-link-success);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.test-link-success-hover {
|
|
136
|
+
color: var(--dt-color-link-success-hover);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.test-link-success-inverted {
|
|
140
|
+
color: var(--dt-color-link-success-inverted);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.test-link-success-inverted-hover {
|
|
144
|
+
color: var(--dt-color-link-success-inverted-hover);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/* ============================================ */
|
|
148
|
+
/* SKIP CASES (should NOT be replaced) */
|
|
149
|
+
/* ============================================ */
|
|
150
|
+
|
|
151
|
+
/* Unrelated tokens with "success" elsewhere */
|
|
152
|
+
.test-skip-unrelated-token {
|
|
153
|
+
--my-success-color: red;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* Already migrated */
|
|
157
|
+
.test-already-positive {
|
|
158
|
+
color: var(--dt-color-foreground-positive);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* Comments with English usage of "success" — preserve */
|
|
162
|
+
.test-comment {
|
|
163
|
+
/* Operation succeeded successfully — keep this comment text */
|
|
164
|
+
color: red;
|
|
165
|
+
}
|
|
166
|
+
</style>
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { describe, it, before } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { readFile } from 'node:fs/promises';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { dirname, join } from 'node:path';
|
|
6
|
+
import config from '../configs/success-to-positive.mjs';
|
|
7
|
+
import { applyConfig } from './helpers.mjs';
|
|
8
|
+
|
|
9
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
const apply = (input) => applyConfig(config, input);
|
|
11
|
+
|
|
12
|
+
describe('success-to-positive config', () => {
|
|
13
|
+
// ─── CSS variable references (data-driven per family) ──────────────────────
|
|
14
|
+
|
|
15
|
+
// Suffix variants per family. The four families (foreground, surface, border,
|
|
16
|
+
// link) emit different subsets, so each family lists exactly the suffixes
|
|
17
|
+
// it ships with.
|
|
18
|
+
const variableTests = [
|
|
19
|
+
['foreground', [
|
|
20
|
+
'', '-strong', '-inverted', '-strong-inverted',
|
|
21
|
+
]],
|
|
22
|
+
['surface', [
|
|
23
|
+
'', '-subtle', '-strong',
|
|
24
|
+
'-opaque', '-subtle-opaque',
|
|
25
|
+
'-inverted', '-subtle-inverted', '-strong-inverted',
|
|
26
|
+
'-opaque-inverted', '-subtle-opaque-inverted',
|
|
27
|
+
]],
|
|
28
|
+
['border', [
|
|
29
|
+
'', '-subtle', '-strong',
|
|
30
|
+
'-inverted', '-subtle-inverted', '-strong-inverted',
|
|
31
|
+
]],
|
|
32
|
+
['link', [
|
|
33
|
+
'', '-hover', '-inverted', '-inverted-hover',
|
|
34
|
+
]],
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
for (const [category, suffixes] of variableTests) {
|
|
38
|
+
describe(`var(--dt-color-${category}-success*) → var(--dt-color-${category}-positive*)`, () => {
|
|
39
|
+
for (const suffix of suffixes) {
|
|
40
|
+
const input = `var(--dt-color-${category}-success${suffix})`;
|
|
41
|
+
const expected = `var(--dt-color-${category}-positive${suffix})`;
|
|
42
|
+
it(`${input} → ${expected}`, () => {
|
|
43
|
+
assert.equal(apply(input), expected);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ─── Utility class renames (data-driven per prefix) ────────────────────────
|
|
50
|
+
|
|
51
|
+
const utilityTests = [
|
|
52
|
+
['fc', [
|
|
53
|
+
'', '-strong', '-inverted', '-strong-inverted',
|
|
54
|
+
]],
|
|
55
|
+
['bgc', [
|
|
56
|
+
'', '-subtle', '-strong',
|
|
57
|
+
'-opaque', '-subtle-opaque',
|
|
58
|
+
'-inverted', '-subtle-inverted', '-strong-inverted',
|
|
59
|
+
'-opaque-inverted', '-subtle-opaque-inverted',
|
|
60
|
+
]],
|
|
61
|
+
['bc', [
|
|
62
|
+
'', '-subtle', '-strong',
|
|
63
|
+
'-inverted', '-subtle-inverted', '-strong-inverted',
|
|
64
|
+
]],
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
for (const [prefix, suffixes] of utilityTests) {
|
|
68
|
+
describe(`d-${prefix}-success* → d-${prefix}-positive*`, () => {
|
|
69
|
+
for (const suffix of suffixes) {
|
|
70
|
+
const input = `d-${prefix}-success${suffix}`;
|
|
71
|
+
const expected = `d-${prefix}-positive${suffix}`;
|
|
72
|
+
it(`${input} → ${expected}`, () => {
|
|
73
|
+
assert.equal(apply(input), expected);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// ─── Utility class context: pseudo / responsive / inside attributes ────────
|
|
80
|
+
|
|
81
|
+
describe('utility class context cases', () => {
|
|
82
|
+
const cases = [
|
|
83
|
+
['h:d-fc-success', 'h:d-fc-positive', 'hover pseudo prefix'],
|
|
84
|
+
['f:d-bgc-success-subtle', 'f:d-bgc-positive-subtle', 'focus pseudo + subtle'],
|
|
85
|
+
['sm:d-bgc-success', 'sm:d-bgc-positive', 'sm responsive'],
|
|
86
|
+
['md:d-bc-success-strong', 'md:d-bc-positive-strong', 'md responsive + strong'],
|
|
87
|
+
[
|
|
88
|
+
'<div class="d-bgc-success d-fc-success-strong">',
|
|
89
|
+
'<div class="d-bgc-positive d-fc-positive-strong">',
|
|
90
|
+
'multiple classes in class attribute',
|
|
91
|
+
],
|
|
92
|
+
[
|
|
93
|
+
':class="\'d-bc-success-subtle\'"',
|
|
94
|
+
':class="\'d-bc-positive-subtle\'"',
|
|
95
|
+
'dynamic :class binding',
|
|
96
|
+
],
|
|
97
|
+
[
|
|
98
|
+
'`d-bgc-success`',
|
|
99
|
+
'`d-bgc-positive`',
|
|
100
|
+
'template literal containing only d-bgc-success',
|
|
101
|
+
],
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
for (const [input, expected, label] of cases) {
|
|
105
|
+
it(label, () => {
|
|
106
|
+
assert.equal(apply(input), expected);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// ─── CSS property context: full declarations are rewritten correctly ───────
|
|
112
|
+
|
|
113
|
+
describe('CSS property context', () => {
|
|
114
|
+
const cssCases = [
|
|
115
|
+
[
|
|
116
|
+
'.a { color: var(--dt-color-foreground-success); }',
|
|
117
|
+
'.a { color: var(--dt-color-foreground-positive); }',
|
|
118
|
+
'color: foreground',
|
|
119
|
+
],
|
|
120
|
+
[
|
|
121
|
+
'.a { background-color: var(--dt-color-surface-success-subtle); }',
|
|
122
|
+
'.a { background-color: var(--dt-color-surface-positive-subtle); }',
|
|
123
|
+
'background-color: surface-subtle',
|
|
124
|
+
],
|
|
125
|
+
[
|
|
126
|
+
'.a { border-color: var(--dt-color-border-success); }',
|
|
127
|
+
'.a { border-color: var(--dt-color-border-positive); }',
|
|
128
|
+
'border-color: border',
|
|
129
|
+
],
|
|
130
|
+
[
|
|
131
|
+
'.a { color: var(--dt-color-link-success-hover); }',
|
|
132
|
+
'.a { color: var(--dt-color-link-positive-hover); }',
|
|
133
|
+
'color: link-hover',
|
|
134
|
+
],
|
|
135
|
+
[
|
|
136
|
+
'--my-token: var(--dt-color-surface-success-opaque-inverted);',
|
|
137
|
+
'--my-token: var(--dt-color-surface-positive-opaque-inverted);',
|
|
138
|
+
'custom property assignment with deepest variant',
|
|
139
|
+
],
|
|
140
|
+
];
|
|
141
|
+
|
|
142
|
+
for (const [input, expected, label] of cssCases) {
|
|
143
|
+
it(label, () => {
|
|
144
|
+
assert.equal(apply(input), expected);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// ─── Skip cases (must NOT be modified) ─────────────────────────────────────
|
|
150
|
+
|
|
151
|
+
describe('skip cases', () => {
|
|
152
|
+
const skipCases = [
|
|
153
|
+
// English words that contain "success" as a prefix
|
|
154
|
+
['Operation completed successfully.', 'English word "successfully"'],
|
|
155
|
+
['The successful run reported nothing.', 'English word "successful"'],
|
|
156
|
+
['// Skip on success: avoid retrying.', 'comment containing the word success'],
|
|
157
|
+
// Custom-named tokens / classes that are not part of the rename family
|
|
158
|
+
['var(--dt-color-success-something)', 'unknown CSS variable shape'],
|
|
159
|
+
['var(--my-success-color)', 'unrelated custom property name'],
|
|
160
|
+
['.d-fc-success-foo', 'utility-like class with non-allowed suffix'],
|
|
161
|
+
['d-status-success', 'class with success in middle, not d-fc/bgc/bc'],
|
|
162
|
+
['my-d-bgc-success', 'class-name suffix that contains a utility token'],
|
|
163
|
+
['custom-d-fc-success-strong', 'longer custom class containing utility token'],
|
|
164
|
+
// Already migrated
|
|
165
|
+
['var(--dt-color-foreground-positive)', 'already migrated foreground'],
|
|
166
|
+
['d-bgc-positive-subtle', 'already migrated utility'],
|
|
167
|
+
// Other base / semantic family names should be untouched
|
|
168
|
+
['d-fc-critical', 'unrelated semantic'],
|
|
169
|
+
['d-bgc-warning-subtle', 'unrelated semantic family'],
|
|
170
|
+
];
|
|
171
|
+
|
|
172
|
+
for (const [input, label] of skipCases) {
|
|
173
|
+
it(`unchanged: ${label}`, () => {
|
|
174
|
+
assert.equal(apply(input), input);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
// ─── Boundary: success-foo should NOT match because -foo isn't a suffix ────
|
|
180
|
+
|
|
181
|
+
describe('suffix boundary protection', () => {
|
|
182
|
+
it('does not consume "-foo" suffix when matching success', () => {
|
|
183
|
+
assert.equal(apply('d-bgc-success-foo'), 'd-bgc-success-foo');
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it('does not partial-match before "fully"', () => {
|
|
187
|
+
assert.equal(
|
|
188
|
+
apply('Test ran successfully across all envs.'),
|
|
189
|
+
'Test ran successfully across all envs.',
|
|
190
|
+
);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('does not rewrite d-bgc-success when followed by an unknown hyphen-letter suffix', () => {
|
|
194
|
+
// d-bgc-success-x is invalid; the regex should bail out and leave it alone
|
|
195
|
+
assert.equal(apply('d-bgc-success-x'), 'd-bgc-success-x');
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('skips template-literal interpolation patterns (manual migration required)', () => {
|
|
199
|
+
// ` ${...} ` interpolation after `success-` is not a known suffix; flag for
|
|
200
|
+
// manual migration instead of guessing the runtime value.
|
|
201
|
+
const input = '`d-bgc-success-${state}`';
|
|
202
|
+
assert.equal(apply(input), input);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// ─── Component-specific tokens ─────────────────────────────────────────────
|
|
207
|
+
|
|
208
|
+
describe('component-specific tokens (badge / inputs)', () => {
|
|
209
|
+
const cases = [
|
|
210
|
+
['var(--dt-badge-color-background-success)', 'var(--dt-badge-color-background-positive)'],
|
|
211
|
+
['var(--dt-inputs-color-border-success)', 'var(--dt-inputs-color-border-positive)'],
|
|
212
|
+
];
|
|
213
|
+
for (const [input, expected] of cases) {
|
|
214
|
+
it(`${input} → ${expected}`, () => {
|
|
215
|
+
assert.equal(apply(input), expected);
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
// ─── Cross-family in one pass ──────────────────────────────────────────────
|
|
221
|
+
|
|
222
|
+
describe('cross-family migration in a single pass', () => {
|
|
223
|
+
it('rewrites foreground, surface, border, link, and utility classes together', () => {
|
|
224
|
+
const input = [
|
|
225
|
+
'<div class="d-fc-success d-bgc-success-subtle d-bc-success-strong">',
|
|
226
|
+
' styled',
|
|
227
|
+
'</div>',
|
|
228
|
+
'<style>',
|
|
229
|
+
'.x {',
|
|
230
|
+
' color: var(--dt-color-foreground-success);',
|
|
231
|
+
' background: var(--dt-color-surface-success);',
|
|
232
|
+
' border: 1px solid var(--dt-color-border-success-subtle);',
|
|
233
|
+
' --link: var(--dt-color-link-success-inverted-hover);',
|
|
234
|
+
'}',
|
|
235
|
+
'</style>',
|
|
236
|
+
].join('\n');
|
|
237
|
+
|
|
238
|
+
const output = apply(input);
|
|
239
|
+
assert.ok(output.includes('d-fc-positive'));
|
|
240
|
+
assert.ok(output.includes('d-bgc-positive-subtle'));
|
|
241
|
+
assert.ok(output.includes('d-bc-positive-strong'));
|
|
242
|
+
assert.ok(output.includes('var(--dt-color-foreground-positive)'));
|
|
243
|
+
assert.ok(output.includes('var(--dt-color-surface-positive)'));
|
|
244
|
+
assert.ok(output.includes('var(--dt-color-border-positive-subtle)'));
|
|
245
|
+
assert.ok(output.includes('var(--dt-color-link-positive-inverted-hover)'));
|
|
246
|
+
// No stray "success" references should remain.
|
|
247
|
+
assert.ok(!output.includes('success'));
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
// ─── Integration: example .vue file ────────────────────────────────────────
|
|
252
|
+
|
|
253
|
+
describe('example .vue file integration', () => {
|
|
254
|
+
let output;
|
|
255
|
+
|
|
256
|
+
before(async () => {
|
|
257
|
+
const input = await readFile(
|
|
258
|
+
join(__dirname, 'success-to-positive-test-examples.vue'), 'utf8',
|
|
259
|
+
);
|
|
260
|
+
output = apply(input);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
it('replaces every success utility class', () => {
|
|
264
|
+
assert.ok(output.includes('d-fc-positive'));
|
|
265
|
+
assert.ok(output.includes('d-bgc-positive-subtle'));
|
|
266
|
+
assert.ok(output.includes('d-bc-positive-strong'));
|
|
267
|
+
assert.ok(output.includes('d-bgc-positive-subtle-opaque-inverted'));
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
it('replaces every CSS variable family', () => {
|
|
271
|
+
assert.ok(output.includes('var(--dt-color-foreground-positive)'));
|
|
272
|
+
assert.ok(output.includes('var(--dt-color-foreground-positive-strong-inverted)'));
|
|
273
|
+
assert.ok(output.includes('var(--dt-color-surface-positive-opaque)'));
|
|
274
|
+
assert.ok(output.includes('var(--dt-color-border-positive-subtle-inverted)'));
|
|
275
|
+
assert.ok(output.includes('var(--dt-color-link-positive-hover)'));
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it('preserves English words and unrelated classes', () => {
|
|
279
|
+
// English usage of "successfully" / "successful" left intact
|
|
280
|
+
assert.ok(output.includes('successfully'));
|
|
281
|
+
assert.ok(output.includes('successful operation'));
|
|
282
|
+
// unrelated semantic families pass through
|
|
283
|
+
assert.ok(output.includes('d-fc-critical'));
|
|
284
|
+
assert.ok(output.includes('d-bgc-warning-subtle'));
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
});
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Manual-test fixture for the radius portion of the `utility-class-to-token-stops` migration.
|
|
3
|
+
Point `pnpm dialtone-migration-helper` at this file to exercise every rewrite in one pass.
|
|
4
|
+
|
|
5
|
+
Expected transformations:
|
|
6
|
+
- d-bar{N} → d-bar-{stop}
|
|
7
|
+
- d-btr{N} → d-bbsr-{stop}
|
|
8
|
+
- d-bbr{N} → d-bber-{stop}
|
|
9
|
+
- d-blr{N} → d-bisr-{stop}
|
|
10
|
+
- d-brr{N} → d-bier-{stop}
|
|
11
|
+
- d-{btr|bbr|blr|brr}-{pill|circle} → d-{bbsr|bber|bisr|bier}-{pill|circle}
|
|
12
|
+
- d-bar-pill, d-bar-circle, d-bar-unset: unchanged (canonical)
|
|
13
|
+
-->
|
|
14
|
+
<template>
|
|
15
|
+
<!-- All-corners: every legacy numeric stop -->
|
|
16
|
+
<div class="d-bar0">bar0 → bar-0</div>
|
|
17
|
+
<div class="d-bar1">bar1 → bar-100</div>
|
|
18
|
+
<div class="d-bar2">bar2 → bar-200</div>
|
|
19
|
+
<div class="d-bar4">bar4 → bar-300</div>
|
|
20
|
+
<div class="d-bar6">bar6 → bar-350</div>
|
|
21
|
+
<div class="d-bar8">bar8 → bar-400</div>
|
|
22
|
+
<div class="d-bar12">bar12 → bar-450</div>
|
|
23
|
+
<div class="d-bar16">bar16 → bar-500</div>
|
|
24
|
+
<div class="d-bar24">bar24 → bar-550 (new token)</div>
|
|
25
|
+
<div class="d-bar32">bar32 → bar-600</div>
|
|
26
|
+
|
|
27
|
+
<!-- Side-pair numeric: physical → logical -->
|
|
28
|
+
<div class="d-btr6">btr6 → bbsr-350 (top pair)</div>
|
|
29
|
+
<div class="d-bbr8">bbr8 → bber-400 (bottom pair)</div>
|
|
30
|
+
<div class="d-blr12">blr12 → bisr-450 (left pair)</div>
|
|
31
|
+
<div class="d-brr16">brr16 → bier-500 (right pair)</div>
|
|
32
|
+
<div class="d-btr24">btr24 → bbsr-550</div>
|
|
33
|
+
<div class="d-bbr32">bbr32 → bber-600</div>
|
|
34
|
+
|
|
35
|
+
<!-- Side-pair keyword: physical → logical -->
|
|
36
|
+
<div class="d-btr-pill">btr-pill → bbsr-pill</div>
|
|
37
|
+
<div class="d-btr-circle">btr-circle → bbsr-circle</div>
|
|
38
|
+
<div class="d-bbr-pill">bbr-pill → bber-pill</div>
|
|
39
|
+
<div class="d-blr-pill">blr-pill → bisr-pill</div>
|
|
40
|
+
<div class="d-brr-circle">brr-circle → bier-circle</div>
|
|
41
|
+
|
|
42
|
+
<!-- Canonical names: unchanged -->
|
|
43
|
+
<div class="d-bar-pill">bar-pill (unchanged)</div>
|
|
44
|
+
<div class="d-bar-circle">bar-circle (unchanged)</div>
|
|
45
|
+
<div class="d-bar-unset">bar-unset (unchanged)</div>
|
|
46
|
+
|
|
47
|
+
<!-- Mixed in one class attribute (multi-class rewrite) -->
|
|
48
|
+
<div class="d-p-200 d-bar6 d-btr8 d-blr-pill d-fc-primary">
|
|
49
|
+
mixed: bar6+btr8+blr-pill get rewritten; d-p-200 and d-fc-primary untouched
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
<!-- Class binding via object syntax (plain strings inside) -->
|
|
53
|
+
<div :class="{ 'd-bar6': rounded, 'd-btr-pill': pillTop }">
|
|
54
|
+
object-syntax binding
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<!-- Class binding via template literal -->
|
|
58
|
+
<div :class="`d-bar${size} d-btr${size}`">
|
|
59
|
+
template-literal (only matches literal suffixes; dynamic interpolation stays as-is)
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<!-- New logical names (already correct): not touched -->
|
|
63
|
+
<div class="d-bar-350 d-bbsr-400 d-bier-pill d-bssr-500 d-beer-circle">
|
|
64
|
+
new logical names stay as-is
|
|
65
|
+
</div>
|
|
66
|
+
</template>
|