@navecss/tokens 0.1.1 → 0.3.0
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/README.md +3 -3
- package/TOKENS.md +1 -0
- package/dist/core-contract.json +1 -1
- package/dist/lib/bin.js +28 -5
- package/dist/lib/facade.js +11 -5
- package/dist/lib/formats.js +27 -6
- package/dist/lib/out-path-conflict.d.ts +3 -0
- package/dist/lib/out-path-conflict.js +7 -0
- package/dist/lib/read-manifest.d.ts +2 -0
- package/dist/lib/read-manifest.js +17 -0
- package/dist/lib/reader.d.ts +6 -0
- package/dist/lib/reader.js +41 -41
- package/dist/lib/reserved-keys.d.ts +1 -0
- package/dist/lib/reserved-keys.js +18 -0
- package/dist/lib/resolve-value.d.ts +8 -0
- package/dist/lib/resolve-value.js +56 -0
- package/dist/lib/theming/comment-open-tracker.js +189 -0
- package/dist/lib/theming/copy-lint.d.ts +1 -1
- package/dist/lib/theming/copy-lint.js +1 -1
- package/dist/lib/theming/emit.js +1 -1
- package/dist/lib/theming/neutral.js +1 -1
- package/dist/lib/theming/seed-channel-split.js +8 -3
- package/dist/lib/theming/third-party-provenance.d.ts +1 -1
- package/dist/lib/theming/third-party-provenance.js +1 -1
- package/dist/lib/validate.js +17 -3
- package/dist/palette-record.json +52 -52
- package/dist/tokens.css +41 -34
- package/dist/tokens.d.ts +47 -2
- package/dist/tokens.js +6 -2
- package/package.json +5 -6
- package/tokens.json +65 -1
|
@@ -13,6 +13,8 @@ export function linesThatBeginInsideAnUnclosedComment(lines) {
|
|
|
13
13
|
isInsideAnOpenComment = isLineStillInsideAnOpenComment(line, isInsideAnOpenComment, reading);
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
+
markLinesFlaggedByTheUrlOpaqueReading(lines, beginningsInsideAnUnclosedComment);
|
|
17
|
+
markLinesFlaggedByTheEscapedLineBreakReading(lines, beginningsInsideAnUnclosedComment);
|
|
16
18
|
return beginningsInsideAnUnclosedComment;
|
|
17
19
|
}
|
|
18
20
|
const AS_THE_TOKENIZER_READS_IT = {
|
|
@@ -79,3 +81,190 @@ function indexAfterAStringLiteral(line, quoteIndex, quote) {
|
|
|
79
81
|
}
|
|
80
82
|
return -1;
|
|
81
83
|
}
|
|
84
|
+
function markLinesFlaggedByTheUrlOpaqueReading(lines, into) {
|
|
85
|
+
let state = { isInsideAnOpenComment: false, urlCarry: 'none' };
|
|
86
|
+
for (const [index, line] of lines.entries()) {
|
|
87
|
+
if (state.isInsideAnOpenComment)
|
|
88
|
+
into.add(index);
|
|
89
|
+
state = scanLineWithOpaqueUrlContent(line, state);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function resumeUrlCarry(line, urlCarry) {
|
|
93
|
+
if (urlCarry === 'none')
|
|
94
|
+
return 0;
|
|
95
|
+
return urlCarry === 'pending' ? resolveUrlContent(line, 0) : indexAfterUnquotedUrlContent(line, 0);
|
|
96
|
+
}
|
|
97
|
+
function scanLineWithOpaqueUrlContent(line, state) {
|
|
98
|
+
const cursor = resumeUrlCarry(line, state.urlCarry);
|
|
99
|
+
if (typeof cursor === 'string')
|
|
100
|
+
return { isInsideAnOpenComment: false, urlCarry: cursor };
|
|
101
|
+
return scanLineForOpaqueUrlContentAndComments(line, state.isInsideAnOpenComment, cursor);
|
|
102
|
+
}
|
|
103
|
+
function scanLineForOpaqueUrlContentAndComments(line, wasInsideAnOpenComment, cursor) {
|
|
104
|
+
let isInsideAnOpenComment = wasInsideAnOpenComment;
|
|
105
|
+
let index = cursor;
|
|
106
|
+
while (index < line.length) {
|
|
107
|
+
if (isInsideAnOpenComment) {
|
|
108
|
+
const closerIndex = line.indexOf('*/', index);
|
|
109
|
+
if (closerIndex === -1)
|
|
110
|
+
return { isInsideAnOpenComment: true, urlCarry: 'none' };
|
|
111
|
+
isInsideAnOpenComment = false;
|
|
112
|
+
index = closerIndex + 2;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const urlLookup = tryToSkipAnUnquotedUrlToken(line, index);
|
|
116
|
+
if (typeof urlLookup === 'string')
|
|
117
|
+
return { isInsideAnOpenComment: false, urlCarry: urlLookup };
|
|
118
|
+
if (urlLookup !== undefined) {
|
|
119
|
+
index = urlLookup;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const character = line[index];
|
|
123
|
+
if (isAQuoteCharacter(character)) {
|
|
124
|
+
const afterTheString = indexAfterAStringLiteral(line, index, character);
|
|
125
|
+
index = afterTheString === -1 ? line.length : afterTheString;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (line.startsWith('/*', index)) {
|
|
129
|
+
isInsideAnOpenComment = true;
|
|
130
|
+
index += 2;
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
index += 1;
|
|
134
|
+
}
|
|
135
|
+
return { isInsideAnOpenComment, urlCarry: 'none' };
|
|
136
|
+
}
|
|
137
|
+
function isAnIdentifierCharacter(character) {
|
|
138
|
+
return (character !== undefined && (/[A-Za-z0-9_-]/.test(character) || character.codePointAt(0) > 0x7f));
|
|
139
|
+
}
|
|
140
|
+
function tryToSkipAnUnquotedUrlToken(line, cursor) {
|
|
141
|
+
if (isAnIdentifierCharacter(line[cursor - 1]) || /[#@]/.test(line[cursor - 1]))
|
|
142
|
+
return undefined;
|
|
143
|
+
if (!/^url\(/i.test(line.slice(cursor, cursor + 4)))
|
|
144
|
+
return undefined;
|
|
145
|
+
return resolveUrlContent(line, cursor + 4);
|
|
146
|
+
}
|
|
147
|
+
function resolveUrlContent(line, cursor) {
|
|
148
|
+
let index = cursor;
|
|
149
|
+
while (index < line.length && /\s/.test(line[index]))
|
|
150
|
+
index += 1;
|
|
151
|
+
if (index === line.length)
|
|
152
|
+
return 'pending';
|
|
153
|
+
if (isAQuoteCharacter(line[index]))
|
|
154
|
+
return index;
|
|
155
|
+
return indexAfterUnquotedUrlContent(line, index);
|
|
156
|
+
}
|
|
157
|
+
function indexAfterUnquotedUrlContent(line, contentStart) {
|
|
158
|
+
let index = contentStart;
|
|
159
|
+
while (index < line.length) {
|
|
160
|
+
if (line[index] === '\\' && index + 1 < line.length) {
|
|
161
|
+
index += 2;
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (line[index] === ')')
|
|
165
|
+
return index + 1;
|
|
166
|
+
index += 1;
|
|
167
|
+
}
|
|
168
|
+
return 'contentOpen';
|
|
169
|
+
}
|
|
170
|
+
function markLinesFlaggedByTheEscapedLineBreakReading(lines, into) {
|
|
171
|
+
let state = NOTHING_IS_OPEN;
|
|
172
|
+
for (const [index, line] of lines.entries()) {
|
|
173
|
+
if (state.isInsideAnOpenComment)
|
|
174
|
+
into.add(index);
|
|
175
|
+
state = scanLineAcrossEscapedLineBreaksAndUrls(line, state);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const NOTHING_IS_OPEN = {
|
|
179
|
+
isInsideAnOpenComment: false,
|
|
180
|
+
urlCarry: 'none',
|
|
181
|
+
openStringQuote: undefined,
|
|
182
|
+
};
|
|
183
|
+
const STILL_INSIDE_AN_OPEN_COMMENT = {
|
|
184
|
+
...NOTHING_IS_OPEN,
|
|
185
|
+
isInsideAnOpenComment: true,
|
|
186
|
+
};
|
|
187
|
+
function scanLineAcrossEscapedLineBreaksAndUrls(line, state) {
|
|
188
|
+
if (state.openStringQuote !== undefined) {
|
|
189
|
+
return resumeAnOpenStringCarriedIntoThisLine(line, state.isInsideAnOpenComment, state.openStringQuote);
|
|
190
|
+
}
|
|
191
|
+
const cursor = resumeUrlCarry(line, state.urlCarry);
|
|
192
|
+
if (typeof cursor === 'string')
|
|
193
|
+
return { ...NOTHING_IS_OPEN, urlCarry: cursor };
|
|
194
|
+
return scanFromStartOfLine(line, state.isInsideAnOpenComment, cursor);
|
|
195
|
+
}
|
|
196
|
+
function resumeAnOpenStringCarriedIntoThisLine(line, isInsideAnOpenComment, openStringQuote) {
|
|
197
|
+
const outcome = scanAPossiblyContinuedStringLiteral(line, -1, openStringQuote);
|
|
198
|
+
if (outcome.kind === 'continuesAcrossAnEscapedLineBreak') {
|
|
199
|
+
return { ...NOTHING_IS_OPEN, isInsideAnOpenComment, openStringQuote };
|
|
200
|
+
}
|
|
201
|
+
if (outcome.kind === 'doesNotClose') {
|
|
202
|
+
return { ...NOTHING_IS_OPEN, isInsideAnOpenComment };
|
|
203
|
+
}
|
|
204
|
+
return scanFromStartOfLine(line, isInsideAnOpenComment, outcome.indexAfter);
|
|
205
|
+
}
|
|
206
|
+
function stringStep(outcome, endOfLine) {
|
|
207
|
+
if (outcome.kind === 'closes')
|
|
208
|
+
return outcome.indexAfter;
|
|
209
|
+
if (outcome.kind === 'continuesAcrossAnEscapedLineBreak')
|
|
210
|
+
return undefined;
|
|
211
|
+
return endOfLine;
|
|
212
|
+
}
|
|
213
|
+
function scanFromStartOfLine(line, wasInsideAnOpenComment, cursor) {
|
|
214
|
+
let isInsideAnOpenComment = wasInsideAnOpenComment;
|
|
215
|
+
let index = cursor;
|
|
216
|
+
while (index < line.length) {
|
|
217
|
+
if (isInsideAnOpenComment) {
|
|
218
|
+
const closerIndex = line.indexOf('*/', index);
|
|
219
|
+
if (closerIndex === -1)
|
|
220
|
+
return STILL_INSIDE_AN_OPEN_COMMENT;
|
|
221
|
+
isInsideAnOpenComment = false;
|
|
222
|
+
index = closerIndex + 2;
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
const urlLookup = tryToSkipAnUnquotedUrlToken(line, index);
|
|
226
|
+
if (urlLookup !== undefined) {
|
|
227
|
+
if (typeof urlLookup === 'string')
|
|
228
|
+
return { ...NOTHING_IS_OPEN, urlCarry: urlLookup };
|
|
229
|
+
index = urlLookup;
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
const character = line[index];
|
|
233
|
+
if (isAQuoteCharacter(character)) {
|
|
234
|
+
const outcome = scanAPossiblyContinuedStringLiteral(line, index, character);
|
|
235
|
+
const target = stringStep(outcome, line.length);
|
|
236
|
+
if (target === undefined)
|
|
237
|
+
return { ...NOTHING_IS_OPEN, openStringQuote: character };
|
|
238
|
+
index = target;
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
if (line.startsWith('/*', index)) {
|
|
242
|
+
isInsideAnOpenComment = true;
|
|
243
|
+
index += 2;
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
index += 1;
|
|
247
|
+
}
|
|
248
|
+
return { ...NOTHING_IS_OPEN, isInsideAnOpenComment };
|
|
249
|
+
}
|
|
250
|
+
function scanAPossiblyContinuedStringLiteral(line, quoteIndex, quote) {
|
|
251
|
+
let cursor = quoteIndex + 1;
|
|
252
|
+
while (cursor < line.length) {
|
|
253
|
+
if (line[cursor] === '\\') {
|
|
254
|
+
if (isAnEscapedLineBreakAtEndOfLine(line, cursor)) {
|
|
255
|
+
return { kind: 'continuesAcrossAnEscapedLineBreak' };
|
|
256
|
+
}
|
|
257
|
+
cursor += 2;
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
if (line[cursor] === quote)
|
|
261
|
+
return { kind: 'closes', indexAfter: cursor + 1 };
|
|
262
|
+
cursor += 1;
|
|
263
|
+
}
|
|
264
|
+
return { kind: 'doesNotClose' };
|
|
265
|
+
}
|
|
266
|
+
function isAnEscapedLineBreakAtEndOfLine(line, cursor) {
|
|
267
|
+
if (cursor === line.length - 1)
|
|
268
|
+
return true;
|
|
269
|
+
return cursor === line.length - 2 && line[cursor + 1] === '\r';
|
|
270
|
+
}
|
|
@@ -8,6 +8,6 @@ export declare function assertDescriptionsAreClean(...descriptionMaps: readonly
|
|
|
8
8
|
export declare const RETHEMING_NOTICE = "Changing this changes everything Nave derives from it. The contrast of the resulting palette follows from what you set, and checking it is yours.";
|
|
9
9
|
export declare function assertNoticeIsClean(notice?: string, noticeLabel?: string): void;
|
|
10
10
|
export declare const FEEDBACK_SHARED_IDENTITY_NOTICE = "warning, success and info, and their -foreground variants, resolve to one shared value here; only danger differs. Colour alone therefore cannot tell those three states apart, so wherever a feedback token carries meaning, give it a text label naming the state and a distinct icon or shape that differs per state.";
|
|
11
|
-
export declare const NO_CONSUMER_CONTRAST_THRESHOLD_INPUT = "0.1.0 ships no consumer contrast-threshold input. No flag of this entry point sets one, and the build reads none. This is the absence of an input, not a limit on the consumer: a consumer may hold whatever contrast target they choose and check their palette against it with their own tooling.
|
|
11
|
+
export declare const NO_CONSUMER_CONTRAST_THRESHOLD_INPUT = "0.1.0 ships no consumer contrast-threshold input. No flag of this entry point sets one, and the build reads none. This is the absence of an input, not a limit on the consumer: a consumer may hold whatever contrast target they choose and check their palette against it with their own tooling. No contrast check this entry point runs over a consumer's values can fail the build, and none prints or returns a result. A consumer-settable target is deliberately out of 0.1.0 rather than overlooked.";
|
|
12
12
|
export declare function assertNoticeIsEmitted(css: string, notice: string, noticeLabel: string): void;
|
|
13
13
|
export declare function assertHarnessFramingIsClean(): void;
|
|
@@ -47,7 +47,7 @@ export function assertNoticeIsClean(notice = RETHEMING_NOTICE, noticeLabel = 'Re
|
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
export const FEEDBACK_SHARED_IDENTITY_NOTICE = 'warning, success and info, and their -foreground variants, resolve to one shared value here; only danger differs. Colour alone therefore cannot tell those three states apart, so wherever a feedback token carries meaning, give it a text label naming the state and a distinct icon or shape that differs per state.';
|
|
50
|
-
export const NO_CONSUMER_CONTRAST_THRESHOLD_INPUT = "0.1.0 ships no consumer contrast-threshold input. No flag of this entry point sets one, and the build reads none. This is the absence of an input, not a limit on the consumer: a consumer may hold whatever contrast target they choose and check their palette against it with their own tooling.
|
|
50
|
+
export const NO_CONSUMER_CONTRAST_THRESHOLD_INPUT = "0.1.0 ships no consumer contrast-threshold input. No flag of this entry point sets one, and the build reads none. This is the absence of an input, not a limit on the consumer: a consumer may hold whatever contrast target they choose and check their palette against it with their own tooling. No contrast check this entry point runs over a consumer's values can fail the build, and none prints or returns a result. A consumer-settable target is deliberately out of 0.1.0 rather than overlooked.";
|
|
51
51
|
export function assertNoticeIsEmitted(css, notice, noticeLabel) {
|
|
52
52
|
if (!css.includes(notice)) {
|
|
53
53
|
throw new Error(`${noticeLabel} violation: the notice is not present, verbatim, in the emitted CSS. Restore it exactly as authored.`);
|
package/dist/lib/theming/emit.js
CHANGED
|
@@ -34,7 +34,7 @@ export function emitCss(result, layer = 'tokens.defaults') {
|
|
|
34
34
|
h: result.records.primary.usedSeed.h,
|
|
35
35
|
});
|
|
36
36
|
const lines = [
|
|
37
|
-
'/* Nave theming — generated, do not edit. See
|
|
37
|
+
'/* Nave theming — generated, do not edit. See the @navecss/tokens README ("Theming"). */',
|
|
38
38
|
'',
|
|
39
39
|
`@property ${TINT_PROPERTY} {`,
|
|
40
40
|
` syntax: '<color>';`,
|
|
@@ -68,7 +68,7 @@ export function neutralRcsFormula(step, literals) {
|
|
|
68
68
|
const found = literals.find((s) => s.step === step);
|
|
69
69
|
if (!found)
|
|
70
70
|
throw new Error(`Neutral step ${step} is not in the shared step table.`);
|
|
71
|
-
return `oklch(from var(--nave-color-tint) ${roundTo(found.l, 4)} ${roundTo(found.c, 4)} h)`;
|
|
71
|
+
return `oklch(from var(--nave-color-tint) ${roundTo(found.l, 4)} ${roundTo(found.c, 4)} h / 1)`;
|
|
72
72
|
}
|
|
73
73
|
function roundTo(n, d) {
|
|
74
74
|
const f = 10 ** d;
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { clamp01 } from "./seed-refusal.js";
|
|
2
|
-
const
|
|
2
|
+
const CSS_WHITESPACE_CHARS = ' \t\n\r\f';
|
|
3
3
|
function cssTrim(text) {
|
|
4
|
-
|
|
4
|
+
let start = 0;
|
|
5
|
+
let end = text.length;
|
|
6
|
+
while (start < end && CSS_WHITESPACE_CHARS.includes(text[start]))
|
|
7
|
+
start += 1;
|
|
8
|
+
while (end > start && CSS_WHITESPACE_CHARS.includes(text[end - 1]))
|
|
9
|
+
end -= 1;
|
|
10
|
+
return text.slice(start, end);
|
|
5
11
|
}
|
|
6
12
|
const CSS_NUMBER = /^[+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:[eE][+-]?\d+)?$/;
|
|
7
13
|
export function readNumericToken(text) {
|
|
@@ -22,7 +28,6 @@ function parseAlphaToken(token) {
|
|
|
22
28
|
return clamp01(readNumericToken(t.slice(0, -1)) / 100);
|
|
23
29
|
return clamp01(readNumericToken(t));
|
|
24
30
|
}
|
|
25
|
-
const CSS_WHITESPACE_CHARS = ' \t\n\r\f';
|
|
26
31
|
function splitTopLevel(text, isSeparator) {
|
|
27
32
|
const tokens = [];
|
|
28
33
|
let current = '';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const
|
|
1
|
+
export declare const CONSUMER_ARTIFACTS: readonly ["tokens.css", "tokens.js", "tokens.d.ts", "breakpoints.js", "breakpoints.d.ts", "palette-record.json", "build-record.json"];
|
|
2
2
|
export interface ProvenanceArtifact {
|
|
3
3
|
path: string;
|
|
4
4
|
content: string;
|
package/dist/lib/validate.js
CHANGED
|
@@ -10,11 +10,25 @@ export function detectSourceKind(filePath) {
|
|
|
10
10
|
return 'json';
|
|
11
11
|
return undefined;
|
|
12
12
|
}
|
|
13
|
-
const DECLARED_CUSTOM_PROPERTY_RE = /(--[a-zA-Z0-9-]+)\s*:/
|
|
14
|
-
|
|
13
|
+
const DECLARED_CUSTOM_PROPERTY_RE = /(?<![\w\u{80}-\u{10FFFF}-])(--[a-zA-Z0-9-]+)\s*:/gu;
|
|
14
|
+
function stripCssComments(css) {
|
|
15
|
+
let kept = '';
|
|
16
|
+
let from = 0;
|
|
17
|
+
for (;;) {
|
|
18
|
+
const open = css.indexOf('/*', from);
|
|
19
|
+
if (open === -1)
|
|
20
|
+
break;
|
|
21
|
+
const close = css.indexOf('*/', open + 2);
|
|
22
|
+
if (close === -1)
|
|
23
|
+
break;
|
|
24
|
+
kept += css.slice(from, open);
|
|
25
|
+
from = close + 2;
|
|
26
|
+
}
|
|
27
|
+
return kept + css.slice(from);
|
|
28
|
+
}
|
|
15
29
|
export function scanDeclaredCustomProperties(css) {
|
|
16
30
|
const found = new Set();
|
|
17
|
-
const declarations = css
|
|
31
|
+
const declarations = stripCssComments(css);
|
|
18
32
|
for (const match of declarations.matchAll(DECLARED_CUSTOM_PROPERTY_RE))
|
|
19
33
|
found.add(match[1]);
|
|
20
34
|
return found;
|
package/dist/palette-record.json
CHANGED
|
@@ -2,88 +2,88 @@
|
|
|
2
2
|
"aboutThisFile": "This file is a resolved palette record: what this build produced for every semantic colour slot, in both schemes. It is not a DTCG 2025.10 document, and it is not meant to be read by a DTCG 2025.10 tool, because its keys are flat dotted names and most of its values are relative-colour-syntax strings, neither of which that format expresses. The token document is tokens.json, shipped beside it.",
|
|
3
3
|
"color.surface.base.light": {
|
|
4
4
|
"$type": "color",
|
|
5
|
-
"$value": "oklch(from var(--nave-color-tint) 1 0 h)"
|
|
5
|
+
"$value": "oklch(from var(--nave-color-tint) 1 0 h / 1)"
|
|
6
6
|
},
|
|
7
7
|
"color.surface.base.dark": {
|
|
8
8
|
"$type": "color",
|
|
9
|
-
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h)"
|
|
9
|
+
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h / 1)"
|
|
10
10
|
},
|
|
11
11
|
"color.surface.raised.light": {
|
|
12
12
|
"$type": "color",
|
|
13
|
-
"$value": "oklch(from var(--nave-color-tint) 1 0 h)"
|
|
13
|
+
"$value": "oklch(from var(--nave-color-tint) 1 0 h / 1)"
|
|
14
14
|
},
|
|
15
15
|
"color.surface.raised.dark": {
|
|
16
16
|
"$type": "color",
|
|
17
|
-
"$value": "oklch(from var(--nave-color-tint) 0.225 0.0067 h)"
|
|
17
|
+
"$value": "oklch(from var(--nave-color-tint) 0.225 0.0067 h / 1)"
|
|
18
18
|
},
|
|
19
19
|
"color.surface.overlay.light": {
|
|
20
20
|
"$type": "color",
|
|
21
|
-
"$value": "oklch(from var(--nave-color-tint) 1 0 h)"
|
|
21
|
+
"$value": "oklch(from var(--nave-color-tint) 1 0 h / 1)"
|
|
22
22
|
},
|
|
23
23
|
"color.surface.overlay.dark": {
|
|
24
24
|
"$type": "color",
|
|
25
|
-
"$value": "oklch(from var(--nave-color-tint) 0.27 0.0067 h)"
|
|
25
|
+
"$value": "oklch(from var(--nave-color-tint) 0.27 0.0067 h / 1)"
|
|
26
26
|
},
|
|
27
27
|
"color.surface.sunken.light": {
|
|
28
28
|
"$type": "color",
|
|
29
|
-
"$value": "oklch(from var(--nave-color-tint) 0.985 0.0067 h)"
|
|
29
|
+
"$value": "oklch(from var(--nave-color-tint) 0.985 0.0067 h / 1)"
|
|
30
30
|
},
|
|
31
31
|
"color.surface.sunken.dark": {
|
|
32
32
|
"$type": "color",
|
|
33
|
-
"$value": "oklch(from var(--nave-color-tint) 0.12 0.0067 h)"
|
|
33
|
+
"$value": "oklch(from var(--nave-color-tint) 0.12 0.0067 h / 1)"
|
|
34
34
|
},
|
|
35
35
|
"color.surface.inverse.light": {
|
|
36
36
|
"$type": "color",
|
|
37
|
-
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h)"
|
|
37
|
+
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h / 1)"
|
|
38
38
|
},
|
|
39
39
|
"color.surface.inverse.dark": {
|
|
40
40
|
"$type": "color",
|
|
41
|
-
"$value": "oklch(from var(--nave-color-tint) 0.965 0.0067 h)"
|
|
41
|
+
"$value": "oklch(from var(--nave-color-tint) 0.965 0.0067 h / 1)"
|
|
42
42
|
},
|
|
43
43
|
"color.content.primary.light": {
|
|
44
44
|
"$type": "color",
|
|
45
|
-
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h)"
|
|
45
|
+
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h / 1)"
|
|
46
46
|
},
|
|
47
47
|
"color.content.primary.dark": {
|
|
48
48
|
"$type": "color",
|
|
49
|
-
"$value": "oklch(from var(--nave-color-tint) 0.965 0.0067 h)"
|
|
49
|
+
"$value": "oklch(from var(--nave-color-tint) 0.965 0.0067 h / 1)"
|
|
50
50
|
},
|
|
51
51
|
"color.content.secondary.light": {
|
|
52
52
|
"$type": "color",
|
|
53
|
-
"$value": "oklch(from var(--nave-color-tint) 0.37 0.0067 h)"
|
|
53
|
+
"$value": "oklch(from var(--nave-color-tint) 0.37 0.0067 h / 1)"
|
|
54
54
|
},
|
|
55
55
|
"color.content.secondary.dark": {
|
|
56
56
|
"$type": "color",
|
|
57
|
-
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h)"
|
|
57
|
+
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h / 1)"
|
|
58
58
|
},
|
|
59
59
|
"color.content.tertiary.light": {
|
|
60
60
|
"$type": "color",
|
|
61
|
-
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h)",
|
|
61
|
+
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h / 1)",
|
|
62
62
|
"$description": "Placeholder and hint text only."
|
|
63
63
|
},
|
|
64
64
|
"color.content.tertiary.dark": {
|
|
65
65
|
"$type": "color",
|
|
66
|
-
"$value": "oklch(from var(--nave-color-tint) 0.72 0.0067 h)",
|
|
66
|
+
"$value": "oklch(from var(--nave-color-tint) 0.72 0.0067 h / 1)",
|
|
67
67
|
"$description": "Placeholder and hint text only."
|
|
68
68
|
},
|
|
69
69
|
"color.content.disabled.light": {
|
|
70
70
|
"$type": "color",
|
|
71
|
-
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h)",
|
|
71
|
+
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h / 1)",
|
|
72
72
|
"$description": "Text inside a disabled interactive component."
|
|
73
73
|
},
|
|
74
74
|
"color.content.disabled.dark": {
|
|
75
75
|
"$type": "color",
|
|
76
|
-
"$value": "oklch(from var(--nave-color-tint) 0.37 0.0067 h)",
|
|
76
|
+
"$value": "oklch(from var(--nave-color-tint) 0.37 0.0067 h / 1)",
|
|
77
77
|
"$description": "Text inside a disabled interactive component."
|
|
78
78
|
},
|
|
79
79
|
"color.content.inverse.light": {
|
|
80
80
|
"$type": "color",
|
|
81
|
-
"$value": "oklch(from var(--nave-color-tint) 0.965 0.0067 h)",
|
|
81
|
+
"$value": "oklch(from var(--nave-color-tint) 0.965 0.0067 h / 1)",
|
|
82
82
|
"$description": "Declared foreground for surface.inverse."
|
|
83
83
|
},
|
|
84
84
|
"color.content.inverse.dark": {
|
|
85
85
|
"$type": "color",
|
|
86
|
-
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h)",
|
|
86
|
+
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h / 1)",
|
|
87
87
|
"$description": "Declared foreground for surface.inverse."
|
|
88
88
|
},
|
|
89
89
|
"color.content.link.light": {
|
|
@@ -98,39 +98,39 @@
|
|
|
98
98
|
},
|
|
99
99
|
"color.border.default.light": {
|
|
100
100
|
"$type": "color",
|
|
101
|
-
"$value": "oklch(from var(--nave-color-tint) 0.905 0.0067 h)",
|
|
101
|
+
"$value": "oklch(from var(--nave-color-tint) 0.905 0.0067 h / 1)",
|
|
102
102
|
"$description": "Decorative dividers and card edges."
|
|
103
103
|
},
|
|
104
104
|
"color.border.default.dark": {
|
|
105
105
|
"$type": "color",
|
|
106
|
-
"$value": "oklch(from var(--nave-color-tint) 0.37 0.0067 h)",
|
|
106
|
+
"$value": "oklch(from var(--nave-color-tint) 0.37 0.0067 h / 1)",
|
|
107
107
|
"$description": "Decorative dividers and card edges."
|
|
108
108
|
},
|
|
109
109
|
"color.border.strong.light": {
|
|
110
110
|
"$type": "color",
|
|
111
|
-
"$value": "oklch(from var(--nave-color-tint) 0.72 0.0067 h)"
|
|
111
|
+
"$value": "oklch(from var(--nave-color-tint) 0.72 0.0067 h / 1)"
|
|
112
112
|
},
|
|
113
113
|
"color.border.strong.dark": {
|
|
114
114
|
"$type": "color",
|
|
115
|
-
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h)"
|
|
115
|
+
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h / 1)"
|
|
116
116
|
},
|
|
117
117
|
"color.border.control.light": {
|
|
118
118
|
"$type": "color",
|
|
119
|
-
"$value": "oklch(from var(--nave-color-tint) 0.59 0.0067 h)",
|
|
119
|
+
"$value": "oklch(from var(--nave-color-tint) 0.59 0.0067 h / 1)",
|
|
120
120
|
"$description": "Identifying boundary for a control (inputs, form boundaries, and the secondary action control)."
|
|
121
121
|
},
|
|
122
122
|
"color.border.control.dark": {
|
|
123
123
|
"$type": "color",
|
|
124
|
-
"$value": "oklch(from var(--nave-color-tint) 0.59 0.0067 h)",
|
|
124
|
+
"$value": "oklch(from var(--nave-color-tint) 0.59 0.0067 h / 1)",
|
|
125
125
|
"$description": "Identifying boundary for a control (inputs, form boundaries, and the secondary action control)."
|
|
126
126
|
},
|
|
127
127
|
"color.border.disabled.light": {
|
|
128
128
|
"$type": "color",
|
|
129
|
-
"$value": "oklch(from var(--nave-color-tint) 0.94 0.0067 h)"
|
|
129
|
+
"$value": "oklch(from var(--nave-color-tint) 0.94 0.0067 h / 1)"
|
|
130
130
|
},
|
|
131
131
|
"color.border.disabled.dark": {
|
|
132
132
|
"$type": "color",
|
|
133
|
-
"$value": "oklch(from var(--nave-color-tint) 0.27 0.0067 h)"
|
|
133
|
+
"$value": "oklch(from var(--nave-color-tint) 0.27 0.0067 h / 1)"
|
|
134
134
|
},
|
|
135
135
|
"color.border.focus.light": {
|
|
136
136
|
"$type": "color",
|
|
@@ -166,19 +166,19 @@
|
|
|
166
166
|
},
|
|
167
167
|
"color.on-action.primary.light": {
|
|
168
168
|
"$type": "color",
|
|
169
|
-
"$value": "oklch(from var(--nave-color-tint) 1 0 h)"
|
|
169
|
+
"$value": "oklch(from var(--nave-color-tint) 1 0 h / 1)"
|
|
170
170
|
},
|
|
171
171
|
"color.on-action.primary.dark": {
|
|
172
172
|
"$type": "color",
|
|
173
|
-
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h)"
|
|
173
|
+
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h / 1)"
|
|
174
174
|
},
|
|
175
175
|
"color.action.secondary.light": {
|
|
176
176
|
"$type": "color",
|
|
177
|
-
"$value": "oklch(from var(--nave-color-tint) 0.965 0.0067 h)"
|
|
177
|
+
"$value": "oklch(from var(--nave-color-tint) 0.965 0.0067 h / 1)"
|
|
178
178
|
},
|
|
179
179
|
"color.action.secondary.dark": {
|
|
180
180
|
"$type": "color",
|
|
181
|
-
"$value": "oklch(from var(--nave-color-tint) 0.27 0.0067 h)"
|
|
181
|
+
"$value": "oklch(from var(--nave-color-tint) 0.27 0.0067 h / 1)"
|
|
182
182
|
},
|
|
183
183
|
"color.feedback.danger.light": {
|
|
184
184
|
"$type": "color",
|
|
@@ -202,92 +202,92 @@
|
|
|
202
202
|
},
|
|
203
203
|
"color.on-feedback.danger.light": {
|
|
204
204
|
"$type": "color",
|
|
205
|
-
"$value": "oklch(from var(--nave-color-tint) 1 0 h)",
|
|
205
|
+
"$value": "oklch(from var(--nave-color-tint) 1 0 h / 1)",
|
|
206
206
|
"$description": "Declared foreground for the solid feedback.danger background."
|
|
207
207
|
},
|
|
208
208
|
"color.on-feedback.danger.dark": {
|
|
209
209
|
"$type": "color",
|
|
210
|
-
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h)",
|
|
210
|
+
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h / 1)",
|
|
211
211
|
"$description": "Declared foreground for the solid feedback.danger background."
|
|
212
212
|
},
|
|
213
213
|
"color.feedback.warning.light": {
|
|
214
214
|
"$type": "color",
|
|
215
|
-
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h)",
|
|
215
|
+
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h / 1)",
|
|
216
216
|
"$description": "Solid-background role for a warning state (shared tinted-neutral family)."
|
|
217
217
|
},
|
|
218
218
|
"color.feedback.warning.dark": {
|
|
219
219
|
"$type": "color",
|
|
220
|
-
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h)",
|
|
220
|
+
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h / 1)",
|
|
221
221
|
"$description": "Solid-background role for a warning state (shared tinted-neutral family)."
|
|
222
222
|
},
|
|
223
223
|
"color.feedback.warning.foreground.light": {
|
|
224
224
|
"$type": "color",
|
|
225
|
-
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h)",
|
|
225
|
+
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h / 1)",
|
|
226
226
|
"$description": "Foreground role for warning text and icons."
|
|
227
227
|
},
|
|
228
228
|
"color.feedback.warning.foreground.dark": {
|
|
229
229
|
"$type": "color",
|
|
230
|
-
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h)",
|
|
230
|
+
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h / 1)",
|
|
231
231
|
"$description": "Foreground role for warning text and icons."
|
|
232
232
|
},
|
|
233
233
|
"color.on-feedback.warning.light": {
|
|
234
234
|
"$type": "color",
|
|
235
|
-
"$value": "oklch(from var(--nave-color-tint) 1 0 h)"
|
|
235
|
+
"$value": "oklch(from var(--nave-color-tint) 1 0 h / 1)"
|
|
236
236
|
},
|
|
237
237
|
"color.on-feedback.warning.dark": {
|
|
238
238
|
"$type": "color",
|
|
239
|
-
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h)"
|
|
239
|
+
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h / 1)"
|
|
240
240
|
},
|
|
241
241
|
"color.feedback.success.light": {
|
|
242
242
|
"$type": "color",
|
|
243
|
-
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h)",
|
|
243
|
+
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h / 1)",
|
|
244
244
|
"$description": "Alias of feedback.warning (shared tinted-neutral family)."
|
|
245
245
|
},
|
|
246
246
|
"color.feedback.success.dark": {
|
|
247
247
|
"$type": "color",
|
|
248
|
-
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h)",
|
|
248
|
+
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h / 1)",
|
|
249
249
|
"$description": "Alias of feedback.warning (shared tinted-neutral family)."
|
|
250
250
|
},
|
|
251
251
|
"color.feedback.success.foreground.light": {
|
|
252
252
|
"$type": "color",
|
|
253
|
-
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h)"
|
|
253
|
+
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h / 1)"
|
|
254
254
|
},
|
|
255
255
|
"color.feedback.success.foreground.dark": {
|
|
256
256
|
"$type": "color",
|
|
257
|
-
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h)"
|
|
257
|
+
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h / 1)"
|
|
258
258
|
},
|
|
259
259
|
"color.on-feedback.success.light": {
|
|
260
260
|
"$type": "color",
|
|
261
|
-
"$value": "oklch(from var(--nave-color-tint) 1 0 h)"
|
|
261
|
+
"$value": "oklch(from var(--nave-color-tint) 1 0 h / 1)"
|
|
262
262
|
},
|
|
263
263
|
"color.on-feedback.success.dark": {
|
|
264
264
|
"$type": "color",
|
|
265
|
-
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h)"
|
|
265
|
+
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h / 1)"
|
|
266
266
|
},
|
|
267
267
|
"color.feedback.info.light": {
|
|
268
268
|
"$type": "color",
|
|
269
|
-
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h)",
|
|
269
|
+
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h / 1)",
|
|
270
270
|
"$description": "Alias of feedback.warning (shared tinted-neutral family)."
|
|
271
271
|
},
|
|
272
272
|
"color.feedback.info.dark": {
|
|
273
273
|
"$type": "color",
|
|
274
|
-
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h)",
|
|
274
|
+
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h / 1)",
|
|
275
275
|
"$description": "Alias of feedback.warning (shared tinted-neutral family)."
|
|
276
276
|
},
|
|
277
277
|
"color.feedback.info.foreground.light": {
|
|
278
278
|
"$type": "color",
|
|
279
|
-
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h)"
|
|
279
|
+
"$value": "oklch(from var(--nave-color-tint) 0.47 0.0067 h / 1)"
|
|
280
280
|
},
|
|
281
281
|
"color.feedback.info.foreground.dark": {
|
|
282
282
|
"$type": "color",
|
|
283
|
-
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h)"
|
|
283
|
+
"$value": "oklch(from var(--nave-color-tint) 0.835 0.0067 h / 1)"
|
|
284
284
|
},
|
|
285
285
|
"color.on-feedback.info.light": {
|
|
286
286
|
"$type": "color",
|
|
287
|
-
"$value": "oklch(from var(--nave-color-tint) 1 0 h)"
|
|
287
|
+
"$value": "oklch(from var(--nave-color-tint) 1 0 h / 1)"
|
|
288
288
|
},
|
|
289
289
|
"color.on-feedback.info.dark": {
|
|
290
290
|
"$type": "color",
|
|
291
|
-
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h)"
|
|
291
|
+
"$value": "oklch(from var(--nave-color-tint) 0.18 0.0067 h / 1)"
|
|
292
292
|
}
|
|
293
293
|
}
|