@dialpad/dialtone-css 8.80.0-next.1 → 8.80.0-next.3

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.
Files changed (187) hide show
  1. package/lib/build/js/dialtone_migrate_link_rendering/button-nav-test-examples.vue +92 -0
  2. package/lib/build/js/dialtone_migrate_link_rendering/button-nav.test.mjs +272 -0
  3. package/lib/build/js/dialtone_migrate_link_rendering/helpers.mjs +25 -0
  4. package/lib/build/js/dialtone_migrate_link_rendering/index.mjs +1041 -0
  5. package/lib/build/js/dialtone_migrate_link_rendering/link-nav-test-examples.vue +97 -0
  6. package/lib/build/js/dialtone_migrate_link_rendering/link-nav.test.mjs +194 -0
  7. package/lib/build/js/dialtone_migrate_link_rendering/underline-test-examples.vue +57 -0
  8. package/lib/build/js/dialtone_migrate_link_rendering/underline.test.mjs +161 -0
  9. package/lib/build/js/dialtone_migrate_props/index.mjs +794 -0
  10. package/lib/build/js/dialtone_migrate_props/test.mjs +959 -0
  11. package/lib/build/js/dialtone_migration_helper/configs/base-to-semantic.mjs +8 -8
  12. package/lib/build/js/dialtone_migration_helper/configs/size-to-layout.mjs +10 -0
  13. package/lib/build/js/dialtone_migration_helper/configs/success-to-positive.mjs +73 -0
  14. package/lib/build/js/dialtone_migration_helper/configs/utility-class-to-token-stops.mjs +92 -12
  15. package/lib/build/js/dialtone_migration_helper/tests/base-to-semantic-test-examples.vue +10 -10
  16. package/lib/build/js/dialtone_migration_helper/tests/base-to-semantic.test.mjs +8 -8
  17. package/lib/build/js/dialtone_migration_helper/tests/size-to-layout-test-examples.vue +16 -0
  18. package/lib/build/js/dialtone_migration_helper/tests/size-to-layout.test.mjs +87 -0
  19. package/lib/build/js/dialtone_migration_helper/tests/success-to-positive-test-examples.vue +166 -0
  20. package/lib/build/js/dialtone_migration_helper/tests/success-to-positive.test.mjs +287 -0
  21. package/lib/build/js/dialtone_migration_helper/tests/utility-class-to-token-stops-radius-examples.vue +66 -0
  22. package/lib/build/js/dialtone_migration_helper/tests/utility-class-to-token-stops.test.mjs +170 -0
  23. package/lib/build/less/components/badge.less +1 -1
  24. package/lib/build/less/components/banner.less +1 -1
  25. package/lib/build/less/components/box.less +228 -0
  26. package/lib/build/less/components/description-list.less +4 -0
  27. package/lib/build/less/components/forms.less +4 -2
  28. package/lib/build/less/components/input.less +2 -2
  29. package/lib/build/less/components/link.less +18 -4
  30. package/lib/build/less/components/modal.less +1 -1
  31. package/lib/build/less/components/notice.less +3 -3
  32. package/lib/build/less/components/progress_circle.less +10 -2
  33. package/lib/build/less/components/prose.less +512 -0
  34. package/lib/build/less/components/rich-text-editor.less +7 -0
  35. package/lib/build/less/components/selects.less +1 -1
  36. package/lib/build/less/components/text.less +2 -2
  37. package/lib/build/less/components/toast.less +1 -1
  38. package/lib/build/less/dialtone.less +2 -0
  39. package/lib/build/less/recipes/leftbar_row.less +1 -0
  40. package/lib/build/less/recipes/settings_menu_button.less +1 -1
  41. package/lib/build/less/recipes/top_banner_info.less +1 -1
  42. package/lib/build/less/utilities/backgrounds.less +12 -0
  43. package/lib/build/less/utilities/borders.less +56 -89
  44. package/lib/build/less/utilities/colors.less +8 -0
  45. package/lib/build/less/utilities/effects.less +1 -0
  46. package/lib/build/less/utilities/flex.less +145 -18
  47. package/lib/build/less/utilities/grid.less +40 -152
  48. package/lib/build/less/utilities/layout.less +19 -7
  49. package/lib/build/less/utilities/sizing.less +148 -143
  50. package/lib/build/less/variables/visual-styles.less +2 -1
  51. package/lib/dist/dialtone-default-theme.css +4364 -1756
  52. package/lib/dist/dialtone-default-theme.min.css +1 -1
  53. package/lib/dist/dialtone-docs.json +1 -1
  54. package/lib/dist/dialtone.css +4271 -1705
  55. package/lib/dist/dialtone.min.css +1 -1
  56. package/lib/dist/js/dialtone_migrate_link_rendering/button-nav-test-examples.vue +92 -0
  57. package/lib/dist/js/dialtone_migrate_link_rendering/button-nav.test.mjs +272 -0
  58. package/lib/dist/js/dialtone_migrate_link_rendering/helpers.mjs +25 -0
  59. package/lib/dist/js/dialtone_migrate_link_rendering/index.mjs +1041 -0
  60. package/lib/dist/js/dialtone_migrate_link_rendering/link-nav-test-examples.vue +97 -0
  61. package/lib/dist/js/dialtone_migrate_link_rendering/link-nav.test.mjs +194 -0
  62. package/lib/dist/js/dialtone_migrate_link_rendering/underline-test-examples.vue +57 -0
  63. package/lib/dist/js/dialtone_migrate_link_rendering/underline.test.mjs +161 -0
  64. package/lib/dist/js/dialtone_migrate_props/index.mjs +794 -0
  65. package/lib/dist/js/dialtone_migrate_props/test.mjs +959 -0
  66. package/lib/dist/js/dialtone_migration_helper/configs/base-to-semantic.mjs +8 -8
  67. package/lib/dist/js/dialtone_migration_helper/configs/size-to-layout.mjs +10 -0
  68. package/lib/dist/js/dialtone_migration_helper/configs/success-to-positive.mjs +73 -0
  69. package/lib/dist/js/dialtone_migration_helper/configs/utility-class-to-token-stops.mjs +92 -12
  70. package/lib/dist/js/dialtone_migration_helper/tests/base-to-semantic-test-examples.vue +10 -10
  71. package/lib/dist/js/dialtone_migration_helper/tests/base-to-semantic.test.mjs +8 -8
  72. package/lib/dist/js/dialtone_migration_helper/tests/size-to-layout-test-examples.vue +16 -0
  73. package/lib/dist/js/dialtone_migration_helper/tests/size-to-layout.test.mjs +87 -0
  74. package/lib/dist/js/dialtone_migration_helper/tests/success-to-positive-test-examples.vue +166 -0
  75. package/lib/dist/js/dialtone_migration_helper/tests/success-to-positive.test.mjs +287 -0
  76. package/lib/dist/js/dialtone_migration_helper/tests/utility-class-to-token-stops-radius-examples.vue +66 -0
  77. package/lib/dist/js/dialtone_migration_helper/tests/utility-class-to-token-stops.test.mjs +170 -0
  78. package/lib/dist/tokens/tokens-101-dark.css +81 -45
  79. package/lib/dist/tokens/tokens-101-light.css +75 -39
  80. package/lib/dist/tokens/tokens-102-dark.css +81 -45
  81. package/lib/dist/tokens/tokens-102-light.css +75 -39
  82. package/lib/dist/tokens/tokens-103-dark.css +81 -45
  83. package/lib/dist/tokens/tokens-103-light.css +75 -39
  84. package/lib/dist/tokens/tokens-104-dark.css +81 -45
  85. package/lib/dist/tokens/tokens-104-light.css +75 -39
  86. package/lib/dist/tokens/tokens-105-dark.css +81 -45
  87. package/lib/dist/tokens/tokens-105-light.css +75 -39
  88. package/lib/dist/tokens/tokens-106-dark.css +81 -45
  89. package/lib/dist/tokens/tokens-106-light.css +75 -39
  90. package/lib/dist/tokens/tokens-107-dark.css +81 -45
  91. package/lib/dist/tokens/tokens-107-light.css +75 -39
  92. package/lib/dist/tokens/tokens-108-dark.css +81 -45
  93. package/lib/dist/tokens/tokens-108-light.css +75 -39
  94. package/lib/dist/tokens/tokens-109-dark.css +81 -45
  95. package/lib/dist/tokens/tokens-109-light.css +75 -39
  96. package/lib/dist/tokens/tokens-110-dark.css +81 -45
  97. package/lib/dist/tokens/tokens-110-light.css +75 -39
  98. package/lib/dist/tokens/tokens-111-dark.css +81 -45
  99. package/lib/dist/tokens/tokens-111-light.css +75 -39
  100. package/lib/dist/tokens/tokens-112-dark.css +81 -45
  101. package/lib/dist/tokens/tokens-112-light.css +75 -39
  102. package/lib/dist/tokens/tokens-113-dark.css +81 -45
  103. package/lib/dist/tokens/tokens-113-light.css +75 -39
  104. package/lib/dist/tokens/tokens-114-dark.css +81 -45
  105. package/lib/dist/tokens/tokens-114-light.css +75 -39
  106. package/lib/dist/tokens/tokens-115-dark.css +81 -45
  107. package/lib/dist/tokens/tokens-115-light.css +75 -39
  108. package/lib/dist/tokens/tokens-116-dark.css +81 -45
  109. package/lib/dist/tokens/tokens-116-light.css +75 -39
  110. package/lib/dist/tokens/tokens-117-dark.css +81 -45
  111. package/lib/dist/tokens/tokens-117-light.css +75 -39
  112. package/lib/dist/tokens/tokens-118-dark.css +81 -45
  113. package/lib/dist/tokens/tokens-118-light.css +75 -39
  114. package/lib/dist/tokens/tokens-119-dark.css +81 -45
  115. package/lib/dist/tokens/tokens-119-light.css +75 -39
  116. package/lib/dist/tokens/tokens-120-dark.css +81 -45
  117. package/lib/dist/tokens/tokens-120-light.css +75 -39
  118. package/lib/dist/tokens/tokens-121-dark.css +81 -45
  119. package/lib/dist/tokens/tokens-121-light.css +75 -39
  120. package/lib/dist/tokens/tokens-122-dark.css +81 -45
  121. package/lib/dist/tokens/tokens-122-light.css +75 -39
  122. package/lib/dist/tokens/tokens-123-dark.css +81 -45
  123. package/lib/dist/tokens/tokens-123-light.css +75 -39
  124. package/lib/dist/tokens/tokens-124-dark.css +81 -45
  125. package/lib/dist/tokens/tokens-124-light.css +75 -39
  126. package/lib/dist/tokens/tokens-125-dark.css +81 -45
  127. package/lib/dist/tokens/tokens-125-light.css +75 -39
  128. package/lib/dist/tokens/tokens-126-dark.css +81 -45
  129. package/lib/dist/tokens/tokens-126-light.css +75 -39
  130. package/lib/dist/tokens/tokens-127-dark.css +81 -45
  131. package/lib/dist/tokens/tokens-127-light.css +75 -39
  132. package/lib/dist/tokens/tokens-128-dark.css +81 -45
  133. package/lib/dist/tokens/tokens-128-light.css +75 -39
  134. package/lib/dist/tokens/tokens-129-dark.css +81 -45
  135. package/lib/dist/tokens/tokens-129-light.css +75 -39
  136. package/lib/dist/tokens/tokens-130-dark.css +81 -45
  137. package/lib/dist/tokens/tokens-130-light.css +75 -39
  138. package/lib/dist/tokens/tokens-131-dark.css +81 -45
  139. package/lib/dist/tokens/tokens-131-light.css +75 -39
  140. package/lib/dist/tokens/tokens-132-dark.css +81 -45
  141. package/lib/dist/tokens/tokens-132-light.css +75 -39
  142. package/lib/dist/tokens/tokens-133-dark.css +81 -45
  143. package/lib/dist/tokens/tokens-133-light.css +75 -39
  144. package/lib/dist/tokens/tokens-134-dark.css +81 -45
  145. package/lib/dist/tokens/tokens-134-light.css +75 -39
  146. package/lib/dist/tokens/tokens-135-dark.css +81 -45
  147. package/lib/dist/tokens/tokens-135-light.css +75 -39
  148. package/lib/dist/tokens/tokens-136-dark.css +81 -45
  149. package/lib/dist/tokens/tokens-136-light.css +75 -39
  150. package/lib/dist/tokens/tokens-137-dark.css +81 -45
  151. package/lib/dist/tokens/tokens-137-light.css +75 -39
  152. package/lib/dist/tokens/tokens-aegean-dark.css +81 -45
  153. package/lib/dist/tokens/tokens-aegean-light.css +75 -39
  154. package/lib/dist/tokens/tokens-base-dark.css +18 -12
  155. package/lib/dist/tokens/tokens-base-light.css +18 -12
  156. package/lib/dist/tokens/tokens-botany-dark.css +81 -45
  157. package/lib/dist/tokens/tokens-botany-light.css +75 -39
  158. package/lib/dist/tokens/tokens-buttercream-dark.css +81 -45
  159. package/lib/dist/tokens/tokens-buttercream-light.css +75 -39
  160. package/lib/dist/tokens/tokens-ceruleo-dark.css +81 -45
  161. package/lib/dist/tokens/tokens-ceruleo-light.css +75 -39
  162. package/lib/dist/tokens/tokens-debug-base.css +6 -0
  163. package/lib/dist/tokens/tokens-debug-dp.css +39 -3
  164. package/lib/dist/tokens/tokens-dp-dark.css +81 -45
  165. package/lib/dist/tokens/tokens-dp-light.css +75 -39
  166. package/lib/dist/tokens/tokens-expressive-dark.css +81 -45
  167. package/lib/dist/tokens/tokens-expressive-light.css +75 -39
  168. package/lib/dist/tokens/tokens-expressive-sm-dark.css +81 -45
  169. package/lib/dist/tokens/tokens-expressive-sm-light.css +75 -39
  170. package/lib/dist/tokens/tokens-high-desert-dark.css +81 -45
  171. package/lib/dist/tokens/tokens-high-desert-light.css +75 -39
  172. package/lib/dist/tokens/tokens-melon-dark.css +81 -45
  173. package/lib/dist/tokens/tokens-melon-light.css +75 -39
  174. package/lib/dist/tokens/tokens-plum-dark.css +81 -45
  175. package/lib/dist/tokens/tokens-plum-light.css +75 -39
  176. package/lib/dist/tokens/tokens-prota-deuter-dark.css +79 -43
  177. package/lib/dist/tokens/tokens-prota-deuter-light.css +74 -38
  178. package/lib/dist/tokens/tokens-sunflower-dark.css +81 -45
  179. package/lib/dist/tokens/tokens-sunflower-light.css +75 -39
  180. package/lib/dist/tokens/tokens-tmo-dark.css +81 -45
  181. package/lib/dist/tokens/tokens-tmo-light.css +75 -39
  182. package/lib/dist/tokens/tokens-trita-dark.css +81 -45
  183. package/lib/dist/tokens/tokens-trita-light.css +75 -39
  184. package/lib/dist/tokens/tokens-verdant-haze-dark.css +81 -45
  185. package/lib/dist/tokens/tokens-verdant-haze-light.css +75 -39
  186. package/lib/dist/tokens-docs.json +1 -1
  187. package/package.json +4 -4
