@dereekb/dbx-components-mcp 13.19.0 → 13.20.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.
@@ -10,7 +10,7 @@ var __export = (target, all) => {
10
10
  // packages/dbx-components-mcp/package.json
11
11
  var package_default = {
12
12
  name: "@dereekb/dbx-components-mcp",
13
- version: "13.19.0",
13
+ version: "13.20.0",
14
14
  type: "module",
15
15
  bin: {
16
16
  "dbx-components-mcp": "dbx-components-mcp.js"
@@ -21,8 +21,8 @@ var package_default = {
21
21
  "ts-morph": "^21.0.0"
22
22
  },
23
23
  peerDependencies: {
24
- "@dereekb/dbx-cli": "13.19.0",
25
- "@dereekb/util": "13.19.0"
24
+ "@dereekb/dbx-cli": "13.20.0",
25
+ "@dereekb/util": "13.20.0"
26
26
  }
27
27
  };
28
28
 
@@ -15658,6 +15658,153 @@ function collectRelativeImports(sourceFile, fileName) {
15658
15658
  return out;
15659
15659
  }
15660
15660
 
15661
+ // packages/dbx-cli/src/lib/route/url-match.ts
15662
+ function normalizePathname(pathname) {
15663
+ let result;
15664
+ if (pathname.length === 0) {
15665
+ result = "/";
15666
+ } else if (pathname.length > 1 && pathname.endsWith("/")) {
15667
+ result = pathname.slice(0, -1);
15668
+ } else {
15669
+ result = pathname;
15670
+ }
15671
+ return result;
15672
+ }
15673
+ function stripUrlQueryAndHash(url) {
15674
+ const hashStripped = url.split("#", 1)[0];
15675
+ return hashStripped.split("?", 1)[0];
15676
+ }
15677
+ function splitSegments(path) {
15678
+ const normalized = path.startsWith("/") ? path.slice(1) : path;
15679
+ return normalized.length === 0 ? [] : normalized.split("/");
15680
+ }
15681
+ function hasParamSegment(path) {
15682
+ return path.includes(":") || path.includes("{");
15683
+ }
15684
+ function tryMatchSegments(route, input) {
15685
+ if (route.length !== input.length) {
15686
+ return void 0;
15687
+ }
15688
+ const params = {};
15689
+ let result = params;
15690
+ for (const [i, r] of route.entries()) {
15691
+ const v = input[i];
15692
+ if (r.startsWith(":")) {
15693
+ const key = r.slice(1);
15694
+ params[key] = decodeURIComponent(v);
15695
+ } else if (r.startsWith("{") && r.endsWith("}")) {
15696
+ const inner = r.slice(1, -1);
15697
+ const colonIdx = inner.indexOf(":");
15698
+ const key = colonIdx >= 0 ? inner.slice(0, colonIdx) : inner;
15699
+ params[key] = decodeURIComponent(v);
15700
+ } else if (r !== v) {
15701
+ result = void 0;
15702
+ break;
15703
+ }
15704
+ }
15705
+ return result;
15706
+ }
15707
+ function extractUrlParamKeys(fullUrl) {
15708
+ if (fullUrl === void 0 || fullUrl.length === 0) {
15709
+ return [];
15710
+ }
15711
+ const seen = /* @__PURE__ */ new Set();
15712
+ const keys = [];
15713
+ for (const segment of fullUrl.split("/")) {
15714
+ const key = extractParamKeyFromSegment(segment);
15715
+ if (key !== void 0 && !seen.has(key)) {
15716
+ seen.add(key);
15717
+ keys.push(key);
15718
+ }
15719
+ }
15720
+ return keys;
15721
+ }
15722
+ function extractParamKeyFromSegment(rawSegment) {
15723
+ const segment = stripUrlQueryAndHash(rawSegment);
15724
+ if (segment.startsWith(":")) {
15725
+ const key = segment.slice(1);
15726
+ return key.length > 0 ? key : void 0;
15727
+ }
15728
+ if (segment.startsWith("{") && segment.endsWith("}")) {
15729
+ const inner = segment.slice(1, -1);
15730
+ const colonIdx = inner.indexOf(":");
15731
+ const rawKey = colonIdx >= 0 ? inner.slice(0, colonIdx) : inner;
15732
+ const key = rawKey.trim();
15733
+ return key.length > 0 ? key : void 0;
15734
+ }
15735
+ return void 0;
15736
+ }
15737
+ function matchUrlAgainstEntries(input) {
15738
+ const pathname = normalizePathname(input.pathname);
15739
+ const literal = matchLiteral(input.entries, pathname);
15740
+ let result;
15741
+ if (literal.length === 1) {
15742
+ result = { kind: "match", via: "literal", value: literal[0].value, matchedFullUrl: normalizePathname(literal[0].fullUrl ?? pathname), params: {} };
15743
+ } else if (literal.length > 1) {
15744
+ result = { kind: "ambiguous", values: literal.map((e) => e.value) };
15745
+ } else {
15746
+ result = matchParamOrNone(input.entries, pathname);
15747
+ }
15748
+ return result;
15749
+ }
15750
+ function matchLiteral(entries, pathname) {
15751
+ const out = [];
15752
+ for (const entry of entries) {
15753
+ if (entry.fullUrl !== void 0 && normalizePathname(entry.fullUrl) === pathname) {
15754
+ out.push(entry);
15755
+ }
15756
+ }
15757
+ return out;
15758
+ }
15759
+ function matchParamOrNone(entries, pathname) {
15760
+ const inputSegments = splitSegments(pathname);
15761
+ const hits = [];
15762
+ for (const entry of entries) {
15763
+ if (entry.fullUrl === void 0 || !hasParamSegment(entry.fullUrl)) {
15764
+ continue;
15765
+ }
15766
+ const params = tryMatchSegments(splitSegments(entry.fullUrl), inputSegments);
15767
+ if (params) {
15768
+ hits.push({ entry, params });
15769
+ }
15770
+ }
15771
+ let result;
15772
+ if (hits.length === 1) {
15773
+ result = { kind: "match", via: "param", value: hits[0].entry.value, matchedFullUrl: normalizePathname(hits[0].entry.fullUrl ?? pathname), params: hits[0].params };
15774
+ } else if (hits.length > 1) {
15775
+ result = { kind: "ambiguous", values: hits.map((h) => h.entry.value) };
15776
+ } else {
15777
+ result = { kind: "none", candidates: scoreCandidates(entries, pathname) };
15778
+ }
15779
+ return result;
15780
+ }
15781
+ function scoreCandidates(entries, pathname) {
15782
+ const segments = splitSegments(normalizePathname(pathname));
15783
+ const scored = [];
15784
+ for (const entry of entries) {
15785
+ if (entry.fullUrl === void 0) {
15786
+ continue;
15787
+ }
15788
+ const candidateSegments = splitSegments(entry.fullUrl);
15789
+ let score = 0;
15790
+ const maxIndex = Math.min(segments.length, candidateSegments.length);
15791
+ for (let i = 0; i < maxIndex; i += 1) {
15792
+ if (segments[i] === candidateSegments[i]) {
15793
+ score += 2;
15794
+ } else if (candidateSegments[i].startsWith(":") || candidateSegments[i].startsWith("{")) {
15795
+ score += 1;
15796
+ } else {
15797
+ break;
15798
+ }
15799
+ }
15800
+ if (score > 0) {
15801
+ scored.push({ value: entry.value, score });
15802
+ }
15803
+ }
15804
+ scored.sort((a, b) => b.score - a.score);
15805
+ return scored.slice(0, 5).map((s) => s.value);
15806
+ }
15807
+
15661
15808
  // packages/dbx-cli/src/lib/route/route-build-tree.ts
15662
15809
  // @__NO_SIDE_EFFECTS__
15663
15810
  function buildRouteTree(nodes, extractIssues) {
@@ -15817,7 +15964,7 @@ function composeFullUrl(node) {
15817
15964
  return void 0;
15818
15965
  }
15819
15966
  const joined = segments.join("");
15820
- const collapsed = joined.replaceAll(/\/{2,}/g, "/");
15967
+ const collapsed = stripUrlQueryAndHash(joined).replaceAll(/\/{2,}/g, "/");
15821
15968
  return collapsed.length === 0 ? "/" : collapsed;
15822
15969
  }
15823
15970
  function compareByName(a, b) {
@@ -15873,148 +16020,6 @@ function loadRouteTree(args) {
15873
16020
  return result;
15874
16021
  }
15875
16022
 
15876
- // packages/dbx-cli/src/lib/route/url-match.ts
15877
- function normalizePathname(pathname) {
15878
- let result;
15879
- if (pathname.length === 0) {
15880
- result = "/";
15881
- } else if (pathname.length > 1 && pathname.endsWith("/")) {
15882
- result = pathname.slice(0, -1);
15883
- } else {
15884
- result = pathname;
15885
- }
15886
- return result;
15887
- }
15888
- function splitSegments(path) {
15889
- const normalized = path.startsWith("/") ? path.slice(1) : path;
15890
- return normalized.length === 0 ? [] : normalized.split("/");
15891
- }
15892
- function hasParamSegment(path) {
15893
- return path.includes(":") || path.includes("{");
15894
- }
15895
- function tryMatchSegments(route, input) {
15896
- if (route.length !== input.length) {
15897
- return void 0;
15898
- }
15899
- const params = {};
15900
- let result = params;
15901
- for (const [i, r] of route.entries()) {
15902
- const v = input[i];
15903
- if (r.startsWith(":")) {
15904
- const key = r.slice(1);
15905
- params[key] = decodeURIComponent(v);
15906
- } else if (r.startsWith("{") && r.endsWith("}")) {
15907
- const inner = r.slice(1, -1);
15908
- const colonIdx = inner.indexOf(":");
15909
- const key = colonIdx >= 0 ? inner.slice(0, colonIdx) : inner;
15910
- params[key] = decodeURIComponent(v);
15911
- } else if (r !== v) {
15912
- result = void 0;
15913
- break;
15914
- }
15915
- }
15916
- return result;
15917
- }
15918
- function extractUrlParamKeys(fullUrl) {
15919
- if (fullUrl === void 0 || fullUrl.length === 0) {
15920
- return [];
15921
- }
15922
- const seen = /* @__PURE__ */ new Set();
15923
- const keys = [];
15924
- for (const segment of fullUrl.split("/")) {
15925
- const key = extractParamKeyFromSegment(segment);
15926
- if (key !== void 0 && !seen.has(key)) {
15927
- seen.add(key);
15928
- keys.push(key);
15929
- }
15930
- }
15931
- return keys;
15932
- }
15933
- function extractParamKeyFromSegment(segment) {
15934
- if (segment.startsWith(":")) {
15935
- const key = segment.slice(1);
15936
- return key.length > 0 ? key : void 0;
15937
- }
15938
- if (segment.startsWith("{") && segment.endsWith("}")) {
15939
- const inner = segment.slice(1, -1);
15940
- const colonIdx = inner.indexOf(":");
15941
- const rawKey = colonIdx >= 0 ? inner.slice(0, colonIdx) : inner;
15942
- const key = rawKey.trim();
15943
- return key.length > 0 ? key : void 0;
15944
- }
15945
- return void 0;
15946
- }
15947
- function matchUrlAgainstEntries(input) {
15948
- const pathname = normalizePathname(input.pathname);
15949
- const literal = matchLiteral(input.entries, pathname);
15950
- let result;
15951
- if (literal.length === 1) {
15952
- result = { kind: "match", via: "literal", value: literal[0].value, matchedFullUrl: normalizePathname(literal[0].fullUrl ?? pathname), params: {} };
15953
- } else if (literal.length > 1) {
15954
- result = { kind: "ambiguous", values: literal.map((e) => e.value) };
15955
- } else {
15956
- result = matchParamOrNone(input.entries, pathname);
15957
- }
15958
- return result;
15959
- }
15960
- function matchLiteral(entries, pathname) {
15961
- const out = [];
15962
- for (const entry of entries) {
15963
- if (entry.fullUrl !== void 0 && normalizePathname(entry.fullUrl) === pathname) {
15964
- out.push(entry);
15965
- }
15966
- }
15967
- return out;
15968
- }
15969
- function matchParamOrNone(entries, pathname) {
15970
- const inputSegments = splitSegments(pathname);
15971
- const hits = [];
15972
- for (const entry of entries) {
15973
- if (entry.fullUrl === void 0 || !hasParamSegment(entry.fullUrl)) {
15974
- continue;
15975
- }
15976
- const params = tryMatchSegments(splitSegments(entry.fullUrl), inputSegments);
15977
- if (params) {
15978
- hits.push({ entry, params });
15979
- }
15980
- }
15981
- let result;
15982
- if (hits.length === 1) {
15983
- result = { kind: "match", via: "param", value: hits[0].entry.value, matchedFullUrl: normalizePathname(hits[0].entry.fullUrl ?? pathname), params: hits[0].params };
15984
- } else if (hits.length > 1) {
15985
- result = { kind: "ambiguous", values: hits.map((h) => h.entry.value) };
15986
- } else {
15987
- result = { kind: "none", candidates: scoreCandidates(entries, pathname) };
15988
- }
15989
- return result;
15990
- }
15991
- function scoreCandidates(entries, pathname) {
15992
- const segments = splitSegments(normalizePathname(pathname));
15993
- const scored = [];
15994
- for (const entry of entries) {
15995
- if (entry.fullUrl === void 0) {
15996
- continue;
15997
- }
15998
- const candidateSegments = splitSegments(entry.fullUrl);
15999
- let score = 0;
16000
- const maxIndex = Math.min(segments.length, candidateSegments.length);
16001
- for (let i = 0; i < maxIndex; i += 1) {
16002
- if (segments[i] === candidateSegments[i]) {
16003
- score += 2;
16004
- } else if (candidateSegments[i].startsWith(":") || candidateSegments[i].startsWith("{")) {
16005
- score += 1;
16006
- } else {
16007
- break;
16008
- }
16009
- }
16010
- if (score > 0) {
16011
- scored.push({ value: entry.value, score });
16012
- }
16013
- }
16014
- scored.sort((a, b) => b.score - a.score);
16015
- return scored.slice(0, 5).map((s) => s.value);
16016
- }
16017
-
16018
16023
  // packages/dbx-cli/src/lib/route/component-resolve.ts
16019
16024
  import { dirname as dirname15, join as join5, normalize } from "node:path/posix";
16020
16025
  var TRY_EXTENSIONS = [".ts", ".tsx", "/index.ts", "/index.tsx"];
@@ -16089,6 +16094,8 @@ function containsImportedSymbol(importStatement, symbol) {
16089
16094
  var MODEL_TYPE_RE = /^[a-zA-Z][a-zA-Z0-9]*$/u;
16090
16095
  var LITERAL_SEGMENT_RE = /^[a-zA-Z0-9][a-zA-Z0-9_-]*$/u;
16091
16096
  var AUTH_UID_PLACEHOLDER = "{authUid}";
16097
+ var CONST_TOKEN_RE = /^\{const:([a-zA-Z0-9][a-zA-Z0-9_-]*)\}$/u;
16098
+ var FLAT_KEY_TOKEN_RE = /^\{flatKey:([a-zA-Z_][a-zA-Z0-9_]*)\}$/u;
16092
16099
  var ROUTE_MODEL_TAG = "dbxRouteModel";
16093
16100
  var ROUTE_MODEL_LIST_TAG = "dbxRouteModelList";
16094
16101
  function parseRouteModelTag(tag) {
@@ -16124,7 +16131,7 @@ function parseModelTag(tokens, description) {
16124
16131
  } else if (MODEL_TYPE_RE.test(tokens[0])) {
16125
16132
  const parsedKey = parseKeyTemplate(tokens[1]);
16126
16133
  if (parsedKey.ok) {
16127
- result = { ok: true, model: { modelType: tokens[0], kind: parsedKey.kind, keyTemplate: tokens[1], description, routeParams: parsedKey.routeParams } };
16134
+ result = { ok: true, model: { modelType: tokens[0], kind: parsedKey.kind, keyTemplate: parsedKey.keyTemplate, description, routeParams: parsedKey.routeParams } };
16128
16135
  } else {
16129
16136
  result = { ok: false, message: parsedKey.message };
16130
16137
  }
@@ -16146,17 +16153,21 @@ function parseKeyTemplate(keyTemplate) {
16146
16153
  return result;
16147
16154
  }
16148
16155
  function parseSingleSegmentKey(segment, keyTemplate) {
16156
+ const flatKeyParam = flatKeyTokenParam(segment);
16149
16157
  const placeholder = placeholderParam(segment);
16150
16158
  let result;
16151
- if (placeholder === void 0) {
16152
- result = { ok: false, message: `Single-segment key template \`${keyTemplate}\` must be a placeholder (\`:param\` or \`${AUTH_UID_PLACEHOLDER}\`).` };
16159
+ if (flatKeyParam !== void 0) {
16160
+ result = { ok: true, kind: "flatKey", keyTemplate, routeParams: [flatKeyParam] };
16161
+ } else if (placeholder === void 0) {
16162
+ result = { ok: false, message: `Single-segment key template \`${keyTemplate}\` must be a placeholder (\`:param\` or \`${AUTH_UID_PLACEHOLDER}\`) or a flattened-key token (\`{flatKey:<param>}\`).` };
16153
16163
  } else {
16154
- result = { ok: true, kind: "id", routeParams: placeholder.routeParam === void 0 ? [] : [placeholder.routeParam] };
16164
+ result = { ok: true, kind: "id", keyTemplate, routeParams: placeholder.routeParam === void 0 ? [] : [placeholder.routeParam] };
16155
16165
  }
16156
16166
  return result;
16157
16167
  }
16158
16168
  function parseAlternatingKey(segments, keyTemplate) {
16159
16169
  const routeParams = [];
16170
+ const normalizedSegments = [];
16160
16171
  let message;
16161
16172
  for (const [i, segment] of segments.entries()) {
16162
16173
  if (i % 2 === 0) {
@@ -16164,18 +16175,24 @@ function parseAlternatingKey(segments, keyTemplate) {
16164
16175
  message = `Key template \`${keyTemplate}\` segment \`${segment}\` must be a literal collection name.`;
16165
16176
  break;
16166
16177
  }
16178
+ normalizedSegments.push(segment);
16167
16179
  } else {
16168
16180
  const placeholder = placeholderParam(segment);
16169
- if (placeholder === void 0) {
16170
- message = `Key template \`${keyTemplate}\` segment \`${segment}\` must be a placeholder (\`:param\` or \`${AUTH_UID_PLACEHOLDER}\`).`;
16181
+ const constId = constTokenId(segment);
16182
+ if (placeholder !== void 0) {
16183
+ if (placeholder.routeParam !== void 0) {
16184
+ routeParams.push(placeholder.routeParam);
16185
+ }
16186
+ normalizedSegments.push(segment);
16187
+ } else if (constId === void 0) {
16188
+ message = `Key template \`${keyTemplate}\` segment \`${segment}\` must be a placeholder (\`:param\` or \`${AUTH_UID_PLACEHOLDER}\`) or a fixed id (\`{const:<id>}\`).`;
16171
16189
  break;
16172
- }
16173
- if (placeholder.routeParam !== void 0) {
16174
- routeParams.push(placeholder.routeParam);
16190
+ } else {
16191
+ normalizedSegments.push(constId);
16175
16192
  }
16176
16193
  }
16177
16194
  }
16178
- return message === void 0 ? { ok: true, kind: "key", routeParams } : { ok: false, message };
16195
+ return message === void 0 ? { ok: true, kind: "key", keyTemplate: normalizedSegments.join("/"), routeParams } : { ok: false, message };
16179
16196
  }
16180
16197
  function placeholderParam(segment) {
16181
16198
  let result;
@@ -16188,6 +16205,14 @@ function placeholderParam(segment) {
16188
16205
  }
16189
16206
  return result;
16190
16207
  }
16208
+ function constTokenId(segment) {
16209
+ const match = CONST_TOKEN_RE.exec(segment);
16210
+ return match === null ? void 0 : match[1];
16211
+ }
16212
+ function flatKeyTokenParam(segment) {
16213
+ const match = FLAT_KEY_TOKEN_RE.exec(segment);
16214
+ return match === null ? void 0 : match[1];
16215
+ }
16191
16216
 
16192
16217
  // packages/dbx-cli/src/lib/route/route-models-extract.ts
16193
16218
  function extractComponentRouteModelTags(sourceFile, component) {
@@ -16209,7 +16234,7 @@ function collectRouteModelTags2(jsDocs) {
16209
16234
 
16210
16235
  // packages/dbx-cli/src/lib/route/route-manifest.ts
16211
16236
  import { Project as Project5 } from "ts-morph";
16212
- var ROUTE_MANIFEST_VERSION = 1;
16237
+ var ROUTE_MANIFEST_VERSION = 2;
16213
16238
  function buildRouteManifest(input, now = /* @__PURE__ */ new Date()) {
16214
16239
  const warnings = [];
16215
16240
  const tree = loadRouteTree({ sources: input.sources });
@@ -1267,7 +1267,7 @@
1267
1267
  "source": "@dereekb/dbx-web",
1268
1268
  "module": "@dereekb/dbx-web",
1269
1269
  "file": "src/lib/layout/content/_content.scss",
1270
- "line": 48,
1270
+ "line": 54,
1271
1271
  "declarations": [
1272
1272
  {
1273
1273
  "property": "margin",
@@ -1299,7 +1299,7 @@
1299
1299
  "source": "@dereekb/dbx-web",
1300
1300
  "module": "@dereekb/dbx-web",
1301
1301
  "file": "src/lib/layout/content/_content.scss",
1302
- "line": 152,
1302
+ "line": 185,
1303
1303
  "declarations": [
1304
1304
  {
1305
1305
  "property": "margin",
@@ -1332,10 +1332,11 @@
1332
1332
  }
1333
1333
  ],
1334
1334
  "role": "layout",
1335
- "intent": "padded content surface lifted with elevation 2 — combines inner padding with a Material elevation shadow",
1335
+ "intent": "padded content surface lifted above its surroundings — the mirror of `.dbx-content-pit`. Per Material 3, elevation is communicated primarily with color (the brightest `surface-bright` tone, always lighter than the pit's `surface-dim` in both light and dark) plus a soft lift shadow for protection against the background, so it reads as raised and stays clearly distinct from the recessed pit. Tonal by default — a low-opacity wash of the active dbxColor over `surface-bright`; rounded by default, opt out with `.dbx-corners-none`. Override `--dbx-content-elevate-tone` (percentage) to tune the wash, `--dbx-content-elevate-bg` to replace the background outright, or `--dbx-content-elevate-shadow` to retune/remove (`none`) the shadow.",
1336
1336
  "seeAlso": [
1337
1337
  "dbx-content-border",
1338
- "dbx-content-pit"
1338
+ "dbx-content-pit",
1339
+ "dbx-corners-none"
1339
1340
  ]
1340
1341
  },
1341
1342
  {
@@ -1344,7 +1345,7 @@
1344
1345
  "source": "@dereekb/dbx-web",
1345
1346
  "module": "@dereekb/dbx-web",
1346
1347
  "file": "src/lib/layout/content/_content.scss",
1347
- "line": 63,
1348
+ "line": 69,
1348
1349
  "declarations": [
1349
1350
  {
1350
1351
  "property": "padding",
@@ -1352,7 +1353,7 @@
1352
1353
  }
1353
1354
  ],
1354
1355
  "role": "layout",
1355
- "intent": "recessed surface pit — `--mat-sys-surface-container` background with a `padding-4` inset, used to visually nest content (e.g. logs, JSON, quoted blocks); rounded by default, opt out with `.dbx-corners-none`",
1356
+ "intent": "recessed surface pit (\"negative elevation\") — a semi-transparent tonal wash of the active dbxColor over `--mat-sys-surface-dim` (the dimmest/greyest M3 surface, the opposite end of the dim/bright pair from `.dbx-content-elevate`) so the lighter surface behind shows through, with a `padding-4` inset, used to visually nest content (e.g. logs, JSON, quoted blocks); rounded by default, opt out with `.dbx-corners-none`",
1356
1357
  "seeAlso": [
1357
1358
  "dbx-content-pit-scrollable",
1358
1359
  "dbx-content-border",
@@ -1366,7 +1367,7 @@
1366
1367
  "source": "@dereekb/dbx-web",
1367
1368
  "module": "@dereekb/dbx-web",
1368
1369
  "file": "src/lib/layout/content/_content.scss",
1369
- "line": 104,
1370
+ "line": 135,
1370
1371
  "declarations": [
1371
1372
  {
1372
1373
  "property": "float",
@@ -1407,7 +1408,7 @@
1407
1408
  "source": "@dereekb/dbx-web",
1408
1409
  "module": "@dereekb/dbx-web",
1409
1410
  "file": "src/lib/layout/content/_content.scss",
1410
- "line": 80,
1411
+ "line": 86,
1411
1412
  "declarations": [
1412
1413
  {
1413
1414
  "property": "border-radius",
@@ -1428,7 +1429,32 @@
1428
1429
  "source": "@dereekb/dbx-web",
1429
1430
  "module": "@dereekb/dbx-web",
1430
1431
  "file": "src/lib/layout/content/_content.scss",
1431
- "line": 93,
1432
+ "line": 99,
1433
+ "declarations": [
1434
+ {
1435
+ "property": "overflow",
1436
+ "value": "hidden"
1437
+ },
1438
+ {
1439
+ "property": "max-width",
1440
+ "value": "100%"
1441
+ }
1442
+ ],
1443
+ "role": "layout",
1444
+ "intent": "scrollable modifier for `.dbx-content-pit` — turns the pit into a fixed frame that clips an inner `.dbx-content-pit-scrollable-content` wrapper; the wrapper (not the frame) scrolls, so the padded/cornered surface never shifts. Drive the height via the `[scrollable]` input (which writes `--dbx-content-pit-scrollable-max-height`) or fall back to `theming.$dbx-content-pit-scrollable-max-height`.",
1445
+ "seeAlso": [
1446
+ "dbx-content-pit",
1447
+ "dbx-content-pit-scrollable-content"
1448
+ ],
1449
+ "parent": "content-pit"
1450
+ },
1451
+ {
1452
+ "slug": "content-pit-scrollable-content",
1453
+ "selector": ".dbx-content-pit",
1454
+ "source": "@dereekb/dbx-web",
1455
+ "module": "@dereekb/dbx-web",
1456
+ "file": "src/lib/layout/content/_content.scss",
1457
+ "line": 113,
1432
1458
  "declarations": [
1433
1459
  {
1434
1460
  "property": "max-height",
@@ -1440,15 +1466,41 @@
1440
1466
  },
1441
1467
  {
1442
1468
  "property": "overflow-y",
1443
- "value": "scroll"
1469
+ "value": "auto"
1470
+ },
1471
+ {
1472
+ "property": "overscroll-behavior",
1473
+ "value": "contain"
1474
+ },
1475
+ {
1476
+ "property": "overflow-anchor",
1477
+ "value": "none"
1478
+ },
1479
+ {
1480
+ "property": "margin-top",
1481
+ "value": "calc(-1 * #{$pit-padding})"
1482
+ },
1483
+ {
1484
+ "property": "margin-bottom",
1485
+ "value": "calc(-1 * #{$pit-padding})"
1486
+ },
1487
+ {
1488
+ "property": "padding-top",
1489
+ "value": "$pit-padding"
1490
+ },
1491
+ {
1492
+ "property": "padding-bottom",
1493
+ "value": "$pit-padding"
1444
1494
  }
1445
1495
  ],
1446
1496
  "role": "layout",
1447
- "intent": "scrollable modifier for `.dbx-content-pit` — caps height at `theming.$dbx-content-pit-scrollable-max-height` and forces `overflow-y: scroll` for long inner content",
1497
+ "intent": "inner scroll region for a scrollable `.dbx-content-pit` — wrap the pit body in this element when using `[scrollable]`; it owns the height cap + `overflow-y` so the pit frame stays put. The cap reads `--dbx-content-pit-scrollable-max-height` (published per-pit by `dbxContentPit`; `none` when the pit isn't scrollable).",
1448
1498
  "seeAlso": [
1449
- "dbx-content-pit"
1499
+ "dbx-content-pit",
1500
+ "dbx-content-pit-scrollable"
1450
1501
  ],
1451
- "parent": "content-pit"
1502
+ "parent": "content-pit-scrollable",
1503
+ "selectorContext": ".dbx-content-pit .dbx-content-pit-scrollable-content"
1452
1504
  },
1453
1505
  {
1454
1506
  "slug": "content-scroll-lock",
@@ -1456,7 +1508,7 @@
1456
1508
  "source": "@dereekb/dbx-web",
1457
1509
  "module": "@dereekb/dbx-web",
1458
1510
  "file": "src/lib/layout/content/_content.scss",
1459
- "line": 143,
1511
+ "line": 176,
1460
1512
  "declarations": [
1461
1513
  {
1462
1514
  "property": "height",
@@ -2476,7 +2528,7 @@
2476
2528
  "source": "@dereekb/dbx-web",
2477
2529
  "module": "@dereekb/dbx-web",
2478
2530
  "file": "src/lib/layout/list/_list.scss",
2479
- "line": 326,
2531
+ "line": 443,
2480
2532
  "declarations": [
2481
2533
  {
2482
2534
  "property": "height",
@@ -2497,7 +2549,7 @@
2497
2549
  "source": "@dereekb/dbx-web",
2498
2550
  "module": "@dereekb/dbx-web",
2499
2551
  "file": "src/lib/layout/list/_list.scss",
2500
- "line": 206,
2552
+ "line": 311,
2501
2553
  "declarations": [
2502
2554
  {
2503
2555
  "property": "--dbx-list-card-items-list-gap",
@@ -2526,7 +2578,7 @@
2526
2578
  "source": "@dereekb/dbx-web",
2527
2579
  "module": "@dereekb/dbx-web",
2528
2580
  "file": "src/lib/layout/list/_list.scss",
2529
- "line": 341,
2581
+ "line": 458,
2530
2582
  "declarations": [
2531
2583
  {
2532
2584
  "property": "padding",
@@ -2546,7 +2598,7 @@
2546
2598
  "source": "@dereekb/dbx-web",
2547
2599
  "module": "@dereekb/dbx-web",
2548
2600
  "file": "src/lib/layout/list/_list.scss",
2549
- "line": 168,
2601
+ "line": 273,
2550
2602
  "declarations": [
2551
2603
  {
2552
2604
  "property": "min-height",
@@ -2575,7 +2627,7 @@
2575
2627
  "source": "@dereekb/dbx-web",
2576
2628
  "module": "@dereekb/dbx-web",
2577
2629
  "file": "src/lib/layout/list/_list.scss",
2578
- "line": 177,
2630
+ "line": 282,
2579
2631
  "declarations": [
2580
2632
  {
2581
2633
  "property": "min-height",
@@ -2601,7 +2653,7 @@
2601
2653
  "source": "@dereekb/dbx-web",
2602
2654
  "module": "@dereekb/dbx-web",
2603
2655
  "file": "src/lib/layout/list/_list.scss",
2604
- "line": 301,
2656
+ "line": 418,
2605
2657
  "declarations": [
2606
2658
  {
2607
2659
  "property": "cursor",
@@ -2618,7 +2670,7 @@
2618
2670
  "source": "@dereekb/dbx-web",
2619
2671
  "module": "@dereekb/dbx-web",
2620
2672
  "file": "src/lib/layout/list/_list.scss",
2621
- "line": 313,
2673
+ "line": 430,
2622
2674
  "declarations": [
2623
2675
  {
2624
2676
  "property": "padding",
@@ -2638,7 +2690,7 @@
2638
2690
  "source": "@dereekb/dbx-web",
2639
2691
  "module": "@dereekb/dbx-web",
2640
2692
  "file": "src/lib/layout/list/_list.scss",
2641
- "line": 240,
2693
+ "line": 357,
2642
2694
  "declarations": [
2643
2695
  {
2644
2696
  "property": "--dbx-list-item-border-radius",
@@ -2665,7 +2717,7 @@
2665
2717
  "source": "@dereekb/dbx-web",
2666
2718
  "module": "@dereekb/dbx-web",
2667
2719
  "file": "src/lib/layout/list/_list.scss",
2668
- "line": 149,
2720
+ "line": 254,
2669
2721
  "declarations": [],
2670
2722
  "role": "state",
2671
2723
  "intent": "pin `.dbx-list-view-group-header` rows to the top of the list while scrolling"
@@ -2676,7 +2728,7 @@
2676
2728
  "source": "@dereekb/dbx-web",
2677
2729
  "module": "@dereekb/dbx-web",
2678
2730
  "file": "src/lib/layout/list/_list.scss",
2679
- "line": 257,
2731
+ "line": 374,
2680
2732
  "declarations": [
2681
2733
  {
2682
2734
  "property": "display",
@@ -2703,7 +2755,7 @@
2703
2755
  "source": "@dereekb/dbx-web",
2704
2756
  "module": "@dereekb/dbx-web",
2705
2757
  "file": "src/lib/layout/list/_list.scss",
2706
- "line": 126,
2758
+ "line": 231,
2707
2759
  "declarations": [],
2708
2760
  "role": "spacing",
2709
2761
  "intent": "strip the leading + trailing padding around `mdc-list-item--with-trailing-meta` rows so meta-only items hug their container"
@@ -2979,7 +3031,7 @@
2979
3031
  "source": "@dereekb/dbx-web",
2980
3032
  "module": "@dereekb/dbx-web",
2981
3033
  "file": "src/lib/layout/content/_content.scss",
2982
- "line": 224,
3034
+ "line": 257,
2983
3035
  "declarations": [
2984
3036
  {
2985
3037
  "property": "padding-bottom",
@@ -3594,10 +3646,22 @@
3594
3646
  {
3595
3647
  "property": "overflow-x",
3596
3648
  "value": "hidden"
3649
+ },
3650
+ {
3651
+ "property": "box-sizing",
3652
+ "value": "border-box"
3653
+ },
3654
+ {
3655
+ "property": "border-top",
3656
+ "value": "var(--dbx-two-column-border-top, 1px solid var(--dbx-divider-color))"
3597
3657
  }
3598
3658
  ],
3599
3659
  "role": "layout",
3600
- "intent": "two-column page layout — fixed-width left column with elevated right content area"
3660
+ "intent": "two-column page layout — fixed-width left column with elevated right content area",
3661
+ "tokensRead": [
3662
+ "--dbx-divider-color",
3663
+ "--dbx-two-column-border-top"
3664
+ ]
3601
3665
  },
3602
3666
  {
3603
3667
  "slug": "u",
@@ -198,29 +198,64 @@
198
198
  },
199
199
  {
200
200
  "cssVariable": "--dbx-border-color",
201
+ "scssVariable": "$dbx-border-color-var",
201
202
  "source": "dbx-web",
202
203
  "role": "color",
203
204
  "intents": [
204
- "border color"
205
+ "border base color",
206
+ "divider base color",
207
+ "outline base color"
205
208
  ],
206
- "description": "Component-scoped override point (`content`) read in `packages/dbx-web/src/lib/layout/content/_content.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `var(--mat-sys-outline-variant)`.",
209
+ "description": "Base border color for the shared semi-transparent border system. Defaults to `--mat-sys-outline-variant` (the M3 divider color). Blended with `--dbx-border-opacity` to produce `--dbx-border-color-current`.",
207
210
  "defaults": {
208
211
  "light": "var(--mat-sys-outline-variant)"
209
212
  },
210
- "componentScope": "content"
213
+ "seeAlso": [
214
+ "--mat-sys-outline-variant",
215
+ "--dbx-border-opacity",
216
+ "--dbx-border-color-current"
217
+ ]
218
+ },
219
+ {
220
+ "cssVariable": "--dbx-border-color-current",
221
+ "scssVariable": "$dbx-border-color-current-var",
222
+ "source": "dbx-web",
223
+ "role": "color",
224
+ "intents": [
225
+ "border color",
226
+ "divider color",
227
+ "semi-transparent border color",
228
+ "computed border color"
229
+ ],
230
+ "description": "Effective, semi-transparent border color — a `color-mix` of `--dbx-border-color` at `--dbx-border-opacity`. Apply this directly to `border` / `border-top` / `border-bottom`. Overriding either input token (globally or on a local scope) recomputes this automatically.",
231
+ "defaults": {
232
+ "light": "color-mix(in srgb, var(--dbx-border-color) var(--dbx-border-opacity), transparent)"
233
+ },
234
+ "antiUseNotes": "Don't hardcode `border: 1px solid rgba(0,0,0,0.1)`; use this token so the color and opacity stay themeable.",
235
+ "seeAlso": [
236
+ "--dbx-border-color",
237
+ "--dbx-border-opacity"
238
+ ]
211
239
  },
212
240
  {
213
241
  "cssVariable": "--dbx-border-opacity",
242
+ "scssVariable": "$dbx-border-opacity-var",
214
243
  "source": "dbx-web",
215
244
  "role": "misc",
216
245
  "intents": [
217
- "border opacity"
246
+ "border opacity",
247
+ "divider transparency",
248
+ "border alpha",
249
+ "semi-transparent border opacity"
218
250
  ],
219
- "description": "Component-scoped override point (`content`) read in `packages/dbx-web/src/lib/layout/content/_content.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `20%`.",
251
+ "description": "Opacity applied to `--dbx-border-color` when computing the effective border color. A percentage (e.g. `70%`). Lower it for a fainter border, raise it toward `100%` for a solid divider.",
220
252
  "defaults": {
221
- "light": "20%"
253
+ "light": "60%"
222
254
  },
223
- "componentScope": "content"
255
+ "seeAlso": [
256
+ "--dbx-border-color",
257
+ "--dbx-border-color-current"
258
+ ]
224
259
  },
225
260
  {
226
261
  "cssVariable": "--dbx-bottom-banner-height",
@@ -288,6 +323,58 @@
288
323
  },
289
324
  "componentScope": "button"
290
325
  },
326
+ {
327
+ "cssVariable": "--dbx-calendar-active-day-color",
328
+ "source": "dbx-web",
329
+ "role": "color",
330
+ "intents": [
331
+ "calendar active day color"
332
+ ],
333
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `var(--dbx-primary-color)`.",
334
+ "defaults": {
335
+ "light": "var(--dbx-primary-color)"
336
+ },
337
+ "componentScope": "calendar"
338
+ },
339
+ {
340
+ "cssVariable": "--dbx-calendar-active-day-tone",
341
+ "source": "dbx-web",
342
+ "role": "misc",
343
+ "intents": [
344
+ "calendar active day tone"
345
+ ],
346
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `30%`.",
347
+ "defaults": {
348
+ "light": "30%"
349
+ },
350
+ "componentScope": "calendar"
351
+ },
352
+ {
353
+ "cssVariable": "--dbx-calendar-border-color",
354
+ "source": "dbx-web",
355
+ "role": "color",
356
+ "intents": [
357
+ "calendar border color"
358
+ ],
359
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `var(--dbx-divider-color)`.",
360
+ "defaults": {
361
+ "light": "var(--dbx-divider-color)"
362
+ },
363
+ "componentScope": "calendar"
364
+ },
365
+ {
366
+ "cssVariable": "--dbx-calendar-border-tone",
367
+ "source": "dbx-web",
368
+ "role": "misc",
369
+ "intents": [
370
+ "calendar border tone"
371
+ ],
372
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `100%`.",
373
+ "defaults": {
374
+ "light": "100%"
375
+ },
376
+ "componentScope": "calendar"
377
+ },
291
378
  {
292
379
  "cssVariable": "--dbx-calendar-day-badge-container-shape",
293
380
  "source": "dbx-web",
@@ -301,6 +388,162 @@
301
388
  },
302
389
  "componentScope": "calendar-month-view"
303
390
  },
391
+ {
392
+ "cssVariable": "--dbx-calendar-highlight-color",
393
+ "source": "dbx-web",
394
+ "role": "color",
395
+ "intents": [
396
+ "calendar highlight color"
397
+ ],
398
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `var(--dbx-accent-color)`.",
399
+ "defaults": {
400
+ "light": "var(--dbx-accent-color)"
401
+ },
402
+ "componentScope": "calendar"
403
+ },
404
+ {
405
+ "cssVariable": "--dbx-calendar-highlight-tone",
406
+ "source": "dbx-web",
407
+ "role": "misc",
408
+ "intents": [
409
+ "calendar highlight tone"
410
+ ],
411
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `30%`.",
412
+ "defaults": {
413
+ "light": "30%"
414
+ },
415
+ "componentScope": "calendar"
416
+ },
417
+ {
418
+ "cssVariable": "--dbx-calendar-hover-color",
419
+ "source": "dbx-web",
420
+ "role": "color",
421
+ "intents": [
422
+ "calendar hover color"
423
+ ],
424
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `var(--mat-sys-on-surface)`.",
425
+ "defaults": {
426
+ "light": "var(--mat-sys-on-surface)"
427
+ },
428
+ "componentScope": "calendar"
429
+ },
430
+ {
431
+ "cssVariable": "--dbx-calendar-hover-tone",
432
+ "source": "dbx-web",
433
+ "role": "misc",
434
+ "intents": [
435
+ "calendar hover tone"
436
+ ],
437
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `4%`.",
438
+ "defaults": {
439
+ "light": "4%"
440
+ },
441
+ "componentScope": "calendar"
442
+ },
443
+ {
444
+ "cssVariable": "--dbx-calendar-not-applicable-color",
445
+ "source": "dbx-web",
446
+ "role": "color",
447
+ "intents": [
448
+ "calendar not applicable color"
449
+ ],
450
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `var(--mat-sys-on-surface)`.",
451
+ "defaults": {
452
+ "light": "var(--mat-sys-on-surface)"
453
+ },
454
+ "componentScope": "calendar"
455
+ },
456
+ {
457
+ "cssVariable": "--dbx-calendar-not-applicable-tone",
458
+ "source": "dbx-web",
459
+ "role": "misc",
460
+ "intents": [
461
+ "calendar not applicable tone"
462
+ ],
463
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `30%`.",
464
+ "defaults": {
465
+ "light": "30%"
466
+ },
467
+ "componentScope": "calendar"
468
+ },
469
+ {
470
+ "cssVariable": "--dbx-calendar-secondary-color",
471
+ "source": "dbx-web",
472
+ "role": "color",
473
+ "intents": [
474
+ "calendar secondary color"
475
+ ],
476
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `var(--mat-sys-on-surface)`.",
477
+ "defaults": {
478
+ "light": "var(--mat-sys-on-surface)"
479
+ },
480
+ "componentScope": "calendar"
481
+ },
482
+ {
483
+ "cssVariable": "--dbx-calendar-secondary-tone",
484
+ "source": "dbx-web",
485
+ "role": "misc",
486
+ "intents": [
487
+ "calendar secondary tone"
488
+ ],
489
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `4%`.",
490
+ "defaults": {
491
+ "light": "4%"
492
+ },
493
+ "componentScope": "calendar"
494
+ },
495
+ {
496
+ "cssVariable": "--dbx-calendar-selected-day-color",
497
+ "source": "dbx-web",
498
+ "role": "color",
499
+ "intents": [
500
+ "calendar selected day color"
501
+ ],
502
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `var(--dbx-primary-color)`.",
503
+ "defaults": {
504
+ "light": "var(--dbx-primary-color)"
505
+ },
506
+ "componentScope": "calendar"
507
+ },
508
+ {
509
+ "cssVariable": "--dbx-calendar-selected-day-tone",
510
+ "source": "dbx-web",
511
+ "role": "misc",
512
+ "intents": [
513
+ "calendar selected day tone"
514
+ ],
515
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `60%`.",
516
+ "defaults": {
517
+ "light": "60%"
518
+ },
519
+ "componentScope": "calendar"
520
+ },
521
+ {
522
+ "cssVariable": "--dbx-calendar-today-color",
523
+ "source": "dbx-web",
524
+ "role": "color",
525
+ "intents": [
526
+ "calendar today color"
527
+ ],
528
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `var(--mat-sys-on-surface)`.",
529
+ "defaults": {
530
+ "light": "var(--mat-sys-on-surface)"
531
+ },
532
+ "componentScope": "calendar"
533
+ },
534
+ {
535
+ "cssVariable": "--dbx-calendar-today-tone",
536
+ "source": "dbx-web",
537
+ "role": "misc",
538
+ "intents": [
539
+ "calendar today tone"
540
+ ],
541
+ "description": "Component-scoped override point (`calendar`) read in `packages/dbx-web/src/lib/extension/calendar/_calendar.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `4%`.",
542
+ "defaults": {
543
+ "light": "4%"
544
+ },
545
+ "componentScope": "calendar"
546
+ },
304
547
  {
305
548
  "cssVariable": "--dbx-card-accent-border-width",
306
549
  "source": "dbx-web",
@@ -466,6 +709,45 @@
466
709
  },
467
710
  "componentScope": "style"
468
711
  },
712
+ {
713
+ "cssVariable": "--dbx-content-elevate-bg",
714
+ "source": "dbx-web",
715
+ "role": "misc",
716
+ "intents": [
717
+ "content elevate bg"
718
+ ],
719
+ "description": "Component-scoped override point (`content`) read in `packages/dbx-web/src/lib/layout/content/_content.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `color-mix(in srgb, #{theming.$dbx-bg-color} var(--dbx-content-elevate-tone, 8%), var(--mat-sys-surface-bright))`.",
720
+ "defaults": {
721
+ "light": "color-mix(in srgb, #{theming.$dbx-bg-color} var(--dbx-content-elevate-tone, 8%), var(--mat-sys-surface-bright))"
722
+ },
723
+ "componentScope": "content"
724
+ },
725
+ {
726
+ "cssVariable": "--dbx-content-elevate-shadow",
727
+ "source": "dbx-web",
728
+ "role": "shadow",
729
+ "intents": [
730
+ "content elevate shadow"
731
+ ],
732
+ "description": "Component-scoped override point (`content`) read in `packages/dbx-web/src/lib/layout/content/_content.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `var(--mat-sys-level1)`.",
733
+ "defaults": {
734
+ "light": "var(--mat-sys-level1)"
735
+ },
736
+ "componentScope": "content"
737
+ },
738
+ {
739
+ "cssVariable": "--dbx-content-elevate-tone",
740
+ "source": "dbx-web",
741
+ "role": "misc",
742
+ "intents": [
743
+ "content elevate tone"
744
+ ],
745
+ "description": "Component-scoped override point (`content`) read in `packages/dbx-web/src/lib/layout/content/_content.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `8%`.",
746
+ "defaults": {
747
+ "light": "8%"
748
+ },
749
+ "componentScope": "content"
750
+ },
469
751
  {
470
752
  "cssVariable": "--dbx-content-headers-count",
471
753
  "scssVariable": "$dbx-content-headers-count-var",
@@ -563,15 +845,28 @@
563
845
  }
564
846
  },
565
847
  {
566
- "cssVariable": "--dbx-content-pit-color-tone",
848
+ "cssVariable": "--dbx-content-pit-bg",
567
849
  "source": "dbx-web",
568
- "role": "color",
850
+ "role": "misc",
569
851
  "intents": [
570
- "content pit color tone"
852
+ "content pit bg"
571
853
  ],
572
- "description": "Component-scoped override point (`content`) read in `packages/dbx-web/src/lib/layout/content/_content.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `11%`.",
854
+ "description": "Component-scoped override point (`content`) read in `packages/dbx-web/src/lib/layout/content/_content.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `color-mix(in srgb, color-mix(in srgb, #{theming.$dbx-bg-color} var(--dbx-content-pit-tone, 8%), var(--mat-sys-surface-dim)) var(--dbx-content-pit-opacity, 50%), transparent)`.",
573
855
  "defaults": {
574
- "light": "11%"
856
+ "light": "color-mix(in srgb, color-mix(in srgb, #{theming.$dbx-bg-color} var(--dbx-content-pit-tone, 8%), var(--mat-sys-surface-dim)) var(--dbx-content-pit-opacity, 50%), transparent)"
857
+ },
858
+ "componentScope": "content"
859
+ },
860
+ {
861
+ "cssVariable": "--dbx-content-pit-opacity",
862
+ "source": "dbx-web",
863
+ "role": "misc",
864
+ "intents": [
865
+ "content pit opacity"
866
+ ],
867
+ "description": "Component-scoped override point (`content`) read in `packages/dbx-web/src/lib/layout/content/_content.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `50%`.",
868
+ "defaults": {
869
+ "light": "50%"
575
870
  },
576
871
  "componentScope": "content"
577
872
  },
@@ -606,6 +901,19 @@
606
901
  "light": "140px"
607
902
  }
608
903
  },
904
+ {
905
+ "cssVariable": "--dbx-content-pit-tone",
906
+ "source": "dbx-web",
907
+ "role": "misc",
908
+ "intents": [
909
+ "content pit tone"
910
+ ],
911
+ "description": "Component-scoped override point (`content`) read in `packages/dbx-web/src/lib/layout/content/_content.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `8%`.",
912
+ "defaults": {
913
+ "light": "8%"
914
+ },
915
+ "componentScope": "content"
916
+ },
609
917
  {
610
918
  "cssVariable": "--dbx-corners-border-radius",
611
919
  "scssVariable": "$dbx-corners-border-radius-var",
@@ -713,6 +1021,26 @@
713
1021
  "light": "var(--mat-sys-outline)"
714
1022
  }
715
1023
  },
1024
+ {
1025
+ "cssVariable": "--dbx-divider-color",
1026
+ "scssVariable": "$dbx-divider-color-var",
1027
+ "source": "dbx-web",
1028
+ "role": "color",
1029
+ "intents": [
1030
+ "divider color",
1031
+ "separator color",
1032
+ "shared divider",
1033
+ "component divider color"
1034
+ ],
1035
+ "description": "Shared divider color for component dividers/separators (dbx-table-view summary rule, dbx-two-column boundary, dbx-calendar cell borders, etc.). Defaults to `--dbx-border-color-current` so every divider inherits the themeable semi-transparent border by default; override this single token (globally or on a local scope) to retint all dividers at once, or override a component's own divider token to retint just that one.",
1036
+ "defaults": {
1037
+ "light": "var(--dbx-border-color-current)"
1038
+ },
1039
+ "antiUseNotes": "Don't hardcode a per-component divider color; default it to this token so dividers stay consistent and themeable.",
1040
+ "seeAlso": [
1041
+ "--dbx-border-color-current"
1042
+ ]
1043
+ },
716
1044
  {
717
1045
  "cssVariable": "--dbx-dot-size",
718
1046
  "source": "dbx-web",
@@ -948,6 +1276,19 @@
948
1276
  },
949
1277
  "componentScope": "list"
950
1278
  },
1279
+ {
1280
+ "cssVariable": "--dbx-list-item-hover-state-layer-opacity",
1281
+ "source": "dbx-web",
1282
+ "role": "misc",
1283
+ "intents": [
1284
+ "list item hover state layer opacity"
1285
+ ],
1286
+ "description": "Component-scoped override point (`list`) read in `packages/dbx-web/src/lib/layout/list/_list.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `0.04`.",
1287
+ "defaults": {
1288
+ "light": "0.04"
1289
+ },
1290
+ "componentScope": "list"
1291
+ },
951
1292
  {
952
1293
  "cssVariable": "--dbx-list-item-padded-min-height",
953
1294
  "source": "dbx-web",
@@ -961,6 +1302,73 @@
961
1302
  },
962
1303
  "componentScope": "list"
963
1304
  },
1305
+ {
1306
+ "cssVariable": "--dbx-list-item-radius-resolved",
1307
+ "source": "dbx-web",
1308
+ "role": "radius",
1309
+ "intents": [
1310
+ "list item radius resolved",
1311
+ "list item radius resolved radius"
1312
+ ],
1313
+ "description": "Component-scoped token (`list`) declared in `packages/dbx-web/src/lib/layout/list/_list.scss`. Add a sassdoc `///` block above the declaration for richer guidance.",
1314
+ "defaults": {
1315
+ "light": "var(--dbx-list-item-border-radius, var(--mat-sys-corner-medium, 12px))"
1316
+ },
1317
+ "componentScope": "list"
1318
+ },
1319
+ {
1320
+ "cssVariable": "--dbx-list-item-selected-color",
1321
+ "source": "dbx-web",
1322
+ "role": "color",
1323
+ "intents": [
1324
+ "list item selected color"
1325
+ ],
1326
+ "description": "Component-scoped token (`list`) declared in `packages/dbx-web/src/lib/layout/list/_list.scss`. Add a sassdoc `///` block above the declaration for richer guidance.",
1327
+ "defaults": {
1328
+ "light": "var(--mat-sys-primary-container)"
1329
+ },
1330
+ "componentScope": "list"
1331
+ },
1332
+ {
1333
+ "cssVariable": "--dbx-list-item-selected-on-color",
1334
+ "source": "dbx-web",
1335
+ "role": "text-color",
1336
+ "intents": [
1337
+ "list item selected on color",
1338
+ "list item selected on color text"
1339
+ ],
1340
+ "description": "Component-scoped token (`list`) declared in `packages/dbx-web/src/lib/layout/list/_list.scss`. Add a sassdoc `///` block above the declaration for richer guidance.",
1341
+ "defaults": {
1342
+ "light": "var(--mat-sys-on-primary-container)"
1343
+ },
1344
+ "componentScope": "list"
1345
+ },
1346
+ {
1347
+ "cssVariable": "--dbx-list-item-spacing",
1348
+ "source": "dbx-web",
1349
+ "role": "misc",
1350
+ "intents": [
1351
+ "list item spacing"
1352
+ ],
1353
+ "description": "Component-scoped token (`list`) declared in `packages/dbx-web/src/lib/layout/list/_list.scss`. Add a sassdoc `///` block above the declaration for richer guidance.",
1354
+ "defaults": {
1355
+ "light": "1px"
1356
+ },
1357
+ "componentScope": "list"
1358
+ },
1359
+ {
1360
+ "cssVariable": "--dbx-list-view-group-header-background",
1361
+ "source": "dbx-web",
1362
+ "role": "misc",
1363
+ "intents": [
1364
+ "list view group header background"
1365
+ ],
1366
+ "description": "Component-scoped override point (`list`) read in `packages/dbx-web/src/lib/layout/list/_list.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `var(--mat-sidenav-content-background-color)`.",
1367
+ "defaults": {
1368
+ "light": "var(--mat-sidenav-content-background-color)"
1369
+ },
1370
+ "componentScope": "list"
1371
+ },
964
1372
  {
965
1373
  "cssVariable": "--dbx-navbar-item-border-radius",
966
1374
  "source": "dbx-web",
@@ -1143,6 +1551,20 @@
1143
1551
  "--mat-sys-outline-variant"
1144
1552
  ]
1145
1553
  },
1554
+ {
1555
+ "cssVariable": "--dbx-overlay-border-radius",
1556
+ "source": "dbx-web",
1557
+ "role": "radius",
1558
+ "intents": [
1559
+ "overlay border radius",
1560
+ "overlay border radius radius"
1561
+ ],
1562
+ "description": "Component-scoped override point (`style`) read in `packages/dbx-web/src/lib/interaction/style/_style.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `var(--mat-sys-corner-medium)`.",
1563
+ "defaults": {
1564
+ "light": "var(--mat-sys-corner-medium)"
1565
+ },
1566
+ "componentScope": "style"
1567
+ },
1146
1568
  {
1147
1569
  "cssVariable": "--dbx-padding-0",
1148
1570
  "scssVariable": "$padding-0-var",
@@ -1611,6 +2033,20 @@
1611
2033
  },
1612
2034
  "componentScope": "sidenav"
1613
2035
  },
2036
+ {
2037
+ "cssVariable": "--dbx-sidenav-bottom-corner-radius",
2038
+ "source": "dbx-web",
2039
+ "role": "radius",
2040
+ "intents": [
2041
+ "sidenav bottom corner radius",
2042
+ "sidenav bottom corner radius radius"
2043
+ ],
2044
+ "description": "Component-scoped override point (`sidenav`) read in `packages/dbx-web/src/lib/router/layout/sidenav/_sidenav.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `var(--mat-sys-corner-extra-large, 24px)`.",
2045
+ "defaults": {
2046
+ "light": "var(--mat-sys-corner-extra-large, 24px)"
2047
+ },
2048
+ "componentScope": "sidenav"
2049
+ },
1614
2050
  {
1615
2051
  "cssVariable": "--dbx-sidenav-divider-color",
1616
2052
  "source": "dbx-web",
@@ -1676,6 +2112,20 @@
1676
2112
  },
1677
2113
  "componentScope": "sidenav"
1678
2114
  },
2115
+ {
2116
+ "cssVariable": "--dbx-sidenav-top-corner-radius",
2117
+ "source": "dbx-web",
2118
+ "role": "radius",
2119
+ "intents": [
2120
+ "sidenav top corner radius",
2121
+ "sidenav top corner radius radius"
2122
+ ],
2123
+ "description": "Component-scoped override point (`sidenav`) read in `packages/dbx-web/src/lib/router/layout/sidenav/_sidenav.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `var(--mat-sys-corner-extra-large, 24px)`.",
2124
+ "defaults": {
2125
+ "light": "var(--mat-sys-corner-extra-large, 24px)"
2126
+ },
2127
+ "componentScope": "sidenav"
2128
+ },
1679
2129
  {
1680
2130
  "cssVariable": "--dbx-sidenav-width",
1681
2131
  "source": "dbx-web",
@@ -1947,6 +2397,19 @@
1947
2397
  "light": "$initial-top-banner-height"
1948
2398
  }
1949
2399
  },
2400
+ {
2401
+ "cssVariable": "--dbx-two-column-border-top",
2402
+ "source": "dbx-web",
2403
+ "role": "misc",
2404
+ "intents": [
2405
+ "two column border top"
2406
+ ],
2407
+ "description": "Component-scoped override point (`column`) read in `packages/dbx-web/src/lib/layout/column/_column.scss` — set it (from an app, or via the owning dbx directive where one exists) to override; unset, it falls back to `1px solid var(--dbx-divider-color)`.",
2408
+ "defaults": {
2409
+ "light": "1px solid var(--dbx-divider-color)"
2410
+ },
2411
+ "componentScope": "column"
2412
+ },
1950
2413
  {
1951
2414
  "cssVariable": "--dbx-two-column-left-width",
1952
2415
  "scssVariable": "$two-column-left-width-var",
@@ -1265,7 +1265,7 @@
1265
1265
  "selector": "dbx-content-pit, [dbxContentPit]",
1266
1266
  "className": "DbxContentPitDirective",
1267
1267
  "module": "@dereekb/dbx-web",
1268
- "description": "Wraps content in a recessed \"pit\" container with optional scrollable overflow and rounded corners.\nUseful for displaying bounded content areas such as lists or previews with a constrained height.\n\nPits round their corners by default. Pass `[rounded]=\"false\"` to square the pit — this applies the\ncommon `.dbx-corners-none` opt-out utility rather than a pit-specific class.",
1268
+ "description": "Wraps content in a recessed \"pit\" container with optional scrollable overflow and rounded corners.\nUseful for displaying bounded content areas such as lists or previews with a constrained height.\n\nPits round their corners by default. Pass `[square]=\"true\"` to square the pit — this applies the\ncommon `.dbx-corners-none` opt-out utility rather than a pit-specific class.\n\nWhen `[scrollable]` is set the pit frame (padding, background, corners) stays fixed and an inner\n`.dbx-content-pit-scrollable-content` wrapper does the scrolling — wrap the body in that element so\nthe frame doesn't shift at the scroll extremes. The resolved max height is published as the\n`--dbx-content-pit-scrollable-max-height` custom property, which the inner wrapper reads.",
1269
1269
  "inputs": [
1270
1270
  {
1271
1271
  "name": "scrollable",
@@ -1274,11 +1274,11 @@
1274
1274
  "required": false
1275
1275
  },
1276
1276
  {
1277
- "name": "rounded",
1277
+ "name": "square",
1278
1278
  "type": "boolean",
1279
1279
  "description": "",
1280
1280
  "required": false,
1281
- "default": "true"
1281
+ "default": "false"
1282
1282
  }
1283
1283
  ],
1284
1284
  "outputs": [],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dereekb/dbx-components-mcp",
3
- "version": "13.19.0",
3
+ "version": "13.20.0",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "dbx-components-mcp": "dbx-components-mcp.js"
@@ -11,7 +11,7 @@
11
11
  "ts-morph": "^21.0.0"
12
12
  },
13
13
  "peerDependencies": {
14
- "@dereekb/dbx-cli": "13.19.0",
15
- "@dereekb/util": "13.19.0"
14
+ "@dereekb/dbx-cli": "13.20.0",
15
+ "@dereekb/util": "13.20.0"
16
16
  }
17
17
  }