@@ -0,0 +1,170 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import config from '../configs/utility-class-to-token-stops.mjs';
4
+ import { applyConfig } from './helpers.mjs';
5
+
6
+ const apply = (input) => applyConfig(config, input);
7
+
8
+ describe('utility-class-to-token-stops config', () => {
9
+ // ─── Off-scale pixel-indexed sizing classes (DLT-3330) ────────────────
10
+ //
11
+ // Old legacy Tier 1 calc-based selectors → new hyphenated px-suffixed selectors.
12
+ // d-w1 → d-w-1px, d-h2 → d-h-2px, d-hmn8 → d-hmn-8px, etc.
13
+
14
+ describe('off-scale sizing — legacy small-value selectors migrate to Npx', () => {
15
+ const prefixes = ['h', 'w', 'hmn', 'hmx', 'wmn', 'wmx'];
16
+ const pxValues = [1, 2, 8, 20, 24];
17
+
18
+ for (const prefix of prefixes) {
19
+ for (const px of pxValues) {
20
+ const from = `d-${prefix}${px}`;
21
+ const to = `d-${prefix}-${px}px`;
22
+ it(`${from} → ${to}`, () => {
23
+ assert.equal(apply(`<div class="${from}" />`), `<div class="${to}" />`);
24
+ });
25
+ }
26
+ }
27
+ });
28
+
29
+ // ─── Existing scale-indexed rewrites unchanged (smoke tests) ──────────
30
+
31
+ describe('scale-indexed sizing — unchanged', () => {
32
+ const cases = [
33
+ ['d-h16', 'd-h-25'],
34
+ ['d-w32', 'd-w-50'],
35
+ ['d-w64', 'd-w-100'],
36
+ ['d-hmn96', 'd-hmn-150'],
37
+ ['d-hmx128', 'd-hmx-200'],
38
+ ['d-w1024', 'd-w-1600'],
39
+ ['d-wmn16', 'd-wmn-25'],
40
+ ];
41
+ for (const [from, to] of cases) {
42
+ it(`${from} → ${to}`, () => {
43
+ assert.equal(apply(`<div class="${from}" />`), `<div class="${to}" />`);
44
+ });
45
+ }
46
+ });
47
+
48
+ // ─── Regex disambiguation: longer alternatives must win over shorter ones ─
49
+
50
+ describe('regex alternation — longest match wins', () => {
51
+ it('d-w1024 matches 1024, not 1', () => {
52
+ assert.equal(apply(`<div class="d-w1024" />`), `<div class="d-w-1600" />`);
53
+ });
54
+ it('d-w128 matches 128, not 1 or 2', () => {
55
+ assert.equal(apply(`<div class="d-w128" />`), `<div class="d-w-200" />`);
56
+ });
57
+ it('d-w24 matches 24 (off-scale), not 2', () => {
58
+ assert.equal(apply(`<div class="d-w24" />`), `<div class="d-w-24px" />`);
59
+ });
60
+ it('d-h20 matches 20 (off-scale), not 2', () => {
61
+ assert.equal(apply(`<div class="d-h20" />`), `<div class="d-h-20px" />`);
62
+ });
63
+ });
64
+
65
+ // ─── Spacing/margin/padding classes still map to spacing stops ────────
66
+
67
+ describe('margin / padding / gap — unchanged behavior', () => {
68
+ const cases = [
69
+ ['d-m8', 'd-m-100'], // margin 8px → spacing-100
70
+ ['d-p8', 'd-p-100'], // padding 8px → spacing-100
71
+ ['d-g8', 'd-g-100'], // gap 8px → spacing-100
72
+ ['d-mt16', 'd-mt-200'], // margin-top 16px → spacing-200
73
+ ['d-pb24', 'd-pb-300'], // padding-bottom 24px → spacing-300
74
+ ];
75
+ for (const [from, to] of cases) {
76
+ it(`${from} → ${to}`, () => {
77
+ assert.equal(apply(`<div class="${from}" />`), `<div class="${to}" />`);
78
+ });
79
+ }
80
+ });
81
+
82
+ // ─── Multi-class strings ──────────────────────────────────────────────
83
+
84
+ describe('multi-class migration', () => {
85
+ it('migrates each off-scale sizing class in a space-separated list', () => {
86
+ const input = `<div class="d-w1 d-h2 d-size-25 d-hmn8 d-wmx24" />`;
87
+ const expected = `<div class="d-w-1px d-h-2px d-size-25 d-hmn-8px d-wmx-24px" />`;
88
+ assert.equal(apply(input), expected);
89
+ });
90
+ });
91
+
92
+ // ─── Border-radius migration (DLT-3329) ───────────────────────────────
93
+
94
+ describe('border-radius all-corners — legacy pixel-suffix to token stop', () => {
95
+ const cases = [
96
+ ['d-bar0', 'd-bar-0'],
97
+ ['d-bar1', 'd-bar-100'],
98
+ ['d-bar2', 'd-bar-200'],
99
+ ['d-bar4', 'd-bar-300'],
100
+ ['d-bar6', 'd-bar-350'],
101
+ ['d-bar8', 'd-bar-400'],
102
+ ['d-bar12', 'd-bar-450'],
103
+ ['d-bar16', 'd-bar-500'],
104
+ ['d-bar24', 'd-bar-550'],
105
+ ['d-bar32', 'd-bar-600'],
106
+ ];
107
+ for (const [from, to] of cases) {
108
+ it(`${from} → ${to}`, () => {
109
+ assert.equal(apply(`<div class="${from}" />`), `<div class="${to}" />`);
110
+ });
111
+ }
112
+ });
113
+
114
+ describe('border-radius side-pair numeric — physical prefix to logical prefix', () => {
115
+ const cases = [
116
+ ['d-btr6', 'd-bbsr-350'], // top → block-start pair
117
+ ['d-bbr8', 'd-bber-400'], // bottom → block-end pair
118
+ ['d-blr12', 'd-bisr-450'], // left → inline-start pair
119
+ ['d-brr16', 'd-bier-500'], // right → inline-end pair
120
+ ['d-btr24', 'd-bbsr-550'], // new 550 stop
121
+ ['d-bbr32', 'd-bber-600'],
122
+ ['d-blr0', 'd-bisr-0'],
123
+ ['d-brr1', 'd-bier-100'],
124
+ ];
125
+ for (const [from, to] of cases) {
126
+ it(`${from} → ${to}`, () => {
127
+ assert.equal(apply(`<div class="${from}" />`), `<div class="${to}" />`);
128
+ });
129
+ }
130
+ });
131
+
132
+ describe('border-radius side-pair keyword — pill/circle', () => {
133
+ const cases = [
134
+ ['d-btr-pill', 'd-bbsr-pill'],
135
+ ['d-btr-circle', 'd-bbsr-circle'],
136
+ ['d-bbr-pill', 'd-bber-pill'],
137
+ ['d-bbr-circle', 'd-bber-circle'],
138
+ ['d-blr-pill', 'd-bisr-pill'],
139
+ ['d-blr-circle', 'd-bisr-circle'],
140
+ ['d-brr-pill', 'd-bier-pill'],
141
+ ['d-brr-circle', 'd-bier-circle'],
142
+ ];
143
+ for (const [from, to] of cases) {
144
+ it(`${from} → ${to}`, () => {
145
+ assert.equal(apply(`<div class="${from}" />`), `<div class="${to}" />`);
146
+ });
147
+ }
148
+ });
149
+
150
+ describe('border-radius canonical keyword names — unchanged', () => {
151
+ const cases = [
152
+ 'd-bar-pill',
153
+ 'd-bar-circle',
154
+ 'd-bar-unset',
155
+ ];
156
+ for (const unchanged of cases) {
157
+ it(`${unchanged} stays as ${unchanged}`, () => {
158
+ assert.equal(apply(`<div class="${unchanged}" />`), `<div class="${unchanged}" />`);
159
+ });
160
+ }
161
+ });
162
+
163
+ describe('border-radius multi-class migration', () => {
164
+ it('rewrites mixed legacy classes in one string', () => {
165
+ const input = `<div class="d-bar6 d-btr8 d-blr-pill d-p-200" />`;
166
+ const expected = `<div class="d-bar-350 d-bbsr-400 d-bisr-pill d-p-200" />`;
167
+ assert.equal(apply(input), expected);
168
+ });
169
+ });
170
+ });
@@ -74,7 +74,7 @@
74
74
 
75
75
  &--positive,
76
76
  &--success {
77
- --badge-color-background: var(--dt-badge-color-background-success);
77
+ --badge-color-background: var(--dt-badge-color-background-positive);
78
78
  }
79
79
 
80
80
  &--warning {
@@ -19,7 +19,7 @@
19
19
  --banner-dialog-padding-y: var(--dt-spacing-100);
20
20
  --banner-dialog-padding-x: var(--dt-spacing-200);
21
21
  --notice-icon-gap: var(--dt-spacing-100);
22
- --notice-actions-align: inherit;
22
+ --notice-actions-align: center;
23
23
 
24
24
  position: fixed;
25
25
  inset-block-start: 0;
@@ -0,0 +1,228 @@
1
+ //
2
+ // DIALTONE
3
+ // COMPONENTS: BOX
4
+ //
5
+ // These are the styles for box component.
6
+ //
7
+ //
8
+ // TABLE OF CONTENTS
9
+ // • @PROPERTY REGISTRATIONS
10
+ // • PARAMETRIC MIXINS
11
+ // • VALUE LISTS
12
+ // • BASE STYLE
13
+ // • MODIFIERS
14
+
15
+ // @@ @PROPERTY REGISTRATIONS
16
+ // ----------------------------------------------------------------------------
17
+ @property --box-p { syntax: "*"; inherits: false; }
18
+
19
+ @property --box-pi { syntax: "*"; inherits: false; }
20
+
21
+ @property --box-pis { syntax: "*"; inherits: false; }
22
+
23
+ @property --box-pie { syntax: "*"; inherits: false; }
24
+
25
+ @property --box-pbl { syntax: "*"; inherits: false; }
26
+
27
+ @property --box-pbs { syntax: "*"; inherits: false; }
28
+
29
+ @property --box-pbe { syntax: "*"; inherits: false; }
30
+
31
+ @property --box-surface { syntax: "<color>"; inherits: false; initial-value: transparent; }
32
+
33
+ @property --box-bc { syntax: "<color>"; inherits: false; initial-value: transparent; }
34
+
35
+ @property --box-bw { syntax: "*"; inherits: false; }
36
+
37
+ @property --box-bwi { syntax: "*"; inherits: false; }
38
+
39
+ @property --box-bwis { syntax: "*"; inherits: false; }
40
+
41
+ @property --box-bwie { syntax: "*"; inherits: false; }
42
+
43
+ @property --box-bwbl { syntax: "*"; inherits: false; }
44
+
45
+ @property --box-bwbs { syntax: "*"; inherits: false; }
46
+
47
+ @property --box-bwbe { syntax: "*"; inherits: false; }
48
+
49
+ @property --box-br { syntax: "<length-percentage>"; inherits: false; initial-value: 0; }
50
+
51
+ @property --box-shadow { syntax: "*"; inherits: false; }
52
+
53
+ @property --box-of { syntax: "*"; inherits: false; }
54
+
55
+ // ============================================================================
56
+ // $ PARAMETRIC MIXINS
57
+ // ----------------------------------------------------------------------------
58
+ ._box-token(@prefix; @prop; @token; @names) {
59
+ each(@names, {
60
+ .d-box--@{prefix}-@{value} { @{prop}: ~"var(--@{token}-@{value})"; }
61
+ });
62
+ }
63
+
64
+ ._box-layout(@prop) {
65
+ &-1px { @{prop}: var(--dt-layout-1px); }
66
+ &-2px { @{prop}: var(--dt-layout-2px); }
67
+ &-8px { @{prop}: var(--dt-layout-8px); }
68
+ &-25 { @{prop}: var(--dt-layout-25); }
69
+ &-20px { @{prop}: var(--dt-layout-20px); }
70
+ &-24px { @{prop}: var(--dt-layout-24px); }
71
+ &-50 { @{prop}: var(--dt-layout-50); }
72
+ &-75 { @{prop}: var(--dt-layout-75); }
73
+ each(range(0, 1600, 100), {
74
+ &-@{value} { @{prop}: ~"var(--dt-layout-@{value})"; }
75
+ });
76
+ // Percentage tokens
77
+ each(@box-layout-percent-values, {
78
+ &-@{value}p { @{prop}: ~"var(--dt-layout-@{value}-percent)"; }
79
+ });
80
+ }
81
+
82
+ ._box-border-width(@prop) {
83
+ each(@box-border-width-values, {
84
+ &-@{value} { @{prop}: ~"var(--dt-size-border-@{value})"; }
85
+ });
86
+ }
87
+
88
+ ._box-spacing(@prop) {
89
+ // Stops outside both range() sequences: 1 (not a multiple of 25), 525 (not a multiple of 50)
90
+ &-1 { @{prop}: var(--dt-spacing-1); }
91
+ &-525 { @{prop}: var(--dt-spacing-525); }
92
+
93
+ each(range(0, 200, 25), {
94
+ &-@{value} { @{prop}: ~"var(--dt-spacing-@{value})"; }
95
+ });
96
+
97
+ each(range(250, 800, 50), {
98
+ &-@{value} { @{prop}: ~"var(--dt-spacing-@{value})"; }
99
+ });
100
+ }
101
+
102
+ // ============================================================================
103
+ // $ VALUE LISTS
104
+ // ----------------------------------------------------------------------------
105
+ @box-surface-values: primary, secondary, moderate, bold, strong, contrast, backdrop, brand, info, warning, critical, positive, success, brand-subtle, brand-strong, info-subtle, info-strong, warning-subtle, warning-strong, critical-subtle, critical-strong, positive-subtle, positive-strong, success-subtle, success-strong, primary-opaque, secondary-opaque, moderate-opaque, bold-opaque, strong-opaque, contrast-opaque, brand-opaque, brand-subtle-opaque, info-opaque, info-subtle-opaque, warning-opaque, warning-subtle-opaque, critical-opaque, critical-subtle-opaque, positive-opaque, positive-subtle-opaque, success-opaque, success-subtle-opaque;
106
+
107
+ @box-border-color-values: subtle, default, moderate, bold, accent, focus, brand, warning, critical, info, positive, success, brand-subtle, brand-strong, warning-subtle, warning-strong, critical-subtle, critical-strong, info-subtle, info-strong, positive-subtle, positive-strong, success-subtle, success-strong;
108
+
109
+ @box-border-width-values: 0, 50, 100, 150, 200, 300, 400;
110
+ @box-layout-percent-values: 10, 20, 25, 30, 33, 40, 50, 60, 66, 70, 75, 80, 90, 95, 100;
111
+ @box-shadow-values: small, medium, large, extra-large, card;
112
+ @box-overflow-values: hidden, scroll, auto, clip, visible;
113
+
114
+ @layer dialtone.components {
115
+
116
+ // @@ BASE STYLE
117
+ // ----------------------------------------------------------------------------
118
+ .d-box {
119
+ box-sizing: border-box;
120
+
121
+ // Overflow
122
+ overflow: var(--box-of, visible);
123
+
124
+ // Surface — OKLCH relative syntax supports d-bgo* opacity utilities
125
+ background-color: oklch(from var(--box-surface) l c h / var(--bgo, alpha));
126
+ border-color: oklch(from var(--box-bc) l c h / var(--bco, alpha));
127
+
128
+ // Border — always solid, no visible border until borderWidth prop is set.
129
+ // Width cascade: specific → axis → shorthand → 0
130
+ border-style: solid;
131
+ border-block-start-width: var(--box-bwbs, var(--box-bwbl, var(--box-bw, 0)));
132
+ border-block-end-width: var(--box-bwbe, var(--box-bwbl, var(--box-bw, 0)));
133
+ border-inline-start-width: var(--box-bwis, var(--box-bwi, var(--box-bw, 0)));
134
+ border-inline-end-width: var(--box-bwie, var(--box-bwi, var(--box-bw, 0)));
135
+ border-radius: var(--box-br);
136
+
137
+ // Shadow
138
+ box-shadow: var(--box-shadow, none);
139
+
140
+ // Padding cascade: specific → axis → shorthand → 0
141
+ padding-block: var(--box-pbs, var(--box-pbl, var(--box-p, 0))) var(--box-pbe, var(--box-pbl, var(--box-p, 0)));
142
+ padding-inline: var(--box-pis, var(--box-pi, var(--box-p, 0))) var(--box-pie, var(--box-pi, var(--box-p, 0)));
143
+ }
144
+
145
+ // ============================================================================
146
+ // $ MODIFIERS
147
+ // ----------------------------------------------------------------------------
148
+ // $$ PADDING
149
+ // ----------------------------------------------------------------------------
150
+ .d-box--p { ._box-spacing(--box-p); }
151
+ .d-box--pi { ._box-spacing(--box-pi); }
152
+ .d-box--pis { ._box-spacing(--box-pis); }
153
+ .d-box--pie { ._box-spacing(--box-pie); }
154
+ .d-box--pbl { ._box-spacing(--box-pbl); }
155
+ .d-box--pbs { ._box-spacing(--box-pbs); }
156
+ .d-box--pbe { ._box-spacing(--box-pbe); }
157
+
158
+ // ----------------------------------------------------------------------------
159
+ // $$ SURFACE
160
+ // ----------------------------------------------------------------------------
161
+ ._box-token(surface; --box-surface; dt-color-surface; @box-surface-values);
162
+
163
+ // ----------------------------------------------------------------------------
164
+ // $$ BORDER
165
+ // ----------------------------------------------------------------------------
166
+ // ── Border ──────────────────────────────────────────────────────────────────
167
+ .d-box--bc-transparent { --box-bc: transparent; }
168
+ ._box-token(bc; --box-bc; dt-color-border; @box-border-color-values);
169
+
170
+ @box-border-radius-values: 0, 100, 200, 300, 350, 400, 450, 500, 550, 600;
171
+
172
+ // Border width — 7 axes × border-width scale
173
+ .d-box--bw { ._box-border-width(--box-bw); }
174
+ .d-box--bwi { ._box-border-width(--box-bwi); }
175
+ .d-box--bwis { ._box-border-width(--box-bwis); }
176
+ .d-box--bwie { ._box-border-width(--box-bwie); }
177
+ .d-box--bwbl { ._box-border-width(--box-bwbl); }
178
+ .d-box--bwbs { ._box-border-width(--box-bwbs); }
179
+ .d-box--bwbe { ._box-border-width(--box-bwbe); }
180
+
181
+ // Border radius
182
+ each(@box-border-radius-values, {
183
+ .d-box--br-@{value} { --box-br: ~"var(--dt-size-radius-@{value})"; }
184
+ });
185
+ .d-box--br-pill { --box-br: var(--dt-size-radius-pill); }
186
+ .d-box--br-circle { --box-br: var(--dt-size-radius-circle); }
187
+
188
+ // ----------------------------------------------------------------------------
189
+ // $$ SHADOW
190
+ // ----------------------------------------------------------------------------
191
+ // ── Shadow ──────────────────────────────────────────────────────────────────
192
+ ._box-token(shadow; --box-shadow; dt-shadow; @box-shadow-values);
193
+
194
+ // ----------------------------------------------------------------------------
195
+ // $$ SIZING
196
+ // ----------------------------------------------------------------------------
197
+ // Layout token values → modifier classes. Raw CSS fallback → inline :style.
198
+ .d-box--is { ._box-layout(inline-size); }
199
+ .d-box--bls { ._box-layout(block-size); }
200
+ .d-box--min-is { ._box-layout(min-inline-size); }
201
+ .d-box--max-is { ._box-layout(max-inline-size); }
202
+ .d-box--min-bls { ._box-layout(min-block-size); }
203
+ .d-box--max-bls { ._box-layout(max-block-size); }
204
+
205
+ // ----------------------------------------------------------------------------
206
+ // $$ OVERFLOW
207
+ // ----------------------------------------------------------------------------
208
+ each(@box-overflow-values, {
209
+ .d-box--of-@{value} { --box-of: @value; }
210
+ });
211
+
212
+ // ----------------------------------------------------------------------------
213
+ // $$ SCROLLBAR
214
+ // ----------------------------------------------------------------------------
215
+ // Inner viewport wrapper — only rendered when scrollbar prop is active.
216
+ // OverlayScrollbars uses this as the viewport element (el.children[0]).
217
+ // :has() detects the wrapper — CSS reacts to its presence without JS class toggling.
218
+ .d-box__scrollbar-content {
219
+ inline-size: 100%;
220
+ block-size: 100%;
221
+ overflow: auto; // Native scroll fallback when OverlayScrollbars is unavailable
222
+ }
223
+
224
+ .d-box:has(> .d-box__scrollbar-content) {
225
+ overflow: hidden;
226
+ }
227
+
228
+ }
@@ -1,3 +1,7 @@
1
+ // Register gap modifier var as non-inheriting so nested description lists
2
+ // don't pick up an ancestor's gap override.
3
+ @property --description-list-gap { syntax: "*"; inherits: false; }
4
+
1
5
  @layer dialtone.components {
2
6
  .d-description-list {
3
7
  display: flex;
@@ -157,7 +157,8 @@ fieldset {
157
157
  }
158
158
  }
159
159
 
160
- .d-validation-message--critical {
160
+ .d-validation-message--critical,
161
+ .d-validation-message--error {
161
162
  --validation-color-text: var(--dt-color-foreground-critical);
162
163
 
163
164
  &::before {
@@ -165,7 +166,8 @@ fieldset {
165
166
  }
166
167
  }
167
168
 
168
- .d-validation-message--positive {
169
+ .d-validation-message--positive,
170
+ .d-validation-message--success {
169
171
  --validation-color-text: var(--dt-color-foreground-positive);
170
172
 
171
173
  &::before {
@@ -300,12 +300,12 @@
300
300
  }
301
301
 
302
302
  .d-input--positive {
303
- --input-color-border: var(--dt-inputs-color-border-success) !important;
303
+ --input-color-border: var(--dt-inputs-color-border-positive) !important;
304
304
  }
305
305
 
306
306
  // @deprecated Use .d-input--positive
307
307
  .d-input--success {
308
- --input-color-border: var(--dt-inputs-color-border-success) !important;
308
+ --input-color-border: var(--dt-inputs-color-border-positive) !important;
309
309
  }
310
310
 
311
311
  // ============================================================================
@@ -95,8 +95,15 @@
95
95
  // ----------------------------------------------------------------------------
96
96
  &--positive,
97
97
  &--success {
98
- --link-color-default: var(--dt-color-link-success);
99
- --link-color-default-hover: var(--dt-color-link-success-hover);
98
+ --link-color-default: var(--dt-color-link-positive);
99
+ --link-color-default-hover: var(--dt-color-link-positive-hover);
100
+ }
101
+
102
+ // $$ INFO
103
+ // ----------------------------------------------------------------------------
104
+ &--info {
105
+ --link-color-default: var(--dt-color-link-info);
106
+ --link-color-default-hover: var(--dt-color-link-info-hover);
100
107
  }
101
108
 
102
109
  // $$ MUTED
@@ -154,8 +161,8 @@
154
161
  // ----------------------------------------------------------------------------
155
162
  &--inverted-positive,
156
163
  &--inverted-success {
157
- --link-color-default: var(--dt-color-link-success-inverted);
158
- --link-color-default-hover: var(--dt-color-link-success-inverted-hover);
164
+ --link-color-default: var(--dt-color-link-positive-inverted);
165
+ --link-color-default-hover: var(--dt-color-link-positive-inverted-hover);
159
166
  }
160
167
 
161
168
  // $$ INVERTED WARNING
@@ -165,6 +172,13 @@
165
172
  --link-color-default-hover: var(--dt-color-link-warning-inverted-hover);
166
173
  }
167
174
 
175
+ // $$ INVERTED INFO
176
+ // ----------------------------------------------------------------------------
177
+ &--inverted-info {
178
+ --link-color-default: var(--dt-color-link-info-inverted);
179
+ --link-color-default-hover: var(--dt-color-link-info-inverted-hover);
180
+ }
181
+
168
182
  // $$ INVERTED MUTED
169
183
  // ----------------------------------------------------------------------------
170
184
  &--inverted-muted {
@@ -287,7 +287,7 @@
287
287
 
288
288
  &--positive,
289
289
  &--success {
290
- --modal-banner-color-background: var(--dt-color-surface-success);
290
+ --modal-banner-color-background: var(--dt-color-surface-positive);
291
291
  }
292
292
 
293
293
  &--general {
@@ -144,7 +144,7 @@
144
144
  .d-banner--info,
145
145
  .d-toast--info {
146
146
  --notice-color-background: var(--dt-color-surface-info);
147
- --notice-color-icon: var(--dt-color-blue-800);
147
+ --notice-color-icon: var(--dt-color-foreground-info);
148
148
 
149
149
  &.d-notice--important,
150
150
  &.d-banner--important,
@@ -162,13 +162,13 @@
162
162
  .d-notice--success,
163
163
  .d-banner--success,
164
164
  .d-toast--success {
165
- --notice-color-background: var(--dt-color-surface-success);
165
+ --notice-color-background: var(--dt-color-surface-positive);
166
166
  --notice-color-icon: var(--dt-color-foreground-positive);
167
167
 
168
168
  &.d-notice--important,
169
169
  &.d-banner--important,
170
170
  &.d-toast--important {
171
- --notice-color-background: var(--dt-color-surface-success-strong);
171
+ --notice-color-background: var(--dt-color-surface-positive-strong);
172
172
  --notice-color-text: var(--dt-color-foreground-primary-inverted);
173
173
  }
174
174
  }
@@ -4,6 +4,14 @@
4
4
  //
5
5
  // https://dialtone.dialpad.com/components/progress-circle
6
6
 
7
+ // @@ @PROPERTY REGISTRATIONS
8
+ // ----------------------------------------------------------------------------
9
+ // `--progress-size` is only read on `.d-progress-circle` itself, so registering
10
+ // as non-inheriting is safe. `--progress-color` is NOT registered — it is set
11
+ // on `.d-progress-circle` and consumed by descendant `.d-progress-circle__shape`
12
+ // elements via inheritance.
13
+ @property --progress-size { syntax: "*"; inherits: false; }
14
+
7
15
  @layer dialtone.components {
8
16
  .d-progress-circle {
9
17
  --progress-size: var(--dt-icon-size-500);
@@ -24,12 +32,12 @@
24
32
 
25
33
  &--brand { --progress-color: var(--dt-color-border-brand); }
26
34
  &--critical { --progress-color: var(--dt-color-border-critical); }
27
- &--positive { --progress-color: var(--dt-color-border-success); }
35
+ &--positive { --progress-color: var(--dt-color-border-positive); }
28
36
  &--warning { --progress-color: var(--dt-color-border-warning); }
29
37
  // AI fill gradient is an SVG <linearGradient> applied in the Vue component;
30
38
  // the track intentionally keeps the default border color.
31
39
  &--ai { --progress-color: var(--dt-color-border-bold); }
32
- &--info { --progress-color: var(--dt-color-blue-600); } // TODO: I still have to create "info" design tokens
40
+ &--info { --progress-color: var(--dt-color-border-info); }
33
41
  }
34
42
 
35
43
  .d-progress-circle__bar {